diff --git a/.gitignore b/.gitignore index f3219dd9..c6fdfbd3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,12 @@ -Thanda.xcodeproj -Thanda.build +Korra.xcodeproj +Korra.build DerivedData CMakeScripts CMakeFiles CMakeCache.txt cmake_install.cmake CMakeLists.txt.user +build*/ +Debug/ +*.sublime* +*.log diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..391a0e8a --- /dev/null +++ b/.gitmodules @@ -0,0 +1,7 @@ +[submodule "src/thirdparty/jsoncpp"] + path = src/thirdparty/jsoncpp + url = git@github.com:open-source-parsers/jsoncpp.git + +[submodule "src/thirdparty/nanogui"] + path = src/thirdparty/nanogui + url = git@github.com:wjakob/nanogui.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 696f9493..fbd48c6d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,13 +1,18 @@ ################## -# Thanda # +# Korra # ################## # credit - base CMake config : Yining Karl Li , edited CMake config: Akshay Shah & Debanshu Singh #name your project -project(Thanda) +project(Korra) cmake_minimum_required(VERSION 2.8) +# include source directories +include_directories( + src/ +) + # set creates a variable set (NUPARU "nuparu") # add include and src directories to path @@ -26,6 +31,28 @@ elseif(WIN32) set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} ${NUPARU}/lib/win) endif() +# set creates a variable +set (THIRDPARTY "src/thirdparty") +# add include and src directories to path for nanogui +include_directories( + ${THIRDPARTY}/nanogui/include + ${THIRDPARTY}/nanogui/src +) + +# NanoGUI library path +set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} ${THIRDPARTY}/nanogui) + +# add include and src directories to path for openvdb_points +include_directories( + /usr/local/include/openvdb/ + /usr/local/openvdb/ + /Library/Frameworks/Houdini.framework/Versions/15.0.347/Resources/toolkit/include/ +) + +# OpenVDB point library path +set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} /usr/local/openvdb/lib) +set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} /Library/Frameworks/Houdini.framework/Versions/15.0.347/Libraries/) + #set include variables set(GLFW_INCLUDE_DIR ${NUPARU}/include ) set(GLEW_INCLUDE_DIR ${NUPARU}/include ) @@ -37,6 +64,11 @@ find_package(OPENGL REQUIRED) find_package(GLEW) find_library(GLFW_LIBRARY "glfw3" HINTS ${GLFW_LIBRARY_DIR}) find_library(JSONCPP "jsoncpp") +find_library(TBB "tbb") +find_library(NANOGUI "nanogui") +find_library(HALF "half") +find_library(OPENVDB "openvdb") +find_library(OPENVDB_POINTS "openvdb_points") add_definitions( -DTW_STATIC @@ -46,14 +78,18 @@ add_definitions( -D_CRT_SECURE_NO_WARNINGS ) -set(CORE_LIBS ${GLFW_LIBRARY} ${GLUT_LIBRARY} ${GLEW_LIBRARY} ${JSONCPP} ${OPENGL_LIBRARY} ) +set(CORE_LIBS ${GLFW_LIBRARY} ${GLUT_LIBRARY} ${GLEW_LIBRARY} ${JSONCPP} ${TBB} ${HALF} ${OPENVDB} ${OPENVDB_POINTS} ${NANOGUI} ${OPENGL_LIBRARY} ) # OSX-specific hacks/fixes if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - #Link IOKit because this is where we get GL stuff for OSX - set(COREVIDEO "-framework CoreVideo") - set(IOKIT "-framework IOKit") - set(CORELIBS ${CORELIBS} ${IOKIT} ${COREVIDEO}) + find_library(COCOA Cocoa) + find_library(COREVIDEO CoreVideo) + find_library(IOKIT IOKit) + find_library(COREFOUNDATION CoreFoundation) + find_library(CARBON_FRAMEWORK Carbon) + + set(CORE_LIBS ${CORE_LIBS} "-framework Cocoa -framework IOKit -framework CoreFoundation -framework CoreVideo -framework Carbon") + endif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") # Linux specific hacks/fixes @@ -69,11 +105,11 @@ elseif(WIN32) endif() if(MSVC) - set(COMPILER_FLAGS + set(COMPILER_FLAGS CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE - CMAKE_C_FLAGS + CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE ) @@ -81,13 +117,32 @@ endif() # Add source files you want to compile (.cpp) set(CORE_SRC + nuparu/src/stb_image/stb_image_write.c + src/loadShaders.cpp + src/utility.cpp src/main.cpp + src/shaderProgram/shaderProgram.cpp + src/shaderProgram/particleAdvectProgram.cpp + src/input/keyboardControl.cpp + src/viewer.cpp src/camera/camera.cpp - src/viewer/viewer.cpp + src/geometry/geometry.cpp + src/geometry/box.cpp + src/geometry/fluidGeo.cpp + src/fluidSolver/fluidParticle.cpp src/fluidSolver/fluidSolver.cpp + src/fluidSolver/SPHGrid.cpp + src/fluidSolver/SPHSolver.cpp src/scene/scene.cpp - src/geom/geom.cpp ) -add_executable(Thanda ${CORE_SRC}) -target_link_libraries(Thanda ${CORE_LIBS}) \ No newline at end of file +add_executable(Korra ${CORE_SRC}) +target_link_libraries(Korra ${CORE_LIBS}) + +# Include zlib for osx +find_package( ZLIB REQUIRED ) +if ( ZLIB_FOUND ) + include_directories( ${ZLIB_INCLUDE_DIRS} ) + target_link_libraries( Korra ${ZLIB_LIBRARIES} ) +endif( ZLIB_FOUND ) + diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 00000000..2ef1ee83 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,98 @@ +The MIT License + +Copyright (c) 2016 [Trung Le](http://www.trungtuanle.com/), [Debanshu Singh](http://www.debanshusingh.com/) + +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. + +Third-Party Code +============================= + +Korra fluid solver includes the following third-party code. + +## easylogging++ + +https://github.com/easylogging/easyloggingpp + +The MIT License (MIT) + +Copyright (c) 2015 muflihun.com + +http://github.com/easylogging/ +http://easylogging.muflihun.com +http://muflihun.com + +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. + +## nanogui + +https://github.com/wjakob/nanogui + +Copyright (c) 2015 Wenzel Jakob , All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. 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. + +3. 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 HOLDER 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. + +You are under no obligation whatsoever to provide any bug fixes, patches, or +upgrades to the features, functionality or performance of the source code +("Enhancements") to anyone; however, if you choose to make your Enhancements +available either publicly, or directly to the author of this software, without +imposing a separate written license agreement for such Enhancements, then you +hereby grant the following license: a non-exclusive, royalty-free perpetual +license to install, use, modify, prepare derivative works, incorporate into +other computer software, distribute, and sublicense such enhancements or +derivative works thereof, in binary and source code form. + + diff --git a/README.md b/README.md index 0b3a5bf2..f3a212cb 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,202 @@ -# CIS563-FluidSolver +# Korra Fluid Solver, CIS 563, University of Pennsylvania, Spring 2016 -FluidSolver Submission guidelines: +[![Youtube Link](https://s3-us-west-2.amazonaws.com/trle/SPHSolverCPP/SPHSolverYoutubePreview.png)](https://youtu.be/QeSkB5jceCE) +![Rendered 1](https://s3-us-west-2.amazonaws.com/trle/SPHSolverCPP/SPHSnapShotFullRender_SkyLight.jpg) +![Rendered 2](https://s3-us-west-2.amazonaws.com/trle/SPHSolverCPP/render_full_angled.jpg) +![GUI](https://s3-us-west-2.amazonaws.com/trle/SPHSolverCPP/GUI_screenshot.png) -(Borrowed from CIS565 README) +## Update April 15 (Final project) -If you have modified any of the CMakeLists.txt files at all (aside from the list of CORE_SRC), you must test that your project can build. Beware of any build issues. +For the proposal of the final project, I want to implement a real time interactive IISPH Solver based on the following papers: +- [A Parallel Architecture for IISPH Fluids](https://graphics.ethz.ch/~sobarbar/papers/Sol14b/Sol14b.pdf) by Felix Thaler, Barbara Solenthaler, and Markus Gross. [Reference video](https://youtu.be/8ikKE4cM_Kk) +- [Real-Time Incompressible Fluid Simulation on the GPU](http://www.hindawi.com/journals/ijcgt/2015/417417/) by Xiao Nie, Leiting Chen, and Tao Xiang -Open a GitHub pull request so that we can see that you have finished. The title should be "Submission: YOUR NAME". +Reach goal: Implementing the graphics pipeline using Vulkan. -In the body of the pull request, include a link to your repository. +## Update April 10 (Sprint 3) -Submit on canvas with a direct link to your pull request on GitHub +### Completed features: +- TBB optimization: After I added TBB, runtime to compute for each frame is reduced by half (see Performance Analysis section below) +- OpenVDB export + meshing +- Solid interaction +- Fluid tank +- Ability to save screenshot every frame into bmp +### Incomplete features: +- IISPH +- GPU Optimization +- Index sorting -And you're done! \ No newline at end of file +## Update March 30 (Sprint 2) + +### Completed features: +- Pressure force field +- Viscosity force field (change value inside scene.json) +- Press Space to pause simulation +- z-indexing + +Currently my simulation is running on the CPU still so it's pretty slow. The only tbb call is in SPHSolver::Update (in SPHSolver.cpp), that update the particle velocity & position using parallel_for (not even sure if this is worth any extra credits); + +## Update March 23 (Sprint 1) +I implemented the SPH Solver with naive neighbor search. When you started running the code, you'll see a test particle iterating through the grid and shows all the neighbors in red color. However, this neighbor search isn't using a working uniform grid yet. + +I have a simple test suite in main.cpp to test Poly6. Currently spiky kernel and viscous kernel are not tested. By uncommenting `#define UNIT_TEST`, there should be print out of the kernel unit testing. + +## Overview + +__Korra__ is a cross-platform C++ fluid SPH solver, designed and built for CIS563 course at the University of Pennsylvania, Sprin 2016, instructed by [Debanshu Singh](http://www.debanshusingh.com/). __Korra__ uses OpenGL heavily for the graphics pipeline. It is also designed for GPU optimization for fluid advection. + +Details will be updated as more features are coming soon. + +## Automatic build (easy!) +``` +./install.sh +``` +The application `Korra` will be created in build folder. Simply run `./Korra` to launch. + +## Manual build (if you prefer doing it manually) + +1. Clone using git clone --recursive git@github.com:trungtle/KorraFluidSolver.git + +If you forgot to call --recursive, you can recover the submodules by +``` +cd CIS563-FluidSolver (at top directory) +git submodule update --init --recursive +``` + +There should be 2 submodules for `jsoncpp` and `nanogui` + +2. Compile nanogui with cmake and make +``` +cd src/thirdparty/nanogui +cmake -G "Unix Makefiles" . +make +``` + +3. Compile Korra with cmake and make +``` +cd ../../../ (at top directory) +mkdir build +cd build +cmake -G "Unix Makefiles" ../ +make +``` +4. Launch +``` +./Korra +``` + + + +## Classes + +The following are classes for the fluid solver. + +### Viewer + +The _Viewer_ class contains all the OpenGL, glfw, glew, shader programs, and scene initialization. Once the the initialization is completed, the _Viewer_ kicks the simulation loop. The loop can be canceled by hitting the ESC key. + +- __Note__: By defining **#define TEST_SCENE** in `viewer.h` and `scene.h`, the test scene would be used instead. + +### Scene + +The _Scene_ class contains the _Camera_ and all other objects in the scene. The _Scene_ class takes in a json file in the `scene/` directory for initializing the fluid solver. In this case, it's the `scene.json` file. + +There are three objects of our interests: + +- *m_fluidContainer*, a _Box_ object that specifies the boundary of the fluid. +- *m_fluidGeo*, a _FluidGeo_ object that specifies the particles of the fluid. +- *m_fluidSolver*, a _FluidSolver_ object that gets updated every simulation frame to compute the fluid state. + +- __Note__: By defining **#define TEST_SCENE** in `viewer.h` and `scene.h`, the test scene would be used instead. + +### ShaderProgram + +The _ShaderProgram_ compiles the `glsl/simple.vert` vertex shader and the `glsl/simple.frag`. This program is used to draw simple geometry without any special shading. + +### ParticleAdvectProgram + +The _ParticleAdvectProgram_ compiles the `glsl/particle_advect.vert`, `glsl/particle_advect.frag`, `glsl/particle_draw.frag`, and `glsl/particle_draw.frag` into 2 programs: `m_programAdvect` and `m_programDraw`. + +This class is used to perform two render passes for transform feedback. In short, the first pass uses the `particle_advect.vert` to update particle positions but skipping the rasterization phase, passing its vertex attributes directly to the `partice_draw.vert` and `particle_draw.frag` for the actual drawing. This approaches allow us to parallelize the particle update using only the shaders. + +### Camera + +The _Camera_ class handles the view matrix. The _Camera_ class uses the _KeyboardControl_ class to handles user keyboard input. To control the _Camera_ movement, uses: + +- **W**: Pan up +- **S**: Pan down +- **A**: Pan left +- **D**: Pan right +- **Up**: Look up +- **Down**: Look down +- **Left**: Look left +- **Right**: Look right + +### Geometry + +The _Geometry_ is the base class for all the drawable geometry classes in a scene. It is not meant to be instanced directly but to be derived by new classes (etc. _Box_ and _FluidGeo_). _Geometry_ class contains all the information for transformations, vertex buffers, vertex arrays, index buffer, and drawing mode. + +Each new geometry instanced **NEEDS** to call Create() in order to properly initialize its data. + +This class supports the basic affine transformation: + +- Translate +- Rotate +- Scale + +This class supports three drawing mode: + +- Wireframe (GL_LINES) +- Shaded (GL_TRIANGLES) +- Vertex (GL_POINTS) + +### Box + +_Box_ is derived from _Geometry_. _Box_ represents a simple box geometry. + +### FluiGeo + +_FluiGeo_ is derived from _Geometry_. FluiGeo represents a collection of fluid particles. _FluidGeo_ also contains the particle positions and velocities. + +### FluidSolver + +_FluidSolver_ initializes all the particle information such as container boundary and particle separation. Its `Update()` function is called each frame to update the solver if needed. + +### KeyboardControl + +_KeyboardControl_ handles user keyboard input. + +## Code flow + +Starting with `main.cpp`, the _Viewer_ is initialized, then the simulation loop kicks in. For each frame, the _Scene_ calls its `Update()` and `Draw()` functions to update the state of the solver then render the result. + +## Performance Analysis + +I improved the performance around calls to tbb::parallel_for when searching neighbors, and tbb::parallel_reduce for computing density, pressure gradient, and viscosity. + +To solve fluid per frame: +- Without TBB: ~338ms +- With TBB: ~137ms + +## Camera control + +See Camera class section above. + +## LICENSE + +See LICENSE.md for the MIT License. + +## Third Party + +- CIS277, Camera code +- glfw, [Website](http://www.glfw.org/) +- glew, [Website](http://glew.sourceforge.net/) +- glm, [Website](http://glm.g-truc.net/0.9.7/index.html) +- opengl-tutorial.org, [Website](http://www.opengl-tutorial.org/) +- jsoncpp, [Github](https://github.com/open-source-parsers/jsoncpp) +- tbb, [Download](https://www.threadingbuildingblocks.org/) +- easylogging++, [Github](https://github.com/easylogging/easyloggingpp +) +- nanogui, [Github](https://github.com/wjakob/nanogui) +- stb_image, diff --git a/install.sh b/install.sh new file mode 100755 index 00000000..14c811d5 --- /dev/null +++ b/install.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# clone submodules +git submodule update --init --recursive + +# compile nanogui +cd src/thirdparty/nanogui +cmake -G "Unix Makefiles" . +make + +# compile Korra +cd ../../../ +mkdir build +cd build +cmake -G "Unix Makefiles" ../ +make + +#launch +./Korra diff --git a/logs/myeasylog.log b/logs/myeasylog.log new file mode 100644 index 00000000..1618e183 --- /dev/null +++ b/logs/myeasylog.log @@ -0,0 +1,38 @@ +2016-03-30 17:05:18,899 INFO [default] ------------------------ + +2016-03-30 17:05:18,900 INFO [default] UNIT TEST ENABLED + +2016-03-30 17:05:18,900 INFO [default] TestKernels + +2016-03-30 17:05:18,900 INFO [default] KernelPoly6, x: 0.000000, h: 10.000000 + +2016-03-30 17:05:18,900 INFO [default] 0.00156668 + +2016-03-30 17:05:18,900 INFO [default] KernelPoly6, x: 1.000000, h: 1.000000 + +2016-03-30 17:05:18,900 INFO [default] 0 + +2016-03-30 17:05:18,901 INFO [default] KernelPoly6, x: 5.400000, h: 2.400000 + +2016-03-30 17:05:18,901 INFO [default] 0 + +2016-03-30 17:05:18,901 INFO [default] KernelPoly6, x: 100.699997, h: 140.229996 + +2016-03-30 17:05:18,901 INFO [default] 6.45454e-08 + +2016-03-30 17:05:18,901 INFO [default] KernelPoly6, x: -30.000000, h: -22.000000 + +2016-03-30 17:05:18,901 INFO [default] 0 + +2016-03-30 17:05:18,901 INFO [default] KernelPoly6, x: 36.000000, h: -2.000000 + +2016-03-30 17:05:18,901 INFO [default] 0 + +2016-03-30 17:05:18,901 INFO [default] KernelPoly6, x: -4.000000, h: 20.000000 + +2016-03-30 17:05:18,901 INFO [default] 0 + +2016-03-30 17:05:18,901 INFO [default] END UNIT TEST + +2016-03-30 17:05:18,901 INFO [default] ------------------------ + diff --git a/nuparu/include/json/config.h b/nuparu/include/json/config.h index 51027dd8..0dcd8ae6 100644 --- a/nuparu/include/json/config.h +++ b/nuparu/include/json/config.h @@ -5,7 +5,6 @@ #ifndef JSON_CONFIG_H_INCLUDED #define JSON_CONFIG_H_INCLUDED -#include /// If defined, indicates that json library is embedded in CppTL library. //# define JSON_IN_CPPTL 1 @@ -57,67 +56,34 @@ // Storages, and 64 bits integer support is disabled. // #define JSON_NO_INT64 1 -#if defined(_MSC_VER) // MSVC -# if _MSC_VER <= 1200 // MSVC 6 - // Microsoft Visual Studio 6 only support conversion from __int64 to double - // (no conversion from unsigned __int64). -# define JSON_USE_INT64_DOUBLE_CONVERSION 1 - // Disable warning 4786 for VS6 caused by STL (identifier was truncated to '255' - // characters in the debug information) - // All projects I've ever seen with VS6 were using this globally (not bothering - // with pragma push/pop). -# pragma warning(disable : 4786) -# endif // MSVC 6 - -# if _MSC_VER >= 1500 // MSVC 2008 - /// Indicates that the following function is deprecated. -# define JSONCPP_DEPRECATED(message) __declspec(deprecated(message)) -# endif - -#endif // defined(_MSC_VER) - - -#ifndef JSON_HAS_RVALUE_REFERENCES - -#if defined(_MSC_VER) && _MSC_VER >= 1600 // MSVC >= 2010 -#define JSON_HAS_RVALUE_REFERENCES 1 -#endif // MSVC >= 2010 - -#ifdef __clang__ -#if __has_feature(cxx_rvalue_references) -#define JSON_HAS_RVALUE_REFERENCES 1 -#endif // has_feature - -#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc) -#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L) -#define JSON_HAS_RVALUE_REFERENCES 1 -#endif // GXX_EXPERIMENTAL - -#endif // __clang__ || __GNUC__ - -#endif // not defined JSON_HAS_RVALUE_REFERENCES - -#ifndef JSON_HAS_RVALUE_REFERENCES -#define JSON_HAS_RVALUE_REFERENCES 0 +#if defined(_MSC_VER) && _MSC_VER <= 1200 // MSVC 6 +// Microsoft Visual Studio 6 only support conversion from __int64 to double +// (no conversion from unsigned __int64). +#define JSON_USE_INT64_DOUBLE_CONVERSION 1 +// Disable warning 4786 for VS6 caused by STL (identifier was truncated to '255' +// characters in the debug information) +// All projects I've ever seen with VS6 were using this globally (not bothering +// with pragma push/pop). +#pragma warning(disable : 4786) +#endif // if defined(_MSC_VER) && _MSC_VER < 1200 // MSVC 6 + +#if defined(_MSC_VER) && _MSC_VER >= 1500 // MSVC 2008 +/// Indicates that the following function is deprecated. +#define JSONCPP_DEPRECATED(message) __declspec(deprecated(message)) +#elif defined(__clang__) && defined(__has_feature) +#if __has_feature(attribute_deprecated_with_message) +#define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message))) +#endif +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) +#define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message))) +#elif defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) +#define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__)) #endif - -#ifdef __clang__ -#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc) -# if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) -# define JSONCPP_DEPRECATED(message) __attribute__ ((deprecated(message))) -# elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) -# define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__)) -# endif // GNUC version -#endif // __clang__ || __GNUC__ #if !defined(JSONCPP_DEPRECATED) #define JSONCPP_DEPRECATED(message) #endif // if !defined(JSONCPP_DEPRECATED) -#if __GNUC__ >= 6 -# define JSON_USE_INT64_DOUBLE_CONVERSION 1 -#endif - namespace Json { typedef int Int; typedef unsigned int UInt; diff --git a/nuparu/include/json/features.h b/nuparu/include/json/features.h index 1bb7bb61..78135478 100644 --- a/nuparu/include/json/features.h +++ b/nuparu/include/json/features.h @@ -44,12 +44,6 @@ class JSON_API Features { /// \c true if root must be either an array or an object value. Default: \c /// false. bool strictRoot_; - - /// \c true if dropped null placeholders are allowed. Default: \c false. - bool allowDroppedNullPlaceholders_; - - /// \c true if numeric object key are allowed. Default: \c false. - bool allowNumericKeys_; }; } // namespace Json diff --git a/nuparu/include/json/reader.h b/nuparu/include/json/reader.h index 70d9505b..e1bd6296 100644 --- a/nuparu/include/json/reader.h +++ b/nuparu/include/json/reader.h @@ -35,18 +35,6 @@ class JSON_API Reader { typedef char Char; typedef const Char* Location; - /** \brief An error tagged with where in the JSON text it was encountered. - * - * The offsets give the [start, limit) range of bytes within the text. Note - * that this is bytes, not codepoints. - * - */ - struct StructuredError { - ptrdiff_t offset_start; - ptrdiff_t offset_limit; - std::string message; - }; - /** \brief Constructs a Reader allowing all features * for parsing. */ @@ -123,38 +111,6 @@ class JSON_API Reader { */ std::string getFormattedErrorMessages() const; - /** \brief Returns a vector of structured erros encounted while parsing. - * \return A (possibly empty) vector of StructuredError objects. Currently - * only one error can be returned, but the caller should tolerate - * multiple - * errors. This can occur if the parser recovers from a non-fatal - * parse error and then encounters additional errors. - */ - std::vector getStructuredErrors() const; - - /** \brief Add a semantic error message. - * \param value JSON Value location associated with the error - * \param message The error message. - * \return \c true if the error was successfully added, \c false if the - * Value offset exceeds the document size. - */ - bool pushError(const Value& value, const std::string& message); - - /** \brief Add a semantic error message with extra context. - * \param value JSON Value location associated with the error - * \param message The error message. - * \param extra Additional JSON Value location to contextualize the error - * \return \c true if the error was successfully added, \c false if either - * Value offset exceeds the document size. - */ - bool pushError(const Value& value, const std::string& message, const Value& extra); - - /** \brief Return whether there are any errors. - * \return \c true if there are no errors to report \c false if - * errors have occurred. - */ - bool good() const; - private: enum TokenType { tokenEndOfStream = 0, @@ -268,7 +224,7 @@ class JSON_API CharReader { char const* beginDoc, char const* endDoc, Value* root, std::string* errs) = 0; - class JSON_API Factory { + class Factory { public: virtual ~Factory() {} /** \brief Allocate a CharReader via operator new(). @@ -321,9 +277,6 @@ class JSON_API CharReaderBuilder : public CharReader::Factory { the JSON value in the input string. - `"rejectDupKeys": false or true` - If true, `parse()` returns false when a key is duplicated within an object. - - `"allowSpecialFloats": false or true` - - If true, special float values (NaNs and infinities) are allowed - and their values are lossfree restorable. You can examine 'settings_` yourself to see the defaults. You can also write and read them just like any @@ -333,9 +286,9 @@ class JSON_API CharReaderBuilder : public CharReader::Factory { Json::Value settings_; CharReaderBuilder(); - ~CharReaderBuilder() override; + virtual ~CharReaderBuilder(); - CharReader* newCharReader() const override; + virtual CharReader* newCharReader() const; /** \return true if 'settings' are legal and consistent; * otherwise, indicate bad settings via 'invalid'. diff --git a/nuparu/include/json/value.h b/nuparu/include/json/value.h index b3f1ceb8..fe55bfde 100644 --- a/nuparu/include/json/value.h +++ b/nuparu/include/json/value.h @@ -40,10 +40,10 @@ namespace Json { class JSON_API Exception : public std::exception { public: Exception(std::string const& msg); - ~Exception() throw() override; - char const* what() const throw() override; + virtual ~Exception() throw(); + virtual char const* what() const throw(); protected: - std::string msg_; + std::string const msg_; }; /** Exceptions which the user cannot easily avoid. @@ -175,8 +175,11 @@ class JSON_API Value { typedef Json::LargestUInt LargestUInt; typedef Json::ArrayIndex ArrayIndex; - static const Value& null; ///< We regret this reference to a global instance; prefer the simpler Value(). - static const Value& nullRef; ///< just a kludge for binary-compatibility; same as null + static const Value& nullRef; +#if !defined(__ARMEL__) + /// \deprecated This exists for binary compatibility only. Use nullRef. + static const Value null; +#endif /// Minimum signed integer value that can be stored in a Json::Value. static const LargestInt minLargestInt; /// Maximum signed integer value that can be stored in a Json::Value. @@ -212,9 +215,6 @@ class JSON_API Value { CZString(ArrayIndex index); CZString(char const* str, unsigned length, DuplicationPolicy allocate); CZString(CZString const& other); -#if JSON_HAS_RVALUE_REFERENCES - CZString(CZString&& other); -#endif ~CZString(); CZString& operator=(CZString other); bool operator<(CZString const& other) const; @@ -297,15 +297,11 @@ Json::Value obj_value(Json::objectValue); // {} Value(bool value); /// Deep copy. Value(const Value& other); -#if JSON_HAS_RVALUE_REFERENCES - /// Move constructor - Value(Value&& other); -#endif ~Value(); /// Deep copy, then swap(other). /// \note Over-write existing comments. To preserve comments, use #swapPayload(). - Value& operator=(Value other); + Value &operator=(const Value &other); /// Swap everything. void swap(Value& other); /// Swap values but leave comments and source offsets in place. @@ -552,13 +548,6 @@ Json::Value obj_value(Json::objectValue); // {} iterator begin(); iterator end(); - // Accessors for the [start, limit) range of bytes within the JSON text from - // which this value was parsed, if any. - void setOffsetStart(ptrdiff_t start); - void setOffsetLimit(ptrdiff_t limit); - ptrdiff_t getOffsetStart() const; - ptrdiff_t getOffsetLimit() const; - private: void initBasic(ValueType type, bool allocated = false); @@ -595,11 +584,6 @@ Json::Value obj_value(Json::objectValue); // {} unsigned int allocated_ : 1; // Notes: if declared as bool, bitfield is useless. // If not allocated_, string_ must be null-terminated. CommentInfo* comments_; - - // [start, limit) byte offsets in the source JSON text from which this Value - // was extracted. - ptrdiff_t start_; - ptrdiff_t limit_; }; /** \brief Experimental and untested: represents an element of the "path" to @@ -745,7 +729,6 @@ class JSON_API ValueConstIterator : public ValueIteratorBase { typedef ValueConstIterator SelfType; ValueConstIterator(); - ValueConstIterator(ValueIterator const& other); private: /*! \internal Use by Value to create an iterator. @@ -795,7 +778,7 @@ class JSON_API ValueIterator : public ValueIteratorBase { typedef ValueIterator SelfType; ValueIterator(); - explicit ValueIterator(const ValueConstIterator& other); + ValueIterator(const ValueConstIterator& other); ValueIterator(const ValueIterator& other); private: diff --git a/nuparu/include/json/version.h b/nuparu/include/json/version.h index 6c570a1e..087fc638 100644 --- a/nuparu/include/json/version.h +++ b/nuparu/include/json/version.h @@ -3,10 +3,10 @@ #ifndef JSON_VERSION_H_INCLUDED # define JSON_VERSION_H_INCLUDED -# define JSONCPP_VERSION_STRING "1.7.0" -# define JSONCPP_VERSION_MAJOR 1 -# define JSONCPP_VERSION_MINOR 7 -# define JSONCPP_VERSION_PATCH 0 +# define JSONCPP_VERSION_STRING "0.10.5" +# define JSONCPP_VERSION_MAJOR 0 +# define JSONCPP_VERSION_MINOR 10 +# define JSONCPP_VERSION_PATCH 5 # define JSONCPP_VERSION_QUALIFIER # define JSONCPP_VERSION_HEXA ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) | (JSONCPP_VERSION_PATCH << 8)) diff --git a/nuparu/include/json/writer.h b/nuparu/include/json/writer.h index 49b15124..2da72b68 100644 --- a/nuparu/include/json/writer.h +++ b/nuparu/include/json/writer.h @@ -99,10 +99,6 @@ class JSON_API StreamWriterBuilder : public StreamWriter::Factory { Strictly speaking, this is not valid JSON. But when the output is being fed to a browser's Javascript, it makes for smaller output and the browser can handle the output just fine. - - "useSpecialFloats": false or true - - If true, outputs non-finite floating point values in the following way: - NaN values as "NaN", positive infinity as "Infinity", and negative infinity - as "-Infinity". You can examine 'settings_` yourself to see the defaults. You can also write and read them just like any @@ -112,12 +108,12 @@ class JSON_API StreamWriterBuilder : public StreamWriter::Factory { Json::Value settings_; StreamWriterBuilder(); - ~StreamWriterBuilder() override; + virtual ~StreamWriterBuilder(); /** * \throw std::exception if something goes wrong (e.g. invalid settings) */ - StreamWriter* newStreamWriter() const override; + virtual StreamWriter* newStreamWriter() const; /** \return true if 'settings' are legal and consistent; * otherwise, indicate bad settings via 'invalid'. @@ -158,29 +154,18 @@ class JSON_API FastWriter : public Writer { public: FastWriter(); - ~FastWriter() override {} + virtual ~FastWriter() {} void enableYAMLCompatibility(); - /** \brief Drop the "null" string from the writer's output for nullValues. - * Strictly speaking, this is not valid JSON. But when the output is being - * fed to a browser's Javascript, it makes for smaller output and the - * browser can handle the output just fine. - */ - void dropNullPlaceholders(); - - void omitEndingLineFeed(); - public: // overridden from Writer - std::string write(const Value& root) override; + virtual std::string write(const Value& root); private: void writeValue(const Value& value); std::string document_; bool yamlCompatiblityEnabled_; - bool dropNullPlaceholders_; - bool omitEndingLineFeed_; }; /** \brief Writes a Value in JSON format in a @@ -210,14 +195,14 @@ class JSON_API FastWriter : public Writer { class JSON_API StyledWriter : public Writer { public: StyledWriter(); - ~StyledWriter() override {} + virtual ~StyledWriter() {} public: // overridden from Writer /** \brief Serialize a Value in JSON format. * \param root Value to serialize. * \return String containing the JSON document that represents the root value. */ - std::string write(const Value& root) override; + virtual std::string write(const Value& root); private: void writeValue(const Value& value); @@ -238,8 +223,8 @@ class JSON_API StyledWriter : public Writer { ChildValues childValues_; std::string document_; std::string indentString_; - unsigned int rightMargin_; - unsigned int indentSize_; + int rightMargin_; + int indentSize_; bool addChildValues_; }; @@ -302,7 +287,7 @@ class JSON_API StyledStreamWriter { ChildValues childValues_; std::ostream* document_; std::string indentString_; - unsigned int rightMargin_; + int rightMargin_; std::string indentation_; bool addChildValues_ : 1; bool indented_ : 1; diff --git a/nuparu/include/openvdb/bin/vdb_print b/nuparu/include/openvdb/bin/vdb_print new file mode 100755 index 00000000..e4063275 Binary files /dev/null and b/nuparu/include/openvdb/bin/vdb_print differ diff --git a/nuparu/include/openvdb/bin/vdb_render b/nuparu/include/openvdb/bin/vdb_render new file mode 100755 index 00000000..24f7c319 Binary files /dev/null and b/nuparu/include/openvdb/bin/vdb_render differ diff --git a/nuparu/include/openvdb/bin/vdb_view b/nuparu/include/openvdb/bin/vdb_view new file mode 100755 index 00000000..7242c1bc Binary files /dev/null and b/nuparu/include/openvdb/bin/vdb_view differ diff --git a/nuparu/include/openvdb/include/houdini_utils/OP_NodeChain.h b/nuparu/include/openvdb/include/houdini_utils/OP_NodeChain.h new file mode 100644 index 00000000..ff4107c4 --- /dev/null +++ b/nuparu/include/openvdb/include/houdini_utils/OP_NodeChain.h @@ -0,0 +1,167 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file OP_NodeChain.h +// +/// @author FX R&D Simulation team +// +/// @brief Utilities to collect a chain of adjacent nodes of a particular type +/// so that they can be cooked in a single step +/// @details For example, adjacent xform SOPs could be collapsed +/// by composing their transformation matrices into a single matrix. + +#ifndef HOUDINI_UTILS_OP_NODECHAIN_HAS_BEEN_INCLUDED +#define HOUDINI_UTILS_OP_NODECHAIN_HAS_BEEN_INCLUDED + +#include +#include // for CH_AutoEvaluateTime +#include +#include +#include // for fpreal +#include +#include +#include // for UT_VERSION_INT +#include +#include +#include +#if defined(PRODDEV_BUILD) || defined(DWREAL_IS_DOUBLE) + // OPENVDB_HOUDINI_API, which has no meaning in a DWA build environment but + // must at least exist, is normally defined by including openvdb/Platform.h. + // For DWA builds (i.e., if either PRODDEV_BUILD or DWREAL_IS_DOUBLE exists), + // that introduces an unwanted and unnecessary library dependency. + #ifndef OPENVDB_HOUDINI_API + #define OPENVDB_HOUDINI_API + #endif +#else + #include +#endif + + +namespace houdini_utils { + +/// @brief Return a list of adjacent, uncooked nodes of the given @c NodeType, +/// starting from @a startNode and traversing the network upstream +/// along input 0 connections. +/// @details The list is ordered from the topmost node to @a startNode. +/// @note Lock the inputs of the topmost node before cooking the chain. +template +inline std::vector +getNodeChain(OP_Context& context, NodeType* startNode, bool addInterest = true) +{ + struct Local { + /// Return the nearest upstream node to the given node, traversing + /// only input 0 connections and omitting bypassed nodes. + static inline OP_Node* nextInput( +#if (UT_VERSION_INT >= 0x0c0500aa) // 12.5.170 + fpreal now, +#else + fpreal /*now*/, +#endif + OP_Node* node) + { + OP_Node* input = node->getInput(0, /*mark_used=*/true); +#if (UT_VERSION_INT >= 0x0c0500aa) // 12.5.170 + while (input) { + OP_Node* passThrough = input->getPassThroughNode(now, /*mark_used=*/true); + if (!passThrough) break; + input = passThrough; + } +#else + while (input && input->getBypass()) { + input = input->getInput(0, /*mark_used=*/true); + } +#endif + return input; + } + }; // struct Local + + const fpreal now = context.getTime(); + + std::vector nodes; + for (OP_Node* node = startNode; node != NULL; node = Local::nextInput(now, node)) { + // Stop if the node does not need to cook. + if (!node->needToCook(context, /*query_only=*/true)) break; + + if (NodeType* candidate = dynamic_cast(node)) { + nodes.push_back(candidate); + } else { + // Stop if the node is not of the requested type, unless it is a SOP_NULL. + std::string opname = node->getName().toStdString().substr(0, 4); + if (opname == "null") continue; + break; // stop for all other node types + } + } + std::reverse(nodes.begin(), nodes.end()); + + if (addInterest && startNode != nodes[0] && nodes[0]->getInput(0)) { + startNode->addExtraInput(nodes[0]->getInput(0), OP_INTEREST_DATA); + } + + return nodes; +} + + +//////////////////////////////////////// + + +/// @brief Constructing an OP_EvalScope object allows one to temporarily +/// (for the duration of the current scope) set the evaluation context +/// and time for a node other than the one that is currently being cooked. +/// @internal Entire class is defined in header, so do *NOT* use *_API +class OP_EvalScope +{ +public: + OP_EvalScope(OP_Node& node, OP_Context& context): + mAutoEvaluator( + *OPgetDirector()->getCommandManager(), + context.getThread(), + context.getTime(), + node.getChannels()), + mDirector(OPgetDirector()), + mThread(context.getThread()) + { + mDirector->pushCwd(mThread, &node); + } + + ~OP_EvalScope() { mDirector->popCwd(mThread); } + +private: + CH_AutoEvaluateTime mAutoEvaluator; + OP_Director* mDirector; + int mThread; +}; + +} // namespace houdini_utils + +#endif // HOUDINI_UTILS_OP_NODECHAIN_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/houdini_utils/ParmFactory.h b/nuparu/include/openvdb/include/houdini_utils/ParmFactory.h new file mode 100644 index 00000000..6a90e7e9 --- /dev/null +++ b/nuparu/include/openvdb/include/houdini_utils/ParmFactory.h @@ -0,0 +1,486 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file ParmFactory.h +/// @author FX R&D OpenVDB team +/// +/// @brief A collection of factory methods and helper functions +/// to simplify Houdini plugin development and maintenance. + +#ifndef HOUDINI_UTILS_PARM_FACTORY_HAS_BEEN_INCLUDED +#define HOUDINI_UTILS_PARM_FACTORY_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#if defined(PRODDEV_BUILD) || defined(DWREAL_IS_DOUBLE) + // OPENVDB_HOUDINI_API, which has no meaning in a DWA build environment but + // must at least exist, is normally defined by including openvdb/Platform.h. + // For DWA builds (i.e., if either PRODDEV_BUILD or DWREAL_IS_DOUBLE exists), + // that introduces an unwanted and unnecessary library dependency. + #ifndef OPENVDB_HOUDINI_API + #define OPENVDB_HOUDINI_API + #endif +#else + #include +#endif +#include +#include +#include +#include + + +#ifdef SESI_OPENVDB + #ifdef OPENVDB_HOUDINI_API + #undef OPENVDB_HOUDINI_API + #define OPENVDB_HOUDINI_API + #endif +#endif + + +class GU_Detail; +class OP_OperatorTable; + +namespace houdini_utils { + +class ParmFactory; + + +/// @brief Parameter template list that is always terminated. +class OPENVDB_HOUDINI_API ParmList +{ +public: + typedef std::vector PrmTemplateVec; + + ParmList() {} + + bool empty() const { return mParmVec.empty(); } + size_t size() const { return mParmVec.size(); } + + void clear() { mParmVec.clear(); mSwitchers.clear(); } + + ParmList& add(const PRM_Template&); + ParmList& add(const ParmFactory&); + + ParmList& beginSwitcher(const std::string& token, const std::string& label = ""); + ParmList& endSwitcher(); + + ParmList& addFolder(const std::string& label); + + /// Return a heap-allocated copy of this list's array of parameters. + PRM_Template* get() const; + +private: + struct SwitcherInfo { size_t parmIdx; std::vector folders; }; + typedef std::vector SwitcherStack; + + void incFolderParmCount(); + SwitcherInfo* getCurrentSwitcher(); + + PrmTemplateVec mParmVec; + SwitcherStack mSwitchers; +}; + + +//////////////////////////////////////// + + +/// @class ParmFactory +/// @brief Helper class to simplify construction of PRM_Templates and +/// dynamic user interfaces. +/// +/// Usage example: +/// @code +/// houdini_utils::ParmList parms; +/// +/// parms.add(houdini_utils::ParmFactory(PRM_STRING, "group", "Group") +/// .setHelpText("Specify a subset of the input VDB grids to be processed.") +/// .setChoiceList(&houdini_utils::PrimGroupMenu)); +/// +/// parms.add(houdini_utils::ParmFactory(PRM_FLT_J, "tolerance", "Pruning Tolerance") +/// .setDefault(PRMzeroDefaults) +/// .setRange(PRM_RANGE_RESTRICTED, 0, PRM_RANGE_UI, 1)); +/// @endcode +class OPENVDB_HOUDINI_API ParmFactory +{ +public: + ParmFactory(PRM_Type, const std::string& token, const std::string& label); + ParmFactory(PRM_MultiType, const std::string& token, const std::string& label); + + // Settings + ParmFactory& setCallbackFunc(const PRM_Callback&); + + /// Specify a menu of values for this parameter. + ParmFactory& setChoiceList(const PRM_ChoiceList*); + /// @brief Specify a menu type and a list of token, label, token, label,... pairs + /// for this parameter. + /// @param typ specifies the menu behavior (toggle, replace, etc.) + /// @param items a list of token, label, token, label,... string pairs + ParmFactory& setChoiceListItems(PRM_ChoiceListType typ, const std::vector& items); + /// @brief Specify a menu type and a list of token, label, token, label,... pairs + /// for this parameter. + /// @param typ specifies the menu behavior (toggle, replace, etc.) + /// @param items a list of token, label, token, label,... string pairs + /// @note The @a items array must be null-terminated. + ParmFactory& setChoiceListItems(PRM_ChoiceListType typ, const char* const* items); + + +#if defined(GCC3) + #define IS_DEPRECATED __attribute__ ((deprecated)) +#elif defined(_MSC_VER) + #define IS_DEPRECATED __declspec(deprecated) +#else + #define IS_DEPRECATED +#endif + + /// @brief Specify a menu type and either a list of menu item labels or a list of + /// token, label, token, label,... pairs for this parameter. + /// @param typ specifies the menu behavior (toggle, replace, etc.) + /// @param items a list of menu item labels or token, label, token, label,... pairs + /// @param paired if @c false, treat all the elements of @a items as labels and assign + /// them numeric tokens starting from zero; otherwise, treat the elements of @a items + /// as token, label, token, label,... pairs + /// @deprecated Use setChoiceListItems() instead. Using unpaired items may mean + /// less typing now, but it prevents you from reordering or deleting entries later. + IS_DEPRECATED ParmFactory& setChoiceList(PRM_ChoiceListType typ, + const std::vector& items, bool paired = false); + /// @brief Specify a menu type and either a list of menu item labels or a list of + /// token, label, token, label,... pairs for this parameter. + /// @param typ specifies the menu behavior (toggle, replace, etc.) + /// @param items a list of menu item labels or token, label, token, label,... pairs + /// @param paired if @c false, treat all the elements of @a items as labels and assign + /// them numeric tokens starting from zero; otherwise, treat the elements of @a items + /// as token, label, token, label,... pairs + /// @note The @a items array must be null-terminated. + /// @deprecated Use setChoiceListItems() instead. Using unpaired items may mean + /// less typing now, but it prevents you from reordering or deleting entries later. + IS_DEPRECATED ParmFactory& setChoiceList(PRM_ChoiceListType typ, + const char* const* items, bool paired = false); + +#undef IS_DEPRECATED + + ParmFactory& setConditional(const PRM_ConditionalBase*); + + /// @brief Specify a default value for this parameter. + /// @details If the string is null, the floating-point value will be used + /// (but rounded if this parameter is integer-valued). + /// @note The string pointer must not point to a temporary. + ParmFactory& setDefault(fpreal, const char* = NULL, CH_StringMeaning = CH_STRING_LITERAL); + /// @brief Specify a default string value for this parameter. + ParmFactory& setDefault(const std::string&, CH_StringMeaning = CH_STRING_LITERAL); + /// @brief Specify default numeric values for the vector elements of this parameter + /// (assuming its vector size is > 1). + /// @details Floating-point values will be rounded if this parameter is integer-valued. + ParmFactory& setDefault(const std::vector&); + /// @brief Specify default values for the vector elements of this parameter + /// (assuming its vector size is > 1). + ParmFactory& setDefault(const std::vector&); + /// Specify a default value or values for this parameter. + ParmFactory& setDefault(const PRM_Default*); + + ParmFactory& setHelpText(const char*); + + ParmFactory& setParmGroup(int); + + /// Specify a range for this parameter's values. + ParmFactory& setRange( + PRM_RangeFlag minFlag, fpreal minVal, + PRM_RangeFlag maxFlag, fpreal maxVal); + /// @brief Specify range for the values of this parameter's vector elements + /// (assuming its vector size is > 1). + ParmFactory& setRange(const std::vector&); + /// Specify a range or ranges for this parameter's values. + ParmFactory& setRange(const PRM_Range*); + + /// Specify (@e key, @e value) pairs of spare data for this parameter. + ParmFactory& setSpareData(const std::map&); + /// Specify spare data for this parameter. + ParmFactory& setSpareData(const PRM_SpareData*); + + /// @brief Specify the list of parameters for each instance of a multiparm. + /// @note This setting is ignored for non-multiparm parameters. + /// @note Parameter name tokens should include a '#' character. + ParmFactory& setMultiparms(const ParmList&); + + /// Specify an extended type for this parameter. + ParmFactory& setTypeExtended(PRM_TypeExtended); + + /// @brief Specify the number of vector elements for this parameter. + /// @details (The default vector size is one element.) + ParmFactory& setVectorSize(int); + + /// Construct and return the parameter template. + PRM_Template get() const; + +private: + struct Impl; + boost::shared_ptr mImpl; + + // For internal use only, and soon to be removed: + ParmFactory& doSetChoiceList(PRM_ChoiceListType, const std::vector&, bool); + ParmFactory& doSetChoiceList(PRM_ChoiceListType, const char* const* items, bool); +}; + + +//////////////////////////////////////// + + +class OpPolicy; +typedef boost::shared_ptr OpPolicyPtr; + + +/// @brief Helper class to simplify operator registration +/// +/// Usage example: +/// @code +/// void +/// newPopOperator(OP_OperatorTable* table) +/// { +/// houdini_utils::ParmList parms; +/// +/// parms.add(houdini_utils::ParmFactory(PRM_STRING, "group", "Group") +/// .setHelpText("Specify a subset of the input VDB grids to be processed.") +/// .setChoiceList(&houdini_utils::PrimGroupMenu)); +/// +/// parms.add(...); +/// +/// ... +/// +/// houdini_utils::OpFactory(MyOpPolicy(), My Node", +/// POP_DW_MyNode::factory, parms, *table, houdini_utils::OpFactory::POP) +/// .addInput("Input geometry") // input 0 (required) +/// .addOptionalInput("Reference geometry"); // input 1 (optional) +/// } +/// @endcode +class OPENVDB_HOUDINI_API OpFactory +{ +public: + enum OpFlavor { SOP, POP, ROP, VOP, HDA }; + + /// @brief Return "SOP" for the SOP flavor, "POP" for the POP flavor, etc. + /// @details Useful in OpPolicy classes for constructing type and icon names. + static std::string flavorToString(OpFlavor); + + /// @brief Construct a factory that on destruction registers a new operator type. + /// @param english the operator's UI name, as it should appear in menus + /// @param ctor a factory function that creates operators of this type + /// @param parms the parameter template list for operators of this type + /// @param table the registry to which to add this operator type + /// @param flavor the operator's class (SOP, POP, etc.) + /// @details @c OpPolicyType specifies the type of OpPolicy to be used to control + /// the factory's behavior. The (unused) @c OpPolicyType argument is required + /// to enable the compiler to infer the type of the template argument + /// (there is no other way to invoke a templated constructor). + template + OpFactory(const OpPolicyType& /*unused*/, const std::string& english, + OP_Constructor ctor, ParmList& parms, OP_OperatorTable& table, OpFlavor flavor = SOP) + { + this->init(OpPolicyPtr(new OpPolicyType), english, ctor, parms, table, flavor); + } + + /// @note Factories initialized with this constructor use the DWAOpPolicy. + OpFactory(const std::string& english, OP_Constructor ctor, + ParmList& parms, OP_OperatorTable& table, OpFlavor flavor = SOP); + + /// Register the operator. + ~OpFactory(); + + /// @brief Return the new operator's flavor (SOP, POP, etc.). + /// @details This accessor is mainly for use by OpPolicy objects. + OpFlavor flavor() const; + /// @brief Return the new operator's flavor as a string ("SOP", "POP", etc.). + /// @details This accessor is mainly for use by OpPolicy objects. + std::string flavorString() const; + /// @brief Return the new operator's type name. + /// @details This accessor is mainly for use by OpPolicy objects. + const std::string& name() const; + /// @brief Return the new operator's UI name. + /// @details This accessor is mainly for use by OpPolicy objects. + const std::string& english() const; + /// @brief Return the new operator's icon name. + /// @details This accessor is mainly for use by OpPolicy objects. + const std::string& iconName() const; + /// @brief Return the new operator's help URL. + /// @details This accessor is mainly for use by OpPolicy objects. + const std::string& helpURL() const; + /// @brief Return the operator table with which this factory is associated. + /// @details This accessor is mainly for use by OpPolicy objects. + const OP_OperatorTable& table() const; + + /// @brief Construct a type name for this operator from the given English name + /// and add it as an alias. + /// @details For backward compatibility when an operator needs to be renamed, + /// add the old name as an alias. + OpFactory& addAlias(const std::string& english); + /// @brief Add an alias for this operator. + /// @details For backward compatibility when an operator needs to be renamed, + /// add the old name as an alias. + /// @note This variant takes an operator type name rather than an English name. + OpFactory& addAliasVerbatim(const std::string& name); + /// Add a required input with the given name. + OpFactory& addInput(const std::string& name); + /// Add an optional input with the given name. + OpFactory& addOptionalInput(const std::string& name); + /// @brief Set the maximum number of inputs allowed by this operator. + /// @note It is only necessary to set this limit if there are inputs + /// that have not been named with addInput() or addOptionalInput(). + OpFactory& setMaxInputs(unsigned = 9999); + /// Specify obsolete parameters to this operator. + OpFactory& setObsoleteParms(const ParmList&); + /// Add one or more local variables to this operator. + OpFactory& setLocalVariables(CH_LocalVariable*); + OpFactory& setFlags(unsigned); + +private: + OpFactory(const OpFactory&); + OpFactory& operator=(const OpFactory&); + + void init(OpPolicyPtr, const std::string& english, OP_Constructor, + ParmList&, OP_OperatorTable&, OpFlavor); + + struct Impl; + boost::shared_ptr mImpl; +}; + + +//////////////////////////////////////// + + +/// @brief An OpPolicy customizes the behavior of an OpFactory. +/// This base class specifies the required interface. +class OPENVDB_HOUDINI_API OpPolicy +{ +public: + OpPolicy() {} + virtual ~OpPolicy() {} + + /// @brief Return a type name for the operator defined by the given factory. + std::string getName(const OpFactory& factory) { return getName(factory, factory.english()); } + + /// @brief Convert an English name into a type name for the operator defined by + /// the given factory, and return the result. + /// @details In this base class implementation, the operator's type name is generated + /// by calling @c UT_String::forceValidVariableName() on the English name. + /// @note This function might be called (from OpFactory::addAlias(), for example) + /// with an English name other than the one returned by + /// factory.@link OpFactory::english() english()@endlink. + virtual std::string getName(const OpFactory& factory, const std::string& english); + + /// @brief Return an icon name for the operator defined by the given factory. + /// @details Return an empty string to use Houdini's default icon naming scheme. + virtual std::string getIconName(const OpFactory&) { return ""; } + + /// @brief Return a help URL for the operator defined by the given factory. + virtual std::string getHelpURL(const OpFactory&) { return ""; } +}; + +/// @brief Default policy for DWA operator types +class OPENVDB_HOUDINI_API DWAOpPolicy: public OpPolicy +{ +public: + /// @brief Return a type name for the operator defined by the given factory. + /// @details The operator's type name is generated from its English name + /// by prepending "DW_" and removing non-alphanumeric characters. + /// For example, "My Node" becomes "DW_MyNode". + virtual std::string getName(const OpFactory&, const std::string& english); + + /// @brief Return a help URL for the operator defined by the given factory. + virtual std::string getHelpURL(const OpFactory&); +}; + +/// @brief Default policies for DWA R&D operator types +/// +/// See http://mydw.anim.dreamworks.com/display/FX/Houdini+Plugin+and+HDA+Naming+Rules + +class DWALevel1RnDOpPolicy : public DWAOpPolicy +{ +public: + /// @brief Level 1: show-wide + virtual std::string getIconName(const OpFactory&) { return "DreamWorks_L1_RnD"; } +}; + +class DWALevel2RnDOpPolicy : public DWAOpPolicy +{ +public: + /// @brief Level 2: global + virtual std::string getIconName(const OpFactory&) { return "DreamWorks_L2_RnD"; } +}; + +class DWALevel3RnDOpPolicy : public DWAOpPolicy +{ +public: + /// @brief Level 3: depot, map, most stable + virtual std::string getIconName(const OpFactory&) { return "DreamWorks_L3_RnD"; } +}; + +//////////////////////////////////////// + + +/// @brief Helper class to manage input locking. +class OPENVDB_HOUDINI_API ScopedInputLock +{ +public: + ScopedInputLock(SOP_Node& node, OP_Context& context): mNode(&node) + { + if (mNode->lockInputs(context) >= UT_ERROR_ABORT) { + throw std::runtime_error("failed to lock inputs"); + } + } + + ~ScopedInputLock() { mNode->unlockInputs(); } + +private: + SOP_Node* mNode; +}; + + +//////////////////////////////////////// + + +// Extended group name drop-down menu incorporating "@= +#include +#include + +#if defined(PRODDEV_BUILD) || defined(DWREAL_IS_DOUBLE) || defined(SESI_OPENVDB) + // OPENVDB_HOUDINI_API, which has no meaning in a DWA build environment but + // must at least exist, is normally defined by including openvdb/Platform.h. + // For DWA builds (i.e., if either PRODDEV_BUILD or DWREAL_IS_DOUBLE exists), + // that introduces an unwanted and unnecessary library dependency. + #ifndef OPENVDB_HOUDINI_API + #define OPENVDB_HOUDINI_API + #endif +#else + #include +#endif + +namespace houdini_utils { + + +/// @brief Add geometry to the given GU_Detail to create a box with the given corners. +/// @param corners the eight corners of the box +/// @param color an optional color for the added geometry +/// @param shaded if false, generate a wireframe box; otherwise, generate a solid box +/// @param alpha an optional opacity for the added geometry +OPENVDB_HOUDINI_API void createBox(GU_Detail&, UT_Vector3 corners[8], + const UT_Vector3* color = NULL, bool shaded = false, float alpha = 1.0); + +} // namespace houdini_utils + +#endif // HOUDINI_UTILS_GEOMETRY_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/Exceptions.h b/nuparu/include/openvdb/include/openvdb/Exceptions.h new file mode 100644 index 00000000..c2a38386 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/Exceptions.h @@ -0,0 +1,112 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_EXCEPTIONS_HAS_BEEN_INCLUDED +#define OPENVDB_EXCEPTIONS_HAS_BEEN_INCLUDED + +#include +#include +#include +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { + +class OPENVDB_API Exception: public std::exception +{ +public: + virtual const char* what() const throw() + { + try { return mMessage.c_str(); } catch (...) {}; + return NULL; + } + + virtual ~Exception() throw() {} + +protected: + Exception() throw() {} + explicit Exception(const char* eType, const std::string* const msg = NULL) throw() + { + try { + if (eType) mMessage = eType; + if (msg) mMessage += ": " + (*msg); + } catch (...) {} + } + +private: + std::string mMessage; +}; + + +#define OPENVDB_EXCEPTION(_classname) \ +class OPENVDB_API _classname: public Exception \ +{ \ +public: \ + _classname() throw() : Exception( #_classname ) {} \ + explicit _classname(const std::string &msg) throw() : Exception( #_classname , &msg) {} \ +} + + +OPENVDB_EXCEPTION(ArithmeticError); +OPENVDB_EXCEPTION(IllegalValueException); +OPENVDB_EXCEPTION(IndexError); +OPENVDB_EXCEPTION(IoError); +OPENVDB_EXCEPTION(KeyError); +OPENVDB_EXCEPTION(LookupError); +OPENVDB_EXCEPTION(NotImplementedError); +OPENVDB_EXCEPTION(ReferenceError); +OPENVDB_EXCEPTION(RuntimeError); +OPENVDB_EXCEPTION(TypeError); +OPENVDB_EXCEPTION(ValueError); + + +#undef OPENVDB_EXCEPTION + +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + + +#define OPENVDB_THROW(exception, message) \ +{ \ + std::string _openvdb_throw_msg; \ + try { \ + std::ostringstream _openvdb_throw_os; \ + _openvdb_throw_os << message; \ + _openvdb_throw_msg = _openvdb_throw_os.str(); \ + } catch (...) {} \ + throw exception(_openvdb_throw_msg); \ +} // OPENVDB_THROW + +#endif // OPENVDB_EXCEPTIONS_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/Grid.h b/nuparu/include/openvdb/include/openvdb/Grid.h new file mode 100644 index 00000000..f43652bd --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/Grid.h @@ -0,0 +1,1404 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_GRID_HAS_BEEN_INCLUDED +#define OPENVDB_GRID_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { + +typedef tree::TreeBase TreeBase; + +template class Grid; // forward declaration + + +/// @brief Create a new grid of type @c GridType with a given background value. +/// +/// @note Calling createGrid(background) is equivalent to calling +/// GridType::create(background). +template +inline typename GridType::Ptr createGrid(const typename GridType::ValueType& background); + + +/// @brief Create a new grid of type @c GridType with background value zero. +/// +/// @note Calling createGrid() is equivalent to calling GridType::create(). +template +inline typename GridType::Ptr createGrid(); + + +/// @brief Create a new grid of the appropriate type that wraps the given tree. +/// +/// @note This function can be called without specifying the template argument, +/// i.e., as createGrid(tree). +template +inline typename Grid::Ptr createGrid(TreePtrType); + + +/// @brief Create a new grid of type @c GridType classified as a "Level Set", +/// i.e., a narrow-band level set. +/// +/// @note @c GridType::ValueType must be a floating-point scalar. +/// +/// @param voxelSize the size of a voxel in world units +/// @param halfWidth the half width of the narrow band in voxel units +/// +/// @details The voxel size and the narrow band half width define the grid's +/// background value as halfWidth*voxelWidth. The transform is linear +/// with a uniform scaling only corresponding to the specified voxel size. +/// +/// @note It is generally advisable to specify a half-width of the narrow band +/// that is larger than one voxel unit, otherwise zero crossings are not guaranteed. +template +typename GridType::Ptr createLevelSet( + Real voxelSize = 1.0, Real halfWidth = LEVEL_SET_HALF_WIDTH); + + +//////////////////////////////////////// + + +/// @brief Abstract base class for typed grids +class OPENVDB_API GridBase: public MetaMap +{ +public: + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + typedef Ptr (*GridFactory)(); + + + virtual ~GridBase() {} + + /// @brief Return a new grid of the same type as this grid and whose + /// metadata and transform are deep copies of this grid's. + virtual GridBase::Ptr copyGrid(CopyPolicy treePolicy = CP_SHARE) const = 0; + + /// Return a new grid whose metadata, transform and tree are deep copies of this grid's. + virtual GridBase::Ptr deepCopyGrid() const = 0; + + + // + // Registry methods + // + /// Create a new grid of the given (registered) type. + static Ptr createGrid(const Name& type); + + /// Return @c true if the given grid type name is registered. + static bool isRegistered(const Name &type); + + /// Clear the grid type registry. + static void clearRegistry(); + + + // + // Grid type methods + // + /// Return the name of this grid's type. + virtual Name type() const = 0; + /// Return the name of the type of a voxel's value (e.g., "float" or "vec3d"). + virtual Name valueType() const = 0; + + /// Return @c true if this grid is of the same type as the template parameter. + template + bool isType() const { return (this->type() == GridType::gridType()); } + + //@{ + /// @brief Return the result of downcasting a GridBase pointer to a Grid pointer + /// of the specified type, or return a null pointer if the types are incompatible. + template + static typename GridType::Ptr grid(const GridBase::Ptr&); + template + static typename GridType::ConstPtr grid(const GridBase::ConstPtr&); + template + static typename GridType::ConstPtr constGrid(const GridBase::Ptr&); + template + static typename GridType::ConstPtr constGrid(const GridBase::ConstPtr&); + //@} + + //@{ + /// @brief Return a pointer to this grid's tree, which might be + /// shared with other grids. The pointer is guaranteed to be non-null. + TreeBase::Ptr baseTreePtr(); + TreeBase::ConstPtr baseTreePtr() const { return this->constBaseTreePtr(); } + virtual TreeBase::ConstPtr constBaseTreePtr() const = 0; + //@} + + //@{ + /// @brief Return a reference to this grid's tree, which might be + /// shared with other grids. + /// @note Calling setTree() on this grid invalidates all references + /// previously returned by this method. + TreeBase& baseTree() { return const_cast(this->constBaseTree()); } + const TreeBase& baseTree() const { return this->constBaseTree(); } + const TreeBase& constBaseTree() const { return *(this->constBaseTreePtr()); } + //@} + + /// @brief Associate the given tree with this grid, in place of its existing tree. + /// @throw ValueError if the tree pointer is null + /// @throw TypeError if the tree is not of the appropriate type + /// @note Invalidates all references previously returned by baseTree() + /// or constBaseTree(). + virtual void setTree(TreeBase::Ptr) = 0; + + /// Set a new tree with the same background value as the previous tree. + virtual void newTree() = 0; + + /// Return @c true if this grid contains only background voxels. + virtual bool empty() const = 0; + /// Empty this grid, setting all voxels to the background. + virtual void clear() = 0; + + /// @brief Reduce the memory footprint of this grid by increasing its sparseness + /// either losslessly (@a tolerance = 0) or lossily (@a tolerance > 0). + /// @details With @a tolerance > 0, sparsify regions where voxels have the same + /// active state and have values that differ by no more than the tolerance + /// (converted to this grid's value type). + virtual void pruneGrid(float tolerance = 0.0) = 0; + +#ifndef OPENVDB_2_ABI_COMPATIBLE + /// @brief Clip this grid to the given world-space bounding box. + /// @details Voxels that lie outside the bounding box are set to the background. + /// @warning Clipping a level set will likely produce a grid that is + /// no longer a valid level set. + void clipGrid(const BBoxd&); + + /// @brief Clip this grid to the given index-space bounding box. + /// @details Voxels that lie outside the bounding box are set to the background. + /// @warning Clipping a level set will likely produce a grid that is + /// no longer a valid level set. + virtual void clip(const CoordBBox&) = 0; +#endif + + + // + // Metadata + // + /// Return this grid's user-specified name. + std::string getName() const; + /// Specify a name for this grid. + void setName(const std::string&); + + /// Return the user-specified description of this grid's creator. + std::string getCreator() const; + /// Provide a description of this grid's creator. + void setCreator(const std::string&); + + /// @brief Return @c true if this grid should be written out with floating-point + /// voxel values (including components of vectors) quantized to 16 bits. + bool saveFloatAsHalf() const; + void setSaveFloatAsHalf(bool); + + /// Return the class of volumetric data (level set, fog volume, etc.) stored in this grid. + GridClass getGridClass() const; + /// Specify the class of volumetric data (level set, fog volume, etc.) stored in this grid. + void setGridClass(GridClass); + /// Remove the setting specifying the class of this grid's volumetric data. + void clearGridClass(); + + /// Return the metadata string value for the given class of volumetric data. + static std::string gridClassToString(GridClass); + /// Return a formatted string version of the grid class. + static std::string gridClassToMenuName(GridClass); + /// @brief Return the class of volumetric data specified by the given string. + /// @details If the string is not one of the ones returned by gridClassToString(), + /// return @c GRID_UNKNOWN. + static GridClass stringToGridClass(const std::string&); + + /// @brief Return the type of vector data (invariant, covariant, etc.) stored + /// in this grid, assuming that this grid contains a vector-valued tree. + VecType getVectorType() const; + /// @brief Specify the type of vector data (invariant, covariant, etc.) stored + /// in this grid, assuming that this grid contains a vector-valued tree. + void setVectorType(VecType); + /// Remove the setting specifying the type of vector data stored in this grid. + void clearVectorType(); + + /// Return the metadata string value for the given type of vector data. + static std::string vecTypeToString(VecType); + /// Return a string listing examples of the given type of vector data + /// (e.g., "Gradient/Normal", given VEC_COVARIANT). + static std::string vecTypeExamples(VecType); + /// @brief Return a string describing how the given type of vector data is affected + /// by transformations (e.g., "Does not transform", given VEC_INVARIANT). + static std::string vecTypeDescription(VecType); + static VecType stringToVecType(const std::string&); + + /// Return @c true if this grid's voxel values are in world space and should be + /// affected by transformations, @c false if they are in local space and should + /// not be affected by transformations. + bool isInWorldSpace() const; + /// Specify whether this grid's voxel values are in world space or in local space. + void setIsInWorldSpace(bool); + + // Standard metadata field names + // (These fields should normally not be accessed directly, but rather + // via the accessor methods above, when available.) + // Note: Visual C++ requires these declarations to be separate statements. + static const char* const META_GRID_CLASS; + static const char* const META_GRID_CREATOR; + static const char* const META_GRID_NAME; + static const char* const META_SAVE_HALF_FLOAT; + static const char* const META_IS_LOCAL_SPACE; + static const char* const META_VECTOR_TYPE; + static const char* const META_FILE_BBOX_MIN; + static const char* const META_FILE_BBOX_MAX; + static const char* const META_FILE_COMPRESSION; + static const char* const META_FILE_MEM_BYTES; + static const char* const META_FILE_VOXEL_COUNT; + + + // + // Statistics + // + /// Return the number of active voxels. + virtual Index64 activeVoxelCount() const = 0; + + /// Return the axis-aligned bounding box of all active voxels. If + /// the grid is empty a default bbox is returned. + virtual CoordBBox evalActiveVoxelBoundingBox() const = 0; + + /// Return the dimensions of the axis-aligned bounding box of all active voxels. + virtual Coord evalActiveVoxelDim() const = 0; + + /// Return the number of bytes of memory used by this grid. + virtual Index64 memUsage() const = 0; + + /// @brief Add metadata to this grid comprising the current values + /// of statistics like the active voxel count and bounding box. + /// @note This metadata is not automatically kept up-to-date with + /// changes to this grid. + void addStatsMetadata(); + /// @brief Return a new MetaMap containing just the metadata that + /// was added to this grid with addStatsMetadata(). + /// @details If addStatsMetadata() was never called on this grid, + /// return an empty MetaMap. + MetaMap::Ptr getStatsMetadata() const; + + + // + // Transform methods + // + //@{ + /// @brief Return a pointer to this grid's transform, which might be + /// shared with other grids. + math::Transform::Ptr transformPtr() { return mTransform; } + math::Transform::ConstPtr transformPtr() const { return mTransform; } + math::Transform::ConstPtr constTransformPtr() const { return mTransform; } + //@} + //@{ + /// @brief Return a reference to this grid's transform, which might be + /// shared with other grids. + /// @note Calling setTransform() on this grid invalidates all references + /// previously returned by this method. + math::Transform& transform() { return *mTransform; } + const math::Transform& transform() const { return *mTransform; } + const math::Transform& constTransform() const { return *mTransform; } + //@} + /// @brief Associate the given transform with this grid, in place of + /// its existing transform. + /// @throw ValueError if the transform pointer is null + /// @note Invalidates all references previously returned by transform() + /// or constTransform(). + void setTransform(math::Transform::Ptr); + + /// Return the size of this grid's voxels. + Vec3d voxelSize() const { return transform().voxelSize(); } + /// @brief Return the size of this grid's voxel at position (x, y, z). + /// @note Frustum and perspective transforms have position-dependent voxel size. + Vec3d voxelSize(const Vec3d& xyz) const { return transform().voxelSize(xyz); } + /// Return true if the voxels in world space are uniformly sized cubes + bool hasUniformVoxels() const { return mTransform->hasUniformScale(); } + //@{ + /// Apply this grid's transform to the given coordinates. + Vec3d indexToWorld(const Vec3d& xyz) const { return transform().indexToWorld(xyz); } + Vec3d indexToWorld(const Coord& ijk) const { return transform().indexToWorld(ijk); } + //@} + /// Apply the inverse of this grid's transform to the given coordinates. + Vec3d worldToIndex(const Vec3d& xyz) const { return transform().worldToIndex(xyz); } + + + // + // I/O methods + // + /// @brief Read the grid topology from a stream. + /// This will read only the grid structure, not the actual data buffers. + virtual void readTopology(std::istream&) = 0; + /// @brief Write the grid topology to a stream. + /// This will write only the grid structure, not the actual data buffers. + virtual void writeTopology(std::ostream&) const = 0; + + /// Read all data buffers for this grid. + virtual void readBuffers(std::istream&) = 0; +#ifndef OPENVDB_2_ABI_COMPATIBLE + /// Read all of this grid's data buffers that intersect the given index-space bounding box. + virtual void readBuffers(std::istream&, const CoordBBox&) = 0; + /// @brief Read all of this grid's data buffers that are not yet resident in memory + /// (because delayed loading is in effect). + /// @details If this grid was read from a memory-mapped file, this operation + /// disconnects the grid from the file. + /// @sa io::File::open, io::MappedFile + virtual void readNonresidentBuffers() const = 0; +#endif + /// Write out all data buffers for this grid. + virtual void writeBuffers(std::ostream&) const = 0; + + /// Read in the transform for this grid. + void readTransform(std::istream& is) { transform().read(is); } + /// Write out the transform for this grid. + void writeTransform(std::ostream& os) const { transform().write(os); } + + /// Output a human-readable description of this grid. + virtual void print(std::ostream& = std::cout, int verboseLevel = 1) const = 0; + + +protected: + /// @brief Initialize with an identity linear transform. + GridBase(): mTransform(math::Transform::createLinearTransform()) {} + + /// @brief Deep copy another grid's metadata and transform. + GridBase(const GridBase& other): MetaMap(other), mTransform(other.mTransform->copy()) {} + + /// @brief Copy another grid's metadata but share its transform. + GridBase(const GridBase& other, ShallowCopy): MetaMap(other), mTransform(other.mTransform) {} + + /// Register a grid type along with a factory function. + static void registerGrid(const Name& type, GridFactory); + /// Remove a grid type from the registry. + static void unregisterGrid(const Name& type); + + +private: + math::Transform::Ptr mTransform; +}; // class GridBase + + +//////////////////////////////////////// + + +typedef std::vector GridPtrVec; +typedef GridPtrVec::iterator GridPtrVecIter; +typedef GridPtrVec::const_iterator GridPtrVecCIter; +typedef boost::shared_ptr GridPtrVecPtr; + +typedef std::vector GridCPtrVec; +typedef GridCPtrVec::iterator GridCPtrVecIter; +typedef GridCPtrVec::const_iterator GridCPtrVecCIter; +typedef boost::shared_ptr GridCPtrVecPtr; + +typedef std::set GridPtrSet; +typedef GridPtrSet::iterator GridPtrSetIter; +typedef GridPtrSet::const_iterator GridPtrSetCIter; +typedef boost::shared_ptr GridPtrSetPtr; + +typedef std::set GridCPtrSet; +typedef GridCPtrSet::iterator GridCPtrSetIter; +typedef GridCPtrSet::const_iterator GridCPtrSetCIter; +typedef boost::shared_ptr GridCPtrSetPtr; + + +/// @brief Predicate functor that returns @c true for grids that have a specified name +struct OPENVDB_API GridNamePred +{ + GridNamePred(const Name& _name): name(_name) {} + bool operator()(const GridBase::ConstPtr& g) const { return g && g->getName() == name; } + Name name; +}; + +/// Return the first grid in the given container whose name is @a name. +template +inline typename GridPtrContainerT::value_type +findGridByName(const GridPtrContainerT& container, const Name& name) +{ + typedef typename GridPtrContainerT::value_type GridPtrT; + typename GridPtrContainerT::const_iterator it = + std::find_if(container.begin(), container.end(), GridNamePred(name)); + return (it == container.end() ? GridPtrT() : *it); +} + +/// Return the first grid in the given map whose name is @a name. +template +inline GridPtrT +findGridByName(const std::map& container, const Name& name) +{ + typedef std::map GridPtrMapT; + for (typename GridPtrMapT::const_iterator it = container.begin(), end = container.end(); + it != end; ++it) + { + const GridPtrT& grid = it->second; + if (grid && grid->getName() == name) return grid; + } + return GridPtrT(); +} +//@} + + +//////////////////////////////////////// + + +/// @brief Container class that associates a tree with a transform and metadata +template +class Grid: public GridBase +{ +public: + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + typedef _TreeType TreeType; + typedef typename _TreeType::Ptr TreePtrType; + typedef typename _TreeType::ConstPtr ConstTreePtrType; + typedef typename _TreeType::ValueType ValueType; + typedef typename _TreeType::BuildType BuildType; + + typedef typename _TreeType::ValueOnIter ValueOnIter; + typedef typename _TreeType::ValueOnCIter ValueOnCIter; + typedef typename _TreeType::ValueOffIter ValueOffIter; + typedef typename _TreeType::ValueOffCIter ValueOffCIter; + typedef typename _TreeType::ValueAllIter ValueAllIter; + typedef typename _TreeType::ValueAllCIter ValueAllCIter; + + typedef typename tree::ValueAccessor<_TreeType, true> Accessor; + typedef typename tree::ValueAccessor ConstAccessor; + typedef typename tree::ValueAccessor<_TreeType, false> UnsafeAccessor; + typedef typename tree::ValueAccessor ConstUnsafeAccessor; + + /// @brief ValueConverter::Type is the type of a grid having the same + /// hierarchy as this grid but a different value type, T. + /// + /// For example, FloatGrid::ValueConverter::Type is equivalent to DoubleGrid. + /// @note If the source grid type is a template argument, it might be necessary + /// to write "typename SourceGrid::template ValueConverter::Type". + template + struct ValueConverter { + typedef Grid::Type> Type; + }; + + /// Return a new grid with the given background value. + static Ptr create(const ValueType& background); + /// Return a new grid with background value zero. + static Ptr create(); + /// @brief Return a new grid that contains the given tree. + /// @throw ValueError if the tree pointer is null + static Ptr create(TreePtrType); + /// @brief Return a new, empty grid with the same transform and metadata as the + /// given grid and with background value zero. + static Ptr create(const GridBase& other); + + + /// Construct a new grid with background value zero. + Grid(); + /// Construct a new grid with the given background value. + explicit Grid(const ValueType& background); + /// @brief Construct a new grid that shares the given tree and associates with it + /// an identity linear transform. + /// @throw ValueError if the tree pointer is null + explicit Grid(TreePtrType); + /// Deep copy another grid's metadata, transform and tree. + Grid(const Grid&); + /// @brief Deep copy the metadata, transform and tree of another grid whose tree + /// configuration is the same as this grid's but whose value type is different. + /// Cast the other grid's values to this grid's value type. + /// @throw TypeError if the other grid's tree configuration doesn't match this grid's + /// or if this grid's ValueType is not constructible from the other grid's ValueType. + template + explicit Grid(const Grid&); + /// Deep copy another grid's metadata, but share its tree and transform. + Grid(const Grid&, ShallowCopy); + /// @brief Deep copy another grid's metadata and transform, but construct a new tree + /// with background value zero. + explicit Grid(const GridBase&); + + virtual ~Grid() {} + + //@{ + /// @brief Return a new grid of the same type as this grid and whose + /// metadata and transform are deep copies of this grid's. + /// @details If @a treePolicy is @c CP_NEW, give the new grid a new, empty tree; + /// if @c CP_SHARE, the new grid shares this grid's tree and transform; + /// if @c CP_COPY, the new grid's tree is a deep copy of this grid's tree and transform + Ptr copy(CopyPolicy treePolicy = CP_SHARE) const; + virtual GridBase::Ptr copyGrid(CopyPolicy treePolicy = CP_SHARE) const; + //@} + //@{ + /// Return a new grid whose metadata, transform and tree are deep copies of this grid's. + Ptr deepCopy() const { return Ptr(new Grid(*this)); } + virtual GridBase::Ptr deepCopyGrid() const { return this->deepCopy(); } + //@} + + /// Return the name of this grid's type. + virtual Name type() const { return this->gridType(); } + /// Return the name of this type of grid. + static Name gridType() { return TreeType::treeType(); } + + + // + // Voxel access methods + // + /// Return the name of the type of a voxel's value (e.g., "float" or "vec3d"). + virtual Name valueType() const { return tree().valueType(); } + + /// @brief Return this grid's background value. + /// + /// @note Use tools::changeBackground to efficiently modify the background values. + const ValueType& background() const { return mTree->background(); } + + /// Return @c true if this grid contains only inactive background voxels. + virtual bool empty() const { return tree().empty(); } + /// Empty this grid, so that all voxels become inactive background voxels. + virtual void clear() { tree().clear(); } + + /// @brief Return an accessor that provides random read and write access + /// to this grid's voxels. The accessor is safe in the sense that + /// it is registered by the tree of this grid. + Accessor getAccessor() { return Accessor(tree()); } + /// @brief Return an accessor that provides random read and write access + /// to this grid's voxels. The accessor is unsafe in the sense that + /// it is not registered by the tree of this grid. In some rare + /// cases this can give a performance advantage over a registered + /// accessor but it is unsafe if the tree topology is modified. + /// + /// @warning Only use this method if you're an expert and know the + /// risks of using an unregistered accessor (see tree/ValueAccessor.h) + Accessor getUnsafeAccessor() { return UnsafeAccessor(tree()); } + //@{ + /// Return an accessor that provides random read-only access to this grid's voxels. + ConstAccessor getAccessor() const { return ConstAccessor(tree()); } + ConstAccessor getConstAccessor() const { return ConstAccessor(tree()); } + //@} + /// @brief Return an accessor that provides random read-only access + /// to this grid's voxels. The accessor is unsafe in the sense that + /// it is not registered by the tree of this grid. In some rare + /// cases this can give a performance advantage over a registered + /// accessor but it is unsafe if the tree topology is modified. + /// + /// @warning Only use this method if you're an expert and know the + /// risks of using an unregistered accessor (see tree/ValueAccessor.h) + ConstAccessor getConstUnsafeAccessor() const { return ConstUnsafeAccessor(tree()); } + + //@{ + /// Return an iterator over all of this grid's active values (tile and voxel). + ValueOnIter beginValueOn() { return tree().beginValueOn(); } + ValueOnCIter beginValueOn() const { return tree().cbeginValueOn(); } + ValueOnCIter cbeginValueOn() const { return tree().cbeginValueOn(); } + //@} + //@{ + /// Return an iterator over all of this grid's inactive values (tile and voxel). + ValueOffIter beginValueOff() { return tree().beginValueOff(); } + ValueOffCIter beginValueOff() const { return tree().cbeginValueOff(); } + ValueOffCIter cbeginValueOff() const { return tree().cbeginValueOff(); } + //@} + //@{ + /// Return an iterator over all of this grid's values (tile and voxel). + ValueAllIter beginValueAll() { return tree().beginValueAll(); } + ValueAllCIter beginValueAll() const { return tree().cbeginValueAll(); } + ValueAllCIter cbeginValueAll() const { return tree().cbeginValueAll(); } + //@} + + /// Return the minimum and maximum active values in this grid. + void evalMinMax(ValueType& minVal, ValueType& maxVal) const; + + /// @brief Set all voxels within a given axis-aligned box to a constant value. + /// @param bbox inclusive coordinates of opposite corners of an axis-aligned box + /// @param value the value to which to set voxels within the box + /// @param active if true, mark voxels within the box as active, + /// otherwise mark them as inactive + /// @param sparse if false, active tiles are voxelized, i.e. only active voxels + /// are generated from the fill operation. Defaults to true. + /// @note If @a sparse is true this operation generates a sparse, but not always optimally sparse, + /// representation of the filled box. Follow fill operations with a prune() + /// operation for optimal sparseness. + void fill(const CoordBBox& bbox, const ValueType& value, bool active = true, bool sparse = true); + + /// Reduce the memory footprint of this grid by increasing its sparseness. + virtual void pruneGrid(float tolerance = 0.0); + +#ifndef OPENVDB_2_ABI_COMPATIBLE + /// @brief Clip this grid to the given index-space bounding box. + /// @details Voxels that lie outside the bounding box are set to the background. + /// @warning Clipping a level set will likely produce a grid that is + /// no longer a valid level set. + virtual void clip(const CoordBBox&); +#endif + + /// @brief Efficiently merge another grid into this grid using one of several schemes. + /// @details This operation is primarily intended to combine grids that are mostly + /// non-overlapping (for example, intermediate grids from computations that are + /// parallelized across disjoint regions of space). + /// @warning This operation always empties the other grid. + void merge(Grid& other, MergePolicy policy = MERGE_ACTIVE_STATES); + + /// @brief Union this grid's set of active values with the active values + /// of the other grid, whose value type may be different. + /// @details The resulting state of a value is active if the corresponding value + /// was already active OR if it is active in the other grid. Also, a resulting + /// value maps to a voxel if the corresponding value already mapped to a voxel + /// OR if it is a voxel in the other grid. Thus, a resulting value can only + /// map to a tile if the corresponding value already mapped to a tile + /// AND if it is a tile value in the other grid. + /// + /// @note This operation modifies only active states, not values. + /// Specifically, active tiles and voxels in this grid are not changed, and + /// tiles or voxels that were inactive in this grid but active in the other grid + /// are marked as active in this grid but left with their original values. + template + void topologyUnion(const Grid& other); + + /// @brief Intersect this grid's set of active values with the active values + /// of the other grid, whose value type may be different. + /// @details The resulting state of a value is active only if the corresponding + /// value was already active AND if it is active in the other tree. Also, a + /// resulting value maps to a voxel if the corresponding value + /// already mapped to an active voxel in either of the two grids + /// and it maps to an active tile or voxel in the other grid. + /// + /// @note This operation can delete branches of this grid that overlap with + /// inactive tiles in the other grid. Also, because it can deactivate voxels, + /// it can create leaf nodes with no active values. Thus, it is recommended + /// to prune this grid after calling this method. + template + void topologyIntersection(const Grid& other); + + /// @brief Difference this grid's set of active values with the active values + /// of the other grid, whose value type may be different. + /// @details After this method is called, voxels in this grid will be active + /// only if they were active to begin with and if the corresponding voxels + /// in the other grid were inactive. + /// + /// @note This operation can delete branches of this grid that overlap with + /// active tiles in the other grid. Also, because it can deactivate voxels, + /// it can create leaf nodes with no active values. Thus, it is recommended + /// to prune this grid after calling this method. + template + void topologyDifference(const Grid& other); + + // + // Statistics + // + /// Return the number of active voxels. + virtual Index64 activeVoxelCount() const { return tree().activeVoxelCount(); } + /// Return the axis-aligned bounding box of all active voxels. + virtual CoordBBox evalActiveVoxelBoundingBox() const; + /// Return the dimensions of the axis-aligned bounding box of all active voxels. + virtual Coord evalActiveVoxelDim() const; + + /// Return the number of bytes of memory used by this grid. + /// @todo Add transform().memUsage() + virtual Index64 memUsage() const { return tree().memUsage(); } + + + // + // Tree methods + // + //@{ + /// @brief Return a pointer to this grid's tree, which might be + /// shared with other grids. The pointer is guaranteed to be non-null. + TreePtrType treePtr() { return mTree; } + ConstTreePtrType treePtr() const { return mTree; } + ConstTreePtrType constTreePtr() const { return mTree; } + virtual TreeBase::ConstPtr constBaseTreePtr() const { return mTree; } + //@} + //@{ + /// @brief Return a reference to this grid's tree, which might be + /// shared with other grids. + /// @note Calling setTree() on this grid invalidates all references + /// previously returned by this method. + TreeType& tree() { return *mTree; } + const TreeType& tree() const { return *mTree; } + const TreeType& constTree() const { return *mTree; } + //@} + + /// @brief Associate the given tree with this grid, in place of its existing tree. + /// @throw ValueError if the tree pointer is null + /// @throw TypeError if the tree is not of type TreeType + /// @note Invalidates all references previously returned by baseTree(), + /// constBaseTree(), tree() or constTree(). + virtual void setTree(TreeBase::Ptr); + + /// @brief Associate a new, empty tree with this grid, in place of its existing tree. + /// @note The new tree has the same background value as the existing tree. + virtual void newTree(); + + + // + // I/O methods + // + /// @brief Read the grid topology from a stream. + /// This will read only the grid structure, not the actual data buffers. + virtual void readTopology(std::istream&); + /// @brief Write the grid topology to a stream. + /// This will write only the grid structure, not the actual data buffers. + virtual void writeTopology(std::ostream&) const; + + /// Read all data buffers for this grid. + virtual void readBuffers(std::istream&); +#ifndef OPENVDB_2_ABI_COMPATIBLE + /// Read all of this grid's data buffers that intersect the given index-space bounding box. + virtual void readBuffers(std::istream&, const CoordBBox&); + /// @brief Read all of this grid's data buffers that are not yet resident in memory + /// (because delayed loading is in effect). + /// @details If this grid was read from a memory-mapped file, this operation + /// disconnects the grid from the file. + /// @sa io::File::open, io::MappedFile + virtual void readNonresidentBuffers() const; +#endif + /// Write out all data buffers for this grid. + virtual void writeBuffers(std::ostream&) const; + + /// Output a human-readable description of this grid. + virtual void print(std::ostream& = std::cout, int verboseLevel = 1) const; + + + // + // Registry methods + // + /// Return @c true if this grid type is registered. + static bool isRegistered() { return GridBase::isRegistered(Grid::gridType()); } + /// Register this grid type along with a factory function. + static void registerGrid() { GridBase::registerGrid(Grid::gridType(), Grid::factory); } + /// Remove this grid type from the registry. + static void unregisterGrid() { GridBase::unregisterGrid(Grid::gridType()); } + + +private: + /// Disallow assignment, since it wouldn't be obvious whether the copy is deep or shallow. + Grid& operator=(const Grid& other); + + /// Helper function for use with registerGrid() + static GridBase::Ptr factory() { return Grid::create(); } + + TreePtrType mTree; +}; // class Grid + + +//////////////////////////////////////// + + +/// @brief Cast a generic grid pointer to a pointer to a grid of a concrete class. +/// +/// Return a null pointer if the input pointer is null or if it +/// points to a grid that is not of type @c GridType. +/// +/// @note Calling gridPtrCast(grid) is equivalent to calling +/// GridBase::grid(grid). +template +inline typename GridType::Ptr +gridPtrCast(const GridBase::Ptr& grid) +{ + return GridBase::grid(grid); +} + + +/// @brief Cast a generic const grid pointer to a const pointer to a grid +/// of a concrete class. +/// +/// Return a null pointer if the input pointer is null or if it +/// points to a grid that is not of type @c GridType. +/// +/// @note Calling gridConstPtrCast(grid) is equivalent to calling +/// GridBase::constGrid(grid). +template +inline typename GridType::ConstPtr +gridConstPtrCast(const GridBase::ConstPtr& grid) +{ + return GridBase::constGrid(grid); +} + + +//////////////////////////////////////// + + +/// @{ +/// @brief Return a pointer to a deep copy of the given grid, provided that +/// the grid's concrete type is @c GridType. +/// +/// Return a null pointer if the input pointer is null or if it +/// points to a grid that is not of type @c GridType. +template +inline typename GridType::Ptr +deepCopyTypedGrid(const GridBase::ConstPtr& grid) +{ + if (!grid || !grid->isType()) return typename GridType::Ptr(); + return gridPtrCast(grid->deepCopyGrid()); +} + + +template +inline typename GridType::Ptr +deepCopyTypedGrid(const GridBase& grid) +{ + if (!grid.isType()) return typename GridType::Ptr(); + return gridPtrCast(grid.deepCopyGrid()); +} +/// @} + + +//////////////////////////////////////// + + +//@{ +/// @brief This adapter allows code that is templated on a Tree type to +/// accept either a Tree type or a Grid type. +template +struct TreeAdapter +{ + typedef _TreeType TreeType; + typedef typename boost::remove_const::type NonConstTreeType; + typedef typename TreeType::Ptr TreePtrType; + typedef typename TreeType::ConstPtr ConstTreePtrType; + typedef typename NonConstTreeType::Ptr NonConstTreePtrType; + typedef Grid GridType; + typedef Grid NonConstGridType; + typedef typename GridType::Ptr GridPtrType; + typedef typename NonConstGridType::Ptr NonConstGridPtrType; + typedef typename GridType::ConstPtr ConstGridPtrType; + typedef typename TreeType::ValueType ValueType; + typedef typename tree::ValueAccessor AccessorType; + typedef typename tree::ValueAccessor ConstAccessorType; + typedef typename tree::ValueAccessor NonConstAccessorType; + + static TreeType& tree(TreeType& t) { return t; } + static TreeType& tree(GridType& g) { return g.tree(); } + static const TreeType& tree(const TreeType& t) { return t; } + static const TreeType& tree(const GridType& g) { return g.tree(); } + static const TreeType& constTree(TreeType& t) { return t; } + static const TreeType& constTree(GridType& g) { return g.constTree(); } + static const TreeType& constTree(const TreeType& t) { return t; } + static const TreeType& constTree(const GridType& g) { return g.constTree(); } +}; + + +/// Partial specialization for Grid types +template +struct TreeAdapter > +{ + typedef _TreeType TreeType; + typedef typename boost::remove_const::type NonConstTreeType; + typedef typename TreeType::Ptr TreePtrType; + typedef typename TreeType::ConstPtr ConstTreePtrType; + typedef typename NonConstTreeType::Ptr NonConstTreePtrType; + typedef Grid GridType; + typedef Grid NonConstGridType; + typedef typename GridType::Ptr GridPtrType; + typedef typename NonConstGridType::Ptr NonConstGridPtrType; + typedef typename GridType::ConstPtr ConstGridPtrType; + typedef typename TreeType::ValueType ValueType; + typedef typename tree::ValueAccessor AccessorType; + typedef typename tree::ValueAccessor ConstAccessorType; + typedef typename tree::ValueAccessor NonConstAccessorType; + + static TreeType& tree(TreeType& t) { return t; } + static TreeType& tree(GridType& g) { return g.tree(); } + static const TreeType& tree(const TreeType& t) { return t; } + static const TreeType& tree(const GridType& g) { return g.tree(); } + static const TreeType& constTree(TreeType& t) { return t; } + static const TreeType& constTree(GridType& g) { return g.constTree(); } + static const TreeType& constTree(const TreeType& t) { return t; } + static const TreeType& constTree(const GridType& g) { return g.constTree(); } +}; + +/// Partial specialization for ValueAccessor types +template +struct TreeAdapter > +{ + typedef _TreeType TreeType; + typedef typename boost::remove_const::type NonConstTreeType; + typedef typename TreeType::Ptr TreePtrType; + typedef typename TreeType::ConstPtr ConstTreePtrType; + typedef typename NonConstTreeType::Ptr NonConstTreePtrType; + typedef Grid GridType; + typedef Grid NonConstGridType; + typedef typename GridType::Ptr GridPtrType; + typedef typename NonConstGridType::Ptr NonConstGridPtrType; + typedef typename GridType::ConstPtr ConstGridPtrType; + typedef typename TreeType::ValueType ValueType; + typedef typename tree::ValueAccessor AccessorType; + typedef typename tree::ValueAccessor ConstAccessorType; + typedef typename tree::ValueAccessor NonConstAccessorType; + + static TreeType& tree(TreeType& t) { return t; } + static TreeType& tree(GridType& g) { return g.tree(); } + static TreeType& tree(AccessorType& a) { return a.tree(); } + static const TreeType& tree(const TreeType& t) { return t; } + static const TreeType& tree(const GridType& g) { return g.tree(); } + static const TreeType& tree(const AccessorType& a) { return a.tree(); } + static const TreeType& constTree(TreeType& t) { return t; } + static const TreeType& constTree(GridType& g) { return g.constTree(); } + static const TreeType& constTree(const TreeType& t) { return t; } + static const TreeType& constTree(const GridType& g) { return g.constTree(); } +}; + +//@} + + +//////////////////////////////////////// + + +template +inline typename GridType::Ptr +GridBase::grid(const GridBase::Ptr& grid) +{ + // The string comparison on type names is slower than a dynamic_pointer_cast, but + // it is safer when pointers cross dso boundaries, as they do in many Houdini nodes. + if (grid && grid->type() == GridType::gridType()) { + return boost::static_pointer_cast(grid); + } + return typename GridType::Ptr(); +} + + +template +inline typename GridType::ConstPtr +GridBase::grid(const GridBase::ConstPtr& grid) +{ + return boost::const_pointer_cast( + GridBase::grid(boost::const_pointer_cast(grid))); +} + + +template +inline typename GridType::ConstPtr +GridBase::constGrid(const GridBase::Ptr& grid) +{ + return boost::const_pointer_cast(GridBase::grid(grid)); +} + + +template +inline typename GridType::ConstPtr +GridBase::constGrid(const GridBase::ConstPtr& grid) +{ + return boost::const_pointer_cast( + GridBase::grid(boost::const_pointer_cast(grid))); +} + + +inline TreeBase::Ptr +GridBase::baseTreePtr() +{ + return boost::const_pointer_cast(this->constBaseTreePtr()); +} + + +inline void +GridBase::setTransform(math::Transform::Ptr xform) +{ + if (!xform) OPENVDB_THROW(ValueError, "Transform pointer is null"); + mTransform = xform; +} + + +//////////////////////////////////////// + + +template +inline Grid::Grid(): mTree(new TreeType) +{ +} + + +template +inline Grid::Grid(const ValueType &background): mTree(new TreeType(background)) +{ +} + + +template +inline Grid::Grid(TreePtrType tree): mTree(tree) +{ + if (!tree) OPENVDB_THROW(ValueError, "Tree pointer is null"); +} + + +template +inline Grid::Grid(const Grid& other): + GridBase(other), + mTree(boost::static_pointer_cast(other.mTree->copy())) +{ +} + + +template +template +inline Grid::Grid(const Grid& other): + GridBase(other), + mTree(new TreeType(other.constTree())) +{ +} + + +template +inline Grid::Grid(const Grid& other, ShallowCopy): + GridBase(other, ShallowCopy()), + mTree(other.mTree) +{ +} + + +template +inline Grid::Grid(const GridBase& other): + GridBase(other), + mTree(new TreeType) +{ +} + + +//static +template +inline typename Grid::Ptr +Grid::create() +{ + return Grid::create(zeroVal()); +} + + +//static +template +inline typename Grid::Ptr +Grid::create(const ValueType& background) +{ + return Ptr(new Grid(background)); +} + + +//static +template +inline typename Grid::Ptr +Grid::create(TreePtrType tree) +{ + return Ptr(new Grid(tree)); +} + + +//static +template +inline typename Grid::Ptr +Grid::create(const GridBase& other) +{ + return Ptr(new Grid(other)); +} + + +//////////////////////////////////////// + + +template +inline typename Grid::Ptr +Grid::copy(CopyPolicy treePolicy) const +{ + Ptr ret; + switch (treePolicy) { + case CP_NEW: + ret.reset(new Grid(*this, ShallowCopy())); + ret->newTree(); + break; + case CP_COPY: + ret.reset(new Grid(*this)); + break; + case CP_SHARE: + ret.reset(new Grid(*this, ShallowCopy())); + break; + } + return ret; +} + + +template +inline GridBase::Ptr +Grid::copyGrid(CopyPolicy treePolicy) const +{ + return this->copy(treePolicy); +} + + +//////////////////////////////////////// + + +template +inline void +Grid::setTree(TreeBase::Ptr tree) +{ + if (!tree) OPENVDB_THROW(ValueError, "Tree pointer is null"); + if (tree->type() != TreeType::treeType()) { + OPENVDB_THROW(TypeError, "Cannot assign a tree of type " + + tree->type() + " to a grid of type " + this->type()); + } + mTree = boost::static_pointer_cast(tree); +} + + +template +inline void +Grid::newTree() +{ + mTree.reset(new TreeType(this->background())); +} + + +//////////////////////////////////////// + + +template +inline void +Grid::fill(const CoordBBox& bbox, const ValueType& value, bool active, bool sparse) +{ + tree().fill(bbox, value, active, sparse); +} + +template +inline void +Grid::pruneGrid(float tolerance) +{ + this->tree().prune(ValueType(zeroVal() + tolerance)); +} + +#ifndef OPENVDB_2_ABI_COMPATIBLE +template +inline void +Grid::clip(const CoordBBox& bbox) +{ + tree().clip(bbox); +} +#endif + + +template +inline void +Grid::merge(Grid& other, MergePolicy policy) +{ + tree().merge(other.tree(), policy); +} + + +template +template +inline void +Grid::topologyUnion(const Grid& other) +{ + tree().topologyUnion(other.tree()); +} + + +template +template +inline void +Grid::topologyIntersection(const Grid& other) +{ + tree().topologyIntersection(other.tree()); +} + + +template +template +inline void +Grid::topologyDifference(const Grid& other) +{ + tree().topologyDifference(other.tree()); +} + + +//////////////////////////////////////// + + +template +inline void +Grid::evalMinMax(ValueType& minVal, ValueType& maxVal) const +{ + tree().evalMinMax(minVal, maxVal); +} + + +template +inline CoordBBox +Grid::evalActiveVoxelBoundingBox() const +{ + CoordBBox bbox; + tree().evalActiveVoxelBoundingBox(bbox); + return bbox; +} + + +template +inline Coord +Grid::evalActiveVoxelDim() const +{ + Coord dim; + const bool nonempty = tree().evalActiveVoxelDim(dim); + return (nonempty ? dim : Coord()); +} + + +//////////////////////////////////////// + + +/// @internal Consider using the stream tagging mechanism (see io::Archive) +/// to specify the float precision, but note that the setting is per-grid. + +template +inline void +Grid::readTopology(std::istream& is) +{ + tree().readTopology(is, saveFloatAsHalf()); +} + + +template +inline void +Grid::writeTopology(std::ostream& os) const +{ + tree().writeTopology(os, saveFloatAsHalf()); +} + + +template +inline void +Grid::readBuffers(std::istream& is) +{ + tree().readBuffers(is, saveFloatAsHalf()); +} + + +#ifndef OPENVDB_2_ABI_COMPATIBLE + +template +inline void +Grid::readBuffers(std::istream& is, const CoordBBox& bbox) +{ + tree().readBuffers(is, bbox, saveFloatAsHalf()); +} + + +template +inline void +Grid::readNonresidentBuffers() const +{ + tree().readNonresidentBuffers(); +} + +#endif // !OPENVDB_2_ABI_COMPATIBLE + + +template +inline void +Grid::writeBuffers(std::ostream& os) const +{ + tree().writeBuffers(os, saveFloatAsHalf()); +} + + +template +inline void +Grid::print(std::ostream& os, int verboseLevel) const +{ + tree().print(os, verboseLevel); + + if (metaCount() > 0) { + os << "Additional metadata:" << std::endl; + for (ConstMetaIterator it = beginMeta(), end = endMeta(); it != end; ++it) { + os << " " << it->first; + if (it->second) { + const std::string value = it->second->str(); + if (!value.empty()) os << ": " << value; + } + os << "\n"; + } + } + + os << "Transform:" << std::endl; + transform().print(os, /*indent=*/" "); + os << std::endl; +} + + +//////////////////////////////////////// + + +template +inline typename GridType::Ptr +createGrid(const typename GridType::ValueType& background) +{ + return GridType::create(background); +} + + +template +inline typename GridType::Ptr +createGrid() +{ + return GridType::create(); +} + + +template +inline typename Grid::Ptr +createGrid(TreePtrType tree) +{ + typedef typename TreePtrType::element_type TreeType; + return Grid::create(tree); +} + + +template +typename GridType::Ptr +createLevelSet(Real voxelSize, Real halfWidth) +{ + typedef typename GridType::ValueType ValueType; + + // GridType::ValueType is required to be a floating-point scalar. + BOOST_STATIC_ASSERT(boost::is_floating_point::value); + + typename GridType::Ptr grid = GridType::create( + /*background=*/static_cast(voxelSize * halfWidth)); + grid->setTransform(math::Transform::createLinearTransform(voxelSize)); + grid->setGridClass(GRID_LEVEL_SET); + return grid; +} + +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_GRID_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/Metadata.h b/nuparu/include/openvdb/include/openvdb/Metadata.h new file mode 100644 index 00000000..82a81ee3 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/Metadata.h @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_METADATA_HAS_BEEN_INCLUDED +#define OPENVDB_METADATA_HAS_BEEN_INCLUDED + +#include +#include + +#endif // OPENVDB_METADATA_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/Platform.h b/nuparu/include/openvdb/include/openvdb/Platform.h new file mode 100644 index 00000000..d9fac2ff --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/Platform.h @@ -0,0 +1,210 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +/// +/// @file Platform.h + +#ifndef OPENVDB_PLATFORM_HAS_BEEN_INCLUDED +#define OPENVDB_PLATFORM_HAS_BEEN_INCLUDED + +#include "PlatformConfig.h" + +#define PRAGMA(x) _Pragma(#x) + +/// Use OPENVDB_DEPRECATED to mark functions as deprecated. +/// It should be placed right before the signature of the function, +/// e.g., "OPENVDB_DEPRECATED void functionName();". +#ifdef OPENVDB_DEPRECATED +#undef OPENVDB_DEPRECATED +#endif +#ifdef _MSC_VER + #define OPENVDB_DEPRECATED __declspec(deprecated) +#else + #define OPENVDB_DEPRECATED __attribute__ ((deprecated)) +#endif + +/// Macro for determining if GCC version is >= than X.Y +#if defined(__GNUC__) + #define OPENVDB_CHECK_GCC(MAJOR, MINOR) \ + (__GNUC__ > MAJOR || (__GNUC__ == MAJOR && __GNUC_MINOR__ >= MINOR)) +#else + #define OPENVDB_CHECK_GCC(MAJOR, MINOR) 0 +#endif + +/// Macro for determining if there are sufficient C++0x/C++11 features +#ifdef __INTEL_COMPILER + #ifdef __INTEL_CXX11_MODE__ + #define OPENVDB_HAS_CXX11 1 + #endif +#elif defined(__clang__) + #ifndef _LIBCPP_VERSION + #include + #endif + #ifdef _LIBCPP_VERSION + #define OPENVDB_HAS_CXX11 1 + #endif +#elif defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus > 199711L) + #define OPENVDB_HAS_CXX11 1 +#elif defined(_MSC_VER) + #if (_MSC_VER >= 1700) + #define OPENVDB_HAS_CXX11 1 + #endif +#endif +#if defined(__GNUC__) && !OPENVDB_CHECK_GCC(4, 4) + // ICC uses GCC's standard library headers, so even if the ICC version + // is recent enough for C++11, the GCC version might not be. + #undef OPENVDB_HAS_CXX11 +#endif + +/// For compilers that need templated function specializations to have +/// storage qualifiers, we need to declare the specializations as static inline. +/// Otherwise, we'll get linker errors about multiply defined symbols. +#if defined(__GNUC__) && OPENVDB_CHECK_GCC(4, 4) + #define OPENVDB_STATIC_SPECIALIZATION +#else + #define OPENVDB_STATIC_SPECIALIZATION static +#endif + + +/// Bracket code with OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN/_END, +/// as in the following example, to inhibit ICC remarks about unreachable code: +/// @code +/// template +/// void processNode(NodeType& node) +/// { +/// OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN +/// if (NodeType::LEVEL == 0) return; // ignore leaf nodes +/// int i = 0; +/// ... +/// OPENVDB_NO_UNREACHABLE_CODE_WARNING_END +/// } +/// @endcode +/// In the above, NodeType::LEVEL == 0 is a compile-time constant expression, +/// so for some template instantiations, the line below it is unreachable. +#if defined(__INTEL_COMPILER) + // Disable ICC remarks 111 ("statement is unreachable"), 128 ("loop is not reachable"), + // 185 ("dynamic initialization in unreachable code"), and 280 ("selector expression + // is constant"). + #define OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN \ + _Pragma("warning (push)") \ + _Pragma("warning (disable:111)") \ + _Pragma("warning (disable:128)") \ + _Pragma("warning (disable:185)") \ + _Pragma("warning (disable:280)") + #define OPENVDB_NO_UNREACHABLE_CODE_WARNING_END \ + _Pragma("warning (pop)") +#elif defined(__clang__) + #define OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN \ + PRAGMA(clang diagnostic push) \ + PRAGMA(clang diagnostic ignored "-Wunreachable-code") + #define OPENVDB_NO_UNREACHABLE_CODE_WARNING_END \ + PRAGMA(clang diagnostic pop) +#else + #define OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + #define OPENVDB_NO_UNREACHABLE_CODE_WARNING_END +#endif + + +/// Visual C++ does not have constants like M_PI unless this is defined. +/// @note This is needed even though the core library is built with this but +/// hcustom 12.1 doesn't define it. So this is needed for HDK operators. +#ifndef _USE_MATH_DEFINES + #define _USE_MATH_DEFINES +#endif + +/// Visual C++ does not have round +#ifdef _MSC_VER + #include + using boost::math::round; +#endif + +/// Visual C++ uses _copysign() instead of copysign() +#ifdef _MSC_VER + #include + static inline double copysign(double x, double y) { return _copysign(x, y); } +#endif + +/// Visual C++ does not have stdint.h which defines types like uint64_t. +/// So for portability we instead include boost/cstdint.hpp. +#include +using boost::int8_t; +using boost::int16_t; +using boost::int32_t; +using boost::int64_t; +using boost::uint8_t; +using boost::uint16_t; +using boost::uint32_t; +using boost::uint64_t; + +/// Helper macros for defining library symbol visibility +#ifdef OPENVDB_EXPORT +#undef OPENVDB_EXPORT +#endif +#ifdef OPENVDB_IMPORT +#undef OPENVDB_IMPORT +#endif +#ifdef __GNUC__ + #define OPENVDB_EXPORT __attribute__((visibility("default"))) + #define OPENVDB_IMPORT __attribute__((visibility("default"))) +#endif +#ifdef _WIN32 + #ifdef OPENVDB_DLL + #define OPENVDB_EXPORT __declspec(dllexport) + #define OPENVDB_IMPORT __declspec(dllimport) + #else + #define OPENVDB_EXPORT + #define OPENVDB_IMPORT + #endif +#endif + +/// All classes and public free standing functions must be explicitly marked +/// as \_API to be exported. The \_PRIVATE macros are defined when +/// building that particular library. +#ifdef OPENVDB_API +#undef OPENVDB_API +#endif +#ifdef OPENVDB_PRIVATE + #define OPENVDB_API OPENVDB_EXPORT +#else + #define OPENVDB_API OPENVDB_IMPORT +#endif +#ifdef OPENVDB_HOUDINI_API +#undef OPENVDB_HOUDINI_API +#endif +#ifdef OPENVDB_HOUDINI_PRIVATE + #define OPENVDB_HOUDINI_API OPENVDB_EXPORT +#else + #define OPENVDB_HOUDINI_API OPENVDB_IMPORT +#endif + +#endif // OPENVDB_PLATFORM_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/PlatformConfig.h b/nuparu/include/openvdb/include/openvdb/PlatformConfig.h new file mode 100644 index 00000000..23276edb --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/PlatformConfig.h @@ -0,0 +1,57 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +/// +/// @file PlatformConfig.h + +#ifndef OPENVDB_PLATFORMCONFIG_HAS_BEEN_INCLUDED +#define OPENVDB_PLATFORMCONFIG_HAS_BEEN_INCLUDED + +// Windows specific configuration +#ifdef _WIN32 + + // By default, assume we're building OpenVDB as a DLL if we're dynamically + // linking in the CRT, unless OPENVDB_STATICLIB is defined. + #if defined(_DLL) && !defined(OPENVDB_STATICLIB) && !defined(OPENVDB_DLL) + #define OPENVDB_DLL + #endif + + // By default, assume that we're dynamically linking OpenEXR, unless + // OPENVDB_OPENEXR_STATICLIB is defined. + #if !defined(OPENVDB_OPENEXR_STATICLIB) && !defined(OPENEXR_DLL) + #define OPENEXR_DLL + #endif + +#endif // _WIN32 + +#endif // OPENVDB_PLATFORMCONFIG_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/Types.h b/nuparu/include/openvdb/include/openvdb/Types.h new file mode 100644 index 00000000..0a2ec16d --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/Types.h @@ -0,0 +1,504 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_TYPES_HAS_BEEN_INCLUDED +#define OPENVDB_TYPES_HAS_BEEN_INCLUDED + +#include "version.h" +#include "Platform.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { + +// One-dimensional scalar types +typedef uint32_t Index32; +typedef uint64_t Index64; +typedef Index32 Index; +typedef int16_t Int16; +typedef int32_t Int32; +typedef int64_t Int64; +typedef Int32 Int; +typedef unsigned char Byte; +typedef double Real; + +// Two-dimensional vector types +typedef math::Vec2 Vec2R; +typedef math::Vec2 Vec2I; +typedef math::Vec2 Vec2f; +typedef math::Vec2 Vec2H; +using math::Vec2i; +using math::Vec2s; +using math::Vec2d; + +// Three-dimensional vector types +typedef math::Vec3 Vec3R; +typedef math::Vec3 Vec3I; +typedef math::Vec3 Vec3f; +typedef math::Vec3 Vec3H; +using math::Vec3i; +using math::Vec3s; +using math::Vec3d; + +using math::Coord; +using math::CoordBBox; +typedef math::BBox BBoxd; + +// Four-dimensional vector types +typedef math::Vec4 Vec4R; +typedef math::Vec4 Vec4I; +typedef math::Vec4 Vec4f; +typedef math::Vec4 Vec4H; +using math::Vec4i; +using math::Vec4s; +using math::Vec4d; + +// Three-dimensional matrix types +typedef math::Mat3 Mat3R; + +// Four-dimensional matrix types +typedef math::Mat4 Mat4R; +typedef math::Mat4 Mat4d; +typedef math::Mat4 Mat4s; + +// Quaternions +typedef math::Quat QuatR; + +// Dummy type for a voxel with a binary mask value, e.g. the active state +class ValueMask {}; + + +//////////////////////////////////////// + + +/// @brief Integer wrapper, required to distinguish PointIndexGrid and +/// PointDataGrid from Int32Grid and Int64Grid +/// @note @c Kind is a dummy parameter used to create distinct types. +template +struct PointIndex +{ + BOOST_STATIC_ASSERT(boost::is_integral::value); + + typedef IntType_ IntType; + + PointIndex(IntType i = IntType(0)): mIndex(i) {} + + operator IntType() const { return mIndex; } + + /// Needed to support the (zeroVal() + val) idiom. + template + PointIndex operator+(T x) { return PointIndex(mIndex + IntType(x)); } + +private: + IntType mIndex; +}; + + +typedef PointIndex PointIndex32; +typedef PointIndex PointIndex64; + +typedef PointIndex PointDataIndex32; +typedef PointIndex PointDataIndex64; + + +//////////////////////////////////////// + + +template struct VecTraits { + static const bool IsVec = false; + static const int Size = 1; + typedef T ElementType; +}; +template struct VecTraits > { + static const bool IsVec = true; + static const int Size = 2; + typedef T ElementType; +}; +template struct VecTraits > { + static const bool IsVec = true; + static const int Size = 3; + typedef T ElementType; +}; +template struct VecTraits > { + static const bool IsVec = true; + static const int Size = 4; + typedef T ElementType; +}; + + +//////////////////////////////////////// + + +/// @brief CanConvertType::value is @c true if a value +/// of type @a ToType can be constructed from a value of type @a FromType. +/// +/// @note @c boost::is_convertible tests for implicit convertibility only. +/// What we want is the equivalent of C++11's @c std::is_constructible, +/// which allows for explicit conversions as well. Unfortunately, not all +/// compilers support @c std::is_constructible yet, so for now, types that +/// can only be converted explicitly have to be indicated with specializations +/// of this template. +template +struct CanConvertType { enum { value = boost::is_convertible::value }; }; + +// Specializations for vector types, which can be constructed from values +// of their own ValueTypes (or values that can be converted to their ValueTypes), +// but only explicitly +template struct CanConvertType > { enum { value = true }; }; +template struct CanConvertType > { enum { value = true }; }; +template struct CanConvertType > { enum { value = true }; }; +template struct CanConvertType, math::Vec2 > { enum {value = true}; }; +template struct CanConvertType, math::Vec3 > { enum {value = true}; }; +template struct CanConvertType, math::Vec4 > { enum {value = true}; }; +template +struct CanConvertType > { enum { value = CanConvertType::value }; }; +template +struct CanConvertType > { enum { value = CanConvertType::value }; }; +template +struct CanConvertType > { enum { value = CanConvertType::value }; }; +template<> struct CanConvertType { enum {value = true}; }; +template<> struct CanConvertType { enum {value = true}; }; +template +struct CanConvertType { enum {value = CanConvertType::value}; }; +template +struct CanConvertType { enum {value = CanConvertType::value}; }; + +//////////////////////////////////////// + + +// Add new items to the *end* of this list, and update NUM_GRID_CLASSES. +enum GridClass { + GRID_UNKNOWN = 0, + GRID_LEVEL_SET, + GRID_FOG_VOLUME, + GRID_STAGGERED +}; +enum { NUM_GRID_CLASSES = GRID_STAGGERED + 1 }; + +static const Real LEVEL_SET_HALF_WIDTH = 3; + +/// The type of a vector determines how transforms are applied to it: +///
+///
Invariant +///
Does not transform (e.g., tuple, uvw, color) +/// +///
Covariant +///
Apply inverse-transpose transformation: @e w = 0, ignores translation +/// (e.g., gradient/normal) +/// +///
Covariant Normalize +///
Apply inverse-transpose transformation: @e w = 0, ignores translation, +/// vectors are renormalized (e.g., unit normal) +/// +///
Contravariant Relative +///
Apply "regular" transformation: @e w = 0, ignores translation +/// (e.g., displacement, velocity, acceleration) +/// +///
Contravariant Absolute +///
Apply "regular" transformation: @e w = 1, vector translates (e.g., position) +///
+enum VecType { + VEC_INVARIANT = 0, + VEC_COVARIANT, + VEC_COVARIANT_NORMALIZE, + VEC_CONTRAVARIANT_RELATIVE, + VEC_CONTRAVARIANT_ABSOLUTE +}; +enum { NUM_VEC_TYPES = VEC_CONTRAVARIANT_ABSOLUTE + 1 }; + + +/// Specify how grids should be merged during certain (typically multithreaded) operations. +///
+///
MERGE_ACTIVE_STATES +///
The output grid is active wherever any of the input grids is active. +/// +///
MERGE_NODES +///
The output grid's tree has a node wherever any of the input grids' trees +/// has a node, regardless of any active states. +/// +///
MERGE_ACTIVE_STATES_AND_NODES +///
The output grid is active wherever any of the input grids is active, +/// and its tree has a node wherever any of the input grids' trees has a node. +///
+enum MergePolicy { + MERGE_ACTIVE_STATES = 0, + MERGE_NODES, + MERGE_ACTIVE_STATES_AND_NODES +}; + + +//////////////////////////////////////// + + +template const char* typeNameAsString() { return typeid(T).name(); } +template<> inline const char* typeNameAsString() { return "bool"; } +template<> inline const char* typeNameAsString() { return "mask"; } +template<> inline const char* typeNameAsString() { return "float"; } +template<> inline const char* typeNameAsString() { return "double"; } +template<> inline const char* typeNameAsString() { return "int32"; } +template<> inline const char* typeNameAsString() { return "uint32"; } +template<> inline const char* typeNameAsString() { return "int64"; } +template<> inline const char* typeNameAsString() { return "vec2i"; } +template<> inline const char* typeNameAsString() { return "vec2s"; } +template<> inline const char* typeNameAsString() { return "vec2d"; } +template<> inline const char* typeNameAsString() { return "vec3i"; } +template<> inline const char* typeNameAsString() { return "vec3s"; } +template<> inline const char* typeNameAsString() { return "vec3d"; } +template<> inline const char* typeNameAsString() { return "string"; } +template<> inline const char* typeNameAsString() { return "mat4s"; } +template<> inline const char* typeNameAsString() { return "mat4d"; } +template<> inline const char* typeNameAsString() { return "ptidx32"; } +template<> inline const char* typeNameAsString() { return "ptidx64"; } +template<> inline const char* typeNameAsString() { return "ptdataidx32"; } +template<> inline const char* typeNameAsString() { return "ptdataidx64"; } + + +//////////////////////////////////////// + + +/// @brief This struct collects both input and output arguments to "grid combiner" functors +/// used with the tree::TypedGrid::combineExtended() and combine2Extended() methods. +/// AValueType and BValueType are the value types of the two grids being combined. +/// +/// @see openvdb/tree/Tree.h for usage information. +/// +/// Setter methods return references to this object, to facilitate the following usage: +/// @code +/// CombineArgs args; +/// myCombineOp(args.setARef(aVal).setBRef(bVal).setAIsActive(true).setBIsActive(false)); +/// @endcode +template +class CombineArgs +{ +public: + typedef AValueType AValueT; + typedef BValueType BValueT; + + CombineArgs() + : mAValPtr(NULL) + , mBValPtr(NULL) + , mResultValPtr(&mResultVal) + , mAIsActive(false) + , mBIsActive(false) + , mResultIsActive(false) + { + } + + /// Use this constructor when the result value is stored externally. + CombineArgs(const AValueType& a, const BValueType& b, AValueType& result, + bool aOn = false, bool bOn = false) + : mAValPtr(&a) + , mBValPtr(&b) + , mResultValPtr(&result) + , mAIsActive(aOn) + , mBIsActive(bOn) + { + this->updateResultActive(); + } + + /// Use this constructor when the result value should be stored in this struct. + CombineArgs(const AValueType& a, const BValueType& b, bool aOn = false, bool bOn = false) + : mAValPtr(&a) + , mBValPtr(&b) + , mResultValPtr(&mResultVal) + , mAIsActive(aOn) + , mBIsActive(bOn) + { + this->updateResultActive(); + } + + /// Get the A input value. + const AValueType& a() const { return *mAValPtr; } + /// Get the B input value. + const BValueType& b() const { return *mBValPtr; } + //@{ + /// Get the output value. + const AValueType& result() const { return *mResultValPtr; } + AValueType& result() { return *mResultValPtr; } + //@} + + /// Set the output value. + CombineArgs& setResult(const AValueType& val) { *mResultValPtr = val; return *this; } + + /// Redirect the A value to a new external source. + CombineArgs& setARef(const AValueType& a) { mAValPtr = &a; return *this; } + /// Redirect the B value to a new external source. + CombineArgs& setBRef(const BValueType& b) { mBValPtr = &b; return *this; } + /// Redirect the result value to a new external destination. + CombineArgs& setResultRef(AValueType& val) { mResultValPtr = &val; return *this; } + + /// @return true if the A value is active + bool aIsActive() const { return mAIsActive; } + /// @return true if the B value is active + bool bIsActive() const { return mBIsActive; } + /// @return true if the output value is active + bool resultIsActive() const { return mResultIsActive; } + + /// Set the active state of the A value. + CombineArgs& setAIsActive(bool b) { mAIsActive = b; updateResultActive(); return *this; } + /// Set the active state of the B value. + CombineArgs& setBIsActive(bool b) { mBIsActive = b; updateResultActive(); return *this; } + /// Set the active state of the output value. + CombineArgs& setResultIsActive(bool b) { mResultIsActive = b; return *this; } + +protected: + /// By default, the result value is active if either of the input values is active, + /// but this behavior can be overridden by calling setResultIsActive(). + void updateResultActive() { mResultIsActive = mAIsActive || mBIsActive; } + + const AValueType* mAValPtr; // pointer to input value from A grid + const BValueType* mBValPtr; // pointer to input value from B grid + AValueType mResultVal; // computed output value (unused if stored externally) + AValueType* mResultValPtr; // pointer to either mResultVal or an external value + bool mAIsActive, mBIsActive; // active states of A and B values + bool mResultIsActive; // computed active state (default: A active || B active) +}; + + +/// This struct adapts a "grid combiner" functor to swap the A and B grid values +/// (e.g., so that if the original functor computes a + 2 * b, the adapted functor +/// will compute b + 2 * a). +template +struct SwappedCombineOp +{ + SwappedCombineOp(CombineOp& _op): op(_op) {} + + void operator()(CombineArgs& args) + { + CombineArgs swappedArgs(args.b(), args.a(), args.result(), + args.bIsActive(), args.aIsActive()); + op(swappedArgs); + } + + CombineOp& op; +}; + + +//////////////////////////////////////// + + +/// In copy constructors, members stored as shared pointers can be handled +/// in several ways: +///
+///
CP_NEW +///
Don't copy the member; default construct a new member object instead. +/// +///
CP_SHARE +///
Copy the shared pointer, so that the original and new objects share +/// the same member. +/// +///
CP_COPY +///
Create a deep copy of the member. +///
+enum CopyPolicy { CP_NEW, CP_SHARE, CP_COPY }; + + +// Dummy class that distinguishes shallow copy constructors from +// deep copy constructors +class ShallowCopy {}; +// Dummy class that distinguishes topology copy constructors from +// deep copy constructors +class TopologyCopy {}; +// Dummy class that distinguishes constructors during file input +class PartialCreate {}; + +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + + +#if defined(__ICC) + +// Use these defines to bracket a region of code that has safe static accesses. +// Keep the region as small as possible. +#define OPENVDB_START_THREADSAFE_STATIC_REFERENCE __pragma(warning(disable:1710)) +#define OPENVDB_FINISH_THREADSAFE_STATIC_REFERENCE __pragma(warning(default:1710)) +#define OPENVDB_START_THREADSAFE_STATIC_WRITE __pragma(warning(disable:1711)) +#define OPENVDB_FINISH_THREADSAFE_STATIC_WRITE __pragma(warning(default:1711)) +#define OPENVDB_START_THREADSAFE_STATIC_ADDRESS __pragma(warning(disable:1712)) +#define OPENVDB_FINISH_THREADSAFE_STATIC_ADDRESS __pragma(warning(default:1712)) + +// Use these defines to bracket a region of code that has unsafe static accesses. +// Keep the region as small as possible. +#define OPENVDB_START_NON_THREADSAFE_STATIC_REFERENCE __pragma(warning(disable:1710)) +#define OPENVDB_FINISH_NON_THREADSAFE_STATIC_REFERENCE __pragma(warning(default:1710)) +#define OPENVDB_START_NON_THREADSAFE_STATIC_WRITE __pragma(warning(disable:1711)) +#define OPENVDB_FINISH_NON_THREADSAFE_STATIC_WRITE __pragma(warning(default:1711)) +#define OPENVDB_START_NON_THREADSAFE_STATIC_ADDRESS __pragma(warning(disable:1712)) +#define OPENVDB_FINISH_NON_THREADSAFE_STATIC_ADDRESS __pragma(warning(default:1712)) + +// Simpler version for one-line cases +#define OPENVDB_THREADSAFE_STATIC_REFERENCE(CODE) \ + __pragma(warning(disable:1710)); CODE; __pragma(warning(default:1710)) +#define OPENVDB_THREADSAFE_STATIC_WRITE(CODE) \ + __pragma(warning(disable:1711)); CODE; __pragma(warning(default:1711)) +#define OPENVDB_THREADSAFE_STATIC_ADDRESS(CODE) \ + __pragma(warning(disable:1712)); CODE; __pragma(warning(default:1712)) + +#else // GCC does not support these compiler warnings + +#define OPENVDB_START_THREADSAFE_STATIC_REFERENCE +#define OPENVDB_FINISH_THREADSAFE_STATIC_REFERENCE +#define OPENVDB_START_THREADSAFE_STATIC_WRITE +#define OPENVDB_FINISH_THREADSAFE_STATIC_WRITE +#define OPENVDB_START_THREADSAFE_STATIC_ADDRESS +#define OPENVDB_FINISH_THREADSAFE_STATIC_ADDRESS + +#define OPENVDB_START_NON_THREADSAFE_STATIC_REFERENCE +#define OPENVDB_FINISH_NON_THREADSAFE_STATIC_REFERENCE +#define OPENVDB_START_NON_THREADSAFE_STATIC_WRITE +#define OPENVDB_FINISH_NON_THREADSAFE_STATIC_WRITE +#define OPENVDB_START_NON_THREADSAFE_STATIC_ADDRESS +#define OPENVDB_FINISH_NON_THREADSAFE_STATIC_ADDRESS + +#define OPENVDB_THREADSAFE_STATIC_REFERENCE(CODE) CODE +#define OPENVDB_THREADSAFE_STATIC_WRITE(CODE) CODE +#define OPENVDB_THREADSAFE_STATIC_ADDRESS(CODE) CODE + +#endif // defined(__ICC) + +#endif // OPENVDB_TYPES_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/io/Archive.h b/nuparu/include/openvdb/include/openvdb/io/Archive.h new file mode 100644 index 00000000..a195fc8b --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/io/Archive.h @@ -0,0 +1,228 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_IO_ARCHIVE_HAS_BEEN_INCLUDED +#define OPENVDB_IO_ARCHIVE_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // for VersionId +#include "Compression.h" // for COMPRESS_ZIP, etc. + + +class TestFile; + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace io { + +class GridDescriptor; + + +/// Grid serializer/unserializer +class OPENVDB_API Archive +{ +public: + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + static const uint32_t DEFAULT_COMPRESSION_FLAGS; + + Archive(); + virtual ~Archive(); + + /// @brief Return a copy of this archive. + virtual Ptr copy() const; + + /// @brief Return the UUID that was most recently written (or read, + /// if no UUID has been written yet). + std::string getUniqueTag() const; + /// @brief Return @c true if the given UUID matches this archive's UUID. + bool isIdentical(const std::string& uuidStr) const; + + /// @brief Return the file format version number of the input stream. + uint32_t fileVersion() const { return mFileVersion; } + /// @brief Return the (major, minor) version number of the library that was + /// used to write the input stream. + VersionId libraryVersion() const { return mLibraryVersion; } + /// @brief Return a string of the form "./", giving the + /// library and file format version numbers associated with the input stream. + std::string version() const; + + /// @brief Return @c true if trees shared by multiple grids are written out + /// only once, @c false if they are written out once per grid. + bool isInstancingEnabled() const { return mEnableInstancing; } + /// @brief Specify whether trees shared by multiple grids should be + /// written out only once (@c true) or once per grid (@c false). + /// @note Instancing is enabled by default. + void setInstancingEnabled(bool b) { mEnableInstancing = b; } + + /// Return @c true if the OpenVDB library includes support for the Blosc compressor. + static bool hasBloscCompression(); + + /// Return a bit mask specifying compression options for the data stream. + uint32_t compression() const { return mCompression; } + /// @brief Specify whether and how the data stream should be compressed. + /// @param c bitwise OR (e.g., COMPRESS_ZIP | COMPRESS_ACTIVE_MASK) of + /// compression option flags (see Compression.h for the available flags) + /// @note Not all combinations of compression options are supported. + void setCompression(uint32_t c) { mCompression = c; } + + /// @brief Return @c true if grid statistics (active voxel count and + /// bounding box, etc.) are computed and written as grid metadata. + bool isGridStatsMetadataEnabled() const { return mEnableGridStats; } + /// @brief Specify whether grid statistics (active voxel count and + /// bounding box, etc.) should be computed and written as grid metadata. + void setGridStatsMetadataEnabled(bool b) { mEnableGridStats = b; } + + /// @brief Write the grids in the given container to this archive's output stream. + virtual void write(const GridCPtrVec&, const MetaMap& = MetaMap()) const {} + + /// @brief Return @c true if delayed loading is enabled. + /// @details If enabled, delayed loading can be disabled for individual files, + /// but not vice-versa. + /// @note Define the environment variable @c OPENVDB_DISABLE_DELAYED_LOAD + /// to disable delayed loading unconditionally. + static bool isDelayedLoadingEnabled(); + +protected: + /// @brief Return @c true if the input stream contains grid offsets + /// that allow for random access or partial reading. + bool inputHasGridOffsets() const { return mInputHasGridOffsets; } + void setInputHasGridOffsets(bool b) { mInputHasGridOffsets = b; } + + /// @brief Tag the given input stream with the input file format version number. + /// + /// The tag can be retrieved with getFormatVersion(). + /// @sa getFormatVersion() + void setFormatVersion(std::istream&); + + /// @brief Tag the given input stream with the version number of + /// the library with which the input stream was created. + /// + /// The tag can be retrieved with getLibraryVersion(). + /// @sa getLibraryVersion() + void setLibraryVersion(std::istream&); + + /// @brief Tag the given input stream with flags indicating whether + /// the input stream contains compressed data and how it is compressed. + void setDataCompression(std::istream&); + + /// @brief Tag an output stream with flags specifying only those + /// compression options that are applicable to the given grid. + void setGridCompression(std::ostream&, const GridBase&) const; + /// @brief Read in the compression flags for a grid and + /// tag the given input stream with those flags. + static void readGridCompression(std::istream&); + + /// Read in and return the number of grids on the input stream. + static int32_t readGridCount(std::istream&); + + /// Populate the given grid from the input stream. + static void readGrid(GridBase::Ptr, const GridDescriptor&, std::istream&); +#ifndef OPENVDB_2_ABI_COMPATIBLE + /// @brief Populate the given grid from the input stream, but only where it + /// intersects the given world-space bounding box. + static void readGrid(GridBase::Ptr, const GridDescriptor&, std::istream&, const BBoxd&); + /// @brief Populate the given grid from the input stream, but only where it + /// intersects the given index-space bounding box. + static void readGrid(GridBase::Ptr, const GridDescriptor&, std::istream&, const CoordBBox&); +#endif + + typedef std::map NamedGridMap; + + /// @brief If the grid represented by the given grid descriptor + /// is an instance, connect it with its instance parent. + void connectInstance(const GridDescriptor&, const NamedGridMap&) const; + + /// Write the given grid descriptor and grid to an output stream + /// and update the GridDescriptor offsets. + /// @param seekable if true, the output stream supports seek operations + void writeGrid(GridDescriptor&, GridBase::ConstPtr, std::ostream&, bool seekable) const; + /// Write the given grid descriptor and grid metadata to an output stream + /// and update the GridDescriptor offsets, but don't write the grid's tree, + /// since it is shared with another grid. + /// @param seekable if true, the output stream supports seek operations + void writeGridInstance(GridDescriptor&, GridBase::ConstPtr, + std::ostream&, bool seekable) const; + + /// @brief Read the magic number, version numbers, UUID, etc. from the given input stream. + /// @return @c true if the input UUID differs from the previously-read UUID. + bool readHeader(std::istream&); + /// @brief Write the magic number, version numbers, UUID, etc. to the given output stream. + /// @param seekable if true, the output stream supports seek operations + /// @todo This method should not be const since it actually redefines the UUID! + void writeHeader(std::ostream&, bool seekable) const; + + //@{ + /// Write the given grids to an output stream. + void write(std::ostream&, const GridPtrVec&, bool seekable, const MetaMap& = MetaMap()) const; + void write(std::ostream&, const GridCPtrVec&, bool seekable, const MetaMap& = MetaMap()) const; + //@} + +private: + friend class ::TestFile; + + /// The version of the file that was read + uint32_t mFileVersion; + /// The version of the library that was used to create the file that was read + VersionId mLibraryVersion; + /// 16-byte (128-bit) UUID + mutable boost::uuids::uuid mUuid;// needs to be mutable since writeHeader is const! + /// Flag indicating whether the input stream contains grid offsets + /// and therefore supports partial reading + bool mInputHasGridOffsets; + /// Flag indicating whether a tree shared by multiple grids should be + /// written out only once (true) or once per grid (false) + bool mEnableInstancing; + /// Flags indicating whether and how the data stream is compressed + uint32_t mCompression; + /// Flag indicating whether grid statistics metadata should be written + bool mEnableGridStats; +}; // class Archive + +} // namespace io +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_IO_ARCHIVE_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/io/Compression.h b/nuparu/include/openvdb/include/openvdb/io/Compression.h new file mode 100644 index 00000000..405d61ac --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/io/Compression.h @@ -0,0 +1,619 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_IO_COMPRESSION_HAS_BEEN_INCLUDED +#define OPENVDB_IO_COMPRESSION_HAS_BEEN_INCLUDED + +#include +#include // for negative() +#include "io.h" // for getDataCompression(), etc. +#include +#include +#include +#include +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace io { + +/// @brief OR-able bit flags for compression options on input and output streams +/// @details +///
+///
COMPRESS_NONE +///
On write, don't compress data.
+/// On read, the input stream contains uncompressed data. +/// +///
COMPRESS_ZIP +///
When writing grids other than level sets or fog volumes, apply +/// ZLIB compression to internal and leaf node value buffers.
+/// When reading grids other than level sets or fog volumes, indicate that +/// the value buffers of internal and leaf nodes are ZLIB-compressed.
+/// ZLIB compresses well but is slow. +/// +///
COMPRESS_ACTIVE_MASK +///
When writing a grid of any class, don't output a node's inactive values +/// if it has two or fewer distinct values. Instead, output minimal information +/// to permit the lossless reconstruction of inactive values.
+/// On read, nodes might have been stored without inactive values. +/// Where necessary, reconstruct inactive values from available information. +/// +///
COMPRESS_BLOSC +///
When writing grids other than level sets or fog volumes, apply +/// Blosc compression to internal and leaf node value buffers.
+/// When reading grids other than level sets or fog volumes, indicate that +/// the value buffers of internal and leaf nodes are Blosc-compressed.
+/// Blosc is much faster than ZLIB and produces comparable file sizes. +///
+enum { + COMPRESS_NONE = 0, + COMPRESS_ZIP = 0x1, + COMPRESS_ACTIVE_MASK = 0x2, + COMPRESS_BLOSC = 0x4 +}; + +/// Return a string describing the given compression flags. +OPENVDB_API std::string compressionToString(uint32_t flags); + + +//////////////////////////////////////// + + +/// @internal Per-node indicator byte that specifies what additional metadata +/// is stored to permit reconstruction of inactive values +enum { + /*0*/ NO_MASK_OR_INACTIVE_VALS, // no inactive vals, or all inactive vals are +background + /*1*/ NO_MASK_AND_MINUS_BG, // all inactive vals are -background + /*2*/ NO_MASK_AND_ONE_INACTIVE_VAL, // all inactive vals have the same non-background val + /*3*/ MASK_AND_NO_INACTIVE_VALS, // mask selects between -background and +background + /*4*/ MASK_AND_ONE_INACTIVE_VAL, // mask selects between backgd and one other inactive val + /*5*/ MASK_AND_TWO_INACTIVE_VALS, // mask selects between two non-background inactive vals + /*6*/ NO_MASK_AND_ALL_VALS // > 2 inactive vals, so no mask compression at all +}; + + +//////////////////////////////////////// + + +/// @brief RealToHalf and its specializations define a mapping from +/// floating-point data types to analogous half float types. +template +struct RealToHalf { + enum { isReal = false }; // unless otherwise specified, type T is not a floating-point type + typedef T HalfT; // type T's half float analogue is T itself + static HalfT convert(const T& val) { return val; } +}; +template<> struct RealToHalf { + enum { isReal = true }; + typedef half HalfT; + static HalfT convert(float val) { return HalfT(val); } +}; +template<> struct RealToHalf { + enum { isReal = true }; + typedef half HalfT; + // A half can only be constructed from a float, so cast the value to a float first. + static HalfT convert(double val) { return HalfT(float(val)); } +}; +template<> struct RealToHalf { + enum { isReal = true }; + typedef Vec2H HalfT; + static HalfT convert(const Vec2s& val) { return HalfT(val); } +}; +template<> struct RealToHalf { + enum { isReal = true }; + typedef Vec2H HalfT; + // A half can only be constructed from a float, so cast the vector's elements to floats first. + static HalfT convert(const Vec2d& val) { return HalfT(Vec2s(val)); } +}; +template<> struct RealToHalf { + enum { isReal = true }; + typedef Vec3H HalfT; + static HalfT convert(const Vec3s& val) { return HalfT(val); } +}; +template<> struct RealToHalf { + enum { isReal = true }; + typedef Vec3H HalfT; + // A half can only be constructed from a float, so cast the vector's elements to floats first. + static HalfT convert(const Vec3d& val) { return HalfT(Vec3s(val)); } +}; + + +/// Return the given value truncated to 16-bit float precision. +template +inline T +truncateRealToHalf(const T& val) +{ + return T(RealToHalf::convert(val)); +} + + +//////////////////////////////////////// + + +OPENVDB_API void zipToStream(std::ostream&, const char* data, size_t numBytes); +OPENVDB_API void unzipFromStream(std::istream&, char* data, size_t numBytes); +OPENVDB_API void bloscToStream(std::ostream&, const char* data, size_t valSize, size_t numVals); +OPENVDB_API void bloscFromStream(std::istream&, char* data, size_t numBytes); + +/// @brief Read data from a stream. +/// @param is the input stream +/// @param data the contiguous array of data to read in +/// @param count the number of elements to read in +/// @param compression whether and how the data is compressed (either COMPRESS_NONE, +/// COMPRESS_ZIP, COMPRESS_ACTIVE_MASK or COMPRESS_BLOSC) +/// @throw IoError if @a compression is COMPRESS_BLOSC but OpenVDB was compiled +/// without Blosc support. +/// @details This default implementation is instantiated only for types +/// whose size can be determined by the sizeof() operator. +template +inline void +readData(std::istream& is, T* data, Index count, uint32_t compression) +{ + if (compression & COMPRESS_BLOSC) { + bloscFromStream(is, reinterpret_cast(data), sizeof(T) * count); + } else if (compression & COMPRESS_ZIP) { + unzipFromStream(is, reinterpret_cast(data), sizeof(T) * count); + } else { + is.read(reinterpret_cast(data), sizeof(T) * count); + } +} + +/// Specialization for std::string input +template<> +inline void +readData(std::istream& is, std::string* data, Index count, uint32_t /*compression*/) +{ + for (Index i = 0; i < count; ++i) { + size_t len = 0; + is >> len; + //data[i].resize(len); + //is.read(&(data[i][0]), len); + + std::string buffer(len+1, ' '); + is.read(&buffer[0], len+1 ); + data[i].assign(buffer, 0, len); + } +} + +/// HalfReader wraps a static function, read(), that is analogous to readData(), above, +/// except that it is partially specialized for floating-point types in order to promote +/// 16-bit half float values to full float. A wrapper class is required because +/// only classes, not functions, can be partially specialized. +template struct HalfReader; +/// Partial specialization for non-floating-point types (no half to float promotion) +template +struct HalfReader { + static inline void read(std::istream& is, T* data, Index count, uint32_t compression) { + readData(is, data, count, compression); + } +}; +/// Partial specialization for floating-point types +template +struct HalfReader { + typedef typename RealToHalf::HalfT HalfT; + static inline void read(std::istream& is, T* data, Index count, uint32_t compression) { + if (count < 1) return; + std::vector halfData(count); // temp buffer into which to read half float values + readData(is, reinterpret_cast(&halfData[0]), count, compression); + // Copy half float values from the temporary buffer to the full float output array. + std::copy(halfData.begin(), halfData.end(), data); + } +}; + + +/// Write data to a stream. +/// @param os the output stream +/// @param data the contiguous array of data to write +/// @param count the number of elements to write out +/// @param compression whether and how to compress the data (either COMPRESS_NONE, +/// COMPRESS_ZIP, COMPRESS_ACTIVE_MASK or COMPRESS_BLOSC) +/// @throw IoError if @a compression is COMPRESS_BLOSC but OpenVDB was compiled +/// without Blosc support. +/// @details This default implementation is instantiated only for types +/// whose size can be determined by the sizeof() operator. +template +inline void +writeData(std::ostream &os, const T *data, Index count, uint32_t compression) +{ + if (compression & COMPRESS_BLOSC) { + bloscToStream(os, reinterpret_cast(data), sizeof(T), count); + } else if (compression & COMPRESS_ZIP) { + zipToStream(os, reinterpret_cast(data), sizeof(T) * count); + } else { + os.write(reinterpret_cast(data), sizeof(T) * count); + } +} + +/// Specialization for std::string output +template<> +inline void +writeData(std::ostream& os, const std::string* data, Index count, + uint32_t /*compression*/) ///< @todo add compression +{ + for (Index i = 0; i < count; ++i) { + const size_t len = data[i].size(); + os << len; + os.write(data[i].c_str(), len+1); + //os.write(&(data[i][0]), len ); + } +} + +/// HalfWriter wraps a static function, write(), that is analogous to writeData(), above, +/// except that it is partially specialized for floating-point types in order to quantize +/// floating-point values to 16-bit half float. A wrapper class is required because +/// only classes, not functions, can be partially specialized. +template struct HalfWriter; +/// Partial specialization for non-floating-point types (no float to half quantization) +template +struct HalfWriter { + static inline void write(std::ostream& os, const T* data, Index count, uint32_t compression) { + writeData(os, data, count, compression); + } +}; +/// Partial specialization for floating-point types +template +struct HalfWriter { + typedef typename RealToHalf::HalfT HalfT; + static inline void write(std::ostream& os, const T* data, Index count, uint32_t compression) { + if (count < 1) return; + // Convert full float values to half float, then output the half float array. + std::vector halfData(count); + for (Index i = 0; i < count; ++i) halfData[i] = RealToHalf::convert(data[i]); + writeData(os, reinterpret_cast(&halfData[0]), count, compression); + } +}; +#ifdef _MSC_VER +/// Specialization to avoid double to float warnings in MSVC +template<> +struct HalfWriter { + typedef RealToHalf::HalfT HalfT; + static inline void write(std::ostream& os, const double* data, Index count, + uint32_t compression) + { + if (count < 1) return; + // Convert full float values to half float, then output the half float array. + std::vector halfData(count); + for (Index i = 0; i < count; ++i) halfData[i] = RealToHalf::convert(data[i]); + writeData(os, reinterpret_cast(&halfData[0]), count, compression); + } +}; +#endif // _MSC_VER + + +//////////////////////////////////////// + + +/// Populate the given buffer with @a destCount values of type @c ValueT +/// read from the given stream, taking into account that the stream might +/// have been compressed via one of several supported schemes. +/// [Mainly for internal use] +/// @param is a stream from which to read data (possibly compressed, +/// depending on the stream's compression settings) +/// @param destBuf a buffer into which to read values of type @c ValueT +/// @param destCount the number of values to be stored in the buffer +/// @param valueMask a bitmask (typically, a node's value mask) indicating +/// which positions in the buffer correspond to active values +/// @param fromHalf if true, read 16-bit half floats from the input stream +/// and convert them to full floats +template +inline void +readCompressedValues(std::istream& is, ValueT* destBuf, Index destCount, + const MaskT& valueMask, bool fromHalf) +{ + // Get the stream's compression settings. + const uint32_t compression = getDataCompression(is); + const bool maskCompressed = compression & COMPRESS_ACTIVE_MASK; + + int8_t metadata = NO_MASK_AND_ALL_VALS; + if (getFormatVersion(is) >= OPENVDB_FILE_VERSION_NODE_MASK_COMPRESSION) { + // Read the flag that specifies what, if any, additional metadata + // (selection mask and/or inactive value(s)) is saved. + is.read(reinterpret_cast(&metadata), /*bytes=*/1); + } + + ValueT background = zeroVal(); + if (const void* bgPtr = getGridBackgroundValuePtr(is)) { + background = *static_cast(bgPtr); + } + ValueT inactiveVal1 = background; + ValueT inactiveVal0 = + ((metadata == NO_MASK_OR_INACTIVE_VALS) ? background : math::negative(background)); + + if (metadata == NO_MASK_AND_ONE_INACTIVE_VAL || + metadata == MASK_AND_ONE_INACTIVE_VAL || + metadata == MASK_AND_TWO_INACTIVE_VALS) + { + // Read one of at most two distinct inactive values. + is.read(reinterpret_cast(&inactiveVal0), sizeof(ValueT)); + if (metadata == MASK_AND_TWO_INACTIVE_VALS) { + // Read the second of two distinct inactive values. + is.read(reinterpret_cast(&inactiveVal1), sizeof(ValueT)); + } + } + + MaskT selectionMask; + if (metadata == MASK_AND_NO_INACTIVE_VALS || + metadata == MASK_AND_ONE_INACTIVE_VAL || + metadata == MASK_AND_TWO_INACTIVE_VALS) + { + // For use in mask compression (only), read the bitmask that selects + // between two distinct inactive values. + selectionMask.load(is); + } + + ValueT* tempBuf = destBuf; + boost::scoped_array scopedTempBuf; + + Index tempCount = destCount; + if (maskCompressed && metadata != NO_MASK_AND_ALL_VALS + && getFormatVersion(is) >= OPENVDB_FILE_VERSION_NODE_MASK_COMPRESSION) + { + tempCount = valueMask.countOn(); + if (tempCount != destCount) { + // If this node has inactive voxels, allocate a temporary buffer + // into which to read just the active values. + scopedTempBuf.reset(new ValueT[tempCount]); + tempBuf = scopedTempBuf.get(); + } + } + + // Read in the buffer. + if (fromHalf) { + HalfReader::isReal, ValueT>::read(is, tempBuf, tempCount, compression); + } else { + readData(is, tempBuf, tempCount, compression); + } + + // If mask compression is enabled and the number of active values read into + // the temp buffer is smaller than the size of the destination buffer, + // then there are missing (inactive) values. + if (maskCompressed && tempCount != destCount) { + // Restore inactive values, using the background value and, if available, + // the inside/outside mask. (For fog volumes, the destination buffer is assumed + // to be initialized to background value zero, so inactive values can be ignored.) + for (Index destIdx = 0, tempIdx = 0; destIdx < MaskT::SIZE; ++destIdx) { + if (valueMask.isOn(destIdx)) { + // Copy a saved active value into this node's buffer. + destBuf[destIdx] = tempBuf[tempIdx]; + ++tempIdx; + } else { + // Reconstruct an unsaved inactive value and copy it into this node's buffer. + destBuf[destIdx] = (selectionMask.isOn(destIdx) ? inactiveVal1 : inactiveVal0); + } + } + } +} + + +/// Write @a srcCount values of type @c ValueT to the given stream, optionally +/// after compressing the values via one of several supported schemes. +/// [Mainly for internal use] +/// @param os a stream to which to write data (possibly compressed, depending +/// on the stream's compression settings) +/// @param srcBuf a buffer containing values of type @c ValueT to be written +/// @param srcCount the number of values stored in the buffer +/// @param valueMask a bitmask (typically, a node's value mask) indicating +/// which positions in the buffer correspond to active values +/// @param childMask a bitmask (typically, a node's child mask) indicating +/// which positions in the buffer correspond to child node pointers +/// @param toHalf if true, convert floating-point values to 16-bit half floats +template +inline void +writeCompressedValues(std::ostream& os, ValueT* srcBuf, Index srcCount, + const MaskT& valueMask, const MaskT& childMask, bool toHalf) +{ + struct Local { + // Comparison function for values + static inline bool eq(const ValueT& a, const ValueT& b) { + return math::isExactlyEqual(a, b); + } + }; + + // Get the stream's compression settings. + const uint32_t compress = getDataCompression(os); + const bool maskCompress = compress & COMPRESS_ACTIVE_MASK; + + Index tempCount = srcCount; + ValueT* tempBuf = srcBuf; + boost::scoped_array scopedTempBuf; + + int8_t metadata = NO_MASK_AND_ALL_VALS; + + if (!maskCompress) { + os.write(reinterpret_cast(&metadata), /*bytes=*/1); + } else { + // A valid level set's inactive values are either +background (outside) + // or -background (inside), and a fog volume's inactive values are all zero. + // Rather than write out all of these values, we can store just the active values + // (given that the value mask specifies their positions) and, if necessary, + // an inside/outside bitmask. + + const ValueT zero = zeroVal(); + ValueT background = zero; + if (const void* bgPtr = getGridBackgroundValuePtr(os)) { + background = *static_cast(bgPtr); + } + + /// @todo Consider all values, not just inactive values? + ValueT inactiveVal[2] = { background, background }; + int numUniqueInactiveVals = 0; + for (typename MaskT::OffIterator it = valueMask.beginOff(); + numUniqueInactiveVals < 3 && it; ++it) + { + const Index32 idx = it.pos(); + + // Skip inactive values that are actually child node pointers. + if (childMask.isOn(idx)) continue; + + const ValueT& val = srcBuf[idx]; + const bool unique = !( + (numUniqueInactiveVals > 0 && Local::eq(val, inactiveVal[0])) || + (numUniqueInactiveVals > 1 && Local::eq(val, inactiveVal[1])) + ); + if (unique) { + if (numUniqueInactiveVals < 2) inactiveVal[numUniqueInactiveVals] = val; + ++numUniqueInactiveVals; + } + } + + metadata = NO_MASK_OR_INACTIVE_VALS; + + if (numUniqueInactiveVals == 1) { + if (!Local::eq(inactiveVal[0], background)) { + if (Local::eq(inactiveVal[0], math::negative(background))) { + metadata = NO_MASK_AND_MINUS_BG; + } else { + metadata = NO_MASK_AND_ONE_INACTIVE_VAL; + } + } + } else if (numUniqueInactiveVals == 2) { + metadata = NO_MASK_OR_INACTIVE_VALS; + if (!Local::eq(inactiveVal[0], background) && !Local::eq(inactiveVal[1], background)) { + // If neither inactive value is equal to the background, both values + // need to be saved, along with a mask that selects between them. + metadata = MASK_AND_TWO_INACTIVE_VALS; + + } else if (Local::eq(inactiveVal[1], background)) { + if (Local::eq(inactiveVal[0], math::negative(background))) { + // If the second inactive value is equal to the background and + // the first is equal to -background, neither value needs to be saved, + // but save a mask that selects between -background and +background. + metadata = MASK_AND_NO_INACTIVE_VALS; + } else { + // If the second inactive value is equal to the background, only + // the first value needs to be saved, along with a mask that selects + // between it and the background. + metadata = MASK_AND_ONE_INACTIVE_VAL; + } + } else if (Local::eq(inactiveVal[0], background)) { + if (Local::eq(inactiveVal[1], math::negative(background))) { + // If the first inactive value is equal to the background and + // the second is equal to -background, neither value needs to be saved, + // but save a mask that selects between -background and +background. + metadata = MASK_AND_NO_INACTIVE_VALS; + std::swap(inactiveVal[0], inactiveVal[1]); + } else { + // If the first inactive value is equal to the background, swap it + // with the second value and save only that value, along with a mask + // that selects between it and the background. + std::swap(inactiveVal[0], inactiveVal[1]); + metadata = MASK_AND_ONE_INACTIVE_VAL; + } + } + } else if (numUniqueInactiveVals > 2) { + metadata = NO_MASK_AND_ALL_VALS; + } + + os.write(reinterpret_cast(&metadata), /*bytes=*/1); + + if (metadata == NO_MASK_AND_ONE_INACTIVE_VAL || + metadata == MASK_AND_ONE_INACTIVE_VAL || + metadata == MASK_AND_TWO_INACTIVE_VALS) + { + if (!toHalf) { + // Write one of at most two distinct inactive values. + os.write(reinterpret_cast(&inactiveVal[0]), sizeof(ValueT)); + if (metadata == MASK_AND_TWO_INACTIVE_VALS) { + // Write the second of two distinct inactive values. + os.write(reinterpret_cast(&inactiveVal[1]), sizeof(ValueT)); + } + } else { + // Write one of at most two distinct inactive values. + ValueT truncatedVal = static_cast(truncateRealToHalf(inactiveVal[0])); + os.write(reinterpret_cast(&truncatedVal), sizeof(ValueT)); + if (metadata == MASK_AND_TWO_INACTIVE_VALS) { + // Write the second of two distinct inactive values. + truncatedVal = truncateRealToHalf(inactiveVal[1]); + os.write(reinterpret_cast(&truncatedVal), sizeof(ValueT)); + } + } + } + + if (metadata == NO_MASK_AND_ALL_VALS) { + // If there are more than two unique inactive values, the entire input buffer + // needs to be saved (both active and inactive values). + /// @todo Save the selection mask as long as most of the inactive values + /// are one of two values? + } else { + // Create a new array to hold just the active values. + scopedTempBuf.reset(new ValueT[srcCount]); + tempBuf = scopedTempBuf.get(); + + if (metadata == NO_MASK_OR_INACTIVE_VALS || + metadata == NO_MASK_AND_MINUS_BG || + metadata == NO_MASK_AND_ONE_INACTIVE_VAL) + { + // Copy active values to the contiguous array. + tempCount = 0; + for (typename MaskT::OnIterator it = valueMask.beginOn(); it; ++it, ++tempCount) { + tempBuf[tempCount] = srcBuf[it.pos()]; + } + } else { + // Copy active values to a new, contiguous array and populate a bitmask + // that selects between two distinct inactive values. + MaskT selectionMask; + tempCount = 0; + for (Index srcIdx = 0; srcIdx < srcCount; ++srcIdx) { + if (valueMask.isOn(srcIdx)) { // active value + tempBuf[tempCount] = srcBuf[srcIdx]; + ++tempCount; + } else { // inactive value + if (Local::eq(srcBuf[srcIdx], inactiveVal[1])) { + selectionMask.setOn(srcIdx); // inactive value 1 + } // else inactive value 0 + } + } + assert(tempCount == valueMask.countOn()); + + // Write out the mask that selects between two inactive values. + selectionMask.save(os); + } + } + } + + // Write out the buffer. + if (toHalf) { + HalfWriter::isReal, ValueT>::write(os, tempBuf, tempCount, compress); + } else { + writeData(os, tempBuf, tempCount, compress); + } +} + +} // namespace io +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_IO_COMPRESSION_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/io/File.h b/nuparu/include/openvdb/include/openvdb/io/File.h new file mode 100644 index 00000000..90689685 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/io/File.h @@ -0,0 +1,276 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file File.h + +#ifndef OPENVDB_IO_FILE_HAS_BEEN_INCLUDED +#define OPENVDB_IO_FILE_HAS_BEEN_INCLUDED + +#include "io.h" // for MappedFile::Notifier +#include "Archive.h" +#include "GridDescriptor.h" +#include +#include +#include +#include + + +class TestFile; +class TestStream; + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace io { + +/// Grid archive associated with a file on disk +class OPENVDB_API File: public Archive +{ +public: + typedef std::multimap NameMap; + typedef NameMap::const_iterator NameMapCIter; + + explicit File(const std::string& filename); + virtual ~File(); + + /// @brief Copy constructor + /// @details The copy will be closed and will not reference the same + /// file descriptor as the original. + File(const File& other); + /// @brief Assignment + /// @details After assignment, this File will be closed and will not + /// reference the same file descriptor as the source File. + File& operator=(const File& other); + + /// @brief Return a copy of this archive. + /// @details The copy will be closed and will not reference the same + /// file descriptor as the original. + virtual boost::shared_ptr copy() const; + + /// @brief Return the name of the file with which this archive is associated. + /// @details The file does not necessarily exist on disk yet. + const std::string& filename() const; + + /// @brief Open the file, read the file header and the file-level metadata, + /// and populate the grid descriptors, but do not load any grids into memory. + /// @details If @a delayLoad is true, map the file into memory and enable delayed loading + /// of grids, and if a notifier is provided, call it when the file gets unmapped. + /// @note Define the environment variable @c OPENVDB_DISABLE_DELAYED_LOAD to disable + /// delayed loading unconditionally. + /// @throw IoError if the file is not a valid VDB file. + /// @return @c true if the file's UUID has changed since it was last read. + /// @see setCopyMaxBytes + bool open(bool delayLoad = true, const MappedFile::Notifier& = MappedFile::Notifier()); + + /// Return @c true if the file has been opened for reading. + bool isOpen() const; + + /// Close the file once we are done reading from it. + void close(); + + /// @brief Return this file's current size on disk in bytes. + /// @throw IoError if the file size cannot be determined. + Index64 getSize() const; + + /// @brief Return the size in bytes above which this file will not be + /// automatically copied during delayed loading. + Index64 copyMaxBytes() const; + /// @brief If this file is opened with delayed loading enabled, make a private copy + /// of the file if its size in bytes is less than the specified value. + /// @details Making a private copy ensures that the file can't change on disk + /// before it has been fully read. + /// @warning If the file is larger than this size, it is the user's responsibility + /// to ensure that it does not change on disk before it has been fully read. + /// Undefined behavior and/or a crash might result otherwise. + /// @note Copying is enabled by default, but it can be disabled for individual files + /// by setting the maximum size to zero bytes. A default size limit can be specified + /// by setting the environment variable @c OPENVDB_DELAYED_LOAD_COPY_MAX_BYTES + /// to the desired number of bytes. + void setCopyMaxBytes(Index64 bytes); + + /// Return @c true if a grid of the given name exists in this file. + bool hasGrid(const Name&) const; + + /// Return (in a newly created MetaMap) the file-level metadata. + MetaMap::Ptr getMetadata() const; + + /// Read the entire contents of the file and return a list of grid pointers. + GridPtrVecPtr getGrids() const; + + /// @brief Read just the grid metadata and transforms from the file and return a list + /// of pointers to grids that are empty except for their metadata and transforms. + /// @throw IoError if this file is not open for reading. + GridPtrVecPtr readAllGridMetadata(); + + /// @brief Read a grid's metadata and transform only. + /// @return A pointer to a grid that is empty except for its metadata and transform. + /// @throw IoError if this file is not open for reading. + /// @throw KeyError if no grid with the given name exists in this file. + GridBase::Ptr readGridMetadata(const Name&); + + /// @brief Read a grid's metadata, topology, transform, etc., but not + /// any of its leaf node data blocks. + /// @return the grid pointer to the partially loaded grid. + /// @note This returns a @c const pointer, so that the grid can't be + /// changed before its data blocks have been loaded. A non-const + /// pointer is only returned when readGrid() is called. + GridBase::ConstPtr readGridPartial(const Name&); + + /// Read an entire grid, including all of its data blocks. + GridBase::Ptr readGrid(const Name&); +#ifndef OPENVDB_2_ABI_COMPATIBLE + /// @brief Read a grid, including its data blocks, but only where it + /// intersects the given world-space bounding box. + GridBase::Ptr readGrid(const Name&, const BBoxd&); +#endif + + /// @todo GridPtrVec readAllGridsPartial(const Name&) + /// @todo GridPtrVec readAllGrids(const Name&) + + /// @brief Write the grids in the given container to the file whose name + /// was given in the constructor. + virtual void write(const GridCPtrVec&, const MetaMap& = MetaMap()) const; + + /// @brief Write the grids in the given container to the file whose name + /// was given in the constructor. + template + void write(const GridPtrContainerT&, const MetaMap& = MetaMap()) const; + + /// A const iterator that iterates over all names in the file. This is only + /// valid once the file has been opened. + class NameIterator + { + public: + NameIterator(const NameMapCIter& iter): mIter(iter) {} + ~NameIterator() {} + + NameIterator& operator++() { mIter++; return *this; } + + bool operator==(const NameIterator& iter) const { return mIter == iter.mIter; } + bool operator!=(const NameIterator& iter) const { return mIter != iter.mIter; } + + Name operator*() const { return this->gridName(); } + + Name gridName() const { return GridDescriptor::nameAsString(mIter->second.uniqueName()); } + + private: + NameMapCIter mIter; + }; + + /// @return a NameIterator to iterate over all grid names in the file. + NameIterator beginName() const; + + /// @return the ending iterator for all grid names in the file. + NameIterator endName() const; + +private: + /// Read in all grid descriptors that are stored in the given stream. + void readGridDescriptors(std::istream&); + + /// @brief Return an iterator to the descriptor for the grid with the given name. + /// If the name is non-unique, return an iterator to the first matching descriptor. + NameMapCIter findDescriptor(const Name&) const; + + /// Return a newly created, empty grid of the type specified by the given grid descriptor. + GridBase::Ptr createGrid(const GridDescriptor&) const; + + /// @brief Read a grid, including its data blocks, but only where it + /// intersects the given world-space bounding box. + GridBase::Ptr readGridByName(const Name&, const BBoxd&); + + /// Read in and return the partially-populated grid specified by the given grid descriptor. + GridBase::ConstPtr readGridPartial(const GridDescriptor&, bool readTopology) const; + + /// Read in and return the grid specified by the given grid descriptor. + GridBase::Ptr readGrid(const GridDescriptor&) const; +#ifndef OPENVDB_2_ABI_COMPATIBLE + /// Read in and return the region of the grid specified by the given grid descriptor + /// that intersects the given world-space bounding box. + GridBase::Ptr readGrid(const GridDescriptor&, const BBoxd&) const; + /// Read in and return the region of the grid specified by the given grid descriptor + /// that intersects the given index-space bounding box. + GridBase::Ptr readGrid(const GridDescriptor&, const CoordBBox&) const; +#endif + + /// @brief Partially populate the given grid by reading its metadata and transform and, + /// if the grid is not an instance, its tree structure, but not the tree's leaf nodes. + void readGridPartial(GridBase::Ptr, std::istream&, bool isInstance, bool readTopology) const; + + /// @brief Retrieve a grid from @c mNamedGrids. Return a null pointer + /// if @c mNamedGrids was not populated (because this file is random-access). + /// @throw KeyError if no grid with the given name exists in this file. + GridBase::Ptr retrieveCachedGrid(const Name&) const; + + void writeGrids(const GridCPtrVec&, const MetaMap&) const; + + MetaMap::Ptr fileMetadata(); + MetaMap::ConstPtr fileMetadata() const; + + const NameMap& gridDescriptors() const; + NameMap& gridDescriptors(); + + std::istream& inputStream() const; + + friend class ::TestFile; + friend class ::TestStream; + + struct Impl; + boost::scoped_ptr mImpl; +}; + + +//////////////////////////////////////// + + +inline void +File::write(const GridCPtrVec& grids, const MetaMap& meta) const +{ + this->writeGrids(grids, meta); +} + + +template +inline void +File::write(const GridPtrContainerT& container, const MetaMap& meta) const +{ + GridCPtrVec grids; + std::copy(container.begin(), container.end(), std::back_inserter(grids)); + this->writeGrids(grids, meta); +} + +} // namespace io +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_IO_FILE_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/io/GridDescriptor.h b/nuparu/include/openvdb/include/openvdb/io/GridDescriptor.h new file mode 100644 index 00000000..364a2b0d --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/io/GridDescriptor.h @@ -0,0 +1,135 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_IO_GRIDDESCRIPTOR_HAS_BEEN_INCLUDED +#define OPENVDB_IO_GRIDDESCRIPTOR_HAS_BEEN_INCLUDED + +#include +#include +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace io { + +/// This structure stores useful information that describes a grid on disk. +/// It can be used to retrieve I/O information about the grid such as +/// offsets into the file where the grid is located, its type, etc. +class OPENVDB_API GridDescriptor +{ +public: + GridDescriptor(); + GridDescriptor(const Name& name, const Name& gridType, bool saveFloatAsHalf = false); + + ~GridDescriptor(); + + const Name& gridType() const { return mGridType; } + const Name& gridName() const { return mGridName; } + const Name& uniqueName() const { return mUniqueName; } + + const Name& instanceParentName() const { return mInstanceParentName; } + void setInstanceParentName(const Name& name) { mInstanceParentName = name; } + bool isInstance() const { return !mInstanceParentName.empty(); } + + bool saveFloatAsHalf() const { return mSaveFloatAsHalf; } + + void setGridPos(boost::int64_t pos) { mGridPos = pos; } + boost::int64_t getGridPos() const { return mGridPos; } + + void setBlockPos(boost::int64_t pos) { mBlockPos = pos; } + boost::int64_t getBlockPos() const { return mBlockPos; } + + void setEndPos(boost::int64_t pos) { mEndPos = pos; } + boost::int64_t getEndPos() const { return mEndPos; } + + // These methods seek to the right position in the given stream. + void seekToGrid(std::istream&) const; + void seekToBlocks(std::istream&) const; + void seekToEnd(std::istream&) const; + + void seekToGrid(std::ostream&) const; + void seekToBlocks(std::ostream&) const; + void seekToEnd(std::ostream&) const; + + /// @brief Write out this descriptor's header information (all data except for + /// stream offsets). + void writeHeader(std::ostream&) const; + + /// @brief Since positions into the stream are known at a later time, they are + /// written out separately. + void writeStreamPos(std::ostream&) const; + + /// @brief Read a grid descriptor from the given stream. + /// @return an empty grid of the type specified by the grid descriptor. + GridBase::Ptr read(std::istream&); + + /// @brief Append the number @a n to the given name (separated by an ASCII + /// "record separator" character) and return the resulting name. + static Name addSuffix(const Name&, int n); + /// @brief Strip from the given name any suffix that is separated by an ASCII + /// "record separator" character and return the resulting name. + static Name stripSuffix(const Name&); + /// @brief Given a name with suffix N, return "name[N]", otherwise just return "name". + /// Use this to produce a human-readable string from a descriptor's unique name. + static std::string nameAsString(const Name&); + /// @brief Given a string of the form "name[N]", return "name" with the suffix N + /// separated by an ASCII "record separator" character). Otherwise just return + /// the string as is. + static Name stringAsUniqueName(const std::string&); + +private: + /// Name of the grid + Name mGridName; + /// Unique name for this descriptor + Name mUniqueName; + /// If nonempty, the name of another grid that shares this grid's tree + Name mInstanceParentName; + /// The type of the grid + Name mGridType; + /// Are floats quantized to 16 bits on disk? + bool mSaveFloatAsHalf; + /// Location in the stream where the grid data is stored + boost::int64_t mGridPos; + /// Location in the stream where the grid blocks are stored + boost::int64_t mBlockPos; + /// Location in the stream where the next grid descriptor begins + boost::int64_t mEndPos; +}; + +} // namespace io +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_IO_GRIDDESCRIPTOR_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/io/Queue.h b/nuparu/include/openvdb/include/openvdb/io/Queue.h new file mode 100644 index 00000000..7ac298ab --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/io/Queue.h @@ -0,0 +1,277 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file Queue.h +/// @author Peter Cucka + +#ifndef OPENVDB_IO_QUEUE_HAS_BEEN_INCLUDED +#define OPENVDB_IO_QUEUE_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include // for std::copy +#include // for std::back_inserter + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace io { + +class Archive; + +/// @brief Queue for asynchronous output of grids to files or streams +/// +/// @warning The queue holds shared pointers to grids. It is not safe +/// to modify a grid that has been placed in the queue. Instead, +/// make a deep copy of the grid (Grid::deepCopy()). +/// +/// @par Example: +/// @code +/// #include +/// #include +/// #include +/// #include +/// +/// using openvdb::io::Queue; +/// +/// struct MyNotifier +/// { +/// // Use a concurrent container, because queue callback functions +/// // must be thread-safe. +/// typedef tbb::concurrent_hash_map FilenameMap; +/// FilenameMap filenames; +/// +/// // Callback function that prints the status of a completed task. +/// void callback(Queue::Id id, Queue::Status status) +/// { +/// const bool ok = (status == Queue::SUCCEEDED); +/// FilenameMap::accessor acc; +/// if (filenames.find(acc, id)) { +/// std::cout << (ok ? "wrote " : "failed to write ") +/// << acc->second << std::endl; +/// filenames.erase(acc); +/// } +/// } +/// }; +/// +/// int main() +/// { +/// // Construct an object to receive notifications from the queue. +/// // The object's lifetime must exceed the queue's. +/// MyNotifier notifier; +/// +/// Queue queue; +/// +/// // Register the callback() method of the MyNotifier object +/// // to receive notifications of completed tasks. +/// queue.addNotifier(boost::bind(&MyNotifier::callback, ¬ifier, _1, _2)); +/// +/// // Queue grids for output (e.g., for each step of a simulation). +/// for (int step = 1; step <= 10; ++step) { +/// openvdb::FloatGrid::Ptr grid = ...; +/// +/// std::ostringstream os; +/// os << "mygrid." << step << ".vdb"; +/// const std::string filename = os.str(); +/// +/// Queue::Id id = queue.writeGrid(grid, openvdb::io::File(filename)); +/// +/// // Associate the filename with the ID of the queued task. +/// MyNotifier::FilenameMap::accessor acc; +/// notifier.filenames.insert(acc, id); +/// acc->second = filename; +/// } +/// } +/// @endcode +/// Output: +/// @code +/// wrote mygrid.1.vdb +/// wrote mygrid.2.vdb +/// wrote mygrid.4.vdb +/// wrote mygrid.3.vdb +/// ... +/// wrote mygrid.10.vdb +/// @endcode +/// Note that tasks do not necessarily complete in the order in which they were queued. +class OPENVDB_API Queue +{ +public: + /// Default maximum queue length (see setCapacity()) + static const Index32 DEFAULT_CAPACITY = 100; + /// @brief Default maximum time in seconds to wait to queue a task + /// when the queue is full (see setTimeout()) + static const Index32 DEFAULT_TIMEOUT = 120; // seconds + + /// ID number of a queued task or of a registered notification callback + typedef Index32 Id; + + /// Status of a queued task + enum Status { UNKNOWN, PENDING, SUCCEEDED, FAILED }; + + + /// Construct a queue with the given capacity. + explicit Queue(Index32 capacity = DEFAULT_CAPACITY); + /// Block until all queued tasks complete (successfully or unsuccessfully). + ~Queue(); + + /// @brief Return @c true if the queue is empty. + bool empty() const; + /// @brief Return the number of tasks currently in the queue. + Index32 size() const; + + /// @brief Return the maximum number of tasks allowed in the queue. + /// @details Once the queue has reached its maximum size, adding + /// a new task will block until an existing task has executed. + Index32 capacity() const; + /// Set the maximum number of tasks allowed in the queue. + void setCapacity(Index32); + + /// Return the maximum number of seconds to wait to queue a task when the queue is full. + Index32 timeout() const; + /// Set the maximum number of seconds to wait to queue a task when the queue is full. + void setTimeout(Index32 seconds = DEFAULT_TIMEOUT); + + /// @brief Return the status of the task with the given ID. + /// @note Querying the status of a task that has already completed + /// (whether successfully or not) removes the task from the status registry. + /// Subsequent queries of its status will return UNKNOWN. + Status status(Id) const; + + typedef boost::function Notifier; + /// @brief Register a function that will be called with a task's ID + /// and status when that task completes, whether successfully or not. + /// @return an ID that can be passed to removeNotifier() to deregister the function + /// @details When multiple notifiers are registered, they are called + /// in the order in which they were registered. + /// @warning Notifiers are called from worker threads, so they must be thread-safe + /// and their lifetimes must exceed that of the queue. They must also not call, + /// directly or indirectly, addNotifier(), removeNotifier() or clearNotifiers(), + /// as that can result in a deadlock. + Id addNotifier(Notifier); + /// Deregister the notifier with the given ID. + void removeNotifier(Id); + /// Deregister all notifiers. + void clearNotifiers(); + + /// @brief Queue a single grid for output to a file or stream. + /// @param grid the grid to be serialized + /// @param archive the io::File or io::Stream to which to output the grid + /// @param fileMetadata optional file-level metadata + /// @return an ID with which the status of the queued task can be queried + /// @throw RuntimeError if the task cannot be queued within the time limit + /// (see setTimeout()) because the queue is full + /// @par Example: + /// @code + /// openvdb::FloatGrid::Ptr grid = ...; + /// + /// openvdb::io::Queue queue; + /// + /// // Write the grid to the file mygrid.vdb. + /// queue.writeGrid(grid, openvdb::io::File("mygrid.vdb")); + /// + /// // Stream the grid to a binary string. + /// std::ostringstream ostr(std::ios_base::binary); + /// queue.writeGrid(grid, openvdb::io::Stream(ostr)); + /// @endcode + Id writeGrid(GridBase::ConstPtr grid, const Archive& archive, + const MetaMap& fileMetadata = MetaMap()); + + /// @brief Queue a container of grids for output to a file. + /// @param grids any iterable container of grid pointers + /// (e.g., a GridPtrVec or GridPtrSet) + /// @param archive the io::File or io::Stream to which to output the grids + /// @param fileMetadata optional file-level metadata + /// @return an ID with which the status of the queued task can be queried + /// @throw RuntimeError if the task cannot be queued within the time limit + /// (see setTimeout()) because the queue is full + /// @par Example: + /// @code + /// openvdb::FloatGrid::Ptr floatGrid = ...; + /// openvdb::BoolGrid::Ptr boolGrid = ...; + /// openvdb::GridPtrVec grids; + /// grids.push_back(floatGrid); + /// grids.push_back(boolGrid); + /// + /// openvdb::io::Queue queue; + /// + /// // Write the grids to the file mygrid.vdb. + /// queue.write(grids, openvdb::io::File("mygrid.vdb")); + /// + /// // Stream the grids to a (binary) string. + /// std::ostringstream ostr(std::ios_base::binary); + /// queue.write(grids, openvdb::io::Stream(ostr)); + /// @endcode + template + Id write(const GridPtrContainer& grids, const Archive& archive, + const MetaMap& fileMetadata = MetaMap()); + +private: + // Disallow copying of instances of this class. + Queue(const Queue&); + Queue& operator=(const Queue&); + + Id writeGridVec(const GridCPtrVec&, const Archive&, const MetaMap&); + + struct Impl; + boost::shared_ptr mImpl; +}; // class Queue + + +template +inline Queue::Id +Queue::write(const GridPtrContainer& container, + const Archive& archive, const MetaMap& metadata) +{ + GridCPtrVec grids; + std::copy(container.begin(), container.end(), std::back_inserter(grids)); + return this->writeGridVec(grids, archive, metadata); +} + +// Specialization for vectors of const Grid pointers; no copying necessary +template<> +inline Queue::Id +Queue::write(const GridCPtrVec& grids, + const Archive& archive, const MetaMap& metadata) +{ + return this->writeGridVec(grids, archive, metadata); +} + +} // namespace io +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_IO_QUEUE_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/io/Stream.h b/nuparu/include/openvdb/include/openvdb/io/Stream.h new file mode 100644 index 00000000..161e0c7f --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/io/Stream.h @@ -0,0 +1,120 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_IO_STREAM_HAS_BEEN_INCLUDED +#define OPENVDB_IO_STREAM_HAS_BEEN_INCLUDED + +#include "Archive.h" +#include +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace io { + +class GridDescriptor; + + +/// Grid archive associated with arbitrary input and output streams (not necessarily files) +class OPENVDB_API Stream: public Archive +{ +public: + /// @brief Read grids from an input stream. + /// @details If @a delayLoad is true, map the contents of the input stream + /// into memory and enable delayed loading of grids. + /// @note Define the environment variable @c OPENVDB_DISABLE_DELAYED_LOAD + /// to disable delayed loading unconditionally. + explicit Stream(std::istream&, bool delayLoad = true); + + /// Construct an archive for stream output. + Stream(); + /// Construct an archive for output to the given stream. + explicit Stream(std::ostream&); + + Stream(const Stream&); + Stream& operator=(const Stream&); + + virtual ~Stream(); + + /// @brief Return a copy of this archive. + virtual Archive::Ptr copy() const; + + /// Return the file-level metadata in a newly created MetaMap. + MetaMap::Ptr getMetadata() const; + + /// Return pointers to the grids that were read from the input stream. + GridPtrVecPtr getGrids(); + + /// @brief Write the grids in the given container to this archive's output stream. + /// @throw ValueError if this archive was constructed without specifying an output stream. + virtual void write(const GridCPtrVec&, const MetaMap& = MetaMap()) const; + + /// @brief Write the grids in the given container to this archive's output stream. + /// @throw ValueError if this archive was constructed without specifying an output stream. + template + void write(const GridPtrContainerT&, const MetaMap& = MetaMap()) const; + +private: + /// Create a new grid of the type specified by the given descriptor, + /// then populate the grid from the given input stream. + /// @return the newly created grid. + GridBase::Ptr readGrid(const GridDescriptor&, std::istream&) const; + + void writeGrids(std::ostream&, const GridCPtrVec&, const MetaMap&) const; + + + struct Impl; + boost::scoped_ptr mImpl; +}; + + +//////////////////////////////////////// + + +template +inline void +Stream::write(const GridPtrContainerT& container, const MetaMap& metadata) const +{ + GridCPtrVec grids; + std::copy(container.begin(), container.end(), std::back_inserter(grids)); + this->write(grids, metadata); +} + +} // namespace io +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_IO_STREAM_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/io/TempFile.h b/nuparu/include/openvdb/include/openvdb/io/TempFile.h new file mode 100644 index 00000000..94f52a4c --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/io/TempFile.h @@ -0,0 +1,81 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file TempFile.h + +#ifndef OPENVDB_IO_TEMPFILE_HAS_BEEN_INCLUDED +#define OPENVDB_IO_TEMPFILE_HAS_BEEN_INCLUDED + +#include +#include +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace io { + +/// Output stream to a unique temporary file +class OPENVDB_API TempFile: public std::ostream +{ +public: + /// @brief Create and open a unique file. + /// @details On UNIX systems, the file is created in the directory specified by + /// the environment variable @c OPENVDB_TEMP_DIR, if that variable is defined, + /// or else in the directory specified by @c TMPDIR, if that variable is defined. + /// Otherwise (and on non-UNIX systems), the file is created in the system default + /// temporary directory. + TempFile(); + ~TempFile(); + + /// Return the path to the temporary file. + const std::string& filename() const; + + /// Return @c true if the file is open for writing. + bool is_open() const; + + /// Close the file. + void close(); + +private: + struct TempFileImpl; + boost::scoped_ptr mImpl; +}; + +} // namespace io +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_IO_TEMPFILE_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/io/io.h b/nuparu/include/openvdb/include/openvdb/io/io.h new file mode 100644 index 00000000..f40f2032 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/io/io.h @@ -0,0 +1,277 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_IO_IO_HAS_BEEN_INCLUDED +#define OPENVDB_IO_IO_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include // for std::ios_base +#include +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { + +class MetaMap; + +namespace io { + +/// @brief Container for metadata describing how to unserialize grids from and/or +/// serialize grids to a stream (which file format, compression scheme, etc. to use) +/// @details This class is mainly for internal use. +class OPENVDB_API StreamMetadata +{ +public: + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + StreamMetadata(); + StreamMetadata(const StreamMetadata&); + explicit StreamMetadata(std::ios_base&); + ~StreamMetadata(); + + StreamMetadata& operator=(const StreamMetadata&); + + /// @brief Transfer metadata items directly to the given stream. + /// @todo Deprecate direct transfer; use StreamMetadata structs everywhere. + void transferTo(std::ios_base&) const; + + uint32_t fileVersion() const; + void setFileVersion(uint32_t); + + VersionId libraryVersion() const; + void setLibraryVersion(VersionId); + + uint32_t compression() const; + void setCompression(uint32_t); + + uint32_t gridClass() const; + void setGridClass(uint32_t); + + const void* backgroundPtr() const; + void setBackgroundPtr(const void*); + + bool halfFloat() const; + void setHalfFloat(bool); + + bool writeGridStats() const; + void setWriteGridStats(bool); + + //@{ + /// @brief Return a (reference to a) copy of the metadata of the grid currently + /// being read or written. + /// @details Some grid metadata might duplicate information returned by + /// gridClass(), backgroundPtr() and other accessors, but those values + /// are not guaranteed to be kept in sync. + MetaMap& gridMetadata(); + const MetaMap& gridMetadata() const; + //@} + + typedef std::map AuxDataMap; + //@{ + /// @brief Return a map that can be populated with arbitrary user data. + AuxDataMap& auxData(); + const AuxDataMap& auxData() const; + //@} + + /// Return a string describing this stream metadata. + std::string str() const; + +private: + struct Impl; + boost::scoped_ptr mImpl; +}; // class StreamMetadata + + +/// Write a description of the given metadata to an output stream. +std::ostream& operator<<(std::ostream&, const StreamMetadata&); + +std::ostream& operator<<(std::ostream&, const StreamMetadata::AuxDataMap&); + + +//////////////////////////////////////// + + +class File; + +/// @brief Handle to control the lifetime of a memory-mapped .vdb file +class OPENVDB_API MappedFile +{ +public: + typedef boost::shared_ptr Ptr; + + ~MappedFile(); + + /// Return the filename of the mapped file. + std::string filename() const; + + /// @brief Return a new stream buffer for the mapped file. + /// @details Typical usage is + /// @code + /// openvdb::io::MappedFile::Ptr mappedFile = ...; + /// boost::shared_ptr buf = mappedFile->createBuffer(); + /// std::istream istrm(buf.get()); + /// // Read from istrm... + /// @endcode + /// The buffer must persist as long as the stream is open. + boost::shared_ptr createBuffer() const; + + typedef boost::function Notifier; + /// @brief Register a function that will be called with this file's name + /// when the file is unmapped. + void setNotifier(const Notifier&); + /// Deregister the notifier. + void clearNotifier(); + +private: + friend class File; + + explicit MappedFile(const std::string& filename, bool autoDelete = false); + + MappedFile(const MappedFile&); // not copyable + MappedFile& operator=(const MappedFile&); // not copyable + + class Impl; + boost::scoped_ptr mImpl; +}; // class MappedFile + + +//////////////////////////////////////// + + +/// Return a string (possibly empty) describing the given system error code. +std::string getErrorString(int errorNum); + + +/// Return a string (possibly empty) describing the most recent system error. +std::string getErrorString(); + + +//////////////////////////////////////// + + +/// @brief Return the file format version number associated with the given input stream. +/// @sa File::setFormatVersion() +OPENVDB_API uint32_t getFormatVersion(std::ios_base&); + +/// @brief Return the (major, minor) library version number associated with the given input stream. +/// @sa File::setLibraryVersion() +OPENVDB_API VersionId getLibraryVersion(std::ios_base&); + +/// @brief Return a string of the form "./", giving the library +/// and file format version numbers associated with the given input stream. +OPENVDB_API std::string getVersion(std::ios_base&); + +/// Associate the current file format and library version numbers with the given input stream. +OPENVDB_API void setCurrentVersion(std::istream&); + +/// @brief Associate specific file format and library version numbers with the given stream. +/// @details This is typically called immediately after reading a header that contains +/// the version numbers. Data read subsequently can then be interpreted appropriately. +OPENVDB_API void setVersion(std::ios_base&, const VersionId& libraryVersion, uint32_t fileVersion); + +/// @brief Return a bitwise OR of compression option flags (COMPRESS_ZIP, +/// COMPRESS_ACTIVE_MASK, etc.) specifying whether and how input data is compressed +/// or output data should be compressed. +OPENVDB_API uint32_t getDataCompression(std::ios_base&); +/// @brief Associate with the given stream a bitwise OR of compression option flags +/// (COMPRESS_ZIP, COMPRESS_ACTIVE_MASK, etc.) specifying whether and how input data +/// is compressed or output data should be compressed. +OPENVDB_API void setDataCompression(std::ios_base&, uint32_t compressionFlags); + +/// @brief Return the class (GRID_LEVEL_SET, GRID_UNKNOWN, etc.) of the grid +/// currently being read from or written to the given stream. +OPENVDB_API uint32_t getGridClass(std::ios_base&); +/// @brief Associate with the given stream the class (GRID_LEVEL_SET, GRID_UNKNOWN, etc.) +/// of the grid currently being read or written. +OPENVDB_API void setGridClass(std::ios_base&, uint32_t); + +/// @brief Return true if floating-point values should be quantized to 16 bits when writing +/// to the given stream or promoted back from 16-bit to full precision when reading from it. +OPENVDB_API bool getHalfFloat(std::ios_base&); +/// @brief Specify whether floating-point values should be quantized to 16 bits when writing +/// to the given stream or promoted back from 16-bit to full precision when reading from it. +OPENVDB_API void setHalfFloat(std::ios_base&, bool); + +/// @brief Return a pointer to the background value of the grid +/// currently being read from or written to the given stream. +OPENVDB_API const void* getGridBackgroundValuePtr(std::ios_base&); +/// @brief Specify (a pointer to) the background value of the grid +/// currently being read from or written to the given stream. +/// @note The pointer must remain valid until the entire grid has been read or written. +OPENVDB_API void setGridBackgroundValuePtr(std::ios_base&, const void* background); + +/// @brief Return @c true if grid statistics (active voxel count and bounding box, etc.) +/// should be computed and stored as grid metadata when writing to the given stream. +OPENVDB_API bool getWriteGridStatsMetadata(std::ios_base&); +/// @brief Specify whether to compute grid statistics (active voxel count and bounding box, etc.) +/// and store them as grid metadata when writing to the given stream. +OPENVDB_API void setWriteGridStatsMetadata(std::ios_base&, bool writeGridStats); + +/// @brief Return a shared pointer to the memory-mapped file with which the given stream +/// is associated, or a null pointer if the stream is not associated with a memory-mapped file. +OPENVDB_API boost::shared_ptr getMappedFilePtr(std::ios_base&); +/// @brief Associate the given stream with (a shared pointer to) a memory-mapped file. +/// @note The shared pointer object (not just the io::MappedFile object to which it points) +/// must remain valid until the file is closed. +OPENVDB_API void setMappedFilePtr(std::ios_base&, boost::shared_ptr&); + +/// @brief Return a shared pointer to an object that stores metadata (file format, +/// compression scheme, etc.) for use when reading from or writing to the given stream. +OPENVDB_API boost::shared_ptr getStreamMetadataPtr(std::ios_base&); +/// @brief Associate the given stream with (a shared pointer to) an object that stores +/// metadata (file format, compression scheme, etc.) for use when reading from +/// or writing to the stream. +/// @details If @a transfer is true, copy metadata from the object directly to the stream +/// (for backward compatibility with older versions of the library). +/// @note The shared pointer object (not just the io::StreamMetadata object to which it points) +/// must remain valid until the file is closed. +OPENVDB_API void setStreamMetadataPtr(std::ios_base&, + boost::shared_ptr&, bool transfer = true); +/// @brief Dissociate the given stream from its metadata object (if it has one) +/// and return a shared pointer to the object. +OPENVDB_API boost::shared_ptr clearStreamMetadataPtr(std::ios_base&); + +} // namespace io +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_IO_IO_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/math/BBox.h b/nuparu/include/openvdb/include/openvdb/math/BBox.h new file mode 100644 index 00000000..15cc8bd6 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/math/BBox.h @@ -0,0 +1,467 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_MATH_BBOX_HAS_BEEN_INCLUDED +#define OPENVDB_MATH_BBOX_HAS_BEEN_INCLUDED + +#include "Math.h" // for math::isApproxEqual() and math::Tolerance() +#include "Vec3.h" +#include +#include // for min/max +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace math { + +/// @brief Axis-aligned bounding box +template +class BBox +{ +public: + typedef Vec3T Vec3Type; + typedef Vec3T ValueType; + typedef Vec3T VectorType; + typedef typename Vec3Type::ValueType ElementType; + + /// @brief Default constructor creates an invalid BBox + BBox(); + + /// @brief Constructor based on a minimum and maximum point. + BBox(const Vec3T& xyzMin, const Vec3T& xyzMax); + + /// @brief Constructor based on a minimum and maximum point. + /// If sorted is false the points will be sorted by x,y,z component. + BBox(const Vec3T& xyzMin, const Vec3T& xyzMax, bool sorted); + + /// @brief Contruct a cubical BBox from a minimum coordinate and a + /// single edge length. + /// @note inclusive for integral ElementTypes + BBox(const Vec3T& xyzMin, const ElementType& length); + + /// @brief Constructor based on a raw array of six points. If + /// sorted is false the points will be sorted by x,y,z component. + explicit BBox(const ElementType* xyz, bool sorted = true); + + /// @brief Copy constructor + BBox(const BBox& other); + + /// @brief Sort the min/max by x,y,z component. + void sort(); + + /// @brief Return a const reference to the minimum point of the BBox + const Vec3T& min() const { return mMin; } + + /// @brief Return a const reference to the maximum point of the BBox + const Vec3T& max() const { return mMax; } + + /// @brief Return a non-const reference to the minimum point of the BBox + Vec3T& min() { return mMin; } + + /// @brief Return a non-const reference to the maximum point of the BBox + Vec3T& max() { return mMax; } + + /// @brief Return true if the two BBox'es are identical + bool operator==(const BBox& rhs) const; + + /// @brief Return true if the two BBox'es are not identical + bool operator!=(const BBox& rhs) const { return !(*this == rhs); } + + /// @brief Return true if the BBox is empty, i.e. has no + /// (positive) volume. + bool empty() const; + + /// @brief Return true if the BBox has a (positive) volume. + bool hasVolume() const { return !this->empty(); } + + /// @brief Return true if the BBox is valid, i.e. as a (positive) volume. + operator bool() const { return !this->empty(); } + + /// @brief Return true if the all components of mMin <= mMax, + /// i.e. the volume is not negative. + /// @note For floating point values a tolerance is used for this test. + bool isSorted() const; + + /// @brief Return the center point of the BBox + Vec3d getCenter() const; + + /// @brief Returns the extents of the BBox, i.e. the length per axis + /// for floating points values or number of grids per axis points + /// integral values. + /// @note inclusive for integral ElementTypes + Vec3T extents() const; + + /// @brief Return the volume spanned by this BBox. + ElementType volume() const { Vec3T e = this->extents(); return e[0] * e[1] * e[2]; } + + /// Return the index (0, 1 or 2) of the longest axis. + size_t maxExtent() const { return MaxIndex(mMax - mMin); } + + /// Return the index (0, 1 or 2) of the shortest axis. + size_t minExtent() const { return MinIndex(mMax - mMin); } + + /// Return @c true if point (x, y, z) is inside this bounding box. + bool isInside(const Vec3T& xyz) const; + + /// Return @c true if the given bounding box is inside this bounding box. + bool isInside(const BBox&) const; + + /// Return @c true if the given bounding box overlaps with this bounding box. + bool hasOverlap(const BBox&) const; + + /// Pad this bounding box. + void expand(ElementType padding); + + /// Expand this bounding box to enclose point (x, y, z). + void expand(const Vec3T& xyz); + + /// Union this bounding box with the given bounding box. + void expand(const BBox&); + // @brief Union this bbox with the cubical bbox defined from xyzMin and + // length + /// @note inclusive for integral ElementTypes + void expand(const Vec3T& xyzMin, const ElementType& length); + + /// Translate this bounding box by \f$(t_x, t_y, t_z)\f$. + void translate(const Vec3T& t); + + /// Apply a map to this bounding box + template + BBox applyMap(const MapType& map) const; + + /// Apply the inverse of a map to this bounding box + template + BBox applyInverseMap(const MapType& map) const; + + /// Unserialize this bounding box from the given stream. + void read(std::istream& is) { mMin.read(is); mMax.read(is); } + + /// Serialize this bounding box to the given stream. + void write(std::ostream& os) const { mMin.write(os); mMax.write(os); } + +private: + Vec3T mMin, mMax; +}; // class BBox + + +//////////////////////////////////////// + + +template +inline +BBox::BBox(): + mMin( std::numeric_limits::max()), + mMax(-std::numeric_limits::max()) +{ +} + +template +inline +BBox::BBox(const Vec3T& xyzMin, const Vec3T& xyzMax): + mMin(xyzMin), mMax(xyzMax) +{ +} + +template +inline +BBox::BBox(const Vec3T& xyzMin, const Vec3T& xyzMax, bool sorted): + mMin(xyzMin), mMax(xyzMax) +{ + if (!sorted) this->sort(); +} + +template +inline +BBox::BBox(const Vec3T& xyzMin, const ElementType& length): + mMin(xyzMin), mMax(xyzMin) +{ + // min and max are inclusive for integral ElementType + const ElementType size = boost::is_integral::value ? length-1 : length; + mMax[0] += size; + mMax[1] += size; + mMax[2] += size; +} + +template +inline +BBox::BBox(const ElementType* xyz, bool sorted): + mMin(xyz[0], xyz[1], xyz[2]), + mMax(xyz[3], xyz[4], xyz[5]) +{ + if (!sorted) this->sort(); +} + + +template +inline +BBox::BBox(const BBox& other): + mMin(other.mMin), mMax(other.mMax) +{ +} + + +//////////////////////////////////////// + + +template +inline bool +BBox::empty() const +{ + if (boost::is_integral::value) { + // min and max are inclusive for integral ElementType + return (mMin[0] > mMax[0] || mMin[1] > mMax[1] || mMin[2] > mMax[2]); + } + return mMin[0] >= mMax[0] || mMin[1] >= mMax[1] || mMin[2] >= mMax[2]; +} + + +template +inline bool +BBox::operator==(const BBox& rhs) const +{ + if (boost::is_integral::value) { + return mMin == rhs.min() && mMax == rhs.max(); + } else { + return math::isApproxEqual(mMin, rhs.min()) && math::isApproxEqual(mMax, rhs.max()); + } +} + + +template +inline void +BBox::sort() +{ + Vec3T tMin(mMin), tMax(mMax); + for (int i = 0; i < 3; ++i) { + mMin[i] = std::min(tMin[i], tMax[i]); + mMax[i] = std::max(tMin[i], tMax[i]); + } +} + + +template +inline bool +BBox::isSorted() const +{ + if (boost::is_integral::value) { + return (mMin[0] <= mMax[0] && mMin[1] <= mMax[1] && mMin[2] <= mMax[2]); + } else { + ElementType t = math::Tolerance::value(); + return (mMin[0] < (mMax[0] + t) && mMin[1] < (mMax[1] + t) && mMin[2] < (mMax[2] + t)); + } +} + + +template +inline Vec3d +BBox::getCenter() const +{ + return (Vec3d(mMin.asPointer()) + Vec3d(mMax.asPointer())) * 0.5; +} + + +template +inline Vec3T +BBox::extents() const +{ + if (boost::is_integral::value) { + return (mMax - mMin) + Vec3T(1, 1, 1); + } else { + return (mMax - mMin); + } +} + +//////////////////////////////////////// + + +template +inline bool +BBox::isInside(const Vec3T& xyz) const +{ + if (boost::is_integral::value) { + return xyz[0] >= mMin[0] && xyz[0] <= mMax[0] && + xyz[1] >= mMin[1] && xyz[1] <= mMax[1] && + xyz[2] >= mMin[2] && xyz[2] <= mMax[2]; + } else { + ElementType t = math::Tolerance::value(); + return xyz[0] > (mMin[0]-t) && xyz[0] < (mMax[0]+t) && + xyz[1] > (mMin[1]-t) && xyz[1] < (mMax[1]+t) && + xyz[2] > (mMin[2]-t) && xyz[2] < (mMax[2]+t); + } +} + + +template +inline bool +BBox::isInside(const BBox& b) const +{ + if (boost::is_integral::value) { + return b.min()[0] >= mMin[0] && b.max()[0] <= mMax[0] && + b.min()[1] >= mMin[1] && b.max()[1] <= mMax[1] && + b.min()[2] >= mMin[2] && b.max()[2] <= mMax[2]; + } else { + ElementType t = math::Tolerance::value(); + return (b.min()[0]-t) > mMin[0] && (b.max()[0]+t) < mMax[0] && + (b.min()[1]-t) > mMin[1] && (b.max()[1]+t) < mMax[1] && + (b.min()[2]-t) > mMin[2] && (b.max()[2]+t) < mMax[2]; + } +} + + +template +inline bool +BBox::hasOverlap(const BBox& b) const +{ + if (boost::is_integral::value) { + return mMax[0] >= b.min()[0] && mMin[0] <= b.max()[0] && + mMax[1] >= b.min()[1] && mMin[1] <= b.max()[1] && + mMax[2] >= b.min()[2] && mMin[2] <= b.max()[2]; + } else { + ElementType t = math::Tolerance::value(); + return mMax[0] > (b.min()[0]-t) && mMin[0] < (b.max()[0]+t) && + mMax[1] > (b.min()[1]-t) && mMin[1] < (b.max()[1]+t) && + mMax[2] > (b.min()[2]-t) && mMin[2] < (b.max()[2]+t); + } +} + + +//////////////////////////////////////// + + +template +inline void +BBox::expand(ElementType dx) +{ + dx = std::abs(dx); + for (int i = 0; i < 3; ++i) { + mMin[i] -= dx; + mMax[i] += dx; + } +} + + +template +inline void +BBox::expand(const Vec3T& xyz) +{ + for (int i = 0; i < 3; ++i) { + mMin[i] = std::min(mMin[i], xyz[i]); + mMax[i] = std::max(mMax[i], xyz[i]); + } +} + + +template +inline void +BBox::expand(const BBox& b) +{ + for (int i = 0; i < 3; ++i) { + mMin[i] = std::min(mMin[i], b.min()[i]); + mMax[i] = std::max(mMax[i], b.max()[i]); + } +} + +template +inline void +BBox::expand(const Vec3T& xyzMin, const ElementType& length) +{ + const ElementType size = boost::is_integral::value ? length-1 : length; + for (int i = 0; i < 3; ++i) { + mMin[i] = std::min(mMin[i], xyzMin[i]); + mMax[i] = std::max(mMax[i], xyzMin[i] + size); + } +} + + +template +inline void +BBox::translate(const Vec3T& dx) +{ + mMin += dx; + mMax += dx; +} + +template +template +inline BBox +BBox::applyMap(const MapType& map) const +{ + typedef Vec3 Vec3R; + BBox bbox; + bbox.expand(map.applyMap(Vec3R(mMin[0], mMin[1], mMin[2]))); + bbox.expand(map.applyMap(Vec3R(mMin[0], mMin[1], mMax[2]))); + bbox.expand(map.applyMap(Vec3R(mMin[0], mMax[1], mMin[2]))); + bbox.expand(map.applyMap(Vec3R(mMax[0], mMin[1], mMin[2]))); + bbox.expand(map.applyMap(Vec3R(mMax[0], mMax[1], mMin[2]))); + bbox.expand(map.applyMap(Vec3R(mMax[0], mMin[1], mMax[2]))); + bbox.expand(map.applyMap(Vec3R(mMin[0], mMax[1], mMax[2]))); + bbox.expand(map.applyMap(Vec3R(mMax[0], mMax[1], mMax[2]))); + return bbox; +} + +template +template +inline BBox +BBox::applyInverseMap(const MapType& map) const +{ + typedef Vec3 Vec3R; + BBox bbox; + bbox.expand(map.applyInverseMap(Vec3R(mMin[0], mMin[1], mMin[2]))); + bbox.expand(map.applyInverseMap(Vec3R(mMin[0], mMin[1], mMax[2]))); + bbox.expand(map.applyInverseMap(Vec3R(mMin[0], mMax[1], mMin[2]))); + bbox.expand(map.applyInverseMap(Vec3R(mMax[0], mMin[1], mMin[2]))); + bbox.expand(map.applyInverseMap(Vec3R(mMax[0], mMax[1], mMin[2]))); + bbox.expand(map.applyInverseMap(Vec3R(mMax[0], mMin[1], mMax[2]))); + bbox.expand(map.applyInverseMap(Vec3R(mMin[0], mMax[1], mMax[2]))); + bbox.expand(map.applyInverseMap(Vec3R(mMax[0], mMax[1], mMax[2]))); + return bbox; +} + +//////////////////////////////////////// + + +template +inline std::ostream& +operator<<(std::ostream& os, const BBox& b) +{ + os << b.min() << " -> " << b.max(); + return os; +} + +} // namespace math +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_MATH_BBOX_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/math/ConjGradient.h b/nuparu/include/openvdb/include/openvdb/math/ConjGradient.h new file mode 100644 index 00000000..6e752fef --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/math/ConjGradient.h @@ -0,0 +1,1841 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +/// @file ConjGradient.h +/// @authors D.J. Hill, Peter Cucka +/// @brief Preconditioned conjugate gradient solver (solves @e Ax = @e b using +/// the conjugate gradient method with one of a selection of preconditioners) + +#ifndef OPENVDB_MATH_CONJGRADIENT_HAS_BEEN_INCLUDED +#define OPENVDB_MATH_CONJGRADIENT_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include "Math.h" // for Abs(), isZero(), Max(), Sqrt() +#include +#include +#include +#include +#include // for std::lower_bound() +#include +#include // for std::isfinite() +#include +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace math { +namespace pcg { + +typedef Index32 SizeType; + +typedef tbb::blocked_range SizeRange; + +template class Vector; + +template class SparseStencilMatrix; + +template class Preconditioner; +template class JacobiPreconditioner; +template class IncompleteCholeskyPreconditioner; + +/// Information about the state of a conjugate gradient solution +struct State { + bool success; + int iterations; + double relativeError; + double absoluteError; +}; + + +/// Return default termination conditions for a conjugate gradient solver. +template +inline State +terminationDefaults() +{ + State s; + s.success = false; + s.iterations = 50; + s.relativeError = 1.0e-6; + s.absoluteError = std::numeric_limits::epsilon() * 100.0; + return s; +} + + +//////////////////////////////////////// + + +/// @brief Solve @e Ax = @e b via the preconditioned conjugate gradient method. +/// +/// @param A a symmetric, positive-definite, @e N x @e N matrix +/// @param b a vector of size @e N +/// @param x a vector of size @e N +/// @param preconditioner a Preconditioner matrix +/// @param termination termination conditions given as a State object with the following fields: +///
+///
success +///
ignored +///
iterations +///
the maximum number of iterations, with or without convergence +///
relativeError +///
the relative error ||bA@f$\hat{x}@f$|| / ||b|| +/// that denotes convergence +///
absoluteError +///
the absolute error ||bA@f$\hat{x}@f$|| that denotes convergence +/// +/// @throw ArithmeticError if either @a x or @a b is not of the appropriate size. +template +inline State +solve( + const PositiveDefMatrix& A, + const Vector& b, + Vector& x, + Preconditioner& preconditioner, + const State& termination = terminationDefaults()); + + +/// @brief Solve @e Ax = @e b via the preconditioned conjugate gradient method. +/// +/// @param A a symmetric, positive-definite, @e N x @e N matrix +/// @param b a vector of size @e N +/// @param x a vector of size @e N +/// @param preconditioner a Preconditioner matrix +/// @param termination termination conditions given as a State object with the following fields: +///
+///
success +///
ignored +///
iterations +///
the maximum number of iterations, with or without convergence +///
relativeError +///
the relative error ||bA@f$\hat{x}@f$|| / ||b|| +/// that denotes convergence +///
absoluteError +///
the absolute error ||bA@f$\hat{x}@f$|| that denotes convergence +/// @param interrupter an object adhering to the util::NullInterrupter interface +/// with which computation can be interrupted +/// +/// @throw ArithmeticError if either @a x or @a b is not of the appropriate size. +/// @throw RuntimeError if the computation is interrupted. +template +inline State +solve( + const PositiveDefMatrix& A, + const Vector& b, + Vector& x, + Preconditioner& preconditioner, + Interrupter& interrupter, + const State& termination = terminationDefaults()); + + +//////////////////////////////////////// + + +/// Lightweight, variable-length vector +template +class Vector +{ +public: + typedef T ValueType; + typedef boost::shared_ptr Ptr; + + /// Construct an empty vector. + Vector(): mData(NULL), mSize(0) {} + /// Construct a vector of @a n elements, with uninitialized values. + Vector(SizeType n): mData(new T[n]), mSize(n) {} + /// Construct a vector of @a n elements and initialize each element to the given value. + Vector(SizeType n, const ValueType& val): mData(new T[n]), mSize(n) { this->fill(val); } + + ~Vector() { mSize = 0; delete[] mData; mData = NULL; } + + /// Deep copy the given vector. + Vector(const Vector&); + /// Deep copy the given vector. + Vector& operator=(const Vector&); + + /// Return the number of elements in this vector. + SizeType size() const { return mSize; } + /// Return @c true if this vector has no elements. + bool empty() const { return (mSize == 0); } + + /// @brief Reset this vector to have @a n elements, with uninitialized values. + /// @warning All of this vector's existing values will be lost. + void resize(SizeType n); + + /// Swap internal storage with another vector, which need not be the same size. + void swap(Vector& other) { std::swap(mData, other.mData); std::swap(mSize, other.mSize); } + + /// Set all elements of this vector to @a value. + void fill(const ValueType& value); + + //@{ + /// @brief Multiply each element of this vector by @a s. + template void scale(const Scalar& s); + template Vector& operator*=(const Scalar& s) { this->scale(s); return *this; } + //@} + + /// Return the dot product of this vector with the given vector, which must be the same size. + ValueType dot(const Vector&) const; + + /// Return the infinity norm of this vector. + ValueType infNorm() const; + /// Return the L2 norm of this vector. + ValueType l2Norm() const { return Sqrt(this->dot(*this)); } + + /// Return @c true if every element of this vector has a finite value. + bool isFinite() const; + + /// @brief Return @c true if this vector is equivalent to the given vector + /// to within the specified tolerance. + template + bool eq(const Vector& other, + ValueType eps = Tolerance::value()) const; + + /// Return a string representation of this vector. + std::string str() const; + + //@{ + /// @brief Return the value of this vector's ith element. + inline T& at(SizeType i) { return mData[i]; } + inline const T& at(SizeType i) const { return mData[i]; } + inline T& operator[](SizeType i) { return this->at(i); } + inline const T& operator[](SizeType i) const { return this->at(i); } + //@} + + //@{ + /// @brief Return a pointer to this vector's elements. + inline T* data() { return mData; } + inline const T* data() const { return mData; } + inline const T* constData() const { return mData; } + //@} + +private: + // Functor for use with tbb::parallel_for() + template struct ScaleOp; + struct DeterministicDotProductOp; + // Functors for use with tbb::parallel_reduce() + template struct EqOp; + struct InfNormOp; + struct IsFiniteOp; + + T* mData; + SizeType mSize; +}; + +typedef Vector VectorS; +typedef Vector VectorD; +//typedef Vector LinearVector; + + +//////////////////////////////////////// + + +/// @brief Sparse, square matrix representing a 3D stencil operator of size @a STENCIL_SIZE +/// @details The implementation is a variation on compressed row storage (CRS). +template +class SparseStencilMatrix +{ +public: + typedef ValueType_ ValueType; + typedef Vector VectorType; + typedef boost::shared_ptr Ptr; + + class ConstValueIter; + class ConstRow; + class RowEditor; + + static const ValueType sZeroValue; + + /// Construct an @a n x @a n matrix with at most @a STENCIL_SIZE nonzero elements per row. + SparseStencilMatrix(SizeType n); + + /// Deep copy the given matrix. + SparseStencilMatrix(const SparseStencilMatrix&); + + //@{ + /// Return the number of rows in this matrix. + SizeType numRows() const { return mNumRows; } + SizeType size() const { return mNumRows; } + //@} + + /// @brief Set the value at the given coordinates. + /// @warning It is not safe to set values in the same row simultaneously + /// from multiple threads. + void setValue(SizeType row, SizeType col, const ValueType&); + + //@{ + /// @brief Return the value at the given coordinates. + /// @warning It is not safe to get values from a row while another thread + /// is setting values in that row. + const ValueType& getValue(SizeType row, SizeType col) const; + const ValueType& operator()(SizeType row, SizeType col) const; + //@} + + /// Return a read-only view onto the given row of this matrix. + ConstRow getConstRow(SizeType row) const; + + /// Return a read/write view onto the given row of this matrix. + RowEditor getRowEditor(SizeType row); + + //@{ + /// @brief Multiply all elements in the matrix by @a s; + template void scale(const Scalar& s); + template + SparseStencilMatrix& operator*=(const Scalar& s) { this->scale(s); return *this; } + //@} + + /// @brief Multiply this matrix by @a inVec and return the result in @a resultVec. + /// @throw ArithmeticError if either @a inVec or @a resultVec is not of size @e N, + /// where @e N x @e N is the size of this matrix. + template + void vectorMultiply(const Vector& inVec, Vector& resultVec) const; + + /// @brief Multiply this matrix by the vector represented by the array @a inVec + /// and return the result in @a resultVec. + /// @warning Both @a inVec and @a resultVec must have at least @e N elements, + /// where @e N x @e N is the size of this matrix. + template + void vectorMultiply(const VecValueType* inVec, VecValueType* resultVec) const; + + /// @brief Return @c true if this matrix is equivalent to the given matrix + /// to within the specified tolerance. + template + bool eq(const SparseStencilMatrix& other, + ValueType eps = Tolerance::value()) const; + + /// Return @c true if every element of this matrix has a finite value. + bool isFinite() const; + + /// Return a string representation of this matrix. + std::string str() const; + +private: + struct RowData { + RowData(ValueType* v, SizeType* c, SizeType& s): mVals(v), mCols(c), mSize(s) {} + ValueType* mVals; SizeType* mCols; SizeType& mSize; + }; + + struct ConstRowData { + ConstRowData(const ValueType* v, const SizeType* c, const SizeType& s): + mVals(v), mCols(c), mSize(s) {} + const ValueType* mVals; const SizeType* mCols; const SizeType& mSize; + }; + + /// Base class for row accessors + template + class RowBase + { + public: + typedef DataType_ DataType; + + static SizeType capacity() { return STENCIL_SIZE; } + + RowBase(const DataType& data): mData(data) {} + + bool empty() const { return (mData.mSize == 0); } + const SizeType& size() const { return mData.mSize; } + + const ValueType& getValue(SizeType columnIdx, bool& active) const; + const ValueType& getValue(SizeType columnIdx) const; + + /// Return an iterator over the stored values in this row. + ConstValueIter cbegin() const; + + /// @brief Return @c true if this row is equivalent to the given row + /// to within the specified tolerance. + template + bool eq(const RowBase& other, + ValueType eps = Tolerance::value()) const; + + /// @brief Return the dot product of this row with the first + /// @a vecSize elements of @a inVec. + /// @warning @a inVec must have at least @a vecSize elements. + template + VecValueType dot(const VecValueType* inVec, SizeType vecSize) const; + + /// Return the dot product of this row with the given vector. + template + VecValueType dot(const Vector& inVec) const; + + /// Return a string representation of this row. + std::string str() const; + + protected: + friend class ConstValueIter; + + const ValueType& value(SizeType i) const { return mData.mVals[i]; } + SizeType column(SizeType i) const { return mData.mCols[i]; } + + /// @brief Return the array index of the first column index that is + /// equal to or greater than the given column index. + /// @note If @a columnIdx is larger than any existing column index, + /// the return value will point beyond the end of the array. + SizeType find(SizeType columnIdx) const; + + DataType mData; + }; + + typedef RowBase ConstRowBase; + +public: + /// Iterator over the stored values in a row of this matrix + class ConstValueIter + { + public: + const ValueType& operator*() const + { + if (mData.mSize == 0) return SparseStencilMatrix::sZeroValue; + return mData.mVals[mCursor]; + } + + SizeType column() const { return mData.mCols[mCursor]; } + + void increment() { mCursor++; } + ConstValueIter& operator++() { increment(); return *this; } + operator bool() const { return (mCursor < mData.mSize); } + + void reset() { mCursor = 0; } + + private: + friend class SparseStencilMatrix; + ConstValueIter(const RowData& d): mData(d.mVals, d.mCols, d.mSize), mCursor(0) {} + ConstValueIter(const ConstRowData& d): mData(d), mCursor(0) {} + + const ConstRowData mData; + SizeType mCursor; + }; + + + /// Read-only accessor to a row of this matrix + class ConstRow: public ConstRowBase + { + public: + ConstRow(const ValueType* valueHead, const SizeType* columnHead, const SizeType& rowSize); + }; // class ConstRow + + + /// Read/write accessor to a row of this matrix + class RowEditor: public RowBase<> + { + public: + RowEditor(ValueType* valueHead, SizeType* columnHead, SizeType& rowSize, SizeType colSize); + + /// Set the number of entries in this row to zero. + void clear(); + + /// @brief Set the value of the entry in the specified column. + /// @return the current number of entries stored in this row. + SizeType setValue(SizeType column, const ValueType& value); + + //@{ + /// @brief Scale all of the entries in this row. + template void scale(const Scalar&); + template + RowEditor& operator*=(const Scalar& s) { this->scale(s); return *this; } + //@} + + private: + const SizeType mNumColumns; // used only for bounds checking + }; // class RowEditor + +private: + // Functors for use with tbb::parallel_for() + struct MatrixCopyOp; + template struct VecMultOp; + template struct RowScaleOp; + + // Functors for use with tbb::parallel_reduce() + struct IsFiniteOp; + template struct EqOp; + + const SizeType mNumRows; + boost::scoped_array mValueArray; + boost::scoped_array mColumnIdxArray; + boost::scoped_array mRowSizeArray; +}; // class SparseStencilMatrix + + +//////////////////////////////////////// + + +/// Base class for conjugate gradient preconditioners +template +class Preconditioner +{ +public: + typedef T ValueType; + typedef boost::shared_ptr Ptr; + + template Preconditioner(const SparseStencilMatrix&) {} + virtual ~Preconditioner() {} + + virtual bool isValid() const { return true; } + + /// @brief Apply this preconditioner to a residue vector: + /// @e z = M−1r + /// @param r residue vector + /// @param[out] z preconditioned residue vector + virtual void apply(const Vector& r, Vector& z) = 0; +}; + + +//////////////////////////////////////// + + +namespace internal { + +// Functor for use with tbb::parallel_for() to copy data from one array to another +template +struct CopyOp +{ + CopyOp(const T* from_, T* to_): from(from_), to(to_) {} + + void operator()(const SizeRange& range) const { + for (SizeType n = range.begin(), N = range.end(); n < N; ++n) to[n] = from[n]; + } + + const T* from; + T* to; +}; + + +// Functor for use with tbb::parallel_for() to fill an array with a constant value +template +struct FillOp +{ + FillOp(T* data_, const T& val_): data(data_), val(val_) {} + + void operator()(const SizeRange& range) const { + for (SizeType n = range.begin(), N = range.end(); n < N; ++n) data[n] = val; + } + + T* data; + const T val; +}; + + +// Functor for use with tbb::parallel_for() that computes a * x + y +template +struct LinearOp +{ + LinearOp(const T& a_, const T* x_, const T* y_, T* out_): a(a_), x(x_), y(y_), out(out_) {} + + void operator()(const SizeRange& range) const { + if (isExactlyEqual(a, T(1))) { + for (SizeType n = range.begin(), N = range.end(); n < N; ++n) out[n] = x[n] + y[n]; + } else if (isExactlyEqual(a, T(-1))) { + for (SizeType n = range.begin(), N = range.end(); n < N; ++n) out[n] = -x[n] + y[n]; + } else { + for (SizeType n = range.begin(), N = range.end(); n < N; ++n) out[n] = a * x[n] + y[n]; + } + } + + const T a, *x, *y; + T* out; +}; + +} // namespace internal + + +//////////////////////////////////////// + + +inline std::ostream& +operator<<(std::ostream& os, const State& state) +{ + os << (state.success ? "succeeded with " : "") + << "rel. err. " << state.relativeError << ", abs. err. " << state.absoluteError + << " after " << state.iterations << " iteration" << (state.iterations == 1 ? "" : "s"); + return os; +} + + +//////////////////////////////////////// + + +template +inline +Vector::Vector(const Vector& other): mData(new T[other.mSize]), mSize(other.mSize) +{ + tbb::parallel_for(SizeRange(0, mSize), + internal::CopyOp(/*from=*/other.mData, /*to=*/mData)); +} + + +template +inline +Vector& Vector::operator=(const Vector& other) +{ + // Update the internal storage to the correct size + + if (mSize != other.mSize) { + mSize = other.mSize; + delete[] mData; + mData = new T[mSize]; + } + + // Deep copy the data + tbb::parallel_for(SizeRange(0, mSize), + internal::CopyOp(/*from=*/other.mData, /*to=*/mData)); + + return *this; +} + + +template +inline void +Vector::resize(SizeType n) +{ + if (n != mSize) { + if (mData) delete[] mData; + mData = new T[n]; + mSize = n; + } +} + + +template +inline void +Vector::fill(const ValueType& value) +{ + tbb::parallel_for(SizeRange(0, mSize), internal::FillOp(mData, value)); +} + + +template +template +struct Vector::ScaleOp +{ + ScaleOp(T* data_, const Scalar& s_): data(data_), s(s_) {} + + void operator()(const SizeRange& range) const { + for (SizeType n = range.begin(), N = range.end(); n < N; ++n) data[n] *= s; + } + + T* data; + const Scalar s; +}; + + +template +template +inline void +Vector::scale(const Scalar& s) +{ + tbb::parallel_for(SizeRange(0, mSize), ScaleOp(mData, s)); +} + + +template +struct Vector::DeterministicDotProductOp +{ + DeterministicDotProductOp(const T* a_, const T* b_, + const SizeType binCount_, const SizeType arraySize_, T* reducetmp_): + a(a_), b(b_), binCount(binCount_), arraySize(arraySize_), reducetmp(reducetmp_) {} + + void operator()(const SizeRange& range) const + { + + const SizeType binSize = arraySize / binCount; + + // Iterate over bins (array segments) + for (SizeType n = range.begin(), N = range.end(); n < N; ++n) { + const SizeType begin = n * binSize; + const SizeType end = (n == binCount-1) ? arraySize : begin + binSize; + + // Compute the partial sum for this array segment + T sum = zeroVal(); + for (SizeType i = begin; i < end; ++i) { + + sum += a[i] * b[i]; + } + // Store the partial sum + reducetmp[n] = sum; + } + } + + + const T* a; + const T* b; + const SizeType binCount; + const SizeType arraySize; + T* reducetmp; +}; + +template +inline T +Vector::dot(const Vector& other) const +{ + assert(this->size() == other.size()); + + const T* aData = this->data(); + const T* bData = other.data(); + + SizeType arraySize = this->size(); + + T result = zeroVal(); + + if (arraySize < 1024) { + + // Compute the dot product in serial for small arrays + + for (SizeType n = 0; n < arraySize; ++n) { + result += aData[n] * bData[n]; + } + + } else { + + // Compute the dot product by segmenting the arrays into + // a predetermined number of sub arrays in parallel and + // accumulate the finial result in series. + + const SizeType binCount = 100; + T partialSums[100]; + + tbb::parallel_for(SizeRange(0, binCount), + DeterministicDotProductOp(aData, bData, binCount, arraySize, partialSums)); + + for (SizeType n = 0; n < binCount; ++n) { + result += partialSums[n]; + } + } + + return result; +} + + +template +struct Vector::InfNormOp +{ + InfNormOp(const T* data_): data(data_) {} + + T operator()(const SizeRange& range, T maxValue) const + { + for (SizeType n = range.begin(), N = range.end(); n < N; ++n) { + maxValue = Max(maxValue, Abs(data[n])); + } + return maxValue; + } + + static T join(T max1, T max2) { return Max(max1, max2); } + + const T* data; +}; + + +template +inline T +Vector::infNorm() const +{ + // Parallelize over the elements of this vector. + T result = tbb::parallel_reduce(SizeRange(0, this->size()), /*seed=*/zeroVal(), + InfNormOp(this->data()), InfNormOp::join); + return result; +} + + +template +struct Vector::IsFiniteOp +{ + IsFiniteOp(const T* data_): data(data_) {} + + bool operator()(const SizeRange& range, bool finite) const + { + if (finite) { + for (SizeType n = range.begin(), N = range.end(); n < N; ++n) { + if (!std::isfinite(data[n])) return false; + } + } + return finite; + } + + static bool join(bool finite1, bool finite2) { return (finite1 && finite2); } + + const T* data; +}; + + +template +inline bool +Vector::isFinite() const +{ + // Parallelize over the elements of this vector. + bool finite = tbb::parallel_reduce(SizeRange(0, this->size()), /*seed=*/true, + IsFiniteOp(this->data()), IsFiniteOp::join); + return finite; +} + + +template +template +struct Vector::EqOp +{ + EqOp(const T* a_, const OtherValueType* b_, T e): a(a_), b(b_), eps(e) {} + + bool operator()(const SizeRange& range, bool equal) const + { + if (equal) { + for (SizeType n = range.begin(), N = range.end(); n < N; ++n) { + if (!isApproxEqual(a[n], b[n], eps)) return false; + } + } + return equal; + } + + static bool join(bool eq1, bool eq2) { return (eq1 && eq2); } + + const T* a; + const OtherValueType* b; + const T eps; +}; + + +template +template +inline bool +Vector::eq(const Vector& other, ValueType eps) const +{ + if (this->size() != other.size()) return false; + bool equal = tbb::parallel_reduce(SizeRange(0, this->size()), /*seed=*/true, + EqOp(this->data(), other.data(), eps), EqOp::join); + return equal; +} + + +template +inline std::string +Vector::str() const +{ + std::ostringstream ostr; + ostr << "["; + std::string sep; + for (SizeType n = 0, N = this->size(); n < N; ++n) { + ostr << sep << (*this)[n]; + sep = ", "; + } + ostr << "]"; + return ostr.str(); +} + + +//////////////////////////////////////// + + +template +const ValueType SparseStencilMatrix::sZeroValue = zeroVal(); + + +template +inline +SparseStencilMatrix::SparseStencilMatrix(SizeType numRows) + : mNumRows(numRows) + , mValueArray(new ValueType[mNumRows * STENCIL_SIZE]) + , mColumnIdxArray(new SizeType[mNumRows * STENCIL_SIZE]) + , mRowSizeArray(new SizeType[mNumRows]) +{ + // Initialize the matrix to a null state by setting the size of each row to zero. + tbb::parallel_for(SizeRange(0, mNumRows), + internal::FillOp(mRowSizeArray.get(), /*value=*/0)); +} + + +template +struct SparseStencilMatrix::MatrixCopyOp +{ + MatrixCopyOp(const SparseStencilMatrix& from_, SparseStencilMatrix& to_): + from(&from_), to(&to_) {} + + void operator()(const SizeRange& range) const + { + const ValueType* fromVal = from->mValueArray.get(); + const SizeType* fromCol = from->mColumnIdxArray.get(); + ValueType* toVal = to->mValueArray.get(); + SizeType* toCol = to->mColumnIdxArray.get(); + for (SizeType n = range.begin(), N = range.end(); n < N; ++n) { + toVal[n] = fromVal[n]; + toCol[n] = fromCol[n]; + } + } + + const SparseStencilMatrix* from; SparseStencilMatrix* to; +}; + + +template +inline +SparseStencilMatrix::SparseStencilMatrix(const SparseStencilMatrix& other) + : mNumRows(other.mNumRows) + , mValueArray(new ValueType[mNumRows * STENCIL_SIZE]) + , mColumnIdxArray(new SizeType[mNumRows * STENCIL_SIZE]) + , mRowSizeArray(new SizeType[mNumRows]) +{ + SizeType size = mNumRows * STENCIL_SIZE; + + // Copy the value and column index arrays from the other matrix to this matrix. + tbb::parallel_for(SizeRange(0, size), MatrixCopyOp(/*from=*/other, /*to=*/*this)); + + // Copy the row size array from the other matrix to this matrix. + tbb::parallel_for(SizeRange(0, mNumRows), + internal::CopyOp(/*from=*/other.mRowSizeArray.get(), /*to=*/mRowSizeArray.get())); +} + + +template +inline void +SparseStencilMatrix::setValue(SizeType row, SizeType col, + const ValueType& val) +{ + assert(row < mNumRows); + this->getRowEditor(row).setValue(col, val); +} + + +template +inline const ValueType& +SparseStencilMatrix::getValue(SizeType row, SizeType col) const +{ + assert(row < mNumRows); + return this->getConstRow(row).getValue(col); +} + + +template +inline const ValueType& +SparseStencilMatrix::operator()(SizeType row, SizeType col) const +{ + return this->getValue(row,col); +} + + +template +template +struct SparseStencilMatrix::RowScaleOp +{ + RowScaleOp(SparseStencilMatrix& m, const Scalar& s_): mat(&m), s(s_) {} + + void operator()(const SizeRange& range) const + { + for (SizeType n = range.begin(), N = range.end(); n < N; ++n) { + RowEditor row = mat->getRowEditor(n); + row.scale(s); + } + } + + SparseStencilMatrix* mat; + const Scalar s; +}; + + +template +template +inline void +SparseStencilMatrix::scale(const Scalar& s) +{ + // Parallelize over the rows in the matrix. + tbb::parallel_for(SizeRange(0, mNumRows), RowScaleOp(*this, s)); +} + + +template +template +struct SparseStencilMatrix::VecMultOp +{ + VecMultOp(const SparseStencilMatrix& m, const VecValueType* i, VecValueType* o): + mat(&m), in(i), out(o) {} + + void operator()(const SizeRange& range) const + { + for (SizeType n = range.begin(), N = range.end(); n < N; ++n) { + ConstRow row = mat->getConstRow(n); + out[n] = row.dot(in, mat->numRows()); + } + } + + const SparseStencilMatrix* mat; + const VecValueType* in; + VecValueType* out; +}; + + +template +template +inline void +SparseStencilMatrix::vectorMultiply( + const Vector& inVec, Vector& resultVec) const +{ + if (inVec.size() != mNumRows) { + OPENVDB_THROW(ArithmeticError, "matrix and input vector have incompatible sizes (" + << mNumRows << "x" << mNumRows << " vs. " << inVec.size() << ")"); + } + if (resultVec.size() != mNumRows) { + OPENVDB_THROW(ArithmeticError, "matrix and result vector have incompatible sizes (" + << mNumRows << "x" << mNumRows << " vs. " << resultVec.size() << ")"); + } + + vectorMultiply(inVec.data(), resultVec.data()); +} + + +template +template +inline void +SparseStencilMatrix::vectorMultiply( + const VecValueType* inVec, VecValueType* resultVec) const +{ + // Parallelize over the rows in the matrix. + tbb::parallel_for(SizeRange(0, mNumRows), + VecMultOp(*this, inVec, resultVec)); +} + + +template +template +struct SparseStencilMatrix::EqOp +{ + EqOp(const SparseStencilMatrix& a_, + const SparseStencilMatrix& b_, ValueType e): + a(&a_), b(&b_), eps(e) {} + + bool operator()(const SizeRange& range, bool equal) const + { + if (equal) { + for (SizeType n = range.begin(), N = range.end(); n < N; ++n) { + if (!a->getConstRow(n).eq(b->getConstRow(n), eps)) return false; + } + } + return equal; + } + + static bool join(bool eq1, bool eq2) { return (eq1 && eq2); } + + const SparseStencilMatrix* a; + const SparseStencilMatrix* b; + const ValueType eps; +}; + + +template +template +inline bool +SparseStencilMatrix::eq( + const SparseStencilMatrix& other, ValueType eps) const +{ + if (this->numRows() != other.numRows()) return false; + bool equal = tbb::parallel_reduce(SizeRange(0, this->numRows()), /*seed=*/true, + EqOp(*this, other, eps), EqOp::join); + return equal; +} + + +template +struct SparseStencilMatrix::IsFiniteOp +{ + IsFiniteOp(const SparseStencilMatrix& m): mat(&m) {} + + bool operator()(const SizeRange& range, bool finite) const + { + if (finite) { + for (SizeType n = range.begin(), N = range.end(); n < N; ++n) { + const ConstRow row = mat->getConstRow(n); + for (ConstValueIter it = row.cbegin(); it; ++it) { + if (!std::isfinite(*it)) return false; + } + } + } + return finite; + } + + static bool join(bool finite1, bool finite2) { return (finite1 && finite2); } + + const SparseStencilMatrix* mat; +}; + + +template +inline bool +SparseStencilMatrix::isFinite() const +{ + // Parallelize over the rows of this matrix. + bool finite = tbb::parallel_reduce(SizeRange(0, this->numRows()), /*seed=*/true, + IsFiniteOp(*this), IsFiniteOp::join); + return finite; +} + + +template +inline std::string +SparseStencilMatrix::str() const +{ + std::ostringstream ostr; + for (SizeType n = 0, N = this->size(); n < N; ++n) { + ostr << n << ": " << this->getConstRow(n).str() << "\n"; + } + return ostr.str(); +} + + +template +inline typename SparseStencilMatrix::RowEditor +SparseStencilMatrix::getRowEditor(SizeType i) +{ + assert(i < mNumRows); + const SizeType head = i * STENCIL_SIZE; + return RowEditor(&mValueArray[head], &mColumnIdxArray[head], mRowSizeArray[i], mNumRows); +} + + +template +inline typename SparseStencilMatrix::ConstRow +SparseStencilMatrix::getConstRow(SizeType i) const +{ + assert(i < mNumRows); + const SizeType head = i * STENCIL_SIZE; // index for this row into main storage + return ConstRow(&mValueArray[head], &mColumnIdxArray[head], mRowSizeArray[i]); +} + + +template +template +inline SizeType +SparseStencilMatrix::RowBase::find(SizeType columnIdx) const +{ + if (this->empty()) return mData.mSize; + + // Get a pointer to the first column index that is equal to or greater than the given index. + // (This assumes that the data is sorted by column.) + const SizeType* colPtr = std::lower_bound(mData.mCols, mData.mCols + mData.mSize, columnIdx); + // Return the offset of the pointer from the beginning of the array. + return static_cast(colPtr - mData.mCols); +} + + +template +template +inline const ValueType& +SparseStencilMatrix::RowBase::getValue( + SizeType columnIdx, bool& active) const +{ + active = false; + SizeType idx = this->find(columnIdx); + if (idx < this->size() && this->column(idx) == columnIdx) { + active = true; + return this->value(idx); + } + return SparseStencilMatrix::sZeroValue; +} + +template +template +inline const ValueType& +SparseStencilMatrix::RowBase::getValue(SizeType columnIdx) const +{ + SizeType idx = this->find(columnIdx); + if (idx < this->size() && this->column(idx) == columnIdx) { + return this->value(idx); + } + return SparseStencilMatrix::sZeroValue; +} + + +template +template +inline typename SparseStencilMatrix::ConstValueIter +SparseStencilMatrix::RowBase::cbegin() const +{ + return ConstValueIter(mData); +} + + +template +template +template +inline bool +SparseStencilMatrix::RowBase::eq( + const RowBase& other, ValueType eps) const +{ + if (this->size() != other.size()) return false; + for (ConstValueIter it = cbegin(), oit = other.cbegin(); it || oit; ++it, ++oit) { + if (it.column() != oit.column()) return false; + if (!isApproxEqual(*it, *oit, eps)) return false; + } + return true; +} + + +template +template +template +inline VecValueType +SparseStencilMatrix::RowBase::dot( + const VecValueType* inVec, SizeType vecSize) const +{ + VecValueType result = zeroVal(); + for (SizeType idx = 0, N = std::min(vecSize, this->size()); idx < N; ++idx) { + result += static_cast(this->value(idx) * inVec[this->column(idx)]); + } + return result; +} + +template +template +template +inline VecValueType +SparseStencilMatrix::RowBase::dot( + const Vector& inVec) const +{ + return dot(inVec.data(), inVec.size()); +} + + +template +template +inline std::string +SparseStencilMatrix::RowBase::str() const +{ + std::ostringstream ostr; + std::string sep; + for (SizeType n = 0, N = this->size(); n < N; ++n) { + ostr << sep << "(" << this->column(n) << ", " << this->value(n) << ")"; + sep = ", "; + } + return ostr.str(); +} + + +template +inline +SparseStencilMatrix::ConstRow::ConstRow( + const ValueType* valueHead, const SizeType* columnHead, const SizeType& rowSize): + ConstRowBase(ConstRowData(const_cast(valueHead), + const_cast(columnHead), const_cast(rowSize))) +{ +} + + +template +inline +SparseStencilMatrix::RowEditor::RowEditor( + ValueType* valueHead, SizeType* columnHead, SizeType& rowSize, SizeType colSize): + RowBase<>(RowData(valueHead, columnHead, rowSize)), mNumColumns(colSize) +{ +} + + +template +inline void +SparseStencilMatrix::RowEditor::clear() +{ + // Note: since mSize is a reference, this modifies the underlying matrix. + RowBase<>::mData.mSize = 0; +} + + +template +inline SizeType +SparseStencilMatrix::RowEditor::setValue( + SizeType column, const ValueType& value) +{ + assert(column < mNumColumns); + + RowData& data = RowBase<>::mData; + + // Get the offset of the first column index that is equal to or greater than + // the column to be modified. + SizeType offset = this->find(column); + + if (offset < data.mSize && data.mCols[offset] == column) { + // If the column already exists, just update its value. + data.mVals[offset] = value; + return data.mSize; + } + + // Check that it is safe to add a new column. + assert(data.mSize < this->capacity()); + + if (offset >= data.mSize) { + // The new column's index is larger than any existing index. Append the new column. + data.mVals[data.mSize] = value; + data.mCols[data.mSize] = column; + } else { + // Insert the new column at the computed offset after shifting subsequent columns. + for (SizeType i = data.mSize; i > offset; --i) { + data.mVals[i] = data.mVals[i - 1]; + data.mCols[i] = data.mCols[i - 1]; + } + data.mVals[offset] = value; + data.mCols[offset] = column; + } + ++data.mSize; + + return data.mSize; +} + + +template +template +inline void +SparseStencilMatrix::RowEditor::scale(const Scalar& s) +{ + for (int idx = 0, N = this->size(); idx < N; ++idx) { + RowBase<>::mData.mVals[idx] *= s; + } +} + + +//////////////////////////////////////// + + +/// Diagonal preconditioner +template +class JacobiPreconditioner: public Preconditioner +{ +private: + struct InitOp; + struct ApplyOp; + +public: + typedef typename MatrixType::ValueType ValueType; + typedef Preconditioner BaseType; + typedef Vector VectorType; + typedef boost::shared_ptr Ptr; + + JacobiPreconditioner(const MatrixType& A): BaseType(A), mDiag(A.numRows()) + { + // Initialize vector mDiag with the values from the matrix diagonal. + tbb::parallel_for(SizeRange(0, A.numRows()), InitOp(A, mDiag.data())); + } + + virtual ~JacobiPreconditioner() {} + + virtual void apply(const Vector& r, Vector& z) + { + const SizeType size = mDiag.size(); + + assert(r.size() == z.size()); + assert(r.size() == size); + + tbb::parallel_for(SizeRange(0, size), ApplyOp(mDiag.data(), r.data(), z.data())); + } + + /// Return @c true if all values along the diagonal are finite. + bool isFinite() const { return mDiag.isFinite(); } + +private: + // Functor for use with tbb::parallel_for() + struct InitOp + { + InitOp(const MatrixType& m, ValueType* v): mat(&m), vec(v) {} + void operator()(const SizeRange& range) const { + for (SizeType n = range.begin(), N = range.end(); n < N; ++n) { + const ValueType val = mat->getValue(n, n); + assert(!isApproxZero(val, ValueType(0.0001))); + vec[n] = static_cast(1.0 / val); + } + } + const MatrixType* mat; ValueType* vec; + }; + + // Functor for use with tbb::parallel_reduce() + struct ApplyOp + { + ApplyOp(const ValueType* x_, const ValueType* y_, ValueType* out_): + x(x_), y(y_), out(out_) {} + void operator()(const SizeRange& range) const { + for (SizeType n = range.begin(), N = range.end(); n < N; ++n) out[n] = x[n] * y[n]; + } + const ValueType *x, *y; ValueType* out; + }; + + // The Jacobi preconditioner is a diagonal matrix + VectorType mDiag; +}; // class JacobiPreconditioner + + +/// Preconditioner using incomplete Cholesky factorization +template +class IncompleteCholeskyPreconditioner: public Preconditioner +{ +private: + struct CopyToLowerOp; + struct TransposeOp; + +public: + typedef typename MatrixType::ValueType ValueType; + typedef Preconditioner BaseType; + typedef Vector VectorType; + typedef boost::shared_ptr Ptr; + typedef SparseStencilMatrix TriangularMatrix; + typedef typename TriangularMatrix::ConstRow TriangleConstRow; + typedef typename TriangularMatrix::RowEditor TriangleRowEditor; + + IncompleteCholeskyPreconditioner(const MatrixType& matrix) + : BaseType(matrix) + , mLowerTriangular(matrix.numRows()) + , mUpperTriangular(matrix.numRows()) + , mTempVec(matrix.numRows()) + { + // Size of matrix + const SizeType numRows = mLowerTriangular.numRows(); + + // Copy the upper triangular part to the lower triangular part. + tbb::parallel_for(SizeRange(0, numRows), CopyToLowerOp(matrix, mLowerTriangular)); + + // Build the Incomplete Cholesky Matrix + // + // Algorithm: + // + // for (k = 0; k < size; ++k) { + // A(k,k) = sqrt(A(k,k)); + // for (i = k +1, i < size; ++i) { + // if (A(i,k) == 0) continue; + // A(i,k) = A(i,k) / A(k,k); + // } + // for (j = k+1; j < size; ++j) { + // for (i = j; i < size; ++i) { + // if (A(i,j) == 0) continue; + // A(i,j) -= A(i,k)*A(j,k); + // } + // } + // } + + mPassedCompatibilityCondition = true; + + for (SizeType k = 0; k < numRows; ++k) { + + TriangleConstRow crow_k = mLowerTriangular.getConstRow(k); + ValueType diagonalValue = crow_k.getValue(k); + + // Test if the matrix build has failed. + if (diagonalValue < 1.e-5) { + mPassedCompatibilityCondition = false; + break; + } + + diagonalValue = Sqrt(diagonalValue); + + TriangleRowEditor row_k = mLowerTriangular.getRowEditor(k); + row_k.setValue(k, diagonalValue); + + // Exploit the fact that the matrix is symmetric. + typename MatrixType::ConstRow srcRow = matrix.getConstRow(k); + typename MatrixType::ConstValueIter citer = srcRow.cbegin(); + for ( ; citer; ++citer) { + SizeType ii = citer.column(); + if (ii < k+1) continue; // look above diagonal + + TriangleRowEditor row_ii = mLowerTriangular.getRowEditor(ii); + + row_ii.setValue(k, *citer / diagonalValue); + } + + // for (j = k+1; j < size; ++j) replaced by row iter below + citer.reset(); // k,j entries + for ( ; citer; ++citer) { + SizeType j = citer.column(); + if (j < k+1) continue; + + TriangleConstRow row_j = mLowerTriangular.getConstRow(j); + ValueType a_jk = row_j.getValue(k); // a_jk is non zero if a_kj is non zero + + // Entry (i,j) is non-zero if matrix(j,i) is nonzero + + typename MatrixType::ConstRow mask = matrix.getConstRow(j); + typename MatrixType::ConstValueIter maskIter = mask.cbegin(); + for ( ; maskIter; ++maskIter) { + SizeType i = maskIter.column(); + if (i < j) continue; + + TriangleConstRow crow_i = mLowerTriangular.getConstRow(i); + ValueType a_ij = crow_i.getValue(j); + ValueType a_ik = crow_i.getValue(k); + TriangleRowEditor row_i = mLowerTriangular.getRowEditor(i); + a_ij -= a_ik * a_jk; + + row_i.setValue(j, a_ij); + } + } + } + + // Build the transpose of the IC matrix: mUpperTriangular + tbb::parallel_for(SizeRange(0, numRows), + TransposeOp(matrix, mLowerTriangular, mUpperTriangular)); + } + + virtual ~IncompleteCholeskyPreconditioner() {} + + virtual bool isValid() const { return mPassedCompatibilityCondition; } + + virtual void apply(const Vector& rVec, Vector& zVec) + { + if (!mPassedCompatibilityCondition) { + OPENVDB_THROW(ArithmeticError, "invalid Cholesky decomposition"); + } + + // Solve mUpperTriangular * mLowerTriangular * rVec = zVec; + + SizeType size = mLowerTriangular.numRows(); + + zVec.fill(zeroVal()); + ValueType* zData = zVec.data(); + + if (size == 0) return; + + assert(rVec.size() == size); + assert(zVec.size() == size); + + // Allocate a temp vector + mTempVec.fill(zeroVal()); + ValueType* tmpData = mTempVec.data(); + const ValueType* rData = rVec.data(); + + // Solve mLowerTriangular * tmp = rVec; + for (SizeType i = 0; i < size; ++i) { + typename TriangularMatrix::ConstRow row = mLowerTriangular.getConstRow(i); + ValueType diagonal = row.getValue(i); + ValueType dot = row.dot(mTempVec); + tmpData[i] = (rData[i] - dot) / diagonal; + if (!std::isfinite(tmpData[i])) { + OPENVDB_LOG_DEBUG_RUNTIME("1 diagonal was " << diagonal); + OPENVDB_LOG_DEBUG_RUNTIME("1a diagonal " << row.getValue(i)); + } + } + + // Solve mUpperTriangular * zVec = tmp; + for (SizeType ii = 0; ii < size; ++ii) { + SizeType i = size - 1 - ii; + typename TriangularMatrix::ConstRow row = mUpperTriangular.getConstRow(i); + ValueType diagonal = row.getValue(i); + ValueType dot = row.dot(zVec); + zData[i] = (tmpData[i] - dot) / diagonal; + if (!std::isfinite(zData[i])) { + OPENVDB_LOG_DEBUG_RUNTIME("2 diagonal was " << diagonal); + } + } + } + + const TriangularMatrix& lowerMatrix() const { return mLowerTriangular; } + const TriangularMatrix& upperMatrix() const { return mUpperTriangular; } + +private: + // Functor for use with tbb::parallel_for() + struct CopyToLowerOp + { + CopyToLowerOp(const MatrixType& m, TriangularMatrix& l): mat(&m), lower(&l) {} + void operator()(const SizeRange& range) const { + for (SizeType n = range.begin(), N = range.end(); n < N; ++n) { + typename TriangularMatrix::RowEditor outRow = lower->getRowEditor(n); + outRow.clear(); + typename MatrixType::ConstRow inRow = mat->getConstRow(n); + for (typename MatrixType::ConstValueIter it = inRow.cbegin(); it; ++it) { + if (it.column() > n) continue; // skip above diagonal + outRow.setValue(it.column(), *it); + } + } + } + const MatrixType* mat; TriangularMatrix* lower; + }; + + // Functor for use with tbb::parallel_for() + struct TransposeOp + { + TransposeOp(const MatrixType& m, const TriangularMatrix& l, TriangularMatrix& u): + mat(&m), lower(&l), upper(&u) {} + void operator()(const SizeRange& range) const { + for (SizeType n = range.begin(), N = range.end(); n < N; ++n) { + typename TriangularMatrix::RowEditor outRow = upper->getRowEditor(n); + outRow.clear(); + // Use the fact that matrix is symmetric. + typename MatrixType::ConstRow inRow = mat->getConstRow(n); + for (typename MatrixType::ConstValueIter it = inRow.cbegin(); it; ++it) { + const SizeType column = it.column(); + if (column < n) continue; // only set upper triangle + outRow.setValue(column, lower->getValue(column, n)); + } + } + } + const MatrixType* mat; const TriangularMatrix* lower; TriangularMatrix* upper; + }; + + TriangularMatrix mLowerTriangular; + TriangularMatrix mUpperTriangular; + Vector mTempVec; + bool mPassedCompatibilityCondition; +}; // class IncompleteCholeskyPreconditioner + + +//////////////////////////////////////// + + +namespace internal { + +/// Compute @e ax + @e y. +template +inline void +axpy(const T& a, const T* xVec, const T* yVec, T* resultVec, SizeType size) +{ + tbb::parallel_for(SizeRange(0, size), LinearOp(a, xVec, yVec, resultVec)); +} + +/// Compute @e ax + @e y. +template +inline void +axpy(const T& a, const Vector& xVec, const Vector& yVec, Vector& result) +{ + assert(xVec.size() == yVec.size()); + assert(xVec.size() == result.size()); + axpy(a, xVec.data(), yVec.data(), result.data(), xVec.size()); +} + + +/// Compute @e r = @e b − @e Ax. +template +inline void +computeResidual(const MatrixOperator& A, const VecValueType* x, + const VecValueType* b, VecValueType* r) +{ + // Compute r = A * x. + A.vectorMultiply(x, r); + // Compute r = b - r. + tbb::parallel_for(SizeRange(0, A.numRows()), LinearOp(-1.0, r, b, r)); +} + +/// Compute @e r = @e b − @e Ax. +template +inline void +computeResidual(const MatrixOperator& A, const Vector& x, const Vector& b, Vector& r) +{ + assert(x.size() == b.size()); + assert(x.size() == r.size()); + assert(x.size() == A.numRows()); + + computeResidual(A, x.data(), b.data(), r.data()); +} + +} // namespace internal + + +//////////////////////////////////////// + + +template +inline State +solve( + const PositiveDefMatrix& Amat, + const Vector& bVec, + Vector& xVec, + Preconditioner& precond, + const State& termination) +{ + util::NullInterrupter interrupter; + return solve(Amat, bVec, xVec, precond, interrupter, termination); +} + + +template +inline State +solve( + const PositiveDefMatrix& Amat, + const Vector& bVec, + Vector& xVec, + Preconditioner& precond, + Interrupter& interrupter, + const State& termination) +{ + typedef typename PositiveDefMatrix::ValueType ValueType; + typedef Vector VectorType; + + State result; + result.success = false; + result.iterations = 0; + result.relativeError = 0.0; + result.absoluteError = 0.0; + + const SizeType size = Amat.numRows(); + if (size == 0) { + OPENVDB_LOG_WARN("pcg::solve(): matrix has dimension zero"); + return result; + } + if (size != bVec.size()) { + OPENVDB_THROW(ArithmeticError, "A and b have incompatible sizes" + << size << "x" << size << " vs. " << bVec.size() << ")"); + } + if (size != xVec.size()) { + OPENVDB_THROW(ArithmeticError, "A and x have incompatible sizes" + << size << "x" << size << " vs. " << xVec.size() << ")"); + } + + // Temp vectors + VectorType zVec(size); // transformed residual (M^-1 r) + VectorType pVec(size); // search direction + VectorType qVec(size); // A * p + + // Compute norm of B (the source) + const ValueType tmp = bVec.infNorm(); + const ValueType infNormOfB = isZero(tmp) ? 1.f : tmp; + + // Compute rVec: residual = b - Ax. + VectorType rVec(size); // vector of residuals + + internal::computeResidual(Amat, xVec, bVec, rVec); + + assert(rVec.isFinite()); + + // Normalize the residual norm with the source norm and look for early out. + result.absoluteError = static_cast(rVec.infNorm()); + result.relativeError = static_cast(result.absoluteError / infNormOfB); + if (result.relativeError <= termination.relativeError) { + result.success = true; + return result; + } + + // Iterations of the CG solve + + ValueType rDotZPrev(1); // inner product of + + // Keep track of the minimum error to monitor convergence. + ValueType minL2Error = std::numeric_limits::max(); + ValueType l2Error; + + int iteration = 0; + for ( ; iteration < termination.iterations; ++iteration) { + + if (interrupter.wasInterrupted()) { + OPENVDB_THROW(RuntimeError, "conjugate gradient solver was interrupted"); + } + + OPENVDB_LOG_DEBUG_RUNTIME("pcg::solve() " << result); + + result.iterations = iteration + 1; + + // Apply preconditioner to residual + // z_{k} = M^-1 r_{k} + precond.apply(rVec, zVec); + + // + const ValueType rDotZ = rVec.dot(zVec); + assert(std::isfinite(rDotZ)); + + if (0 == iteration) { + // Initialize + pVec = zVec; + } else { + const ValueType beta = rDotZ / rDotZPrev; + // p = beta * p + z + internal::axpy(beta, pVec, zVec, /*result */pVec); + } + + // q_{k} = A p_{k} + Amat.vectorMultiply(pVec, qVec); + + // alpha = / + const ValueType pAp = pVec.dot(qVec); + assert(std::isfinite(pAp)); + + const ValueType alpha = rDotZ / pAp; + rDotZPrev = rDotZ; + + // x_{k} = x_{k-1} + alpha * p_{k} + internal::axpy(alpha, pVec, xVec, /*result=*/xVec); + + // r_{k} = r_{k-1} - alpha_{k-1} A p_{k} + internal::axpy(-alpha, qVec, rVec, /*result=*/rVec); + + // update tolerances + l2Error = rVec.l2Norm(); + minL2Error = Min(l2Error, minL2Error); + + result.absoluteError = static_cast(rVec.infNorm()); + result.relativeError = static_cast(result.absoluteError / infNormOfB); + + if (l2Error > 2 * minL2Error) { + // The solution started to diverge. + result.success = false; + break; + } + if (!std::isfinite(result.absoluteError)) { + // Total divergence of solution + result.success = false; + break; + } + if (result.absoluteError <= termination.absoluteError) { + // Convergence + result.success = true; + break; + } + if (result.relativeError <= termination.relativeError) { + // Convergence + result.success = true; + break; + } + } + OPENVDB_LOG_DEBUG_RUNTIME("pcg::solve() " << result); + + return result; +} + +} // namespace pcg +} // namespace math +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_MATH_CONJGRADIENT_HAS_BEEN_INCLUDED + +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// diff --git a/nuparu/include/openvdb/include/openvdb/math/Coord.h b/nuparu/include/openvdb/include/openvdb/math/Coord.h new file mode 100644 index 00000000..01a4893c --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/math/Coord.h @@ -0,0 +1,528 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_MATH_COORD_HAS_BEEN_INCLUDED +#define OPENVDB_MATH_COORD_HAS_BEEN_INCLUDED + +#include +#include "Math.h" +#include "Vec3.h" + +namespace tbb { class split; } // forward declaration + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace math { + +/// @brief Signed (x, y, z) 32-bit integer coordinates +class Coord +{ +public: + typedef int32_t Int32; + typedef uint32_t Index32; + typedef Vec3 Vec3i; + typedef Vec3 Vec3I; + + typedef Int32 ValueType; + typedef std::numeric_limits Limits; + + Coord() { mVec[0] = mVec[1] = mVec[2] = 0; } + explicit Coord(Int32 xyz) { mVec[0] = mVec[1] = mVec[2] = xyz; } + Coord(Int32 x, Int32 y, Int32 z) { mVec[0] = x; mVec[1] = y; mVec[2] = z; } + explicit Coord(const Vec3i& v) { mVec[0] = v[0]; mVec[1] = v[1]; mVec[2] = v[2]; } + explicit Coord(const Vec3I& v) + { + mVec[0] = Int32(v[0]); mVec[1] = Int32(v[1]); mVec[2] = Int32(v[2]); + } + explicit Coord(const Int32* v) { mVec[0] = v[0]; mVec[1] = v[1]; mVec[2] = v[2]; } + + /// @brief Return the smallest possible coordinate + static Coord min() { return Coord(Limits::min()); } + + /// @brief Return the largest possible coordinate + static Coord max() { return Coord(Limits::max()); } + + /// @brief Return @a xyz rounded to the closest integer coordinates + /// (cell centered conversion). + template static Coord round(const Vec3& xyz) + { + return Coord(Int32(Round(xyz[0])), Int32(Round(xyz[1])), Int32(Round(xyz[2]))); + } + /// @brief Return the largest integer coordinates that are not greater + /// than @a xyz (node centered conversion). + template static Coord floor(const Vec3& xyz) + { + return Coord(Int32(Floor(xyz[0])), Int32(Floor(xyz[1])), Int32(Floor(xyz[2]))); + } + + /// @brief Return the largest integer coordinates that are not greater + /// than @a xyz+1 (node centered conversion). + template static Coord ceil(const Vec3& xyz) + { + return Coord(Int32(Ceil(xyz[0])), Int32(Ceil(xyz[1])), Int32(Ceil(xyz[2]))); + } + + Coord& reset(Int32 x, Int32 y, Int32 z) + { + mVec[0] = x; mVec[1] = y; mVec[2] = z; + return *this; + } + Coord& reset(Int32 xyz) { return this->reset(xyz, xyz, xyz); } + + Coord& setX(Int32 x) { mVec[0] = x; return *this; } + Coord& setY(Int32 y) { mVec[1] = y; return *this; } + Coord& setZ(Int32 z) { mVec[2] = z; return *this; } + + Coord& offset(Int32 dx, Int32 dy, Int32 dz) + { + mVec[0]+=dx; mVec[1]+=dy; mVec[2]+=dz; + return *this; + } + Coord& offset(Int32 n) { return this->offset(n, n, n); } + Coord offsetBy(Int32 dx, Int32 dy, Int32 dz) const + { + return Coord(mVec[0] + dx, mVec[1] + dy, mVec[2] + dz); + } + Coord offsetBy(Int32 n) const { return offsetBy(n, n, n); } + + Coord& operator+=(const Coord& rhs) + { + mVec[0] += rhs[0]; mVec[1] += rhs[1]; mVec[2] += rhs[2]; + return *this; + } + Coord& operator-=(const Coord& rhs) + { + mVec[0] -= rhs[0]; mVec[1] -= rhs[1]; mVec[2] -= rhs[2]; + return *this; + } + Coord operator+(const Coord& rhs) const + { + return Coord(mVec[0] + rhs[0], mVec[1] + rhs[1], mVec[2] + rhs[2]); + } + Coord operator-(const Coord& rhs) const + { + return Coord(mVec[0] - rhs[0], mVec[1] - rhs[1], mVec[2] - rhs[2]); + } + Coord operator-() const { return Coord(-mVec[0], -mVec[1], -mVec[2]); } + + Coord operator>> (size_t n) const { return Coord(mVec[0]>>n, mVec[1]>>n, mVec[2]>>n); } + Coord operator<< (size_t n) const { return Coord(mVec[0]<>=(size_t n) { mVec[0]>>=n; mVec[1]>>=n; mVec[2]>>=n; return *this; } + Coord operator& (Int32 n) const { return Coord(mVec[0] & n, mVec[1] & n, mVec[2] & n); } + Coord operator| (Int32 n) const { return Coord(mVec[0] | n, mVec[1] | n, mVec[2] | n); } + Coord& operator&= (Int32 n) { mVec[0]&=n; mVec[1]&=n; mVec[2]&=n; return *this; } + Coord& operator|= (Int32 n) { mVec[0]|=n; mVec[1]|=n; mVec[2]|=n; return *this; } + + Int32 x() const { return mVec[0]; } + Int32 y() const { return mVec[1]; } + Int32 z() const { return mVec[2]; } + Int32 operator[](size_t i) const { assert(i < 3); return mVec[i]; } + Int32& x() { return mVec[0]; } + Int32& y() { return mVec[1]; } + Int32& z() { return mVec[2]; } + Int32& operator[](size_t i) { assert(i < 3); return mVec[i]; } + + const Int32* data() const { return mVec; } + Int32* data() { return mVec; } + const Int32* asPointer() const { return mVec; } + Int32* asPointer() { return mVec; } + Vec3d asVec3d() const { return Vec3d(double(mVec[0]), double(mVec[1]), double(mVec[2])); } + Vec3s asVec3s() const { return Vec3s(float(mVec[0]), float(mVec[1]), float(mVec[2])); } + Vec3i asVec3i() const { return Vec3i(mVec); } + Vec3I asVec3I() const { return Vec3I(Index32(mVec[0]), Index32(mVec[1]), Index32(mVec[2])); } + void asXYZ(Int32& x, Int32& y, Int32& z) const { x = mVec[0]; y = mVec[1]; z = mVec[2]; } + + bool operator==(const Coord& rhs) const + { + return (mVec[0] == rhs.mVec[0] && mVec[1] == rhs.mVec[1] && mVec[2] == rhs.mVec[2]); + } + bool operator!=(const Coord& rhs) const { return !(*this == rhs); } + + /// Lexicographic less than + bool operator<(const Coord& rhs) const + { + return this->x() < rhs.x() ? true : this->x() > rhs.x() ? false + : this->y() < rhs.y() ? true : this->y() > rhs.y() ? false + : this->z() < rhs.z() ? true : false; + } + /// Lexicographic less than or equal to + bool operator<=(const Coord& rhs) const + { + return this->x() < rhs.x() ? true : this->x() > rhs.x() ? false + : this->y() < rhs.y() ? true : this->y() > rhs.y() ? false + : this->z() <=rhs.z() ? true : false; + } + /// Lexicographic greater than + bool operator>(const Coord& rhs) const { return !(*this <= rhs); } + /// Lexicographic greater than or equal to + bool operator>=(const Coord& rhs) const { return !(*this < rhs); } + + /// Perform a component-wise minimum with the other Coord. + void minComponent(const Coord& other) + { + mVec[0] = std::min(mVec[0], other.mVec[0]); + mVec[1] = std::min(mVec[1], other.mVec[1]); + mVec[2] = std::min(mVec[2], other.mVec[2]); + } + + /// Perform a component-wise maximum with the other Coord. + void maxComponent(const Coord& other) + { + mVec[0] = std::max(mVec[0], other.mVec[0]); + mVec[1] = std::max(mVec[1], other.mVec[1]); + mVec[2] = std::max(mVec[2], other.mVec[2]); + } + + /// Return the component-wise minimum of the two Coords. + static inline Coord minComponent(const Coord& lhs, const Coord& rhs) + { + return Coord(std::min(lhs.x(), rhs.x()), + std::min(lhs.y(), rhs.y()), + std::min(lhs.z(), rhs.z())); + } + + /// Return the component-wise maximum of the two Coords. + static inline Coord maxComponent(const Coord& lhs, const Coord& rhs) + { + return Coord(std::max(lhs.x(), rhs.x()), + std::max(lhs.y(), rhs.y()), + std::max(lhs.z(), rhs.z())); + } + + /// Return true if any of the components of @a a are smaller than the + /// corresponding components of @a b. + static inline bool lessThan(const Coord& a, const Coord& b) + { + return (a[0] < b[0] || a[1] < b[1] || a[2] < b[2]); + } + + /// @brief Return the index (0, 1 or 2) with the smallest value. + size_t minIndex() const { return MinIndex(mVec); } + + /// @brief Return the index (0, 1 or 2) with the largest value. + size_t maxIndex() const { return MaxIndex(mVec); } + + void read(std::istream& is) { is.read(reinterpret_cast(mVec), sizeof(mVec)); } + void write(std::ostream& os) const + { + os.write(reinterpret_cast(mVec), sizeof(mVec)); + } + +private: + + Int32 mVec[3]; +}; // class Coord + + +//////////////////////////////////////// + + +/// @brief Axis-aligned bounding box of signed integer coordinates +/// @note The range of the integer coordinates, [min, max], is inclusive. +/// Thus, a bounding box with min = max is not empty but rather encloses +/// a single coordinate. +class CoordBBox +{ +public: + typedef uint64_t Index64; + typedef Coord::ValueType ValueType; + + /// @brief Iterator over Coord domain covered by a CoordBBox + /// + /// @note If ZYX is true Z is the fastest moving coordinate, else + /// it is the X coordinate, i.e. XYZ traversal + template + class Iterator { + public: + /// @brief C-tor from a bounding box + Iterator(const CoordBBox &b) : mPos(b.min()), mMin(b.min()), mMax(b.max()) {} + /// @brief Increments iterator to point to the next coordinate + /// @note Stops a the last + 1 coordinate of the bounding box + /// as defined by the template parameter. + Iterator& operator++() { + ZYX ? this->next<2,1,0>() : this->next<0,1,2>(); + return *this; + } + /// @brief Return true if the iterator still points to a valid coordinate + operator bool() const { + return ZYX ? mPos[0] <= mMax[0] : mPos[2] <= mMax[2]; + } + /// @brief Return a const reference to the coordinate currently pointed to + const Coord& operator*() const { return mPos; } + private: + template + inline void next() { + if ( mPos[a] < mMax[a] ) {//by far this is the most common case + ++mPos[a]; + } else if ( mPos[b] < mMax[b] ) { + mPos[a] = mMin[a]; + ++mPos[b]; + } else if ( mPos[c] <= mMax[c] ) { + mPos[a] = mMin[a]; + mPos[b] = mMin[b]; + ++mPos[c]; + } + } + Coord mPos, mMin, mMax; + };// CoordBBox::Iterator + + /// @brief The default constructor produces an empty bounding box. + CoordBBox(): mMin(Coord::max()), mMax(Coord::min()) {} + /// @brief Construct a bounding box with the given @a min and @a max bounds. + CoordBBox(const Coord& min, const Coord& max): mMin(min), mMax(max) {} + /// @brief Splitting constructor for use in TBB ranges + /// @note The other bounding box is assumed to be divisible. + CoordBBox(CoordBBox& other, const tbb::split&): mMin(other.mMin), mMax(other.mMax) + { + assert(this->is_divisible()); + const size_t n = this->maxExtent(); + mMax[n] = (mMin[n] + mMax[n]) >> 1; + other.mMin[n] = mMax[n] + 1; + } + + static CoordBBox createCube(const Coord& min, ValueType dim) + { + return CoordBBox(min, min.offsetBy(dim - 1)); + } + + /// Return an "infinite" bounding box, as defined by the Coord value range. + static CoordBBox inf() { return CoordBBox(Coord::min(), Coord::max()); } + + const Coord& min() const { return mMin; } + const Coord& max() const { return mMax; } + + Coord& min() { return mMin; } + Coord& max() { return mMax; } + + void reset() { mMin = Coord::max(); mMax = Coord::min(); } + void reset(const Coord& min, const Coord& max) { mMin = min; mMax = max; } + void resetToCube(const Coord& min, ValueType dim) { mMin = min; mMax = min.offsetBy(dim - 1); } + + /// @note The start coordinate is inclusive. + Coord getStart() const { return mMin; } + /// @note The end coordinate is exclusive. + Coord getEnd() const { return mMax.offsetBy(1); } + + bool operator==(const CoordBBox& rhs) const { return mMin == rhs.mMin && mMax == rhs.mMax; } + bool operator!=(const CoordBBox& rhs) const { return !(*this == rhs); } + + bool empty() const { return (mMin[0] > mMax[0] || mMin[1] > mMax[1] || mMin[2] > mMax[2]); } + //@{ + /// Return @c true if this bounding box is nonempty + operator bool() const { return !this->empty(); } + bool hasVolume() const { return !this->empty(); } + //@} + + /// Return the floating-point position of the center of this bounding box. + Vec3d getCenter() const { return 0.5 * Vec3d((mMin + mMax).asPointer()); } + + /// @brief Return the dimensions of the coordinates spanned by this bounding box. + /// @note Since coordinates are inclusive, a bounding box with min = max + /// has dimensions of (1, 1, 1). + Coord dim() const { return mMax.offsetBy(1) - mMin; } + /// @todo deprecate - use dim instead + Coord extents() const { return this->dim(); } + /// @brief Return the integer volume of coordinates spanned by this bounding box. + /// @note Since coordinates are inclusive, a bounding box with min = max has volume one. + Index64 volume() const + { + const Coord d = this->dim(); + return Index64(d[0]) * Index64(d[1]) * Index64(d[2]); + } + /// Return @c true if this bounding box can be subdivided [mainly for use by TBB]. + bool is_divisible() const { return mMin[0]dim().minIndex(); } + + /// @brief Return the index (0, 1 or 2) of the longest axis. + size_t maxExtent() const { return this->dim().maxIndex(); } + + /// Return @c true if point (x, y, z) is inside this bounding box. + bool isInside(const Coord& xyz) const + { + return !(Coord::lessThan(xyz,mMin) || Coord::lessThan(mMax,xyz)); + } + + /// Return @c true if the given bounding box is inside this bounding box. + bool isInside(const CoordBBox& b) const + { + return !(Coord::lessThan(b.mMin,mMin) || Coord::lessThan(mMax,b.mMax)); + } + + /// Return @c true if the given bounding box overlaps with this bounding box. + bool hasOverlap(const CoordBBox& b) const + { + return !(Coord::lessThan(mMax,b.mMin) || Coord::lessThan(b.mMax,mMin)); + } + + /// Pad this bounding box with the specified padding. + void expand(ValueType padding) + { + mMin.offset(-padding); + mMax.offset( padding); + } + + /// Return a new instance that is expanded by the specified padding. + CoordBBox expandBy(ValueType padding) const + { + return CoordBBox(mMin.offsetBy(-padding),mMax.offsetBy(padding)); + } + + /// Expand this bounding box to enclose point (x, y, z). + void expand(const Coord& xyz) + { + mMin.minComponent(xyz); + mMax.maxComponent(xyz); + } + + /// Union this bounding box with the given bounding box. + void expand(const CoordBBox& bbox) + { + mMin.minComponent(bbox.min()); + mMax.maxComponent(bbox.max()); + } + /// Intersect this bounding box with the given bounding box. + void intersect(const CoordBBox& bbox) + { + mMin.maxComponent(bbox.min()); + mMax.minComponent(bbox.max()); + } + /// @brief Union this bounding box with the cubical bounding box + /// of the given size and with the given minimum coordinates. + void expand(const Coord& min, Coord::ValueType dim) + { + mMin.minComponent(min); + mMax.maxComponent(min.offsetBy(dim-1)); + } + /// Translate this bounding box by @f$(t_x, t_y, t_z)@f$. + void translate(const Coord& t) { mMin += t; mMax += t; } + + //@{ + /// @brief Bit-wise operations performed on both the min and max members + CoordBBox operator>> (size_t n) const { return CoordBBox(mMin>>n, mMax>>n); } + CoordBBox operator<< (size_t n) const { return CoordBBox(mMin<>=(size_t n) { mMin >>= n; mMax >>= n; return *this; } + CoordBBox operator& (Coord::Int32 n) const { return CoordBBox(mMin & n, mMax & n); } + CoordBBox operator| (Coord::Int32 n) const { return CoordBBox(mMin | n, mMax | n); } + CoordBBox& operator&= (Coord::Int32 n) { mMin &= n; mMax &= n; return *this; } + CoordBBox& operator|= (Coord::Int32 n) { mMin |= n; mMax |= n; return *this; } + //@} + + /// Unserialize this bounding box from the given stream. + void read(std::istream& is) { mMin.read(is); mMax.read(is); } + /// Serialize this bounding box to the given stream. + void write(std::ostream& os) const { mMin.write(os); mMax.write(os); } + +private: + Coord mMin, mMax; +}; // class CoordBBox + + +//////////////////////////////////////// + + +inline std::ostream& operator<<(std::ostream& os, const Coord& xyz) +{ + os << xyz.asVec3i(); return os; +} + + +//@{ +/// Allow a Coord to be added to or subtracted from a Vec3. +template +inline Vec3::type> +operator+(const Vec3& v0, const Coord& v1) +{ + Vec3::type> result(v0); + result[0] += v1[0]; + result[1] += v1[1]; + result[2] += v1[2]; + return result; +} + +template +inline Vec3::type> +operator+(const Coord& v1, const Vec3& v0) +{ + Vec3::type> result(v0); + result[0] += v1[0]; + result[1] += v1[1]; + result[2] += v1[2]; + return result; +} +//@} + + +//@{ +/// Allow a Coord to be subtracted from a Vec3. +template +inline Vec3::type> +operator-(const Vec3& v0, const Coord& v1) +{ + Vec3::type> result(v0); + result[0] -= v1[0]; + result[1] -= v1[1]; + result[2] -= v1[2]; + return result; +} + +template +inline Vec3::type> +operator-(const Coord& v1, const Vec3& v0) +{ + Vec3::type> result(v0); + result[0] -= v1[0]; + result[1] -= v1[1]; + result[2] -= v1[2]; + return -result; +} +//@} + +inline std::ostream& +operator<<(std::ostream& os, const CoordBBox& b) +{ + os << b.min() << " -> " << b.max(); + return os; +} + +} // namespace math +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_MATH_COORD_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/math/DDA.h b/nuparu/include/openvdb/include/openvdb/math/DDA.h new file mode 100644 index 00000000..c4242b14 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/math/DDA.h @@ -0,0 +1,373 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file DDA.h +/// +/// @author Ken Museth +/// +/// @brief Digital Differential Analyzers specialized for VDB. + +#ifndef OPENVDB_MATH_DDA_HAS_BEEN_INCLUDED +#define OPENVDB_MATH_DDA_HAS_BEEN_INCLUDED + +#include "Coord.h" +#include "Math.h" +#include "Vec3.h" +#include // for std::ostream +#include // for std::numeric_limits::max() + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace math { + +/// @brief A Digital Differential Analyzer specialized for OpenVDB grids +/// @note Conceptually similar to Bresenham's line algorithm applied +/// to a 3D Ray intersecting OpenVDB nodes or voxels. Log2Dim = 0 +/// corresponds to a voxel and Log2Dim a tree node of size 2^Log2Dim. +/// +/// @note The Ray template class is expected to have the following +/// methods: test(time), t0(), t1(), invDir(), and operator()(time). +/// See the example Ray class above for their definition. +template +class DDA +{ +public: + typedef typename RayT::RealType RealType; + typedef RealType RealT; + typedef typename RayT::Vec3Type Vec3Type; + typedef Vec3Type Vec3T; + + /// @brief uninitialized constructor + DDA() {} + + DDA(const RayT& ray) { this->init(ray); } + + DDA(const RayT& ray, RealT startTime) { this->init(ray, startTime); } + + DDA(const RayT& ray, RealT startTime, RealT maxTime) { this->init(ray, startTime, maxTime); } + + inline void init(const RayT& ray, RealT startTime, RealT maxTime) + { + assert(startTime <= maxTime); + static const int DIM = 1 << Log2Dim; + mT0 = startTime; + mT1 = maxTime; + const Vec3T &pos = ray(mT0), &dir = ray.dir(), &inv = ray.invDir(); + mVoxel = Coord::floor(pos) & (~(DIM-1)); + for (int axis = 0; axis < 3; ++axis) { + if (math::isZero(dir[axis])) {//handles dir = +/- 0 + mStep[axis] = 0;//dummy value + mNext[axis] = std::numeric_limits::max();//i.e. disabled! + mDelta[axis] = std::numeric_limits::max();//dummy value + } else if (inv[axis] > 0) { + mStep[axis] = DIM; + mNext[axis] = mT0 + (mVoxel[axis] + DIM - pos[axis]) * inv[axis]; + mDelta[axis] = mStep[axis] * inv[axis]; + } else { + mStep[axis] = -DIM; + mNext[axis] = mT0 + (mVoxel[axis] - pos[axis]) * inv[axis]; + mDelta[axis] = mStep[axis] * inv[axis]; + } + } + } + + inline void init(const RayT& ray) { this->init(ray, ray.t0(), ray.t1()); } + + inline void init(const RayT& ray, RealT startTime) { this->init(ray, startTime, ray.t1()); } + + /// @brief Increment the voxel index to next intersected voxel or node + /// and returns true if the step in time does not exceed maxTime. + inline bool step() + { + const int stepAxis = static_cast(math::MinIndex(mNext)); + mT0 = mNext[stepAxis]; + mNext[stepAxis] += mDelta[stepAxis]; + mVoxel[stepAxis] += mStep[stepAxis]; + return mT0 <= mT1; + } + + /// @brief Return the index coordinates of the next node or voxel + /// intersected by the ray. If Log2Dim = 0 the return value is the + /// actual signed coordinate of the voxel, else it is the origin + /// of the corresponding VDB tree node or tile. + /// @note Incurs no computational overhead. + inline const Coord& voxel() const { return mVoxel; } + + /// @brief Return the time (parameterized along the Ray) of the + /// first hit of a tree node of size 2^Log2Dim. + /// @details This value is initialized to startTime or ray.t0() + /// depending on the constructor used. + /// @note Incurs no computational overhead. + inline RealType time() const { return mT0; } + + /// @brief Return the maximum time (parameterized along the Ray). + inline RealType maxTime() const { return mT1; } + + /// @brief Return the time (parameterized along the Ray) of the + /// second (i.e. next) hit of a tree node of size 2^Log2Dim. + /// @note Incurs a (small) computational overhead. + inline RealType next() const { return math::Min(mT1, mNext[0], mNext[1], mNext[2]); } + + /// @brief Print information about this DDA for debugging. + /// @param os a stream to which to write textual information. + void print(std::ostream& os = std::cout) const + { + os << "Dim=" << (1< +#include "Math.h" +#include "Coord.h" +#include "Vec3.h" + +#include +#include + +#ifdef DWA_OPENVDB +#include +#endif + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace math { + + +//////////////////////////////////////// + + +/// @brief Different discrete schemes used in the first derivatives. +// Add new items to the *end* of this list, and update NUM_DS_SCHEMES. +enum DScheme { + UNKNOWN_DS = -1, + CD_2NDT = 0, // center difference, 2nd order, but the result must be divided by 2 + CD_2ND, // center difference, 2nd order + CD_4TH, // center difference, 4th order + CD_6TH, // center difference, 6th order + FD_1ST, // forward difference, 1st order + FD_2ND, // forward difference, 2nd order + FD_3RD, // forward difference, 3rd order + BD_1ST, // backward difference, 1st order + BD_2ND, // backward difference, 2nd order + BD_3RD, // backward difference, 3rd order + FD_WENO5, // forward difference, weno5 + BD_WENO5, // backward difference, weno5 + FD_HJWENO5, // forward differene, HJ-weno5 + BD_HJWENO5 // backward difference, HJ-weno5 +}; + +enum { NUM_DS_SCHEMES = BD_HJWENO5 + 1 }; + + +inline std::string +dsSchemeToString(DScheme dss) +{ + std::string ret; + switch (dss) { + case UNKNOWN_DS: ret = "unknown_ds"; break; + case CD_2NDT: ret = "cd_2ndt"; break; + case CD_2ND: ret = "cd_2nd"; break; + case CD_4TH: ret = "cd_4th"; break; + case CD_6TH: ret = "cd_6th"; break; + case FD_1ST: ret = "fd_1st"; break; + case FD_2ND: ret = "fd_2nd"; break; + case FD_3RD: ret = "fd_3rd"; break; + case BD_1ST: ret = "bd_1st"; break; + case BD_2ND: ret = "bd_2nd"; break; + case BD_3RD: ret = "bd_3rd"; break; + case FD_WENO5: ret = "fd_weno5"; break; + case BD_WENO5: ret = "bd_weno5"; break; + case FD_HJWENO5: ret = "fd_hjweno5"; break; + case BD_HJWENO5: ret = "bd_hjweno5"; break; + } + return ret; +} + +inline DScheme +stringToDScheme(const std::string& s) +{ + DScheme ret = UNKNOWN_DS; + + std::string str = s; + boost::trim(str); + boost::to_lower(str); + + if (str == dsSchemeToString(CD_2NDT)) { + ret = CD_2NDT; + } else if (str == dsSchemeToString(CD_2ND)) { + ret = CD_2ND; + } else if (str == dsSchemeToString(CD_4TH)) { + ret = CD_4TH; + } else if (str == dsSchemeToString(CD_6TH)) { + ret = CD_6TH; + } else if (str == dsSchemeToString(FD_1ST)) { + ret = FD_1ST; + } else if (str == dsSchemeToString(FD_2ND)) { + ret = FD_2ND; + } else if (str == dsSchemeToString(FD_3RD)) { + ret = FD_3RD; + } else if (str == dsSchemeToString(BD_1ST)) { + ret = BD_1ST; + } else if (str == dsSchemeToString(BD_2ND)) { + ret = BD_2ND; + } else if (str == dsSchemeToString(BD_3RD)) { + ret = BD_3RD; + } else if (str == dsSchemeToString(FD_WENO5)) { + ret = FD_WENO5; + } else if (str == dsSchemeToString(BD_WENO5)) { + ret = BD_WENO5; + } else if (str == dsSchemeToString(FD_HJWENO5)) { + ret = FD_HJWENO5; + } else if (str == dsSchemeToString(BD_HJWENO5)) { + ret = BD_HJWENO5; + } + + return ret; +} + +inline std::string +dsSchemeToMenuName(DScheme dss) +{ + std::string ret; + switch (dss) { + case UNKNOWN_DS: ret = "Unknown DS scheme"; break; + case CD_2NDT: ret = "Twice 2nd-order center difference"; break; + case CD_2ND: ret = "2nd-order center difference"; break; + case CD_4TH: ret = "4th-order center difference"; break; + case CD_6TH: ret = "6th-order center difference"; break; + case FD_1ST: ret = "1st-order forward difference"; break; + case FD_2ND: ret = "2nd-order forward difference"; break; + case FD_3RD: ret = "3rd-order forward difference"; break; + case BD_1ST: ret = "1st-order backward difference"; break; + case BD_2ND: ret = "2nd-order backward difference"; break; + case BD_3RD: ret = "3rd-order backward difference"; break; + case FD_WENO5: ret = "5th-order WENO forward difference"; break; + case BD_WENO5: ret = "5th-order WENO backward difference"; break; + case FD_HJWENO5: ret = "5th-order HJ-WENO forward difference"; break; + case BD_HJWENO5: ret = "5th-order HJ-WENO backward difference"; break; + } + return ret; +} + + + +//////////////////////////////////////// + + +/// @brief Different discrete schemes used in the second derivatives. +// Add new items to the *end* of this list, and update NUM_DD_SCHEMES. +enum DDScheme { + UNKNOWN_DD = -1, + CD_SECOND = 0, // center difference, 2nd order + CD_FOURTH, // center difference, 4th order + CD_SIXTH // center difference, 6th order +}; + +enum { NUM_DD_SCHEMES = CD_SIXTH + 1 }; + + +//////////////////////////////////////// + + +/// @brief Biased Gradients are limited to non-centered differences +// Add new items to the *end* of this list, and update NUM_BIAS_SCHEMES. +enum BiasedGradientScheme { + UNKNOWN_BIAS = -1, + FIRST_BIAS = 0, // uses FD_1ST & BD_1ST + SECOND_BIAS, // uses FD_2ND & BD_2ND + THIRD_BIAS, // uses FD_3RD & BD_3RD + WENO5_BIAS, // uses WENO5 + HJWENO5_BIAS // uses HJWENO5 +}; + +enum { NUM_BIAS_SCHEMES = HJWENO5_BIAS + 1 }; + +inline std::string +biasedGradientSchemeToString(BiasedGradientScheme bgs) +{ + std::string ret; + switch (bgs) { + case UNKNOWN_BIAS: ret = "unknown_bias"; break; + case FIRST_BIAS: ret = "first_bias"; break; + case SECOND_BIAS: ret = "second_bias"; break; + case THIRD_BIAS: ret = "third_bias"; break; + case WENO5_BIAS: ret = "weno5_bias"; break; + case HJWENO5_BIAS: ret = "hjweno5_bias"; break; + } + return ret; +} + +inline BiasedGradientScheme +stringToBiasedGradientScheme(const std::string& s) +{ + BiasedGradientScheme ret = UNKNOWN_BIAS; + + std::string str = s; + boost::trim(str); + boost::to_lower(str); + + if (str == biasedGradientSchemeToString(FIRST_BIAS)) { + ret = FIRST_BIAS; + } else if (str == biasedGradientSchemeToString(SECOND_BIAS)) { + ret = SECOND_BIAS; + } else if (str == biasedGradientSchemeToString(THIRD_BIAS)) { + ret = THIRD_BIAS; + } else if (str == biasedGradientSchemeToString(WENO5_BIAS)) { + ret = WENO5_BIAS; + } else if (str == biasedGradientSchemeToString(HJWENO5_BIAS)) { + ret = HJWENO5_BIAS; + } + return ret; +} + +inline std::string +biasedGradientSchemeToMenuName(BiasedGradientScheme bgs) +{ + std::string ret; + switch (bgs) { + case UNKNOWN_BIAS: ret = "Unknown biased gradient"; break; + case FIRST_BIAS: ret = "1st-order biased gradient"; break; + case SECOND_BIAS: ret = "2nd-order biased gradient"; break; + case THIRD_BIAS: ret = "3rd-order biased gradient"; break; + case WENO5_BIAS: ret = "5th-order WENO biased gradient"; break; + case HJWENO5_BIAS: ret = "5th-order HJ-WENO biased gradient"; break; + } + return ret; +} + +//////////////////////////////////////// + + +/// @brief Temporal integration schemes +// Add new items to the *end* of this list, and update NUM_TEMPORAL_SCHEMES. +enum TemporalIntegrationScheme { + UNKNOWN_TIS = -1, + TVD_RK1,//same as explicit Euler integration + TVD_RK2, + TVD_RK3 +}; + +enum { NUM_TEMPORAL_SCHEMES = TVD_RK3 + 1 }; + +inline std::string +temporalIntegrationSchemeToString(TemporalIntegrationScheme tis) +{ + std::string ret; + switch (tis) { + case UNKNOWN_TIS: ret = "unknown_tis"; break; + case TVD_RK1: ret = "tvd_rk1"; break; + case TVD_RK2: ret = "tvd_rk2"; break; + case TVD_RK3: ret = "tvd_rk3"; break; + } + return ret; +} + +inline TemporalIntegrationScheme +stringToTemporalIntegrationScheme(const std::string& s) +{ + TemporalIntegrationScheme ret = UNKNOWN_TIS; + + std::string str = s; + boost::trim(str); + boost::to_lower(str); + + if (str == temporalIntegrationSchemeToString(TVD_RK1)) { + ret = TVD_RK1; + } else if (str == temporalIntegrationSchemeToString(TVD_RK2)) { + ret = TVD_RK2; + } else if (str == temporalIntegrationSchemeToString(TVD_RK3)) { + ret = TVD_RK3; + } + + return ret; +} + +inline std::string +temporalIntegrationSchemeToMenuName(TemporalIntegrationScheme tis) +{ + std::string ret; + switch (tis) { + case UNKNOWN_TIS: ret = "Unknown temporal integration"; break; + case TVD_RK1: ret = "Forward Euler"; break; + case TVD_RK2: ret = "2nd-order Runge-Kutta"; break; + case TVD_RK3: ret = "3rd-order Runge-Kutta"; break; + } + return ret; +} + + +//@} + + +/// @brief Implementation of nominally fifth-order finite-difference WENO +/// @details This function returns the numerical flux. See "High Order Finite Difference and +/// Finite Volume WENO Schemes and Discontinuous Galerkin Methods for CFD" - Chi-Wang Shu +/// ICASE Report No 2001-11 (page 6). Also see ICASE No 97-65 for a more complete reference +/// (Shu, 1997). +/// Given v1 = f(x-2dx), v2 = f(x-dx), v3 = f(x), v4 = f(x+dx) and v5 = f(x+2dx), +/// return an interpolated value f(x+dx/2) with the special property that +/// ( f(x+dx/2) - f(x-dx/2) ) / dx = df/dx (x) + error, +/// where the error is fifth-order in smooth regions: O(dx) <= error <=O(dx^5) +template +inline ValueType +WENO5(const ValueType& v1, const ValueType& v2, const ValueType& v3, + const ValueType& v4, const ValueType& v5, float scale2 = 0.01f) +{ + const double C = 13.0 / 12.0; + // WENO is formulated for non-dimensional equations, here the optional scale2 + // is a reference value (squared) for the function being interpolated. For + // example if 'v' is of order 1000, then scale2 = 10^6 is ok. But in practice + // leave scale2 = 1. + const double eps = 1e-6 * scale2; + // {\tilde \omega_k} = \gamma_k / ( \beta_k + \epsilon)^2 in Shu's ICASE report) + const double A1=0.1/math::Pow2(C*math::Pow2(v1-2*v2+v3)+0.25*math::Pow2(v1-4*v2+3.0*v3)+eps), + A2=0.6/math::Pow2(C*math::Pow2(v2-2*v3+v4)+0.25*math::Pow2(v2-v4)+eps), + A3=0.3/math::Pow2(C*math::Pow2(v3-2*v4+v5)+0.25*math::Pow2(3.0*v3-4*v4+v5)+eps); + + return static_cast(static_cast( + A1*(2.0*v1 - 7.0*v2 + 11.0*v3) + + A2*(5.0*v3 - v2 + 2.0*v4) + + A3*(2.0*v3 + 5.0*v4 - v5))/(6.0*(A1+A2+A3))); +} + + +template +inline Real GodunovsNormSqrd(bool isOutside, + Real dP_xm, Real dP_xp, + Real dP_ym, Real dP_yp, + Real dP_zm, Real dP_zp) +{ + using math::Max; + using math::Min; + using math::Pow2; + + const Real zero(0); + Real dPLen2; + if (isOutside) { // outside + dPLen2 = Max(Pow2(Max(dP_xm, zero)), Pow2(Min(dP_xp,zero))); // (dP/dx)2 + dPLen2 += Max(Pow2(Max(dP_ym, zero)), Pow2(Min(dP_yp,zero))); // (dP/dy)2 + dPLen2 += Max(Pow2(Max(dP_zm, zero)), Pow2(Min(dP_zp,zero))); // (dP/dz)2 + } else { // inside + dPLen2 = Max(Pow2(Min(dP_xm, zero)), Pow2(Max(dP_xp,zero))); // (dP/dx)2 + dPLen2 += Max(Pow2(Min(dP_ym, zero)), Pow2(Max(dP_yp,zero))); // (dP/dy)2 + dPLen2 += Max(Pow2(Min(dP_zm, zero)), Pow2(Max(dP_zp,zero))); // (dP/dz)2 + } + return dPLen2; // |\nabla\phi|^2 +} + + +template +OPENVDB_DEPRECATED inline Real GudonovsNormSqrd(bool isOutside, + Real dP_xm, Real dP_xp, + Real dP_ym, Real dP_yp, + Real dP_zm, Real dP_zp) +{ return GodunovsNormSqrd(isOutside, dP_xm, dP_xp, dP_ym, dP_yp, dP_zm, dP_zp); } + +template +inline Real +GodunovsNormSqrd(bool isOutside, const Vec3& gradient_m, const Vec3& gradient_p) +{ + return GodunovsNormSqrd(isOutside, + gradient_m[0], gradient_p[0], + gradient_m[1], gradient_p[1], + gradient_m[2], gradient_p[2]); +} + +template +OPENVDB_DEPRECATED inline Real GudonovsNormSqrd(bool isOutside, + const Vec3& gradient_m, + const Vec3& gradient_p) +{ + return GodunovsNormSqrd(isOutside, gradient_m, gradient_p); +} + + +#ifdef DWA_OPENVDB +inline simd::Float4 simdMin(const simd::Float4& a, const simd::Float4& b) { + return simd::Float4(_mm_min_ps(a.base(), b.base())); +} +inline simd::Float4 simdMax(const simd::Float4& a, const simd::Float4& b) { + return simd::Float4(_mm_max_ps(a.base(), b.base())); +} + +inline float simdSum(const simd::Float4& v); + +inline simd::Float4 Pow2(const simd::Float4& v) { return v * v; } + +template<> +inline simd::Float4 +WENO5(const simd::Float4& v1, const simd::Float4& v2, const simd::Float4& v3, + const simd::Float4& v4, const simd::Float4& v5, float scale2) +{ + using math::Pow2; + typedef simd::Float4 F4; + const F4 + C(13.f / 12.f), + eps(1.0e-6f * scale2), + two(2.0), three(3.0), four(4.0), five(5.0), fourth(0.25), + A1 = F4(0.1f) / Pow2(C*Pow2(v1-two*v2+v3) + fourth*Pow2(v1-four*v2+three*v3) + eps), + A2 = F4(0.6f) / Pow2(C*Pow2(v2-two*v3+v4) + fourth*Pow2(v2-v4) + eps), + A3 = F4(0.3f) / Pow2(C*Pow2(v3-two*v4+v5) + fourth*Pow2(three*v3-four*v4+v5) + eps); + return (A1 * (two * v1 - F4(7.0) * v2 + F4(11.0) * v3) + + A2 * (five * v3 - v2 + two * v4) + + A3 * (two * v3 + five * v4 - v5)) / (F4(6.0) * (A1 + A2 + A3)); +} + + +inline float +simdSum(const simd::Float4& v) +{ + // temp = { v3+v3, v2+v2, v1+v3, v0+v2 } + __m128 temp = _mm_add_ps(v.base(), _mm_movehl_ps(v.base(), v.base())); + // temp = { v3+v3, v2+v2, v1+v3, (v0+v2)+(v1+v3) } + temp = _mm_add_ss(temp, _mm_shuffle_ps(temp, temp, 1)); + return _mm_cvtss_f32(temp); +} + +inline float +GodunovsNormSqrd(bool isOutside, const simd::Float4& dP_m, const simd::Float4& dP_p) +{ + const simd::Float4 zero(0.0); + simd::Float4 v = isOutside + ? simdMax(math::Pow2(simdMax(dP_m, zero)), math::Pow2(simdMin(dP_p, zero))) + : simdMax(math::Pow2(simdMin(dP_m, zero)), math::Pow2(simdMax(dP_p, zero))); + return simdSum(v);//should be v[0]+v[1]+v[2] +} + +OPENVDB_DEPRECATED inline float GudonovsNormSqrd(bool isOutside, + const simd::Float4& dP_m, + const simd::Float4& dP_p) +{ + return GodunovsNormSqrd(isOutside, dP_m, dP_p); +} +#endif + +template +struct D1 +{ + // random access version + template + static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk); + + template + static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk); + + template + static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk); + + // stencil access version + template + static typename Stencil::ValueType inX(const Stencil& S); + + template + static typename Stencil::ValueType inY(const Stencil& S); + + template + static typename Stencil::ValueType inZ(const Stencil& S); +}; + +template<> +struct D1 +{ + // the difference opperator + template + static ValueType difference(const ValueType& xp1, const ValueType& xm1) { + return xp1 - xm1; + } + + // random access version + template + static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk) + { + return difference( + grid.getValue(ijk.offsetBy(1, 0, 0)), + grid.getValue(ijk.offsetBy(-1, 0, 0))); + } + + template + static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk) + { + return difference( + grid.getValue(ijk.offsetBy(0, 1, 0)), + grid.getValue(ijk.offsetBy( 0, -1, 0))); + } + + template + static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk) + { + return difference( + grid.getValue(ijk.offsetBy(0, 0, 1)), + grid.getValue(ijk.offsetBy( 0, 0, -1))); + } + + // stencil access version + template + static typename Stencil::ValueType inX(const Stencil& S) + { + return difference( S.template getValue< 1, 0, 0>(), S.template getValue<-1, 0, 0>()); + } + + template + static typename Stencil::ValueType inY(const Stencil& S) + { + return difference( S.template getValue< 0, 1, 0>(), S.template getValue< 0,-1, 0>()); + } + + template + static typename Stencil::ValueType inZ(const Stencil& S) + { + return difference( S.template getValue< 0, 0, 1>(), S.template getValue< 0, 0,-1>()); + } +}; + +template<> +struct D1 +{ + + // the difference opperator + template + static ValueType difference(const ValueType& xp1, const ValueType& xm1) { + return (xp1 - xm1)*ValueType(0.5); + } + + + // random access + template + static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk) + { + return difference( + grid.getValue(ijk.offsetBy(1, 0, 0)), + grid.getValue(ijk.offsetBy(-1, 0, 0))); + } + + template + static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk) + { + return difference( + grid.getValue(ijk.offsetBy(0, 1, 0)), + grid.getValue(ijk.offsetBy( 0, -1, 0))); + } + + template + static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk) + { + return difference( + grid.getValue(ijk.offsetBy(0, 0, 1)), + grid.getValue(ijk.offsetBy( 0, 0, -1))); + } + + + // stencil access version + template + static typename Stencil::ValueType inX(const Stencil& S) + { + return difference(S.template getValue< 1, 0, 0>(), S.template getValue<-1, 0, 0>()); + } + template + static typename Stencil::ValueType inY(const Stencil& S) + { + return difference(S.template getValue< 0, 1, 0>(), S.template getValue< 0,-1, 0>()); + } + + template + static typename Stencil::ValueType inZ(const Stencil& S) + { + return difference(S.template getValue< 0, 0, 1>(), S.template getValue< 0, 0,-1>()); + } + +}; + +template<> +struct D1 +{ + + // the difference opperator + template + static ValueType difference( const ValueType& xp2, const ValueType& xp1, + const ValueType& xm1, const ValueType& xm2 ) { + return ValueType(2./3.)*(xp1 - xm1) + ValueType(1./12.)*(xm2 - xp2) ; + } + + + // random access version + template + static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk) + { + return difference( + grid.getValue(ijk.offsetBy( 2,0,0)), grid.getValue(ijk.offsetBy( 1,0,0)), + grid.getValue(ijk.offsetBy(-1,0,0)), grid.getValue(ijk.offsetBy(-2,0,0)) ); + } + + template + static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk) + { + + return difference( + grid.getValue(ijk.offsetBy( 0, 2, 0)), grid.getValue(ijk.offsetBy( 0, 1, 0)), + grid.getValue(ijk.offsetBy( 0,-1, 0)), grid.getValue(ijk.offsetBy( 0,-2, 0)) ); + } + + template + static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk) + { + + return difference( + grid.getValue(ijk.offsetBy( 0, 0, 2)), grid.getValue(ijk.offsetBy( 0, 0, 1)), + grid.getValue(ijk.offsetBy( 0, 0,-1)), grid.getValue(ijk.offsetBy( 0, 0,-2)) ); + } + + + // stencil access version + template + static typename Stencil::ValueType inX(const Stencil& S) + { + return difference( S.template getValue< 2, 0, 0>(), + S.template getValue< 1, 0, 0>(), + S.template getValue<-1, 0, 0>(), + S.template getValue<-2, 0, 0>() ); + } + + template + static typename Stencil::ValueType inY(const Stencil& S) + { + return difference( S.template getValue< 0, 2, 0>(), + S.template getValue< 0, 1, 0>(), + S.template getValue< 0,-1, 0>(), + S.template getValue< 0,-2, 0>() ); + } + + template + static typename Stencil::ValueType inZ(const Stencil& S) + { + return difference( S.template getValue< 0, 0, 2>(), + S.template getValue< 0, 0, 1>(), + S.template getValue< 0, 0,-1>(), + S.template getValue< 0, 0,-2>() ); + } +}; + +template<> +struct D1 +{ + + // the difference opperator + template + static ValueType difference( const ValueType& xp3, const ValueType& xp2, const ValueType& xp1, + const ValueType& xm1, const ValueType& xm2, const ValueType& xm3 ) + { + return ValueType(3./4.)*(xp1 - xm1) - ValueType(0.15)*(xp2 - xm2) + + ValueType(1./60.)*(xp3-xm3); + } + + + // random access version + template + static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk) + { + return difference( + grid.getValue(ijk.offsetBy( 3,0,0)), grid.getValue(ijk.offsetBy( 2,0,0)), + grid.getValue(ijk.offsetBy( 1,0,0)), grid.getValue(ijk.offsetBy(-1,0,0)), + grid.getValue(ijk.offsetBy(-2,0,0)), grid.getValue(ijk.offsetBy(-3,0,0))); + } + + template + static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk) + { + return difference( + grid.getValue(ijk.offsetBy( 0, 3, 0)), grid.getValue(ijk.offsetBy( 0, 2, 0)), + grid.getValue(ijk.offsetBy( 0, 1, 0)), grid.getValue(ijk.offsetBy( 0,-1, 0)), + grid.getValue(ijk.offsetBy( 0,-2, 0)), grid.getValue(ijk.offsetBy( 0,-3, 0))); + } + + template + static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk) + { + return difference( + grid.getValue(ijk.offsetBy( 0, 0, 3)), grid.getValue(ijk.offsetBy( 0, 0, 2)), + grid.getValue(ijk.offsetBy( 0, 0, 1)), grid.getValue(ijk.offsetBy( 0, 0,-1)), + grid.getValue(ijk.offsetBy( 0, 0,-2)), grid.getValue(ijk.offsetBy( 0, 0,-3))); + } + + // stencil access version + template + static typename Stencil::ValueType inX(const Stencil& S) + { + return difference(S.template getValue< 3, 0, 0>(), + S.template getValue< 2, 0, 0>(), + S.template getValue< 1, 0, 0>(), + S.template getValue<-1, 0, 0>(), + S.template getValue<-2, 0, 0>(), + S.template getValue<-3, 0, 0>()); + } + + template + static typename Stencil::ValueType inY(const Stencil& S) + { + + return difference( S.template getValue< 0, 3, 0>(), + S.template getValue< 0, 2, 0>(), + S.template getValue< 0, 1, 0>(), + S.template getValue< 0,-1, 0>(), + S.template getValue< 0,-2, 0>(), + S.template getValue< 0,-3, 0>()); + } + + template + static typename Stencil::ValueType inZ(const Stencil& S) + { + + return difference( S.template getValue< 0, 0, 3>(), + S.template getValue< 0, 0, 2>(), + S.template getValue< 0, 0, 1>(), + S.template getValue< 0, 0,-1>(), + S.template getValue< 0, 0,-2>(), + S.template getValue< 0, 0,-3>()); + } +}; + + +template<> +struct D1 +{ + + // the difference opperator + template + static ValueType difference(const ValueType& xp1, const ValueType& xp0) { + return xp1 - xp0; + } + + + // random access version + template + static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk) + { + return difference(grid.getValue(ijk.offsetBy(1, 0, 0)), grid.getValue(ijk)); + } + + template + static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk) + { + return difference(grid.getValue(ijk.offsetBy(0, 1, 0)), grid.getValue(ijk)); + } + + template + static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk) + { + return difference(grid.getValue(ijk.offsetBy(0, 0, 1)), grid.getValue(ijk)); + } + + // stencil access version + template + static typename Stencil::ValueType inX(const Stencil& S) + { + return difference(S.template getValue< 1, 0, 0>(), S.template getValue< 0, 0, 0>()); + } + + template + static typename Stencil::ValueType inY(const Stencil& S) + { + return difference(S.template getValue< 0, 1, 0>(), S.template getValue< 0, 0, 0>()); + } + + template + static typename Stencil::ValueType inZ(const Stencil& S) + { + return difference(S.template getValue< 0, 0, 1>(), S.template getValue< 0, 0, 0>()); + } +}; + + +template<> +struct D1 +{ + // the difference opperator + template + static ValueType difference(const ValueType& xp2, const ValueType& xp1, const ValueType& xp0) + { + return ValueType(2)*xp1 -(ValueType(0.5)*xp2 + ValueType(3./2.)*xp0); + } + + + // random access version + template + static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk) + { + return difference( + grid.getValue(ijk.offsetBy(2,0,0)), + grid.getValue(ijk.offsetBy(1,0,0)), + grid.getValue(ijk)); + } + + template + static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk) + { + return difference( + grid.getValue(ijk.offsetBy(0,2,0)), + grid.getValue(ijk.offsetBy(0,1,0)), + grid.getValue(ijk)); + } + + template + static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk) + { + return difference( + grid.getValue(ijk.offsetBy(0,0,2)), + grid.getValue(ijk.offsetBy(0,0,1)), + grid.getValue(ijk)); + } + + + // stencil access version + template + static typename Stencil::ValueType inX(const Stencil& S) + { + return difference( S.template getValue< 2, 0, 0>(), + S.template getValue< 1, 0, 0>(), + S.template getValue< 0, 0, 0>() ); + } + + template + static typename Stencil::ValueType inY(const Stencil& S) + { + return difference( S.template getValue< 0, 2, 0>(), + S.template getValue< 0, 1, 0>(), + S.template getValue< 0, 0, 0>() ); + } + + template + static typename Stencil::ValueType inZ(const Stencil& S) + { + return difference( S.template getValue< 0, 0, 2>(), + S.template getValue< 0, 0, 1>(), + S.template getValue< 0, 0, 0>() ); + } + +}; + + +template<> +struct D1 +{ + + // the difference opperator + template + static ValueType difference(const ValueType& xp3, const ValueType& xp2, + const ValueType& xp1, const ValueType& xp0) + { + return static_cast(xp3/3.0 - 1.5*xp2 + 3.0*xp1 - 11.0*xp0/6.0); + } + + + // random access version + template + static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk) + { + return difference( grid.getValue(ijk.offsetBy(3,0,0)), + grid.getValue(ijk.offsetBy(2,0,0)), + grid.getValue(ijk.offsetBy(1,0,0)), + grid.getValue(ijk) ); + } + + template + static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk) + { + return difference( grid.getValue(ijk.offsetBy(0,3,0)), + grid.getValue(ijk.offsetBy(0,2,0)), + grid.getValue(ijk.offsetBy(0,1,0)), + grid.getValue(ijk) ); + } + + template + static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk) + { + return difference( grid.getValue(ijk.offsetBy(0,0,3)), + grid.getValue(ijk.offsetBy(0,0,2)), + grid.getValue(ijk.offsetBy(0,0,1)), + grid.getValue(ijk) ); + } + + + // stencil access version + template + static typename Stencil::ValueType inX(const Stencil& S) + { + return difference(S.template getValue< 3, 0, 0>(), + S.template getValue< 2, 0, 0>(), + S.template getValue< 1, 0, 0>(), + S.template getValue< 0, 0, 0>() ); + } + + template + static typename Stencil::ValueType inY(const Stencil& S) + { + return difference(S.template getValue< 0, 3, 0>(), + S.template getValue< 0, 2, 0>(), + S.template getValue< 0, 1, 0>(), + S.template getValue< 0, 0, 0>() ); + } + + template + static typename Stencil::ValueType inZ(const Stencil& S) + { + return difference( S.template getValue< 0, 0, 3>(), + S.template getValue< 0, 0, 2>(), + S.template getValue< 0, 0, 1>(), + S.template getValue< 0, 0, 0>() ); + } +}; + + +template<> +struct D1 +{ + + // the difference opperator + template + static ValueType difference(const ValueType& xm1, const ValueType& xm0) { + return -D1::difference(xm1, xm0); + } + + + // random access version + template + static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk) + { + return difference(grid.getValue(ijk.offsetBy(-1,0,0)), grid.getValue(ijk)); + } + + template + static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk) + { + return difference(grid.getValue(ijk.offsetBy(0,-1,0)), grid.getValue(ijk)); + } + + template + static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk) + { + return difference(grid.getValue(ijk.offsetBy(0, 0,-1)), grid.getValue(ijk)); + } + + + // stencil access version + template + static typename Stencil::ValueType inX(const Stencil& S) + { + return difference(S.template getValue<-1, 0, 0>(), S.template getValue< 0, 0, 0>()); + } + + template + static typename Stencil::ValueType inY(const Stencil& S) + { + return difference(S.template getValue< 0,-1, 0>(), S.template getValue< 0, 0, 0>()); + } + + template + static typename Stencil::ValueType inZ(const Stencil& S) + { + return difference(S.template getValue< 0, 0,-1>(), S.template getValue< 0, 0, 0>()); + } +}; + + +template<> +struct D1 +{ + + // the difference opperator + template + static ValueType difference(const ValueType& xm2, const ValueType& xm1, const ValueType& xm0) + { + return -D1::difference(xm2, xm1, xm0); + } + + + // random access version + template + static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk) + { + return difference( grid.getValue(ijk.offsetBy(-2,0,0)), + grid.getValue(ijk.offsetBy(-1,0,0)), + grid.getValue(ijk) ); + } + + template + static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk) + { + return difference( grid.getValue(ijk.offsetBy(0,-2,0)), + grid.getValue(ijk.offsetBy(0,-1,0)), + grid.getValue(ijk) ); + } + + template + static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk) + { + return difference( grid.getValue(ijk.offsetBy(0,0,-2)), + grid.getValue(ijk.offsetBy(0,0,-1)), + grid.getValue(ijk) ); + } + + // stencil access version + template + static typename Stencil::ValueType inX(const Stencil& S) + { + return difference( S.template getValue<-2, 0, 0>(), + S.template getValue<-1, 0, 0>(), + S.template getValue< 0, 0, 0>() ); + } + + template + static typename Stencil::ValueType inY(const Stencil& S) + { + return difference( S.template getValue< 0,-2, 0>(), + S.template getValue< 0,-1, 0>(), + S.template getValue< 0, 0, 0>() ); + } + + template + static typename Stencil::ValueType inZ(const Stencil& S) + { + return difference( S.template getValue< 0, 0,-2>(), + S.template getValue< 0, 0,-1>(), + S.template getValue< 0, 0, 0>() ); + } +}; + + +template<> +struct D1 +{ + + // the difference opperator + template + static ValueType difference(const ValueType& xm3, const ValueType& xm2, + const ValueType& xm1, const ValueType& xm0) + { + return -D1::difference(xm3, xm2, xm1, xm0); + } + + // random access version + template + static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk) + { + return difference( grid.getValue(ijk.offsetBy(-3,0,0)), + grid.getValue(ijk.offsetBy(-2,0,0)), + grid.getValue(ijk.offsetBy(-1,0,0)), + grid.getValue(ijk) ); + } + + template + static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk) + { + return difference( grid.getValue(ijk.offsetBy( 0,-3,0)), + grid.getValue(ijk.offsetBy( 0,-2,0)), + grid.getValue(ijk.offsetBy( 0,-1,0)), + grid.getValue(ijk) ); + } + + template + static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk) + { + return difference( grid.getValue(ijk.offsetBy( 0, 0,-3)), + grid.getValue(ijk.offsetBy( 0, 0,-2)), + grid.getValue(ijk.offsetBy( 0, 0,-1)), + grid.getValue(ijk) ); + } + + // stencil access version + template + static typename Stencil::ValueType inX(const Stencil& S) + { + return difference( S.template getValue<-3, 0, 0>(), + S.template getValue<-2, 0, 0>(), + S.template getValue<-1, 0, 0>(), + S.template getValue< 0, 0, 0>() ); + } + + template + static typename Stencil::ValueType inY(const Stencil& S) + { + return difference( S.template getValue< 0,-3, 0>(), + S.template getValue< 0,-2, 0>(), + S.template getValue< 0,-1, 0>(), + S.template getValue< 0, 0, 0>() ); + } + + template + static typename Stencil::ValueType inZ(const Stencil& S) + { + return difference( S.template getValue< 0, 0,-3>(), + S.template getValue< 0, 0,-2>(), + S.template getValue< 0, 0,-1>(), + S.template getValue< 0, 0, 0>() ); + } + +}; + +template<> +struct D1 +{ + // the difference operator + template + static ValueType difference(const ValueType& xp3, const ValueType& xp2, + const ValueType& xp1, const ValueType& xp0, + const ValueType& xm1, const ValueType& xm2) { + return WENO5(xp3, xp2, xp1, xp0, xm1) + - WENO5(xp2, xp1, xp0, xm1, xm2); + } + + + // random access version + template + static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + ValueType V[6]; + V[0] = grid.getValue(ijk.offsetBy(3,0,0)); + V[1] = grid.getValue(ijk.offsetBy(2,0,0)); + V[2] = grid.getValue(ijk.offsetBy(1,0,0)); + V[3] = grid.getValue(ijk); + V[4] = grid.getValue(ijk.offsetBy(-1,0,0)); + V[5] = grid.getValue(ijk.offsetBy(-2,0,0)); + + return difference(V[0], V[1], V[2], V[3], V[4], V[5]); + } + + template + static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + ValueType V[6]; + V[0] = grid.getValue(ijk.offsetBy(0,3,0)); + V[1] = grid.getValue(ijk.offsetBy(0,2,0)); + V[2] = grid.getValue(ijk.offsetBy(0,1,0)); + V[3] = grid.getValue(ijk); + V[4] = grid.getValue(ijk.offsetBy(0,-1,0)); + V[5] = grid.getValue(ijk.offsetBy(0,-2,0)); + + return difference(V[0], V[1], V[2], V[3], V[4], V[5]); + } + + template + static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + ValueType V[6]; + V[0] = grid.getValue(ijk.offsetBy(0,0,3)); + V[1] = grid.getValue(ijk.offsetBy(0,0,2)); + V[2] = grid.getValue(ijk.offsetBy(0,0,1)); + V[3] = grid.getValue(ijk); + V[4] = grid.getValue(ijk.offsetBy(0,0,-1)); + V[5] = grid.getValue(ijk.offsetBy(0,0,-2)); + + return difference(V[0], V[1], V[2], V[3], V[4], V[5]); + } + + // stencil access version + template + static typename Stencil::ValueType inX(const Stencil& S) + { + + return static_cast(difference( + S.template getValue< 3, 0, 0>(), + S.template getValue< 2, 0, 0>(), + S.template getValue< 1, 0, 0>(), + S.template getValue< 0, 0, 0>(), + S.template getValue<-1, 0, 0>(), + S.template getValue<-2, 0, 0>() )); + + } + + template + static typename Stencil::ValueType inY(const Stencil& S) + { + return static_cast(difference( + S.template getValue< 0, 3, 0>(), + S.template getValue< 0, 2, 0>(), + S.template getValue< 0, 1, 0>(), + S.template getValue< 0, 0, 0>(), + S.template getValue< 0,-1, 0>(), + S.template getValue< 0,-2, 0>() )); + } + + template + static typename Stencil::ValueType inZ(const Stencil& S) + { + return static_cast(difference( + S.template getValue< 0, 0, 3>(), + S.template getValue< 0, 0, 2>(), + S.template getValue< 0, 0, 1>(), + S.template getValue< 0, 0, 0>(), + S.template getValue< 0, 0,-1>(), + S.template getValue< 0, 0,-2>() )); + } +}; + +template<> +struct D1 +{ + + // the difference opperator + template + static ValueType difference(const ValueType& xp3, const ValueType& xp2, + const ValueType& xp1, const ValueType& xp0, + const ValueType& xm1, const ValueType& xm2) { + return WENO5(xp3 - xp2, xp2 - xp1, xp1 - xp0, xp0-xm1, xm1-xm2); + } + + // random access version + template + static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + ValueType V[6]; + V[0] = grid.getValue(ijk.offsetBy(3,0,0)); + V[1] = grid.getValue(ijk.offsetBy(2,0,0)); + V[2] = grid.getValue(ijk.offsetBy(1,0,0)); + V[3] = grid.getValue(ijk); + V[4] = grid.getValue(ijk.offsetBy(-1,0,0)); + V[5] = grid.getValue(ijk.offsetBy(-2,0,0)); + + return difference(V[0], V[1], V[2], V[3], V[4], V[5]); + + } + + template + static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + ValueType V[6]; + V[0] = grid.getValue(ijk.offsetBy(0,3,0)); + V[1] = grid.getValue(ijk.offsetBy(0,2,0)); + V[2] = grid.getValue(ijk.offsetBy(0,1,0)); + V[3] = grid.getValue(ijk); + V[4] = grid.getValue(ijk.offsetBy(0,-1,0)); + V[5] = grid.getValue(ijk.offsetBy(0,-2,0)); + + return difference(V[0], V[1], V[2], V[3], V[4], V[5]); + } + + template + static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + ValueType V[6]; + V[0] = grid.getValue(ijk.offsetBy(0,0,3)); + V[1] = grid.getValue(ijk.offsetBy(0,0,2)); + V[2] = grid.getValue(ijk.offsetBy(0,0,1)); + V[3] = grid.getValue(ijk); + V[4] = grid.getValue(ijk.offsetBy(0,0,-1)); + V[5] = grid.getValue(ijk.offsetBy(0,0,-2)); + + return difference(V[0], V[1], V[2], V[3], V[4], V[5]); + } + + // stencil access version + template + static typename Stencil::ValueType inX(const Stencil& S) + { + + return difference( S.template getValue< 3, 0, 0>(), + S.template getValue< 2, 0, 0>(), + S.template getValue< 1, 0, 0>(), + S.template getValue< 0, 0, 0>(), + S.template getValue<-1, 0, 0>(), + S.template getValue<-2, 0, 0>() ); + + } + + template + static typename Stencil::ValueType inY(const Stencil& S) + { + return difference( S.template getValue< 0, 3, 0>(), + S.template getValue< 0, 2, 0>(), + S.template getValue< 0, 1, 0>(), + S.template getValue< 0, 0, 0>(), + S.template getValue< 0,-1, 0>(), + S.template getValue< 0,-2, 0>() ); + } + + template + static typename Stencil::ValueType inZ(const Stencil& S) + { + + return difference( S.template getValue< 0, 0, 3>(), + S.template getValue< 0, 0, 2>(), + S.template getValue< 0, 0, 1>(), + S.template getValue< 0, 0, 0>(), + S.template getValue< 0, 0,-1>(), + S.template getValue< 0, 0,-2>() ); + } + +}; + +template<> +struct D1 +{ + + template + static ValueType difference(const ValueType& xm3, const ValueType& xm2, const ValueType& xm1, + const ValueType& xm0, const ValueType& xp1, const ValueType& xp2) + { + return -D1::difference(xm3, xm2, xm1, xm0, xp1, xp2); + } + + + // random access version + template + static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + ValueType V[6]; + V[0] = grid.getValue(ijk.offsetBy(-3,0,0)); + V[1] = grid.getValue(ijk.offsetBy(-2,0,0)); + V[2] = grid.getValue(ijk.offsetBy(-1,0,0)); + V[3] = grid.getValue(ijk); + V[4] = grid.getValue(ijk.offsetBy(1,0,0)); + V[5] = grid.getValue(ijk.offsetBy(2,0,0)); + + return difference(V[0], V[1], V[2], V[3], V[4], V[5]); + } + + template + static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + ValueType V[6]; + V[0] = grid.getValue(ijk.offsetBy(0,-3,0)); + V[1] = grid.getValue(ijk.offsetBy(0,-2,0)); + V[2] = grid.getValue(ijk.offsetBy(0,-1,0)); + V[3] = grid.getValue(ijk); + V[4] = grid.getValue(ijk.offsetBy(0,1,0)); + V[5] = grid.getValue(ijk.offsetBy(0,2,0)); + + return difference(V[0], V[1], V[2], V[3], V[4], V[5]); + } + + template + static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + ValueType V[6]; + V[0] = grid.getValue(ijk.offsetBy(0,0,-3)); + V[1] = grid.getValue(ijk.offsetBy(0,0,-2)); + V[2] = grid.getValue(ijk.offsetBy(0,0,-1)); + V[3] = grid.getValue(ijk); + V[4] = grid.getValue(ijk.offsetBy(0,0,1)); + V[5] = grid.getValue(ijk.offsetBy(0,0,2)); + + return difference(V[0], V[1], V[2], V[3], V[4], V[5]); + } + + // stencil access version + template + static typename Stencil::ValueType inX(const Stencil& S) + { + typedef typename Stencil::ValueType ValueType; + ValueType V[6]; + V[0] = S.template getValue<-3, 0, 0>(); + V[1] = S.template getValue<-2, 0, 0>(); + V[2] = S.template getValue<-1, 0, 0>(); + V[3] = S.template getValue< 0, 0, 0>(); + V[4] = S.template getValue< 1, 0, 0>(); + V[5] = S.template getValue< 2, 0, 0>(); + + return difference(V[0], V[1], V[2], V[3], V[4], V[5]); + } + + template + static typename Stencil::ValueType inY(const Stencil& S) + { + typedef typename Stencil::ValueType ValueType; + ValueType V[6]; + V[0] = S.template getValue< 0,-3, 0>(); + V[1] = S.template getValue< 0,-2, 0>(); + V[2] = S.template getValue< 0,-1, 0>(); + V[3] = S.template getValue< 0, 0, 0>(); + V[4] = S.template getValue< 0, 1, 0>(); + V[5] = S.template getValue< 0, 2, 0>(); + + return difference(V[0], V[1], V[2], V[3], V[4], V[5]); + } + + template + static typename Stencil::ValueType inZ(const Stencil& S) + { + typedef typename Stencil::ValueType ValueType; + ValueType V[6]; + V[0] = S.template getValue< 0, 0,-3>(); + V[1] = S.template getValue< 0, 0,-2>(); + V[2] = S.template getValue< 0, 0,-1>(); + V[3] = S.template getValue< 0, 0, 0>(); + V[4] = S.template getValue< 0, 0, 1>(); + V[5] = S.template getValue< 0, 0, 2>(); + + return difference(V[0], V[1], V[2], V[3], V[4], V[5]); + } +}; + + +template<> +struct D1 +{ + template + static ValueType difference(const ValueType& xm3, const ValueType& xm2, const ValueType& xm1, + const ValueType& xm0, const ValueType& xp1, const ValueType& xp2) + { + return -D1::difference(xm3, xm2, xm1, xm0, xp1, xp2); + } + + // random access version + template + static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + ValueType V[6]; + V[0] = grid.getValue(ijk.offsetBy(-3,0,0)); + V[1] = grid.getValue(ijk.offsetBy(-2,0,0)); + V[2] = grid.getValue(ijk.offsetBy(-1,0,0)); + V[3] = grid.getValue(ijk); + V[4] = grid.getValue(ijk.offsetBy(1,0,0)); + V[5] = grid.getValue(ijk.offsetBy(2,0,0)); + + return difference(V[0], V[1], V[2], V[3], V[4], V[5]); + } + + template + static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + ValueType V[6]; + V[0] = grid.getValue(ijk.offsetBy(0,-3,0)); + V[1] = grid.getValue(ijk.offsetBy(0,-2,0)); + V[2] = grid.getValue(ijk.offsetBy(0,-1,0)); + V[3] = grid.getValue(ijk); + V[4] = grid.getValue(ijk.offsetBy(0,1,0)); + V[5] = grid.getValue(ijk.offsetBy(0,2,0)); + + return difference(V[0], V[1], V[2], V[3], V[4], V[5]); + } + + template + static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + ValueType V[6]; + V[0] = grid.getValue(ijk.offsetBy(0,0,-3)); + V[1] = grid.getValue(ijk.offsetBy(0,0,-2)); + V[2] = grid.getValue(ijk.offsetBy(0,0,-1)); + V[3] = grid.getValue(ijk); + V[4] = grid.getValue(ijk.offsetBy(0,0,1)); + V[5] = grid.getValue(ijk.offsetBy(0,0,2)); + + return difference(V[0], V[1], V[2], V[3], V[4], V[5]); + } + + // stencil access version + template + static typename Stencil::ValueType inX(const Stencil& S) + { + typedef typename Stencil::ValueType ValueType; + ValueType V[6]; + V[0] = S.template getValue<-3, 0, 0>(); + V[1] = S.template getValue<-2, 0, 0>(); + V[2] = S.template getValue<-1, 0, 0>(); + V[3] = S.template getValue< 0, 0, 0>(); + V[4] = S.template getValue< 1, 0, 0>(); + V[5] = S.template getValue< 2, 0, 0>(); + + return difference(V[0], V[1], V[2], V[3], V[4], V[5]); + } + + template + static typename Stencil::ValueType inY(const Stencil& S) + { + typedef typename Stencil::ValueType ValueType; + ValueType V[6]; + V[0] = S.template getValue< 0,-3, 0>(); + V[1] = S.template getValue< 0,-2, 0>(); + V[2] = S.template getValue< 0,-1, 0>(); + V[3] = S.template getValue< 0, 0, 0>(); + V[4] = S.template getValue< 0, 1, 0>(); + V[5] = S.template getValue< 0, 2, 0>(); + + return difference(V[0], V[1], V[2], V[3], V[4], V[5]); + } + + template + static typename Stencil::ValueType inZ(const Stencil& S) + { + typedef typename Stencil::ValueType ValueType; + ValueType V[6]; + V[0] = S.template getValue< 0, 0,-3>(); + V[1] = S.template getValue< 0, 0,-2>(); + V[2] = S.template getValue< 0, 0,-1>(); + V[3] = S.template getValue< 0, 0, 0>(); + V[4] = S.template getValue< 0, 0, 1>(); + V[5] = S.template getValue< 0, 0, 2>(); + + return difference(V[0], V[1], V[2], V[3], V[4], V[5]); + } +}; + + +template +struct D1Vec +{ + // random access version + template + static typename Accessor::ValueType::value_type + inX(const Accessor& grid, const Coord& ijk, int n) + { + return D1::inX(grid, ijk)[n]; + } + + template + static typename Accessor::ValueType::value_type + inY(const Accessor& grid, const Coord& ijk, int n) + { + return D1::inY(grid, ijk)[n]; + } + template + static typename Accessor::ValueType::value_type + inZ(const Accessor& grid, const Coord& ijk, int n) + { + return D1::inZ(grid, ijk)[n]; + } + + + // stencil access version + template + static typename Stencil::ValueType::value_type inX(const Stencil& S, int n) + { + return D1::inX(S)[n]; + } + + template + static typename Stencil::ValueType::value_type inY(const Stencil& S, int n) + { + return D1::inY(S)[n]; + } + + template + static typename Stencil::ValueType::value_type inZ(const Stencil& S, int n) + { + return D1::inZ(S)[n]; + } +}; + + +template<> +struct D1Vec +{ + + // random access version + template + static typename Accessor::ValueType::value_type + inX(const Accessor& grid, const Coord& ijk, int n) + { + return D1::difference( grid.getValue(ijk.offsetBy( 1, 0, 0))[n], + grid.getValue(ijk.offsetBy(-1, 0, 0))[n] ); + } + + template + static typename Accessor::ValueType::value_type + inY(const Accessor& grid, const Coord& ijk, int n) + { + return D1::difference( grid.getValue(ijk.offsetBy(0, 1, 0))[n], + grid.getValue(ijk.offsetBy(0,-1, 0))[n] ); + } + + template + static typename Accessor::ValueType::value_type + inZ(const Accessor& grid, const Coord& ijk, int n) + { + return D1::difference( grid.getValue(ijk.offsetBy(0, 0, 1))[n], + grid.getValue(ijk.offsetBy(0, 0,-1))[n] ); + } + + // stencil access version + template + static typename Stencil::ValueType::value_type inX(const Stencil& S, int n) + { + return D1::difference( S.template getValue< 1, 0, 0>()[n], + S.template getValue<-1, 0, 0>()[n] ); + } + + template + static typename Stencil::ValueType::value_type inY(const Stencil& S, int n) + { + return D1::difference( S.template getValue< 0, 1, 0>()[n], + S.template getValue< 0,-1, 0>()[n] ); + } + + template + static typename Stencil::ValueType::value_type inZ(const Stencil& S, int n) + { + return D1::difference( S.template getValue< 0, 0, 1>()[n], + S.template getValue< 0, 0,-1>()[n] ); + } +}; + +template<> +struct D1Vec +{ + + // random access version + template + static typename Accessor::ValueType::value_type + inX(const Accessor& grid, const Coord& ijk, int n) + { + return D1::difference( grid.getValue(ijk.offsetBy( 1, 0, 0))[n] , + grid.getValue(ijk.offsetBy(-1, 0, 0))[n] ); + } + + template + static typename Accessor::ValueType::value_type + inY(const Accessor& grid, const Coord& ijk, int n) + { + return D1::difference( grid.getValue(ijk.offsetBy(0, 1, 0))[n] , + grid.getValue(ijk.offsetBy(0,-1, 0))[n] ); + } + + template + static typename Accessor::ValueType::value_type + inZ(const Accessor& grid, const Coord& ijk, int n) + { + return D1::difference( grid.getValue(ijk.offsetBy(0, 0, 1))[n] , + grid.getValue(ijk.offsetBy(0, 0,-1))[n] ); + } + + + // stencil access version + template + static typename Stencil::ValueType::value_type inX(const Stencil& S, int n) + { + return D1::difference( S.template getValue< 1, 0, 0>()[n], + S.template getValue<-1, 0, 0>()[n] ); + } + + template + static typename Stencil::ValueType::value_type inY(const Stencil& S, int n) + { + return D1::difference( S.template getValue< 0, 1, 0>()[n], + S.template getValue< 0,-1, 0>()[n] ); + } + + template + static typename Stencil::ValueType::value_type inZ(const Stencil& S, int n) + { + return D1::difference( S.template getValue< 0, 0, 1>()[n], + S.template getValue< 0, 0,-1>()[n] ); + } +}; + + +template<> +struct D1Vec { + // typedef typename Accessor::ValueType::value_type value_type; + + + // random access version + template + static typename Accessor::ValueType::value_type + inX(const Accessor& grid, const Coord& ijk, int n) + { + return D1::difference( + grid.getValue(ijk.offsetBy(2, 0, 0))[n], grid.getValue(ijk.offsetBy( 1, 0, 0))[n], + grid.getValue(ijk.offsetBy(-1,0, 0))[n], grid.getValue(ijk.offsetBy(-2, 0, 0))[n]); + } + + template + static typename Accessor::ValueType::value_type + inY(const Accessor& grid, const Coord& ijk, int n) + { + return D1::difference( + grid.getValue(ijk.offsetBy( 0, 2, 0))[n], grid.getValue(ijk.offsetBy( 0, 1, 0))[n], + grid.getValue(ijk.offsetBy( 0,-1, 0))[n], grid.getValue(ijk.offsetBy( 0,-2, 0))[n]); + } + + template + static typename Accessor::ValueType::value_type + inZ(const Accessor& grid, const Coord& ijk, int n) + { + return D1::difference( + grid.getValue(ijk.offsetBy(0,0, 2))[n], grid.getValue(ijk.offsetBy( 0, 0, 1))[n], + grid.getValue(ijk.offsetBy(0,0,-1))[n], grid.getValue(ijk.offsetBy( 0, 0,-2))[n]); + } + + // stencil access version + template + static typename Stencil::ValueType::value_type inX(const Stencil& S, int n) + { + return D1::difference( + S.template getValue< 2, 0, 0>()[n], S.template getValue< 1, 0, 0>()[n], + S.template getValue<-1, 0, 0>()[n], S.template getValue<-2, 0, 0>()[n] ); + } + + template + static typename Stencil::ValueType::value_type inY(const Stencil& S, int n) + { + return D1::difference( + S.template getValue< 0, 2, 0>()[n], S.template getValue< 0, 1, 0>()[n], + S.template getValue< 0,-1, 0>()[n], S.template getValue< 0,-2, 0>()[n]); + } + + template + static typename Stencil::ValueType::value_type inZ(const Stencil& S, int n) + { + return D1::difference( + S.template getValue< 0, 0, 2>()[n], S.template getValue< 0, 0, 1>()[n], + S.template getValue< 0, 0,-1>()[n], S.template getValue< 0, 0,-2>()[n]); + } +}; + + +template<> +struct D1Vec +{ + //typedef typename Accessor::ValueType::value_type::value_type ValueType; + + // random access version + template + static typename Accessor::ValueType::value_type + inX(const Accessor& grid, const Coord& ijk, int n) + { + return D1::difference( + grid.getValue(ijk.offsetBy( 3, 0, 0))[n], grid.getValue(ijk.offsetBy( 2, 0, 0))[n], + grid.getValue(ijk.offsetBy( 1, 0, 0))[n], grid.getValue(ijk.offsetBy(-1, 0, 0))[n], + grid.getValue(ijk.offsetBy(-2, 0, 0))[n], grid.getValue(ijk.offsetBy(-3, 0, 0))[n] ); + } + + template + static typename Accessor::ValueType::value_type + inY(const Accessor& grid, const Coord& ijk, int n) + { + return D1::difference( + grid.getValue(ijk.offsetBy( 0, 3, 0))[n], grid.getValue(ijk.offsetBy( 0, 2, 0))[n], + grid.getValue(ijk.offsetBy( 0, 1, 0))[n], grid.getValue(ijk.offsetBy( 0,-1, 0))[n], + grid.getValue(ijk.offsetBy( 0,-2, 0))[n], grid.getValue(ijk.offsetBy( 0,-3, 0))[n] ); + } + + template + static typename Accessor::ValueType::value_type + inZ(const Accessor& grid, const Coord& ijk, int n) + { + return D1::difference( + grid.getValue(ijk.offsetBy( 0, 0, 3))[n], grid.getValue(ijk.offsetBy( 0, 0, 2))[n], + grid.getValue(ijk.offsetBy( 0, 0, 1))[n], grid.getValue(ijk.offsetBy( 0, 0,-1))[n], + grid.getValue(ijk.offsetBy( 0, 0,-2))[n], grid.getValue(ijk.offsetBy( 0, 0,-3))[n] ); + } + + + // stencil access version + template + static typename Stencil::ValueType::value_type inX(const Stencil& S, int n) + { + return D1::difference( + S.template getValue< 3, 0, 0>()[n], S.template getValue< 2, 0, 0>()[n], + S.template getValue< 1, 0, 0>()[n], S.template getValue<-1, 0, 0>()[n], + S.template getValue<-2, 0, 0>()[n], S.template getValue<-3, 0, 0>()[n] ); + } + + template + static typename Stencil::ValueType::value_type inY(const Stencil& S, int n) + { + return D1::difference( + S.template getValue< 0, 3, 0>()[n], S.template getValue< 0, 2, 0>()[n], + S.template getValue< 0, 1, 0>()[n], S.template getValue< 0,-1, 0>()[n], + S.template getValue< 0,-2, 0>()[n], S.template getValue< 0,-3, 0>()[n] ); + } + + template + static typename Stencil::ValueType::value_type inZ(const Stencil& S, int n) + { + return D1::difference( + S.template getValue< 0, 0, 3>()[n], S.template getValue< 0, 0, 2>()[n], + S.template getValue< 0, 0, 1>()[n], S.template getValue< 0, 0,-1>()[n], + S.template getValue< 0, 0,-2>()[n], S.template getValue< 0, 0,-3>()[n] ); + } +}; + +template +struct D2 +{ + + template + static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk); + template + static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk); + template + static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk); + + // cross derivatives + template + static typename Accessor::ValueType inXandY(const Accessor& grid, const Coord& ijk); + + template + static typename Accessor::ValueType inXandZ(const Accessor& grid, const Coord& ijk); + + template + static typename Accessor::ValueType inYandZ(const Accessor& grid, const Coord& ijk); + + + // stencil access version + template + static typename Stencil::ValueType inX(const Stencil& S); + template + static typename Stencil::ValueType inY(const Stencil& S); + template + static typename Stencil::ValueType inZ(const Stencil& S); + + // cross derivatives + template + static typename Stencil::ValueType inXandY(const Stencil& S); + + template + static typename Stencil::ValueType inXandZ(const Stencil& S); + + template + static typename Stencil::ValueType inYandZ(const Stencil& S); +}; + +template<> +struct D2 +{ + + // the difference opperator + template + static ValueType difference(const ValueType& xp1, const ValueType& xp0, const ValueType& xm1) + { + return xp1 + xm1 - ValueType(2)*xp0; + } + + template + static ValueType crossdifference(const ValueType& xpyp, const ValueType& xpym, + const ValueType& xmyp, const ValueType& xmym) + { + return ValueType(0.25)*(xpyp + xmym - xpym - xmyp); + } + + // random access version + template + static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk) + { + return difference( grid.getValue(ijk.offsetBy( 1,0,0)), grid.getValue(ijk), + grid.getValue(ijk.offsetBy(-1,0,0)) ); + } + + template + static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk) + { + + return difference( grid.getValue(ijk.offsetBy(0, 1,0)), grid.getValue(ijk), + grid.getValue(ijk.offsetBy(0,-1,0)) ); + } + + template + static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk) + { + return difference( grid.getValue(ijk.offsetBy( 0,0, 1)), grid.getValue(ijk), + grid.getValue(ijk.offsetBy( 0,0,-1)) ); + } + + // cross derivatives + template + static typename Accessor::ValueType inXandY(const Accessor& grid, const Coord& ijk) + { + return crossdifference( + grid.getValue(ijk.offsetBy(1, 1,0)), grid.getValue(ijk.offsetBy( 1,-1,0)), + grid.getValue(ijk.offsetBy(-1,1,0)), grid.getValue(ijk.offsetBy(-1,-1,0))); + + } + + template + static typename Accessor::ValueType inXandZ(const Accessor& grid, const Coord& ijk) + { + return crossdifference( + grid.getValue(ijk.offsetBy(1,0, 1)), grid.getValue(ijk.offsetBy(1, 0,-1)), + grid.getValue(ijk.offsetBy(-1,0,1)), grid.getValue(ijk.offsetBy(-1,0,-1)) ); + } + + template + static typename Accessor::ValueType inYandZ(const Accessor& grid, const Coord& ijk) + { + return crossdifference( + grid.getValue(ijk.offsetBy(0, 1,1)), grid.getValue(ijk.offsetBy(0, 1,-1)), + grid.getValue(ijk.offsetBy(0,-1,1)), grid.getValue(ijk.offsetBy(0,-1,-1)) ); + } + + + // stencil access version + template + static typename Stencil::ValueType inX(const Stencil& S) + { + return difference( S.template getValue< 1, 0, 0>(), S.template getValue< 0, 0, 0>(), + S.template getValue<-1, 0, 0>() ); + } + + template + static typename Stencil::ValueType inY(const Stencil& S) + { + return difference( S.template getValue< 0, 1, 0>(), S.template getValue< 0, 0, 0>(), + S.template getValue< 0,-1, 0>() ); + } + + template + static typename Stencil::ValueType inZ(const Stencil& S) + { + return difference( S.template getValue< 0, 0, 1>(), S.template getValue< 0, 0, 0>(), + S.template getValue< 0, 0,-1>() ); + } + + // cross derivatives + template + static typename Stencil::ValueType inXandY(const Stencil& S) + { + return crossdifference(S.template getValue< 1, 1, 0>(), S.template getValue< 1,-1, 0>(), + S.template getValue<-1, 1, 0>(), S.template getValue<-1,-1, 0>() ); + } + + template + static typename Stencil::ValueType inXandZ(const Stencil& S) + { + return crossdifference(S.template getValue< 1, 0, 1>(), S.template getValue< 1, 0,-1>(), + S.template getValue<-1, 0, 1>(), S.template getValue<-1, 0,-1>() ); + } + + template + static typename Stencil::ValueType inYandZ(const Stencil& S) + { + return crossdifference(S.template getValue< 0, 1, 1>(), S.template getValue< 0, 1,-1>(), + S.template getValue< 0,-1, 1>(), S.template getValue< 0,-1,-1>() ); + } +}; + + +template<> +struct D2 +{ + + // the difference opperator + template + static ValueType difference(const ValueType& xp2, const ValueType& xp1, const ValueType& xp0, + const ValueType& xm1, const ValueType& xm2) { + return ValueType(-1./12.)*(xp2 + xm2) + ValueType(4./3.)*(xp1 + xm1) -ValueType(2.5)*xp0; + } + + template + static ValueType crossdifference(const ValueType& xp2yp2, const ValueType& xp2yp1, + const ValueType& xp2ym1, const ValueType& xp2ym2, + const ValueType& xp1yp2, const ValueType& xp1yp1, + const ValueType& xp1ym1, const ValueType& xp1ym2, + const ValueType& xm2yp2, const ValueType& xm2yp1, + const ValueType& xm2ym1, const ValueType& xm2ym2, + const ValueType& xm1yp2, const ValueType& xm1yp1, + const ValueType& xm1ym1, const ValueType& xm1ym2 ) { + ValueType tmp1 = + ValueType(2./3.0)*(xp1yp1 - xm1yp1 - xp1ym1 + xm1ym1)- + ValueType(1./12.)*(xp2yp1 - xm2yp1 - xp2ym1 + xm2ym1); + ValueType tmp2 = + ValueType(2./3.0)*(xp1yp2 - xm1yp2 - xp1ym2 + xm1ym2)- + ValueType(1./12.)*(xp2yp2 - xm2yp2 - xp2ym2 + xm2ym2); + + return ValueType(2./3.)*tmp1 - ValueType(1./12.)*tmp2; + } + + + + // random access version + template + static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk) + { + return difference( + grid.getValue(ijk.offsetBy(2,0,0)), grid.getValue(ijk.offsetBy( 1,0,0)), + grid.getValue(ijk), + grid.getValue(ijk.offsetBy(-1,0,0)), grid.getValue(ijk.offsetBy(-2, 0, 0))); + } + + template + static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk) + { + return difference( + grid.getValue(ijk.offsetBy(0, 2,0)), grid.getValue(ijk.offsetBy(0, 1,0)), + grid.getValue(ijk), + grid.getValue(ijk.offsetBy(0,-1,0)), grid.getValue(ijk.offsetBy(0,-2, 0))); + } + + template + static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk) + { + return difference( + grid.getValue(ijk.offsetBy(0,0, 2)), grid.getValue(ijk.offsetBy(0, 0,1)), + grid.getValue(ijk), + grid.getValue(ijk.offsetBy(0,0,-1)), grid.getValue(ijk.offsetBy(0,0,-2))); + } + + // cross derivatives + template + static typename Accessor::ValueType inXandY(const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + typename Accessor::ValueType tmp1 = + D1::inX(grid, ijk.offsetBy(0, 1, 0)) - + D1::inX(grid, ijk.offsetBy(0,-1, 0)); + typename Accessor::ValueType tmp2 = + D1::inX(grid, ijk.offsetBy(0, 2, 0)) - + D1::inX(grid, ijk.offsetBy(0,-2, 0)); + return ValueType(2./3.)*tmp1 - ValueType(1./12.)*tmp2; + } + + template + static typename Accessor::ValueType inXandZ(const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + typename Accessor::ValueType tmp1 = + D1::inX(grid, ijk.offsetBy(0, 0, 1)) - + D1::inX(grid, ijk.offsetBy(0, 0,-1)); + typename Accessor::ValueType tmp2 = + D1::inX(grid, ijk.offsetBy(0, 0, 2)) - + D1::inX(grid, ijk.offsetBy(0, 0,-2)); + return ValueType(2./3.)*tmp1 - ValueType(1./12.)*tmp2; + } + + template + static typename Accessor::ValueType inYandZ(const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + typename Accessor::ValueType tmp1 = + D1::inY(grid, ijk.offsetBy(0, 0, 1)) - + D1::inY(grid, ijk.offsetBy(0, 0,-1)); + typename Accessor::ValueType tmp2 = + D1::inY(grid, ijk.offsetBy(0, 0, 2)) - + D1::inY(grid, ijk.offsetBy(0, 0,-2)); + return ValueType(2./3.)*tmp1 - ValueType(1./12.)*tmp2; + } + + + // stencil access version + template + static typename Stencil::ValueType inX(const Stencil& S) + { + return difference(S.template getValue< 2, 0, 0>(), S.template getValue< 1, 0, 0>(), + S.template getValue< 0, 0, 0>(), + S.template getValue<-1, 0, 0>(), S.template getValue<-2, 0, 0>() ); + } + + template + static typename Stencil::ValueType inY(const Stencil& S) + { + return difference(S.template getValue< 0, 2, 0>(), S.template getValue< 0, 1, 0>(), + S.template getValue< 0, 0, 0>(), + S.template getValue< 0,-1, 0>(), S.template getValue< 0,-2, 0>() ); + } + + template + static typename Stencil::ValueType inZ(const Stencil& S) + { + return difference(S.template getValue< 0, 0, 2>(), S.template getValue< 0, 0, 1>(), + S.template getValue< 0, 0, 0>(), + S.template getValue< 0, 0,-1>(), S.template getValue< 0, 0,-2>() ); + } + + // cross derivatives + template + static typename Stencil::ValueType inXandY(const Stencil& S) + { + return crossdifference( + S.template getValue< 2, 2, 0>(), S.template getValue< 2, 1, 0>(), + S.template getValue< 2,-1, 0>(), S.template getValue< 2,-2, 0>(), + S.template getValue< 1, 2, 0>(), S.template getValue< 1, 1, 0>(), + S.template getValue< 1,-1, 0>(), S.template getValue< 1,-2, 0>(), + S.template getValue<-2, 2, 0>(), S.template getValue<-2, 1, 0>(), + S.template getValue<-2,-1, 0>(), S.template getValue<-2,-2, 0>(), + S.template getValue<-1, 2, 0>(), S.template getValue<-1, 1, 0>(), + S.template getValue<-1,-1, 0>(), S.template getValue<-1,-2, 0>() ); + } + + template + static typename Stencil::ValueType inXandZ(const Stencil& S) + { + return crossdifference( + S.template getValue< 2, 0, 2>(), S.template getValue< 2, 0, 1>(), + S.template getValue< 2, 0,-1>(), S.template getValue< 2, 0,-2>(), + S.template getValue< 1, 0, 2>(), S.template getValue< 1, 0, 1>(), + S.template getValue< 1, 0,-1>(), S.template getValue< 1, 0,-2>(), + S.template getValue<-2, 0, 2>(), S.template getValue<-2, 0, 1>(), + S.template getValue<-2, 0,-1>(), S.template getValue<-2, 0,-2>(), + S.template getValue<-1, 0, 2>(), S.template getValue<-1, 0, 1>(), + S.template getValue<-1, 0,-1>(), S.template getValue<-1, 0,-2>() ); + } + + template + static typename Stencil::ValueType inYandZ(const Stencil& S) + { + return crossdifference( + S.template getValue< 0, 2, 2>(), S.template getValue< 0, 2, 1>(), + S.template getValue< 0, 2,-1>(), S.template getValue< 0, 2,-2>(), + S.template getValue< 0, 1, 2>(), S.template getValue< 0, 1, 1>(), + S.template getValue< 0, 1,-1>(), S.template getValue< 0, 1,-2>(), + S.template getValue< 0,-2, 2>(), S.template getValue< 0,-2, 1>(), + S.template getValue< 0,-2,-1>(), S.template getValue< 0,-2,-2>(), + S.template getValue< 0,-1, 2>(), S.template getValue< 0,-1, 1>(), + S.template getValue< 0,-1,-1>(), S.template getValue< 0,-1,-2>() ); + } +}; + + +template<> +struct D2 +{ + // the difference opperator + template + static ValueType difference(const ValueType& xp3, const ValueType& xp2, const ValueType& xp1, + const ValueType& xp0, + const ValueType& xm1, const ValueType& xm2, const ValueType& xm3) + { + return ValueType(1./90.)*(xp3 + xm3) - ValueType(3./20.)*(xp2 + xm2) + + ValueType(1.5)*(xp1 + xm1) - ValueType(49./18.)*xp0; + } + + template + static ValueType crossdifference( const ValueType& xp1yp1,const ValueType& xm1yp1, + const ValueType& xp1ym1,const ValueType& xm1ym1, + const ValueType& xp2yp1,const ValueType& xm2yp1, + const ValueType& xp2ym1,const ValueType& xm2ym1, + const ValueType& xp3yp1,const ValueType& xm3yp1, + const ValueType& xp3ym1,const ValueType& xm3ym1, + const ValueType& xp1yp2,const ValueType& xm1yp2, + const ValueType& xp1ym2,const ValueType& xm1ym2, + const ValueType& xp2yp2,const ValueType& xm2yp2, + const ValueType& xp2ym2,const ValueType& xm2ym2, + const ValueType& xp3yp2,const ValueType& xm3yp2, + const ValueType& xp3ym2,const ValueType& xm3ym2, + const ValueType& xp1yp3,const ValueType& xm1yp3, + const ValueType& xp1ym3,const ValueType& xm1ym3, + const ValueType& xp2yp3,const ValueType& xm2yp3, + const ValueType& xp2ym3,const ValueType& xm2ym3, + const ValueType& xp3yp3,const ValueType& xm3yp3, + const ValueType& xp3ym3,const ValueType& xm3ym3 ) + { + ValueType tmp1 = + ValueType(0.7500)*(xp1yp1 - xm1yp1 - xp1ym1 + xm1ym1) - + ValueType(0.1500)*(xp2yp1 - xm2yp1 - xp2ym1 + xm2ym1) + + ValueType(1./60.)*(xp3yp1 - xm3yp1 - xp3ym1 + xm3ym1); + + ValueType tmp2 = + ValueType(0.7500)*(xp1yp2 - xm1yp2 - xp1ym2 + xm1ym2) - + ValueType(0.1500)*(xp2yp2 - xm2yp2 - xp2ym2 + xm2ym2) + + ValueType(1./60.)*(xp3yp2 - xm3yp2 - xp3ym2 + xm3ym2); + + ValueType tmp3 = + ValueType(0.7500)*(xp1yp3 - xm1yp3 - xp1ym3 + xm1ym3) - + ValueType(0.1500)*(xp2yp3 - xm2yp3 - xp2ym3 + xm2ym3) + + ValueType(1./60.)*(xp3yp3 - xm3yp3 - xp3ym3 + xm3ym3); + + return ValueType(0.75)*tmp1 - ValueType(0.15)*tmp2 + ValueType(1./60)*tmp3; + } + + // random access version + + template + static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk) + { + return difference( + grid.getValue(ijk.offsetBy( 3, 0, 0)), grid.getValue(ijk.offsetBy( 2, 0, 0)), + grid.getValue(ijk.offsetBy( 1, 0, 0)), grid.getValue(ijk), + grid.getValue(ijk.offsetBy(-1, 0, 0)), grid.getValue(ijk.offsetBy(-2, 0, 0)), + grid.getValue(ijk.offsetBy(-3, 0, 0)) ); + } + + template + static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk) + { + return difference( + grid.getValue(ijk.offsetBy( 0, 3, 0)), grid.getValue(ijk.offsetBy( 0, 2, 0)), + grid.getValue(ijk.offsetBy( 0, 1, 0)), grid.getValue(ijk), + grid.getValue(ijk.offsetBy( 0,-1, 0)), grid.getValue(ijk.offsetBy( 0,-2, 0)), + grid.getValue(ijk.offsetBy( 0,-3, 0)) ); + } + + template + static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk) + { + + return difference( + grid.getValue(ijk.offsetBy( 0, 0, 3)), grid.getValue(ijk.offsetBy( 0, 0, 2)), + grid.getValue(ijk.offsetBy( 0, 0, 1)), grid.getValue(ijk), + grid.getValue(ijk.offsetBy( 0, 0,-1)), grid.getValue(ijk.offsetBy( 0, 0,-2)), + grid.getValue(ijk.offsetBy( 0, 0,-3)) ); + } + + template + static typename Accessor::ValueType inXandY(const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueT; + ValueT tmp1 = + D1::inX(grid, ijk.offsetBy(0, 1, 0)) - + D1::inX(grid, ijk.offsetBy(0,-1, 0)); + ValueT tmp2 = + D1::inX(grid, ijk.offsetBy(0, 2, 0)) - + D1::inX(grid, ijk.offsetBy(0,-2, 0)); + ValueT tmp3 = + D1::inX(grid, ijk.offsetBy(0, 3, 0)) - + D1::inX(grid, ijk.offsetBy(0,-3, 0)); + return ValueT(0.75*tmp1 - 0.15*tmp2 + 1./60*tmp3); + } + + template + static typename Accessor::ValueType inXandZ(const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueT; + ValueT tmp1 = + D1::inX(grid, ijk.offsetBy(0, 0, 1)) - + D1::inX(grid, ijk.offsetBy(0, 0,-1)); + ValueT tmp2 = + D1::inX(grid, ijk.offsetBy(0, 0, 2)) - + D1::inX(grid, ijk.offsetBy(0, 0,-2)); + ValueT tmp3 = + D1::inX(grid, ijk.offsetBy(0, 0, 3)) - + D1::inX(grid, ijk.offsetBy(0, 0,-3)); + return ValueT(0.75*tmp1 - 0.15*tmp2 + 1./60*tmp3); + } + + template + static typename Accessor::ValueType inYandZ(const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueT; + ValueT tmp1 = + D1::inY(grid, ijk.offsetBy(0, 0, 1)) - + D1::inY(grid, ijk.offsetBy(0, 0,-1)); + ValueT tmp2 = + D1::inY(grid, ijk.offsetBy(0, 0, 2)) - + D1::inY(grid, ijk.offsetBy(0, 0,-2)); + ValueT tmp3 = + D1::inY(grid, ijk.offsetBy(0, 0, 3)) - + D1::inY(grid, ijk.offsetBy(0, 0,-3)); + return ValueT(0.75*tmp1 - 0.15*tmp2 + 1./60*tmp3); + } + + + // stencil access version + template + static typename Stencil::ValueType inX(const Stencil& S) + { + return difference( S.template getValue< 3, 0, 0>(), S.template getValue< 2, 0, 0>(), + S.template getValue< 1, 0, 0>(), S.template getValue< 0, 0, 0>(), + S.template getValue<-1, 0, 0>(), S.template getValue<-2, 0, 0>(), + S.template getValue<-3, 0, 0>() ); + } + + template + static typename Stencil::ValueType inY(const Stencil& S) + { + return difference( S.template getValue< 0, 3, 0>(), S.template getValue< 0, 2, 0>(), + S.template getValue< 0, 1, 0>(), S.template getValue< 0, 0, 0>(), + S.template getValue< 0,-1, 0>(), S.template getValue< 0,-2, 0>(), + S.template getValue< 0,-3, 0>() ); + + } + + template + static typename Stencil::ValueType inZ(const Stencil& S) + { + return difference( S.template getValue< 0, 0, 3>(), S.template getValue< 0, 0, 2>(), + S.template getValue< 0, 0, 1>(), S.template getValue< 0, 0, 0>(), + S.template getValue< 0, 0,-1>(), S.template getValue< 0, 0,-2>(), + S.template getValue< 0, 0,-3>() ); + } + + template + static typename Stencil::ValueType inXandY(const Stencil& S) + { + return crossdifference( S.template getValue< 1, 1, 0>(), S.template getValue<-1, 1, 0>(), + S.template getValue< 1,-1, 0>(), S.template getValue<-1,-1, 0>(), + S.template getValue< 2, 1, 0>(), S.template getValue<-2, 1, 0>(), + S.template getValue< 2,-1, 0>(), S.template getValue<-2,-1, 0>(), + S.template getValue< 3, 1, 0>(), S.template getValue<-3, 1, 0>(), + S.template getValue< 3,-1, 0>(), S.template getValue<-3,-1, 0>(), + S.template getValue< 1, 2, 0>(), S.template getValue<-1, 2, 0>(), + S.template getValue< 1,-2, 0>(), S.template getValue<-1,-2, 0>(), + S.template getValue< 2, 2, 0>(), S.template getValue<-2, 2, 0>(), + S.template getValue< 2,-2, 0>(), S.template getValue<-2,-2, 0>(), + S.template getValue< 3, 2, 0>(), S.template getValue<-3, 2, 0>(), + S.template getValue< 3,-2, 0>(), S.template getValue<-3,-2, 0>(), + S.template getValue< 1, 3, 0>(), S.template getValue<-1, 3, 0>(), + S.template getValue< 1,-3, 0>(), S.template getValue<-1,-3, 0>(), + S.template getValue< 2, 3, 0>(), S.template getValue<-2, 3, 0>(), + S.template getValue< 2,-3, 0>(), S.template getValue<-2,-3, 0>(), + S.template getValue< 3, 3, 0>(), S.template getValue<-3, 3, 0>(), + S.template getValue< 3,-3, 0>(), S.template getValue<-3,-3, 0>() ); + } + + template + static typename Stencil::ValueType inXandZ(const Stencil& S) + { + return crossdifference( S.template getValue< 1, 0, 1>(), S.template getValue<-1, 0, 1>(), + S.template getValue< 1, 0,-1>(), S.template getValue<-1, 0,-1>(), + S.template getValue< 2, 0, 1>(), S.template getValue<-2, 0, 1>(), + S.template getValue< 2, 0,-1>(), S.template getValue<-2, 0,-1>(), + S.template getValue< 3, 0, 1>(), S.template getValue<-3, 0, 1>(), + S.template getValue< 3, 0,-1>(), S.template getValue<-3, 0,-1>(), + S.template getValue< 1, 0, 2>(), S.template getValue<-1, 0, 2>(), + S.template getValue< 1, 0,-2>(), S.template getValue<-1, 0,-2>(), + S.template getValue< 2, 0, 2>(), S.template getValue<-2, 0, 2>(), + S.template getValue< 2, 0,-2>(), S.template getValue<-2, 0,-2>(), + S.template getValue< 3, 0, 2>(), S.template getValue<-3, 0, 2>(), + S.template getValue< 3, 0,-2>(), S.template getValue<-3, 0,-2>(), + S.template getValue< 1, 0, 3>(), S.template getValue<-1, 0, 3>(), + S.template getValue< 1, 0,-3>(), S.template getValue<-1, 0,-3>(), + S.template getValue< 2, 0, 3>(), S.template getValue<-2, 0, 3>(), + S.template getValue< 2, 0,-3>(), S.template getValue<-2, 0,-3>(), + S.template getValue< 3, 0, 3>(), S.template getValue<-3, 0, 3>(), + S.template getValue< 3, 0,-3>(), S.template getValue<-3, 0,-3>() ); + } + + template + static typename Stencil::ValueType inYandZ(const Stencil& S) + { + return crossdifference( S.template getValue< 0, 1, 1>(), S.template getValue< 0,-1, 1>(), + S.template getValue< 0, 1,-1>(), S.template getValue< 0,-1,-1>(), + S.template getValue< 0, 2, 1>(), S.template getValue< 0,-2, 1>(), + S.template getValue< 0, 2,-1>(), S.template getValue< 0,-2,-1>(), + S.template getValue< 0, 3, 1>(), S.template getValue< 0,-3, 1>(), + S.template getValue< 0, 3,-1>(), S.template getValue< 0,-3,-1>(), + S.template getValue< 0, 1, 2>(), S.template getValue< 0,-1, 2>(), + S.template getValue< 0, 1,-2>(), S.template getValue< 0,-1,-2>(), + S.template getValue< 0, 2, 2>(), S.template getValue< 0,-2, 2>(), + S.template getValue< 0, 2,-2>(), S.template getValue< 0,-2,-2>(), + S.template getValue< 0, 3, 2>(), S.template getValue< 0,-3, 2>(), + S.template getValue< 0, 3,-2>(), S.template getValue< 0,-3,-2>(), + S.template getValue< 0, 1, 3>(), S.template getValue< 0,-1, 3>(), + S.template getValue< 0, 1,-3>(), S.template getValue< 0,-1,-3>(), + S.template getValue< 0, 2, 3>(), S.template getValue< 0,-2, 3>(), + S.template getValue< 0, 2,-3>(), S.template getValue< 0,-2,-3>(), + S.template getValue< 0, 3, 3>(), S.template getValue< 0,-3, 3>(), + S.template getValue< 0, 3,-3>(), S.template getValue< 0,-3,-3>() ); + } + +}; + +} // end math namespace +} // namespace OPENVDB_VERSION_NAME +} // end openvdb namespace + +#endif // OPENVDB_MATH_FINITEDIFFERENCE_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/math/Hermite.h b/nuparu/include/openvdb/include/openvdb/math/Hermite.h new file mode 100644 index 00000000..97974ac9 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/math/Hermite.h @@ -0,0 +1,493 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2014 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_MATH_HERMITE_HAS_BEEN_INCLUDED +#define OPENVDB_MATH_HERMITE_HAS_BEEN_INCLUDED + +#include +#include +#include "QuantizedUnitVec.h" +#include "Math.h" + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace math { + + +// Forward declaration +class Hermite; + + +//////////////////////////////////////// + +// Utility methods + + +//@{ +/// min and max operations done directly on the compressed data. +OPENVDB_API Hermite min(const Hermite&, const Hermite&); +OPENVDB_API Hermite max(const Hermite&, const Hermite&); +//@} + + +//////////////////////////////////////// + + +/// @brief Quantized Hermite data object that stores compressed intersection +/// information (offsets and normlas) for the up-wind edges of a voxel. (Size 10 bytes) +class OPENVDB_API Hermite +{ +public: + + Hermite(); + Hermite(const Hermite&); + const Hermite& operator=(const Hermite&); + + /// clears all intersection data + void clear(); + + /// @return true if this Hermite objet has any edge intersection data. + operator bool() const; + + /// equality operator + inline bool operator==(const Hermite&) const; + /// inequality operator + bool operator!=(const Hermite& rhs) const { return !(*this == rhs); } + + /// unary negation operator, flips inside/outside state and normals. + Hermite operator-() const; + + //@{ + /// @brief methods to compress and store edge data. + /// @note @c offset is expected to be in the [0 to 1) range. + template + void setX(T offset, const Vec3&); + + template + void setY(T offset, const Vec3&); + + template + void setZ(T offset, const Vec3&); + //@} + + /// @return true if the current Hermite object is classified + // as being inside a contour. + bool isInside() const { return MASK_SIGN & mData; } + /// Set the inside/outside state to reflect if this Hermite object + /// is located at a point in space that is inside/outside a contour. + void setIsInside(bool); + + //@{ + /// @return true if this Hermite object has intersection data + /// for the corresponding edge. + bool hasOffsetX() const { return mXNormal; }; + bool hasOffsetY() const { return mYNormal; } + bool hasOffsetZ() const { return MASK_ZFLAG & mData; } + //@} + + //@{ + /// Edge offset greater-than comparisson operators + /// @note is @c this offset > than @c other offset + bool isGreaterX(const Hermite& other) const; + bool isGreaterY(const Hermite& other) const; + bool isGreaterZ(const Hermite& other) const; + //@} + + //@{ + /// Edge offset less-than comparisson operators + /// @note is @c this offset < than @c other offset + bool isLessX(const Hermite& other) const; + bool isLessY(const Hermite& other) const; + bool isLessZ(const Hermite& other) const; + //@} + + //@{ + /// @return uncompressed edge intersection offsets + float getOffsetX() const; + float getOffsetY() const; + float getOffsetZ() const; + //@} + + //@{ + /// @return uncompressed edge intersection normals + Vec3s getNormalX() const { return QuantizedUnitVec::unpack(mXNormal); } + Vec3s getNormalY() const { return QuantizedUnitVec::unpack(mYNormal); } + Vec3s getNormalZ() const { return QuantizedUnitVec::unpack(mZNormal); } + //@} + + //@{ + /// copy edge data from other Hermite object + /// @note copies data in the compressed form + void setX(const Hermite&); + void setY(const Hermite&); + void setZ(const Hermite&); + //@} + + /// String representation. + std::string str() const; + + /// Unserialize this transform from the given stream. + void read(std::istream&); + /// Serialize this transform to the given stream. + void write(std::ostream&) const; + + //@{ + /// Operators required by OpenVDB. + /// @note These methods don't perform meaningful operations on Hermite data. + bool operator< (const Hermite&) const { return false; }; + bool operator> (const Hermite&) const { return false; }; + template Hermite operator+(const T&) const { return *this; } + template Hermite operator-(const T&) const { return *this; } + //@} + +private: + /// Helper function that quantizes a [0, 1) offset using 10-bits. + template + static uint32_t quantizeOffset(T offset); + + /// Helper function that returns (signed) compressed-offsets, + /// used by comparisson operators. + static void getSignedOffsets(const Hermite& lhs, const Hermite& rhs, + const uint32_t bitmask, int& lhsV, int& rhsV); + + + // Bits masks + // 10000000000000000000000000000000 + static const uint32_t MASK_SIGN = 0x80000000; + // 01000000000000000000000000000000 + static const uint32_t MASK_ZFLAG = 0x40000000; + // 00111111111100000000000000000000 + static const uint32_t MASK_XSLOT = 0x3FF00000; + // 00000000000011111111110000000000 + static const uint32_t MASK_YSLOT = 0x000FFC00; + // 00000000000000000000001111111111 + static const uint32_t MASK_ZSLOT = 0x000003FF; + // 00111111111111111111111111111111 + static const uint32_t MASK_SLOTS = 0x3FFFFFFF; + + + uint16_t mXNormal, mYNormal, mZNormal; + uint32_t mData; + +}; // class Hermite + + +//////////////////////////////////////// + +// output-stream insertion operator + +inline std::ostream& +operator<<(std::ostream& ostr, const Hermite& rhs) +{ + ostr << rhs.str(); + return ostr; +} + + +//////////////////////////////////////// + +// construction and assignment + +inline const Hermite& +Hermite::operator=(const Hermite& rhs) +{ + mData = rhs.mData; + mXNormal = rhs.mXNormal; + mYNormal = rhs.mYNormal; + mZNormal = rhs.mZNormal; + return *this; +} + + +inline void +Hermite::clear() +{ + mXNormal = 0; + mYNormal = 0; + mZNormal = 0; + mData = 0; +} + + +//////////////////////////////////////// + +// bool operator and equality + +inline +Hermite::operator bool() const +{ + if (0 != (mXNormal | mYNormal)) return true; + return hasOffsetZ(); +} + + +inline bool +Hermite::operator==(const Hermite& rhs) const +{ + if(mXNormal != rhs.mXNormal) return false; + if(mYNormal != rhs.mYNormal) return false; + if(mZNormal != rhs.mZNormal) return false; + return mData == rhs.mData; +} + + +//////////////////////////////////////// + +// unary negation operator + +inline Hermite +Hermite::operator-() const +{ + Hermite ret(*this); + QuantizedUnitVec::flipSignBits(ret.mXNormal); + QuantizedUnitVec::flipSignBits(ret.mYNormal); + QuantizedUnitVec::flipSignBits(ret.mZNormal); + ret.mData = (~MASK_SIGN & ret.mData) | (MASK_SIGN & ~ret.mData); + return ret; +} + + +//////////////////////////////////////// + +// Helper funcions + +template +inline uint32_t +Hermite::quantizeOffset(T offset) +{ + // the offset is expected to be normalized [0 to 1) + assert(offset < 1.0); + assert(offset > -1.0e-8); + + // quantize the offset using 10-bits. (higher bits are masked out) + return uint32_t(1023 * offset) & MASK_ZSLOT; +} + +inline void +Hermite::getSignedOffsets(const Hermite& lhs, const Hermite& rhs, + const uint32_t bitmask, int& lhsV, int& rhsV) +{ + lhsV = bitmask & lhs.mData; + rhsV = bitmask & rhs.mData; + + if(lhs.isInside()) lhsV = -lhsV; + if(rhs.isInside()) rhsV = -rhsV; +} + + +//////////////////////////////////////// + +// compress and set edge data + +template +inline void +Hermite::setX(T offset, const Vec3& n) +{ + mData &= ~MASK_XSLOT; // clear xslot + mData |= quantizeOffset(offset) << 20; + mXNormal = QuantizedUnitVec::pack(n); +} + +template +inline void +Hermite::setY(T offset, const Vec3& n) +{ + mData &= ~MASK_YSLOT; // clear yslot + mData |= quantizeOffset(offset) << 10; + mYNormal = QuantizedUnitVec::pack(n); +} + +template +inline void +Hermite::setZ(T offset, const Vec3& n) +{ + mData &= ~MASK_ZSLOT; // clear zslot + mData |= MASK_ZFLAG | quantizeOffset(offset); + mZNormal = QuantizedUnitVec::pack(n); +} + + +//////////////////////////////////////// + +// change inside/outside state + +inline void +Hermite::setIsInside(bool isInside) +{ + mData &= ~MASK_SIGN; // clear sign-bit + mData |= uint32_t(isInside) * MASK_SIGN; +} + + +//////////////////////////////////////// + +// Uncompress and return the edge intersection-offsets +// 0.000977517 = 1.0 / 1023 + +inline float +Hermite::getOffsetX() const +{ + return float(((mData >> 20) & MASK_ZSLOT) * 0.000977517); +} + +inline float +Hermite::getOffsetY() const +{ + return float(((mData >> 10) & MASK_ZSLOT) * 0.000977517); +} + +inline float +Hermite::getOffsetZ() const +{ + return float((mData & MASK_ZSLOT) * 0.000977517); +} + + +//////////////////////////////////////// + +// copy compressed edge data from other object + +inline void +Hermite::setX(const Hermite& rhs) +{ + mData &= ~MASK_XSLOT; // clear xslot + mData |= MASK_XSLOT & rhs.mData; // copy xbits from rhs + mXNormal = rhs.mXNormal; // copy compressed normal + + // Flip the copied normal if the rhs object has + // a different inside/outside state. + if(hasOffsetX() && isInside() != rhs.isInside()) + QuantizedUnitVec::flipSignBits(mXNormal); +} + +inline void +Hermite::setY(const Hermite& rhs) +{ + mData &= ~MASK_YSLOT; + mData |= MASK_YSLOT & rhs.mData; + mYNormal = rhs.mYNormal; + + if(hasOffsetY() && isInside() != rhs.isInside()) + QuantizedUnitVec::flipSignBits(mYNormal); +} + +inline void +Hermite::setZ(const Hermite& rhs) +{ + mData &= ~MASK_ZSLOT; + mData |= (MASK_ZFLAG | MASK_ZSLOT) & rhs.mData; + mZNormal = rhs.mZNormal; + if(hasOffsetZ() && isInside() != rhs.isInside()) + QuantizedUnitVec::flipSignBits(mZNormal); +} + + +//////////////////////////////////////// + +// edge comparison operators + +inline bool +Hermite::isGreaterX(const Hermite& rhs) const +{ + int lhsV, rhsV; + getSignedOffsets(*this, rhs, MASK_XSLOT, lhsV, rhsV); + return lhsV > rhsV; +} + +inline bool +Hermite::isGreaterY(const Hermite& rhs) const +{ + int lhsV, rhsV; + getSignedOffsets(*this, rhs, MASK_YSLOT, lhsV, rhsV); + return lhsV > rhsV; +} + +inline bool +Hermite::isGreaterZ(const Hermite& rhs) const +{ + int lhsV, rhsV; + getSignedOffsets(*this, rhs, MASK_ZSLOT, lhsV, rhsV); + return lhsV > rhsV; +} + +inline bool +Hermite::isLessX(const Hermite& rhs) const +{ + int lhsV, rhsV; + getSignedOffsets(*this, rhs, MASK_XSLOT, lhsV, rhsV); + return lhsV < rhsV; +} + +inline bool +Hermite::isLessY(const Hermite& rhs) const +{ + int lhsV, rhsV; + getSignedOffsets(*this, rhs, MASK_YSLOT, lhsV, rhsV); + return lhsV < rhsV; +} + +inline bool +Hermite::isLessZ(const Hermite& rhs) const +{ + int lhsV, rhsV; + getSignedOffsets(*this, rhs, MASK_ZSLOT, lhsV, rhsV); + return lhsV < rhsV; +} + + +//////////////////////////////////////// + + +inline bool +isApproxEqual(const Hermite& lhs, const Hermite& rhs) { return lhs == rhs; } + +inline bool +isApproxEqual(const Hermite& lhs, const Hermite& rhs, const Hermite& /*tolerance*/) + { return isApproxEqual(lhs, rhs); } + + +} // namespace math + + +//////////////////////////////////////// + + +template<> inline math::Hermite zeroVal() { return math::Hermite(); } + + +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_MATH_HERMITE_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2014 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/math/LegacyFrustum.h b/nuparu/include/openvdb/include/openvdb/math/LegacyFrustum.h new file mode 100644 index 00000000..b6b13c10 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/math/LegacyFrustum.h @@ -0,0 +1,196 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file math/LegacyFrustum.h + +#ifndef OPENVDB_MATH_LEGACYFRUSTUM_HAS_BEEN_INCLUDED +#define OPENVDB_MATH_LEGACYFRUSTUM_HAS_BEEN_INCLUDED + +#include +#include // for Real typedef +#include "Coord.h" +#include "Mat4.h" +#include "Vec3.h" + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace math { +namespace internal { + +/// @brief LegacyFrustum class used at DreamWorks for converting old vdb files. +class LegacyFrustum +{ +public: + LegacyFrustum(std::istream& is) + { + // First read in the old transform's base class. + // the "extents" + Vec3i tmpMin, tmpMax; + is.read(reinterpret_cast(&tmpMin), sizeof(Vec3i::ValueType) * 3); + is.read(reinterpret_cast(&tmpMax), sizeof(Vec3i::ValueType) * 3); + + Coord tmpMinCoord(tmpMin); + Coord tmpMaxCoord(tmpMax); + + // set the extents + mExtents = CoordBBox(tmpMinCoord, tmpMaxCoord); + + // read the old-frustum class member data + //Mat4d tmpW2C; + Mat4d tmpW2C, tmpC2S, tmpS2C, tmpWorldToLocal; + Mat4d tmpS2U, tmpXYLocalToUnit, tmpZLocalToUnit; + Real tmpWindow[6]; + Real tmpPadding; + + //Mat4d tmpXYUnitToLocal, tmpZUnitToLocal + + // read in each matrix. + is.read(reinterpret_cast(&tmpW2C), + sizeof(Mat4d::value_type) * Mat4d::size * Mat4d::size); + is.read(reinterpret_cast(&mC2W), + sizeof(Mat4d::value_type) * Mat4d::size * Mat4d::size); + is.read(reinterpret_cast(&tmpC2S), + sizeof(Mat4d::value_type) * Mat4d::size * Mat4d::size); + is.read(reinterpret_cast(&tmpS2C), + sizeof(Mat4d::value_type) * Mat4d::size * Mat4d::size); + is.read(reinterpret_cast(&tmpWorldToLocal), + sizeof(Mat4d::value_type) * Mat4d::size * Mat4d::size); + is.read(reinterpret_cast(&mLocalToWorld), + sizeof(Mat4d::value_type) * Mat4d::size * Mat4d::size); + + is.read(reinterpret_cast(&tmpWindow[0]), sizeof(Real)); + is.read(reinterpret_cast(&tmpWindow[1]), sizeof(Real)); + is.read(reinterpret_cast(&tmpWindow[2]), sizeof(Real)); + is.read(reinterpret_cast(&tmpWindow[3]), sizeof(Real)); + is.read(reinterpret_cast(&tmpWindow[4]), sizeof(Real)); + is.read(reinterpret_cast(&tmpWindow[5]), sizeof(Real)); + + is.read(reinterpret_cast(&tmpPadding), sizeof(Real)); + + is.read(reinterpret_cast(&tmpS2U), + sizeof(Mat4d::value_type) * Mat4d::size * Mat4d::size); + is.read(reinterpret_cast(&mXYUnitToLocal), + sizeof(Mat4d::value_type) * Mat4d::size * Mat4d::size); + is.read(reinterpret_cast(&tmpXYLocalToUnit), + sizeof(Mat4d::value_type) * Mat4d::size * Mat4d::size); + is.read(reinterpret_cast(&mZUnitToLocal), + sizeof(Mat4d::value_type) * Mat4d::size * Mat4d::size); + is.read(reinterpret_cast(&tmpZLocalToUnit), + sizeof(Mat4d::value_type) * Mat4d::size * Mat4d::size); + + + mNearPlane = tmpWindow[4]; + mFarPlane = tmpWindow[5]; + + // Look up the world space corners of the + // frustum grid. + mFrNearOrigin = unitToLocalFrustum(Vec3R(0,0,0)); + mFrFarOrigin = unitToLocalFrustum(Vec3R(0,0,1)); + + Vec3d frNearXTip = unitToLocalFrustum(Vec3R(1,0,0)); + Vec3d frNearYTip = unitToLocalFrustum(Vec3R(0,1,0)); + mFrNearXBasis = frNearXTip - mFrNearOrigin; + mFrNearYBasis = frNearYTip - mFrNearOrigin; + + Vec3R frFarXTip = unitToLocalFrustum(Vec3R(1,0,1)); + Vec3R frFarYTip = unitToLocalFrustum(Vec3R(0,1,1)); + mFrFarXBasis = frFarXTip - mFrFarOrigin; + mFrFarYBasis = frFarYTip - mFrFarOrigin; + } + + ~LegacyFrustum() {} + + const Mat4d& getCamXForm() const {return mC2W; } + + double getDepth() const {return (mFarPlane - mNearPlane); } + double getTaper() const { + + return getNearPlaneWidth() / getFarPlaneWidth(); + } + + double getNearPlaneWidth() const { + double nearPlaneWidth = (unitToWorld(Vec3d(0,0,0)) - unitToWorld(Vec3d(1,0,0))).length(); + return nearPlaneWidth; + } + + double getFarPlaneWidth() const { + double farPlaneWidth = (unitToWorld(Vec3d(0,0,1)) - unitToWorld(Vec3d(1,0,1))).length(); + return farPlaneWidth; + } + + double getNearPlaneDist() const { return mNearPlane; } + + const CoordBBox& getBBox() const {return mExtents; } + + Vec3d unitToWorld(const Vec3d& in) const {return mLocalToWorld.transform( unitToLocal(in) ); } + +private: + LegacyFrustum() {} + + Vec3d unitToLocal(const Vec3d& U) const { + + // We first find the local space coordinates + // of the unit point projected onto the near + // and far planes of the frustum by using a + // linear combination of the planes basis vectors + Vec3d nearLS = ( U[0] * mFrNearXBasis ) + ( U[1] * mFrNearYBasis ) + mFrNearOrigin; + Vec3d farLS = ( U[0] * mFrFarXBasis ) + ( U[1] * mFrFarYBasis ) + mFrFarOrigin; + + // then we lerp the two ws points in frustum z space + return U[2] * farLS + ( 1.0 - U[2] ) * nearLS; + } + + Vec3d unitToLocalFrustum(const Vec3d& u) const { + Vec3d fzu = mZUnitToLocal.transformH(u); + Vec3d fu = u; + fu[2] = fzu.z(); + return mXYUnitToLocal.transformH(fu); + } + +private: + Mat4d mC2W, mLocalToWorld, mXYUnitToLocal, mZUnitToLocal; + CoordBBox mExtents; + Vec3d mFrNearXBasis, mFrNearYBasis, mFrFarXBasis, mFrFarYBasis; + Vec3d mFrNearOrigin, mFrFarOrigin; + double mNearPlane, mFarPlane; +}; + +} // namespace internal +} // namespace math +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_MATH_LEGACYFRUSTUM_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/math/Maps.h b/nuparu/include/openvdb/include/openvdb/math/Maps.h new file mode 100644 index 00000000..17655946 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/math/Maps.h @@ -0,0 +1,2685 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file Maps.h + +#ifndef OPENVDB_MATH_MAPS_HAS_BEEN_INCLUDED +#define OPENVDB_MATH_MAPS_HAS_BEEN_INCLUDED + +#include "Math.h" +#include "Mat4.h" +#include "Vec3.h" +#include "BBox.h" +#include "Coord.h" +#include // for io::getFormatVersion() +#include +#include +#include +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace math { + + +//////////////////////////////////////// + +/// Forward declarations of the different map types + +class MapBase; +class ScaleMap; +class TranslationMap; +class ScaleTranslateMap; +class UniformScaleMap; +class UniformScaleTranslateMap; +class AffineMap; +class UnitaryMap; +class NonlinearFrustumMap; + +template class CompoundMap; + +typedef CompoundMap UnitaryAndTranslationMap; +typedef CompoundMap, UnitaryMap> SpectralDecomposedMap; +typedef SpectralDecomposedMap SymmetricMap; +typedef CompoundMap FullyDecomposedMap; +typedef CompoundMap PolarDecomposedMap; + + +//////////////////////////////////////// + +/// Map traits + +template struct is_linear { static const bool value = false; }; +template<> struct is_linear { static const bool value = true; }; +template<> struct is_linear { static const bool value = true; }; +template<> struct is_linear { static const bool value = true; }; +template<> struct is_linear { static const bool value = true; }; +template<> struct is_linear { static const bool value = true; }; +template<> struct is_linear { static const bool value = true; }; +template<> struct is_linear { static const bool value = true; }; + +template struct is_linear > { + static const bool value = is_linear::value && is_linear::value; +}; + + +template struct is_uniform_scale { static const bool value = false; }; +template<> struct is_uniform_scale { static const bool value = true; }; + +template struct is_uniform_scale_translate { static const bool value = false; }; +template<> struct is_uniform_scale_translate { static const bool value = true; }; +template<> struct is_uniform_scale_translate { + static const bool value = true; +}; + + +template struct is_scale { static const bool value = false; }; +template<> struct is_scale { static const bool value = true; }; + +template struct is_scale_translate { static const bool value = false; }; +template<> struct is_scale_translate { static const bool value = true; }; + + +template struct is_uniform_diagonal_jacobian { + static const bool value = is_uniform_scale::value || is_uniform_scale_translate::value; +}; + +template struct is_diagonal_jacobian { + static const bool value = is_scale::value || is_scale_translate::value; +}; + + +//////////////////////////////////////// + +/// Utility methods + +/// @brief Create a SymmetricMap from a symmetric matrix. +/// Decomposes the map into Rotation Diagonal Rotation^T +OPENVDB_API boost::shared_ptr createSymmetricMap(const Mat3d& m); + + +/// @brief General decomposition of a Matrix into a Unitary (e.g. rotation) +/// following a Symmetric (e.g. stretch & shear) +OPENVDB_API boost::shared_ptr createFullyDecomposedMap(const Mat4d& m); + + +/// @brief Decomposes a general linear into translation following polar decomposition. +/// +/// T U S where: +/// +/// T: Translation +/// U: Unitary (rotation or reflection) +/// S: Symmetric +/// +/// @note: the Symmetric is automatically decomposed into Q D Q^T, where +/// Q is rotation and D is diagonal. +OPENVDB_API boost::shared_ptr createPolarDecomposedMap(const Mat3d& m); + + +/// @brief reduces an AffineMap to a ScaleMap or a ScaleTranslateMap when it can +OPENVDB_API boost::shared_ptr simplify(boost::shared_ptr affine); + +/// @brief Returns the left pseudoInverse of the input matrix when the 3x3 part is symmetric +/// otherwise it zeros the 3x3 and reverses the translation. +OPENVDB_API Mat4d approxInverse(const Mat4d& mat); + + +//////////////////////////////////////// + + +/// @brief Abstract base class for maps +class OPENVDB_API MapBase +{ +public: + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + typedef Ptr (*MapFactory)(); + + virtual ~MapBase(){} + + virtual boost::shared_ptr getAffineMap() const = 0; + + /// Return the name of this map's concrete type (e.g., @c "AffineMap"). + virtual Name type() const = 0; + + /// Return @c true if this map is of concrete type @c MapT (e.g., AffineMap). + template bool isType() const { return this->type() == MapT::mapType(); } + + /// Return @c true if this map is equal to the given map. + virtual bool isEqual(const MapBase& other) const = 0; + + /// Return @c true if this map is linear. + virtual bool isLinear() const = 0; + /// Return @c true if the spacing between the image of latice is uniform in all directions + virtual bool hasUniformScale() const = 0; + + virtual Vec3d applyMap(const Vec3d& in) const = 0; + virtual Vec3d applyInverseMap(const Vec3d& in) const = 0; + + //@{ + /// @brief Apply the Inverse Jacobian Transpose of this map to a vector. + /// For a linear map this is equivalent to applying the transpose of + /// inverse map excluding translation. + virtual Vec3d applyIJT(const Vec3d& in) const = 0; + virtual Vec3d applyIJT(const Vec3d& in, const Vec3d& domainPos) const = 0; + //@} + + virtual Mat3d applyIJC(const Mat3d& m) const = 0; + virtual Mat3d applyIJC(const Mat3d& m, const Vec3d& v, const Vec3d& domainPos) const = 0; + + + virtual double determinant() const = 0; + virtual double determinant(const Vec3d&) const = 0; + + + //@{ + /// @brief Method to return the local size of a voxel. + /// When a location is specified as an argument, it is understood to be + /// be in the domain of the map (i.e. index space) + virtual Vec3d voxelSize() const = 0; + virtual Vec3d voxelSize(const Vec3d&) const = 0; + //@} + + virtual void read(std::istream&) = 0; + virtual void write(std::ostream&) const = 0; + + virtual std::string str() const = 0; + + virtual MapBase::Ptr copy() const = 0; + + //@{ + /// @brief Methods to update the map + virtual MapBase::Ptr preRotate(double radians, Axis axis = X_AXIS) const = 0; + virtual MapBase::Ptr preTranslate(const Vec3d&) const = 0; + virtual MapBase::Ptr preScale(const Vec3d&) const = 0; + virtual MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const = 0; + + virtual MapBase::Ptr postRotate(double radians, Axis axis = X_AXIS) const = 0; + virtual MapBase::Ptr postTranslate(const Vec3d&) const = 0; + virtual MapBase::Ptr postScale(const Vec3d&) const = 0; + virtual MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const = 0; + //@} + + //@{ + /// @brief Apply the Jacobian of this map to a vector. + /// For a linear map this is equivalent to applying the map excluding translation. + /// @warning Houdini 12.5 uses an earlier version of OpenVDB, and maps created + /// with that version lack a virtual table entry for this method. Do not call + /// this method from Houdini 12.5. + virtual Vec3d applyJacobian(const Vec3d& in) const = 0; + virtual Vec3d applyJacobian(const Vec3d& in, const Vec3d& domainPos) const = 0; + //@} + + //@{ + /// @brief Apply the InverseJacobian of this map to a vector. + /// For a linear map this is equivalent to applying the map inverse excluding translation. + /// @warning Houdini 12.5 uses an earlier version of OpenVDB, and maps created + /// with that version lack a virtual table entry for this method. Do not call + /// this method from Houdini 12.5. + virtual Vec3d applyInverseJacobian(const Vec3d& in) const = 0; + virtual Vec3d applyInverseJacobian(const Vec3d& in, const Vec3d& domainPos) const = 0; + //@} + + + //@{ + /// @brief Apply the Jacobian transpose of this map to a vector. + /// For a linear map this is equivalent to applying the transpose of the map + /// excluding translation. + /// @warning Houdini 12.5 uses an earlier version of OpenVDB, and maps created + /// with that version lack a virtual table entry for this method. Do not call + /// this method from Houdini 12.5. + virtual Vec3d applyJT(const Vec3d& in) const = 0; + virtual Vec3d applyJT(const Vec3d& in, const Vec3d& domainPos) const = 0; + //@} + + /// @brief Return a new map representing the inverse of this map. + /// @throw NotImplementedError if the map is a NonlinearFrustumMap. + /// @warning Houdini 12.5 uses an earlier version of OpenVDB, and maps created + /// with that version lack a virtual table entry for this method. Do not call + /// this method from Houdini 12.5. + virtual MapBase::Ptr inverseMap() const = 0; + +protected: + MapBase() {} + + template + static bool isEqualBase(const MapT& self, const MapBase& other) + { + return other.isType() && (self == *static_cast(&other)); + } +}; + + +//////////////////////////////////////// + + +/// @brief Threadsafe singleton object for accessing the map type-name dictionary. +/// Associates a map type-name with a factory function. +class OPENVDB_API MapRegistry +{ +public: + typedef std::map MapDictionary; + + static MapRegistry* instance(); + + /// Create a new map of the given (registered) type name. + static MapBase::Ptr createMap(const Name&); + + /// Return @c true if the given map type name is registered. + static bool isRegistered(const Name&); + + /// Register a map type along with a factory function. + static void registerMap(const Name&, MapBase::MapFactory); + + /// Remove a map type from the registry. + static void unregisterMap(const Name&); + + /// Clear the map type registry. + static void clear(); + +private: + MapRegistry() {} + + static MapRegistry* staticInstance(); + + static MapRegistry* mInstance; + + MapDictionary mMap; +}; + + +//////////////////////////////////////// + + +/// @brief A general linear transform using homogeneous coordinates to perform +/// rotation, scaling, shear and translation +class OPENVDB_API AffineMap: public MapBase +{ +public: + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + AffineMap(): + mMatrix(Mat4d::identity()), + mMatrixInv(Mat4d::identity()), + mJacobianInv(Mat3d::identity()), + mDeterminant(1), + mVoxelSize(Vec3d(1,1,1)), + mIsDiagonal(true), + mIsIdentity(true) + // the default constructor for translation is zero + { + } + + AffineMap(const Mat3d& m) + { + Mat4d mat4(Mat4d::identity()); + mat4.setMat3(m); + mMatrix = mat4; + updateAcceleration(); + } + + AffineMap(const Mat4d& m): mMatrix(m) + { + if (!isAffine(m)) { + OPENVDB_THROW(ArithmeticError, + "Tried to initialize an affine transform from a non-affine 4x4 matrix"); + } + updateAcceleration(); + } + + AffineMap(const AffineMap& other): + MapBase(other), + mMatrix(other.mMatrix), + mMatrixInv(other.mMatrixInv), + mJacobianInv(other.mJacobianInv), + mDeterminant(other.mDeterminant), + mVoxelSize(other.mVoxelSize), + mIsDiagonal(other.mIsDiagonal), + mIsIdentity(other.mIsIdentity) + { + } + + /// @brief constructor that merges the matrixes for two affine maps + AffineMap(const AffineMap& first, const AffineMap& second): + mMatrix(first.mMatrix * second.mMatrix) + { + updateAcceleration(); + } + + ~AffineMap() {} + + /// Return a MapBase::Ptr to a new AffineMap + static MapBase::Ptr create() { return MapBase::Ptr(new AffineMap()); } + /// Return a MapBase::Ptr to a deep copy of this map + MapBase::Ptr copy() const { return MapBase::Ptr(new AffineMap(*this)); } + + MapBase::Ptr inverseMap() const { return MapBase::Ptr(new AffineMap(mMatrixInv)); } + + static bool isRegistered() { return MapRegistry::isRegistered(AffineMap::mapType()); } + + static void registerMap() + { + MapRegistry::registerMap( + AffineMap::mapType(), + AffineMap::create); + } + + Name type() const { return mapType(); } + static Name mapType() { return Name("AffineMap"); } + + /// Return @c true (an AffineMap is always linear). + bool isLinear() const { return true; } + + /// Return @c false ( test if this is unitary with translation ) + bool hasUniformScale() const + { + Mat3d mat = mMatrix.getMat3(); + const double det = mat.det(); + if (isApproxEqual(det, double(0))) { + return false; + } else { + mat *= (1.f / pow(std::abs(det),1./3.)); + return isUnitary(mat); + } + } + + virtual bool isEqual(const MapBase& other) const { return isEqualBase(*this, other); } + + bool operator==(const AffineMap& other) const + { + // the Mat.eq() is approximate + if (!mMatrix.eq(other.mMatrix)) { return false; } + if (!mMatrixInv.eq(other.mMatrixInv)) { return false; } + return true; + } + + bool operator!=(const AffineMap& other) const { return !(*this == other); } + + AffineMap& operator=(const AffineMap& other) + { + mMatrix = other.mMatrix; + mMatrixInv = other.mMatrixInv; + + mJacobianInv = other.mJacobianInv; + mDeterminant = other.mDeterminant; + mVoxelSize = other.mVoxelSize; + mIsDiagonal = other.mIsDiagonal; + mIsIdentity = other.mIsIdentity; + return *this; + } + /// Return the image of @c in under the map + Vec3d applyMap(const Vec3d& in) const { return in * mMatrix; } + /// Return the pre-image of @c in under the map + Vec3d applyInverseMap(const Vec3d& in) const {return in * mMatrixInv; } + + /// Return the Jacobian of the map applied to @a in. + Vec3d applyJacobian(const Vec3d& in, const Vec3d&) const { return applyJacobian(in); } + /// Return the Jacobian of the map applied to @a in. + Vec3d applyJacobian(const Vec3d& in) const { return mMatrix.transform3x3(in); } + + /// Return the Inverse Jacobian of the map applied to @a in. (i.e. inverse map with out translation) + Vec3d applyInverseJacobian(const Vec3d& in, const Vec3d&) const { return applyInverseJacobian(in); } + /// Return the Inverse Jacobian of the map applied to @a in. (i.e. inverse map with out translation) + Vec3d applyInverseJacobian(const Vec3d& in) const { return mMatrixInv.transform3x3(in); } + + /// Return the Jacobian Transpose of the map applied to @a in. + /// This tranforms range-space gradients to domain-space gradients + Vec3d applyJT(const Vec3d& in, const Vec3d&) const { return applyJT(in); } + /// Return the Jacobian Transpose of the map applied to @a in. + Vec3d applyJT(const Vec3d& in) const { + const double* m = mMatrix.asPointer(); + return Vec3d( m[ 0] * in[0] + m[ 1] * in[1] + m[ 2] * in[2], + m[ 4] * in[0] + m[ 5] * in[1] + m[ 6] * in[2], + m[ 8] * in[0] + m[ 9] * in[1] + m[10] * in[2] ); + } + + /// Return the transpose of the inverse Jacobian of the map applied to @a in. + Vec3d applyIJT(const Vec3d& in, const Vec3d&) const { return applyIJT(in); } + /// Return the transpose of the inverse Jacobian of the map applied to @c in + Vec3d applyIJT(const Vec3d& in) const { return in * mJacobianInv; } + /// Return the Jacobian Curvature: zero for a linear map + Mat3d applyIJC(const Mat3d& m) const { + return mJacobianInv.transpose()* m * mJacobianInv; + } + Mat3d applyIJC(const Mat3d& in, const Vec3d& , const Vec3d& ) const { + return applyIJC(in); + } + /// Return the determinant of the Jacobian, ignores argument + double determinant(const Vec3d& ) const { return determinant(); } + /// Return the determinant of the Jacobian + double determinant() const { return mDeterminant; } + + //@{ + /// @brief Return the lengths of the images of the segments + /// (0,0,0)-(1,0,0), (0,0,0)-(0,1,0) and (0,0,0)-(0,0,1). + Vec3d voxelSize() const { return mVoxelSize; } + Vec3d voxelSize(const Vec3d&) const { return voxelSize(); } + //@} + + /// Return @c true if the underlying matrix is approximately an identity + bool isIdentity() const { return mIsIdentity; } + /// Return @c true if the underylying matrix is diagonal + bool isDiagonal() const { return mIsDiagonal; } + /// Return @c true if the map is equivalent to a ScaleMap + bool isScale() const { return isDiagonal(); } + /// Return @c true if the map is equivalent to a ScaleTranslateMap + bool isScaleTranslate() const { return math::isDiagonal(mMatrix.getMat3()); } + + + // Methods that modify the existing affine map + + //@{ + /// @brief Modify the existing affine map by pre-applying the given operation. + void accumPreRotation(Axis axis, double radians) + { + mMatrix.preRotate(axis, radians); + updateAcceleration(); + } + void accumPreScale(const Vec3d& v) + { + mMatrix.preScale(v); + updateAcceleration(); + } + void accumPreTranslation(const Vec3d& v) + { + mMatrix.preTranslate(v); + updateAcceleration(); + } + void accumPreShear(Axis axis0, Axis axis1, double shear) + { + mMatrix.preShear(axis0, axis1, shear); + updateAcceleration(); + } + //@} + + + //@{ + /// @brief Modify the existing affine map by post-applying the given operation. + void accumPostRotation(Axis axis, double radians) + { + mMatrix.postRotate(axis, radians); + updateAcceleration(); + } + void accumPostScale(const Vec3d& v) + { + mMatrix.postScale(v); + updateAcceleration(); + } + void accumPostTranslation(const Vec3d& v) + { + mMatrix.postTranslate(v); + updateAcceleration(); + } + void accumPostShear(Axis axis0, Axis axis1, double shear) + { + mMatrix.postShear(axis0, axis1, shear); + updateAcceleration(); + } + //@} + + + /// read serialization + void read(std::istream& is) + { + mMatrix.read(is); + updateAcceleration(); + } + + /// write serialization + void write(std::ostream& os) const + { + mMatrix.write(os); + } + + /// string serialization, useful for debugging + std::string str() const + { + std::ostringstream buffer; + buffer << " - mat4:\n" << mMatrix.str() << std::endl; + buffer << " - voxel dimensions: " << mVoxelSize << std::endl; + return buffer.str(); + } + + /// on-demand decomposition of the affine map + boost::shared_ptr createDecomposedMap() + { + return createFullyDecomposedMap(mMatrix); + } + + /// Return AffineMap::Ptr to a deep copy of the current AffineMap + AffineMap::Ptr getAffineMap() const { return AffineMap::Ptr(new AffineMap(*this)); } + + /// Return AffineMap::Ptr to the inverse of this map + AffineMap::Ptr inverse() const { return AffineMap::Ptr(new AffineMap(mMatrixInv)); } + + + //@{ + /// @brief Return a MapBase::Ptr to a new map that is the result + /// of prepending the appropraite operation. + MapBase::Ptr preRotate(double radians, Axis axis = X_AXIS) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPreRotation(axis, radians); + return simplify(affineMap); + } + MapBase::Ptr preTranslate(const Vec3d& t) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPreTranslation(t); + return boost::static_pointer_cast(affineMap); + } + MapBase::Ptr preScale(const Vec3d& s) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPreScale(s); + return boost::static_pointer_cast(affineMap); + } + MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPreShear(axis0, axis1, shear); + return simplify(affineMap); + } + //@} + + + //@{ + /// @brief Return a MapBase::Ptr to a new map that is the result + /// of postfixing the appropraite operation. + MapBase::Ptr postRotate(double radians, Axis axis = X_AXIS) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPostRotation(axis, radians); + return simplify(affineMap); + } + MapBase::Ptr postTranslate(const Vec3d& t) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPostTranslation(t); + return boost::static_pointer_cast(affineMap); + } + MapBase::Ptr postScale(const Vec3d& s) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPostScale(s); + return boost::static_pointer_cast(affineMap); + } + MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPostShear(axis0, axis1, shear); + return simplify(affineMap); + } + //@} + + /// Return the matrix representation of this AffineMap + Mat4d getMat4() const { return mMatrix;} + const Mat4d& getConstMat4() const {return mMatrix;} + const Mat3d& getConstJacobianInv() const {return mJacobianInv;} + +private: + void updateAcceleration() { + Mat3d mat3 = mMatrix.getMat3(); + mDeterminant = mat3.det(); + + if (std::abs(mDeterminant) < (3.0 * math::Tolerance::value())) { + OPENVDB_THROW(ArithmeticError, + "Tried to initialize an affine transform from a nearly singular matrix"); + } + mMatrixInv = mMatrix.inverse(); + mJacobianInv = mat3.inverse().transpose(); + mIsDiagonal = math::isDiagonal(mMatrix); + mIsIdentity = math::isIdentity(mMatrix); + Vec3d pos = applyMap(Vec3d(0,0,0)); + mVoxelSize(0) = (applyMap(Vec3d(1,0,0)) - pos).length(); + mVoxelSize(1) = (applyMap(Vec3d(0,1,0)) - pos).length(); + mVoxelSize(2) = (applyMap(Vec3d(0,0,1)) - pos).length(); + } + + // the underlying matrix + Mat4d mMatrix; + + // stored for acceleration + Mat4d mMatrixInv; + Mat3d mJacobianInv; + double mDeterminant; + Vec3d mVoxelSize; + bool mIsDiagonal, mIsIdentity; +}; // class AffineMap + + +//////////////////////////////////////// + + +/// @brief A specialized Affine transform that scales along the principal axis +/// the scaling need not be uniform in the three-directions +class OPENVDB_API ScaleMap: public MapBase +{ +public: + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + ScaleMap(): MapBase(), mScaleValues(Vec3d(1,1,1)), mVoxelSize(Vec3d(1,1,1)), + mScaleValuesInverse(Vec3d(1,1,1)), + mInvScaleSqr(1,1,1), mInvTwiceScale(0.5,0.5,0.5){} + + ScaleMap(const Vec3d& scale): + MapBase(), + mScaleValues(scale), + mVoxelSize(Vec3d(std::abs(scale(0)),std::abs(scale(1)), std::abs(scale(2)))) + { + double determinant = scale[0]* scale[1] * scale[2]; + if (std::abs(determinant) < 3.0 * math::Tolerance::value()) { + OPENVDB_THROW(ArithmeticError, "Non-zero scale values required"); + } + mScaleValuesInverse = 1.0 / mScaleValues; + mInvScaleSqr = mScaleValuesInverse * mScaleValuesInverse; + mInvTwiceScale = mScaleValuesInverse / 2; + } + + ScaleMap(const ScaleMap& other): + MapBase(), + mScaleValues(other.mScaleValues), + mVoxelSize(other.mVoxelSize), + mScaleValuesInverse(other.mScaleValuesInverse), + mInvScaleSqr(other.mInvScaleSqr), + mInvTwiceScale(other.mInvTwiceScale) + { + } + + ~ScaleMap() {} + + /// Return a MapBase::Ptr to a new ScaleMap + static MapBase::Ptr create() { return MapBase::Ptr(new ScaleMap()); } + /// Return a MapBase::Ptr to a deep copy of this map + MapBase::Ptr copy() const { return MapBase::Ptr(new ScaleMap(*this)); } + + MapBase::Ptr inverseMap() const { return MapBase::Ptr(new ScaleMap(mScaleValuesInverse)); } + + static bool isRegistered() { return MapRegistry::isRegistered(ScaleMap::mapType()); } + + static void registerMap() + { + MapRegistry::registerMap( + ScaleMap::mapType(), + ScaleMap::create); + } + + Name type() const { return mapType(); } + static Name mapType() { return Name("ScaleMap"); } + + /// Return @c true (a ScaleMap is always linear). + bool isLinear() const { return true; } + + /// Return @c true if the values have the same magitude (eg. -1, 1, -1 would be a rotation). + bool hasUniformScale() const + { + bool value = isApproxEqual( + std::abs(mScaleValues.x()), std::abs(mScaleValues.y()), double(5e-7)); + value = value && isApproxEqual( + std::abs(mScaleValues.x()), std::abs(mScaleValues.z()), double(5e-7)); + return value; + } + + /// Return the image of @c in under the map + Vec3d applyMap(const Vec3d& in) const + { + return Vec3d( + in.x() * mScaleValues.x(), + in.y() * mScaleValues.y(), + in.z() * mScaleValues.z()); + } + /// Return the pre-image of @c in under the map + Vec3d applyInverseMap(const Vec3d& in) const + { + return Vec3d( + in.x() * mScaleValuesInverse.x(), + in.y() * mScaleValuesInverse.y(), + in.z() * mScaleValuesInverse.z()); + } + /// Return the Jacobian of the map applied to @a in. + Vec3d applyJacobian(const Vec3d& in, const Vec3d&) const { return applyJacobian(in); } + /// Return the Jacobian of the map applied to @a in. + Vec3d applyJacobian(const Vec3d& in) const { return applyMap(in); } + + /// Return the Inverse Jacobian of the map applied to @a in. (i.e. inverse map with out translation) + Vec3d applyInverseJacobian(const Vec3d& in, const Vec3d&) const { return applyInverseJacobian(in); } + /// Return the Inverse Jacobian of the map applied to @a in. (i.e. inverse map with out translation) + Vec3d applyInverseJacobian(const Vec3d& in) const { return applyInverseMap(in); } + + /// Return the Jacobian Transpose of the map applied to @a in. + /// This tranforms range-space gradients to domain-space gradients + Vec3d applyJT(const Vec3d& in, const Vec3d&) const { return applyJT(in); } + /// Return the Jacobian Transpose of the map applied to @a in. + Vec3d applyJT(const Vec3d& in) const { return applyMap(in); } + + + + /// @brief Return the transpose of the inverse Jacobian of the map applied to @a in. + /// @details Ignores second argument + Vec3d applyIJT(const Vec3d& in, const Vec3d&) const { return applyIJT(in);} + /// Return the transpose of the inverse Jacobian of the map applied to @c in + Vec3d applyIJT(const Vec3d& in) const { return applyInverseMap(in); } + /// Return the Jacobian Curvature: zero for a linear map + Mat3d applyIJC(const Mat3d& in) const + { + Mat3d tmp; + for (int i = 0; i < 3; i++) { + tmp.setRow(i, in.row(i) * mScaleValuesInverse(i)); + } + for (int i = 0; i < 3; i++) { + tmp.setCol(i, tmp.col(i) * mScaleValuesInverse(i)); + } + return tmp; + } + Mat3d applyIJC(const Mat3d& in, const Vec3d&, const Vec3d&) const { return applyIJC(in); } + /// Return the product of the scale values, ignores argument + double determinant(const Vec3d&) const { return determinant(); } + /// Return the product of the scale values + double determinant() const { return mScaleValues.x() * mScaleValues.y() * mScaleValues.z(); } + + /// Return the scale values that define the map + const Vec3d& getScale() const {return mScaleValues;} + + /// Return the square of the scale. Used to optimize some finite difference calculations + const Vec3d& getInvScaleSqr() const { return mInvScaleSqr; } + /// Return 1/(2 scale). Used to optimize some finite difference calculations + const Vec3d& getInvTwiceScale() const { return mInvTwiceScale; } + /// Return 1/(scale) + const Vec3d& getInvScale() const { return mScaleValuesInverse; } + + //@{ + /// @brief Returns the lengths of the images + /// of the segments + /// \f$(0,0,0)-(1,0,0)\f$, \f$(0,0,0)-(0,1,0)\f$, \f$(0,0,0)-(0,0,1)\f$ + /// this is equivalent to the absolute values of the scale values + Vec3d voxelSize() const { return mVoxelSize; } + Vec3d voxelSize(const Vec3d&) const { return voxelSize(); } + //@} + + /// read serialization + void read(std::istream& is) + { + mScaleValues.read(is); + mVoxelSize.read(is); + mScaleValuesInverse.read(is); + mInvScaleSqr.read(is); + mInvTwiceScale.read(is); + } + /// write serialization + void write(std::ostream& os) const + { + mScaleValues.write(os); + mVoxelSize.write(os); + mScaleValuesInverse.write(os); + mInvScaleSqr.write(os); + mInvTwiceScale.write(os); + } + /// string serialization, useful for debuging + std::string str() const + { + std::ostringstream buffer; + buffer << " - scale: " << mScaleValues << std::endl; + buffer << " - voxel dimensions: " << mVoxelSize << std::endl; + return buffer.str(); + } + + virtual bool isEqual(const MapBase& other) const { return isEqualBase(*this, other); } + + bool operator==(const ScaleMap& other) const + { + // ::eq() uses a tolerance + if (!mScaleValues.eq(other.mScaleValues)) { return false; } + return true; + } + + bool operator!=(const ScaleMap& other) const { return !(*this == other); } + + /// Return a AffineMap equivalent to this map + AffineMap::Ptr getAffineMap() const + { + return AffineMap::Ptr(new AffineMap(math::scale(mScaleValues))); + } + + + + //@{ + /// @brief Return a MapBase::Ptr to a new map that is the result + /// of prepending the appropraite operation to the existing map + MapBase::Ptr preRotate(double radians, Axis axis) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPreRotation(axis, radians); + return simplify(affineMap); + } + + MapBase::Ptr preTranslate(const Vec3d& tr) const; + + MapBase::Ptr preScale(const Vec3d& v) const; + + MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPreShear(axis0, axis1, shear); + return simplify(affineMap); + } + //@} + + + //@{ + /// @brief Return a MapBase::Ptr to a new map that is the result + /// of prepending the appropraite operation to the existing map. + MapBase::Ptr postRotate(double radians, Axis axis) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPostRotation(axis, radians); + return simplify(affineMap); + } + + MapBase::Ptr postTranslate(const Vec3d& tr) const; + + MapBase::Ptr postScale(const Vec3d& v) const; + + MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPostShear(axis0, axis1, shear); + return simplify(affineMap); + } + //@} + +private: + Vec3d mScaleValues, mVoxelSize, mScaleValuesInverse, mInvScaleSqr, mInvTwiceScale; +}; // class ScaleMap + + +/// @brief A specialized Affine transform that scales along the principal axis +/// the scaling is uniform in the three-directions +class OPENVDB_API UniformScaleMap: public ScaleMap +{ +public: + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + UniformScaleMap(): ScaleMap(Vec3d(1,1,1)) {} + UniformScaleMap(double scale): ScaleMap(Vec3d(scale, scale, scale)) {} + UniformScaleMap(const UniformScaleMap& other): ScaleMap(other) {} + ~UniformScaleMap() {} + + /// Return a MapBase::Ptr to a new UniformScaleMap + static MapBase::Ptr create() { return MapBase::Ptr(new UniformScaleMap()); } + /// Return a MapBase::Ptr to a deep copy of this map + MapBase::Ptr copy() const { return MapBase::Ptr(new UniformScaleMap(*this)); } + + MapBase::Ptr inverseMap() const + { + const Vec3d& invScale = getInvScale(); + return MapBase::Ptr(new UniformScaleMap( invScale[0])); + } + + static bool isRegistered() { return MapRegistry::isRegistered(UniformScaleMap::mapType()); } + static void registerMap() + { + MapRegistry::registerMap( + UniformScaleMap::mapType(), + UniformScaleMap::create); + } + + Name type() const { return mapType(); } + static Name mapType() { return Name("UniformScaleMap"); } + + virtual bool isEqual(const MapBase& other) const { return isEqualBase(*this, other); } + + bool operator==(const UniformScaleMap& other) const { return ScaleMap::operator==(other); } + bool operator!=(const UniformScaleMap& other) const { return !(*this == other); } + + /// Return a MapBase::Ptr to a UniformScaleTraslateMap that is the result of + /// pre-translation on this map + MapBase::Ptr preTranslate(const Vec3d& tr) const; + + /// Return a MapBase::Ptr to a UniformScaleTraslateMap that is the result of + /// post-translation on this map + MapBase::Ptr postTranslate(const Vec3d& tr) const; + +}; // class UniformScaleMap + + +//////////////////////////////////////// + + +inline MapBase::Ptr +ScaleMap::preScale(const Vec3d& v) const +{ + const Vec3d new_scale(v * mScaleValues); + if (isApproxEqual(new_scale[0],new_scale[1]) && isApproxEqual(new_scale[0],new_scale[2])) { + return MapBase::Ptr(new UniformScaleMap(new_scale[0])); + } else { + return MapBase::Ptr(new ScaleMap(new_scale)); + } +} + + +inline MapBase::Ptr +ScaleMap::postScale(const Vec3d& v) const +{ // pre-post Scale are the same for a scale map + return preScale(v); +} + + +/// @brief A specialized linear transform that performs a translation +class OPENVDB_API TranslationMap: public MapBase +{ +public: + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + // default constructor is a translation by zero. + TranslationMap(): MapBase(), mTranslation(Vec3d(0,0,0)) {} + TranslationMap(const Vec3d& t): MapBase(), mTranslation(t) {} + TranslationMap(const TranslationMap& other): MapBase(), mTranslation(other.mTranslation) {} + + ~TranslationMap() {} + + /// Return a MapBase::Ptr to a new TranslationMap + static MapBase::Ptr create() { return MapBase::Ptr(new TranslationMap()); } + /// Return a MapBase::Ptr to a deep copy of this map + MapBase::Ptr copy() const { return MapBase::Ptr(new TranslationMap(*this)); } + + MapBase::Ptr inverseMap() const { return MapBase::Ptr(new TranslationMap(-mTranslation)); } + + static bool isRegistered() { return MapRegistry::isRegistered(TranslationMap::mapType()); } + + static void registerMap() + { + MapRegistry::registerMap( + TranslationMap::mapType(), + TranslationMap::create); + } + + Name type() const { return mapType(); } + static Name mapType() { return Name("TranslationMap"); } + + /// Return @c true (a TranslationMap is always linear). + bool isLinear() const { return true; } + + /// Return @c false (by convention true) + bool hasUniformScale() const { return true; } + + /// Return the image of @c in under the map + Vec3d applyMap(const Vec3d& in) const { return in + mTranslation; } + /// Return the pre-image of @c in under the map + Vec3d applyInverseMap(const Vec3d& in) const { return in - mTranslation; } + /// Return the Jacobian of the map applied to @a in. + Vec3d applyJacobian(const Vec3d& in, const Vec3d&) const { return applyJacobian(in); } + /// Return the Jacobian of the map applied to @a in. + Vec3d applyJacobian(const Vec3d& in) const { return in; } + + /// Return the Inverse Jacobian of the map applied to @a in. (i.e. inverse map with out translation) + Vec3d applyInverseJacobian(const Vec3d& in, const Vec3d&) const { return applyInverseJacobian(in); } + /// Return the Inverse Jacobian of the map applied to @a in. (i.e. inverse map with out translation) + Vec3d applyInverseJacobian(const Vec3d& in) const { return in; } + + + /// Return the Jacobian Transpose of the map applied to @a in. + /// This tranforms range-space gradients to domain-space gradients + Vec3d applyJT(const Vec3d& in, const Vec3d&) const { return applyJT(in); } + /// Return the Jacobian Transpose of the map applied to @a in. + Vec3d applyJT(const Vec3d& in) const { return in; } + + /// @brief Return the transpose of the inverse Jacobian (Identity for TranslationMap) + /// of the map applied to @c in, ignores second argument + Vec3d applyIJT(const Vec3d& in, const Vec3d& ) const { return applyIJT(in);} + /// @brief Return the transpose of the inverse Jacobian (Identity for TranslationMap) + /// of the map applied to @c in + Vec3d applyIJT(const Vec3d& in) const {return in;} + /// Return the Jacobian Curvature: zero for a linear map + Mat3d applyIJC(const Mat3d& mat) const {return mat;} + Mat3d applyIJC(const Mat3d& mat, const Vec3d&, const Vec3d&) const { return applyIJC(mat); } + + /// Return @c 1 + double determinant(const Vec3d& ) const { return determinant(); } + /// Return @c 1 + double determinant() const { return 1.0; } + + /// Return \f$ (1,1,1) \f$ + Vec3d voxelSize() const { return Vec3d(1,1,1);} + /// Return \f$ (1,1,1) \f$ + Vec3d voxelSize(const Vec3d&) const { return voxelSize();} + + /// Return the translation vector + const Vec3d& getTranslation() const { return mTranslation; } + /// read serialization + void read(std::istream& is) { mTranslation.read(is); } + /// write serialization + void write(std::ostream& os) const { mTranslation.write(os); } + + /// string serialization, useful for debuging + std::string str() const + { + std::ostringstream buffer; + buffer << " - translation: " << mTranslation << std::endl; + return buffer.str(); + } + + virtual bool isEqual(const MapBase& other) const { return isEqualBase(*this, other); } + + bool operator==(const TranslationMap& other) const + { + // ::eq() uses a tolerance + return mTranslation.eq(other.mTranslation); + } + + bool operator!=(const TranslationMap& other) const { return !(*this == other); } + + /// Return AffineMap::Ptr to an AffineMap equivalent to *this + AffineMap::Ptr getAffineMap() const + { + Mat4d matrix(Mat4d::identity()); + matrix.setTranslation(mTranslation); + + AffineMap::Ptr affineMap(new AffineMap(matrix)); + return affineMap; + } + + //@{ + /// @brief Return a MapBase::Ptr to a new map that is the result + /// of prepending the appropriate operation. + MapBase::Ptr preRotate(double radians, Axis axis) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPreRotation(axis, radians); + return simplify(affineMap); + + } + MapBase::Ptr preTranslate(const Vec3d& t) const + { + return MapBase::Ptr(new TranslationMap(t + mTranslation)); + } + + MapBase::Ptr preScale(const Vec3d& v) const; + + MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPreShear(axis0, axis1, shear); + return simplify(affineMap); + } + //@} + + //@{ + /// @brief Return a MapBase::Ptr to a new map that is the result + /// of postfixing the appropriate operation. + MapBase::Ptr postRotate(double radians, Axis axis) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPostRotation(axis, radians); + return simplify(affineMap); + + } + MapBase::Ptr postTranslate(const Vec3d& t) const + { // post and pre are the same for this + return MapBase::Ptr(new TranslationMap(t + mTranslation)); + } + + MapBase::Ptr postScale(const Vec3d& v) const; + + MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPostShear(axis0, axis1, shear); + return simplify(affineMap); + } + //@} + +private: + Vec3d mTranslation; +}; // class TranslationMap + + +//////////////////////////////////////// + + +/// @brief A specialized Affine transform that scales along the principal axis +/// the scaling need not be uniform in the three-directions, and then +/// translates the result. +class OPENVDB_API ScaleTranslateMap: public MapBase +{ +public: + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + ScaleTranslateMap(): + MapBase(), + mTranslation(Vec3d(0,0,0)), + mScaleValues(Vec3d(1,1,1)), + mVoxelSize(Vec3d(1,1,1)), + mScaleValuesInverse(Vec3d(1,1,1)), + mInvScaleSqr(1,1,1), + mInvTwiceScale(0.5,0.5,0.5) + { + } + + ScaleTranslateMap(const Vec3d& scale, const Vec3d& translate): + MapBase(), + mTranslation(translate), + mScaleValues(scale), + mVoxelSize(std::abs(scale(0)), std::abs(scale(1)), std::abs(scale(2))) + { + const double determinant = scale[0]* scale[1] * scale[2]; + if (std::abs(determinant) < 3.0 * math::Tolerance::value()) { + OPENVDB_THROW(ArithmeticError, "Non-zero scale values required"); + } + mScaleValuesInverse = 1.0 / mScaleValues; + mInvScaleSqr = mScaleValuesInverse * mScaleValuesInverse; + mInvTwiceScale = mScaleValuesInverse / 2; + } + + ScaleTranslateMap(const ScaleMap& scale, const TranslationMap& translate): + MapBase(), + mTranslation(translate.getTranslation()), + mScaleValues(scale.getScale()), + mVoxelSize(std::abs(mScaleValues(0)), + std::abs(mScaleValues(1)), + std::abs(mScaleValues(2))), + mScaleValuesInverse(1.0 / scale.getScale()) + { + mInvScaleSqr = mScaleValuesInverse * mScaleValuesInverse; + mInvTwiceScale = mScaleValuesInverse / 2; + } + + ScaleTranslateMap(const ScaleTranslateMap& other): + MapBase(), + mTranslation(other.mTranslation), + mScaleValues(other.mScaleValues), + mVoxelSize(other.mVoxelSize), + mScaleValuesInverse(other.mScaleValuesInverse), + mInvScaleSqr(other.mInvScaleSqr), + mInvTwiceScale(other.mInvTwiceScale) + {} + + ~ScaleTranslateMap() {} + + /// Return a MapBase::Ptr to a new ScaleTranslateMap + static MapBase::Ptr create() { return MapBase::Ptr(new ScaleTranslateMap()); } + /// Return a MapBase::Ptr to a deep copy of this map + MapBase::Ptr copy() const { return MapBase::Ptr(new ScaleTranslateMap(*this)); } + + MapBase::Ptr inverseMap() const + { + return MapBase::Ptr(new ScaleTranslateMap( + mScaleValuesInverse, -mScaleValuesInverse * mTranslation)); + } + + static bool isRegistered() { return MapRegistry::isRegistered(ScaleTranslateMap::mapType()); } + + static void registerMap() + { + MapRegistry::registerMap( + ScaleTranslateMap::mapType(), + ScaleTranslateMap::create); + } + + Name type() const { return mapType(); } + static Name mapType() { return Name("ScaleTranslateMap"); } + + /// Return @c true (a ScaleTranslateMap is always linear). + bool isLinear() const { return true; } + + /// @brief Return @c true if the scale values have the same magnitude + /// (eg. -1, 1, -1 would be a rotation). + bool hasUniformScale() const + { + bool value = isApproxEqual( + std::abs(mScaleValues.x()), std::abs(mScaleValues.y()), double(5e-7)); + value = value && isApproxEqual( + std::abs(mScaleValues.x()), std::abs(mScaleValues.z()), double(5e-7)); + return value; + } + + /// Return the image of @c under the map + Vec3d applyMap(const Vec3d& in) const + { + return Vec3d( + in.x() * mScaleValues.x() + mTranslation.x(), + in.y() * mScaleValues.y() + mTranslation.y(), + in.z() * mScaleValues.z() + mTranslation.z()); + } + /// Return the pre-image of @c under the map + Vec3d applyInverseMap(const Vec3d& in) const + { + return Vec3d( + (in.x() - mTranslation.x() ) * mScaleValuesInverse.x(), + (in.y() - mTranslation.y() ) * mScaleValuesInverse.y(), + (in.z() - mTranslation.z() ) * mScaleValuesInverse.z()); + } + + /// Return the Jacobian of the map applied to @a in. + Vec3d applyJacobian(const Vec3d& in, const Vec3d&) const { return applyJacobian(in); } + /// Return the Jacobian of the map applied to @a in. + Vec3d applyJacobian(const Vec3d& in) const { return in * mScaleValues; } + + /// Return the Inverse Jacobian of the map applied to @a in. (i.e. inverse map with out translation) + Vec3d applyInverseJacobian(const Vec3d& in, const Vec3d&) const { return applyInverseJacobian(in); } + /// Return the Inverse Jacobian of the map applied to @a in. (i.e. inverse map with out translation) + Vec3d applyInverseJacobian(const Vec3d& in) const { return in * mScaleValuesInverse; } + + /// Return the Jacobian Transpose of the map applied to @a in. + /// This tranforms range-space gradients to domain-space gradients + Vec3d applyJT(const Vec3d& in, const Vec3d&) const { return applyJT(in); } + /// Return the Jacobian Transpose of the map applied to @a in. + Vec3d applyJT(const Vec3d& in) const { return applyJacobian(in); } + + /// @brief Return the transpose of the inverse Jacobian of the map applied to @a in + /// @details Ignores second argument + Vec3d applyIJT(const Vec3d& in, const Vec3d& ) const { return applyIJT(in);} + /// Return the transpose of the inverse Jacobian of the map applied to @c in + Vec3d applyIJT(const Vec3d& in) const + { + return Vec3d( + in.x() * mScaleValuesInverse.x(), + in.y() * mScaleValuesInverse.y(), + in.z() * mScaleValuesInverse.z()); + } + /// Return the Jacobian Curvature: zero for a linear map + Mat3d applyIJC(const Mat3d& in) const + { + Mat3d tmp; + for (int i=0; i<3; i++){ + tmp.setRow(i, in.row(i)*mScaleValuesInverse(i)); + } + for (int i=0; i<3; i++){ + tmp.setCol(i, tmp.col(i)*mScaleValuesInverse(i)); + } + return tmp; + } + Mat3d applyIJC(const Mat3d& in, const Vec3d&, const Vec3d& ) const { return applyIJC(in); } + + /// Return the product of the scale values, ignores argument + double determinant(const Vec3d& ) const { return determinant(); } + /// Return the product of the scale values + double determinant() const { return mScaleValues.x()*mScaleValues.y()*mScaleValues.z(); } + /// Return the absolute values of the scale values + Vec3d voxelSize() const { return mVoxelSize;} + /// Return the absolute values of the scale values, ignores + ///argument + Vec3d voxelSize(const Vec3d&) const { return voxelSize();} + + /// Returns the scale values + const Vec3d& getScale() const { return mScaleValues; } + /// Returns the translation + const Vec3d& getTranslation() const { return mTranslation; } + + /// Return the square of the scale. Used to optimize some finite difference calculations + const Vec3d& getInvScaleSqr() const {return mInvScaleSqr;} + /// Return 1/(2 scale). Used to optimize some finite difference calculations + const Vec3d& getInvTwiceScale() const {return mInvTwiceScale;} + /// Return 1/(scale) + const Vec3d& getInvScale() const {return mScaleValuesInverse; } + + /// read serialization + void read(std::istream& is) + { + mTranslation.read(is); + mScaleValues.read(is); + mVoxelSize.read(is); + mScaleValuesInverse.read(is); + mInvScaleSqr.read(is); + mInvTwiceScale.read(is); + } + /// write serialization + void write(std::ostream& os) const + { + mTranslation.write(os); + mScaleValues.write(os); + mVoxelSize.write(os); + mScaleValuesInverse.write(os); + mInvScaleSqr.write(os); + mInvTwiceScale.write(os); + } + /// string serialization, useful for debuging + std::string str() const + { + std::ostringstream buffer; + buffer << " - translation: " << mTranslation << std::endl; + buffer << " - scale: " << mScaleValues << std::endl; + buffer << " - voxel dimensions: " << mVoxelSize << std::endl; + return buffer.str(); + } + + virtual bool isEqual(const MapBase& other) const { return isEqualBase(*this, other); } + + bool operator==(const ScaleTranslateMap& other) const + { + // ::eq() uses a tolerance + if (!mScaleValues.eq(other.mScaleValues)) { return false; } + if (!mTranslation.eq(other.mTranslation)) { return false; } + return true; + } + + bool operator!=(const ScaleTranslateMap& other) const { return !(*this == other); } + + /// Return AffineMap::Ptr to an AffineMap equivalent to *this + AffineMap::Ptr getAffineMap() const + { + AffineMap::Ptr affineMap(new AffineMap(math::scale(mScaleValues))); + affineMap->accumPostTranslation(mTranslation); + return affineMap; + } + + //@{ + /// @brief Return a MapBase::Ptr to a new map that is the result + /// of prepending the appropraite operation. + MapBase::Ptr preRotate(double radians, Axis axis) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPreRotation(axis, radians); + return simplify(affineMap); + } + MapBase::Ptr preTranslate(const Vec3d& t) const + { + const Vec3d& s = mScaleValues; + const Vec3d scaled_trans( t.x() * s.x(), + t.y() * s.y(), + t.z() * s.z() ); + return MapBase::Ptr( new ScaleTranslateMap(mScaleValues, mTranslation + scaled_trans)); + } + + MapBase::Ptr preScale(const Vec3d& v) const; + + MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPreShear(axis0, axis1, shear); + return simplify(affineMap); + } + //@} + + //@{ + /// @brief Return a MapBase::Ptr to a new map that is the result + /// of postfixing the appropraite operation. + MapBase::Ptr postRotate(double radians, Axis axis) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPostRotation(axis, radians); + return simplify(affineMap); + } + MapBase::Ptr postTranslate(const Vec3d& t) const + { + return MapBase::Ptr( new ScaleTranslateMap(mScaleValues, mTranslation + t)); + } + + MapBase::Ptr postScale(const Vec3d& v) const; + + MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPostShear(axis0, axis1, shear); + return simplify(affineMap); + } + //@} + +private: + Vec3d mTranslation, mScaleValues, mVoxelSize, mScaleValuesInverse, + mInvScaleSqr, mInvTwiceScale; +}; // class ScaleTanslateMap + + +inline MapBase::Ptr +ScaleMap::postTranslate(const Vec3d& t) const +{ + return MapBase::Ptr(new ScaleTranslateMap(mScaleValues, t)); +} + + +inline MapBase::Ptr +ScaleMap::preTranslate(const Vec3d& t) const +{ + + const Vec3d& s = mScaleValues; + const Vec3d scaled_trans( t.x() * s.x(), + t.y() * s.y(), + t.z() * s.z() ); + return MapBase::Ptr(new ScaleTranslateMap(mScaleValues, scaled_trans)); +} + + +/// @brief A specialized Affine transform that uniformaly scales along the principal axis +/// and then translates the result. +class OPENVDB_API UniformScaleTranslateMap: public ScaleTranslateMap +{ +public: + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + UniformScaleTranslateMap():ScaleTranslateMap(Vec3d(1,1,1), Vec3d(0,0,0)) {} + UniformScaleTranslateMap(double scale, const Vec3d& translate): + ScaleTranslateMap(Vec3d(scale,scale,scale), translate) {} + UniformScaleTranslateMap(const UniformScaleMap& scale, const TranslationMap& translate): + ScaleTranslateMap(scale.getScale(), translate.getTranslation()) {} + + UniformScaleTranslateMap(const UniformScaleTranslateMap& other):ScaleTranslateMap(other) {} + ~UniformScaleTranslateMap() {} + + /// Return a MapBase::Ptr to a new UniformScaleTranslateMap + static MapBase::Ptr create() { return MapBase::Ptr(new UniformScaleTranslateMap()); } + /// Return a MapBase::Ptr to a deep copy of this map + MapBase::Ptr copy() const { return MapBase::Ptr(new UniformScaleTranslateMap(*this)); } + + MapBase::Ptr inverseMap() const + { + const Vec3d& scaleInv = getInvScale(); + const Vec3d& trans = getTranslation(); + return MapBase::Ptr(new UniformScaleTranslateMap(scaleInv[0], -scaleInv[0] * trans)); + } + + static bool isRegistered() + { + return MapRegistry::isRegistered(UniformScaleTranslateMap::mapType()); + } + + static void registerMap() + { + MapRegistry::registerMap( + UniformScaleTranslateMap::mapType(), + UniformScaleTranslateMap::create); + } + + Name type() const { return mapType(); } + static Name mapType() { return Name("UniformScaleTranslateMap"); } + + virtual bool isEqual(const MapBase& other) const { return isEqualBase(*this, other); } + + bool operator==(const UniformScaleTranslateMap& other) const + { + return ScaleTranslateMap::operator==(other); + } + bool operator!=(const UniformScaleTranslateMap& other) const { return !(*this == other); } + + /// @brief Return a MapBase::Ptr to a UniformScaleTranslateMap that is + /// the result of prepending translation on this map. + MapBase::Ptr preTranslate(const Vec3d& t) const + { + const double scale = this->getScale().x(); + const Vec3d new_trans = this->getTranslation() + scale * t; + return MapBase::Ptr( new UniformScaleTranslateMap(scale, new_trans)); + } + + /// @brief Return a MapBase::Ptr to a UniformScaleTranslateMap that is + /// the result of postfixing translation on this map. + MapBase::Ptr postTranslate(const Vec3d& t) const + { + const double scale = this->getScale().x(); + return MapBase::Ptr( new UniformScaleTranslateMap(scale, this->getTranslation() + t)); + } +}; // class UniformScaleTanslateMap + + +inline MapBase::Ptr +UniformScaleMap::postTranslate(const Vec3d& t) const +{ + const double scale = this->getScale().x(); + return MapBase::Ptr(new UniformScaleTranslateMap(scale, t)); +} + + +inline MapBase::Ptr +UniformScaleMap::preTranslate(const Vec3d& t) const +{ + const double scale = this->getScale().x(); + return MapBase::Ptr(new UniformScaleTranslateMap(scale, scale*t)); +} + + +inline MapBase::Ptr +TranslationMap::preScale(const Vec3d& v) const +{ + if (isApproxEqual(v[0],v[1]) && isApproxEqual(v[0],v[2])) { + return MapBase::Ptr(new UniformScaleTranslateMap(v[0], mTranslation)); + } else { + return MapBase::Ptr(new ScaleTranslateMap(v, mTranslation)); + } +} + + +inline MapBase::Ptr +TranslationMap::postScale(const Vec3d& v) const +{ + if (isApproxEqual(v[0],v[1]) && isApproxEqual(v[0],v[2])) { + return MapBase::Ptr(new UniformScaleTranslateMap(v[0], v[0]*mTranslation)); + } else { + const Vec3d trans(mTranslation.x()*v.x(), + mTranslation.y()*v.y(), + mTranslation.z()*v.z()); + return MapBase::Ptr(new ScaleTranslateMap(v, trans)); + } +} + + +inline MapBase::Ptr +ScaleTranslateMap::preScale(const Vec3d& v) const +{ + const Vec3d new_scale( v * mScaleValues ); + if (isApproxEqual(new_scale[0],new_scale[1]) && isApproxEqual(new_scale[0],new_scale[2])) { + return MapBase::Ptr( new UniformScaleTranslateMap(new_scale[0], mTranslation)); + } else { + return MapBase::Ptr( new ScaleTranslateMap(new_scale, mTranslation)); + } +} + + +inline MapBase::Ptr +ScaleTranslateMap::postScale(const Vec3d& v) const +{ + const Vec3d new_scale( v * mScaleValues ); + const Vec3d new_trans( mTranslation.x()*v.x(), + mTranslation.y()*v.y(), + mTranslation.z()*v.z() ); + + if (isApproxEqual(new_scale[0],new_scale[1]) && isApproxEqual(new_scale[0],new_scale[2])) { + return MapBase::Ptr( new UniformScaleTranslateMap(new_scale[0], new_trans)); + } else { + return MapBase::Ptr( new ScaleTranslateMap(new_scale, new_trans)); + } +} + + +//////////////////////////////////////// + + +/// @brief A specialized linear transform that performs a unitary maping +/// i.e. rotation and or reflection. +class OPENVDB_API UnitaryMap: public MapBase +{ +public: + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + /// default constructor makes an Idenity. + UnitaryMap(): mAffineMap(Mat4d::identity()) + { + } + + UnitaryMap(const Vec3d& axis, double radians) + { + Mat3d matrix; + matrix.setToRotation(axis, radians); + mAffineMap = AffineMap(matrix); + } + + UnitaryMap(Axis axis, double radians) + { + Mat4d matrix; + matrix.setToRotation(axis, radians); + mAffineMap = AffineMap(matrix); + } + + UnitaryMap(const Mat3d& m) + { + // test that the mat3 is a rotation || reflection + if (!isUnitary(m)) { + OPENVDB_THROW(ArithmeticError, "Matrix initializing unitary map was not unitary"); + } + + Mat4d matrix(Mat4d::identity()); + matrix.setMat3(m); + mAffineMap = AffineMap(matrix); + } + + UnitaryMap(const Mat4d& m) + { + if (!isInvertible(m)) { + OPENVDB_THROW(ArithmeticError, + "4x4 Matrix initializing unitary map was not unitary: not invertible"); + } + + if (!isAffine(m)) { + OPENVDB_THROW(ArithmeticError, + "4x4 Matrix initializing unitary map was not unitary: not affine"); + } + + if (hasTranslation(m)) { + OPENVDB_THROW(ArithmeticError, + "4x4 Matrix initializing unitary map was not unitary: had translation"); + } + + if (!isUnitary(m.getMat3())) { + OPENVDB_THROW(ArithmeticError, + "4x4 Matrix initializing unitary map was not unitary"); + } + + mAffineMap = AffineMap(m); + } + + UnitaryMap(const UnitaryMap& other): + MapBase(other), + mAffineMap(other.mAffineMap) + { + } + + UnitaryMap(const UnitaryMap& first, const UnitaryMap& second): + mAffineMap(*(first.getAffineMap()), *(second.getAffineMap())) + { + } + + ~UnitaryMap() {} + /// Return a MapBase::Ptr to a new UnitaryMap + static MapBase::Ptr create() { return MapBase::Ptr(new UnitaryMap()); } + /// Returns a MapBase::Ptr to a deep copy of *this + MapBase::Ptr copy() const { return MapBase::Ptr(new UnitaryMap(*this)); } + + MapBase::Ptr inverseMap() const + { + return MapBase::Ptr(new UnitaryMap(mAffineMap.getMat4().inverse())); + } + + static bool isRegistered() { return MapRegistry::isRegistered(UnitaryMap::mapType()); } + + static void registerMap() + { + MapRegistry::registerMap( + UnitaryMap::mapType(), + UnitaryMap::create); + } + + /// Return @c UnitaryMap + Name type() const { return mapType(); } + /// Return @c UnitaryMap + static Name mapType() { return Name("UnitaryMap"); } + + /// Return @c true (a UnitaryMap is always linear). + bool isLinear() const { return true; } + + /// Return @c false (by convention true) + bool hasUniformScale() const { return true; } + + virtual bool isEqual(const MapBase& other) const { return isEqualBase(*this, other); } + + bool operator==(const UnitaryMap& other) const + { + // compare underlying linear map. + if (mAffineMap!=other.mAffineMap) return false; + return true; + } + + bool operator!=(const UnitaryMap& other) const { return !(*this == other); } + /// Return the image of @c in under the map + Vec3d applyMap(const Vec3d& in) const { return mAffineMap.applyMap(in); } + /// Return the pre-image of @c in under the map + Vec3d applyInverseMap(const Vec3d& in) const { return mAffineMap.applyInverseMap(in); } + + Vec3d applyJacobian(const Vec3d& in, const Vec3d&) const { return applyJacobian(in); } + /// Return the Jacobian of the map applied to @a in. + Vec3d applyJacobian(const Vec3d& in) const { return mAffineMap.applyJacobian(in); } + + /// Return the Inverse Jacobian of the map applied to @a in. (i.e. inverse map with out translation) + Vec3d applyInverseJacobian(const Vec3d& in, const Vec3d&) const { return applyInverseJacobian(in); } + /// Return the Inverse Jacobian of the map applied to @a in. (i.e. inverse map with out translation) + Vec3d applyInverseJacobian(const Vec3d& in) const { return mAffineMap.applyInverseJacobian(in); } + + + /// Return the Jacobian Transpose of the map applied to @a in. + /// This tranforms range-space gradients to domain-space gradients + Vec3d applyJT(const Vec3d& in, const Vec3d&) const { return applyJT(in); } + /// Return the Jacobian Transpose of the map applied to @a in. + Vec3d applyJT(const Vec3d& in) const { + // The transpose of the unitary map is its inverse + return applyInverseMap(in); + } + + + /// @brief Return the transpose of the inverse Jacobian of the map applied to @a in + /// @details Ignores second argument + Vec3d applyIJT(const Vec3d& in, const Vec3d& ) const { return applyIJT(in);} + /// Return the transpose of the inverse Jacobian of the map applied to @c in + Vec3d applyIJT(const Vec3d& in) const { return mAffineMap.applyIJT(in); } + /// Return the Jacobian Curvature: zero for a linear map + Mat3d applyIJC(const Mat3d& in) const { return mAffineMap.applyIJC(in); } + Mat3d applyIJC(const Mat3d& in, const Vec3d&, const Vec3d& ) const { return applyIJC(in); } + /// Return the determinant of the Jacobian, ignores argument + double determinant(const Vec3d& ) const { return determinant(); } + /// Return the determinant of the Jacobian + double determinant() const { return mAffineMap.determinant(); } + + + /// @brief Returns the lengths of the images + /// of the segments + /// \f$(0,0,0)-(1,0,0)\f$, \f$(0,0,0)-(0,1,0)\f$, + /// \f$(0,0,0)-(0,0,1)\f$ + Vec3d voxelSize() const { return mAffineMap.voxelSize();} + Vec3d voxelSize(const Vec3d&) const { return voxelSize();} + + /// read serialization + void read(std::istream& is) + { + mAffineMap.read(is); + } + + /// write serialization + void write(std::ostream& os) const + { + mAffineMap.write(os); + } + /// string serialization, useful for debuging + std::string str() const + { + std::ostringstream buffer; + buffer << mAffineMap.str(); + return buffer.str(); + } + /// Return AffineMap::Ptr to an AffineMap equivalent to *this + AffineMap::Ptr getAffineMap() const { return AffineMap::Ptr(new AffineMap(mAffineMap)); } + + //@{ + /// @brief Return a MapBase::Ptr to a new map that is the result + /// of prepending the appropraite operation. + MapBase::Ptr preRotate(double radians, Axis axis) const + { + UnitaryMap first(axis, radians); + UnitaryMap::Ptr unitaryMap(new UnitaryMap(first, *this)); + return boost::static_pointer_cast(unitaryMap); + } + MapBase::Ptr preTranslate(const Vec3d& t) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPreTranslation(t); + return simplify(affineMap); + } + MapBase::Ptr preScale(const Vec3d& v) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPreScale(v); + return simplify(affineMap); + } + MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPreShear(axis0, axis1, shear); + return simplify(affineMap); + } + //@} + + + //@{ + /// @brief Return a MapBase::Ptr to a new map that is the result + /// of postfixing the appropraite operation. + MapBase::Ptr postRotate(double radians, Axis axis) const + { + UnitaryMap second(axis, radians); + UnitaryMap::Ptr unitaryMap(new UnitaryMap(*this, second)); + return boost::static_pointer_cast(unitaryMap); + } + MapBase::Ptr postTranslate(const Vec3d& t) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPostTranslation(t); + return simplify(affineMap); + } + MapBase::Ptr postScale(const Vec3d& v) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPostScale(v); + return simplify(affineMap); + } + MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const + { + AffineMap::Ptr affineMap = getAffineMap(); + affineMap->accumPostShear(axis0, axis1, shear); + return simplify(affineMap); + } + //@} + +private: + AffineMap mAffineMap; +}; // class UnitaryMap + + +//////////////////////////////////////// + + +/// @brief This map is composed of three steps. +/// First it will take a box of size (Lx X Ly X Lz) defined by a member data bounding box +/// and map it into a frustum with near plane (1 X Ly/Lx) and prescribed depth +/// Then this frustum is transformed by an internal second map: most often a uniform scale, +/// but other effects can be achieved by accumulating translation, shear and rotation: these +/// are all applied to the second map +class OPENVDB_API NonlinearFrustumMap: public MapBase +{ +public: + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + NonlinearFrustumMap(): + MapBase(), + mBBox(Vec3d(0), Vec3d(1)), + mTaper(1), + mDepth(1) + { + init(); + } + + /// @brief Constructor that takes an index-space bounding box + /// to be mapped into a frustum with a given @a depth and @a taper + /// (defined as ratio of nearplane/farplane). + NonlinearFrustumMap(const BBoxd& bb, double taper, double depth): + MapBase(),mBBox(bb), mTaper(taper), mDepth(depth) + { + init(); + } + + /// @brief Constructor that takes an index-space bounding box + /// to be mapped into a frustum with a given @a depth and @a taper + /// (defined as ratio of nearplane/farplane). + /// @details This frustum is further modifed by the @a secondMap, + /// intended to be a simple translation and rotation and uniform scale + NonlinearFrustumMap(const BBoxd& bb, double taper, double depth, + const MapBase::Ptr& secondMap): + mBBox(bb), mTaper(taper), mDepth(depth) + { + if (!secondMap->isLinear() ) { + OPENVDB_THROW(ArithmeticError, + "The second map in the Frustum transfrom must be linear"); + } + mSecondMap = *( secondMap->getAffineMap() ); + init(); + } + + NonlinearFrustumMap(const NonlinearFrustumMap& other): + MapBase(), + mBBox(other.mBBox), + mTaper(other.mTaper), + mDepth(other.mDepth), + mSecondMap(other.mSecondMap), + mHasSimpleAffine(other.mHasSimpleAffine) + { + init(); + } + + /// @brief Constructor from a camera frustum + /// + /// @param position the tip of the frustum (i.e., the camera's position). + /// @param direction a vector pointing from @a position toward the near plane. + /// @param up a non-unit vector describing the direction and extent of + /// the frustum's intersection on the near plane. Together, + /// @a up must be orthogonal to @a direction. + /// @param aspect the aspect ratio of the frustum intersection with near plane + /// defined as width / height + /// @param z_near,depth the distance from @a position along @a direction to the + /// near and far planes of the frustum. + /// @param x_count the number of voxels, aligned with @a left, + /// across the face of the frustum + /// @param z_count the number of voxels, aligned with @a direction, + /// between the near and far planes + NonlinearFrustumMap(const Vec3d& position, + const Vec3d& direction, + const Vec3d& up, + double aspect /* width / height */, + double z_near, double depth, + Coord::ValueType x_count, Coord::ValueType z_count) { + + /// @todo check that depth > 0 + /// @todo check up.length > 0 + /// @todo check that direction dot up = 0 + if (!(depth > 0)) { + OPENVDB_THROW(ArithmeticError, + "The frustum depth must be non-zero and positive"); + } + if (!(up.length() > 0)) { + OPENVDB_THROW(ArithmeticError, + "The frustum height must be non-zero and positive"); + } + if (!(aspect > 0)) { + OPENVDB_THROW(ArithmeticError, + "The frustum aspect ratio must be non-zero and positive"); + } + if (!(isApproxEqual(up.dot(direction), 0.))) { + OPENVDB_THROW(ArithmeticError, + "The frustum up orientation must be perpendicular to into-frustum direction"); + } + + double near_plane_height = 2 * up.length(); + double near_plane_width = aspect * near_plane_height; + + Coord::ValueType y_count = static_cast(Round(x_count / aspect)); + + mBBox = BBoxd(Vec3d(0,0,0), Vec3d(x_count, y_count, z_count)); + mDepth = depth / near_plane_width; // depth non-dimensionalized on width + double gamma = near_plane_width / z_near; + mTaper = 1./(mDepth*gamma + 1.); + + Vec3d direction_unit = direction; + direction_unit.normalize(); + + Mat4d r1(Mat4d::identity()); + r1.setToRotation(/*from*/Vec3d(0,0,1), /*to */direction_unit); + Mat4d r2(Mat4d::identity()); + Vec3d temp = r1.inverse().transform(up); + r2.setToRotation(/*from*/Vec3d(0,1,0), /*to*/temp ); + Mat4d scale = math::scale( + Vec3d(near_plane_width, near_plane_width, near_plane_width)); + + // move the near plane to origin, rotate to align with axis, and scale down + // T_inv * R1_inv * R2_inv * scale_inv + Mat4d mat = scale * r2 * r1; + mat.setTranslation(position + z_near*direction_unit); + + mSecondMap = AffineMap(mat); + + init(); + } + + ~NonlinearFrustumMap(){} + /// Return a MapBase::Ptr to a new NonlinearFrustumMap + static MapBase::Ptr create() { return MapBase::Ptr(new NonlinearFrustumMap()); } + /// Return a MapBase::Ptr to a deep copy of this map + MapBase::Ptr copy() const { return MapBase::Ptr(new NonlinearFrustumMap(*this)); } + + /// @brief Not implemented, since there is currently no map type that can + /// represent the inverse of a frustum + /// @throw NotImplementedError + MapBase::Ptr inverseMap() const + { + OPENVDB_THROW(NotImplementedError, + "inverseMap() is not implemented for NonlinearFrustumMap"); + } + static bool isRegistered() { return MapRegistry::isRegistered(NonlinearFrustumMap::mapType()); } + + static void registerMap() + { + MapRegistry::registerMap( + NonlinearFrustumMap::mapType(), + NonlinearFrustumMap::create); + } + /// Return @c NonlinearFrustumMap + Name type() const { return mapType(); } + /// Return @c NonlinearFrustumMap + static Name mapType() { return Name("NonlinearFrustumMap"); } + + /// Return @c false (a NonlinearFrustumMap is never linear). + bool isLinear() const { return false; } + + /// Return @c false (by convention false) + bool hasUniformScale() const { return false; } + + /// Return @c true if the map is equivalent to an identity + bool isIdentity() const + { + // The frustum can only be consistent with a linear map if the taper value is 1 + if (!isApproxEqual(mTaper, double(1)) ) return false; + + // There are various ways an identity can decomposed between the two parts of the + // map. Best to just check that the principle vectors are stationary. + const Vec3d e1(1,0,0); + if (!applyMap(e1).eq(e1)) return false; + + const Vec3d e2(0,1,0); + if (!applyMap(e2).eq(e2)) return false; + + const Vec3d e3(0,0,1); + if (!applyMap(e3).eq(e3)) return false; + + return true; + } + + virtual bool isEqual(const MapBase& other) const { return isEqualBase(*this, other); } + + bool operator==(const NonlinearFrustumMap& other) const + { + if (mBBox!=other.mBBox) return false; + if (!isApproxEqual(mTaper, other.mTaper)) return false; + if (!isApproxEqual(mDepth, other.mDepth)) return false; + + // Two linear transforms are equivalent iff they have the same translation + // and have the same affects on orthongal spanning basis check translation + Vec3d e(0,0,0); + if (!mSecondMap.applyMap(e).eq(other.mSecondMap.applyMap(e))) return false; + /// check spanning vectors + e(0) = 1; + if (!mSecondMap.applyMap(e).eq(other.mSecondMap.applyMap(e))) return false; + e(0) = 0; + e(1) = 1; + if (!mSecondMap.applyMap(e).eq(other.mSecondMap.applyMap(e))) return false; + e(1) = 0; + e(2) = 1; + if (!mSecondMap.applyMap(e).eq(other.mSecondMap.applyMap(e))) return false; + return true; + } + + bool operator!=(const NonlinearFrustumMap& other) const { return !(*this == other); } + + /// Return the image of @c in under the map + Vec3d applyMap(const Vec3d& in) const + { + return mSecondMap.applyMap(applyFrustumMap(in)); + } + + /// Return the pre-image of @c in under the map + Vec3d applyInverseMap(const Vec3d& in) const + { + return applyFrustumInverseMap(mSecondMap.applyInverseMap(in)); + } + /// Return the Jacobian of the linear second map applied to @c in + Vec3d applyJacobian(const Vec3d& in) const { return mSecondMap.applyJacobian(in); } + /// Return the Jacobian defined at @c isloc applied to @c in + Vec3d applyJacobian(const Vec3d& in, const Vec3d& isloc) const + { + // Move the center of the x-face of the bbox + // to the origin in index space. + Vec3d centered(isloc); + centered = centered - mBBox.min(); + centered.x() -= mXo; + centered.y() -= mYo; + + // scale the z-direction on depth / K count + const double zprime = centered.z()*mDepthOnLz; + + const double scale = (mGamma * zprime + 1.) / mLx; + const double scale2 = mGamma * mDepthOnLz / mLx; + + const Vec3d tmp(scale * in.x() + scale2 * centered.x()* in.z(), + scale * in.y() + scale2 * centered.y()* in.z(), + mDepthOnLz * in.z()); + + return mSecondMap.applyJacobian(tmp); + } + + + /// Return the Inverse Jacobian of the map applied to @a in. (i.e. inverse map with out translation) + Vec3d applyInverseJacobian(const Vec3d& in) const { return mSecondMap.applyInverseJacobian(in); } + /// Return the Inverse Jacobian defined at @c isloc of the map applied to @a in. + Vec3d applyInverseJacobian(const Vec3d& in, const Vec3d& isloc) const { + + // Move the center of the x-face of the bbox + // to the origin in index space. + Vec3d centered(isloc); + centered = centered - mBBox.min(); + centered.x() -= mXo; + centered.y() -= mYo; + + // scale the z-direction on depth / K count + const double zprime = centered.z()*mDepthOnLz; + + const double scale = (mGamma * zprime + 1.) / mLx; + const double scale2 = mGamma * mDepthOnLz / mLx; + + + Vec3d out = mSecondMap.applyInverseJacobian(in); + + out.x() = (out.x() - scale2 * centered.x() * out.z() / mDepthOnLz) / scale; + out.y() = (out.y() - scale2 * centered.y() * out.z() / mDepthOnLz) / scale; + out.z() = out.z() / mDepthOnLz; + + return out; + } + + + + /// Return the Jacobian Transpose of the map applied to vector @c in at @c indexloc. + /// This tranforms range-space gradients to domain-space gradients. + /// + Vec3d applyJT(const Vec3d& in, const Vec3d& isloc) const { + const Vec3d tmp = mSecondMap.applyJT(in); + // Move the center of the x-face of the bbox + // to the origin in index space. + Vec3d centered(isloc); + centered = centered - mBBox.min(); + centered.x() -= mXo; + centered.y() -= mYo; + + // scale the z-direction on depth / K count + const double zprime = centered.z()*mDepthOnLz; + + const double scale = (mGamma * zprime + 1.) / mLx; + const double scale2 = mGamma * mDepthOnLz / mLx; + + return Vec3d(scale * tmp.x(), + scale * tmp.y(), + scale2 * centered.x()* tmp.x() + + scale2 * centered.y()* tmp.y() + + mDepthOnLz * tmp.z()); + } + /// Return the Jacobian Transpose of the second map applied to @c in. + Vec3d applyJT(const Vec3d& in) const { + return mSecondMap.applyJT(in); + } + + /// Return the transpose of the inverse Jacobian of the linear second map applied to @c in + Vec3d applyIJT(const Vec3d& in) const { return mSecondMap.applyIJT(in); } + + // the Jacobian of the nonlinear part of the transform is a sparse matrix + // Jacobian^(-T) = + // + // (Lx)( 1/s 0 0 ) + // ( 0 1/s 0 ) + // ( -(x-xo)g/(sLx) -(y-yo)g/(sLx) Lz/(Depth Lx) ) + /// Return the transpose of the inverse Jacobain (at @c locW applied to @c in. + /// @c ijk is the location in the pre-image space (e.g. index space) + Vec3d applyIJT(const Vec3d& d1_is, const Vec3d& ijk) const + { + const Vec3d loc = applyFrustumMap(ijk); + const double s = mGamma * loc.z() + 1.; + + // verify that we aren't at the singularity + if (isApproxEqual(s, 0.)) { + OPENVDB_THROW(ArithmeticError, "Tried to evaluate the frustum transform" + " at the singular focal point (e.g. camera)"); + } + + const double sinv = 1.0/s; // 1/(z*gamma + 1) + const double pt0 = mLx * sinv; // Lx / (z*gamma +1) + const double pt1 = mGamma * pt0; // gamma * Lx / ( z*gamma +1) + const double pt2 = pt1 * sinv; // gamma * Lx / ( z*gamma +1)**2 + + const Mat3d& jacinv = mSecondMap.getConstJacobianInv(); + + // compute \frac{\partial E_i}{\partial x_j} + Mat3d gradE(Mat3d::zero()); + for (int j = 0; j < 3; ++j ) { + gradE(0,j) = pt0 * jacinv(0,j) - pt2 * loc.x()*jacinv(2,j); + gradE(1,j) = pt0 * jacinv(1,j) - pt2 * loc.y()*jacinv(2,j); + gradE(2,j) = (1./mDepthOnLz) * jacinv(2,j); + } + + Vec3d result; + for (int i = 0; i < 3; ++i) { + result(i) = d1_is(0) * gradE(0,i) + d1_is(1) * gradE(1,i) + d1_is(2) * gradE(2,i); + } + + return result; + + } + + /// Return the Jacobian Curvature for the linear second map + Mat3d applyIJC(const Mat3d& in) const { return mSecondMap.applyIJC(in); } + /// Return the Jacobian Curvature: all the second derivatives in range space + /// @param d2_is second derivative matrix computed in index space + /// @param d1_is gradient computed in index space + /// @param ijk the index space location where the result is computed + Mat3d applyIJC(const Mat3d& d2_is, const Vec3d& d1_is, const Vec3d& ijk) const + { + const Vec3d loc = applyFrustumMap(ijk); + + const double s = mGamma * loc.z() + 1.; + + // verify that we aren't at the singularity + if (isApproxEqual(s, 0.)) { + OPENVDB_THROW(ArithmeticError, "Tried to evaluate the frustum transform" + " at the singular focal point (e.g. camera)"); + } + + // precompute + const double sinv = 1.0/s; // 1/(z*gamma + 1) + const double pt0 = mLx * sinv; // Lx / (z*gamma +1) + const double pt1 = mGamma * pt0; // gamma * Lx / ( z*gamma +1) + const double pt2 = pt1 * sinv; // gamma * Lx / ( z*gamma +1)**2 + const double pt3 = pt2 * sinv; // gamma * Lx / ( z*gamma +1)**3 + + const Mat3d& jacinv = mSecondMap.getConstJacobianInv(); + + // compute \frac{\partial^2 E_i}{\partial x_j \partial x_k} + + Mat3d matE0(Mat3d::zero()); + Mat3d matE1(Mat3d::zero()); // matE2 = 0 + for(int j = 0; j < 3; j++) { + for (int k = 0; k < 3; k++) { + + const double pt4 = 2. * jacinv(2,j) * jacinv(2,k) * pt3; + + matE0(j,k) = -(jacinv(0,j) * jacinv(2,k) + jacinv(2,j) * jacinv(0,k)) * pt2 + + pt4 * loc.x(); + + matE1(j,k) = -(jacinv(1,j) * jacinv(2,k) + jacinv(2,j) * jacinv(1,k)) * pt2 + + pt4 * loc.y(); + } + } + + // compute \frac{\partial E_i}{\partial x_j} + Mat3d gradE(Mat3d::zero()); + for (int j = 0; j < 3; ++j ) { + gradE(0,j) = pt0 * jacinv(0,j) - pt2 * loc.x()*jacinv(2,j); + gradE(1,j) = pt0 * jacinv(1,j) - pt2 * loc.y()*jacinv(2,j); + gradE(2,j) = (1./mDepthOnLz) * jacinv(2,j); + } + + Mat3d result(Mat3d::zero()); + // compute \fac{\partial E_j}{\partial x_m} \fac{\partial E_i}{\partial x_n} + // \frac{\partial^2 input}{\partial E_i \partial E_j} + for (int m = 0; m < 3; ++m ) { + for ( int n = 0; n < 3; ++n) { + for (int i = 0; i < 3; ++i ) { + for (int j = 0; j < 3; ++j) { + result(m, n) += gradE(j, m) * gradE(i, n) * d2_is(i, j); + } + } + } + } + + for (int m = 0; m < 3; ++m ) { + for ( int n = 0; n < 3; ++n) { + result(m, n) += + matE0(m, n) * d1_is(0) + matE1(m, n) * d1_is(1);// + matE2(m, n) * d1_is(2); + } + } + + return result; + } + + /// Return the determinant of the Jacobian of linear second map + double determinant() const {return mSecondMap.determinant();} // no implementation + + /// Return the determinate of the Jacobian evaluated at @c loc + /// @c loc is a location in the pre-image space (e.g., index space) + double determinant(const Vec3d& loc) const + { + double s = mGamma * loc.z() + 1.0; + double frustum_determinant = s * s * mDepthOnLzLxLx; + return mSecondMap.determinant() * frustum_determinant; + } + + /// Return the size of a voxel at the center of the near plane + Vec3d voxelSize() const + { + const Vec3d loc( 0.5*(mBBox.min().x() + mBBox.max().x()), + 0.5*(mBBox.min().y() + mBBox.max().y()), + mBBox.min().z()); + + return voxelSize(loc); + + } + + /// @brief Returns the lengths of the images of the three segments + /// from @a loc to @a loc + (1,0,0), from @a loc to @a loc + (0,1,0) + /// and from @a loc to @a loc + (0,0,1) + /// @param loc a location in the pre-image space (e.g., index space) + Vec3d voxelSize(const Vec3d& loc) const + { + Vec3d out, pos = applyMap(loc); + out(0) = (applyMap(loc + Vec3d(1,0,0)) - pos).length(); + out(1) = (applyMap(loc + Vec3d(0,1,0)) - pos).length(); + out(2) = (applyMap(loc + Vec3d(0,0,1)) - pos).length(); + return out; + } + + AffineMap::Ptr getAffineMap() const { return mSecondMap.getAffineMap(); } + + /// set the taper value, the ratio of nearplane width / far plane width + void setTaper(double t) { mTaper = t; init();} + /// Return the taper value. + double getTaper() const { return mTaper; } + /// set the frustum depth: distance between near and far plane = frustm depth * frustm x-width + void setDepth(double d) { mDepth = d; init();} + /// Return the unscaled frustm depth + double getDepth() const { return mDepth; } + // gamma a non-dimensional number: nearplane x-width / camera to near plane distance + double getGamma() const { return mGamma; } + + /// Return the bounding box that defines the frustum in pre-image space + const BBoxd& getBBox() const { return mBBox; } + + /// Return MapBase::Ptr& to the second map + const AffineMap& secondMap() const { return mSecondMap; } + /// Return @c true if the the bounding box in index space that defines the region that + /// is maped into the frustum is non-zero, otherwise @c false + bool isValid() const { return !mBBox.empty();} + + /// Return @c true if the second map is a uniform scale, Rotation and translation + bool hasSimpleAffine() const { return mHasSimpleAffine; } + + /// read serialization + void read(std::istream& is) + { + // for backward compatibility with earlier version + if (io::getFormatVersion(is) < OPENVDB_FILE_VERSION_FLOAT_FRUSTUM_BBOX ) { + CoordBBox bb; + bb.read(is); + mBBox = BBoxd(bb.min().asVec3d(), bb.max().asVec3d()); + } else { + mBBox.read(is); + } + + is.read(reinterpret_cast(&mTaper), sizeof(double)); + is.read(reinterpret_cast(&mDepth), sizeof(double)); + + // Read the second maps type. + Name type = readString(is); + + // Check if the map has been registered. + if(!MapRegistry::isRegistered(type)) { + OPENVDB_THROW(KeyError, "Map " << type << " is not registered"); + } + + // Create the second map of the type and then read it in. + MapBase::Ptr proxy = math::MapRegistry::createMap(type); + proxy->read(is); + mSecondMap = *(proxy->getAffineMap()); + init(); + } + + /// write serialization + void write(std::ostream& os) const + { + mBBox.write(os); + os.write(reinterpret_cast(&mTaper), sizeof(double)); + os.write(reinterpret_cast(&mDepth), sizeof(double)); + + writeString(os, mSecondMap.type()); + mSecondMap.write(os); + } + + /// string serialization, useful for debuging + std::string str() const + { + std::ostringstream buffer; + buffer << " - taper: " << mTaper << std::endl; + buffer << " - depth: " << mDepth << std::endl; + buffer << " SecondMap: "<< mSecondMap.type() << std::endl; + buffer << mSecondMap.str() << std::endl; + return buffer.str(); + } + + //@{ + /// @brief Return a MapBase::Ptr to a new map that is the result + /// of prepending the appropriate operation to the linear part of this map + MapBase::Ptr preRotate(double radians, Axis axis = X_AXIS) const + { + return MapBase::Ptr( + new NonlinearFrustumMap(mBBox, mTaper, mDepth, mSecondMap.preRotate(radians, axis))); + } + MapBase::Ptr preTranslate(const Vec3d& t) const + { + return MapBase::Ptr( + new NonlinearFrustumMap(mBBox, mTaper, mDepth, mSecondMap.preTranslate(t))); + } + MapBase::Ptr preScale(const Vec3d& s) const + { + return MapBase::Ptr( + new NonlinearFrustumMap(mBBox, mTaper, mDepth, mSecondMap.preScale(s))); + } + MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const + { + return MapBase::Ptr(new NonlinearFrustumMap( + mBBox, mTaper, mDepth, mSecondMap.preShear(shear, axis0, axis1))); + } + //@} + + //@{ + /// @brief Return a MapBase::Ptr to a new map that is the result + /// of postfixing the appropiate operation to the linear part of this map. + MapBase::Ptr postRotate(double radians, Axis axis = X_AXIS) const + { + return MapBase::Ptr( + new NonlinearFrustumMap(mBBox, mTaper, mDepth, mSecondMap.postRotate(radians, axis))); + } + MapBase::Ptr postTranslate(const Vec3d& t) const + { + return MapBase::Ptr( + new NonlinearFrustumMap(mBBox, mTaper, mDepth, mSecondMap.postTranslate(t))); + } + MapBase::Ptr postScale(const Vec3d& s) const + { + return MapBase::Ptr( + new NonlinearFrustumMap(mBBox, mTaper, mDepth, mSecondMap.postScale(s))); + } + MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const + { + return MapBase::Ptr(new NonlinearFrustumMap( + mBBox, mTaper, mDepth, mSecondMap.postShear(shear, axis0, axis1))); + } + //@} + +private: + void init() + { + // set up as a frustum + mLx = mBBox.extents().x(); + mLy = mBBox.extents().y(); + mLz = mBBox.extents().z(); + + if (isApproxEqual(mLx,0.) || isApproxEqual(mLy,0.) || isApproxEqual(mLz,0.) ) { + OPENVDB_THROW(ArithmeticError, "The index space bounding box" + " must have at least two index points in each direction."); + } + + mXo = 0.5* mLx; + mYo = 0.5* mLy; + + // mDepth is non-dimensionalized on near + mGamma = (1./mTaper - 1) / mDepth; + + mDepthOnLz = mDepth/mLz; + mDepthOnLzLxLx = mDepthOnLz/(mLx * mLx); + + /// test for shear and non-uniform scale + mHasSimpleAffine = true; + Vec3d tmp = mSecondMap.voxelSize(); + + /// false if there is non-uniform scale + if (!isApproxEqual(tmp(0), tmp(1))) { mHasSimpleAffine = false; return; } + if (!isApproxEqual(tmp(0), tmp(2))) { mHasSimpleAffine = false; return; } + + Vec3d trans = mSecondMap.applyMap(Vec3d(0,0,0)); + /// look for shear + Vec3d tmp1 = mSecondMap.applyMap(Vec3d(1,0,0)) - trans; + Vec3d tmp2 = mSecondMap.applyMap(Vec3d(0,1,0)) - trans; + Vec3d tmp3 = mSecondMap.applyMap(Vec3d(0,0,1)) - trans; + + /// false if there is shear + if (!isApproxEqual(tmp1.dot(tmp2), 0., 1.e-7)) { mHasSimpleAffine = false; return; } + if (!isApproxEqual(tmp2.dot(tmp3), 0., 1.e-7)) { mHasSimpleAffine = false; return; } + if (!isApproxEqual(tmp3.dot(tmp1), 0., 1.e-7)) { mHasSimpleAffine = false; return; } + } + + Vec3d applyFrustumMap(const Vec3d& in) const + { + + // Move the center of the x-face of the bbox + // to the origin in index space. + Vec3d out(in); + out = out - mBBox.min(); + out.x() -= mXo; + out.y() -= mYo; + + // scale the z-direction on depth / K count + out.z() *= mDepthOnLz; + + double scale = (mGamma * out.z() + 1.)/ mLx; + + // scale the x-y on the length I count and apply tapper + out.x() *= scale ; + out.y() *= scale ; + + return out; + } + + Vec3d applyFrustumInverseMap(const Vec3d& in) const + { + // invert taper and resize: scale = 1/( (z+1)/2 (mt-1) + 1) + Vec3d out(in); + double invScale = mLx / (mGamma * out.z() + 1.); + out.x() *= invScale; + out.y() *= invScale; + + out.x() += mXo; + out.y() += mYo; + + out.z() /= mDepthOnLz; + + // move back + out = out + mBBox.min(); + return out; + } + + // bounding box in index space used in Frustum transforms. + BBoxd mBBox; + + // taper value used in constructing Frustums. + double mTaper; + double mDepth; + + // defines the second map + AffineMap mSecondMap; + + // these are derived from the above. + double mLx, mLy, mLz; + double mXo, mYo, mGamma, mDepthOnLz, mDepthOnLzLxLx; + + // true: if the mSecondMap is linear and has no shear, and has no non-uniform scale + bool mHasSimpleAffine; +}; // class NonlinearFrustumMap + + +//////////////////////////////////////// + + +/// @brief Creates the composition of two maps, each of which could be a composition. +/// In the case that each component of the composition classified as linear an +/// acceleration AffineMap is stored. +template +class CompoundMap +{ +public: + typedef CompoundMap MyType; + + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + + CompoundMap() { updateAffineMatrix(); } + + CompoundMap(const FirstMapType& f, const SecondMapType& s): mFirstMap(f), mSecondMap(s) + { + updateAffineMatrix(); + } + + CompoundMap(const MyType& other): + mFirstMap(other.mFirstMap), + mSecondMap(other.mSecondMap), + mAffineMap(other.mAffineMap) + {} + + Name type() const { return mapType(); } + static Name mapType() + { + return (FirstMapType::mapType() + Name(":") + SecondMapType::mapType()); + } + + bool operator==(const MyType& other) const + { + if (mFirstMap != other.mFirstMap) return false; + if (mSecondMap != other.mSecondMap) return false; + if (mAffineMap != other.mAffineMap) return false; + return true; + } + + bool operator!=(const MyType& other) const { return !(*this == other); } + + MyType& operator=(const MyType& other) + { + mFirstMap = other.mFirstMap; + mSecondMap = other.mSecondMap; + mAffineMap = other.mAffineMap; + return *this; + } + + bool isIdentity() const + { + if (is_linear::value) { + return mAffineMap.isIdentity(); + } else { + return mFirstMap.isIdentity()&&mSecondMap.isIdentity(); + } + } + + bool isDiagonal() const { + if (is_linear::value) { + return mAffineMap.isDiagonal(); + } else { + return mFirstMap.isDiagonal()&&mSecondMap.isDiagonal(); + } + } + + AffineMap::Ptr getAffineMap() const + { + if (is_linear::value) { + AffineMap::Ptr affine(new AffineMap(mAffineMap)); + return affine; + } else { + OPENVDB_THROW(ArithmeticError, + "Constant affine matrix representation not possible for this nonlinear map"); + } + } + + // direct decompotion + const FirstMapType& firstMap() const { return mFirstMap; } + const SecondMapType& secondMap() const {return mSecondMap; } + + void setFirstMap(const FirstMapType& first) { mFirstMap = first; updateAffineMatrix(); } + void setSecondMap(const SecondMapType& second) { mSecondMap = second; updateAffineMatrix(); } + + void read(std::istream& is) + { + mAffineMap.read(is); + mFirstMap.read(is); + mSecondMap.read(is); + } + void write(std::ostream& os) const + { + mAffineMap.write(os); + mFirstMap.write(os); + mSecondMap.write(os); + } + +private: + void updateAffineMatrix() + { + if (is_linear::value) { + // both maps need to be linear, these methods are only defined for linear maps + AffineMap::Ptr first = mFirstMap.getAffineMap(); + AffineMap::Ptr second= mSecondMap.getAffineMap(); + mAffineMap = AffineMap(*first, *second); + } + } + + FirstMapType mFirstMap; + SecondMapType mSecondMap; + // used for acceleration + AffineMap mAffineMap; +}; // class CompoundMap + +} // namespace math +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_MATH_MAPS_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/math/Mat.h b/nuparu/include/openvdb/include/openvdb/math/Mat.h new file mode 100644 index 00000000..d413e77d --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/math/Mat.h @@ -0,0 +1,1026 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file Mat.h +/// @author Joshua Schpok + +#ifndef OPENVDB_MATH_MAT_HAS_BEEN_INCLUDED +#define OPENVDB_MATH_MAT_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include "Math.h" + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace math { + +/// @class Mat "Mat.h" +/// A base class for square matrices. +template +class Mat +{ +public: + typedef T value_type; + typedef T ValueType; + enum SIZE_ { size = SIZE }; + + // Number of cols, rows, elements + static unsigned numRows() { return SIZE; } + static unsigned numColumns() { return SIZE; } + static unsigned numElements() { return SIZE*SIZE; } + + /// Default ctor. Does nothing. Required because declaring a copy (or + /// other) constructor means the default constructor gets left out. + Mat() { } + + /// Copy constructor. Used when the class signature matches exactly. + Mat(Mat const &src) { + for (unsigned i(0); i < numElements(); ++i) { + mm[i] = src.mm[i]; + } + } + + /// @return string representation of matrix + /// Since output is multiline, optional indentation argument prefixes + /// each newline with that much white space. It does not indent + /// the first line, since you might be calling this inline: + /// + /// cout << "matrix: " << mat.str(7) + /// + /// matrix: [[1 2] + /// [3 4]] + std::string + str(unsigned indentation = 0) const { + + std::string ret; + std::string indent; + + // We add +1 since we're indenting one for the first '[' + indent.append(indentation+1, ' '); + + ret.append("["); + + // For each row, + for (unsigned i(0); i < SIZE; i++) { + + ret.append("["); + + // For each column + for (unsigned j(0); j < SIZE; j++) { + + // Put a comma after everything except the last + if (j) ret.append(", "); + ret.append((boost::format("%1%") % mm[(i*SIZE)+j]).str()); + } + + ret.append("]"); + + // At the end of every row (except the last)... + if (i < SIZE-1 ) + // ...suffix the row bracket with a comma, newline, and + // advance indentation + ret.append((boost::format(",\n%1%") % indent).str()); + } + + ret.append("]"); + + return ret; + } + + /// Write a Mat to an output stream + friend std::ostream& operator<<( + std::ostream& ostr, + const Mat& m) + { + ostr << m.str(); + return ostr; + } + + void write(std::ostream& os) const { + os.write(reinterpret_cast(&mm), sizeof(T)*SIZE*SIZE); + } + + void read(std::istream& is) { + is.read(reinterpret_cast(&mm), sizeof(T)*SIZE*SIZE); + } + + +protected: + T mm[SIZE*SIZE]; +}; + + +template class Quat; +template class Vec3; + +/// @brief Return the rotation matrix specified by the given quaternion. +/// @details The quaternion is normalized and used to construct the matrix. +/// Note that the matrix is transposed to match post-multiplication semantics. +template +MatType +rotation(const Quat &q, + typename MatType::value_type eps = static_cast(1.0e-8)) +{ + typedef typename MatType::value_type T; + + T qdot(q.dot(q)); + T s(0); + + if (!isApproxEqual(qdot, T(0.0),eps)) { + s = T(2.0 / qdot); + } + + T x = s*q.x(); + T y = s*q.y(); + T z = s*q.z(); + T wx = x*q.w(); + T wy = y*q.w(); + T wz = z*q.w(); + T xx = x*q.x(); + T xy = y*q.x(); + T xz = z*q.x(); + T yy = y*q.y(); + T yz = z*q.y(); + T zz = z*q.z(); + + MatType r; + r[0][0]=T(1) - (yy+zz); r[0][1]=xy + wz; r[0][2]=xz - wy; + r[1][0]=xy - wz; r[1][1]=T(1) - (xx+zz); r[1][2]=yz + wx; + r[2][0]=xz + wy; r[2][1]=yz - wx; r[2][2]=T(1) - (xx+yy); + + if(MatType::numColumns() == 4) padMat4(r); + return r; +} + + + +/// @brief Return a matrix for rotation by @a angle radians about the given @a axis. +/// @param axis The axis (one of X, Y, Z) to rotate about. +/// @param angle The rotation angle, in radians. +template +MatType +rotation(Axis axis, typename MatType::value_type angle) +{ + typedef typename MatType::value_type T; + T c = static_cast(cos(angle)); + T s = static_cast(sin(angle)); + + MatType result; + result.setIdentity(); + + switch (axis) { + case X_AXIS: + result[1][1] = c; + result[1][2] = s; + result[2][1] = -s; + result[2][2] = c; + return result; + case Y_AXIS: + result[0][0] = c; + result[0][2] = -s; + result[2][0] = s; + result[2][2] = c; + return result; + case Z_AXIS: + result[0][0] = c; + result[0][1] = s; + result[1][0] = -s; + result[1][1] = c; + return result; + default: + throw ValueError("Unrecognized rotation axis"); + } +} + + +/// @brief Return a matrix for rotation by @a angle radians about the given @a axis. +/// @note The axis must be a unit vector. +template +MatType +rotation(const Vec3 &_axis, typename MatType::value_type angle) +{ + typedef typename MatType::value_type T; + T txy, txz, tyz, sx, sy, sz; + + Vec3 axis(_axis.unit()); + + // compute trig properties of angle: + T c(cos(double(angle))); + T s(sin(double(angle))); + T t(1 - c); + + MatType result; + // handle diagonal elements + result[0][0] = axis[0]*axis[0] * t + c; + result[1][1] = axis[1]*axis[1] * t + c; + result[2][2] = axis[2]*axis[2] * t + c; + + txy = axis[0]*axis[1] * t; + sz = axis[2] * s; + + txz = axis[0]*axis[2] * t; + sy = axis[1] * s; + + tyz = axis[1]*axis[2] * t; + sx = axis[0] * s; + + // right handed space + // Contribution from rotation about 'z' + result[0][1] = txy + sz; + result[1][0] = txy - sz; + // Contribution from rotation about 'y' + result[0][2] = txz - sy; + result[2][0] = txz + sy; + // Contribution from rotation about 'x' + result[1][2] = tyz + sx; + result[2][1] = tyz - sx; + + if(MatType::numColumns() == 4) padMat4(result); + return MatType(result); +} + + +/// @brief Return the Euler angles composing the given rotation matrix. +/// @details Optional axes arguments describe in what order elementary rotations +/// are applied. Note that in our convention, XYZ means Rz * Ry * Rx. +/// Because we are using rows rather than columns to represent the +/// local axes of a coordinate frame, the interpretation from a local +/// reference point of view is to first rotate about the x axis, then +/// about the newly rotated y axis, and finally by the new local z axis. +/// From a fixed reference point of view, the interpretation is to +/// rotate about the stationary world z, y, and x axes respectively. +/// +/// Irrespective of the Euler angle convention, in the case of distinct +/// axes, eulerAngles() returns the x, y, and z angles in the corresponding +/// x, y, z components of the returned Vec3. For the XZX convention, the +/// left X value is returned in Vec3.x, and the right X value in Vec3.y. +/// For the ZXZ convention the left Z value is returned in Vec3.z and +/// the right Z value in Vec3.y +/// +/// Examples of reconstructing r from its Euler angle decomposition +/// +/// v = eulerAngles(r, ZYX_ROTATION); +/// rx.setToRotation(Vec3d(1,0,0), v[0]); +/// ry.setToRotation(Vec3d(0,1,0), v[1]); +/// rz.setToRotation(Vec3d(0,0,1), v[2]); +/// r = rx * ry * rz; +/// +/// v = eulerAngles(r, ZXZ_ROTATION); +/// rz1.setToRotation(Vec3d(0,0,1), v[2]); +/// rx.setToRotation (Vec3d(1,0,0), v[0]); +/// rz2.setToRotation(Vec3d(0,0,1), v[1]); +/// r = rz2 * rx * rz1; +/// +/// v = eulerAngles(r, XZX_ROTATION); +/// rx1.setToRotation (Vec3d(1,0,0), v[0]); +/// rx2.setToRotation (Vec3d(1,0,0), v[1]); +/// rz.setToRotation (Vec3d(0,0,1), v[2]); +/// r = rx2 * rz * rx1; +/// +template +Vec3 +eulerAngles( + const MatType& mat, + RotationOrder rotationOrder, + typename MatType::value_type eps = static_cast(1.0e-8)) +{ + typedef typename MatType::value_type ValueType; + typedef Vec3 V; + ValueType phi, theta, psi; + + switch(rotationOrder) + { + case XYZ_ROTATION: + if (isApproxEqual(mat[2][0], ValueType(1.0), eps)) { + theta = ValueType(M_PI_2); + phi = ValueType(0.5 * atan2(mat[1][2], mat[1][1])); + psi = phi; + } else if (isApproxEqual(mat[2][0], ValueType(-1.0), eps)) { + theta = ValueType(-M_PI_2); + phi = ValueType(0.5 * atan2(mat[1][2], mat[1][1])); + psi = -phi; + } else { + psi = ValueType(atan2(-mat[1][0],mat[0][0])); + phi = ValueType(atan2(-mat[2][1],mat[2][2])); + theta = ValueType(atan2(mat[2][0], + sqrt( mat[2][1]*mat[2][1] + + mat[2][2]*mat[2][2]))); + } + return V(phi, theta, psi); + case ZXY_ROTATION: + if (isApproxEqual(mat[1][2], ValueType(1.0), eps)) { + theta = ValueType(M_PI_2); + phi = ValueType(0.5 * atan2(mat[0][1], mat[0][0])); + psi = phi; + } else if (isApproxEqual(mat[1][2], ValueType(-1.0), eps)) { + theta = ValueType(-M_PI/2); + phi = ValueType(0.5 * atan2(mat[0][1],mat[2][1])); + psi = -phi; + } else { + psi = ValueType(atan2(-mat[0][2], mat[2][2])); + phi = ValueType(atan2(-mat[1][0], mat[1][1])); + theta = ValueType(atan2(mat[1][2], + sqrt(mat[0][2] * mat[0][2] + + mat[2][2] * mat[2][2]))); + } + return V(theta, psi, phi); + + case YZX_ROTATION: + if (isApproxEqual(mat[0][1], ValueType(1.0), eps)) { + theta = ValueType(M_PI_2); + phi = ValueType(0.5 * atan2(mat[2][0], mat[2][2])); + psi = phi; + } else if (isApproxEqual(mat[0][1], ValueType(-1.0), eps)) { + theta = ValueType(-M_PI/2); + phi = ValueType(0.5 * atan2(mat[2][0], mat[1][0])); + psi = -phi; + } else { + psi = ValueType(atan2(-mat[2][1], mat[1][1])); + phi = ValueType(atan2(-mat[0][2], mat[0][0])); + theta = ValueType(atan2(mat[0][1], + sqrt(mat[0][0] * mat[0][0] + + mat[0][2] * mat[0][2]))); + } + return V(psi, phi, theta); + + case XZX_ROTATION: + + if (isApproxEqual(mat[0][0], ValueType(1.0), eps)) { + theta = ValueType(0.0); + phi = ValueType(0.5 * atan2(mat[1][2], mat[1][1])); + psi = phi; + } else if (isApproxEqual(mat[0][0], ValueType(-1.0), eps)) { + theta = ValueType(M_PI); + psi = ValueType(0.5 * atan2(mat[2][1], -mat[1][1])); + phi = - psi; + } else { + psi = ValueType(atan2(mat[2][0], -mat[1][0])); + phi = ValueType(atan2(mat[0][2], mat[0][1])); + theta = ValueType(atan2(sqrt(mat[0][1] * mat[0][1] + + mat[0][2] * mat[0][2]), + mat[0][0])); + } + return V(phi, psi, theta); + + case ZXZ_ROTATION: + + if (isApproxEqual(mat[2][2], ValueType(1.0), eps)) { + theta = ValueType(0.0); + phi = ValueType(0.5 * atan2(mat[0][1], mat[0][0])); + psi = phi; + } else if (isApproxEqual(mat[2][2], ValueType(-1.0), eps)) { + theta = ValueType(M_PI); + phi = ValueType(0.5 * atan2(mat[0][1], mat[0][0])); + psi = -phi; + } else { + psi = ValueType(atan2(mat[0][2], mat[1][2])); + phi = ValueType(atan2(mat[2][0], -mat[2][1])); + theta = ValueType(atan2(sqrt(mat[0][2] * mat[0][2] + + mat[1][2] * mat[1][2]), + mat[2][2])); + } + return V(theta, psi, phi); + + case YXZ_ROTATION: + + if (isApproxEqual(mat[2][1], ValueType(1.0), eps)) { + theta = ValueType(-M_PI_2); + phi = ValueType(0.5 * atan2(-mat[1][0], mat[0][0])); + psi = phi; + } else if (isApproxEqual(mat[2][1], ValueType(-1.0), eps)) { + theta = ValueType(M_PI_2); + phi = ValueType(0.5 * atan2(mat[1][0], mat[0][0])); + psi = -phi; + } else { + psi = ValueType(atan2(mat[0][1], mat[1][1])); + phi = ValueType(atan2(mat[2][0], mat[2][2])); + theta = ValueType(atan2(-mat[2][1], + sqrt(mat[0][1] * mat[0][1] + + mat[1][1] * mat[1][1]))); + } + return V(theta, phi, psi); + + case ZYX_ROTATION: + + if (isApproxEqual(mat[0][2], ValueType(1.0), eps)) { + theta = ValueType(-M_PI_2); + phi = ValueType(0.5 * atan2(-mat[1][0], mat[1][1])); + psi = phi; + } else if (isApproxEqual(mat[0][2], ValueType(-1.0), eps)) { + theta = ValueType(M_PI_2); + phi = ValueType(0.5 * atan2(mat[2][1], mat[2][0])); + psi = -phi; + } else { + psi = ValueType(atan2(mat[1][2], mat[2][2])); + phi = ValueType(atan2(mat[0][1], mat[0][0])); + theta = ValueType(atan2(-mat[0][2], + sqrt(mat[0][1] * mat[0][1] + + mat[0][0] * mat[0][0]))); + } + return V(psi, theta, phi); + + case XZY_ROTATION: + + if (isApproxEqual(mat[1][0], ValueType(-1.0), eps)) { + theta = ValueType(M_PI_2); + psi = ValueType(0.5 * atan2(mat[2][1], mat[2][2])); + phi = -psi; + } else if (isApproxEqual(mat[1][0], ValueType(1.0), eps)) { + theta = ValueType(-M_PI_2); + psi = ValueType(0.5 * atan2(- mat[2][1], mat[2][2])); + phi = psi; + } else { + psi = ValueType(atan2(mat[2][0], mat[0][0])); + phi = ValueType(atan2(mat[1][2], mat[1][1])); + theta = ValueType(atan2(- mat[1][0], + sqrt(mat[1][1] * mat[1][1] + + mat[1][2] * mat[1][2]))); + } + return V(phi, psi, theta); + } + + OPENVDB_THROW(NotImplementedError, "Euler extraction sequence not implemented"); +} + + +/// @brief Return a rotation matrix that maps @a v1 onto @a v2 +/// about the cross product of @a v1 and @a v2. +template +MatType +rotation( + const Vec3& _v1, + const Vec3& _v2, + typename MatType::value_type eps=1.0e-8) +{ + typedef typename MatType::value_type T; + Vec3 v1(_v1); + Vec3 v2(_v2); + + // Check if v1 and v2 are unit length + if (!isApproxEqual(1.0, v1.dot(v1), eps)) { + v1.normalize(); + } + if (!isApproxEqual(1.0, v2.dot(v2), eps)) { + v2.normalize(); + } + + Vec3 cross; + cross.cross(v1, v2); + + if (isApproxEqual(cross[0], 0.0, eps) && + isApproxEqual(cross[1], 0.0, eps) && + isApproxEqual(cross[2], 0.0, eps)) { + + + // Given two unit vectors v1 and v2 that are nearly parallel, build a + // rotation matrix that maps v1 onto v2. First find which principal axis + // p is closest to perpendicular to v1. Find a reflection that exchanges + // v1 and p, and find a reflection that exchanges p2 and v2. The desired + // rotation matrix is the composition of these two reflections. See the + // paper "Efficiently Building a Matrix to Rotate One Vector to + // Another" by Tomas Moller and John Hughes in Journal of Graphics + // Tools Vol 4, No 4 for details. + + Vec3 u, v, p(0.0, 0.0, 0.0); + + double x = Abs(v1[0]); + double y = Abs(v1[1]); + double z = Abs(v1[2]); + + if (x < y) { + if (z < x) { + p[2] = 1; + } else { + p[0] = 1; + } + } else { + if (z < y) { + p[2] = 1; + } else { + p[1] = 1; + } + } + u = p - v1; + v = p - v2; + + double udot = u.dot(u); + double vdot = v.dot(v); + + double a = -2 / udot; + double b = -2 / vdot; + double c = 4 * u.dot(v) / (udot * vdot); + + MatType result; + result.setIdentity(); + + for (int j = 0; j < 3; j++) { + for (int i = 0; i < 3; i++) + result[i][j] = + a * u[i] * u[j] + b * v[i] * v[j] + c * v[j] * u[i]; + } + result[0][0] += 1.0; + result[1][1] += 1.0; + result[2][2] += 1.0; + + if(MatType::numColumns() == 4) padMat4(result); + return result; + + } else { + double c = v1.dot(v2); + double a = (1.0 - c) / cross.dot(cross); + + double a0 = a * cross[0]; + double a1 = a * cross[1]; + double a2 = a * cross[2]; + + double a01 = a0 * cross[1]; + double a02 = a0 * cross[2]; + double a12 = a1 * cross[2]; + + MatType r; + + r[0][0] = c + a0 * cross[0]; + r[0][1] = a01 + cross[2]; + r[0][2] = a02 - cross[1], + r[1][0] = a01 - cross[2]; + r[1][1] = c + a1 * cross[1]; + r[1][2] = a12 + cross[0]; + r[2][0] = a02 + cross[1]; + r[2][1] = a12 - cross[0]; + r[2][2] = c + a2 * cross[2]; + + if(MatType::numColumns() == 4) padMat4(r); + return r; + + } +} + + +/// Return a matrix that scales by @a s. +template +MatType +scale(const Vec3& s) +{ + // Gets identity, then sets top 3 diagonal + // Inefficient by 3 sets. + + MatType result; + result.setIdentity(); + result[0][0] = s[0]; + result[1][1] = s[1]; + result[2][2] = s[2]; + + return result; +} + + +/// Return a Vec3 representing the lengths of the passed matrix's upper 3x3's rows. +template +Vec3 +getScale(const MatType &mat) +{ + typedef Vec3 V; + return V( + V(mat[0][0], mat[0][1], mat[0][2]).length(), + V(mat[1][0], mat[1][1], mat[1][2]).length(), + V(mat[2][0], mat[2][1], mat[2][2]).length()); +} + + +/// @brief Return a copy of the given matrix with its upper 3x3 rows normalized. +/// @details This can be geometrically interpreted as a matrix with no scaling +/// along its major axes. +template +MatType +unit(const MatType &mat, typename MatType::value_type eps = 1.0e-8) +{ + Vec3 dud; + return unit(mat, eps, dud); +} + + +/// @brief Return a copy of the given matrix with its upper 3x3 rows normalized, +/// and return the length of each of these rows in @a scaling. +/// @details This can be geometrically interpretted as a matrix with no scaling +/// along its major axes, and the scaling in the input vector +template +MatType +unit( + const MatType &in, + typename MatType::value_type eps, + Vec3& scaling) +{ + typedef typename MatType::value_type T; + MatType result(in); + + for (int i(0); i < 3; i++) { + try { + const Vec3 u( + Vec3(in[i][0], in[i][1], in[i][2]).unit(eps, scaling[i])); + for (int j=0; j<3; j++) result[i][j] = u[j]; + } catch (ArithmeticError&) { + for (int j=0; j<3; j++) result[i][j] = 0; + } + } + return result; +} + + +/// @brief Set the matrix to a shear along @a axis0 by a fraction of @a axis1. +/// @param axis0 The fixed axis of the shear. +/// @param axis1 The shear axis. +/// @param shear The shear factor. +template +MatType +shear(Axis axis0, Axis axis1, typename MatType::value_type shear) +{ + int index0 = static_cast(axis0); + int index1 = static_cast(axis1); + + MatType result; + result.setIdentity(); + if (axis0 == axis1) { + result[index1][index0] = shear + 1; + } else { + result[index1][index0] = shear; + } + + return result; +} + + +/// Return a matrix as the cross product of the given vector. +template +MatType +skew(const Vec3 &skew) +{ + typedef typename MatType::value_type T; + + MatType r; + r[0][0] = T(0); r[0][1] = skew.z(); r[0][2] = -skew.y(); + r[1][0] = -skew.z(); r[1][1] = T(0); r[2][1] = skew.x(); + r[2][0] = skew.y(); r[2][1] = -skew.x(); r[2][2] = T(0); + + if(MatType::numColumns() == 4) padMat4(r); + return r; +} + + +/// @brief Return an orientation matrix such that z points along @a direction, +/// and y is along the @a direction / @a vertical plane. +template +MatType +aim(const Vec3& direction, + const Vec3& vertical) +{ + typedef typename MatType::value_type T; + Vec3 forward(direction.unit()); + Vec3 horizontal(vertical.unit().cross(forward).unit()); + Vec3 up(forward.cross(horizontal).unit()); + + MatType r; + + r[0][0]=horizontal.x(); r[0][1]=horizontal.y(); r[0][2]=horizontal.z(); + r[1][0]=up.x(); r[1][1]=up.y(); r[1][2]=up.z(); + r[2][0]=forward.x(); r[2][1]=forward.y(); r[2][2]=forward.z(); + + if(MatType::numColumns() == 4) padMat4(r); + return r; +} + +/// @brief This function snaps a specific axis to a specific direction, +/// preserving scaling. +/// @details It does this using minimum energy, thus posing a unique solution if +/// basis & direction aren't parallel. +/// @note @a direction need not be unit. +template +inline MatType +snapMatBasis(const MatType& source, Axis axis, const Vec3& direction) +{ + typedef typename MatType::value_type T; + + Vec3 unitDir(direction.unit()); + Vec3 ourUnitAxis(source.row(axis).unit()); + + // Are the two parallel? + T parallel = unitDir.dot(ourUnitAxis); + + // Already snapped! + if (isApproxEqual(parallel, T(1.0))) return source; + + if (isApproxEqual(parallel, T(-1.0))) { + OPENVDB_THROW(ValueError, "Cannot snap to inverse axis"); + } + + // Find angle between our basis and the one specified + T angleBetween(angle(unitDir, ourUnitAxis)); + // Caclulate axis to rotate along + Vec3 rotationAxis = unitDir.cross(ourUnitAxis); + + MatType rotation; + rotation.setToRotation(rotationAxis, angleBetween); + + return source * rotation; +} + +/// @brief Write 0s along Mat4's last row and column, and a 1 on its diagonal. +/// @details Useful initialization when we're initializing just the 3x3 block. +template +static MatType& +padMat4(MatType& dest) +{ + dest[0][3] = dest[1][3] = dest[2][3] = 0; + dest[3][2] = dest[3][1] = dest[3][0] = 0; + dest[3][3] = 1; + + return dest; +} + + +/// @brief Solve for A=B*B, given A. +/// @details Denman-Beavers square root iteration +template +inline void +sqrtSolve(const MatType &aA, MatType &aB, double aTol=0.01) +{ + unsigned int iterations = (unsigned int)(log(aTol)/log(0.5)); + MatType Y[2]; + MatType Z[2]; + MatType invY; + MatType invZ; + + unsigned int current = 0; + + Y[0]=aA; + Z[0] = MatType::identity(); + + unsigned int iteration; + for (iteration=0; iteration +inline void +powSolve(const MatType &aA, MatType &aB, double aPower, double aTol=0.01) +{ + unsigned int iterations = (unsigned int)(log(aTol)/log(0.5)); + + const bool inverted = ( aPower < 0.0 ); + + if (inverted) { + aPower = -aPower; + } + + unsigned int whole = (unsigned int)aPower; + double fraction = aPower - whole; + + MatType R; + R = MatType::identity(); + + MatType partial = aA; + + double contribution = 1.0; + + unsigned int iteration; + + for (iteration=0; iteration< iterations; iteration++) + { + sqrtSolve(partial, partial, aTol); + contribution *= 0.5; + + if (fraction>=contribution) + { + R *= partial; + fraction-=contribution; + } + } + + partial = aA; + while (whole) + { + if (whole & 1) { + R *= partial; + } + whole>>=1; + if(whole) { + partial*=partial; + } + } + + if (inverted) { + aB = R.inverse(); + } + else { + aB = R; + } +} + + +/// @brief Determine if a matrix is an identity matrix. +template +inline bool +isIdentity(const MatType& m) +{ + return m.eq(MatType::identity()); +} + + +/// @brief Determine if a matrix is invertible. +template +inline bool +isInvertible(const MatType& m) +{ + typedef typename MatType::ValueType value_type; + return !isApproxEqual(m.det(), (value_type)0); +} + + +/// @brief Determine if a matrix is symmetric. +/// @details This implicitly uses math::isApproxEqual() to determine equality. +template +inline bool +isSymmetric(const MatType& m) +{ + return m.eq(m.transpose()); +} + + +/// Determine if a matrix is unitary (i.e., rotation or reflection). +template +inline bool +isUnitary(const MatType& m) +{ + typedef typename MatType::ValueType value_type; + if (!isApproxEqual(std::abs(m.det()), value_type(1.0))) return false; + // check that the matrix transpose is the inverse + MatType temp = m * m.transpose(); + return temp.eq(MatType::identity()); +} + + +/// Determine if a matrix is diagonal. +template +inline bool +isDiagonal(const MatType& mat) +{ + int n = MatType::size; + typename MatType::ValueType temp(0); + for (int i = 0; i < n; ++i) { + for (int j = 0; j < n; ++j) { + if (i != j) { + temp+=std::abs(mat(i,j)); + } + } + } + return isApproxEqual(temp, typename MatType::ValueType(0.0)); +} + + +/// Return the @f$L_\infty@f$ norm of an N x N matrix. +template +typename MatType::ValueType +lInfinityNorm(const MatType& matrix) +{ + int n = MatType::size; + typename MatType::ValueType norm = 0; + + for( int j = 0; j +typename MatType::ValueType +lOneNorm(const MatType& matrix) +{ + int n = MatType::size; + typename MatType::ValueType norm = 0; + + for( int i = 0; i +bool +polarDecomposition(const MatType& input, MatType& unitary, + MatType& positive_hermitian, unsigned int MAX_ITERATIONS=100) +{ + unitary = input; + MatType new_unitary(input); + MatType unitary_inv; + + if (fabs(unitary.det()) < math::Tolerance::value()) return false; + + unsigned int iteration(0); + + typename MatType::ValueType linf_of_u; + typename MatType::ValueType l1nm_of_u; + typename MatType::ValueType linf_of_u_inv; + typename MatType::ValueType l1nm_of_u_inv; + typename MatType::ValueType l1_error = 100; + double gamma; + + do { + unitary_inv = unitary.inverse(); + linf_of_u = lInfinityNorm(unitary); + l1nm_of_u = lOneNorm(unitary); + + linf_of_u_inv = lInfinityNorm(unitary_inv); + l1nm_of_u_inv = lOneNorm(unitary_inv); + + gamma = sqrt( sqrt( (l1nm_of_u_inv * linf_of_u_inv ) / (l1nm_of_u * linf_of_u) )); + + new_unitary = 0.5*(gamma * unitary + (1./gamma) * unitary_inv.transpose() ); + + l1_error = lInfinityNorm(unitary - new_unitary); + unitary = new_unitary; + + /// this generally converges in less than ten iterations + if (iteration > MAX_ITERATIONS) return false; + iteration++; + } while (l1_error > math::Tolerance::value()); + + positive_hermitian = unitary.transpose() * input; + return true; +} + +} // namespace math +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_MATH_MAT_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/math/Mat3.h b/nuparu/include/openvdb/include/openvdb/math/Mat3.h new file mode 100644 index 00000000..1b64e883 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/math/Mat3.h @@ -0,0 +1,867 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_MATH_MAT3_H_HAS_BEEN_INCLUDED +#define OPENVDB_MATH_MAT3_H_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include "Vec3.h" +#include "Mat.h" + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace math { + +template class Vec3; +template class Mat4; +template class Quat; + +/// @class Mat3 Mat3.h +/// @brief 3x3 matrix class. +template +class Mat3: public Mat<3, T> +{ +public: + /// Data type held by the matrix. + typedef T value_type; + typedef T ValueType; + typedef Mat<3, T> MyBase; + /// Trivial constructor, the matrix is NOT initialized + Mat3() {} + + /// Constructor given the quaternion rotation, e.g. Mat3f m(q); + /// The quaternion is normalized and used to construct the matrix + Mat3(const Quat &q) + { setToRotation(q); } + + + /// Constructor given array of elements, the ordering is in row major form: + /** @verbatim + a b c + d e f + g h i + @endverbatim */ + template + Mat3(Source a, Source b, Source c, + Source d, Source e, Source f, + Source g, Source h, Source i) + { + MyBase::mm[0] = static_cast(a); + MyBase::mm[1] = static_cast(b); + MyBase::mm[2] = static_cast(c); + MyBase::mm[3] = static_cast(d); + MyBase::mm[4] = static_cast(e); + MyBase::mm[5] = static_cast(f); + MyBase::mm[6] = static_cast(g); + MyBase::mm[7] = static_cast(h); + MyBase::mm[8] = static_cast(i); + } // constructor1Test + + /// Construct matrix from rows or columns vectors (defaults to rows + /// for historical reasons) + template + Mat3(const Vec3 &v1, const Vec3 &v2, const Vec3 &v3, bool rows = true) + { + if (rows) { + this->setRows(v1, v2, v3); + } else { + this->setColumns(v1, v2, v3); + } + } + + /// Constructor given array of elements, the ordering is in row major form:\n + /// a[0] a[1] a[2]\n + /// a[3] a[4] a[5]\n + /// a[6] a[7] a[8]\n + template + Mat3(Source *a) + { + MyBase::mm[0] = a[0]; + MyBase::mm[1] = a[1]; + MyBase::mm[2] = a[2]; + MyBase::mm[3] = a[3]; + MyBase::mm[4] = a[4]; + MyBase::mm[5] = a[5]; + MyBase::mm[6] = a[6]; + MyBase::mm[7] = a[7]; + MyBase::mm[8] = a[8]; + } // constructor1Test + + /// Copy constructor + Mat3(const Mat<3, T> &m) + { + for (int i=0; i<3; ++i) { + for (int j=0; j<3; ++j) { + MyBase::mm[i*3 + j] = m[i][j]; + } + } + } + + /// Conversion constructor + template + explicit Mat3(const Mat3 &m) + { + for (int i=0; i<3; ++i) { + for (int j=0; j<3; ++j) { + MyBase::mm[i*3 + j] = static_cast(m[i][j]); + } + } + } + + /// Conversion from Mat4 (copies top left) + explicit Mat3(const Mat4 &m) + { + for (int i=0; i<3; ++i) { + for (int j=0; j<3; ++j) { + MyBase::mm[i*3 + j] = m[i][j]; + } + } + } + + /// Predefined constant for identity matrix + static const Mat3& identity() { + return sIdentity; + } + + /// Predefined constant for zero matrix + static const Mat3& zero() { + return sZero; + } + + /// Set ith row to vector v + void setRow(int i, const Vec3 &v) + { + // assert(i>=0 && i<3); + int i3 = i * 3; + + MyBase::mm[i3+0] = v[0]; + MyBase::mm[i3+1] = v[1]; + MyBase::mm[i3+2] = v[2]; + } // rowColumnTest + + /// Get ith row, e.g. Vec3d v = m.row(1); + Vec3 row(int i) const + { + // assert(i>=0 && i<3); + return Vec3((*this)(i,0), (*this)(i,1), (*this)(i,2)); + } // rowColumnTest + + /// Set jth column to vector v + void setCol(int j, const Vec3& v) + { + // assert(j>=0 && j<3); + MyBase::mm[0+j] = v[0]; + MyBase::mm[3+j] = v[1]; + MyBase::mm[6+j] = v[2]; + } // rowColumnTest + + /// Get jth column, e.g. Vec3d v = m.col(0); + Vec3 col(int j) const + { + // assert(j>=0 && j<3); + return Vec3((*this)(0,j), (*this)(1,j), (*this)(2,j)); + } // rowColumnTest + + // NB: The following two methods were changed to + // work around a gccWS5 compiler issue related to strict + // aliasing (see FX-475). + + //@{ + /// Array style reference to ith row + /// e.g. m[1][2] = 4; + T* operator[](int i) { return &(MyBase::mm[i*3]); } + const T* operator[](int i) const { return &(MyBase::mm[i*3]); } + //@} + + T* asPointer() {return MyBase::mm;} + const T* asPointer() const {return MyBase::mm;} + + /// Alternative indexed reference to the elements + /// Note that the indices are row first and column second. + /// e.g. m(0,0) = 1; + T& operator()(int i, int j) + { + // assert(i>=0 && i<3); + // assert(j>=0 && j<3); + return MyBase::mm[3*i+j]; + } // trivial + + /// Alternative indexed constant reference to the elements, + /// Note that the indices are row first and column second. + /// e.g. float f = m(1,0); + T operator()(int i, int j) const + { + // assert(i>=0 && i<3); + // assert(j>=0 && j<3); + return MyBase::mm[3*i+j]; + } // trivial + + /// Set the rows of "this" matrix to the vectors v1, v2, v3 + void setRows(const Vec3 &v1, const Vec3 &v2, const Vec3 &v3) + { + MyBase::mm[0] = v1[0]; + MyBase::mm[1] = v1[1]; + MyBase::mm[2] = v1[2]; + MyBase::mm[3] = v2[0]; + MyBase::mm[4] = v2[1]; + MyBase::mm[5] = v2[2]; + MyBase::mm[6] = v3[0]; + MyBase::mm[7] = v3[1]; + MyBase::mm[8] = v3[2]; + } // setRows + + /// Set the columns of "this" matrix to the vectors v1, v2, v3 + void setColumns(const Vec3 &v1, const Vec3 &v2, const Vec3 &v3) + { + MyBase::mm[0] = v1[0]; + MyBase::mm[1] = v2[0]; + MyBase::mm[2] = v3[0]; + MyBase::mm[3] = v1[1]; + MyBase::mm[4] = v2[1]; + MyBase::mm[5] = v3[1]; + MyBase::mm[6] = v1[2]; + MyBase::mm[7] = v2[2]; + MyBase::mm[8] = v3[2]; + } // setColumns + + /// Set the rows of "this" matrix to the vectors v1, v2, v3 + OPENVDB_DEPRECATED void setBasis(const Vec3 &v1, const Vec3 &v2, const Vec3 &v3) + { + this->setRows(v1, v2, v3); + } + + /// Set diagonal and symmetric triangular components + void setSymmetric(const Vec3 &vdiag, const Vec3 &vtri) + { + MyBase::mm[0] = vdiag[0]; + MyBase::mm[1] = vtri[0]; + MyBase::mm[2] = vtri[1]; + MyBase::mm[3] = vtri[0]; + MyBase::mm[4] = vdiag[1]; + MyBase::mm[5] = vtri[2]; + MyBase::mm[6] = vtri[1]; + MyBase::mm[7] = vtri[2]; + MyBase::mm[8] = vdiag[2]; + } // setSymmetricTest + + /// Returns matrix with prescribed diagonal and symmetric triangular + /// components + static Mat3 symmetric(const Vec3 &vdiag, const Vec3 &vtri) + { + return Mat3( + vdiag[0], vtri[0], vtri[1], + vtri[0], vdiag[1], vtri[2], + vtri[1], vtri[2], vdiag[2] + ); + } + + /// Set the matrix as cross product of the given vector + void setSkew(const Vec3 &v) + {*this = skew(v);} + + /// @brief Set this matrix to the rotation matrix specified by the quaternion + /// @details The quaternion is normalized and used to construct the matrix. + /// Note that the matrix is transposed to match post-multiplication semantics. + void setToRotation(const Quat &q) + {*this = rotation >(q);} + + /// @brief Set this matrix to the rotation specified by @a axis and @a angle + /// @details The axis must be unit vector + void setToRotation(const Vec3 &axis, T angle) + {*this = rotation >(axis, angle);} + + /// Set this matrix to zero + void setZero() + { + MyBase::mm[0] = 0; + MyBase::mm[1] = 0; + MyBase::mm[2] = 0; + MyBase::mm[3] = 0; + MyBase::mm[4] = 0; + MyBase::mm[5] = 0; + MyBase::mm[6] = 0; + MyBase::mm[7] = 0; + MyBase::mm[8] = 0; + } // trivial + + /// Set "this" matrix to identity + void setIdentity() + { + MyBase::mm[0] = 1; + MyBase::mm[1] = 0; + MyBase::mm[2] = 0; + MyBase::mm[3] = 0; + MyBase::mm[4] = 1; + MyBase::mm[5] = 0; + MyBase::mm[6] = 0; + MyBase::mm[7] = 0; + MyBase::mm[8] = 1; + } // trivial + + /// Assignment operator + template + const Mat3& operator=(const Mat3 &m) + { + const Source *src = m.asPointer(); + + // don't suppress type conversion warnings + std::copy(src, (src + this->numElements()), MyBase::mm); + return *this; + } // opEqualToTest + + /// Test if "this" is equivalent to m with tolerance of eps value + bool eq(const Mat3 &m, T eps=1.0e-8) const + { + return (isApproxEqual(MyBase::mm[0],m.mm[0],eps) && + isApproxEqual(MyBase::mm[1],m.mm[1],eps) && + isApproxEqual(MyBase::mm[2],m.mm[2],eps) && + isApproxEqual(MyBase::mm[3],m.mm[3],eps) && + isApproxEqual(MyBase::mm[4],m.mm[4],eps) && + isApproxEqual(MyBase::mm[5],m.mm[5],eps) && + isApproxEqual(MyBase::mm[6],m.mm[6],eps) && + isApproxEqual(MyBase::mm[7],m.mm[7],eps) && + isApproxEqual(MyBase::mm[8],m.mm[8],eps)); + } // trivial + + /// Negation operator, for e.g. m1 = -m2; + Mat3 operator-() const + { + return Mat3( + -MyBase::mm[0], -MyBase::mm[1], -MyBase::mm[2], + -MyBase::mm[3], -MyBase::mm[4], -MyBase::mm[5], + -MyBase::mm[6], -MyBase::mm[7], -MyBase::mm[8] + ); + } // trivial + + /// Multiplication operator, e.g. M = scalar * M; + // friend Mat3 operator*(T scalar, const Mat3& m) { + // return m*scalar; + // } + + /// @brief Returns m, where \f$m_{i,j} *= scalar\f$ for \f$i, j \in [0, 2]\f$ + template + const Mat3& operator*=(S scalar) + { + MyBase::mm[0] *= scalar; + MyBase::mm[1] *= scalar; + MyBase::mm[2] *= scalar; + MyBase::mm[3] *= scalar; + MyBase::mm[4] *= scalar; + MyBase::mm[5] *= scalar; + MyBase::mm[6] *= scalar; + MyBase::mm[7] *= scalar; + MyBase::mm[8] *= scalar; + return *this; + } + + /// @brief Returns m0, where \f$m0_{i,j} += m1_{i,j}\f$ for \f$i, j \in [0, 2]\f$ + template + const Mat3 &operator+=(const Mat3 &m1) + { + const S *s = m1.asPointer(); + + MyBase::mm[0] += s[0]; + MyBase::mm[1] += s[1]; + MyBase::mm[2] += s[2]; + MyBase::mm[3] += s[3]; + MyBase::mm[4] += s[4]; + MyBase::mm[5] += s[5]; + MyBase::mm[6] += s[6]; + MyBase::mm[7] += s[7]; + MyBase::mm[8] += s[8]; + return *this; + } + + /// @brief Returns m0, where \f$m0_{i,j} -= m1_{i,j}\f$ for \f$i, j \in [0, 2]\f$ + template + const Mat3 &operator-=(const Mat3 &m1) + { + const S *s = m1.asPointer(); + + MyBase::mm[0] -= s[0]; + MyBase::mm[1] -= s[1]; + MyBase::mm[2] -= s[2]; + MyBase::mm[3] -= s[3]; + MyBase::mm[4] -= s[4]; + MyBase::mm[5] -= s[5]; + MyBase::mm[6] -= s[6]; + MyBase::mm[7] -= s[7]; + MyBase::mm[8] -= s[8]; + return *this; + } + + /// @brief Returns m0, where \f$m0_{i,j} *= m1_{i,j}\f$ for \f$i, j \in [0, 2]\f$ + template + const Mat3 &operator*=(const Mat3 &m1) + { + Mat3 m0(*this); + const T* s0 = m0.asPointer(); + const S* s1 = m1.asPointer(); + + MyBase::mm[0] = static_cast(s0[0] * s1[0] + + s0[1] * s1[3] + + s0[2] * s1[6]); + MyBase::mm[1] = static_cast(s0[0] * s1[1] + + s0[1] * s1[4] + + s0[2] * s1[7]); + MyBase::mm[2] = static_cast(s0[0] * s1[2] + + s0[1] * s1[5] + + s0[2] * s1[8]); + + MyBase::mm[3] = static_cast(s0[3] * s1[0] + + s0[4] * s1[3] + + s0[5] * s1[6]); + MyBase::mm[4] = static_cast(s0[3] * s1[1] + + s0[4] * s1[4] + + s0[5] * s1[7]); + MyBase::mm[5] = static_cast(s0[3] * s1[2] + + s0[4] * s1[5] + + s0[5] * s1[8]); + + MyBase::mm[6] = static_cast(s0[6] * s1[0] + + s0[7] * s1[3] + + s0[8] * s1[6]); + MyBase::mm[7] = static_cast(s0[6] * s1[1] + + s0[7] * s1[4] + + s0[8] * s1[7]); + MyBase::mm[8] = static_cast(s0[6] * s1[2] + + s0[7] * s1[5] + + s0[8] * s1[8]); + + return *this; + } + + /// @brief Return the cofactor matrix of "this" + Mat3 cofactor() const + { + return Mat3( + MyBase::mm[4] * MyBase::mm[8] - MyBase::mm[5] * MyBase::mm[7], + MyBase::mm[5] * MyBase::mm[6] - MyBase::mm[3] * MyBase::mm[8], + MyBase::mm[3] * MyBase::mm[7] - MyBase::mm[4] * MyBase::mm[6], + MyBase::mm[2] * MyBase::mm[7] - MyBase::mm[1] * MyBase::mm[8], + MyBase::mm[0] * MyBase::mm[8] - MyBase::mm[2] * MyBase::mm[6], + MyBase::mm[1] * MyBase::mm[6] - MyBase::mm[0] * MyBase::mm[7], + MyBase::mm[1] * MyBase::mm[5] - MyBase::mm[2] * MyBase::mm[4], + MyBase::mm[2] * MyBase::mm[3] - MyBase::mm[0] * MyBase::mm[5], + MyBase::mm[0] * MyBase::mm[4] - MyBase::mm[1] * MyBase::mm[3]); + } + + /// returns adjoint of "this", i.e. the transpose of the cofactor of "this" + Mat3 adjoint() const + { + return Mat3( + MyBase::mm[4] * MyBase::mm[8] - MyBase::mm[5] * MyBase::mm[7], + MyBase::mm[2] * MyBase::mm[7] - MyBase::mm[1] * MyBase::mm[8], + MyBase::mm[1] * MyBase::mm[5] - MyBase::mm[2] * MyBase::mm[4], + MyBase::mm[5] * MyBase::mm[6] - MyBase::mm[3] * MyBase::mm[8], + MyBase::mm[0] * MyBase::mm[8] - MyBase::mm[2] * MyBase::mm[6], + MyBase::mm[2] * MyBase::mm[3] - MyBase::mm[0] * MyBase::mm[5], + MyBase::mm[3] * MyBase::mm[7] - MyBase::mm[4] * MyBase::mm[6], + MyBase::mm[1] * MyBase::mm[6] - MyBase::mm[0] * MyBase::mm[7], + MyBase::mm[0] * MyBase::mm[4] - MyBase::mm[1] * MyBase::mm[3]); + + } // adjointTest + + /// returns transpose of this + Mat3 transpose() const + { + return Mat3( + MyBase::mm[0], MyBase::mm[3], MyBase::mm[6], + MyBase::mm[1], MyBase::mm[4], MyBase::mm[7], + MyBase::mm[2], MyBase::mm[5], MyBase::mm[8]); + + } // transposeTest + + /// returns inverse of this + /// @throws ArithmeticError if singular + Mat3 inverse(T tolerance = 0) const + { + Mat3 inv(this->adjoint()); + + const T det = inv.mm[0]*MyBase::mm[0] + inv.mm[1]*MyBase::mm[3] + inv.mm[2]*MyBase::mm[6]; + + // If the determinant is 0, m was singular and "this" will contain junk. + if (isApproxEqual(det,T(0.0),tolerance)) { + OPENVDB_THROW(ArithmeticError, "Inversion of singular 3x3 matrix"); + } + return inv * (T(1)/det); + } // invertTest + + /// Determinant of matrix + T det() const + { + const T co00 = MyBase::mm[4]*MyBase::mm[8] - MyBase::mm[5]*MyBase::mm[7]; + const T co10 = MyBase::mm[5]*MyBase::mm[6] - MyBase::mm[3]*MyBase::mm[8]; + const T co20 = MyBase::mm[3]*MyBase::mm[7] - MyBase::mm[4]*MyBase::mm[6]; + return MyBase::mm[0]*co00 + MyBase::mm[1]*co10 + MyBase::mm[2]*co20; + } // determinantTest + + /// Trace of matrix + T trace() const + { + return MyBase::mm[0]+MyBase::mm[4]+MyBase::mm[8]; + } + + /// This function snaps a specific axis to a specific direction, + /// preserving scaling. It does this using minimum energy, thus + /// posing a unique solution if basis & direction arent parralel. + /// Direction need not be unit. + Mat3 snapBasis(Axis axis, const Vec3 &direction) + { + return snapMatBasis(*this, axis, direction); + } + + /// Return the transformed vector by "this" matrix. + /// This function is equivalent to post-multiplying the matrix. + template + Vec3 transform(const Vec3 &v) const + { + return static_cast< Vec3 >(v * *this); + } // xformVectorTest + + /// Return the transformed vector by transpose of "this" matrix. + /// This function is equivalent to pre-multiplying the matrix. + template + Vec3 pretransform(const Vec3 &v) const + { + return static_cast< Vec3 >(*this * v); + } // xformTVectorTest + + + /// Treats diag as a diagonal matrix and returns the + /// multiplication of "this" with diag (from the right). + Mat3 timesDiagonal(const Vec3& diag) const + { + Mat3 ret(*this); + + ret.mm[0] *= diag(0); + ret.mm[1] *= diag(1); + ret.mm[2] *= diag(2); + ret.mm[3] *= diag(0); + ret.mm[4] *= diag(1); + ret.mm[5] *= diag(2); + ret.mm[6] *= diag(0); + ret.mm[7] *= diag(1); + ret.mm[8] *= diag(2); + return ret; + } + +private: + static const Mat3 sIdentity; + static const Mat3 sZero; +}; // class Mat3 + + +template +const Mat3 Mat3::sIdentity = Mat3(1, 0, 0, + 0, 1, 0, + 0, 0, 1); + +template +const Mat3 Mat3::sZero = Mat3(0, 0, 0, + 0, 0, 0, + 0, 0, 0); + +/// @relates Mat3 +/// @brief Equality operator, does exact floating point comparisons +template +bool operator==(const Mat3 &m0, const Mat3 &m1) +{ + const T0 *t0 = m0.asPointer(); + const T1 *t1 = m1.asPointer(); + + for (int i=0; i<9; ++i) { + if (!isExactlyEqual(t0[i], t1[i])) return false; + } + return true; +} + +/// @relates Mat3 +/// @brief Inequality operator, does exact floating point comparisons +template +bool operator!=(const Mat3 &m0, const Mat3 &m1) { return !(m0 == m1); } + +/// @relates Mat3 +/// @brief Returns M, where \f$M_{i,j} = m_{i,j} * scalar\f$ for \f$i, j \in [0, 2]\f$ +template +Mat3::type> operator*(S scalar, const Mat3 &m) +{ return m*scalar; } + +/// @relates Mat3 +/// @brief Returns M, where \f$M_{i,j} = m_{i,j} * scalar\f$ for \f$i, j \in [0, 2]\f$ +template +Mat3::type> operator*(const Mat3 &m, S scalar) +{ + Mat3::type> result(m); + result *= scalar; + return result; +} + +/// @relates Mat3 +/// @brief Returns M, where \f$M_{i,j} = m0_{i,j} + m1_{i,j}\f$ for \f$i, j \in [0, 2]\f$ +template +Mat3::type> operator+(const Mat3 &m0, const Mat3 &m1) +{ + Mat3::type> result(m0); + result += m1; + return result; +} + +/// @relates Mat3 +/// @brief Returns M, where \f$M_{i,j} = m0_{i,j} - m1_{i,j}\f$ for \f$i, j \in [0, 2]\f$ +template +Mat3::type> operator-(const Mat3 &m0, const Mat3 &m1) +{ + Mat3::type> result(m0); + result -= m1; + return result; +} + + +/// @brief Matrix multiplication. +/// +/// Returns M, where +/// \f$M_{ij} = \sum_{n=0}^2\left(m0_{nj} + m1_{in}\right)\f$ for \f$i, j \in [0, 2]\f$ +template +Mat3::type>operator*(const Mat3 &m0, const Mat3 &m1) +{ + Mat3::type> result(m0); + result *= m1; + return result; +} + +/// @relates Mat3 +/// @brief Returns v, where \f$v_{i} = \sum_{n=0}^2 m_{i,n} * v_n\f$ for \f$i \in [0, 2]\f$ +template +inline Vec3::type> +operator*(const Mat3 &_m, const Vec3 &_v) +{ + MT const *m = _m.asPointer(); + return Vec3::type>( + _v[0]*m[0] + _v[1]*m[1] + _v[2]*m[2], + _v[0]*m[3] + _v[1]*m[4] + _v[2]*m[5], + _v[0]*m[6] + _v[1]*m[7] + _v[2]*m[8]); +} + +/// @relates Mat3 +/// @brief Returns v, where \f$v_{i} = \sum_{n=0}^2 m_{n,i} * v_n\f$ for \f$i \in [0, 2]\f$ +template +inline Vec3::type> +operator*(const Vec3 &_v, const Mat3 &_m) +{ + MT const *m = _m.asPointer(); + return Vec3::type>( + _v[0]*m[0] + _v[1]*m[3] + _v[2]*m[6], + _v[0]*m[1] + _v[1]*m[4] + _v[2]*m[7], + _v[0]*m[2] + _v[1]*m[5] + _v[2]*m[8]); +} + +/// @relates Mat3 +/// @brief Returns v, where \f$v_{i} = \sum_{n=0}^2 m_{i,n} * v_n\f$ for \f$i \in [0, 2]\f$ +template +inline Vec3 &operator *= (Vec3 &_v, const Mat3 &_m) +{ + Vec3 mult = _v * _m; + _v = mult; + return _v; +} + +/// Returns outer product of v1, v2, i.e. v1 v2^T if v1 and v2 are +/// column vectors, e.g. M = Mat3f::outerproduct(v1,v2); +template +Mat3 outerProduct(const Vec3& v1, const Vec3& v2) +{ + return Mat3(v1[0]*v2[0], v1[0]*v2[1], v1[0]*v2[2], + v1[1]*v2[0], v1[1]*v2[1], v1[1]*v2[2], + v1[2]*v2[0], v1[2]*v2[1], v1[2]*v2[2]); +}// outerProduct + +typedef Mat3 Mat3s; +typedef Mat3 Mat3d; + +#if DWREAL_IS_DOUBLE == 1 +typedef Mat3d Mat3f; +#else +typedef Mat3s Mat3f; +#endif // DWREAL_IS_DOUBLE + + +/// Interpolate the rotation between m1 and m2 using Mat::powSolve. +/// Unlike slerp, translation is not treated independently. +/// This results in smoother animation results. +template +Mat3 powLerp(const Mat3 &m1, const Mat3 &m2, T t) +{ + Mat3 x = m1.inverse() * m2; + powSolve(x, x, t); + Mat3 m = m1 * x; + return m; +} + + +namespace { + template + void pivot(int i, int j, Mat3& S, Vec3& D, Mat3& Q) + { + const int& n = Mat3::size; // should be 3 + T temp; + /// scratch variables used in pivoting + double cotan_of_2_theta; + double tan_of_theta; + double cosin_of_theta; + double sin_of_theta; + double z; + + double Sij = S(i,j); + + double Sjj_minus_Sii = D[j] - D[i]; + + if (fabs(Sjj_minus_Sii) * (10*math::Tolerance::value()) > fabs(Sij)) { + tan_of_theta = Sij / Sjj_minus_Sii; + } else { + /// pivot on Sij + cotan_of_2_theta = 0.5*Sjj_minus_Sii / Sij ; + + if (cotan_of_2_theta < 0.) { + tan_of_theta = + -1./(sqrt(1. + cotan_of_2_theta*cotan_of_2_theta) - cotan_of_2_theta); + } else { + tan_of_theta = + 1./(sqrt(1. + cotan_of_2_theta*cotan_of_2_theta) + cotan_of_2_theta); + } + } + + cosin_of_theta = 1./sqrt( 1. + tan_of_theta * tan_of_theta); + sin_of_theta = cosin_of_theta * tan_of_theta; + z = tan_of_theta * Sij; + S(i,j) = 0; + D[i] -= z; + D[j] += z; + for (int k = 0; k < i; ++k) { + temp = S(k,i); + S(k,i) = cosin_of_theta * temp - sin_of_theta * S(k,j); + S(k,j)= sin_of_theta * temp + cosin_of_theta * S(k,j); + } + for (int k = i+1; k < j; ++k) { + temp = S(i,k); + S(i,k) = cosin_of_theta * temp - sin_of_theta * S(k,j); + S(k,j) = sin_of_theta * temp + cosin_of_theta * S(k,j); + } + for (int k = j+1; k < n; ++k) { + temp = S(i,k); + S(i,k) = cosin_of_theta * temp - sin_of_theta * S(j,k); + S(j,k) = sin_of_theta * temp + cosin_of_theta * S(j,k); + } + for (int k = 0; k < n; ++k) + { + temp = Q(k,i); + Q(k,i) = cosin_of_theta * temp - sin_of_theta*Q(k,j); + Q(k,j) = sin_of_theta * temp + cosin_of_theta*Q(k,j); + } + } +} + + +/// @brief Use Jacobi iterations to decompose a symmetric 3x3 matrix +/// (diagonalize and compute eigenvectors) +/// @details This is based on the "Efficient numerical diagonalization of Hermitian 3x3 matrices" +/// Joachim Kopp. arXiv.org preprint: physics/0610206 +/// with the addition of largest pivot +template +bool diagonalizeSymmetricMatrix(const Mat3& input, Mat3& Q, Vec3& D, + unsigned int MAX_ITERATIONS=250) +{ + /// use Givens rotation matrix to eliminate off-diagonal entries. + /// initialize the rotation matrix as idenity + Q = Mat3::identity(); + int n = Mat3::size; // should be 3 + + /// temp matrix. Assumed to be symmetric + Mat3 S(input); + + for (int i = 0; i < n; ++i) { + D[i] = S(i,i); + } + + unsigned int iterations(0); + /// Just iterate over all the non-diagonal enteries + /// using the largest as a pivot. + do { + /// check for absolute convergence + /// are symmetric off diagonals all zero + double er = 0; + for (int i = 0; i < n; ++i) { + for (int j = i+1; j < n; ++j) { + er += fabs(S(i,j)); + } + } + if (std::abs(er) < math::Tolerance::value()) { + return true; + } + iterations++; + + T max_element = 0; + int ip = 0; + int jp = 0; + /// loop over all the off-diagonals above the diagonal + for (int i = 0; i < n; ++i) { + for (int j = i+1; j < n; ++j){ + + if ( fabs(D[i]) * (10*math::Tolerance::value()) > fabs(S(i,j))) { + /// value too small to pivot on + S(i,j) = 0; + } + if (fabs(S(i,j)) > max_element) { + max_element = fabs(S(i,j)); + ip = i; + jp = j; + } + } + } + pivot(ip, jp, S, D, Q); + } while (iterations < MAX_ITERATIONS); + + return false; +} + +} // namespace math +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_MATH_MAT3_H_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/math/Mat4.h b/nuparu/include/openvdb/include/openvdb/math/Mat4.h new file mode 100644 index 00000000..34f7d7fc --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/math/Mat4.h @@ -0,0 +1,1398 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_MATH_MAT4_H_HAS_BEEN_INCLUDED +#define OPENVDB_MATH_MAT4_H_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include "Math.h" +#include "Mat3.h" +#include "Vec3.h" +#include "Vec4.h" + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace math { + +template class Vec4; + + +/// @class Mat4 Mat4.h +/// @brief 4x4 -matrix class. +template +class Mat4: public Mat<4, T> +{ +public: + /// Data type held by the matrix. + typedef T value_type; + typedef T ValueType; + typedef Mat<4, T> MyBase; + + /// Trivial constructor, the matrix is NOT initialized + Mat4() {} + + /// Constructor given array of elements, the ordering is in row major form: + /** @verbatim + a[ 0] a[1] a[ 2] a[ 3] + a[ 4] a[5] a[ 6] a[ 7] + a[ 8] a[9] a[10] a[11] + a[12] a[13] a[14] a[15] + @endverbatim */ + template + Mat4(Source *a) + { + for (int i = 0; i < 16; i++) { + MyBase::mm[i] = a[i]; + } + } + + /// Constructor given array of elements, the ordering is in row major form: + /** @verbatim + a b c d + e f g h + i j k l + m n o p + @endverbatim */ + template + Mat4(Source a, Source b, Source c, Source d, + Source e, Source f, Source g, Source h, + Source i, Source j, Source k, Source l, + Source m, Source n, Source o, Source p) + { + MyBase::mm[ 0] = T(a); + MyBase::mm[ 1] = T(b); + MyBase::mm[ 2] = T(c); + MyBase::mm[ 3] = T(d); + + MyBase::mm[ 4] = T(e); + MyBase::mm[ 5] = T(f); + MyBase::mm[ 6] = T(g); + MyBase::mm[ 7] = T(h); + + MyBase::mm[ 8] = T(i); + MyBase::mm[ 9] = T(j); + MyBase::mm[10] = T(k); + MyBase::mm[11] = T(l); + + MyBase::mm[12] = T(m); + MyBase::mm[13] = T(n); + MyBase::mm[14] = T(o); + MyBase::mm[15] = T(p); + } + + /// Construct matrix from rows or columns vectors (defaults to rows + /// for historical reasons) + template + Mat4(const Vec4 &v1, const Vec4 &v2, + const Vec4 &v3, const Vec4 &v4, bool rows = true) + { + if (rows) { + this->setRows(v1, v2, v3); + } else { + this->setColumns(v1, v2, v3); + } + } + + /// Copy constructor + Mat4(const Mat<4, T> &m) + { + for (int i = 0; i < 4; ++i) { + for (int j = 0; j < 4; ++j) { + MyBase::mm[i*4 + j] = m[i][j]; + } + } + } + + /// Conversion constructor + template + explicit Mat4(const Mat4 &m) + { + const Source *src = m.asPointer(); + + for (int i=0; i<16; ++i) { + MyBase::mm[i] = static_cast(src[i]); + } + } + + /// Predefined constant for identity matrix + static const Mat4& identity() { + return sIdentity; + } + + /// Predefined constant for zero matrix + static const Mat4& zero() { + return sZero; + } + + /// Set ith row to vector v + void setRow(int i, const Vec4 &v) + { + // assert(i>=0 && i<4); + int i4 = i * 4; + MyBase::mm[i4+0] = v[0]; + MyBase::mm[i4+1] = v[1]; + MyBase::mm[i4+2] = v[2]; + MyBase::mm[i4+3] = v[3]; + } + + /// Get ith row, e.g. Vec4f v = m.row(1); + Vec4 row(int i) const + { + // assert(i>=0 && i<3); + return Vec4((*this)(i,0), (*this)(i,1), (*this)(i,2), (*this)(i,3)); + } + + /// Set jth column to vector v + void setCol(int j, const Vec4& v) + { + // assert(j>=0 && j<4); + MyBase::mm[ 0+j] = v[0]; + MyBase::mm[ 4+j] = v[1]; + MyBase::mm[ 8+j] = v[2]; + MyBase::mm[12+j] = v[3]; + } + + /// Get jth column, e.g. Vec4f v = m.col(0); + Vec4 col(int j) const + { + // assert(j>=0 && j<4); + return Vec4((*this)(0,j), (*this)(1,j), (*this)(2,j), (*this)(3,j)); + } + + //@{ + /// Array style reference to ith row + /// e.g. m[1][3] = 4; + T* operator[](int i) { return &(MyBase::mm[i<<2]); } + const T* operator[](int i) const { return &(MyBase::mm[i<<2]); } + //@} + + /// Direct access to the internal data + T* asPointer() {return MyBase::mm;} + const T* asPointer() const {return MyBase::mm;} + + /// Alternative indexed reference to the elements + /// Note that the indices are row first and column second. + /// e.g. m(0,0) = 1; + T& operator()(int i, int j) + { + // assert(i>=0 && i<4); + // assert(j>=0 && j<4); + return MyBase::mm[4*i+j]; + } + + /// Alternative indexed constant reference to the elements, + /// Note that the indices are row first and column second. + /// e.g. float f = m(1,0); + T operator()(int i, int j) const + { + // assert(i>=0 && i<4); + // assert(j>=0 && j<4); + return MyBase::mm[4*i+j]; + } + + /// Set the rows of "this" matrix to the vectors v1, v2, v3, v4 + void setRows(const Vec4 &v1, const Vec4 &v2, + const Vec4 &v3, const Vec4 &v4) + { + MyBase::mm[ 0] = v1[0]; + MyBase::mm[ 1] = v1[1]; + MyBase::mm[ 2] = v1[2]; + MyBase::mm[ 3] = v1[3]; + + MyBase::mm[ 4] = v2[0]; + MyBase::mm[ 5] = v2[1]; + MyBase::mm[ 6] = v2[2]; + MyBase::mm[ 7] = v2[3]; + + MyBase::mm[ 8] = v3[0]; + MyBase::mm[ 9] = v3[1]; + MyBase::mm[10] = v3[2]; + MyBase::mm[11] = v3[3]; + + MyBase::mm[12] = v4[0]; + MyBase::mm[13] = v4[1]; + MyBase::mm[14] = v4[2]; + MyBase::mm[15] = v4[3]; + } + + /// Set the columns of "this" matrix to the vectors v1, v2, v3, v4 + void setColumns(const Vec4 &v1, const Vec4 &v2, + const Vec4 &v3, const Vec4 &v4) + { + MyBase::mm[ 0] = v1[0]; + MyBase::mm[ 1] = v2[0]; + MyBase::mm[ 2] = v3[0]; + MyBase::mm[ 3] = v4[0]; + + MyBase::mm[ 4] = v1[1]; + MyBase::mm[ 5] = v2[1]; + MyBase::mm[ 6] = v3[1]; + MyBase::mm[ 7] = v4[1]; + + MyBase::mm[ 8] = v1[2]; + MyBase::mm[ 9] = v2[2]; + MyBase::mm[10] = v3[2]; + MyBase::mm[11] = v4[2]; + + MyBase::mm[12] = v1[3]; + MyBase::mm[13] = v2[3]; + MyBase::mm[14] = v3[3]; + MyBase::mm[15] = v4[3]; + } + + /// Set the rows of "this" matrix to the vectors v1, v2, v3, v4 + OPENVDB_DEPRECATED void setBasis(const Vec4 &v1, const Vec4 &v2, + const Vec4 &v3, const Vec4 &v4) + { + this->setRows(v1, v2, v3, v4); + } + + + // Set "this" matrix to zero + void setZero() + { + MyBase::mm[ 0] = 0; + MyBase::mm[ 1] = 0; + MyBase::mm[ 2] = 0; + MyBase::mm[ 3] = 0; + MyBase::mm[ 4] = 0; + MyBase::mm[ 5] = 0; + MyBase::mm[ 6] = 0; + MyBase::mm[ 7] = 0; + MyBase::mm[ 8] = 0; + MyBase::mm[ 9] = 0; + MyBase::mm[10] = 0; + MyBase::mm[11] = 0; + MyBase::mm[12] = 0; + MyBase::mm[13] = 0; + MyBase::mm[14] = 0; + MyBase::mm[15] = 0; + } + + /// Set "this" matrix to identity + void setIdentity() + { + MyBase::mm[ 0] = 1; + MyBase::mm[ 1] = 0; + MyBase::mm[ 2] = 0; + MyBase::mm[ 3] = 0; + + MyBase::mm[ 4] = 0; + MyBase::mm[ 5] = 1; + MyBase::mm[ 6] = 0; + MyBase::mm[ 7] = 0; + + MyBase::mm[ 8] = 0; + MyBase::mm[ 9] = 0; + MyBase::mm[10] = 1; + MyBase::mm[11] = 0; + + MyBase::mm[12] = 0; + MyBase::mm[13] = 0; + MyBase::mm[14] = 0; + MyBase::mm[15] = 1; + } + + + /// Set upper left to a Mat3 + void setMat3(const Mat3 &m) + { + for (int i = 0; i < 3; i++) + for (int j=0; j < 3; j++) + MyBase::mm[i*4+j] = m[i][j]; + } + + Mat3 getMat3() const + { + Mat3 m; + + for (int i = 0; i < 3; i++) + for (int j = 0; j < 3; j++) + m[i][j] = MyBase::mm[i*4+j]; + + return m; + } + + /// Return the translation component + Vec3 getTranslation() const + { + return Vec3(MyBase::mm[12], MyBase::mm[13], MyBase::mm[14]); + } + + void setTranslation(const Vec3 &t) + { + MyBase::mm[12] = t[0]; + MyBase::mm[13] = t[1]; + MyBase::mm[14] = t[2]; + } + + /// Assignment operator + template + const Mat4& operator=(const Mat4 &m) + { + const Source *src = m.asPointer(); + + // don't suppress warnings when assigning from different numerical types + std::copy(src, (src + this->numElements()), MyBase::mm); + return *this; + } + + /// Test if "this" is equivalent to m with tolerance of eps value + bool eq(const Mat4 &m, T eps=1.0e-8) const + { + for (int i = 0; i < 16; i++) { + if (!isApproxEqual(MyBase::mm[i], m.mm[i], eps)) + return false; + } + return true; + } + + /// Negation operator, for e.g. m1 = -m2; + Mat4 operator-() const + { + return Mat4( + -MyBase::mm[ 0], -MyBase::mm[ 1], -MyBase::mm[ 2], -MyBase::mm[ 3], + -MyBase::mm[ 4], -MyBase::mm[ 5], -MyBase::mm[ 6], -MyBase::mm[ 7], + -MyBase::mm[ 8], -MyBase::mm[ 9], -MyBase::mm[10], -MyBase::mm[11], + -MyBase::mm[12], -MyBase::mm[13], -MyBase::mm[14], -MyBase::mm[15] + ); + } // trivial + + /// Return m, where \f$m_{i,j} *= scalar\f$ for \f$i, j \in [0, 3]\f$ + template + const Mat4& operator*=(S scalar) + { + MyBase::mm[ 0] *= scalar; + MyBase::mm[ 1] *= scalar; + MyBase::mm[ 2] *= scalar; + MyBase::mm[ 3] *= scalar; + + MyBase::mm[ 4] *= scalar; + MyBase::mm[ 5] *= scalar; + MyBase::mm[ 6] *= scalar; + MyBase::mm[ 7] *= scalar; + + MyBase::mm[ 8] *= scalar; + MyBase::mm[ 9] *= scalar; + MyBase::mm[10] *= scalar; + MyBase::mm[11] *= scalar; + + MyBase::mm[12] *= scalar; + MyBase::mm[13] *= scalar; + MyBase::mm[14] *= scalar; + MyBase::mm[15] *= scalar; + return *this; + } + + /// @brief Returns m0, where \f$m0_{i,j} += m1_{i,j}\f$ for \f$i, j \in [0, 3]\f$ + template + const Mat4 &operator+=(const Mat4 &m1) + { + const S* s = m1.asPointer(); + + MyBase::mm[ 0] += s[ 0]; + MyBase::mm[ 1] += s[ 1]; + MyBase::mm[ 2] += s[ 2]; + MyBase::mm[ 3] += s[ 3]; + + MyBase::mm[ 4] += s[ 4]; + MyBase::mm[ 5] += s[ 5]; + MyBase::mm[ 6] += s[ 6]; + MyBase::mm[ 7] += s[ 7]; + + MyBase::mm[ 8] += s[ 8]; + MyBase::mm[ 9] += s[ 9]; + MyBase::mm[10] += s[10]; + MyBase::mm[11] += s[11]; + + MyBase::mm[12] += s[12]; + MyBase::mm[13] += s[13]; + MyBase::mm[14] += s[14]; + MyBase::mm[15] += s[15]; + + return *this; + } + + /// @brief Returns m0, where \f$m0_{i,j} -= m1_{i,j}\f$ for \f$i, j \in [0, 3]\f$ + template + const Mat4 &operator-=(const Mat4 &m1) + { + const S* s = m1.asPointer(); + + MyBase::mm[ 0] -= s[ 0]; + MyBase::mm[ 1] -= s[ 1]; + MyBase::mm[ 2] -= s[ 2]; + MyBase::mm[ 3] -= s[ 3]; + + MyBase::mm[ 4] -= s[ 4]; + MyBase::mm[ 5] -= s[ 5]; + MyBase::mm[ 6] -= s[ 6]; + MyBase::mm[ 7] -= s[ 7]; + + MyBase::mm[ 8] -= s[ 8]; + MyBase::mm[ 9] -= s[ 9]; + MyBase::mm[10] -= s[10]; + MyBase::mm[11] -= s[11]; + + MyBase::mm[12] -= s[12]; + MyBase::mm[13] -= s[13]; + MyBase::mm[14] -= s[14]; + MyBase::mm[15] -= s[15]; + + return *this; + } + + /// Return m, where \f$m_{i,j} = \sum_{k} m0_{i,k}*m1_{k,j}\f$ for \f$i, j \in [0, 3]\f$ + template + const Mat4 &operator*=(const Mat4 &m1) + { + Mat4 m0(*this); + + const T* s0 = m0.asPointer(); + const S* s1 = m1.asPointer(); + + for (int i = 0; i < 4; i++) { + int i4 = 4 * i; + MyBase::mm[i4+0] = static_cast(s0[i4+0] * s1[ 0] + + s0[i4+1] * s1[ 4] + + s0[i4+2] * s1[ 8] + + s0[i4+3] * s1[12]); + + MyBase::mm[i4+1] = static_cast(s0[i4+0] * s1[ 1] + + s0[i4+1] * s1[ 5] + + s0[i4+2] * s1[ 9] + + s0[i4+3] * s1[13]); + + MyBase::mm[i4+2] = static_cast(s0[i4+0] * s1[ 2] + + s0[i4+1] * s1[ 6] + + s0[i4+2] * s1[10] + + s0[i4+3] * s1[14]); + + MyBase::mm[i4+3] = static_cast(s0[i4+0] * s1[ 3] + + s0[i4+1] * s1[ 7] + + s0[i4+2] * s1[11] + + s0[i4+3] * s1[15]); + } + return *this; + } + + /// @return transpose of this + Mat4 transpose() const + { + return Mat4( + MyBase::mm[ 0], MyBase::mm[ 4], MyBase::mm[ 8], MyBase::mm[12], + MyBase::mm[ 1], MyBase::mm[ 5], MyBase::mm[ 9], MyBase::mm[13], + MyBase::mm[ 2], MyBase::mm[ 6], MyBase::mm[10], MyBase::mm[14], + MyBase::mm[ 3], MyBase::mm[ 7], MyBase::mm[11], MyBase::mm[15] + ); + } + + + /// @return inverse of this + /// @throw ArithmeticError if singular + Mat4 inverse(T tolerance = 0) const + { + // + // inv [ A | b ] = [ E | f ] A: 3x3, b: 3x1, c': 1x3 d: 1x1 + // [ c' | d ] [ g' | h ] + // + // If A is invertible use + // + // E = A^-1 + p*h*r + // p = A^-1 * b + // f = -p * h + // g' = -h * c' + // h = 1 / (d - c'*p) + // r' = c'*A^-1 + // + // Otherwise use gauss-jordan elimination + // + + // + // We create this alias to ourself so we can easily use own subscript + // operator. + const Mat4& m(*this); + + T m0011 = m[0][0] * m[1][1]; + T m0012 = m[0][0] * m[1][2]; + T m0110 = m[0][1] * m[1][0]; + T m0210 = m[0][2] * m[1][0]; + T m0120 = m[0][1] * m[2][0]; + T m0220 = m[0][2] * m[2][0]; + + T detA = m0011 * m[2][2] - m0012 * m[2][1] - m0110 * m[2][2] + + m0210 * m[2][1] + m0120 * m[1][2] - m0220 * m[1][1]; + + bool hasPerspective = + (!isExactlyEqual(m[0][3], T(0.0)) || + !isExactlyEqual(m[1][3], T(0.0)) || + !isExactlyEqual(m[2][3], T(0.0)) || + !isExactlyEqual(m[3][3], T(1.0))); + + T det; + if (hasPerspective) { + det = m[0][3] * det3(m, 1,2,3, 0,2,1) + + m[1][3] * det3(m, 2,0,3, 0,2,1) + + m[2][3] * det3(m, 3,0,1, 0,2,1) + + m[3][3] * detA; + } else { + det = detA * m[3][3]; + } + + Mat4 inv; + bool invertible; + + if (isApproxEqual(det,T(0.0),tolerance)) { + invertible = false; + + } else if (isApproxEqual(detA,T(0.0),T(1e-8))) { + // det is too small to rely on inversion by subblocks + invertible = m.invert(inv, tolerance); + + } else { + invertible = true; + detA = 1.0 / detA; + + // + // Calculate A^-1 + // + inv[0][0] = detA * ( m[1][1] * m[2][2] - m[1][2] * m[2][1]); + inv[0][1] = detA * (-m[0][1] * m[2][2] + m[0][2] * m[2][1]); + inv[0][2] = detA * ( m[0][1] * m[1][2] - m[0][2] * m[1][1]); + + inv[1][0] = detA * (-m[1][0] * m[2][2] + m[1][2] * m[2][0]); + inv[1][1] = detA * ( m[0][0] * m[2][2] - m0220); + inv[1][2] = detA * ( m0210 - m0012); + + inv[2][0] = detA * ( m[1][0] * m[2][1] - m[1][1] * m[2][0]); + inv[2][1] = detA * ( m0120 - m[0][0] * m[2][1]); + inv[2][2] = detA * ( m0011 - m0110); + + if (hasPerspective) { + // + // Calculate r, p, and h + // + Vec3 r; + r[0] = m[3][0] * inv[0][0] + m[3][1] * inv[1][0] + + m[3][2] * inv[2][0]; + r[1] = m[3][0] * inv[0][1] + m[3][1] * inv[1][1] + + m[3][2] * inv[2][1]; + r[2] = m[3][0] * inv[0][2] + m[3][1] * inv[1][2] + + m[3][2] * inv[2][2]; + + Vec3 p; + p[0] = inv[0][0] * m[0][3] + inv[0][1] * m[1][3] + + inv[0][2] * m[2][3]; + p[1] = inv[1][0] * m[0][3] + inv[1][1] * m[1][3] + + inv[1][2] * m[2][3]; + p[2] = inv[2][0] * m[0][3] + inv[2][1] * m[1][3] + + inv[2][2] * m[2][3]; + + T h = m[3][3] - p.dot(Vec3(m[3][0],m[3][1],m[3][2])); + if (isApproxEqual(h,T(0.0),tolerance)) { + invertible = false; + + } else { + h = 1.0 / h; + + // + // Calculate h, g, and f + // + inv[3][3] = h; + inv[3][0] = -h * r[0]; + inv[3][1] = -h * r[1]; + inv[3][2] = -h * r[2]; + + inv[0][3] = -h * p[0]; + inv[1][3] = -h * p[1]; + inv[2][3] = -h * p[2]; + + // + // Calculate E + // + p *= h; + inv[0][0] += p[0] * r[0]; + inv[0][1] += p[0] * r[1]; + inv[0][2] += p[0] * r[2]; + inv[1][0] += p[1] * r[0]; + inv[1][1] += p[1] * r[1]; + inv[1][2] += p[1] * r[2]; + inv[2][0] += p[2] * r[0]; + inv[2][1] += p[2] * r[1]; + inv[2][2] += p[2] * r[2]; + } + } else { + // Equations are much simpler in the non-perspective case + inv[3][0] = - (m[3][0] * inv[0][0] + m[3][1] * inv[1][0] + + m[3][2] * inv[2][0]); + inv[3][1] = - (m[3][0] * inv[0][1] + m[3][1] * inv[1][1] + + m[3][2] * inv[2][1]); + inv[3][2] = - (m[3][0] * inv[0][2] + m[3][1] * inv[1][2] + + m[3][2] * inv[2][2]); + inv[0][3] = 0.0; + inv[1][3] = 0.0; + inv[2][3] = 0.0; + inv[3][3] = 1.0; + } + } + + if (!invertible) OPENVDB_THROW(ArithmeticError, "Inversion of singular 4x4 matrix"); + return inv; + } + + + /// Determinant of matrix + T det() const + { + const T *ap; + Mat3 submat; + T det; + T *sp; + int i, j, k, sign; + + det = 0; + sign = 1; + for (i = 0; i < 4; i++) { + ap = &MyBase::mm[ 0]; + sp = submat.asPointer(); + for (j = 0; j < 4; j++) { + for (k = 0; k < 4; k++) { + if ((k != i) && (j != 0)) { + *sp++ = *ap; + } + ap++; + } + } + + det += sign * MyBase::mm[i] * submat.det(); + sign = -sign; + } + + return det; + } + + /// Sets the matrix to a matrix that translates by v + static Mat4 translation(const Vec3d& v) + { + return Mat4( + T(1), T(0), T(0), T(0), + T(0), T(1), T(0), T(0), + T(0), T(0), T(1), T(0), + T(v.x()), T(v.y()),T(v.z()), T(1)); + } + + /// Sets the matrix to a matrix that translates by v + template + void setToTranslation(const Vec3& v) + { + MyBase::mm[ 0] = 1; + MyBase::mm[ 1] = 0; + MyBase::mm[ 2] = 0; + MyBase::mm[ 3] = 0; + + MyBase::mm[ 4] = 0; + MyBase::mm[ 5] = 1; + MyBase::mm[ 6] = 0; + MyBase::mm[ 7] = 0; + + MyBase::mm[ 8] = 0; + MyBase::mm[ 9] = 0; + MyBase::mm[10] = 1; + MyBase::mm[11] = 0; + + MyBase::mm[12] = v.x(); + MyBase::mm[13] = v.y(); + MyBase::mm[14] = v.z(); + MyBase::mm[15] = 1; + } + + /// Left multiples by the specified translation, i.e. Trans * (*this) + template + void preTranslate(const Vec3& tr) + { + Vec3 tmp(tr.x(), tr.y(), tr.z()); + Mat4 Tr = Mat4::translation(tmp); + + *this = Tr * (*this); + + } + + /// Right multiplies by the specified translation matrix, i.e. (*this) * Trans + template + void postTranslate(const Vec3& tr) + { + Vec3 tmp(tr.x(), tr.y(), tr.z()); + Mat4 Tr = Mat4::translation(tmp); + + *this = (*this) * Tr; + + } + + + /// Sets the matrix to a matrix that scales by v + template + void setToScale(const Vec3& v) + { + this->setIdentity(); + MyBase::mm[ 0] = v.x(); + MyBase::mm[ 5] = v.y(); + MyBase::mm[10] = v.z(); + } + + // Left multiples by the specified scale matrix, i.e. Sc * (*this) + template + void preScale(const Vec3& v) + { + MyBase::mm[ 0] *= v.x(); + MyBase::mm[ 1] *= v.x(); + MyBase::mm[ 2] *= v.x(); + MyBase::mm[ 3] *= v.x(); + + MyBase::mm[ 4] *= v.y(); + MyBase::mm[ 5] *= v.y(); + MyBase::mm[ 6] *= v.y(); + MyBase::mm[ 7] *= v.y(); + + MyBase::mm[ 8] *= v.z(); + MyBase::mm[ 9] *= v.z(); + MyBase::mm[10] *= v.z(); + MyBase::mm[11] *= v.z(); + } + + + + // Right multiples by the specified scale matrix, i.e. (*this) * Sc + template + void postScale(const Vec3& v) + { + + MyBase::mm[ 0] *= v.x(); + MyBase::mm[ 1] *= v.y(); + MyBase::mm[ 2] *= v.z(); + + MyBase::mm[ 4] *= v.x(); + MyBase::mm[ 5] *= v.y(); + MyBase::mm[ 6] *= v.z(); + + MyBase::mm[ 8] *= v.x(); + MyBase::mm[ 9] *= v.y(); + MyBase::mm[10] *= v.z(); + + MyBase::mm[12] *= v.x(); + MyBase::mm[13] *= v.y(); + MyBase::mm[14] *= v.z(); + + } + + + /// @brief Sets the matrix to a rotation about the given axis. + /// @param axis The axis (one of X, Y, Z) to rotate about. + /// @param angle The rotation angle, in radians. + void setToRotation(Axis axis, T angle) {*this = rotation >(axis, angle);} + + /// @brief Sets the matrix to a rotation about an arbitrary axis + /// @param axis The axis of rotation (cannot be zero-length) + /// @param angle The rotation angle, in radians. + void setToRotation(const Vec3& axis, T angle) {*this = rotation >(axis, angle);} + + /// @brief Sets the matrix to a rotation that maps v1 onto v2 about the cross + /// product of v1 and v2. + void setToRotation(const Vec3& v1, const Vec3& v2) {*this = rotation >(v1, v2);} + + + /// @brief Left multiplies by a rotation clock-wiseabout the given axis into this matrix. + /// @param axis The axis (one of X, Y, Z) of rotation. + /// @param angle The clock-wise rotation angle, in radians. + void preRotate(Axis axis, T angle) + { + T c = static_cast(cos(angle)); + T s = -static_cast(sin(angle)); // the "-" makes it clockwise + + switch (axis) { + case X_AXIS: + { + T a4, a5, a6, a7; + + a4 = c * MyBase::mm[ 4] - s * MyBase::mm[ 8]; + a5 = c * MyBase::mm[ 5] - s * MyBase::mm[ 9]; + a6 = c * MyBase::mm[ 6] - s * MyBase::mm[10]; + a7 = c * MyBase::mm[ 7] - s * MyBase::mm[11]; + + + MyBase::mm[ 8] = s * MyBase::mm[ 4] + c * MyBase::mm[ 8]; + MyBase::mm[ 9] = s * MyBase::mm[ 5] + c * MyBase::mm[ 9]; + MyBase::mm[10] = s * MyBase::mm[ 6] + c * MyBase::mm[10]; + MyBase::mm[11] = s * MyBase::mm[ 7] + c * MyBase::mm[11]; + + MyBase::mm[ 4] = a4; + MyBase::mm[ 5] = a5; + MyBase::mm[ 6] = a6; + MyBase::mm[ 7] = a7; + } + break; + + case Y_AXIS: + { + T a0, a1, a2, a3; + + a0 = c * MyBase::mm[ 0] + s * MyBase::mm[ 8]; + a1 = c * MyBase::mm[ 1] + s * MyBase::mm[ 9]; + a2 = c * MyBase::mm[ 2] + s * MyBase::mm[10]; + a3 = c * MyBase::mm[ 3] + s * MyBase::mm[11]; + + MyBase::mm[ 8] = -s * MyBase::mm[ 0] + c * MyBase::mm[ 8]; + MyBase::mm[ 9] = -s * MyBase::mm[ 1] + c * MyBase::mm[ 9]; + MyBase::mm[10] = -s * MyBase::mm[ 2] + c * MyBase::mm[10]; + MyBase::mm[11] = -s * MyBase::mm[ 3] + c * MyBase::mm[11]; + + + MyBase::mm[ 0] = a0; + MyBase::mm[ 1] = a1; + MyBase::mm[ 2] = a2; + MyBase::mm[ 3] = a3; + } + break; + + case Z_AXIS: + { + T a0, a1, a2, a3; + + a0 = c * MyBase::mm[ 0] - s * MyBase::mm[ 4]; + a1 = c * MyBase::mm[ 1] - s * MyBase::mm[ 5]; + a2 = c * MyBase::mm[ 2] - s * MyBase::mm[ 6]; + a3 = c * MyBase::mm[ 3] - s * MyBase::mm[ 7]; + + MyBase::mm[ 4] = s * MyBase::mm[ 0] + c * MyBase::mm[ 4]; + MyBase::mm[ 5] = s * MyBase::mm[ 1] + c * MyBase::mm[ 5]; + MyBase::mm[ 6] = s * MyBase::mm[ 2] + c * MyBase::mm[ 6]; + MyBase::mm[ 7] = s * MyBase::mm[ 3] + c * MyBase::mm[ 7]; + + MyBase::mm[ 0] = a0; + MyBase::mm[ 1] = a1; + MyBase::mm[ 2] = a2; + MyBase::mm[ 3] = a3; + } + break; + + default: + assert(axis==X_AXIS || axis==Y_AXIS || axis==Z_AXIS); + } + } + + + /// @brief Right multiplies by a rotation clock-wiseabout the given axis into this matrix. + /// @param axis The axis (one of X, Y, Z) of rotation. + /// @param angle The clock-wise rotation angle, in radians. + void postRotate(Axis axis, T angle) + { + T c = static_cast(cos(angle)); + T s = -static_cast(sin(angle)); // the "-" makes it clockwise + + + + switch (axis) { + case X_AXIS: + { + T a2, a6, a10, a14; + + a2 = c * MyBase::mm[ 2] - s * MyBase::mm[ 1]; + a6 = c * MyBase::mm[ 6] - s * MyBase::mm[ 5]; + a10 = c * MyBase::mm[10] - s * MyBase::mm[ 9]; + a14 = c * MyBase::mm[14] - s * MyBase::mm[13]; + + + MyBase::mm[ 1] = c * MyBase::mm[ 1] + s * MyBase::mm[ 2]; + MyBase::mm[ 5] = c * MyBase::mm[ 5] + s * MyBase::mm[ 6]; + MyBase::mm[ 9] = c * MyBase::mm[ 9] + s * MyBase::mm[10]; + MyBase::mm[13] = c * MyBase::mm[13] + s * MyBase::mm[14]; + + MyBase::mm[ 2] = a2; + MyBase::mm[ 6] = a6; + MyBase::mm[10] = a10; + MyBase::mm[14] = a14; + } + break; + + case Y_AXIS: + { + T a2, a6, a10, a14; + + a2 = c * MyBase::mm[ 2] + s * MyBase::mm[ 0]; + a6 = c * MyBase::mm[ 6] + s * MyBase::mm[ 4]; + a10 = c * MyBase::mm[10] + s * MyBase::mm[ 8]; + a14 = c * MyBase::mm[14] + s * MyBase::mm[12]; + + MyBase::mm[ 0] = c * MyBase::mm[ 0] - s * MyBase::mm[ 2]; + MyBase::mm[ 4] = c * MyBase::mm[ 4] - s * MyBase::mm[ 6]; + MyBase::mm[ 8] = c * MyBase::mm[ 8] - s * MyBase::mm[10]; + MyBase::mm[12] = c * MyBase::mm[12] - s * MyBase::mm[14]; + + MyBase::mm[ 2] = a2; + MyBase::mm[ 6] = a6; + MyBase::mm[10] = a10; + MyBase::mm[14] = a14; + } + break; + + case Z_AXIS: + { + T a1, a5, a9, a13; + + a1 = c * MyBase::mm[ 1] - s * MyBase::mm[ 0]; + a5 = c * MyBase::mm[ 5] - s * MyBase::mm[ 4]; + a9 = c * MyBase::mm[ 9] - s * MyBase::mm[ 8]; + a13 = c * MyBase::mm[13] - s * MyBase::mm[12]; + + MyBase::mm[ 0] = c * MyBase::mm[ 0] + s * MyBase::mm[ 1]; + MyBase::mm[ 4] = c * MyBase::mm[ 4] + s * MyBase::mm[ 5]; + MyBase::mm[ 8] = c * MyBase::mm[ 8] + s * MyBase::mm[ 9]; + MyBase::mm[12] = c * MyBase::mm[12] + s * MyBase::mm[13]; + + MyBase::mm[ 1] = a1; + MyBase::mm[ 5] = a5; + MyBase::mm[ 9] = a9; + MyBase::mm[13] = a13; + + } + break; + + default: + assert(axis==X_AXIS || axis==Y_AXIS || axis==Z_AXIS); + } + } + + /// @brief Sets the matrix to a shear along axis0 by a fraction of axis1. + /// @param axis0 The fixed axis of the shear. + /// @param axis1 The shear axis. + /// @param shearby The shear factor. + void setToShear(Axis axis0, Axis axis1, T shearby) + { + *this = shear >(axis0, axis1, shearby); + } + + + /// @brief Left multiplies a shearing transformation into the matrix. + /// @see setToShear + void preShear(Axis axis0, Axis axis1, T shear) + { + int index0 = static_cast(axis0); + int index1 = static_cast(axis1); + + // to row "index1" add a multiple of the index0 row + MyBase::mm[index1 * 4 + 0] += shear * MyBase::mm[index0 * 4 + 0]; + MyBase::mm[index1 * 4 + 1] += shear * MyBase::mm[index0 * 4 + 1]; + MyBase::mm[index1 * 4 + 2] += shear * MyBase::mm[index0 * 4 + 2]; + MyBase::mm[index1 * 4 + 3] += shear * MyBase::mm[index0 * 4 + 3]; + } + + + /// @brief Right multiplies a shearing transformation into the matrix. + /// @see setToShear + void postShear(Axis axis0, Axis axis1, T shear) + { + int index0 = static_cast(axis0); + int index1 = static_cast(axis1); + + // to collumn "index0" add a multiple of the index1 row + MyBase::mm[index0 + 0] += shear * MyBase::mm[index1 + 0]; + MyBase::mm[index0 + 4] += shear * MyBase::mm[index1 + 4]; + MyBase::mm[index0 + 8] += shear * MyBase::mm[index1 + 8]; + MyBase::mm[index0 + 12] += shear * MyBase::mm[index1 + 12]; + + } + + /// Transform a Vec4 by post-multiplication. + template + Vec4 transform(const Vec4 &v) const + { + return static_cast< Vec4 >(v * *this); + } + + /// Transform a Vec3 by post-multiplication, without homogenous division. + template + Vec3 transform(const Vec3 &v) const + { + return static_cast< Vec3 >(v * *this); + } + + /// Transform a Vec4 by pre-multiplication. + template + Vec4 pretransform(const Vec4 &v) const + { + return static_cast< Vec4 >(*this * v); + } + + /// Transform a Vec3 by pre-multiplication, without homogenous division. + template + Vec3 pretransform(const Vec3 &v) const + { + return static_cast< Vec3 >(*this * v); + } + + /// Transform a Vec3 by post-multiplication, doing homogenous divison. + template + Vec3 transformH(const Vec3 &p) const + { + T0 w; + + // w = p * (*this).col(3); + w = static_cast(p[0] * MyBase::mm[ 3] + p[1] * MyBase::mm[ 7] + + p[2] * MyBase::mm[11] + MyBase::mm[15]); + + if ( !isExactlyEqual(w , 0.0) ) { + return Vec3(static_cast((p[0] * MyBase::mm[ 0] + p[1] * MyBase::mm[ 4] + + p[2] * MyBase::mm[ 8] + MyBase::mm[12]) / w), + static_cast((p[0] * MyBase::mm[ 1] + p[1] * MyBase::mm[ 5] + + p[2] * MyBase::mm[ 9] + MyBase::mm[13]) / w), + static_cast((p[0] * MyBase::mm[ 2] + p[1] * MyBase::mm[ 6] + + p[2] * MyBase::mm[10] + MyBase::mm[14]) / w)); + } + + return Vec3(0, 0, 0); + } + + /// Transform a Vec3 by pre-multiplication, doing homogenous division. + template + Vec3 pretransformH(const Vec3 &p) const + { + T0 w; + + // w = p * (*this).col(3); + w = p[0] * MyBase::mm[12] + p[1] * MyBase::mm[13] + p[2] * MyBase::mm[14] + MyBase::mm[15]; + + if ( !isExactlyEqual(w , 0.0) ) { + return Vec3(static_cast((p[0] * MyBase::mm[ 0] + p[1] * MyBase::mm[ 1] + + p[2] * MyBase::mm[ 2] + MyBase::mm[ 3]) / w), + static_cast((p[0] * MyBase::mm[ 4] + p[1] * MyBase::mm[ 5] + + p[2] * MyBase::mm[ 6] + MyBase::mm[ 7]) / w), + static_cast((p[0] * MyBase::mm[ 8] + p[1] * MyBase::mm[ 9] + + p[2] * MyBase::mm[10] + MyBase::mm[11]) / w)); + } + + return Vec3(0, 0, 0); + } + + /// Transform a Vec3 by post-multiplication, without translation. + template + Vec3 transform3x3(const Vec3 &v) const + { + return Vec3( + static_cast(v[0] * MyBase::mm[ 0] + v[1] * MyBase::mm[ 4] + v[2] * MyBase::mm[ 8]), + static_cast(v[0] * MyBase::mm[ 1] + v[1] * MyBase::mm[ 5] + v[2] * MyBase::mm[ 9]), + static_cast(v[0] * MyBase::mm[ 2] + v[1] * MyBase::mm[ 6] + v[2] * MyBase::mm[10])); + } + + +private: + bool invert(Mat4 &inverse, T tolerance) const; + + T det2(const Mat4 &a, int i0, int i1, int j0, int j1) const { + int i0row = i0 * 4; + int i1row = i1 * 4; + return a.mm[i0row+j0]*a.mm[i1row+j1] - a.mm[i0row+j1]*a.mm[i1row+j0]; + } + + T det3(const Mat4 &a, int i0, int i1, int i2, + int j0, int j1, int j2) const { + int i0row = i0 * 4; + return a.mm[i0row+j0]*det2(a, i1,i2, j1,j2) + + a.mm[i0row+j1]*det2(a, i1,i2, j2,j0) + + a.mm[i0row+j2]*det2(a, i1,i2, j0,j1); + } + + static const Mat4 sIdentity; + static const Mat4 sZero; +}; // class Mat4 + + +template +const Mat4 Mat4::sIdentity = Mat4(1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); + +template +const Mat4 Mat4::sZero = Mat4(0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0); + +/// @relates Mat4 +/// @brief Equality operator, does exact floating point comparisons +template +bool operator==(const Mat4 &m0, const Mat4 &m1) +{ + const T0 *t0 = m0.asPointer(); + const T1 *t1 = m1.asPointer(); + + for (int i=0; i<16; ++i) if (!isExactlyEqual(t0[i], t1[i])) return false; + return true; +} + +/// @relates Mat4 +/// @brief Inequality operator, does exact floating point comparisons +template +bool operator!=(const Mat4 &m0, const Mat4 &m1) { return !(m0 == m1); } + +/// @relates Mat4 +/// @brief Returns M, where \f$M_{i,j} = m_{i,j} * scalar\f$ for \f$i, j \in [0, 3]\f$ +template +Mat4::type> operator*(S scalar, const Mat4 &m) +{ + return m*scalar; +} + +/// @relates Mat4 +/// @brief Returns M, where \f$M_{i,j} = m_{i,j} * scalar\f$ for \f$i, j \in [0, 3]\f$ +template +Mat4::type> operator*(const Mat4 &m, S scalar) +{ + Mat4::type> result(m); + result *= scalar; + return result; +} + +/// @relates Mat4 +/// @brief Returns v, where \f$v_{i} = \sum_{n=0}^3 m_{i,n} * v_n \f$ for \f$i \in [0, 3]\f$ +template +inline Vec4::type> +operator*(const Mat4 &_m, + const Vec4 &_v) +{ + MT const *m = _m.asPointer(); + return Vec4::type>( + _v[0]*m[0] + _v[1]*m[1] + _v[2]*m[2] + _v[3]*m[3], + _v[0]*m[4] + _v[1]*m[5] + _v[2]*m[6] + _v[3]*m[7], + _v[0]*m[8] + _v[1]*m[9] + _v[2]*m[10] + _v[3]*m[11], + _v[0]*m[12] + _v[1]*m[13] + _v[2]*m[14] + _v[3]*m[15]); +} + +/// @relates Mat4 +/// @brief Returns v, where \f$v_{i} = \sum_{n=0}^3 m_{n,i} * v_n \f$ for \f$i \in [0, 3]\f$ +template +inline Vec4::type> +operator*(const Vec4 &_v, + const Mat4 &_m) +{ + MT const *m = _m.asPointer(); + return Vec4::type>( + _v[0]*m[0] + _v[1]*m[4] + _v[2]*m[8] + _v[3]*m[12], + _v[0]*m[1] + _v[1]*m[5] + _v[2]*m[9] + _v[3]*m[13], + _v[0]*m[2] + _v[1]*m[6] + _v[2]*m[10] + _v[3]*m[14], + _v[0]*m[3] + _v[1]*m[7] + _v[2]*m[11] + _v[3]*m[15]); +} + +/// @relates Mat4 +/// @brief Returns v, where +/// \f$v_{i} = \sum_{n=0}^3\left(m_{i,n} * v_n + m_{i,3}\right)\f$ for \f$i \in [0, 2]\f$ +template +inline Vec3::type> +operator*(const Mat4 &_m, + const Vec3 &_v) +{ + MT const *m = _m.asPointer(); + return Vec3::type>( + _v[0]*m[0] + _v[1]*m[1] + _v[2]*m[2] + m[3], + _v[0]*m[4] + _v[1]*m[5] + _v[2]*m[6] + m[7], + _v[0]*m[8] + _v[1]*m[9] + _v[2]*m[10] + m[11]); +} + +/// @relates Mat4 +/// @brief Returns v, where +/// \f$v_{i} = \sum_{n=0}^3\left(m_{n,i} * v_n + m_{3,i}\right)\f$ for \f$i \in [0, 2]\f$ +template +inline Vec3::type> +operator*(const Vec3 &_v, + const Mat4 &_m) +{ + MT const *m = _m.asPointer(); + return Vec3::type>( + _v[0]*m[0] + _v[1]*m[4] + _v[2]*m[8] + m[12], + _v[0]*m[1] + _v[1]*m[5] + _v[2]*m[9] + m[13], + _v[0]*m[2] + _v[1]*m[6] + _v[2]*m[10] + m[14]); +} + +/// @relates Mat4 +/// @brief Returns M, where \f$M_{i,j} = m0_{i,j} + m1_{i,j}\f$ for \f$i, j \in [0, 3]\f$ +template +Mat4::type> +operator+(const Mat4 &m0, const Mat4 &m1) +{ + Mat4::type> result(m0); + result += m1; + return result; +} + +/// @relates Mat4 +/// @brief Returns M, where \f$M_{i,j} = m0_{i,j} - m1_{i,j}\f$ for \f$i, j \in [0, 3]\f$ +template +Mat4::type> +operator-(const Mat4 &m0, const Mat4 &m1) +{ + Mat4::type> result(m0); + result -= m1; + return result; +} + +/// @relates Mat4 +/// @brief Returns M, where +/// \f$M_{ij} = \sum_{n=0}^3\left(m0_{nj} + m1_{in}\right)\f$ for \f$i, j \in [0, 3]\f$ +template +Mat4::type> +operator*(const Mat4 &m0, const Mat4 &m1) +{ + Mat4::type> result(m0); + result *= m1; + return result; +} + + +/// Transform a Vec3 by pre-multiplication, without translation. +/// Presumes this matrix is inverse of coordinate transform +/// Synonymous to "pretransform3x3" +template +Vec3 transformNormal(const Mat4 &m, const Vec3 &n) +{ + return Vec3( + static_cast(m[0][0]*n[0] + m[0][1]*n[1] + m[0][2]*n[2]), + static_cast(m[1][0]*n[0] + m[1][1]*n[1] + m[1][2]*n[2]), + static_cast(m[2][0]*n[0] + m[2][1]*n[1] + m[2][2]*n[2])); +} + + +/// Invert via gauss-jordan elimination. Modified from dreamworks internal mx library +template +bool Mat4::invert(Mat4 &inverse, T tolerance) const +{ + Mat4 temp(*this); + inverse.setIdentity(); + + // Forward elimination step + double det = 1.0; + for (int i = 0; i < 4; ++i) { + int row = i; + double max = fabs(temp[i][i]); + + for (int k = i+1; k < 4; ++k) { + if (fabs(temp[k][i]) > max) { + row = k; + max = fabs(temp[k][i]); + } + } + + if (isExactlyEqual(max, 0.0)) return false; + + // must move pivot to row i + if (row != i) { + det = -det; + for (int k = 0; k < 4; ++k) { + std::swap(temp[row][k], temp[i][k]); + std::swap(inverse[row][k], inverse[i][k]); + } + } + + double pivot = temp[i][i]; + det *= pivot; + + // scale row i + for (int k = 0; k < 4; ++k) { + temp[i][k] /= pivot; + inverse[i][k] /= pivot; + } + + // eliminate in rows below i + for (int j = i+1; j < 4; ++j) { + double t = temp[j][i]; + if (!isExactlyEqual(t, 0.0)) { + // subtract scaled row i from row j + for (int k = 0; k < 4; ++k) { + temp[j][k] -= temp[i][k] * t; + inverse[j][k] -= inverse[i][k] * t; + } + } + } + } + + // Backward elimination step + for (int i = 3; i > 0; --i) { + for (int j = 0; j < i; ++j) { + double t = temp[j][i]; + + if (!isExactlyEqual(t, 0.0)) { + for (int k = 0; k < 4; ++k) { + inverse[j][k] -= inverse[i][k]*t; + } + } + } + } + return det*det >= tolerance*tolerance; +} + +template +inline bool isAffine(const Mat4& m) { + return (m.col(3) == Vec4(0, 0, 0, 1)); +} + +template +inline bool hasTranslation(const Mat4& m) { + return (m.row(3) != Vec4(0, 0, 0, 1)); +} + + +typedef Mat4 Mat4s; +typedef Mat4 Mat4d; + +#if DWREAL_IS_DOUBLE == 1 +typedef Mat4d Mat4f; +#else +typedef Mat4s Mat4f; +#endif // DWREAL_IS_DOUBLE + +} // namespace math + + +template<> inline math::Mat4s zeroVal() { return math::Mat4s::identity(); } +template<> inline math::Mat4d zeroVal() { return math::Mat4d::identity(); } + +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_UTIL_MAT4_H_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/math/Math.h b/nuparu/include/openvdb/include/openvdb/math/Math.h new file mode 100644 index 00000000..c2213295 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/math/Math.h @@ -0,0 +1,912 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file Math.h +/// @brief General-purpose arithmetic and comparison routines, most of which +/// accept arbitrary value types (or at least arbitrary numeric value types) + +#ifndef OPENVDB_MATH_HAS_BEEN_INCLUDED +#define OPENVDB_MATH_HAS_BEEN_INCLUDED + +#include +#include // for std::max() +#include // for floor(), ceil() and sqrt() +#include // for pow(), fabs() etc +#include // for srand(), abs(int) +#include // for std::numeric_limits::max() +#include +#include +#include +#include // boost::math::isfinite +#include // for boost::random::mt19937 +#include +#include +#include // for BOOST_VERSION +#include +#include + + +// Compile pragmas + +#define PRAGMA(x) _Pragma(#x) + +// Intel(r) compiler fires remark #1572: floating-point equality and inequality +// comparisons are unrealiable when == or != is used with floating point operands. +#if defined(__INTEL_COMPILER) + #define OPENVDB_NO_FP_EQUALITY_WARNING_BEGIN \ + _Pragma("warning (push)") \ + _Pragma("warning (disable:1572)") + #define OPENVDB_NO_FP_EQUALITY_WARNING_END \ + _Pragma("warning (pop)") +#elif defined(__clang__) + #define OPENVDB_NO_FP_EQUALITY_WARNING_BEGIN \ + PRAGMA(clang diagnostic push) \ + PRAGMA(clang diagnostic ignored "-Wfloat-equal") + #define OPENVDB_NO_FP_EQUALITY_WARNING_END \ + PRAGMA(clang diagnostic pop) +#else + // For GCC, #pragma GCC diagnostic ignored "-Wfloat-equal" + // isn't working until gcc 4.2+, + // Trying + // #pragma GCC system_header + // creates other problems, most notably "warning: will never be executed" + // in from templates, unsure of how to work around. + // If necessary, could use integer based comparisons for equality + #define OPENVDB_NO_FP_EQUALITY_WARNING_BEGIN + #define OPENVDB_NO_FP_EQUALITY_WARNING_END +#endif + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { + +/// @brief Return the value of type T that corresponds to zero. +/// @note A zeroVal() specialization must be defined for each @c ValueType T +/// that cannot be constructed using the form @c T(0). For example, @c std::string(0) +/// treats 0 as @c NULL and throws a @c std::logic_error. +template inline T zeroVal() { return T(0); } +/// Return the @c std::string value that corresponds to zero. +template<> inline std::string zeroVal() { return ""; } +/// Return the @c bool value that corresponds to zero. +template<> inline bool zeroVal() { return false; } + +/// @todo These won't be needed if we eliminate StringGrids. +//@{ +/// @brief Needed to support the (zeroVal() + val) idiom +/// when @c ValueType is @c std::string +inline std::string operator+(const std::string& s, bool) { return s; } +inline std::string operator+(const std::string& s, int) { return s; } +inline std::string operator+(const std::string& s, float) { return s; } +inline std::string operator+(const std::string& s, double) { return s; } +//@} + + +namespace math { + +/// @brief Return the unary negation of the given value. +/// @note A negative() specialization must be defined for each ValueType T +/// for which unary negation is not defined. +template inline T negative(const T& val) { return T(-val); } +/// Return the negation of the given boolean. +template<> inline bool negative(const bool& val) { return !val; } +/// Return the "negation" of the given string. +template<> inline std::string negative(const std::string& val) { return val; } + + +//@{ +/// Tolerance for floating-point comparison +template struct Tolerance { static T value() { return zeroVal(); } }; +template<> struct Tolerance { static float value() { return 1e-8f; } }; +template<> struct Tolerance { static double value() { return 1e-15; } }; +//@} + +//@{ +/// Delta for small floating-point offsets +template struct Delta { static T value() { return zeroVal(); } }; +template<> struct Delta { static float value() { return 1e-5f; } }; +template<> struct Delta { static double value() { return 1e-9; } }; +//@} + + +// ==========> Random Values <================== + +/// @brief Simple generator of random numbers over the range [0, 1) +/// @details Thread-safe as long as each thread has its own Rand01 instance +template +class Rand01 +{ +private: + EngineType mEngine; + boost::uniform_01 mRand; + +public: + typedef FloatType ValueType; + + /// @brief Initialize the generator. + /// @param engine random number generator + Rand01(const EngineType& engine): mEngine(engine) {} + + /// @brief Initialize the generator. + /// @param seed seed value for the random number generator + Rand01(unsigned int seed): mEngine(static_cast(seed)) {} + + /// Set the seed value for the random number generator + void setSeed(unsigned int seed) + { + mEngine.seed(static_cast(seed)); + } + + /// Return a const reference to the random number generator. + const EngineType& engine() const { return mEngine; } + + /// Return a uniformly distributed random number in the range [0, 1). + FloatType operator()() { return mRand(mEngine); } +}; + +typedef Rand01 Random01; + + +/// @brief Simple random integer generator +/// @details Thread-safe as long as each thread has its own RandInt instance +template +class RandInt +{ +private: +#if BOOST_VERSION >= 104700 + typedef boost::random::uniform_int_distribution Distr; +#else + typedef boost::uniform_int Distr; +#endif + EngineType mEngine; + Distr mRand; + +public: + /// @brief Initialize the generator. + /// @param engine random number generator + /// @param imin,imax generate integers that are uniformly distributed over [imin, imax] + RandInt(const EngineType& engine, IntType imin, IntType imax): + mEngine(engine), + mRand(std::min(imin, imax), std::max(imin, imax)) + {} + + /// @brief Initialize the generator. + /// @param seed seed value for the random number generator + /// @param imin,imax generate integers that are uniformly distributed over [imin, imax] + RandInt(unsigned int seed, IntType imin, IntType imax): + mEngine(static_cast(seed)), + mRand(std::min(imin, imax), std::max(imin, imax)) + {} + + /// Change the range over which integers are distributed to [imin, imax]. + void setRange(IntType imin, IntType imax) + { + mRand = Distr(std::min(imin, imax), std::max(imin, imax)); + } + + /// Set the seed value for the random number generator + void setSeed(unsigned int seed) + { + mEngine.seed(static_cast(seed)); + } + + /// Return a const reference to the random number generator. + const EngineType& engine() const { return mEngine; } + + /// Return a randomly-generated integer in the current range. + IntType operator()() { return mRand(mEngine); } + + /// @brief Return a randomly-generated integer in the new range [imin, imax], + /// without changing the current range. + IntType operator()(IntType imin, IntType imax) + { + const IntType lo = std::min(imin, imax), hi = std::max(imin, imax); +#if BOOST_VERSION >= 104700 + return mRand(mEngine, typename Distr::param_type(lo, hi)); +#else + return Distr(lo, hi)(mEngine); +#endif + } +}; + +typedef RandInt RandomInt; + + +// ==========> Clamp <================== + +/// Return @a x clamped to [@a min, @a max] +template +inline Type +Clamp(Type x, Type min, Type max) +{ + assert( !(min>max) ); + return x > min ? x < max ? x : max : min; +} + + +/// Return @a x clamped to [0, 1] +template +inline Type +Clamp01(Type x) { return x > Type(0) ? x < Type(1) ? x : Type(1) : Type(0); } + + +/// Return @c true if @a x is outside [0,1] +template +inline bool +ClampTest01(Type &x) +{ + if (x >= Type(0) && x <= Type(1)) return false; + x = x < Type(0) ? Type(0) : Type(1); + return true; +} + +/// @brief Return 0 if @a x < @a 0, 1 if @a x > 1 or else @f$(3-2x)x^2@f$. +template +inline Type +SmoothUnitStep(Type x) +{ + return x > 0 ? x < 1 ? (3-2*x)*x*x : Type(1) : Type(0); +} + +/// @brief Return 0 if @a x < @a min, 1 if @a x > @a max or else @f$(3-2t)t^2@f$, +/// where @f$t = (x-min)/(max-min)@f$. +template +inline Type +SmoothUnitStep(Type x, Type min, Type max) +{ + assert(min < max); + return SmoothUnitStep((x-min)/(max-min)); +} + + +// ==========> Absolute Value <================== + + +//@{ +/// Return the absolute value of the given quantity. +inline int32_t Abs(int32_t i) { return abs(i); } +inline int64_t Abs(int64_t i) +{ +#ifdef _MSC_VER + return (i < int64_t(0) ? -i : i); +#else + return labs(i); +#endif +} +inline float Abs(float x) { return fabsf(x); } +inline double Abs(double x) { return fabs(x); } +inline long double Abs(long double x) { return fabsl(x); } +inline uint32_t Abs(uint32_t i) { return i; } +inline uint64_t Abs(uint64_t i) { return i; } +inline bool Abs(bool b) { return b; } +// On OSX size_t and uint64_t are different types +#if defined(__APPLE__) || defined(MACOSX) +inline size_t Abs(size_t i) { return i; } +#endif +//@} + + +//////////////////////////////////////// + + +// ==========> Value Comparison <================== + + +/// Return @c true if @a x is exactly equal to zero. +template +inline bool +isZero(const Type& x) +{ + OPENVDB_NO_FP_EQUALITY_WARNING_BEGIN + return x == zeroVal(); + OPENVDB_NO_FP_EQUALITY_WARNING_END +} + + +/// @brief Return @c true if @a x is equal to zero to within +/// the default floating-point comparison tolerance. +template +inline bool +isApproxZero(const Type& x) +{ + const Type tolerance = Type(zeroVal() + Tolerance::value()); + return !(x > tolerance) && !(x < -tolerance); +} + +/// Return @c true if @a x is equal to zero to within the given tolerance. +template +inline bool +isApproxZero(const Type& x, const Type& tolerance) +{ + return !(x > tolerance) && !(x < -tolerance); +} + + +/// Return @c true if @a x is less than zero. +template +inline bool +isNegative(const Type& x) { return x < zeroVal(); } + +/// Return @c false, since @c bool values are never less than zero. +template<> inline bool isNegative(const bool&) { return false; } + + +/// Return @c true if @a x is finite. +template +inline bool +isFinite(const Type& x) { return boost::math::isfinite(x); } + + +/// @brief Return @c true if @a a is equal to @a b to within +/// the default floating-point comparison tolerance. +template +inline bool +isApproxEqual(const Type& a, const Type& b) +{ + const Type tolerance = Type(zeroVal() + Tolerance::value()); + return !(Abs(a - b) > tolerance); +} + + +/// Return @c true if @a a is equal to @a b to within the given tolerance. +template +inline bool +isApproxEqual(const Type& a, const Type& b, const Type& tolerance) +{ + return !(Abs(a - b) > tolerance); +} + +#define OPENVDB_EXACT_IS_APPROX_EQUAL(T) \ + template<> inline bool isApproxEqual(const T& a, const T& b) { return a == b; } \ + template<> inline bool isApproxEqual(const T& a, const T& b, const T&) { return a == b; } \ + /**/ + +OPENVDB_EXACT_IS_APPROX_EQUAL(bool) +OPENVDB_EXACT_IS_APPROX_EQUAL(std::string) + + +/// @brief Return @c true if @a a is larger than @a b to within +/// the given tolerance, i.e., if @a b - @a a < @a tolerance. +template +inline bool +isApproxLarger(const Type& a, const Type& b, const Type& tolerance) +{ + return (b - a < tolerance); +} + + +/// @brief Return @c true if @a a is exactly equal to @a b. +template +inline bool +isExactlyEqual(const T0& a, const T1& b) +{ + OPENVDB_NO_FP_EQUALITY_WARNING_BEGIN + return a == b; + OPENVDB_NO_FP_EQUALITY_WARNING_END +} + + +template +inline bool +isRelOrApproxEqual(const Type& a, const Type& b, const Type& absTol, const Type& relTol) +{ + // First check to see if we are inside the absolute tolerance + // Necessary for numbers close to 0 + if (!(Abs(a - b) > absTol)) return true; + + // Next check to see if we are inside the relative tolerance + // to handle large numbers that aren't within the abs tolerance + // but could be the closest floating point representation + double relError; + if (Abs(b) > Abs(a)) { + relError = Abs((a - b) / b); + } else { + relError = Abs((a - b) / a); + } + return (relError <= relTol); +} + +template<> +inline bool +isRelOrApproxEqual(const bool& a, const bool& b, const bool&, const bool&) +{ + return (a == b); +} + + +// Avoid strict aliasing issues by using type punning +// http://cellperformance.beyond3d.com/articles/2006/06/understanding-strict-aliasing.html +// Using "casting through a union(2)" +inline int32_t +floatToInt32(const float aFloatValue) +{ + union FloatOrInt32 { float floatValue; int32_t int32Value; }; + const FloatOrInt32* foi = reinterpret_cast(&aFloatValue); + return foi->int32Value; +} + + +inline int64_t +doubleToInt64(const double aDoubleValue) +{ + union DoubleOrInt64 { double doubleValue; int64_t int64Value; }; + const DoubleOrInt64* dol = reinterpret_cast(&aDoubleValue); + return dol->int64Value; +} + + +// aUnitsInLastPlace is the allowed difference between the least significant digits +// of the numbers' floating point representation +// Please read the reference paper before trying to use isUlpsEqual +// http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm +inline bool +isUlpsEqual(const double aLeft, const double aRight, const int64_t aUnitsInLastPlace) +{ + int64_t longLeft = doubleToInt64(aLeft); + // Because of 2's complement, must restore lexicographical order + if (longLeft < 0) { + longLeft = INT64_C(0x8000000000000000) - longLeft; + } + + int64_t longRight = doubleToInt64(aRight); + // Because of 2's complement, must restore lexicographical order + if (longRight < 0) { + longRight = INT64_C(0x8000000000000000) - longRight; + } + + int64_t difference = labs(longLeft - longRight); + return (difference <= aUnitsInLastPlace); +} + +inline bool +isUlpsEqual(const float aLeft, const float aRight, const int32_t aUnitsInLastPlace) +{ + int32_t intLeft = floatToInt32(aLeft); + // Because of 2's complement, must restore lexicographical order + if (intLeft < 0) { + intLeft = 0x80000000 - intLeft; + } + + int32_t intRight = floatToInt32(aRight); + // Because of 2's complement, must restore lexicographical order + if (intRight < 0) { + intRight = 0x80000000 - intRight; + } + + int32_t difference = abs(intLeft - intRight); + return (difference <= aUnitsInLastPlace); +} + + +//////////////////////////////////////// + + +// ==========> Pow <================== + +/// Return @f$ x^2 @f$. +template +inline Type Pow2(Type x) { return x*x; } + +/// Return @f$ x^3 @f$. +template +inline Type Pow3(Type x) { return x*x*x; } + +/// Return @f$ x^4 @f$. +template +inline Type Pow4(Type x) { return Pow2(Pow2(x)); } + +/// Return @f$ x^n @f$. +template +Type +Pow(Type x, int n) +{ + Type ans = 1; + if (n < 0) { + n = -n; + x = Type(1)/x; + } + while (n--) ans *= x; + return ans; +} + +//@{ +/// Return @f$ b^e @f$. +inline float +Pow(float b, float e) +{ + assert( b >= 0.0f && "Pow(float,float): base is negative" ); + return powf(b,e); +} + +inline double +Pow(double b, double e) +{ + assert( b >= 0.0 && "Pow(double,double): base is negative" ); + return pow(b,e); +} +//@} + + +// ==========> Max <================== + +/// Return the maximum of two values +template +inline const Type& +Max(const Type& a, const Type& b) +{ + return std::max(a,b) ; +} + +/// Return the maximum of three values +template +inline const Type& +Max(const Type& a, const Type& b, const Type& c) +{ + return std::max( std::max(a,b), c ) ; +} + +/// Return the maximum of four values +template +inline const Type& +Max(const Type& a, const Type& b, const Type& c, const Type& d) +{ + return std::max(std::max(a,b), std::max(c,d)); +} + +/// Return the maximum of five values +template +inline const Type& +Max(const Type& a, const Type& b, const Type& c, const Type& d, const Type& e) +{ + return std::max(std::max(a,b), Max(c,d,e)); +} + +/// Return the maximum of six values +template +inline const Type& +Max(const Type& a, const Type& b, const Type& c, const Type& d, const Type& e, const Type& f) +{ + return std::max(Max(a,b,c), Max(d,e,f)); +} + +/// Return the maximum of seven values +template +inline const Type& +Max(const Type& a, const Type& b, const Type& c, const Type& d, + const Type& e, const Type& f, const Type& g) +{ + return std::max(Max(a,b,c,d), Max(e,f,g)); +} + +/// Return the maximum of eight values +template +inline const Type& +Max(const Type& a, const Type& b, const Type& c, const Type& d, + const Type& e, const Type& f, const Type& g, const Type& h) +{ + return std::max(Max(a,b,c,d), Max(e,f,g,h)); +} + + +// ==========> Min <================== + +/// Return the minimum of two values +template +inline const Type& +Min(const Type& a, const Type& b) { return std::min(a, b); } + +/// Return the minimum of three values +template +inline const Type& +Min(const Type& a, const Type& b, const Type& c) { return std::min(std::min(a, b), c); } + +/// Return the minimum of four values +template +inline const Type& +Min(const Type& a, const Type& b, const Type& c, const Type& d) +{ + return std::min(std::min(a, b), std::min(c, d)); +} + +/// Return the minimum of five values +template +inline const Type& +Min(const Type& a, const Type& b, const Type& c, const Type& d, const Type& e) +{ + return std::min(std::min(a,b), Min(c,d,e)); +} + +/// Return the minimum of six values +template +inline const Type& +Min(const Type& a, const Type& b, const Type& c, const Type& d, const Type& e, const Type& f) +{ + return std::min(Min(a,b,c), Min(d,e,f)); +} + +/// Return the minimum of seven values +template +inline const Type& +Min(const Type& a, const Type& b, const Type& c, const Type& d, + const Type& e, const Type& f, const Type& g) +{ + return std::min(Min(a,b,c,d), Min(e,f,g)); +} + +/// Return the minimum of eight values +template +inline const Type& +Min(const Type& a, const Type& b, const Type& c, const Type& d, + const Type& e, const Type& f, const Type& g, const Type& h) +{ + return std::min(Min(a,b,c,d), Min(e,f,g,h)); +} + + +// ============> Exp <================== + +/// Return @f$ e^x @f$. +template +inline Type Exp(const Type& x) { return std::exp(x); } + + +//////////////////////////////////////// + + +/// Return the sign of the given value as an integer (either -1, 0 or 1). +template +inline int Sign(const Type &x) { return (zeroVal() < x) - (x < zeroVal()); } + + +/// @brief Return @c true if @a a and @a b have different signs. +/// @note Zero is considered a positive number. +template +inline bool +SignChange(const Type& a, const Type& b) +{ + return ( (a()) ^ (b()) ); +} + + +/// @brief Return @c true if the interval [@a a, @a b] includes zero, +/// i.e., if either @a a or @a b is zero or if they have different signs. +template +inline bool +ZeroCrossing(const Type& a, const Type& b) +{ + return a * b <= zeroVal(); +} + + +//@{ +/// Return the square root of a floating-point value. +inline float Sqrt(float x) { return sqrtf(x); } +inline double Sqrt(double x) { return sqrt(x); } +inline long double Sqrt(long double x) { return sqrtl(x); } +//@} + + +//@{ +/// Return the cube root of a floating-point value. +inline float Cbrt(float x) { return boost::math::cbrt(x); } +inline double Cbrt(double x) { return boost::math::cbrt(x); } +inline long double Cbrt(long double x) { return boost::math::cbrt(x); } +//@} + + +//@{ +/// Return the remainder of @a x / @a y. +inline int Mod(int x, int y) { return (x % y); } +inline float Mod(float x, float y) { return fmodf(x,y); } +inline double Mod(double x, double y) { return fmod(x,y); } +inline long double Mod(long double x, long double y) { return fmodl(x,y); } +template inline Type Remainder(Type x, Type y) { return Mod(x,y); } +//@} + + +//@{ +/// Return @a x rounded up to the nearest integer. +inline float RoundUp(float x) { return ceilf(x); } +inline double RoundUp(double x) { return ceil(x); } +inline long double RoundUp(long double x) { return ceill(x); } +//@} +/// Return @a x rounded up to the nearest multiple of @a base. +template +inline Type +RoundUp(Type x, Type base) +{ + Type remainder = Remainder(x, base); + return remainder ? x-remainder+base : x; +} + + +//@{ +/// Return @a x rounded down to the nearest integer. +inline float RoundDown(float x) { return floorf(x); } +inline double RoundDown(double x) { return floor(x); } +inline long double RoundDown(long double x) { return floorl(x); } +//@} +/// Return @a x rounded down to the nearest multiple of @a base. +template +inline Type +RoundDown(Type x, Type base) +{ + Type remainder = Remainder(x, base); + return remainder ? x-remainder : x; +} + + +//@{ +/// Return @a x rounded to the nearest integer. +inline float Round(float x) { return RoundDown(x + 0.5f); } +inline double Round(double x) { return RoundDown(x + 0.5); } +inline long double Round(long double x) { return RoundDown(x + 0.5l); } +//@} + + +/// Return the euclidean remainder of @a x. +/// Note unlike % operator this will always return a positive result +template +inline Type +EuclideanRemainder(Type x) { return x - RoundDown(x); } + + +/// Return the integer part of @a x. +template +inline Type +IntegerPart(Type x) +{ + return (x > 0 ? RoundDown(x) : RoundUp(x)); +} + +/// Return the fractional part of @a x. +template +inline Type +FractionalPart(Type x) { return Mod(x,Type(1)); } + + +//@{ +/// Return the floor of @a x. +inline int Floor(float x) { return int(RoundDown(x)); } +inline int Floor(double x) { return int(RoundDown(x)); } +inline int Floor(long double x) { return int(RoundDown(x)); } +//@} + + +//@{ +/// Return the ceiling of @a x. +inline int Ceil(float x) { return int(RoundUp(x)); } +inline int Ceil(double x) { return int(RoundUp(x)); } +inline int Ceil(long double x) { return int(RoundUp(x)); } +//@} + + +/// Return @a x if it is greater or equal in magnitude than @a delta. Otherwise, return zero. +template +inline Type Chop(Type x, Type delta) { return (Abs(x) < delta ? zeroVal() : x); } + + +/// Return @a x truncated to the given number of decimal digits. +template +inline Type +Truncate(Type x, unsigned int digits) +{ + Type tenth = Pow(10,digits); + return RoundDown(x*tenth+0.5)/tenth; +} + + +//////////////////////////////////////// + + +/// Return the inverse of @a x. +template +inline Type +Inv(Type x) +{ + assert(x); + return Type(1)/x; +} + + +enum Axis { + X_AXIS = 0, + Y_AXIS = 1, + Z_AXIS = 2 +}; + +// enum values are consistent with their historical mx analogs. +enum RotationOrder { + XYZ_ROTATION = 0, + XZY_ROTATION, + YXZ_ROTATION, + YZX_ROTATION, + ZXY_ROTATION, + ZYX_ROTATION, + XZX_ROTATION, + ZXZ_ROTATION +}; + + +template +struct promote { + typedef typename boost::numeric::conversion_traits::supertype type; +}; + + +/// @brief Return the index [0,1,2] of the smallest value in a 3D vector. +/// @note This methods assumes operator[] exists and avoids branching. +/// @details If two components of the input vector are equal and smaller than the +/// third component, the largest index of the two is always returned. +/// If all three vector components are equal the largest index, i.e. 2, is +/// returned. In other words the return value corresponds to the largest index +/// of the of the smallest vector components. +template +size_t +MinIndex(const Vec3T& v) +{ +#ifndef _MSC_VER // Visual C++ doesn't guarantee thread-safe initialization of local statics + static +#endif + const size_t hashTable[8] = { 2, 1, 9, 1, 2, 9, 0, 0 };//9 is a dummy value + const size_t hashKey = + ((v[0] < v[1]) << 2) + ((v[0] < v[2]) << 1) + (v[1] < v[2]);// ?*4+?*2+?*1 + return hashTable[hashKey]; +} + + +/// @brief Return the index [0,1,2] of the largest value in a 3D vector. +/// @note This methods assumes operator[] exists and avoids branching. +/// @details If two components of the input vector are equal and larger than the +/// third component, the largest index of the two is always returned. +/// If all three vector components are equal the largest index, i.e. 2, is +/// returned. In other words the return value corresponds to the largest index +/// of the largest vector components. +template +size_t +MaxIndex(const Vec3T& v) +{ +#ifndef _MSC_VER // Visual C++ doesn't guarantee thread-safe initialization of local statics + static +#endif + const size_t hashTable[8] = { 2, 1, 9, 1, 2, 9, 0, 0 };//9 is a dummy value + const size_t hashKey = + ((v[0] > v[1]) << 2) + ((v[0] > v[2]) << 1) + (v[1] > v[2]);// ?*4+?*2+?*1 + return hashTable[hashKey]; +} + +} // namespace math +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_MATH_MATH_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/math/Operators.h b/nuparu/include/openvdb/include/openvdb/math/Operators.h new file mode 100644 index 00000000..61aa4bc0 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/math/Operators.h @@ -0,0 +1,2123 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file Operators.h + +#ifndef OPENVDB_MATH_OPERATORS_HAS_BEEN_INCLUDED +#define OPENVDB_MATH_OPERATORS_HAS_BEEN_INCLUDED + +#include "FiniteDifference.h" +#include "Stencils.h" +#include "Maps.h" +#include "Transform.h" + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace math { + +// Simple tools to help determine when type conversions are needed +template struct is_vec3d { static const bool value = false; }; +template<> struct is_vec3d { static const bool value = true; }; + +template struct is_double { static const bool value = false; }; +template<> struct is_double { static const bool value = true; }; + + +/// @brief Adapter to associate a map with a world-space operator, +/// giving it the same call signature as an index-space operator +/// @todo For now, the operator's result type must be specified explicitly, +/// but eventually it should be possible, via traits, to derive the result type +/// from the operator type. +template +struct MapAdapter { + MapAdapter(const MapType& m): map(m) {} + + template + inline ResultType + result(const AccessorType& grid, const Coord& ijk) { return OpType::result(map, grid, ijk); } + + template + inline ResultType + result(const StencilType& stencil) { return OpType::result(map, stencil); } + + const MapType map; +}; + + +/// Adapter for vector-valued index-space operators to return the vector magnitude +template +struct ISOpMagnitude { + template + static inline double result(const AccessorType& grid, const Coord& ijk) { + return double(OpType::result(grid, ijk).length()); + } + + template + static inline double result(const StencilType& stencil) { + return double(OpType::result(stencil).length()); + } +}; + +/// Adapter for vector-valued world-space operators to return the vector magnitude +template +struct OpMagnitude { + template + static inline double result(const MapT& map, const AccessorType& grid, const Coord& ijk) { + return double(OpType::result(map, grid, ijk).length()); + } + + template + static inline double result(const MapT& map, const StencilType& stencil) { + return double(OpType::result(map, stencil).length()); + } +}; + + +namespace internal { + +// This additional layer is necessary for Visual C++ to compile. +template +struct ReturnValue { + typedef typename T::ValueType ValueType; + typedef math::Vec3 Vec3Type; +}; + +} // namespace internal + +// ---- Operators defined in index space + + +//@{ +/// @brief Gradient operators defined in index space of various orders +template +struct ISGradient +{ + // random access version + template static Vec3 + result(const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + typedef Vec3 Vec3Type; + return Vec3Type( D1::inX(grid, ijk), + D1::inY(grid, ijk), + D1::inZ(grid, ijk) ); + } + + // stencil access version + template static Vec3 + result(const StencilT& stencil) + { + typedef typename StencilT::ValueType ValueType; + typedef Vec3 Vec3Type; + return Vec3Type( D1::inX(stencil), + D1::inY(stencil), + D1::inZ(stencil) ); + } +}; +//@} + +/// struct that relates the BiasedGradientScheme to the +/// forward and backward difference methods used, as well as to +/// the correct stencil type for index space use +template +struct BIAS_SCHEME { + static const DScheme FD = FD_1ST; + static const DScheme BD = BD_1ST; + + template + struct ISStencil { + typedef SevenPointStencil StencilType; + }; +}; + +template<> struct BIAS_SCHEME +{ + static const DScheme FD = FD_1ST; + static const DScheme BD = BD_1ST; + + template + struct ISStencil { + typedef SevenPointStencil StencilType; + }; +}; + +template<> struct BIAS_SCHEME +{ + static const DScheme FD = FD_2ND; + static const DScheme BD = BD_2ND; + + template + struct ISStencil { + typedef ThirteenPointStencil StencilType; + }; +}; +template<> struct BIAS_SCHEME +{ + static const DScheme FD = FD_3RD; + static const DScheme BD = BD_3RD; + + template + struct ISStencil { + typedef NineteenPointStencil StencilType; + }; +}; +template<> struct BIAS_SCHEME +{ + static const DScheme FD = FD_WENO5; + static const DScheme BD = BD_WENO5; + + template + struct ISStencil { + typedef NineteenPointStencil StencilType; + }; +}; +template<> struct BIAS_SCHEME +{ + static const DScheme FD = FD_HJWENO5; + static const DScheme BD = BD_HJWENO5; + + template + struct ISStencil { + typedef NineteenPointStencil StencilType; + }; +}; + + +//@{ +/// @brief Biased Gradient Operators, using upwinding defined by the @c Vec3Bias input + +template +struct ISGradientBiased +{ + static const DScheme FD = BIAS_SCHEME::FD; + static const DScheme BD = BIAS_SCHEME::BD; + + // random access version + template + static Vec3 + result(const Accessor& grid, const Coord& ijk, const Vec3Bias& V) + { + typedef typename Accessor::ValueType ValueType; + typedef Vec3 Vec3Type; + + return Vec3Type(V[0]<0 ? D1::inX(grid,ijk) : D1::inX(grid,ijk), + V[1]<0 ? D1::inY(grid,ijk) : D1::inY(grid,ijk), + V[2]<0 ? D1::inZ(grid,ijk) : D1::inZ(grid,ijk) ); + } + + // stencil access version + template + static Vec3 + result(const StencilT& stencil, const Vec3Bias& V) + { + typedef typename StencilT::ValueType ValueType; + typedef Vec3 Vec3Type; + + return Vec3Type(V[0]<0 ? D1::inX(stencil) : D1::inX(stencil), + V[1]<0 ? D1::inY(stencil) : D1::inY(stencil), + V[2]<0 ? D1::inZ(stencil) : D1::inZ(stencil) ); + } +}; + + +template +struct ISGradientNormSqrd +{ + static const DScheme FD = BIAS_SCHEME::FD; + static const DScheme BD = BIAS_SCHEME::BD; + + + // random access version + template + static typename Accessor::ValueType + result(const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + typedef math::Vec3 Vec3Type; + + Vec3Type up = ISGradient::result(grid, ijk); + Vec3Type down = ISGradient::result(grid, ijk); + return math::GodunovsNormSqrd(grid.getValue(ijk)>0, down, up); + } + + // stencil access version + template + static typename StencilT::ValueType + result(const StencilT& stencil) + { + typedef typename StencilT::ValueType ValueType; + typedef math::Vec3 Vec3Type; + + Vec3Type up = ISGradient::result(stencil); + Vec3Type down = ISGradient::result(stencil); + return math::GodunovsNormSqrd(stencil.template getValue<0, 0, 0>()>0, down, up); + } +}; + +#ifdef DWA_OPENVDB // for SIMD - note will do the computations in float +template<> +struct ISGradientNormSqrd +{ + // random access version + template + static typename Accessor::ValueType result(const Accessor& grid, const Coord& ijk) + { + struct GetValue + { + const Accessor& acc; + GetValue(const Accessor& acc_): acc(acc_) {} + // Return the grid value at ijk converted to simd::Float4::value_type (= float). + inline simd::Float4::value_type operator()(const Coord& ijk_) { + return static_cast(acc.getValue(ijk_)); + } + } + valueAt(grid); + + // SSE optimized + const simd::Float4 + v1(valueAt(ijk.offsetBy(-2, 0, 0)) - valueAt(ijk.offsetBy(-3, 0, 0)), + valueAt(ijk.offsetBy( 0,-2, 0)) - valueAt(ijk.offsetBy( 0,-3, 0)), + valueAt(ijk.offsetBy( 0, 0,-2)) - valueAt(ijk.offsetBy( 0, 0,-3)), 0), + v2(valueAt(ijk.offsetBy(-1, 0, 0)) - valueAt(ijk.offsetBy(-2, 0, 0)), + valueAt(ijk.offsetBy( 0,-1, 0)) - valueAt(ijk.offsetBy( 0,-2, 0)), + valueAt(ijk.offsetBy( 0, 0,-1)) - valueAt(ijk.offsetBy( 0, 0,-2)), 0), + v3(valueAt(ijk ) - valueAt(ijk.offsetBy(-1, 0, 0)), + valueAt(ijk ) - valueAt(ijk.offsetBy( 0,-1, 0)), + valueAt(ijk ) - valueAt(ijk.offsetBy( 0, 0,-1)), 0), + v4(valueAt(ijk.offsetBy( 1, 0, 0)) - valueAt(ijk ), + valueAt(ijk.offsetBy( 0, 1, 0)) - valueAt(ijk ), + valueAt(ijk.offsetBy( 0, 0, 1)) - valueAt(ijk ), 0), + v5(valueAt(ijk.offsetBy( 2, 0, 0)) - valueAt(ijk.offsetBy( 1, 0, 0)), + valueAt(ijk.offsetBy( 0, 2, 0)) - valueAt(ijk.offsetBy( 0, 1, 0)), + valueAt(ijk.offsetBy( 0, 0, 2)) - valueAt(ijk.offsetBy( 0, 0, 1)), 0), + v6(valueAt(ijk.offsetBy( 3, 0, 0)) - valueAt(ijk.offsetBy( 2, 0, 0)), + valueAt(ijk.offsetBy( 0, 3, 0)) - valueAt(ijk.offsetBy( 0, 2, 0)), + valueAt(ijk.offsetBy( 0, 0, 3)) - valueAt(ijk.offsetBy( 0, 0, 2)), 0), + down = math::WENO5(v1, v2, v3, v4, v5), + up = math::WENO5(v6, v5, v4, v3, v2); + + return math::GodunovsNormSqrd(grid.getValue(ijk)>0, down, up); + } + + // stencil access version + template + static typename StencilT::ValueType result(const StencilT& s) + { + typedef simd::Float4::value_type F4Val; + + // SSE optimized + const simd::Float4 + v1(F4Val(s.template getValue<-2, 0, 0>()) - F4Val(s.template getValue<-3, 0, 0>()), + F4Val(s.template getValue< 0,-2, 0>()) - F4Val(s.template getValue< 0,-3, 0>()), + F4Val(s.template getValue< 0, 0,-2>()) - F4Val(s.template getValue< 0, 0,-3>()), 0), + v2(F4Val(s.template getValue<-1, 0, 0>()) - F4Val(s.template getValue<-2, 0, 0>()), + F4Val(s.template getValue< 0,-1, 0>()) - F4Val(s.template getValue< 0,-2, 0>()), + F4Val(s.template getValue< 0, 0,-1>()) - F4Val(s.template getValue< 0, 0,-2>()), 0), + v3(F4Val(s.template getValue< 0, 0, 0>()) - F4Val(s.template getValue<-1, 0, 0>()), + F4Val(s.template getValue< 0, 0, 0>()) - F4Val(s.template getValue< 0,-1, 0>()), + F4Val(s.template getValue< 0, 0, 0>()) - F4Val(s.template getValue< 0, 0,-1>()), 0), + v4(F4Val(s.template getValue< 1, 0, 0>()) - F4Val(s.template getValue< 0, 0, 0>()), + F4Val(s.template getValue< 0, 1, 0>()) - F4Val(s.template getValue< 0, 0, 0>()), + F4Val(s.template getValue< 0, 0, 1>()) - F4Val(s.template getValue< 0, 0, 0>()), 0), + v5(F4Val(s.template getValue< 2, 0, 0>()) - F4Val(s.template getValue< 1, 0, 0>()), + F4Val(s.template getValue< 0, 2, 0>()) - F4Val(s.template getValue< 0, 1, 0>()), + F4Val(s.template getValue< 0, 0, 2>()) - F4Val(s.template getValue< 0, 0, 1>()), 0), + v6(F4Val(s.template getValue< 3, 0, 0>()) - F4Val(s.template getValue< 2, 0, 0>()), + F4Val(s.template getValue< 0, 3, 0>()) - F4Val(s.template getValue< 0, 2, 0>()), + F4Val(s.template getValue< 0, 0, 3>()) - F4Val(s.template getValue< 0, 0, 2>()), 0), + down = math::WENO5(v1, v2, v3, v4, v5), + up = math::WENO5(v6, v5, v4, v3, v2); + + return math::GodunovsNormSqrd(s.template getValue<0, 0, 0>()>0, down, up); + } +}; +#endif //DWA_OPENVDB // for SIMD - note will do the computations in float +//@} + + +//@{ +/// @brief Laplacian defined in index space, using various center-difference stencils +template +struct ISLaplacian +{ + // random access version + template + static typename Accessor::ValueType result(const Accessor& grid, const Coord& ijk); + + // stencil access version + template + static typename StencilT::ValueType result(const StencilT& stencil); +}; + + +template<> +struct ISLaplacian +{ + // random access version + template + static typename Accessor::ValueType result(const Accessor& grid, const Coord& ijk) + { + return grid.getValue(ijk.offsetBy(1,0,0)) + grid.getValue(ijk.offsetBy(-1, 0, 0)) + + grid.getValue(ijk.offsetBy(0,1,0)) + grid.getValue(ijk.offsetBy(0, -1, 0)) + + grid.getValue(ijk.offsetBy(0,0,1)) + grid.getValue(ijk.offsetBy(0, 0,-1)) + - 6*grid.getValue(ijk); + } + + // stencil access version + template + static typename StencilT::ValueType result(const StencilT& stencil) + { + return stencil.template getValue< 1, 0, 0>() + stencil.template getValue<-1, 0, 0>() + + stencil.template getValue< 0, 1, 0>() + stencil.template getValue< 0,-1, 0>() + + stencil.template getValue< 0, 0, 1>() + stencil.template getValue< 0, 0,-1>() + - 6*stencil.template getValue< 0, 0, 0>(); + } +}; + +template<> +struct ISLaplacian +{ + // random access version + template + static typename Accessor::ValueType result(const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueT; + return static_cast( + (-1./12.)*( + grid.getValue(ijk.offsetBy(2,0,0)) + grid.getValue(ijk.offsetBy(-2, 0, 0)) + + grid.getValue(ijk.offsetBy(0,2,0)) + grid.getValue(ijk.offsetBy( 0,-2, 0)) + + grid.getValue(ijk.offsetBy(0,0,2)) + grid.getValue(ijk.offsetBy( 0, 0,-2)) ) + + (4./3.)*( + grid.getValue(ijk.offsetBy(1,0,0)) + grid.getValue(ijk.offsetBy(-1, 0, 0)) + + grid.getValue(ijk.offsetBy(0,1,0)) + grid.getValue(ijk.offsetBy( 0,-1, 0)) + + grid.getValue(ijk.offsetBy(0,0,1)) + grid.getValue(ijk.offsetBy( 0, 0,-1)) ) + - 7.5*grid.getValue(ijk)); + } + + // stencil access version + template + static typename StencilT::ValueType result(const StencilT& stencil) + { + typedef typename StencilT::ValueType ValueT; + return static_cast( + (-1./12.)*( + stencil.template getValue< 2, 0, 0>() + stencil.template getValue<-2, 0, 0>() + + stencil.template getValue< 0, 2, 0>() + stencil.template getValue< 0,-2, 0>() + + stencil.template getValue< 0, 0, 2>() + stencil.template getValue< 0, 0,-2>() ) + + (4./3.)*( + stencil.template getValue< 1, 0, 0>() + stencil.template getValue<-1, 0, 0>() + + stencil.template getValue< 0, 1, 0>() + stencil.template getValue< 0,-1, 0>() + + stencil.template getValue< 0, 0, 1>() + stencil.template getValue< 0, 0,-1>() ) + - 7.5*stencil.template getValue< 0, 0, 0>()); + } +}; + +template<> +struct ISLaplacian +{ + // random access version + template + static typename Accessor::ValueType result(const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueT; + return static_cast( + (1./90.)*( + grid.getValue(ijk.offsetBy(3,0,0)) + grid.getValue(ijk.offsetBy(-3, 0, 0)) + + grid.getValue(ijk.offsetBy(0,3,0)) + grid.getValue(ijk.offsetBy( 0,-3, 0)) + + grid.getValue(ijk.offsetBy(0,0,3)) + grid.getValue(ijk.offsetBy( 0, 0,-3)) ) + - (3./20.)*( + grid.getValue(ijk.offsetBy(2,0,0)) + grid.getValue(ijk.offsetBy(-2, 0, 0)) + + grid.getValue(ijk.offsetBy(0,2,0)) + grid.getValue(ijk.offsetBy( 0,-2, 0)) + + grid.getValue(ijk.offsetBy(0,0,2)) + grid.getValue(ijk.offsetBy( 0, 0,-2)) ) + + 1.5 *( + grid.getValue(ijk.offsetBy(1,0,0)) + grid.getValue(ijk.offsetBy(-1, 0, 0)) + + grid.getValue(ijk.offsetBy(0,1,0)) + grid.getValue(ijk.offsetBy( 0,-1, 0)) + + grid.getValue(ijk.offsetBy(0,0,1)) + grid.getValue(ijk.offsetBy( 0, 0,-1)) ) + - (3*49/18.)*grid.getValue(ijk)); + } + + // stencil access version + template + static typename StencilT::ValueType result(const StencilT& stencil) + { + typedef typename StencilT::ValueType ValueT; + return static_cast( + (1./90.)*( + stencil.template getValue< 3, 0, 0>() + stencil.template getValue<-3, 0, 0>() + + stencil.template getValue< 0, 3, 0>() + stencil.template getValue< 0,-3, 0>() + + stencil.template getValue< 0, 0, 3>() + stencil.template getValue< 0, 0,-3>() ) + - (3./20.)*( + stencil.template getValue< 2, 0, 0>() + stencil.template getValue<-2, 0, 0>() + + stencil.template getValue< 0, 2, 0>() + stencil.template getValue< 0,-2, 0>() + + stencil.template getValue< 0, 0, 2>() + stencil.template getValue< 0, 0,-2>() ) + + 1.5 *( + stencil.template getValue< 1, 0, 0>() + stencil.template getValue<-1, 0, 0>() + + stencil.template getValue< 0, 1, 0>() + stencil.template getValue< 0,-1, 0>() + + stencil.template getValue< 0, 0, 1>() + stencil.template getValue< 0, 0,-1>() ) + - (3*49/18.)*stencil.template getValue< 0, 0, 0>()); + } +}; +//@} + + +//@{ +/// Divergence operator defined in index space using various first derivative schemes +template +struct ISDivergence +{ + // random access version + template static typename Accessor::ValueType::value_type + result(const Accessor& grid, const Coord& ijk) + { + return D1Vec::inX(grid, ijk, 0) + + D1Vec::inY(grid, ijk, 1) + + D1Vec::inZ(grid, ijk, 2); + } + + // stencil access version + template static typename StencilT::ValueType::value_type + result(const StencilT& stencil) + { + return D1Vec::inX(stencil, 0) + + D1Vec::inY(stencil, 1) + + D1Vec::inZ(stencil, 2); + } +}; +//@} + + +//@{ +/// Curl operator defined in index space using various first derivative schemes +template +struct ISCurl +{ + // random access version + template + static typename Accessor::ValueType result(const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType Vec3Type; + return Vec3Type( D1Vec::inY(grid, ijk, 2) - //dw/dy - dv/dz + D1Vec::inZ(grid, ijk, 1), + D1Vec::inZ(grid, ijk, 0) - //du/dz - dw/dx + D1Vec::inX(grid, ijk, 2), + D1Vec::inX(grid, ijk, 1) - //dv/dx - du/dy + D1Vec::inY(grid, ijk, 0) ); + } + + // stencil access version + template + static typename StencilT::ValueType result(const StencilT& stencil) + { + typedef typename StencilT::ValueType Vec3Type; + return Vec3Type( D1Vec::inY(stencil, 2) - //dw/dy - dv/dz + D1Vec::inZ(stencil, 1), + D1Vec::inZ(stencil, 0) - //du/dz - dw/dx + D1Vec::inX(stencil, 2), + D1Vec::inX(stencil, 1) - //dv/dx - du/dy + D1Vec::inY(stencil, 0) ); + } +}; +//@} + + +//@{ +/// Compute the mean curvature in index space +template +struct ISMeanCurvature +{ + /// @brief random access version + /// @return true if the gradient is none-zero, in which case the + /// mean curvature is computed as two parts: @c alpha is the numerator in + /// @f$\nabla \cdot (\nabla \phi / |\nabla \phi|)@f$, and @c beta is @f$|\nabla \phi|@f$. + template + static bool result(const Accessor& grid, const Coord& ijk, + typename Accessor::ValueType& alpha, + typename Accessor::ValueType& beta) + { + typedef typename Accessor::ValueType ValueType; + + const ValueType Dx = D1::inX(grid, ijk); + const ValueType Dy = D1::inY(grid, ijk); + const ValueType Dz = D1::inZ(grid, ijk); + + const ValueType Dx2 = Dx*Dx; + const ValueType Dy2 = Dy*Dy; + const ValueType Dz2 = Dz*Dz; + const ValueType normGrad = Dx2 + Dy2 + Dz2; + if (normGrad <= math::Tolerance::value()) { + alpha = beta = 0; + return false; + } + + const ValueType Dxx = D2::inX(grid, ijk); + const ValueType Dyy = D2::inY(grid, ijk); + const ValueType Dzz = D2::inZ(grid, ijk); + + const ValueType Dxy = D2::inXandY(grid, ijk); + const ValueType Dyz = D2::inYandZ(grid, ijk); + const ValueType Dxz = D2::inXandZ(grid, ijk); + + // for return + alpha = (Dx2*(Dyy+Dzz)+Dy2*(Dxx+Dzz)+Dz2*(Dxx+Dyy)-2*(Dx*(Dy*Dxy+Dz*Dxz)+Dy*Dz*Dyz)); + beta = ValueType(std::sqrt(double(normGrad))); // * 1/dx + return true; + } + + /// @brief stencil access version + /// @return true if the gradient is none-zero, in which case the + /// mean curvature is computed as two parts: @c alpha is the numerator in + /// @f$\nabla \cdot (\nabla \phi / |\nabla \phi|)@f$, and @c beta is @f$|\nabla \phi|@f$. + template + static bool result(const StencilT& stencil, + typename StencilT::ValueType& alpha, + typename StencilT::ValueType& beta) + { + typedef typename StencilT::ValueType ValueType; + const ValueType Dx = D1::inX(stencil); + const ValueType Dy = D1::inY(stencil); + const ValueType Dz = D1::inZ(stencil); + + const ValueType Dx2 = Dx*Dx; + const ValueType Dy2 = Dy*Dy; + const ValueType Dz2 = Dz*Dz; + const ValueType normGrad = Dx2 + Dy2 + Dz2; + if (normGrad <= math::Tolerance::value()) { + alpha = beta = 0; + return false; + } + + const ValueType Dxx = D2::inX(stencil); + const ValueType Dyy = D2::inY(stencil); + const ValueType Dzz = D2::inZ(stencil); + + const ValueType Dxy = D2::inXandY(stencil); + const ValueType Dyz = D2::inYandZ(stencil); + const ValueType Dxz = D2::inXandZ(stencil); + + // for return + alpha = (Dx2*(Dyy+Dzz)+Dy2*(Dxx+Dzz)+Dz2*(Dxx+Dyy)-2*(Dx*(Dy*Dxy+Dz*Dxz)+Dy*Dz*Dyz)); + beta = ValueType(std::sqrt(double(normGrad))); // * 1/dx + return true; + } +}; + +//////////////////////////////////////////////////////// + +// --- Operators defined in the Range of a given map + +//@{ +/// @brief Center difference gradient operators, defined with respect to +/// the range-space of the @c map +/// @note This will need to be divided by two in the case of CD_2NDT +template +struct Gradient +{ + // random access version + template + static typename internal::ReturnValue::Vec3Type + result(const MapType& map, const Accessor& grid, const Coord& ijk) + { + typedef typename internal::ReturnValue::Vec3Type Vec3Type; + + Vec3d iGradient( ISGradient::result(grid, ijk) ); + return Vec3Type(map.applyIJT(iGradient, ijk.asVec3d())); + } + + // stencil access version + template + static typename internal::ReturnValue::Vec3Type + result(const MapType& map, const StencilT& stencil) + { + typedef typename internal::ReturnValue::Vec3Type Vec3Type; + + Vec3d iGradient( ISGradient::result(stencil) ); + return Vec3Type(map.applyIJT(iGradient, stencil.getCenterCoord().asVec3d())); + } +}; + +// Partial template specialization of Gradient +// translation, any order +template +struct Gradient +{ + // random access version + template + static typename internal::ReturnValue::Vec3Type + result(const TranslationMap&, const Accessor& grid, const Coord& ijk) + { + return ISGradient::result(grid, ijk); + } + + // stencil access version + template + static typename internal::ReturnValue::Vec3Type + result(const TranslationMap&, const StencilT& stencil) + { + return ISGradient::result(stencil); + } +}; + +/// Full template specialization of Gradient +/// uniform scale, 2nd order +template<> +struct Gradient +{ + // random access version + template + static typename internal::ReturnValue::Vec3Type + result(const UniformScaleMap& map, const Accessor& grid, const Coord& ijk) + { + typedef typename internal::ReturnValue::ValueType ValueType; + typedef typename internal::ReturnValue::Vec3Type Vec3Type; + + Vec3Type iGradient( ISGradient::result(grid, ijk) ); + ValueType inv2dx = ValueType(map.getInvTwiceScale()[0]); + return iGradient * inv2dx; + } + + // stencil access version + template + static typename internal::ReturnValue::Vec3Type + result(const UniformScaleMap& map, const StencilT& stencil) + { + typedef typename internal::ReturnValue::ValueType ValueType; + typedef typename internal::ReturnValue::Vec3Type Vec3Type; + + Vec3Type iGradient( ISGradient::result(stencil) ); + ValueType inv2dx = ValueType(map.getInvTwiceScale()[0]); + return iGradient * inv2dx; + } +}; + +/// Full template specialization of Gradient +/// uniform scale translate, 2nd order +template<> +struct Gradient +{ + // random access version + template + static typename internal::ReturnValue::Vec3Type + result(const UniformScaleTranslateMap& map, const Accessor& grid, const Coord& ijk) + { + typedef typename internal::ReturnValue::ValueType ValueType; + typedef typename internal::ReturnValue::Vec3Type Vec3Type; + + Vec3Type iGradient( ISGradient::result(grid, ijk) ); + ValueType inv2dx = ValueType(map.getInvTwiceScale()[0]); + return iGradient * inv2dx; + } + + // stencil access version + template + static typename internal::ReturnValue::Vec3Type + result(const UniformScaleTranslateMap& map, const StencilT& stencil) + { + typedef typename internal::ReturnValue::ValueType ValueType; + typedef typename internal::ReturnValue::Vec3Type Vec3Type; + + Vec3Type iGradient( ISGradient::result(stencil) ); + ValueType inv2dx = ValueType(map.getInvTwiceScale()[0]); + return iGradient * inv2dx; + } +}; + +/// Full template specialization of Gradient +/// scale, 2nd order +template<> +struct Gradient +{ + // random access version + template + static typename internal::ReturnValue::Vec3Type + result(const ScaleMap& map, const Accessor& grid, const Coord& ijk) + { + typedef typename internal::ReturnValue::ValueType ValueType; + typedef typename internal::ReturnValue::Vec3Type Vec3Type; + + Vec3Type iGradient( ISGradient::result(grid, ijk) ); + return Vec3Type(ValueType(iGradient[0] * map.getInvTwiceScale()[0]), + ValueType(iGradient[1] * map.getInvTwiceScale()[1]), + ValueType(iGradient[2] * map.getInvTwiceScale()[2]) ); + } + + // stencil access version + template + static typename internal::ReturnValue::Vec3Type + result(const ScaleMap& map, const StencilT& stencil) + { + typedef typename internal::ReturnValue::ValueType ValueType; + typedef typename internal::ReturnValue::Vec3Type Vec3Type; + + Vec3Type iGradient( ISGradient::result(stencil) ); + return Vec3Type(ValueType(iGradient[0] * map.getInvTwiceScale()[0]), + ValueType(iGradient[1] * map.getInvTwiceScale()[1]), + ValueType(iGradient[2] * map.getInvTwiceScale()[2]) ); + } +}; + +/// Full template specialization of Gradient +/// scale translate, 2nd order +template<> +struct Gradient +{ + // random access version + template + static typename internal::ReturnValue::Vec3Type + result(const ScaleTranslateMap& map, const Accessor& grid, const Coord& ijk) + { + typedef typename internal::ReturnValue::ValueType ValueType; + typedef typename internal::ReturnValue::Vec3Type Vec3Type; + + Vec3Type iGradient( ISGradient::result(grid, ijk) ); + return Vec3Type(ValueType(iGradient[0] * map.getInvTwiceScale()[0]), + ValueType(iGradient[1] * map.getInvTwiceScale()[1]), + ValueType(iGradient[2] * map.getInvTwiceScale()[2]) ); + } + + // Stencil access version + template + static typename internal::ReturnValue::Vec3Type + result(const ScaleTranslateMap& map, const StencilT& stencil) + { + typedef typename internal::ReturnValue::ValueType ValueType; + typedef typename internal::ReturnValue::Vec3Type Vec3Type; + + Vec3Type iGradient( ISGradient::result(stencil) ); + return Vec3Type(ValueType(iGradient[0] * map.getInvTwiceScale()[0]), + ValueType(iGradient[1] * map.getInvTwiceScale()[1]), + ValueType(iGradient[2] * map.getInvTwiceScale()[2]) ); + } +}; +//@} + + +//@{ +/// @brief Biased gradient operators, defined with respect to the range-space of the map +/// @note This will need to be divided by two in the case of CD_2NDT +template +struct GradientBiased +{ + // random access version + template static math::Vec3 + result(const MapType& map, const Accessor& grid, const Coord& ijk, + const Vec3& V) + { + typedef typename Accessor::ValueType ValueType; + typedef math::Vec3 Vec3Type; + + Vec3d iGradient( ISGradientBiased::result(grid, ijk, V) ); + return Vec3Type(map.applyIJT(iGradient, ijk.asVec3d())); + } + + // stencil access version + template static math::Vec3 + result(const MapType& map, const StencilT& stencil, + const Vec3& V) + { + typedef typename StencilT::ValueType ValueType; + typedef math::Vec3 Vec3Type; + + Vec3d iGradient( ISGradientBiased::result(stencil, V) ); + return Vec3Type(map.applyIJT(iGradient, stencil.getCenterCoord().asVec3d())); + } +}; +//@} + + +//////////////////////////////////////////////////////// + +// Computes |Grad[Phi]| using upwinding +template +struct GradientNormSqrd +{ + static const DScheme FD = BIAS_SCHEME::FD; + static const DScheme BD = BIAS_SCHEME::BD; + + + // random access version + template + static typename Accessor::ValueType + result(const MapType& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + typedef math::Vec3 Vec3Type; + + Vec3Type up = Gradient::result(map, grid, ijk); + Vec3Type down = Gradient::result(map, grid, ijk); + return math::GodunovsNormSqrd(grid.getValue(ijk)>0, down, up); + } + + // stencil access version + template + static typename StencilT::ValueType + result(const MapType& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType ValueType; + typedef math::Vec3 Vec3Type; + + Vec3Type up = Gradient::result(map, stencil); + Vec3Type down = Gradient::result(map, stencil); + return math::GodunovsNormSqrd(stencil.template getValue<0, 0, 0>()>0, down, up); + } +}; + +/// Partial template specialization of GradientNormSqrd +template +struct GradientNormSqrd +{ + // random access version + template + static typename Accessor::ValueType + result(const UniformScaleMap& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + + ValueType invdxdx = ValueType(map.getInvScaleSqr()[0]); + return invdxdx * ISGradientNormSqrd::result(grid, ijk); + } + + // stencil access version + template + static typename StencilT::ValueType + result(const UniformScaleMap& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType ValueType; + + ValueType invdxdx = ValueType(map.getInvScaleSqr()[0]); + return invdxdx * ISGradientNormSqrd::result(stencil); + } +}; + +/// Partial template specialization of GradientNormSqrd +template +struct GradientNormSqrd +{ + // random access version + template + static typename Accessor::ValueType + result(const UniformScaleTranslateMap& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + + ValueType invdxdx = ValueType(map.getInvScaleSqr()[0]); + return invdxdx * ISGradientNormSqrd::result(grid, ijk); + } + + // stencil access version + template + static typename StencilT::ValueType + result(const UniformScaleTranslateMap& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType ValueType; + + ValueType invdxdx = ValueType(map.getInvScaleSqr()[0]); + return invdxdx * ISGradientNormSqrd::result(stencil); + } +}; + + +//@{ +/// @brief Compute the divergence of a vector-valued grid using differencing +/// of various orders, the result defined with respect to the range-space of the map. +template +struct Divergence +{ + // random access version + template static typename Accessor::ValueType::value_type + result(const MapType& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType::value_type ValueType; + + ValueType div(0); + for (int i=0; i < 3; i++) { + Vec3d vec( D1Vec::inX(grid, ijk, i), + D1Vec::inY(grid, ijk, i), + D1Vec::inZ(grid, ijk, i) ); + div += ValueType(map.applyIJT(vec, ijk.asVec3d())[i]); + } + return div; + } + + // stencil access version + template static typename StencilT::ValueType::value_type + result(const MapType& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType::value_type ValueType; + + ValueType div(0); + for (int i=0; i < 3; i++) { + Vec3d vec( D1Vec::inX(stencil, i), + D1Vec::inY(stencil, i), + D1Vec::inZ(stencil, i) ); + div += ValueType(map.applyIJT(vec, stencil.getCenterCoord().asVec3d())[i]); + } + return div; + } +}; + +/// Partial template specialization of Divergence +/// translation, any scheme +template +struct Divergence +{ + // random access version + template static typename Accessor::ValueType::value_type + result(const TranslationMap&, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType::value_type ValueType; + + ValueType div(0); + div =ISDivergence::result(grid, ijk); + return div; + } + + // stencil access version + template static typename StencilT::ValueType::value_type + result(const TranslationMap&, const StencilT& stencil) + { + typedef typename StencilT::ValueType::value_type ValueType; + + ValueType div(0); + div =ISDivergence::result(stencil); + return div; + } +}; + +/// Partial template specialization of Divergence +/// uniform scale, any scheme +template +struct Divergence +{ + // random access version + template static typename Accessor::ValueType::value_type + result(const UniformScaleMap& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType::value_type ValueType; + + ValueType div(0); + + div =ISDivergence::result(grid, ijk); + ValueType invdx = ValueType(map.getInvScale()[0]); + return div * invdx; + } + + // stencil access version + template static typename StencilT::ValueType::value_type + result(const UniformScaleMap& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType::value_type ValueType; + + ValueType div(0); + + div =ISDivergence::result(stencil); + ValueType invdx = ValueType(map.getInvScale()[0]); + return div * invdx; + } +}; + +/// Partial template specialization of Divergence +/// uniform scale and translation, any scheme +template +struct Divergence +{ + // random access version + template static typename Accessor::ValueType::value_type + result(const UniformScaleTranslateMap& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType::value_type ValueType; + + ValueType div(0); + + div =ISDivergence::result(grid, ijk); + ValueType invdx = ValueType(map.getInvScale()[0]); + return div * invdx; + } + + // stencil access version + template static typename StencilT::ValueType::value_type + result(const UniformScaleTranslateMap& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType::value_type ValueType; + + ValueType div(0); + + div =ISDivergence::result(stencil); + ValueType invdx = ValueType(map.getInvScale()[0]); + return div * invdx; + } +}; + +/// Full template specialization of Divergence +/// uniform scale 2nd order +template<> +struct Divergence +{ + // random access version + template static typename Accessor::ValueType::value_type + result(const UniformScaleMap& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType::value_type ValueType; + + ValueType div(0); + div =ISDivergence::result(grid, ijk); + ValueType inv2dx = ValueType(map.getInvTwiceScale()[0]); + return div * inv2dx; + } + + // stencil access version + template static typename StencilT::ValueType::value_type + result(const UniformScaleMap& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType::value_type ValueType; + + ValueType div(0); + div =ISDivergence::result(stencil); + ValueType inv2dx = ValueType(map.getInvTwiceScale()[0]); + return div * inv2dx; + } +}; + +/// Full template specialization of Divergence +/// uniform scale translate 2nd order +template<> +struct Divergence +{ + // random access version + template static typename Accessor::ValueType::value_type + result(const UniformScaleTranslateMap& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType::value_type ValueType; + + ValueType div(0); + + div =ISDivergence::result(grid, ijk); + ValueType inv2dx = ValueType(map.getInvTwiceScale()[0]); + return div * inv2dx; + } + + // stencil access version + template static typename StencilT::ValueType::value_type + result(const UniformScaleTranslateMap& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType::value_type ValueType; + + ValueType div(0); + + div =ISDivergence::result(stencil); + ValueType inv2dx = ValueType(map.getInvTwiceScale()[0]); + return div * inv2dx; + } +}; + +/// Partial template specialization of Divergence +/// scale, any scheme +template +struct Divergence +{ + // random access version + template static typename Accessor::ValueType::value_type + result(const ScaleMap& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType::value_type ValueType; + + ValueType div = ValueType( + D1Vec::inX(grid, ijk, 0) * (map.getInvScale()[0]) + + D1Vec::inY(grid, ijk, 1) * (map.getInvScale()[1]) + + D1Vec::inZ(grid, ijk, 2) * (map.getInvScale()[2])); + return div; + } + + // stencil access version + template static typename StencilT::ValueType::value_type + result(const ScaleMap& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType::value_type ValueType; + + ValueType div(0); + div = ValueType( + D1Vec::inX(stencil, 0) * (map.getInvScale()[0]) + + D1Vec::inY(stencil, 1) * (map.getInvScale()[1]) + + D1Vec::inZ(stencil, 2) * (map.getInvScale()[2]) ); + return div; + } +}; + +/// Partial template specialization of Divergence +/// scale translate, any scheme +template +struct Divergence +{ + // random access version + template static typename Accessor::ValueType::value_type + result(const ScaleTranslateMap& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType::value_type ValueType; + + ValueType div = ValueType( + D1Vec::inX(grid, ijk, 0) * (map.getInvScale()[0]) + + D1Vec::inY(grid, ijk, 1) * (map.getInvScale()[1]) + + D1Vec::inZ(grid, ijk, 2) * (map.getInvScale()[2])); + return div; + } + + // stencil access version + template static typename StencilT::ValueType::value_type + result(const ScaleTranslateMap& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType::value_type ValueType; + + ValueType div(0); + div = ValueType( + D1Vec::inX(stencil, 0) * (map.getInvScale()[0]) + + D1Vec::inY(stencil, 1) * (map.getInvScale()[1]) + + D1Vec::inZ(stencil, 2) * (map.getInvScale()[2]) ); + return div; + } +}; + +/// Full template specialization Divergence +/// scale 2nd order +template<> +struct Divergence +{ + // random access version + template static typename Accessor::ValueType::value_type + result(const ScaleMap& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType::value_type ValueType; + + ValueType div = ValueType( + D1Vec::inX(grid, ijk, 0) * (map.getInvTwiceScale()[0]) + + D1Vec::inY(grid, ijk, 1) * (map.getInvTwiceScale()[1]) + + D1Vec::inZ(grid, ijk, 2) * (map.getInvTwiceScale()[2]) ); + return div; + } + + // stencil access version + template static typename StencilT::ValueType::value_type + result(const ScaleMap& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType::value_type ValueType; + + ValueType div = ValueType( + D1Vec::inX(stencil, 0) * (map.getInvTwiceScale()[0]) + + D1Vec::inY(stencil, 1) * (map.getInvTwiceScale()[1]) + + D1Vec::inZ(stencil, 2) * (map.getInvTwiceScale()[2]) ); + return div; + } +}; + +/// Full template specialization of Divergence +/// scale and translate, 2nd order +template<> +struct Divergence +{ + // random access version + template static typename Accessor::ValueType::value_type + result(const ScaleTranslateMap& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType::value_type ValueType; + + ValueType div = ValueType( + D1Vec::inX(grid, ijk, 0) * (map.getInvTwiceScale()[0]) + + D1Vec::inY(grid, ijk, 1) * (map.getInvTwiceScale()[1]) + + D1Vec::inZ(grid, ijk, 2) * (map.getInvTwiceScale()[2]) ); + return div; + } + + // stencil access version + template static typename StencilT::ValueType::value_type + result(const ScaleTranslateMap& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType::value_type ValueType; + + ValueType div = ValueType( + D1Vec::inX(stencil, 0) * (map.getInvTwiceScale()[0]) + + D1Vec::inY(stencil, 1) * (map.getInvTwiceScale()[1]) + + D1Vec::inZ(stencil, 2) * (map.getInvTwiceScale()[2]) ); + return div; + } +}; +//@} + + +//@{ +/// @brief Compute the curl of a vector-valued grid using differencing +/// of various orders in the space defined by the range of the map. +template +struct Curl +{ + // random access version + template static typename Accessor::ValueType + result(const MapType& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType Vec3Type; + Vec3Type mat[3]; + for (int i = 0; i < 3; i++) { + Vec3d vec( + D1Vec::inX(grid, ijk, i), + D1Vec::inY(grid, ijk, i), + D1Vec::inZ(grid, ijk, i)); + // dF_i/dx_j (x_1 = x, x_2 = y, x_3 = z) + mat[i] = Vec3Type(map.applyIJT(vec, ijk.asVec3d())); + } + return Vec3Type(mat[2][1] - mat[1][2], // dF_3/dx_2 - dF_2/dx_3 + mat[0][2] - mat[2][0], // dF_1/dx_3 - dF_3/dx_1 + mat[1][0] - mat[0][1]); // dF_2/dx_1 - dF_1/dx_2 + } + + // stencil access version + template static typename StencilT::ValueType + result(const MapType& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType Vec3Type; + Vec3Type mat[3]; + for (int i = 0; i < 3; i++) { + Vec3d vec( + D1Vec::inX(stencil, i), + D1Vec::inY(stencil, i), + D1Vec::inZ(stencil, i)); + // dF_i/dx_j (x_1 = x, x_2 = y, x_3 = z) + mat[i] = Vec3Type(map.applyIJT(vec, stencil.getCenterCoord().asVec3d())); + } + return Vec3Type(mat[2][1] - mat[1][2], // dF_3/dx_2 - dF_2/dx_3 + mat[0][2] - mat[2][0], // dF_1/dx_3 - dF_3/dx_1 + mat[1][0] - mat[0][1]); // dF_2/dx_1 - dF_1/dx_2 + } +}; + +/// Partial template specialization of Curl +template +struct Curl +{ + // random access version + template static typename Accessor::ValueType + result(const UniformScaleMap& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType Vec3Type; + typedef typename Vec3Type::value_type ValueType; + return ISCurl::result(grid, ijk) * ValueType(map.getInvScale()[0]); + } + + // Stencil access version + template static typename StencilT::ValueType + result(const UniformScaleMap& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType Vec3Type; + typedef typename Vec3Type::value_type ValueType; + return ISCurl::result(stencil) * ValueType(map.getInvScale()[0]); + } +}; + +/// Partial template specialization of Curl +template +struct Curl +{ + // random access version + template static typename Accessor::ValueType + result(const UniformScaleTranslateMap& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType Vec3Type; + typedef typename Vec3Type::value_type ValueType; + + return ISCurl::result(grid, ijk) * ValueType(map.getInvScale()[0]); + } + + // stencil access version + template static typename StencilT::ValueType + result(const UniformScaleTranslateMap& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType Vec3Type; + typedef typename Vec3Type::value_type ValueType; + + return ISCurl::result(stencil) * ValueType(map.getInvScale()[0]); + } +}; + +/// Full template specialization of Curl +template<> +struct Curl +{ + // random access version + template static typename Accessor::ValueType + result(const UniformScaleMap& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType Vec3Type; + typedef typename Vec3Type::value_type ValueType; + + return ISCurl::result(grid, ijk) * ValueType(map.getInvTwiceScale()[0]); + } + + // stencil access version + template static typename StencilT::ValueType + result(const UniformScaleMap& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType Vec3Type; + typedef typename Vec3Type::value_type ValueType; + + return ISCurl::result(stencil) * ValueType(map.getInvTwiceScale()[0]); + } +}; + +/// Full template specialization of Curl +template<> +struct Curl +{ + // random access version + template static typename Accessor::ValueType + result(const UniformScaleTranslateMap& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType Vec3Type; + typedef typename Vec3Type::value_type ValueType; + + return ISCurl::result(grid, ijk) * ValueType(map.getInvTwiceScale()[0]); + } + + // stencil access version + template static typename StencilT::ValueType + result(const UniformScaleTranslateMap& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType Vec3Type; + typedef typename Vec3Type::value_type ValueType; + + return ISCurl::result(stencil) * ValueType(map.getInvTwiceScale()[0]); + } +}; +//@} + + +//@{ +/// @brief Compute the Laplacian at a given location in a grid using finite differencing +/// of various orders. The result is defined in the range of the map. +template +struct Laplacian +{ + // random access version + template + static typename Accessor::ValueType result(const MapType& map, + const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + // all the second derivatives in index space + ValueType iddx = D2::inX(grid, ijk); + ValueType iddy = D2::inY(grid, ijk); + ValueType iddz = D2::inZ(grid, ijk); + + ValueType iddxy = D2::inXandY(grid, ijk); + ValueType iddyz = D2::inYandZ(grid, ijk); + ValueType iddxz = D2::inXandZ(grid, ijk); + + // second derivatives in index space + Mat3d d2_is(iddx, iddxy, iddxz, + iddxy, iddy, iddyz, + iddxz, iddyz, iddz); + + Mat3d d2_rs; // to hold the second derivative matrix in range space + if (is_linear::value) { + d2_rs = map.applyIJC(d2_is); + } else { + // compute the first derivatives with 2nd order accuracy. + Vec3d d1_is(static_cast(D1::inX(grid, ijk)), + static_cast(D1::inY(grid, ijk)), + static_cast(D1::inZ(grid, ijk))); + + d2_rs = map.applyIJC(d2_is, d1_is, ijk.asVec3d()); + } + + // the trace of the second derivative (range space) matrix is laplacian + return ValueType(d2_rs(0,0) + d2_rs(1,1) + d2_rs(2,2)); + } + + // stencil access version + template + static typename StencilT::ValueType result(const MapType& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType ValueType; + // all the second derivatives in index space + ValueType iddx = D2::inX(stencil); + ValueType iddy = D2::inY(stencil); + ValueType iddz = D2::inZ(stencil); + + ValueType iddxy = D2::inXandY(stencil); + ValueType iddyz = D2::inYandZ(stencil); + ValueType iddxz = D2::inXandZ(stencil); + + // second derivatives in index space + Mat3d d2_is(iddx, iddxy, iddxz, + iddxy, iddy, iddyz, + iddxz, iddyz, iddz); + + Mat3d d2_rs; // to hold the second derivative matrix in range space + if (is_linear::value) { + d2_rs = map.applyIJC(d2_is); + } else { + // compute the first derivatives with 2nd order accuracy. + Vec3d d1_is(D1::inX(stencil), + D1::inY(stencil), + D1::inZ(stencil) ); + + d2_rs = map.applyIJC(d2_is, d1_is, stencil.getCenterCoord().asVec3d()); + } + + // the trace of the second derivative (range space) matrix is laplacian + return ValueType(d2_rs(0,0) + d2_rs(1,1) + d2_rs(2,2)); + } +}; + + +template +struct Laplacian +{ + // random access version + template + static typename Accessor::ValueType result(const TranslationMap&, + const Accessor& grid, const Coord& ijk) + { + return ISLaplacian::result(grid, ijk); + } + + // stencil access version + template + static typename StencilT::ValueType result(const TranslationMap&, const StencilT& stencil) + { + return ISLaplacian::result(stencil); + } +}; + + +// The Laplacian is invariant to rotation or reflection. +template +struct Laplacian +{ + // random access version + template + static typename Accessor::ValueType result(const UnitaryMap&, + const Accessor& grid, const Coord& ijk) + { + return ISLaplacian::result(grid, ijk); + } + + // stencil access version + template + static typename StencilT::ValueType result(const UnitaryMap&, const StencilT& stencil) + { + return ISLaplacian::result(stencil); + } +}; + + +template +struct Laplacian +{ + // random access version + template static typename Accessor::ValueType + result(const UniformScaleMap& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + ValueType invdxdx = ValueType(map.getInvScaleSqr()[0]); + return ISLaplacian::result(grid, ijk) * invdxdx; + } + + // stencil access version + template static typename StencilT::ValueType + result(const UniformScaleMap& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType ValueType; + ValueType invdxdx = ValueType(map.getInvScaleSqr()[0]); + return ISLaplacian::result(stencil) * invdxdx; + } +}; + + +template +struct Laplacian +{ + // random access version + template static typename Accessor::ValueType + result(const UniformScaleTranslateMap& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + ValueType invdxdx = ValueType(map.getInvScaleSqr()[0]); + return ISLaplacian::result(grid, ijk) * invdxdx; + } + + // stencil access version + template static typename StencilT::ValueType + result(const UniformScaleTranslateMap& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType ValueType; + ValueType invdxdx = ValueType(map.getInvScaleSqr()[0]); + return ISLaplacian::result(stencil) * invdxdx; + } +}; + + +template +struct Laplacian +{ + // random access version + template static typename Accessor::ValueType + result(const ScaleMap& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + + // compute the second derivatives in index space + ValueType iddx = D2::inX(grid, ijk); + ValueType iddy = D2::inY(grid, ijk); + ValueType iddz = D2::inZ(grid, ijk); + const Vec3d& invScaleSqr = map.getInvScaleSqr(); + // scale them by the appropriate 1/dx^2, 1/dy^2, 1/dz^2 and sum + return ValueType(iddx * invScaleSqr[0] + iddy * invScaleSqr[1] + iddz * invScaleSqr[2]); + } + + // stencil access version + template static typename StencilT::ValueType + result(const ScaleMap& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType ValueType; + + // compute the second derivatives in index space + ValueType iddx = D2::inX(stencil); + ValueType iddy = D2::inY(stencil); + ValueType iddz = D2::inZ(stencil); + const Vec3d& invScaleSqr = map.getInvScaleSqr(); + // scale them by the appropriate 1/dx^2, 1/dy^2, 1/dz^2 and sum + return ValueType(iddx * invScaleSqr[0] + iddy * invScaleSqr[1] + iddz * invScaleSqr[2]); + } +}; + + +template +struct Laplacian +{ + // random access version + template static typename Accessor::ValueType + result(const ScaleTranslateMap& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + // compute the second derivatives in index space + ValueType iddx = D2::inX(grid, ijk); + ValueType iddy = D2::inY(grid, ijk); + ValueType iddz = D2::inZ(grid, ijk); + const Vec3d& invScaleSqr = map.getInvScaleSqr(); + // scale them by the appropriate 1/dx^2, 1/dy^2, 1/dz^2 and sum + return ValueType(iddx * invScaleSqr[0] + iddy * invScaleSqr[1] + iddz * invScaleSqr[2]); + } + + // stencil access version + template static typename StencilT::ValueType + result(const ScaleTranslateMap& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType ValueType; + // compute the second derivatives in index space + ValueType iddx = D2::inX(stencil); + ValueType iddy = D2::inY(stencil); + ValueType iddz = D2::inZ(stencil); + const Vec3d& invScaleSqr = map.getInvScaleSqr(); + // scale them by the appropriate 1/dx^2, 1/dy^2, 1/dz^2 and sum + return ValueType(iddx * invScaleSqr[0] + iddy * invScaleSqr[1] + iddz * invScaleSqr[2]); + } +}; + + +/// @brief Compute the closest-point transform to a level set. +/// @return the closest point to the surface from which the level set was derived, +/// in the domain space of the map (e.g., voxel space). +template +struct CPT +{ + // random access version + template static math::Vec3 + result(const MapType& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + typedef Vec3 Vec3Type; + + // current distance + ValueType d = grid.getValue(ijk); + // compute gradient in physical space where it is a unit normal + // since the grid holds a distance level set. + Vec3d vectorFromSurface(d*Gradient::result(map, grid, ijk)); + if (is_linear::value) { + Vec3d result = ijk.asVec3d() - map.applyInverseMap(vectorFromSurface); + return Vec3Type(result); + } else { + Vec3d location = map.applyMap(ijk.asVec3d()); + Vec3d result = map.applyInverseMap(location - vectorFromSurface); + return Vec3Type(result); + } + } + + // stencil access version + template static math::Vec3 + result(const MapType& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType ValueType; + typedef Vec3 Vec3Type; + + // current distance + ValueType d = stencil.template getValue<0, 0, 0>(); + // compute gradient in physical space where it is a unit normal + // since the grid holds a distance level set. + Vec3d vectorFromSurface(d*Gradient::result(map, stencil)); + if (is_linear::value) { + Vec3d result = stencil.getCenterCoord().asVec3d() + - map.applyInverseMap(vectorFromSurface); + return Vec3Type(result); + } else { + Vec3d location = map.applyMap(stencil.getCenterCoord().asVec3d()); + Vec3d result = map.applyInverseMap(location - vectorFromSurface); + return Vec3Type(result); + } + } +}; + + +/// @brief Compute the closest-point transform to a level set. +/// @return the closest point to the surface from which the level set was derived, +/// in the range space of the map (e.g., in world space) +template +struct CPT_RANGE +{ + // random access version + template static Vec3 + result(const MapType& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + typedef Vec3 Vec3Type; + // current distance + ValueType d = grid.getValue(ijk); + // compute gradient in physical space where it is a unit normal + // since the grid holds a distance level set. + Vec3Type vectorFromSurface = + d*Gradient::result(map, grid, ijk); + Vec3d result = map.applyMap(ijk.asVec3d()) - vectorFromSurface; + + return Vec3Type(result); + } + + // stencil access version + template static Vec3 + result(const MapType& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType ValueType; + typedef Vec3 Vec3Type; + // current distance + ValueType d = stencil.template getValue<0, 0, 0>(); + // compute gradient in physical space where it is a unit normal + // since the grid holds a distance level set. + Vec3Type vectorFromSurface = + d*Gradient::result(map, stencil); + Vec3d result = map.applyMap(stencil.getCenterCoord().asVec3d()) - vectorFromSurface; + + return Vec3Type(result); + } +}; + + +/// @brief Compute the mean curvature. +/// @return the mean curvature in two parts: @c alpha is the numerator in +/// @f$\nabla \cdot (\nabla \phi / |\nabla \phi|)@f$, and @c beta is @f$|\nabla \phi|@f$. +template +struct MeanCurvature +{ + /// @brief random access version + /// @return true if the gradient is none-zero, in which case the + /// mean curvature is computed as two parts: @c alpha is the numerator in + /// @f$\nabla \cdot (\nabla \phi / |\nabla \phi|)@f$, and @c beta is @f$|\nabla \phi|@f$. + template + static bool compute(const MapType& map, const Accessor& grid, const Coord& ijk, + double& alpha, double& beta) + { + typedef typename Accessor::ValueType ValueType; + + // compute the gradient in index and world space + Vec3d d1_is(static_cast(D1::inX(grid, ijk)), + static_cast(D1::inY(grid, ijk)), + static_cast(D1::inZ(grid, ijk))), d1_ws; + if (is_linear::value) {//resolved at compiletime + d1_ws = map.applyIJT(d1_is); + } else { + d1_ws = map.applyIJT(d1_is, ijk.asVec3d()); + } + const double Dx2 = d1_ws(0)*d1_ws(0); + const double Dy2 = d1_ws(1)*d1_ws(1); + const double Dz2 = d1_ws(2)*d1_ws(2); + const double normGrad = Dx2 + Dy2 + Dz2; + if (normGrad <= math::Tolerance::value()) { + alpha = beta = 0; + return false; + } + + // all the second derivatives in index space + ValueType iddx = D2::inX(grid, ijk); + ValueType iddy = D2::inY(grid, ijk); + ValueType iddz = D2::inZ(grid, ijk); + + ValueType iddxy = D2::inXandY(grid, ijk); + ValueType iddyz = D2::inYandZ(grid, ijk); + ValueType iddxz = D2::inXandZ(grid, ijk); + + // second derivatives in index space + Mat3d d2_is(iddx, iddxy, iddxz, + iddxy, iddy, iddyz, + iddxz, iddyz, iddz); + + // convert second derivatives to world space + Mat3d d2_ws; + if (is_linear::value) {//resolved at compiletime + d2_ws = map.applyIJC(d2_is); + } else { + d2_ws = map.applyIJC(d2_is, d1_is, ijk.asVec3d()); + } + + // assemble the nominator and denominator for mean curvature + alpha = (Dx2*(d2_ws(1,1)+d2_ws(2,2))+Dy2*(d2_ws(0,0)+d2_ws(2,2)) + +Dz2*(d2_ws(0,0)+d2_ws(1,1)) + -2*(d1_ws(0)*(d1_ws(1)*d2_ws(0,1)+d1_ws(2)*d2_ws(0,2)) + +d1_ws(1)*d1_ws(2)*d2_ws(1,2))); + beta = std::sqrt(normGrad); // * 1/dx + return true; + } + + template + static typename Accessor::ValueType result(const MapType& map, + const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + double alpha, beta; + return compute(map, grid, ijk, alpha, beta) ? + ValueType(alpha/(2. *math::Pow3(beta))) : 0; + } + + template + static typename Accessor::ValueType normGrad(const MapType& map, + const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + double alpha, beta; + return compute(map, grid, ijk, alpha, beta) ? + ValueType(alpha/(2. *math::Pow2(beta))) : 0; + } + + /// @brief stencil access version + /// @return true if the gradient is none-zero, in which case the + /// mean curvature is computed as two parts: @c alpha is the numerator in + /// @f$\nabla \cdot (\nabla \phi / |\nabla \phi|)@f$, and @c beta is @f$|\nabla \phi|@f$. + template + static bool compute(const MapType& map, const StencilT& stencil, + double& alpha, double& beta) + { + typedef typename StencilT::ValueType ValueType; + + // compute the gradient in index and world space + Vec3d d1_is(D1::inX(stencil), + D1::inY(stencil), + D1::inZ(stencil) ), d1_ws; + if (is_linear::value) {//resolved at compiletime + d1_ws = map.applyIJT(d1_is); + } else { + d1_ws = map.applyIJT(d1_is, stencil.getCenterCoord().asVec3d()); + } + const double Dx2 = d1_ws(0)*d1_ws(0); + const double Dy2 = d1_ws(1)*d1_ws(1); + const double Dz2 = d1_ws(2)*d1_ws(2); + const double normGrad = Dx2 + Dy2 + Dz2; + if (normGrad <= math::Tolerance::value()) { + alpha = beta = 0; + return false; + } + + // all the second derivatives in index space + ValueType iddx = D2::inX(stencil); + ValueType iddy = D2::inY(stencil); + ValueType iddz = D2::inZ(stencil); + + ValueType iddxy = D2::inXandY(stencil); + ValueType iddyz = D2::inYandZ(stencil); + ValueType iddxz = D2::inXandZ(stencil); + + // second derivatives in index space + Mat3d d2_is(iddx, iddxy, iddxz, + iddxy, iddy, iddyz, + iddxz, iddyz, iddz); + + // convert second derivatives to world space + Mat3d d2_ws; + if (is_linear::value) {//resolved at compiletime + d2_ws = map.applyIJC(d2_is); + } else { + d2_ws = map.applyIJC(d2_is, d1_is, stencil.getCenterCoord().asVec3d()); + } + + // for return + alpha = (Dx2*(d2_ws(1,1)+d2_ws(2,2))+Dy2*(d2_ws(0,0)+d2_ws(2,2)) + +Dz2*(d2_ws(0,0)+d2_ws(1,1)) + -2*(d1_ws(0)*(d1_ws(1)*d2_ws(0,1)+d1_ws(2)*d2_ws(0,2)) + +d1_ws(1)*d1_ws(2)*d2_ws(1,2))); + beta = std::sqrt(normGrad); // * 1/dx + return true; + } + + template + static typename StencilT::ValueType + result(const MapType& map, const StencilT stencil) + { + typedef typename StencilT::ValueType ValueType; + double alpha, beta; + return compute(map, stencil, alpha, beta) ? + ValueType(alpha/(2*math::Pow3(beta))) : 0; + } + + template + static typename StencilT::ValueType normGrad(const MapType& map, const StencilT stencil) + { + typedef typename StencilT::ValueType ValueType; + double alpha, beta; + return compute(map, stencil, alpha, beta) ? + ValueType(alpha/(2*math::Pow2(beta))) : 0; + } +}; + + +template +struct MeanCurvature +{ + // random access version + template + static typename Accessor::ValueType result(const TranslationMap&, + const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + + ValueType alpha, beta; + return ISMeanCurvature::result(grid, ijk, alpha, beta) ? + ValueType(alpha /(2*math::Pow3(beta))) : 0; + } + + template + static typename Accessor::ValueType normGrad(const TranslationMap&, + const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + + ValueType alpha, beta; + return ISMeanCurvature::result(grid, ijk, alpha, beta) ? + ValueType(alpha/(2*math::Pow2(beta))) : 0; + } + + // stencil access version + template + static typename StencilT::ValueType result(const TranslationMap&, const StencilT& stencil) + { + typedef typename StencilT::ValueType ValueType; + + ValueType alpha, beta; + return ISMeanCurvature::result(stencil, alpha, beta) ? + ValueType(alpha /(2*math::Pow3(beta))) : 0; + } + + template + static typename StencilT::ValueType normGrad(const TranslationMap&, const StencilT& stencil) + { + typedef typename StencilT::ValueType ValueType; + + ValueType alpha, beta; + return ISMeanCurvature::result(stencil, alpha, beta) ? + ValueType(alpha/(2*math::Pow2(beta))) : 0; + } +}; + + +template +struct MeanCurvature +{ + // random access version + template + static typename Accessor::ValueType result(const UniformScaleMap& map, + const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + + ValueType alpha, beta; + if (ISMeanCurvature::result(grid, ijk, alpha, beta)) { + ValueType inv2dx = ValueType(map.getInvTwiceScale()[0]); + return ValueType(alpha*inv2dx/math::Pow3(beta)); + } + return 0; + } + + template + static typename Accessor::ValueType normGrad(const UniformScaleMap& map, + const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + + ValueType alpha, beta; + if (ISMeanCurvature::result(grid, ijk, alpha, beta)) { + ValueType invdxdx = ValueType(map.getInvScaleSqr()[0]); + return ValueType(alpha*invdxdx/(2*math::Pow2(beta))); + } + return 0; + } + + // stencil access version + template + static typename StencilT::ValueType result(const UniformScaleMap& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType ValueType; + + ValueType alpha, beta; + if (ISMeanCurvature::result(stencil, alpha, beta)) { + ValueType inv2dx = ValueType(map.getInvTwiceScale()[0]); + return ValueType(alpha*inv2dx/math::Pow3(beta)); + } + return 0; + } + + template + static typename StencilT::ValueType normGrad(const UniformScaleMap& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType ValueType; + + ValueType alpha, beta; + if (ISMeanCurvature::result(stencil, alpha, beta)) { + ValueType invdxdx = ValueType(map.getInvScaleSqr()[0]); + return ValueType(alpha*invdxdx/(2*math::Pow2(beta))); + } + return 0; + } +}; + + +template +struct MeanCurvature +{ + // random access version + template static typename Accessor::ValueType + result(const UniformScaleTranslateMap& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + + ValueType alpha, beta; + if (ISMeanCurvature::result(grid, ijk, alpha, beta)) { + ValueType inv2dx = ValueType(map.getInvTwiceScale()[0]); + return ValueType(alpha*inv2dx/math::Pow3(beta)); + } + return 0; + } + + template static typename Accessor::ValueType + normGrad(const UniformScaleTranslateMap& map, const Accessor& grid, const Coord& ijk) + { + typedef typename Accessor::ValueType ValueType; + + ValueType alpha, beta; + if (ISMeanCurvature::result(grid, ijk, alpha, beta)) { + ValueType invdxdx = ValueType(map.getInvScaleSqr()[0]); + return ValueType(alpha*invdxdx/(2*math::Pow2(beta))); + } + return 0; + } + + // stencil access version + template static typename StencilT::ValueType + result(const UniformScaleTranslateMap& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType ValueType; + + ValueType alpha, beta; + if (ISMeanCurvature::result(stencil, alpha, beta)) { + ValueType inv2dx = ValueType(map.getInvTwiceScale()[0]); + return ValueType(alpha*inv2dx/math::Pow3(beta)); + } + return 0; + } + + template static typename StencilT::ValueType + normGrad(const UniformScaleTranslateMap& map, const StencilT& stencil) + { + typedef typename StencilT::ValueType ValueType; + + ValueType alpha, beta; + if (ISMeanCurvature::result(stencil, alpha, beta)) { + ValueType invdxdx = ValueType(map.getInvScaleSqr()[0]); + return ValueType(alpha*invdxdx/(2*math::Pow2(beta))); + } + return 0; + } +}; + + +/// @brief A wrapper that holds a MapBase::ConstPtr and exposes a reduced set +/// of functionality needed by the mathematical operators +/// @details This may be used in some Map-templated code, when the overhead of +/// actually resolving the @c Map type is large compared to the map work to be done. +class GenericMap +{ +public: + template + GenericMap(const GridType& g): mMap(g.transform().baseMap()) {} + + GenericMap(const Transform& t): mMap(t.baseMap()) {} + GenericMap(MapBase::Ptr map): mMap(boost::const_pointer_cast(map)) {} + GenericMap(MapBase::ConstPtr map): mMap(map) {} + ~GenericMap() {} + + Vec3d applyMap(const Vec3d& in) const { return mMap->applyMap(in); } + Vec3d applyInverseMap(const Vec3d& in) const { return mMap->applyInverseMap(in); } + + Vec3d applyIJT(const Vec3d& in) const { return mMap->applyIJT(in); } + Vec3d applyIJT(const Vec3d& in, const Vec3d& pos) const { return mMap->applyIJT(in, pos); } + Mat3d applyIJC(const Mat3d& m) const { return mMap->applyIJC(m); } + Mat3d applyIJC(const Mat3d& m, const Vec3d& v, const Vec3d& pos) const + { return mMap->applyIJC(m,v,pos); } + + double determinant() const { return mMap->determinant(); } + double determinant(const Vec3d& in) const { return mMap->determinant(in); } + + Vec3d voxelSize() const { return mMap->voxelSize(); } + Vec3d voxelSize(const Vec3d&v) const { return mMap->voxelSize(v); } + +private: + MapBase::ConstPtr mMap; +}; + +} // end math namespace +} // namespace OPENVDB_VERSION_NAME +} // end openvdb namespace + +#endif // OPENVDB_MATH_OPERATORS_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/math/Proximity.h b/nuparu/include/openvdb/include/openvdb/math/Proximity.h new file mode 100644 index 00000000..37110936 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/math/Proximity.h @@ -0,0 +1,79 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_MATH_PROXIMITY_HAS_BEEN_INCLUDED +#define OPENVDB_MATH_PROXIMITY_HAS_BEEN_INCLUDED + +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace math { + +/// @brief Closest Point on Triangle to Point. Given a triangle @c abc and a point @c p, +/// return the point on @c abc closest to @c p and the corresponding barycentric coordinates. +/// +/// @details Algorithms from "Real-Time Collision Detection" pg 136 to 142 by Christer Ericson. +/// The closest point is obtained by first determining which of the triangles' +/// Voronoi feature regions @c p is in and then computing the orthogonal projection +/// of @c p onto the corresponding feature. +/// +/// @param a The triangle's first vertex point. +/// @param b The triangle's second vertex point. +/// @param c The triangle's third vertex point. +/// @param p Point to compute the closest point on @c abc for. +/// @param uvw Barycentric coordinates, computed and returned. +OPENVDB_API Vec3d +closestPointOnTriangleToPoint( + const Vec3d& a, const Vec3d& b, const Vec3d& c, const Vec3d& p, Vec3d& uvw); + + +/// @brief Closest Point on Line Segment to Point. Given segment @c ab and point @c p, +/// return the point on @c ab closest to @c p and @c t the parametric distance to @c b. +/// +/// @param a The segment's first vertex point. +/// @param b The segment's second vertex point. +/// @param p Point to compute the closest point on @c ab for. +/// @param t Parametric distance to @c b. +OPENVDB_API Vec3d +closestPointOnSegmentToPoint( + const Vec3d& a, const Vec3d& b, const Vec3d& p, double& t); + +} // namespace math +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_MESH_TO_VOLUME_UTIL_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/math/QuantizedUnitVec.h b/nuparu/include/openvdb/include/openvdb/math/QuantizedUnitVec.h new file mode 100644 index 00000000..09a81ad8 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/math/QuantizedUnitVec.h @@ -0,0 +1,166 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_MATH_QUANTIZED_UNIT_VEC_HAS_BEEN_INCLUDED +#define OPENVDB_MATH_QUANTIZED_UNIT_VEC_HAS_BEEN_INCLUDED + +#include +#include +#include "Vec3.h" +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace math { + + +// Bit compression method that effciently represents a unit vector using +// 2 bytes i.e. 16 bits of data by only storing two quantized components. +// Based on "Higher Accuracy Quantized Normals" article from GameDev.Net LLC, 2000 + +class OPENVDB_API QuantizedUnitVec +{ +public: + + template + static uint16_t pack(const Vec3& vec); + static Vec3s unpack(const uint16_t data); + + static void flipSignBits(uint16_t&); + +private: + QuantizedUnitVec() {} + + // threadsafe initialization function for the normalization weights. + static void init(); + + // bit masks + static const uint16_t MASK_SLOTS = 0x1FFF; // 0001111111111111 + static const uint16_t MASK_XSLOT = 0x1F80; // 0001111110000000 + static const uint16_t MASK_YSLOT = 0x007F; // 0000000001111111 + static const uint16_t MASK_XSIGN = 0x8000; // 1000000000000000 + static const uint16_t MASK_YSIGN = 0x4000; // 0100000000000000 + static const uint16_t MASK_ZSIGN = 0x2000; // 0010000000000000 + + // initialization flag. + static bool sInitialized; + + // normalization weights, 32 kilobytes. + static float sNormalizationWeights[MASK_SLOTS + 1]; +}; // class QuantizedUnitVec + + +//////////////////////////////////////// + + +template +inline uint16_t +QuantizedUnitVec::pack(const Vec3& vec) +{ + if (math::isZero(vec)) return 0; + + uint16_t data = 0; + T x(vec[0]), y(vec[1]), z(vec[2]); + + // The sign of the three components are first stored using + // 3-bits and can then safely be discarded. + if (x < T(0.0)) { data |= MASK_XSIGN; x = -x; } + if (y < T(0.0)) { data |= MASK_YSIGN; y = -y; } + if (z < T(0.0)) { data |= MASK_ZSIGN; z = -z; } + + // The z component is discarded and x & y are quantized in + // the 0 to 126 range. + T w = T(126.0) / (x + y + z); + uint16_t xbits = static_cast((x * w)); + uint16_t ybits = static_cast((y * w)); + + // The remaining 13 bits in our 16 bit word are dividied into a + // 6-bit x-slot and a 7-bit y-slot. Both the xbits and the ybits + // can still be represented using (2^7 - 1) quantization levels. + + // If the xbits requre more than 6-bits, store the complement. + // (xbits + ybits < 127, thus if xbits > 63 => ybits <= 63) + if(xbits > 63) { + xbits = static_cast(127 - xbits); + ybits = static_cast(127 - ybits); + } + + // Pack components into their respective slots. + data = static_cast(data | (xbits << 7)); + data = static_cast(data | ybits); + return data; +} + + +inline Vec3s +QuantizedUnitVec::unpack(const uint16_t data) +{ + if (!sInitialized) init(); + + const float w = sNormalizationWeights[data & MASK_SLOTS]; + + uint16_t xbits = static_cast((data & MASK_XSLOT) >> 7); + uint16_t ybits = static_cast(data & MASK_YSLOT); + + // Check if the complement components where stored and revert. + if ((xbits + ybits) > 126) { + xbits = static_cast(127 - xbits); + ybits = static_cast(127 - ybits); + } + + Vec3s vec(float(xbits) * w, float(ybits) * w, float(126 - xbits - ybits) * w); + + if (data & MASK_XSIGN) vec[0] = -vec[0]; + if (data & MASK_YSIGN) vec[1] = -vec[1]; + if (data & MASK_ZSIGN) vec[2] = -vec[2]; + return vec; +} + + +//////////////////////////////////////// + + +inline void +QuantizedUnitVec::flipSignBits(uint16_t& v) +{ + v = static_cast((v & MASK_SLOTS) | (~v & ~MASK_SLOTS)); +} + + +} // namespace math +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_MATH_QUANTIZED_UNIT_VEC_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/math/Quat.h b/nuparu/include/openvdb/include/openvdb/math/Quat.h new file mode 100644 index 00000000..93248f1d --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/math/Quat.h @@ -0,0 +1,658 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_MATH_QUAT_H_HAS_BEEN_INCLUDED +#define OPENVDB_MATH_QUAT_H_HAS_BEEN_INCLUDED + +#include +#include + +#include "Mat.h" +#include "Mat3.h" +#include "Math.h" +#include "Vec3.h" +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace math { + +template class Quat; + +/// Linear interpolation between the two quaternions +template +Quat slerp(const Quat &q1, const Quat &q2, T t, T tolerance=0.00001) +{ + T qdot, angle, sineAngle; + + qdot = q1.dot(q2); + + if (fabs(qdot) >= 1.0) { + angle = 0; // not necessary but suppresses compiler warning + sineAngle = 0; + } else { + angle = acos(qdot); + sineAngle = sin(angle); + } + + // + // Denominator close to 0 corresponds to the case where the + // two quaternions are close to the same rotation. In this + // case linear interpolation is used but we normalize to + // guarantee unit length + // + if (sineAngle <= tolerance) { + T s = 1.0 - t; + + Quat qtemp(s * q1[0] + t * q2[0], s * q1[1] + t * q2[1], + s * q1[2] + t * q2[2], s * q1[3] + t * q2[3]); + // + // Check the case where two close to antipodal quaternions were + // blended resulting in a nearly zero result which can happen, + // for example, if t is close to 0.5. In this case it is not safe + // to project back onto the sphere. + // + double lengthSquared = qtemp.dot(qtemp); + + if (lengthSquared <= tolerance * tolerance) { + qtemp = (t < 0.5) ? q1 : q2; + } else { + qtemp *= 1.0 / sqrt(lengthSquared); + } + return qtemp; + } else { + + T sine = 1.0 / sineAngle; + T a = sin((1.0 - t) * angle) * sine; + T b = sin(t * angle) * sine; + return Quat(a * q1[0] + b * q2[0], a * q1[1] + b * q2[1], + a * q1[2] + b * q2[2], a * q1[3] + b * q2[3]); + } + +} + +template +class Quat +{ +public: + /// Trivial constructor, the quaternion is NOT initialized + Quat() {} + + /// Constructor with four arguments, e.g. Quatf q(1,2,3,4); + Quat(T x, T y, T z, T w) + { + mm[0] = x; + mm[1] = y; + mm[2] = z; + mm[3] = w; + + } + + /// Constructor with array argument, e.g. float a[4]; Quatf q(a); + Quat(T *a) + { + mm[0] = a[0]; + mm[1] = a[1]; + mm[2] = a[2]; + mm[3] = a[3]; + + } + + /// Constructor given rotation as axis and angle, the axis must be + /// unit vector + Quat(const Vec3 &axis, T angle) + { + // assert( REL_EQ(axis.length(), 1.) ); + + T s = T(sin(angle*T(0.5))); + + mm[0] = axis.x() * s; + mm[1] = axis.y() * s; + mm[2] = axis.z() * s; + + mm[3] = T(cos(angle*T(0.5))); + + } + + /// Constructor given rotation as axis and angle + Quat(math::Axis axis, T angle) + { + T s = T(sin(angle*T(0.5))); + + mm[0] = (axis==math::X_AXIS) * s; + mm[1] = (axis==math::Y_AXIS) * s; + mm[2] = (axis==math::Z_AXIS) * s; + + mm[3] = T(cos(angle*T(0.5))); + } + + /// Constructor given a rotation matrix + template + Quat(const Mat3 &rot) { + + // verify that the matrix is really a rotation + if(!isUnitary(rot)) { // unitary is reflection or rotation + OPENVDB_THROW(ArithmeticError, + "A non-rotation matrix can not be used to construct a quaternion"); + } + if (!isApproxEqual(rot.det(), (T1)1)) { // rule out reflection + OPENVDB_THROW(ArithmeticError, + "A reflection matrix can not be used to construct a quaternion"); + } + + T trace = (T)rot.trace(); + if (trace > 0) { + + T q_w = 0.5 * std::sqrt(trace+1); + T factor = 0.25 / q_w; + + mm[0] = factor * (rot(1,2) - rot(2,1)); + mm[1] = factor * (rot(2,0) - rot(0,2)); + mm[2] = factor * (rot(0,1) - rot(1,0)); + mm[3] = q_w; + } else if (rot(0,0) > rot(1,1) && rot(0,0) > rot(2,2)) { + + T q_x = 0.5 * sqrt(rot(0,0)- rot(1,1)-rot(2,2)+1); + T factor = 0.25 / q_x; + + mm[0] = q_x; + mm[1] = factor * (rot(0,1) + rot(1,0)); + mm[2] = factor * (rot(2,0) + rot(0,2)); + mm[3] = factor * (rot(1,2) - rot(2,1)); + } else if (rot(1,1) > rot(2,2)) { + + T q_y = 0.5 * sqrt(rot(1,1)-rot(0,0)-rot(2,2)+1); + T factor = 0.25 / q_y; + + mm[0] = factor * (rot(0,1) + rot(1,0)); + mm[1] = q_y; + mm[2] = factor * (rot(1,2) + rot(2,1)); + mm[3] = factor * (rot(2,0) - rot(0,2)); + } else { + + T q_z = 0.5 * sqrt(rot(2,2)-rot(0,0)-rot(1,1)+1); + T factor = 0.25 / q_z; + + mm[0] = factor * (rot(2,0) + rot(0,2)); + mm[1] = factor * (rot(1,2) + rot(2,1)); + mm[2] = q_z; + mm[3] = factor * (rot(0,1) - rot(1,0)); + } + } + + /// Copy constructor + Quat(const Quat &q) + { + mm[0] = q.mm[0]; + mm[1] = q.mm[1]; + mm[2] = q.mm[2]; + mm[3] = q.mm[3]; + + } + + /// Reference to the component, e.g. q.x() = 4.5f; + T& x() { return mm[0]; } + T& y() { return mm[1]; } + T& z() { return mm[2]; } + T& w() { return mm[3]; } + + /// Get the component, e.g. float f = q.w(); + T x() const { return mm[0]; } + T y() const { return mm[1]; } + T z() const { return mm[2]; } + T w() const { return mm[3]; } + + // Number of elements + static unsigned numElements() { return 4; } + + /// Array style reference to the components, e.g. q[3] = 1.34f; + T& operator[](int i) { return mm[i]; } + + /// Array style constant reference to the components, e.g. float f = q[1]; + T operator[](int i) const { return mm[i]; } + + /// Cast to T* + operator T*() { return mm; } + operator const T*() const { return mm; } + + /// Alternative indexed reference to the elements + T& operator()(int i) { return mm[i]; } + + /// Alternative indexed constant reference to the elements, + T operator()(int i) const { return mm[i]; } + + /// Return angle of rotation + T angle() const + { + T sqrLength = mm[0]*mm[0] + mm[1]*mm[1] + mm[2]*mm[2]; + + if ( sqrLength > 1.0e-8 ) { + + return T(T(2.0) * acos(mm[3])); + + } else { + + return T(0.0); + } + } + + /// Return axis of rotation + Vec3 axis() const + { + T sqrLength = mm[0]*mm[0] + mm[1]*mm[1] + mm[2]*mm[2]; + + if ( sqrLength > 1.0e-8 ) { + + T invLength = T(T(1)/sqrt(sqrLength)); + + return Vec3( mm[0]*invLength, mm[1]*invLength, mm[2]*invLength ); + } else { + + return Vec3(1,0,0); + } + } + + + /// "this" quaternion gets initialized to [x, y, z, w] + Quat& init(T x, T y, T z, T w) + { + mm[0] = x; mm[1] = y; mm[2] = z; mm[3] = w; + return *this; + } + + /// "this" quaternion gets initialized to identity, same as setIdentity() + Quat& init() { return setIdentity(); } + + /// Set "this" quaternion to rotation specified by axis and angle, + /// the axis must be unit vector + Quat& setAxisAngle(const Vec3& axis, T angle) + { + + T s = T(sin(angle*T(0.5))); + + mm[0] = axis.x() * s; + mm[1] = axis.y() * s; + mm[2] = axis.z() * s; + + mm[3] = T(cos(angle*T(0.5))); + + return *this; + } // axisAngleTest + + /// Set "this" vector to zero + Quat& setZero() + { + mm[0] = mm[1] = mm[2] = mm[3] = 0; + return *this; + } + + /// Set "this" vector to identity + Quat& setIdentity() + { + mm[0] = mm[1] = mm[2] = 0; + mm[3] = 1; + return *this; + } + + /// Returns vector of x,y,z rotational components + Vec3 eulerAngles(RotationOrder rotationOrder) const + { return math::eulerAngles(Mat3(*this), rotationOrder); } + + /// Assignment operator + Quat& operator=(const Quat &q) + { + mm[0] = q.mm[0]; + mm[1] = q.mm[1]; + mm[2] = q.mm[2]; + mm[3] = q.mm[3]; + + return *this; + } + + /// Equality operator, does exact floating point comparisons + bool operator==(const Quat &q) const + { + return (isExactlyEqual(mm[0],q.mm[0]) && + isExactlyEqual(mm[1],q.mm[1]) && + isExactlyEqual(mm[2],q.mm[2]) && + isExactlyEqual(mm[3],q.mm[3]) ); + } + + /// Test if "this" is equivalent to q with tolerance of eps value + bool eq(const Quat &q, T eps=1.0e-7) const + { + return isApproxEqual(mm[0],q.mm[0],eps) && isApproxEqual(mm[1],q.mm[1],eps) && + isApproxEqual(mm[2],q.mm[2],eps) && isApproxEqual(mm[3],q.mm[3],eps) ; + } // trivial + + /// Add quaternion q to "this" quaternion, e.g. q += q1; + Quat& operator+=(const Quat &q) + { + mm[0] += q.mm[0]; + mm[1] += q.mm[1]; + mm[2] += q.mm[2]; + mm[3] += q.mm[3]; + + return *this; + } + + /// Subtract quaternion q from "this" quaternion, e.g. q -= q1; + Quat& operator-=(const Quat &q) + { + mm[0] -= q.mm[0]; + mm[1] -= q.mm[1]; + mm[2] -= q.mm[2]; + mm[3] -= q.mm[3]; + + return *this; + } + + /// Scale "this" quaternion by scalar, e.g. q *= scalar; + Quat& operator*=(T scalar) + { + mm[0] *= scalar; + mm[1] *= scalar; + mm[2] *= scalar; + mm[3] *= scalar; + + return *this; + } + + /// Return (this+q), e.g. q = q1 + q2; + Quat operator+(const Quat &q) const + { + return Quat(mm[0]+q.mm[0], mm[1]+q.mm[1], mm[2]+q.mm[2], mm[3]+q.mm[3]); + } + + /// Return (this-q), e.g. q = q1 - q2; + Quat operator-(const Quat &q) const + { + return Quat(mm[0]-q.mm[0], mm[1]-q.mm[1], mm[2]-q.mm[2], mm[3]-q.mm[3]); + } + + /// Return (this*q), e.g. q = q1 * q2; + Quat operator*(const Quat &q) const + { + Quat prod; + + prod.mm[0] = mm[3]*q.mm[0] + mm[0]*q.mm[3] + mm[1]*q.mm[2] - mm[2]*q.mm[1]; + prod.mm[1] = mm[3]*q.mm[1] + mm[1]*q.mm[3] + mm[2]*q.mm[0] - mm[0]*q.mm[2]; + prod.mm[2] = mm[3]*q.mm[2] + mm[2]*q.mm[3] + mm[0]*q.mm[1] - mm[1]*q.mm[0]; + prod.mm[3] = mm[3]*q.mm[3] - mm[0]*q.mm[0] - mm[1]*q.mm[1] - mm[2]*q.mm[2]; + + return prod; + + } + + /// Assigns this to (this*q), e.g. q *= q1; + Quat operator*=(const Quat &q) + { + *this = *this * q; + return *this; + } + + /// Return (this*scalar), e.g. q = q1 * scalar; + Quat operator*(T scalar) const + { + return Quat(mm[0]*scalar, mm[1]*scalar, mm[2]*scalar, mm[3]*scalar); + } + + /// Return (this/scalar), e.g. q = q1 / scalar; + Quat operator/(T scalar) const + { + return Quat(mm[0]/scalar, mm[1]/scalar, mm[2]/scalar, mm[3]/scalar); + } + + /// Negation operator, e.g. q = -q; + Quat operator-() const + { return Quat(-mm[0], -mm[1], -mm[2], -mm[3]); } + + /// this = q1 + q2 + /// "this", q1 and q2 need not be distinct objects, e.g. q.add(q1,q); + Quat& add(const Quat &q1, const Quat &q2) + { + mm[0] = q1.mm[0] + q2.mm[0]; + mm[1] = q1.mm[1] + q2.mm[1]; + mm[2] = q1.mm[2] + q2.mm[2]; + mm[3] = q1.mm[3] + q2.mm[3]; + + return *this; + } + + /// this = q1 - q2 + /// "this", q1 and q2 need not be distinct objects, e.g. q.sub(q1,q); + Quat& sub(const Quat &q1, const Quat &q2) + { + mm[0] = q1.mm[0] - q2.mm[0]; + mm[1] = q1.mm[1] - q2.mm[1]; + mm[2] = q1.mm[2] - q2.mm[2]; + mm[3] = q1.mm[3] - q2.mm[3]; + + return *this; + } + + /// this = q1 * q2 + /// q1 and q2 must be distinct objects than "this", e.g. q.mult(q1,q2); + Quat& mult(const Quat &q1, const Quat &q2) + { + mm[0] = q1.mm[3]*q2.mm[0] + q1.mm[0]*q2.mm[3] + + q1.mm[1]*q2.mm[2] - q1.mm[2]*q2.mm[1]; + mm[1] = q1.mm[3]*q2.mm[1] + q1.mm[1]*q2.mm[3] + + q1.mm[2]*q2.mm[0] - q1.mm[0]*q2.mm[2]; + mm[2] = q1.mm[3]*q2.mm[2] + q1.mm[2]*q2.mm[3] + + q1.mm[0]*q2.mm[1] - q1.mm[1]*q2.mm[0]; + mm[3] = q1.mm[3]*q2.mm[3] - q1.mm[0]*q2.mm[0] - + q1.mm[1]*q2.mm[1] - q1.mm[2]*q2.mm[2]; + + return *this; + } + + /// this = scalar*q, q need not be distinct object than "this", + /// e.g. q.scale(1.5,q1); + Quat& scale(T scale, const Quat &q) + { + mm[0] = scale * q.mm[0]; + mm[1] = scale * q.mm[1]; + mm[2] = scale * q.mm[2]; + mm[3] = scale * q.mm[3]; + + return *this; + } + + /// Dot product + T dot(const Quat &q) const + { + return (mm[0]*q.mm[0] + mm[1]*q.mm[1] + mm[2]*q.mm[2] + mm[3]*q.mm[3]); + } + + /// Return the quaternion rate corrsponding to the angular velocity omega + /// and "this" current rotation + Quat derivative(const Vec3& omega) const + { + return Quat( +w()*omega.x() -z()*omega.y() +y()*omega.z() , + +z()*omega.x() +w()*omega.y() -x()*omega.z() , + -y()*omega.x() +x()*omega.y() +w()*omega.z() , + -x()*omega.x() -y()*omega.y() -z()*omega.z() ); + } + + /// this = normalized this + bool normalize(T eps = T(1.0e-8)) + { + T d = T(sqrt(mm[0]*mm[0] + mm[1]*mm[1] + mm[2]*mm[2] + mm[3]*mm[3])); + if( isApproxEqual(d, T(0.0), eps) ) return false; + *this *= ( T(1)/d ); + return true; + } + + /// this = normalized this + Quat unit() const + { + T d = sqrt(mm[0]*mm[0] + mm[1]*mm[1] + mm[2]*mm[2] + mm[3]*mm[3]); + if( isExactlyEqual(d , T(0.0) ) ) + OPENVDB_THROW(ArithmeticError, + "Normalizing degenerate quaternion"); + return *this / d; + } + + /// returns inverse of this + Quat inverse(T tolerance = T(0)) + { + T d = mm[0]*mm[0] + mm[1]*mm[1] + mm[2]*mm[2] + mm[3]*mm[3]; + if( isApproxEqual(d, T(0.0), tolerance) ) + OPENVDB_THROW(ArithmeticError, + "Cannot invert degenerate quaternion"); + Quat result = *this/-d; + result.mm[3] = -result.mm[3]; + return result; + } + + + /// Return the conjugate of "this", same as invert without + /// unit quaternion test + Quat conjugate() const + { + return Quat(-mm[0], -mm[1], -mm[2], mm[3]); + } + + /// Return rotated vector by "this" quaternion + Vec3 rotateVector(const Vec3 &v) const + { + Mat3 m(*this); + return m.transform(v); + } + + /// Predefined constants, e.g. Quat q = Quat::identity(); + static Quat zero() { return Quat(0,0,0,0); } + static Quat identity() { return Quat(0,0,0,1); } + + /// @return string representation of Classname + std::string + str() const { + std::ostringstream buffer; + + buffer << "["; + + // For each column + for (unsigned j(0); j < 4; j++) { + if (j) buffer << ", "; + buffer << mm[j]; + } + + buffer << "]"; + + return buffer.str(); + } + + /// Output to the stream, e.g. std::cout << q << std::endl; + friend std::ostream& operator<<(std::ostream &stream, const Quat &q) + { + stream << q.str(); + return stream; + } + + friend Quat slerp<>(const Quat &q1, const Quat &q2, T t, T tolerance); + + + void write(std::ostream& os) const { + os.write((char*)&mm, sizeof(T)*4); + } + void read(std::istream& is) { + is.read((char*)&mm, sizeof(T)*4); + } + +protected: + T mm[4]; +}; + +/// Returns V, where \f$V_i = v_i * scalar\f$ for \f$i \in [0, 3]\f$ +template +Quat operator*(S scalar, const Quat &q) { return q*scalar; } + + +/// @brief Interpolate between m1 and m2. +/// Converts to quaternion form and uses slerp +/// m1 and m2 must be rotation matrices! +template +Mat3 slerp(const Mat3 &m1, const Mat3 &m2, T t) +{ + typedef Mat3 MatType; + + Quat q1(m1); + Quat q2(m2); + + if (q1.dot(q2) < 0) q2 *= -1; + + Quat qslerp = slerp(q1, q2, static_cast(t)); + MatType m = rotation(qslerp); + return m; +} + + + +/// Interpolate between m1 and m4 by converting m1 ... m4 into +/// quaternions and treating them as control points of a Bezier +/// curve using slerp in place of lerp in the De Castlejeau evaluation +/// algorithm. Just like a cubic Bezier curve, this will interpolate +/// m1 at t = 0 and m4 at t = 1 but in general will not pass through +/// m2 and m3. Unlike a standard Bezier curve this curve will not have +/// the convex hull property. +/// m1 ... m4 must be rotation matrices! +template +Mat3 bezLerp(const Mat3 &m1, const Mat3 &m2, + const Mat3 &m3, const Mat3 &m4, + T t) +{ + Mat3 m00, m01, m02, m10, m11; + + m00 = slerp(m1, m2, t); + m01 = slerp(m2, m3, t); + m02 = slerp(m3, m4, t); + + m10 = slerp(m00, m01, t); + m11 = slerp(m01, m02, t); + + return slerp(m10, m11, t); +} + +typedef Quat Quats; +typedef Quat Quatd; + +} // namespace math +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif //OPENVDB_MATH_QUAT_H_HAS_BEEN_INCLUDED + +// --------------------------------------------------------------------------- +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/math/Ray.h b/nuparu/include/openvdb/include/openvdb/math/Ray.h new file mode 100644 index 00000000..00bc0e27 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/math/Ray.h @@ -0,0 +1,342 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file Ray.h +/// +/// @author Ken Museth +/// +/// @brief A Ray class. + +#ifndef OPENVDB_MATH_RAY_HAS_BEEN_INCLUDED +#define OPENVDB_MATH_RAY_HAS_BEEN_INCLUDED + +#include "Math.h" +#include "Vec3.h" +#include "Transform.h" +#include // for std::ostream +#include +#include // for std::numeric_limits::max() + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace math { + +template +class Ray +{ +public: + BOOST_STATIC_ASSERT(boost::is_floating_point::value); + typedef RealT RealType; + typedef Vec3 Vec3Type; + typedef Vec3Type Vec3T; + struct TimeSpan { + RealT t0, t1; + /// @brief Default constructor + TimeSpan() {} + /// @brief Constructor + TimeSpan(RealT _t0, RealT _t1) : t0(_t0), t1(_t1) {} + /// @brief Set both times + inline void set(RealT _t0, RealT _t1) { t0=_t0; t1=_t1; } + /// @brief Get both times + inline void get(RealT& _t0, RealT& _t1) const { _t0=t0; _t1=t1; } + /// @brief Return @c true if t1 is larger than t0 by at least eps. + inline bool valid(RealT eps=math::Delta::value()) const { return (t1-t0)>eps; } + /// @brief Return the midpoint of the ray. + inline RealT mid() const { return 0.5*(t0 + t1); } + /// @brief Multiplies both times + inline void scale(RealT s) {assert(s>0); t0*=s; t1*=s; } + /// @brief Return @c true if time is inclusive + inline bool test(RealT t) const { return (t>=t0 && t<=t1); } + }; + + Ray(const Vec3Type& eye = Vec3Type(0,0,0), + const Vec3Type& direction = Vec3Type(1,0,0), + RealT t0 = math::Delta::value(), + RealT t1 = std::numeric_limits::max()) + : mEye(eye), mDir(direction), mInvDir(1/mDir), mTimeSpan(t0, t1) + { + } + + inline void setEye(const Vec3Type& eye) { mEye = eye; } + + inline void setDir(const Vec3Type& dir) + { + mDir = dir; + mInvDir = 1/mDir; + } + + inline void setMinTime(RealT t0) { assert(t0>0); mTimeSpan.t0 = t0; } + + inline void setMaxTime(RealT t1) { assert(t1>0); mTimeSpan.t1 = t1; } + + inline void setTimes(RealT t0 = math::Delta::value(), + RealT t1 = std::numeric_limits::max()) + { + assert(t0>0 && t1>0); + mTimeSpan.set(t0, t1); + } + + inline void scaleTimes(RealT scale) { mTimeSpan.scale(scale); } + + inline void reset(const Vec3Type& eye, + const Vec3Type& direction, + RealT t0 = math::Delta::value(), + RealT t1 = std::numeric_limits::max()) + { + this->setEye(eye); + this->setDir(direction); + this->setTimes(t0, t1); + } + + inline const Vec3T& eye() const {return mEye;} + + inline const Vec3T& dir() const {return mDir;} + + inline const Vec3T& invDir() const {return mInvDir;} + + inline RealT t0() const {return mTimeSpan.t0;} + + inline RealT t1() const {return mTimeSpan.t1;} + + /// @brief Return the position along the ray at the specified time. + inline Vec3R operator()(RealT time) const { return mEye + mDir * time; } + + /// @brief Return the starting point of the ray. + inline Vec3R start() const { return (*this)(mTimeSpan.t0); } + + /// @brief Return the endpoint of the ray. + inline Vec3R end() const { return (*this)(mTimeSpan.t1); } + + /// @brief Return the midpoint of the ray. + inline Vec3R mid() const { return (*this)(mTimeSpan.mid()); } + + /// @brief Return @c true if t0 is strictly less than t1. + OPENVDB_DEPRECATED inline bool test() const { return mTimeSpan.valid(RealT(0)); } + + /// @brief Return @c true if t1 is larger than t0 by at least eps. + inline bool valid(RealT eps=math::Delta::value()) const + { + return mTimeSpan.valid(eps); + } + + /// @brief Return @c true if @a time is within t0 and t1, both inclusive. + inline bool test(RealT time) const { return mTimeSpan.test(time); } + + /// @brief Return a new Ray that is transformed with the specified map. + /// @param map the map from which to construct the new Ray. + /// @warning Assumes a linear map and a normalized direction. + /// @details The requirement that the direction is normalized + /// follows from the transformation of t0 and t1 - and that fact that + /// we want applyMap and applyInverseMap to be inverse operations. + template + inline Ray applyMap(const MapType& map) const + { + assert(map.isLinear()); + assert(math::isRelOrApproxEqual(mDir.length(), RealT(1), Tolerance::value(), Delta::value())); + const Vec3T eye = map.applyMap(mEye); + const Vec3T dir = map.applyJacobian(mDir); + const RealT length = dir.length(); + return Ray(eye, dir/length, length*mTimeSpan.t0, length*mTimeSpan.t1); + } + + /// @brief Return a new Ray that is transformed with the inverse of the specified map. + /// @param map the map from which to construct the new Ray by inverse mapping. + /// @warning Assumes a linear map and a normalized direction. + /// @details The requirement that the direction is normalized + /// follows from the transformation of t0 and t1 - and that fact that + /// we want applyMap and applyInverseMap to be inverse operations. + template + inline Ray applyInverseMap(const MapType& map) const + { + assert(map.isLinear()); + assert(math::isRelOrApproxEqual(mDir.length(), RealT(1), Tolerance::value(), Delta::value())); + const Vec3T eye = map.applyInverseMap(mEye); + const Vec3T dir = map.applyInverseJacobian(mDir); + const RealT length = dir.length(); + return Ray(eye, dir/length, length*mTimeSpan.t0, length*mTimeSpan.t1); + } + + /// @brief Return a new ray in world space, assuming the existing + /// ray is represented in the index space of the specified grid. + template + inline Ray indexToWorld(const GridType& grid) const + { + return this->applyMap(*(grid.transform().baseMap())); + } + + /// @brief Return a new ray in the index space of the specified + /// grid, assuming the existing ray is represented in world space. + template + inline Ray worldToIndex(const GridType& grid) const + { + return this->applyInverseMap(*(grid.transform().baseMap())); + } + + /// @brief Return true if this ray intersects the specified sphere. + /// @param center The center of the sphere in the same space as this ray. + /// @param radius The radius of the sphere in the same units as this ray. + /// @param t0 The first intersection point if an intersection exists. + /// @param t1 The second intersection point if an intersection exists. + /// @note If the return value is true, i.e. a hit, and t0 = + /// this->t0() or t1 == this->t1() only one true intersection exist. + inline bool intersects(const Vec3T& center, RealT radius, RealT& t0, RealT& t1) const + { + const Vec3T origin = mEye - center; + const RealT A = mDir.lengthSqr(); + const RealT B = 2 * mDir.dot(origin); + const RealT C = origin.lengthSqr() - radius * radius; + const RealT D = B * B - 4 * A * C; + + if (D < 0) return false; + + const RealT Q = RealT(-0.5)*(B<0 ? (B + Sqrt(D)) : (B - Sqrt(D))); + + t0 = Q / A; + t1 = C / Q; + + if (t0 > t1) std::swap(t0, t1); + if (t0 < mTimeSpan.t0) t0 = mTimeSpan.t0; + if (t1 > mTimeSpan.t1) t1 = mTimeSpan.t1; + return t0 <= t1; + } + + /// @brief Return true if this ray intersects the specified sphere. + /// @param center The center of the sphere in the same space as this ray. + /// @param radius The radius of the sphere in the same units as this ray. + inline bool intersects(const Vec3T& center, RealT radius) const + { + RealT t0, t1; + return this->intersects(center, radius, t0, t1)>0; + } + + /// @brief Return true if this ray intersects the specified sphere. + /// @note For intersection this ray is clipped to the two intersection points. + /// @param center The center of the sphere in the same space as this ray. + /// @param radius The radius of the sphere in the same units as this ray. + inline bool clip(const Vec3T& center, RealT radius) + { + RealT t0, t1; + const bool hit = this->intersects(center, radius, t0, t1); + if (hit) mTimeSpan.set(t0, t1); + return hit; + } + + /// @brief Return true if the Ray intersects the specified + /// axisaligned bounding box. + /// @param bbox Axis-aligned bounding box in the same space as the Ray. + /// @param t0 If an intersection is detected this is assigned + /// the time for the first intersection point. + /// @param t1 If an intersection is detected this is assigned + /// the time for the second intersection point. + template + inline bool intersects(const BBoxT& bbox, RealT& t0, RealT& t1) const + { + mTimeSpan.get(t0, t1); + for (int i = 0; i < 3; ++i) { + RealT a = (bbox.min()[i] - mEye[i]) * mInvDir[i]; + RealT b = (bbox.max()[i] - mEye[i]) * mInvDir[i]; + if (a > b) std::swap(a, b); + if (a > t0) t0 = a; + if (b < t1) t1 = b; + if (t0 > t1) return false; + } + return true; + } + + /// @brief Return true if this ray intersects the specified bounding box. + /// @param bbox Axis-aligned bounding box in the same space as this ray. + template + inline bool intersects(const BBoxT& bbox) const + { + RealT t0, t1; + return this->intersects(bbox, t0, t1); + } + + /// @brief Return true if this ray intersects the specified bounding box. + /// @note For intersection this ray is clipped to the two intersection points. + /// @param bbox Axis-aligned bounding box in the same space as this ray. + template + inline bool clip(const BBoxT& bbox) + { + RealT t0, t1; + const bool hit = this->intersects(bbox, t0, t1); + if (hit) mTimeSpan.set(t0, t1); + return hit; + } + + /// @brief Return true if the Ray intersects the plane specified + /// by a normal and distance from the origin. + /// @param normal Normal of the plane. + /// @param distance Distance of the plane to the origin. + /// @param t Time of intersection, if one exists. + inline bool intersects(const Vec3T& normal, RealT distance, RealT& t) const + { + const RealT cosAngle = mDir.dot(normal); + if (math::isApproxZero(cosAngle)) return false;//parallel + t = (distance - mEye.dot(normal))/cosAngle; + return this->test(t); + } + + /// @brief Return true if the Ray intersects the plane specified + /// by a normal and point. + /// @param normal Normal of the plane. + /// @param point Point in the plane. + /// @param t Time of intersection, if one exists. + inline bool intersects(const Vec3T& normal, const Vec3T& point, RealT& t) const + { + return this->intersects(normal, point.dot(normal), t); + } + +private: + Vec3T mEye, mDir, mInvDir; + TimeSpan mTimeSpan; +}; // end of Ray class + +/// @brief Output streaming of the Ray class. +/// @note Primarily intended for debugging. +template +inline std::ostream& operator<<(std::ostream& os, const Ray& r) +{ + os << "eye=" << r.eye() << " dir=" << r.dir() << " 1/dir="< // for ostringstream +#include +#include +#include +#include +#include +#include // for std::less +#include "Math.h" + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace math { + +/// @brief Templated class to compute the minimum and maximum values. +template > +class MinMax +{ +public: + + /// @brief Constructor + MinMax(const ValueType &min, const ValueType &max) : mMin(min), mMax(max) + { + } + + /// Add a single sample. + inline void add(const ValueType &val, const Less &less = Less()) + { + if (less(val, mMin)) mMin = val; + if (less(mMax, val)) mMax = val; + } + + /// Return the minimum value. + inline const ValueType& min() const { return mMin; } + + /// Return the maximum value. + inline const ValueType& max() const { return mMax; } + + /// Add the samples from the other Stats instance. + inline void add(const MinMax& other, const Less &less = Less()) + { + if (less(other.mMin, mMin)) mMin = other.mMin; + if (less(mMax, other.mMax)) mMax = other.mMax; + } + + /// @brief Print MinMax to the specified output stream. + void print(const std::string &name= "", std::ostream &strm=std::cout, int precision=3) const + { + // Write to a temporary string stream so as not to affect the state + // (precision, field width, etc.) of the output stream. + std::ostringstream os; + os << std::setprecision(precision) << std::setiosflags(std::ios::fixed); + os << "MinMax "; + if (!name.empty()) os << "for \"" << name << "\" "; + os << " Min=" << mMin << ", Max=" << mMax << std::endl; + strm << os.str(); + } + +protected: + + ValueType mMin, mMax; +};//end MinMax + +/// @brief This class computes the minimum and maximum values of a population +/// of floating-point values. +class Extrema +{ +public: + + /// @brief Constructor + /// @warning The min/max values are initiated to extreme values + Extrema() + : mSize(0) + , mMin(std::numeric_limits::max()) + , mMax(-mMin) + { + } + + /// Add a single sample. + void add(double val) + { + ++mSize; + mMin = std::min(val, mMin); + mMax = std::max(val, mMax); + } + + /// Add @a n samples with constant value @a val. + void add(double val, uint64_t n) + { + mSize += n; + mMin = std::min(val, mMin); + mMax = std::max(val, mMax); + } + + /// Return the size of the population, i.e., the total number of samples. + inline uint64_t size() const { return mSize; } + + /// Return the minimum value. + inline double min() const { return mMin; } + + /// Return the maximum value. + inline double max() const { return mMax; } + + /// Return the range defined as the maximum value minus the minimum value. + inline double range() const { return mMax - mMin; } + + /// Add the samples from the other Stats instance. + void add(const Extrema& other) + { + if (other.mSize > 0) this->join(other); + } + + /// @brief Print extrema to the specified output stream. + void print(const std::string &name= "", std::ostream &strm=std::cout, int precision=3) const + { + // Write to a temporary string stream so as not to affect the state + // (precision, field width, etc.) of the output stream. + std::ostringstream os; + os << std::setprecision(precision) << std::setiosflags(std::ios::fixed); + os << "Extrema "; + if (!name.empty()) os << "for \"" << name << "\" "; + if (mSize>0) { + os << "with " << mSize << " samples:\n" + << " Min=" << mMin + << ", Max=" << mMax + << ", Range="<< this->range() << std::endl; + } else { + os << ": no samples were added." << std::endl; + } + strm << os.str(); + } + +protected: + + inline void join(const Extrema& other) + { + assert(other.mSize > 0); + mSize += other.mSize; + mMin = std::min(mMin, other.mMin); + mMax = std::max(mMax, other.mMax); + } + + uint64_t mSize; + double mMin, mMax; +};//end Extrema + + +/// @brief This class computes statistics (minimum value, maximum +/// value, mean, variance and standard deviation) of a population +/// of floating-point values. +/// +/// @details variance = Mean[ (X-Mean[X])^2 ] = Mean[X^2] - Mean[X]^2, +/// standard deviation = sqrt(variance) +/// +/// @note This class employs incremental computation and double precision. +class Stats : public Extrema +{ +public: + Stats() + : Extrema() + , mAvg(0.0) + , mAux(0.0) + { + } + + /// Add a single sample. + void add(double val) + { + Extrema::add(val); + const double delta = val - mAvg; + mAvg += delta/double(mSize); + mAux += delta*(val - mAvg); + } + + /// Add @a n samples with constant value @a val. + void add(double val, uint64_t n) + { + const double denom = 1.0/double(mSize + n); + const double delta = val - mAvg; + mAvg += denom * delta * double(n); + mAux += denom * delta * delta * double(mSize) * double(n); + Extrema::add(val, n); + } + + /// Add the samples from the other Stats instance. + void add(const Stats& other) + { + if (other.mSize > 0) { + const double denom = 1.0/double(mSize + other.mSize); + const double delta = other.mAvg - mAvg; + mAvg += denom * delta * double(other.mSize); + mAux += other.mAux + denom * delta * delta * double(mSize) * double(other.mSize); + Extrema::join(other); + } + } + + //@{ + /// Return the arithmetic mean, i.e. average, value. + inline double avg() const { return mAvg; } + inline double mean() const { return mAvg; } + //@} + + //@{ + /// @brief Return the population variance. + /// @note The unbiased sample variance = population variance * + //num/(num-1) + inline double var() const { return mSize<2 ? 0.0 : mAux/double(mSize); } + inline double variance() const { return this->var(); } + //@} + + //@{ + /// @brief Return the standard deviation (=Sqrt(variance)) as + /// defined from the (biased) population variance. + inline double std() const { return sqrt(this->var()); } + inline double stdDev() const { return this->std(); } + //@} + + /// @brief Print statistics to the specified output stream. + void print(const std::string &name= "", std::ostream &strm=std::cout, int precision=3) const + { + // Write to a temporary string stream so as not to affect the state + // (precision, field width, etc.) of the output stream. + std::ostringstream os; + os << std::setprecision(precision) << std::setiosflags(std::ios::fixed); + os << "Statistics "; + if (!name.empty()) os << "for \"" << name << "\" "; + if (mSize>0) { + os << "with " << mSize << " samples:\n" + << " Min=" << mMin + << ", Max=" << mMax + << ", Ave=" << mAvg + << ", Std=" << this->stdDev() + << ", Var=" << this->variance() << std::endl; + } else { + os << ": no samples were added." << std::endl; + } + strm << os.str(); + } + +protected: + using Extrema::mSize; + using Extrema::mMin; + using Extrema::mMax; + double mAvg, mAux; +}; // end Stats + + +//////////////////////////////////////// + + +/// @brief This class computes a histogram, with a fixed interval width, +/// of a population of floating-point values. +class Histogram +{ +public: + /// Construct with given minimum and maximum values and the given bin count. + Histogram(double min, double max, size_t numBins = 10) + : mSize(0), mMin(min), mMax(max + 1e-10), + mDelta(double(numBins)/(max-min)), mBins(numBins) + { + if ( mMax <= mMin ) { + OPENVDB_THROW(ValueError, "Histogram: expected min < max"); + } else if ( numBins == 0 ) { + OPENVDB_THROW(ValueError, "Histogram: expected at least one bin"); + } + for (size_t i=0; imMax) return false; + mBins[size_t(mDelta*(val-mMin))] += n; + mSize += n; + return true; + } + + /// @brief Add all the contributions from the other histogram, provided that + /// it has the same configuration as this histogram. + bool add(const Histogram& other) + { + if (!isApproxEqual(mMin, other.mMin) || !isApproxEqual(mMax, other.mMax) || + mBins.size() != other.mBins.size()) return false; + for (size_t i=0, e=mBins.size(); i!=e; ++i) mBins[i] += other.mBins[i]; + mSize += other.mSize; + return true; + } + + /// Return the number of bins in this histogram. + inline size_t numBins() const { return mBins.size(); } + /// Return the lower bound of this histogram's value range. + inline double min() const { return mMin; } + /// Return the upper bound of this histogram's value range. + inline double max() const { return mMax; } + /// Return the minimum value in the nth bin. + inline double min(int n) const { return mMin+n/mDelta; } + /// Return the maximum value in the nth bin. + inline double max(int n) const { return mMin+(n+1)/mDelta; } + /// Return the number of samples in the nth bin. + inline uint64_t count(int n) const { return mBins[n]; } + /// Return the population size, i.e., the total number of samples. + inline uint64_t size() const { return mSize; } + + /// Print the histogram to the specified output stream. + void print(const std::string& name = "", std::ostream& strm = std::cout) const + { + // Write to a temporary string stream so as not to affect the state + // (precision, field width, etc.) of the output stream. + std::ostringstream os; + os << std::setprecision(6) << std::setiosflags(std::ios::fixed) << std::endl; + os << "Histogram "; + if (!name.empty()) os << "for \"" << name << "\" "; + if (mSize > 0) { + os << "with " << mSize << " samples:\n"; + os << "==============================================================\n"; + os << "|| # | Min | Max | Frequency | % ||\n"; + os << "==============================================================\n"; + for (int i = 0, e = int(mBins.size()); i != e; ++i) { + os << "|| " << std::setw(4) << i << " | " << std::setw(14) << this->min(i) << " | " + << std::setw(14) << this->max(i) << " | " << std::setw(9) << mBins[i] << " | " + << std::setw(3) << (100*mBins[i]/mSize) << " ||\n"; + } + os << "==============================================================\n"; + } else { + os << ": no samples were added." << std::endl; + } + strm << os.str(); + } + +private: + uint64_t mSize; + double mMin, mMax, mDelta; + std::vector mBins; +}; + +} // namespace math +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_MATH_STATS_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/math/Stencils.h b/nuparu/include/openvdb/include/openvdb/math/Stencils.h new file mode 100644 index 00000000..dcdc7508 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/math/Stencils.h @@ -0,0 +1,1680 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @author Ken Museth +/// +/// @file Stencils.h +/// +/// @brief Defines various finite difference stencils by means of the +/// "curiously recurring template pattern" on a BaseStencil +/// that caches stencil values and stores a ValueAccessor for +/// fast lookup. + +#ifndef OPENVDB_MATH_STENCILS_HAS_BEEN_INCLUDED +#define OPENVDB_MATH_STENCILS_HAS_BEEN_INCLUDED + +#include +#include +#include // for Pow2, needed by WENO and Godunov +#include // for Real +#include // for Coord +#include // for WENO5 and GodunovsNormSqrd +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace math { + + +//////////////////////////////////////// + +template +class BaseStencil +{ +public: + typedef GridT GridType; + typedef typename GridT::TreeType TreeType; + typedef typename GridT::ValueType ValueType; + typedef tree::ValueAccessor AccessorType; + typedef std::vector BufferType; + typedef typename BufferType::iterator IterType; + + /// @brief Initialize the stencil buffer with the values of voxel (i, j, k) + /// and its neighbors. + /// @param ijk Index coordinates of stencil center + inline void moveTo(const Coord& ijk) + { + mCenter = ijk; + mStencil[0] = mCache.getValue(ijk); + static_cast(*this).init(mCenter); + } + + /// @brief Initialize the stencil buffer with the values of voxel (i, j, k) + /// and its neighbors. The method also takes a value of the center + /// element of the stencil, assuming it is already known. + /// @param ijk Index coordinates of stnecil center + /// @param centerValue Value of the center element of the stencil + inline void moveTo(const Coord& ijk, const ValueType& centerValue) + { + mCenter = ijk; + mStencil[0] = centerValue; + static_cast(*this).init(mCenter); + } + + /// @brief Initialize the stencil buffer with the values of voxel + /// (x, y, z) and its neighbors. + /// + /// @note This version is slightly faster than the one above, since + /// the center voxel's value is read directly from the iterator. + template + inline void moveTo(const IterType& iter) + { + mCenter = iter.getCoord(); + mStencil[0] = *iter; + static_cast(*this).init(mCenter); + } + + /// @brief Initialize the stencil buffer with the values of voxel (x, y, z) + /// and its neighbors. + /// @param xyz Floating point voxel coordinates of stencil center + /// @details This method will check to see if it is necessary to + /// update the stencil based on the cached index coordinates of + /// the center point. + inline void moveTo(const Vec3R& xyz) + { + Coord ijk = openvdb::Coord::floor(xyz); + if (ijk != mCenter) this->moveTo(ijk); + } + + /// @brief Return the value from the stencil buffer with linear + /// offset pos. + /// + /// @note The default (@a pos = 0) corresponds to the first element + /// which is typically the center point of the stencil. + inline const ValueType& getValue(unsigned int pos = 0) const + { + assert(pos < mStencil.size()); + return mStencil[pos]; + } + + /// @brief Return the value at the specified location relative to the center of the stencil + template + inline const ValueType& getValue() const + { + return mStencil[static_cast(*this).template pos()]; + } + + /// @brief Set the value at the specified location relative to the center of the stencil + template + inline void setValue(const ValueType& value) + { + mStencil[static_cast(*this).template pos()] = value; + } + + /// @brief Return the size of the stencil buffer. + inline int size() { return mStencil.size(); } + + /// @brief Return the median value of the current stencil. + inline ValueType median() const + { + BufferType tmp(mStencil);//local copy + assert(!tmp.empty()); + size_t midpoint = (tmp.size() - 1) >> 1; + // Partially sort the vector until the median value is at the midpoint. + std::nth_element(tmp.begin(), tmp.begin() + midpoint, tmp.end()); + return tmp[midpoint]; + } + + /// @brief Return the mean value of the current stencil. + inline ValueType mean() const + { + ValueType sum = 0.0; + for (int n = 0, s = int(mStencil.size()); n < s; ++n) sum += mStencil[n]; + return sum / mStencil.size(); + } + + /// @brief Return the smallest value in the stencil buffer. + inline ValueType min() const + { + IterType iter = std::min_element(mStencil.begin(), mStencil.end()); + return *iter; + } + + /// @brief Return the largest value in the stencil buffer. + inline ValueType max() const + { + IterType iter = std::max_element(mStencil.begin(), mStencil.end()); + return *iter; + } + + /// @brief Return the coordinates of the center point of the stencil. + inline const Coord& getCenterCoord() const { return mCenter; } + + /// @brief Return the value at the center of the stencil + inline const ValueType& getCenterValue() const { return mStencil[0]; } + + /// @brief Return true if the center of the stencil intersects the + /// iso-contour specified by the isoValue + inline bool intersects(const ValueType &isoValue = zeroVal()) const + { + const bool less = this->getValue< 0, 0, 0>() < isoValue; + return (less ^ (this->getValue<-1, 0, 0>() < isoValue)) || + (less ^ (this->getValue< 1, 0, 0>() < isoValue)) || + (less ^ (this->getValue< 0,-1, 0>() < isoValue)) || + (less ^ (this->getValue< 0, 1, 0>() < isoValue)) || + (less ^ (this->getValue< 0, 0,-1>() < isoValue)) || + (less ^ (this->getValue< 0, 0, 1>() < isoValue)) ; + } + + /// @brief Return a const reference to the grid from which this + /// stencil was constructed. + inline const GridType& grid() const { return *mGrid; } + + /// @brief Return a const reference to the ValueAccessor + /// associated with this Stencil. + inline const AccessorType& accessor() const { return mCache; } + +protected: + // Constructor is protected to prevent direct instantiation. + BaseStencil(const GridType& grid, int size) + : mGrid(&grid) + , mCache(grid.tree()) + , mStencil(size) + , mCenter(Coord::max()) + { + } + + const GridType* mGrid; + AccessorType mCache; + BufferType mStencil; + Coord mCenter; + +}; // BaseStencil class + + +//////////////////////////////////////// + + +namespace { // anonymous namespace for stencil-layout map + + // the seven point stencil + template struct SevenPt {}; + template<> struct SevenPt< 0, 0, 0> { enum { idx = 0 }; }; + template<> struct SevenPt< 1, 0, 0> { enum { idx = 1 }; }; + template<> struct SevenPt< 0, 1, 0> { enum { idx = 2 }; }; + template<> struct SevenPt< 0, 0, 1> { enum { idx = 3 }; }; + template<> struct SevenPt<-1, 0, 0> { enum { idx = 4 }; }; + template<> struct SevenPt< 0,-1, 0> { enum { idx = 5 }; }; + template<> struct SevenPt< 0, 0,-1> { enum { idx = 6 }; }; + +} + + +template +class SevenPointStencil: public BaseStencil, GridT, IsSafe> +{ + typedef SevenPointStencil SelfT; + typedef BaseStencil BaseType; +public: + typedef GridT GridType; + typedef typename GridT::TreeType TreeType; + typedef typename GridT::ValueType ValueType; + + static const int SIZE = 7; + + SevenPointStencil(const GridT& grid): BaseType(grid, SIZE) {} + + /// Return linear offset for the specified stencil point relative to its center + template + unsigned int pos() const { return SevenPt::idx; } + +private: + inline void init(const Coord& ijk) + { + BaseType::template setValue<-1, 0, 0>(mCache.getValue(ijk.offsetBy(-1, 0, 0))); + BaseType::template setValue< 1, 0, 0>(mCache.getValue(ijk.offsetBy( 1, 0, 0))); + + BaseType::template setValue< 0,-1, 0>(mCache.getValue(ijk.offsetBy( 0,-1, 0))); + BaseType::template setValue< 0, 1, 0>(mCache.getValue(ijk.offsetBy( 0, 1, 0))); + + BaseType::template setValue< 0, 0,-1>(mCache.getValue(ijk.offsetBy( 0, 0,-1))); + BaseType::template setValue< 0, 0, 1>(mCache.getValue(ijk.offsetBy( 0, 0, 1))); + } + + template friend class BaseStencil; // allow base class to call init() + using BaseType::mCache; + using BaseType::mStencil; +};// SevenPointStencil class + + +//////////////////////////////////////// + + +namespace { // anonymous namespace for stencil-layout map + + // the eight point box stencil + template struct BoxPt {}; + template<> struct BoxPt< 0, 0, 0> { enum { idx = 0 }; }; + template<> struct BoxPt< 0, 0, 1> { enum { idx = 1 }; }; + template<> struct BoxPt< 0, 1, 1> { enum { idx = 2 }; }; + template<> struct BoxPt< 0, 1, 0> { enum { idx = 3 }; }; + template<> struct BoxPt< 1, 0, 0> { enum { idx = 4 }; }; + template<> struct BoxPt< 1, 0, 1> { enum { idx = 5 }; }; + template<> struct BoxPt< 1, 1, 1> { enum { idx = 6 }; }; + template<> struct BoxPt< 1, 1, 0> { enum { idx = 7 }; }; +} + +template +class BoxStencil: public BaseStencil, GridT, IsSafe> +{ + typedef BoxStencil SelfT; + typedef BaseStencil BaseType; +public: + typedef GridT GridType; + typedef typename GridT::TreeType TreeType; + typedef typename GridT::ValueType ValueType; + + static const int SIZE = 8; + + BoxStencil(const GridType& grid): BaseType(grid, SIZE) {} + + /// Return linear offset for the specified stencil point relative to its center + template + unsigned int pos() const { return BoxPt::idx; } + + /// @brief Return true if the center of the stencil intersects the + /// iso-contour specified by the isoValue + inline bool intersects(const ValueType &isoValue = zeroVal()) const + { + const bool less = mStencil[0] < isoValue; + return (less ^ (mStencil[1] < isoValue)) || + (less ^ (mStencil[2] < isoValue)) || + (less ^ (mStencil[3] < isoValue)) || + (less ^ (mStencil[4] < isoValue)) || + (less ^ (mStencil[5] < isoValue)) || + (less ^ (mStencil[6] < isoValue)) || + (less ^ (mStencil[7] < isoValue)) ; + } + + /// @brief Return the trilinear interpolation at the normalized position. + /// @param xyz Floating point coordinate position. + /// @warning It is assumed that the stencil has already been moved + /// to the relevant voxel position, e.g. using moveTo(xyz). + /// @note Trilinear interpolation kernal reads as: + /// v000 (1-u)(1-v)(1-w) + v001 (1-u)(1-v)w + v010 (1-u)v(1-w) + v011 (1-u)vw + /// + v100 u(1-v)(1-w) + v101 u(1-v)w + v110 uv(1-w) + v111 uvw + inline ValueType interpolation(const math::Vec3& xyz) const + { + const Real u = xyz[0] - BaseType::mCenter[0]; assert(u>=0 && u<=1); + const Real v = xyz[1] - BaseType::mCenter[1]; assert(v>=0 && v<=1); + const Real w = xyz[2] - BaseType::mCenter[2]; assert(w>=0 && w<=1); + + ValueType V = BaseType::template getValue<0,0,0>(); + ValueType A = static_cast(V + (BaseType::template getValue<0,0,1>() - V) * w); + V = BaseType::template getValue< 0, 1, 0>(); + ValueType B = static_cast(V + (BaseType::template getValue<0,1,1>() - V) * w); + ValueType C = static_cast(A + (B - A) * v); + + V = BaseType::template getValue<1,0,0>(); + A = static_cast(V + (BaseType::template getValue<1,0,1>() - V) * w); + V = BaseType::template getValue<1,1,0>(); + B = static_cast(V + (BaseType::template getValue<1,1,1>() - V) * w); + ValueType D = static_cast(A + (B - A) * v); + + return static_cast(C + (D - C) * u); + } + + /// @brief Return the gradient in world space of the trilinear interpolation kernel. + /// @param xyz Floating point coordinate position. + /// @warning It is assumed that the stencil has already been moved + /// to the relevant voxel position, e.g. using moveTo(xyz). + /// @note Computed as partial derivatives of the trilinear interpolation kernel: + /// v000 (1-u)(1-v)(1-w) + v001 (1-u)(1-v)w + v010 (1-u)v(1-w) + v011 (1-u)vw + /// + v100 u(1-v)(1-w) + v101 u(1-v)w + v110 uv(1-w) + v111 uvw + inline math::Vec3 gradient(const math::Vec3& xyz) const + { + const Real u = xyz[0] - BaseType::mCenter[0]; assert(u>=0 && u<=1); + const Real v = xyz[1] - BaseType::mCenter[1]; assert(v>=0 && v<=1); + const Real w = xyz[2] - BaseType::mCenter[2]; assert(w>=0 && w<=1); + + ValueType D[4]={BaseType::template getValue<0,0,1>()-BaseType::template getValue<0,0,0>(), + BaseType::template getValue<0,1,1>()-BaseType::template getValue<0,1,0>(), + BaseType::template getValue<1,0,1>()-BaseType::template getValue<1,0,0>(), + BaseType::template getValue<1,1,1>()-BaseType::template getValue<1,1,0>()}; + + // Z component + ValueType A = static_cast(D[0] + (D[1]- D[0]) * v); + ValueType B = static_cast(D[2] + (D[3]- D[2]) * v); + math::Vec3 grad(zeroVal(), + zeroVal(), + static_cast(A + (B - A) * u)); + + D[0] = static_cast(BaseType::template getValue<0,0,0>() + D[0] * w); + D[1] = static_cast(BaseType::template getValue<0,1,0>() + D[1] * w); + D[2] = static_cast(BaseType::template getValue<1,0,0>() + D[2] * w); + D[3] = static_cast(BaseType::template getValue<1,1,0>() + D[3] * w); + + // X component + A = static_cast(D[0] + (D[1] - D[0]) * v); + B = static_cast(D[2] + (D[3] - D[2]) * v); + + grad[0] = B - A; + + // Y component + A = D[1] - D[0]; + B = D[3] - D[2]; + + grad[1] = static_cast(A + (B - A) * u); + + return BaseType::mGrid->transform().baseMap()->applyIJT(grad, xyz); + } + +private: + inline void init(const Coord& ijk) + { + BaseType::template setValue< 0, 0, 1>(mCache.getValue(ijk.offsetBy( 0, 0, 1))); + BaseType::template setValue< 0, 1, 1>(mCache.getValue(ijk.offsetBy( 0, 1, 1))); + BaseType::template setValue< 0, 1, 0>(mCache.getValue(ijk.offsetBy( 0, 1, 0))); + BaseType::template setValue< 1, 0, 0>(mCache.getValue(ijk.offsetBy( 1, 0, 0))); + BaseType::template setValue< 1, 0, 1>(mCache.getValue(ijk.offsetBy( 1, 0, 1))); + BaseType::template setValue< 1, 1, 1>(mCache.getValue(ijk.offsetBy( 1, 1, 1))); + BaseType::template setValue< 1, 1, 0>(mCache.getValue(ijk.offsetBy( 1, 1, 0))); + } + + template friend class BaseStencil; // allow base class to call init() + using BaseType::mCache; + using BaseType::mStencil; +};// BoxStencil class + + +//////////////////////////////////////// + + +namespace { // anonymous namespace for stencil-layout map + + // the dense point stencil + template struct DensePt {}; + template<> struct DensePt< 0, 0, 0> { enum { idx = 0 }; }; + + template<> struct DensePt< 1, 0, 0> { enum { idx = 1 }; }; + template<> struct DensePt< 0, 1, 0> { enum { idx = 2 }; }; + template<> struct DensePt< 0, 0, 1> { enum { idx = 3 }; }; + + template<> struct DensePt<-1, 0, 0> { enum { idx = 4 }; }; + template<> struct DensePt< 0,-1, 0> { enum { idx = 5 }; }; + template<> struct DensePt< 0, 0,-1> { enum { idx = 6 }; }; + + template<> struct DensePt<-1,-1, 0> { enum { idx = 7 }; }; + template<> struct DensePt< 0,-1,-1> { enum { idx = 8 }; }; + template<> struct DensePt<-1, 0,-1> { enum { idx = 9 }; }; + + template<> struct DensePt< 1,-1, 0> { enum { idx = 10 }; }; + template<> struct DensePt< 0, 1,-1> { enum { idx = 11 }; }; + template<> struct DensePt<-1, 0, 1> { enum { idx = 12 }; }; + + template<> struct DensePt<-1, 1, 0> { enum { idx = 13 }; }; + template<> struct DensePt< 0,-1, 1> { enum { idx = 14 }; }; + template<> struct DensePt< 1, 0,-1> { enum { idx = 15 }; }; + + template<> struct DensePt< 1, 1, 0> { enum { idx = 16 }; }; + template<> struct DensePt< 0, 1, 1> { enum { idx = 17 }; }; + template<> struct DensePt< 1, 0, 1> { enum { idx = 18 }; }; + +} + + +template +class SecondOrderDenseStencil + : public BaseStencil, GridT, IsSafe > +{ + typedef SecondOrderDenseStencil SelfT; + typedef BaseStencil BaseType; +public: + typedef GridT GridType; + typedef typename GridT::TreeType TreeType; + typedef typename GridType::ValueType ValueType; + + static const int SIZE = 19; + + SecondOrderDenseStencil(const GridType& grid): BaseType(grid, SIZE) {} + + /// Return linear offset for the specified stencil point relative to its center + template + unsigned int pos() const { return DensePt::idx; } + +private: + inline void init(const Coord& ijk) + { + mStencil[DensePt< 1, 0, 0>::idx] = mCache.getValue(ijk.offsetBy( 1, 0, 0)); + mStencil[DensePt< 0, 1, 0>::idx] = mCache.getValue(ijk.offsetBy( 0, 1, 0)); + mStencil[DensePt< 0, 0, 1>::idx] = mCache.getValue(ijk.offsetBy( 0, 0, 1)); + + mStencil[DensePt<-1, 0, 0>::idx] = mCache.getValue(ijk.offsetBy(-1, 0, 0)); + mStencil[DensePt< 0,-1, 0>::idx] = mCache.getValue(ijk.offsetBy( 0, -1, 0)); + mStencil[DensePt< 0, 0,-1>::idx] = mCache.getValue(ijk.offsetBy( 0, 0, -1)); + + mStencil[DensePt<-1,-1, 0>::idx] = mCache.getValue(ijk.offsetBy(-1, -1, 0)); + mStencil[DensePt< 1,-1, 0>::idx] = mCache.getValue(ijk.offsetBy( 1, -1, 0)); + mStencil[DensePt<-1, 1, 0>::idx] = mCache.getValue(ijk.offsetBy(-1, 1, 0)); + mStencil[DensePt< 1, 1, 0>::idx] = mCache.getValue(ijk.offsetBy( 1, 1, 0)); + + mStencil[DensePt<-1, 0,-1>::idx] = mCache.getValue(ijk.offsetBy(-1, 0, -1)); + mStencil[DensePt< 1, 0,-1>::idx] = mCache.getValue(ijk.offsetBy( 1, 0, -1)); + mStencil[DensePt<-1, 0, 1>::idx] = mCache.getValue(ijk.offsetBy(-1, 0, 1)); + mStencil[DensePt< 1, 0, 1>::idx] = mCache.getValue(ijk.offsetBy( 1, 0, 1)); + + mStencil[DensePt< 0,-1,-1>::idx] = mCache.getValue(ijk.offsetBy( 0, -1, -1)); + mStencil[DensePt< 0, 1,-1>::idx] = mCache.getValue(ijk.offsetBy( 0, 1, -1)); + mStencil[DensePt< 0,-1, 1>::idx] = mCache.getValue(ijk.offsetBy( 0, -1, 1)); + mStencil[DensePt< 0, 1, 1>::idx] = mCache.getValue(ijk.offsetBy( 0, 1, 1)); + } + + template friend class BaseStencil; // allow base class to call init() + using BaseType::mCache; + using BaseType::mStencil; +};// SecondOrderDenseStencil class + + +//////////////////////////////////////// + + +namespace { // anonymous namespace for stencil-layout map + + // the dense point stencil + template struct ThirteenPt {}; + template<> struct ThirteenPt< 0, 0, 0> { enum { idx = 0 }; }; + + template<> struct ThirteenPt< 1, 0, 0> { enum { idx = 1 }; }; + template<> struct ThirteenPt< 0, 1, 0> { enum { idx = 2 }; }; + template<> struct ThirteenPt< 0, 0, 1> { enum { idx = 3 }; }; + + template<> struct ThirteenPt<-1, 0, 0> { enum { idx = 4 }; }; + template<> struct ThirteenPt< 0,-1, 0> { enum { idx = 5 }; }; + template<> struct ThirteenPt< 0, 0,-1> { enum { idx = 6 }; }; + + template<> struct ThirteenPt< 2, 0, 0> { enum { idx = 7 }; }; + template<> struct ThirteenPt< 0, 2, 0> { enum { idx = 8 }; }; + template<> struct ThirteenPt< 0, 0, 2> { enum { idx = 9 }; }; + + template<> struct ThirteenPt<-2, 0, 0> { enum { idx = 10 }; }; + template<> struct ThirteenPt< 0,-2, 0> { enum { idx = 11 }; }; + template<> struct ThirteenPt< 0, 0,-2> { enum { idx = 12 }; }; + +} + + +template +class ThirteenPointStencil + : public BaseStencil, GridT, IsSafe> +{ + typedef ThirteenPointStencil SelfT; + typedef BaseStencil BaseType; +public: + typedef GridT GridType; + typedef typename GridT::TreeType TreeType; + typedef typename GridType::ValueType ValueType; + + static const int SIZE = 13; + + ThirteenPointStencil(const GridType& grid): BaseType(grid, SIZE) {} + + /// Return linear offset for the specified stencil point relative to its center + template + unsigned int pos() const { return ThirteenPt::idx; } + +private: + inline void init(const Coord& ijk) + { + mStencil[ThirteenPt< 2, 0, 0>::idx] = mCache.getValue(ijk.offsetBy( 2, 0, 0)); + mStencil[ThirteenPt< 1, 0, 0>::idx] = mCache.getValue(ijk.offsetBy( 1, 0, 0)); + mStencil[ThirteenPt<-1, 0, 0>::idx] = mCache.getValue(ijk.offsetBy(-1, 0, 0)); + mStencil[ThirteenPt<-2, 0, 0>::idx] = mCache.getValue(ijk.offsetBy(-2, 0, 0)); + + mStencil[ThirteenPt< 0, 2, 0>::idx] = mCache.getValue(ijk.offsetBy( 0, 2, 0)); + mStencil[ThirteenPt< 0, 1, 0>::idx] = mCache.getValue(ijk.offsetBy( 0, 1, 0)); + mStencil[ThirteenPt< 0,-1, 0>::idx] = mCache.getValue(ijk.offsetBy( 0, -1, 0)); + mStencil[ThirteenPt< 0,-2, 0>::idx] = mCache.getValue(ijk.offsetBy( 0, -2, 0)); + + mStencil[ThirteenPt< 0, 0, 2>::idx] = mCache.getValue(ijk.offsetBy( 0, 0, 2)); + mStencil[ThirteenPt< 0, 0, 1>::idx] = mCache.getValue(ijk.offsetBy( 0, 0, 1)); + mStencil[ThirteenPt< 0, 0,-1>::idx] = mCache.getValue(ijk.offsetBy( 0, 0, -1)); + mStencil[ThirteenPt< 0, 0,-2>::idx] = mCache.getValue(ijk.offsetBy( 0, 0, -2)); + } + + template friend class BaseStencil; // allow base class to call init() + using BaseType::mCache; + using BaseType::mStencil; +};// ThirteenPointStencil class + + +//////////////////////////////////////// + + +namespace { // anonymous namespace for stencil-layout map + + // the 4th-order dense point stencil + template struct FourthDensePt {}; + template<> struct FourthDensePt< 0, 0, 0> { enum { idx = 0 }; }; + + template<> struct FourthDensePt<-2, 2, 0> { enum { idx = 1 }; }; + template<> struct FourthDensePt<-1, 2, 0> { enum { idx = 2 }; }; + template<> struct FourthDensePt< 0, 2, 0> { enum { idx = 3 }; }; + template<> struct FourthDensePt< 1, 2, 0> { enum { idx = 4 }; }; + template<> struct FourthDensePt< 2, 2, 0> { enum { idx = 5 }; }; + + template<> struct FourthDensePt<-2, 1, 0> { enum { idx = 6 }; }; + template<> struct FourthDensePt<-1, 1, 0> { enum { idx = 7 }; }; + template<> struct FourthDensePt< 0, 1, 0> { enum { idx = 8 }; }; + template<> struct FourthDensePt< 1, 1, 0> { enum { idx = 9 }; }; + template<> struct FourthDensePt< 2, 1, 0> { enum { idx = 10 }; }; + + template<> struct FourthDensePt<-2, 0, 0> { enum { idx = 11 }; }; + template<> struct FourthDensePt<-1, 0, 0> { enum { idx = 12 }; }; + template<> struct FourthDensePt< 1, 0, 0> { enum { idx = 13 }; }; + template<> struct FourthDensePt< 2, 0, 0> { enum { idx = 14 }; }; + + template<> struct FourthDensePt<-2,-1, 0> { enum { idx = 15 }; }; + template<> struct FourthDensePt<-1,-1, 0> { enum { idx = 16 }; }; + template<> struct FourthDensePt< 0,-1, 0> { enum { idx = 17 }; }; + template<> struct FourthDensePt< 1,-1, 0> { enum { idx = 18 }; }; + template<> struct FourthDensePt< 2,-1, 0> { enum { idx = 19 }; }; + + template<> struct FourthDensePt<-2,-2, 0> { enum { idx = 20 }; }; + template<> struct FourthDensePt<-1,-2, 0> { enum { idx = 21 }; }; + template<> struct FourthDensePt< 0,-2, 0> { enum { idx = 22 }; }; + template<> struct FourthDensePt< 1,-2, 0> { enum { idx = 23 }; }; + template<> struct FourthDensePt< 2,-2, 0> { enum { idx = 24 }; }; + + + template<> struct FourthDensePt<-2, 0, 2> { enum { idx = 25 }; }; + template<> struct FourthDensePt<-1, 0, 2> { enum { idx = 26 }; }; + template<> struct FourthDensePt< 0, 0, 2> { enum { idx = 27 }; }; + template<> struct FourthDensePt< 1, 0, 2> { enum { idx = 28 }; }; + template<> struct FourthDensePt< 2, 0, 2> { enum { idx = 29 }; }; + + template<> struct FourthDensePt<-2, 0, 1> { enum { idx = 30 }; }; + template<> struct FourthDensePt<-1, 0, 1> { enum { idx = 31 }; }; + template<> struct FourthDensePt< 0, 0, 1> { enum { idx = 32 }; }; + template<> struct FourthDensePt< 1, 0, 1> { enum { idx = 33 }; }; + template<> struct FourthDensePt< 2, 0, 1> { enum { idx = 34 }; }; + + template<> struct FourthDensePt<-2, 0,-1> { enum { idx = 35 }; }; + template<> struct FourthDensePt<-1, 0,-1> { enum { idx = 36 }; }; + template<> struct FourthDensePt< 0, 0,-1> { enum { idx = 37 }; }; + template<> struct FourthDensePt< 1, 0,-1> { enum { idx = 38 }; }; + template<> struct FourthDensePt< 2, 0,-1> { enum { idx = 39 }; }; + + template<> struct FourthDensePt<-2, 0,-2> { enum { idx = 40 }; }; + template<> struct FourthDensePt<-1, 0,-2> { enum { idx = 41 }; }; + template<> struct FourthDensePt< 0, 0,-2> { enum { idx = 42 }; }; + template<> struct FourthDensePt< 1, 0,-2> { enum { idx = 43 }; }; + template<> struct FourthDensePt< 2, 0,-2> { enum { idx = 44 }; }; + + + template<> struct FourthDensePt< 0,-2, 2> { enum { idx = 45 }; }; + template<> struct FourthDensePt< 0,-1, 2> { enum { idx = 46 }; }; + template<> struct FourthDensePt< 0, 1, 2> { enum { idx = 47 }; }; + template<> struct FourthDensePt< 0, 2, 2> { enum { idx = 48 }; }; + + template<> struct FourthDensePt< 0,-2, 1> { enum { idx = 49 }; }; + template<> struct FourthDensePt< 0,-1, 1> { enum { idx = 50 }; }; + template<> struct FourthDensePt< 0, 1, 1> { enum { idx = 51 }; }; + template<> struct FourthDensePt< 0, 2, 1> { enum { idx = 52 }; }; + + template<> struct FourthDensePt< 0,-2,-1> { enum { idx = 53 }; }; + template<> struct FourthDensePt< 0,-1,-1> { enum { idx = 54 }; }; + template<> struct FourthDensePt< 0, 1,-1> { enum { idx = 55 }; }; + template<> struct FourthDensePt< 0, 2,-1> { enum { idx = 56 }; }; + + template<> struct FourthDensePt< 0,-2,-2> { enum { idx = 57 }; }; + template<> struct FourthDensePt< 0,-1,-2> { enum { idx = 58 }; }; + template<> struct FourthDensePt< 0, 1,-2> { enum { idx = 59 }; }; + template<> struct FourthDensePt< 0, 2,-2> { enum { idx = 60 }; }; + +} + + +template +class FourthOrderDenseStencil + : public BaseStencil, GridT, IsSafe> +{ + typedef FourthOrderDenseStencil SelfT; + typedef BaseStencil BaseType; +public: + typedef GridT GridType; + typedef typename GridT::TreeType TreeType; + typedef typename GridType::ValueType ValueType; + + static const int SIZE = 61; + + FourthOrderDenseStencil(const GridType& grid): BaseType(grid, SIZE) {} + + /// Return linear offset for the specified stencil point relative to its center + template + unsigned int pos() const { return FourthDensePt::idx; } + +private: + inline void init(const Coord& ijk) + { + mStencil[FourthDensePt<-2, 2, 0>::idx] = mCache.getValue(ijk.offsetBy(-2, 2, 0)); + mStencil[FourthDensePt<-1, 2, 0>::idx] = mCache.getValue(ijk.offsetBy(-1, 2, 0)); + mStencil[FourthDensePt< 0, 2, 0>::idx] = mCache.getValue(ijk.offsetBy( 0, 2, 0)); + mStencil[FourthDensePt< 1, 2, 0>::idx] = mCache.getValue(ijk.offsetBy( 1, 2, 0)); + mStencil[FourthDensePt< 2, 2, 0>::idx] = mCache.getValue(ijk.offsetBy( 2, 2, 0)); + + mStencil[FourthDensePt<-2, 1, 0>::idx] = mCache.getValue(ijk.offsetBy(-2, 1, 0)); + mStencil[FourthDensePt<-1, 1, 0>::idx] = mCache.getValue(ijk.offsetBy(-1, 1, 0)); + mStencil[FourthDensePt< 0, 1, 0>::idx] = mCache.getValue(ijk.offsetBy( 0, 1, 0)); + mStencil[FourthDensePt< 1, 1, 0>::idx] = mCache.getValue(ijk.offsetBy( 1, 1, 0)); + mStencil[FourthDensePt< 2, 1, 0>::idx] = mCache.getValue(ijk.offsetBy( 2, 1, 0)); + + mStencil[FourthDensePt<-2, 0, 0>::idx] = mCache.getValue(ijk.offsetBy(-2, 0, 0)); + mStencil[FourthDensePt<-1, 0, 0>::idx] = mCache.getValue(ijk.offsetBy(-1, 0, 0)); + mStencil[FourthDensePt< 1, 0, 0>::idx] = mCache.getValue(ijk.offsetBy( 1, 0, 0)); + mStencil[FourthDensePt< 2, 0, 0>::idx] = mCache.getValue(ijk.offsetBy( 2, 0, 0)); + + mStencil[FourthDensePt<-2,-1, 0>::idx] = mCache.getValue(ijk.offsetBy(-2,-1, 0)); + mStencil[FourthDensePt<-1,-1, 0>::idx] = mCache.getValue(ijk.offsetBy(-1,-1, 0)); + mStencil[FourthDensePt< 0,-1, 0>::idx] = mCache.getValue(ijk.offsetBy( 0,-1, 0)); + mStencil[FourthDensePt< 1,-1, 0>::idx] = mCache.getValue(ijk.offsetBy( 1,-1, 0)); + mStencil[FourthDensePt< 2,-1, 0>::idx] = mCache.getValue(ijk.offsetBy( 2,-1, 0)); + + mStencil[FourthDensePt<-2,-2, 0>::idx] = mCache.getValue(ijk.offsetBy(-2,-2, 0)); + mStencil[FourthDensePt<-1,-2, 0>::idx] = mCache.getValue(ijk.offsetBy(-1,-2, 0)); + mStencil[FourthDensePt< 0,-2, 0>::idx] = mCache.getValue(ijk.offsetBy( 0,-2, 0)); + mStencil[FourthDensePt< 1,-2, 0>::idx] = mCache.getValue(ijk.offsetBy( 1,-2, 0)); + mStencil[FourthDensePt< 2,-2, 0>::idx] = mCache.getValue(ijk.offsetBy( 2,-2, 0)); + + mStencil[FourthDensePt<-2, 0, 2>::idx] = mCache.getValue(ijk.offsetBy(-2, 0, 2)); + mStencil[FourthDensePt<-1, 0, 2>::idx] = mCache.getValue(ijk.offsetBy(-1, 0, 2)); + mStencil[FourthDensePt< 0, 0, 2>::idx] = mCache.getValue(ijk.offsetBy( 0, 0, 2)); + mStencil[FourthDensePt< 1, 0, 2>::idx] = mCache.getValue(ijk.offsetBy( 1, 0, 2)); + mStencil[FourthDensePt< 2, 0, 2>::idx] = mCache.getValue(ijk.offsetBy( 2, 0, 2)); + + mStencil[FourthDensePt<-2, 0, 1>::idx] = mCache.getValue(ijk.offsetBy(-2, 0, 1)); + mStencil[FourthDensePt<-1, 0, 1>::idx] = mCache.getValue(ijk.offsetBy(-1, 0, 1)); + mStencil[FourthDensePt< 0, 0, 1>::idx] = mCache.getValue(ijk.offsetBy( 0, 0, 1)); + mStencil[FourthDensePt< 1, 0, 1>::idx] = mCache.getValue(ijk.offsetBy( 1, 0, 1)); + mStencil[FourthDensePt< 2, 0, 1>::idx] = mCache.getValue(ijk.offsetBy( 2, 0, 1)); + + mStencil[FourthDensePt<-2, 0,-1>::idx] = mCache.getValue(ijk.offsetBy(-2, 0,-1)); + mStencil[FourthDensePt<-1, 0,-1>::idx] = mCache.getValue(ijk.offsetBy(-1, 0,-1)); + mStencil[FourthDensePt< 0, 0,-1>::idx] = mCache.getValue(ijk.offsetBy( 0, 0,-1)); + mStencil[FourthDensePt< 1, 0,-1>::idx] = mCache.getValue(ijk.offsetBy( 1, 0,-1)); + mStencil[FourthDensePt< 2, 0,-1>::idx] = mCache.getValue(ijk.offsetBy( 2, 0,-1)); + + mStencil[FourthDensePt<-2, 0,-2>::idx] = mCache.getValue(ijk.offsetBy(-2, 0,-2)); + mStencil[FourthDensePt<-1, 0,-2>::idx] = mCache.getValue(ijk.offsetBy(-1, 0,-2)); + mStencil[FourthDensePt< 0, 0,-2>::idx] = mCache.getValue(ijk.offsetBy( 0, 0,-2)); + mStencil[FourthDensePt< 1, 0,-2>::idx] = mCache.getValue(ijk.offsetBy( 1, 0,-2)); + mStencil[FourthDensePt< 2, 0,-2>::idx] = mCache.getValue(ijk.offsetBy( 2, 0,-2)); + + + mStencil[FourthDensePt< 0,-2, 2>::idx] = mCache.getValue(ijk.offsetBy( 0,-2, 2)); + mStencil[FourthDensePt< 0,-1, 2>::idx] = mCache.getValue(ijk.offsetBy( 0,-1, 2)); + mStencil[FourthDensePt< 0, 1, 2>::idx] = mCache.getValue(ijk.offsetBy( 0, 1, 2)); + mStencil[FourthDensePt< 0, 2, 2>::idx] = mCache.getValue(ijk.offsetBy( 0, 2, 2)); + + mStencil[FourthDensePt< 0,-2, 1>::idx] = mCache.getValue(ijk.offsetBy( 0,-2, 1)); + mStencil[FourthDensePt< 0,-1, 1>::idx] = mCache.getValue(ijk.offsetBy( 0,-1, 1)); + mStencil[FourthDensePt< 0, 1, 1>::idx] = mCache.getValue(ijk.offsetBy( 0, 1, 1)); + mStencil[FourthDensePt< 0, 2, 1>::idx] = mCache.getValue(ijk.offsetBy( 0, 2, 1)); + + mStencil[FourthDensePt< 0,-2,-1>::idx] = mCache.getValue(ijk.offsetBy( 0,-2,-1)); + mStencil[FourthDensePt< 0,-1,-1>::idx] = mCache.getValue(ijk.offsetBy( 0,-1,-1)); + mStencil[FourthDensePt< 0, 1,-1>::idx] = mCache.getValue(ijk.offsetBy( 0, 1,-1)); + mStencil[FourthDensePt< 0, 2,-1>::idx] = mCache.getValue(ijk.offsetBy( 0, 2,-1)); + + mStencil[FourthDensePt< 0,-2,-2>::idx] = mCache.getValue(ijk.offsetBy( 0,-2,-2)); + mStencil[FourthDensePt< 0,-1,-2>::idx] = mCache.getValue(ijk.offsetBy( 0,-1,-2)); + mStencil[FourthDensePt< 0, 1,-2>::idx] = mCache.getValue(ijk.offsetBy( 0, 1,-2)); + mStencil[FourthDensePt< 0, 2,-2>::idx] = mCache.getValue(ijk.offsetBy( 0, 2,-2)); + } + + template friend class BaseStencil; // allow base class to call init() + using BaseType::mCache; + using BaseType::mStencil; +};// FourthOrderDenseStencil class + + +//////////////////////////////////////// + + +namespace { // anonymous namespace for stencil-layout map + + // the dense point stencil + template struct NineteenPt {}; + template<> struct NineteenPt< 0, 0, 0> { enum { idx = 0 }; }; + + template<> struct NineteenPt< 1, 0, 0> { enum { idx = 1 }; }; + template<> struct NineteenPt< 0, 1, 0> { enum { idx = 2 }; }; + template<> struct NineteenPt< 0, 0, 1> { enum { idx = 3 }; }; + + template<> struct NineteenPt<-1, 0, 0> { enum { idx = 4 }; }; + template<> struct NineteenPt< 0,-1, 0> { enum { idx = 5 }; }; + template<> struct NineteenPt< 0, 0,-1> { enum { idx = 6 }; }; + + template<> struct NineteenPt< 2, 0, 0> { enum { idx = 7 }; }; + template<> struct NineteenPt< 0, 2, 0> { enum { idx = 8 }; }; + template<> struct NineteenPt< 0, 0, 2> { enum { idx = 9 }; }; + + template<> struct NineteenPt<-2, 0, 0> { enum { idx = 10 }; }; + template<> struct NineteenPt< 0,-2, 0> { enum { idx = 11 }; }; + template<> struct NineteenPt< 0, 0,-2> { enum { idx = 12 }; }; + + template<> struct NineteenPt< 3, 0, 0> { enum { idx = 13 }; }; + template<> struct NineteenPt< 0, 3, 0> { enum { idx = 14 }; }; + template<> struct NineteenPt< 0, 0, 3> { enum { idx = 15 }; }; + + template<> struct NineteenPt<-3, 0, 0> { enum { idx = 16 }; }; + template<> struct NineteenPt< 0,-3, 0> { enum { idx = 17 }; }; + template<> struct NineteenPt< 0, 0,-3> { enum { idx = 18 }; }; + +} + + +template +class NineteenPointStencil + : public BaseStencil, GridT, IsSafe> +{ + typedef NineteenPointStencil SelfT; + typedef BaseStencil BaseType; +public: + typedef GridT GridType; + typedef typename GridT::TreeType TreeType; + typedef typename GridType::ValueType ValueType; + + static const int SIZE = 19; + + NineteenPointStencil(const GridType& grid): BaseType(grid, SIZE) {} + + /// Return linear offset for the specified stencil point relative to its center + template + unsigned int pos() const { return NineteenPt::idx; } + +private: + inline void init(const Coord& ijk) + { + mStencil[NineteenPt< 3, 0, 0>::idx] = mCache.getValue(ijk.offsetBy( 3, 0, 0)); + mStencil[NineteenPt< 2, 0, 0>::idx] = mCache.getValue(ijk.offsetBy( 2, 0, 0)); + mStencil[NineteenPt< 1, 0, 0>::idx] = mCache.getValue(ijk.offsetBy( 1, 0, 0)); + mStencil[NineteenPt<-1, 0, 0>::idx] = mCache.getValue(ijk.offsetBy(-1, 0, 0)); + mStencil[NineteenPt<-2, 0, 0>::idx] = mCache.getValue(ijk.offsetBy(-2, 0, 0)); + mStencil[NineteenPt<-3, 0, 0>::idx] = mCache.getValue(ijk.offsetBy(-3, 0, 0)); + + mStencil[NineteenPt< 0, 3, 0>::idx] = mCache.getValue(ijk.offsetBy( 0, 3, 0)); + mStencil[NineteenPt< 0, 2, 0>::idx] = mCache.getValue(ijk.offsetBy( 0, 2, 0)); + mStencil[NineteenPt< 0, 1, 0>::idx] = mCache.getValue(ijk.offsetBy( 0, 1, 0)); + mStencil[NineteenPt< 0,-1, 0>::idx] = mCache.getValue(ijk.offsetBy( 0, -1, 0)); + mStencil[NineteenPt< 0,-2, 0>::idx] = mCache.getValue(ijk.offsetBy( 0, -2, 0)); + mStencil[NineteenPt< 0,-3, 0>::idx] = mCache.getValue(ijk.offsetBy( 0, -3, 0)); + + mStencil[NineteenPt< 0, 0, 3>::idx] = mCache.getValue(ijk.offsetBy( 0, 0, 3)); + mStencil[NineteenPt< 0, 0, 2>::idx] = mCache.getValue(ijk.offsetBy( 0, 0, 2)); + mStencil[NineteenPt< 0, 0, 1>::idx] = mCache.getValue(ijk.offsetBy( 0, 0, 1)); + mStencil[NineteenPt< 0, 0,-1>::idx] = mCache.getValue(ijk.offsetBy( 0, 0, -1)); + mStencil[NineteenPt< 0, 0,-2>::idx] = mCache.getValue(ijk.offsetBy( 0, 0, -2)); + mStencil[NineteenPt< 0, 0,-3>::idx] = mCache.getValue(ijk.offsetBy( 0, 0, -3)); + } + + template friend class BaseStencil; // allow base class to call init() + using BaseType::mCache; + using BaseType::mStencil; +};// NineteenPointStencil class + + +//////////////////////////////////////// + + +namespace { // anonymous namespace for stencil-layout map + + // the 4th-order dense point stencil + template struct SixthDensePt { }; + template<> struct SixthDensePt< 0, 0, 0> { enum { idx = 0 }; }; + + template<> struct SixthDensePt<-3, 3, 0> { enum { idx = 1 }; }; + template<> struct SixthDensePt<-2, 3, 0> { enum { idx = 2 }; }; + template<> struct SixthDensePt<-1, 3, 0> { enum { idx = 3 }; }; + template<> struct SixthDensePt< 0, 3, 0> { enum { idx = 4 }; }; + template<> struct SixthDensePt< 1, 3, 0> { enum { idx = 5 }; }; + template<> struct SixthDensePt< 2, 3, 0> { enum { idx = 6 }; }; + template<> struct SixthDensePt< 3, 3, 0> { enum { idx = 7 }; }; + + template<> struct SixthDensePt<-3, 2, 0> { enum { idx = 8 }; }; + template<> struct SixthDensePt<-2, 2, 0> { enum { idx = 9 }; }; + template<> struct SixthDensePt<-1, 2, 0> { enum { idx = 10 }; }; + template<> struct SixthDensePt< 0, 2, 0> { enum { idx = 11 }; }; + template<> struct SixthDensePt< 1, 2, 0> { enum { idx = 12 }; }; + template<> struct SixthDensePt< 2, 2, 0> { enum { idx = 13 }; }; + template<> struct SixthDensePt< 3, 2, 0> { enum { idx = 14 }; }; + + template<> struct SixthDensePt<-3, 1, 0> { enum { idx = 15 }; }; + template<> struct SixthDensePt<-2, 1, 0> { enum { idx = 16 }; }; + template<> struct SixthDensePt<-1, 1, 0> { enum { idx = 17 }; }; + template<> struct SixthDensePt< 0, 1, 0> { enum { idx = 18 }; }; + template<> struct SixthDensePt< 1, 1, 0> { enum { idx = 19 }; }; + template<> struct SixthDensePt< 2, 1, 0> { enum { idx = 20 }; }; + template<> struct SixthDensePt< 3, 1, 0> { enum { idx = 21 }; }; + + template<> struct SixthDensePt<-3, 0, 0> { enum { idx = 22 }; }; + template<> struct SixthDensePt<-2, 0, 0> { enum { idx = 23 }; }; + template<> struct SixthDensePt<-1, 0, 0> { enum { idx = 24 }; }; + template<> struct SixthDensePt< 1, 0, 0> { enum { idx = 25 }; }; + template<> struct SixthDensePt< 2, 0, 0> { enum { idx = 26 }; }; + template<> struct SixthDensePt< 3, 0, 0> { enum { idx = 27 }; }; + + + template<> struct SixthDensePt<-3,-1, 0> { enum { idx = 28 }; }; + template<> struct SixthDensePt<-2,-1, 0> { enum { idx = 29 }; }; + template<> struct SixthDensePt<-1,-1, 0> { enum { idx = 30 }; }; + template<> struct SixthDensePt< 0,-1, 0> { enum { idx = 31 }; }; + template<> struct SixthDensePt< 1,-1, 0> { enum { idx = 32 }; }; + template<> struct SixthDensePt< 2,-1, 0> { enum { idx = 33 }; }; + template<> struct SixthDensePt< 3,-1, 0> { enum { idx = 34 }; }; + + + template<> struct SixthDensePt<-3,-2, 0> { enum { idx = 35 }; }; + template<> struct SixthDensePt<-2,-2, 0> { enum { idx = 36 }; }; + template<> struct SixthDensePt<-1,-2, 0> { enum { idx = 37 }; }; + template<> struct SixthDensePt< 0,-2, 0> { enum { idx = 38 }; }; + template<> struct SixthDensePt< 1,-2, 0> { enum { idx = 39 }; }; + template<> struct SixthDensePt< 2,-2, 0> { enum { idx = 40 }; }; + template<> struct SixthDensePt< 3,-2, 0> { enum { idx = 41 }; }; + + + template<> struct SixthDensePt<-3,-3, 0> { enum { idx = 42 }; }; + template<> struct SixthDensePt<-2,-3, 0> { enum { idx = 43 }; }; + template<> struct SixthDensePt<-1,-3, 0> { enum { idx = 44 }; }; + template<> struct SixthDensePt< 0,-3, 0> { enum { idx = 45 }; }; + template<> struct SixthDensePt< 1,-3, 0> { enum { idx = 46 }; }; + template<> struct SixthDensePt< 2,-3, 0> { enum { idx = 47 }; }; + template<> struct SixthDensePt< 3,-3, 0> { enum { idx = 48 }; }; + + + template<> struct SixthDensePt<-3, 0, 3> { enum { idx = 49 }; }; + template<> struct SixthDensePt<-2, 0, 3> { enum { idx = 50 }; }; + template<> struct SixthDensePt<-1, 0, 3> { enum { idx = 51 }; }; + template<> struct SixthDensePt< 0, 0, 3> { enum { idx = 52 }; }; + template<> struct SixthDensePt< 1, 0, 3> { enum { idx = 53 }; }; + template<> struct SixthDensePt< 2, 0, 3> { enum { idx = 54 }; }; + template<> struct SixthDensePt< 3, 0, 3> { enum { idx = 55 }; }; + + + template<> struct SixthDensePt<-3, 0, 2> { enum { idx = 56 }; }; + template<> struct SixthDensePt<-2, 0, 2> { enum { idx = 57 }; }; + template<> struct SixthDensePt<-1, 0, 2> { enum { idx = 58 }; }; + template<> struct SixthDensePt< 0, 0, 2> { enum { idx = 59 }; }; + template<> struct SixthDensePt< 1, 0, 2> { enum { idx = 60 }; }; + template<> struct SixthDensePt< 2, 0, 2> { enum { idx = 61 }; }; + template<> struct SixthDensePt< 3, 0, 2> { enum { idx = 62 }; }; + + template<> struct SixthDensePt<-3, 0, 1> { enum { idx = 63 }; }; + template<> struct SixthDensePt<-2, 0, 1> { enum { idx = 64 }; }; + template<> struct SixthDensePt<-1, 0, 1> { enum { idx = 65 }; }; + template<> struct SixthDensePt< 0, 0, 1> { enum { idx = 66 }; }; + template<> struct SixthDensePt< 1, 0, 1> { enum { idx = 67 }; }; + template<> struct SixthDensePt< 2, 0, 1> { enum { idx = 68 }; }; + template<> struct SixthDensePt< 3, 0, 1> { enum { idx = 69 }; }; + + + template<> struct SixthDensePt<-3, 0,-1> { enum { idx = 70 }; }; + template<> struct SixthDensePt<-2, 0,-1> { enum { idx = 71 }; }; + template<> struct SixthDensePt<-1, 0,-1> { enum { idx = 72 }; }; + template<> struct SixthDensePt< 0, 0,-1> { enum { idx = 73 }; }; + template<> struct SixthDensePt< 1, 0,-1> { enum { idx = 74 }; }; + template<> struct SixthDensePt< 2, 0,-1> { enum { idx = 75 }; }; + template<> struct SixthDensePt< 3, 0,-1> { enum { idx = 76 }; }; + + + template<> struct SixthDensePt<-3, 0,-2> { enum { idx = 77 }; }; + template<> struct SixthDensePt<-2, 0,-2> { enum { idx = 78 }; }; + template<> struct SixthDensePt<-1, 0,-2> { enum { idx = 79 }; }; + template<> struct SixthDensePt< 0, 0,-2> { enum { idx = 80 }; }; + template<> struct SixthDensePt< 1, 0,-2> { enum { idx = 81 }; }; + template<> struct SixthDensePt< 2, 0,-2> { enum { idx = 82 }; }; + template<> struct SixthDensePt< 3, 0,-2> { enum { idx = 83 }; }; + + + template<> struct SixthDensePt<-3, 0,-3> { enum { idx = 84 }; }; + template<> struct SixthDensePt<-2, 0,-3> { enum { idx = 85 }; }; + template<> struct SixthDensePt<-1, 0,-3> { enum { idx = 86 }; }; + template<> struct SixthDensePt< 0, 0,-3> { enum { idx = 87 }; }; + template<> struct SixthDensePt< 1, 0,-3> { enum { idx = 88 }; }; + template<> struct SixthDensePt< 2, 0,-3> { enum { idx = 89 }; }; + template<> struct SixthDensePt< 3, 0,-3> { enum { idx = 90 }; }; + + + template<> struct SixthDensePt< 0,-3, 3> { enum { idx = 91 }; }; + template<> struct SixthDensePt< 0,-2, 3> { enum { idx = 92 }; }; + template<> struct SixthDensePt< 0,-1, 3> { enum { idx = 93 }; }; + template<> struct SixthDensePt< 0, 1, 3> { enum { idx = 94 }; }; + template<> struct SixthDensePt< 0, 2, 3> { enum { idx = 95 }; }; + template<> struct SixthDensePt< 0, 3, 3> { enum { idx = 96 }; }; + + template<> struct SixthDensePt< 0,-3, 2> { enum { idx = 97 }; }; + template<> struct SixthDensePt< 0,-2, 2> { enum { idx = 98 }; }; + template<> struct SixthDensePt< 0,-1, 2> { enum { idx = 99 }; }; + template<> struct SixthDensePt< 0, 1, 2> { enum { idx = 100 }; }; + template<> struct SixthDensePt< 0, 2, 2> { enum { idx = 101 }; }; + template<> struct SixthDensePt< 0, 3, 2> { enum { idx = 102 }; }; + + template<> struct SixthDensePt< 0,-3, 1> { enum { idx = 103 }; }; + template<> struct SixthDensePt< 0,-2, 1> { enum { idx = 104 }; }; + template<> struct SixthDensePt< 0,-1, 1> { enum { idx = 105 }; }; + template<> struct SixthDensePt< 0, 1, 1> { enum { idx = 106 }; }; + template<> struct SixthDensePt< 0, 2, 1> { enum { idx = 107 }; }; + template<> struct SixthDensePt< 0, 3, 1> { enum { idx = 108 }; }; + + template<> struct SixthDensePt< 0,-3,-1> { enum { idx = 109 }; }; + template<> struct SixthDensePt< 0,-2,-1> { enum { idx = 110 }; }; + template<> struct SixthDensePt< 0,-1,-1> { enum { idx = 111 }; }; + template<> struct SixthDensePt< 0, 1,-1> { enum { idx = 112 }; }; + template<> struct SixthDensePt< 0, 2,-1> { enum { idx = 113 }; }; + template<> struct SixthDensePt< 0, 3,-1> { enum { idx = 114 }; }; + + template<> struct SixthDensePt< 0,-3,-2> { enum { idx = 115 }; }; + template<> struct SixthDensePt< 0,-2,-2> { enum { idx = 116 }; }; + template<> struct SixthDensePt< 0,-1,-2> { enum { idx = 117 }; }; + template<> struct SixthDensePt< 0, 1,-2> { enum { idx = 118 }; }; + template<> struct SixthDensePt< 0, 2,-2> { enum { idx = 119 }; }; + template<> struct SixthDensePt< 0, 3,-2> { enum { idx = 120 }; }; + + template<> struct SixthDensePt< 0,-3,-3> { enum { idx = 121 }; }; + template<> struct SixthDensePt< 0,-2,-3> { enum { idx = 122 }; }; + template<> struct SixthDensePt< 0,-1,-3> { enum { idx = 123 }; }; + template<> struct SixthDensePt< 0, 1,-3> { enum { idx = 124 }; }; + template<> struct SixthDensePt< 0, 2,-3> { enum { idx = 125 }; }; + template<> struct SixthDensePt< 0, 3,-3> { enum { idx = 126 }; }; + +} + + +template +class SixthOrderDenseStencil + : public BaseStencil, GridT, IsSafe> +{ + typedef SixthOrderDenseStencil SelfT; + typedef BaseStencil BaseType; +public: + typedef GridT GridType; + typedef typename GridT::TreeType TreeType; + typedef typename GridType::ValueType ValueType; + + static const int SIZE = 127; + + SixthOrderDenseStencil(const GridType& grid): BaseType(grid, SIZE) {} + + /// Return linear offset for the specified stencil point relative to its center + template + unsigned int pos() const { return SixthDensePt::idx; } + +private: + inline void init(const Coord& ijk) + { + mStencil[SixthDensePt<-3, 3, 0>::idx] = mCache.getValue(ijk.offsetBy(-3, 3, 0)); + mStencil[SixthDensePt<-2, 3, 0>::idx] = mCache.getValue(ijk.offsetBy(-2, 3, 0)); + mStencil[SixthDensePt<-1, 3, 0>::idx] = mCache.getValue(ijk.offsetBy(-1, 3, 0)); + mStencil[SixthDensePt< 0, 3, 0>::idx] = mCache.getValue(ijk.offsetBy( 0, 3, 0)); + mStencil[SixthDensePt< 1, 3, 0>::idx] = mCache.getValue(ijk.offsetBy( 1, 3, 0)); + mStencil[SixthDensePt< 2, 3, 0>::idx] = mCache.getValue(ijk.offsetBy( 2, 3, 0)); + mStencil[SixthDensePt< 3, 3, 0>::idx] = mCache.getValue(ijk.offsetBy( 3, 3, 0)); + + mStencil[SixthDensePt<-3, 2, 0>::idx] = mCache.getValue(ijk.offsetBy(-3, 2, 0)); + mStencil[SixthDensePt<-2, 2, 0>::idx] = mCache.getValue(ijk.offsetBy(-2, 2, 0)); + mStencil[SixthDensePt<-1, 2, 0>::idx] = mCache.getValue(ijk.offsetBy(-1, 2, 0)); + mStencil[SixthDensePt< 0, 2, 0>::idx] = mCache.getValue(ijk.offsetBy( 0, 2, 0)); + mStencil[SixthDensePt< 1, 2, 0>::idx] = mCache.getValue(ijk.offsetBy( 1, 2, 0)); + mStencil[SixthDensePt< 2, 2, 0>::idx] = mCache.getValue(ijk.offsetBy( 2, 2, 0)); + mStencil[SixthDensePt< 3, 2, 0>::idx] = mCache.getValue(ijk.offsetBy( 3, 2, 0)); + + mStencil[SixthDensePt<-3, 1, 0>::idx] = mCache.getValue(ijk.offsetBy(-3, 1, 0)); + mStencil[SixthDensePt<-2, 1, 0>::idx] = mCache.getValue(ijk.offsetBy(-2, 1, 0)); + mStencil[SixthDensePt<-1, 1, 0>::idx] = mCache.getValue(ijk.offsetBy(-1, 1, 0)); + mStencil[SixthDensePt< 0, 1, 0>::idx] = mCache.getValue(ijk.offsetBy( 0, 1, 0)); + mStencil[SixthDensePt< 1, 1, 0>::idx] = mCache.getValue(ijk.offsetBy( 1, 1, 0)); + mStencil[SixthDensePt< 2, 1, 0>::idx] = mCache.getValue(ijk.offsetBy( 2, 1, 0)); + mStencil[SixthDensePt< 3, 1, 0>::idx] = mCache.getValue(ijk.offsetBy( 3, 1, 0)); + + mStencil[SixthDensePt<-3, 0, 0>::idx] = mCache.getValue(ijk.offsetBy(-3, 0, 0)); + mStencil[SixthDensePt<-2, 0, 0>::idx] = mCache.getValue(ijk.offsetBy(-2, 0, 0)); + mStencil[SixthDensePt<-1, 0, 0>::idx] = mCache.getValue(ijk.offsetBy(-1, 0, 0)); + mStencil[SixthDensePt< 1, 0, 0>::idx] = mCache.getValue(ijk.offsetBy( 1, 0, 0)); + mStencil[SixthDensePt< 2, 0, 0>::idx] = mCache.getValue(ijk.offsetBy( 2, 0, 0)); + mStencil[SixthDensePt< 3, 0, 0>::idx] = mCache.getValue(ijk.offsetBy( 3, 0, 0)); + + mStencil[SixthDensePt<-3,-1, 0>::idx] = mCache.getValue(ijk.offsetBy(-3,-1, 0)); + mStencil[SixthDensePt<-2,-1, 0>::idx] = mCache.getValue(ijk.offsetBy(-2,-1, 0)); + mStencil[SixthDensePt<-1,-1, 0>::idx] = mCache.getValue(ijk.offsetBy(-1,-1, 0)); + mStencil[SixthDensePt< 0,-1, 0>::idx] = mCache.getValue(ijk.offsetBy( 0,-1, 0)); + mStencil[SixthDensePt< 1,-1, 0>::idx] = mCache.getValue(ijk.offsetBy( 1,-1, 0)); + mStencil[SixthDensePt< 2,-1, 0>::idx] = mCache.getValue(ijk.offsetBy( 2,-1, 0)); + mStencil[SixthDensePt< 3,-1, 0>::idx] = mCache.getValue(ijk.offsetBy( 3,-1, 0)); + + mStencil[SixthDensePt<-3,-2, 0>::idx] = mCache.getValue(ijk.offsetBy(-3,-2, 0)); + mStencil[SixthDensePt<-2,-2, 0>::idx] = mCache.getValue(ijk.offsetBy(-2,-2, 0)); + mStencil[SixthDensePt<-1,-2, 0>::idx] = mCache.getValue(ijk.offsetBy(-1,-2, 0)); + mStencil[SixthDensePt< 0,-2, 0>::idx] = mCache.getValue(ijk.offsetBy( 0,-2, 0)); + mStencil[SixthDensePt< 1,-2, 0>::idx] = mCache.getValue(ijk.offsetBy( 1,-2, 0)); + mStencil[SixthDensePt< 2,-2, 0>::idx] = mCache.getValue(ijk.offsetBy( 2,-2, 0)); + mStencil[SixthDensePt< 3,-2, 0>::idx] = mCache.getValue(ijk.offsetBy( 3,-2, 0)); + + mStencil[SixthDensePt<-3,-3, 0>::idx] = mCache.getValue(ijk.offsetBy(-3,-3, 0)); + mStencil[SixthDensePt<-2,-3, 0>::idx] = mCache.getValue(ijk.offsetBy(-2,-3, 0)); + mStencil[SixthDensePt<-1,-3, 0>::idx] = mCache.getValue(ijk.offsetBy(-1,-3, 0)); + mStencil[SixthDensePt< 0,-3, 0>::idx] = mCache.getValue(ijk.offsetBy( 0,-3, 0)); + mStencil[SixthDensePt< 1,-3, 0>::idx] = mCache.getValue(ijk.offsetBy( 1,-3, 0)); + mStencil[SixthDensePt< 2,-3, 0>::idx] = mCache.getValue(ijk.offsetBy( 2,-3, 0)); + mStencil[SixthDensePt< 3,-3, 0>::idx] = mCache.getValue(ijk.offsetBy( 3,-3, 0)); + + mStencil[SixthDensePt<-3, 0, 3>::idx] = mCache.getValue(ijk.offsetBy(-3, 0, 3)); + mStencil[SixthDensePt<-2, 0, 3>::idx] = mCache.getValue(ijk.offsetBy(-2, 0, 3)); + mStencil[SixthDensePt<-1, 0, 3>::idx] = mCache.getValue(ijk.offsetBy(-1, 0, 3)); + mStencil[SixthDensePt< 0, 0, 3>::idx] = mCache.getValue(ijk.offsetBy( 0, 0, 3)); + mStencil[SixthDensePt< 1, 0, 3>::idx] = mCache.getValue(ijk.offsetBy( 1, 0, 3)); + mStencil[SixthDensePt< 2, 0, 3>::idx] = mCache.getValue(ijk.offsetBy( 2, 0, 3)); + mStencil[SixthDensePt< 3, 0, 3>::idx] = mCache.getValue(ijk.offsetBy( 3, 0, 3)); + + mStencil[SixthDensePt<-3, 0, 2>::idx] = mCache.getValue(ijk.offsetBy(-3, 0, 2)); + mStencil[SixthDensePt<-2, 0, 2>::idx] = mCache.getValue(ijk.offsetBy(-2, 0, 2)); + mStencil[SixthDensePt<-1, 0, 2>::idx] = mCache.getValue(ijk.offsetBy(-1, 0, 2)); + mStencil[SixthDensePt< 0, 0, 2>::idx] = mCache.getValue(ijk.offsetBy( 0, 0, 2)); + mStencil[SixthDensePt< 1, 0, 2>::idx] = mCache.getValue(ijk.offsetBy( 1, 0, 2)); + mStencil[SixthDensePt< 2, 0, 2>::idx] = mCache.getValue(ijk.offsetBy( 2, 0, 2)); + mStencil[SixthDensePt< 3, 0, 2>::idx] = mCache.getValue(ijk.offsetBy( 3, 0, 2)); + + mStencil[SixthDensePt<-3, 0, 1>::idx] = mCache.getValue(ijk.offsetBy(-3, 0, 1)); + mStencil[SixthDensePt<-2, 0, 1>::idx] = mCache.getValue(ijk.offsetBy(-2, 0, 1)); + mStencil[SixthDensePt<-1, 0, 1>::idx] = mCache.getValue(ijk.offsetBy(-1, 0, 1)); + mStencil[SixthDensePt< 0, 0, 1>::idx] = mCache.getValue(ijk.offsetBy( 0, 0, 1)); + mStencil[SixthDensePt< 1, 0, 1>::idx] = mCache.getValue(ijk.offsetBy( 1, 0, 1)); + mStencil[SixthDensePt< 2, 0, 1>::idx] = mCache.getValue(ijk.offsetBy( 2, 0, 1)); + mStencil[SixthDensePt< 3, 0, 1>::idx] = mCache.getValue(ijk.offsetBy( 3, 0, 1)); + + mStencil[SixthDensePt<-3, 0,-1>::idx] = mCache.getValue(ijk.offsetBy(-3, 0,-1)); + mStencil[SixthDensePt<-2, 0,-1>::idx] = mCache.getValue(ijk.offsetBy(-2, 0,-1)); + mStencil[SixthDensePt<-1, 0,-1>::idx] = mCache.getValue(ijk.offsetBy(-1, 0,-1)); + mStencil[SixthDensePt< 0, 0,-1>::idx] = mCache.getValue(ijk.offsetBy( 0, 0,-1)); + mStencil[SixthDensePt< 1, 0,-1>::idx] = mCache.getValue(ijk.offsetBy( 1, 0,-1)); + mStencil[SixthDensePt< 2, 0,-1>::idx] = mCache.getValue(ijk.offsetBy( 2, 0,-1)); + mStencil[SixthDensePt< 3, 0,-1>::idx] = mCache.getValue(ijk.offsetBy( 3, 0,-1)); + + mStencil[SixthDensePt<-3, 0,-2>::idx] = mCache.getValue(ijk.offsetBy(-3, 0,-2)); + mStencil[SixthDensePt<-2, 0,-2>::idx] = mCache.getValue(ijk.offsetBy(-2, 0,-2)); + mStencil[SixthDensePt<-1, 0,-2>::idx] = mCache.getValue(ijk.offsetBy(-1, 0,-2)); + mStencil[SixthDensePt< 0, 0,-2>::idx] = mCache.getValue(ijk.offsetBy( 0, 0,-2)); + mStencil[SixthDensePt< 1, 0,-2>::idx] = mCache.getValue(ijk.offsetBy( 1, 0,-2)); + mStencil[SixthDensePt< 2, 0,-2>::idx] = mCache.getValue(ijk.offsetBy( 2, 0,-2)); + mStencil[SixthDensePt< 3, 0,-2>::idx] = mCache.getValue(ijk.offsetBy( 3, 0,-2)); + + mStencil[SixthDensePt<-3, 0,-3>::idx] = mCache.getValue(ijk.offsetBy(-3, 0,-3)); + mStencil[SixthDensePt<-2, 0,-3>::idx] = mCache.getValue(ijk.offsetBy(-2, 0,-3)); + mStencil[SixthDensePt<-1, 0,-3>::idx] = mCache.getValue(ijk.offsetBy(-1, 0,-3)); + mStencil[SixthDensePt< 0, 0,-3>::idx] = mCache.getValue(ijk.offsetBy( 0, 0,-3)); + mStencil[SixthDensePt< 1, 0,-3>::idx] = mCache.getValue(ijk.offsetBy( 1, 0,-3)); + mStencil[SixthDensePt< 2, 0,-3>::idx] = mCache.getValue(ijk.offsetBy( 2, 0,-3)); + mStencil[SixthDensePt< 3, 0,-3>::idx] = mCache.getValue(ijk.offsetBy( 3, 0,-3)); + + mStencil[SixthDensePt< 0,-3, 3>::idx] = mCache.getValue(ijk.offsetBy( 0,-3, 3)); + mStencil[SixthDensePt< 0,-2, 3>::idx] = mCache.getValue(ijk.offsetBy( 0,-2, 3)); + mStencil[SixthDensePt< 0,-1, 3>::idx] = mCache.getValue(ijk.offsetBy( 0,-1, 3)); + mStencil[SixthDensePt< 0, 1, 3>::idx] = mCache.getValue(ijk.offsetBy( 0, 1, 3)); + mStencil[SixthDensePt< 0, 2, 3>::idx] = mCache.getValue(ijk.offsetBy( 0, 2, 3)); + mStencil[SixthDensePt< 0, 3, 3>::idx] = mCache.getValue(ijk.offsetBy( 0, 3, 3)); + + mStencil[SixthDensePt< 0,-3, 2>::idx] = mCache.getValue(ijk.offsetBy( 0,-3, 2)); + mStencil[SixthDensePt< 0,-2, 2>::idx] = mCache.getValue(ijk.offsetBy( 0,-2, 2)); + mStencil[SixthDensePt< 0,-1, 2>::idx] = mCache.getValue(ijk.offsetBy( 0,-1, 2)); + mStencil[SixthDensePt< 0, 1, 2>::idx] = mCache.getValue(ijk.offsetBy( 0, 1, 2)); + mStencil[SixthDensePt< 0, 2, 2>::idx] = mCache.getValue(ijk.offsetBy( 0, 2, 2)); + mStencil[SixthDensePt< 0, 3, 2>::idx] = mCache.getValue(ijk.offsetBy( 0, 3, 2)); + + mStencil[SixthDensePt< 0,-3, 1>::idx] = mCache.getValue(ijk.offsetBy( 0,-3, 1)); + mStencil[SixthDensePt< 0,-2, 1>::idx] = mCache.getValue(ijk.offsetBy( 0,-2, 1)); + mStencil[SixthDensePt< 0,-1, 1>::idx] = mCache.getValue(ijk.offsetBy( 0,-1, 1)); + mStencil[SixthDensePt< 0, 1, 1>::idx] = mCache.getValue(ijk.offsetBy( 0, 1, 1)); + mStencil[SixthDensePt< 0, 2, 1>::idx] = mCache.getValue(ijk.offsetBy( 0, 2, 1)); + mStencil[SixthDensePt< 0, 3, 1>::idx] = mCache.getValue(ijk.offsetBy( 0, 3, 1)); + + mStencil[SixthDensePt< 0,-3,-1>::idx] = mCache.getValue(ijk.offsetBy( 0,-3,-1)); + mStencil[SixthDensePt< 0,-2,-1>::idx] = mCache.getValue(ijk.offsetBy( 0,-2,-1)); + mStencil[SixthDensePt< 0,-1,-1>::idx] = mCache.getValue(ijk.offsetBy( 0,-1,-1)); + mStencil[SixthDensePt< 0, 1,-1>::idx] = mCache.getValue(ijk.offsetBy( 0, 1,-1)); + mStencil[SixthDensePt< 0, 2,-1>::idx] = mCache.getValue(ijk.offsetBy( 0, 2,-1)); + mStencil[SixthDensePt< 0, 3,-1>::idx] = mCache.getValue(ijk.offsetBy( 0, 3,-1)); + + mStencil[SixthDensePt< 0,-3,-2>::idx] = mCache.getValue(ijk.offsetBy( 0,-3,-2)); + mStencil[SixthDensePt< 0,-2,-2>::idx] = mCache.getValue(ijk.offsetBy( 0,-2,-2)); + mStencil[SixthDensePt< 0,-1,-2>::idx] = mCache.getValue(ijk.offsetBy( 0,-1,-2)); + mStencil[SixthDensePt< 0, 1,-2>::idx] = mCache.getValue(ijk.offsetBy( 0, 1,-2)); + mStencil[SixthDensePt< 0, 2,-2>::idx] = mCache.getValue(ijk.offsetBy( 0, 2,-2)); + mStencil[SixthDensePt< 0, 3,-2>::idx] = mCache.getValue(ijk.offsetBy( 0, 3,-2)); + + mStencil[SixthDensePt< 0,-3,-3>::idx] = mCache.getValue(ijk.offsetBy( 0,-3,-3)); + mStencil[SixthDensePt< 0,-2,-3>::idx] = mCache.getValue(ijk.offsetBy( 0,-2,-3)); + mStencil[SixthDensePt< 0,-1,-3>::idx] = mCache.getValue(ijk.offsetBy( 0,-1,-3)); + mStencil[SixthDensePt< 0, 1,-3>::idx] = mCache.getValue(ijk.offsetBy( 0, 1,-3)); + mStencil[SixthDensePt< 0, 2,-3>::idx] = mCache.getValue(ijk.offsetBy( 0, 2,-3)); + mStencil[SixthDensePt< 0, 3,-3>::idx] = mCache.getValue(ijk.offsetBy( 0, 3,-3)); + } + + template friend class BaseStencil; // allow base class to call init() + using BaseType::mCache; + using BaseType::mStencil; +};// SixthOrderDenseStencil class + + +////////////////////////////////////////////////////////////////////// + + +/// This is a simple 7-point nearest neighbor stencil that supports +/// gradient by second-order central differencing, first-order upwinding, +/// Laplacian, closest-point transform and zero-crossing test. +/// +/// @note For optimal random access performance this class +/// includes its own grid accessor. +template +class GradStencil : public BaseStencil, GridT, IsSafe> +{ + typedef GradStencil SelfT; + typedef BaseStencil BaseType; +public: + typedef GridT GridType; + typedef typename GridT::TreeType TreeType; + typedef typename GridType::ValueType ValueType; + + static const int SIZE = 7; + + GradStencil(const GridType& grid) + : BaseType(grid, SIZE) + , mInv2Dx(ValueType(0.5 / grid.voxelSize()[0])) + , mInvDx2(ValueType(4.0 * mInv2Dx * mInv2Dx)) + { + } + + GradStencil(const GridType& grid, Real dx) + : BaseType(grid, SIZE) + , mInv2Dx(ValueType(0.5 / dx)) + , mInvDx2(ValueType(4.0 * mInv2Dx * mInv2Dx)) + { + } + + /// @brief Return the norm square of the single-sided upwind gradient + /// (computed via Godunov's scheme) at the previously buffered location. + /// + /// @note This method should not be called until the stencil + /// buffer has been populated via a call to moveTo(ijk). + inline ValueType normSqGrad() const + { + return mInvDx2 * math::GodunovsNormSqrd(mStencil[0] > 0, + mStencil[0] - mStencil[1], + mStencil[2] - mStencil[0], + mStencil[0] - mStencil[3], + mStencil[4] - mStencil[0], + mStencil[0] - mStencil[5], + mStencil[6] - mStencil[0]); + } + + /// @brief Return the gradient computed at the previously buffered + /// location by second order central differencing. + /// + /// @note This method should not be called until the stencil + /// buffer has been populated via a call to moveTo(ijk). + inline math::Vec3 gradient() const + { + return math::Vec3(mStencil[2] - mStencil[1], + mStencil[4] - mStencil[3], + mStencil[6] - mStencil[5])*mInv2Dx; + } + /// @brief Return the first-order upwind gradient corresponding to the direction V. + /// + /// @note This method should not be called until the stencil + /// buffer has been populated via a call to moveTo(ijk). + inline math::Vec3 gradient(const math::Vec3& V) const + { + return math::Vec3( + V[0]>0 ? mStencil[0] - mStencil[1] : mStencil[2] - mStencil[0], + V[1]>0 ? mStencil[0] - mStencil[3] : mStencil[4] - mStencil[0], + V[2]>0 ? mStencil[0] - mStencil[5] : mStencil[6] - mStencil[0])*2*mInv2Dx; + } + + /// Return the Laplacian computed at the previously buffered + /// location by second-order central differencing. + inline ValueType laplacian() const + { + return mInvDx2 * (mStencil[1] + mStencil[2] + + mStencil[3] + mStencil[4] + + mStencil[5] + mStencil[6] - 6*mStencil[0]); + } + + /// Return @c true if the sign of the value at the center point of the stencil + /// is different from the signs of any of its six nearest neighbors. + inline bool zeroCrossing() const + { + const typename BaseType::BufferType& v = mStencil; + return (v[0]>0 ? (v[1]<0 || v[2]<0 || v[3]<0 || v[4]<0 || v[5]<0 || v[6]<0) + : (v[1]>0 || v[2]>0 || v[3]>0 || v[4]>0 || v[5]>0 || v[6]>0)); + } + + /// @brief Compute the closest-point transform to a level set. + /// @return the closest point in index space to the surface + /// from which the level set was derived. + /// + /// @note This method assumes that the grid represents a level set + /// with distances in world units and a simple affine transfrom + /// with uniform scaling. + inline math::Vec3 cpt() + { + const Coord& ijk = BaseType::getCenterCoord(); + const ValueType d = ValueType(mStencil[0] * 0.5 * mInvDx2); // distance in voxels / (2dx^2) + return math::Vec3(ijk[0] - d*(mStencil[2] - mStencil[1]), + ijk[1] - d*(mStencil[4] - mStencil[3]), + ijk[2] - d*(mStencil[6] - mStencil[5])); + } + +private: + + inline void init(const Coord& ijk) + { + mStencil[1] = mCache.getValue(ijk.offsetBy(-1, 0, 0)); + mStencil[2] = mCache.getValue(ijk.offsetBy( 1, 0, 0)); + + mStencil[3] = mCache.getValue(ijk.offsetBy( 0, -1, 0)); + mStencil[4] = mCache.getValue(ijk.offsetBy( 0, 1, 0)); + + mStencil[5] = mCache.getValue(ijk.offsetBy( 0, 0, -1)); + mStencil[6] = mCache.getValue(ijk.offsetBy( 0, 0, 1)); + } + + template friend class BaseStencil; // allow base class to call init() + using BaseType::mCache; + using BaseType::mStencil; + const ValueType mInv2Dx, mInvDx2; +}; // GradStencil class + +//////////////////////////////////////// + + +/// @brief This is a special 19-point stencil that supports optimal fifth-order WENO +/// upwinding, second-order central differencing, Laplacian, and zero-crossing test. +/// +/// @note For optimal random access performance this class +/// includes its own grid accessor. +template +class WenoStencil: public BaseStencil, GridT, IsSafe> +{ + typedef WenoStencil SelfT; + typedef BaseStencil BaseType; +public: + typedef GridT GridType; + typedef typename GridT::TreeType TreeType; + typedef typename GridType::ValueType ValueType; + + static const int SIZE = 19; + + WenoStencil(const GridType& grid) + : BaseType(grid, SIZE) + , mDx2(ValueType(math::Pow2(grid.voxelSize()[0]))) + , mInv2Dx(ValueType(0.5 / grid.voxelSize()[0])) + , mInvDx2(ValueType(1.0 / mDx2)) + { + } + + WenoStencil(const GridType& grid, Real dx) + : BaseType(grid, SIZE) + , mDx2(ValueType(dx * dx)) + , mInv2Dx(ValueType(0.5 / dx)) + , mInvDx2(ValueType(1.0 / mDx2)) + { + } + + /// @brief Return the norm-square of the WENO upwind gradient (computed via + /// WENO upwinding and Godunov's scheme) at the previously buffered location. + /// + /// @note This method should not be called until the stencil + /// buffer has been populated via a call to moveTo(ijk). + inline ValueType normSqGrad() const + { + const typename BaseType::BufferType& v = mStencil; +#ifdef DWA_OPENVDB + // SSE optimized + const simd::Float4 + v1(v[2]-v[1], v[ 8]-v[ 7], v[14]-v[13], 0), + v2(v[3]-v[2], v[ 9]-v[ 8], v[15]-v[14], 0), + v3(v[0]-v[3], v[ 0]-v[ 9], v[ 0]-v[15], 0), + v4(v[4]-v[0], v[10]-v[ 0], v[16]-v[ 0], 0), + v5(v[5]-v[4], v[11]-v[10], v[17]-v[16], 0), + v6(v[6]-v[5], v[12]-v[11], v[18]-v[17], 0), + dP_m = math::WENO5(v1, v2, v3, v4, v5, mDx2), + dP_p = math::WENO5(v6, v5, v4, v3, v2, mDx2); + + return mInvDx2 * math::GodunovsNormSqrd(mStencil[0] > 0, dP_m, dP_p); +#else + const Real + dP_xm = math::WENO5(v[ 2]-v[ 1],v[ 3]-v[ 2],v[ 0]-v[ 3],v[ 4]-v[ 0],v[ 5]-v[ 4],mDx2), + dP_xp = math::WENO5(v[ 6]-v[ 5],v[ 5]-v[ 4],v[ 4]-v[ 0],v[ 0]-v[ 3],v[ 3]-v[ 2],mDx2), + dP_ym = math::WENO5(v[ 8]-v[ 7],v[ 9]-v[ 8],v[ 0]-v[ 9],v[10]-v[ 0],v[11]-v[10],mDx2), + dP_yp = math::WENO5(v[12]-v[11],v[11]-v[10],v[10]-v[ 0],v[ 0]-v[ 9],v[ 9]-v[ 8],mDx2), + dP_zm = math::WENO5(v[14]-v[13],v[15]-v[14],v[ 0]-v[15],v[16]-v[ 0],v[17]-v[16],mDx2), + dP_zp = math::WENO5(v[18]-v[17],v[17]-v[16],v[16]-v[ 0],v[ 0]-v[15],v[15]-v[14],mDx2); + return static_cast( + mInvDx2*math::GodunovsNormSqrd(v[0]>0,dP_xm,dP_xp,dP_ym,dP_yp,dP_zm,dP_zp)); +#endif + } + + /// Return the optimal fifth-order upwind gradient corresponding to the + /// direction V. + /// + /// @note This method should not be called until the stencil + /// buffer has been populated via a call to moveTo(ijk). + inline math::Vec3 gradient(const math::Vec3& V) const + { + const typename BaseType::BufferType& v = mStencil; + return 2*mInv2Dx * math::Vec3( + V[0]>0 ? math::WENO5(v[ 2]-v[ 1],v[ 3]-v[ 2],v[ 0]-v[ 3], v[ 4]-v[ 0],v[ 5]-v[ 4],mDx2) + : math::WENO5(v[ 6]-v[ 5],v[ 5]-v[ 4],v[ 4]-v[ 0], v[ 0]-v[ 3],v[ 3]-v[ 2],mDx2), + V[1]>0 ? math::WENO5(v[ 8]-v[ 7],v[ 9]-v[ 8],v[ 0]-v[ 9], v[10]-v[ 0],v[11]-v[10],mDx2) + : math::WENO5(v[12]-v[11],v[11]-v[10],v[10]-v[ 0], v[ 0]-v[ 9],v[ 9]-v[ 8],mDx2), + V[2]>0 ? math::WENO5(v[14]-v[13],v[15]-v[14],v[ 0]-v[15], v[16]-v[ 0],v[17]-v[16],mDx2) + : math::WENO5(v[18]-v[17],v[17]-v[16],v[16]-v[ 0], v[ 0]-v[15],v[15]-v[14],mDx2)); + } + /// Return the gradient computed at the previously buffered + /// location by second-order central differencing. + /// + /// @note This method should not be called until the stencil + /// buffer has been populated via a call to moveTo(ijk). + inline math::Vec3 gradient() const + { + return mInv2Dx * math::Vec3(mStencil[ 4] - mStencil[ 3], + mStencil[10] - mStencil[ 9], + mStencil[16] - mStencil[15]); + } + + /// Return the Laplacian computed at the previously buffered + /// location by second-order central differencing. + /// + /// @note This method should not be called until the stencil + /// buffer has been populated via a call to moveTo(ijk). + inline ValueType laplacian() const + { + return mInvDx2 * ( + mStencil[ 3] + mStencil[ 4] + + mStencil[ 9] + mStencil[10] + + mStencil[15] + mStencil[16] - 6*mStencil[0]); + } + + /// Return @c true if the sign of the value at the center point of the stencil + /// differs from the sign of any of its six nearest neighbors + inline bool zeroCrossing() const + { + const typename BaseType::BufferType& v = mStencil; + return (v[ 0]>0 ? (v[ 3]<0 || v[ 4]<0 || v[ 9]<0 || v[10]<0 || v[15]<0 || v[16]<0) + : (v[ 3]>0 || v[ 4]>0 || v[ 9]>0 || v[10]>0 || v[15]>0 || v[16]>0)); + } + +private: + inline void init(const Coord& ijk) + { + mStencil[ 1] = mCache.getValue(ijk.offsetBy(-3, 0, 0)); + mStencil[ 2] = mCache.getValue(ijk.offsetBy(-2, 0, 0)); + mStencil[ 3] = mCache.getValue(ijk.offsetBy(-1, 0, 0)); + mStencil[ 4] = mCache.getValue(ijk.offsetBy( 1, 0, 0)); + mStencil[ 5] = mCache.getValue(ijk.offsetBy( 2, 0, 0)); + mStencil[ 6] = mCache.getValue(ijk.offsetBy( 3, 0, 0)); + + mStencil[ 7] = mCache.getValue(ijk.offsetBy( 0, -3, 0)); + mStencil[ 8] = mCache.getValue(ijk.offsetBy( 0, -2, 0)); + mStencil[ 9] = mCache.getValue(ijk.offsetBy( 0, -1, 0)); + mStencil[10] = mCache.getValue(ijk.offsetBy( 0, 1, 0)); + mStencil[11] = mCache.getValue(ijk.offsetBy( 0, 2, 0)); + mStencil[12] = mCache.getValue(ijk.offsetBy( 0, 3, 0)); + + mStencil[13] = mCache.getValue(ijk.offsetBy( 0, 0, -3)); + mStencil[14] = mCache.getValue(ijk.offsetBy( 0, 0, -2)); + mStencil[15] = mCache.getValue(ijk.offsetBy( 0, 0, -1)); + mStencil[16] = mCache.getValue(ijk.offsetBy( 0, 0, 1)); + mStencil[17] = mCache.getValue(ijk.offsetBy( 0, 0, 2)); + mStencil[18] = mCache.getValue(ijk.offsetBy( 0, 0, 3)); + } + + template friend class BaseStencil; // allow base class to call init() + using BaseType::mCache; + using BaseType::mStencil; + const ValueType mDx2, mInv2Dx, mInvDx2; +}; // WenoStencil class + + +////////////////////////////////////////////////////////////////////// + + +template +class CurvatureStencil: public BaseStencil, GridT, IsSafe> +{ + typedef CurvatureStencil SelfT; + typedef BaseStencil BaseType; +public: + typedef GridT GridType; + typedef typename GridT::TreeType TreeType; + typedef typename GridT::ValueType ValueType; + + static const int SIZE = 19; + + CurvatureStencil(const GridType& grid) + : BaseType(grid, SIZE) + , mInv2Dx(ValueType(0.5 / grid.voxelSize()[0])) + , mInvDx2(ValueType(4.0 * mInv2Dx * mInv2Dx)) + { + } + + CurvatureStencil(const GridType& grid, Real dx) + : BaseType(grid, SIZE) + , mInv2Dx(ValueType(0.5 / dx)) + , mInvDx2(ValueType(4.0 * mInv2Dx * mInv2Dx)) + { + } + + /// @brief Return the mean curvature at the previously buffered location. + /// + /// @note This method should not be called until the stencil + /// buffer has been populated via a call to moveTo(ijk). + inline ValueType meanCurvature() + { + Real alpha, beta; + return this->meanCurvature(alpha, beta) ? ValueType(alpha*mInv2Dx/math::Pow3(beta)) : 0; + } + + /// Return the mean curvature multiplied by the norm of the + /// central-difference gradient. This method is very useful for + /// mean-curvature flow of level sets! + /// + /// @note This method should not be called until the stencil + /// buffer has been populated via a call to moveTo(ijk). + inline ValueType meanCurvatureNormGrad() + { + Real alpha, beta; + return this->meanCurvature(alpha, beta) ? ValueType(alpha*mInvDx2/(2*math::Pow2(beta))) : 0; + } + + /// Return the Laplacian computed at the previously buffered + /// location by second-order central differencing. + /// + /// @note This method should not be called until the stencil + /// buffer has been populated via a call to moveTo(ijk). + inline ValueType laplacian() const + { + return mInvDx2 * ( + mStencil[1] + mStencil[2] + + mStencil[3] + mStencil[4] + + mStencil[5] + mStencil[6] - 6*mStencil[0]); + } + + /// Return the gradient computed at the previously buffered + /// location by second-order central differencing. + /// + /// @note This method should not be called until the stencil + /// buffer has been populated via a call to moveTo(ijk). + inline math::Vec3 gradient() + { + return math::Vec3( + mStencil[2] - mStencil[1], + mStencil[4] - mStencil[3], + mStencil[6] - mStencil[5])*mInv2Dx; + } + +private: + inline void init(const Coord &ijk) + { + mStencil[ 1] = mCache.getValue(ijk.offsetBy(-1, 0, 0)); + mStencil[ 2] = mCache.getValue(ijk.offsetBy( 1, 0, 0)); + + mStencil[ 3] = mCache.getValue(ijk.offsetBy( 0, -1, 0)); + mStencil[ 4] = mCache.getValue(ijk.offsetBy( 0, 1, 0)); + + mStencil[ 5] = mCache.getValue(ijk.offsetBy( 0, 0, -1)); + mStencil[ 6] = mCache.getValue(ijk.offsetBy( 0, 0, 1)); + + mStencil[ 7] = mCache.getValue(ijk.offsetBy(-1, -1, 0)); + mStencil[ 8] = mCache.getValue(ijk.offsetBy( 1, -1, 0)); + mStencil[ 9] = mCache.getValue(ijk.offsetBy(-1, 1, 0)); + mStencil[10] = mCache.getValue(ijk.offsetBy( 1, 1, 0)); + + mStencil[11] = mCache.getValue(ijk.offsetBy(-1, 0, -1)); + mStencil[12] = mCache.getValue(ijk.offsetBy( 1, 0, -1)); + mStencil[13] = mCache.getValue(ijk.offsetBy(-1, 0, 1)); + mStencil[14] = mCache.getValue(ijk.offsetBy( 1, 0, 1)); + + mStencil[15] = mCache.getValue(ijk.offsetBy( 0, -1, -1)); + mStencil[16] = mCache.getValue(ijk.offsetBy( 0, 1, -1)); + mStencil[17] = mCache.getValue(ijk.offsetBy( 0, -1, 1)); + mStencil[18] = mCache.getValue(ijk.offsetBy( 0, 1, 1)); + } + + inline bool meanCurvature(Real& alpha, Real& beta) const + { + // For performance all finite differences are unscaled wrt dx + const Real + Half(0.5), Quarter(0.25), + Dx = Half * (mStencil[2] - mStencil[1]), Dx2 = Dx * Dx, // * 1/dx + Dy = Half * (mStencil[4] - mStencil[3]), Dy2 = Dy * Dy, // * 1/dx + Dz = Half * (mStencil[6] - mStencil[5]), Dz2 = Dz * Dz, // * 1/dx + normGrad = Dx2 + Dy2 + Dz2; + if (normGrad <= math::Tolerance::value()) { + alpha = beta = 0; + return false; + } + const Real + Dxx = mStencil[2] - 2 * mStencil[0] + mStencil[1], // * 1/dx2 + Dyy = mStencil[4] - 2 * mStencil[0] + mStencil[3], // * 1/dx2 + Dzz = mStencil[6] - 2 * mStencil[0] + mStencil[5], // * 1/dx2 + Dxy = Quarter * (mStencil[10] - mStencil[ 8] + mStencil[7] - mStencil[ 9]), // * 1/dx2 + Dxz = Quarter * (mStencil[14] - mStencil[12] + mStencil[11] - mStencil[13]), // * 1/dx2 + Dyz = Quarter * (mStencil[18] - mStencil[16] + mStencil[15] - mStencil[17]); // * 1/dx2 + alpha = (Dx2*(Dyy+Dzz)+Dy2*(Dxx+Dzz)+Dz2*(Dxx+Dyy)-2*(Dx*(Dy*Dxy+Dz*Dxz)+Dy*Dz*Dyz)); + beta = std::sqrt(normGrad); // * 1/dx + return true; + } + + template friend class BaseStencil; // allow base class to call init() + using BaseType::mCache; + using BaseType::mStencil; + const ValueType mInv2Dx, mInvDx2; +}; // CurvatureStencil class + + +////////////////////////////////////////////////////////////////////// + + +/// @brief Dense stencil of a given width +template +class DenseStencil: public BaseStencil, GridT, IsSafe> +{ + typedef DenseStencil SelfT; + typedef BaseStencil BaseType; +public: + typedef GridT GridType; + typedef typename GridT::TreeType TreeType; + typedef typename GridType::ValueType ValueType; + + DenseStencil(const GridType& grid, int halfWidth) + : BaseType(grid, /*size=*/math::Pow3(2 * halfWidth + 1)) + , mHalfWidth(halfWidth) + { + assert(halfWidth>0); + } + + inline const ValueType& getCenterValue() const { return mStencil[(mStencil.size()-1)>>1]; } + + /// @brief Initialize the stencil buffer with the values of voxel (x, y, z) + /// and its neighbors. + inline void moveTo(const Coord& ijk) + { + BaseType::mCenter = ijk; + this->init(ijk); + } + /// @brief Initialize the stencil buffer with the values of voxel + /// (x, y, z) and its neighbors. + template + inline void moveTo(const IterType& iter) + { + BaseType::mCenter = iter.getCoord(); + this->init(BaseType::mCenter); + } + +private: + /// Initialize the stencil buffer centered at (i, j, k). + /// @warning The center point is NOT at mStencil[0] for this DenseStencil! + inline void init(const Coord& ijk) + { + int n = 0; + for (Coord p=ijk.offsetBy(-mHalfWidth), q=ijk.offsetBy(mHalfWidth); p[0] <= q[0]; ++p[0]) { + for (p[1] = ijk[1]-mHalfWidth; p[1] <= q[1]; ++p[1]) { + for (p[2] = ijk[2]-mHalfWidth; p[2] <= q[2]; ++p[2]) { + mStencil[n++] = mCache.getValue(p); + } + } + } + } + + template friend class BaseStencil; // allow base class to call init() + using BaseType::mCache; + using BaseType::mStencil; + const int mHalfWidth; +};// DenseStencil class + + +} // end math namespace +} // namespace OPENVDB_VERSION_NAME +} // end openvdb namespace + +#endif // OPENVDB_MATH_STENCILS_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/math/Transform.h b/nuparu/include/openvdb/include/openvdb/math/Transform.h new file mode 100644 index 00000000..df37d0e4 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/math/Transform.h @@ -0,0 +1,310 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_MATH_TRANSFORM_HAS_BEEN_INCLUDED +#define OPENVDB_MATH_TRANSFORM_HAS_BEEN_INCLUDED + +#include "Maps.h" +#include +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace math { + +// Forward declaration +class Transform; + + +// Utility methods + +/// @brief Calculate an axis-aligned bounding box in index space from an +/// axis-aligned bounding box in world space. +/// @see Transform::worldToIndex(const BBoxd&) const +OPENVDB_API void +calculateBounds(const Transform& t, const Vec3d& minWS, const Vec3d& maxWS, + Vec3d& minIS, Vec3d& maxIS); + +/// @brief Calculate an axis-aligned bounding box in index space from a +/// bounding sphere in world space. +/// @todo void calculateBounds(const Transform& t, const Vec3d& center, const Real radius, +/// Vec3d& minIS, Vec3d& maxIS); + + +//////////////////////////////////////// + + +/// @class Transform +class OPENVDB_API Transform +{ +public: + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + Transform(): mMap(MapBase::Ptr(new ScaleMap())) {} + Transform(const MapBase::Ptr&); + Transform(const Transform&); + ~Transform() {} + + Ptr copy() const { return Ptr(new Transform(mMap->copy())); } + + //@{ + /// @brief Create and return a shared pointer to a new transform. + static Transform::Ptr createLinearTransform(double voxelSize = 1.0); + static Transform::Ptr createLinearTransform(const Mat4R&); + static Transform::Ptr createFrustumTransform(const BBoxd&, double taper, + double depth, double voxelSize = 1.0); + //@} + + /// Return @c true if the transformation map is exclusively linear/affine. + bool isLinear() const { return mMap->isLinear(); } + + /// Return @c true if the transform is equivalent to an idenity. + bool isIdentity() const ; + /// Return the transformation map's type-name + Name mapType() const { return mMap->type(); } + + + //@{ + /// @brief Update the linear (affine) map by prepending or + /// postfixing the appropriate operation. In the case of + /// a frustum, the pre-operations apply to the linear part + /// of the transform and not the entire transform, while the + /// post-operations are allways applied last. + void preRotate(double radians, const Axis axis = X_AXIS); + void preTranslate(const Vec3d&); + void preScale(const Vec3d&); + void preScale(double); + void preShear(double shear, Axis axis0, Axis axis1); + void preMult(const Mat4d&); + void preMult(const Mat3d&); + + void postRotate(double radians, const Axis axis = X_AXIS); + void postTranslate(const Vec3d&); + void postScale(const Vec3d&); + void postScale(double); + void postShear(double shear, Axis axis0, Axis axis1); + void postMult(const Mat4d&); + void postMult(const Mat3d&); + //@} + + /// Return the size of a voxel using the linear component of the map. + Vec3d voxelSize() const { return mMap->voxelSize(); } + /// @brief Return the size of a voxel at position (x, y, z). + /// @note Maps that have a nonlinear component (e.g., perspective and frustum maps) + /// have position-dependent voxel sizes. + Vec3d voxelSize(const Vec3d& xyz) const { return mMap->voxelSize(xyz); } + + /// Return the voxel volume of the linear component of the map. + double voxelVolume() const { return mMap->determinant(); } + /// Return the voxel volume at position (x, y, z). + double voxelVolume(const Vec3d& xyz) const { return mMap->determinant(xyz); } + /// Return true if the voxels in world space are uniformly sized cubes + bool hasUniformScale() const { return mMap->hasUniformScale(); } + + //@{ + /// @brief Apply this transformation to the given coordinates. + Vec3d indexToWorld(const Vec3d& xyz) const { return mMap->applyMap(xyz); } + Vec3d indexToWorld(const Coord& ijk) const { return mMap->applyMap(ijk.asVec3d()); } + Vec3d worldToIndex(const Vec3d& xyz) const { return mMap->applyInverseMap(xyz); } + Coord worldToIndexCellCentered(const Vec3d& xyz) const {return Coord::round(worldToIndex(xyz));} + Coord worldToIndexNodeCentered(const Vec3d& xyz) const {return Coord::floor(worldToIndex(xyz));} + //@} + + //@{ + /// @brief Apply this transformation to the given index-space bounding box. + /// @return an axis-aligned world-space bounding box + BBoxd indexToWorld(const CoordBBox&) const; + BBoxd indexToWorld(const BBoxd&) const; + //@} + //@{ + /// @brief Apply the inverse of this transformation to the given world-space bounding box. + /// @return an axis-aligned index-space bounding box + BBoxd worldToIndex(const BBoxd&) const; + CoordBBox worldToIndexCellCentered(const BBoxd&) const; + CoordBBox worldToIndexNodeCentered(const BBoxd&) const; + //@} + + //@{ + /// Return a base pointer to the transformation map. + MapBase::ConstPtr baseMap() const { return mMap; } + MapBase::Ptr baseMap() { return mMap; } + //@} + + //@{ + /// @brief Return the result of downcasting the base map pointer to a + /// @c MapType pointer, or return a null pointer if the types are incompatible. + template typename MapType::Ptr map(); + template typename MapType::ConstPtr map() const; + template typename MapType::ConstPtr constMap() const; + //@} + + /// Unserialize this transform from the given stream. + void read(std::istream&); + /// Serialize this transform to the given stream. + void write(std::ostream&) const; + + /// @brief Print a description of this transform. + /// @param os a stream to which to write textual information + /// @param indent a string with which to prefix each line of text + void print(std::ostream& os = std::cout, const std::string& indent = "") const; + + bool operator==(const Transform& other) const; + inline bool operator!=(const Transform& other) const { return !(*this == other); } + +private: + MapBase::Ptr mMap; +}; // class Transform + + +OPENVDB_API std::ostream& operator<<(std::ostream&, const Transform&); + + +//////////////////////////////////////// + + +template +inline typename MapType::Ptr +Transform::map() +{ + if (mMap->type() == MapType::mapType()) { + return boost::static_pointer_cast(mMap); + } + return typename MapType::Ptr(); +} + + +template +inline typename MapType::ConstPtr +Transform::map() const +{ + return boost::const_pointer_cast( + const_cast(this)->map()); +} + + +template +inline typename MapType::ConstPtr +Transform::constMap() const +{ + return map(); +} + + +//////////////////////////////////////// + + +/// Helper function used internally by processTypedMap() +template +inline void +doProcessTypedMap(Transform& transform, OpType& op) +{ + ResolvedMapType& resolvedMap = *transform.map(); +#ifdef _MSC_VER + op.operator()(resolvedMap); +#else + op.template operator()(resolvedMap); +#endif +} + +/// Helper function used internally by processTypedMap() +template +inline void +doProcessTypedMap(const Transform& transform, OpType& op) +{ + const ResolvedMapType& resolvedMap = *transform.map(); +#ifdef _MSC_VER + op.operator()(resolvedMap); +#else + op.template operator()(resolvedMap); +#endif +} + + +/// @brief Utility function that, given a generic map pointer, +/// calls a functor on the fully-resoved map +/// +/// Usage: +/// @code +/// struct Foo { +/// template +/// void operator()(const MapT& map) const { blah } +/// }; +/// +/// processTypedMap(myMap, Foo()); +/// @endcode +/// +/// @return @c false if the grid type is unknown or unhandled. +template +bool +processTypedMap(TransformType& transform, OpType& op) +{ + using namespace openvdb; + + const Name mapType = transform.mapType(); + if (mapType == UniformScaleMap::mapType()) { + doProcessTypedMap(transform, op); + + } else if (mapType == UniformScaleTranslateMap::mapType()) { + doProcessTypedMap(transform, op); + + } else if (mapType == ScaleMap::mapType()) { + doProcessTypedMap(transform, op); + + } else if (mapType == ScaleTranslateMap::mapType()) { + doProcessTypedMap(transform, op); + + } else if (mapType == UnitaryMap::mapType()) { + doProcessTypedMap(transform, op); + + } else if (mapType == AffineMap::mapType()) { + doProcessTypedMap(transform, op); + + } else if (mapType == TranslationMap::mapType()) { + doProcessTypedMap(transform, op); + + } else if (mapType == NonlinearFrustumMap::mapType()) { + doProcessTypedMap(transform, op); + } else { + return false; + } + return true; +} + +} // namespace math +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_MATH_TRANSFORM_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/math/Tuple.h b/nuparu/include/openvdb/include/openvdb/math/Tuple.h new file mode 100644 index 00000000..f46248a0 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/math/Tuple.h @@ -0,0 +1,212 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file Tuple.h +/// @author Ben Kwa + +#ifndef OPENVDB_MATH_TUPLE_HAS_BEEN_INCLUDED +#define OPENVDB_MATH_TUPLE_HAS_BEEN_INCLUDED + +#include +#include +#include "Math.h" + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace math { + +/// @class Tuple "Tuple.h" +/// A base class for homogenous tuple types +template +class Tuple { +public: + typedef T value_type; + typedef T ValueType; + + static const int size = SIZE; + + /// Default ctor. Does nothing. Required because declaring a copy (or + /// other) constructor means the default constructor gets left out. + Tuple() {} + + /// Copy constructor. Used when the class signature matches exactly. + inline Tuple(Tuple const &src) { + for (int i = 0; i < SIZE; ++i) { + mm[i] = src.mm[i]; + } + } + + /// Conversion constructor. Tuples with different value types and + /// different sizes can be interconverted using this member. Converting + /// from a larger tuple results in truncation; converting from a smaller + /// tuple results in the extra data members being zeroed out. This + /// function assumes that the integer 0 is convertible to the tuple's + /// value type. + template + explicit Tuple(Tuple const &src) { + enum { COPY_END = (SIZE < src_size ? SIZE : src_size) }; + + for (int i = 0; i < COPY_END; ++i) { + mm[i] = src[i]; + } + for (int i = COPY_END; i < SIZE; ++i) { + mm[i] = 0; + } + } + + T operator[](int i) const { + // we'd prefer to use size_t, but can't because gcc3.2 doesn't like + // it - it conflicts with child class conversion operators to + // pointer types. +// assert(i >= 0 && i < SIZE); + return mm[i]; + } + + T& operator[](int i) { + // see above for size_t vs int +// assert(i >= 0 && i < SIZE); + return mm[i]; + } + + /// @name Compatibility + /// These are mostly for backwards compability with functions that take + /// old-style Vs (which are just arrays). + //@{ + /// Copies this tuple into an array of a compatible type + template + void toV(S *v) const { + for (int i = 0; i < SIZE; ++i) { + v[i] = mm[i]; + } + } + + /// Exposes the internal array. Be careful when using this function. + value_type *asV() { + return mm; + } + /// Exposes the internal array. Be careful when using this function. + value_type const *asV() const { + return mm; + } + //@} Compatibility + + /// @return string representation of Classname + std::string + str() const { + std::ostringstream buffer; + + buffer << "["; + + // For each column + for (unsigned j(0); j < SIZE; j++) { + if (j) buffer << ", "; + buffer << mm[j]; + } + + buffer << "]"; + + return buffer.str(); + } + + void write(std::ostream& os) const { + os.write(reinterpret_cast(&mm), sizeof(T)*SIZE); + } + void read(std::istream& is) { + is.read(reinterpret_cast(&mm), sizeof(T)*SIZE); + } + +protected: + T mm[SIZE]; +}; + + +//////////////////////////////////////// + + +/// @return true if t0 < t1, comparing components in order of significance. +template +bool +operator<(const Tuple& t0, const Tuple& t1) +{ + for (int i = 0; i < SIZE-1; ++i) { + if (!isExactlyEqual(t0[i], t1[i])) return t0[i] < t1[i]; + } + return t0[SIZE-1] < t1[SIZE-1]; +} + + +/// @return true if t0 > t1, comparing components in order of significance. +template +bool +operator>(const Tuple& t0, const Tuple& t1) +{ + for (int i = 0; i < SIZE-1; ++i) { + if (!isExactlyEqual(t0[i], t1[i])) return t0[i] > t1[i]; + } + return t0[SIZE-1] > t1[SIZE-1]; +} + + +//////////////////////////////////////// + + +/// @return the absolute value of the given Tuple. +template +Tuple +Abs(const Tuple& t) +{ + Tuple result; + for (int i = 0; i < SIZE; ++i) result[i] = math::Abs(t[i]); + return result; +} + + +//////////////////////////////////////// + + +/// Write a Tuple to an output stream +template +std::ostream& operator<<(std::ostream& ostr, const Tuple& classname) +{ + ostr << classname.str(); + return ostr; +} + +} // namespace math +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_MATH_TUPLE_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/math/Vec2.h b/nuparu/include/openvdb/include/openvdb/math/Vec2.h new file mode 100644 index 00000000..71a1d726 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/math/Vec2.h @@ -0,0 +1,553 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_MATH_VEC2_HAS_BEEN_INCLUDED +#define OPENVDB_MATH_VEC2_HAS_BEEN_INCLUDED + +#include +#include +#include "Math.h" +#include "Tuple.h" + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace math { + +template class Mat2; + +template +class Vec2: public Tuple<2, T> +{ +public: + typedef T value_type; + typedef T ValueType; + + /// Trivial constructor, the vector is NOT initialized + Vec2() {} + + /// Constructor with one argument, e.g. Vec2f v(0); + explicit Vec2(T val) { this->mm[0] = this->mm[1] = val; } + + /// Constructor with two arguments, e.g. Vec2f v(1,2,3); + Vec2(T x, T y) + { + this->mm[0] = x; + this->mm[1] = y; + } + + /// Constructor with array argument, e.g. float a[2]; Vec2f v(a); + template + Vec2(Source *a) + { + this->mm[0] = a[0]; + this->mm[1] = a[1]; + } // trivial + + /// Conversion constructor + template + explicit Vec2(const Tuple<2, Source> &t) + { + this->mm[0] = static_cast(t[0]); + this->mm[1] = static_cast(t[1]); + } + + /// Reference to the component, e.g. v.x() = 4.5f; + T& x() {return this->mm[0];} + T& y() {return this->mm[1];} + + /// Get the component, e.g. float f = v.y(); + T x() const {return this->mm[0];} + T y() const {return this->mm[1];} + + /// Alternative indexed reference to the elements + T& operator()(int i) {return this->mm[i];} + + /// Alternative indexed constant reference to the elements, + T operator()(int i) const {return this->mm[i];} + + T* asPointer() {return this->mm;} + const T* asPointer() const {return this->mm;} + + /// "this" vector gets initialized to [x, y, z], + /// calling v.init(); has same effect as calling v = Vec2::zero(); + const Vec2& init(T x=0, T y=0) + { + this->mm[0] = x; this->mm[1] = y; + return *this; + } + + /// Set "this" vector to zero + const Vec2& setZero() + { + this->mm[0] = 0; this->mm[1] = 0; + return *this; + } + + /// Assignment operator + template + const Vec2& operator=(const Vec2 &v) + { + // note: don't static_cast because that suppresses warnings + this->mm[0] = v[0]; + this->mm[1] = v[1]; + + return *this; + } + + /// Equality operator, does exact floating point comparisons + bool operator==(const Vec2 &v) const + { + return (isExactlyEqual(this->mm[0], v.mm[0]) && isExactlyEqual(this->mm[1], v.mm[1])); + } + + /// Inequality operator, does exact floating point comparisons + bool operator!=(const Vec2 &v) const { return !(*this==v); } + + /// Test if "this" vector is equivalent to vector v with tolerance of eps + bool eq(const Vec2 &v, T eps = static_cast(1.0e-7)) const + { + return isApproxEqual(this->mm[0], v.mm[0], eps) && + isApproxEqual(this->mm[1], v.mm[1], eps); + } // trivial + + /// Negation operator, for e.g. v1 = -v2; + Vec2 operator-() const {return Vec2(-this->mm[0], -this->mm[1]);} + + /// this = v1 + v2 + /// "this", v1 and v2 need not be distinct objects, e.g. v.add(v1,v); + template + const Vec2& add(const Vec2 &v1, const Vec2 &v2) + { + this->mm[0] = v1[0] + v2[0]; + this->mm[1] = v1[1] + v2[1]; + + return *this; + } + + /// this = v1 - v2 + /// "this", v1 and v2 need not be distinct objects, e.g. v.sub(v1,v); + template + const Vec2& sub(const Vec2 &v1, const Vec2 &v2) + { + this->mm[0] = v1[0] - v2[0]; + this->mm[1] = v1[1] - v2[1]; + + return *this; + } + + /// this = scalar*v, v need not be a distinct object from "this", + /// e.g. v.scale(1.5,v1); + template + const Vec2& scale(T0 scalar, const Vec2 &v) + { + this->mm[0] = scalar * v[0]; + this->mm[1] = scalar * v[1]; + + return *this; + } + + template + const Vec2 &div(T0 scalar, const Vec2 &v) + { + this->mm[0] = v[0] / scalar; + this->mm[1] = v[1] / scalar; + + return *this; + } + + /// Dot product + T dot(const Vec2 &v) const { return this->mm[0]*v[0] + this->mm[1]*v[1]; } // trivial + + /// Length of the vector + T length() const + { + return static_cast(sqrt(double(this->mm[0]*this->mm[0] + this->mm[1]*this->mm[1]))); + } + + /// Squared length of the vector, much faster than length() as it + /// does not involve square root + T lengthSqr() const { return (this->mm[0]*this->mm[0] + this->mm[1]*this->mm[1]); } + + /// Return a reference to itsef after the exponent has been + /// applied to all the vector components. + inline const Vec2& exp() + { + this->mm[0] = std::exp(this->mm[0]); + this->mm[1] = std::exp(this->mm[1]); + return *this; + } + + /// Return the sum of all the vector components. + inline T sum() const + { + return this->mm[0] + this->mm[1]; + } + + /// this = normalized this + bool normalize(T eps=1.0e-8) + { + T d = length(); + if (isApproxEqual(d, T(0), eps)) { + return false; + } + *this *= (T(1) / d); + return true; + } + + /// return normalized this, throws if null vector + Vec2 unit(T eps=0) const + { + T d; + return unit(eps, d); + } + + /// return normalized this and length, throws if null vector + Vec2 unit(T eps, T& len) const + { + len = length(); + if (isApproxEqual(len, T(0), eps)) { + OPENVDB_THROW(ArithmeticError, "Normalizing null 2-vector"); + } + return *this / len; + } + + /// Returns v, where \f$v_i *= scalar\f$ for \f$i \in [0, 1]\f$ + template + const Vec2 &operator*=(S scalar) + { + this->mm[0] *= scalar; + this->mm[1] *= scalar; + return *this; + } + + /// Returns v0, where \f$v0_i *= v1_i\f$ for \f$i \in [0, 1]\f$ + template + const Vec2 &operator*=(const Vec2 &v1) + { + this->mm[0] *= v1[0]; + this->mm[1] *= v1[1]; + return *this; + } + + /// Returns v, where \f$v_i /= scalar\f$ for \f$i \in [0, 1]\f$ + template + const Vec2 &operator/=(S scalar) + { + this->mm[0] /= scalar; + this->mm[1] /= scalar; + return *this; + } + + /// Returns v0, where \f$v0_i /= v1_i\f$ for \f$i \in [0, 1]\f$ + template + const Vec2 &operator/=(const Vec2 &v1) + { + this->mm[0] /= v1[0]; + this->mm[1] /= v1[1]; + return *this; + } + + /// Returns v, where \f$v_i += scalar\f$ for \f$i \in [0, 1]\f$ + template + const Vec2 &operator+=(S scalar) + { + this->mm[0] += scalar; + this->mm[1] += scalar; + return *this; + } + + /// Returns v0, where \f$v0_i += v1_i\f$ for \f$i \in [0, 1]\f$ + template + const Vec2 &operator+=(const Vec2 &v1) + { + this->mm[0] += v1[0]; + this->mm[1] += v1[1]; + return *this; + } + + /// Returns v, where \f$v_i += scalar\f$ for \f$i \in [0, 1]\f$ + template + const Vec2 &operator-=(S scalar) + { + this->mm[0] -= scalar; + this->mm[1] -= scalar; + return *this; + } + + /// Returns v0, where \f$v0_i -= v1_i\f$ for \f$i \in [0, 1]\f$ + template + const Vec2 &operator-=(const Vec2 &v1) + { + this->mm[0] -= v1[0]; + this->mm[1] -= v1[1]; + return *this; + } + + // Number of cols, rows, elements + static unsigned numRows() { return 1; } + static unsigned numColumns() { return 2; } + static unsigned numElements() { return 2; } + + /// Returns the scalar component of v in the direction of onto, onto need + /// not be unit. e.g float c = Vec2f::component(v1,v2); + T component(const Vec2 &onto, T eps=1.0e-8) const + { + T l = onto.length(); + if (isApproxEqual(l, T(0), eps)) return 0; + + return dot(onto)*(T(1)/l); + } + + /// Return the projection of v onto the vector, onto need not be unit + /// e.g. Vec2f v = Vec2f::projection(v,n); + Vec2 projection(const Vec2 &onto, T eps=1.0e-8) const + { + T l = onto.lengthSqr(); + if (isApproxEqual(l, T(0), eps)) return Vec2::zero(); + + return onto*(dot(onto)*(T(1)/l)); + } + + /// Return an arbitrary unit vector perpendicular to v + /// Vector v must be a unit vector + /// e.g. v.normalize(); Vec2f n = Vec2f::getArbPerpendicular(v); + Vec2 getArbPerpendicular() const { return Vec2(-this->mm[1], this->mm[0]); } + + /// True if a Nan is present in vector + bool isNan() const { return isnan(this->mm[0]) || isnan(this->mm[1]); } + + /// True if an Inf is present in vector + bool isInfinite() const { return isinf(this->mm[0]) || isinf(this->mm[1]); } + + /// True if all no Nan or Inf values present + bool isFinite() const { return finite(this->mm[0]) && finite(this->mm[1]); } + + /// Predefined constants, e.g. Vec2f v = Vec2f::xNegAxis(); + static Vec2 zero() { return Vec2(0, 0); } +}; + + +/// Returns V, where \f$V_i = v_i * scalar\f$ for \f$i \in [0, 1]\f$ +template +inline Vec2::type> operator*(S scalar, const Vec2 &v) +{ + return v * scalar; +} + +/// Returns V, where \f$V_i = v_i * scalar\f$ for \f$i \in [0, 1]\f$ +template +inline Vec2::type> operator*(const Vec2 &v, S scalar) +{ + Vec2::type> result(v); + result *= scalar; + return result; +} + +/// Returns V, where \f$V_i = v0_i * v1_i\f$ for \f$i \in [0, 1]\f$ +template +inline Vec2::type> operator*(const Vec2 &v0, const Vec2 &v1) +{ + Vec2::type> result(v0[0] * v1[0], v0[1] * v1[1]); + return result; +} + +/// Returns V, where \f$V_i = scalar / v_i\f$ for \f$i \in [0, 1]\f$ +template +inline Vec2::type> operator/(S scalar, const Vec2 &v) +{ + return Vec2::type>(scalar/v[0], scalar/v[1]); +} + +/// Returns V, where \f$V_i = v_i / scalar\f$ for \f$i \in [0, 1]\f$ +template +inline Vec2::type> operator/(const Vec2 &v, S scalar) +{ + Vec2::type> result(v); + result /= scalar; + return result; +} + +/// Returns V, where \f$V_i = v0_i / v1_i\f$ for \f$i \in [0, 1]\f$ +template +inline Vec2::type> operator/(const Vec2 &v0, const Vec2 &v1) +{ + Vec2::type> result(v0[0] / v1[0], v0[1] / v1[1]); + return result; +} + +/// Returns V, where \f$V_i = v0_i + v1_i\f$ for \f$i \in [0, 1]\f$ +template +inline Vec2::type> operator+(const Vec2 &v0, const Vec2 &v1) +{ + Vec2::type> result(v0); + result += v1; + return result; +} + +/// Returns V, where \f$V_i = v_i + scalar\f$ for \f$i \in [0, 1]\f$ +template +inline Vec2::type> operator+(const Vec2 &v, S scalar) +{ + Vec2::type> result(v); + result += scalar; + return result; +} + +/// Returns V, where \f$V_i = v0_i - v1_i\f$ for \f$i \in [0, 1]\f$ +template +inline Vec2::type> operator-(const Vec2 &v0, const Vec2 &v1) +{ + Vec2::type> result(v0); + result -= v1; + return result; +} + +/// Returns V, where \f$V_i = v_i - scalar\f$ for \f$i \in [0, 1]\f$ +template +inline Vec2::type> operator-(const Vec2 &v, S scalar) +{ + Vec2::type> result(v); + result -= scalar; + return result; +} + +/// Angle between two vectors, the result is between [0, pi], +/// e.g. float a = Vec2f::angle(v1,v2); +template +inline T angle(const Vec2 &v1, const Vec2 &v2) +{ + T c = v1.dot(v2); + return acos(c); +} + +template +inline bool +isApproxEqual(const Vec2& a, const Vec2& b) +{ + return a.eq(b); +} +template +inline bool +isApproxEqual(const Vec2& a, const Vec2& b, const Vec2& eps) +{ + return isApproxEqual(a.x(), b.x(), eps.x()) && + isApproxEqual(a.y(), b.y(), eps.y()); +} + +template +inline bool +isFinite(const Vec2& v) +{ + return isFinite(v[0]) && isFinite(v[1]); +} + +/// Return @c true if all components are exactly equal to zero. +template +inline bool +isZero(const Vec2& v) +{ + return isZero(v[0]) && isZero(v[1]); +} + +template +inline Vec2 +Abs(const Vec2& v) +{ + return Vec2(Abs(v[0]), Abs(v[1])); +} + +/// Orthonormalize vectors v1 and v2 and store back the resulting basis +/// e.g. Vec2f::orthonormalize(v1,v2); +template +inline void orthonormalize(Vec2 &v1, Vec2 &v2) +{ + // If the input vectors are v0, v1, and v2, then the Gram-Schmidt + // orthonormalization produces vectors u0, u1, and u2 as follows, + // + // u0 = v0/|v0| + // u1 = (v1-(u0*v1)u0)/|v1-(u0*v1)u0| + // + // where |A| indicates length of vector A and A*B indicates dot + // product of vectors A and B. + + // compute u0 + v1.normalize(); + + // compute u1 + T d0 = v1.dot(v2); + v2 -= v1*d0; + v2.normalize(); +} + + +/// \remark We are switching to a more explicit name because the semantics +/// are different from std::min/max. In that case, the function returns a +/// reference to one of the objects based on a comparator. Here, we must +/// fabricate a new object which might not match either of the inputs. + +/// Return component-wise minimum of the two vectors. +template +inline Vec2 minComponent(const Vec2 &v1, const Vec2 &v2) +{ + return Vec2( + std::min(v1.x(), v2.x()), + std::min(v1.y(), v2.y())); +} + +/// Return component-wise maximum of the two vectors. +template +inline Vec2 maxComponent(const Vec2 &v1, const Vec2 &v2) +{ + return Vec2( + std::max(v1.x(), v2.x()), + std::max(v1.y(), v2.y())); +} + +/// @brief Return a vector with the exponent applied to each of +/// the components of the input vector. +template +inline Vec2 Exp(Vec2 v) { return v.exp(); } + +typedef Vec2 Vec2i; +typedef Vec2 Vec2ui; +typedef Vec2 Vec2s; +typedef Vec2 Vec2d; + +} // namespace math +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_MATH_VEC2_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/math/Vec3.h b/nuparu/include/openvdb/include/openvdb/math/Vec3.h new file mode 100644 index 00000000..9b4a8a85 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/math/Vec3.h @@ -0,0 +1,661 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_MATH_VEC3_HAS_BEEN_INCLUDED +#define OPENVDB_MATH_VEC3_HAS_BEEN_INCLUDED + +#include +#include +#include "Math.h" +#include "Tuple.h" + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace math { + +template class Mat3; + +template +class Vec3: public Tuple<3, T> +{ +public: + typedef T value_type; + typedef T ValueType; + + /// Trivial constructor, the vector is NOT initialized + Vec3() {} + + /// Constructor with one argument, e.g. Vec3f v(0); + explicit Vec3(T val) { this->mm[0] = this->mm[1] = this->mm[2] = val; } + + /// Constructor with three arguments, e.g. Vec3d v(1,2,3); + Vec3(T x, T y, T z) + { + this->mm[0] = x; + this->mm[1] = y; + this->mm[2] = z; + } + + /// Constructor with array argument, e.g. double a[3]; Vec3d v(a); + template + Vec3(Source *a) + { + this->mm[0] = a[0]; + this->mm[1] = a[1]; + this->mm[2] = a[2]; + } + + /// @brief Construct a Vec3 from a 3-Tuple with a possibly different value type. + /// @details Type conversion warnings are suppressed. + template + explicit Vec3(const Tuple<3, Source> &v) + { + this->mm[0] = static_cast(v[0]); + this->mm[1] = static_cast(v[1]); + this->mm[2] = static_cast(v[2]); + } + + /// @brief Construct a Vec3 from another Vec3 with a possibly different value type. + /// @details Type conversion warnings are suppressed. + template + Vec3(const Vec3& v) + { + this->mm[0] = static_cast(v[0]); + this->mm[1] = static_cast(v[1]); + this->mm[2] = static_cast(v[2]); + } + + /// Reference to the component, e.g. v.x() = 4.5f; + T& x() { return this->mm[0]; } + T& y() { return this->mm[1]; } + T& z() { return this->mm[2]; } + + /// Get the component, e.g. float f = v.y(); + T x() const { return this->mm[0]; } + T y() const { return this->mm[1]; } + T z() const { return this->mm[2]; } + + T* asPointer() { return this->mm; } + const T* asPointer() const { return this->mm; } + + /// Alternative indexed reference to the elements + T& operator()(int i) { return this->mm[i]; } + + /// Alternative indexed constant reference to the elements, + T operator()(int i) const { return this->mm[i]; } + + /// "this" vector gets initialized to [x, y, z], + /// calling v.init(); has same effect as calling v = Vec3::zero(); + const Vec3& init(T x=0, T y=0, T z=0) + { + this->mm[0] = x; this->mm[1] = y; this->mm[2] = z; + return *this; + } + + + /// Set "this" vector to zero + const Vec3& setZero() + { + this->mm[0] = 0; this->mm[1] = 0; this->mm[2] = 0; + return *this; + } + + /// @brief Assignment operator + /// @details Type conversion warnings are not suppressed. + template + const Vec3& operator=(const Vec3 &v) + { + // note: don't static_cast because that suppresses warnings + this->mm[0] = v[0]; + this->mm[1] = v[1]; + this->mm[2] = v[2]; + + return *this; + } + + /// Test if "this" vector is equivalent to vector v with tolerance of eps + bool eq(const Vec3 &v, T eps = static_cast(1.0e-7)) const + { + return isRelOrApproxEqual(this->mm[0], v.mm[0], eps, eps) && + isRelOrApproxEqual(this->mm[1], v.mm[1], eps, eps) && + isRelOrApproxEqual(this->mm[2], v.mm[2], eps, eps); + } + + + /// Negation operator, for e.g. v1 = -v2; + Vec3 operator-() const { return Vec3(-this->mm[0], -this->mm[1], -this->mm[2]); } + + /// this = v1 + v2 + /// "this", v1 and v2 need not be distinct objects, e.g. v.add(v1,v); + template + const Vec3& add(const Vec3 &v1, const Vec3 &v2) + { + this->mm[0] = v1[0] + v2[0]; + this->mm[1] = v1[1] + v2[1]; + this->mm[2] = v1[2] + v2[2]; + + return *this; + } + + /// this = v1 - v2 + /// "this", v1 and v2 need not be distinct objects, e.g. v.sub(v1,v); + template + const Vec3& sub(const Vec3 &v1, const Vec3 &v2) + { + this->mm[0] = v1[0] - v2[0]; + this->mm[1] = v1[1] - v2[1]; + this->mm[2] = v1[2] - v2[2]; + + return *this; + } + + /// this = scalar*v, v need not be a distinct object from "this", + /// e.g. v.scale(1.5,v1); + template + const Vec3& scale(T0 scale, const Vec3 &v) + { + this->mm[0] = scale * v[0]; + this->mm[1] = scale * v[1]; + this->mm[2] = scale * v[2]; + + return *this; + } + + template + const Vec3 &div(T0 scale, const Vec3 &v) + { + this->mm[0] = v[0] / scale; + this->mm[1] = v[1] / scale; + this->mm[2] = v[2] / scale; + + return *this; + } + + /// Dot product + T dot(const Vec3 &v) const + { + return + this->mm[0]*v.mm[0] + + this->mm[1]*v.mm[1] + + this->mm[2]*v.mm[2]; + } + + /// Length of the vector + T length() const + { + return static_cast(sqrt(double( + this->mm[0]*this->mm[0] + + this->mm[1]*this->mm[1] + + this->mm[2]*this->mm[2]))); + } + + + /// Squared length of the vector, much faster than length() as it + /// does not involve square root + T lengthSqr() const + { + return + this->mm[0]*this->mm[0] + + this->mm[1]*this->mm[1] + + this->mm[2]*this->mm[2]; + } + + /// Return the cross product of "this" vector and v; + Vec3 cross(const Vec3 &v) const + { + return Vec3(this->mm[1]*v.mm[2] - this->mm[2]*v.mm[1], + this->mm[2]*v.mm[0] - this->mm[0]*v.mm[2], + this->mm[0]*v.mm[1] - this->mm[1]*v.mm[0]); + } + + + /// this = v1 cross v2, v1 and v2 must be distinct objects than "this" + const Vec3& cross(const Vec3 &v1, const Vec3 &v2) + { + // assert(this!=&v1); + // assert(this!=&v2); + this->mm[0] = v1.mm[1]*v2.mm[2] - v1.mm[2]*v2.mm[1]; + this->mm[1] = v1.mm[2]*v2.mm[0] - v1.mm[0]*v2.mm[2]; + this->mm[2] = v1.mm[0]*v2.mm[1] - v1.mm[1]*v2.mm[0]; + return *this; + } + + /// Returns v, where \f$v_i *= scalar\f$ for \f$i \in [0, 2]\f$ + template + const Vec3 &operator*=(S scalar) + { + this->mm[0] = static_cast(this->mm[0] * scalar); + this->mm[1] = static_cast(this->mm[1] * scalar); + this->mm[2] = static_cast(this->mm[2] * scalar); + return *this; + } + + /// Returns v0, where \f$v0_i *= v1_i\f$ for \f$i \in [0, 2]\f$ + template + const Vec3 &operator*=(const Vec3 &v1) + { + this->mm[0] *= v1[0]; + this->mm[1] *= v1[1]; + this->mm[2] *= v1[2]; + return *this; + } + + /// Returns v, where \f$v_i /= scalar\f$ for \f$i \in [0, 2]\f$ + template + const Vec3 &operator/=(S scalar) + { + this->mm[0] /= scalar; + this->mm[1] /= scalar; + this->mm[2] /= scalar; + return *this; + } + + /// Returns v0, where \f$v0_i /= v1_i\f$ for \f$i \in [0, 2]\f$ + template + const Vec3 &operator/=(const Vec3 &v1) + { + this->mm[0] /= v1[0]; + this->mm[1] /= v1[1]; + this->mm[2] /= v1[2]; + return *this; + } + + /// Returns v, where \f$v_i += scalar\f$ for \f$i \in [0, 2]\f$ + template + const Vec3 &operator+=(S scalar) + { + this->mm[0] = static_cast(this->mm[0] + scalar); + this->mm[1] = static_cast(this->mm[1] + scalar); + this->mm[2] = static_cast(this->mm[2] + scalar); + return *this; + } + + /// Returns v0, where \f$v0_i += v1_i\f$ for \f$i \in [0, 2]\f$ + template + const Vec3 &operator+=(const Vec3 &v1) + { + this->mm[0] += v1[0]; + this->mm[1] += v1[1]; + this->mm[2] += v1[2]; + return *this; + } + + /// Returns v, where \f$v_i += scalar\f$ for \f$i \in [0, 2]\f$ + template + const Vec3 &operator-=(S scalar) + { + this->mm[0] -= scalar; + this->mm[1] -= scalar; + this->mm[2] -= scalar; + return *this; + } + + /// Returns v0, where \f$v0_i -= v1_i\f$ for \f$i \in [0, 2]\f$ + template + const Vec3 &operator-=(const Vec3 &v1) + { + this->mm[0] -= v1[0]; + this->mm[1] -= v1[1]; + this->mm[2] -= v1[2]; + return *this; + } + + /// Return a reference to itsef after the exponent has been + /// applied to all the vector components. + inline const Vec3& exp() + { + this->mm[0] = std::exp(this->mm[0]); + this->mm[1] = std::exp(this->mm[1]); + this->mm[2] = std::exp(this->mm[2]); + return *this; + } + + /// Return the sum of all the vector components. + inline T sum() const + { + return this->mm[0] + this->mm[1] + this->mm[2]; + } + + /// this = normalized this + bool normalize(T eps = T(1.0e-7)) + { + T d = length(); + if (isApproxEqual(d, T(0), eps)) { + return false; + } + *this *= (T(1) / d); + return true; + } + + + /// return normalized this, throws if null vector + Vec3 unit(T eps=0) const + { + T d; + return unit(eps, d); + } + + /// return normalized this and length, throws if null vector + Vec3 unit(T eps, T& len) const + { + len = length(); + if (isApproxEqual(len, T(0), eps)) { + OPENVDB_THROW(ArithmeticError, "Normalizing null 3-vector"); + } + return *this / len; + } + + // Number of cols, rows, elements + static unsigned numRows() { return 1; } + static unsigned numColumns() { return 3; } + static unsigned numElements() { return 3; } + + /// Returns the scalar component of v in the direction of onto, onto need + /// not be unit. e.g double c = Vec3d::component(v1,v2); + T component(const Vec3 &onto, T eps = static_cast(1.0e-7)) const + { + T l = onto.length(); + if (isApproxEqual(l, T(0), eps)) return 0; + + return dot(onto)*(T(1)/l); + } + + /// Return the projection of v onto the vector, onto need not be unit + /// e.g. Vec3d a = vprojection(n); + Vec3 projection(const Vec3 &onto, T eps = static_cast(1.0e-7)) const + { + T l = onto.lengthSqr(); + if (isApproxEqual(l, T(0), eps)) return Vec3::zero(); + + return onto*(dot(onto)*(T(1)/l)); + } + + /// Return an arbitrary unit vector perpendicular to v + /// Vector this must be a unit vector + /// e.g. v = v.normalize(); Vec3d n = v.getArbPerpendicular(); + Vec3 getArbPerpendicular() const + { + Vec3 u; + T l; + + if ( fabs(this->mm[0]) >= fabs(this->mm[1]) ) { + // v.x or v.z is the largest magnitude component, swap them + l = this->mm[0]*this->mm[0] + this->mm[2]*this->mm[2]; + l = static_cast(T(1)/sqrt(double(l))); + u.mm[0] = -this->mm[2]*l; + u.mm[1] = (T)0.0; + u.mm[2] = +this->mm[0]*l; + } else { + // W.y or W.z is the largest magnitude component, swap them + l = this->mm[1]*this->mm[1] + this->mm[2]*this->mm[2]; + l = static_cast(T(1)/sqrt(double(l))); + u.mm[0] = (T)0.0; + u.mm[1] = +this->mm[2]*l; + u.mm[2] = -this->mm[1]*l; + } + + return u; + } + + /// True if a Nan is present in vector + bool isNan() const { return isnan(this->mm[0]) || isnan(this->mm[1]) || isnan(this->mm[2]); } + + /// True if an Inf is present in vector + bool isInfinite() const + { + return isinf(this->mm[0]) || isinf(this->mm[1]) || isinf(this->mm[2]); + } + + /// True if all no Nan or Inf values present + bool isFinite() const + { + return finite(this->mm[0]) && finite(this->mm[1]) && finite(this->mm[2]); + } + + /// Predefined constants, e.g. Vec3d v = Vec3d::xNegAxis(); + static Vec3 zero() { return Vec3(0, 0, 0); } +}; + + +/// Equality operator, does exact floating point comparisons +template +inline bool operator==(const Vec3 &v0, const Vec3 &v1) +{ + return isExactlyEqual(v0[0], v1[0]) && isExactlyEqual(v0[1], v1[1]) + && isExactlyEqual(v0[2], v1[2]); +} + +/// Inequality operator, does exact floating point comparisons +template +inline bool operator!=(const Vec3 &v0, const Vec3 &v1) { return !(v0==v1); } + +/// Returns V, where \f$V_i = v_i * scalar\f$ for \f$i \in [0, 2]\f$ +template +inline Vec3::type> operator*(S scalar, const Vec3 &v) { return v*scalar; } + +/// Returns V, where \f$V_i = v_i * scalar\f$ for \f$i \in [0, 2]\f$ +template +inline Vec3::type> operator*(const Vec3 &v, S scalar) +{ + Vec3::type> result(v); + result *= scalar; + return result; +} + +/// Returns V, where \f$V_i = v0_i * v1_i\f$ for \f$i \in [0, 2]\f$ +template +inline Vec3::type> operator*(const Vec3 &v0, const Vec3 &v1) +{ + Vec3::type> result(v0[0] * v1[0], v0[1] * v1[1], v0[2] * v1[2]); + return result; +} + + +/// Returns V, where \f$V_i = scalar / v_i\f$ for \f$i \in [0, 2]\f$ +template +inline Vec3::type> operator/(S scalar, const Vec3 &v) +{ + return Vec3::type>(scalar/v[0], scalar/v[1], scalar/v[2]); +} + +/// Returns V, where \f$V_i = v_i / scalar\f$ for \f$i \in [0, 2]\f$ +template +inline Vec3::type> operator/(const Vec3 &v, S scalar) +{ + Vec3::type> result(v); + result /= scalar; + return result; +} + +/// Returns V, where \f$V_i = v0_i / v1_i\f$ for \f$i \in [0, 2]\f$ +template +inline Vec3::type> operator/(const Vec3 &v0, const Vec3 &v1) +{ + Vec3::type> result(v0[0] / v1[0], v0[1] / v1[1], v0[2] / v1[2]); + return result; +} + +/// Returns V, where \f$V_i = v0_i + v1_i\f$ for \f$i \in [0, 2]\f$ +template +inline Vec3::type> operator+(const Vec3 &v0, const Vec3 &v1) +{ + Vec3::type> result(v0); + result += v1; + return result; +} + +/// Returns V, where \f$V_i = v_i + scalar\f$ for \f$i \in [0, 2]\f$ +template +inline Vec3::type> operator+(const Vec3 &v, S scalar) +{ + Vec3::type> result(v); + result += scalar; + return result; +} + +/// Returns V, where \f$V_i = v0_i - v1_i\f$ for \f$i \in [0, 2]\f$ +template +inline Vec3::type> operator-(const Vec3 &v0, const Vec3 &v1) +{ + Vec3::type> result(v0); + result -= v1; + return result; +} + +/// Returns V, where \f$V_i = v_i - scalar\f$ for \f$i \in [0, 2]\f$ +template +inline Vec3::type> operator-(const Vec3 &v, S scalar) +{ + Vec3::type> result(v); + result -= scalar; + return result; +} + +/// Angle between two vectors, the result is between [0, pi], +/// e.g. double a = Vec3d::angle(v1,v2); +template +inline T angle(const Vec3 &v1, const Vec3 &v2) +{ + Vec3 c = v1.cross(v2); + return static_cast(atan2(c.length(), v1.dot(v2))); +} + +template +inline bool +isApproxEqual(const Vec3& a, const Vec3& b) +{ + return a.eq(b); +} +template +inline bool +isApproxEqual(const Vec3& a, const Vec3& b, const Vec3& eps) +{ + return isApproxEqual(a.x(), b.x(), eps.x()) && + isApproxEqual(a.y(), b.y(), eps.y()) && + isApproxEqual(a.z(), b.z(), eps.z()); +} + +template +inline bool +isFinite(const Vec3& v) +{ + return isFinite(v[0]) && isFinite(v[1]) && isFinite(v[2]); +} + +/// Return @c true if all components are exactly equal to zero. +template +inline bool +isZero(const Vec3& v) +{ + return isZero(v[0]) && isZero(v[1]) && isZero(v[2]); +} + +template +inline Vec3 +Abs(const Vec3& v) +{ + return Vec3(Abs(v[0]), Abs(v[1]), Abs(v[2])); +} + +/// Orthonormalize vectors v1, v2 and v3 and store back the resulting +/// basis e.g. Vec3d::orthonormalize(v1,v2,v3); +template +inline void orthonormalize(Vec3 &v1, Vec3 &v2, Vec3 &v3) +{ + // If the input vectors are v0, v1, and v2, then the Gram-Schmidt + // orthonormalization produces vectors u0, u1, and u2 as follows, + // + // u0 = v0/|v0| + // u1 = (v1-(u0*v1)u0)/|v1-(u0*v1)u0| + // u2 = (v2-(u0*v2)u0-(u1*v2)u1)/|v2-(u0*v2)u0-(u1*v2)u1| + // + // where |A| indicates length of vector A and A*B indicates dot + // product of vectors A and B. + + // compute u0 + v1.normalize(); + + // compute u1 + T d0 = v1.dot(v2); + v2 -= v1*d0; + v2.normalize(); + + // compute u2 + T d1 = v2.dot(v3); + d0 = v1.dot(v3); + v3 -= v1*d0 + v2*d1; + v3.normalize(); +} + +/// @remark We are switching to a more explicit name because the semantics +/// are different from std::min/max. In that case, the function returns a +/// reference to one of the objects based on a comparator. Here, we must +/// fabricate a new object which might not match either of the inputs. + +/// Return component-wise minimum of the two vectors. +template +inline Vec3 minComponent(const Vec3 &v1, const Vec3 &v2) +{ + return Vec3( + std::min(v1.x(), v2.x()), + std::min(v1.y(), v2.y()), + std::min(v1.z(), v2.z())); +} + +/// Return component-wise maximum of the two vectors. +template +inline Vec3 maxComponent(const Vec3 &v1, const Vec3 &v2) +{ + return Vec3( + std::max(v1.x(), v2.x()), + std::max(v1.y(), v2.y()), + std::max(v1.z(), v2.z())); +} + +/// @brief Return a vector with the exponent applied to each of +/// the components of the input vector. +template +inline Vec3 Exp(Vec3 v) { return v.exp(); } + +typedef Vec3 Vec3i; +typedef Vec3 Vec3ui; +typedef Vec3 Vec3s; +typedef Vec3 Vec3d; + +} // namespace math +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_MATH_VEC3_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/math/Vec4.h b/nuparu/include/openvdb/include/openvdb/math/Vec4.h new file mode 100644 index 00000000..64ac29fb --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/math/Vec4.h @@ -0,0 +1,594 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_MATH_VEC4_HAS_BEEN_INCLUDED +#define OPENVDB_MATH_VEC4_HAS_BEEN_INCLUDED + +#include +#include +#include "Math.h" +#include "Tuple.h" +#include "Vec3.h" + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace math { + +template class Mat3; + +template +class Vec4: public Tuple<4, T> +{ +public: + typedef T value_type; + typedef T ValueType; + + /// Trivial constructor, the vector is NOT initialized + Vec4() {} + + /// Constructor with one argument, e.g. Vec4f v(0); + explicit Vec4(T val) { this->mm[0] = this->mm[1] = this->mm[2] = this->mm[3] = val; } + + /// Constructor with four arguments, e.g. Vec4f v(1,2,3,4); + Vec4(T x, T y, T z, T w) + { + this->mm[0] = x; + this->mm[1] = y; + this->mm[2] = z; + this->mm[3] = w; + } + + /// Constructor with array argument, e.g. float a[4]; Vec4f v(a); + template + Vec4(Source *a) + { + this->mm[0] = a[0]; + this->mm[1] = a[1]; + this->mm[2] = a[2]; + this->mm[3] = a[3]; + } + + /// Conversion constructor + template + explicit Vec4(const Tuple<4, Source> &v) + { + this->mm[0] = static_cast(v[0]); + this->mm[1] = static_cast(v[1]); + this->mm[2] = static_cast(v[2]); + this->mm[3] = static_cast(v[3]); + } + + /// Reference to the component, e.g. v.x() = 4.5f; + T& x() { return this->mm[0]; } + T& y() { return this->mm[1]; } + T& z() { return this->mm[2]; } + T& w() { return this->mm[3]; } + + /// Get the component, e.g. float f = v.y(); + T x() const { return this->mm[0]; } + T y() const { return this->mm[1]; } + T z() const { return this->mm[2]; } + T w() const { return this->mm[3]; } + + T* asPointer() { return this->mm; } + const T* asPointer() const { return this->mm; } + + /// Alternative indexed reference to the elements + T& operator()(int i) { return this->mm[i]; } + + /// Alternative indexed constant reference to the elements, + T operator()(int i) const { return this->mm[i]; } + + /// Returns a Vec3 with the first three elements of the Vec4. + Vec3 getVec3() const { return Vec3(this->mm[0], this->mm[1], this->mm[2]); } + + /// "this" vector gets initialized to [x, y, z, w], + /// calling v.init(); has same effect as calling v = Vec4::zero(); + const Vec4& init(T x=0, T y=0, T z=0, T w=0) + { + this->mm[0] = x; this->mm[1] = y; this->mm[2] = z; this->mm[3] = w; + return *this; + } + + /// Set "this" vector to zero + const Vec4& setZero() + { + this->mm[0] = 0; this->mm[1] = 0; this->mm[2] = 0; this->mm[3] = 0; + return *this; + } + + /// Assignment operator + template + const Vec4& operator=(const Vec4 &v) + { + // note: don't static_cast because that suppresses warnings + this->mm[0] = v[0]; + this->mm[1] = v[1]; + this->mm[2] = v[2]; + this->mm[3] = v[3]; + + return *this; + } + + /// Test if "this" vector is equivalent to vector v with tolerance + /// of eps + bool eq(const Vec4 &v, T eps=1.0e-8) const + { + return isApproxEqual(this->mm[0], v.mm[0], eps) && + isApproxEqual(this->mm[1], v.mm[1], eps) && + isApproxEqual(this->mm[2], v.mm[2], eps) && + isApproxEqual(this->mm[3], v.mm[3], eps); + } + + /// Negation operator, for e.g. v1 = -v2; + Vec4 operator-() const + { + return Vec4( + -this->mm[0], + -this->mm[1], + -this->mm[2], + -this->mm[3]); + } + + /// this = v1 + v2 + /// "this", v1 and v2 need not be distinct objects, e.g. v.add(v1,v); + template + const Vec4& add(const Vec4 &v1, const Vec4 &v2) + { + this->mm[0] = v1[0] + v2[0]; + this->mm[1] = v1[1] + v2[1]; + this->mm[2] = v1[2] + v2[2]; + this->mm[3] = v1[3] + v2[3]; + + return *this; + } + + + /// this = v1 - v2 + /// "this", v1 and v2 need not be distinct objects, e.g. v.sub(v1,v); + template + const Vec4& sub(const Vec4 &v1, const Vec4 &v2) + { + this->mm[0] = v1[0] - v2[0]; + this->mm[1] = v1[1] - v2[1]; + this->mm[2] = v1[2] - v2[2]; + this->mm[3] = v1[3] - v2[3]; + + return *this; + } + + /// this = scalar*v, v need not be a distinct object from "this", + /// e.g. v.scale(1.5,v1); + template + const Vec4& scale(T0 scale, const Vec4 &v) + { + this->mm[0] = scale * v[0]; + this->mm[1] = scale * v[1]; + this->mm[2] = scale * v[2]; + this->mm[3] = scale * v[3]; + + return *this; + } + + template + const Vec4 &div(T0 scalar, const Vec4 &v) + { + this->mm[0] = v[0] / scalar; + this->mm[1] = v[1] / scalar; + this->mm[2] = v[2] / scalar; + this->mm[3] = v[3] / scalar; + + return *this; + } + + /// Dot product + T dot(const Vec4 &v) const + { + return (this->mm[0]*v.mm[0] + this->mm[1]*v.mm[1] + + this->mm[2]*v.mm[2] + this->mm[3]*v.mm[3]); + } + + /// Length of the vector + T length() const + { + return sqrt( + this->mm[0]*this->mm[0] + + this->mm[1]*this->mm[1] + + this->mm[2]*this->mm[2] + + this->mm[3]*this->mm[3]); + } + + + /// Squared length of the vector, much faster than length() as it + /// does not involve square root + T lengthSqr() const + { + return (this->mm[0]*this->mm[0] + this->mm[1]*this->mm[1] + + this->mm[2]*this->mm[2] + this->mm[3]*this->mm[3]); + } + + /// Return a reference to itsef after the exponent has been + /// applied to all the vector components. + inline const Vec4& exp() + { + this->mm[0] = std::exp(this->mm[0]); + this->mm[1] = std::exp(this->mm[1]); + this->mm[2] = std::exp(this->mm[2]); + this->mm[3] = std::exp(this->mm[3]); + return *this; + } + + /// Return the sum of all the vector components. + inline T sum() const + { + return this->mm[0] + this->mm[1] + this->mm[2] + this->mm[3]; + } + + + /// this = normalized this + bool normalize(T eps=1.0e-8) + { + T d = length(); + if (isApproxEqual(d, T(0), eps)) { + return false; + } + *this *= (T(1) / d); + return true; + } + + /// return normalized this, throws if null vector + Vec4 unit(T eps=0) const + { + T d; + return unit(eps, d); + } + + /// return normalized this and length, throws if null vector + Vec4 unit(T eps, T& len) const + { + len = length(); + if (isApproxEqual(len, T(0), eps)) { + throw ArithmeticError("Normalizing null 4-vector"); + } + return *this / len; + } + + /// Returns v, where \f$v_i *= scalar\f$ for \f$i \in [0, 3]\f$ + template + const Vec4 &operator*=(S scalar) + { + this->mm[0] *= scalar; + this->mm[1] *= scalar; + this->mm[2] *= scalar; + this->mm[3] *= scalar; + return *this; + } + + /// Returns v0, where \f$v0_i *= v1_i\f$ for \f$i \in [0, 3]\f$ + template + const Vec4 &operator*=(const Vec4 &v1) + { + this->mm[0] *= v1[0]; + this->mm[1] *= v1[1]; + this->mm[2] *= v1[2]; + this->mm[3] *= v1[3]; + + return *this; + } + + /// Returns v, where \f$v_i /= scalar\f$ for \f$i \in [0, 3]\f$ + template + const Vec4 &operator/=(S scalar) + { + this->mm[0] /= scalar; + this->mm[1] /= scalar; + this->mm[2] /= scalar; + this->mm[3] /= scalar; + return *this; + } + + /// Returns v0, where \f$v0_i /= v1_i\f$ for \f$i \in [0, 3]\f$ + template + const Vec4 &operator/=(const Vec4 &v1) + { + this->mm[0] /= v1[0]; + this->mm[1] /= v1[1]; + this->mm[2] /= v1[2]; + this->mm[3] /= v1[3]; + return *this; + } + + /// Returns v, where \f$v_i += scalar\f$ for \f$i \in [0, 3]\f$ + template + const Vec4 &operator+=(S scalar) + { + this->mm[0] += scalar; + this->mm[1] += scalar; + this->mm[2] += scalar; + this->mm[3] += scalar; + return *this; + } + + /// Returns v0, where \f$v0_i += v1_i\f$ for \f$i \in [0, 3]\f$ + template + const Vec4 &operator+=(const Vec4 &v1) + { + this->mm[0] += v1[0]; + this->mm[1] += v1[1]; + this->mm[2] += v1[2]; + this->mm[3] += v1[3]; + return *this; + } + + /// Returns v, where \f$v_i += scalar\f$ for \f$i \in [0, 3]\f$ + template + const Vec4 &operator-=(S scalar) + { + this->mm[0] -= scalar; + this->mm[1] -= scalar; + this->mm[2] -= scalar; + this->mm[3] -= scalar; + return *this; + } + + /// Returns v0, where \f$v0_i -= v1_i\f$ for \f$i \in [0, 3]\f$ + template + const Vec4 &operator-=(const Vec4 &v1) + { + this->mm[0] -= v1[0]; + this->mm[1] -= v1[1]; + this->mm[2] -= v1[2]; + this->mm[3] -= v1[3]; + return *this; + } + + // Number of cols, rows, elements + static unsigned numRows() { return 1; } + static unsigned numColumns() { return 4; } + static unsigned numElements() { return 4; } + + /// True if a Nan is present in vector + bool isNan() const + { + return isnan(this->mm[0]) || isnan(this->mm[1]) + || isnan(this->mm[2]) || isnan(this->mm[3]); + } + + /// True if an Inf is present in vector + bool isInfinite() const + { + return isinf(this->mm[0]) || isinf(this->mm[1]) + || isinf(this->mm[2]) || isinf(this->mm[3]); + } + + /// True if all no Nan or Inf values present + bool isFinite() const + { + return finite(this->mm[0]) && finite(this->mm[1]) + && finite(this->mm[2]) && finite(this->mm[3]); + } + + /// Predefined constants, e.g. Vec4f v = Vec4f::xNegAxis(); + static Vec4 zero() { return Vec4(0, 0, 0, 0); } + static Vec4 origin() { return Vec4(0, 0, 0, 1); } +}; + +/// Equality operator, does exact floating point comparisons +template +inline bool operator==(const Vec4 &v0, const Vec4 &v1) +{ + return + isExactlyEqual(v0[0], v1[0]) && + isExactlyEqual(v0[1], v1[1]) && + isExactlyEqual(v0[2], v1[2]) && + isExactlyEqual(v0[3], v1[3]); +} + +/// Inequality operator, does exact floating point comparisons +template +inline bool operator!=(const Vec4 &v0, const Vec4 &v1) { return !(v0==v1); } + +/// Returns V, where \f$V_i = v_i * scalar\f$ for \f$i \in [0, 3]\f$ +template +inline Vec4::type> operator*(S scalar, const Vec4 &v) +{ return v*scalar; } + +/// Returns V, where \f$V_i = v_i * scalar\f$ for \f$i \in [0, 3]\f$ +template +inline Vec4::type> operator*(const Vec4 &v, S scalar) +{ + Vec4::type> result(v); + result *= scalar; + return result; +} + +/// Returns V, where \f$V_i = v0_i * v1_i\f$ for \f$i \in [0, 3]\f$ +template +inline Vec4::type> operator*(const Vec4 &v0, + const Vec4 &v1) +{ + Vec4::type> result(v0[0]*v1[0], + v0[1]*v1[1], + v0[2]*v1[2], + v0[3]*v1[3]); + return result; +} + +/// Returns V, where \f$V_i = scalar / v_i\f$ for \f$i \in [0, 3]\f$ +template +inline Vec4::type> operator/(S scalar, const Vec4 &v) +{ + return Vec4::type>(scalar/v[0], + scalar/v[1], + scalar/v[2], + scalar/v[3]); +} + +/// Returns V, where \f$V_i = v_i / scalar\f$ for \f$i \in [0, 3]\f$ +template +inline Vec4::type> operator/(const Vec4 &v, S scalar) +{ + Vec4::type> result(v); + result /= scalar; + return result; +} + +/// Returns V, where \f$V_i = v0_i / v1_i\f$ for \f$i \in [0, 3]\f$ +template +inline Vec4::type> operator/(const Vec4 &v0, + const Vec4 &v1) +{ + Vec4::type> + result(v0[0]/v1[0], v0[1]/v1[1], v0[2]/v1[2], v0[3]/v1[3]); + return result; +} + +/// Returns V, where \f$V_i = v0_i + v1_i\f$ for \f$i \in [0, 3]\f$ +template +inline Vec4::type> operator+(const Vec4 &v0, const Vec4 &v1) +{ + Vec4::type> result(v0); + result += v1; + return result; +} + +/// Returns V, where \f$V_i = v_i + scalar\f$ for \f$i \in [0, 3]\f$ +template +inline Vec4::type> operator+(const Vec4 &v, S scalar) +{ + Vec4::type> result(v); + result += scalar; + return result; +} + +/// Returns V, where \f$V_i = v0_i - v1_i\f$ for \f$i \in [0, 3]\f$ +template +inline Vec4::type> operator-(const Vec4 &v0, const Vec4 &v1) +{ + Vec4::type> result(v0); + result -= v1; + return result; +} + +/// Returns V, where \f$V_i = v_i - scalar\f$ for \f$i \in [0, 3]\f$ +template +inline Vec4::type> operator-(const Vec4 &v, S scalar) +{ + Vec4::type> result(v); + result -= scalar; + return result; +} + +template +inline bool +isApproxEqual(const Vec4& a, const Vec4& b) +{ + return a.eq(b); +} +template +inline bool +isApproxEqual(const Vec4& a, const Vec4& b, const Vec4& eps) +{ + return isApproxEqual(a[0], b[0], eps[0]) && + isApproxEqual(a[1], b[1], eps[1]) && + isApproxEqual(a[2], b[2], eps[2]) && + isApproxEqual(a[3], b[3], eps[3]); +} + +template +inline bool +isFinite(const Vec4& v) +{ + return isFinite(v[0]) && isFinite(v[1]) && isFinite(v[2]) && isFinite(v[3]); +} + +/// Return @c true if all components are exactly equal to zero. +template +inline bool +isZero(const Vec4& v) +{ + return isZero(v[0]) && isZero(v[1]) && isZero(v[2]) && isZero(v[3]); +} + +template +inline Vec4 +Abs(const Vec4& v) +{ + return Vec4(Abs(v[0]), Abs(v[1]), Abs(v[2]), Abs(v[3])); +} + +/// @remark We are switching to a more explicit name because the semantics +/// are different from std::min/max. In that case, the function returns a +/// reference to one of the objects based on a comparator. Here, we must +/// fabricate a new object which might not match either of the inputs. + +/// Return component-wise minimum of the two vectors. +template +inline Vec4 minComponent(const Vec4 &v1, const Vec4 &v2) +{ + return Vec4( + std::min(v1.x(), v2.x()), + std::min(v1.y(), v2.y()), + std::min(v1.z(), v2.z()), + std::min(v1.w(), v2.w())); +} + +/// Return component-wise maximum of the two vectors. +template +inline Vec4 maxComponent(const Vec4 &v1, const Vec4 &v2) +{ + return Vec4( + std::max(v1.x(), v2.x()), + std::max(v1.y(), v2.y()), + std::max(v1.z(), v2.z()), + std::max(v1.w(), v2.w())); +} + +/// @brief Return a vector with the exponent applied to each of +/// the components of the input vector. +template +inline Vec4 Exp(Vec4 v) { return v.exp(); } + +typedef Vec4 Vec4i; +typedef Vec4 Vec4ui; +typedef Vec4 Vec4s; +typedef Vec4 Vec4d; + +} // namespace math +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_MATH_VEC4_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/metadata/MetaMap.h b/nuparu/include/openvdb/include/openvdb/metadata/MetaMap.h new file mode 100644 index 00000000..455b31a8 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/metadata/MetaMap.h @@ -0,0 +1,251 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_METADATA_METAMAP_HAS_BEEN_INCLUDED +#define OPENVDB_METADATA_METAMAP_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { + +/// Container that maps names (strings) to values of arbitrary types +class OPENVDB_API MetaMap +{ +public: + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + typedef std::map MetadataMap; + typedef MetadataMap::iterator MetaIterator; + typedef MetadataMap::const_iterator ConstMetaIterator; + ///< @todo this should really iterate over a map of Metadata::ConstPtrs + + MetaMap() {} + MetaMap(const MetaMap& other); + virtual ~MetaMap() {} + + /// Return a copy of this map whose fields are shared with this map. + MetaMap::Ptr copyMeta() const; + /// Return a deep copy of this map that shares no data with this map. + MetaMap::Ptr deepCopyMeta() const; + + /// Assign a deep copy of another map to this map. + MetaMap& operator=(const MetaMap&); + + /// Unserialize metadata from the given stream. + void readMeta(std::istream&); + /// Serialize metadata to the given stream. + void writeMeta(std::ostream&) const; + + /// @brief Insert a new metadata field or overwrite the value of an existing field. + /// @details If a field with the given name doesn't already exist, add a new field. + /// Otherwise, if the new value's type is the same as the existing field's value type, + /// overwrite the existing value with new value. + /// @throw TypeError if a field with the given name already exists, but its value type + /// is not the same as the new value's + /// @throw ValueError if the given field name is empty. + void insertMeta(const Name&, const Metadata& value); + /// @brief Deep copy all of the metadata fields from the given map into this map. + /// @throw TypeError if any field in the given map has the same name as + /// but a different value type than one of this map's fields. + void insertMeta(const MetaMap&); + + /// Remove the given metadata field if it exists. + void removeMeta(const Name&); + + //@{ + /// @brief Return a pointer to the metadata with the given name. + /// If no such field exists, return a null pointer. + Metadata::Ptr operator[](const Name&); + Metadata::ConstPtr operator[](const Name&) const; + //@} + + //@{ + /// @brief Return a pointer to a TypedMetadata object of type @c T and with the given name. + /// If no such field exists or if there is a type mismatch, return a null pointer. + template typename T::Ptr getMetadata(const Name&); + template typename T::ConstPtr getMetadata(const Name&) const; + //@} + + /// @brief Return a reference to the value of type @c T stored in the given metadata field. + /// @throw LookupError if no field with the given name exists. + /// @throw TypeError if the given field is not of type @c T. + template T& metaValue(const Name&); + template const T& metaValue(const Name&) const; + + // Functions for iterating over the metadata + MetaIterator beginMeta() { return mMeta.begin(); } + MetaIterator endMeta() { return mMeta.end(); } + ConstMetaIterator beginMeta() const { return mMeta.begin(); } + ConstMetaIterator endMeta() const { return mMeta.end(); } + + void clearMetadata() { mMeta.clear(); } + + size_t metaCount() const { return mMeta.size(); } + + /// Return a string describing this metadata map. Prefix each line with @a indent. + std::string str(const std::string& indent = "") const; + + /// Return @c true if the given map is equivalent to this map. + bool operator==(const MetaMap& other) const; + /// Return @c true if the given map is different from this map. + bool operator!=(const MetaMap& other) const { return !(*this == other); } + +private: + /// @brief Return a pointer to TypedMetadata with the given template parameter. + /// @throw LookupError if no field with the given name is found. + /// @throw TypeError if the given field is not of type T. + template + typename TypedMetadata::Ptr getValidTypedMetadata(const Name&) const; + + MetadataMap mMeta; +}; + +/// Write a MetaMap to an output stream +std::ostream& operator<<(std::ostream&, const MetaMap&); + + +//////////////////////////////////////// + + +inline Metadata::Ptr +MetaMap::operator[](const Name& name) +{ + MetaIterator iter = mMeta.find(name); + return (iter == mMeta.end() ? Metadata::Ptr() : iter->second); +} + +inline Metadata::ConstPtr +MetaMap::operator[](const Name &name) const +{ + ConstMetaIterator iter = mMeta.find(name); + return (iter == mMeta.end() ? Metadata::Ptr() : iter->second); +} + + +//////////////////////////////////////// + + +template +inline typename T::Ptr +MetaMap::getMetadata(const Name &name) +{ + ConstMetaIterator iter = mMeta.find(name); + if(iter == mMeta.end()) { + return typename T::Ptr(); + } + + // To ensure that we get valid conversion if the metadata pointers cross dso + // boundaries, we have to check the qualified typename and then do a static + // cast. This is slower than doing a dynamic_pointer_cast, but is safer when + // pointers cross dso boundaries. + if (iter->second->typeName() == T::staticTypeName()) { + return boost::static_pointer_cast(iter->second); + } // else + return typename T::Ptr(); +} + +template +inline typename T::ConstPtr +MetaMap::getMetadata(const Name &name) const +{ + ConstMetaIterator iter = mMeta.find(name); + if(iter == mMeta.end()) { + return typename T::ConstPtr(); + } + // To ensure that we get valid conversion if the metadata pointers cross dso + // boundaries, we have to check the qualified typename and then do a static + // cast. This is slower than doing a dynamic_pointer_cast, but is safer when + // pointers cross dso boundaries. + if (iter->second->typeName() == T::staticTypeName()) { + return boost::static_pointer_cast(iter->second); + } // else + return typename T::ConstPtr(); +} + + +//////////////////////////////////////// + + +template +inline typename TypedMetadata::Ptr +MetaMap::getValidTypedMetadata(const Name &name) const +{ + ConstMetaIterator iter = mMeta.find(name); + if (iter == mMeta.end()) OPENVDB_THROW(LookupError, "Cannot find metadata " << name); + + // To ensure that we get valid conversion if the metadata pointers cross dso + // boundaries, we have to check the qualified typename and then do a static + // cast. This is slower than doing a dynamic_pointer_cast, but is safer when + // pointers cross dso boundaries. + typename TypedMetadata::Ptr m; + if (iter->second->typeName() == TypedMetadata::staticTypeName()) { + m = boost::static_pointer_cast, Metadata>(iter->second); + } + if (!m) OPENVDB_THROW(TypeError, "Invalid type for metadata " << name); + return m; +} + + +//////////////////////////////////////// + + +template +inline T& +MetaMap::metaValue(const Name &name) +{ + typename TypedMetadata::Ptr m = getValidTypedMetadata(name); + return m->value(); +} + + +template +inline const T& +MetaMap::metaValue(const Name &name) const +{ + typename TypedMetadata::Ptr m = getValidTypedMetadata(name); + return m->value(); +} + +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_METADATA_METAMAP_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/metadata/Metadata.h b/nuparu/include/openvdb/include/openvdb/metadata/Metadata.h new file mode 100644 index 00000000..96c44ef3 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/metadata/Metadata.h @@ -0,0 +1,397 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_METADATA_METADATA_HAS_BEEN_INCLUDED +#define OPENVDB_METADATA_METADATA_HAS_BEEN_INCLUDED + +#include +#include +#include +#include // for math::isZero() +#include +#include +#include +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { + +/// @brief Base class for storing metadata information in a grid. +class OPENVDB_API Metadata +{ +public: + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + Metadata() {} + virtual ~Metadata() {} + + /// Return the type name of the metadata. + virtual Name typeName() const = 0; + + /// Return a copy of the metadata. + virtual Metadata::Ptr copy() const = 0; + + /// Copy the given metadata into this metadata. + virtual void copy(const Metadata& other) = 0; + + /// Return a textual representation of this metadata. + virtual std::string str() const = 0; + + /// Return the boolean representation of this metadata (empty strings + /// and zeroVals evaluate to false; most other values evaluate to true). + virtual bool asBool() const = 0; + + /// Return @c true if the given metadata is equivalent to this metadata. + bool operator==(const Metadata& other) const; + /// Return @c true if the given metadata is different from this metadata. + bool operator!=(const Metadata& other) const { return !(*this == other); } + + /// Return the size of this metadata in bytes. + virtual Index32 size() const = 0; + + /// Unserialize this metadata from a stream. + void read(std::istream&); + /// Serialize this metadata to a stream. + void write(std::ostream&) const; + + /// Create new metadata of the given type. + static Metadata::Ptr createMetadata(const Name& typeName); + + /// Return @c true if the given type is known by the metadata type registry. + static bool isRegisteredType(const Name& typeName); + + /// Clear out the metadata registry. + static void clearRegistry(); + + /// Register the given metadata type along with a factory function. + static void registerType(const Name& typeName, Metadata::Ptr (*createMetadata)()); + static void unregisterType(const Name& typeName); + +protected: + /// Read the size of the metadata from a stream. + static Index32 readSize(std::istream&); + /// Write the size of the metadata to a stream. + void writeSize(std::ostream&) const; + + /// Read the metadata from a stream. + virtual void readValue(std::istream&, Index32 numBytes) = 0; + /// Write the metadata to a stream. + virtual void writeValue(std::ostream&) const = 0; + +private: + // Disallow copying of instances of this class. + Metadata(const Metadata&); + Metadata& operator=(const Metadata&); +}; + + +/// @brief Subclass to read (and ignore) data of an unregistered type +class OPENVDB_API UnknownMetadata: public Metadata +{ +public: + UnknownMetadata() {} + virtual ~UnknownMetadata() {} + virtual Name typeName() const { return ""; } + virtual Metadata::Ptr copy() const { OPENVDB_THROW(TypeError, "Metadata has unknown type"); } + virtual void copy(const Metadata&) { OPENVDB_THROW(TypeError, "Destination has unknown type"); } + virtual std::string str() const { return ""; } + virtual bool asBool() const { return false; } + virtual Index32 size() const { return 0; } + +protected: + virtual void readValue(std::istream&s, Index32 numBytes); + virtual void writeValue(std::ostream&) const; +}; + + +/// @brief Templated metadata class to hold specific types. +template +class TypedMetadata: public Metadata +{ +public: + typedef boost::shared_ptr > Ptr; + typedef boost::shared_ptr > ConstPtr; + + TypedMetadata(); + TypedMetadata(const T& value); + TypedMetadata(const TypedMetadata& other); + virtual ~TypedMetadata(); + + virtual Name typeName() const; + virtual Metadata::Ptr copy() const; + virtual void copy(const Metadata& other); + virtual std::string str() const; + virtual bool asBool() const; + virtual Index32 size() const { return static_cast(sizeof(T)); } + + /// Set this metadata's value. + void setValue(const T&); + /// Return this metadata's value. + T& value(); + const T& value() const; + + // Static specialized function for the type name. This function must be + // template specialized for each type T. + static Name staticTypeName() { return typeNameAsString(); } + + /// Create new metadata of this type. + static Metadata::Ptr createMetadata(); + + static void registerType(); + static void unregisterType(); + static bool isRegisteredType(); + +protected: + virtual void readValue(std::istream&, Index32 numBytes); + virtual void writeValue(std::ostream&) const; + +private: + T mValue; +}; + +/// Write a Metadata to an output stream +std::ostream& operator<<(std::ostream& ostr, const Metadata& metadata); + + +//////////////////////////////////////// + + +inline void +Metadata::writeSize(std::ostream& os) const +{ + const Index32 n = this->size(); + os.write(reinterpret_cast(&n), sizeof(Index32)); +} + + +inline Index32 +Metadata::readSize(std::istream& is) +{ + Index32 n = 0; + is.read(reinterpret_cast(&n), sizeof(Index32)); + return n; +} + + +inline void +Metadata::read(std::istream& is) +{ + const Index32 numBytes = this->readSize(is); + this->readValue(is, numBytes); +} + + +inline void +Metadata::write(std::ostream& os) const +{ + this->writeSize(os); + this->writeValue(os); +} + + +//////////////////////////////////////// + + +template +inline +TypedMetadata::TypedMetadata() : mValue(T()) +{ +} + +template +inline +TypedMetadata::TypedMetadata(const T &value) : mValue(value) +{ +} + +template +inline +TypedMetadata::TypedMetadata(const TypedMetadata &other) : + Metadata(), + mValue(other.mValue) +{ +} + +template +inline +TypedMetadata::~TypedMetadata() +{ +} + +template +inline Name +TypedMetadata::typeName() const +{ + return TypedMetadata::staticTypeName(); +} + +template +inline void +TypedMetadata::setValue(const T& val) +{ + mValue = val; +} + +template +inline T& +TypedMetadata::value() +{ + return mValue; +} + +template +inline const T& +TypedMetadata::value() const +{ + return mValue; +} + +template +inline Metadata::Ptr +TypedMetadata::copy() const +{ + Metadata::Ptr metadata(new TypedMetadata()); + metadata->copy(*this); + return metadata; +} + +template +inline void +TypedMetadata::copy(const Metadata &other) +{ + const TypedMetadata* t = dynamic_cast*>(&other); + if (t == NULL) OPENVDB_THROW(TypeError, "Incompatible type during copy"); + mValue = t->mValue; +} + + +template +inline void +TypedMetadata::readValue(std::istream& is, Index32 /*numBytes*/) +{ + //assert(this->size() == numBytes); + is.read(reinterpret_cast(&mValue), this->size()); +} + +template +inline void +TypedMetadata::writeValue(std::ostream& os) const +{ + os.write(reinterpret_cast(&mValue), this->size()); +} + +template +inline std::string +TypedMetadata::str() const +{ + std::ostringstream ostr; + ostr << mValue; + return ostr.str(); +} + +template +inline bool +TypedMetadata::asBool() const +{ + return !math::isZero(mValue); +} + +template +inline Metadata::Ptr +TypedMetadata::createMetadata() +{ + Metadata::Ptr ret(new TypedMetadata()); + return ret; +} + +template +inline void +TypedMetadata::registerType() +{ + Metadata::registerType(TypedMetadata::staticTypeName(), + TypedMetadata::createMetadata); +} + +template +inline void +TypedMetadata::unregisterType() +{ + Metadata::unregisterType(TypedMetadata::staticTypeName()); +} + +template +inline bool +TypedMetadata::isRegisteredType() +{ + return Metadata::isRegisteredType(TypedMetadata::staticTypeName()); +} + + +template<> +inline std::string +TypedMetadata::str() const +{ + return (mValue ? "true" : "false"); +} + + +inline std::ostream& +operator<<(std::ostream& ostr, const Metadata& metadata) +{ + ostr << metadata.str(); + return ostr; +} + + +typedef TypedMetadata BoolMetadata; +typedef TypedMetadata DoubleMetadata; +typedef TypedMetadata FloatMetadata; +typedef TypedMetadata Int32Metadata; +typedef TypedMetadata Int64Metadata; +typedef TypedMetadata Vec2DMetadata; +typedef TypedMetadata Vec2IMetadata; +typedef TypedMetadata Vec2SMetadata; +typedef TypedMetadata Vec3DMetadata; +typedef TypedMetadata Vec3IMetadata; +typedef TypedMetadata Vec3SMetadata; +typedef TypedMetadata Mat4SMetadata; +typedef TypedMetadata Mat4DMetadata; + +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_METADATA_METADATA_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/metadata/StringMetadata.h b/nuparu/include/openvdb/include/openvdb/metadata/StringMetadata.h new file mode 100644 index 00000000..53030cf1 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/metadata/StringMetadata.h @@ -0,0 +1,75 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_METADATA_STRINGMETADATA_HAS_BEEN_INCLUDED +#define OPENVDB_METADATA_STRINGMETADATA_HAS_BEEN_INCLUDED + +#include +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { + +typedef TypedMetadata StringMetadata; + + +template <> +inline Index32 +StringMetadata::size() const +{ + return Index32(mValue.size()); +} + + +template<> +inline void +StringMetadata::readValue(std::istream& is, Index32 size) +{ + mValue.resize(size, '\0'); + is.read(&mValue[0], size); +} + +template<> +inline void +StringMetadata::writeValue(std::ostream &os) const +{ + os.write(reinterpret_cast(&mValue[0]), this->size()); +} + +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_METADATA_STRINGMETADATA_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/openvdb.h b/nuparu/include/openvdb/include/openvdb/openvdb.h new file mode 100644 index 00000000..ef29f51f --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/openvdb.h @@ -0,0 +1,99 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_OPENVDB_HAS_BEEN_INCLUDED +#define OPENVDB_OPENVDB_HAS_BEEN_INCLUDED + +#include "Platform.h" +#include "Types.h" +#include "Metadata.h" +#include "math/Maps.h" +#include "math/Transform.h" +#include "Grid.h" +#include "tree/Tree.h" +#include "io/File.h" + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { + +/// Common tree types +typedef tree::Tree4::Type MaskTree; +typedef tree::Tree4::Type BoolTree; +typedef tree::Tree4::Type FloatTree; +typedef tree::Tree4::Type DoubleTree; +typedef tree::Tree4::Type Int32Tree; +typedef tree::Tree4::Type UInt32Tree; +typedef tree::Tree4::Type Int64Tree; +typedef tree::Tree4::Type Vec2ITree; +typedef tree::Tree4::Type Vec2STree; +typedef tree::Tree4::Type Vec2DTree; +typedef tree::Tree4::Type Vec3ITree; +typedef tree::Tree4::Type Vec3STree; +typedef tree::Tree4::Type Vec3DTree; +typedef tree::Tree4::Type StringTree; +typedef MaskTree TopologyTree; +typedef Vec3STree Vec3fTree; +typedef Vec3DTree Vec3dTree; +typedef FloatTree ScalarTree; +typedef Vec3fTree VectorTree; + +/// Common grid types +typedef Grid MaskGrid; +typedef Grid BoolGrid; +typedef Grid FloatGrid; +typedef Grid DoubleGrid; +typedef Grid Int32Grid; +typedef Grid Int64Grid; +typedef Grid Vec3IGrid; +typedef Grid Vec3SGrid; +typedef Grid Vec3DGrid; +typedef Grid StringGrid; +typedef Vec3SGrid Vec3fGrid; +typedef Vec3DGrid Vec3dGrid; +typedef FloatGrid ScalarGrid; +typedef Vec3fGrid VectorGrid; +typedef MaskGrid TopologyGrid; + +/// Global registration of basic types +OPENVDB_API void initialize(); + +/// Global deregistration of basic types +OPENVDB_API void uninitialize(); + +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_OPENVDB_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/ChangeBackground.h b/nuparu/include/openvdb/include/openvdb/tools/ChangeBackground.h new file mode 100644 index 00000000..3e1e61d0 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/ChangeBackground.h @@ -0,0 +1,278 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file ChangeBackground.h +/// +/// @brief Efficient multi-threaded replacement of the background +/// values in tree. +/// +/// @author Ken Museth + +#ifndef OPENVDB_TOOLS_ChangeBACKGROUND_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_ChangeBACKGROUND_HAS_BEEN_INCLUDED + +#include // for isNegative and negative +#include // for Index typedef +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief Replace the background value in all the nodes of a tree. +/// @details The sign of the background value is preserved, and only +/// inactive values equal to the old background value are replaced. +/// +/// @note If a LeafManager is used the cached leaf nodes are reused, +/// resulting in slightly better overall performance. +/// +/// @param tree Tree (or LeafManager) that will have its background value changed +/// @param background the new background value +/// @param threaded enable or disable threading (threading is enabled by default) +/// @param grainSize used to control the threading granularity (default is 32) +template +inline void +changeBackground( + TreeOrLeafManagerT& tree, + const typename TreeOrLeafManagerT::ValueType& background, + bool threaded = true, + size_t grainSize = 32); + + +/// @brief Replace the background value in all the nodes of a floating-point tree +/// containing a symmetric narrow-band level set. +/// @details All inactive values will be set to +| @a halfWidth | if outside +/// and -| @a halfWidth | if inside, where @a halfWidth is half the width +/// of the symmetric narrow band. +/// +/// @note This method is faster than changeBackground since it does not +/// perform tests to see if inactive values are equal to the old background value. +/// @note If a LeafManager is used the cached leaf nodes are reused, +/// resulting in slightly better overall performance. +/// +/// @param tree Tree (or LeafManager) that will have its background value changed +/// @param halfWidth half of the width of the symmetric narrow band +/// @param threaded enable or disable threading (threading is enabled by default) +/// @param grainSize used to control the threading granularity (default is 32) +/// +/// @throw ValueError if @a halfWidth is negative (as defined by math::isNegative) +template +inline void +changeLevelSetBackground( + TreeOrLeafManagerT& tree, + const typename TreeOrLeafManagerT::ValueType& halfWidth, + bool threaded = true, + size_t grainSize = 32); + + +/// @brief Replace the background values in all the nodes of a floating-point tree +/// containing a possibly asymmetric narrow-band level set. +/// @details All inactive values will be set to +| @a outsideWidth | if outside +/// and -| @a insideWidth | if inside, where @a outsideWidth is the outside +/// width of the narrow band and @a insideWidth is its inside width. +/// +/// @note This method is faster than changeBackground since it does not +/// perform tests to see if inactive values are equal to the old background value. +/// @note If a LeafManager is used the cached leaf nodes are reused, +/// resulting in slightly better overall performance. +/// +/// @param tree Tree (or LeafManager) that will have its background value changed +/// @param outsideWidth The width of the outside of the narrow band +/// @param insideWidth The width of the inside of the narrow band +/// @param threaded enable or disable threading (threading is enabled by default) +/// @param grainSize used to control the threading granularity (default is 32) +/// +/// @throw ValueError if @a outsideWidth is negative or @a insideWidth is +/// not negative (as defined by math::isNegative) +template +inline void +changeAsymmetricLevelSetBackground( + TreeOrLeafManagerT& tree, + const typename TreeOrLeafManagerT::ValueType& outsideWidth, + const typename TreeOrLeafManagerT::ValueType& insideWidth, + bool threaded = true, + size_t grainSize = 32); + + +////////////////////////////////////////////////////// + + +// Replaces the background value in a Tree of any type. +template +class ChangeBackgroundOp +{ +public: + typedef typename TreeOrLeafManagerT::ValueType ValueT; + typedef typename TreeOrLeafManagerT::RootNodeType RootT; + typedef typename TreeOrLeafManagerT::LeafNodeType LeafT; + + + ChangeBackgroundOp(const TreeOrLeafManagerT& tree, const ValueT& newValue) + : mOldValue(tree.root().background()) + , mNewValue(newValue) + { + } + void operator()(RootT& root) const + { + for (typename RootT::ValueOffIter it = root.beginValueOff(); it; ++it) this->set(it); + root.setBackground(mNewValue, false); + } + void operator()(LeafT& node) const + { + for (typename LeafT::ValueOffIter it = node.beginValueOff(); it; ++it) this->set(it); + } + template + void operator()(NodeT& node) const + { + typename NodeT::NodeMaskType mask = node.getValueOffMask(); + for (typename NodeT::ValueOnIter it(mask.beginOn(), &node); it; ++it) this->set(it); + } +private: + + template + inline void set(IterT& iter) const + { + if (math::isApproxEqual(*iter, mOldValue)) { + iter.setValue(mNewValue); + } else if (math::isApproxEqual(*iter, math::negative(mOldValue))) { + iter.setValue(math::negative(mNewValue)); + } + } + const ValueT mOldValue, mNewValue; +};// ChangeBackgroundOp + + +// Replaces the background value in a Tree assumed to represent a +// level set. It is generally faster than ChangeBackgroundOp. +// Note that is follows the sign-convention that outside is positive +// and inside is negative! +template +class ChangeLevelSetBackgroundOp +{ +public: + typedef typename TreeOrLeafManagerT::ValueType ValueT; + typedef typename TreeOrLeafManagerT::RootNodeType RootT; + typedef typename TreeOrLeafManagerT::LeafNodeType LeafT; + + /// @brief Constructor for asymmetric narrow-bands + ChangeLevelSetBackgroundOp(const ValueT& outside, const ValueT& inside) + : mOutside(outside) + , mInside(inside) + { + if (math::isNegative(mOutside)) { + OPENVDB_THROW(ValueError, + "ChangeLevelSetBackgroundOp: the outside value cannot be negative!"); + } + if (!math::isNegative(mInside)) { + OPENVDB_THROW(ValueError, + "ChangeLevelSetBackgroundOp: the inside value must be negative!"); + } + } + void operator()(RootT& root) const + { + for (typename RootT::ValueOffIter it = root.beginValueOff(); it; ++it) this->set(it); + root.setBackground(mOutside, false); + } + void operator()(LeafT& node) const + { + for(typename LeafT::ValueOffIter it = node.beginValueOff(); it; ++it) this->set(it); + } + template + void operator()(NodeT& node) const + { + typedef typename NodeT::ValueOffIter IterT; + for (IterT it(node.getChildMask().beginOff(), &node); it; ++it) this->set(it); + } +private: + + template + inline void set(IterT& iter) const + { + //this is safe since we know ValueType is_floating_point + ValueT& v = const_cast(*iter); + v = v < 0 ? mInside : mOutside; + } + const ValueT mOutside, mInside; +};// ChangeLevelSetBackgroundOp + + +template +inline void +changeBackground( + TreeOrLeafManagerT& tree, + const typename TreeOrLeafManagerT::ValueType& background, + bool threaded, + size_t grainSize) +{ + tree::NodeManager linearTree(tree); + ChangeBackgroundOp op(tree, background); + linearTree.foreachTopDown(op, threaded, grainSize); +} + + +template +inline void +changeAsymmetricLevelSetBackground( + TreeOrLeafManagerT& tree, + const typename TreeOrLeafManagerT::ValueType& outsideValue, + const typename TreeOrLeafManagerT::ValueType& insideValue, + bool threaded, + size_t grainSize) +{ + tree::NodeManager linearTree(tree); + ChangeLevelSetBackgroundOp op(outsideValue, insideValue); + linearTree.foreachTopDown(op, threaded, grainSize); +} + + +// If the narrow-band is symmetric only one background value is required +template +inline void +changeLevelSetBackground( + TreeOrLeafManagerT& tree, + const typename TreeOrLeafManagerT::ValueType& background, + bool threaded, + size_t grainSize) +{ + changeAsymmetricLevelSetBackground( + tree, background, math::negative(background), threaded, grainSize); +} + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_CHANGEBACKGROUND_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/Clip.h b/nuparu/include/openvdb/include/openvdb/tools/Clip.h new file mode 100644 index 00000000..c3f09d49 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/Clip.h @@ -0,0 +1,413 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file Clip.h +/// +/// @brief Functions to clip a grid against a bounding box or against +/// another grid's active voxel topology + +#ifndef OPENVDB_TOOLS_CLIP_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_CLIP_HAS_BEEN_INCLUDED + +#include // for ValueMask +#include +#include // for isNegative +#include +#include "GridTransformer.h" // for resampleToMatch() +#include +#include +#include +#include +#include +#include "Prune.h" + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief Clip the given grid against a world-space bounding box +/// and return a new grid containing the result. +/// @warning Clipping a level set will likely produce a grid that is +/// no longer a valid level set. +template OPENVDB_STATIC_SPECIALIZATION +inline typename GridType::Ptr clip(const GridType& grid, const BBoxd&); + +/// @brief Clip a grid against the active voxels of another grid +/// and return a new grid containing the result. +/// @param grid the grid to be clipped +/// @param mask a grid whose active voxels form a boolean clipping mask +/// @details The mask grid need not have the same transform as the source grid. +/// Also, if the mask grid is a level set, consider using tools::sdfInteriorMask +/// to construct a new mask comprising the interior (rather than the narrow band) +/// of the level set. +/// @warning Clipping a level set will likely produce a grid that is +/// no longer a valid level set. +template OPENVDB_STATIC_SPECIALIZATION +inline typename GridType::Ptr clip(const GridType& grid, const Grid& mask); + + +//////////////////////////////////////// + + +namespace clip_internal { + + +//////////////////////////////////////// + + +template +class MaskInteriorVoxels +{ +public: + typedef typename TreeT::ValueType ValueT; + typedef typename TreeT::LeafNodeType LeafNodeT; + + MaskInteriorVoxels(const TreeT& tree): mAcc(tree) {} + + template + void operator()(LeafNodeType &leaf, size_t /*leafIndex*/) const + { + const LeafNodeT *refLeaf = mAcc.probeConstLeaf(leaf.origin()); + if (refLeaf) { + typename LeafNodeType::ValueOffIter iter = leaf.beginValueOff(); + for ( ; iter; ++iter) { + const Index pos = iter.pos(); + leaf.setActiveState(pos, math::isNegative(refLeaf->getValue(pos))); + } + } + } + +private: + tree::ValueAccessor mAcc; +}; + + +//////////////////////////////////////// + + +template +class CopyLeafNodes +{ +public: + typedef typename TreeT::template ValueConverter::Type MaskTreeT; + typedef tree::LeafManager MaskLeafManagerT; + + CopyLeafNodes(const TreeT& tree, const MaskLeafManagerT& leafNodes); + + void run(bool threaded = true); + + typename TreeT::Ptr tree() const { return mNewTree; } + + CopyLeafNodes(CopyLeafNodes&, tbb::split); + void operator()(const tbb::blocked_range&); + void join(const CopyLeafNodes& rhs) { mNewTree->merge(*rhs.mNewTree); } + +private: + const MaskTreeT* mClipMask; + const TreeT* mTree; + const MaskLeafManagerT* mLeafNodes; + typename TreeT::Ptr mNewTree; +}; + + +template +CopyLeafNodes::CopyLeafNodes(const TreeT& tree, const MaskLeafManagerT& leafNodes) + : mTree(&tree) + , mLeafNodes(&leafNodes) + , mNewTree(new TreeT(mTree->background())) +{ +} + + +template +CopyLeafNodes::CopyLeafNodes(CopyLeafNodes& rhs, tbb::split) + : mTree(rhs.mTree) + , mLeafNodes(rhs.mLeafNodes) + , mNewTree(new TreeT(mTree->background())) +{ +} + + +template +void +CopyLeafNodes::run(bool threaded) +{ + if (threaded) tbb::parallel_reduce(mLeafNodes->getRange(), *this); + else (*this)(mLeafNodes->getRange()); +} + + +template +void +CopyLeafNodes::operator()(const tbb::blocked_range& range) +{ + typedef typename TreeT::LeafNodeType LeafT; + typedef typename MaskTree::LeafNodeType MaskLeafT; + typename MaskLeafT::ValueOnCIter it; + + tree::ValueAccessor acc(*mNewTree); + tree::ValueAccessor refAcc(*mTree); + + for (size_t n = range.begin(); n != range.end(); ++n) { + const MaskLeafT& maskLeaf = mLeafNodes->leaf(n); + const Coord& ijk = maskLeaf.origin(); + const LeafT* refLeaf = refAcc.probeConstLeaf(ijk); + + LeafT* newLeaf = acc.touchLeaf(ijk); + + if (refLeaf) { + for (it = maskLeaf.cbeginValueOn(); it; ++it) { + const Index pos = it.pos(); + newLeaf->setValueOnly(pos, refLeaf->getValue(pos)); + newLeaf->setActiveState(pos, refLeaf->isValueOn(pos)); + } + } else { + typename TreeT::ValueType value; + bool isActive = refAcc.probeValue(ijk, value); + + for (it = maskLeaf.cbeginValueOn(); it; ++it) { + const Index pos = it.pos(); + newLeaf->setValueOnly(pos, value); + newLeaf->setActiveState(pos, isActive); + } + } + } +} + + +//////////////////////////////////////// + + +struct BoolSampler +{ + static const char* name() { return "bin"; } + static int radius() { return 2; } + static bool mipmap() { return false; } + static bool consistent() { return true; } + + template + static bool sample(const TreeT& inTree, + const Vec3R& inCoord, typename TreeT::ValueType& result) + { + Coord ijk; + ijk[0] = int(std::floor(inCoord[0])); + ijk[1] = int(std::floor(inCoord[1])); + ijk[2] = int(std::floor(inCoord[2])); + return inTree.probeValue(ijk, result); + } +}; + + +//////////////////////////////////////// + + +// Convert a grid of one type to a grid of another type +template +struct ConvertGrid +{ + typedef typename FromGridT::Ptr FromGridPtrT; + typedef typename ToGridT::Ptr ToGridPtrT; + ToGridPtrT operator()(const FromGridPtrT& grid) { return ToGridPtrT(new ToGridT(*grid)); } +}; + +// Partial specialization that avoids copying when +// the input and output grid types are the same +template +struct ConvertGrid +{ + typedef typename GridT::Ptr GridPtrT; + GridPtrT operator()(const GridPtrT& grid) { return grid; } +}; + + +//////////////////////////////////////// + + +// Convert a grid of arbitrary type to a mask grid and return a pointer to the new grid. +template +inline typename boost::disable_if, + typename GridT::template ValueConverter::Type::Ptr>::type +convertToMaskGrid(const GridT& grid) +{ + typedef typename GridT::template ValueConverter::Type MaskGridT; + typedef typename MaskGridT::Ptr MaskGridPtrT; + + // Convert the input grid to a boolean mask grid (with the same tree configuration). + MaskGridPtrT mask = MaskGridT::create(/*background=*/false); + mask->topologyUnion(grid); + mask->setTransform(grid.constTransform().copy()); + return mask; +} + +// Overload that avoids any processing if the input grid is already a mask grid +template +inline typename boost::enable_if, + typename GridT::Ptr>::type +convertToMaskGrid(const GridT& grid) +{ + return grid.copy(); // shallow copy +} + + +//////////////////////////////////////// + + +template +inline typename GridType::Ptr +doClip(const GridType& grid, const typename GridType::template ValueConverter::Type& aMask) +{ + typedef typename GridType::TreeType TreeT; + typedef typename GridType::TreeType::template ValueConverter::Type MaskTreeT; + + const GridClass gridClass = grid.getGridClass(); + const TreeT& tree = grid.tree(); + + MaskTreeT mask(false); + mask.topologyUnion(tree); + + if (gridClass == GRID_LEVEL_SET) { + tree::LeafManager leafNodes(mask); + leafNodes.foreach(MaskInteriorVoxels(tree)); + + tree::ValueAccessor acc(tree); + + typename MaskTreeT::ValueAllIter iter(mask); + iter.setMaxDepth(MaskTreeT::ValueAllIter::LEAF_DEPTH - 1); + + for ( ; iter; ++iter) { + iter.setActiveState(math::isNegative(acc.getValue(iter.getCoord()))); + } + } + + mask.topologyIntersection(aMask.constTree()); + + typename GridType::Ptr outGrid; + { + // Copy voxel values and states. + tree::LeafManager leafNodes(mask); + CopyLeafNodes maskOp(tree, leafNodes); + maskOp.run(); + outGrid = GridType::create(maskOp.tree()); + } + { + // Copy tile values and states. + tree::ValueAccessor refAcc(tree); + tree::ValueAccessor maskAcc(mask); + + typename TreeT::ValueAllIter it(outGrid->tree()); + it.setMaxDepth(TreeT::ValueAllIter::LEAF_DEPTH - 1); + for ( ; it; ++it) { + Coord ijk = it.getCoord(); + + if (maskAcc.isValueOn(ijk)) { + typename TreeT::ValueType value; + bool isActive = refAcc.probeValue(ijk, value); + + it.setValue(value); + if (!isActive) it.setValueOff(); + } + } + } + + outGrid->setTransform(grid.transform().copy()); + if (gridClass != GRID_LEVEL_SET) outGrid->setGridClass(gridClass); + + return outGrid; +} + +} // namespace clip_internal + + +//////////////////////////////////////// + + +template +OPENVDB_STATIC_SPECIALIZATION +inline typename GridType::Ptr +clip(const GridType& grid, const BBoxd& bbox) +{ + typedef typename GridType::template ValueConverter::Type MaskGridT; + + // Transform the world-space bounding box into the source grid's index space. + Vec3d idxMin, idxMax; + math::calculateBounds(grid.constTransform(), bbox.min(), bbox.max(), idxMin, idxMax); + CoordBBox region(Coord::floor(idxMin), Coord::floor(idxMax)); + // Construct a boolean mask grid that is true inside the index-space bounding box + // and false everywhere else. + MaskGridT clipMask(/*background=*/false); + clipMask.fill(region, /*value=*/true, /*active=*/true); + + return clip_internal::doClip(grid, clipMask); +} + + +template +OPENVDB_STATIC_SPECIALIZATION +inline typename GridType1::Ptr +clip(const GridType1& grid1, const Grid& grid2) +{ + typedef typename GridType1::template ValueConverter::Type MaskGridT1; + typedef typename MaskGridT1::Ptr MaskGridPtrT1; + + typedef Grid GridType2; + typedef typename GridType2::template ValueConverter::Type MaskGridT2; + typedef typename MaskGridT2::Ptr MaskGridPtrT2; + + // Convert the mask grid to a boolean grid with the same tree configuration. + MaskGridPtrT2 maskGrid = clip_internal::convertToMaskGrid( grid2 ); + + // Resample the boolean mask grid into the source grid's index space. + if (grid1.constTransform() != maskGrid->constTransform()) { + MaskGridPtrT2 resampledMask = MaskGridT2::create(/*background=*/false); + resampledMask->setTransform(grid1.constTransform().copy()); + tools::resampleToMatch(*maskGrid, *resampledMask); + tools::prune(resampledMask->tree()); + maskGrid = resampledMask; + } + + // Convert the bool mask grid to a bool grid of the same configuration as the source grid. + MaskGridPtrT1 clipMask = + clip_internal::ConvertGrid()( maskGrid ); + + // Clip the source grid against the boolean mask grid. + return clip_internal::doClip(grid1, *clipMask); +} + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_CLIP_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/Composite.h b/nuparu/include/openvdb/include/openvdb/tools/Composite.h new file mode 100644 index 00000000..fe4f6fd3 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/Composite.h @@ -0,0 +1,1107 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file Composite.h +/// +/// @brief Functions to efficiently perform various compositing operations on grids +/// +/// @authors Peter Cucka, Mihai Alden + +#ifndef OPENVDB_TOOLS_COMPOSITE_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_COMPOSITE_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include // for isExactlyEqual() +#include "ValueTransformer.h" // for transformValues() +#include "Prune.h"// for prune +#include "SignedFloodFill.h" // for signedFloodFill() +#include + +#include +#include +#include +#include +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief Given two level set grids, replace the A grid with the union of A and B. +/// @throw ValueError if the background value of either grid is not greater than zero. +/// @note This operation always leaves the B grid empty. +template OPENVDB_STATIC_SPECIALIZATION +inline void csgUnion(GridOrTreeT& a, GridOrTreeT& b, bool prune = true); +/// @brief Given two level set grids, replace the A grid with the intersection of A and B. +/// @throw ValueError if the background value of either grid is not greater than zero. +/// @note This operation always leaves the B grid empty. +template OPENVDB_STATIC_SPECIALIZATION +inline void csgIntersection(GridOrTreeT& a, GridOrTreeT& b, bool prune = true); +/// @brief Given two level set grids, replace the A grid with the difference A / B. +/// @throw ValueError if the background value of either grid is not greater than zero. +/// @note This operation always leaves the B grid empty. +template OPENVDB_STATIC_SPECIALIZATION +inline void csgDifference(GridOrTreeT& a, GridOrTreeT& b, bool prune = true); + +/// @brief Threaded CSG union operation that produces a new grid or tree from +/// immutable inputs. +/// @return The CSG union of the @a and @b level set inputs. +template OPENVDB_STATIC_SPECIALIZATION +inline typename GridOrTreeT::Ptr csgUnionCopy(const GridOrTreeT& a, const GridOrTreeT& b); +/// @brief Threaded CSG intersection operation that produces a new grid or tree from +/// immutable inputs. +/// @return The CSG intersection of the @a and @b level set inputs. +template OPENVDB_STATIC_SPECIALIZATION +inline typename GridOrTreeT::Ptr csgIntersectionCopy(const GridOrTreeT& a, const GridOrTreeT& b); +/// @brief Threaded CSG difference operation that produces a new grid or tree from +/// immutable inputs. +/// @return The CSG difference of the @a and @b level set inputs. +template OPENVDB_STATIC_SPECIALIZATION +inline typename GridOrTreeT::Ptr csgDifferenceCopy(const GridOrTreeT& a, const GridOrTreeT& b); + +/// @brief Given grids A and B, compute max(a, b) per voxel (using sparse traversal). +/// Store the result in the A grid and leave the B grid empty. +template OPENVDB_STATIC_SPECIALIZATION +inline void compMax(GridOrTreeT& a, GridOrTreeT& b); +/// @brief Given grids A and B, compute min(a, b) per voxel (using sparse traversal). +/// Store the result in the A grid and leave the B grid empty. +template OPENVDB_STATIC_SPECIALIZATION +inline void compMin(GridOrTreeT& a, GridOrTreeT& b); +/// @brief Given grids A and B, compute a + b per voxel (using sparse traversal). +/// Store the result in the A grid and leave the B grid empty. +template OPENVDB_STATIC_SPECIALIZATION +inline void compSum(GridOrTreeT& a, GridOrTreeT& b); +/// @brief Given grids A and B, compute a * b per voxel (using sparse traversal). +/// Store the result in the A grid and leave the B grid empty. +template OPENVDB_STATIC_SPECIALIZATION +inline void compMul(GridOrTreeT& a, GridOrTreeT& b); +/// @brief Given grids A and B, compute a / b per voxel (using sparse traversal). +/// Store the result in the A grid and leave the B grid empty. +template OPENVDB_STATIC_SPECIALIZATION +inline void compDiv(GridOrTreeT& a, GridOrTreeT& b); + +/// Copy the active voxels of B into A. +template OPENVDB_STATIC_SPECIALIZATION +inline void compReplace(GridOrTreeT& a, const GridOrTreeT& b); + + +//////////////////////////////////////// + + +namespace composite { + +// composite::min() and composite::max() for non-vector types compare with operator<(). +template inline +const typename boost::disable_if_c::IsVec, T>::type& // = T if T is not a vector type +min(const T& a, const T& b) { return std::min(a, b); } + +template inline +const typename boost::disable_if_c::IsVec, T>::type& +max(const T& a, const T& b) { return std::max(a, b); } + + +// composite::min() and composite::max() for OpenVDB vector types compare by magnitude. +template inline +const typename boost::enable_if_c::IsVec, T>::type& // = T if T is a vector type +min(const T& a, const T& b) +{ + const typename T::ValueType aMag = a.lengthSqr(), bMag = b.lengthSqr(); + return (aMag < bMag ? a : (bMag < aMag ? b : std::min(a, b))); +} + +template inline +const typename boost::enable_if_c::IsVec, T>::type& +max(const T& a, const T& b) +{ + const typename T::ValueType aMag = a.lengthSqr(), bMag = b.lengthSqr(); + return (aMag < bMag ? b : (bMag < aMag ? a : std::max(a, b))); +} + + +template inline +typename boost::disable_if, T>::type // = T if T is not an integer type +divide(const T& a, const T& b) { return a / b; } + +template inline +typename boost::enable_if, T>::type // = T if T is an integer type +divide(const T& a, const T& b) +{ + const T zero(0); + if (b != zero) return a / b; + if (a == zero) return 0; + return (a > 0 ? std::numeric_limits::max() : -std::numeric_limits::max()); +} + +// If b is true, return a / 1 = a. +// If b is false and a is true, return 1 / 0 = inf = MAX_BOOL = 1 = a. +// If b is false and a is false, return 0 / 0 = NaN = 0 = a. +inline bool divide(bool a, bool /*b*/) { return a; } + + +enum CSGOperation { CSG_UNION, CSG_INTERSECTION, CSG_DIFFERENCE }; + +template +struct BuildPrimarySegment +{ + typedef typename TreeType::ValueType ValueType; + typedef typename TreeType::Ptr TreePtrType; + typedef typename TreeType::LeafNodeType LeafNodeType; + typedef typename LeafNodeType::NodeMaskType NodeMaskType; + typedef typename TreeType::RootNodeType RootNodeType; + typedef typename RootNodeType::NodeChainType NodeChainType; + typedef typename boost::mpl::at >::type InternalNodeType; + + BuildPrimarySegment(const TreeType& lhs, const TreeType& rhs) + : mSegment(new TreeType(lhs.background())) + , mLhsTree(&lhs) + , mRhsTree(&rhs) + { + } + + void operator()() const + { + std::vector leafNodes; + + { + std::vector internalNodes; + mLhsTree->getNodes(internalNodes); + + ProcessInternalNodes op(internalNodes, *mRhsTree, *mSegment, leafNodes); + tbb::parallel_reduce(tbb::blocked_range(0, internalNodes.size()), op); + } + + ProcessLeafNodes op(leafNodes, *mRhsTree, *mSegment); + tbb::parallel_reduce(tbb::blocked_range(0, leafNodes.size()), op); + } + + TreePtrType& segment() { return mSegment; } + +private: + + struct ProcessInternalNodes { + + ProcessInternalNodes(std::vector& lhsNodes, const TreeType& rhsTree, + TreeType& outputTree, std::vector& outputLeafNodes) + : mLhsNodes(lhsNodes.empty() ? NULL : &lhsNodes.front()) + , mRhsTree(&rhsTree) + , mLocalTree(mRhsTree->background()) + , mOutputTree(&outputTree) + , mLocalLeafNodes() + , mOutputLeafNodes(&outputLeafNodes) + { + } + + ProcessInternalNodes(ProcessInternalNodes& other, tbb::split) + : mLhsNodes(other.mLhsNodes) + , mRhsTree(other.mRhsTree) + , mLocalTree(mRhsTree->background()) + , mOutputTree(&mLocalTree) + , mLocalLeafNodes() + , mOutputLeafNodes(&mLocalLeafNodes) + { + } + + void join(ProcessInternalNodes& other) + { + mOutputTree->merge(*other.mOutputTree); + mOutputLeafNodes->insert(mOutputLeafNodes->end(), + other.mOutputLeafNodes->begin(), other.mOutputLeafNodes->end()); + } + + void operator()(const tbb::blocked_range& range) + { + tree::ValueAccessor rhsAcc(*mRhsTree); + tree::ValueAccessor outputAcc(*mOutputTree); + + std::vector tmpLeafNodes; + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + const InternalNodeType& lhsNode = *mLhsNodes[n]; + const Coord& ijk = lhsNode.origin(); + const InternalNodeType * rhsNode = rhsAcc.template probeConstNode(ijk); + + if (rhsNode) { + lhsNode.getNodes(*mOutputLeafNodes); + } else { + if (Operation == CSG_INTERSECTION) { + if (rhsAcc.getValue(ijk) < ValueType(0.0)) { + tmpLeafNodes.clear(); + lhsNode.getNodes(tmpLeafNodes); + for (size_t i = 0, I = tmpLeafNodes.size(); i < I; ++i) { + outputAcc.addLeaf(new LeafNodeType(*tmpLeafNodes[i])); + } + } + } else { // Union & Difference + if (!(rhsAcc.getValue(ijk) < ValueType(0.0))) { + tmpLeafNodes.clear(); + lhsNode.getNodes(tmpLeafNodes); + for (size_t i = 0, I = tmpLeafNodes.size(); i < I; ++i) { + outputAcc.addLeaf(new LeafNodeType(*tmpLeafNodes[i])); + } + } + } + } + } // end range loop + } + + InternalNodeType const * const * const mLhsNodes; + TreeType const * const mRhsTree; + TreeType mLocalTree; + TreeType * const mOutputTree; + + std::vector mLocalLeafNodes; + std::vector * const mOutputLeafNodes; + }; // struct ProcessInternalNodes + + struct ProcessLeafNodes { + + ProcessLeafNodes(std::vector& lhsNodes, const TreeType& rhsTree, TreeType& output) + : mLhsNodes(lhsNodes.empty() ? NULL : &lhsNodes.front()) + , mRhsTree(&rhsTree) + , mLocalTree(mRhsTree->background()) + , mOutputTree(&output) + { + } + + ProcessLeafNodes(ProcessLeafNodes& other, tbb::split) + : mLhsNodes(other.mLhsNodes) + , mRhsTree(other.mRhsTree) + , mLocalTree(mRhsTree->background()) + , mOutputTree(&mLocalTree) + { + } + + void join(ProcessLeafNodes& rhs) { mOutputTree->merge(*rhs.mOutputTree); } + + void operator()(const tbb::blocked_range& range) + { + tree::ValueAccessor rhsAcc(*mRhsTree); + tree::ValueAccessor outputAcc(*mOutputTree); + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + const LeafNodeType& lhsNode = *mLhsNodes[n]; + const Coord& ijk = lhsNode.origin(); + + const LeafNodeType* rhsNodePt = rhsAcc.probeConstLeaf(ijk); + + if (rhsNodePt) { // combine overlapping nodes + + LeafNodeType* outputNode = outputAcc.touchLeaf(ijk); + ValueType * outputData = outputNode->buffer().data(); + NodeMaskType& outputMask = outputNode->getValueMask(); + + const ValueType * lhsData = lhsNode.buffer().data(); + const NodeMaskType& lhsMask = lhsNode.getValueMask(); + + const ValueType * rhsData = rhsNodePt->buffer().data(); + const NodeMaskType& rhsMask = rhsNodePt->getValueMask(); + + if (Operation == CSG_INTERSECTION) { + for (Index pos = 0; pos < LeafNodeType::SIZE; ++pos) { + const bool fromRhs = lhsData[pos] < rhsData[pos]; + outputData[pos] = fromRhs ? rhsData[pos] : lhsData[pos]; + outputMask.set(pos, fromRhs ? rhsMask.isOn(pos) : lhsMask.isOn(pos)); + } + } else if (Operation == CSG_DIFFERENCE){ + for (Index pos = 0; pos < LeafNodeType::SIZE; ++pos) { + const ValueType rhsVal = math::negative(rhsData[pos]); + const bool fromRhs = lhsData[pos] < rhsVal; + outputData[pos] = fromRhs ? rhsVal : lhsData[pos]; + outputMask.set(pos, fromRhs ? rhsMask.isOn(pos) : lhsMask.isOn(pos)); + } + } else { // Union + for (Index pos = 0; pos < LeafNodeType::SIZE; ++pos) { + const bool fromRhs = lhsData[pos] > rhsData[pos]; + outputData[pos] = fromRhs ? rhsData[pos] : lhsData[pos]; + outputMask.set(pos, fromRhs ? rhsMask.isOn(pos) : lhsMask.isOn(pos)); + } + } + + } else { + if (Operation == CSG_INTERSECTION) { + if (rhsAcc.getValue(ijk) < ValueType(0.0)) { + outputAcc.addLeaf(new LeafNodeType(lhsNode)); + } + } else { // Union & Difference + if (!(rhsAcc.getValue(ijk) < ValueType(0.0))) { + outputAcc.addLeaf(new LeafNodeType(lhsNode)); + } + } + } + } // end range loop + } + + LeafNodeType const * const * const mLhsNodes; + TreeType const * const mRhsTree; + TreeType mLocalTree; + TreeType * const mOutputTree; + }; // struct ProcessLeafNodes + + TreePtrType mSegment; + TreeType const * const mLhsTree; + TreeType const * const mRhsTree; +}; // struct BuildPrimarySegment + + +template +struct BuildSecondarySegment +{ + typedef typename TreeType::ValueType ValueType; + typedef typename TreeType::Ptr TreePtrType; + typedef typename TreeType::LeafNodeType LeafNodeType; + typedef typename LeafNodeType::NodeMaskType NodeMaskType; + typedef typename TreeType::RootNodeType RootNodeType; + typedef typename RootNodeType::NodeChainType NodeChainType; + typedef typename boost::mpl::at >::type InternalNodeType; + + BuildSecondarySegment(const TreeType& lhs, const TreeType& rhs) + : mSegment(new TreeType(lhs.background())) + , mLhsTree(&lhs) + , mRhsTree(&rhs) + { + } + + void operator()() const + { + std::vector leafNodes; + + { + std::vector internalNodes; + mRhsTree->getNodes(internalNodes); + + ProcessInternalNodes op(internalNodes, *mLhsTree, *mSegment, leafNodes); + tbb::parallel_reduce(tbb::blocked_range(0, internalNodes.size()), op); + } + + ProcessLeafNodes op(leafNodes, *mLhsTree, *mSegment); + tbb::parallel_reduce(tbb::blocked_range(0, leafNodes.size()), op); + } + + TreePtrType& segment() { return mSegment; } + +private: + + struct ProcessInternalNodes { + + ProcessInternalNodes(std::vector& rhsNodes, const TreeType& lhsTree, + TreeType& outputTree, std::vector& outputLeafNodes) + : mRhsNodes(rhsNodes.empty() ? NULL : &rhsNodes.front()) + , mLhsTree(&lhsTree) + , mLocalTree(mLhsTree->background()) + , mOutputTree(&outputTree) + , mLocalLeafNodes() + , mOutputLeafNodes(&outputLeafNodes) + { + } + + ProcessInternalNodes(ProcessInternalNodes& other, tbb::split) + : mRhsNodes(other.mRhsNodes) + , mLhsTree(other.mLhsTree) + , mLocalTree(mLhsTree->background()) + , mOutputTree(&mLocalTree) + , mLocalLeafNodes() + , mOutputLeafNodes(&mLocalLeafNodes) + { + } + + void join(ProcessInternalNodes& other) + { + mOutputTree->merge(*other.mOutputTree); + mOutputLeafNodes->insert(mOutputLeafNodes->end(), + other.mOutputLeafNodes->begin(), other.mOutputLeafNodes->end()); + } + + void operator()(const tbb::blocked_range& range) + { + tree::ValueAccessor lhsAcc(*mLhsTree); + tree::ValueAccessor outputAcc(*mOutputTree); + + std::vector tmpLeafNodes; + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + const InternalNodeType& rhsNode = *mRhsNodes[n]; + const Coord& ijk = rhsNode.origin(); + const InternalNodeType * lhsNode = lhsAcc.template probeConstNode(ijk); + + if (lhsNode) { + rhsNode.getNodes(*mOutputLeafNodes); + } else { + if (Operation == CSG_INTERSECTION) { + if (lhsAcc.getValue(ijk) < ValueType(0.0)) { + tmpLeafNodes.clear(); + rhsNode.getNodes(tmpLeafNodes); + for (size_t i = 0, I = tmpLeafNodes.size(); i < I; ++i) { + outputAcc.addLeaf(new LeafNodeType(*tmpLeafNodes[i])); + } + } + } else if (Operation == CSG_DIFFERENCE) { + if (lhsAcc.getValue(ijk) < ValueType(0.0)) { + tmpLeafNodes.clear(); + rhsNode.getNodes(tmpLeafNodes); + for (size_t i = 0, I = tmpLeafNodes.size(); i < I; ++i) { + LeafNodeType* outputNode = new LeafNodeType(*tmpLeafNodes[i]); + outputNode->negate(); + outputAcc.addLeaf(outputNode); + } + } + } else { // Union + if (!(lhsAcc.getValue(ijk) < ValueType(0.0))) { + tmpLeafNodes.clear(); + rhsNode.getNodes(tmpLeafNodes); + for (size_t i = 0, I = tmpLeafNodes.size(); i < I; ++i) { + outputAcc.addLeaf(new LeafNodeType(*tmpLeafNodes[i])); + } + } + } + } + } // end range loop + } + + InternalNodeType const * const * const mRhsNodes; + TreeType const * const mLhsTree; + TreeType mLocalTree; + TreeType * const mOutputTree; + + std::vector mLocalLeafNodes; + std::vector * const mOutputLeafNodes; + }; // struct ProcessInternalNodes + + struct ProcessLeafNodes { + + ProcessLeafNodes(std::vector& rhsNodes, const TreeType& lhsTree, TreeType& output) + : mRhsNodes(rhsNodes.empty() ? NULL : &rhsNodes.front()) + , mLhsTree(&lhsTree) + , mLocalTree(mLhsTree->background()) + , mOutputTree(&output) + { + } + + ProcessLeafNodes(ProcessLeafNodes& rhs, tbb::split) + : mRhsNodes(rhs.mRhsNodes) + , mLhsTree(rhs.mLhsTree) + , mLocalTree(mLhsTree->background()) + , mOutputTree(&mLocalTree) + { + } + + void join(ProcessLeafNodes& rhs) { mOutputTree->merge(*rhs.mOutputTree); } + + void operator()(const tbb::blocked_range& range) + { + tree::ValueAccessor lhsAcc(*mLhsTree); + tree::ValueAccessor outputAcc(*mOutputTree); + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + const LeafNodeType& rhsNode = *mRhsNodes[n]; + const Coord& ijk = rhsNode.origin(); + + const LeafNodeType* lhsNode = lhsAcc.probeConstLeaf(ijk); + + if (!lhsNode) { + if (Operation == CSG_INTERSECTION) { + if (lhsAcc.getValue(ijk) < ValueType(0.0)) { + outputAcc.addLeaf(new LeafNodeType(rhsNode)); + } + } else if (Operation == CSG_DIFFERENCE) { + if (lhsAcc.getValue(ijk) < ValueType(0.0)) { + LeafNodeType* outputNode = new LeafNodeType(rhsNode); + outputNode->negate(); + outputAcc.addLeaf(outputNode); + } + } else { // Union + if (!(lhsAcc.getValue(ijk) < ValueType(0.0))) { + outputAcc.addLeaf(new LeafNodeType(rhsNode)); + } + } + } + } // end range loop + } + + LeafNodeType const * const * const mRhsNodes; + TreeType const * const mLhsTree; + TreeType mLocalTree; + TreeType * const mOutputTree; + }; // struct ProcessLeafNodes + + TreePtrType mSegment; + TreeType const * const mLhsTree; + TreeType const * const mRhsTree; +}; // struct BuildSecondarySegment + + +template +inline typename TreeType::Ptr +doCSGCopy(const TreeType& lhs, const TreeType& rhs) +{ + BuildPrimarySegment primary(lhs, rhs); + BuildSecondarySegment secondary(lhs, rhs); + + // Exploiting nested parallelism + tbb::task_group tasks; + tasks.run(primary); + tasks.run(secondary); + tasks.wait(); + + primary.segment()->merge(*secondary.segment()); + + // The leafnode (level = 0) sign is set in the segment construction. + tools::signedFloodFill(*primary.segment(), /*threaded=*/true, /*grainSize=*/1, /*minLevel=*/1); + + return primary.segment(); +} + + +//////////////////////////////////////// + + +template +struct GridOrTreeConstructor +{ + typedef typename TreeType::Ptr TreeTypePtr; + static TreeTypePtr construct(const TreeType&, TreeTypePtr& tree) { return tree; } +}; + + +template +struct GridOrTreeConstructor > +{ + typedef Grid GridType; + typedef typename Grid::Ptr GridTypePtr; + typedef typename TreeType::Ptr TreeTypePtr; + + static GridTypePtr construct(const GridType& grid, TreeTypePtr& tree) { + GridTypePtr maskGrid(GridType::create(tree)); + maskGrid->setTransform(grid.transform().copy()); + maskGrid->insertMeta(grid); + return maskGrid; + } +}; + + +//////////////////////////////////////// + + +} // namespace composite + + +template +OPENVDB_STATIC_SPECIALIZATION inline void +compMax(GridOrTreeT& aTree, GridOrTreeT& bTree) +{ + typedef TreeAdapter Adapter; + typedef typename Adapter::TreeType TreeT; + typedef typename TreeT::ValueType ValueT; + struct Local { + static inline void op(CombineArgs& args) { + args.setResult(composite::max(args.a(), args.b())); + } + }; + Adapter::tree(aTree).combineExtended(Adapter::tree(bTree), Local::op, /*prune=*/false); +} + + +template +OPENVDB_STATIC_SPECIALIZATION inline void +compMin(GridOrTreeT& aTree, GridOrTreeT& bTree) +{ + typedef TreeAdapter Adapter; + typedef typename Adapter::TreeType TreeT; + typedef typename TreeT::ValueType ValueT; + struct Local { + static inline void op(CombineArgs& args) { + args.setResult(composite::min(args.a(), args.b())); + } + }; + Adapter::tree(aTree).combineExtended(Adapter::tree(bTree), Local::op, /*prune=*/false); +} + + +template +OPENVDB_STATIC_SPECIALIZATION inline void +compSum(GridOrTreeT& aTree, GridOrTreeT& bTree) +{ + typedef TreeAdapter Adapter; + typedef typename Adapter::TreeType TreeT; + struct Local { + static inline void op(CombineArgs& args) { + args.setResult(args.a() + args.b()); + } + }; + Adapter::tree(aTree).combineExtended(Adapter::tree(bTree), Local::op, /*prune=*/false); +} + + +template +OPENVDB_STATIC_SPECIALIZATION inline void +compMul(GridOrTreeT& aTree, GridOrTreeT& bTree) +{ + typedef TreeAdapter Adapter; + typedef typename Adapter::TreeType TreeT; + struct Local { + static inline void op(CombineArgs& args) { + args.setResult(args.a() * args.b()); + } + }; + Adapter::tree(aTree).combineExtended(Adapter::tree(bTree), Local::op, /*prune=*/false); +} + + +template +OPENVDB_STATIC_SPECIALIZATION inline void +compDiv(GridOrTreeT& aTree, GridOrTreeT& bTree) +{ + typedef TreeAdapter Adapter; + typedef typename Adapter::TreeType TreeT; + struct Local { + static inline void op(CombineArgs& args) { + args.setResult(composite::divide(args.a(), args.b())); + } + }; + Adapter::tree(aTree).combineExtended(Adapter::tree(bTree), Local::op, /*prune=*/false); +} + + +//////////////////////////////////////// + + +template +struct CompReplaceOp +{ + TreeT* const aTree; + + CompReplaceOp(TreeT& _aTree): aTree(&_aTree) {} + + /// @note fill operation is not thread safe + void operator()(const typename TreeT::ValueOnCIter& iter) const + { + CoordBBox bbox; + iter.getBoundingBox(bbox); + aTree->fill(bbox, *iter); + } + + void operator()(const typename TreeT::LeafCIter& leafIter) const + { + tree::ValueAccessor acc(*aTree); + for (typename TreeT::LeafCIter::LeafNodeT::ValueOnCIter iter = + leafIter->cbeginValueOn(); iter; ++iter) + { + acc.setValue(iter.getCoord(), *iter); + } + } +}; + + +template +OPENVDB_STATIC_SPECIALIZATION inline void +compReplace(GridOrTreeT& aTree, const GridOrTreeT& bTree) +{ + typedef TreeAdapter Adapter; + typedef typename Adapter::TreeType TreeT; + typedef typename TreeT::ValueOnCIter ValueOnCIterT; + + // Copy active states (but not values) from B to A. + Adapter::tree(aTree).topologyUnion(Adapter::tree(bTree)); + + CompReplaceOp op(Adapter::tree(aTree)); + + // Copy all active tile values from B to A. + ValueOnCIterT iter = bTree.cbeginValueOn(); + iter.setMaxDepth(iter.getLeafDepth() - 1); // don't descend into leaf nodes + foreach(iter, op, /*threaded=*/false); + + // Copy all active voxel values from B to A. + foreach(Adapter::tree(bTree).cbeginLeaf(), op); +} + + +//////////////////////////////////////// + + +/// Base visitor class for CSG operations +/// (not intended to be used polymorphically, so no virtual functions) +template +class CsgVisitorBase +{ +public: + typedef TreeType TreeT; + typedef typename TreeT::ValueType ValueT; + typedef typename TreeT::LeafNodeType::ChildAllIter ChildIterT; + + enum { STOP = 3 }; + + CsgVisitorBase(const TreeT& aTree, const TreeT& bTree): + mAOutside(aTree.background()), + mAInside(math::negative(mAOutside)), + mBOutside(bTree.background()), + mBInside(math::negative(mBOutside)) + { + const ValueT zero = zeroVal(); + if (!(mAOutside > zero)) { + OPENVDB_THROW(ValueError, + "expected grid A outside value > 0, got " << mAOutside); + } + if (!(mAInside < zero)) { + OPENVDB_THROW(ValueError, + "expected grid A inside value < 0, got " << mAInside); + } + if (!(mBOutside > zero)) { + OPENVDB_THROW(ValueError, + "expected grid B outside value > 0, got " << mBOutside); + } + if (!(mBInside < zero)) { + OPENVDB_THROW(ValueError, + "expected grid B outside value < 0, got " << mBOutside); + } + } + +protected: + ValueT mAOutside, mAInside, mBOutside, mBInside; +}; + + +//////////////////////////////////////// + + +template +struct CsgUnionVisitor: public CsgVisitorBase +{ + typedef TreeType TreeT; + typedef typename TreeT::ValueType ValueT; + typedef typename TreeT::LeafNodeType::ChildAllIter ChildIterT; + + enum { STOP = CsgVisitorBase::STOP }; + + CsgUnionVisitor(const TreeT& a, const TreeT& b): CsgVisitorBase(a, b) {} + + /// Don't process nodes that are at different tree levels. + template + inline int operator()(AIterT&, BIterT&) { return 0; } + + /// Process root and internal nodes. + template + inline int operator()(IterT& aIter, IterT& bIter) + { + ValueT aValue = zeroVal(); + typename IterT::ChildNodeType* aChild = aIter.probeChild(aValue); + if (!aChild && aValue < zeroVal()) { + // A is an inside tile. Leave it alone and stop traversing this branch. + return STOP; + } + + ValueT bValue = zeroVal(); + typename IterT::ChildNodeType* bChild = bIter.probeChild(bValue); + if (!bChild && bValue < zeroVal()) { + // B is an inside tile. Make A an inside tile and stop traversing this branch. + aIter.setValue(this->mAInside); + aIter.setValueOn(bIter.isValueOn()); + delete aChild; + return STOP; + } + + if (!aChild && aValue > zeroVal()) { + // A is an outside tile. If B has a child, transfer it to A, + // otherwise leave A alone. + if (bChild) { + bIter.setValue(this->mBOutside); + bIter.setValueOff(); + bChild->resetBackground(this->mBOutside, this->mAOutside); + aIter.setChild(bChild); // transfer child + delete aChild; + } + return STOP; + } + + // If A has a child and B is an outside tile, stop traversing this branch. + // Continue traversal only if A and B both have children. + return (aChild && bChild) ? 0 : STOP; + } + + /// Process leaf node values. + inline int operator()(ChildIterT& aIter, ChildIterT& bIter) + { + ValueT aValue, bValue; + aIter.probeValue(aValue); + bIter.probeValue(bValue); + if (aValue > bValue) { // a = min(a, b) + aIter.setValue(bValue); + aIter.setValueOn(bIter.isValueOn()); + } + return 0; + } +}; + + + +//////////////////////////////////////// + + +template +struct CsgIntersectVisitor: public CsgVisitorBase +{ + typedef TreeType TreeT; + typedef typename TreeT::ValueType ValueT; + typedef typename TreeT::LeafNodeType::ChildAllIter ChildIterT; + + enum { STOP = CsgVisitorBase::STOP }; + + CsgIntersectVisitor(const TreeT& a, const TreeT& b): CsgVisitorBase(a, b) {} + + /// Don't process nodes that are at different tree levels. + template + inline int operator()(AIterT&, BIterT&) { return 0; } + + /// Process root and internal nodes. + template + inline int operator()(IterT& aIter, IterT& bIter) + { + ValueT aValue = zeroVal(); + typename IterT::ChildNodeType* aChild = aIter.probeChild(aValue); + if (!aChild && !(aValue < zeroVal())) { + // A is an outside tile. Leave it alone and stop traversing this branch. + return STOP; + } + + ValueT bValue = zeroVal(); + typename IterT::ChildNodeType* bChild = bIter.probeChild(bValue); + if (!bChild && !(bValue < zeroVal())) { + // B is an outside tile. Make A an outside tile and stop traversing this branch. + aIter.setValue(this->mAOutside); + aIter.setValueOn(bIter.isValueOn()); + delete aChild; + return STOP; + } + + if (!aChild && aValue < zeroVal()) { + // A is an inside tile. If B has a child, transfer it to A, + // otherwise leave A alone. + if (bChild) { + bIter.setValue(this->mBOutside); + bIter.setValueOff(); + bChild->resetBackground(this->mBOutside, this->mAOutside); + aIter.setChild(bChild); // transfer child + delete aChild; + } + return STOP; + } + + // If A has a child and B is an outside tile, stop traversing this branch. + // Continue traversal only if A and B both have children. + return (aChild && bChild) ? 0 : STOP; + } + + /// Process leaf node values. + inline int operator()(ChildIterT& aIter, ChildIterT& bIter) + { + ValueT aValue, bValue; + aIter.probeValue(aValue); + bIter.probeValue(bValue); + if (aValue < bValue) { // a = max(a, b) + aIter.setValue(bValue); + aIter.setValueOn(bIter.isValueOn()); + } + return 0; + } +}; + + +//////////////////////////////////////// + + +template +struct CsgDiffVisitor: public CsgVisitorBase +{ + typedef TreeType TreeT; + typedef typename TreeT::ValueType ValueT; + typedef typename TreeT::LeafNodeType::ChildAllIter ChildIterT; + + enum { STOP = CsgVisitorBase::STOP }; + + CsgDiffVisitor(const TreeT& a, const TreeT& b): CsgVisitorBase(a, b) {} + + /// Don't process nodes that are at different tree levels. + template + inline int operator()(AIterT&, BIterT&) { return 0; } + + /// Process root and internal nodes. + template + inline int operator()(IterT& aIter, IterT& bIter) + { + ValueT aValue = zeroVal(); + typename IterT::ChildNodeType* aChild = aIter.probeChild(aValue); + if (!aChild && !(aValue < zeroVal())) { + // A is an outside tile. Leave it alone and stop traversing this branch. + return STOP; + } + + ValueT bValue = zeroVal(); + typename IterT::ChildNodeType* bChild = bIter.probeChild(bValue); + if (!bChild && bValue < zeroVal()) { + // B is an inside tile. Make A an inside tile and stop traversing this branch. + aIter.setValue(this->mAOutside); + aIter.setValueOn(bIter.isValueOn()); + delete aChild; + return STOP; + } + + if (!aChild && aValue < zeroVal()) { + // A is an inside tile. If B has a child, transfer it to A, + // otherwise leave A alone. + if (bChild) { + bIter.setValue(this->mBOutside); + bIter.setValueOff(); + bChild->resetBackground(this->mBOutside, this->mAOutside); + aIter.setChild(bChild); // transfer child + bChild->negate(); + delete aChild; + } + return STOP; + } + + // If A has a child and B is an outside tile, stop traversing this branch. + // Continue traversal only if A and B both have children. + return (aChild && bChild) ? 0 : STOP; + } + + /// Process leaf node values. + inline int operator()(ChildIterT& aIter, ChildIterT& bIter) + { + ValueT aValue, bValue; + aIter.probeValue(aValue); + bIter.probeValue(bValue); + bValue = math::negative(bValue); + if (aValue < bValue) { // a = max(a, -b) + aIter.setValue(bValue); + aIter.setValueOn(bIter.isValueOn()); + } + return 0; + } +}; + + +//////////////////////////////////////// + + +template +OPENVDB_STATIC_SPECIALIZATION inline void +csgUnion(GridOrTreeT& a, GridOrTreeT& b, bool prune) +{ + typedef TreeAdapter Adapter; + typedef typename Adapter::TreeType TreeT; + TreeT &aTree = Adapter::tree(a), &bTree = Adapter::tree(b); + CsgUnionVisitor visitor(aTree, bTree); + aTree.visit2(bTree, visitor); + if (prune) tools::pruneLevelSet(aTree); +} + +template +OPENVDB_STATIC_SPECIALIZATION inline void +csgIntersection(GridOrTreeT& a, GridOrTreeT& b, bool prune) +{ + typedef TreeAdapter Adapter; + typedef typename Adapter::TreeType TreeT; + TreeT &aTree = Adapter::tree(a), &bTree = Adapter::tree(b); + CsgIntersectVisitor visitor(aTree, bTree); + aTree.visit2(bTree, visitor); + if (prune) tools::pruneLevelSet(aTree); +} + +template +OPENVDB_STATIC_SPECIALIZATION inline void +csgDifference(GridOrTreeT& a, GridOrTreeT& b, bool prune) +{ + typedef TreeAdapter Adapter; + typedef typename Adapter::TreeType TreeT; + TreeT &aTree = Adapter::tree(a), &bTree = Adapter::tree(b); + CsgDiffVisitor visitor(aTree, bTree); + aTree.visit2(bTree, visitor); + if (prune) tools::pruneLevelSet(aTree); +} + + +template +OPENVDB_STATIC_SPECIALIZATION inline typename GridOrTreeT::Ptr +csgUnionCopy(const GridOrTreeT& a, const GridOrTreeT& b) +{ + typedef TreeAdapter Adapter; + typedef typename Adapter::TreeType::Ptr TreePtrT; + + TreePtrT output = composite::doCSGCopy( + Adapter::tree(a), Adapter::tree(b)); + + return composite::GridOrTreeConstructor::construct(a, output); +} + + +template +OPENVDB_STATIC_SPECIALIZATION inline typename GridOrTreeT::Ptr +csgIntersectionCopy(const GridOrTreeT& a, const GridOrTreeT& b) +{ + typedef TreeAdapter Adapter; + typedef typename Adapter::TreeType::Ptr TreePtrT; + + TreePtrT output = composite::doCSGCopy( + Adapter::tree(a), Adapter::tree(b)); + + return composite::GridOrTreeConstructor::construct(a, output); +} + + +template +OPENVDB_STATIC_SPECIALIZATION inline typename GridOrTreeT::Ptr +csgDifferenceCopy(const GridOrTreeT& a, const GridOrTreeT& b) +{ + typedef TreeAdapter Adapter; + typedef typename Adapter::TreeType::Ptr TreePtrT; + + TreePtrT output = composite::doCSGCopy( + Adapter::tree(a), Adapter::tree(b)); + + return composite::GridOrTreeConstructor::construct(a, output); +} + + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_COMPOSITE_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/Dense.h b/nuparu/include/openvdb/include/openvdb/tools/Dense.h new file mode 100644 index 00000000..e4c091ec --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/Dense.h @@ -0,0 +1,608 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file Dense.h +/// +/// @brief This file defines a simple dense grid and efficient +/// converters to and from VDB grids. + +#ifndef OPENVDB_TOOLS_DENSE_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_DENSE_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include +#include "Prune.h" + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief Populate a dense grid with the values of voxels from a sparse grid, +/// where the sparse grid intersects the dense grid. +/// @param sparse an OpenVDB grid or tree from which to copy values +/// @param dense the dense grid into which to copy values +/// @param serial if false, process voxels in parallel +template +void +copyToDense( + const GridOrTreeT& sparse, + DenseT& dense, + bool serial = false); + + +/// @brief Populate a sparse grid with the values of all of the voxels of a dense grid. +/// @param dense the dense grid from which to copy values +/// @param sparse an OpenVDB grid or tree into which to copy values +/// @param tolerance values in the dense grid that are within this tolerance of the sparse +/// grid's background value become inactive background voxels or tiles in the sparse grid +/// @param serial if false, process voxels in parallel +template +void +copyFromDense( + const DenseT& dense, + GridOrTreeT& sparse, + const typename GridOrTreeT::ValueType& tolerance, + bool serial = false); + + +//////////////////////////////////////// + +/// We currently support the following two 3D memory layouts for dense +/// volumes: XYZ, i.e. x is the fastest moving index, and ZYX, i.e. z +/// is the fastest moving index. The ZYX memory layout leads to nested +/// for-loops of the order x, y, z, which we find to be the most +/// intuitive. Hence, ZYX is the layout used throughout VDB. However, +/// other data structures, e.g. Houdini and Maya, employ the XYZ +/// layout. Clearly a dense volume with the ZYX layout converts more +/// efficiently to a VDB, but we support both for convenience. +enum MemoryLayout { LayoutXYZ, LayoutZYX }; + +/// @brief Base class for Dense which is defined below. +/// @note The constructor of this class is protected to prevent direct +/// instantiation. +template class DenseBase; + +/// @brief Partial template specialization of DenseBase. +/// @note ZYX is the memory-layout in VDB. It leads to nested +/// for-loops of the order x, y, z which we find to be the most intuitive. +template +class DenseBase +{ +public: + /// @brief Return the linear offset into this grid's value array given by + /// unsigned coordinates (i, j, k), i.e., coordinates relative to + /// the origin of this grid's bounding box. + /// + /// @warning The input coordinates are assume to be relative to + /// the grid's origin, i.e. minimum of its index bounding box! + inline size_t coordToOffset(size_t i, size_t j, size_t k) const { return i*mX + j*mY + k; } + + /// @brief Return the local coordinate corresponding to the specified linear offset. + /// + /// @warning The returned coordinate is relative to the origin of this + /// grid's bounding box so add dense.origin() to get absolute coordinates. + inline Coord offsetToLocalCoord(size_t n) const + { + const size_t x = n / mX; + n -= mX*x; + const size_t y = n / mY; + return Coord(Coord::ValueType(x), Coord::ValueType(y), Coord::ValueType(n - mY*y)); + } + + /// @brief Return the stride of the array in the x direction ( = dimY*dimZ). + /// @note This method is required by both CopyToDense and CopyFromDense. + inline size_t xStride() const { return mX; } + + /// @brief Return the stride of the array in the y direction ( = dimZ). + /// @note This method is required by both CopyToDense and CopyFromDense. + inline size_t yStride() const { return mY; } + + /// @brief Return the stride of the array in the z direction ( = 1). + /// @note This method is required by both CopyToDense and CopyFromDense. + static size_t zStride() { return 1; } + +protected: + /// Protected constructor so as to prevent direct instantiation + DenseBase(const CoordBBox& bbox) : mBBox(bbox), mY(bbox.dim()[2]), mX(mY*bbox.dim()[1]) {} + + const CoordBBox mBBox;//signed coordinates of the domain represented by the grid + const size_t mY, mX;//strides in the y and x direction +};// end of DenseBase + +/// @brief Partial template specialization of DenseBase. +/// @note This is the memory-layout employed in Houdini and Maya. It leads +/// to nested for-loops of the order z, y, x. +template +class DenseBase +{ +public: + /// @brief Return the linear offset into this grid's value array given by + /// unsigned coordinates (i, j, k), i.e., coordinates relative to + /// the origin of this grid's bounding box. + /// + /// @warning The input coordinates are assume to be relative to + /// the grid's origin, i.e. minimum of its index bounding box! + inline size_t coordToOffset(size_t i, size_t j, size_t k) const { return i + j*mY + k*mZ; } + + /// @brief Return the index coordinate corresponding to the specified linear offset. + /// + /// @warning The returned coordinate is relative to the origin of this + /// grid's bounding box so add dense.origin() to get absolute coordinates. + inline Coord offsetToLocalCoord(size_t n) const + { + const size_t z = n / mZ; + n -= mZ*z; + const size_t y = n / mY; + return Coord(Coord::ValueType(n - mY*y), Coord::ValueType(y), Coord::ValueType(z)); + } + + /// @brief Return the stride of the array in the x direction ( = 1). + /// @note This method is required by both CopyToDense and CopyFromDense. + static size_t xStride() { return 1; } + + /// @brief Return the stride of the array in the y direction ( = dimX). + /// @note This method is required by both CopyToDense and CopyFromDense. + inline size_t yStride() const { return mY; } + + /// @brief Return the stride of the array in the y direction ( = dimX*dimY). + /// @note This method is required by both CopyToDense and CopyFromDense. + inline size_t zStride() const { return mZ; } + +protected: + /// Protected constructor so as to prevent direct instantiation + DenseBase(const CoordBBox& bbox) : mBBox(bbox), mY(bbox.dim()[0]), mZ(mY*bbox.dim()[1]) {} + + const CoordBBox mBBox;//signed coordinates of the domain represented by the grid + const size_t mY, mZ;//strides in the y and z direction +};// end of DenseBase + +/// @brief Dense is a simple dense grid API used by the CopyToDense and +/// CopyFromDense classes defined below. +/// @details Use the Dense class to efficiently produce a dense in-memory +/// representation of an OpenVDB grid. However, be aware that a dense grid +/// could have a memory footprint that is orders of magnitude larger than +/// the sparse grid from which it originates. +/// +/// @note This class can be used as a simple wrapper for existing dense grid +/// classes if they provide access to the raw data array. +/// @note This implementation allows for the 3D memory layout to be +/// defined by the MemoryLayout template parameter (see above for definition). +/// The default memory layout is ZYX since that's the layout used by OpenVDB grids. +template +class Dense : public DenseBase +{ +public: + typedef ValueT ValueType; + typedef DenseBase BaseT; + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + /// @brief Construct a dense grid with a given range of coordinates. + /// + /// @param bbox the bounding box of the (signed) coordinate range of this grid + /// @throw ValueError if the bounding box is empty. + /// @note The min and max coordinates of the bounding box are inclusive. + Dense(const CoordBBox& bbox) : BaseT(bbox) { this->init(); } + + /// @brief Construct a dense grid with a given range of coordinates and initial value + /// + /// @param bbox the bounding box of the (signed) coordinate range of this grid + /// @param value the initial value of the grid. + /// @throw ValueError if the bounding box is empty. + /// @note The min and max coordinates of the bounding box are inclusive. + Dense(const CoordBBox& bbox, const ValueT& value) : BaseT(bbox) + { + this->init(); + this->fill(value); + } + + /// @brief Construct a dense grid that wraps an external array. + /// + /// @param bbox the bounding box of the (signed) coordinate range of this grid + /// @param data a raw C-style array whose size is commensurate with + /// the coordinate domain of @a bbox + /// + /// @note The data array is assumed to have a stride of one in the @e z direction. + /// @throw ValueError if the bounding box is empty. + /// @note The min and max coordinates of the bounding box are inclusive. + Dense(const CoordBBox& bbox, ValueT* data) : BaseT(bbox), mData(data) + { + if (BaseT::mBBox.empty()) { + OPENVDB_THROW(ValueError, "can't construct a dense grid with an empty bounding box"); + } + } + + /// @brief Construct a dense grid with a given origin and dimensions. + /// + /// @param dim the desired dimensions of the grid + /// @param min the signed coordinates of the first voxel in the dense grid + /// @throw ValueError if any of the dimensions are zero. + /// @note The @a min coordinate is inclusive, and the max coordinate will be + /// @a min + @a dim - 1. + Dense(const Coord& dim, const Coord& min = Coord(0)) + : BaseT(CoordBBox(min, min+dim.offsetBy(-1))) + { + this->init(); + } + + /// @brief Return the memory layout for this grid (see above for definitions). + static MemoryLayout memoryLayout() { return Layout; } + + /// @brief Return a raw pointer to this grid's value array. + /// @note This method is required by CopyToDense. + inline ValueT* data() { return mData; } + + /// @brief Return a raw pointer to this grid's value array. + /// @note This method is required by CopyFromDense. + inline const ValueT* data() const { return mData; } + + /// @brief Return the bounding box of the signed index domain of this grid. + /// @note This method is required by both CopyToDense and CopyFromDense. + inline const CoordBBox& bbox() const { return BaseT::mBBox; } + + /// Return the grid's origin in index coordinates. + inline const Coord& origin() const { return BaseT::mBBox.min(); } + + /// @brief Return the number of voxels contained in this grid. + inline Index64 valueCount() const { return BaseT::mBBox.volume(); } + + /// @brief Set the value of the voxel at the given array offset. + inline void setValue(size_t offset, const ValueT& value) { mData[offset] = value; } + + /// @brief Return a const reference to the value of the voxel at the given array offset. + const ValueT& getValue(size_t offset) const { return mData[offset]; } + + /// @brief Return a non-const reference to the value of the voxel at the given array offset. + ValueT& getValue(size_t offset) { return mData[offset]; } + + /// @brief Set the value of the voxel at unsigned index coordinates (i, j, k). + /// @note This is somewhat slower than using an array offset. + inline void setValue(size_t i, size_t j, size_t k, const ValueT& value) + { + mData[BaseT::coordToOffset(i,j,k)] = value; + } + + /// @brief Return a const reference to the value of the voxel at unsigned index coordinates (i, j, k). + /// @note This is somewhat slower than using an array offset. + inline const ValueT& getValue(size_t i, size_t j, size_t k) const + { + return mData[BaseT::coordToOffset(i,j,k)]; + } + + /// @brief Return a non-const reference to the value of the voxel at unsigned index coordinates (i, j, k). + /// @note This is somewhat slower than using an array offset. + inline ValueT& getValue(size_t i, size_t j, size_t k) + { + return mData[BaseT::coordToOffset(i,j,k)]; + } + + /// @brief Set the value of the voxel at the given signed coordinates. + /// @note This is slower than using either an array offset or unsigned index coordinates. + inline void setValue(const Coord& xyz, const ValueT& value) + { + mData[this->coordToOffset(xyz)] = value; + } + + /// @brief Return a const reference to the value of the voxel at the given signed coordinates. + /// @note This is slower than using either an array offset or unsigned index coordinates. + inline const ValueT& getValue(const Coord& xyz) const + { + return mData[this->coordToOffset(xyz)]; + } + + /// @brief Return a non-const reference to the value of the voxel at the given signed coordinates. + /// @note This is slower than using either an array offset or unsigned index coordinates. + inline ValueT& getValue(const Coord& xyz) + { + return mData[this->coordToOffset(xyz)]; + } + + /// @brief Fill this grid with a constant value. + inline void fill(const ValueT& value) + { + size_t size = this->valueCount(); + ValueT* a = mData; + while(size--) *a++ = value; + } + + /// @brief Return the linear offset into this grid's value array given by + /// the specified signed coordinates, i.e., coordinates in the space of + /// this grid's bounding box. + /// + /// @note This method reflects the fact that we assume the same + /// layout of values as an OpenVDB grid, i.e., the fastest coordinate is @e z. + inline size_t coordToOffset(const Coord& xyz) const + { + assert(BaseT::mBBox.isInside(xyz)); + return BaseT::coordToOffset(size_t(xyz[0]-BaseT::mBBox.min()[0]), + size_t(xyz[1]-BaseT::mBBox.min()[1]), + size_t(xyz[2]-BaseT::mBBox.min()[2])); + } + + /// @brief Return the global coordinate corresponding to the specified linear offset. + inline Coord offsetToCoord(size_t n) const + { + return this->offsetToLocalCoord(n) + BaseT::mBBox.min(); + } + + /// @brief Return the memory footprint of this Dense grid in bytes. + inline Index64 memUsage() const + { + return sizeof(*this) + BaseT::mBBox.volume() * sizeof(ValueType); + } + + /// @brief Output a human-readable description of this grid to the + /// specified stream. + void print(const std::string& name = "", std::ostream& os = std::cout) const + { + const Coord dim = BaseT::mBBox.dim(); + os << "Dense Grid"; + if (!name.empty()) os << " \"" << name << "\""; + util::printBytes(os, this->memUsage(), ":\n Memory footprint: "); + os << " Dimensions of grid : " << dim[0] << " x " << dim[1] << " x " << dim[2] << "\n"; + os << " Number of voxels: " << util::formattedInt(this->valueCount()) << "\n"; + os << " Bounding box of voxels: " << BaseT::mBBox << "\n"; + os << " Memory layout: " << (Layout == LayoutZYX ? "ZYX (" : "XYZ (dis") + << "similar to VDB)\n"; + } + +private: + + /// @brief Private method to initialize the dense value array. + void init() + { + if (BaseT::mBBox.empty()) { + OPENVDB_THROW(ValueError, "can't construct a dense grid with an empty bounding box"); + } + mArray.reset(new ValueT[BaseT::mBBox.volume()]); + mData = mArray.get(); + } + + boost::scoped_array mArray; + ValueT* mData;//raw c-style pointer to values +};// end of Dense + +//////////////////////////////////////// + + +/// @brief Copy an OpenVDB tree into an existing dense grid. +/// +/// @note Only voxels that intersect the dense grid's bounding box are copied +/// from the OpenVDB tree. But both active and inactive voxels are copied, +/// so all existing values in the dense grid are overwritten, regardless of +/// the OpenVDB tree's topology. +template > +class CopyToDense +{ +public: + typedef _DenseT DenseT; + typedef _TreeT TreeT; + typedef typename TreeT::ValueType ValueT; + + CopyToDense(const TreeT& tree, DenseT& dense) + : mRoot(&(tree.root())), mDense(&dense) {} + + void copy(bool serial = false) const + { + if (serial) { + mRoot->copyToDense(mDense->bbox(), *mDense); + } else { + tbb::parallel_for(mDense->bbox(), *this); + } + } + + /// @brief Public method called by tbb::parallel_for + void operator()(const CoordBBox& bbox) const + { + mRoot->copyToDense(bbox, *mDense); + } + +private: + const typename TreeT::RootNodeType* mRoot; + DenseT* mDense; +};// CopyToDense + + +// Convenient wrapper function for the CopyToDense class +template +void +copyToDense(const GridOrTreeT& sparse, DenseT& dense, bool serial) +{ + typedef TreeAdapter Adapter; + typedef typename Adapter::TreeType TreeT; + + CopyToDense op(Adapter::constTree(sparse), dense); + op.copy(serial); +} + + +//////////////////////////////////////// + + +/// @brief Copy the values from a dense grid into an OpenVDB tree. +/// +/// @details Values in the dense grid that are within a tolerance of +/// the background value are truncated to inactive background voxels or tiles. +/// This allows the tree to form a sparse representation of the dense grid. +/// +/// @note Since this class allocates leaf nodes concurrently it is recommended +/// to use a scalable implementation of @c new like the one provided by TBB, +/// rather than the mutex-protected standard library @c new. +template > +class CopyFromDense +{ +public: + typedef _DenseT DenseT; + typedef _TreeT TreeT; + typedef typename TreeT::ValueType ValueT; + typedef typename TreeT::LeafNodeType LeafT; + typedef tree::ValueAccessor AccessorT; + + CopyFromDense(const DenseT& dense, TreeT& tree, const ValueT& tolerance) + : mDense(&dense), + mTree(&tree), + mBlocks(NULL), + mTolerance(tolerance), + mAccessor(tree.empty() ? NULL : new AccessorT(tree)) + { + } + CopyFromDense(const CopyFromDense& other) + : mDense(other.mDense), + mTree(other.mTree), + mBlocks(other.mBlocks), + mTolerance(other.mTolerance), + mAccessor(other.mAccessor.get() == NULL ? NULL : new AccessorT(*mTree)) + { + } + + /// @brief Copy values from the dense grid to the sparse tree. + void copy(bool serial = false) + { + mBlocks = new std::vector(); + const CoordBBox& bbox = mDense->bbox(); + // Pre-process: Construct a list of blocks aligned with (potential) leaf nodes + for (CoordBBox sub=bbox; sub.min()[0] <= bbox.max()[0]; sub.min()[0] = sub.max()[0] + 1) { + for (sub.min()[1] = bbox.min()[1]; sub.min()[1] <= bbox.max()[1]; + sub.min()[1] = sub.max()[1] + 1) + { + for (sub.min()[2] = bbox.min()[2]; sub.min()[2] <= bbox.max()[2]; + sub.min()[2] = sub.max()[2] + 1) + { + sub.max() = Coord::minComponent(bbox.max(), + (sub.min()&(~(LeafT::DIM-1u))).offsetBy(LeafT::DIM-1u)); + mBlocks->push_back(Block(sub)); + } + } + } + + // Multi-threaded process: Convert dense grid into leaf nodes and tiles + if (serial) { + (*this)(tbb::blocked_range(0, mBlocks->size())); + } else { + tbb::parallel_for(tbb::blocked_range(0, mBlocks->size()), *this); + } + + // Post-process: Insert leaf nodes and tiles into the tree, and prune the tiles only! + tree::ValueAccessor acc(*mTree); + for (size_t m=0, size = mBlocks->size(); m &r) const + { + assert(mBlocks); + LeafT* leaf = new LeafT(); + + for (size_t m=r.begin(), n=0, end = r.end(); m != end; ++m, ++n) { + + Block& block = (*mBlocks)[m]; + const CoordBBox &bbox = block.bbox; + + if (mAccessor.get() == NULL) {//i.e. empty target tree + leaf->fill(mTree->background(), false); + } else {//account for existing leaf nodes in the target tree + if (const LeafT* target = mAccessor->probeConstLeaf(bbox.min())) { + (*leaf) = (*target); + } else { + ValueT value = zeroVal(); + bool state = mAccessor->probeValue(bbox.min(), value); + leaf->fill(value, state); + } + } + + leaf->copyFromDense(bbox, *mDense, mTree->background(), mTolerance); + + if (!leaf->isConstant(block.tile.first, block.tile.second, mTolerance)) { + leaf->setOrigin(bbox.min() & (~(LeafT::DIM - 1))); + block.leaf = leaf; + leaf = new LeafT(); + } + }// loop over blocks + + delete leaf; + } + +private: + struct Block { + CoordBBox bbox; + LeafT* leaf; + std::pair tile; + Block(const CoordBBox& b) : bbox(b), leaf(NULL) {} + }; + + const DenseT* mDense; + TreeT* mTree; + std::vector* mBlocks; + ValueT mTolerance; + boost::scoped_ptr mAccessor; +};// CopyFromDense + + +// Convenient wrapper function for the CopyFromDense class +template +void +copyFromDense(const DenseT& dense, GridOrTreeT& sparse, + const typename GridOrTreeT::ValueType& tolerance, bool serial) +{ + typedef TreeAdapter Adapter; + typedef typename Adapter::TreeType TreeT; + + CopyFromDense op(dense, Adapter::tree(sparse), tolerance); + op.copy(serial); +} + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_DENSE_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/DenseSparseTools.h b/nuparu/include/openvdb/include/openvdb/tools/DenseSparseTools.h new file mode 100644 index 00000000..c8ec5e75 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/DenseSparseTools.h @@ -0,0 +1,1259 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_TOOLS_DENSESPARSETOOLS_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_DENSESPARSETOOLS_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include "Dense.h" + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief Selectively extract and transform data from a dense grid, producing a +/// sparse tree with leaf nodes only (e.g. create a tree from the square +/// of values greater than a cutoff.) +/// @param dense A dense grid that acts as a data source +/// @param functor A functor that selects and transforms data for output +/// @param background The background value of the resulting sparse grid +/// @param threaded Option to use threaded or serial code path +/// @return @c Ptr to tree with the valuetype and configuration defined +/// by typedefs in the @c functor. +/// @note To achieve optimal sparsity consider calling the prune() +/// method on the result. +/// @note To simply copy the all the data from a Dense grid to a +/// OpenVDB Grid, use tools::copyFromDense() for better performance. +/// +/// The type of the sparse tree is determined by the specified OtpType +/// functor by means of the typedef OptType::ResultTreeType +/// +/// The OptType function is responsible for the the transformation of +/// dense grid data to sparse grid data on a per-voxel basis. +/// +/// Only leaf nodes with active values will be added to the sparse grid. +/// +/// The OpType must struct that defines a the minimal form +/// @code +/// struct ExampleOp +/// { +/// typedef DesiredTreeType ResultTreeType; +/// +/// template +/// void OpType::operator() (const DenseValueType a, const IndexOrCoord& ijk, +/// ResultTreeType::LeafNodeType* leaf); +/// }; +/// @endcode +/// +/// For example, to generate a tree with valuesOn +/// at locations greater than a given maskvalue +/// @code +/// template +/// class Rule +/// { +/// public: +/// // Standard tree type (e.g. MaskTree or FloatTree in openvdb.h) +/// typedef typename openvdb::tree::Tree4::Type ResultTreeType; +/// +/// typedef typename ResultTreeType::LeafNodeType ResultLeafNodeType; +/// typedef typename ResultTreeType::ValueType ResultValueType; +/// +/// typedef float DenseValueType; +/// +/// typedef vdbmath::Coord::ValueType Index; +/// +/// Rule(const DenseValueType& value): mMaskValue(value){}; +/// +/// template +/// void operator()(const DenseValueType& a, const IndexOrCoord& offset, +/// ResultLeafNodeType* leaf) const +/// { +/// if (a > mMaskValue) { +/// leaf->setValueOn(offset, a); +/// } +/// } +/// +/// private: +/// const DenseValueType mMaskValue; +/// }; +/// @endcode +template +typename OpType::ResultTreeType::Ptr +extractSparseTree(const DenseType& dense, const OpType& functor, + const typename OpType::ResultValueType& background, + bool threaded = true); + +/// This struct that aids template resolution of a new tree type +/// has the same configuration at TreeType, but the ValueType from +/// DenseType. +template struct DSConverter { + typedef typename DenseType::ValueType ValueType; + + typedef typename TreeType::template ValueConverter::Type Type; +}; + + +/// @brief Copy data from the intersection of a sparse tree and a dense input grid. +/// The resulting tree has the same configuration as the sparse tree, but holds +/// the data type specified by the dense input. +/// @param dense A dense grid that acts as a data source +/// @param mask The active voxels and tiles intersected with dense define iteration mask +/// @param background The background value of the resulting sparse grid +/// @param threaded Option to use threaded or serial code path +/// @return @c Ptr to tree with the same configuration as @c mask but of value type +/// defined by @c dense. +template +typename DSConverter::Type::Ptr +extractSparseTreeWithMask(const DenseType& dense, + const MaskTreeType& mask, + const typename DenseType::ValueType& background, + bool threaded = true); + + +/// Apply a point-wise functor to the intersection of a dense grid and a given bounding box +/// @param dense A dense grid to be transformed +/// @param bbox Index space bounding box, define region where the transformation is applied +/// @param op A functor that acts on the dense grid value type +/// @param parallel Used to select multithreaded or single threaded +/// Minimally, the @c op class has to support a @c operator() method, +/// @code +/// // Square values in a grid +/// struct Op +/// { +/// ValueT operator()(const ValueT& in) const +/// { +/// // do work +/// ValueT result = in * in; +/// +/// return result; +/// } +/// }; +/// @endcode +/// NB: only Dense grids with memory layout zxy are supported +template +void transformDense(Dense& dense, + const openvdb::CoordBBox& bbox, const OpType& op, bool parallel=true); + +/// We currrently support the following operations when compositing sparse +/// data into a dense grid. +enum DSCompositeOp { + DS_OVER, DS_ADD, DS_SUB, DS_MIN, DS_MAX, DS_MULT, DS_SET +}; + +/// @brief Composite data from a sparse tree into a dense array of the same value type. +/// @param dense Dense grid to be altered by the operation +/// @param source Sparse data to composite into @c dense +/// @param alpha Sparse Alpha mask used in compositing operations. +/// @param beta Constant multiplier on src +/// @param strength Constant multiplier on alpha +/// @param threaded Enable threading for this operation. +template +void compositeToDense(Dense& dense, + const TreeT& source, + const TreeT& alpha, + const typename TreeT::ValueType beta, + const typename TreeT::ValueType strength, + bool threaded = true); + + +/// @brief Functor-based class used to extract data that satisfies some +/// criteria defined by the embedded @c OpType functor. The @c extractSparseTree +/// function wraps this class. +template +class SparseExtractor +{ + +public: + + typedef openvdb::math::Coord::ValueType Index; + + typedef typename DenseType::ValueType DenseValueType; + typedef typename OpType::ResultTreeType ResultTreeType; + typedef typename ResultTreeType::ValueType ResultValueType; + typedef typename ResultTreeType::LeafNodeType ResultLeafNodeType; + typedef typename ResultTreeType::template ValueConverter::Type MaskTree; + + typedef tbb::blocked_range3d Range3d; + + +private: + + const DenseType& mDense; + const OpType& mFunctor; + const ResultValueType mBackground; + const openvdb::math::CoordBBox mBBox; + const Index mWidth; + typename ResultTreeType::Ptr mMask; + openvdb::math::Coord mMin; + + +public: + + SparseExtractor(const DenseType& dense, const OpType& functor, + const ResultValueType background) : + mDense(dense), mFunctor(functor), + mBackground(background), + mBBox(dense.bbox()), + mWidth(ResultLeafNodeType::DIM), + mMask( new ResultTreeType(mBackground)) + {} + + + SparseExtractor(const DenseType& dense, + const openvdb::math::CoordBBox& bbox, + const OpType& functor, + const ResultValueType background) : + mDense(dense), mFunctor(functor), + mBackground(background), + mBBox(bbox), + mWidth(ResultLeafNodeType::DIM), + mMask( new ResultTreeType(mBackground)) + { + // mBBox must be inside the coordinate rage of the dense grid + if (!dense.bbox().isInside(mBBox)) { + OPENVDB_THROW(ValueError, "Data extraction window out of bound"); + } + } + + + SparseExtractor(SparseExtractor& other, tbb::split): + mDense(other.mDense), mFunctor(other.mFunctor), + mBackground(other.mBackground), mBBox(other.mBBox), + mWidth(other.mWidth), + mMask(new ResultTreeType(mBackground)), + mMin(other.mMin) + {} + + typename ResultTreeType::Ptr extract(bool threaded = true) { + + + // Construct 3D range of leaf nodes that + // intersect mBBox. + + // Snap the bbox to nearest leaf nodes min and max + + openvdb::math::Coord padded_min = mBBox.min(); + openvdb::math::Coord padded_max = mBBox.max(); + + + padded_min &= ~(mWidth - 1); + padded_max &= ~(mWidth - 1); + + padded_max[0] += mWidth - 1; + padded_max[1] += mWidth - 1; + padded_max[2] += mWidth - 1; + + + // number of leaf nodes in each direction + // division by leaf width, e.g. 8 in most cases + + const Index xleafCount = ( padded_max.x() - padded_min.x() + 1 ) / mWidth; + const Index yleafCount = ( padded_max.y() - padded_min.y() + 1 ) / mWidth; + const Index zleafCount = ( padded_max.z() - padded_min.z() + 1 ) / mWidth; + + mMin = padded_min; + + + Range3d leafRange(0, xleafCount, 1, + 0, yleafCount, 1, + 0, zleafCount, 1); + + + // Iterate over the leafnodes applying *this as a functor. + if (threaded) { + tbb::parallel_reduce(leafRange, *this); + } else { + (*this)(leafRange); + } + + return mMask; + } + + + void operator()(const Range3d& range) { + + ResultLeafNodeType* leaf = NULL; + + // Unpack the range3d item. + const Index imin = range.pages().begin(); + const Index imax = range.pages().end(); + + const Index jmin = range.rows().begin(); + const Index jmax = range.rows().end(); + + const Index kmin = range.cols().begin(); + const Index kmax = range.cols().end(); + + + // loop over all the candidate leafs. Adding only those with 'true' values + // to the tree + + for (Index i = imin; i < imax; ++i) { + for (Index j = jmin; j < jmax; ++j) { + for (Index k = kmin; k < kmax; ++k) { + + // Calculate the origin of candidate leaf + const openvdb::math::Coord origin = + mMin + openvdb::math::Coord(mWidth * i, + mWidth * j, + mWidth * k ); + + if (leaf == NULL) { + leaf = new ResultLeafNodeType(origin, mBackground); + } else { + leaf->setOrigin(origin); + leaf->fill(mBackground); + leaf->setValuesOff(); + } + + // The bounding box for this leaf + + openvdb::math::CoordBBox localBBox = leaf->getNodeBoundingBox(); + + // Shrink to the intersection with mBBox (i.e. the dense + // volume) + + localBBox.intersect(mBBox); + + // Early out for non-intersecting leafs + + if (localBBox.empty()) continue; + + + const openvdb::math::Coord start = localBBox.getStart(); + const openvdb::math::Coord end = localBBox.getEnd(); + + // Order the looping to respect the memory layout in + // the Dense source + + if (mDense.memoryLayout() == openvdb::tools::LayoutZYX) { + + openvdb::math::Coord ijk; + Index offset; + const DenseValueType* dp; + for (ijk[0] = start.x(); ijk[0] < end.x(); ++ijk[0] ) { + for (ijk[1] = start.y(); ijk[1] < end.y(); ++ijk[1] ) { + for (ijk[2] = start.z(), + offset = ResultLeafNodeType::coordToOffset(ijk), + dp = &mDense.getValue(ijk); + ijk[2] < end.z(); ++ijk[2], ++offset, ++dp) { + + mFunctor(*dp, offset, leaf); + } + } + } + + } else { + + openvdb::math::Coord ijk; + const DenseValueType* dp; + for (ijk[2] = start.z(); ijk[2] < end.z(); ++ijk[2]) { + for (ijk[1] = start.y(); ijk[1] < end.y(); ++ijk[1]) { + for (ijk[0] = start.x(), + dp = &mDense.getValue(ijk); + ijk[0] < end.x(); ++ijk[0], ++dp) { + + mFunctor(*dp, ijk, leaf); + + } + } + } + } + + // Only add non-empty leafs (empty is defined as all inactive) + + if (!leaf->isEmpty()) { + mMask->addLeaf(*leaf); + leaf = NULL; + } + + } + } + } + + // Clean up an unused leaf. + + if (leaf != NULL) delete leaf; + } + + void join(SparseExtractor& rhs) { + mMask->merge(*rhs.mMask); + } +}; // class SparseExtractor + + +template +typename OpType::ResultTreeType::Ptr +extractSparseTree(const DenseType& dense, const OpType& functor, + const typename OpType::ResultValueType& background, + bool threaded) +{ + + // Construct the mask using a parallel reduce pattern. + // Each thread computes disjoint mask-trees. The join merges + // into a single tree. + + SparseExtractor extractor(dense, functor, background); + + return extractor.extract(threaded); +} + + +/// @brief Functor-based class used to extract data from a dense grid, at +/// the index-space intersection with a supplied mask in the form of a sparse tree. +/// The @c extractSparseTreeWithMask function wraps this class. +template +class SparseMaskedExtractor +{ +public: + + typedef typename DSConverter::Type _ResultTreeType; + typedef _ResultTreeType ResultTreeType; + typedef typename ResultTreeType::LeafNodeType ResultLeafNodeType; + typedef typename ResultTreeType::ValueType ResultValueType; + typedef ResultValueType DenseValueType; + + typedef typename ResultTreeType::template ValueConverter::Type MaskTree; + typedef typename MaskTree::LeafCIter MaskLeafCIter; + typedef std::vector MaskLeafVec; + + + SparseMaskedExtractor(const DenseType& dense, + const ResultValueType& background, + const MaskLeafVec& leafVec + ): + mDense(dense), mBackground(background), mBBox(dense.bbox()), + mLeafVec(leafVec), + mResult(new ResultTreeType(mBackground)) + {} + + + + SparseMaskedExtractor(const SparseMaskedExtractor& other, tbb::split): + mDense(other.mDense), mBackground(other.mBackground), mBBox(other.mBBox), + mLeafVec(other.mLeafVec), mResult( new ResultTreeType(mBackground)) + {} + + typename ResultTreeType::Ptr extract(bool threaded = true) { + + tbb::blocked_range range(0, mLeafVec.size()); + + if (threaded) { + tbb::parallel_reduce(range, *this); + } else { + (*this)(range); + } + + return mResult; + } + + + // Used in looping over leaf nodes in the masked grid + // and using the active mask to select data to + void operator()(const tbb::blocked_range& range) { + + ResultLeafNodeType* leaf = NULL; + + + // loop over all the candidate leafs. Adding only those with 'true' values + // to the tree + + for (size_t idx = range.begin(); idx < range.end(); ++ idx) { + + const typename MaskTree::LeafNodeType* maskLeaf = mLeafVec[idx]; + + // The bounding box for this leaf + + openvdb::math::CoordBBox localBBox = maskLeaf->getNodeBoundingBox(); + + // Shrink to the intersection with the dense volume + + localBBox.intersect(mBBox); + + // Early out if there was no intersection + + if (localBBox.empty()) continue; + + // Reset or allocate the target leaf + + if (leaf == NULL) { + leaf = new ResultLeafNodeType(maskLeaf->origin(), mBackground); + } else { + leaf->setOrigin(maskLeaf->origin()); + leaf->fill(mBackground); + leaf->setValuesOff(); + } + + + // Iterate over the intersecting bounding box + // copying active values to the result tree + + const openvdb::math::Coord start = localBBox.getStart(); + const openvdb::math::Coord end = localBBox.getEnd(); + + + openvdb::math::Coord ijk; + + if (mDense.memoryLayout() == openvdb::tools::LayoutZYX + && maskLeaf->isDense()) { + + Index offset; + const DenseValueType* src; + for (ijk[0] = start.x(); ijk[0] < end.x(); ++ijk[0] ) { + for (ijk[1] = start.y(); ijk[1] < end.y(); ++ijk[1] ) { + for (ijk[2] = start.z(), + offset = ResultLeafNodeType::coordToOffset(ijk), + src = &mDense.getValue(ijk); + ijk[2] < end.z(); ++ijk[2], ++offset, ++src) { + + // copy into leaf + leaf->setValueOn(offset, *src); + } + + } + } + + } else { + + Index offset; + for (ijk[0] = start.x(); ijk[0] < end.x(); ++ijk[0] ) { + for (ijk[1] = start.y(); ijk[1] < end.y(); ++ijk[1] ) { + for (ijk[2] = start.z(), + offset = ResultLeafNodeType::coordToOffset(ijk); + ijk[2] < end.z(); ++ijk[2], ++offset) { + + if (maskLeaf->isValueOn(offset)) { + const ResultValueType denseValue = mDense.getValue(ijk); + leaf->setValueOn(offset, denseValue); + } + } + } + } + } + // Only add non-empty leafs (empty is defined as all inactive) + + if (!leaf->isEmpty()) { + mResult->addLeaf(*leaf); + leaf = NULL; + } + } + + // Clean up an unused leaf. + + if (leaf != NULL) delete leaf; + } + + void join(SparseMaskedExtractor& rhs) { + mResult->merge(*rhs.mResult); + } + + +private: + const DenseType& mDense; + const ResultValueType mBackground; + const openvdb::math::CoordBBox& mBBox; + const MaskLeafVec& mLeafVec; + + typename ResultTreeType::Ptr mResult; + +}; // class SparseMaskedExtractor + + +/// @brief a simple utility class used by @c extractSparseTreeWithMask +template +struct ExtractAll +{ + typedef _ResultTreeType ResultTreeType; + typedef typename ResultTreeType::LeafNodeType ResultLeafNodeType; + + template inline void + operator()(const DenseValueType& a, const CoordOrIndex& offset, ResultLeafNodeType* leaf) const + { + leaf->setValueOn(offset, a); + } +}; + + +template +typename DSConverter::Type::Ptr +extractSparseTreeWithMask(const DenseType& dense, + const MaskTreeType& maskProxy, + const typename DenseType::ValueType& background, + bool threaded) +{ + typedef SparseMaskedExtractor LeafExtractor; + typedef typename LeafExtractor::DenseValueType DenseValueType; + typedef typename LeafExtractor::ResultTreeType ResultTreeType; + typedef typename LeafExtractor::MaskLeafVec MaskLeafVec; + typedef typename LeafExtractor::MaskTree MaskTree; + typedef typename LeafExtractor::MaskLeafCIter MaskLeafCIter; + typedef ExtractAll ExtractionRule; + + // Use Mask tree to hold the topology + + MaskTree maskTree(maskProxy, false, TopologyCopy()); + + // Construct an array of pointers to the mask leafs. + + const size_t leafCount = maskTree.leafCount(); + MaskLeafVec leafarray(leafCount); + MaskLeafCIter leafiter = maskTree.cbeginLeaf(); + for (size_t n = 0; n != leafCount; ++n, ++leafiter) { + leafarray[n] = leafiter.getLeaf(); + } + + + // Extract the data that is masked leaf nodes in the mask. + + LeafExtractor leafextractor(dense, background, leafarray); + typename ResultTreeType::Ptr resultTree = leafextractor.extract(threaded); + + + // Extract data that is masked by tiles in the mask. + + + // Loop over the mask tiles, extracting the data into new trees. + // These trees will be leaf-orthogonal to the leafTree (i.e. no leaf + // nodes will overlap). Merge these trees into the result. + + typename MaskTreeType::ValueOnCIter tileIter(maskProxy); + tileIter.setMaxDepth(MaskTreeType::ValueOnCIter::LEAF_DEPTH - 1); + + // Return the leaf tree if the mask had no tiles + + if (!tileIter) return resultTree; + + ExtractionRule allrule; + + // Loop over the tiles in series, but the actual data extraction + // is in parallel. + + CoordBBox bbox; + for ( ; tileIter; ++tileIter) { + + // Find the intersection of the tile with the dense grid. + + tileIter.getBoundingBox(bbox); + bbox.intersect(dense.bbox()); + + if (bbox.empty()) continue; + + SparseExtractor copyData(dense, bbox, allrule, background); + typename ResultTreeType::Ptr fromTileTree = copyData.extract(threaded); + resultTree->merge(*fromTileTree); + } + + return resultTree; +} + + +/// @brief Class that applies a functor to the index space intersection +/// of a prescribed bounding box and the dense grid. +/// NB: This class only supports DenseGrids with ZYX memory layout. +template +class DenseTransformer +{ +public: + + typedef _ValueT ValueT; + typedef Dense DenseT; + typedef openvdb::math::Coord::ValueType IntType; + typedef tbb::blocked_range2d RangeType; + + +private: + + DenseT& mDense; + const OpType& mOp; + openvdb::math::CoordBBox mBBox; + +public: + DenseTransformer(DenseT& dense, + const openvdb::math::CoordBBox& bbox, + const OpType& functor): + mDense(dense), mOp(functor), mBBox(dense.bbox()) + { + // The iteration space is the intersection of the + // input bbox and the index-space covered by the dense grid + mBBox.intersect(bbox); + } + + DenseTransformer(const DenseTransformer& other) : + mDense(other.mDense), mOp(other.mOp), mBBox(other.mBBox) {} + + void apply(bool threaded = true) { + + // Early out if the iteration space is empty + + if (mBBox.empty()) return; + + + const openvdb::math::Coord start = mBBox.getStart(); + const openvdb::math::Coord end = mBBox.getEnd(); + + // The iteration range only the slower two directions. + const RangeType range(start.x(), end.x(), 1, + start.y(), end.y(), 1); + + if (threaded) { + tbb::parallel_for(range, *this); + } else { + (*this)(range); + } + } + + void operator()(const RangeType& range) const { + + // The stride in the z-direction. + // Note: the bbox is [inclusive, inclusive] + + const size_t zlength = size_t(mBBox.max().z() - mBBox.min().z() + 1); + + const IntType imin = range.rows().begin(); + const IntType imax = range.rows().end(); + const IntType jmin = range.cols().begin(); + const IntType jmax = range.cols().end(); + + + openvdb::math::Coord xyz(imin, jmin, mBBox.min().z()); + for (xyz[0] = imin; xyz[0] != imax; ++xyz[0]) { + for (xyz[1] = jmin; xyz[1] != jmax; ++xyz[1]) { + + mOp.transform(mDense, xyz, zlength); + } + } + } +}; // class DenseTransformer + + +/// @brief a wrapper struct used to avoid unnecessary computation of +/// memory access from @c Coord when all offsets are guaranteed to be +/// within the dense grid. +template +struct ContiguousOp +{ + ContiguousOp(const PointWiseOp& op) : mOp(op){} + + typedef Dense DenseT; + inline void transform(DenseT& dense, openvdb::math::Coord& ijk, size_t size) const + { + ValueT* dp = const_cast(&dense.getValue(ijk)); + + for (size_t offset = 0; offset < size; ++offset) { + dp[offset] = mOp(dp[offset]); + } + } + + const PointWiseOp mOp; +}; + + +/// Apply a point-wise functor to the intersection of a dense grid and a given bounding box +template +void +transformDense(Dense& dense, + const openvdb::CoordBBox& bbox, + const PointwiseOpT& functor, bool parallel) +{ + typedef ContiguousOp OpT; + + // Convert the Op so it operates on a contiguous line in memory + + OpT op(functor); + + // Apply to the index space intersection in the dense grid + DenseTransformer transformer(dense, bbox, op); + transformer.apply(parallel); +} + + +template +class SparseToDenseCompositor +{ + +public: + typedef _TreeT TreeT; + typedef typename TreeT::ValueType ValueT; + typedef typename TreeT::LeafNodeType LeafT; + typedef typename TreeT::template ValueConverter::Type MaskTreeT; + typedef typename MaskTreeT::LeafNodeType MaskLeafT; + typedef Dense DenseT; + typedef openvdb::math::Coord::ValueType Index; + typedef tbb::blocked_range3d Range3d; + + SparseToDenseCompositor(DenseT& dense, const TreeT& source, const TreeT& alpha, + const ValueT beta, const ValueT strength) : + mDense(dense), mSource(source), mAlpha(alpha), mBeta(beta), mStrength(strength) + {} + + SparseToDenseCompositor(const SparseToDenseCompositor& other): + mDense(other.mDense), mSource(other.mSource), mAlpha(other.mAlpha), + mBeta(other.mBeta), mStrength(other.mStrength) {} + + + + void sparseComposite(bool threaded) { + + const ValueT beta = mBeta; + const ValueT strenght = mStrength; + + // construct a tree that defines the iteration space + + MaskTreeT maskTree(mSource, false /*background*/, openvdb::TopologyCopy()); + maskTree.topologyUnion(mAlpha); + + // Composite regions that are represented by leafnodes in either mAlpha or mSource + // Parallelize over bool-leafs + + openvdb::tree::LeafManager maskLeafs(maskTree); + maskLeafs.foreach(*this, threaded); + + // Composite regions that are represented by tiles + // Parallelize within each tile. + + typename MaskTreeT::ValueOnCIter citer = maskTree.cbeginValueOn(); + citer.setMaxDepth(MaskTree::ValueOnCIter::LEAF_DEPTH - 1); + + if (!citer) return; + + typename tree::ValueAccessor alphaAccessor(mAlpha); + typename tree::ValueAccessor sourceAccessor(mSource); + + for (; citer; ++citer) { + + const openvdb::math::Coord org = citer.getCoord(); + + // Early out if both alpha and source are zero in this tile. + + const ValueT alphaValue = alphaAccessor.getValue(org); + const ValueT sourceValue = sourceAccessor.getValue(org); + + if (openvdb::math::isZero(alphaValue) && + openvdb::math::isZero(sourceValue) ) continue; + + // Compute overlap of tile with the dense grid + + openvdb::math::CoordBBox localBBox = citer.getBoundingBox(); + localBBox.intersect(mDense.bbox()); + + // Early out if there is no intersection + + if (localBBox.empty()) continue; + + // Composite the tile-uniform values into the dense grid. + compositeFromTile(mDense, localBBox, sourceValue, + alphaValue, beta, strenght, threaded); + } + } + + // Composites leaf values where the alpha values are active. + // Used in sparseComposite + void inline operator()(const MaskLeafT& maskLeaf, size_t /*i*/) const + { + + typedef UniformLeaf ULeaf; + openvdb::math::CoordBBox localBBox = maskLeaf.getNodeBoundingBox(); + localBBox.intersect(mDense.bbox()); + + // Early out for non-overlapping leafs + + if (localBBox.empty()) return; + + const openvdb::math::Coord org = maskLeaf.origin(); + const LeafT* alphaLeaf = mAlpha.probeLeaf(org); + const LeafT* sourceLeaf = mSource.probeLeaf(org); + + if (!sourceLeaf) { + + // Create a source leaf proxy with the correct value + ULeaf uniformSource(mSource.getValue(org)); + + if (!alphaLeaf) { + + // Create an alpha leaf proxy with the correct value + ULeaf uniformAlpha(mAlpha.getValue(org)); + + compositeFromLeaf(mDense, localBBox, uniformSource, uniformAlpha, + mBeta, mStrength); + } else { + + compositeFromLeaf(mDense, localBBox, uniformSource, *alphaLeaf, + mBeta, mStrength); + } + } else { + if (!alphaLeaf) { + + // Create an alpha leaf proxy with the correct value + ULeaf uniformAlpha(mAlpha.getValue(org)); + + compositeFromLeaf(mDense, localBBox, *sourceLeaf, uniformAlpha, + mBeta, mStrength); + } else { + + compositeFromLeaf(mDense, localBBox, *sourceLeaf, *alphaLeaf, + mBeta, mStrength); + } + } + } + // i.e. it assumes that all valueOff Alpha voxels have value 0. + + template + inline static void compositeFromLeaf(DenseT& dense, const openvdb::math::CoordBBox& bbox, + const LeafT1& source, const LeafT2& alpha, + const ValueT beta, const ValueT strength) + { + typedef openvdb::math::Coord::ValueType IntType; + + const ValueT sbeta = strength * beta; + openvdb::math::Coord ijk = bbox.min(); + + + if (alpha.isDense() /*all active values*/) { + + // Optimal path for dense alphaLeaf + const IntType size = bbox.max().z() + 1 - bbox.min().z(); + + for (ijk[0] = bbox.min().x(); ijk[0] < bbox.max().x() + 1; ++ijk[0]) { + for (ijk[1] = bbox.min().y(); ijk[1] < bbox.max().y() + 1; ++ijk[1]) { + + ValueT* d = const_cast(&dense.getValue(ijk)); + const ValueT* a = &alpha.getValue(ijk); + const ValueT* s = &source.getValue(ijk); + + for (IntType idx = 0; idx < size; ++idx) { + d[idx] = CompositeMethod::apply(d[idx], a[idx], s[idx], + strength, beta, sbeta); + } + } + } + } else { + + // AlphaLeaf has non-active cells. + + for (ijk[0] = bbox.min().x(); ijk[0] < bbox.max().x() + 1; ++ijk[0]) { + for (ijk[1] = bbox.min().y(); ijk[1] < bbox.max().y() + 1; ++ijk[1]) { + for (ijk[2] = bbox.min().z(); ijk[2] < bbox.max().z() + 1; ++ijk[2]) { + + if (alpha.isValueOn(ijk)) { + + dense.setValue(ijk, + CompositeMethod::apply(dense.getValue(ijk), + alpha.getValue(ijk), source.getValue(ijk), + strength, beta, sbeta) + ); + } + } + } + } + } + } + + inline static void compositeFromTile(DenseT& dense, openvdb::math::CoordBBox& bbox, + const ValueT& sourceValue, const ValueT& alphaValue, + const ValueT& beta, const ValueT& strength, + bool threaded) + { + + typedef UniformTransformer TileTransformer; + TileTransformer functor(sourceValue, alphaValue, beta, strength); + + // Transform the data inside the bbox according to the TileTranformer. + + transformDense(dense, bbox, functor, threaded); + + } + + + void denseComposite(bool threaded) + { + /// Construct a range that corresponds to the + /// bounding box of the dense volume + const openvdb::math::CoordBBox& bbox = mDense.bbox(); + + Range3d range(bbox.min().x(), bbox.max().x(), LeafT::DIM, + bbox.min().y(), bbox.max().y(), LeafT::DIM, + bbox.min().z(), bbox.max().z(), LeafT::DIM); + + // Iterate over the range, compositing into + // the dense grid using value accessors for + // sparse the grids. + if (threaded) { + tbb::parallel_for(range, *this); + } else { + (*this)(range); + } + + } + + // Composites a dense region using value accessors + // into a dense grid + void inline operator()(const Range3d& range) const + { + // Use value accessors to alpha and source + + typename tree::ValueAccessor alphaAccessor(mAlpha); + typename tree::ValueAccessor sourceAccessor(mSource); + + const ValueT strength = mStrength; + const ValueT beta = mBeta; + const ValueT sbeta = strength * beta; + + // Unpack the range3d item. + const Index imin = range.pages().begin(); + const Index imax = range.pages().end(); + + const Index jmin = range.rows().begin(); + const Index jmax = range.rows().end(); + + const Index kmin = range.cols().begin(); + const Index kmax = range.cols().end(); + + openvdb::Coord ijk; + for (ijk[0] = imin; ijk[0] < imax; ++ijk[0]) { + for (ijk[1] = jmin; ijk[1] < jmax; ++ijk[1]) { + for (ijk[2] = kmin; ijk[2] < kmax; ++ijk[2]) { + const ValueT d_old = mDense.getValue(ijk); + const ValueT& alpha = alphaAccessor.getValue(ijk); + const ValueT& src = sourceAccessor.getValue(ijk); + + mDense.setValue(ijk, CompositeMethod::apply(d_old, alpha, src, + strength, beta, sbeta)); + } + } + } + + } + + +private: + + // Internal class that wraps the templated composite method + // for use when both alpha and source are uniform over + // a prescribed bbox (e.g. a tile). + class UniformTransformer + { + public: + UniformTransformer(const ValueT& source, const ValueT& alpha, const ValueT& _beta, + const ValueT& _strength) : + mSource(source), mAlpha(alpha), mBeta(_beta), + mStrength(_strength), mSBeta(_strength * _beta) + {} + + ValueT operator()(const ValueT& input) const + { + return CompositeMethod::apply(input, mAlpha, mSource, + mStrength, mBeta, mSBeta); + } + + private: + const ValueT mSource; const ValueT mAlpha; const ValueT mBeta; + const ValueT mStrength; const ValueT mSBeta; + }; + + + // Simple Class structure that mimics a leaf + // with uniform values. Holds LeafT::DIM copies + // of a value in an array. + struct Line { ValueT mValues[LeafT::DIM]; }; + class UniformLeaf : private Line + { + public: + typedef typename LeafT::ValueType ValueT; + + typedef Line BaseT; + UniformLeaf(const ValueT& value) : BaseT(init(value)) {} + + static const BaseT init(const ValueT& value) { + BaseT tmp; + for (openvdb::Index i = 0; i < LeafT::DIM; ++i) { + tmp.mValues[i] = value; + } + return tmp; + } + + bool isDense() const { return true; } + bool isValueOn(openvdb::math::Coord&) const { return true; } + + inline const ValueT& getValue(const openvdb::math::Coord& ) const + {return BaseT::mValues[0];} + }; + +private: + DenseT& mDense; + const TreeT& mSource; + const TreeT& mAlpha; + ValueT mBeta; + ValueT mStrength; +}; // class SparseToDenseCompositor + + +namespace ds +{ + //@{ + /// @brief Point wise methods used to apply various compositing operations. + template + struct OpOver + { + static inline ValueT apply(const ValueT u, const ValueT alpha, + const ValueT v, + const ValueT strength, + const ValueT beta, + const ValueT /*sbeta*/) + { return (u + strength * alpha * (beta * v - u)); } + }; + + + template + struct OpAdd + { + static inline ValueT apply(const ValueT u, const ValueT alpha, + const ValueT v, + const ValueT /*strength*/, + const ValueT /*beta*/, + const ValueT sbeta) + { return (u + sbeta * alpha * v); } + }; + + template + struct OpSub + { + static inline ValueT apply(const ValueT u, const ValueT alpha, + const ValueT v, + const ValueT /*strength*/, + const ValueT /*beta*/, + const ValueT sbeta) + { return (u - sbeta * alpha * v); } + }; + + template + struct OpMin + { + static inline ValueT apply(const ValueT u, const ValueT alpha, + const ValueT v, + const ValueT s /*trength*/, + const ValueT beta, + const ValueT /*sbeta*/) + { return ( ( 1 - s * alpha) * u + s * alpha * std::min(u, beta * v) ); } + }; + + + template + struct OpMax + { + static inline ValueT apply(const ValueT u, const ValueT alpha, + const ValueT v, + const ValueT s/*trength*/, + const ValueT beta, + const ValueT /*sbeta*/) + { return ( ( 1 - s * alpha ) * u + s * alpha * std::min(u, beta * v) ); } + }; + + template + struct OpMult + { + static inline ValueT apply(const ValueT u, const ValueT alpha, + const ValueT v, + const ValueT s/*trength*/, + const ValueT /*beta*/, + const ValueT sbeta) + { return ( ( 1 + alpha * (sbeta * v - s)) * u ); } + }; + //@} + + //@{ + /// Translator that converts an enum to compositing functor types + template + struct CompositeFunctorTranslator{}; + + template + struct CompositeFunctorTranslator{ typedef OpOver OpT; }; + + template + struct CompositeFunctorTranslator{ typedef OpAdd OpT; }; + + template + struct CompositeFunctorTranslator{ typedef OpSub OpT; }; + + template + struct CompositeFunctorTranslator{ typedef OpMin OpT; }; + + template + struct CompositeFunctorTranslator{ typedef OpMax OpT; }; + + template + struct CompositeFunctorTranslator{ typedef OpMult OpT; }; + //@} + +} // namespace ds + + +template +void compositeToDense( + Dense& dense, + const TreeT& source, const TreeT& alpha, + const typename TreeT::ValueType beta, + const typename TreeT::ValueType strength, + bool threaded) +{ + typedef typename TreeT::ValueType ValueT; + typedef ds::CompositeFunctorTranslator Translator; + typedef typename Translator::OpT Method; + + if (openvdb::math::isZero(strength)) return; + + SparseToDenseCompositor tool(dense, source, alpha, beta, strength); + + if (openvdb::math::isZero(alpha.background()) && + openvdb::math::isZero(source.background())) + { + // Use the sparsity of (alpha U source) as the iteration space. + tool.sparseComposite(threaded); + } else { + // Use the bounding box of dense as the iteration space. + tool.denseComposite(threaded); + } +} + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif //OPENVDB_TOOLS_DENSESPARSETOOLS_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/Diagnostics.h b/nuparu/include/openvdb/include/openvdb/tools/Diagnostics.h new file mode 100644 index 00000000..68bc4853 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/Diagnostics.h @@ -0,0 +1,1344 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +/// +/// @file Diagnostics.h +/// +/// @author Ken Museth +/// +/// @brief Various diagnostic tools to identify potential issues with +/// for example narrow-band level sets or fog volumes +/// +#ifndef OPENVDB_TOOLS_DIAGNOSTICS_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_DIAGNOSTICS_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +//////////////////////////////////////////////////////////////////////////////// + +/// @brief Perform checks on a grid to see if it is a valid symmetric, +/// narrow-band level set. +/// +/// @param grid Grid to be checked +/// @param number Number of the checks to be performed (see below) +/// @return string with a message indicating the nature of the +/// issue. If no issue is detected the return string is empty. +/// +/// @details @a number refers to the following ordered list of +/// checks - always starting from the top. +/// Fast checks +/// 1: value type is floating point +/// 2: has level set class type +/// 3: has uniform scale +/// 4: background value is positive and n*dx +/// +/// Slower checks +/// 5: no active tiles +/// 6: all the values are finite, i.e not NaN or infinite +/// 7: active values in range between +-background +/// 8: abs of inactive values = background, i.e. assuming a symmetric +/// narrow band! +/// +/// Relatively slow check (however multithreaded) +/// 9: norm gradient is close to one, i.e. satisfied the Eikonal equation. +template +std::string +checkLevelSet(const GridType& grid, size_t number=9); + +//////////////////////////////////////////////////////////////////////////////// + +/// @brief Perform checks on a grid to see if it is a valid fog volume. +/// +/// @param grid Grid to be checked +/// @param number Number of the checks to be performed (see below) +/// @return string with a message indicating the nature of the +/// issue. If no issue is detected the return string is empty. +/// +/// @details @a number refers to the following ordered list of +/// checks - always starting from the top. +/// Fast checks +/// 1: value type is floating point +/// 2: has FOG volume class type +/// 3: background value is zero +/// +/// Slower checks +/// 4: all the values are finite, i.e not NaN or infinite +/// 5: inactive values are zero +/// 6: active values are in the range [0,1] +template +std::string +checkFogVolume(const GridType& grid, size_t number=6); + +//////////////////////////////////////////////////////////////////////////////// + +/// @brief Threaded method to find unique inactive values. +/// +/// @param grid A VDB volume. +/// @param values List of unique inactive values, returned by this method. +/// @param numValues Number of values to look for. +/// @return @c false if the @a grid has more than @a numValues inactive values. +template +bool +uniqueInactiveValues(const GridType& grid, + std::vector& values, size_t numValues); + + +//////////////////////////////////////////////////////////////////////////////// + +/// @brief Checks NaN values +template +struct CheckNan +{ + typedef typename VecTraits::ElementType ElementType; + typedef TreeIterT TileIterT; + typedef typename tree::IterTraits + ::template NodeConverter::Type VoxelIterT; + + /// @brief Default constructor + CheckNan() {} + + /// Return true if the scalar value is NaN + inline bool operator()(const ElementType& v) const { return boost::math::isnan(v); } + + /// @brief This allows for vector values to be checked component-wise + template + inline typename boost::enable_if_c::IsVec, bool>::type + operator()(const T& v) const + { + for (int i=0; i::Size; ++i) if ((*this)(v[i])) return true;//should unroll + return false; + } + + /// @brief Return true if the tile at the iterator location is NaN + bool operator()(const TreeIterT &iter) const { return (*this)(*iter); } + + /// @brief Return true if the voxel at the iterator location is NaN + bool operator()(const VoxelIterT &iter) const { return (*this)(*iter); } + + /// @brief Return a string describing a failed check. + std::string str() const { return "NaN"; } + +};// CheckNan + +//////////////////////////////////////////////////////////////////////////////// + +/// @brief Checks for infinite values, e.g. 1/0 or -1/0 +template +struct CheckInf +{ + typedef typename VecTraits::ElementType ElementType; + typedef TreeIterT TileIterT; + typedef typename tree::IterTraits + ::template NodeConverter::Type VoxelIterT; + + /// @brief Default constructor + CheckInf() {} + + /// Return true if the value is infinite + inline bool operator()(const ElementType& v) const { return boost::math::isinf(v); } + + /// Return true if any of the vector components are infinite. + template inline typename boost::enable_if_c::IsVec, bool>::type + operator()(const T& v) const + { + for (int i=0; i::Size; ++i) if ((*this)(v[i])) return true; + return false; + } + + /// @brief Return true if the tile at the iterator location is infinite + bool operator()(const TreeIterT &iter) const { return (*this)(*iter); } + + /// @brief Return true if the tile at the iterator location is infinite + bool operator()(const VoxelIterT &iter) const { return (*this)(*iter); } + + /// @brief Return a string describing a failed check. + std::string str() const { return "infinite"; } +};// CheckInf + +//////////////////////////////////////////////////////////////////////////////// + +/// @brief Checks for both NaN and inf values, i.e. any value that is not finite. +template +struct CheckFinite +{ + typedef typename VecTraits::ElementType ElementType; + typedef TreeIterT TileIterT; + typedef typename tree::IterTraits + ::template NodeConverter::Type VoxelIterT; + + /// @brief Default constructor + CheckFinite() {} + + /// Return true if the value is NOT finite, i.e. it's NaN or infinite + inline bool operator()(const ElementType& v) const { return !boost::math::isfinite(v); } + + /// Return true if any of the vector components are NaN or infinite. + template + inline typename boost::enable_if_c::IsVec, bool>::type + operator()(const T& v) const { + for (int i=0; i::Size; ++i) if ((*this)(v[i])) return true; + return false; + } + + /// @brief Return true if the tile at the iterator location is NaN or infinite. + bool operator()(const TreeIterT &iter) const { return (*this)(*iter); } + + /// @brief Return true if the tile at the iterator location is NaN or infinite. + bool operator()(const VoxelIterT &iter) const { return (*this)(*iter); } + + /// @brief Return a string describing a failed check. + std::string str() const { return "not finite"; } +};// CheckFinite + +//////////////////////////////////////////////////////////////////////////////// + +/// @brief Check that the magnitude of a value, a, is close to a fixed +/// magnitude, b, given a fixed tolerance c. That is | |a| - |b| | <= c +template +struct CheckMagnitude +{ + typedef typename VecTraits::ElementType ElementType; + typedef TreeIterT TileIterT; + typedef typename tree::IterTraits + ::template NodeConverter::Type VoxelIterT; + + /// @brief Default constructor + CheckMagnitude(const ElementType& a, + const ElementType& t = math::Tolerance::value()) + : absVal(math::Abs(a)), tolVal(math::Abs(t)) + { + } + + /// Return true if the magnitude of the value is not approximately + /// equal to totVal. + inline bool operator()(const ElementType& v) const + { + return math::Abs(math::Abs(v) - absVal) > tolVal; + } + + /// Return true if any of the vector components are infinite. + template inline typename boost::enable_if_c::IsVec, bool>::type + operator()(const T& v) const + { + for (int i=0; i::Size; ++i) if ((*this)(v[i])) return true; + return false; + } + + /// @brief Return true if the tile at the iterator location is infinite + bool operator()(const TreeIterT &iter) const { return (*this)(*iter); } + + /// @brief Return true if the tile at the iterator location is infinite + bool operator()(const VoxelIterT &iter) const { return (*this)(*iter); } + + /// @brief Return a string describing a failed check. + std::string str() const + { + std::ostringstream ss; + ss << "not equal to +/-"< +struct CheckRange +{ + typedef typename VecTraits::ElementType ElementType; + typedef TreeIterT TileIterT; + typedef typename tree::IterTraits + ::template NodeConverter::Type VoxelIterT; + + // @brief Constructor taking a range to be tested against. + CheckRange(const ElementType& _min, const ElementType& _max) : minVal(_min), maxVal(_max) + { + if (minVal > maxVal) { + OPENVDB_THROW(ValueError, "CheckRange: Invalid range (min > max)"); + } + } + + /// Return true if the value is smaller than min or larger than max. + inline bool operator()(const ElementType& v) const + { + return (MinInclusive ? vmaxVal : v>=maxVal); + } + + /// Return true if any of the vector components are out of range. + template + inline typename boost::enable_if_c::IsVec, bool>::type + operator()(const T& v) const { + for (int i=0; i::Size; ++i) if ((*this)(v[i])) return true; + return false; + } + + /// @brief Return true if the voxel at the iterator location is out of range. + bool operator()(const TreeIterT &iter) const { return (*this)(*iter); } + + /// @brief Return true if the tile at the iterator location is out of range. + bool operator()(const VoxelIterT &iter) const { return (*this)(*iter); } + + /// @brief Return a string describing a failed check. + std::string str() const + { + std::ostringstream ss; + ss << "outside the value range " << (MinInclusive ? "[" : "]") + << minVal << "," << maxVal << (MaxInclusive ? "]" : "["); + return ss.str(); + } + + const ElementType minVal, maxVal; +};// CheckRange + +//////////////////////////////////////////////////////////////////////////////// + +/// @brief Checks a value against a minimum +template +struct CheckMin +{ + typedef typename VecTraits::ElementType ElementType; + typedef TreeIterT TileIterT; + typedef typename tree::IterTraits + ::template NodeConverter::Type VoxelIterT; + + // @brief Constructor taking a minimum to be tested against. + CheckMin(const ElementType& _min) : minVal(_min) {} + + /// Return true if the value is smaller than min. + inline bool operator()(const ElementType& v) const { return v + inline typename boost::enable_if_c::IsVec, bool>::type + operator()(const T& v) const { + for (int i=0; i::Size; ++i) if ((*this)(v[i])) return true; + return false; + } + + /// @brief Return true if the voxel at the iterator location is smaller than min. + bool operator()(const TreeIterT &iter) const { return (*this)(*iter); } + + /// @brief Return true if the tile at the iterator location is smaller than min. + bool operator()(const VoxelIterT &iter) const { return (*this)(*iter); } + + /// @brief Return a string describing a failed check. + std::string str() const + { + std::ostringstream ss; + ss << "smaller than "< +struct CheckMax +{ + typedef typename VecTraits::ElementType ElementType; + typedef TreeIterT TileIterT; + typedef typename tree::IterTraits + ::template NodeConverter::Type VoxelIterT; + + /// @brief Constructor taking a maximum to be tested against. + CheckMax(const ElementType& _max) : maxVal(_max) {} + + /// Return true if the value is larger than max. + inline bool operator()(const ElementType& v) const { return v>maxVal; } + + /// Return true if any of the vector components are larger than max. + template + inline typename boost::enable_if_c::IsVec, bool>::type + operator()(const T& v) const { + for (int i=0; i::Size; ++i) if ((*this)(v[i])) return true; + return false; + } + + /// @brief Return true if the tile at the iterator location is larger than max. + bool operator()(const TreeIterT &iter) const { return (*this)(*iter); } + + /// @brief Return true if the voxel at the iterator location is larger than max. + bool operator()(const VoxelIterT &iter) const { return (*this)(*iter); } + + /// @brief Return a string describing a failed check. + std::string str() const + { + std::ostringstream ss; + ss << "larger than "<//math::WENO5_BIAS> +struct CheckNormGrad +{ + typedef typename GridT::ValueType ValueType; + BOOST_STATIC_ASSERT(boost::is_floating_point::value); + typedef TreeIterT TileIterT; + typedef typename tree::IterTraits + ::template NodeConverter::Type VoxelIterT; + typedef typename GridT::ConstAccessor AccT; + + /// @brief Constructor taking a grid and a range to be tested against. + CheckNormGrad(const GridT& grid, const ValueType& _min, const ValueType& _max) + : acc(grid.getConstAccessor()) + , invdx2(ValueType(1.0/math::Pow2(grid.voxelSize()[0]))) + , minVal2(_min*_min) + , maxVal2(_max*_max) + { + if ( !grid.hasUniformVoxels() ) { + OPENVDB_THROW(ValueError, "CheckNormGrad: The transform must have uniform scale"); + } + if (_min > _max) { + OPENVDB_THROW(ValueError, "CheckNormGrad: Invalid range (min > max)"); + } + } + + CheckNormGrad(const CheckNormGrad& other) + : acc(other.acc.tree()) + , invdx2(other.invdx2) + , minVal2(other.minVal2) + , maxVal2(other.maxVal2) + { + } + + /// Return true if the value is smaller than min or larger than max. + inline bool operator()(const ValueType& v) const { return vmaxVal2; } + + /// @brief Return true if zero is outside the range. + /// @note We assume that the norm of the gradient of a tile is always zero. + inline bool operator()(const TreeIterT&) const { return (*this)(ValueType(0)); } + + /// @brief Return true if the norm of the gradient at a voxel + /// location of the iterator is out of range. + inline bool operator()(const VoxelIterT &iter) const + { + const Coord ijk = iter.getCoord(); + return (*this)(invdx2 * math::ISGradientNormSqrd::result(acc, ijk)); + } + + /// @brief Return a string describing a failed check. + std::string str() const + { + std::ostringstream ss; + ss << "outside the range of NormGrad ["< >//math::GradStencil +struct CheckEikonal +{ + typedef typename GridT::ValueType ValueType; + BOOST_STATIC_ASSERT(boost::is_floating_point::value); + typedef TreeIterT TileIterT; + typedef typename tree::IterTraits + ::template NodeConverter::Type VoxelIterT; + + /// @brief Constructor taking a grid and a range to be tested against. + CheckEikonal(const GridT& grid, const ValueType& _min, const ValueType& _max) + : stencil(grid), minVal(_min), maxVal(_max) + { + if ( !grid.hasUniformVoxels() ) { + OPENVDB_THROW(ValueError, "CheckEikonal: The transform must have uniform scale"); + } + if (minVal > maxVal) { + OPENVDB_THROW(ValueError, "CheckEikonal: Invalid range (min > max)"); + } + } + + CheckEikonal(const CheckEikonal& other) + : stencil(other.stencil.grid()), minVal(other.minVal), maxVal(other.maxVal) + { + } + + /// Return true if the value is smaller than min or larger than max. + inline bool operator()(const ValueType& v) const { return vmaxVal; } + + /// @brief Return true if zero is outside the range. + /// @note We assume that the norm of the gradient of a tile is always zero. + inline bool operator()(const TreeIterT&) const { return (*this)(ValueType(0)); } + + /// @brief Return true if the norm of the gradient at a + /// zero-crossing voxel location of the iterator is out of range. + inline bool operator()(const VoxelIterT &iter) const + { + stencil.moveTo(iter); + if (!stencil.zeroCrossing()) return false; + return (*this)(stencil.normSqGrad()); + } + + /// @brief Return a string describing a failed check. + std::string str() const + { + std::ostringstream ss; + ss << "outside the range of NormGrad ["< +struct CheckDivergence +{ + typedef typename GridT::ValueType ValueType; + typedef typename VecTraits::ElementType ElementType; + BOOST_STATIC_ASSERT(boost::is_floating_point::value); + typedef TreeIterT TileIterT; + typedef typename tree::IterTraits + ::template NodeConverter::Type VoxelIterT; + typedef typename GridT::ConstAccessor AccT; + + /// @brief Constructor taking a grid and a range to be tested against. + CheckDivergence(const GridT& grid, + const ValueType& _min, + const ValueType& _max) + : acc(grid.getConstAccessor()) + , invdx(ValueType(1.0/grid.voxelSize()[0])) + , minVal(_min) + , maxVal(_max) + { + if ( !grid.hasUniformVoxels() ) { + OPENVDB_THROW(ValueError, "CheckDivergence: The transform must have uniform scale"); + } + if (minVal > maxVal) { + OPENVDB_THROW(ValueError, "CheckDivergence: Invalid range (min > max)"); + } + } + /// Return true if the value is smaller than min or larger than max. + inline bool operator()(const ElementType& v) const { return vmaxVal; } + + /// @brief Return true if zero is outside the range. + /// @note We assume that the divergence of a tile is always zero. + inline bool operator()(const TreeIterT&) const { return (*this)(ElementType(0)); } + + /// @brief Return true if the divergence at a voxel location of + /// the iterator is out of range. + inline bool operator()(const VoxelIterT &iter) const + { + const Coord ijk = iter.getCoord(); + return (*this)(invdx * math::ISDivergence::result(acc, ijk)); + } + + /// @brief Return a string describing a failed check. + std::string str() const + { + std::ostringstream ss; + ss << "outside the range of divergence ["< +class Diagnose +{ + public: + typedef typename GridT::template ValueConverter::Type MaskType; + + Diagnose(const GridT& grid) : mGrid(&grid), mMask(new MaskType()), mCount(0) + { + mMask->setTransform(grid.transformPtr()->copy()); + } + + template + std::string check(const CheckT& check, + bool updateMask = false, + bool checkVoxels = true, + bool checkTiles = true, + bool checkBackground = true) + { + typename MaskType::TreeType* mask = updateMask ? &(mMask->tree()) : NULL; + CheckValues cc(mask, mGrid, check); + std::ostringstream ss; + if (checkBackground) ss << cc.checkBackground(); + if (checkTiles) ss << cc.checkTiles(); + if (checkVoxels) ss << cc.checkVoxels(); + mCount += cc.mCount; + return ss.str(); + } + + //@{ + /// @brief Return a boolean mask of all the values + /// (i.e. tiles and/or voxels) that have failed one or + /// more checks. + typename MaskType::ConstPtr mask() const { return mMask; } + typename MaskType::Ptr mask() { return mMask; } + //@} + + /// @brief Return the number of values (i.e. background, tiles or + /// voxels) that have failed one or more checks. + Index64 valueCount() const { return mMask->activeVoxelCount(); } + + /// @brief Return total number of failed checks + /// @note If only one check was performed and the mask was updated + /// failureCount equals valueCount. + Index64 failureCount() const { return mCount; } + + /// @brief Return a const reference to the grid + const GridT& grid() const { return *mGrid; } + + /// @brief Clear the mask and error counter + void clear() { mMask = new MaskType(); mCount = 0; } + +private: + // disallow copy construction and copy by assignment! + Diagnose(const Diagnose&);// not implemented + Diagnose& operator=(const Diagnose&);// not implemented + + const GridT* mGrid; + typename MaskType::Ptr mMask; + Index64 mCount; + + /// @brief Private class that performs the multithreaded checks + template + struct CheckValues + { + typedef typename MaskType::TreeType MaskT; + typedef typename GridT::TreeType::LeafNodeType LeafT; + typedef typename tree::LeafManager LeafManagerT; + const bool mOwnsMask; + MaskT* mMask; + const GridT* mGrid; + const CheckT mCheck; + Index64 mCount; + + CheckValues(MaskT* mask, const GridT* grid, const CheckT& check) + : mOwnsMask(false) + , mMask(mask) + , mGrid(grid) + , mCheck(check) + , mCount(0) + { + } + CheckValues(CheckValues& other, tbb::split) + : mOwnsMask(true) + , mMask(other.mMask ? new MaskT() : NULL) + , mGrid(other.mGrid) + , mCheck(other.mCheck) + , mCount(0) + { + } + ~CheckValues() { if (mOwnsMask) delete mMask; } + + std::string checkBackground() + { + std::ostringstream ss; + if (mCheck(mGrid->background())) { + ++mCount; + ss << "Background is " + mCheck.str() << std::endl; + } + return ss.str(); + } + + std::string checkTiles() + { + std::ostringstream ss; + const Index64 n = mCount; + typename CheckT::TileIterT i(mGrid->tree()); + for (i.setMaxDepth(GridT::TreeType::RootNodeType::LEVEL - 1); i; ++i) { + if (mCheck(i)) { + ++mCount; + if (mMask) mMask->fill(i.getBoundingBox(), true, true); + } + } + if (const Index64 m = mCount - n) { + ss << m << " tile" << (m==1 ? " is " : "s are ") + mCheck.str() << std::endl; + } + return ss.str(); + } + + std::string checkVoxels() + { + std::ostringstream ss; + LeafManagerT leafs(mGrid->tree()); + const Index64 n = mCount; + tbb::parallel_reduce(leafs.leafRange(), *this); + if (const Index64 m = mCount - n) { + ss << m << " voxel" << (m==1 ? " is " : "s are ") + mCheck.str() << std::endl; + } + return ss.str(); + } + + void operator()(const typename LeafManagerT::LeafRange& r) + { + typedef typename CheckT::VoxelIterT VoxelIterT; + if (mMask) { + for (typename LeafManagerT::LeafRange::Iterator i=r.begin(); i; ++i) { + typename MaskT::LeafNodeType* maskLeaf = NULL; + for (VoxelIterT j = tree::IterTraits::begin(*i); j; ++j) { + if (mCheck(j)) { + ++mCount; + if (maskLeaf == NULL) maskLeaf = mMask->touchLeaf(j.getCoord()); + maskLeaf->setValueOn(j.pos(), true); + } + } + } + } else { + for (typename LeafManagerT::LeafRange::Iterator i=r.begin(); i; ++i) { + for (VoxelIterT j = tree::IterTraits::begin(*i); j; ++j) { + if (mCheck(j)) ++mCount; + } + } + } + } + void join(const CheckValues& other) + { + if (mMask) mMask->merge(*(other.mMask), openvdb::MERGE_ACTIVE_STATES_AND_NODES); + mCount += other.mCount; + } + };//End of private class CheckValues + +};// End of public class Diagnose + + +//////////////////////////////////////////////////////////////////////////////// + +/// @brief Class that performs various types of checks on narrow-band level sets. +/// +/// @note The most common usage is to simply call CheckLevelSet::check() +template +class CheckLevelSet +{ +public: + typedef typename GridType::ValueType ValueType; + typedef typename GridType::template ValueConverter::Type MaskType; + + CheckLevelSet(const GridType& grid) : mDiagnose(grid) {} + + //@{ + /// @brief Return a boolean mask of all the values + /// (i.e. tiles and/or voxels) that have failed one or + /// more checks. + typename MaskType::ConstPtr mask() const { return mDiagnose.mask(); } + typename MaskType::Ptr mask() { return mDiagnose.mask(); } + //@} + + /// @brief Return the number of values (i.e. background, tiles or + /// voxels) that have failed one or more checks. + Index64 valueCount() const { return mDiagnose.valueCount(); } + + /// @brief Return total number of failed checks + /// @note If only one check was performed and the mask was updated + /// failureCount equals valueCount. + Index64 failureCount() const { return mDiagnose.failureCount(); } + + /// @brief Return a const reference to the grid + const GridType& grid() const { return mDiagnose.grid(); } + + /// @brief Clear the mask and error counter + void clear() { mDiagnose.clear(); } + + /// @brief Return a nonempty message if the grid's value type is a floating point. + /// + /// @note No run-time overhead + static std::string checkValueType() + { + static const bool test = boost::is_floating_point::value; + return test ? "" : "Value type is not floating point\n"; + } + + /// @brief Return message if the grid's class is a level set. + /// + /// @note Small run-time overhead + std::string checkClassType() const + { + const bool test = mDiagnose.grid().getGridClass() == GRID_LEVEL_SET; + return test ? "" : "Class type is not \"GRID_LEVEL_SET\"\n"; + } + + /// @brief Return a nonempty message if the grid's transform does not have uniform scaling. + /// + /// @note Small run-time overhead + std::string checkTransform() const + { + return mDiagnose.grid().hasUniformVoxels() ? "" : "Does not have uniform voxels\n"; + } + + /// @brief Return a nonempty message if the background value is larger than or + /// equal to the halfWidth*voxelSize. + /// + /// @note Small run-time overhead + std::string checkBackground(Real halfWidth = LEVEL_SET_HALF_WIDTH) const + { + const Real w = mDiagnose.grid().background() / mDiagnose.grid().voxelSize()[0]; + if (w < halfWidth) { + std::ostringstream ss; + ss << "The background value ("<< mDiagnose.grid().background()<<") is less than " + << halfWidth << " voxel units\n"; + return ss.str(); + } + return ""; + } + + /// @brief Return a nonempty message if the grid has no active tile values. + /// + /// @note Medium run-time overhead + std::string checkTiles() const + { + const bool test = mDiagnose.grid().tree().hasActiveTiles(); + return test ? "Has active tile values\n" : ""; + } + + /// @brief Return a nonempty message if any of the values are not finite. i.e. NaN or inf. + /// + /// @note Medium run-time overhead + std::string checkFinite(bool updateMask = false) + { + CheckFinite c; + return mDiagnose.check(c, updateMask, /*voxel*/true, /*tiles*/true, /*background*/true); + } + + /// @brief Return a nonempty message if the active voxel values are out-of-range. + /// + /// @note Medium run-time overhead + std::string checkRange(bool updateMask = false) + { + const ValueType& background = mDiagnose.grid().background(); + CheckRange c(-background, background); + return mDiagnose.check(c, updateMask, /*voxel*/true, /*tiles*/false, /*background*/false); + } + + /// @brief Return a nonempty message if the the inactive values do not have a + /// magnitude equal to the background value. + /// + /// @note Medium run-time overhead + std::string checkInactiveValues(bool updateMask = false) + { + const ValueType& background = mDiagnose.grid().background(); + CheckMagnitude c(background); + return mDiagnose.check(c, updateMask, /*voxel*/true, /*tiles*/true, /*background*/false); + } + + /// @brief Return a nonempty message if the norm of the gradient of the + /// active voxels is out of the range minV to maxV. + /// + /// @note Significant run-time overhead + std::string checkEikonal(bool updateMask = false, ValueType minV = 0.5, ValueType maxV = 1.5) + { + CheckEikonal c(mDiagnose.grid(), minV, maxV); + return mDiagnose.check(c, updateMask, /*voxel*/true, /*tiles*/false, /*background*/false); + } + + /// @brief Return a nonempty message if an error or issue is detected. Only + /// runs tests with a number lower than or equal to n, where: + /// + /// Fast checks + /// 1: value type is floating point + /// 2: has level set class type + /// 3: has uniform scale + /// 4: background value is positive and n*dx + /// + /// Slower checks + /// 5: no active tiles + /// 6: all the values are finite, i.e not NaN or infinite + /// 7: active values in range between +-background + /// 8: abs of inactive values = background, i.e. assuming a symmetric narrow band! + /// + /// Relatively slow check (however multi-threaded) + /// 9: norm of gradient at zero-crossings is one, i.e. satisfied the Eikonal equation. + std::string check(size_t n=9, bool updateMask = false) + { + std::string str = this->checkValueType(); + if (str.empty() && n>1) str = this->checkClassType(); + if (str.empty() && n>2) str = this->checkTransform(); + if (str.empty() && n>3) str = this->checkBackground(); + if (str.empty() && n>4) str = this->checkTiles(); + if (str.empty() && n>5) str = this->checkFinite(updateMask); + if (str.empty() && n>6) str = this->checkRange(updateMask); + if (str.empty() && n>7) str = this->checkInactiveValues(updateMask); + if (str.empty() && n>8) str = this->checkEikonal(updateMask); + return str; + } + +private: + // disallow copy construction and copy by assignment! + CheckLevelSet(const CheckLevelSet&);// not implemented + CheckLevelSet& operator=(const CheckLevelSet&);// not implemented + + // Member data + Diagnose mDiagnose; +};// CheckLevelSet + +template +std::string +checkLevelSet(const GridType& grid, size_t n) +{ + CheckLevelSet c(grid); + return c.check(n, false); +} + +//////////////////////////////////////////////////////////////////////////////// + +/// @brief Class that performs various types of checks on fog volumes. +/// +/// @note The most common usage is to simply call CheckFogVolume::check() +template +class CheckFogVolume +{ +public: + typedef typename GridType::ValueType ValueType; + typedef typename GridType::template ValueConverter::Type MaskType; + + CheckFogVolume(const GridType& grid) : mDiagnose(grid) {} + + //@{ + /// @brief Return a boolean mask of all the values + /// (i.e. tiles and/or voxels) that have failed one or + /// more checks. + typename MaskType::ConstPtr mask() const { return mDiagnose.mask(); } + typename MaskType::Ptr mask() { return mDiagnose.mask(); } + //@} + + /// @brief Return the number of values (i.e. background, tiles or + /// voxels) that have failed one or more checks. + Index64 valueCount() const { return mDiagnose.valueCount(); } + + /// @brief Return total number of failed checks + /// @note If only one check was performed and the mask was updated + /// failureCount equals valueCount. + Index64 failureCount() const { return mDiagnose.failureCount(); } + + /// @brief Return a const reference to the grid + const GridType& grid() const { return mDiagnose.grid(); } + + /// @brief Clear the mask and error counter + void clear() { mDiagnose.clear(); } + + /// @brief Return a nonempty message if the grid's value type is a floating point. + /// + /// @note No run-time overhead + static std::string checkValueType() + { + static const bool test = boost::is_floating_point::value; + return test ? "" : "Value type is not floating point"; + } + + /// @brief Return a nonempty message if the grid's class is a level set. + /// + /// @note Small run-time overhead + std::string checkClassType() const + { + const bool test = mDiagnose.grid().getGridClass() == GRID_FOG_VOLUME; + return test ? "" : "Class type is not \"GRID_LEVEL_SET\""; + } + + /// @brief Return a nonempty message if the background value is not zero. + /// + /// @note Small run-time overhead + std::string checkBackground() const + { + if (!math::isApproxZero(mDiagnose.grid().background())) { + std::ostringstream ss; + ss << "The background value ("<< mDiagnose.grid().background()<<") is not zero"; + return ss.str(); + } + return ""; + } + + /// @brief Return a nonempty message if any of the values are not finite. i.e. NaN or inf. + /// + /// @note Medium run-time overhead + std::string checkFinite(bool updateMask = false) + { + CheckFinite c; + return mDiagnose.check(c, updateMask, /*voxel*/true, /*tiles*/true, /*background*/true); + } + + /// @brief Return a nonempty message if any of the inactive values are not zero. + /// + /// @note Medium run-time overhead + std::string checkInactiveValues(bool updateMask = false) + { + CheckMagnitude c(0); + return mDiagnose.check(c, updateMask, /*voxel*/true, /*tiles*/true, /*background*/true); + } + + /// @brief Return a nonempty message if the active voxel values + /// are out-of-range, i.e. not in the range [0,1]. + /// + /// @note Medium run-time overhead + std::string checkRange(bool updateMask = false) + { + CheckRange c(0, 1); + return mDiagnose.check(c, updateMask, /*voxel*/true, /*tiles*/true, /*background*/false); + } + + /// @brief Return a nonempty message if an error or issue is detected. Only + /// runs tests with a number lower than or equal to n, where: + /// + /// Fast checks + /// 1: value type is floating point + /// 2: has FOG volume class type + /// 3: background value is zero + /// + /// Slower checks + /// 4: all the values are finite, i.e not NaN or infinite + /// 5: inactive values are zero + /// 6: active values are in the range [0,1] + std::string check(size_t n=6, bool updateMask = false) + { + std::string str = this->checkValueType(); + if (str.empty() && n>1) str = this->checkClassType(); + if (str.empty() && n>2) str = this->checkBackground(); + if (str.empty() && n>3) str = this->checkFinite(updateMask); + if (str.empty() && n>4) str = this->checkInactiveValues(updateMask); + if (str.empty() && n>5) str = this->checkRange(updateMask); + return str; + } + +private: + // disallow copy construction and copy by assignment! + CheckFogVolume(const CheckFogVolume&);// not implemented + CheckFogVolume& operator=(const CheckFogVolume&);// not implemented + + // Member data + Diagnose mDiagnose; +};// CheckFogVolume + +template +std::string +checkFogVolume(const GridType& grid, size_t n) +{ + CheckFogVolume c(grid); + return c.check(n, false); +} + + +//////////////////////////////////////////////////////////////////////////////// + +// Internal utility objects and implementation details + + +namespace diagnostics_internal { + + +template +class InactiveVoxelValues +{ +public: + typedef tree::LeafManager LeafArray; + typedef typename TreeType::ValueType ValueType; + typedef std::set SetType; + + InactiveVoxelValues(LeafArray&, size_t numValues); + + void runParallel(); + void runSerial(); + + void getInactiveValues(SetType&) const; + + inline InactiveVoxelValues(const InactiveVoxelValues&, tbb::split); + inline void operator()(const tbb::blocked_range&); + inline void join(const InactiveVoxelValues&); + +private: + LeafArray& mLeafArray; + SetType mInactiveValues; + size_t mNumValues; +};// InactiveVoxelValues + +template +InactiveVoxelValues::InactiveVoxelValues(LeafArray& leafs, size_t numValues) + : mLeafArray(leafs) + , mInactiveValues() + , mNumValues(numValues) +{ +} + +template +inline +InactiveVoxelValues::InactiveVoxelValues( + const InactiveVoxelValues& rhs, tbb::split) + : mLeafArray(rhs.mLeafArray) + , mInactiveValues() + , mNumValues(rhs.mNumValues) +{ +} + +template +void +InactiveVoxelValues::runParallel() +{ + tbb::parallel_reduce(mLeafArray.getRange(), *this); +} + + +template +void +InactiveVoxelValues::runSerial() +{ + (*this)(mLeafArray.getRange()); +} + + +template +inline void +InactiveVoxelValues::operator()(const tbb::blocked_range& range) +{ + typename TreeType::LeafNodeType::ValueOffCIter iter; + + for (size_t n = range.begin(); n < range.end() && !tbb::task::self().is_cancelled(); ++n) { + for (iter = mLeafArray.leaf(n).cbeginValueOff(); iter; ++iter) { + mInactiveValues.insert(iter.getValue()); + } + + if (mInactiveValues.size() > mNumValues) { + tbb::task::self().cancel_group_execution(); + } + } +} + +template +inline void +InactiveVoxelValues::join(const InactiveVoxelValues& rhs) +{ + mInactiveValues.insert(rhs.mInactiveValues.begin(), rhs.mInactiveValues.end()); +} + +template +inline void +InactiveVoxelValues::getInactiveValues(SetType& values) const +{ + values.insert(mInactiveValues.begin(), mInactiveValues.end()); +} + + +//////////////////////////////////////// + + +template +class InactiveTileValues +{ +public: + typedef tree::IteratorRange IterRange; + typedef typename TreeType::ValueType ValueType; + typedef std::set SetType; + + InactiveTileValues(size_t numValues); + + void runParallel(IterRange&); + void runSerial(IterRange&); + + void getInactiveValues(SetType&) const; + + inline InactiveTileValues(const InactiveTileValues&, tbb::split); + inline void operator()(IterRange&); + inline void join(const InactiveTileValues&); + +private: + SetType mInactiveValues; + size_t mNumValues; +}; + + +template +InactiveTileValues::InactiveTileValues(size_t numValues) + : mInactiveValues() + , mNumValues(numValues) +{ +} + +template +inline +InactiveTileValues::InactiveTileValues( + const InactiveTileValues& rhs, tbb::split) + : mInactiveValues() + , mNumValues(rhs.mNumValues) +{ +} + +template +void +InactiveTileValues::runParallel(IterRange& range) +{ + tbb::parallel_reduce(range, *this); +} + + +template +void +InactiveTileValues::runSerial(IterRange& range) +{ + (*this)(range); +} + + +template +inline void +InactiveTileValues::operator()(IterRange& range) +{ + for (; range && !tbb::task::self().is_cancelled(); ++range) { + typename TreeType::ValueOffCIter iter = range.iterator(); + for (; iter; ++iter) { + mInactiveValues.insert(iter.getValue()); + } + + if (mInactiveValues.size() > mNumValues) { + tbb::task::self().cancel_group_execution(); + } + } +} + +template +inline void +InactiveTileValues::join(const InactiveTileValues& rhs) +{ + mInactiveValues.insert(rhs.mInactiveValues.begin(), rhs.mInactiveValues.end()); +} + +template +inline void +InactiveTileValues::getInactiveValues(SetType& values) const +{ + values.insert(mInactiveValues.begin(), mInactiveValues.end()); +} + +} // namespace diagnostics_internal + + +//////////////////////////////////////// + + +template +bool +uniqueInactiveValues(const GridType& grid, + std::vector& values, size_t numValues) +{ + + typedef typename GridType::TreeType TreeType; + typedef typename GridType::ValueType ValueType; + typedef std::set SetType; + + SetType uniqueValues; + + { // Check inactive voxels + TreeType& tree = const_cast(grid.tree()); + tree::LeafManager leafs(tree); + diagnostics_internal::InactiveVoxelValues voxelOp(leafs, numValues); + voxelOp.runParallel(); + voxelOp.getInactiveValues(uniqueValues); + } + + // Check inactive tiles + if (uniqueValues.size() <= numValues) { + typename TreeType::ValueOffCIter iter(grid.tree()); + iter.setMaxDepth(TreeType::ValueAllIter::LEAF_DEPTH - 1); + diagnostics_internal::InactiveTileValues tileOp(numValues); + + tree::IteratorRange range(iter); + tileOp.runParallel(range); + + tileOp.getInactiveValues(uniqueValues); + } + + values.clear(); + values.reserve(uniqueValues.size()); + + typename SetType::iterator it = uniqueValues.begin(); + for ( ; it != uniqueValues.end(); ++it) { + values.push_back(*it); + } + + return values.size() <= numValues; +} + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_DIAGNOSTICS_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/Filter.h b/nuparu/include/openvdb/include/openvdb/tools/Filter.h new file mode 100644 index 00000000..9bc124b8 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/Filter.h @@ -0,0 +1,459 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @author Ken Museth +/// +/// @file Filter.h +/// +/// @brief Filtering of VDB volumes. Note that only the values in the +/// grid are changed, not its topology! All operations can optionally +/// be masked with another grid that acts as an alpha-mask. + +#ifndef OPENVDB_TOOLS_FILTER_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_FILTER_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Interpolation.h" + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief Volume filtering (e.g., diffusion) with optional alpha masking +/// +/// @note Only the values in the grid are changed, not its topology! +template::Type, + typename InterruptT = util::NullInterrupter> +class Filter +{ +public: + typedef GridT GridType; + typedef MaskT MaskType; + typedef typename GridType::TreeType TreeType; + typedef typename TreeType::LeafNodeType LeafType; + typedef typename GridType::ValueType ValueType; + typedef typename MaskType::ValueType AlphaType; + typedef typename tree::LeafManager LeafManagerType; + typedef typename LeafManagerType::LeafRange RangeType; + typedef typename LeafManagerType::BufferType BufferType; + BOOST_STATIC_ASSERT(boost::is_floating_point::value); + + /// Constructor + /// @param grid Grid to be filtered. + /// @param interrupt Optional interrupter. + Filter(GridT& grid, InterruptT* interrupt = NULL) + : mGrid(&grid) + , mTask(0) + , mInterrupter(interrupt) + , mMask(NULL) + , mGrainSize(1) + , mMinMask(0) + , mMaxMask(1) + , mInvertMask(false) + { + } + + /// @brief Shallow copy constructor called by tbb::parallel_for() + /// threads during filtering. + /// @param other The other Filter from which to copy. + Filter(const Filter& other) + : mGrid(other.mGrid) + , mTask(other.mTask) + , mInterrupter(other.mInterrupter) + , mMask(other.mMask) + , mGrainSize(other.mGrainSize) + , mMinMask(other.mMinMask) + , mMaxMask(other.mMaxMask) + , mInvertMask(other.mInvertMask) + { + } + + /// @return the grain-size used for multi-threading + int getGrainSize() const { return mGrainSize; } + /// @brief Set the grain-size used for multi-threading. + /// @note A grain size of 0 or less disables multi-threading! + void setGrainSize(int grainsize) { mGrainSize = grainsize; } + + /// @brief Return the minimum value of the mask to be used for the + /// derivation of a smooth alpha value. + AlphaType minMask() const { return mMinMask; } + /// @brief Return the maximum value of the mask to be used for the + /// derivation of a smooth alpha value. + AlphaType maxMask() const { return mMaxMask; } + /// @brief Define the range for the (optional) scalar mask. + /// @param min Minimum value of the range. + /// @param max Maximum value of the range. + /// @details Mask values outside the range are clamped to zero or one, and + /// values inside the range map smoothly to 0->1 (unless the mask is inverted). + /// @throw ValueError if @a min is not smaller than @a max. + void setMaskRange(AlphaType min, AlphaType max) + { + if (!(min < max)) OPENVDB_THROW(ValueError, "Invalid mask range (expects min < max)"); + mMinMask = min; + mMaxMask = max; + } + + /// @brief Return true if the mask is inverted, i.e. min->max in the + /// original mask maps to 1->0 in the inverted alpha mask. + bool isMaskInverted() const { return mInvertMask; } + /// @brief Invert the optional mask, i.e. min->max in the original + /// mask maps to 1->0 in the inverted alpha mask. + void invertMask(bool invert=true) { mInvertMask = invert; } + + /// @brief One iteration of a fast separable mean-value (i.e. box) filter. + /// @param width The width of the mean-value filter is 2*width+1 voxels. + /// @param iterations Number of times the mean-value filter is applied. + /// @param mask Optional alpha mask. + void mean(int width = 1, int iterations = 1, const MaskType* mask = NULL); + + /// @brief One iteration of a fast separable Gaussian filter. + /// + /// @note This is approximated as 4 iterations of a separable mean filter + /// which typically leads an approximation that's better than 95%! + /// @param width The width of the mean-value filter is 2*width+1 voxels. + /// @param iterations Number of times the mean-value filter is applied. + /// @param mask Optional alpha mask. + void gaussian(int width = 1, int iterations = 1, const MaskType* mask = NULL); + + /// @brief One iteration of a median-value filter + /// + /// @note This filter is not separable and is hence relatively slow! + /// @param width The width of the mean-value filter is 2*width+1 voxels. + /// @param iterations Number of times the mean-value filter is applied. + /// @param mask Optional alpha mask. + void median(int width = 1, int iterations = 1, const MaskType* mask = NULL); + + /// Offsets (i.e. adds) a constant value to all active voxels. + /// @param offset Offset in the same units as the grid. + /// @param mask Optional alpha mask. + void offset(ValueType offset, const MaskType* mask = NULL); + + /// @brief Used internally by tbb::parallel_for() + /// @param range Range of LeafNodes over which to multi-thread. + /// + /// @warning Never call this method directly! + void operator()(const RangeType& range) const + { + if (mTask) mTask(const_cast(this), range); + else OPENVDB_THROW(ValueError, "task is undefined - call median(), mean(), etc."); + } + +private: + typedef typename TreeType::LeafNodeType LeafT; + typedef typename LeafT::ValueOnIter VoxelIterT; + typedef typename LeafT::ValueOnCIter VoxelCIterT; + typedef typename tree::LeafManager::BufferType BufferT; + typedef typename RangeType::Iterator LeafIterT; + typedef tools::AlphaMask AlphaMaskT; + + void cook(LeafManagerType& leafs); + + template + struct Avg { + Avg(const GridT* grid, Int32 w): acc(grid->tree()), width(w), frac(1.f/float(2*w+1)) {} + inline ValueType operator()(Coord xyz); + typename GridT::ConstAccessor acc; + const Int32 width; + const float frac; + }; + + // Private filter methods called by tbb::parallel_for threads + template + void doBox( const RangeType& r, Int32 w); + void doBoxX(const RangeType& r, Int32 w) { this->doBox >(r,w); } + void doBoxZ(const RangeType& r, Int32 w) { this->doBox >(r,w); } + void doBoxY(const RangeType& r, Int32 w) { this->doBox >(r,w); } + void doMedian(const RangeType&, int); + void doOffset(const RangeType&, ValueType); + /// @return true if the process was interrupted + bool wasInterrupted(); + + GridType* mGrid; + typename boost::function mTask; + InterruptT* mInterrupter; + const MaskType* mMask; + int mGrainSize; + AlphaType mMinMask, mMaxMask; + bool mInvertMask; +}; // end of Filter class + + +//////////////////////////////////////// + + +namespace filter_internal { +// Helper function for Filter::Avg::operator() +template static inline void accum(T& sum, T addend) { sum += addend; } +// Overload for bool ValueType +inline void accum(bool& sum, bool addend) { sum = sum || addend; } +} + + +template +template +inline typename GridT::ValueType +Filter::Avg::operator()(Coord xyz) +{ + ValueType sum = zeroVal(); + Int32 &i = xyz[Axis], j = i + width; + for (i -= width; i <= j; ++i) filter_internal::accum(sum, acc.getValue(xyz)); + return static_cast(sum * frac); +} + + +//////////////////////////////////////// + + +template +inline void +Filter::mean(int width, int iterations, const MaskType* mask) +{ + mMask = mask; + + if (mInterrupter) mInterrupter->start("Applying mean filter"); + + const int w = std::max(1, width); + + LeafManagerType leafs(mGrid->tree(), 1, mGrainSize==0); + + for (int i=0; iwasInterrupted(); ++i) { + mTask = boost::bind(&Filter::doBoxX, _1, _2, w); + this->cook(leafs); + + mTask = boost::bind(&Filter::doBoxY, _1, _2, w); + this->cook(leafs); + + mTask = boost::bind(&Filter::doBoxZ, _1, _2, w); + this->cook(leafs); + } + + if (mInterrupter) mInterrupter->end(); +} + + +template +inline void +Filter::gaussian(int width, int iterations, const MaskType* mask) +{ + mMask = mask; + + if (mInterrupter) mInterrupter->start("Applying Gaussian filter"); + + const int w = std::max(1, width); + + LeafManagerType leafs(mGrid->tree(), 1, mGrainSize==0); + + for (int i=0; iwasInterrupted(); ++n) { + mTask = boost::bind(&Filter::doBoxX, _1, _2, w); + this->cook(leafs); + + mTask = boost::bind(&Filter::doBoxY, _1, _2, w); + this->cook(leafs); + + mTask = boost::bind(&Filter::doBoxZ, _1, _2, w); + this->cook(leafs); + } + } + + if (mInterrupter) mInterrupter->end(); +} + + +template +inline void +Filter::median(int width, int iterations, const MaskType* mask) +{ + mMask = mask; + + if (mInterrupter) mInterrupter->start("Applying median filter"); + + LeafManagerType leafs(mGrid->tree(), 1, mGrainSize==0); + + mTask = boost::bind(&Filter::doMedian, _1, _2, std::max(1, width)); + for (int i=0; iwasInterrupted(); ++i) this->cook(leafs); + + if (mInterrupter) mInterrupter->end(); +} + + +template +inline void +Filter::offset(ValueType value, const MaskType* mask) +{ + mMask = mask; + + if (mInterrupter) mInterrupter->start("Applying offset"); + + LeafManagerType leafs(mGrid->tree(), 0, mGrainSize==0); + + mTask = boost::bind(&Filter::doOffset, _1, _2, value); + this->cook(leafs); + + if (mInterrupter) mInterrupter->end(); +} + + +//////////////////////////////////////// + + +/// Private method to perform the task (serial or threaded) and +/// subsequently swap the leaf buffers. +template +inline void +Filter::cook(LeafManagerType& leafs) +{ + if (mGrainSize>0) { + tbb::parallel_for(leafs.leafRange(mGrainSize), *this); + } else { + (*this)(leafs.leafRange()); + } + leafs.swapLeafBuffer(1, mGrainSize==0); +} + + +/// One dimensional convolution of a separable box filter +template +template +inline void +Filter::doBox(const RangeType& range, Int32 w) +{ + this->wasInterrupted(); + AvgT avg(mGrid, w); + if (mMask) { + typename AlphaMaskT::FloatType a, b; + AlphaMaskT alpha(*mGrid, *mMask, mMinMask, mMaxMask, mInvertMask); + for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) { + BufferT& buffer = leafIter.buffer(1); + for (VoxelCIterT iter = leafIter->cbeginValueOn(); iter; ++iter) { + const Coord xyz = iter.getCoord(); + if (alpha(xyz, a, b)) { + buffer.setValue(iter.pos(), ValueType(b*(*iter) + a*avg(xyz))); + } + } + } + } else { + for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) { + BufferT& buffer = leafIter.buffer(1); + for (VoxelCIterT iter = leafIter->cbeginValueOn(); iter; ++iter) { + buffer.setValue(iter.pos(), avg(iter.getCoord())); + } + } + } +} + + +/// Performs simple but slow median-value diffusion +template +inline void +Filter::doMedian(const RangeType& range, int width) +{ + this->wasInterrupted(); + typename math::DenseStencil stencil(*mGrid, width);//creates local cache! + if (mMask) { + typename AlphaMaskT::FloatType a, b; + AlphaMaskT alpha(*mGrid, *mMask, mMinMask, mMaxMask, mInvertMask); + for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) { + BufferT& buffer = leafIter.buffer(1); + for (VoxelCIterT iter = leafIter->cbeginValueOn(); iter; ++iter) { + if (alpha(iter.getCoord(), a, b)) { + stencil.moveTo(iter); + buffer.setValue(iter.pos(), ValueType(b*(*iter) + a*stencil.median())); + } + } + } + } else { + for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) { + BufferT& buffer = leafIter.buffer(1); + for (VoxelCIterT iter = leafIter->cbeginValueOn(); iter; ++iter) { + stencil.moveTo(iter); + buffer.setValue(iter.pos(), stencil.median()); + } + } + } +} + + +/// Offsets the values by a constant +template +inline void +Filter::doOffset(const RangeType& range, ValueType offset) +{ + this->wasInterrupted(); + if (mMask) { + typename AlphaMaskT::FloatType a, b; + AlphaMaskT alpha(*mGrid, *mMask, mMinMask, mMaxMask, mInvertMask); + for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) { + for (VoxelIterT iter = leafIter->beginValueOn(); iter; ++iter) { + if (alpha(iter.getCoord(), a, b)) iter.setValue(ValueType(*iter + a*offset)); + } + } + } else { + for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) { + for (VoxelIterT iter = leafIter->beginValueOn(); iter; ++iter) { + iter.setValue(*iter + offset); + } + } + } +} + + +template +inline bool +Filter::wasInterrupted() +{ + if (util::wasInterrupted(mInterrupter)) { + tbb::task::self().cancel_group_execution(); + return true; + } + return false; +} + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_FILTER_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/GridOperators.h b/nuparu/include/openvdb/include/openvdb/tools/GridOperators.h new file mode 100644 index 00000000..a5b94a7d --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/GridOperators.h @@ -0,0 +1,1090 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file GridOperators.h +/// +/// @brief Applies an operator on an input grid to produce an output +/// grid with the same topology but potentially different value type. + +#ifndef OPENVDB_TOOLS_GRID_OPERATORS_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_GRID_OPERATORS_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief VectorToScalarConverter::Type is the type of a grid +/// having the same tree configuration as VectorGridType but a scalar value type, T, +/// where T is the type of the original vector components. +/// @details For example, VectorToScalarConverter::Type is equivalent to DoubleGrid. +template struct VectorToScalarConverter { + typedef typename VectorGridType::ValueType::value_type VecComponentValueT; + typedef typename VectorGridType::template ValueConverter::Type Type; +}; + +/// @brief ScalarToVectorConverter::Type is the type of a grid +/// having the same tree configuration as ScalarGridType but value type Vec3 +/// where T is ScalarGridType::ValueType. +/// @details For example, ScalarToVectorConverter::Type is equivalent to Vec3DGrid. +template struct ScalarToVectorConverter { + typedef math::Vec3 VectorValueT; + typedef typename ScalarGridType::template ValueConverter::Type Type; +}; + + +/// @brief Compute the Closest-Point Transform (CPT) from a distance field. +/// @return a new vector-valued grid with the same numerical precision as the input grid +/// (for example, if the input grid is a DoubleGrid, the output grid will be a Vec3DGrid) +/// @details When a mask grid is specified, the solution is calculated only in +/// the intersection of the mask active topology and the input active topology +/// independent of the transforms associated with either grid. +/// @note The current implementation assumes all the input distance values +/// are represented by leaf voxels and not tiles. This is true for all +/// narrow-band level sets, which this class was originally developed for. +/// In the future we will expand this class to also handle tile values. +template inline +typename ScalarToVectorConverter::Type::Ptr +cpt(const GridType& grid, bool threaded, InterruptT* interrupt); + +template inline +typename ScalarToVectorConverter::Type::Ptr +cpt(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt); + +template inline +typename ScalarToVectorConverter::Type::Ptr +cpt(const GridType& grid, bool threaded = true) +{ + return cpt(grid, threaded, NULL); +} + +template inline +typename ScalarToVectorConverter::Type::Ptr +cpt(const GridType& grid, const MaskT& mask, bool threaded = true) +{ + return cpt(grid, mask, threaded, NULL); +} + + +/// @brief Compute the curl of the given vector-valued grid. +/// @return a new vector-valued grid +/// @details When a mask grid is specified, the solution is calculated only in +/// the intersection of the mask active topology and the input active topology +/// independent of the transforms associated with either grid. +template inline +typename GridType::Ptr +curl(const GridType& grid, bool threaded, InterruptT* interrupt); + +template inline +typename GridType::Ptr +curl(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt); + +template inline +typename GridType::Ptr +curl(const GridType& grid, bool threaded = true) +{ + return curl(grid, threaded, NULL); +} + +template inline +typename GridType::Ptr +curl(const GridType& grid, const MaskT& mask, bool threaded = true) +{ + return curl(grid, mask, threaded, NULL); +} + + +/// @brief Compute the divergence of the given vector-valued grid. +/// @return a new scalar-valued grid with the same numerical precision as the input grid +/// (for example, if the input grid is a Vec3DGrid, the output grid will be a DoubleGrid) +/// @details When a mask grid is specified, the solution is calculated only in +/// the intersection of the mask active topology and the input active topology +/// independent of the transforms associated with either grid. +template inline +typename VectorToScalarConverter::Type::Ptr +divergence(const GridType& grid, bool threaded, InterruptT* interrupt); + +template inline +typename VectorToScalarConverter::Type::Ptr +divergence(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt); + +template inline +typename VectorToScalarConverter::Type::Ptr +divergence(const GridType& grid, bool threaded = true) +{ + return divergence(grid, threaded, NULL); +} + +template inline +typename VectorToScalarConverter::Type::Ptr +divergence(const GridType& grid, const MaskT& mask, bool threaded = true) +{ + return divergence(grid, mask, threaded, NULL); +} + + +/// @brief Compute the gradient of the given scalar grid. +/// @return a new vector-valued grid with the same numerical precision as the input grid +/// (for example, if the input grid is a DoubleGrid, the output grid will be a Vec3DGrid) +/// @details When a mask grid is specified, the solution is calculated only in +/// the intersection of the mask active topology and the input active topology +/// independent of the transforms associated with either grid. +template inline +typename ScalarToVectorConverter::Type::Ptr +gradient(const GridType& grid, bool threaded, InterruptT* interrupt); + +template inline +typename ScalarToVectorConverter::Type::Ptr +gradient(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt); + +template inline +typename ScalarToVectorConverter::Type::Ptr +gradient(const GridType& grid, bool threaded = true) +{ + return gradient(grid, threaded, NULL); +} + +template inline +typename ScalarToVectorConverter::Type::Ptr +gradient(const GridType& grid, const MaskT& mask, bool threaded = true) +{ + return gradient(grid, mask, threaded, NULL); +} + + +/// @brief Compute the Laplacian of the given scalar grid. +/// @return a new scalar grid +/// @details When a mask grid is specified, the solution is calculated only in +/// the intersection of the mask active topology and the input active topology +/// independent of the transforms associated with either grid. +template inline +typename GridType::Ptr +laplacian(const GridType& grid, bool threaded, InterruptT* interrupt); + +template inline +typename GridType::Ptr +laplacian(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt); + +template inline +typename GridType::Ptr +laplacian(const GridType& grid, bool threaded = true) +{ + return laplacian(grid, threaded, NULL); +} + +template inline +typename GridType::Ptr +laplacian(const GridType& grid, const MaskT mask, bool threaded = true) +{ + return laplacian(grid, mask, threaded, NULL); +} + + +/// @brief Compute the mean curvature of the given grid. +/// @return a new grid +/// @details When a mask grid is specified, the solution is calculated only in +/// the intersection of the mask active topology and the input active topology +/// independent of the transforms associated with either grid. +template inline +typename GridType::Ptr +meanCurvature(const GridType& grid, bool threaded, InterruptT* interrupt); + +template inline +typename GridType::Ptr +meanCurvature(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt); + +template inline +typename GridType::Ptr +meanCurvature(const GridType& grid, bool threaded = true) +{ + return meanCurvature(grid, threaded, NULL); +} + +template inline +typename GridType::Ptr +meanCurvature(const GridType& grid, const MaskT& mask, bool threaded = true) +{ + return meanCurvature(grid, mask, threaded, NULL); +} + + +/// @brief Compute the magnitudes of the vectors of the given vector-valued grid. +/// @return a new scalar-valued grid with the same numerical precision as the input grid +/// (for example, if the input grid is a Vec3DGrid, the output grid will be a DoubleGrid) +/// @details When a mask grid is specified, the solution is calculated only in +/// the intersection of the mask active topology and the input active topology +/// independent of the transforms associated with either grid. +template inline +typename VectorToScalarConverter::Type::Ptr +magnitude(const GridType& grid, bool threaded, InterruptT* interrupt); + +template inline +typename VectorToScalarConverter::Type::Ptr +magnitude(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt); + +template inline +typename VectorToScalarConverter::Type::Ptr +magnitude(const GridType& grid, bool threaded = true) +{ + return magnitude(grid, threaded, NULL); +} + +template inline +typename VectorToScalarConverter::Type::Ptr +magnitude(const GridType& grid, const MaskT& mask, bool threaded = true) +{ + return magnitude(grid, mask, threaded, NULL); +} + + +/// @brief Normalize the vectors of the given vector-valued grid. +/// @return a new vector-valued grid +/// @details When a mask grid is specified, the solution is calculated only in +/// the intersection of the mask active topology and the input active topology +/// independent of the transforms associated with either grid. +template inline +typename GridType::Ptr +normalize(const GridType& grid, bool threaded, InterruptT* interrupt); + +template inline +typename GridType::Ptr +normalize(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt); + +template inline +typename GridType::Ptr +normalize(const GridType& grid, bool threaded = true) +{ + return normalize(grid, threaded, NULL); +} + +template inline +typename GridType::Ptr +normalize(const GridType& grid, const MaskT& mask, bool threaded = true) +{ + return normalize(grid, mask, threaded, NULL); +} + + +//////////////////////////////////////// + + +namespace gridop { + +/// @brief ToMaskGrid::Type is the type of a grid having the same +/// tree hierarchy as grid type T but a value equal to its active state. +/// @details For example, ToMaskGrid::Type is equivalent to MaskGrid. +template +struct ToMaskGrid { + typedef Grid::Type> Type; +}; + + +/// @brief Apply an operator on an input grid to produce an output grid +/// with the same topology but a possibly different value type. +/// @details To facilitate inlining, this class is also templated on a Map type. +/// +/// @note This is a helper class and should never be used directly. +/// +/// @note The current implementation assumes all the input +/// values are represented by leaf voxels and not tiles. In the +/// future we will expand this class to also handle tile values. +template< + typename InGridT, + typename MaskGridType, + typename OutGridT, + typename MapT, + typename OperatorT, + typename InterruptT = util::NullInterrupter> +class GridOperator +{ +public: + typedef typename OutGridT::TreeType OutTreeT; + typedef typename OutTreeT::LeafNodeType OutLeafT; + typedef typename tree::LeafManager LeafManagerT; + + GridOperator(const InGridT& grid, const MaskGridType* mask, const MapT& map, + InterruptT* interrupt = NULL): + mAcc(grid.getConstAccessor()), mMap(map), mInterrupt(interrupt), mMask(mask) + { + } + + virtual ~GridOperator() {} + typename OutGridT::Ptr process(bool threaded = true) + { + if (mInterrupt) mInterrupt->start("Processing grid"); + + // Derive background value of the output grid + typename InGridT::TreeType tmp(mAcc.tree().background()); + typename OutGridT::ValueType backg = OperatorT::result(mMap, tmp, math::Coord(0)); + + // output tree = topology copy of input tree! + typename OutTreeT::Ptr tree(new OutTreeT(mAcc.tree(), backg, TopologyCopy())); + + + // create grid with output tree and unit transform + typename OutGridT::Ptr result(new OutGridT(tree)); + + // Modify the solution area if a mask was supplied. + if (mMask) { + result->topologyIntersection(*mMask); + } + + // transform of output grid = transform of input grid + result->setTransform(math::Transform::Ptr(new math::Transform( mMap.copy() ))); + + LeafManagerT leafManager(*tree); + + if (threaded) { + tbb::parallel_for(leafManager.leafRange(), *this); + } else { + (*this)(leafManager.leafRange()); + } + + if (mInterrupt) mInterrupt->end(); + return result; + } + + /// @brief Iterate sequentially over LeafNodes and voxels in the output + /// grid and compute the Laplacian using a valueAccessor for the + /// input grid. + /// + /// @note Never call this public method directly - it is called by + /// TBB threads only! + void operator()(const typename LeafManagerT::LeafRange& range) const + { + if (util::wasInterrupted(mInterrupt)) tbb::task::self().cancel_group_execution(); + + for (typename LeafManagerT::LeafRange::Iterator leaf=range.begin(); leaf; ++leaf) { + for (typename OutLeafT::ValueOnIter value=leaf->beginValueOn(); value; ++value) { + value.setValue(OperatorT::result(mMap, mAcc, value.getCoord())); + } + } + } + +protected: + typedef typename InGridT::ConstAccessor AccessorT; + mutable AccessorT mAcc; + const MapT& mMap; + InterruptT* mInterrupt; + const MaskGridType* mMask; +}; // end of GridOperator class + +} // namespace gridop + + +//////////////////////////////////////// + + +/// @brief Compute the closest-point transform of a scalar grid. +template< + typename InGridT, + typename MaskGridType = typename gridop::ToMaskGrid::Type, + typename InterruptT = util::NullInterrupter> +class Cpt +{ +public: + typedef InGridT InGridType; + typedef typename ScalarToVectorConverter::Type OutGridType; + + Cpt(const InGridType& grid, InterruptT* interrupt = NULL): + mInputGrid(grid), mInterrupt(interrupt), mMask(NULL) + { + } + + Cpt(const InGridType& grid, const MaskGridType& mask, InterruptT* interrupt = NULL): + mInputGrid(grid), mInterrupt(interrupt), mMask(&mask) + { + } + + typename OutGridType::Ptr process(bool threaded = true, bool useWorldTransform = true) + { + Functor functor(mInputGrid, mMask, threaded, useWorldTransform, mInterrupt); + processTypedMap(mInputGrid.transform(), functor); + if (functor.mOutputGrid) functor.mOutputGrid->setVectorType(VEC_CONTRAVARIANT_ABSOLUTE); + return functor.mOutputGrid; + } + +private: + struct IsOpT + { + template + static typename OutGridType::ValueType + result(const MapT& map, const AccT& acc, const Coord& xyz) + { + return math::CPT::result(map, acc, xyz); + } + }; + struct WsOpT + { + template + static typename OutGridType::ValueType + result(const MapT& map, const AccT& acc, const Coord& xyz) + { + return math::CPT_RANGE::result(map, acc, xyz); + } + }; + struct Functor + { + Functor(const InGridType& grid, const MaskGridType* mask, + bool threaded, bool worldspace, InterruptT* interrupt) + : mThreaded(threaded) + , mWorldSpace(worldspace) + , mInputGrid(grid) + , mInterrupt(interrupt) + , mMask(mask) + {} + + template + void operator()(const MapT& map) + { + if (mWorldSpace) { + gridop::GridOperator + op(mInputGrid, mMask, map, mInterrupt); + mOutputGrid = op.process(mThreaded); // cache the result + } else { + gridop::GridOperator + op(mInputGrid, mMask, map, mInterrupt); + mOutputGrid = op.process(mThreaded); // cache the result + } + } + const bool mThreaded; + const bool mWorldSpace; + const InGridType& mInputGrid; + typename OutGridType::Ptr mOutputGrid; + InterruptT* mInterrupt; + const MaskGridType* mMask; + }; + const InGridType& mInputGrid; + InterruptT* mInterrupt; + const MaskGridType* mMask; +}; // end of Cpt class + + +//////////////////////////////////////// + + +/// @brief Compute the curl of a vector grid. +template< + typename GridT, + typename MaskGridType = typename gridop::ToMaskGrid::Type, + typename InterruptT = util::NullInterrupter> +class Curl +{ +public: + typedef GridT InGridType; + typedef GridT OutGridType; + + Curl(const GridT& grid, InterruptT* interrupt = NULL): + mInputGrid(grid), mInterrupt(interrupt), mMask(NULL) + { + } + + Curl(const GridT& grid, const MaskGridType& mask, InterruptT* interrupt = NULL): + mInputGrid(grid), mInterrupt(interrupt), mMask(&mask) + { + } + + typename GridT::Ptr process(bool threaded = true) + { + Functor functor(mInputGrid, mMask, threaded, mInterrupt); + processTypedMap(mInputGrid.transform(), functor); + if (functor.mOutputGrid) functor.mOutputGrid->setVectorType(VEC_COVARIANT); + return functor.mOutputGrid; + } + +private: + struct Functor + { + Functor(const GridT& grid, const MaskGridType* mask, + bool threaded, InterruptT* interrupt): + mThreaded(threaded), mInputGrid(grid), mInterrupt(interrupt), mMask(mask) {} + + template + void operator()(const MapT& map) + { + typedef math::Curl OpT; + gridop::GridOperator + op(mInputGrid, mMask, map, mInterrupt); + mOutputGrid = op.process(mThreaded); // cache the result + } + + const bool mThreaded; + const GridT& mInputGrid; + typename GridT::Ptr mOutputGrid; + InterruptT* mInterrupt; + const MaskGridType* mMask; + }; // Private Functor + + const GridT& mInputGrid; + InterruptT* mInterrupt; + const MaskGridType* mMask; +}; // end of Curl class + + +//////////////////////////////////////// + + +/// @brief Compute the divergence of a vector grid. +template< + typename InGridT, + typename MaskGridType = typename gridop::ToMaskGrid::Type, + typename InterruptT = util::NullInterrupter> +class Divergence +{ +public: + typedef InGridT InGridType; + typedef typename VectorToScalarConverter::Type OutGridType; + + Divergence(const InGridT& grid, InterruptT* interrupt = NULL): + mInputGrid(grid), mInterrupt(interrupt), mMask(NULL) + { + } + + Divergence(const InGridT& grid, const MaskGridType& mask, InterruptT* interrupt = NULL): + mInputGrid(grid), mInterrupt(interrupt), mMask(&mask) + { + } + + typename OutGridType::Ptr process(bool threaded = true) + { + if (mInputGrid.getGridClass() == GRID_STAGGERED) { + Functor functor(mInputGrid, mMask, threaded, mInterrupt); + processTypedMap(mInputGrid.transform(), functor); + return functor.mOutputGrid; + } else { + Functor functor(mInputGrid, mMask, threaded, mInterrupt); + processTypedMap(mInputGrid.transform(), functor); + return functor.mOutputGrid; + } + } + +protected: + template + struct Functor + { + Functor(const InGridT& grid, const MaskGridType* mask, + bool threaded, InterruptT* interrupt): + mThreaded(threaded), mInputGrid(grid), mInterrupt(interrupt), mMask(mask) {} + + template + void operator()(const MapT& map) + { + typedef math::Divergence OpT; + gridop::GridOperator + op(mInputGrid, mMask, map, mInterrupt); + mOutputGrid = op.process(mThreaded); // cache the result + } + + const bool mThreaded; + const InGridType& mInputGrid; + typename OutGridType::Ptr mOutputGrid; + InterruptT* mInterrupt; + const MaskGridType* mMask; + }; // Private Functor + + const InGridType& mInputGrid; + InterruptT* mInterrupt; + const MaskGridType* mMask; +}; // end of Divergence class + + +//////////////////////////////////////// + + +/// @brief Compute the gradient of a scalar grid. +template< + typename InGridT, + typename MaskGridType = typename gridop::ToMaskGrid::Type, + typename InterruptT = util::NullInterrupter> +class Gradient +{ +public: + typedef InGridT InGridType; + typedef typename ScalarToVectorConverter::Type OutGridType; + + Gradient(const InGridT& grid, InterruptT* interrupt = NULL): + mInputGrid(grid), mInterrupt(interrupt), mMask(NULL) + { + } + + Gradient(const InGridT& grid, const MaskGridType& mask, InterruptT* interrupt = NULL): + mInputGrid(grid), mInterrupt(interrupt), mMask(&mask) + { + } + + typename OutGridType::Ptr process(bool threaded = true) + { + Functor functor(mInputGrid, mMask, threaded, mInterrupt); + processTypedMap(mInputGrid.transform(), functor); + if (functor.mOutputGrid) functor.mOutputGrid->setVectorType(VEC_COVARIANT); + return functor.mOutputGrid; + } + +protected: + struct Functor + { + Functor(const InGridT& grid, const MaskGridType* mask, + bool threaded, InterruptT* interrupt): + mThreaded(threaded), mInputGrid(grid), mInterrupt(interrupt), mMask(mask) {} + + template + void operator()(const MapT& map) + { + typedef math::Gradient OpT; + gridop::GridOperator + op(mInputGrid, mMask, map, mInterrupt); + mOutputGrid = op.process(mThreaded); // cache the result + } + + const bool mThreaded; + const InGridT& mInputGrid; + typename OutGridType::Ptr mOutputGrid; + InterruptT* mInterrupt; + const MaskGridType* mMask; + }; // Private Functor + + const InGridT& mInputGrid; + InterruptT* mInterrupt; + const MaskGridType* mMask; +}; // end of Gradient class + + +//////////////////////////////////////// + + +template< + typename GridT, + typename MaskGridType = typename gridop::ToMaskGrid::Type, + typename InterruptT = util::NullInterrupter> +class Laplacian +{ +public: + typedef GridT InGridType; + typedef GridT OutGridType; + + Laplacian(const GridT& grid, InterruptT* interrupt = NULL): + mInputGrid(grid), mInterrupt(interrupt), mMask(NULL) + { + } + + Laplacian(const GridT& grid, const MaskGridType& mask, InterruptT* interrupt = NULL): + mInputGrid(grid), mInterrupt(interrupt), mMask(&mask) + { + } + + typename GridT::Ptr process(bool threaded = true) + { + Functor functor(mInputGrid, mMask, threaded, mInterrupt); + processTypedMap(mInputGrid.transform(), functor); + if (functor.mOutputGrid) functor.mOutputGrid->setVectorType(VEC_COVARIANT); + return functor.mOutputGrid; + } + +protected: + struct Functor + { + Functor(const GridT& grid, const MaskGridType* mask, bool threaded, InterruptT* interrupt): + mThreaded(threaded), mInputGrid(grid), mInterrupt(interrupt), mMask(mask) {} + + template + void operator()(const MapT& map) + { + typedef math::Laplacian OpT; + gridop::GridOperator + op(mInputGrid, mMask, map); + mOutputGrid = op.process(mThreaded); // cache the result + } + + const bool mThreaded; + const GridT& mInputGrid; + typename GridT::Ptr mOutputGrid; + InterruptT* mInterrupt; + const MaskGridType* mMask; + }; // Private Functor + + const GridT& mInputGrid; + InterruptT* mInterrupt; + const MaskGridType* mMask; +}; // end of Laplacian class + + +//////////////////////////////////////// + + +template< + typename GridT, + typename MaskGridType = typename gridop::ToMaskGrid::Type, + typename InterruptT = util::NullInterrupter> +class MeanCurvature +{ +public: + typedef GridT InGridType; + typedef GridT OutGridType; + + MeanCurvature(const GridT& grid, InterruptT* interrupt = NULL): + mInputGrid(grid), mInterrupt(interrupt), mMask(NULL) + { + } + + MeanCurvature(const GridT& grid, const MaskGridType& mask, InterruptT* interrupt = NULL): + mInputGrid(grid), mInterrupt(interrupt), mMask(&mask) + { + } + + typename GridT::Ptr process(bool threaded = true) + { + Functor functor(mInputGrid, mMask, threaded, mInterrupt); + processTypedMap(mInputGrid.transform(), functor); + if (functor.mOutputGrid) functor.mOutputGrid->setVectorType(VEC_COVARIANT); + return functor.mOutputGrid; + } + +protected: + struct Functor + { + Functor(const GridT& grid, const MaskGridType* mask, bool threaded, InterruptT* interrupt): + mThreaded(threaded), mInputGrid(grid), mInterrupt(interrupt), mMask(mask) {} + + template + void operator()(const MapT& map) + { + typedef math::MeanCurvature OpT; + gridop::GridOperator + op(mInputGrid, mMask, map); + mOutputGrid = op.process(mThreaded); // cache the result + } + + const bool mThreaded; + const GridT& mInputGrid; + typename GridT::Ptr mOutputGrid; + InterruptT* mInterrupt; + const MaskGridType* mMask; + }; // Private Functor + + const GridT& mInputGrid; + InterruptT* mInterrupt; + const MaskGridType* mMask; +}; // end of MeanCurvature class + + +//////////////////////////////////////// + + +template< + typename InGridT, + typename MaskGridType = typename gridop::ToMaskGrid::Type, + typename InterruptT = util::NullInterrupter> +class Magnitude +{ +public: + typedef InGridT InGridType; + typedef typename VectorToScalarConverter::Type OutGridType; + + Magnitude(const InGridType& grid, InterruptT* interrupt = NULL): + mInputGrid(grid), mInterrupt(interrupt), mMask(NULL) + { + } + + Magnitude(const InGridType& grid, const MaskGridType& mask, InterruptT* interrupt = NULL): + mInputGrid(grid), mInterrupt(interrupt), mMask(&mask) + { + } + + typename OutGridType::Ptr process(bool threaded = true) + { + Functor functor(mInputGrid, mMask, threaded, mInterrupt); + processTypedMap(mInputGrid.transform(), functor); + return functor.mOutputGrid; + } + +protected: + struct OpT + { + template + static typename OutGridType::ValueType + result(const MapT&, const AccT& acc, const Coord& xyz) { return acc.getValue(xyz).length();} + }; + struct Functor + { + Functor(const InGridT& grid, const MaskGridType* mask, + bool threaded, InterruptT* interrupt): + mThreaded(threaded), mInputGrid(grid), mInterrupt(interrupt), mMask(mask) {} + + template + void operator()(const MapT& map) + { + gridop::GridOperator + op(mInputGrid, mMask, map); + mOutputGrid = op.process(mThreaded); // cache the result + } + + const bool mThreaded; + const InGridType& mInputGrid; + typename OutGridType::Ptr mOutputGrid; + InterruptT* mInterrupt; + const MaskGridType* mMask; + }; // Private Functor + + const InGridType& mInputGrid; + InterruptT* mInterrupt; + const MaskGridType* mMask; +}; // end of Magnitude class + + +//////////////////////////////////////// + + +template< + typename GridT, + typename MaskGridType = typename gridop::ToMaskGrid::Type, + typename InterruptT = util::NullInterrupter> +class Normalize +{ +public: + typedef GridT InGridType; + typedef GridT OutGridType; + + Normalize(const GridT& grid, InterruptT* interrupt = NULL): + mInputGrid(grid), mInterrupt(interrupt), mMask(NULL) + { + } + + Normalize(const GridT& grid, const MaskGridType& mask, InterruptT* interrupt = NULL): + mInputGrid(grid), mInterrupt(interrupt), mMask(&mask) + { + } + + typename GridT::Ptr process(bool threaded = true) + { + Functor functor(mInputGrid, mMask, threaded, mInterrupt); + processTypedMap(mInputGrid.transform(), functor); + if (typename GridT::Ptr outGrid = functor.mOutputGrid) { + const VecType vecType = mInputGrid.getVectorType(); + if (vecType == VEC_COVARIANT) { + outGrid->setVectorType(VEC_COVARIANT_NORMALIZE); + } else { + outGrid->setVectorType(vecType); + } + } + return functor.mOutputGrid; + } + +protected: + struct OpT + { + template + static typename OutGridType::ValueType + result(const MapT&, const AccT& acc, const Coord& xyz) + { + typename OutGridType::ValueType vec = acc.getValue(xyz); + if ( !vec.normalize() ) vec.setZero(); + return vec; + } + }; + struct Functor + { + Functor(const GridT& grid, const MaskGridType* mask, bool threaded, InterruptT* interrupt): + mThreaded(threaded), mInputGrid(grid), mInterrupt(interrupt), mMask(mask) {} + + template + void operator()(const MapT& map) + { + gridop::GridOperator + op(mInputGrid, mMask,map); + mOutputGrid = op.process(mThreaded); // cache the result + } + + const bool mThreaded; + const GridT& mInputGrid; + typename GridT::Ptr mOutputGrid; + InterruptT* mInterrupt; + const MaskGridType* mMask; + }; // Private Functor + + const GridT& mInputGrid; + InterruptT* mInterrupt; + const MaskGridType* mMask; +}; // end of Normalize class + + +//////////////////////////////////////// + + +template inline +typename ScalarToVectorConverter::Type::Ptr +cpt(const GridType& grid, bool threaded, InterruptT* interrupt) +{ + Cpt::Type, InterruptT> op(grid, interrupt); + return op.process(threaded); +} + +template inline +typename ScalarToVectorConverter::Type::Ptr +cpt(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt) +{ + Cpt op(grid, mask, interrupt); + return op.process(threaded); +} + +template inline +typename GridType::Ptr +curl(const GridType& grid, bool threaded, InterruptT* interrupt) +{ + Curl::Type, InterruptT> op(grid, interrupt); + return op.process(threaded); +} + +template inline +typename GridType::Ptr +curl(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt) +{ + Curl op(grid, mask, interrupt); + return op.process(threaded); +} + +template inline +typename VectorToScalarConverter::Type::Ptr +divergence(const GridType& grid, bool threaded, InterruptT* interrupt) +{ + Divergence::Type, InterruptT> + op(grid, interrupt); + return op.process(threaded); +} + +template inline +typename VectorToScalarConverter::Type::Ptr +divergence(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt) +{ + Divergence op(grid, mask, interrupt); + return op.process(threaded); +} + +template inline +typename ScalarToVectorConverter::Type::Ptr +gradient(const GridType& grid, bool threaded, InterruptT* interrupt) +{ + Gradient::Type, InterruptT> + op(grid, interrupt); + return op.process(threaded); +} + +template inline +typename ScalarToVectorConverter::Type::Ptr +gradient(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt) +{ + Gradient op(grid, mask, interrupt); + return op.process(threaded); +} + +template inline +typename GridType::Ptr +laplacian(const GridType& grid, bool threaded, InterruptT* interrupt) +{ + Laplacian::Type, InterruptT> + op(grid, interrupt); + return op.process(threaded); +} + +template inline +typename GridType::Ptr +laplacian(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt) +{ + Laplacian op(grid, mask, interrupt); + return op.process(threaded); +} + +template inline +typename GridType::Ptr +meanCurvature(const GridType& grid, bool threaded, InterruptT* interrupt) +{ + MeanCurvature::Type, InterruptT> + op(grid, interrupt); + return op.process(threaded); +} + +template inline +typename GridType::Ptr +meanCurvature(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt) +{ + MeanCurvature op(grid, mask, interrupt); + return op.process(threaded); +} + +template inline +typename VectorToScalarConverter::Type::Ptr +magnitude(const GridType& grid, bool threaded, InterruptT* interrupt) +{ + Magnitude::Type, InterruptT> + op(grid, interrupt); + return op.process(threaded); +} + +template inline +typename VectorToScalarConverter::Type::Ptr +magnitude(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt) +{ + Magnitude op(grid, mask, interrupt); + return op.process(threaded); +} + +template inline +typename GridType::Ptr +normalize(const GridType& grid, bool threaded, InterruptT* interrupt) +{ + Normalize::Type, InterruptT> + op(grid, interrupt); + return op.process(threaded); +} + +template inline +typename GridType::Ptr +normalize(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt) +{ + Normalize op(grid, mask, interrupt); + return op.process(threaded); +} + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_GRID_OPERATORS_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/GridTransformer.h b/nuparu/include/openvdb/include/openvdb/tools/GridTransformer.h new file mode 100644 index 00000000..b23f94ab --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/GridTransformer.h @@ -0,0 +1,1039 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file GridTransformer.h +/// @author Peter Cucka + +#ifndef OPENVDB_TOOLS_GRIDTRANSFORMER_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_GRIDTRANSFORMER_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include +#include // for isApproxEqual() +#include +#include "ChangeBackground.h" +#include "Interpolation.h" +#include "LevelSetRebuild.h" // for doLevelSetRebuild() +#include "SignedFloodFill.h" // for signedFloodFill +#include "Prune.h" // for pruneLevelSet + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief Resample an input grid into an output grid of the same type such that, +/// after resampling, the input and output grids coincide (apart from sampling +/// artifacts), but the output grid's transform is unchanged. +/// @details Specifically, this function resamples the input grid into the output +/// grid's index space, using a sampling kernel like PointSampler, BoxSampler, +/// or QuadraticSampler. +/// @param inGrid the grid to be resampled +/// @param outGrid the grid into which to write the resampled voxel data +/// @param interrupter an object adhering to the util::NullInterrupter interface +/// @par Example: +/// @code +/// // Create an input grid with the default identity transform +/// // and populate it with a level-set sphere. +/// FloatGrid::ConstPtr src = tools::makeSphere(...); +/// // Create an output grid and give it a uniform-scale transform. +/// FloatGrid::Ptr dest = FloatGrid::create(); +/// const float voxelSize = 0.5; +/// dest->setTransform(math::Transform::createLinearTransform(voxelSize)); +/// // Resample the input grid into the output grid, reproducing +/// // the level-set sphere at a smaller voxel size. +/// MyInterrupter interrupter = ...; +/// tools::resampleToMatch(*src, *dest, interrupter); +/// @endcode +template +inline void +resampleToMatch(const GridType& inGrid, GridType& outGrid, Interrupter& interrupter); + +/// @brief Resample an input grid into an output grid of the same type such that, +/// after resampling, the input and output grids coincide (apart from sampling +/// artifacts), but the output grid's transform is unchanged. +/// @details Specifically, this function resamples the input grid into the output +/// grid's index space, using a sampling kernel like PointSampler, BoxSampler, +/// or QuadraticSampler. +/// @param inGrid the grid to be resampled +/// @param outGrid the grid into which to write the resampled voxel data +/// @par Example: +/// @code +/// // Create an input grid with the default identity transform +/// // and populate it with a level-set sphere. +/// FloatGrid::ConstPtr src = tools::makeSphere(...); +/// // Create an output grid and give it a uniform-scale transform. +/// FloatGrid::Ptr dest = FloatGrid::create(); +/// const float voxelSize = 0.5; +/// dest->setTransform(math::Transform::createLinearTransform(voxelSize)); +/// // Resample the input grid into the output grid, reproducing +/// // the level-set sphere at a smaller voxel size. +/// tools::resampleToMatch(*src, *dest); +/// @endcode +template +inline void +resampleToMatch(const GridType& inGrid, GridType& outGrid); + + +//////////////////////////////////////// + + +namespace internal { + +/// @brief A TileSampler wraps a grid sampler of another type (BoxSampler, +/// QuadraticSampler, etc.), and for samples that fall within a given tile +/// of the grid, it returns a cached tile value instead of accessing the grid. +template +class TileSampler: public Sampler +{ +public: + typedef typename TreeT::ValueType ValueT; + + /// @param b the index-space bounding box of a particular grid tile + /// @param tileVal the tile's value + /// @param on the tile's active state + TileSampler(const CoordBBox& b, const ValueT& tileVal, bool on): + mBBox(b.min().asVec3d(), b.max().asVec3d()), mVal(tileVal), mActive(on), mEmpty(false) + { + mBBox.expand(-this->radius()); // shrink the bounding box by the sample radius + mEmpty = mBBox.empty(); + } + + bool sample(const TreeT& inTree, const Vec3R& inCoord, ValueT& result) const + { + if (!mEmpty && mBBox.isInside(inCoord)) { result = mVal; return mActive; } + return Sampler::sample(inTree, inCoord, result); + } + +protected: + BBoxd mBBox; + ValueT mVal; + bool mActive, mEmpty; +}; + + +/// @brief For point sampling, tree traversal is less expensive than testing +/// bounding box membership. +template +class TileSampler: public PointSampler { +public: + TileSampler(const CoordBBox&, const typename TreeT::ValueType&, bool) {} +}; + +/// @brief For point sampling, tree traversal is less expensive than testing +/// bounding box membership. +template +class TileSampler: public StaggeredPointSampler { +public: + TileSampler(const CoordBBox&, const typename TreeT::ValueType&, bool) {} +}; + +} // namespace internal + + +//////////////////////////////////////// + + +/// A GridResampler applies a geometric transformation to an +/// input grid using one of several sampling schemes, and stores +/// the result in an output grid. +/// +/// Usage: +/// @code +/// GridResampler resampler(); +/// resampler.transformGrid(xform, inGrid, outGrid); +/// @endcode +/// where @c xform is a functor that implements the following methods: +/// @code +/// bool isAffine() const +/// openvdb::Vec3d transform(const openvdb::Vec3d&) const +/// openvdb::Vec3d invTransform(const openvdb::Vec3d&) const +/// @endcode +/// @note When the transform is affine and can be expressed as a 4 x 4 matrix, +/// a GridTransformer is much more efficient than a GridResampler. +class GridResampler +{ +public: + typedef boost::shared_ptr Ptr; + typedef boost::function InterruptFunc; + + GridResampler(): mThreaded(true), mTransformTiles(true) {} + virtual ~GridResampler() {} + + /// Enable or disable threading. (Threading is enabled by default.) + void setThreaded(bool b) { mThreaded = b; } + /// Return @c true if threading is enabled. + bool threaded() const { return mThreaded; } + /// Enable or disable processing of tiles. (Enabled by default, except for level set grids.) + void setTransformTiles(bool b) { mTransformTiles = b; } + /// Return @c true if tile processing is enabled. + bool transformTiles() const { return mTransformTiles; } + + /// @brief Allow processing to be aborted by providing an interrupter object. + /// The interrupter will be queried periodically during processing. + /// @see util/NullInterrupter.h for interrupter interface requirements. + template void setInterrupter(InterrupterType&); + + template + void transformGrid(const Transformer&, + const GridT& inGrid, GridT& outGrid) const; + +protected: + template + void applyTransform(const Transformer&, const GridT& inGrid, GridT& outGrid) const; + + bool interrupt() const { return mInterrupt && mInterrupt(); } + +private: + template + static void transformBBox(const Transformer&, const CoordBBox& inBBox, + const InTreeT& inTree, OutTreeT& outTree, const InterruptFunc&, + const Sampler& = Sampler()); + + template + class RangeProcessor; + + bool mThreaded, mTransformTiles; + InterruptFunc mInterrupt; +}; + + +//////////////////////////////////////// + + +/// @brief A GridTransformer applies a geometric transformation to an +/// input grid using one of several sampling schemes, and stores +/// the result in an output grid. +/// +/// @note GridTransformer is optimized for affine transformations. +/// +/// Usage: +/// @code +/// Mat4R xform = ...; +/// GridTransformer transformer(xform); +/// transformer.transformGrid(inGrid, outGrid); +/// @endcode +/// or +/// @code +/// Vec3R pivot = ..., scale = ..., rotate = ..., translate = ...; +/// GridTransformer transformer(pivot, scale, rotate, translate); +/// transformer.transformGrid(inGrid, outGrid); +/// @endcode +class GridTransformer: public GridResampler +{ +public: + typedef boost::shared_ptr Ptr; + + GridTransformer(const Mat4R& xform); + GridTransformer( + const Vec3R& pivot, + const Vec3R& scale, + const Vec3R& rotate, + const Vec3R& translate, + const std::string& xformOrder = "tsr", + const std::string& rotationOrder = "zyx"); + virtual ~GridTransformer() {} + + const Mat4R& getTransform() const { return mTransform; } + + template + void transformGrid(const GridT& inGrid, GridT& outGrid) const; + +private: + struct MatrixTransform; + + inline void init(const Vec3R& pivot, const Vec3R& scale, + const Vec3R& rotate, const Vec3R& translate, + const std::string& xformOrder, const std::string& rotOrder); + + Vec3R mPivot; + Vec3i mMipLevels; + Mat4R mTransform, mPreScaleTransform, mPostScaleTransform; +}; + + +//////////////////////////////////////// + + +namespace local_util { + +/// @brief Decompose an affine transform into scale, rotation and translation components. +/// @return @c false if the given matrix is not affine or cannot otherwise be decomposed. +template +inline bool +decompose(const math::Mat4& m, math::Vec3& scale, + math::Vec3& rotate, math::Vec3& translate) +{ + if (!math::isAffine(m)) return false; + + // This is the translation in world space + translate = m.getTranslation(); + // Extract translation. + const math::Mat3 xform = m.getMat3(); + + const math::Vec3 unsignedScale( + (math::Vec3(1, 0, 0) * xform).length(), + (math::Vec3(0, 1, 0) * xform).length(), + (math::Vec3(0, 0, 1) * xform).length()); + + const bool hasUniformScale = unsignedScale.eq(math::Vec3(unsignedScale[0])); + + bool hasRotation = false; + bool validDecomposition = false; + + T minAngle = std::numeric_limits::max(); + + // If the transformation matrix contains a reflection, + // test different negative scales to find a decomposition + // that favors the optimal resampling algorithm. + for (size_t n = 0; n < 8; ++n) { + + const math::Vec3 signedScale( + n & 0x1 ? -unsignedScale.x() : unsignedScale.x(), + n & 0x2 ? -unsignedScale.y() : unsignedScale.y(), + n & 0x4 ? -unsignedScale.z() : unsignedScale.z()); + + // Extract scale and potentially reflection. + const math::Mat3 mat = xform * math::scale >(signedScale).inverse(); + if (mat.det() < T(0.0)) continue; // Skip if mat contains a reflection. + + const math::Vec3 tmpAngle = math::eulerAngles(mat, math::XYZ_ROTATION); + + const math::Mat3 rebuild = + math::rotation >(math::Vec3(1, 0, 0), tmpAngle.x()) * + math::rotation >(math::Vec3(0, 1, 0), tmpAngle.y()) * + math::rotation >(math::Vec3(0, 0, 1), tmpAngle.z()) * + math::scale >(signedScale); + + if (xform.eq(rebuild)) { + + const T maxAngle = std::max(std::abs(tmpAngle[0]), + std::max(std::abs(tmpAngle[1]), std::abs(tmpAngle[2]))); + + if (!(minAngle < maxAngle)) { // Update if less or equal. + + minAngle = maxAngle; + rotate = tmpAngle; + scale = signedScale; + + hasRotation = !rotate.eq(math::Vec3::zero()); + validDecomposition = true; + + if (hasUniformScale || !hasRotation) { + // Current decomposition is optimal. + break; + } + } + } + } + + if (!validDecomposition || (hasRotation && !hasUniformScale)) { + // The decomposition is invalid if the transformation matrix contains shear. + // No unique decomposition if scale is nonuniform and rotation is nonzero. + return false; + } + + return true; +} + +} // namespace local_util + + +//////////////////////////////////////// + + +/// This class implements the Transformer functor interface (specifically, +/// the isAffine(), transform() and invTransform() methods) for a transform +/// that is expressed as a 4 x 4 matrix. +struct GridTransformer::MatrixTransform +{ + MatrixTransform(): mat(Mat4R::identity()), invMat(Mat4R::identity()) {} + MatrixTransform(const Mat4R& xform): mat(xform), invMat(xform.inverse()) {} + + bool isAffine() const { return math::isAffine(mat); } + + Vec3R transform(const Vec3R& pos) const { return mat.transformH(pos); } + + Vec3R invTransform(const Vec3R& pos) const { return invMat.transformH(pos); } + + Mat4R mat, invMat; +}; + + +//////////////////////////////////////// + + +/// @brief This class implements the Transformer functor interface (specifically, +/// the isAffine(), transform() and invTransform() methods) for a transform +/// that maps an A grid into a B grid's index space such that, after resampling, +/// A's index space and transform match B's index space and transform. +class ABTransform +{ +public: + /// @param aXform the A grid's transform + /// @param bXform the B grid's transform + ABTransform(const math::Transform& aXform, const math::Transform& bXform): + mAXform(aXform), + mBXform(bXform), + mIsAffine(mAXform.isLinear() && mBXform.isLinear()), + mIsIdentity(mIsAffine && mAXform == mBXform) + {} + + bool isAffine() const { return mIsAffine; } + + bool isIdentity() const { return mIsIdentity; } + + openvdb::Vec3R transform(const openvdb::Vec3R& pos) const + { + return mBXform.worldToIndex(mAXform.indexToWorld(pos)); + } + + openvdb::Vec3R invTransform(const openvdb::Vec3R& pos) const + { + return mAXform.worldToIndex(mBXform.indexToWorld(pos)); + } + + const math::Transform& getA() const { return mAXform; } + const math::Transform& getB() const { return mBXform; } + +private: + const math::Transform &mAXform, &mBXform; + const bool mIsAffine; + const bool mIsIdentity; +}; + + +/// The normal entry points for resampling are the resampleToMatch() functions, +/// which correctly handle level set grids under scaling and shearing. +/// doResampleToMatch() is mainly for internal use but is typically faster +/// for level sets, and correct provided that no scaling or shearing is needed. +/// +/// @warning Do not use this function to scale or shear a level set grid. +template +inline void +doResampleToMatch(const GridType& inGrid, GridType& outGrid, Interrupter& interrupter) +{ + ABTransform xform(inGrid.transform(), outGrid.transform()); + + if (Sampler::consistent() && xform.isIdentity()) { + // If the transforms of the input and output are identical, the + // output tree is simply a deep copy of the input tree. + outGrid.setTree(inGrid.tree().copy()); + } else if (xform.isAffine()) { + // If the input and output transforms are both affine, create an + // input to output transform (in:index-to-world * out:world-to-index) + // and use the fast GridTransformer API. + Mat4R mat = xform.getA().baseMap()->getAffineMap()->getMat4() * + ( xform.getB().baseMap()->getAffineMap()->getMat4().inverse() ); + + GridTransformer transformer(mat); + transformer.setInterrupter(interrupter); + + // Transform the input grid and store the result in the output grid. + transformer.transformGrid(inGrid, outGrid); + } else { + // If either the input or the output transform is non-affine, + // use the slower GridResampler API. + GridResampler resampler; + resampler.setInterrupter(interrupter); + + resampler.transformGrid(xform, inGrid, outGrid); + } +} + + +template +inline void +resampleToMatch(const GridType& inGrid, GridType& outGrid, Interrupter& interrupter) +{ + if (inGrid.getGridClass() == GRID_LEVEL_SET) { + // If the input grid is a level set, resample it using the level set rebuild tool. + + if (inGrid.constTransform() == outGrid.constTransform()) { + // If the transforms of the input and output grids are identical, + // the output tree is simply a deep copy of the input tree. + outGrid.setTree(inGrid.tree().copy()); + return; + } + + // If the output grid is a level set, resample the input grid to have the output grid's + // background value. Otherwise, preserve the input grid's background value. + typedef typename GridType::ValueType ValueT; + const ValueT halfWidth = ((outGrid.getGridClass() == openvdb::GRID_LEVEL_SET) + ? ValueT(outGrid.background() * (1.0 / outGrid.voxelSize()[0])) + : ValueT(inGrid.background() * (1.0 / inGrid.voxelSize()[0]))); + + typename GridType::Ptr tempGrid; + try { + tempGrid = doLevelSetRebuild(inGrid, /*iso=*/zeroVal(), + /*exWidth=*/halfWidth, /*inWidth=*/halfWidth, + &outGrid.constTransform(), &interrupter); + } catch (TypeError&) { + // The input grid is classified as a level set, but it has a value type + // that is not supported by the level set rebuild tool. Fall back to + // using the generic resampler. + tempGrid.reset(); + } + if (tempGrid) { + outGrid.setTree(tempGrid->treePtr()); + return; + } + } + + // If the input grid is not a level set, use the generic resampler. + doResampleToMatch(inGrid, outGrid, interrupter); +} + + +template +inline void +resampleToMatch(const GridType& inGrid, GridType& outGrid) +{ + util::NullInterrupter interrupter; + resampleToMatch(inGrid, outGrid, interrupter); +} + + +//////////////////////////////////////// + + +inline +GridTransformer::GridTransformer(const Mat4R& xform): + mPivot(0, 0, 0), + mMipLevels(0, 0, 0), + mTransform(xform), + mPreScaleTransform(Mat4R::identity()), + mPostScaleTransform(Mat4R::identity()) +{ + Vec3R scale, rotate, translate; + if (local_util::decompose(mTransform, scale, rotate, translate)) { + // If the transform can be decomposed into affine components, + // use them to set up a mipmapping-like scheme for downsampling. + init(mPivot, scale, rotate, translate, "srt", "zyx"); + } +} + + +inline +GridTransformer::GridTransformer( + const Vec3R& pivot, const Vec3R& scale, + const Vec3R& rotate, const Vec3R& translate, + const std::string& xformOrder, const std::string& rotOrder): + mPivot(0, 0, 0), + mMipLevels(0, 0, 0), + mPreScaleTransform(Mat4R::identity()), + mPostScaleTransform(Mat4R::identity()) +{ + init(pivot, scale, rotate, translate, xformOrder, rotOrder); +} + + +//////////////////////////////////////// + + +inline void +GridTransformer::init( + const Vec3R& pivot, const Vec3R& scale, + const Vec3R& rotate, const Vec3R& translate, + const std::string& xformOrder, const std::string& rotOrder) +{ + if (xformOrder.size() != 3) { + OPENVDB_THROW(ValueError, "invalid transform order (" + xformOrder + ")"); + } + if (rotOrder.size() != 3) { + OPENVDB_THROW(ValueError, "invalid rotation order (" + rotOrder + ")"); + } + + mPivot = pivot; + + // Scaling is handled via a mipmapping-like scheme of successive + // halvings of the tree resolution, until the remaining scale + // factor is greater than or equal to 1/2. + Vec3R scaleRemainder = scale; + for (int i = 0; i < 3; ++i) { + double s = std::fabs(scale(i)); + if (s < 0.5) { + mMipLevels(i) = int(std::floor(-std::log(s)/std::log(2.0))); + scaleRemainder(i) = scale(i) * (1 << mMipLevels(i)); + } + } + + // Build pre-scale and post-scale transform matrices based on + // the user-specified order of operations. + // Note that we iterate over the transform order string in reverse order + // (e.g., "t", "r", "s", given "srt"). This is because math::Mat matrices + // postmultiply row vectors rather than premultiplying column vectors. + mTransform = mPreScaleTransform = mPostScaleTransform = Mat4R::identity(); + Mat4R* remainder = &mPostScaleTransform; + int rpos, spos, tpos; + rpos = spos = tpos = 3; + for (int ix = 2; ix >= 0; --ix) { // reverse iteration + switch (xformOrder[ix]) { + + case 'r': + rpos = ix; + mTransform.preTranslate(pivot); + remainder->preTranslate(pivot); + + int xpos, ypos, zpos; + xpos = ypos = zpos = 3; + for (int ir = 2; ir >= 0; --ir) { + switch (rotOrder[ir]) { + case 'x': + xpos = ir; + mTransform.preRotate(math::X_AXIS, rotate.x()); + remainder->preRotate(math::X_AXIS, rotate.x()); + break; + case 'y': + ypos = ir; + mTransform.preRotate(math::Y_AXIS, rotate.y()); + remainder->preRotate(math::Y_AXIS, rotate.y()); + break; + case 'z': + zpos = ir; + mTransform.preRotate(math::Z_AXIS, rotate.z()); + remainder->preRotate(math::Z_AXIS, rotate.z()); + break; + } + } + // Reject rotation order strings that don't contain exactly one + // instance of "x", "y" and "z". + if (xpos > 2 || ypos > 2 || zpos > 2) { + OPENVDB_THROW(ValueError, "invalid rotation order (" + rotOrder + ")"); + } + + mTransform.preTranslate(-pivot); + remainder->preTranslate(-pivot); + break; + + case 's': + spos = ix; + mTransform.preTranslate(pivot); + mTransform.preScale(scale); + mTransform.preTranslate(-pivot); + + remainder->preTranslate(pivot); + remainder->preScale(scaleRemainder); + remainder->preTranslate(-pivot); + remainder = &mPreScaleTransform; + break; + + case 't': + tpos = ix; + mTransform.preTranslate(translate); + remainder->preTranslate(translate); + break; + } + } + // Reject transform order strings that don't contain exactly one + // instance of "t", "r" and "s". + if (tpos > 2 || rpos > 2 || spos > 2) { + OPENVDB_THROW(ValueError, "invalid transform order (" + xformOrder + ")"); + } +} + + +//////////////////////////////////////// + + +template +void +GridResampler::setInterrupter(InterrupterType& interrupter) +{ + mInterrupt = boost::bind(&InterrupterType::wasInterrupted, + /*this=*/&interrupter, /*percent=*/-1); +} + + +template +void +GridResampler::transformGrid(const Transformer& xform, + const GridT& inGrid, GridT& outGrid) const +{ + tools::changeBackground(outGrid.tree(), inGrid.background()); + applyTransform(xform, inGrid, outGrid); +} + + +template +void +GridTransformer::transformGrid(const GridT& inGrid, GridT& outGrid) const +{ + tools::changeBackground(outGrid.tree(), inGrid.background()); + + if (!Sampler::mipmap() || mMipLevels == Vec3i::zero()) { + // Skip the mipmapping step. + const MatrixTransform xform(mTransform); + applyTransform(xform, inGrid, outGrid); + + } else { + bool firstPass = true; + const typename GridT::ValueType background = inGrid.background(); + typename GridT::Ptr tempGrid = GridT::create(background); + + if (!mPreScaleTransform.eq(Mat4R::identity())) { + firstPass = false; + // Apply the pre-scale transform to the input grid + // and store the result in a temporary grid. + const MatrixTransform xform(mPreScaleTransform); + applyTransform(xform, inGrid, *tempGrid); + } + + // While the scale factor along one or more axes is less than 1/2, + // scale the grid by half along those axes. + Vec3i count = mMipLevels; // # of halvings remaining per axis + while (count != Vec3i::zero()) { + MatrixTransform xform; + xform.mat.setTranslation(mPivot); + xform.mat.preScale(Vec3R( + count.x() ? .5 : 1, count.y() ? .5 : 1, count.z() ? .5 : 1)); + xform.mat.preTranslate(-mPivot); + xform.invMat = xform.mat.inverse(); + + if (firstPass) { + firstPass = false; + // Scale the input grid and store the result in a temporary grid. + applyTransform(xform, inGrid, *tempGrid); + } else { + // Scale the temporary grid and store the result in a transient grid, + // then swap the two and discard the transient grid. + typename GridT::Ptr destGrid = GridT::create(background); + applyTransform(xform, *tempGrid, *destGrid); + tempGrid.swap(destGrid); + } + // (3, 2, 1) -> (2, 1, 0) -> (1, 0, 0) -> (0, 0, 0), etc. + count = math::maxComponent(count - 1, Vec3i::zero()); + } + + // Apply the post-scale transform and store the result in the output grid. + if (!mPostScaleTransform.eq(Mat4R::identity())) { + const MatrixTransform xform(mPostScaleTransform); + applyTransform(xform, *tempGrid, outGrid); + } else { + outGrid.setTree(tempGrid->treePtr()); + } + } +} + + +//////////////////////////////////////// + + +template +class GridResampler::RangeProcessor +{ +public: + typedef typename TreeT::LeafCIter LeafIterT; + typedef typename TreeT::ValueAllCIter TileIterT; + typedef typename tree::IteratorRange LeafRange; + typedef typename tree::IteratorRange TileRange; + typedef typename tree::ValueAccessor InTreeAccessor; + typedef typename tree::ValueAccessor OutTreeAccessor; + + RangeProcessor(const Transformer& xform, const CoordBBox& b, const TreeT& inT, TreeT& outT): + mIsRoot(true), mXform(xform), mBBox(b), + mInTree(inT), mOutTree(&outT), mInAcc(mInTree), mOutAcc(*mOutTree) + {} + + RangeProcessor(const Transformer& xform, const CoordBBox& b, const TreeT& inTree): + mIsRoot(false), mXform(xform), mBBox(b), + mInTree(inTree), mOutTree(new TreeT(inTree.background())), + mInAcc(mInTree), mOutAcc(*mOutTree) + {} + + ~RangeProcessor() { if (!mIsRoot) delete mOutTree; } + + /// Splitting constructor: don't copy the original processor's output tree + RangeProcessor(RangeProcessor& other, tbb::split): + mIsRoot(false), + mXform(other.mXform), + mBBox(other.mBBox), + mInTree(other.mInTree), + mOutTree(new TreeT(mInTree.background())), + mInAcc(mInTree), + mOutAcc(*mOutTree), + mInterrupt(other.mInterrupt) + {} + + void setInterrupt(const InterruptFunc& f) { mInterrupt = f; } + + /// Transform each leaf node in the given range. + void operator()(LeafRange& r) + { + for ( ; r; ++r) { + if (interrupt()) break; + LeafIterT i = r.iterator(); + CoordBBox bbox(i->origin(), i->origin() + Coord(i->dim())); + if (!mBBox.empty()) { + // Intersect the leaf node's bounding box with mBBox. + bbox = CoordBBox( + Coord::maxComponent(bbox.min(), mBBox.min()), + Coord::minComponent(bbox.max(), mBBox.max())); + } + if (!bbox.empty()) { + transformBBox(mXform, bbox, mInAcc, mOutAcc, mInterrupt); + } + } + } + + /// Transform each non-background tile in the given range. + void operator()(TileRange& r) + { + for ( ; r; ++r) { + if (interrupt()) break; + + TileIterT i = r.iterator(); + // Skip voxels and background tiles. + if (!i.isTileValue()) continue; + if (!i.isValueOn() && math::isApproxEqual(*i, mOutTree->background())) continue; + + CoordBBox bbox; + i.getBoundingBox(bbox); + if (!mBBox.empty()) { + // Intersect the tile's bounding box with mBBox. + bbox = CoordBBox( + Coord::maxComponent(bbox.min(), mBBox.min()), + Coord::minComponent(bbox.max(), mBBox.max())); + } + if (!bbox.empty()) { + /// @todo This samples the tile voxel-by-voxel, which is much too slow. + /// Instead, compute the largest axis-aligned bounding box that is + /// contained in the transformed tile (adjusted for the sampler radius) + /// and fill it with the tile value. Then transform the remaining voxels. + internal::TileSampler + sampler(bbox, i.getValue(), i.isValueOn()); + transformBBox(mXform, bbox, mInAcc, mOutAcc, mInterrupt, sampler); + } + } + } + + /// Merge another processor's output tree into this processor's tree. + void join(RangeProcessor& other) + { + if (!interrupt()) mOutTree->merge(*other.mOutTree); + } + +private: + bool interrupt() const { return mInterrupt && mInterrupt(); } + + const bool mIsRoot; // true if mOutTree is the top-level tree + Transformer mXform; + CoordBBox mBBox; + const TreeT& mInTree; + TreeT* mOutTree; + InTreeAccessor mInAcc; + OutTreeAccessor mOutAcc; + InterruptFunc mInterrupt; +}; + + +//////////////////////////////////////// + + +template +void +GridResampler::applyTransform(const Transformer& xform, + const GridT& inGrid, GridT& outGrid) const +{ + typedef typename GridT::TreeType TreeT; + const TreeT& inTree = inGrid.tree(); + TreeT& outTree = outGrid.tree(); + + typedef RangeProcessor RangeProc; + + const GridClass gridClass = inGrid.getGridClass(); + + if (gridClass != GRID_LEVEL_SET && mTransformTiles) { + // Independently transform the tiles of the input grid. + // Note: Tiles in level sets can only be background tiles, and they + // are handled more efficiently with a signed flood fill (see below). + + RangeProc proc(xform, CoordBBox(), inTree, outTree); + proc.setInterrupt(mInterrupt); + + typename RangeProc::TileIterT tileIter = inTree.cbeginValueAll(); + tileIter.setMaxDepth(tileIter.getLeafDepth() - 1); // skip leaf nodes + typename RangeProc::TileRange tileRange(tileIter); + + if (mThreaded) { + tbb::parallel_reduce(tileRange, proc); + } else { + proc(tileRange); + } + } + + CoordBBox clipBBox; + if (gridClass == GRID_LEVEL_SET) { + // Inactive voxels in level sets can only be background voxels, and they + // are handled more efficiently with a signed flood fill (see below). + clipBBox = inGrid.evalActiveVoxelBoundingBox(); + } + + // Independently transform the leaf nodes of the input grid. + + RangeProc proc(xform, clipBBox, inTree, outTree); + proc.setInterrupt(mInterrupt); + + typename RangeProc::LeafRange leafRange(inTree.cbeginLeaf()); + + if (mThreaded) { + tbb::parallel_reduce(leafRange, proc); + } else { + proc(leafRange); + } + + // If the grid is a level set, mark inactive voxels as inside or outside. + if (gridClass == GRID_LEVEL_SET) { + tools::pruneLevelSet(outTree); + tools::signedFloodFill(outTree); + } +} + + +//////////////////////////////////////// + + +//static +template +void +GridResampler::transformBBox( + const Transformer& xform, + const CoordBBox& bbox, + const InTreeT& inTree, + OutTreeT& outTree, + const InterruptFunc& interrupt, + const Sampler& sampler) +{ + typedef typename OutTreeT::ValueType ValueT; + + // Transform the corners of the input tree's bounding box + // and compute the enclosing bounding box in the output tree. + Vec3R + inRMin(bbox.min().x(), bbox.min().y(), bbox.min().z()), + inRMax(bbox.max().x(), bbox.max().y(), bbox.max().z()), + outRMin = math::minComponent(xform.transform(inRMin), xform.transform(inRMax)), + outRMax = math::maxComponent(xform.transform(inRMin), xform.transform(inRMax)); + for (int i = 0; i < 8; ++i) { + Vec3R corner( + i & 1 ? inRMax.x() : inRMin.x(), + i & 2 ? inRMax.y() : inRMin.y(), + i & 4 ? inRMax.z() : inRMin.z()); + outRMin = math::minComponent(outRMin, xform.transform(corner)); + outRMax = math::maxComponent(outRMax, xform.transform(corner)); + } + Vec3i + outMin = local_util::floorVec3(outRMin) - Sampler::radius(), + outMax = local_util::ceilVec3(outRMax) + Sampler::radius(); + + if (!xform.isAffine()) { + // If the transform is not affine, back-project each output voxel + // into the input tree. + Vec3R xyz, inXYZ; + Coord outXYZ; + int &x = outXYZ.x(), &y = outXYZ.y(), &z = outXYZ.z(); + for (x = outMin.x(); x <= outMax.x(); ++x) { + if (interrupt && interrupt()) break; + xyz.x() = x; + for (y = outMin.y(); y <= outMax.y(); ++y) { + if (interrupt && interrupt()) break; + xyz.y() = y; + for (z = outMin.z(); z <= outMax.z(); ++z) { + xyz.z() = z; + inXYZ = xform.invTransform(xyz); + ValueT result; + if (sampler.sample(inTree, inXYZ, result)) { + outTree.setValueOn(outXYZ, result); + } else { + // Note: Don't overwrite existing active values with inactive values. + if (!outTree.isValueOn(outXYZ)) { + outTree.setValueOff(outXYZ, result); + } + } + } + } + } + } else { // affine + // Compute step sizes in the input tree that correspond to + // unit steps in x, y and z in the output tree. + const Vec3R + translation = xform.invTransform(Vec3R(0, 0, 0)), + deltaX = xform.invTransform(Vec3R(1, 0, 0)) - translation, + deltaY = xform.invTransform(Vec3R(0, 1, 0)) - translation, + deltaZ = xform.invTransform(Vec3R(0, 0, 1)) - translation; + +#if defined(__ICC) + /// @todo The following line is a workaround for bad code generation + /// in opt-icc11.1_64 (but not debug or gcc) builds. It should be + /// removed once the problem has been addressed at its source. + const Vec3R dummy = deltaX; +#endif + + // Step by whole voxels through the output tree, sampling the + // corresponding fractional voxels of the input tree. + Vec3R inStartX = xform.invTransform(Vec3R(outMin)); + Coord outXYZ; + int &x = outXYZ.x(), &y = outXYZ.y(), &z = outXYZ.z(); + for (x = outMin.x(); x <= outMax.x(); ++x, inStartX += deltaX) { + if (interrupt && interrupt()) break; + Vec3R inStartY = inStartX; + for (y = outMin.y(); y <= outMax.y(); ++y, inStartY += deltaY) { + if (interrupt && interrupt()) break; + Vec3R inXYZ = inStartY; + for (z = outMin.z(); z <= outMax.z(); ++z, inXYZ += deltaZ) { + ValueT result; + if (sampler.sample(inTree, inXYZ, result)) { + outTree.setValueOn(outXYZ, result); + } else { + // Note: Don't overwrite existing active values with inactive values. + if (!outTree.isValueOn(outXYZ)) { + outTree.setValueOff(outXYZ, result); + } + } + } + } + } + } +} // GridResampler::transformBBox() + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_GRIDTRANSFORMER_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/Interpolation.h b/nuparu/include/openvdb/include/openvdb/tools/Interpolation.h new file mode 100644 index 00000000..81decbad --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/Interpolation.h @@ -0,0 +1,1040 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file Interpolation.h +/// +/// Sampler classes such as PointSampler and BoxSampler that are intended for use +/// with tools::GridTransformer should operate in voxel space and must adhere to +/// the interface described in the example below: +/// @code +/// struct MySampler +/// { +/// // Return a short name that can be used to identify this sampler +/// // in error messages and elsewhere. +/// const char* name() { return "mysampler"; } +/// +/// // Return the radius of the sampling kernel in voxels, not including +/// // the center voxel. This is the number of voxels of padding that +/// // are added to all sides of a volume as a result of resampling. +/// int radius() { return 2; } +/// +/// // Return true if scaling by a factor smaller than 0.5 (along any axis) +/// // should be handled via a mipmapping-like scheme of successive halvings +/// // of a grid's resolution, until the remaining scale factor is +/// // greater than or equal to 1/2. Set this to false only when high-quality +/// // scaling is not required. +/// bool mipmap() { return true; } +/// +/// // Specify if sampling at a location that is collocated with a grid point +/// // is guaranteed to return the exact value at that grid point. +/// // For most sampling kernels, this should be false. +/// bool consistent() { return false; } +/// +/// // Sample the tree at the given coordinates and return the result in val. +/// // Return true if the sampled value is active. +/// template +/// bool sample(const TreeT& tree, const Vec3R& coord, typename TreeT::ValueType& val); +/// }; +/// @endcode + +#ifndef OPENVDB_TOOLS_INTERPOLATION_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_INTERPOLATION_HAS_BEEN_INCLUDED + +#include +#include +#include // for OPENVDB_VERSION_NAME +#include // for round() +#include // for SmoothUnitStep +#include // for Transform +#include +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief Provises a unified interface for sampling, i.e. interpolation. +/// @details Order = 0: closest point +/// Order = 1: tri-linear +/// Order = 2: tri-quadratic +/// Staggered: Set to true for MAC grids +template +struct Sampler +{ + BOOST_STATIC_ASSERT(Order < 3); + static const char* name(); + static int radius(); + static bool mipmap(); + static bool consistent(); + static bool staggered(); + static size_t order(); + + /// @brief Sample @a inTree at the floating-point index coordinate @a inCoord + /// and store the result in @a result. + /// + /// @return @c true if the sampled value is active. + template + static bool sample(const TreeT& inTree, const Vec3R& inCoord, + typename TreeT::ValueType& result); + + /// @brief Sample @a inTree at the floating-point index coordinate @a inCoord. + /// + /// @return the reconstructed value + template + static typename TreeT::ValueType sample(const TreeT& inTree, const Vec3R& inCoord); +}; + +//////////////////////////////////////// Non-Staggered Samplers + +// The following samplers operate in voxel space. +// When the samplers are applied to grids holding vector or other non-scalar data, +// the data is assumed to be collocated. For example, using the BoxSampler on a grid +// with ValueType Vec3f assumes that all three elements in a vector can be assigned +// the same physical location. Consider using the GridSampler below instead. + +struct PointSampler +{ + static const char* name() { return "point"; } + static int radius() { return 0; } + static bool mipmap() { return false; } + static bool consistent() { return true; } + static bool staggered() { return false; } + static size_t order() { return 0; } + + /// @brief Sample @a inTree at the nearest neighbor to @a inCoord + /// and store the result in @a result. + /// @return @c true if the sampled value is active. + template + static bool sample(const TreeT& inTree, const Vec3R& inCoord, + typename TreeT::ValueType& result); + + /// @brief Sample @a inTree at the nearest neighbor to @a inCoord + /// @return the reconstructed value + template + static typename TreeT::ValueType sample(const TreeT& inTree, const Vec3R& inCoord); +}; + + +struct BoxSampler +{ + static const char* name() { return "box"; } + static int radius() { return 1; } + static bool mipmap() { return true; } + static bool consistent() { return true; } + static bool staggered() { return false; } + static size_t order() { return 1; } + + /// @brief Trilinearly reconstruct @a inTree at @a inCoord + /// and store the result in @a result. + /// @return @c true if any one of the sampled values is active. + template + static bool sample(const TreeT& inTree, const Vec3R& inCoord, + typename TreeT::ValueType& result); + + /// @brief Trilinearly reconstruct @a inTree at @a inCoord. + /// @return the reconstructed value + template + static typename TreeT::ValueType sample(const TreeT& inTree, const Vec3R& inCoord); + + /// @brief Import all eight values from @a inTree to support + /// tri-linear interpolation. + template + static inline void getValues(ValueT (&data)[N][N][N], const TreeT& inTree, Coord ijk); + + /// @brief Import all eight values from @a inTree to support + /// tri-linear interpolation. + /// @return @c true if any of the eight values are active + template + static inline bool probeValues(ValueT (&data)[N][N][N], const TreeT& inTree, Coord ijk); + + /// @brief Find the minimum and maximum values of the eight cell + /// values in @ data. + template + static inline void extrema(ValueT (&data)[N][N][N], ValueT& vMin, ValueT& vMax); + + /// @return the tri-linear interpolation with the unit cell coordinates @a uvw + template + static inline ValueT trilinearInterpolation(ValueT (&data)[N][N][N], const Vec3R& uvw); +}; + + +struct QuadraticSampler +{ + static const char* name() { return "quadratic"; } + static int radius() { return 1; } + static bool mipmap() { return true; } + static bool consistent() { return false; } + static bool staggered() { return false; } + static size_t order() { return 2; } + + /// @brief Triquadratically reconstruct @a inTree at @a inCoord + /// and store the result in @a result. + /// @return @c true if any one of the sampled values is active. + template + static bool sample(const TreeT& inTree, const Vec3R& inCoord, + typename TreeT::ValueType& result); + + /// @brief Triquadratically reconstruct @a inTree at to @a inCoord. + /// @return the reconstructed value + template + static typename TreeT::ValueType sample(const TreeT& inTree, const Vec3R& inCoord); + + template + static inline ValueT triquadraticInterpolation(ValueT (&data)[N][N][N], const Vec3R& uvw); +}; + + +//////////////////////////////////////// Staggered Samplers + + +// The following samplers operate in voxel space and are designed for Vec3 +// staggered grid data (e.g., fluid simulations using the Marker-and-Cell approach +// associate elements of the velocity vector with different physical locations: +// the faces of a cube). + +struct StaggeredPointSampler +{ + static const char* name() { return "point"; } + static int radius() { return 0; } + static bool mipmap() { return false; } + static bool consistent() { return false; } + static bool staggered() { return true; } + static size_t order() { return 0; } + + /// @brief Sample @a inTree at the nearest neighbor to @a inCoord + /// and store the result in @a result. + /// @return true if the sampled value is active. + template + static bool sample(const TreeT& inTree, const Vec3R& inCoord, + typename TreeT::ValueType& result); + + /// @brief Sample @a inTree at the nearest neighbor to @a inCoord + /// @return the reconstructed value + template + static typename TreeT::ValueType sample(const TreeT& inTree, const Vec3R& inCoord); +}; + + +struct StaggeredBoxSampler +{ + static const char* name() { return "box"; } + static int radius() { return 1; } + static bool mipmap() { return true; } + static bool consistent() { return false; } + static bool staggered() { return true; } + static size_t order() { return 1; } + + /// @brief Trilinearly reconstruct @a inTree at @a inCoord + /// and store the result in @a result. + /// @return true if any one of the sampled value is active. + template + static bool sample(const TreeT& inTree, const Vec3R& inCoord, + typename TreeT::ValueType& result); + + /// @brief Trilinearly reconstruct @a inTree at @a inCoord. + /// @return the reconstructed value + template + static typename TreeT::ValueType sample(const TreeT& inTree, const Vec3R& inCoord); +}; + + +struct StaggeredQuadraticSampler +{ + static const char* name() { return "quadratic"; } + static int radius() { return 1; } + static bool mipmap() { return true; } + static bool consistent() { return false; } + static bool staggered() { return true; } + static size_t order() { return 2; } + + /// @brief Triquadratically reconstruct @a inTree at @a inCoord + /// and store the result in @a result. + /// @return true if any one of the sampled values is active. + template + static bool sample(const TreeT& inTree, const Vec3R& inCoord, + typename TreeT::ValueType& result); + + /// @brief Triquadratically reconstruct @a inTree at to @a inCoord. + /// @return the reconstructed value + template + static typename TreeT::ValueType sample(const TreeT& inTree, const Vec3R& inCoord); +}; + + +//////////////////////////////////////// GridSampler + + +/// @brief Class that provides the interface for continuous sampling +/// of values in a tree. +/// +/// @details Since trees support only discrete voxel sampling, TreeSampler +/// must be used to sample arbitrary continuous points in (world or +/// index) space. +/// +/// @warning This implementation of the GridSampler stores a pointer +/// to a Tree for value access. While this is thread-safe it is +/// uncached and hence slow compared to using a +/// ValueAccessor. Consequently it is normally advisable to use the +/// template specialization below that employs a +/// ValueAccessor. However, care must be taken when dealing with +/// multi-threading (see warning below). +template +class GridSampler +{ +public: + typedef boost::shared_ptr Ptr; + typedef typename GridOrTreeType::ValueType ValueType; + typedef typename TreeAdapter::GridType GridType; + typedef typename TreeAdapter::TreeType TreeType; + typedef typename TreeAdapter::AccessorType AccessorType; + + /// @param grid a grid to be sampled + explicit GridSampler(const GridType& grid) + : mTree(&(grid.tree())), mTransform(&(grid.transform())) {} + + /// @param tree a tree to be sampled, or a ValueAccessor for the tree + /// @param transform is used when sampling world space locations. + GridSampler(const TreeType& tree, const math::Transform& transform) + : mTree(&tree), mTransform(&transform) {} + + const math::Transform& transform() const { return *mTransform; } + + /// @brief Sample a point in index space in the grid. + /// @param x Fractional x-coordinate of point in index-coordinates of grid + /// @param y Fractional y-coordinate of point in index-coordinates of grid + /// @param z Fractional z-coordinate of point in index-coordinates of grid + template + ValueType sampleVoxel(const RealType& x, const RealType& y, const RealType& z) const + { + return this->isSample(Vec3d(x,y,z)); + } + + /// @brief Sample value in integer index space + /// @param i Integer x-coordinate in index space + /// @param j Integer y-coordinate in index space + /// @param k Integer x-coordinate in index space + ValueType sampleVoxel(typename Coord::ValueType i, + typename Coord::ValueType j, + typename Coord::ValueType k) const + { + return this->isSample(Coord(i,j,k)); + } + + /// @brief Sample value in integer index space + /// @param ijk the location in index space + ValueType isSample(const Coord& ijk) const { return mTree->getValue(ijk); } + + /// @brief Sample in fractional index space + /// @param ispoint the location in index space + ValueType isSample(const Vec3d& ispoint) const + { + ValueType result = zeroVal(); + SamplerType::sample(*mTree, ispoint, result); + return result; + } + + /// @brief Sample in world space + /// @param wspoint the location in world space + ValueType wsSample(const Vec3d& wspoint) const + { + ValueType result = zeroVal(); + SamplerType::sample(*mTree, mTransform->worldToIndex(wspoint), result); + return result; + } + +private: + const TreeType* mTree; + const math::Transform* mTransform; +}; // class GridSampler + + +/// @brief Specialization of GridSampler for construction from a ValueAccessor type +/// +/// @note This version should normally be favored over the one above +/// that takes a Grid or Tree. The reason is this version uses a +/// ValueAccessor that performs fast (cached) access where the +/// tree-based flavor performs slower (uncached) access. +/// +/// @warning Since this version stores a pointer to an (externally +/// allocated) value accessor it is not threadsafe. Hence each thread +/// should have its own instance of a GridSampler constructed from a +/// local ValueAccessor. Alternatively the Grid/Tree-based GridSampler +/// is threadsafe, but also slower. +template +class GridSampler, SamplerType> +{ +public: + typedef boost::shared_ptr Ptr; + typedef typename TreeT::ValueType ValueType; + typedef TreeT TreeType; + typedef Grid GridType; + typedef typename tree::ValueAccessor AccessorType; + + /// @param acc a ValueAccessor to be sampled + /// @param transform is used when sampling world space locations. + GridSampler(const AccessorType& acc, + const math::Transform& transform) + : mAccessor(&acc), mTransform(&transform) {} + + const math::Transform& transform() const { return *mTransform; } + + /// @brief Sample a point in index space in the grid. + /// @param x Fractional x-coordinate of point in index-coordinates of grid + /// @param y Fractional y-coordinate of point in index-coordinates of grid + /// @param z Fractional z-coordinate of point in index-coordinates of grid + template + ValueType sampleVoxel(const RealType& x, const RealType& y, const RealType& z) const + { + return this->isSample(Vec3d(x,y,z)); + } + + /// @brief Sample value in integer index space + /// @param i Integer x-coordinate in index space + /// @param j Integer y-coordinate in index space + /// @param k Integer x-coordinate in index space + ValueType sampleVoxel(typename Coord::ValueType i, + typename Coord::ValueType j, + typename Coord::ValueType k) const + { + return this->isSample(Coord(i,j,k)); + } + + /// @brief Sample value in integer index space + /// @param ijk the location in index space + ValueType isSample(const Coord& ijk) const { return mAccessor->getValue(ijk); } + + /// @brief Sample in fractional index space + /// @param ispoint the location in index space + ValueType isSample(const Vec3d& ispoint) const + { + ValueType result = zeroVal(); + SamplerType::sample(*mAccessor, ispoint, result); + return result; + } + + /// @brief Sample in world space + /// @param wspoint the location in world space + ValueType wsSample(const Vec3d& wspoint) const + { + ValueType result = zeroVal(); + SamplerType::sample(*mAccessor, mTransform->worldToIndex(wspoint), result); + return result; + } + +private: + const AccessorType* mAccessor;//not thread-safe! + const math::Transform* mTransform; +};//Specialization of GridSampler + + +//////////////////////////////////////// DualGridSampler + + +/// @brief This is a simple convenience class that allows for sampling +/// from a source grid into the index space of a target grid. At +/// construction the source and target grids are checked for alignment +/// which potentially renders interpolation unnecessary. Else +/// interpolation is performed according to the templated Sampler +/// type. +/// +/// @warning For performance reasons the check for alignment of the +/// two grids is only performed at construction time! +template +class DualGridSampler +{ +public: + typedef typename GridOrTreeT::ValueType ValueType; + typedef typename TreeAdapter::GridType GridType; + typedef typename TreeAdapter::TreeType TreeType; + typedef typename TreeAdapter::AccessorType AccessorType; + + /// @brief Grid and transform constructor. + /// @param sourceGrid Source grid. + /// @param targetXform Transform of the target grid. + DualGridSampler(const GridType& sourceGrid, + const math::Transform& targetXform) + : mSourceTree(&(sourceGrid.tree())) + , mSourceXform(&(sourceGrid.transform())) + , mTargetXform(&targetXform) + , mAligned(targetXform == *mSourceXform) + { + } + /// @brief Tree and transform constructor. + /// @param sourceTree Source tree. + /// @param sourceXform Transform of the source grid. + /// @param targetXform Transform of the target grid. + DualGridSampler(const TreeType& sourceTree, + const math::Transform& sourceXform, + const math::Transform& targetXform) + : mSourceTree(&sourceTree) + , mSourceXform(&sourceXform) + , mTargetXform(&targetXform) + , mAligned(targetXform == sourceXform) + { + } + /// @brief Return the value of the source grid at the index + /// coordinates, ijk, relative to the target grid (or its tranform). + inline ValueType operator()(const Coord& ijk) const + { + if (mAligned) return mSourceTree->getValue(ijk); + const Vec3R world = mTargetXform->indexToWorld(ijk); + return SamplerT::sample(*mSourceTree, mSourceXform->worldToIndex(world)); + } + /// @brief Return true if the two grids are aligned. + inline bool isAligned() const { return mAligned; } +private: + const TreeType* mSourceTree; + const math::Transform* mSourceXform; + const math::Transform* mTargetXform; + const bool mAligned; +};// DualGridSampler + +/// @brief Specialization of DualGridSampler for construction from a ValueAccessor type. +template +class DualGridSampler, SamplerT> +{ + public: + typedef typename TreeT::ValueType ValueType; + typedef TreeT TreeType; + typedef Grid GridType; + typedef typename tree::ValueAccessor AccessorType; + + /// @brief ValueAccessor and transform constructor. + /// @param sourceAccessor ValueAccessor into the source grid. + /// @param sourceXform Transform for the source grid. + /// @param targetXform Transform for the target grid. + DualGridSampler(const AccessorType& sourceAccessor, + const math::Transform& sourceXform, + const math::Transform& targetXform) + : mSourceAcc(&sourceAccessor) + , mSourceXform(&sourceXform) + , mTargetXform(&targetXform) + , mAligned(targetXform == sourceXform) + { + } + /// @brief Return the value of the source grid at the index + /// coordinates, ijk, relative to the target grid. + inline ValueType operator()(const Coord& ijk) const + { + if (mAligned) return mSourceAcc->getValue(ijk); + const Vec3R world = mTargetXform->indexToWorld(ijk); + return SamplerT::sample(*mSourceAcc, mSourceXform->worldToIndex(world)); + } + /// @brief Return true if the two grids are aligned. + inline bool isAligned() const { return mAligned; } +private: + const AccessorType* mSourceAcc; + const math::Transform* mSourceXform; + const math::Transform* mTargetXform; + const bool mAligned; +};//Specialization of DualGridSampler + +//////////////////////////////////////// AlphaMask + + +// Class to derive the normalized alpha mask +template +class AlphaMask +{ +public: + BOOST_STATIC_ASSERT(boost::is_floating_point::value); + typedef GridT GridType; + typedef MaskT MaskType; + typedef SamplerT SamlerType; + typedef FloatT FloatType; + + AlphaMask(const GridT& grid, const MaskT& mask, FloatT min, FloatT max, bool invert) + : mAcc(mask.tree()) + , mSampler(mAcc, mask.transform() , grid.transform()) + , mMin(min) + , mInvNorm(1/(max-min)) + , mInvert(invert) + { + assert(min < max); + } + + inline bool operator()(const Coord& xyz, FloatT& a, FloatT& b) const + { + a = math::SmoothUnitStep( (mSampler(xyz) - mMin) * mInvNorm );//smooth mapping to 0->1 + b = 1 - a; + if (mInvert) std::swap(a,b); + return a>0; + } + +protected: + typedef typename MaskType::ConstAccessor AccT; + AccT mAcc; + tools::DualGridSampler mSampler; + const FloatT mMin, mInvNorm; + const bool mInvert; +};// AlphaMask + +//////////////////////////////////////// + +namespace local_util { + +inline Vec3i +floorVec3(const Vec3R& v) +{ + return Vec3i(int(std::floor(v(0))), int(std::floor(v(1))), int(std::floor(v(2)))); +} + + +inline Vec3i +ceilVec3(const Vec3R& v) +{ + return Vec3i(int(std::ceil(v(0))), int(std::ceil(v(1))), int(std::ceil(v(2)))); +} + + +inline Vec3i +roundVec3(const Vec3R& v) +{ + return Vec3i(int(::round(v(0))), int(::round(v(1))), int(::round(v(2)))); +} + +} // namespace local_util + + +//////////////////////////////////////// PointSampler + + +template +inline bool +PointSampler::sample(const TreeT& inTree, const Vec3R& inCoord, + typename TreeT::ValueType& result) +{ + return inTree.probeValue(Coord(local_util::roundVec3(inCoord)), result); +} + +template +inline typename TreeT::ValueType +PointSampler::sample(const TreeT& inTree, const Vec3R& inCoord) +{ + return inTree.getValue(Coord(local_util::roundVec3(inCoord))); +} + + +//////////////////////////////////////// BoxSampler + +template +inline void +BoxSampler::getValues(ValueT (&data)[N][N][N], const TreeT& inTree, Coord ijk) +{ + data[0][0][0] = inTree.getValue(ijk); // i, j, k + + ijk[2] += 1; + data[0][0][1] = inTree.getValue(ijk); // i, j, k + 1 + + ijk[1] += 1; + data[0][1][1] = inTree.getValue(ijk); // i, j+1, k + 1 + + ijk[2] -= 1; + data[0][1][0] = inTree.getValue(ijk); // i, j+1, k + + ijk[0] += 1; + ijk[1] -= 1; + data[1][0][0] = inTree.getValue(ijk); // i+1, j, k + + ijk[2] += 1; + data[1][0][1] = inTree.getValue(ijk); // i+1, j, k + 1 + + ijk[1] += 1; + data[1][1][1] = inTree.getValue(ijk); // i+1, j+1, k + 1 + + ijk[2] -= 1; + data[1][1][0] = inTree.getValue(ijk); // i+1, j+1, k +} + +template +inline bool +BoxSampler::probeValues(ValueT (&data)[N][N][N], const TreeT& inTree, Coord ijk) +{ + bool hasActiveValues = false; + hasActiveValues |= inTree.probeValue(ijk, data[0][0][0]); // i, j, k + + ijk[2] += 1; + hasActiveValues |= inTree.probeValue(ijk, data[0][0][1]); // i, j, k + 1 + + ijk[1] += 1; + hasActiveValues |= inTree.probeValue(ijk, data[0][1][1]); // i, j+1, k + 1 + + ijk[2] -= 1; + hasActiveValues |= inTree.probeValue(ijk, data[0][1][0]); // i, j+1, k + + ijk[0] += 1; + ijk[1] -= 1; + hasActiveValues |= inTree.probeValue(ijk, data[1][0][0]); // i+1, j, k + + ijk[2] += 1; + hasActiveValues |= inTree.probeValue(ijk, data[1][0][1]); // i+1, j, k + 1 + + ijk[1] += 1; + hasActiveValues |= inTree.probeValue(ijk, data[1][1][1]); // i+1, j+1, k + 1 + + ijk[2] -= 1; + hasActiveValues |= inTree.probeValue(ijk, data[1][1][0]); // i+1, j+1, k + + return hasActiveValues; +} + +template +inline void +BoxSampler::extrema(ValueT (&data)[N][N][N], ValueT& vMin, ValueT &vMax) +{ + vMin = vMax = data[0][0][0]; + vMin = math::Min(vMin, data[0][0][1]); + vMax = math::Max(vMax, data[0][0][1]); + vMin = math::Min(vMin, data[0][1][0]); + vMax = math::Max(vMax, data[0][1][0]); + vMin = math::Min(vMin, data[0][1][1]); + vMax = math::Max(vMax, data[0][1][1]); + vMin = math::Min(vMin, data[1][0][0]); + vMax = math::Max(vMax, data[1][0][0]); + vMin = math::Min(vMin, data[1][0][1]); + vMax = math::Max(vMax, data[1][0][1]); + vMin = math::Min(vMin, data[1][1][0]); + vMax = math::Max(vMax, data[1][1][0]); + vMin = math::Min(vMin, data[1][1][1]); + vMax = math::Max(vMax, data[1][1][1]); +} + + +template +inline ValueT +BoxSampler::trilinearInterpolation(ValueT (&data)[N][N][N], const Vec3R& uvw) +{ + // Trilinear interpolation: + // The eight surrounding latice values are used to construct the result. \n + // result(x,y,z) = + // v000 (1-x)(1-y)(1-z) + v001 (1-x)(1-y)z + v010 (1-x)y(1-z) + v011 (1-x)yz + // + v100 x(1-y)(1-z) + v101 x(1-y)z + v110 xy(1-z) + v111 xyz + + ValueT resultA, resultB; + + resultA = data[0][0][0] + ValueT((data[0][0][1] - data[0][0][0]) * uvw[2]); + resultB = data[0][1][0] + ValueT((data[0][1][1] - data[0][1][0]) * uvw[2]); + ValueT result1 = resultA + ValueT((resultB-resultA) * uvw[1]); + + resultA = data[1][0][0] + ValueT((data[1][0][1] - data[1][0][0]) * uvw[2]); + resultB = data[1][1][0] + ValueT((data[1][1][1] - data[1][1][0]) * uvw[2]); + ValueT result2 = resultA + ValueT((resultB - resultA) * uvw[1]); + + return result1 + ValueT(uvw[0] * (result2 - result1)); +} + + +template +inline bool +BoxSampler::sample(const TreeT& inTree, const Vec3R& inCoord, + typename TreeT::ValueType& result) +{ + typedef typename TreeT::ValueType ValueT; + + const Vec3i inIdx = local_util::floorVec3(inCoord); + const Vec3R uvw = inCoord - inIdx; + + // Retrieve the values of the eight voxels surrounding the + // fractional source coordinates. + ValueT data[2][2][2]; + + const bool hasActiveValues = BoxSampler::probeValues(data, inTree, Coord(inIdx)); + + result = BoxSampler::trilinearInterpolation(data, uvw); + + return hasActiveValues; +} + + +template +inline typename TreeT::ValueType +BoxSampler::sample(const TreeT& inTree, const Vec3R& inCoord) +{ + typedef typename TreeT::ValueType ValueT; + + const Vec3i inIdx = local_util::floorVec3(inCoord); + const Vec3R uvw = inCoord - inIdx; + + // Retrieve the values of the eight voxels surrounding the + // fractional source coordinates. + ValueT data[2][2][2]; + + BoxSampler::getValues(data, inTree, Coord(inIdx)); + + return BoxSampler::trilinearInterpolation(data, uvw); +} + + +//////////////////////////////////////// QuadraticSampler + +template +inline ValueT +QuadraticSampler::triquadraticInterpolation(ValueT (&data)[N][N][N], const Vec3R& uvw) +{ + /// @todo For vector types, interpolate over each component independently. + ValueT vx[3]; + for (int dx = 0; dx < 3; ++dx) { + ValueT vy[3]; + for (int dy = 0; dy < 3; ++dy) { + // Fit a parabola to three contiguous samples in z + // (at z=-1, z=0 and z=1), then evaluate the parabola at z', + // where z' is the fractional part of inCoord.z, i.e., + // inCoord.z - inIdx.z. The coefficients come from solving + // + // | (-1)^2 -1 1 || a | | v0 | + // | 0 0 1 || b | = | v1 | + // | 1^2 1 1 || c | | v2 | + // + // for a, b and c. + const ValueT* vz = &data[dx][dy][0]; + const ValueT + az = static_cast(0.5 * (vz[0] + vz[2]) - vz[1]), + bz = static_cast(0.5 * (vz[2] - vz[0])), + cz = static_cast(vz[1]); + vy[dy] = static_cast(uvw.z() * (uvw.z() * az + bz) + cz); + }//loop over y + // Fit a parabola to three interpolated samples in y, then + // evaluate the parabola at y', where y' is the fractional + // part of inCoord.y. + const ValueT + ay = static_cast(0.5 * (vy[0] + vy[2]) - vy[1]), + by = static_cast(0.5 * (vy[2] - vy[0])), + cy = static_cast(vy[1]); + vx[dx] = static_cast(uvw.y() * (uvw.y() * ay + by) + cy); + }//loop over x + // Fit a parabola to three interpolated samples in x, then + // evaluate the parabola at the fractional part of inCoord.x. + const ValueT + ax = static_cast(0.5 * (vx[0] + vx[2]) - vx[1]), + bx = static_cast(0.5 * (vx[2] - vx[0])), + cx = static_cast(vx[1]); + return static_cast(uvw.x() * (uvw.x() * ax + bx) + cx); +} + +template +inline bool +QuadraticSampler::sample(const TreeT& inTree, const Vec3R& inCoord, + typename TreeT::ValueType& result) +{ + typedef typename TreeT::ValueType ValueT; + + const Vec3i inIdx = local_util::floorVec3(inCoord), inLoIdx = inIdx - Vec3i(1, 1, 1); + const Vec3R uvw = inCoord - inIdx; + + // Retrieve the values of the 27 voxels surrounding the + // fractional source coordinates. + bool active = false; + ValueT data[3][3][3]; + for (int dx = 0, ix = inLoIdx.x(); dx < 3; ++dx, ++ix) { + for (int dy = 0, iy = inLoIdx.y(); dy < 3; ++dy, ++iy) { + for (int dz = 0, iz = inLoIdx.z(); dz < 3; ++dz, ++iz) { + if (inTree.probeValue(Coord(ix, iy, iz), data[dx][dy][dz])) active = true; + } + } + } + + result = QuadraticSampler::triquadraticInterpolation(data, uvw); + + return active; +} + +template +inline typename TreeT::ValueType +QuadraticSampler::sample(const TreeT& inTree, const Vec3R& inCoord) +{ + typedef typename TreeT::ValueType ValueT; + + const Vec3i inIdx = local_util::floorVec3(inCoord), inLoIdx = inIdx - Vec3i(1, 1, 1); + const Vec3R uvw = inCoord - inIdx; + + // Retrieve the values of the 27 voxels surrounding the + // fractional source coordinates. + ValueT data[3][3][3]; + for (int dx = 0, ix = inLoIdx.x(); dx < 3; ++dx, ++ix) { + for (int dy = 0, iy = inLoIdx.y(); dy < 3; ++dy, ++iy) { + for (int dz = 0, iz = inLoIdx.z(); dz < 3; ++dz, ++iz) { + data[dx][dy][dz] = inTree.getValue(Coord(ix, iy, iz)); + } + } + } + + return QuadraticSampler::triquadraticInterpolation(data, uvw); +} + + +//////////////////////////////////////// StaggeredPointSampler + + +template +inline bool +StaggeredPointSampler::sample(const TreeT& inTree, const Vec3R& inCoord, + typename TreeT::ValueType& result) +{ + typedef typename TreeT::ValueType ValueType; + + ValueType tempX, tempY, tempZ; + bool active = false; + + active = PointSampler::sample(inTree, inCoord + Vec3R(0.5, 0, 0), tempX) || active; + active = PointSampler::sample(inTree, inCoord + Vec3R(0, 0.5, 0), tempY) || active; + active = PointSampler::sample(inTree, inCoord + Vec3R(0, 0, 0.5), tempZ) || active; + + result.x() = tempX.x(); + result.y() = tempY.y(); + result.z() = tempZ.z(); + + return active; +} + +template +inline typename TreeT::ValueType +StaggeredPointSampler::sample(const TreeT& inTree, const Vec3R& inCoord) +{ + typedef typename TreeT::ValueType ValueT; + + const ValueT tempX = PointSampler::sample(inTree, inCoord + Vec3R(0.5, 0.0, 0.0)); + const ValueT tempY = PointSampler::sample(inTree, inCoord + Vec3R(0.0, 0.5, 0.0)); + const ValueT tempZ = PointSampler::sample(inTree, inCoord + Vec3R(0.0, 0.0, 0.5)); + + return ValueT(tempX.x(), tempY.y(), tempZ.z()); +} + + +//////////////////////////////////////// StaggeredBoxSampler + + +template +inline bool +StaggeredBoxSampler::sample(const TreeT& inTree, const Vec3R& inCoord, + typename TreeT::ValueType& result) +{ + typedef typename TreeT::ValueType ValueType; + + ValueType tempX, tempY, tempZ; + tempX = tempY = tempZ = zeroVal(); + bool active = false; + + active = BoxSampler::sample(inTree, inCoord + Vec3R(0.5, 0, 0), tempX) || active; + active = BoxSampler::sample(inTree, inCoord + Vec3R(0, 0.5, 0), tempY) || active; + active = BoxSampler::sample(inTree, inCoord + Vec3R(0, 0, 0.5), tempZ) || active; + + result.x() = tempX.x(); + result.y() = tempY.y(); + result.z() = tempZ.z(); + + return active; +} + +template +inline typename TreeT::ValueType +StaggeredBoxSampler::sample(const TreeT& inTree, const Vec3R& inCoord) +{ + typedef typename TreeT::ValueType ValueT; + + const ValueT tempX = BoxSampler::sample(inTree, inCoord + Vec3R(0.5, 0.0, 0.0)); + const ValueT tempY = BoxSampler::sample(inTree, inCoord + Vec3R(0.0, 0.5, 0.0)); + const ValueT tempZ = BoxSampler::sample(inTree, inCoord + Vec3R(0.0, 0.0, 0.5)); + + return ValueT(tempX.x(), tempY.y(), tempZ.z()); +} + + +//////////////////////////////////////// StaggeredQuadraticSampler + + +template +inline bool +StaggeredQuadraticSampler::sample(const TreeT& inTree, const Vec3R& inCoord, + typename TreeT::ValueType& result) +{ + typedef typename TreeT::ValueType ValueType; + + ValueType tempX, tempY, tempZ; + bool active = false; + + active = QuadraticSampler::sample(inTree, inCoord + Vec3R(0.5, 0, 0), tempX) || active; + active = QuadraticSampler::sample(inTree, inCoord + Vec3R(0, 0.5, 0), tempY) || active; + active = QuadraticSampler::sample(inTree, inCoord + Vec3R(0, 0, 0.5), tempZ) || active; + + result.x() = tempX.x(); + result.y() = tempY.y(); + result.z() = tempZ.z(); + + return active; +} + +template +inline typename TreeT::ValueType +StaggeredQuadraticSampler::sample(const TreeT& inTree, const Vec3R& inCoord) +{ + typedef typename TreeT::ValueType ValueT; + + const ValueT tempX = QuadraticSampler::sample(inTree, inCoord + Vec3R(0.5, 0.0, 0.0)); + const ValueT tempY = QuadraticSampler::sample(inTree, inCoord + Vec3R(0.0, 0.5, 0.0)); + const ValueT tempZ = QuadraticSampler::sample(inTree, inCoord + Vec3R(0.0, 0.0, 0.5)); + + return ValueT(tempX.x(), tempY.y(), tempZ.z()); +} + +//////////////////////////////////////// Sampler + +template <> +struct Sampler<0, false> : public PointSampler {}; + +template <> +struct Sampler<1, false> : public BoxSampler {}; + +template <> +struct Sampler<2, false> : public QuadraticSampler {}; + +template <> +struct Sampler<0, true> : public StaggeredPointSampler {}; + +template <> +struct Sampler<1, true> : public StaggeredBoxSampler {}; + +template <> +struct Sampler<2, true> : public StaggeredQuadraticSampler {}; + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_INTERPOLATION_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/LevelSetAdvect.h b/nuparu/include/openvdb/include/openvdb/tools/LevelSetAdvect.h new file mode 100644 index 00000000..2139315a --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/LevelSetAdvect.h @@ -0,0 +1,569 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/////////////////////////////////////////////////////////////////////////// +// +/// @author Ken Museth +/// +/// @file LevelSetAdvect.h +/// +/// @brief Hyperbolic advection of narrow-band level sets + +#ifndef OPENVDB_TOOLS_LEVEL_SET_ADVECT_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_LEVEL_SET_ADVECT_HAS_BEEN_INCLUDED + +#include +#include +#include +#include "LevelSetTracker.h" +#include "VelocityFields.h" // for EnrightField +#include +#include +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief Hyperbolic advection of narrow-band level sets in an +/// external velocity field +/// +/// The @c FieldType template argument below refers to any functor +/// with the following interface (see tools/VelocityFields.h +/// for examples): +/// +/// @code +/// class VelocityField { +/// ... +/// public: +/// openvdb::VectorType operator() (const openvdb::Coord& xyz, ValueType time) const; +/// ... +/// }; +/// @endcode +/// +/// @note The functor method returns the velocity field at coordinate +/// position xyz of the advection grid, and for the specified +/// time. Note that since the velocity is returned in the local +/// coordinate space of the grid that is being advected, the functor +/// typically depends on the transformation of that grid. This design +/// is chosen for performance reasons. Finally we will assume that the +/// functor method is NOT threadsafe (typically uses a ValueAccessor) +/// and that its lightweight enough that we can copy it per thread. +/// +/// The @c InterruptType template argument below refers to any class +/// with the following interface: +/// @code +/// class Interrupter { +/// ... +/// public: +/// void start(const char* name = NULL)// called when computations begin +/// void end() // called when computations end +/// bool wasInterrupted(int percent=-1)// return true to break computation +///}; +/// @endcode +/// +/// @note If no template argument is provided for this InterruptType +/// the util::NullInterrupter is used which implies that all +/// interrupter calls are no-ops (i.e. incurs no computational overhead). +/// + +template, + typename InterruptT = util::NullInterrupter> +class LevelSetAdvection +{ +public: + typedef GridT GridType; + typedef LevelSetTracker TrackerT; + typedef typename TrackerT::LeafRange LeafRange; + typedef typename TrackerT::LeafType LeafType; + typedef typename TrackerT::BufferType BufferType; + typedef typename TrackerT::ValueType ValueType; + typedef typename FieldT::VectorType VectorType; + + /// Main constructor + LevelSetAdvection(GridT& grid, const FieldT& field, InterruptT* interrupt = NULL): + mTracker(grid, interrupt), mField(field), + mSpatialScheme(math::HJWENO5_BIAS), + mTemporalScheme(math::TVD_RK2) {} + + virtual ~LevelSetAdvection() {} + + /// @return the spatial finite difference scheme + math::BiasedGradientScheme getSpatialScheme() const { return mSpatialScheme; } + /// @brief Set the spatial finite difference scheme + void setSpatialScheme(math::BiasedGradientScheme scheme) { mSpatialScheme = scheme; } + + /// @return the temporal integration scheme + math::TemporalIntegrationScheme getTemporalScheme() const { return mTemporalScheme; } + /// @brief Set the spatial finite difference scheme + void setTemporalScheme(math::TemporalIntegrationScheme scheme) { mTemporalScheme = scheme; } + + /// @return the spatial finite difference scheme + math::BiasedGradientScheme getTrackerSpatialScheme() const { return mTracker.getSpatialScheme(); } + /// @brief Set the spatial finite difference scheme + void setTrackerSpatialScheme(math::BiasedGradientScheme scheme) { mTracker.setSpatialScheme(scheme); } + + /// @return the temporal integration scheme + math::TemporalIntegrationScheme getTrackerTemporalScheme() const { return mTracker.getTemporalScheme(); } + /// @brief Set the spatial finite difference scheme + void setTrackerTemporalScheme(math::TemporalIntegrationScheme scheme) { mTracker.setTemporalScheme(scheme); } + + /// @return The number of normalizations performed per track or + /// normalize call. + int getNormCount() const { return mTracker.getNormCount(); } + /// @brief Set the number of normalizations performed per track or + /// normalize call. + void setNormCount(int n) { mTracker.setNormCount(n); } + + /// @return the grain-size used for multi-threading + int getGrainSize() const { return mTracker.getGrainSize(); } + /// @brief Set the grain-size used for multi-threading. + /// @note A grain size of 0 or less disables multi-threading! + void setGrainSize(int grainsize) { mTracker.setGrainSize(grainsize); } + + /// Advect the level set from its current time, time0, to its + /// final time, time1. If time0>time1 backward advection is performed. + /// + /// @return number of CFL iterations used to advect from time0 to time1 + size_t advect(ValueType time0, ValueType time1); + +private: + + // disallow copy construction and copy by assinment! + LevelSetAdvection(const LevelSetAdvection&);// not implemented + LevelSetAdvection& operator=(const LevelSetAdvection&);// not implemented + + // This templated private struct implements all the level set magic. + template + struct Advect + { + /// Main constructor + Advect(LevelSetAdvection& parent); + /// Shallow copy constructor called by tbb::parallel_for() threads + Advect(const Advect& other); + /// Destructor + virtual ~Advect() { if (mIsMaster) this->clearField(); } + /// Advect the level set from its current time, time0, to its final time, time1. + /// @return number of CFL iterations + size_t advect(ValueType time0, ValueType time1); + /// Used internally by tbb::parallel_for() + void operator()(const LeafRange& r) const + { + if (mTask) mTask(const_cast(this), r); + else OPENVDB_THROW(ValueError, "task is undefined - don\'t call this method directly"); + } + /// method calling tbb + void cook(const char* msg, size_t swapBuffer = 0); + /// Sample field and return the CFL time step + typename GridT::ValueType sampleField(ValueType time0, ValueType time1); + template void sample(const LeafRange& r, ValueType t0, ValueType t1); + inline void sampleXformed(const LeafRange& r, ValueType t0, ValueType t1) + { + this->sample(r, t0, t1); + } + inline void sampleAligned(const LeafRange& r, ValueType t0, ValueType t1) + { + this->sample(r, t0, t1); + } + void clearField(); + // Convex combination of Phi and a forward Euler advection steps: + // Phi(result) = alpha * Phi(phi) + (1-alpha) * (Phi(0) - dt * Speed(speed)*|Grad[Phi(0)]|); + template + void euler(const LeafRange&, ValueType, Index, Index); + inline void euler01(const LeafRange& r, ValueType t) {this->euler<0,1>(r, t, 0, 1);} + inline void euler12(const LeafRange& r, ValueType t) {this->euler<1,2>(r, t, 1, 1);} + inline void euler34(const LeafRange& r, ValueType t) {this->euler<3,4>(r, t, 1, 2);} + inline void euler13(const LeafRange& r, ValueType t) {this->euler<1,3>(r, t, 1, 2);} + + LevelSetAdvection& mParent; + VectorType* mVelocity; + size_t* mOffsets; + const MapT* mMap; + typename boost::function mTask; + const bool mIsMaster; + }; // end of private Advect struct + + template + size_t advect1(ValueType time0, ValueType time1); + + template + size_t advect2(ValueType time0, ValueType time1); + + template + size_t advect3(ValueType time0, ValueType time1); + + TrackerT mTracker; + //each thread needs a deep copy of the field since it might contain a ValueAccessor + const FieldT mField; + math::BiasedGradientScheme mSpatialScheme; + math::TemporalIntegrationScheme mTemporalScheme; + +};//end of LevelSetAdvection + +template +inline size_t +LevelSetAdvection::advect(ValueType time0, ValueType time1) +{ + switch (mSpatialScheme) { + case math::FIRST_BIAS: + return this->advect1(time0, time1); + case math::SECOND_BIAS: + return this->advect1(time0, time1); + case math::THIRD_BIAS: + return this->advect1(time0, time1); + case math::WENO5_BIAS: + return this->advect1(time0, time1); + case math::HJWENO5_BIAS: + return this->advect1(time0, time1); + default: + OPENVDB_THROW(ValueError, "Spatial difference scheme not supported!"); + } + return 0; +} + +template +template +inline size_t +LevelSetAdvection::advect1(ValueType time0, ValueType time1) +{ + switch (mTemporalScheme) { + case math::TVD_RK1: + return this->advect2(time0, time1); + case math::TVD_RK2: + return this->advect2(time0, time1); + case math::TVD_RK3: + return this->advect2(time0, time1); + default: + OPENVDB_THROW(ValueError, "Temporal integration scheme not supported!"); + } + return 0; +} + +template +template +inline size_t +LevelSetAdvection::advect2(ValueType time0, ValueType time1) +{ + const math::Transform& trans = mTracker.grid().transform(); + if (trans.mapType() == math::UniformScaleMap::mapType()) { + return this->advect3(time0, time1); + } else if (trans.mapType() == math::UniformScaleTranslateMap::mapType()) { + return this->advect3(time0, time1); + } else if (trans.mapType() == math::UnitaryMap::mapType()) { + return this->advect3(time0, time1); + } else if (trans.mapType() == math::TranslationMap::mapType()) { + return this->advect3(time0, time1); + } else { + OPENVDB_THROW(ValueError, "MapType not supported!"); + } + return 0; +} + +template +template +inline size_t +LevelSetAdvection::advect3(ValueType time0, ValueType time1) +{ + Advect tmp(*this); + return tmp.advect(time0, time1); +} + + +/////////////////////////////////////////////////////////////////////// + + +template +template +inline +LevelSetAdvection:: +Advect:: +Advect(LevelSetAdvection& parent) + : mParent(parent) + , mVelocity(NULL) + , mOffsets(NULL) + , mMap(parent.mTracker.grid().transform().template constMap().get()) + , mTask(0) + , mIsMaster(true) +{ +} + +template +template +inline +LevelSetAdvection:: +Advect:: +Advect(const Advect& other) + : mParent(other.mParent) + , mVelocity(other.mVelocity) + , mOffsets(other.mOffsets) + , mMap(other.mMap) + , mTask(other.mTask) + , mIsMaster(false) +{ +} + +template +template +inline size_t +LevelSetAdvection:: +Advect:: +advect(ValueType time0, ValueType time1) +{ + //util::CpuTimer timer; + size_t countCFL = 0; + if ( math::isZero(time0 - time1) ) return countCFL; + const bool isForward = time0 < time1; + while ((isForward ? time0time1) && mParent.mTracker.checkInterrupter()) { + /// Make sure we have enough temporal auxiliary buffers + //timer.start( "\nallocate buffers" ); + mParent.mTracker.leafs().rebuildAuxBuffers(TemporalScheme == math::TVD_RK3 ? 2 : 1); + //timer.stop(); + + const ValueType dt = this->sampleField(time0, time1); + if ( math::isZero(dt) ) break;//V is essentially zero so terminate + + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN //switch is resolved at compile-time + switch(TemporalScheme) { + case math::TVD_RK1: + // Perform one explicit Euler step: t1 = t0 + dt + // Phi_t1(1) = Phi_t0(0) - dt * VdotG_t0(0) + mTask = boost::bind(&Advect::euler01, _1, _2, dt); + + // Cook and swap buffer 0 and 1 such that Phi_t1(0) and Phi_t0(1) + this->cook("Advecting level set using TVD_RK1", 1); + break; + case math::TVD_RK2: + // Perform one explicit Euler step: t1 = t0 + dt + // Phi_t1(1) = Phi_t0(0) - dt * VdotG_t0(0) + mTask = boost::bind(&Advect::euler01, _1, _2, dt); + + // Cook and swap buffer 0 and 1 such that Phi_t1(0) and Phi_t0(1) + this->cook("Advecting level set using TVD_RK1 (step 1 of 2)", 1); + + // Convex combine explict Euler step: t2 = t0 + dt + // Phi_t2(1) = 1/2 * Phi_t0(1) + 1/2 * (Phi_t1(0) - dt * V.Grad_t1(0)) + mTask = boost::bind(&Advect::euler12, _1, _2, dt); + + // Cook and swap buffer 0 and 1 such that Phi_t2(0) and Phi_t1(1) + this->cook("Advecting level set using TVD_RK1 (step 2 of 2)", 1); + break; + case math::TVD_RK3: + // Perform one explicit Euler step: t1 = t0 + dt + // Phi_t1(1) = Phi_t0(0) - dt * VdotG_t0(0) + mTask = boost::bind(&Advect::euler01, _1, _2, dt); + + // Cook and swap buffer 0 and 1 such that Phi_t1(0) and Phi_t0(1) + this->cook("Advecting level set using TVD_RK3 (step 1 of 3)", 1); + + // Convex combine explict Euler step: t2 = t0 + dt/2 + // Phi_t2(2) = 3/4 * Phi_t0(1) + 1/4 * (Phi_t1(0) - dt * V.Grad_t1(0)) + mTask = boost::bind(&Advect::euler34, _1, _2, dt); + + // Cook and swap buffer 0 and 2 such that Phi_t2(0) and Phi_t1(2) + this->cook("Advecting level set using TVD_RK3 (step 2 of 3)", 2); + + // Convex combine explict Euler step: t3 = t0 + dt + // Phi_t3(2) = 1/3 * Phi_t0(1) + 2/3 * (Phi_t2(0) - dt * V.Grad_t2(0) + mTask = boost::bind(&Advect::euler13, _1, _2, dt); + + // Cook and swap buffer 0 and 2 such that Phi_t3(0) and Phi_t2(2) + this->cook("Advecting level set using TVD_RK3 (step 3 of 3)", 2); + break; + default: + OPENVDB_THROW(ValueError, "Temporal integration scheme not supported!"); + }//end of compile-time resolved switch + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + + time0 += isForward ? dt : -dt; + ++countCFL; + mParent.mTracker.leafs().removeAuxBuffers(); + this->clearField(); + /// Track the narrow band + mParent.mTracker.track(); + }//end wile-loop over time + return countCFL;//number of CLF propagation steps +} + +template +template +inline typename GridT::ValueType +LevelSetAdvection:: +Advect:: +sampleField(ValueType time0, ValueType time1) +{ + const int grainSize = mParent.mTracker.getGrainSize(); + const size_t leafCount = mParent.mTracker.leafs().leafCount(); + if (leafCount==0) return ValueType(0.0); + + // Compute the pre-fix sum of offsets to active voxels + size_t size=0, voxelCount=mParent.mTracker.leafs().getPreFixSum(mOffsets, size, grainSize); + + // Sample the velocity field + if (mParent.mField.transform() == mParent.mTracker.grid().transform()) { + mTask = boost::bind(&Advect::sampleAligned, _1, _2, time0, time1); + } else { + mTask = boost::bind(&Advect::sampleXformed, _1, _2, time0, time1); + } + assert(voxelCount != mParent.mTracker.grid().activeVoxelCount()); + mVelocity = new VectorType[ voxelCount ]; + this->cook("Sampling advection field"); + + // Find the extrema of the magnitude of the velocities + ValueType maxAbsV = 0; + VectorType* v = mVelocity; + for (size_t i=0; ilengthSqr())); + + // Compute the CFL number + if (math::isApproxZero(maxAbsV, math::Delta::value())) return ValueType(0); +#ifndef _MSC_VER // Visual C++ doesn't guarantee thread-safe initialization of local statics + static +#endif + const ValueType CFL = (TemporalScheme == math::TVD_RK1 ? ValueType(0.3) : + TemporalScheme == math::TVD_RK2 ? ValueType(0.9) : + ValueType(1.0))/math::Sqrt(ValueType(3.0)); + const ValueType dt = math::Abs(time1 - time0), dx = mParent.mTracker.voxelSize(); + return math::Min(dt, ValueType(CFL*dx/math::Sqrt(maxAbsV))); +} + +template +template +template +inline void +LevelSetAdvection:: +Advect:: +sample(const LeafRange& range, ValueType time0, ValueType time1) +{ + const bool isForward = time0 < time1; + typedef typename LeafType::ValueOnCIter VoxelIterT; + const MapT& map = *mMap; + const FieldT field( mParent.mField ); + mParent.mTracker.checkInterrupter(); + for (typename LeafRange::Iterator leafIter = range.begin(); leafIter; ++leafIter) { + VectorType* vel = mVelocity + mOffsets[ leafIter.pos() ]; + for (VoxelIterT iter = leafIter->cbeginValueOn(); iter; ++iter, ++vel) { + const VectorType v = Aligned ? field(iter.getCoord(), time0) ://resolved at compile time + field(map.applyMap(iter.getCoord().asVec3d()), time0); + *vel = isForward ? v : -v; + } + } +} + +template +template +inline void +LevelSetAdvection:: +Advect:: +clearField() +{ + delete [] mOffsets; + delete [] mVelocity; + mOffsets = NULL; + mVelocity = NULL; +} + +template +template +inline void +LevelSetAdvection:: +Advect:: +cook(const char* msg, size_t swapBuffer) +{ + mParent.mTracker.startInterrupter( msg ); + + const int grainSize = mParent.mTracker.getGrainSize(); + const LeafRange range = mParent.mTracker.leafs().leafRange(grainSize); + + grainSize == 0 ? (*this)(range) : tbb::parallel_for(range, *this); + + mParent.mTracker.leafs().swapLeafBuffer(swapBuffer, grainSize == 0); + + mParent.mTracker.endInterrupter(); +} + +// Convex combination of Phi and a forward Euler advection steps: +// Phi(result) = alpha * Phi(phi) + (1-alpha) * (Phi(0) - dt * V.Grad(0)); +template +template +template +inline void +LevelSetAdvection:: +Advect:: +euler(const LeafRange& range, ValueType dt, Index phiBuffer, Index resultBuffer) +{ + typedef math::BIAS_SCHEME SchemeT; + typedef typename SchemeT::template ISStencil::StencilType StencilT; + typedef typename LeafType::ValueOnCIter VoxelIterT; + typedef math::GradientBiased GradT; + + static const ValueType Alpha = ValueType(Nominator)/ValueType(Denominator); + static const ValueType Beta = ValueType(1) - Alpha; + + mParent.mTracker.checkInterrupter(); + const MapT& map = *mMap; + StencilT stencil(mParent.mTracker.grid()); + for (typename LeafRange::Iterator leafIter = range.begin(); leafIter; ++leafIter) { + const VectorType* vel = mVelocity + mOffsets[ leafIter.pos() ]; + const ValueType* phi = leafIter.buffer(phiBuffer).data(); + ValueType* result = leafIter.buffer(resultBuffer).data(); + for (VoxelIterT voxelIter = leafIter->cbeginValueOn(); voxelIter; ++voxelIter, ++vel) { + const Index i = voxelIter.pos(); + stencil.moveTo(voxelIter); + const ValueType a = stencil.getValue() - dt * vel->dot(GradT::result(map, stencil, *vel)); + result[i] = Nominator ? Alpha * phi[i] + Beta * a : a; + }//loop over active voxels in the leaf of the mask + }//loop over leafs of the level set +} + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_LEVEL_SET_ADVECT_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/LevelSetFilter.h b/nuparu/include/openvdb/include/openvdb/tools/LevelSetFilter.h new file mode 100644 index 00000000..4e9a864b --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/LevelSetFilter.h @@ -0,0 +1,546 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @author Ken Museth +/// +/// @file LevelSetFilter.h +/// +/// @brief Performs various types of level set deformations with +/// interface tracking. These unrestricted deformations include +/// surface smoothing (e.g., Laplacian flow), filtering (e.g., mean +/// value) and morphological operations (e.g., morphological opening). +/// All these operations can optionally be masked with another grid that +/// acts as an alpha-mask. + +#ifndef OPENVDB_TOOLS_LEVELSETFILTER_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_LEVELSETFILTER_HAS_BEEN_INCLUDED + +#include +#include +#include "LevelSetTracker.h" +#include "Interpolation.h" + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief Filtering (e.g. diffusion) of narrow-band level sets. An +/// optional scalar field can be used to produce a (smooth) alpha mask +/// for the filtering. +/// +/// @note This class performs proper interface tracking which allows +/// for unrestricted surface deformations +template::Type, + typename InterruptT = util::NullInterrupter> +class LevelSetFilter : public LevelSetTracker +{ +public: + typedef LevelSetTracker BaseType; + typedef GridT GridType; + typedef MaskT MaskType; + typedef typename GridType::TreeType TreeType; + typedef typename TreeType::ValueType ValueType; + typedef typename MaskType::ValueType AlphaType; + BOOST_STATIC_ASSERT(boost::is_floating_point::value); + + /// @brief Main constructor from a grid + /// @param grid The level set to be filtered. + /// @param interrupt Optional interrupter. + LevelSetFilter(GridType& grid, InterruptT* interrupt = NULL) + : BaseType(grid, interrupt) + , mMinMask(0) + , mMaxMask(1) + , mInvertMask(false) + { + } + /// @brief Default destructor + virtual ~LevelSetFilter() {} + + /// @brief Return the minimum value of the mask to be used for the + /// derivation of a smooth alpha value. + AlphaType minMask() const { return mMinMask; } + /// @brief Return the maximum value of the mask to be used for the + /// derivation of a smooth alpha value. + AlphaType maxMask() const { return mMaxMask; } + /// @brief Define the range for the (optional) scalar mask. + /// @param min Minimum value of the range. + /// @param max Maximum value of the range. + /// @details Mask values outside the range maps to alpha values of + /// respectfully zero and one, and values inside the range maps + /// smoothly to 0->1 (unless of course the mask is inverted). + /// @throw ValueError if @a min is not smaller than @a max. + void setMaskRange(AlphaType min, AlphaType max) + { + if (!(min < max)) OPENVDB_THROW(ValueError, "Invalid mask range (expects min < max)"); + mMinMask = min; + mMaxMask = max; + } + + /// @brief Return true if the mask is inverted, i.e. min->max in the + /// original mask maps to 1->0 in the inverted alpha mask. + bool isMaskInverted() const { return mInvertMask; } + /// @brief Invert the optional mask, i.e. min->max in the original + /// mask maps to 1->0 in the inverted alpha mask. + void invertMask(bool invert=true) { mInvertMask = invert; } + + /// @brief One iteration of mean-curvature flow of the level set. + /// @param mask Optional alpha mask. + void meanCurvature(const MaskType* mask = NULL) + { + Filter f(this, mask); f.meanCurvature(); + } + + /// @brief One iteration of Laplacian flow of the level set. + /// @param mask Optional alpha mask. + void laplacian(const MaskType* mask = NULL) + { + Filter f(this, mask); f.laplacian(); + } + + /// @brief One iteration of a fast separable Gaussian filter. + /// @param width Width of the Gaussian kernel in voxel units. + /// @param mask Optional alpha mask. + /// + /// @note This is approximated as 4 iterations of a separable mean filter + /// which typically leads an approximation that's better than 95%! + void gaussian(int width = 1, const MaskType* mask = NULL) + { + Filter f(this, mask); f.gaussian(width); + } + + /// @brief Offset the level set by the specified (world) distance. + /// @param offset Value of the offset. + /// @param mask Optional alpha mask. + void offset(ValueType offset, const MaskType* mask = NULL) + { + Filter f(this, mask); f.offset(offset); + } + + /// @brief One iteration of median-value flow of the level set. + /// @param width Width of the median-value kernel in voxel units. + /// @param mask Optional alpha mask. + /// + /// @warning This filter is not separable and is hence relatively + /// slow! + void median(int width = 1, const MaskType* mask = NULL) + { + Filter f(this, mask); f.median(width); + } + + /// @brief One iteration of mean-value flow of the level set. + /// @param width Width of the mean-value kernel in voxel units. + /// @param mask Optional alpha mask. + /// + /// @note This filter is separable so it's fast! + void mean(int width = 1, const MaskType* mask = NULL) + { + Filter f(this, mask); f.mean(width); + } + +private: + // disallow copy construction and copy by assignment! + LevelSetFilter(const LevelSetFilter&);// not implemented + LevelSetFilter& operator=(const LevelSetFilter&);// not implemented + + // Private struct that implements all the filtering. + struct Filter + { + typedef typename TreeType::LeafNodeType LeafT; + typedef typename LeafT::ValueOnIter VoxelIterT; + typedef typename LeafT::ValueOnCIter VoxelCIterT; + typedef typename tree::LeafManager::BufferType BufferT; + typedef typename tree::LeafManager::LeafRange LeafRange; + typedef typename LeafRange::Iterator LeafIterT; + typedef tools::AlphaMask AlphaMaskT; + + Filter(LevelSetFilter* parent, const MaskType* mask) : mParent(parent), mMask(mask) {} + virtual ~Filter() {} + + void box(int width); + void median(int width); + void mean(int width); + void gaussian(int width); + void laplacian(); + void meanCurvature(); + void offset(ValueType value); + void operator()(const LeafRange& r) const + { + if (mTask) mTask(const_cast(this), r); + else OPENVDB_THROW(ValueError, "task is undefined - don\'t call this method directly"); + } + void cook(bool swap) + { + const int n = mParent->getGrainSize(); + if (n>0) { + tbb::parallel_for(mParent->leafs().leafRange(n), *this); + } else { + (*this)(mParent->leafs().leafRange()); + } + if (swap) mParent->leafs().swapLeafBuffer(1, n==0); + } + + template + struct Avg { + Avg(const GridT& grid, Int32 w) : + acc(grid.tree()), width(w), frac(1/ValueType(2*w+1)) {} + inline ValueType operator()(Coord xyz) + { + ValueType sum = zeroVal(); + Int32& i = xyz[Axis], j = i + width; + for (i -= width; i <= j; ++i) sum += acc.getValue(xyz); + return sum*frac; + } + typename GridT::ConstAccessor acc; + const Int32 width; + const ValueType frac; + }; + + template + void box( const LeafRange& r, Int32 w); + + void boxX(const LeafRange& r, Int32 w) { this->box >(r,w); } + void boxZ(const LeafRange& r, Int32 w) { this->box >(r,w); } + void boxY(const LeafRange& r, Int32 w) { this->box >(r,w); } + + void median(const LeafRange&, int); + void meanCurvature(const LeafRange&); + void laplacian(const LeafRange&); + void offset(const LeafRange&, ValueType); + + LevelSetFilter* mParent; + const MaskType* mMask; + typename boost::function mTask; + }; // end of private Filter struct + + AlphaType mMinMask, mMaxMask; + bool mInvertMask; + +}; // end of LevelSetFilter class + + +//////////////////////////////////////// + +template +inline void +LevelSetFilter:: +Filter::median(int width) +{ + mParent->startInterrupter("Median-value flow of level set"); + + mParent->leafs().rebuildAuxBuffers(1, mParent->getGrainSize()==0); + + mTask = boost::bind(&Filter::median, _1, _2, std::max(1, width)); + this->cook(true); + + mParent->track(); + + mParent->endInterrupter(); +} + +template +inline void +LevelSetFilter:: +Filter::mean(int width) +{ + mParent->startInterrupter("Mean-value flow of level set"); + + this->box(width); + + mParent->endInterrupter(); +} + +template +inline void +LevelSetFilter:: +Filter::gaussian(int width) +{ + mParent->startInterrupter("Gaussian flow of level set"); + + for (int n=0; n<4; ++n) this->box(width); + + mParent->endInterrupter(); +} + +template +inline void +LevelSetFilter:: +Filter::box(int width) +{ + mParent->leafs().rebuildAuxBuffers(1, mParent->getGrainSize()==0); + + width = std::max(1, width); + + mTask = boost::bind(&Filter::boxX, _1, _2, width); + this->cook(true); + + mTask = boost::bind(&Filter::boxY, _1, _2, width); + this->cook(true); + + mTask = boost::bind(&Filter::boxZ, _1, _2, width); + this->cook(true); + + mParent->track(); +} + +template +inline void +LevelSetFilter:: +Filter::meanCurvature() +{ + mParent->startInterrupter("Mean-curvature flow of level set"); + + mParent->leafs().rebuildAuxBuffers(1, mParent->getGrainSize()==0); + + mTask = boost::bind(&Filter::meanCurvature, _1, _2); + this->cook(true); + + mParent->track(); + + mParent->endInterrupter(); +} + +template +inline void +LevelSetFilter:: +Filter::laplacian() +{ + mParent->startInterrupter("Laplacian flow of level set"); + + mParent->leafs().rebuildAuxBuffers(1, mParent->getGrainSize()==0); + + mTask = boost::bind(&Filter::laplacian, _1, _2); + this->cook(true); + + mParent->track(); + + mParent->endInterrupter(); +} + +template +inline void +LevelSetFilter:: +Filter::offset(ValueType value) +{ + mParent->startInterrupter("Offsetting level set"); + + mParent->leafs().removeAuxBuffers();// no auxiliary buffers required + + const ValueType CFL = ValueType(0.5) * mParent->voxelSize(), offset = openvdb::math::Abs(value); + ValueType dist = 0.0; + while (offset-dist > ValueType(0.001)*CFL && mParent->checkInterrupter()) { + const ValueType delta = openvdb::math::Min(offset-dist, CFL); + dist += delta; + + mTask = boost::bind(&Filter::offset, _1, _2, copysign(delta, value)); + this->cook(false); + + mParent->track(); + } + + mParent->endInterrupter(); +} + + +///////////////////////// PRIVATE METHODS ////////////////////// + +/// Performs parabolic mean-curvature diffusion +template +inline void +LevelSetFilter:: +Filter::meanCurvature(const LeafRange& range) +{ + mParent->checkInterrupter(); + //const float CFL = 0.9f, dt = CFL * mDx * mDx / 6.0f; + const ValueType dx = mParent->voxelSize(), dt = math::Pow2(dx) / ValueType(3.0); + math::CurvatureStencil stencil(mParent->grid(), dx); + if (mMask) { + typename AlphaMaskT::FloatType a, b; + AlphaMaskT alpha(mParent->grid(), *mMask, mParent->minMask(), + mParent->maxMask(), mParent->isMaskInverted()); + for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) { + ValueType* buffer = leafIter.buffer(1).data(); + for (VoxelCIterT iter = leafIter->cbeginValueOn(); iter; ++iter) { + if (alpha(iter.getCoord(), a, b)) { + stencil.moveTo(iter); + const ValueType phi0 = *iter, phi1 = phi0 + dt*stencil.meanCurvatureNormGrad(); + buffer[iter.pos()] = b * phi0 + a * phi1; + } + } + } + } else { + for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) { + ValueType* buffer = leafIter.buffer(1).data(); + for (VoxelCIterT iter = leafIter->cbeginValueOn(); iter; ++iter) { + stencil.moveTo(iter); + buffer[iter.pos()] = *iter + dt*stencil.meanCurvatureNormGrad(); + } + } + } +} + +/// Performs Laplacian diffusion. Note if the grids contains a true +/// signed distance field (e.g. a solution to the Eikonal equation) +/// Laplacian diffusions (e.g. geometric heat equation) is actually +/// identical to mean curvature diffusion, yet less computationally +/// expensive! In other words if you're performing renormalization +/// anyway (e.g. rebuilding the narrow-band) you should consider +/// performing Laplacian diffusion over mean curvature flow! +template +inline void +LevelSetFilter:: +Filter::laplacian(const LeafRange& range) +{ + mParent->checkInterrupter(); + //const float CFL = 0.9f, half_dt = CFL * mDx * mDx / 12.0f; + const ValueType dx = mParent->voxelSize(), dt = math::Pow2(dx) / ValueType(6.0); + math::GradStencil stencil(mParent->grid(), dx); + if (mMask) { + typename AlphaMaskT::FloatType a, b; + AlphaMaskT alpha(mParent->grid(), *mMask, mParent->minMask(), + mParent->maxMask(), mParent->isMaskInverted()); + for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) { + ValueType* buffer = leafIter.buffer(1).data(); + for (VoxelCIterT iter = leafIter->cbeginValueOn(); iter; ++iter) { + if (alpha(iter.getCoord(), a, b)) { + stencil.moveTo(iter); + const ValueType phi0 = *iter, phi1 = phi0 + dt*stencil.laplacian(); + buffer[iter.pos()] = b * phi0 + a * phi1; + } + } + } + } else { + for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) { + ValueType* buffer = leafIter.buffer(1).data(); + for (VoxelCIterT iter = leafIter->cbeginValueOn(); iter; ++iter) { + stencil.moveTo(iter); + buffer[iter.pos()] = *iter + dt*stencil.laplacian(); + } + } + } +} + +/// Offsets the values by a constant +template +inline void +LevelSetFilter:: +Filter::offset(const LeafRange& range, ValueType offset) +{ + mParent->checkInterrupter(); + if (mMask) { + typename AlphaMaskT::FloatType a, b; + AlphaMaskT alpha(mParent->grid(), *mMask, mParent->minMask(), + mParent->maxMask(), mParent->isMaskInverted()); + for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) { + for (VoxelIterT iter = leafIter->beginValueOn(); iter; ++iter) { + if (alpha(iter.getCoord(), a, b)) iter.setValue(*iter + a*offset); + } + } + } else { + for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) { + for (VoxelIterT iter = leafIter->beginValueOn(); iter; ++iter) { + iter.setValue(*iter + offset); + } + } + } +} + +/// Performs simple but slow median-value diffusion +template +inline void +LevelSetFilter:: +Filter::median(const LeafRange& range, int width) +{ + mParent->checkInterrupter(); + typename math::DenseStencil stencil(mParent->grid(), width);//creates local cache! + if (mMask) { + typename AlphaMaskT::FloatType a, b; + AlphaMaskT alpha(mParent->grid(), *mMask, mParent->minMask(), + mParent->maxMask(), mParent->isMaskInverted()); + for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) { + ValueType* buffer = leafIter.buffer(1).data(); + for (VoxelCIterT iter = leafIter->cbeginValueOn(); iter; ++iter) { + if (alpha(iter.getCoord(), a, b)) { + stencil.moveTo(iter); + buffer[iter.pos()] = b * (*iter) + a * stencil.median(); + } + } + } + } else { + for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) { + ValueType* buffer = leafIter.buffer(1).data(); + for (VoxelCIterT iter = leafIter->cbeginValueOn(); iter; ++iter) { + stencil.moveTo(iter); + buffer[iter.pos()] = stencil.median(); + } + } + } +} + +/// One dimensional convolution of a separable box filter +template +template +inline void +LevelSetFilter:: +Filter::box(const LeafRange& range, Int32 w) +{ + mParent->checkInterrupter(); + AvgT avg(mParent->grid(), w); + if (mMask) { + typename AlphaMaskT::FloatType a, b; + AlphaMaskT alpha(mParent->grid(), *mMask, mParent->minMask(), + mParent->maxMask(), mParent->isMaskInverted()); + for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) { + ValueType* buffer = leafIter.buffer(1).data(); + for (VoxelCIterT iter = leafIter->cbeginValueOn(); iter; ++iter) { + const Coord xyz = iter.getCoord(); + if (alpha(xyz, a, b)) buffer[iter.pos()] = b * (*iter)+ a * avg(xyz); + } + } + } else { + for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) { + ValueType* buffer = leafIter.buffer(1).data(); + for (VoxelCIterT iter = leafIter->cbeginValueOn(); iter; ++iter) { + buffer[iter.pos()] = avg(iter.getCoord()); + } + } + } +} + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_LEVELSETFILTER_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/LevelSetFracture.h b/nuparu/include/openvdb/include/openvdb/tools/LevelSetFracture.h new file mode 100644 index 00000000..db73ee08 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/LevelSetFracture.h @@ -0,0 +1,346 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file tools/LevelSetFracture.h +/// +/// @brief Divide volumes represented by level set grids into multiple, +/// disjoint pieces by intersecting them with one or more "cutter" volumes, +/// also represented by level sets. + +#ifndef OPENVDB_TOOLS_LEVELSETFRACTURE_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_LEVELSETFRACTURE_HAS_BEEN_INCLUDED + +#include +#include +#include + +#include "Composite.h" // for csgIntersectionCopy() and csgDifferenceCopy() +#include "GridTransformer.h" // for resampleToMatch() +#include "LevelSetUtil.h" // for sdfSegmentation() + +#include +#include + +#include +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief Level set fracturing +template +class LevelSetFracture +{ +public: + typedef std::vector Vec3sList; + typedef std::vector QuatsList; + typedef std::list GridPtrList; + typedef typename GridPtrList::iterator GridPtrListIter; + + + /// @brief Default constructor + /// + /// @param interrupter optional interrupter object + explicit LevelSetFracture(InterruptType* interrupter = NULL); + + /// @brief Divide volumes represented by level set grids into multiple, + /// disjoint pieces by intersecting them with one or more "cutter" volumes, + /// also represented by level sets. + /// @details If desired, the process can be applied iteratively, so that + /// fragments created with one cutter are subdivided by other cutters. + /// + /// @note The incoming @a grids and the @a cutter are required to have matching + /// transforms and narrow band widths! + /// + /// @param grids list of grids to fracture. The residuals of the + /// fractured grids will remain in this list + /// @param cutter a level set grid to use as the cutter object + /// @param segment toggle to split disjoint fragments into their own grids + /// @param points optional list of world space points at which to instance the + /// cutter object (if null, use the cutter's current position only) + /// @param rotations optional list of custom rotations for each cutter instance + /// @param cutterOverlap toggle to allow consecutive cutter instances to fracture + /// previously generated fragments + void fracture(GridPtrList& grids, const GridType& cutter, bool segment = false, + const Vec3sList* points = NULL, const QuatsList* rotations = NULL, + bool cutterOverlap = true); + + /// Return a list of new fragments, not including the residuals from the input grids. + GridPtrList& fragments() { return mFragments; } + + /// Remove all elements from the fragment list. + void clear() { mFragments.clear(); } + +private: + // disallow copy by assignment + void operator=(const LevelSetFracture&) {} + + bool wasInterrupted(int percent = -1) const { + return mInterrupter && mInterrupter->wasInterrupted(percent); + } + + bool isValidFragment(GridType&) const; + void segmentFragments(GridPtrList&) const; + void process(GridPtrList&, const GridType& cutter); + + InterruptType* mInterrupter; + GridPtrList mFragments; +}; + + +//////////////////////////////////////// + + +// Internal utility objects and implementation details + +namespace level_set_fracture_internal { + + +template +struct FindMinMaxVoxelValue { + + typedef typename LeafNodeType::ValueType ValueType; + + FindMinMaxVoxelValue(const std::vector& nodes) + : minValue(std::numeric_limits::max()) + , maxValue(-minValue) + , mNodes(nodes.empty() ? NULL : &nodes.front()) + { + } + + FindMinMaxVoxelValue(FindMinMaxVoxelValue& rhs, tbb::split) + : minValue(std::numeric_limits::max()) + , maxValue(-minValue) + , mNodes(rhs.mNodes) + { + } + + void operator()(const tbb::blocked_range& range) { + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + const ValueType* data = mNodes[n]->buffer().data(); + for (Index i = 0; i < LeafNodeType::SIZE; ++i) { + minValue = std::min(minValue, data[i]); + maxValue = std::max(maxValue, data[i]); + } + } + } + + void join(FindMinMaxVoxelValue& rhs) { + minValue = std::min(minValue, rhs.minValue); + maxValue = std::max(maxValue, rhs.maxValue); + } + + ValueType minValue, maxValue; + + LeafNodeType const * const * const mNodes; +}; // struct FindMinMaxVoxelValue + + +} // namespace level_set_fracture_internal + + +//////////////////////////////////////// + + +template +LevelSetFracture::LevelSetFracture(InterruptType* interrupter) + : mInterrupter(interrupter) + , mFragments() +{ +} + + +template +void +LevelSetFracture::fracture(GridPtrList& grids, const GridType& cutter, + bool segmentation, const Vec3sList* points, const QuatsList* rotations, bool cutterOverlap) +{ + // We can process all incoming grids with the same cutter instance, + // this optimization is enabled by the requirement of having matching + // transforms between all incoming grids and the cutter object. + if (points && points->size() != 0) { + + + math::Transform::Ptr originalCutterTransform = cutter.transform().copy(); + GridType cutterGrid(cutter, ShallowCopy()); + + const bool hasInstanceRotations = + points && rotations && points->size() == rotations->size(); + + // for each instance point.. + for (size_t p = 0, P = points->size(); p < P; ++p) { + int percent = int((float(p) / float(P)) * 100.0); + if (wasInterrupted(percent)) break; + + GridType instCutterGrid; + instCutterGrid.setTransform(originalCutterTransform->copy()); + math::Transform::Ptr xform = originalCutterTransform->copy(); + + if (hasInstanceRotations) { + const Vec3s& rot = (*rotations)[p].eulerAngles(math::XYZ_ROTATION); + xform->preRotate(rot[0], math::X_AXIS); + xform->preRotate(rot[1], math::Y_AXIS); + xform->preRotate(rot[2], math::Z_AXIS); + xform->postTranslate((*points)[p]); + } else { + xform->postTranslate((*points)[p]); + } + + cutterGrid.setTransform(xform); + + // Since there is no scaling, use the generic resampler instead of + // the more expensive level set rebuild tool. + if (mInterrupter != NULL) { + + if (hasInstanceRotations) { + doResampleToMatch(cutterGrid, instCutterGrid, *mInterrupter); + } else { + doResampleToMatch(cutterGrid, instCutterGrid, *mInterrupter); + } + } else { + util::NullInterrupter interrupter; + if (hasInstanceRotations) { + doResampleToMatch(cutterGrid, instCutterGrid, interrupter); + } else { + doResampleToMatch(cutterGrid, instCutterGrid, interrupter); + } + } + + if (wasInterrupted(percent)) break; + + if (cutterOverlap && !mFragments.empty()) process(mFragments, instCutterGrid); + process(grids, instCutterGrid); + } + + } else { + // use cutter in place + if (cutterOverlap && !mFragments.empty()) process(mFragments, cutter); + process(grids, cutter); + } + + if (segmentation) { + segmentFragments(mFragments); + segmentFragments(grids); + } +} + + +template +bool +LevelSetFracture::isValidFragment(GridType& grid) const +{ + typedef typename GridType::TreeType::LeafNodeType LeafNodeType; + + if (grid.tree().leafCount() < 9) { + + std::vector nodes; + grid.tree().getNodes(nodes); + + Index64 activeVoxelCount = 0; + + for (size_t n = 0, N = nodes.size(); n < N; ++n) { + activeVoxelCount += nodes[n]->onVoxelCount(); + } + + if (activeVoxelCount < 27) return false; + + level_set_fracture_internal::FindMinMaxVoxelValue op(nodes); + tbb::parallel_reduce(tbb::blocked_range(0, nodes.size()), op); + + if ((op.minValue < 0) == (op.maxValue < 0)) return false; + } + + return true; +} + + +template +void +LevelSetFracture::segmentFragments(GridPtrList& grids) const +{ + GridPtrList newFragments; + + for (GridPtrListIter it = grids.begin(); it != grids.end(); ++it) { + + std::vector segments; + segmentSDF(*(*it), segments); + + for (size_t n = 0, N = segments.size(); n < N; ++n) { + newFragments.push_back(segments[n]); + } + } + + grids.swap(newFragments); +} + + +template +void +LevelSetFracture::process( + GridPtrList& grids, const GridType& cutter) +{ + typedef typename GridType::Ptr GridPtr; + GridPtrList newFragments; + + for (GridPtrListIter it = grids.begin(); it != grids.end(); ++it) { + + if (wasInterrupted()) break; + + GridPtr& grid = *it; + + GridPtr fragment = csgIntersectionCopy(*grid, cutter); + if (!isValidFragment(*fragment)) continue; + + GridPtr residual = csgDifferenceCopy(*grid, cutter); + if (!isValidFragment(*residual)) continue; + + newFragments.push_back(fragment); + + grid->tree().clear(); + grid->tree().merge(residual->tree()); + } + + if (!newFragments.empty()) { + mFragments.splice(mFragments.end(), newFragments); + } +} + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_LEVELSETFRACTURE_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/LevelSetMeasure.h b/nuparu/include/openvdb/include/openvdb/tools/LevelSetMeasure.h new file mode 100644 index 00000000..f7880182 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/LevelSetMeasure.h @@ -0,0 +1,567 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @author Ken Museth +/// +/// @file LevelSetMeasure.h + +#ifndef OPENVDB_TOOLS_LEVELSETMEASURE_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_LEVELSETMEASURE_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include //for Pi +#include +#include +#include +#include +#include +#include +#include +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief Return the surface area of a narrow-band level set. +/// +/// @param grid a scalar, floating-point grid with one or more disjoint, +/// closed isosurfaces at the given @a isovalue +/// @param useWorldSpace if true the area is computed in +/// world space units, else in voxel units. +/// +/// @throw TypeError if @a grid is not scalar or not floating-point or not a level set. +template +inline Real +levelSetArea(const GridType& grid, bool useWorldSpace = true); + +/// @brief Return the volume of a narrow-band level set surface. +/// +/// @param grid a scalar, floating-point grid with one or more disjoint, +/// closed isosurfaces at the given @a isovalue +/// @param useWorldSpace if true the volume is computed in +/// world space units, else in voxel units. +/// +/// @throw TypeError if @a grid is not scalar or not floating-point or not a level set. +template +inline Real +levelSetVolume(const GridType& grid, bool useWorldSpace = true); + +/// @brief Compute the surface area and volume of a narrow-band level set. +/// +/// @param grid a scalar, floating-point grid with one or more disjoint, +/// closed isosurfaces at the given @a isovalue +/// @param area surface area of the level set +/// @param volume volume of the level set surface +/// @param useWorldSpace if true the area and volume are computed in +/// world space units, else in voxel units. +/// +/// @throw TypeError if @a grid is not scalar or not floating-point or not a level set. +template +inline void +levelSetMeasure(const GridType& grid, Real& area, Real& volume, bool useWorldSpace = true); + +/// @brief Compute the surface area and volume of a narrow-band level set. +/// +/// @param grid a scalar, floating-point grid with one or more disjoint, +/// closed isosurfaces at the given @a isovalue +/// @param area surface area of the level set +/// @param volume volume of the level set surface +/// @param avgCurvature average mean curvature of the level set surface +/// @param useWorldSpace if true the area, volume and curvature are computed in +/// world space units, else in voxel units. +/// +/// @throw TypeError if @a grid is not scalar or not floating-point or not a level set. +template +inline void +levelSetMeasure(const GridType& grid, Real& area, Real& volume, Real& avgCurvature, + bool useWorldSpace = true); + +/// @brief Smeared-out and continuous Dirac Delta function. +template +class DiracDelta +{ +public: + DiracDelta(RealT eps) : mC(0.5/eps), mD(2*boost::math::constants::pi()*mC), mE(eps) {} + inline RealT operator()(RealT phi) const { return math::Abs(phi) > mE ? 0 : mC*(1+cos(mD*phi)); } +private: + const RealT mC, mD, mE; +}; + + +/// @brief Multi-threaded computation of surface area, volume and +/// average mean-curvature for narrow band level sets. +/// +/// @details To reduce the risk of round-off errors (primarily due to +/// catastrophic cancellation) and guarantee determinism during +/// multi-threading this class is implemented using parallel_for, and +/// delayed reduction of a sorted list. +template +class LevelSetMeasure +{ +public: + typedef GridT GridType; + typedef typename GridType::TreeType TreeType; + typedef typename TreeType::ValueType ValueType; + typedef typename tree::LeafManager ManagerType; + BOOST_STATIC_ASSERT(boost::is_floating_point::value); + + /// @brief Main constructor from a grid + /// @param grid The level set to be measured. + /// @param interrupt Optional interrupter. + /// @throw RuntimeError if the grid is not a level set. + LevelSetMeasure(const GridType& grid, InterruptT* interrupt = NULL); + + LevelSetMeasure(ManagerType& leafs, Real Dx, InterruptT* interrupt); + + /// @brief Re-initialize using the specified grid. + void reinit(const GridType& grid); + + /// @brief Re-initialize using the specified LeafManager and voxelSize. + void reinit(ManagerType& leafs, Real dx); + + /// @brief Destructor + virtual ~LevelSetMeasure() {} + + /// @return the grain-size used for multi-threading + int getGrainSize() const { return mGrainSize; } + + /// @brief Set the grain-size used for multi-threading. + /// @note A grain size of 0 or less disables multi-threading! + void setGrainSize(int grainsize) { mGrainSize = grainsize; } + + /// @brief Compute the surface area and volume of the level + /// set. Use the last argument to specify the result in world or + /// voxel units. + /// @note This method is faster (about 3x) then the measure method + /// below that also computes the average mean-curvature. + void measure(Real& area, Real& volume, bool useWorldUnits = true); + + /// @brief Compute the surface area, volume, and average + /// mean-curvature of the level set. Use the last argument to + /// specify the result in world or voxel units. + /// @note This method is slower (about 3x) then the measure method + /// above that only computes the area and volume. + void measure(Real& area, Real& volume, Real& avgMeanCurvature, bool useWorldUnits = true); + +private: + // disallow copy construction and copy by assignment! + LevelSetMeasure(const LevelSetMeasure&);// not implemented + LevelSetMeasure& operator=(const LevelSetMeasure&);// not implemented + + const TreeType* mTree; + ManagerType* mLeafs; + InterruptT* mInterrupter; + double mDx; + double* mArray; + int mGrainSize; + + // @brief Return false if the process was interrupted + bool checkInterrupter(); + + typedef typename TreeType::LeafNodeType LeafT; + typedef typename LeafT::ValueOnCIter VoxelCIterT; + typedef typename ManagerType::LeafRange LeafRange; + typedef typename LeafRange::Iterator LeafIterT; + + struct Measure2 + { + Measure2(LevelSetMeasure* parent) : mParent(parent), mAcc(*mParent->mTree) + { + if (parent->mGrainSize>0) { + tbb::parallel_for(parent->mLeafs->leafRange(parent->mGrainSize), *this); + } else { + (*this)(parent->mLeafs->leafRange()); + } + } + Measure2(const Measure2& other) : mParent(other.mParent), mAcc(*mParent->mTree) {} + void operator()(const LeafRange& range) const; + LevelSetMeasure* mParent; + typename GridT::ConstAccessor mAcc; + }; + struct Measure3 + { + Measure3(LevelSetMeasure* parent) : mParent(parent), mAcc(*mParent->mTree) + { + if (parent->mGrainSize>0) { + tbb::parallel_for(parent->mLeafs->leafRange(parent->mGrainSize), *this); + } else { + (*this)(parent->mLeafs->leafRange()); + } + } + Measure3(const Measure3& other) : mParent(other.mParent), mAcc(*mParent->mTree) {} + void operator()(const LeafRange& range) const; + LevelSetMeasure* mParent; + typename GridT::ConstAccessor mAcc; + }; + inline double reduce(double* first, double scale) + { + double* last = first + mLeafs->leafCount(); + tbb::parallel_sort(first, last);//reduces catastrophic cancellation + Real sum = 0.0; + while(first != last) sum += *first++; + return scale * sum; + } + +}; // end of LevelSetMeasure class + + +template +inline +LevelSetMeasure::LevelSetMeasure(const GridType& grid, InterruptT* interrupt) + : mTree(&(grid.tree())) + , mLeafs(NULL) + , mInterrupter(interrupt) + , mDx(grid.voxelSize()[0]) + , mArray(NULL) + , mGrainSize(1) +{ + if (!grid.hasUniformVoxels()) { + OPENVDB_THROW(RuntimeError, + "The transform must have uniform scale for the LevelSetMeasure to function"); + } + if (grid.getGridClass() != GRID_LEVEL_SET) { + OPENVDB_THROW(RuntimeError, + "LevelSetMeasure only supports level sets;" + " try setting the grid class to \"level set\""); + } +} + + +template +inline +LevelSetMeasure::LevelSetMeasure( + ManagerType& leafs, Real dx, InterruptT* interrupt) + : mTree(&(leafs.tree())) + , mLeafs(&leafs) + , mInterrupter(interrupt) + , mDx(dx) + , mArray(NULL) + , mGrainSize(1) +{ +} + +template +inline void +LevelSetMeasure::reinit(const GridType& grid) +{ + if (!grid.hasUniformVoxels()) { + OPENVDB_THROW(RuntimeError, + "The transform must have uniform scale for the LevelSetMeasure to function"); + } + if (grid.getGridClass() != GRID_LEVEL_SET) { + OPENVDB_THROW(RuntimeError, + "LevelSetMeasure only supports level sets;" + " try setting the grid class to \"level set\""); + } + mTree = &(grid.tree()); + mLeafs = NULL; + mDx = grid.voxelSize()[0]; +} + + +template +inline void +LevelSetMeasure::reinit(ManagerType& leafs, Real dx) +{ + mLeafs = &leafs; + mTree = &(leafs.tree()); + mDx = dx; +} + +//////////////////////////////////////// + + +template +inline void +LevelSetMeasure::measure(Real& area, Real& volume, bool useWorldUnits) +{ + if (mInterrupter) mInterrupter->start("Measuring level set"); + + + const bool newLeafs = mLeafs == NULL; + if (newLeafs) mLeafs = new ManagerType(*mTree); + const size_t leafCount = mLeafs->leafCount(); + if (leafCount == 0) { + area = volume = 0; + return; + } + mArray = new double[2*leafCount]; + + Measure2 m(this); + + const double dx = useWorldUnits ? mDx : 1.0; + area = this->reduce(mArray, math::Pow2(dx)); + volume = this->reduce(mArray + leafCount, math::Pow3(dx) / 3.0); + + if (newLeafs) { + delete mLeafs; + mLeafs = NULL; + } + delete [] mArray; + + if (mInterrupter) mInterrupter->end(); +} + + +template +inline void +LevelSetMeasure::measure(Real& area, Real& volume, + Real& avgMeanCurvature, + bool useWorldUnits) +{ + if (mInterrupter) mInterrupter->start("Measuring level set"); + + const bool newLeafs = mLeafs == NULL; + if (newLeafs) mLeafs = new ManagerType(*mTree); + const size_t leafCount = mLeafs->leafCount(); + if (leafCount == 0) { + area = volume = avgMeanCurvature = 0; + return; + } + mArray = new double[3*leafCount]; + + Measure3 m(this); + + const double dx = useWorldUnits ? mDx : 1.0; + area = this->reduce(mArray, math::Pow2(dx)); + volume = this->reduce(mArray + leafCount, math::Pow3(dx) / 3.0); + avgMeanCurvature = this->reduce(mArray + 2*leafCount, dx/area); + + if (newLeafs) { + delete mLeafs; + mLeafs = NULL; + } + delete [] mArray; + + if (mInterrupter) mInterrupter->end(); +} + + +///////////////////////// PRIVATE METHODS ////////////////////// + + +template +inline bool +LevelSetMeasure::checkInterrupter() +{ + if (util::wasInterrupted(mInterrupter)) { + tbb::task::self().cancel_group_execution(); + return false; + } + return true; +} + +template +inline void +LevelSetMeasure:: +Measure2::operator()(const LeafRange& range) const +{ + typedef math::Vec3 Vec3T; + typedef math::ISGradient Grad; + mParent->checkInterrupter(); + const Real invDx = 1.0/mParent->mDx; + const DiracDelta DD(1.5); + const size_t leafCount = mParent->mLeafs->leafCount(); + for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) { + Real sumA = 0, sumV = 0;//reduce risk of catastrophic cancellation + for (VoxelCIterT voxelIter = leafIter->cbeginValueOn(); voxelIter; ++voxelIter) { + const Real dd = DD(invDx * (*voxelIter)); + if (dd > 0.0) { + const Coord p = voxelIter.getCoord(); + const Vec3T g = invDx*Grad::result(mAcc, p);//voxel units + sumA += dd * g.dot(g); + sumV += dd * (g[0]*p[0]+g[1]*p[1]+g[2]*p[2]); + } + } + double* v = mParent->mArray + leafIter.pos(); + *v = sumA; + v += leafCount; + *v = sumV; + } +} + +template +inline void +LevelSetMeasure:: +Measure3::operator()(const LeafRange& range) const +{ + typedef math::Vec3 Vec3T; + typedef math::ISGradient Grad; + typedef math::ISMeanCurvature Curv; + mParent->checkInterrupter(); + const Real invDx = 1.0/mParent->mDx; + const DiracDelta DD(1.5); + ValueType alpha, beta; + const size_t leafCount = mParent->mLeafs->leafCount(); + for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) { + Real sumA = 0, sumV = 0, sumC = 0;//reduce risk of catastrophic cancellation + for (VoxelCIterT voxelIter = leafIter->cbeginValueOn(); voxelIter; ++voxelIter) { + const Real dd = DD(invDx * (*voxelIter)); + if (dd > 0.0) { + const Coord p = voxelIter.getCoord(); + const Vec3T g = invDx*Grad::result(mAcc, p);//voxel units + const Real dA = dd * g.dot(g); + sumA += dA; + sumV += dd * (g[0]*p[0]+g[1]*p[1]+g[2]*p[2]); + Curv::result(mAcc, p, alpha, beta); + sumC += dA * alpha/(2*math::Pow2(beta))*invDx; + } + } + double* v = mParent->mArray + leafIter.pos(); + *v = sumA; + v += leafCount; + *v = sumV; + v += leafCount; + *v = sumC; + } +} + +//////////////////////////////////////// + +template +inline typename boost::enable_if, Real>::type +doLevelSetArea(const GridT& grid, bool useWorldSpace) +{ + Real area, volume; + LevelSetMeasure m(grid); + m.measure(area, volume, useWorldSpace); + return area; +} + +template +inline typename boost::disable_if, Real>::type +doLevelSetArea(const GridT&, bool) +{ + OPENVDB_THROW(TypeError, + "level set area is supported only for scalar, floating-point grids"); +} + +template +inline Real +levelSetArea(const GridT& grid, bool useWorldSpace) +{ + return doLevelSetArea(grid, useWorldSpace); +} + +//////////////////////////////////////// + +template +inline typename boost::enable_if, Real>::type +doLevelSetVolume(const GridT& grid, bool useWorldSpace) +{ + Real area, volume; + LevelSetMeasure m(grid); + m.measure(area, volume, useWorldSpace); + return volume; +} + +template +inline typename boost::disable_if, Real>::type +doLevelSetVolume(const GridT&, bool) +{ + OPENVDB_THROW(TypeError, + "level set volume is supported only for scalar, floating-point grids"); +} + +template +inline Real +levelSetVolume(const GridT& grid, bool useWorldSpace) +{ + return doLevelSetVolume(grid, useWorldSpace); +} + +//////////////////////////////////////// + +template +inline typename boost::enable_if >::type +doLevelSetMeasure(const GridT& grid, Real& area, Real& volume, bool useWorldSpace) +{ + LevelSetMeasure m(grid); + m.measure(area, volume, useWorldSpace); +} + +template +inline typename boost::disable_if >::type +doLevelSetMeasure(const GridT&, Real&, Real&, bool) +{ + OPENVDB_THROW(TypeError, + "level set measure is supported only for scalar, floating-point grids"); +} + +template +inline void +levelSetMeasure(const GridT& grid, Real& area, Real& volume, bool useWorldSpace) +{ + doLevelSetMeasure(grid, area, volume, useWorldSpace); +} + +//////////////////////////////////////// + +template +inline typename boost::enable_if >::type +doLevelSetMeasure(const GridT& grid, Real& area, Real& volume, Real& avgCurvature, + bool useWorldSpace) +{ + LevelSetMeasure m(grid); + m.measure(area, volume, avgCurvature, useWorldSpace); +} + +template +inline typename boost::disable_if >::type +doLevelSetMeasure(const GridT&, Real&, Real&, Real&, bool) +{ + OPENVDB_THROW(TypeError, + "level set measure is supported only for scalar, floating-point grids"); +} + +template +inline void +levelSetMeasure(const GridT& grid, Real& area, Real& volume, Real& avgCurvature, bool useWorldSpace) +{ + doLevelSetMeasure(grid, area, volume, avgCurvature, useWorldSpace); +} + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_LEVELSETMEASURE_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/LevelSetMorph.h b/nuparu/include/openvdb/include/openvdb/tools/LevelSetMorph.h new file mode 100644 index 00000000..618d5bea --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/LevelSetMorph.h @@ -0,0 +1,664 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/////////////////////////////////////////////////////////////////////////// +// +/// @author Ken Museth +/// +/// @file LevelSetMorph.h +/// +/// @brief Shape morphology of level sets. Morphing from a source +/// narrow-band level sets to a target narrow-band level set. + +#ifndef OPENVDB_TOOLS_LEVEL_SET_MORPH_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_LEVEL_SET_MORPH_HAS_BEEN_INCLUDED + +#include "LevelSetTracker.h" +#include "Interpolation.h" // for BoxSampler, etc. +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + + +/// @brief Shape morphology of level sets. Morphing from a source +/// narrow-band level sets to a target narrow-band level set. +/// +/// @details +/// The @c InterruptType template argument below refers to any class +/// with the following interface: +/// @code +/// class Interrupter { +/// ... +/// public: +/// void start(const char* name = NULL)// called when computations begin +/// void end() // called when computations end +/// bool wasInterrupted(int percent=-1)// return true to break computation +/// }; +/// @endcode +/// +/// @note If no template argument is provided for this InterruptType, +/// the util::NullInterrupter is used, which implies that all interrupter +/// calls are no-ops (i.e., they incur no computational overhead). +template +class LevelSetMorphing +{ +public: + typedef GridT GridType; + typedef typename GridT::TreeType TreeType; + typedef LevelSetTracker TrackerT; + typedef typename TrackerT::LeafRange LeafRange; + typedef typename TrackerT::LeafType LeafType; + typedef typename TrackerT::BufferType BufferType; + typedef typename TrackerT::ValueType ValueType; + + /// Main constructor + LevelSetMorphing(GridT& sourceGrid, + const GridT& targetGrid, + InterruptT* interrupt = NULL) + : mTracker(sourceGrid, interrupt) + , mTarget(&targetGrid) + , mMask(NULL) + , mSpatialScheme(math::HJWENO5_BIAS) + , mTemporalScheme(math::TVD_RK2) + , mMinMask(0) + , mDeltaMask(1) + , mInvertMask(false) + { + } + + virtual ~LevelSetMorphing() {} + + /// Redefine the target level set + void setTarget(const GridT& targetGrid) { mTarget = &targetGrid; } + + /// Define the alpha mask + void setAlphaMask(const GridT& maskGrid) { mMask = &maskGrid; } + + /// Return the spatial finite-difference scheme + math::BiasedGradientScheme getSpatialScheme() const { return mSpatialScheme; } + /// Set the spatial finite-difference scheme + void setSpatialScheme(math::BiasedGradientScheme scheme) { mSpatialScheme = scheme; } + + /// Return the temporal integration scheme + math::TemporalIntegrationScheme getTemporalScheme() const { return mTemporalScheme; } + /// Set the temporal integration scheme + void setTemporalScheme(math::TemporalIntegrationScheme scheme) { mTemporalScheme = scheme; } + + /// Return the spatial finite-difference scheme + math::BiasedGradientScheme getTrackerSpatialScheme() const + { + return mTracker.getSpatialScheme(); + } + /// Set the spatial finite-difference scheme + void setTrackerSpatialScheme(math::BiasedGradientScheme scheme) + { + mTracker.setSpatialScheme(scheme); + } + /// Return the temporal integration scheme + math::TemporalIntegrationScheme getTrackerTemporalScheme() const + { + return mTracker.getTemporalScheme(); + } + /// Set the temporal integration scheme + void setTrackerTemporalScheme(math::TemporalIntegrationScheme scheme) + { + mTracker.setTemporalScheme(scheme); + } + /// Return the number of normalizations performed per track or normalize call. + int getNormCount() const { return mTracker.getNormCount(); } + /// Set the number of normalizations performed per track or normalize call. + void setNormCount(int n) { mTracker.setNormCount(n); } + + /// Return the grain size used for multithreading + int getGrainSize() const { return mTracker.getGrainSize(); } + /// @brief Set the grain size used for multithreading. + /// @note A grain size of 0 or less disables multithreading! + void setGrainSize(int grainsize) { mTracker.setGrainSize(grainsize); } + + /// @brief Return the minimum value of the mask to be used for the + /// derivation of a smooth alpha value. + ValueType minMask() const { return mMinMask; } + + /// @brief Return the maximum value of the mask to be used for the + /// derivation of a smooth alpha value. + ValueType maxMask() const { return mDeltaMask + mMinMask; } + + /// @brief Define the range for the (optional) scalar mask. + /// @param min Minimum value of the range. + /// @param max Maximum value of the range. + /// @details Mask values outside the range maps to alpha values of + /// respectfully zero and one, and values inside the range maps + /// smoothly to 0->1 (unless of course the mask is inverted). + /// @throw ValueError if @a min is not smaller than @a max. + void setMaskRange(ValueType min, ValueType max) + { + if (!(min < max)) OPENVDB_THROW(ValueError, "Invalid mask range (expects min < max)"); + mMinMask = min; + mDeltaMask = max-min; + } + + /// @brief Return true if the mask is inverted, i.e. min->max in the + /// original mask maps to 1->0 in the inverted alpha mask. + bool isMaskInverted() const { return mInvertMask; } + /// @brief Invert the optional mask, i.e. min->max in the original + /// mask maps to 1->0 in the inverted alpha mask. + void invertMask(bool invert=true) { mInvertMask = invert; } + + /// @brief Advect the level set from its current time, @a time0, to its + /// final time, @a time1. If @a time0 > @a time1, perform backward advection. + /// + /// @return the number of CFL iterations used to advect from @a time0 to @a time1 + size_t advect(ValueType time0, ValueType time1); + +private: + + // disallow copy construction and copy by assignment! + LevelSetMorphing(const LevelSetMorphing&);// not implemented + LevelSetMorphing& operator=(const LevelSetMorphing&);// not implemented + + template + size_t advect1(ValueType time0, ValueType time1); + + template + size_t advect2(ValueType time0, ValueType time1); + + template + size_t advect3(ValueType time0, ValueType time1); + + TrackerT mTracker; + const GridT *mTarget, *mMask; + math::BiasedGradientScheme mSpatialScheme; + math::TemporalIntegrationScheme mTemporalScheme; + ValueType mMinMask, mDeltaMask; + bool mInvertMask; + + // This templated private class implements all the level set magic. + template + struct Morph + { + /// Main constructor + Morph(LevelSetMorphing& parent); + /// Shallow copy constructor called by tbb::parallel_for() threads + Morph(const Morph& other); + /// Shallow copy constructor called by tbb::parallel_reduce() threads + Morph(Morph& other, tbb::split); + /// destructor + virtual ~Morph() {} + /// Advect the level set from its current time, time0, to its final time, time1. + /// @return number of CFL iterations + size_t advect(ValueType time0, ValueType time1); + /// Used internally by tbb::parallel_for() + void operator()(const LeafRange& r) const + { + if (mTask) mTask(const_cast(this), r); + else OPENVDB_THROW(ValueError, "task is undefined - don\'t call this method directly"); + } + /// Used internally by tbb::parallel_reduce() + void operator()(const LeafRange& r) + { + if (mTask) mTask(this, r); + else OPENVDB_THROW(ValueError, "task is undefined - don\'t call this method directly"); + } + /// This is only called by tbb::parallel_reduce() threads + void join(const Morph& other) { mMaxAbsS = math::Max(mMaxAbsS, other.mMaxAbsS); } + + /// Enum to define the type of multithreading + enum ThreadingMode { PARALLEL_FOR, PARALLEL_REDUCE }; // for internal use + // method calling tbb + void cook(ThreadingMode mode, size_t swapBuffer = 0); + + /// Sample field and return the CFT time step + typename GridT::ValueType sampleSpeed(ValueType time0, ValueType time1, Index speedBuffer); + void sampleXformedSpeed(const LeafRange& r, Index speedBuffer); + void sampleAlignedSpeed(const LeafRange& r, Index speedBuffer); + + // Convex combination of Phi and a forward Euler advection steps: + // Phi(result) = alpha * Phi(phi) + (1-alpha) * (Phi(0) - dt * Speed(speed)*|Grad[Phi(0)]|); + template + void euler(const LeafRange&, ValueType, Index, Index, Index); + inline void euler01(const LeafRange& r, ValueType t, Index s) {this->euler<0,1>(r,t,0,1,s);} + inline void euler12(const LeafRange& r, ValueType t) {this->euler<1,2>(r, t, 1, 1, 2);} + inline void euler34(const LeafRange& r, ValueType t) {this->euler<3,4>(r, t, 1, 2, 3);} + inline void euler13(const LeafRange& r, ValueType t) {this->euler<1,3>(r, t, 1, 2, 3);} + + typedef typename boost::function FuncType; + LevelSetMorphing* mParent; + ValueType mMinAbsS, mMaxAbsS; + const MapT* mMap; + FuncType mTask; + }; // end of private Morph struct + +};//end of LevelSetMorphing + +template +inline size_t +LevelSetMorphing::advect(ValueType time0, ValueType time1) +{ + switch (mSpatialScheme) { + case math::FIRST_BIAS: + return this->advect1(time0, time1); + //case math::SECOND_BIAS: + //return this->advect1(time0, time1); + //case math::THIRD_BIAS: + //return this->advect1(time0, time1); + //case math::WENO5_BIAS: + //return this->advect1(time0, time1); + case math::HJWENO5_BIAS: + return this->advect1(time0, time1); + default: + OPENVDB_THROW(ValueError, "Spatial difference scheme not supported!"); + } + return 0; +} + +template +template +inline size_t +LevelSetMorphing::advect1(ValueType time0, ValueType time1) +{ + switch (mTemporalScheme) { + case math::TVD_RK1: + return this->advect2(time0, time1); + case math::TVD_RK2: + return this->advect2(time0, time1); + case math::TVD_RK3: + return this->advect2(time0, time1); + default: + OPENVDB_THROW(ValueError, "Temporal integration scheme not supported!"); + } + return 0; +} + +template +template +inline size_t +LevelSetMorphing::advect2(ValueType time0, ValueType time1) +{ + const math::Transform& trans = mTracker.grid().transform(); + if (trans.mapType() == math::UniformScaleMap::mapType()) { + return this->advect3(time0, time1); + } else if (trans.mapType() == math::UniformScaleTranslateMap::mapType()) { + return this->advect3( + time0, time1); + } else if (trans.mapType() == math::UnitaryMap::mapType()) { + return this->advect3(time0, time1); + } else if (trans.mapType() == math::TranslationMap::mapType()) { + return this->advect3(time0, time1); + } else { + OPENVDB_THROW(ValueError, "MapType not supported!"); + } + return 0; +} + +template +template +inline size_t +LevelSetMorphing::advect3(ValueType time0, ValueType time1) +{ + Morph tmp(*this); + return tmp.advect(time0, time1); +} + + +/////////////////////////////////////////////////////////////////////// + +template +template +inline +LevelSetMorphing:: +Morph:: +Morph(LevelSetMorphing& parent) + : mParent(&parent) + , mMinAbsS(ValueType(1e-6)) + , mMap(parent.mTracker.grid().transform().template constMap().get()) + , mTask(0) +{ +} + +template +template +inline +LevelSetMorphing:: +Morph:: +Morph(const Morph& other) + : mParent(other.mParent) + , mMinAbsS(other.mMinAbsS) + , mMaxAbsS(other.mMaxAbsS) + , mMap(other.mMap) + , mTask(other.mTask) +{ +} + +template +template +inline +LevelSetMorphing:: +Morph:: +Morph(Morph& other, tbb::split) + : mParent(other.mParent) + , mMinAbsS(other.mMinAbsS) + , mMaxAbsS(other.mMaxAbsS) + , mMap(other.mMap) + , mTask(other.mTask) +{ +} + +template +template +inline size_t +LevelSetMorphing:: +Morph:: +advect(ValueType time0, ValueType time1) +{ + // Make sure we have enough temporal auxiliary buffers for the time + // integration AS WELL AS an extra buffer with the speed function! + static const Index auxBuffers = 1 + (TemporalScheme == math::TVD_RK3 ? 2 : 1); + size_t countCFL = 0; + while (time0 < time1 && mParent->mTracker.checkInterrupter()) { + mParent->mTracker.leafs().rebuildAuxBuffers(auxBuffers); + + const ValueType dt = this->sampleSpeed(time0, time1, auxBuffers); + if ( math::isZero(dt) ) break;//V is essentially zero so terminate + + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN //switch is resolved at compile-time + switch(TemporalScheme) { + case math::TVD_RK1: + // Perform one explicit Euler step: t1 = t0 + dt + // Phi_t1(1) = Phi_t0(0) - dt * Speed(2) * |Grad[Phi(0)]| + mTask = boost::bind(&Morph::euler01, _1, _2, dt, /*speed*/2); + + // Cook and swap buffer 0 and 1 such that Phi_t1(0) and Phi_t0(1) + this->cook(PARALLEL_FOR, 1); + break; + case math::TVD_RK2: + // Perform one explicit Euler step: t1 = t0 + dt + // Phi_t1(1) = Phi_t0(0) - dt * Speed(2) * |Grad[Phi(0)]| + mTask = boost::bind(&Morph::euler01, _1, _2, dt, /*speed*/2); + + // Cook and swap buffer 0 and 1 such that Phi_t1(0) and Phi_t0(1) + this->cook(PARALLEL_FOR, 1); + + // Convex combine explict Euler step: t2 = t0 + dt + // Phi_t2(1) = 1/2 * Phi_t0(1) + 1/2 * (Phi_t1(0) - dt * Speed(2) * |Grad[Phi(0)]|) + mTask = boost::bind(&Morph::euler12, _1, _2, dt); + + // Cook and swap buffer 0 and 1 such that Phi_t2(0) and Phi_t1(1) + this->cook(PARALLEL_FOR, 1); + break; + case math::TVD_RK3: + // Perform one explicit Euler step: t1 = t0 + dt + // Phi_t1(1) = Phi_t0(0) - dt * Speed(3) * |Grad[Phi(0)]| + mTask = boost::bind(&Morph::euler01, _1, _2, dt, /*speed*/3); + + // Cook and swap buffer 0 and 1 such that Phi_t1(0) and Phi_t0(1) + this->cook(PARALLEL_FOR, 1); + + // Convex combine explict Euler step: t2 = t0 + dt/2 + // Phi_t2(2) = 3/4 * Phi_t0(1) + 1/4 * (Phi_t1(0) - dt * Speed(3) * |Grad[Phi(0)]|) + mTask = boost::bind(&Morph::euler34, _1, _2, dt); + + // Cook and swap buffer 0 and 2 such that Phi_t2(0) and Phi_t1(2) + this->cook(PARALLEL_FOR, 2); + + // Convex combine explict Euler step: t3 = t0 + dt + // Phi_t3(2) = 1/3 * Phi_t0(1) + 2/3 * (Phi_t2(0) - dt * Speed(3) * |Grad[Phi(0)]|) + mTask = boost::bind(&Morph::euler13, _1, _2, dt); + + // Cook and swap buffer 0 and 2 such that Phi_t3(0) and Phi_t2(2) + this->cook(PARALLEL_FOR, 2); + break; + default: + OPENVDB_THROW(ValueError, "Temporal integration scheme not supported!"); + }//end of compile-time resolved switch + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + + time0 += dt; + ++countCFL; + mParent->mTracker.leafs().removeAuxBuffers(); + + // Track the narrow band + mParent->mTracker.track(); + }//end wile-loop over time + + return countCFL;//number of CLF propagation steps +} + +template +template +inline typename GridT::ValueType +LevelSetMorphing:: +Morph:: +sampleSpeed(ValueType time0, ValueType time1, Index speedBuffer) +{ + mMaxAbsS = mMinAbsS; + const size_t leafCount = mParent->mTracker.leafs().leafCount(); + if (leafCount==0 || time0 >= time1) return ValueType(0); + + const math::Transform& xform = mParent->mTracker.grid().transform(); + if (mParent->mTarget->transform() == xform && + (mParent->mMask == NULL || mParent->mMask->transform() == xform)) { + mTask = boost::bind(&Morph::sampleAlignedSpeed, _1, _2, speedBuffer); + } else { + mTask = boost::bind(&Morph::sampleXformedSpeed, _1, _2, speedBuffer); + } + this->cook(PARALLEL_REDUCE); + if (math::isApproxEqual(mMinAbsS, mMaxAbsS)) return ValueType(0);//speed is essentially zero + static const ValueType CFL = (TemporalScheme == math::TVD_RK1 ? ValueType(0.3) : + TemporalScheme == math::TVD_RK2 ? ValueType(0.9) : + ValueType(1.0))/math::Sqrt(ValueType(3.0)); + const ValueType dt = math::Abs(time1 - time0), dx = mParent->mTracker.voxelSize(); + return math::Min(dt, ValueType(CFL*dx/mMaxAbsS)); +} + +template +template +inline void +LevelSetMorphing:: +Morph:: +sampleXformedSpeed(const LeafRange& range, Index speedBuffer) +{ + typedef typename LeafType::ValueOnCIter VoxelIterT; + typedef tools::GridSampler SamplerT; + const MapT& map = *mMap; + mParent->mTracker.checkInterrupter(); + + typename GridT::ConstAccessor targetAcc = mParent->mTarget->getAccessor(); + SamplerT target(targetAcc, mParent->mTarget->transform()); + if (mParent->mMask == NULL) { + for (typename LeafRange::Iterator leafIter = range.begin(); leafIter; ++leafIter) { + ValueType* speed = leafIter.buffer(speedBuffer).data(); + bool isZero = true; + for (VoxelIterT voxelIter = leafIter->cbeginValueOn(); voxelIter; ++voxelIter) { + ValueType& s = speed[voxelIter.pos()]; + s -= target.wsSample(map.applyMap(voxelIter.getCoord().asVec3d())); + if (!math::isApproxZero(s)) isZero = false; + mMaxAbsS = math::Max(mMaxAbsS, math::Abs(s)); + } + if (isZero) speed[0] = std::numeric_limits::max();//tag first voxel + } + } else { + const ValueType min = mParent->mMinMask, invNorm = 1.0f/(mParent->mDeltaMask); + const bool invMask = mParent->isMaskInverted(); + typename GridT::ConstAccessor maskAcc = mParent->mMask->getAccessor(); + SamplerT mask(maskAcc, mParent->mMask->transform()); + for (typename LeafRange::Iterator leafIter = range.begin(); leafIter; ++leafIter) { + ValueType* speed = leafIter.buffer(speedBuffer).data(); + bool isZero = true; + for (VoxelIterT voxelIter = leafIter->cbeginValueOn(); voxelIter; ++voxelIter) { + const Vec3R xyz = map.applyMap(voxelIter.getCoord().asVec3d());//world space + const ValueType a = math::SmoothUnitStep((mask.wsSample(xyz)-min)*invNorm); + ValueType& s = speed[voxelIter.pos()]; + s -= target.wsSample(xyz); + s *= invMask ? 1 - a : a; + if (!math::isApproxZero(s)) isZero = false; + mMaxAbsS = math::Max(mMaxAbsS, math::Abs(s)); + } + if (isZero) speed[0] = std::numeric_limits::max();//tag first voxel + } + } +} + +template +template +inline void +LevelSetMorphing:: +Morph:: +sampleAlignedSpeed(const LeafRange& range, Index speedBuffer) +{ + typedef typename LeafType::ValueOnCIter VoxelIterT; + mParent->mTracker.checkInterrupter(); + + typename GridT::ConstAccessor target = mParent->mTarget->getAccessor(); + + if (mParent->mMask == NULL) { + for (typename LeafRange::Iterator leafIter = range.begin(); leafIter; ++leafIter) { + ValueType* speed = leafIter.buffer(speedBuffer).data(); + bool isZero = true; + for (VoxelIterT voxelIter = leafIter->cbeginValueOn(); voxelIter; ++voxelIter) { + ValueType& s = speed[voxelIter.pos()]; + s -= target.getValue(voxelIter.getCoord()); + if (!math::isApproxZero(s)) isZero = false; + mMaxAbsS = math::Max(mMaxAbsS, math::Abs(s)); + } + if (isZero) speed[0] = std::numeric_limits::max();//tag first voxel + } + } else { + const ValueType min = mParent->mMinMask, invNorm = 1.0f/(mParent->mDeltaMask); + const bool invMask = mParent->isMaskInverted(); + typename GridT::ConstAccessor mask = mParent->mMask->getAccessor(); + for (typename LeafRange::Iterator leafIter = range.begin(); leafIter; ++leafIter) { + ValueType* speed = leafIter.buffer(speedBuffer).data(); + bool isZero = true; + for (VoxelIterT voxelIter = leafIter->cbeginValueOn(); voxelIter; ++voxelIter) { + const Coord ijk = voxelIter.getCoord();//index space + const ValueType a = math::SmoothUnitStep((mask.getValue(ijk)-min)*invNorm); + ValueType& s = speed[voxelIter.pos()]; + s -= target.getValue(ijk); + s *= invMask ? 1 - a : a; + if (!math::isApproxZero(s)) isZero = false; + mMaxAbsS = math::Max(mMaxAbsS, math::Abs(s)); + } + if (isZero) speed[0] = std::numeric_limits::max();//tag first voxel + } + } +} + +template +template +inline void +LevelSetMorphing:: +Morph:: +cook(ThreadingMode mode, size_t swapBuffer) +{ + mParent->mTracker.startInterrupter("Morphing level set"); + + const int grainSize = mParent->mTracker.getGrainSize(); + const LeafRange range = mParent->mTracker.leafs().leafRange(grainSize); + + if (mParent->mTracker.getGrainSize()==0) { + (*this)(range); + } else if (mode == PARALLEL_FOR) { + tbb::parallel_for(range, *this); + } else if (mode == PARALLEL_REDUCE) { + tbb::parallel_reduce(range, *this); + } else { + throw std::runtime_error("Undefined threading mode"); + } + + mParent->mTracker.leafs().swapLeafBuffer(swapBuffer, grainSize == 0); + + mParent->mTracker.endInterrupter(); +} + +template +template +template +inline void +LevelSetMorphing:: +Morph:: +euler(const LeafRange& range, ValueType dt, + Index phiBuffer, Index resultBuffer, Index speedBuffer) +{ + typedef math::BIAS_SCHEME SchemeT; + typedef typename SchemeT::template ISStencil::StencilType StencilT; + typedef typename LeafType::ValueOnCIter VoxelIterT; + typedef math::GradientNormSqrd NumGrad; + + static const ValueType Alpha = ValueType(Nominator)/ValueType(Denominator); + static const ValueType Beta = ValueType(1) - Alpha; + + mParent->mTracker.checkInterrupter(); + const MapT& map = *mMap; + StencilT stencil(mParent->mTracker.grid()); + + for (typename LeafRange::Iterator leafIter = range.begin(); leafIter; ++leafIter) { + const ValueType* speed = leafIter.buffer(speedBuffer).data(); + if (math::isExactlyEqual(speed[0], std::numeric_limits::max())) continue; + const ValueType* phi = leafIter.buffer(phiBuffer).data(); + ValueType* result = leafIter.buffer(resultBuffer).data(); + for (VoxelIterT voxelIter = leafIter->cbeginValueOn(); voxelIter; ++voxelIter) { + const Index n = voxelIter.pos(); + if (math::isApproxZero(speed[n])) continue; + stencil.moveTo(voxelIter); + const ValueType v = stencil.getValue() - dt * speed[n] * NumGrad::result(map, stencil); + result[n] = Nominator ? Alpha * phi[n] + Beta * v : v; + }//loop over active voxels in the leaf of the mask + }//loop over leafs of the level set +} + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_LEVEL_SET_MORPH_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/LevelSetPlatonic.h b/nuparu/include/openvdb/include/openvdb/tools/LevelSetPlatonic.h new file mode 100644 index 00000000..09b1bc3b --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/LevelSetPlatonic.h @@ -0,0 +1,494 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +/// +/// @author Ken Museth +/// +/// @file LevelSetPlatonic.h +/// +/// @brief Generate a narrow-band level sets of the five platonic solids. +/// +/// @note By definition a level set has a fixed narrow band width +/// (the half width is defined by LEVEL_SET_HALF_WIDTH in Types.h), +/// whereas an SDF can have a variable narrow band width. + +#ifndef OPENVDB_TOOLS_LEVELSETPLATONIC_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_LEVELSETPLATONIC_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief Return a grid of type @c GridType containing a narrow-band level set +/// representation of a platonic solid. +/// +/// @param faceCount number of faces of the platonic solid, i.e. 4, 6, 8, 12 or 20 +/// @param scale scale of the platonic solid in world units +/// @param center center of the platonic solid in world units +/// @param voxelSize voxel size in world units +/// @param halfWidth half the width of the narrow band, in voxel units +/// @param interrupt a pointer adhering to the util::NullInterrupter interface +/// +/// @details Faces: TETRAHEDRON=4, CUBE=6, OCTAHEDRON=8, DODECAHEDRON=12, ICOSAHEDRON=20 +/// +/// @note @c GridType::ValueType must be a floating-point scalar. +template +typename GridType::Ptr +createLevelSetPlatonic(int faceCount,// 4, 6, 8, 12 or 20 + float scale = 1.0f, + const Vec3f& center = Vec3f(0.0f), + float voxelSize = 0.1f, + float halfWidth = float(LEVEL_SET_HALF_WIDTH), + InterruptT* interrupt = NULL); + +/// @brief Return a grid of type @c GridType containing a narrow-band level set +/// representation of a platonic solid. +/// +/// @param faceCount number of faces of the platonic solid, i.e. 4, 6, 8, 12 or 20 +/// @param scale scale of the platonic solid in world units +/// @param center center of the platonic solid in world units +/// @param voxelSize voxel size in world units +/// @param halfWidth half the width of the narrow band, in voxel units +/// +/// @details Faces: TETRAHEDRON=4, CUBE=6, OCTAHEDRON=8, DODECAHEDRON=12, ICOSAHEDRON=20 +/// +/// @note @c GridType::ValueType must be a floating-point scalar. +template +typename GridType::Ptr +createLevelSetPlatonic(int faceCount,// 4, 6, 8, 12 or 20 + float scale = 1.0f, + const Vec3f& center = Vec3f(0.0f), + float voxelSize = 0.1f, + float halfWidth = float(LEVEL_SET_HALF_WIDTH)) +{ + return createLevelSetPlatonic(faceCount, + scale, + center, + voxelSize, + halfWidth); +} + +//////////////////////////////////////////////////////////////////////////////// + +/// @brief Return a grid of type @c GridType containing a narrow-band level set +/// representation of a tetrahedron. +/// +/// @param scale scale of the platonic solid in world units +/// @param center center of the platonic solid in world units +/// @param voxelSize voxel size in world units +/// @param halfWidth half the width of the narrow band, in voxel units +/// @param interrupt a pointer adhering to the util::NullInterrupter interface +/// +/// @note @c GridType::ValueType must be a floating-point scalar. +template +typename GridType::Ptr +createLevelSetTetrahedron(float scale = 1.0f, + const Vec3f& center = Vec3f(0.0f), + float voxelSize = 0.1f, + float halfWidth = float(LEVEL_SET_HALF_WIDTH), + InterruptT* interrupt = NULL) +{ + return createLevelSetPlatonic(4, scale, center, + voxelSize, halfWidth, interrupt); +} + +/// @brief Return a grid of type @c GridType containing a narrow-band level set +/// representation of a tetrahedron. +/// +/// @param scale scale of the platonic solid in world units +/// @param center center of the platonic solid in world units +/// @param voxelSize voxel size in world units +/// @param halfWidth half the width of the narrow band, in voxel units +/// +/// @note @c GridType::ValueType must be a floating-point scalar. +template +typename GridType::Ptr +createLevelSetTetrahedron(float scale = 1.0f, + const Vec3f& center = Vec3f(0.0f), + float voxelSize = 0.1f, + float halfWidth = float(LEVEL_SET_HALF_WIDTH)) +{ + return createLevelSetPlatonic(4, scale, center, + voxelSize, halfWidth); +} + +//////////////////////////////////////////////////////////////////////////////// + +/// @brief Return a grid of type @c GridType containing a narrow-band level set +/// representation of a cube. +/// +/// @param scale scale of the platonic solid in world units +/// @param center center of the platonic solid in world units +/// @param voxelSize voxel size in world units +/// @param halfWidth half the width of the narrow band, in voxel units +/// @param interrupt a pointer adhering to the util::NullInterrupter interface +/// +/// @note @c GridType::ValueType must be a floating-point scalar. +template +typename GridType::Ptr +createLevelSetCube(float scale = 1.0f, + const Vec3f& center = Vec3f(0.0f), + float voxelSize = 0.1f, + float halfWidth = float(LEVEL_SET_HALF_WIDTH), + InterruptT* interrupt = NULL) +{ + return createLevelSetPlatonic(6, scale, center, + voxelSize, halfWidth, interrupt); +} + +/// @brief Return a grid of type @c GridType containing a narrow-band level set +/// representation of a cube. +/// +/// @param scale scale of the platonic solid in world units +/// @param center center of the platonic solid in world units +/// @param voxelSize voxel size in world units +/// @param halfWidth half the width of the narrow band, in voxel units +/// +/// @note @c GridType::ValueType must be a floating-point scalar. +template +typename GridType::Ptr +createLevelSetCube(float scale = 1.0f, + const Vec3f& center = Vec3f(0.0f), + float voxelSize = 0.1f, + float halfWidth = float(LEVEL_SET_HALF_WIDTH)) +{ + return createLevelSetPlatonic(6, scale, center, + voxelSize, halfWidth); +} + +//////////////////////////////////////////////////////////////////////////////// + +/// @brief Return a grid of type @c GridType containing a narrow-band level set +/// representation of an octahedron. +/// +/// @param scale scale of the platonic solid in world units +/// @param center center of the platonic solid in world units +/// @param voxelSize voxel size in world units +/// @param halfWidth half the width of the narrow band, in voxel units +/// @param interrupt a pointer adhering to the util::NullInterrupter interface +/// +/// @note @c GridType::ValueType must be a floating-point scalar. +template +typename GridType::Ptr +createLevelSetOctahedron(float scale = 1.0f, + const Vec3f& center = Vec3f(0.0f), + float voxelSize = 0.1f, + float halfWidth = float(LEVEL_SET_HALF_WIDTH), + InterruptT* interrupt = NULL) +{ + return createLevelSetPlatonic(8, scale, center, + voxelSize, halfWidth, interrupt); +} + +/// @brief Return a grid of type @c GridType containing a narrow-band level set +/// representation of an octahedron. +/// +/// @param scale scale of the platonic solid in world units +/// @param center center of the platonic solid in world units +/// @param voxelSize voxel size in world units +/// @param halfWidth half the width of the narrow band, in voxel units +/// +/// @note @c GridType::ValueType must be a floating-point scalar. +template +typename GridType::Ptr +createLevelSetOctahedron(float scale = 1.0f, + const Vec3f& center = Vec3f(0.0f), + float voxelSize = 0.1f, + float halfWidth = float(LEVEL_SET_HALF_WIDTH)) +{ + return createLevelSetPlatonic(8, scale, center, + voxelSize, halfWidth); +} + +//////////////////////////////////////////////////////////////////////////////// + +/// @brief Return a grid of type @c GridType containing a narrow-band level set +/// representation of a dodecahedron. +/// +/// @param scale scale of the platonic solid in world units +/// @param center center of the platonic solid in world units +/// @param voxelSize voxel size in world units +/// @param halfWidth half the width of the narrow band, in voxel units +/// @param interrupt a pointer adhering to the util::NullInterrupter interface +/// +/// @note @c GridType::ValueType must be a floating-point scalar. +template +typename GridType::Ptr +createLevelSetDodecahedron(float scale = 1.0f, + const Vec3f& center = Vec3f(0.0f), + float voxelSize = 0.1f, + float halfWidth = float(LEVEL_SET_HALF_WIDTH), + InterruptT* interrupt = NULL) +{ + return createLevelSetPlatonic(12, scale, center, + voxelSize, halfWidth, interrupt); +} + +/// @brief Return a grid of type @c GridType containing a narrow-band level set +/// representation of a dodecahedron. +/// +/// @param scale scale of the platonic solid in world units +/// @param center center of the platonic solid in world units +/// @param voxelSize voxel size in world units +/// @param halfWidth half the width of the narrow band, in voxel units +/// +/// @note @c GridType::ValueType must be a floating-point scalar. +template +typename GridType::Ptr +createLevelSetDodecahedron(float scale = 1.0f, + const Vec3f& center = Vec3f(0.0f), + float voxelSize = 0.1f, + float halfWidth = float(LEVEL_SET_HALF_WIDTH)) +{ + return createLevelSetPlatonic(12, scale, center, + voxelSize, halfWidth); +} + +//////////////////////////////////////////////////////////////////////////////// + +/// @brief Return a grid of type @c GridType containing a narrow-band level set +/// representation of an icosahedron. +/// +/// @param scale scale of the platonic solid in world units +/// @param center center of the platonic solid in world units +/// @param voxelSize voxel size in world units +/// @param halfWidth half the width of the narrow band, in voxel units +/// @param interrupt a pointer adhering to the util::NullInterrupter interface +/// +/// @note @c GridType::ValueType must be a floating-point scalar. +template +typename GridType::Ptr +createLevelSetIcosahedron(float scale = 1.0f, + const Vec3f& center = Vec3f(0.0f), + float voxelSize = 0.1f, + float halfWidth = float(LEVEL_SET_HALF_WIDTH), + InterruptT* interrupt = NULL) +{ + return createLevelSetPlatonic(20, scale, center, + voxelSize, halfWidth, interrupt); +} + +/// @brief Return a grid of type @c GridType containing a narrow-band level set +/// representation of an icosahedron. +/// +/// @param scale scale of the platonic solid in world units +/// @param center center of the platonic solid in world units +/// @param voxelSize voxel size in world units +/// @param halfWidth half the width of the narrow band, in voxel units +/// +/// @note @c GridType::ValueType must be a floating-point scalar. +template +typename GridType::Ptr +createLevelSetIcosahedron(float scale = 1.0f, + const Vec3f& center = Vec3f(0.0f), + float voxelSize = 0.1f, + float halfWidth = float(LEVEL_SET_HALF_WIDTH)) +{ + return createLevelSetPlatonic(20, scale, center, + voxelSize, halfWidth); +} + +//////////////////////////////////////////////////////////////////////////////// + +template +typename GridType::Ptr +createLevelSetPlatonic(int faceCount,float scale, const Vec3f& center, + float voxelSize, float halfWidth, InterruptT* interrupt) +{ + // GridType::ValueType is required to be a floating-point scalar. + BOOST_STATIC_ASSERT(boost::is_floating_point::value); + + const math::Transform::Ptr xform = math::Transform::createLinearTransform( voxelSize ); + + std::vector vtx; + std::vector tri; + std::vector qua; + + if (faceCount == 4) {// Tetrahedron + + vtx.push_back( Vec3f( 0.0f, 1.0f, 0.0f) ); + vtx.push_back( Vec3f(-0.942810297f, -0.333329707f, 0.0f) ); + vtx.push_back( Vec3f( 0.471405149f, -0.333329707f, 0.816497624) ); + vtx.push_back( Vec3f( 0.471405149f, -0.333329707f, -0.816497624f) ); + + tri.push_back( Vec3I(0, 2, 3) ); + tri.push_back( Vec3I(0, 3, 1) ); + tri.push_back( Vec3I(0, 1, 2) ); + tri.push_back( Vec3I(1, 3, 2) ); + + } else if (faceCount == 6) {// Cube + + vtx.push_back( Vec3f(-0.5f, -0.5f, -0.5f) ); + vtx.push_back( Vec3f( 0.5f, -0.5f, -0.5f) ); + vtx.push_back( Vec3f( 0.5f, -0.5f, 0.5f) ); + vtx.push_back( Vec3f(-0.5f, -0.5f, 0.5f) ); + vtx.push_back( Vec3f(-0.5f, 0.5f, -0.5f) ); + vtx.push_back( Vec3f( 0.5f, 0.5f, -0.5f) ); + vtx.push_back( Vec3f( 0.5f, 0.5f, 0.5f) ); + vtx.push_back( Vec3f(-0.5f, 0.5f, 0.5f) ); + + qua.push_back( Vec4I(1, 0, 4, 5) ); + qua.push_back( Vec4I(2, 1, 5, 6) ); + qua.push_back( Vec4I(3, 2, 6, 7) ); + qua.push_back( Vec4I(0, 3, 7, 4) ); + qua.push_back( Vec4I(2, 3, 0, 1) ); + qua.push_back( Vec4I(5, 4, 7, 6) ); + + } else if (faceCount == 8) {// Octahedron + + vtx.push_back( Vec3f( 0.0f, 0.0f, -1.0f) ); + vtx.push_back( Vec3f( 1.0f, 0.0f, 0.0f) ); + vtx.push_back( Vec3f( 0.0f, 0.0f, 1.0f) ); + vtx.push_back( Vec3f(-1.0f, 0.0f, 0.0f) ); + vtx.push_back( Vec3f( 0.0f,-1.0f, 0.0f) ); + vtx.push_back( Vec3f( 0.0f, 1.0f, 0.0f) ); + + tri.push_back( Vec3I(0, 4, 3) ); + tri.push_back( Vec3I(0, 1, 4) ); + tri.push_back( Vec3I(1, 2, 4) ); + tri.push_back( Vec3I(2, 3, 4) ); + tri.push_back( Vec3I(0, 3, 5) ); + tri.push_back( Vec3I(0, 5, 1) ); + tri.push_back( Vec3I(1, 5, 2) ); + tri.push_back( Vec3I(2, 5, 3) ); + + } else if (faceCount == 12) {// Dodecahedron + + vtx.push_back( Vec3f( 0.354437858f, 0.487842113f, -0.789344311f) ); + vtx.push_back( Vec3f( 0.573492587f, -0.186338872f, -0.78934437f) ); + vtx.push_back( Vec3f( 0.0f, -0.603005826f, -0.78934443f) ); + vtx.push_back( Vec3f(-0.573492587f, -0.186338872f, -0.78934437f) ); + vtx.push_back( Vec3f(-0.354437858f, 0.487842113f, -0.789344311f) ); + vtx.push_back( Vec3f(-0.573492587f, 0.789345026f, -0.186338797f) ); + vtx.push_back( Vec3f(-0.927930415f, -0.301502913f, -0.186338872f) ); + vtx.push_back( Vec3f( 0.0f, -0.975683928f, -0.186338902f) ); + vtx.push_back( Vec3f( 0.927930415f, -0.301502913f, -0.186338872f) ); + vtx.push_back( Vec3f( 0.573492587f, 0.789345026f, -0.186338797f) ); + vtx.push_back( Vec3f( 0.0f, 0.975683868f, 0.186338902f) ); + vtx.push_back( Vec3f(-0.927930415f, 0.301502913f, 0.186338872f) ); + vtx.push_back( Vec3f(-0.573492587f, -0.789345026f, 0.186338797f) ); + vtx.push_back( Vec3f( 0.573492587f, -0.789345026f, 0.186338797f) ); + vtx.push_back( Vec3f( 0.927930415f, 0.301502913f, 0.186338872f) ); + vtx.push_back( Vec3f( 0.0f, 0.603005826f, 0.78934443f) ); + vtx.push_back( Vec3f( 0.573492587f, 0.186338872f, 0.78934437f) ); + vtx.push_back( Vec3f( 0.354437858f, -0.487842113f, 0.789344311f) ); + vtx.push_back( Vec3f(-0.354437858f, -0.487842113f, 0.789344311f) ); + vtx.push_back( Vec3f(-0.573492587f, 0.186338872f, 0.78934437f) ); + + qua.push_back( Vec4I(0, 1, 2, 3) ); + tri.push_back( Vec3I(0, 3, 4) ); + qua.push_back( Vec4I(0, 4, 5, 10) ); + tri.push_back( Vec3I(0, 10, 9) ); + qua.push_back( Vec4I(0, 9, 14, 8) ); + tri.push_back( Vec3I(0, 8, 1) ); + qua.push_back( Vec4I(1, 8, 13, 7) ); + tri.push_back( Vec3I(1, 7, 2) ); + qua.push_back( Vec4I(2, 7, 12, 6) ); + tri.push_back( Vec3I(2, 6, 3) ); + qua.push_back( Vec4I(3, 6, 11, 5) ); + tri.push_back( Vec3I(3, 5, 4) ); + qua.push_back( Vec4I(5, 11, 19, 15) ); + tri.push_back( Vec3I(5, 15, 10) ); + qua.push_back( Vec4I(6, 12, 18, 19) ); + tri.push_back( Vec3I(6, 19, 11) ); + qua.push_back( Vec4I(7, 13, 17, 18) ); + tri.push_back( Vec3I(7, 18, 12) ); + qua.push_back( Vec4I(8, 14, 16, 17) ); + tri.push_back( Vec3I(8, 17, 13) ); + qua.push_back( Vec4I(9, 10, 15, 16) ); + tri.push_back( Vec3I(9, 16, 14) ); + qua.push_back( Vec4I(15, 19, 18, 17) ); + tri.push_back( Vec3I(15, 17, 16) ); + + } else if (faceCount == 20) {// Icosahedron + + vtx.push_back( Vec3f(0.0f, 0.0f, -1.0f) ); + vtx.push_back( Vec3f(0.0f, 0.894427359f, -0.447213143f) ); + vtx.push_back( Vec3f(0.850650847f, 0.276393682f, -0.447213203f) ); + vtx.push_back( Vec3f(0.525731206f, -0.723606944f, -0.447213262f) ); + vtx.push_back( Vec3f(-0.525731206f, -0.723606944f, -0.447213262f) ); + vtx.push_back( Vec3f(-0.850650847f, 0.276393682f, -0.447213203f) ); + vtx.push_back( Vec3f(-0.525731206f, 0.723606944f, 0.447213262f) ); + vtx.push_back( Vec3f(-0.850650847f, -0.276393682f, 0.447213203f) ); + vtx.push_back( Vec3f(0.0f, -0.894427359f, 0.447213143f) ); + vtx.push_back( Vec3f(0.850650847f, -0.276393682f, 0.447213203f) ); + vtx.push_back( Vec3f(0.525731206f, 0.723606944f, 0.447213262f) ); + vtx.push_back( Vec3f(0.0f, 0.0f, 1.0f) ); + + tri.push_back( Vec3I( 2, 0, 1) ); + tri.push_back( Vec3I( 3, 0, 2) ); + tri.push_back( Vec3I( 4, 0, 3) ); + tri.push_back( Vec3I( 5, 0, 4) ); + tri.push_back( Vec3I( 1, 0, 5) ); + tri.push_back( Vec3I( 6, 1, 5) ); + tri.push_back( Vec3I( 7, 5, 4) ); + tri.push_back( Vec3I( 8, 4, 3) ); + tri.push_back( Vec3I( 9, 3, 2) ); + tri.push_back( Vec3I(10, 2, 1) ); + tri.push_back( Vec3I(10, 1, 6) ); + tri.push_back( Vec3I( 6, 5, 7) ); + tri.push_back( Vec3I( 7, 4, 8) ); + tri.push_back( Vec3I( 8, 3, 9) ); + tri.push_back( Vec3I( 9, 2, 10) ); + tri.push_back( Vec3I( 6, 11, 10) ); + tri.push_back( Vec3I(10, 11, 9) ); + tri.push_back( Vec3I( 9, 11, 8) ); + tri.push_back( Vec3I( 8, 11, 7) ); + tri.push_back( Vec3I( 7, 11, 6) ); + + } else { + OPENVDB_THROW(RuntimeError, "Invalid face count"); + } + + // Apply scale and translation to all the vertices + for ( size_t i = 0; i( *xform, vtx, tri, qua, halfWidth ); +} + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_LEVELSETPLATONIC_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/LevelSetRebuild.h b/nuparu/include/openvdb/include/openvdb/tools/LevelSetRebuild.h new file mode 100644 index 00000000..9b1c7ddc --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/LevelSetRebuild.h @@ -0,0 +1,353 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_TOOLS_LEVELSETREBUILD_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_LEVELSETREBUILD_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + + +/// @brief Return a new grid of type @c GridType that contains a narrow-band level set +/// representation of an isosurface of a given grid. +/// +/// @param grid a scalar, floating-point grid with one or more disjoint, +/// closed isosurfaces at the given @a isovalue +/// @param isovalue the isovalue that defines the implicit surface (defaults to zero, +/// which is typical if the input grid is already a level set or a SDF). +/// @param halfWidth half the width of the narrow band, in voxel units +/// (defaults to 3 voxels, which is required for some level set operations) +/// @param xform optional transform for the output grid +/// (if not provided, the transform of the input @a grid will be matched) +/// +/// @throw TypeError if @a grid is not scalar or not floating-point +/// +/// @note If the input grid contains overlapping isosurfaces, interior edges will be lost. +template +inline typename GridType::Ptr +levelSetRebuild(const GridType& grid, float isovalue = 0, + float halfWidth = float(LEVEL_SET_HALF_WIDTH), const math::Transform* xform = NULL); + + +/// @brief Return a new grid of type @c GridType that contains a narrow-band level set +/// representation of an isosurface of a given grid. +/// +/// @param grid a scalar, floating-point grid with one or more disjoint, +/// closed isosurfaces at the given @a isovalue +/// @param isovalue the isovalue that defines the implicit surface +/// @param exBandWidth the exterior narrow-band width in voxel units +/// @param inBandWidth the interior narrow-band width in voxel units +/// @param xform optional transform for the output grid +/// (if not provided, the transform of the input @a grid will be matched) +/// +/// @throw TypeError if @a grid is not scalar or not floating-point +/// +/// @note If the input grid contains overlapping isosurfaces, interior edges will be lost. +template +inline typename GridType::Ptr +levelSetRebuild(const GridType& grid, float isovalue, float exBandWidth, float inBandWidth, + const math::Transform* xform = NULL); + + +/// @brief Return a new grid of type @c GridType that contains a narrow-band level set +/// representation of an isosurface of a given grid. +/// +/// @param grid a scalar, floating-point grid with one or more disjoint, +/// closed isosurfaces at the given @a isovalue +/// @param isovalue the isovalue that defines the implicit surface +/// @param exBandWidth the exterior narrow-band width in voxel units +/// @param inBandWidth the interior narrow-band width in voxel units +/// @param xform optional transform for the output grid +/// (if not provided, the transform of the input @a grid will be matched) +/// @param interrupter optional interrupter object +/// +/// @throw TypeError if @a grid is not scalar or not floating-point +/// +/// @note If the input grid contains overlapping isosurfaces, interior edges will be lost. +template +inline typename GridType::Ptr +levelSetRebuild(const GridType& grid, float isovalue, float exBandWidth, float inBandWidth, + const math::Transform* xform = NULL, InterruptT* interrupter = NULL); + + +//////////////////////////////////////// + + +// Internal utility objects and implementation details + +namespace internal { + +class PointListTransform +{ +public: + PointListTransform(const PointList& pointsIn, std::vector& pointsOut, + const math::Transform& xform) + : mPointsIn(pointsIn) + , mPointsOut(&pointsOut) + , mXform(xform) + { + } + + void runParallel() + { + tbb::parallel_for(tbb::blocked_range(0, mPointsOut->size()), *this); + } + + void runSerial() + { + (*this)(tbb::blocked_range(0, mPointsOut->size())); + } + + inline void operator()(const tbb::blocked_range& range) const + { + for (size_t n = range.begin(); n < range.end(); ++n) { + (*mPointsOut)[n] = Vec3s(mXform.worldToIndex(mPointsIn[n])); + } + } + +private: + const PointList& mPointsIn; + std::vector * const mPointsOut; + const math::Transform& mXform; +}; + + +class PrimCpy +{ +public: + PrimCpy(const PolygonPoolList& primsIn, const std::vector& indexList, + std::vector& primsOut) + : mPrimsIn(primsIn) + , mIndexList(indexList) + , mPrimsOut(&primsOut) + { + } + + void runParallel() + { + tbb::parallel_for(tbb::blocked_range(0, mIndexList.size()), *this); + } + + void runSerial() + { + (*this)(tbb::blocked_range(0, mIndexList.size())); + } + + inline void operator()(const tbb::blocked_range& range) const + { + openvdb::Vec4I quad; + quad[3] = openvdb::util::INVALID_IDX; + std::vector& primsOut = *mPrimsOut; + + for (size_t n = range.begin(); n < range.end(); ++n) { + size_t index = mIndexList[n]; + PolygonPool& polygons = mPrimsIn[n]; + + // Copy quads + for (size_t i = 0, I = polygons.numQuads(); i < I; ++i) { + primsOut[index++] = polygons.quad(i); + } + polygons.clearQuads(); + + // Copy triangles (adaptive mesh) + for (size_t i = 0, I = polygons.numTriangles(); i < I; ++i) { + const openvdb::Vec3I& triangle = polygons.triangle(i); + quad[0] = triangle[0]; + quad[1] = triangle[1]; + quad[2] = triangle[2]; + primsOut[index++] = quad; + } + + polygons.clearTriangles(); + } + } + +private: + const PolygonPoolList& mPrimsIn; + const std::vector& mIndexList; + std::vector * const mPrimsOut; +}; + +} // namespace internal + + +//////////////////////////////////////// + + +/// The normal entry points for level set rebuild are the levelSetRebuild() functions. +/// doLevelSetRebuild() is mainly for internal use, but when the isovalue and half band +/// widths are given in ValueType units (for example, if they are queried from +/// a grid), it might be more convenient to call this function directly. +/// +/// @internal This overload is enabled only for grids with a scalar, floating-point ValueType. +template +inline typename boost::enable_if, +typename GridType::Ptr>::type +doLevelSetRebuild(const GridType& grid, typename GridType::ValueType iso, + typename GridType::ValueType exWidth, typename GridType::ValueType inWidth, + const math::Transform* xform, InterruptT* interrupter) +{ + const float + isovalue = float(iso), + exBandWidth = float(exWidth), + inBandWidth = float(inWidth); + + tools::VolumeToMesh mesher(isovalue); + mesher(grid); + + math::Transform::Ptr transform = (xform != NULL) ? xform->copy() : grid.transform().copy(); + + std::vector points(mesher.pointListSize()); + + { // Copy and transform (required for MeshToVolume) points to grid space. + internal::PointListTransform ptnXForm(mesher.pointList(), points, *transform); + ptnXForm.runParallel(); + mesher.pointList().reset(NULL); + } + + std::vector primitives; + + { // Copy primitives. + PolygonPoolList& polygonPoolList = mesher.polygonPoolList(); + + size_t numPrimitives = 0; + std::vector indexlist(mesher.polygonPoolListSize()); + + for (size_t n = 0, N = mesher.polygonPoolListSize(); n < N; ++n) { + const openvdb::tools::PolygonPool& polygons = polygonPoolList[n]; + indexlist[n] = numPrimitives; + numPrimitives += polygons.numQuads(); + numPrimitives += polygons.numTriangles(); + } + + primitives.resize(numPrimitives); + internal::PrimCpy primCpy(polygonPoolList, indexlist, primitives); + primCpy.runParallel(); + } + + QuadAndTriangleDataAdapter mesh(points, primitives); + + if (interrupter) { + return meshToVolume(*interrupter, mesh, *transform, exBandWidth, inBandWidth, + DISABLE_RENORMALIZATION, NULL); + } + + return meshToVolume(mesh, *transform, exBandWidth, inBandWidth, + DISABLE_RENORMALIZATION, NULL); +} + + +/// @internal This overload is enabled only for grids that do not have a scalar, +/// floating-point ValueType. +template +inline typename boost::disable_if, +typename GridType::Ptr>::type +doLevelSetRebuild(const GridType&, typename GridType::ValueType /*isovalue*/, + typename GridType::ValueType /*exWidth*/, typename GridType::ValueType /*inWidth*/, + const math::Transform*, InterruptT*) +{ + OPENVDB_THROW(TypeError, + "level set rebuild is supported only for scalar, floating-point grids"); +} + + +//////////////////////////////////////// + + +template +inline typename GridType::Ptr +levelSetRebuild(const GridType& grid, float iso, float exWidth, float inWidth, + const math::Transform* xform, InterruptT* interrupter) +{ + typedef typename GridType::ValueType ValueT; + ValueT + isovalue(zeroVal() + ValueT(iso)), + exBandWidth(zeroVal() + ValueT(exWidth)), + inBandWidth(zeroVal() + ValueT(inWidth)); + + return doLevelSetRebuild(grid, isovalue, exBandWidth, inBandWidth, xform, interrupter); +} + + +template +inline typename GridType::Ptr +levelSetRebuild(const GridType& grid, float iso, float exWidth, float inWidth, + const math::Transform* xform) +{ + typedef typename GridType::ValueType ValueT; + ValueT + isovalue(zeroVal() + ValueT(iso)), + exBandWidth(zeroVal() + ValueT(exWidth)), + inBandWidth(zeroVal() + ValueT(inWidth)); + + return doLevelSetRebuild( + grid, isovalue, exBandWidth, inBandWidth, xform, NULL); +} + + +template +inline typename GridType::Ptr +levelSetRebuild(const GridType& grid, float iso, float halfVal, const math::Transform* xform) +{ + typedef typename GridType::ValueType ValueT; + ValueT + isovalue(zeroVal() + ValueT(iso)), + halfWidth(zeroVal() + ValueT(halfVal)); + + return doLevelSetRebuild( + grid, isovalue, halfWidth, halfWidth, xform, NULL); +} + + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_LEVELSETREBUILD_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/LevelSetSphere.h b/nuparu/include/openvdb/include/openvdb/tools/LevelSetSphere.h new file mode 100644 index 00000000..2b87d1a9 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/LevelSetSphere.h @@ -0,0 +1,222 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +/// +/// @file LevelSetSphere.h +/// +/// @brief Generate a narrow-band level set of sphere. +/// +/// @note By definition a level set has a fixed narrow band width +/// (the half width is defined by LEVEL_SET_HALF_WIDTH in Types.h), +/// whereas an SDF can have a variable narrow band width. + +#ifndef OPENVDB_TOOLS_LEVELSETSPHERE_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_LEVELSETSPHERE_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include "SignedFloodFill.h" + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief Return a grid of type @c GridType containing a narrow-band level set +/// representation of a sphere. +/// +/// @param radius radius of the sphere in world units +/// @param center center of the sphere in world units +/// @param voxelSize voxel size in world units +/// @param halfWidth half the width of the narrow band, in voxel units +/// @param interrupt a pointer adhering to the util::NullInterrupter interface +/// +/// @note @c GridType::ValueType must be a floating-point scalar. +/// @note The leapfrog algorithm employed in this method is best suited +/// for a single large sphere. For multiple small spheres consider +/// using the faster algorithm in ParticlesToLevelSet.h +template +typename GridType::Ptr +createLevelSetSphere(float radius, const openvdb::Vec3f& center, float voxelSize, + float halfWidth = float(LEVEL_SET_HALF_WIDTH), InterruptT* interrupt = NULL); + +/// @brief Return a grid of type @c GridType containing a narrow-band level set +/// representation of a sphere. +/// +/// @param radius radius of the sphere in world units +/// @param center center of the sphere in world units +/// @param voxelSize voxel size in world units +/// @param halfWidth half the width of the narrow band, in voxel units +/// +/// @note @c GridType::ValueType must be a floating-point scalar. +/// @note The leapfrog algorithm employed in this method is best suited +/// for a single large sphere. For multiple small spheres consider +/// using the faster algorithm in ParticlesToLevelSet.h +template +typename GridType::Ptr +createLevelSetSphere(float radius, const openvdb::Vec3f& center, float voxelSize, + float halfWidth = float(LEVEL_SET_HALF_WIDTH)) +{ + return createLevelSetSphere(radius,center,voxelSize,halfWidth); +} + + +//////////////////////////////////////// + + +/// @brief Generates a signed distance field (or narrow band level +/// set) to a single sphere. +/// +/// @note The leapfrog algorithm employed in this class is best +/// suited for a single large sphere. For multiple small spheres consider +/// using the faster algorithm in tools/ParticlesToLevelSet.h +template +class LevelSetSphere +{ +public: + typedef typename GridT::ValueType ValueT; + typedef typename math::Vec3 Vec3T; + BOOST_STATIC_ASSERT(boost::is_floating_point::value); + + /// @brief Constructor + /// + /// @param radius radius of the sphere in world units + /// @param center center of the sphere in world units + /// @param interrupt pointer to optional interrupter. Use template + /// argument util::NullInterrupter if no interruption is desired. + /// + /// @note If the radius of the sphere is smaller than + /// 1.5*voxelSize, i.e. the sphere is smaller than the Nyquist + /// frequency of the grid, it is ignored! + LevelSetSphere(ValueT radius, const Vec3T ¢er, InterruptT* interrupt = NULL) + : mRadius(radius), mCenter(center), mInterrupt(interrupt) + { + if (mRadius<=0) OPENVDB_THROW(ValueError, "radius must be positive"); + } + + /// @return a narrow-band level set of the sphere + /// + /// @param voxelSize Size of voxels in world units + /// @param halfWidth Half-width of narrow-band in voxel units + typename GridT::Ptr getLevelSet(ValueT voxelSize, ValueT halfWidth) + { + mGrid = createLevelSet(voxelSize, halfWidth); + this->rasterSphere(voxelSize, halfWidth); + mGrid->setGridClass(GRID_LEVEL_SET); + return mGrid; + } + +private: + void rasterSphere(ValueT dx, ValueT w) + { + if (!(dx>0.0f)) OPENVDB_THROW(ValueError, "voxel size must be positive"); + if (!(w>1)) OPENVDB_THROW(ValueError, "half-width must be larger than one"); + + // Define radius of sphere and narrow-band in voxel units + const ValueT r0 = mRadius/dx, rmax = r0 + w; + + // Radius below the Nyquist frequency + if (r0 < 1.5f) return; + + // Define center of sphere in voxel units + const Vec3T c(mCenter[0]/dx, mCenter[1]/dx, mCenter[2]/dx); + + // Define index coordinates and their respective bounds + openvdb::Coord ijk; + int &i = ijk[0], &j = ijk[1], &k = ijk[2], m=1; + const int imin=math::Floor(c[0]-rmax), imax=math::Ceil(c[0]+rmax); + const int jmin=math::Floor(c[1]-rmax), jmax=math::Ceil(c[1]+rmax); + const int kmin=math::Floor(c[2]-rmax), kmax=math::Ceil(c[2]+rmax); + + // Allocate a ValueAccessor for accelerated random access + typename GridT::Accessor accessor = mGrid->getAccessor(); + + if (mInterrupt) mInterrupt->start("Generating level set of sphere"); + // Compute signed distances to sphere using leapfrogging in k + for ( i = imin; i <= imax; ++i ) { + if (util::wasInterrupted(mInterrupt)) return; + const float x2 = math::Pow2(i - c[0]); + for ( j = jmin; j <= jmax; ++j ) { + const float x2y2 = math::Pow2(j - c[1]) + x2; + for (k=kmin; k<=kmax; k += m) { + m = 1; + /// Distance in voxel units to sphere + const float v = math::Sqrt(x2y2 + math::Pow2(k-c[2]))-r0, + d = math::Abs(v); + if ( d < w ){ // inside narrow band + accessor.setValue(ijk, dx*v);// distance in world units + } else {// outside narrow band + m += math::Floor(d-w);// leapfrog + } + }//end leapfrog over k + }//end loop over j + }//end loop over i + + // Define consistent signed distances outside the narrow-band + tools::signedFloodFill(mGrid->tree()); + + if (mInterrupt) mInterrupt->end(); + } + + const ValueT mRadius; + const Vec3T mCenter; + InterruptT* mInterrupt; + typename GridT::Ptr mGrid; +};// LevelSetSphere + + +//////////////////////////////////////// + + +template +typename GridType::Ptr +createLevelSetSphere(float radius, const openvdb::Vec3f& center, float voxelSize, + float halfWidth, InterruptT* interrupt) +{ + // GridType::ValueType is required to be a floating-point scalar. + BOOST_STATIC_ASSERT(boost::is_floating_point::value); + + typedef typename GridType::ValueType ValueT; + LevelSetSphere factory(ValueT(radius), center, interrupt); + return factory.getLevelSet(ValueT(voxelSize), ValueT(halfWidth)); +} + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_LEVELSETSPHERE_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/LevelSetTracker.h b/nuparu/include/openvdb/include/openvdb/tools/LevelSetTracker.h new file mode 100644 index 00000000..1d4acd8a --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/LevelSetTracker.h @@ -0,0 +1,650 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @author Ken Museth +/// +/// @file LevelSetTracker.h +/// +/// @brief Performs multi-threaded interface tracking of narrow band +/// level sets. This is the building-block for most level set +/// computations that involve dynamic topology, e.g. advection. + +#ifndef OPENVDB_TOOLS_LEVEL_SET_TRACKER_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_LEVEL_SET_TRACKER_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ChangeBackground.h"// for changeLevelSetBackground +#include "Morphology.h"//for dilateActiveValues +#include "Prune.h"// for pruneLevelSet + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief Performs multi-threaded interface tracking of narrow band level sets +template +class LevelSetTracker +{ +public: + typedef GridT GridType; + typedef typename GridT::TreeType TreeType; + typedef typename TreeType::LeafNodeType LeafType; + typedef typename TreeType::ValueType ValueType; + typedef typename tree::LeafManager LeafManagerType; // leafs + buffers + typedef typename LeafManagerType::LeafRange LeafRange; + typedef typename LeafManagerType::BufferType BufferType; + typedef typename TreeType::template ValueConverter::Type MaskTreeType; + BOOST_STATIC_ASSERT(boost::is_floating_point::value); + + /// Lightweight struct that stores the state of the LevelSetTracker + struct State { + State(math::BiasedGradientScheme s = math::HJWENO5_BIAS, + math::TemporalIntegrationScheme t = math::TVD_RK1, + int n = static_cast(LEVEL_SET_HALF_WIDTH), int g = 1) + : spatialScheme(s), temporalScheme(t), normCount(n), grainSize(g) {} + math::BiasedGradientScheme spatialScheme; + math::TemporalIntegrationScheme temporalScheme; + int normCount;// Number of iterations of normalization + int grainSize; + }; + + /// @brief Main constructor + /// @throw RuntimeError if the grid is not a level set + LevelSetTracker(GridT& grid, InterruptT* interrupt = NULL); + + virtual ~LevelSetTracker() { delete mLeafs; } + + /// @brief Iterative normalization, i.e. solving the Eikonal equation + /// @note The mask it optional and by default it is ignored. + template + void normalize(const MaskType* mask); + + /// @brief Iterative normalization, i.e. solving the Eikonal equation + void normalize() { this->normalize(NULL); } + + /// @brief Track the level set interface, i.e. rebuild and normalize the + /// narrow band of the level set. + void track(); + + /// @brief Remove voxels that are outside the narrow band. (substep of track) + void prune(); + + /// @brief Fast but approximate dilation of the narrow band - one + /// layer at a time. Normally we recommend using the resize method below + /// which internally calls dilate (or erode) with the correct + /// number of @a iterations to achieve the desired half voxel width + /// of the narrow band (3 is recomended for most level set applications). + /// + /// @note Since many level set applications perform + /// interface-tracking, which in turn rebuilds the narrow-band + /// accurately, this dilate method can often be used with a + /// single iterations of low-order re-normalization. This + /// effectively allows very narrow bands to be created from points + /// or polygons (e.g. with a half voxel width of 1), followed by a + /// fast but approximate dilation (typically with a half voxel + /// width of 3). This can be significantly faster than generating + /// the final width of the narrow band from points or polygons. + void dilate(int iterations = 1); + + /// @brief Erodes the width of the narrow-band and update the background values + /// @throw ValueError if @a iterations is larger than the current half-width. + void erode(int iterations = 1); + + /// @brief Resize the width of the narrow band, i.e. perform + /// dilation and renormalization or erosion as required. + bool resize(Index halfWidth = static_cast(LEVEL_SET_HALF_WIDTH)); + + /// @brief Return the half width of the narrow band in floating-point voxel units. + ValueType getHalfWidth() const { return mGrid->background()/mDx; } + + /// @brief Return the state of the tracker (see struct defined above) + State getState() const { return mState; } + + /// @brief Set the state of the tracker (see struct defined above) + void setState(const State& s) { mState =s; } + + /// @return the spatial finite difference scheme + math::BiasedGradientScheme getSpatialScheme() const { return mState.spatialScheme; } + + /// @brief Set the spatial finite difference scheme + void setSpatialScheme(math::BiasedGradientScheme scheme) { mState.spatialScheme = scheme; } + + /// @return the temporal integration scheme + math::TemporalIntegrationScheme getTemporalScheme() const { return mState.temporalScheme; } + + /// @brief Set the spatial finite difference scheme + void setTemporalScheme(math::TemporalIntegrationScheme scheme) { mState.temporalScheme = scheme;} + + /// @return The number of normalizations performed per track or + /// normalize call. + int getNormCount() const { return mState.normCount; } + + /// @brief Set the number of normalizations performed per track or + /// normalize call. + void setNormCount(int n) { mState.normCount = n; } + + /// @return the grain-size used for multi-threading + int getGrainSize() const { return mState.grainSize; } + + /// @brief Set the grain-size used for multi-threading. + /// @note A grainsize of 0 or less disables multi-threading! + void setGrainSize(int grainsize) { mState.grainSize = grainsize; } + + ValueType voxelSize() const { return mDx; } + + void startInterrupter(const char* msg); + + void endInterrupter(); + + /// @return false if the process was interrupted + bool checkInterrupter(); + + const GridType& grid() const { return *mGrid; } + + LeafManagerType& leafs() { return *mLeafs; } + + const LeafManagerType& leafs() const { return *mLeafs; } + +private: + + // disallow copy construction and copy by assignment! + LevelSetTracker(const LevelSetTracker&);// not implemented + LevelSetTracker& operator=(const LevelSetTracker&);// not implemented + + // Private class to perform multi-threaded trimming of + // voxels that are too far away from the zero-crossing. + struct Trim + { + Trim(LevelSetTracker& tracker) : mTracker(tracker) {} + void trim(); + void operator()(const LeafRange& r) const; + LevelSetTracker& mTracker; + };// Trim + + // Private struct to perform multi-threaded normalization + template + struct Normalizer + { + typedef math::BIAS_SCHEME SchemeT; + typedef typename SchemeT::template ISStencil::StencilType StencilT; + typedef typename MaskT::LeafNodeType MaskLeafT; + typedef typename MaskLeafT::ValueOnCIter MaskIterT; + typedef typename LeafType::ValueOnCIter VoxelIterT; + Normalizer(LevelSetTracker& tracker, const MaskT* mask); + void normalize(); + void operator()(const LeafRange& r) const {mTask(const_cast(this), r);} + void cook(const char* msg, int swapBuffer=0); + template + void euler(const LeafRange& range, Index phiBuffer, Index resultBuffer); + inline void euler01(const LeafRange& r) {this->euler<0,1>(r, 0, 1);} + inline void euler12(const LeafRange& r) {this->euler<1,2>(r, 1, 1);} + inline void euler34(const LeafRange& r) {this->euler<3,4>(r, 1, 2);} + inline void euler13(const LeafRange& r) {this->euler<1,3>(r, 1, 2);} + template + void eval(StencilT& stencil, const ValueType* phi, ValueType* result, Index n) const; + LevelSetTracker& mTracker; + const MaskT* mMask; + const ValueType mDt, mInvDx; + typename boost::function mTask; + }; // Normalizer struct + + template + void normalize1(const MaskT* mask); + + template + void normalize2(const MaskT* mask); + + // Throughout the methods below mLeafs is always assumed to contain + // a list of the current LeafNodes! The auxiliary buffers on the + // other hand always have to be allocated locally, since some + // methods need them and others don't! + GridType* mGrid; + LeafManagerType* mLeafs; + InterruptT* mInterrupter; + const ValueType mDx; + State mState; +}; // end of LevelSetTracker class + +template +LevelSetTracker:: +LevelSetTracker(GridT& grid, InterruptT* interrupt): + mGrid(&grid), + mLeafs(new LeafManagerType(grid.tree())), + mInterrupter(interrupt), + mDx(static_cast(grid.voxelSize()[0])), + mState() +{ + if ( !grid.hasUniformVoxels() ) { + OPENVDB_THROW(RuntimeError, + "The transform must have uniform scale for the LevelSetTracker to function"); + } + if ( grid.getGridClass() != GRID_LEVEL_SET) { + OPENVDB_THROW(RuntimeError, + "LevelSetTracker expected a level set, got a grid of class \"" + + grid.gridClassToString(grid.getGridClass()) + + "\" [hint: Grid::setGridClass(openvdb::GRID_LEVEL_SET)]"); + } +} + +template +inline void +LevelSetTracker:: +prune() +{ + this->startInterrupter("Pruning Level Set"); + + // Prune voxels that are too far away from the zero-crossing + Trim t(*this); + t.trim(); + + // Remove inactive nodes from tree + tools::pruneLevelSet(mGrid->tree()); + + // The tree topology has changes so rebuild the list of leafs + mLeafs->rebuildLeafArray(); + this->endInterrupter(); +} + +template +inline void +LevelSetTracker:: +track() +{ + // Dilate narrow-band (this also rebuilds the leaf array!) + tools::dilateActiveValues( *mLeafs, 1, tools::NN_FACE, tools::IGNORE_TILES); + + // Compute signed distances in dilated narrow-band + this->normalize(); + + // Remove voxels that are outside the narrow band + this->prune(); +} + +template +inline void +LevelSetTracker:: +dilate(int iterations) +{ + if (this->getNormCount() == 0) { + for (int i=0; i < iterations; ++i) { + tools::dilateActiveValues( *mLeafs, 1, tools::NN_FACE, tools::IGNORE_TILES); + tools::changeLevelSetBackground(this->leafs(), mDx + mGrid->background()); + } + } else { + for (int i=0; i < iterations; ++i) { + MaskTreeType mask0(mGrid->tree(), false, TopologyCopy()); + tools::dilateActiveValues( *mLeafs, 1, tools::NN_FACE, tools::IGNORE_TILES); + tools::changeLevelSetBackground(this->leafs(), mDx + mGrid->background()); + MaskTreeType mask(mGrid->tree(), false, TopologyCopy()); + mask.topologyDifference(mask0); + this->normalize(&mask); + } + } +} + +template +inline void +LevelSetTracker:: +erode(int iterations) +{ + tools::erodeVoxels(*mLeafs, iterations); + mLeafs->rebuildLeafArray(); + const ValueType background = mGrid->background() - iterations*mDx; + tools::changeLevelSetBackground(this->leafs(), background); +} + +template +inline bool +LevelSetTracker:: +resize(Index halfWidth) +{ + const int wOld = static_cast(math::RoundDown(this->getHalfWidth())); + const int wNew = static_cast(halfWidth); + if (wOld < wNew) { + this->dilate(wNew - wOld); + } else if (wOld > wNew) { + this->erode(wOld - wNew); + } + return wOld != wNew; +} + +template +inline void +LevelSetTracker:: +startInterrupter(const char* msg) +{ + if (mInterrupter) mInterrupter->start(msg); +} + +template +inline void +LevelSetTracker:: +endInterrupter() +{ + if (mInterrupter) mInterrupter->end(); +} + +template +inline bool +LevelSetTracker:: +checkInterrupter() +{ + if (util::wasInterrupted(mInterrupter)) { + tbb::task::self().cancel_group_execution(); + return false; + } + return true; +} + +template +template +inline void +LevelSetTracker:: +normalize(const MaskT* mask) +{ + switch (this->getSpatialScheme()) { + case math::FIRST_BIAS: + this->normalize1(mask); break; + case math::SECOND_BIAS: + this->normalize1(mask); break; + case math::THIRD_BIAS: + this->normalize1(mask); break; + case math::WENO5_BIAS: + this->normalize1(mask); break; + case math::HJWENO5_BIAS: + this->normalize1(mask); break; + default: + OPENVDB_THROW(ValueError, "Spatial difference scheme not supported!"); + } +} + +template +template +inline void +LevelSetTracker:: +normalize1(const MaskT* mask) +{ + switch (this->getTemporalScheme()) { + case math::TVD_RK1: + this->normalize2(mask); break; + case math::TVD_RK2: + this->normalize2(mask); break; + case math::TVD_RK3: + this->normalize2(mask); break; + default: + OPENVDB_THROW(ValueError, "Temporal integration scheme not supported!"); + } +} + +template +template +inline void +LevelSetTracker:: +normalize2(const MaskT* mask) +{ + Normalizer tmp(*this, mask); + tmp.normalize(); +} + +//////////////////////////////////////////////////////////////////////////// + +template +inline void +LevelSetTracker:: +Trim::trim() +{ + const int grainSize = mTracker.getGrainSize(); + const LeafRange range = mTracker.leafs().leafRange(grainSize); + + if (grainSize>0) { + tbb::parallel_for(range, *this); + } else { + (*this)(range); + } +} + +/// Prunes away voxels that have moved outside the narrow band +template +inline void +LevelSetTracker:: +Trim::operator()(const LeafRange& range) const +{ + typedef typename LeafType::ValueOnIter VoxelIterT; + mTracker.checkInterrupter(); + const ValueType gamma = mTracker.mGrid->background(); + + for (typename LeafRange::Iterator leafIter = range.begin(); leafIter; ++leafIter) { + LeafType &leaf = *leafIter; + for (VoxelIterT iter = leaf.beginValueOn(); iter; ++iter) { + const ValueType val = *iter; + if (val <= -gamma) + leaf.setValueOff(iter.pos(), -gamma); + else if (val >= gamma) + leaf.setValueOff(iter.pos(), gamma); + } + } +} + +//////////////////////////////////////////////////////////////////////////// + +template +template +inline +LevelSetTracker:: +Normalizer:: +Normalizer(LevelSetTracker& tracker, const MaskT* mask) + : mTracker(tracker) + , mMask(mask) + , mDt(tracker.voxelSize()*(TemporalScheme == math::TVD_RK1 ? 0.3f : + TemporalScheme == math::TVD_RK2 ? 0.9f : 1.0f)) + , mInvDx(1.0f/tracker.voxelSize()) + , mTask(0) +{ +} + +template +template +inline void +LevelSetTracker:: +Normalizer:: +normalize() +{ + /// Make sure we have enough temporal auxiliary buffers + mTracker.mLeafs->rebuildAuxBuffers(TemporalScheme == math::TVD_RK3 ? 2 : 1); + + for (int n=0, e=mTracker.getNormCount(); n < e; ++n) { + + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + switch(TemporalScheme) {//switch is resolved at compile-time + case math::TVD_RK1: + // Perform one explicit Euler step: t1 = t0 + dt + // Phi_t1(0) = Phi_t0(0) - dt * VdotG_t0(1) + mTask = boost::bind(&Normalizer::euler01, _1, _2); + + // Cook and swap buffer 0 and 1 such that Phi_t1(0) and Phi_t0(1) + this->cook("Normalizing level set using TVD_RK1", 1); + break; + case math::TVD_RK2: + // Perform one explicit Euler step: t1 = t0 + dt + // Phi_t1(1) = Phi_t0(0) - dt * VdotG_t0(1) + mTask = boost::bind(&Normalizer::euler01, _1, _2); + + // Cook and swap buffer 0 and 1 such that Phi_t1(0) and Phi_t0(1) + this->cook("Normalizing level set using TVD_RK1 (step 1 of 2)", 1); + + // Convex combine explicit Euler step: t2 = t0 + dt + // Phi_t2(1) = 1/2 * Phi_t0(1) + 1/2 * (Phi_t1(0) - dt * V.Grad_t1(0)) + mTask = boost::bind(&Normalizer::euler12, _1, _2); + + // Cook and swap buffer 0 and 1 such that Phi_t2(0) and Phi_t1(1) + this->cook("Normalizing level set using TVD_RK1 (step 2 of 2)", 1); + break; + case math::TVD_RK3: + // Perform one explicit Euler step: t1 = t0 + dt + // Phi_t1(1) = Phi_t0(0) - dt * VdotG_t0(1) + mTask = boost::bind(&Normalizer::euler01, _1, _2); + + // Cook and swap buffer 0 and 1 such that Phi_t1(0) and Phi_t0(1) + this->cook("Normalizing level set using TVD_RK3 (step 1 of 3)", 1); + + // Convex combine explicit Euler step: t2 = t0 + dt/2 + // Phi_t2(2) = 3/4 * Phi_t0(1) + 1/4 * (Phi_t1(0) - dt * V.Grad_t1(0)) + mTask = boost::bind(&Normalizer::euler34, _1, _2); + + // Cook and swap buffer 0 and 2 such that Phi_t2(0) and Phi_t1(2) + this->cook("Normalizing level set using TVD_RK3 (step 2 of 3)", 2); + + // Convex combine explicit Euler step: t3 = t0 + dt + // Phi_t3(2) = 1/3 * Phi_t0(1) + 2/3 * (Phi_t2(0) - dt * V.Grad_t2(0) + mTask = boost::bind(&Normalizer::euler13, _1, _2); + + // Cook and swap buffer 0 and 2 such that Phi_t3(0) and Phi_t2(2) + this->cook("Normalizing level set using TVD_RK3 (step 3 of 3)", 2); + break; + default: + OPENVDB_THROW(ValueError, "Temporal integration scheme not supported!"); + } + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + mTracker.mLeafs->removeAuxBuffers(); +} + +/// Private method to perform the task (serial or threaded) and +/// subsequently swap the leaf buffers. +template +template +inline void +LevelSetTracker:: +Normalizer:: +cook(const char* msg, int swapBuffer) +{ + mTracker.startInterrupter( msg ); + + const int grainSize = mTracker.getGrainSize(); + const LeafRange range = mTracker.leafs().leafRange(grainSize); + + grainSize>0 ? tbb::parallel_for(range, *this) : (*this)(range); + + mTracker.leafs().swapLeafBuffer(swapBuffer, grainSize==0); + + mTracker.endInterrupter(); +} + +template +template +template +inline void +LevelSetTracker:: +Normalizer:: +eval(StencilT& stencil, const ValueType* phi, ValueType* result, Index n) const +{ + typedef typename math::ISGradientNormSqrd GradientT; + static const ValueType alpha = ValueType(Nominator)/ValueType(Denominator); + static const ValueType beta = ValueType(1) - alpha; + + const ValueType normSqGradPhi = GradientT::result(stencil); + const ValueType phi0 = stencil.getValue(); + ValueType v = phi0 / ( math::Sqrt(math::Pow2(phi0) + normSqGradPhi) + + math::Tolerance::value() ); + v = phi0 - mDt * v * (math::Sqrt(normSqGradPhi) * mInvDx - 1.0f); + result[n] = Nominator ? alpha * phi[n] + beta * v : v; +} + +template +template +template +inline void +LevelSetTracker:: +Normalizer:: +euler(const LeafRange& range, Index phiBuffer, Index resultBuffer) +{ + typedef typename LeafType::ValueOnCIter VoxelIterT; + + mTracker.checkInterrupter(); + + StencilT stencil(mTracker.grid()); + + for (typename LeafRange::Iterator leafIter = range.begin(); leafIter; ++leafIter) { + const ValueType* phi = leafIter.buffer(phiBuffer).data(); + ValueType* result = leafIter.buffer(resultBuffer).data(); + if (mMask == NULL) { + for (VoxelIterT iter = leafIter->cbeginValueOn(); iter; ++iter) { + stencil.moveTo(iter); + this->eval(stencil, phi, result, iter.pos()); + }//loop over active voxels in the leaf of the level set + } else if (const MaskLeafT* mask = mMask->probeLeaf(leafIter->origin())) { + const ValueType* phi0 = leafIter->buffer().data(); + for (MaskIterT iter = mask->cbeginValueOn(); iter; ++iter) { + const Index i = iter.pos(); + stencil.moveTo(iter.getCoord(), phi0[i]); + this->eval(stencil, phi, result, i); + }//loop over active voxels in the leaf of the mask + } + }//loop over leafs of the level set +} + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_LEVEL_SET_TRACKER_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/LevelSetUtil.h b/nuparu/include/openvdb/include/openvdb/tools/LevelSetUtil.h new file mode 100644 index 00000000..97a91b87 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/LevelSetUtil.h @@ -0,0 +1,2554 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file tools/LevelSetUtil.h +/// +/// @brief Miscellaneous utility methods that operate primarily +/// or exclusively on level set grids. +/// +/// @author Mihai Alden + + +#ifndef OPENVDB_TOOLS_LEVEL_SET_UTIL_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_LEVEL_SET_UTIL_HAS_BEEN_INCLUDED + +#include "MeshToVolume.h" // for traceExteriorBoundaries +#include "SignedFloodFill.h" // for signedFloodFillWithValues + +#include +#include + +#include +#include +#include +#include + +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +// MS Visual C++ requires this extra level of indirection in order to compile +// THIS MUST EXIST IN AN UNNAMED NAMESPACE IN ORDER TO COMPILE ON WINDOWS +namespace { + +template +inline typename GridType::ValueType lsutilGridMax() +{ + return std::numeric_limits::max(); +} + +template +inline typename GridType::ValueType lsutilGridZero() +{ + return zeroVal(); +} + +} // unnamed namespace + + +//////////////////////////////////////// + + +/// @brief Threaded method to convert a sparse level set/SDF into a sparse fog volume +/// +/// @details For a level set, the active and negative-valued interior half of the +/// narrow band becomes a linear ramp from 0 to 1; the inactive interior becomes +/// active with a constant value of 1; and the exterior, including the background +/// and the active exterior half of the narrow band, becomes inactive with a constant +/// value of 0. The interior, though active, remains sparse. +/// @details For a generic SDF, a specified cutoff distance determines the width +/// of the ramp, but otherwise the result is the same as for a level set. +/// +/// @param grid level set/SDF grid to transform +/// @param cutoffDistance optional world space cutoff distance for the ramp +/// (automatically clamped if greater than the interior +/// narrow band width) +template +inline void +sdfToFogVolume( + GridType& grid, + typename GridType::ValueType cutoffDistance = lsutilGridMax()); + + +/// @brief Threaded method to construct a boolean mask that represents interior regions +/// in a signed distance field. +/// +/// @return A shared pointer to either a boolean grid or tree with the same tree +/// configuration and potentially transform as the input @c volume and whose active +/// and @c true values correspond to the interior of the input signed distance field. +/// +/// @param volume Signed distance field / level set volume. +/// @param isovalue Threshold below which values are considered part of the +/// interior region. +template +inline typename GridOrTreeType::template ValueConverter::Type::Ptr +sdfInteriorMask( + const GridOrTreeType& volume, + typename GridOrTreeType::ValueType isovalue = lsutilGridZero()); + + +/// @brief Extracts the interior regions of a signed distance field and topologically enclosed +/// (watertight) regions of value greater than the @a isovalue (cavities) that can arise +/// as the result of CSG union operations between different shapes where at least one of +/// the shapes has a concavity that is capped. +/// +/// For example the enclosed region of a capped bottle would include the walls and +/// the interior cavity. +/// +/// @return A shared pointer to either a boolean grid or tree with the same tree configuration +/// and potentially transform as the input @c volume and whose active and @c true values +/// correspond to the interior and enclosed regions in the input signed distance field. +/// +/// @param volume Signed distance field / level set volume. +/// @param isovalue Threshold below which values are considered part of the interior region. +/// @param fillMask Optional boolean tree, when provided enclosed cavity regions that are not +/// completely filled by this mask are ignored. +/// +/// For instance if the fill mask does not completely fill the bottle in the +/// previous example only the walls and cap are returned and the interior +/// cavity will be ignored. +template +inline typename GridOrTreeType::template ValueConverter::Type::Ptr +extractEnclosedRegion(const GridOrTreeType& volume, + typename GridOrTreeType::ValueType isovalue = lsutilGridZero(), + const typename TreeAdapter::TreeType::template ValueConverter::Type* fillMask = NULL); + + +/// @brief Return a mask of the voxels that intersect the implicit surface with the given @a isovalue. +/// +/// @param volume Signed distance field / level set volume. +/// @param isovalue The crossing point that is considered the surface. +template +inline typename GridOrTreeType::template ValueConverter::Type::Ptr +extractIsosurfaceMask(const GridOrTreeType& volume, typename GridOrTreeType::ValueType isovalue); + + +/// @brief Return a mask for each connected component of the given grid's active voxels. +/// +/// @param volume Input grid or tree +/// @param masks Output set of disjoint active topology masks sorted in descending order +/// based on the active voxel count. +template +inline void +extractActiveVoxelSegmentMasks(const GridOrTreeType& volume, + std::vector::Type::Ptr>& masks); + + +/// @brief Separates disjoint active topology components into distinct grids or trees. +/// +/// @details Supports volumes with active tiles. +/// +/// @param volume Input grid or tree +/// @param segments Output set of disjoint active topology components sorted in +/// descending order based on the active voxel count. +template +inline void +segmentActiveVoxels(const GridOrTreeType& volume, std::vector& segments); + + +/// @brief Separates disjoint SDF surfaces into distinct grids or trees. +/// +/// @details Supports asymmetric interior / exterior narrowband widths and +/// SDF volumes with dense interior regions. +/// +/// @param volume Input signed distance field / level set volume +/// @param segments Output set of disjoint SDF surfaces found in @a volume sorted in +/// descending order based on the surface intersecting voxel count. +template +inline void +segmentSDF(const GridOrTreeType& volume, std::vector& segments); + + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// + +// Internal utility objects and implementation details + + +namespace level_set_util_internal { + + +template +struct MaskInteriorVoxels { + + typedef typename LeafNodeType::ValueType ValueType; + typedef tree::LeafNode BoolLeafNodeType; + + MaskInteriorVoxels( + ValueType isovalue, const LeafNodeType ** nodes, BoolLeafNodeType ** maskNodes) + : mNodes(nodes), mMaskNodes(maskNodes), mIsovalue(isovalue) + { + } + + void operator()(const tbb::blocked_range& range) const { + + BoolLeafNodeType * maskNodePt = NULL; + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + mMaskNodes[n] = NULL; + const LeafNodeType& node = *mNodes[n]; + + if (!maskNodePt) { + maskNodePt = new BoolLeafNodeType(node.origin(), false); + } else { + maskNodePt->setOrigin(node.origin()); + } + + const ValueType* values = &node.getValue(0); + for (Index i = 0; i < LeafNodeType::SIZE; ++i) { + if (values[i] < mIsovalue) maskNodePt->setValueOn(i, true); + } + + if (maskNodePt->onVoxelCount() > 0) { + mMaskNodes[n] = maskNodePt; + maskNodePt = NULL; + } + } + + if (maskNodePt) delete maskNodePt; + } + + LeafNodeType const * const * const mNodes; + BoolLeafNodeType ** const mMaskNodes; + ValueType const mIsovalue; +}; // MaskInteriorVoxels + + +template +struct MaskInteriorTiles { + + typedef typename TreeType::ValueType ValueType; + + MaskInteriorTiles(ValueType isovalue, const TreeType& tree, InternalNodeType ** maskNodes) + : mTree(&tree), mMaskNodes(maskNodes), mIsovalue(isovalue) { } + + void operator()(const tbb::blocked_range& range) const { + tree::ValueAccessor acc(*mTree); + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + typename InternalNodeType::ValueAllIter it = mMaskNodes[n]->beginValueAll(); + for (; it; ++it) { + if (acc.getValue(it.getCoord()) < mIsovalue) { + it.setValue(true); + it.setValueOn(true); + } + } + } + } + + TreeType const * const mTree; + InternalNodeType ** const mMaskNodes; + ValueType const mIsovalue; +}; // MaskInteriorTiles + + +template +struct PopulateTree { + + typedef typename TreeType::ValueType ValueType; + typedef typename TreeType::LeafNodeType LeafNodeType; + + PopulateTree(TreeType& tree, LeafNodeType** leafnodes, + const size_t * nodexIndexMap, ValueType background) + : mNewTree(background) + , mTreePt(&tree) + , mNodes(leafnodes) + , mNodeIndexMap(nodexIndexMap) + { + } + + PopulateTree(PopulateTree& rhs, tbb::split) + : mNewTree(rhs.mNewTree.background()) + , mTreePt(&mNewTree) + , mNodes(rhs.mNodes) + , mNodeIndexMap(rhs.mNodeIndexMap) + { + } + + void operator()(const tbb::blocked_range& range) { + + tree::ValueAccessor acc(*mTreePt); + + if (mNodeIndexMap) { + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + for (size_t i = mNodeIndexMap[n], I = mNodeIndexMap[n + 1]; i < I; ++i) { + if (mNodes[i] != NULL) acc.addLeaf(mNodes[i]); + } + } + } else { + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + acc.addLeaf(mNodes[n]); + } + } + } + + void join(PopulateTree& rhs) { mTreePt->merge(*rhs.mTreePt); } + +private: + TreeType mNewTree; + TreeType * const mTreePt; + LeafNodeType ** const mNodes; + size_t const * const mNodeIndexMap; +}; // PopulateTree + + +/// @brief Negative active values are set @c 0, everything else is set to @c 1. +template +struct LabelBoundaryVoxels { + + typedef typename LeafNodeType::ValueType ValueType; + typedef tree::LeafNode CharLeafNodeType; + + LabelBoundaryVoxels( + ValueType isovalue, const LeafNodeType ** nodes, CharLeafNodeType ** maskNodes) + : mNodes(nodes), mMaskNodes(maskNodes), mIsovalue(isovalue) + { + } + + void operator()(const tbb::blocked_range& range) const { + + CharLeafNodeType * maskNodePt = NULL; + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + mMaskNodes[n] = NULL; + const LeafNodeType& node = *mNodes[n]; + + if (!maskNodePt) { + maskNodePt = new CharLeafNodeType(node.origin(), 1); + } else { + maskNodePt->setOrigin(node.origin()); + } + + typename LeafNodeType::ValueOnCIter it; + for (it = node.cbeginValueOn(); it; ++it) { + maskNodePt->setValueOn(it.pos(), ((*it - mIsovalue) < 0.0) ? 0 : 1); + } + + if (maskNodePt->onVoxelCount() > 0) { + mMaskNodes[n] = maskNodePt; + maskNodePt = NULL; + } + } + + if (maskNodePt) delete maskNodePt; + } + + LeafNodeType const * const * const mNodes; + CharLeafNodeType ** const mMaskNodes; + ValueType const mIsovalue; +}; // LabelBoundaryVoxels + + +template +struct FlipRegionSign { + typedef typename LeafNodeType::ValueType ValueType; + + FlipRegionSign(LeafNodeType ** nodes) : mNodes(nodes) { } + + void operator()(const tbb::blocked_range& range) const { + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + ValueType* values = const_cast(&mNodes[n]->getValue(0)); + for (Index i = 0; i < LeafNodeType::SIZE; ++i) { + values[i] = values[i] < 0 ? 1 : -1; + } + } + } + + LeafNodeType ** const mNodes; +}; // FlipRegionSign + + +template +struct FindMinVoxelValue { + + typedef typename LeafNodeType::ValueType ValueType; + + FindMinVoxelValue(LeafNodeType const * const * const leafnodes) + : minValue(std::numeric_limits::max()) + , mNodes(leafnodes) + { + } + + FindMinVoxelValue(FindMinVoxelValue& rhs, tbb::split) + : minValue(std::numeric_limits::max()) + , mNodes(rhs.mNodes) + { + } + + void operator()(const tbb::blocked_range& range) { + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + const ValueType* data = mNodes[n]->buffer().data(); + for (Index i = 0; i < LeafNodeType::SIZE; ++i) { + minValue = std::min(minValue, data[i]); + } + } + } + + void join(FindMinVoxelValue& rhs) { minValue = std::min(minValue, rhs.minValue); } + + ValueType minValue; + + LeafNodeType const * const * const mNodes; +}; // FindMinVoxelValue + + +template +struct FindMinTileValue { + + typedef typename InternalNodeType::ValueType ValueType; + + FindMinTileValue(InternalNodeType const * const * const nodes) + : minValue(std::numeric_limits::max()) + , mNodes(nodes) + { + } + + FindMinTileValue(FindMinTileValue& rhs, tbb::split) + : minValue(std::numeric_limits::max()) + , mNodes(rhs.mNodes) + { + } + + void operator()(const tbb::blocked_range& range) { + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + typename InternalNodeType::ValueAllCIter it = mNodes[n]->beginValueAll(); + for (; it; ++it) { + minValue = std::min(minValue, *it); + } + } + } + + void join(FindMinTileValue& rhs) { minValue = std::min(minValue, rhs.minValue); } + + ValueType minValue; + + InternalNodeType const * const * const mNodes; +}; // FindMinTileValue + + +template +struct SDFVoxelsToFogVolume { + + typedef typename LeafNodeType::ValueType ValueType; + + SDFVoxelsToFogVolume(LeafNodeType ** nodes, ValueType cutoffDistance) + : mNodes(nodes), mWeight(ValueType(1.0) / cutoffDistance) + { + } + + void operator()(const tbb::blocked_range& range) const { + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + LeafNodeType& node = *mNodes[n]; + node.setValuesOff(); + + ValueType* values = node.buffer().data(); + for (Index i = 0; i < LeafNodeType::SIZE; ++i) { + values[i] = values[i] > ValueType(0.0) ? ValueType(0.0) : values[i] * mWeight; + if (values[i] > ValueType(0.0)) node.setValueOn(i); + } + + if (node.onVoxelCount() == 0) { + delete mNodes[n]; + mNodes[n] = NULL; + } + } + } + + LeafNodeType ** const mNodes; + ValueType const mWeight; +}; // SDFVoxelsToFogVolume + + +template +struct SDFTilesToFogVolume { + + SDFTilesToFogVolume(const TreeType& tree, InternalNodeType ** nodes) + : mTree(&tree), mNodes(nodes) { } + + void operator()(const tbb::blocked_range& range) const { + + typedef typename TreeType::ValueType ValueType; + tree::ValueAccessor acc(*mTree); + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + typename InternalNodeType::ValueAllIter it = mNodes[n]->beginValueAll(); + for (; it; ++it) { + if (acc.getValue(it.getCoord()) < ValueType(0.0)) { + it.setValue(ValueType(1.0)); + it.setValueOn(true); + } + } + } + } + + TreeType const * const mTree; + InternalNodeType ** const mNodes; +}; // SDFTilesToFogVolume + + +template +struct FillMaskBoundary { + + typedef typename TreeType::ValueType ValueType; + typedef typename TreeType::LeafNodeType LeafNodeType; + typedef typename TreeType::template ValueConverter::Type BoolTreeType; + typedef typename BoolTreeType::LeafNodeType BoolLeafNodeType; + + FillMaskBoundary(const TreeType& tree, ValueType isovalue, const BoolTreeType& fillMask, + const BoolLeafNodeType ** fillNodes, BoolLeafNodeType ** newNodes) + : mTree(&tree), mFillMask(&fillMask), mFillNodes(fillNodes), mNewNodes(newNodes), mIsovalue(isovalue) + { + } + + void operator()(const tbb::blocked_range& range) const { + + tree::ValueAccessor maskAcc(*mFillMask); + tree::ValueAccessor distAcc(*mTree); + + boost::scoped_array valueMask(new char[BoolLeafNodeType::SIZE]); + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + mNewNodes[n] = NULL; + const BoolLeafNodeType& node = *mFillNodes[n]; + const Coord& origin = node.origin(); + + const bool denseNode = node.isDense(); + + // possible early out if the fill mask is dense + if (denseNode) { + + int denseNeighbors = 0; + + const BoolLeafNodeType* neighborNode = maskAcc.probeConstLeaf(origin.offsetBy(-1, 0, 0)); + if (neighborNode && neighborNode->isDense()) ++denseNeighbors; + + neighborNode = maskAcc.probeConstLeaf(origin.offsetBy(BoolLeafNodeType::DIM, 0, 0)); + if (neighborNode && neighborNode->isDense()) ++denseNeighbors; + + neighborNode = maskAcc.probeConstLeaf(origin.offsetBy(0, -1, 0)); + if (neighborNode && neighborNode->isDense()) ++denseNeighbors; + + neighborNode = maskAcc.probeConstLeaf(origin.offsetBy(0, BoolLeafNodeType::DIM, 0)); + if (neighborNode && neighborNode->isDense()) ++denseNeighbors; + + neighborNode = maskAcc.probeConstLeaf(origin.offsetBy(0, 0, -1)); + if (neighborNode && neighborNode->isDense()) ++denseNeighbors; + + neighborNode = maskAcc.probeConstLeaf(origin.offsetBy(0, 0, BoolLeafNodeType::DIM)); + if (neighborNode && neighborNode->isDense()) ++denseNeighbors; + + if (denseNeighbors == 6) continue; + } + + // rest value mask + memset(valueMask.get(), 0, sizeof(char) * BoolLeafNodeType::SIZE); + + const typename TreeType::LeafNodeType* distNode = distAcc.probeConstLeaf(origin); + + // check internal voxel neighbors + + bool earlyTermination = false; + + if (!denseNode) { + if (distNode) { + evalInternalNeighborsP(valueMask.get(), node, *distNode); + evalInternalNeighborsN(valueMask.get(), node, *distNode); + } else if (distAcc.getValue(origin) > mIsovalue) { + earlyTermination = evalInternalNeighborsP(valueMask.get(), node); + if (!earlyTermination) earlyTermination = evalInternalNeighborsN(valueMask.get(), node); + } + } + + // check external voxel neighbors + + if (!earlyTermination) { + evalExternalNeighborsX(valueMask.get(), node, maskAcc, distAcc); + evalExternalNeighborsX(valueMask.get(), node, maskAcc, distAcc); + evalExternalNeighborsY(valueMask.get(), node, maskAcc, distAcc); + evalExternalNeighborsY(valueMask.get(), node, maskAcc, distAcc); + evalExternalNeighborsZ(valueMask.get(), node, maskAcc, distAcc); + evalExternalNeighborsZ(valueMask.get(), node, maskAcc, distAcc); + } + + // Export marked boundary voxels. + + int numBoundaryValues = 0; + for (Index i = 0, I = BoolLeafNodeType::SIZE; i < I; ++i) { + numBoundaryValues += valueMask[i] == 1; + } + + if (numBoundaryValues > 0) { + mNewNodes[n] = new BoolLeafNodeType(origin, false); + for (Index i = 0, I = BoolLeafNodeType::SIZE; i < I; ++i) { + if (valueMask[i] == 1) mNewNodes[n]->setValueOn(i); + } + } + } + } + +private: + + // Check internal voxel neighbors in positive {x, y, z} directions. + + void evalInternalNeighborsP(char* valueMask, const BoolLeafNodeType& node, const LeafNodeType& distNode) const { + + for (Index x = 0; x < BoolLeafNodeType::DIM; ++x) { + const Index xPos = x << (2 * BoolLeafNodeType::LOG2DIM); + for (Index y = 0; y < BoolLeafNodeType::DIM; ++y) { + const Index yPos = xPos + (y << BoolLeafNodeType::LOG2DIM); + for (Index z = 0; z < BoolLeafNodeType::DIM - 1; ++z) { + const Index pos = yPos + z; + + if (valueMask[pos] != 0 || !node.isValueOn(pos)) continue; + + if (!node.isValueOn(pos + 1) && distNode.getValue(pos + 1) > mIsovalue) { + valueMask[pos] = 1; + } + } + } + } + + for (Index x = 0; x < BoolLeafNodeType::DIM; ++x) { + const Index xPos = x << (2 * BoolLeafNodeType::LOG2DIM); + for (Index y = 0; y < BoolLeafNodeType::DIM - 1; ++y) { + const Index yPos = xPos + (y << BoolLeafNodeType::LOG2DIM); + for (Index z = 0; z < BoolLeafNodeType::DIM; ++z) { + const Index pos = yPos + z; + + if (valueMask[pos] != 0 || !node.isValueOn(pos)) continue; + + if (!node.isValueOn(pos + BoolLeafNodeType::DIM) && + distNode.getValue(pos + BoolLeafNodeType::DIM) > mIsovalue) { + valueMask[pos] = 1; + } + } + } + } + + for (Index x = 0; x < BoolLeafNodeType::DIM - 1; ++x) { + const Index xPos = x << (2 * BoolLeafNodeType::LOG2DIM); + for (Index y = 0; y < BoolLeafNodeType::DIM; ++y) { + const Index yPos = xPos + (y << BoolLeafNodeType::LOG2DIM); + for (Index z = 0; z < BoolLeafNodeType::DIM; ++z) { + const Index pos = yPos + z; + + if (valueMask[pos] != 0 || !node.isValueOn(pos)) continue; + + if (!node.isValueOn(pos + BoolLeafNodeType::DIM * BoolLeafNodeType::DIM) && + distNode.getValue(pos + BoolLeafNodeType::DIM * BoolLeafNodeType::DIM) > mIsovalue) { + valueMask[pos] = 1; + } + } + } + } + } + + bool evalInternalNeighborsP(char* valueMask, const BoolLeafNodeType& node) const { + + for (Index x = 0; x < BoolLeafNodeType::DIM; ++x) { + const Index xPos = x << (2 * BoolLeafNodeType::LOG2DIM); + for (Index y = 0; y < BoolLeafNodeType::DIM; ++y) { + const Index yPos = xPos + (y << BoolLeafNodeType::LOG2DIM); + for (Index z = 0; z < BoolLeafNodeType::DIM - 1; ++z) { + const Index pos = yPos + z; + + if (node.isValueOn(pos) && !node.isValueOn(pos + 1)) { + valueMask[pos] = 1; + return true; + } + } + } + } + + for (Index x = 0; x < BoolLeafNodeType::DIM; ++x) { + const Index xPos = x << (2 * BoolLeafNodeType::LOG2DIM); + for (Index y = 0; y < BoolLeafNodeType::DIM - 1; ++y) { + const Index yPos = xPos + (y << BoolLeafNodeType::LOG2DIM); + for (Index z = 0; z < BoolLeafNodeType::DIM; ++z) { + const Index pos = yPos + z; + + if (node.isValueOn(pos) && !node.isValueOn(pos + BoolLeafNodeType::DIM)) { + valueMask[pos] = 1; + return true; + } + } + } + } + + for (Index x = 0; x < BoolLeafNodeType::DIM - 1; ++x) { + const Index xPos = x << (2 * BoolLeafNodeType::LOG2DIM); + for (Index y = 0; y < BoolLeafNodeType::DIM; ++y) { + const Index yPos = xPos + (y << BoolLeafNodeType::LOG2DIM); + for (Index z = 0; z < BoolLeafNodeType::DIM; ++z) { + const Index pos = yPos + z; + + if (node.isValueOn(pos) && + !node.isValueOn(pos + BoolLeafNodeType::DIM * BoolLeafNodeType::DIM)) { + valueMask[pos] = 1; + return true; + } + } + } + } + + return false; + } + + // Check internal voxel neighbors in negative {x, y, z} directions. + + void evalInternalNeighborsN(char* valueMask, const BoolLeafNodeType& node, const LeafNodeType& distNode) const { + + for (Index x = 0; x < BoolLeafNodeType::DIM; ++x) { + const Index xPos = x << (2 * BoolLeafNodeType::LOG2DIM); + for (Index y = 0; y < BoolLeafNodeType::DIM; ++y) { + const Index yPos = xPos + (y << BoolLeafNodeType::LOG2DIM); + for (Index z = 1; z < BoolLeafNodeType::DIM; ++z) { + const Index pos = yPos + z; + + if (valueMask[pos] != 0 || !node.isValueOn(pos)) continue; + + if (!node.isValueOn(pos - 1) && distNode.getValue(pos - 1) > mIsovalue) { + valueMask[pos] = 1; + } + } + } + } + + for (Index x = 0; x < BoolLeafNodeType::DIM; ++x) { + const Index xPos = x << (2 * BoolLeafNodeType::LOG2DIM); + for (Index y = 1; y < BoolLeafNodeType::DIM; ++y) { + const Index yPos = xPos + (y << BoolLeafNodeType::LOG2DIM); + for (Index z = 0; z < BoolLeafNodeType::DIM; ++z) { + const Index pos = yPos + z; + + if (valueMask[pos] != 0 || !node.isValueOn(pos)) continue; + + if (!node.isValueOn(pos - BoolLeafNodeType::DIM) && + distNode.getValue(pos - BoolLeafNodeType::DIM) > mIsovalue) { + valueMask[pos] = 1; + } + } + } + } + + for (Index x = 1; x < BoolLeafNodeType::DIM; ++x) { + const Index xPos = x << (2 * BoolLeafNodeType::LOG2DIM); + for (Index y = 0; y < BoolLeafNodeType::DIM; ++y) { + const Index yPos = xPos + (y << BoolLeafNodeType::LOG2DIM); + for (Index z = 0; z < BoolLeafNodeType::DIM; ++z) { + const Index pos = yPos + z; + + if (valueMask[pos] != 0 || !node.isValueOn(pos)) continue; + + if (!node.isValueOn(pos - BoolLeafNodeType::DIM * BoolLeafNodeType::DIM) && + distNode.getValue(pos - BoolLeafNodeType::DIM * BoolLeafNodeType::DIM) > mIsovalue) { + valueMask[pos] = 1; + } + } + } + } + } + + + bool evalInternalNeighborsN(char* valueMask, const BoolLeafNodeType& node) const { + + for (Index x = 0; x < BoolLeafNodeType::DIM; ++x) { + const Index xPos = x << (2 * BoolLeafNodeType::LOG2DIM); + for (Index y = 0; y < BoolLeafNodeType::DIM; ++y) { + const Index yPos = xPos + (y << BoolLeafNodeType::LOG2DIM); + for (Index z = 1; z < BoolLeafNodeType::DIM; ++z) { + const Index pos = yPos + z; + + if (node.isValueOn(pos) && !node.isValueOn(pos - 1)) { + valueMask[pos] = 1; + return true; + } + } + } + } + + for (Index x = 0; x < BoolLeafNodeType::DIM; ++x) { + const Index xPos = x << (2 * BoolLeafNodeType::LOG2DIM); + for (Index y = 1; y < BoolLeafNodeType::DIM; ++y) { + const Index yPos = xPos + (y << BoolLeafNodeType::LOG2DIM); + for (Index z = 0; z < BoolLeafNodeType::DIM; ++z) { + const Index pos = yPos + z; + + if (node.isValueOn(pos) && !node.isValueOn(pos - BoolLeafNodeType::DIM)) { + valueMask[pos] = 1; + return true; + } + } + } + } + + for (Index x = 1; x < BoolLeafNodeType::DIM; ++x) { + const Index xPos = x << (2 * BoolLeafNodeType::LOG2DIM); + for (Index y = 0; y < BoolLeafNodeType::DIM; ++y) { + const Index yPos = xPos + (y << BoolLeafNodeType::LOG2DIM); + for (Index z = 0; z < BoolLeafNodeType::DIM; ++z) { + const Index pos = yPos + z; + + if (node.isValueOn(pos) && + !node.isValueOn(pos - BoolLeafNodeType::DIM * BoolLeafNodeType::DIM)) { + valueMask[pos] = 1; + return true; + } + } + } + } + + return false; + } + + + // Check external voxel neighbors + + // If UpWind is true check the X+ oriented node face, else the X- oriented face. + template + void evalExternalNeighborsX(char* valueMask, const BoolLeafNodeType& node, + const tree::ValueAccessor& maskAcc, + const tree::ValueAccessor& distAcc) const { + + const Coord& origin = node.origin(); + Coord ijk(0, 0, 0), nijk; + int step = -1; + + if (UpWind) { + step = 1; + ijk[0] = int(BoolLeafNodeType::DIM) - 1; + } + + const Index xPos = ijk[0] << (2 * int(BoolLeafNodeType::LOG2DIM)); + + for (ijk[1] = 0; ijk[1] < int(BoolLeafNodeType::DIM); ++ijk[1]) { + const Index yPos = xPos + (ijk[1] << int(BoolLeafNodeType::LOG2DIM)); + + for (ijk[2] = 0; ijk[2] < int(BoolLeafNodeType::DIM); ++ijk[2]) { + const Index pos = yPos + ijk[2]; + + if (valueMask[pos] == 0 && node.isValueOn(pos)) { + + nijk = origin + ijk.offsetBy(step, 0, 0); + + if (!maskAcc.isValueOn(nijk) && distAcc.getValue(nijk) > mIsovalue) { + valueMask[pos] = 1; + } + } + } + } + } + + // If UpWind is true check the Y+ oriented node face, else the Y- oriented face. + template + void evalExternalNeighborsY(char* valueMask, const BoolLeafNodeType& node, + const tree::ValueAccessor& maskAcc, + const tree::ValueAccessor& distAcc) const { + + const Coord& origin = node.origin(); + Coord ijk(0, 0, 0), nijk; + int step = -1; + + if (UpWind) { + step = 1; + ijk[1] = int(BoolLeafNodeType::DIM) - 1; + } + + const Index yPos = ijk[1] << int(BoolLeafNodeType::LOG2DIM); + + for (ijk[0] = 0; ijk[0] < int(BoolLeafNodeType::DIM); ++ijk[0]) { + const Index xPos = yPos + (ijk[0] << (2 * int(BoolLeafNodeType::LOG2DIM))); + + for (ijk[2] = 0; ijk[2] < int(BoolLeafNodeType::DIM); ++ijk[2]) { + const Index pos = xPos + ijk[2]; + + if (valueMask[pos] == 0 && node.isValueOn(pos)) { + + nijk = origin + ijk.offsetBy(0, step, 0); + if (!maskAcc.isValueOn(nijk) && distAcc.getValue(nijk) > mIsovalue) { + valueMask[pos] = 1; + } + } + } + } + } + + // If UpWind is true check the Z+ oriented node face, else the Z- oriented face. + template + void evalExternalNeighborsZ(char* valueMask, const BoolLeafNodeType& node, + const tree::ValueAccessor& maskAcc, + const tree::ValueAccessor& distAcc) const { + + const Coord& origin = node.origin(); + Coord ijk(0, 0, 0), nijk; + int step = -1; + + if (UpWind) { + step = 1; + ijk[2] = int(BoolLeafNodeType::DIM) - 1; + } + + for (ijk[0] = 0; ijk[0] < int(BoolLeafNodeType::DIM); ++ijk[0]) { + const Index xPos = ijk[0] << (2 * int(BoolLeafNodeType::LOG2DIM)); + + for (ijk[1] = 0; ijk[1] < int(BoolLeafNodeType::DIM); ++ijk[1]) { + const Index pos = ijk[2] + xPos + (ijk[1] << int(BoolLeafNodeType::LOG2DIM)); + + if (valueMask[pos] == 0 && node.isValueOn(pos)) { + + nijk = origin + ijk.offsetBy(0, 0, step); + if (!maskAcc.isValueOn(nijk) && distAcc.getValue(nijk) > mIsovalue) { + valueMask[pos] = 1; + } + } + } + } + } + + ////////// + + TreeType const * const mTree; + BoolTreeType const * const mFillMask; + BoolLeafNodeType const * const * const mFillNodes; + BoolLeafNodeType ** const mNewNodes; + ValueType const mIsovalue; +}; // FillMaskBoundary + + +/// @brief Constructs a memory light char tree that represents the exterior region with @c +1 +/// and the interior regions with @c -1. +template +inline typename TreeType::template ValueConverter::Type::Ptr +computeEnclosedRegionMask(const TreeType& tree, typename TreeType::ValueType isovalue, + const typename TreeType::template ValueConverter::Type* fillMask) +{ + typedef typename TreeType::LeafNodeType LeafNodeType; + typedef typename TreeType::RootNodeType RootNodeType; + typedef typename RootNodeType::NodeChainType NodeChainType; + typedef typename boost::mpl::at >::type InternalNodeType; + + typedef typename TreeType::template ValueConverter::Type CharTreeType; + typedef typename CharTreeType::LeafNodeType CharLeafNodeType; + typedef typename CharTreeType::RootNodeType CharRootNodeType; + typedef typename CharRootNodeType::NodeChainType CharNodeChainType; + + typedef typename TreeType::template ValueConverter::Type BoolTreeType; + typedef typename BoolTreeType::LeafNodeType BoolLeafNodeType; + + ///// + + const TreeType* treePt = &tree; + + size_t numLeafNodes = 0, numInternalNodes = 0; + + std::vector nodes; + std::vector leafnodeCount; + + { + // compute the prefix sum of the leafnode count in each internal node. + std::vector internalNodes; + treePt->getNodes(internalNodes); + + numInternalNodes = internalNodes.size(); + + leafnodeCount.push_back(0); + for (size_t n = 0; n < numInternalNodes; ++n) { + leafnodeCount.push_back(leafnodeCount.back() + internalNodes[n]->leafCount()); + } + + numLeafNodes = leafnodeCount.back(); + + // extract all leafnodes + nodes.reserve(numLeafNodes); + + for (size_t n = 0; n < numInternalNodes; ++n) { + internalNodes[n]->getNodes(nodes); + } + } + + // create mask leafnodes + boost::scoped_array maskNodes(new CharLeafNodeType*[numLeafNodes]); + + tbb::parallel_for(tbb::blocked_range(0, numLeafNodes), + LabelBoundaryVoxels(isovalue, &nodes[0], maskNodes.get())); + + // create mask grid + typename CharTreeType::Ptr maskTree(new CharTreeType(1)); + + PopulateTree populate(*maskTree, maskNodes.get(), &leafnodeCount[0], 1); + tbb::parallel_reduce(tbb::blocked_range(0, numInternalNodes), populate); + + // optionally evaluate the fill mask + + std::vector extraMaskNodes; + + if (fillMask) { + + std::vector fillMaskNodes; + fillMask->getNodes(fillMaskNodes); + + boost::scoped_array boundaryMaskNodes(new BoolLeafNodeType*[fillMaskNodes.size()]); + + tbb::parallel_for(tbb::blocked_range(0, fillMaskNodes.size()), + FillMaskBoundary(tree, isovalue, *fillMask, &fillMaskNodes[0], boundaryMaskNodes.get())); + + tree::ValueAccessor maskAcc(*maskTree); + + for (size_t n = 0, N = fillMaskNodes.size(); n < N; ++n) { + + if (boundaryMaskNodes[n] == NULL) continue; + + const BoolLeafNodeType& boundaryNode = *boundaryMaskNodes[n]; + const Coord& origin = boundaryNode.origin(); + + CharLeafNodeType* maskNodePt = maskAcc.probeLeaf(origin); + + if (!maskNodePt) { + maskNodePt = maskAcc.touchLeaf(origin); + extraMaskNodes.push_back(maskNodePt); + } + + char* data = maskNodePt->buffer().data(); + + typename BoolLeafNodeType::ValueOnCIter it = boundaryNode.cbeginValueOn(); + for (; it; ++it) { + if (data[it.pos()] != 0) data[it.pos()] = -1; + } + + delete boundaryMaskNodes[n]; + } + } + + // eliminate enclosed regions + tools::traceExteriorBoundaries(*maskTree); + + // flip voxel sign to negative inside and positive outside. + tbb::parallel_for(tbb::blocked_range(0, numLeafNodes), + FlipRegionSign(maskNodes.get())); + + if (!extraMaskNodes.empty()) { + tbb::parallel_for(tbb::blocked_range(0, extraMaskNodes.size()), + FlipRegionSign(&extraMaskNodes[0])); + } + + // propagate sign information into tile region + tools::signedFloodFill(*maskTree); + + return maskTree; +} // computeEnclosedRegionMask() + + +template +inline typename TreeType::template ValueConverter::Type::Ptr +computeInteriorMask(const TreeType& tree, typename TreeType::ValueType iso) +{ + typedef typename TreeType::LeafNodeType LeafNodeType; + typedef typename TreeType::RootNodeType RootNodeType; + typedef typename RootNodeType::NodeChainType NodeChainType; + typedef typename boost::mpl::at >::type InternalNodeType; + + typedef typename TreeType::template ValueConverter::Type BoolTreeType; + typedef typename BoolTreeType::LeafNodeType BoolLeafNodeType; + typedef typename BoolTreeType::RootNodeType BoolRootNodeType; + typedef typename BoolRootNodeType::NodeChainType BoolNodeChainType; + typedef typename boost::mpl::at >::type BoolInternalNodeType; + + ///// + size_t numLeafNodes = 0, numInternalNodes = 0; + + std::vector nodes; + std::vector leafnodeCount; + + { + // compute the prefix sum of the leafnode count in each internal node. + std::vector internalNodes; + tree.getNodes(internalNodes); + + numInternalNodes = internalNodes.size(); + + leafnodeCount.push_back(0); + for (size_t n = 0; n < numInternalNodes; ++n) { + leafnodeCount.push_back(leafnodeCount.back() + internalNodes[n]->leafCount()); + } + + numLeafNodes = leafnodeCount.back(); + + // extract all leafnodes + nodes.reserve(numLeafNodes); + + for (size_t n = 0; n < numInternalNodes; ++n) { + internalNodes[n]->getNodes(nodes); + } + } + + // create mask leafnodes + boost::scoped_array maskNodes(new BoolLeafNodeType*[numLeafNodes]); + + tbb::parallel_for(tbb::blocked_range(0, numLeafNodes), + MaskInteriorVoxels(iso, &nodes[0], maskNodes.get())); + + + // create mask grid + typename BoolTreeType::Ptr maskTree(new BoolTreeType(false)); + + PopulateTree populate(*maskTree, maskNodes.get(), &leafnodeCount[0], false); + tbb::parallel_reduce(tbb::blocked_range(0, numInternalNodes), populate); + + + // evaluate tile values + std::vector internalMaskNodes; + maskTree->getNodes(internalMaskNodes); + + tbb::parallel_for(tbb::blocked_range(0, internalMaskNodes.size()), + MaskInteriorTiles(iso, tree, &internalMaskNodes[0])); + + tree::ValueAccessor acc(tree); + + typename BoolTreeType::ValueAllIter it(*maskTree); + it.setMaxDepth(BoolTreeType::ValueAllIter::LEAF_DEPTH - 2); + + for ( ; it; ++it) { + if (acc.getValue(it.getCoord()) < iso) { + it.setValue(true); + it.setActiveState(true); + } + } + + return maskTree; +} // computeInteriorMask() + + +template +struct MaskIsovalueCrossingVoxels +{ + typedef typename InputTreeType::ValueType InputValueType; + typedef typename InputTreeType::LeafNodeType InputLeafNodeType; + typedef typename InputTreeType::template ValueConverter::Type BoolTreeType; + typedef typename BoolTreeType::LeafNodeType BoolLeafNodeType; + + MaskIsovalueCrossingVoxels( + const InputTreeType& inputTree, + const std::vector& inputLeafNodes, + BoolTreeType& maskTree, + InputValueType iso) + : mInputAccessor(inputTree) + , mInputNodes(!inputLeafNodes.empty() ? &inputLeafNodes.front() : NULL) + , mMaskTree(false) + , mMaskAccessor(maskTree) + , mIsovalue(iso) + { + } + + MaskIsovalueCrossingVoxels(MaskIsovalueCrossingVoxels& rhs, tbb::split) + : mInputAccessor(rhs.mInputAccessor.tree()) + , mInputNodes(rhs.mInputNodes) + , mMaskTree(false) + , mMaskAccessor(mMaskTree) + , mIsovalue(rhs.mIsovalue) + { + } + + void operator()(const tbb::blocked_range& range) { + + const InputValueType iso = mIsovalue; + Coord ijk(0, 0, 0); + + BoolLeafNodeType* maskNodePt = NULL; + + for (size_t n = range.begin(); mInputNodes && (n != range.end()); ++n) { + + const InputLeafNodeType& node = *mInputNodes[n]; + + if (!maskNodePt) maskNodePt = new BoolLeafNodeType(node.origin(), false); + else maskNodePt->setOrigin(node.origin()); + + bool collectedData = false; + + for (typename InputLeafNodeType::ValueOnCIter it = node.cbeginValueOn(); it; ++it) { + + bool isUnder = *it < iso; + + ijk = it.getCoord(); + + ++ijk[2]; + bool signChange = isUnder != (mInputAccessor.getValue(ijk) < iso); // +z edge + --ijk[2]; + + if (!signChange) { + --ijk[2]; + signChange = isUnder != (mInputAccessor.getValue(ijk) < iso); // -z edge + ++ijk[2]; + } + + if (!signChange) { + ++ijk[1]; + signChange = isUnder != (mInputAccessor.getValue(ijk) < iso); // +y edge + --ijk[1]; + } + + if (!signChange) { + --ijk[1]; + signChange = isUnder != (mInputAccessor.getValue(ijk) < iso); // -y edge + ++ijk[1]; + } + + if (!signChange) { + ++ijk[0]; + signChange = isUnder != (mInputAccessor.getValue(ijk) < iso); // +x edge + --ijk[0]; + } + + if (!signChange) { + --ijk[0]; + signChange = isUnder != (mInputAccessor.getValue(ijk) < iso); // -x edge + ++ijk[0]; + } + + if (signChange) { + collectedData = true; + maskNodePt->setValueOn(it.pos(), true); + } + } + + if (collectedData) { + mMaskAccessor.addLeaf(maskNodePt); + maskNodePt = NULL; + } + } + + if (maskNodePt) delete maskNodePt; + } + + void join(MaskIsovalueCrossingVoxels& rhs) { + mMaskAccessor.tree().merge(rhs.mMaskAccessor.tree()); + } + +private: + tree::ValueAccessor mInputAccessor; + InputLeafNodeType const * const * const mInputNodes; + + BoolTreeType mMaskTree; + tree::ValueAccessor mMaskAccessor; + + InputValueType mIsovalue; +}; // MaskIsovalueCrossingVoxels + + +//////////////////////////////////////// + + +template +struct NodeMaskSegment +{ + typedef boost::shared_ptr Ptr; + typedef typename NodeType::NodeMaskType NodeMaskType; + + NodeMaskSegment() : connections(), mask(false), origin(0,0,0), visited(false) {} + + std::vector connections; + NodeMaskType mask; + Coord origin; + bool visited; +}; // struct NodeMaskSegment + + +template +inline void +nodeMaskSegmentation(const NodeType& node, + std::vector::Ptr>& segments) +{ + typedef typename NodeType::NodeMaskType NodeMaskType; + typedef NodeMaskSegment NodeMaskSegmentType; + typedef typename NodeMaskSegmentType::Ptr NodeMaskSegmentTypePtr; + + NodeMaskType nodeMask(node.getValueMask()); + std::deque indexList; + + while (!nodeMask.isOff()) { + + NodeMaskSegmentTypePtr segment(new NodeMaskSegmentType()); + segment->origin = node.origin(); + + NodeMaskType& mask = segment->mask; + + indexList.push_back(nodeMask.findFirstOn()); + nodeMask.setOff(indexList.back()); // mark as visited + Coord ijk(0, 0, 0); + + while (!indexList.empty()) { + + const Index pos = indexList.back(); + indexList.pop_back(); + + if (mask.isOn(pos)) continue; + mask.setOn(pos); + + ijk = NodeType::offsetToLocalCoord(pos); + + Index npos = pos - 1; + if (ijk[2] != 0 && nodeMask.isOn(npos)) { + nodeMask.setOff(npos); + indexList.push_back(npos); + } + + npos = pos + 1; + if (ijk[2] != (NodeType::DIM - 1) && nodeMask.isOn(npos)) { + nodeMask.setOff(npos); + indexList.push_back(npos); + } + + npos = pos - NodeType::DIM; + if (ijk[1] != 0 && nodeMask.isOn(npos)) { + nodeMask.setOff(npos); + indexList.push_back(npos); + } + + npos = pos + NodeType::DIM; + if (ijk[1] != (NodeType::DIM - 1) && nodeMask.isOn(npos)) { + nodeMask.setOff(npos); + indexList.push_back(npos); + } + + npos = pos - NodeType::DIM * NodeType::DIM; + if (ijk[0] != 0 && nodeMask.isOn(npos)) { + nodeMask.setOff(npos); + indexList.push_back(npos); + } + + npos = pos + NodeType::DIM * NodeType::DIM; + if (ijk[0] != (NodeType::DIM - 1) && nodeMask.isOn(npos)) { + nodeMask.setOff(npos); + indexList.push_back(npos); + } + + } + + segments.push_back(segment); + } +} + + +template +struct SegmentNodeMask +{ + typedef NodeMaskSegment NodeMaskSegmentType; + typedef typename NodeMaskSegmentType::Ptr NodeMaskSegmentTypePtr; + typedef typename std::vector NodeMaskSegmentVector; + + SegmentNodeMask(std::vector& nodes, NodeMaskSegmentVector* nodeMaskArray) + : mNodes(!nodes.empty() ? &nodes.front() : NULL) + , mNodeMaskArray(nodeMaskArray) + { + } + + void operator()(const tbb::blocked_range& range) const { + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + NodeType& node = *mNodes[n]; + nodeMaskSegmentation(node, mNodeMaskArray[n]); + + // hack origin data to store array offset + Coord& origin = const_cast(node.origin()); + origin[0] = static_cast(n); + } + } + + NodeType * const * const mNodes; + NodeMaskSegmentVector * const mNodeMaskArray; +}; // struct SegmentNodeMask + + +template +struct ConnectNodeMaskSegments +{ + typedef typename NodeType::NodeMaskType NodeMaskType; + typedef NodeMaskSegment NodeMaskSegmentType; + typedef typename NodeMaskSegmentType::Ptr NodeMaskSegmentTypePtr; + typedef typename std::vector NodeMaskSegmentVector; + + ConnectNodeMaskSegments(const TreeType& tree, NodeMaskSegmentVector* nodeMaskArray) + : mTree(&tree) + , mNodeMaskArray(nodeMaskArray) + { + } + + void operator()(const tbb::blocked_range& range) const { + + tree::ValueAccessor acc(*mTree); + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + NodeMaskSegmentVector& segments = mNodeMaskArray[n]; + if (segments.empty()) continue; + + std::vector > connections(segments.size()); + + Coord ijk = segments[0]->origin; + + const NodeType* node = acc.template probeConstNode(ijk); + if (!node) continue; + + // get neighbour nodes + + ijk[2] += NodeType::DIM; + const NodeType* nodeZUp = acc.template probeConstNode(ijk); + ijk[2] -= (NodeType::DIM + NodeType::DIM); + const NodeType* nodeZDown = acc.template probeConstNode(ijk); + ijk[2] += NodeType::DIM; + + ijk[1] += NodeType::DIM; + const NodeType* nodeYUp = acc.template probeConstNode(ijk); + ijk[1] -= (NodeType::DIM + NodeType::DIM); + const NodeType* nodeYDown = acc.template probeConstNode(ijk); + ijk[1] += NodeType::DIM; + + ijk[0] += NodeType::DIM; + const NodeType* nodeXUp = acc.template probeConstNode(ijk); + ijk[0] -= (NodeType::DIM + NodeType::DIM); + const NodeType* nodeXDown = acc.template probeConstNode(ijk); + ijk[0] += NodeType::DIM; + + const Index startPos = node->getValueMask().findFirstOn(); + for (Index pos = startPos; pos < NodeMaskType::SIZE; ++pos) { + + if (!node->isValueOn(pos)) continue; + + ijk = NodeType::offsetToLocalCoord(pos); + Index npos = 0; + + if (ijk[2] == 0) { + npos = pos + (NodeType::DIM - 1); + if (nodeZDown && nodeZDown->isValueOn(npos)) { + NodeMaskSegmentType* nsegment = + findNodeMaskSegment(mNodeMaskArray[getNodeOffset(*nodeZDown)], npos); + const Index idx = findNodeMaskSegmentIndex(segments, pos); + connections[idx].insert(nsegment); + } + } else if (ijk[2] == (NodeType::DIM - 1)) { + npos = pos - (NodeType::DIM - 1); + if (nodeZUp && nodeZUp->isValueOn(npos)) { + NodeMaskSegmentType* nsegment = + findNodeMaskSegment(mNodeMaskArray[getNodeOffset(*nodeZUp)], npos); + const Index idx = findNodeMaskSegmentIndex(segments, pos); + connections[idx].insert(nsegment); + } + } + + if (ijk[1] == 0) { + npos = pos + (NodeType::DIM - 1) * NodeType::DIM; + if (nodeYDown && nodeYDown->isValueOn(npos)) { + NodeMaskSegmentType* nsegment = + findNodeMaskSegment(mNodeMaskArray[getNodeOffset(*nodeYDown)], npos); + const Index idx = findNodeMaskSegmentIndex(segments, pos); + connections[idx].insert(nsegment); + } + } else if (ijk[1] == (NodeType::DIM - 1)) { + npos = pos - (NodeType::DIM - 1) * NodeType::DIM; + if (nodeYUp && nodeYUp->isValueOn(npos)) { + NodeMaskSegmentType* nsegment = + findNodeMaskSegment(mNodeMaskArray[getNodeOffset(*nodeYUp)], npos); + const Index idx = findNodeMaskSegmentIndex(segments, pos); + connections[idx].insert(nsegment); + } + } + + if (ijk[0] == 0) { + npos = pos + (NodeType::DIM - 1) * NodeType::DIM * NodeType::DIM; + if (nodeXDown && nodeXDown->isValueOn(npos)) { + NodeMaskSegmentType* nsegment = + findNodeMaskSegment(mNodeMaskArray[getNodeOffset(*nodeXDown)], npos); + const Index idx = findNodeMaskSegmentIndex(segments, pos); + connections[idx].insert(nsegment); + } + } else if (ijk[0] == (NodeType::DIM - 1)) { + npos = pos - (NodeType::DIM - 1) * NodeType::DIM * NodeType::DIM; + if (nodeXUp && nodeXUp->isValueOn(npos)) { + NodeMaskSegmentType* nsegment = + findNodeMaskSegment(mNodeMaskArray[getNodeOffset(*nodeXUp)], npos); + const Index idx = findNodeMaskSegmentIndex(segments, pos); + connections[idx].insert(nsegment); + } + } + } + + for (size_t i = 0, I = connections.size(); i < I; ++i) { + + typename std::set::iterator + it = connections[i].begin(), end = connections[i].end(); + + std::vector& segmentConnections = segments[i]->connections; + segmentConnections.reserve(connections.size()); + for (; it != end; ++it) { + segmentConnections.push_back(*it); + } + } + } // end range loop + } + +private: + + static inline size_t getNodeOffset(const NodeType& node) { + return static_cast(node.origin()[0]); + } + + static inline NodeMaskSegmentType* + findNodeMaskSegment(NodeMaskSegmentVector& segments, Index pos) + { + NodeMaskSegmentType* segment = NULL; + + for (size_t n = 0, N = segments.size(); n < N; ++n) { + if (segments[n]->mask.isOn(pos)) { + segment = segments[n].get(); + break; + } + } + + return segment; + } + + static inline Index + findNodeMaskSegmentIndex(NodeMaskSegmentVector& segments, Index pos) + { + for (Index n = 0, N = Index(segments.size()); n < N; ++n) { + if (segments[n]->mask.isOn(pos)) return n; + } + return Index(-1); + } + + TreeType const * const mTree; + NodeMaskSegmentVector * const mNodeMaskArray; +}; // struct ConnectNodeMaskSegments + + +template +struct MaskSegmentGroup +{ + typedef typename TreeType::LeafNodeType LeafNodeType; + typedef typename TreeType::Ptr TreeTypePtr; + typedef NodeMaskSegment NodeMaskSegmentType; + + MaskSegmentGroup(const std::vector& segments) + : mSegments(!segments.empty() ? &segments.front() : NULL) + , mTree(new TreeType(false)) + { + } + + MaskSegmentGroup(const MaskSegmentGroup& rhs, tbb::split) + : mSegments(rhs.mSegments) + , mTree(new TreeType(false)) + { + } + + TreeTypePtr& mask() { return mTree; } + + void join(MaskSegmentGroup& rhs) { mTree->merge(*rhs.mTree); } + + void operator()(const tbb::blocked_range& range) { + + tree::ValueAccessor acc(*mTree); + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + NodeMaskSegmentType& segment = *mSegments[n]; + LeafNodeType* node = acc.touchLeaf(segment.origin); + node->getValueMask() |= segment.mask; + } + } + +private: + NodeMaskSegmentType * const * const mSegments; + TreeTypePtr mTree; +}; // struct MaskSegmentGroup + + +//////////////////////////////////////// + + +template +struct ExpandLeafNodeRegion +{ + typedef typename TreeType::ValueType ValueType; + typedef typename TreeType::LeafNodeType LeafNodeType; + typedef typename LeafNodeType::NodeMaskType NodeMaskType; + + typedef typename TreeType::template ValueConverter::Type BoolTreeType; + typedef typename BoolTreeType::LeafNodeType BoolLeafNodeType; + + ///// + + ExpandLeafNodeRegion(const TreeType& distTree, BoolTreeType& maskTree, std::vector& maskNodes) + : mDistTree(&distTree) + , mMaskTree(&maskTree) + , mMaskNodes(!maskNodes.empty() ? &maskNodes.front() : NULL) + , mNewMaskTree(false) + { + } + + ExpandLeafNodeRegion(const ExpandLeafNodeRegion& rhs, tbb::split) + : mDistTree(rhs.mDistTree) + , mMaskTree(rhs.mMaskTree) + , mMaskNodes(rhs.mMaskNodes) + , mNewMaskTree(false) + { + } + + BoolTreeType& newMaskTree() { return mNewMaskTree; } + + void join(ExpandLeafNodeRegion& rhs) { mNewMaskTree.merge(rhs.mNewMaskTree); } + + void operator()(const tbb::blocked_range& range) { + + typedef LeafNodeType NodeType; + + tree::ValueAccessor distAcc(*mDistTree); + tree::ValueAccessor maskAcc(*mMaskTree); + tree::ValueAccessor newMaskAcc(mNewMaskTree); + + NodeMaskType maskZUp, maskZDown, maskYUp, maskYDown, maskXUp, maskXDown; + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + BoolLeafNodeType& maskNode = *mMaskNodes[n]; + if (maskNode.isEmpty()) continue; + + Coord ijk = maskNode.origin(), nijk; + + const LeafNodeType* distNode = distAcc.probeConstLeaf(ijk); + if (!distNode) continue; + + const ValueType *dataZUp = NULL, *dataZDown = NULL, + *dataYUp = NULL, *dataYDown = NULL, + *dataXUp = NULL, *dataXDown = NULL; + + ijk[2] += NodeType::DIM; + getData(ijk, distAcc, maskAcc, maskZUp, dataZUp); + ijk[2] -= (NodeType::DIM + NodeType::DIM); + getData(ijk, distAcc, maskAcc, maskZDown, dataZDown); + ijk[2] += NodeType::DIM; + + ijk[1] += NodeType::DIM; + getData(ijk, distAcc, maskAcc, maskYUp, dataYUp); + ijk[1] -= (NodeType::DIM + NodeType::DIM); + getData(ijk, distAcc, maskAcc, maskYDown, dataYDown); + ijk[1] += NodeType::DIM; + + ijk[0] += NodeType::DIM; + getData(ijk, distAcc, maskAcc, maskXUp, dataXUp); + ijk[0] -= (NodeType::DIM + NodeType::DIM); + getData(ijk, distAcc, maskAcc, maskXDown, dataXDown); + ijk[0] += NodeType::DIM; + + for (typename BoolLeafNodeType::ValueOnIter it = maskNode.beginValueOn(); it; ++it) { + + const Index pos = it.pos(); + const ValueType val = std::abs(distNode->getValue(pos)); + + ijk = BoolLeafNodeType::offsetToLocalCoord(pos); + nijk = ijk + maskNode.origin(); + + if (dataZUp && ijk[2] == (BoolLeafNodeType::DIM - 1)) { + const Index npos = pos - (NodeType::DIM - 1); + if (maskZUp.isOn(npos) && std::abs(dataZUp[npos]) > val) { + newMaskAcc.setValueOn(nijk.offsetBy(0, 0, 1)); + } + } else if (dataZDown && ijk[2] == 0) { + const Index npos = pos + (NodeType::DIM - 1); + if (maskZDown.isOn(npos) && std::abs(dataZDown[npos]) > val) { + newMaskAcc.setValueOn(nijk.offsetBy(0, 0, -1)); + } + } + + if (dataYUp && ijk[1] == (BoolLeafNodeType::DIM - 1)) { + const Index npos = pos - (NodeType::DIM - 1) * NodeType::DIM; + if (maskYUp.isOn(npos) && std::abs(dataYUp[npos]) > val) { + newMaskAcc.setValueOn(nijk.offsetBy(0, 1, 0)); + } + } else if (dataYDown && ijk[1] == 0) { + const Index npos = pos + (NodeType::DIM - 1) * NodeType::DIM; + if (maskYDown.isOn(npos) && std::abs(dataYDown[npos]) > val) { + newMaskAcc.setValueOn(nijk.offsetBy(0, -1, 0)); + } + } + + if (dataXUp && ijk[0] == (BoolLeafNodeType::DIM - 1)) { + const Index npos = pos - (NodeType::DIM - 1) * NodeType::DIM * NodeType::DIM; + if (maskXUp.isOn(npos) && std::abs(dataXUp[npos]) > val) { + newMaskAcc.setValueOn(nijk.offsetBy(1, 0, 0)); + } + } else if (dataXDown && ijk[0] == 0) { + const Index npos = pos + (NodeType::DIM - 1) * NodeType::DIM * NodeType::DIM; + if (maskXDown.isOn(npos) && std::abs(dataXDown[npos]) > val) { + newMaskAcc.setValueOn(nijk.offsetBy(-1, 0, 0)); + } + } + + } // end value on loop + } // end range loop + } + +private: + + static inline void + getData(const Coord& ijk, tree::ValueAccessor& distAcc, + tree::ValueAccessor& maskAcc, NodeMaskType& mask, const ValueType*& data) + { + const LeafNodeType* node = distAcc.probeConstLeaf(ijk); + if (node) { + data = node->buffer().data(); + mask = node->getValueMask(); + const BoolLeafNodeType* maskNodePt = maskAcc.probeConstLeaf(ijk); + if (maskNodePt) mask -= maskNodePt->getValueMask(); + } + } + + TreeType const * const mDistTree; + BoolTreeType * const mMaskTree; + BoolLeafNodeType ** const mMaskNodes; + + BoolTreeType mNewMaskTree; +}; // struct ExpandLeafNodeRegion + + +template +struct FillLeafNodeVoxels +{ + typedef typename TreeType::ValueType ValueType; + typedef typename TreeType::LeafNodeType LeafNodeType; + typedef typename LeafNodeType::NodeMaskType NodeMaskType; + typedef tree::LeafNode BoolLeafNodeType; + + FillLeafNodeVoxels(const TreeType& tree, std::vector& maskNodes) + : mTree(&tree), mMaskNodes(!maskNodes.empty() ? &maskNodes.front() : NULL) + { + } + + void operator()(const tbb::blocked_range& range) const { + + tree::ValueAccessor distAcc(*mTree); + + std::vector indexList; + indexList.reserve(NodeMaskType::SIZE); + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + BoolLeafNodeType& maskNode = *mMaskNodes[n]; + + const LeafNodeType * distNode = distAcc.probeConstLeaf(maskNode.origin()); + if (!distNode) continue; + + NodeMaskType mask(distNode->getValueMask()); + NodeMaskType& narrowbandMask = maskNode.getValueMask(); + + for (Index pos = narrowbandMask.findFirstOn(); pos < NodeMaskType::SIZE; ++pos) { + if (narrowbandMask.isOn(pos)) indexList.push_back(pos); + } + + mask -= narrowbandMask; // bitwise difference + narrowbandMask.setOff(); + + const ValueType* data = distNode->buffer().data(); + Coord ijk(0, 0, 0); + + while (!indexList.empty()) { + + const Index pos = indexList.back(); + indexList.pop_back(); + + if (narrowbandMask.isOn(pos)) continue; + narrowbandMask.setOn(pos); + + const ValueType dist = std::abs(data[pos]); + + ijk = LeafNodeType::offsetToLocalCoord(pos); + + Index npos = pos - 1; + if (ijk[2] != 0 && mask.isOn(npos) && std::abs(data[npos]) > dist) { + mask.setOff(npos); + indexList.push_back(npos); + } + + npos = pos + 1; + if (ijk[2] != (LeafNodeType::DIM - 1) && mask.isOn(npos) && std::abs(data[npos]) > dist) { + mask.setOff(npos); + indexList.push_back(npos); + } + + npos = pos - LeafNodeType::DIM; + if (ijk[1] != 0 && mask.isOn(npos) && std::abs(data[npos]) > dist) { + mask.setOff(npos); + indexList.push_back(npos); + } + + npos = pos + LeafNodeType::DIM; + if (ijk[1] != (LeafNodeType::DIM - 1) && mask.isOn(npos) && std::abs(data[npos]) > dist) { + mask.setOff(npos); + indexList.push_back(npos); + } + + npos = pos - LeafNodeType::DIM * LeafNodeType::DIM; + if (ijk[0] != 0 && mask.isOn(npos) && std::abs(data[npos]) > dist) { + mask.setOff(npos); + indexList.push_back(npos); + } + + npos = pos + LeafNodeType::DIM * LeafNodeType::DIM; + if (ijk[0] != (LeafNodeType::DIM - 1) && mask.isOn(npos) && std::abs(data[npos]) > dist) { + mask.setOff(npos); + indexList.push_back(npos); + } + } // end flood fill loop + } // end range loop + } + + TreeType const * const mTree; + BoolLeafNodeType ** const mMaskNodes; +}; // FillLeafNodeVoxels + + +template +struct ExpandNarrowbandMask +{ + typedef typename TreeType::template ValueConverter::Type BoolTreeType; + typedef typename BoolTreeType::LeafNodeType BoolLeafNodeType; + typedef typename BoolTreeType::Ptr BoolTreeTypePtr; + + ExpandNarrowbandMask(const TreeType& tree, std::vector& segments) + : mTree(&tree), mSegments(!segments.empty() ? &segments.front() : NULL) + { + } + + void operator()(const tbb::blocked_range& range) const { + + const TreeType& distTree = *mTree; + std::vector nodes; + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + BoolTreeType& narrowBandMask = *mSegments[n]; + + BoolTreeType candidateMask(narrowBandMask, false, TopologyCopy()); + + while (true) { + + nodes.clear(); + candidateMask.getNodes(nodes); + if (nodes.empty()) break; + + const tbb::blocked_range nodeRange(0, nodes.size()); + + tbb::parallel_for(nodeRange, FillLeafNodeVoxels(distTree, nodes)); + + narrowBandMask.topologyUnion(candidateMask); + + ExpandLeafNodeRegion op(distTree, narrowBandMask, nodes); + tbb::parallel_reduce(nodeRange, op); + + if (op.newMaskTree().empty()) break; + + candidateMask.clear(); + candidateMask.merge(op.newMaskTree()); + } // end expand loop + } // end range loop + } + + TreeType const * const mTree; + BoolTreeTypePtr * const mSegments; +}; // ExpandNarrowbandMask + + +template +struct FloodFillSign +{ + typedef typename TreeType::Ptr TreeTypePtr; + typedef typename TreeType::ValueType ValueType; + typedef typename TreeType::LeafNodeType LeafNodeType; + typedef typename TreeType::RootNodeType RootNodeType; + typedef typename RootNodeType::NodeChainType NodeChainType; + typedef typename boost::mpl::at >::type InternalNodeType; + + FloodFillSign(const TreeType& tree, std::vector& segments) + : mTree(&tree) + , mSegments(!segments.empty() ? &segments.front() : NULL) + , mMinValue(ValueType(0.0)) + { + ValueType minSDFValue = std::numeric_limits::max(); + + { + std::vector nodes; + tree.getNodes(nodes); + + if (!nodes.empty()) { + FindMinTileValue minOp(&nodes[0]); + tbb::parallel_reduce(tbb::blocked_range(0, nodes.size()), minOp); + minSDFValue = std::min(minSDFValue, minOp.minValue); + } + } + + if (minSDFValue > ValueType(0.0)) { + std::vector nodes; + tree.getNodes(nodes); + if (!nodes.empty()) { + FindMinVoxelValue minOp(&nodes[0]); + tbb::parallel_reduce(tbb::blocked_range(0, nodes.size()), minOp); + minSDFValue = std::min(minSDFValue, minOp.minValue); + } + } + + mMinValue = minSDFValue; + } + + void operator()(const tbb::blocked_range& range) const { + const ValueType interiorValue = -std::abs(mMinValue); + const ValueType exteriorValue = std::abs(mTree->background()); + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + tools::signedFloodFillWithValues(*mSegments[n], exteriorValue, interiorValue); + } + } + +private: + + TreeType const * const mTree; + TreeTypePtr * const mSegments; + ValueType mMinValue; +}; // FloodFillSign + + +template +struct MaskedCopy +{ + typedef typename TreeType::Ptr TreeTypePtr; + typedef typename TreeType::ValueType ValueType; + typedef typename TreeType::LeafNodeType LeafNodeType; + + typedef typename TreeType::template ValueConverter::Type BoolTreeType; + typedef typename BoolTreeType::Ptr BoolTreeTypePtr; + typedef typename BoolTreeType::LeafNodeType BoolLeafNodeType; + + MaskedCopy(const TreeType& tree, std::vector& segments, std::vector& masks) + : mTree(&tree) + , mSegments(!segments.empty() ? &segments.front() : NULL) + , mMasks(!masks.empty() ? &masks.front() : NULL) + { + } + + void operator()(const tbb::blocked_range& range) const { + + std::vector nodes; + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + const BoolTreeType& mask = *mMasks[n]; + + nodes.clear(); + mask.getNodes(nodes); + + Copy op(*mTree, nodes); + tbb::parallel_reduce(tbb::blocked_range(0, nodes.size()), op); + mSegments[n] = op.outputTree(); + } + } + +private: + + struct Copy { + Copy(const TreeType& inputTree, std::vector& maskNodes) + : mInputTree(&inputTree) + , mMaskNodes(!maskNodes.empty() ? &maskNodes.front() : NULL) + , mOutputTreePtr(new TreeType(inputTree.background())) + { + } + + Copy(const Copy& rhs, tbb::split) + : mInputTree(rhs.mInputTree) + , mMaskNodes(rhs.mMaskNodes) + , mOutputTreePtr(new TreeType(mInputTree->background())) + { + } + + TreeTypePtr& outputTree() { return mOutputTreePtr; } + + void join(Copy& rhs) { mOutputTreePtr->merge(*rhs.mOutputTreePtr); } + + void operator()(const tbb::blocked_range& range) { + + tree::ValueAccessor inputAcc(*mInputTree); + tree::ValueAccessor outputAcc(*mOutputTreePtr); + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + const BoolLeafNodeType& maskNode = *mMaskNodes[n]; + if (maskNode.isEmpty()) continue; + + const Coord& ijk = maskNode.origin(); + + const LeafNodeType* inputNode = inputAcc.probeConstLeaf(ijk); + if (inputNode) { + + LeafNodeType* outputNode = outputAcc.touchLeaf(ijk); + + for (typename BoolLeafNodeType::ValueOnCIter it = maskNode.cbeginValueOn(); it; ++it) { + const Index idx = it.pos(); + outputNode->setValueOn(idx, inputNode->getValue(idx)); + } + } else { + const int valueDepth = inputAcc.getValueDepth(ijk); + if (valueDepth >= 0) { + outputAcc.addTile(TreeType::RootNodeType::LEVEL - valueDepth, + ijk, inputAcc.getValue(ijk), true); + } + } + } + } + + private: + TreeType const * const mInputTree; + BoolLeafNodeType const * const * const mMaskNodes; + TreeTypePtr mOutputTreePtr; + }; // struct Copy + + TreeType const * const mTree; + TreeTypePtr * const mSegments; + BoolTreeTypePtr * const mMasks; +}; // MaskedCopy + + +//////////////////////////////////////// + + +template +struct ComputeActiveVoxelCount +{ + ComputeActiveVoxelCount(std::vector& segments, size_t *countArray) + : mSegments(!segments.empty() ? &segments.front() : NULL) + , mCountArray(countArray) + { + } + + void operator()(const tbb::blocked_range& range) const { + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + mCountArray[n] = mSegments[n]->activeVoxelCount(); + } + } + + VolumePtrType * const mSegments; + size_t * const mCountArray; +}; + + +struct GreaterCount +{ + GreaterCount(const size_t *countArray) : mCountArray(countArray) {} + + inline bool operator() (const size_t& lhs, const size_t& rhs) const + { + return (mCountArray[lhs] > mCountArray[rhs]); + } + + size_t const * const mCountArray; +}; + +//////////////////////////////////////// + + +template +struct GridOrTreeConstructor +{ + typedef typename TreeType::Ptr TreeTypePtr; + typedef typename TreeType::template ValueConverter::Type::Ptr BoolTreePtrType; + + static BoolTreePtrType constructMask(const TreeType&, BoolTreePtrType& maskTree) { return maskTree; } + static TreeTypePtr construct(const TreeType&, TreeTypePtr& tree) { return tree; } +}; + + +template +struct GridOrTreeConstructor > +{ + typedef Grid GridType; + typedef typename Grid::Ptr GridTypePtr; + typedef typename TreeType::Ptr TreeTypePtr; + + typedef typename TreeType::template ValueConverter::Type BoolTreeType; + typedef typename BoolTreeType::Ptr BoolTreePtrType; + typedef Grid BoolGridType; + typedef typename BoolGridType::Ptr BoolGridPtrType; + + static BoolGridPtrType constructMask(const GridType& grid, BoolTreePtrType& maskTree) { + BoolGridPtrType maskGrid(BoolGridType::create(maskTree)); + maskGrid->setTransform(grid.transform().copy()); + return maskGrid; + } + + static GridTypePtr construct(const GridType& grid, TreeTypePtr& maskTree) { + GridTypePtr maskGrid(GridType::create(maskTree)); + maskGrid->setTransform(grid.transform().copy()); + maskGrid->insertMeta(grid); + return maskGrid; + } +}; + + +} // namespace level_set_util_internal + + +//////////////////////////////////////// + + +template +inline void +sdfToFogVolume(GridType& grid, typename GridType::ValueType cutoffDistance) +{ + typedef typename GridType::ValueType ValueType; + typedef typename GridType::TreeType TreeType; + typedef typename TreeType::LeafNodeType LeafNodeType; + typedef typename TreeType::RootNodeType RootNodeType; + typedef typename RootNodeType::NodeChainType NodeChainType; + typedef typename boost::mpl::at >::type InternalNodeType; + + ////////// + + TreeType& tree = grid.tree(); + + size_t numLeafNodes = 0, numInternalNodes = 0; + + std::vector nodes; + std::vector leafnodeCount; + + { + // Compute the prefix sum of the leafnode count in each internal node. + std::vector internalNodes; + tree.getNodes(internalNodes); + + numInternalNodes = internalNodes.size(); + + leafnodeCount.push_back(0); + for (size_t n = 0; n < numInternalNodes; ++n) { + leafnodeCount.push_back(leafnodeCount.back() + internalNodes[n]->leafCount()); + } + + numLeafNodes = leafnodeCount.back(); + + // Steal all leafnodes (Removes them from the tree and transfers ownership.) + nodes.reserve(numLeafNodes); + + for (size_t n = 0; n < numInternalNodes; ++n) { + internalNodes[n]->stealNodes(nodes, tree.background(), false); + } + + // Clamp cutoffDistance to min sdf value + ValueType minSDFValue = std::numeric_limits::max(); + + { + level_set_util_internal::FindMinTileValue minOp(&internalNodes[0]); + tbb::parallel_reduce(tbb::blocked_range(0, internalNodes.size()), minOp); + minSDFValue = std::min(minSDFValue, minOp.minValue); + } + + if (minSDFValue > ValueType(0.0)) { + level_set_util_internal::FindMinVoxelValue minOp(&nodes[0]); + tbb::parallel_reduce(tbb::blocked_range(0, nodes.size()), minOp); + minSDFValue = std::min(minSDFValue, minOp.minValue); + } + + cutoffDistance = -std::abs(cutoffDistance); + cutoffDistance = minSDFValue > cutoffDistance ? minSDFValue : cutoffDistance; + } + + // Transform voxel values and delete leafnodes that are uniformly zero after the transformation. + // (Positive values are set to zero with inactive state and negative values are remapped + // from zero to one with active state.) + tbb::parallel_for(tbb::blocked_range(0, nodes.size()), + level_set_util_internal::SDFVoxelsToFogVolume(&nodes[0], cutoffDistance)); + + // Populate a new tree with the remaining leafnodes + typename TreeType::Ptr newTree(new TreeType(ValueType(0.0))); + + level_set_util_internal::PopulateTree populate(*newTree, &nodes[0], &leafnodeCount[0], 0); + tbb::parallel_reduce(tbb::blocked_range(0, numInternalNodes), populate); + + // Transform tile values (Negative valued tiles are set to 1.0 with active state.) + std::vector internalNodes; + newTree->getNodes(internalNodes); + + tbb::parallel_for(tbb::blocked_range(0, internalNodes.size()), + level_set_util_internal::SDFTilesToFogVolume(tree, &internalNodes[0])); + + { + tree::ValueAccessor acc(tree); + + typename TreeType::ValueAllIter it(*newTree); + it.setMaxDepth(TreeType::ValueAllIter::LEAF_DEPTH - 2); + + for ( ; it; ++it) { + if (acc.getValue(it.getCoord()) < ValueType(0.0)) { + it.setValue(ValueType(1.0)); + it.setActiveState(true); + } + } + } + + // Insert missing root level tiles. (The new tree is constructed from the remaining leafnodes + // and will therefore not contain any root level tiles that may exist in the original tree.) + { + typename TreeType::ValueAllIter it(tree); + it.setMaxDepth(TreeType::ValueAllIter::ROOT_DEPTH); + for ( ; it; ++it) { + if (it.getValue() < ValueType(0.0)) { + newTree->addTile(TreeType::ValueAllIter::ROOT_LEVEL, it.getCoord(), ValueType(1.0), true); + } + } + } + + grid.setTree(newTree); + grid.setGridClass(GRID_FOG_VOLUME); +} + + +//////////////////////////////////////// + + +template +inline typename GridOrTreeType::template ValueConverter::Type::Ptr +sdfInteriorMask(const GridOrTreeType& volume, typename GridOrTreeType::ValueType isovalue) +{ + typedef typename TreeAdapter::TreeType TreeType; + const TreeType& tree = TreeAdapter::tree(volume); + + typedef typename TreeType::template ValueConverter::Type::Ptr BoolTreePtrType; + BoolTreePtrType mask = level_set_util_internal::computeInteriorMask(tree, isovalue); + + return level_set_util_internal::GridOrTreeConstructor::constructMask(volume, mask); +} + + +template +inline typename GridOrTreeType::template ValueConverter::Type::Ptr +extractEnclosedRegion(const GridOrTreeType& volume, + typename GridOrTreeType::ValueType isovalue, + const typename TreeAdapter::TreeType::template ValueConverter::Type* fillMask) +{ + typedef typename TreeAdapter::TreeType TreeType; + const TreeType& tree = TreeAdapter::tree(volume); + + typedef typename TreeType::template ValueConverter::Type::Ptr CharTreePtrType; + CharTreePtrType regionMask = level_set_util_internal::computeEnclosedRegionMask(tree, isovalue, fillMask); + + typedef typename TreeType::template ValueConverter::Type::Ptr BoolTreePtrType; + BoolTreePtrType mask = level_set_util_internal::computeInteriorMask(*regionMask, 0); + + return level_set_util_internal::GridOrTreeConstructor::constructMask(volume, mask); +} + + +//////////////////////////////////////// + + +template +inline typename GridOrTreeType::template ValueConverter::Type::Ptr +extractIsosurfaceMask(const GridOrTreeType& volume, typename GridOrTreeType::ValueType isovalue) +{ + typedef typename TreeAdapter::TreeType TreeType; + const TreeType& tree = TreeAdapter::tree(volume); + + std::vector nodes; + tree.getNodes(nodes); + + typedef typename TreeType::template ValueConverter::Type BoolTreeType; + typename BoolTreeType::Ptr mask(new BoolTreeType(false)); + + level_set_util_internal::MaskIsovalueCrossingVoxels op(tree, nodes, *mask, isovalue); + tbb::parallel_reduce(tbb::blocked_range(0, nodes.size()), op); + + return level_set_util_internal::GridOrTreeConstructor::constructMask(volume, mask); +} + + +//////////////////////////////////////// + + +template +inline void +extractActiveVoxelSegmentMasks(const GridOrTreeType& volume, + std::vector::Type::Ptr>& masks) +{ + typedef typename TreeAdapter::TreeType TreeType; + typedef typename TreeType::template ValueConverter::Type BoolTreeType; + typedef typename BoolTreeType::Ptr BoolTreePtrType; + typedef typename BoolTreeType::LeafNodeType BoolLeafNodeType; + + typedef level_set_util_internal::NodeMaskSegment NodeMaskSegmentType; + typedef typename NodeMaskSegmentType::Ptr NodeMaskSegmentPtrType; + typedef typename std::vector NodeMaskSegmentPtrVector; + typedef typename std::vector NodeMaskSegmentRawPtrVector; + + ///// + + const TreeType& tree = TreeAdapter::tree(volume); + + BoolTreeType topologyMask(tree, false, TopologyCopy()); + + if (topologyMask.hasActiveTiles()) { + topologyMask.voxelizeActiveTiles(); + } + + std::vector leafnodes; + topologyMask.getNodes(leafnodes); + + if (leafnodes.empty()) return; + + // 1. Split node masks into disjoint segments + // Note: The LeafNode origin coord is modified to record the 'leafnodes' array offset. + + boost::scoped_array nodeSegmentArray(new NodeMaskSegmentPtrVector[leafnodes.size()]); + + tbb::parallel_for(tbb::blocked_range(0, leafnodes.size()), + level_set_util_internal::SegmentNodeMask(leafnodes, nodeSegmentArray.get())); + + + // 2. Compute segment connectivity + + tbb::parallel_for(tbb::blocked_range(0, leafnodes.size()), + level_set_util_internal::ConnectNodeMaskSegments( + topologyMask, nodeSegmentArray.get())); + + topologyMask.clear(); + + size_t nodeSegmentCount = 0; + for (size_t n = 0, N = leafnodes.size(); n < N; ++n) { + nodeSegmentCount += nodeSegmentArray[n].size(); + } + + // 3. Group connected segments + + std::deque nodeSegmentGroups; + + NodeMaskSegmentType* nextSegment = nodeSegmentArray[0][0].get(); + while (nextSegment) { + + nodeSegmentGroups.push_back(NodeMaskSegmentRawPtrVector()); + + std::vector& segmentGroup = nodeSegmentGroups.back(); + segmentGroup.reserve(nodeSegmentCount); + + std::deque segmentQueue; + segmentQueue.push_back(nextSegment); + nextSegment = NULL; + + while (!segmentQueue.empty()) { + + NodeMaskSegmentType* segment = segmentQueue.back(); + segmentQueue.pop_back(); + + if (segment->visited) continue; + segment->visited = true; + + segmentGroup.push_back(segment); + + // queue connected segments + std::vector& connections = segment->connections; + for (size_t n = 0, N = connections.size(); n < N; ++n) { + if (!connections[n]->visited) segmentQueue.push_back(connections[n]); + } + } + + // find first unvisited segment + for (size_t n = 0, N = leafnodes.size(); n < N; ++n) { + NodeMaskSegmentPtrVector& nodeSegments = nodeSegmentArray[n]; + for (size_t i = 0, I = nodeSegments.size(); i < I; ++i) { + if (!nodeSegments[i]->visited) nextSegment = nodeSegments[i].get(); + } + } + } + + // 4. Mask segment groups + + if (nodeSegmentGroups.size() == 1) { + + BoolTreePtrType mask(new BoolTreeType(tree, false, TopologyCopy())); + + if (mask->hasActiveTiles()) { + mask->voxelizeActiveTiles(); + } + + masks.push_back( + level_set_util_internal::GridOrTreeConstructor::constructMask(volume, mask)); + + } else if (nodeSegmentGroups.size() > 1) { + + for (size_t n = 0, N = nodeSegmentGroups.size(); n < N; ++n) { + + NodeMaskSegmentRawPtrVector& segmentGroup = nodeSegmentGroups[n]; + + level_set_util_internal::MaskSegmentGroup op(segmentGroup); + tbb::parallel_reduce(tbb::blocked_range(0, segmentGroup.size()), op); + + masks.push_back( + level_set_util_internal::GridOrTreeConstructor::constructMask(volume, op.mask())); + } + } + + // 5. Sort segments in descending order based on the active voxel count. + + if (masks.size() > 1) { + const size_t segmentCount = masks.size(); + + boost::scoped_array segmentOrderArray(new size_t[segmentCount]); + boost::scoped_array voxelCountArray(new size_t[segmentCount]); + + for (size_t n = 0; n < segmentCount; ++n) { + segmentOrderArray[n] = n; + } + + tbb::parallel_for(tbb::blocked_range(0, segmentCount), + level_set_util_internal::ComputeActiveVoxelCount(masks, voxelCountArray.get())); + + size_t *begin = segmentOrderArray.get(); + tbb::parallel_sort(begin, begin + masks.size(), level_set_util_internal::GreaterCount(voxelCountArray.get())); + + std::vector orderedMasks; + orderedMasks.reserve(masks.size()); + + for (size_t n = 0; n < segmentCount; ++n) { + orderedMasks.push_back(masks[segmentOrderArray[n]]); + } + + masks.swap(orderedMasks); + } + +} // extractActiveVoxelSegmentMasks() + + +template +inline void +segmentActiveVoxels(const GridOrTreeType& volume, std::vector& segments) +{ + typedef typename TreeAdapter::TreeType TreeType; + typedef typename TreeType::Ptr TreePtrType; + typedef typename TreeType::template ValueConverter::Type BoolTreeType; + typedef typename BoolTreeType::Ptr BoolTreePtrType; + + const TreeType& inputTree = TreeAdapter::tree(volume); + + // 1. Segment active topology mask + std::vector maskSegmentArray; + extractActiveVoxelSegmentMasks(inputTree, maskSegmentArray); + + const size_t numSegments = maskSegmentArray.size(); + + if (numSegments < 2) { + // single segment early-out + TreePtrType segment(new TreeType(inputTree)); + segments.push_back( + level_set_util_internal::GridOrTreeConstructor::construct(volume, segment)); + return; + } + + const tbb::blocked_range segmentRange(0, numSegments); + + // 2. Export segments + std::vector outputSegmentArray(numSegments); + + tbb::parallel_for(segmentRange, + level_set_util_internal::MaskedCopy(inputTree, outputSegmentArray, maskSegmentArray)); + + for (size_t n = 0, N = numSegments; n < N; ++n) { + segments.push_back( + level_set_util_internal::GridOrTreeConstructor::construct(volume, outputSegmentArray[n])); + } +} + + +template +inline void +segmentSDF(const GridOrTreeType& volume, std::vector& segments) +{ + typedef typename TreeAdapter::TreeType TreeType; + typedef typename TreeType::Ptr TreePtrType; + typedef typename TreeType::template ValueConverter::Type BoolTreeType; + typedef typename BoolTreeType::Ptr BoolTreePtrType; + + const TreeType& inputTree = TreeAdapter::tree(volume); + + // 1. Mask zero crossing voxels + BoolTreePtrType mask = extractIsosurfaceMask(inputTree, lsutilGridZero()); + + // 2. Segment the zero crossing mask + std::vector maskSegmentArray; + extractActiveVoxelSegmentMasks(*mask, maskSegmentArray); + + const size_t numSegments = maskSegmentArray.size(); + + if (numSegments < 2) { + // single segment early-out + TreePtrType segment(new TreeType(inputTree)); + segments.push_back( + level_set_util_internal::GridOrTreeConstructor::construct(volume, segment)); + return; + } + + const tbb::blocked_range segmentRange(0, numSegments); + + + // 3. Expand zero crossing mask to capture sdf narrow band + tbb::parallel_for(segmentRange, + level_set_util_internal::ExpandNarrowbandMask(inputTree, maskSegmentArray)); + + // 4. Export sdf segments + std::vector outputSegmentArray(numSegments); + + tbb::parallel_for(segmentRange, + level_set_util_internal::MaskedCopy(inputTree, outputSegmentArray, maskSegmentArray)); + + tbb::parallel_for(segmentRange, + level_set_util_internal::FloodFillSign(inputTree, outputSegmentArray)); + + + for (size_t n = 0, N = numSegments; n < N; ++n) { + segments.push_back( + level_set_util_internal::GridOrTreeConstructor::construct(volume, outputSegmentArray[n])); + } +} + + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_LEVEL_SET_UTIL_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) + diff --git a/nuparu/include/openvdb/include/openvdb/tools/MaskToLevelSet.h b/nuparu/include/openvdb/include/openvdb/tools/MaskToLevelSet.h new file mode 100644 index 00000000..391883fe --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/MaskToLevelSet.h @@ -0,0 +1,199 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file MaskToLevelSet.h +/// +/// @brief This tool generated a narrow band level set from the +/// interface between the active and inactive voxels of an +/// input grid. +/// +/// @par Example: +/// Combine with @c tools::createPointMaskGrid for fast point cloud to level set conversion. +/// +/// @author FX R&D OpenVDB team + +#ifndef OPENVDB_TOOLS_MASK_TO_LEVELSET_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_MASK_TO_LEVELSET_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include // for isNegative +#include +#include "LevelSetFilter.h" +#include "Morphology.h" // for erodeVoxels and dilateActiveValues +#include "SignedFloodFill.h" // for signedFloodFill + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief Compute the narrow band level set to the interface +/// between active and inactive voxels in the input grid. +/// +/// @return a shared pointer to a new narrow band level set (SDF) of type @c float +/// +/// @param grid an incoming grid of arbitrary data type whose active voxels +/// are used in constructing the narrow band level set +/// @param halfWidth half of the narrow band level set width in voxel units +/// @param dilation amount of dilation in voxel units +/// @param erosion amount of erosion in voxel units +/// @param interrupt optional interrupter (see NullInterrupter.h) +/// +template +inline typename Grid::Type>::Ptr +maskToLevelSet(const GridT& grid, + int halfWidth = 3, + int dilation = 1, + int erosion = 1, + InterrupterT* interrupt = NULL); + +/// @brief Compute the narrow band level set to the interface +/// between active and inactive voxels in the input grid. +/// +/// @return a shared pointer to a new narrow band level set (SDF) of type @c float +/// +/// @param grid an incoming grid of arbitrary data type whose active voxels +/// are used in constructing the narrow band level set +/// @param halfWidth half of the narrow band level set width in voxel units +/// @param dilation amount of dilation in voxel units +/// @param erosion amount of erosion in voxel units +/// +/// @note This template specialized version uses first order upwinding and no interrupter. +/// C++03 compilers do not allow functions to have default template arguments - +/// hence this workaround. +/// +template +inline typename Grid::Type>::Ptr +maskToLevelSet(const GridT& grid, + int halfWidth = 3, + int dilation = 1, + int erosion = 1) +{ + typedef util::NullInterrupter T; + return maskToLevelSet(grid, halfWidth, dilation, erosion); +} + +namespace { + +template +struct DilateOp +{ + DilateOp(TreeT& t, int n) : tree(&t), size(n) {} + void operator()() const { + dilateActiveValues( *tree, size, tools::NN_FACE, tools::IGNORE_TILES); + } + TreeT* tree; + const int size; +}; + + +template +struct ErodeOp +{ + ErodeOp(TreeT& t, int n) : tree(&t), size(n) {} + void operator()() const { erodeVoxels( *tree, size); } + TreeT* tree; + const int size; +}; + +}// unnamed namespace + + +template +inline typename Grid::Type>::Ptr +maskToLevelSet(const GridT& grid, int halfWidth, int dilation, int erosion, InterrupterT* interrupt) +{ + typedef typename GridT::TreeType::template ValueConverter::Type MaskTreeT; + typedef typename GridT::TreeType::template ValueConverter::Type FloatTreeT; + typedef Grid FloatGridT; + + // Check input. + if ( halfWidth <= 0 ) { + OPENVDB_THROW(ValueError, "Narrow band width must be non-zero!"); + } + if ( !grid.hasUniformVoxels() ) { + OPENVDB_THROW(ValueError, "Non-uniform voxels are not supported!"); + } + + // background value = outside value + const float outside = static_cast(grid.voxelSize()[0]) * halfWidth; + + // Copy the topology into a MaskGrid. + MaskTreeT maskTree( grid.tree(), false/*background*/, openvdb::TopologyCopy() ); + + // Morphological closing operation. + dilateActiveValues( maskTree, dilation, tools::NN_FACE, tools::IGNORE_TILES); + erodeVoxels( maskTree, erosion); + + // Generate a volume with an implicit zero crossing at the boundary + // between active and inactive values in the input grid. + typename FloatTreeT::Ptr lsTree( new FloatTreeT(maskTree, + outside,// = inactive + -outside,//= active + openvdb::TopologyCopy()) ); + + tbb::task_group pool; + pool.run( ErodeOp< MaskTreeT >( maskTree, halfWidth ) ); + pool.run( DilateOp( *lsTree , halfWidth ) ); + pool.wait();// wait for both tasks to complete + + lsTree->topologyDifference( maskTree ); + tools::pruneLevelSet( *lsTree, /*threading=*/true); + + // Create a level set grid from the tree + typename FloatGridT::Ptr lsGrid = FloatGridT::create( lsTree ); + lsGrid->setTransform( grid.transform().copy() ); + lsGrid->setGridClass( openvdb::GRID_LEVEL_SET ); + + // Normalize and prune level set + LevelSetTracker tracker( *lsGrid, interrupt ); + tracker.setSpatialScheme( Scheme ); + tracker.setNormCount( 3 * halfWidth ); + tracker.normalize(); + tracker.prune(); + + return lsGrid; +} + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif //OPENVDB_TOOLS_MASK_TO_LEVELSET_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/MeshToVolume.h b/nuparu/include/openvdb/include/openvdb/tools/MeshToVolume.h new file mode 100644 index 00000000..8872fad2 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/MeshToVolume.h @@ -0,0 +1,4032 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file MeshToVolume.h +/// +/// @brief Convert polygonal meshes that consist of quads and/or triangles +/// into signed or unsigned distance field volumes. +/// +/// @note The signed distance field conversion requires a closed surface +/// but not necessarily a manifold surface. Supports surfaces with +/// self intersections and degenerate faces and is independent of +/// mesh surface normals / polygon orientation. +/// +/// @author Mihai Alden + + +#ifndef OPENVDB_TOOLS_MESH_TO_VOLUME_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_MESH_TO_VOLUME_HAS_BEEN_INCLUDED + +#include +#include // for GodunovsNormSqrd +#include // for closestPointOnTriangleToPoint +#include +#include + +#include "ChangeBackground.h" +#include "Prune.h" // for pruneInactive and pruneLevelSet +#include "SignedFloodFill.h" // for signedFloodFillWithValues + +#include +#include +#include +#include +#include +#include +#include + +#include // const_max +#include // for isfinite +#include + +#include // for std::sort +#include +#include +#include +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + + +//////////////////////////////////////// + + +/// @brief Mesh to volume conversion flags +enum MeshToVolumeFlags { + + /// Switch from the default signed distance field conversion that classifies + /// regions as either inside or outside the mesh boundary to a unsigned distance + /// field conversion that only computes distance values. This conversion type + /// does not require a closed watertight mesh. + UNSIGNED_DISTANCE_FIELD = 0x1, + + /// Disable the cleanup step that removes voxels created by self intersecting + /// portions of the mesh. + DISABLE_INTERSECTING_VOXEL_REMOVAL = 0x2, + + /// Disable the distance renormalization step that smooths out bumps caused + /// by self intersecting or overlapping portions of the mesh + DISABLE_RENORMALIZATION = 0x4, + + /// Disable the cleanup step that removes active voxels that exceed the + /// narrow band limits. (Only relevant for small limits) + DISABLE_NARROW_BAND_TRIMMING = 0x8 +}; + + +/// @brief Convert polygonal meshes that consist of quads and/or triangles into +/// signed or unsigned distance field volumes. +/// +/// @note Requires a closed surface but not necessarily a manifold surface. +/// Supports surfaces with self intersections and degenerate faces +/// and is independent of mesh surface normals. +/// +/// @interface MeshDataAdapter +/// Expected interface for the MeshDataAdapter class +/// @code +/// struct MeshDataAdapter { +/// size_t polygonCount() const; // Total number of polygons +/// size_t pointCount() const; // Total number of points +/// size_t vertexCount(size_t n) const; // Vertex count for polygon n +/// +/// // Return position pos in local grid index space for polygon n and vertex v +/// void getIndexSpacePoint(size_t n, size_t v, openvdb::Vec3d& pos) const; +/// }; +/// @endcode +/// +/// @param mesh mesh data access class that conforms to the MeshDataAdapter +/// interface +/// @param transform world-to-index-space transform +/// @param exteriorBandWidth exterior narrow band width in voxel units +/// @param interiorBandWidth interior narrow band width in voxel units +/// (set to std::numeric_limits::max() to fill object +/// interior with distance values) +/// @param flags optional conversion flags defined in @c MeshToVolumeFlags +/// @param polygonIndexGrid optional grid output that will contain the closest-polygon +/// index for each voxel in the narrow band region +template +inline typename GridType::Ptr +meshToVolume( + const MeshDataAdapter& mesh, + const math::Transform& transform, + float exteriorBandWidth = 3.0f, + float interiorBandWidth = 3.0f, + int flags = 0, + typename GridType::template ValueConverter::Type * polygonIndexGrid = NULL); + + +/// @brief Convert polygonal meshes that consist of quads and/or triangles into +/// signed or unsigned distance field volumes. +/// +/// @param interrupter a callback to interrupt the conversion process that conforms +/// to the util::NullInterrupter interface +/// @param mesh mesh data access class that conforms to the MeshDataAdapter +/// interface +/// @param transform world-to-index-space transform +/// @param exteriorBandWidth exterior narrow band width in voxel units +/// @param interiorBandWidth interior narrow band width in voxel units (set this value to +/// std::numeric_limits::max() to fill interior regions +/// with distance values) +/// @param flags optional conversion flags defined in @c MeshToVolumeFlags +/// @param polygonIndexGrid optional grid output that will contain the closest-polygon +/// index for each voxel in the active narrow band region +template +inline typename GridType::Ptr +meshToVolume( + Interrupter& interrupter, + const MeshDataAdapter& mesh, + const math::Transform& transform, + float exteriorBandWidth = 3.0f, + float interiorBandWidth = 3.0f, + int flags = 0, + typename GridType::template ValueConverter::Type * polygonIndexGrid = NULL); + + +//////////////////////////////////////// + + +/// @brief Contiguous quad and triangle data adapter class +/// +/// @details PointType and PolygonType must provide element access +/// through the square brackets operator. +/// @details Points are assumed to be in local grid index space. +/// @details The PolygonType tuple can have either three or four components +/// this property must be specified in a static member variable +/// named @c size, similar to the math::Tuple class. +/// @details A four component tuple can represent a quads or a triangle +/// if the fourth component set to @c util::INVALID_INDEX +template +struct QuadAndTriangleDataAdapter { + + QuadAndTriangleDataAdapter(const std::vector& points, + const std::vector& polygons) + : mPointArray(points.empty() ? NULL : &points[0]) + , mPointArraySize(points.size()) + , mPolygonArray(polygons.empty() ? NULL : &polygons[0]) + , mPolygonArraySize(polygons.size()) + { + } + + QuadAndTriangleDataAdapter(const PointType * pointArray, size_t pointArraySize, + const PolygonType* polygonArray, size_t polygonArraySize) + : mPointArray(pointArray) + , mPointArraySize(pointArraySize) + , mPolygonArray(polygonArray) + , mPolygonArraySize(polygonArraySize) + { + } + + size_t polygonCount() const { return mPolygonArraySize; } + size_t pointCount() const { return mPointArraySize; } + + /// @brief Vertex count for polygon @a n + size_t vertexCount(size_t n) const { + return (PolygonType::size == 3 || mPolygonArray[n][3] == util::INVALID_IDX) ? 3 : 4; + } + + /// @brief Returns position @a pos in local grid index space + /// for polygon @a n and vertex @a v + void getIndexSpacePoint(size_t n, size_t v, Vec3d& pos) const { + const PointType& p = mPointArray[mPolygonArray[n][int(v)]]; + pos[0] = double(p[0]); + pos[1] = double(p[1]); + pos[2] = double(p[2]); + } + +private: + PointType const * const mPointArray; + size_t const mPointArraySize; + PolygonType const * const mPolygonArray; + size_t const mPolygonArraySize; +}; // struct QuadAndTriangleDataAdapter + + +//////////////////////////////////////// + + +// Wrapper functions for the mesh to volume converter + + +/// @brief Convert a triangle mesh to a level set volume. +/// +/// @return a grid of type @c GridType containing a narrow-band level set +/// representation of the input mesh. +/// +/// @throw TypeError if @c GridType is not scalar or not floating-point +/// +/// @note Requires a closed surface but not necessarily a manifold surface. +/// Supports surfaces with self intersections and degenerate faces +/// and is independent of mesh surface normals. +/// +/// @param xform transform for the output grid +/// @param points list of world space point positions +/// @param triangles triangle index list +/// @param halfWidth half the width of the narrow band, in voxel units +template +inline typename GridType::Ptr +meshToLevelSet( + const openvdb::math::Transform& xform, + const std::vector& points, + const std::vector& triangles, + float halfWidth = float(LEVEL_SET_HALF_WIDTH)); + + +/// @brief Convert a quad mesh to a level set volume. +/// +/// @return a grid of type @c GridType containing a narrow-band level set +/// representation of the input mesh. +/// +/// @throw TypeError if @c GridType is not scalar or not floating-point +/// +/// @note Requires a closed surface but not necessarily a manifold surface. +/// Supports surfaces with self intersections and degenerate faces +/// and is independent of mesh surface normals. +/// +/// @param xform transform for the output grid +/// @param points list of world space point positions +/// @param quads quad index list +/// @param halfWidth half the width of the narrow band, in voxel units +template +inline typename GridType::Ptr +meshToLevelSet( + const openvdb::math::Transform& xform, + const std::vector& points, + const std::vector& quads, + float halfWidth = float(LEVEL_SET_HALF_WIDTH)); + + +/// @brief Convert a triangle and quad mesh to a level set volume. +/// +/// @return a grid of type @c GridType containing a narrow-band level set +/// representation of the input mesh. +/// +/// @throw TypeError if @c GridType is not scalar or not floating-point +/// +/// @note Requires a closed surface but not necessarily a manifold surface. +/// Supports surfaces with self intersections and degenerate faces +/// and is independent of mesh surface normals. +/// +/// @param xform transform for the output grid +/// @param points list of world space point positions +/// @param triangles triangle index list +/// @param quads quad index list +/// @param halfWidth half the width of the narrow band, in voxel units +template +inline typename GridType::Ptr +meshToLevelSet( + const openvdb::math::Transform& xform, + const std::vector& points, + const std::vector& triangles, + const std::vector& quads, + float halfWidth = float(LEVEL_SET_HALF_WIDTH)); + + +/// @brief Convert a triangle and quad mesh to a signed distance field +/// with an asymmetrical narrow band. +/// +/// @return a grid of type @c GridType containing a narrow-band signed +/// distance field representation of the input mesh. +/// +/// @throw TypeError if @c GridType is not scalar or not floating-point +/// +/// @note Requires a closed surface but not necessarily a manifold surface. +/// Supports surfaces with self intersections and degenerate faces +/// and is independent of mesh surface normals. +/// +/// @param xform transform for the output grid +/// @param points list of world space point positions +/// @param triangles triangle index list +/// @param quads quad index list +/// @param exBandWidth the exterior narrow-band width in voxel units +/// @param inBandWidth the interior narrow-band width in voxel units +template +inline typename GridType::Ptr +meshToSignedDistanceField( + const openvdb::math::Transform& xform, + const std::vector& points, + const std::vector& triangles, + const std::vector& quads, + float exBandWidth, + float inBandWidth); + + +/// @brief Convert a triangle and quad mesh to an unsigned distance field. +/// +/// @return a grid of type @c GridType containing a narrow-band unsigned +/// distance field representation of the input mesh. +/// +/// @throw TypeError if @c GridType is not scalar or not floating-point +/// +/// @note Does not requires a closed surface. +/// +/// @param xform transform for the output grid +/// @param points list of world space point positions +/// @param triangles triangle index list +/// @param quads quad index list +/// @param bandWidth the width of the narrow band, in voxel units +template +inline typename GridType::Ptr +meshToUnsignedDistanceField( + const openvdb::math::Transform& xform, + const std::vector& points, + const std::vector& triangles, + const std::vector& quads, + float bandWidth); + + +//////////////////////////////////////// + + +/// @brief Return a grid of type @c GridType containing a narrow-band level set +/// representation of a box. +/// +/// @param bbox a bounding box in world units +/// @param xform world-to-index-space transform +/// @param halfWidth half the width of the narrow band, in voxel units +template +inline typename GridType::Ptr +createLevelSetBox(const math::BBox& bbox, + const openvdb::math::Transform& xform, + typename VecType::ValueType halfWidth = LEVEL_SET_HALF_WIDTH); + + +//////////////////////////////////////// + + +/// @brief Traces the exterior voxel boundary of closed objects in the input +/// volume @a tree. Exterior voxels are marked with a negative sign, +/// voxels with a value below @c 0.75 are left unchanged and act as +/// the boundary layer. +/// +/// @note Does not propagate sign information into tile regions. +template +inline void +traceExteriorBoundaries(FloatTreeT& tree); + + +//////////////////////////////////////// + + +/// @brief Extracts and stores voxel edge intersection data from a mesh. +class MeshToVoxelEdgeData +{ +public: + + ////////// + + ///@brief Internal edge data type. + struct EdgeData { + EdgeData(float dist = 1.0) + : mXDist(dist), mYDist(dist), mZDist(dist) + , mXPrim(util::INVALID_IDX) + , mYPrim(util::INVALID_IDX) + , mZPrim(util::INVALID_IDX) + { + } + + //@{ + /// Required by several of the tree nodes + /// @note These methods don't perform meaningful operations. + bool operator< (const EdgeData&) const { return false; } + bool operator> (const EdgeData&) const { return false; } + template EdgeData operator+(const T&) const { return *this; } + template EdgeData operator-(const T&) const { return *this; } + EdgeData operator-() const { return *this; } + //@} + + bool operator==(const EdgeData& rhs) const + { + return mXPrim == rhs.mXPrim && mYPrim == rhs.mYPrim && mZPrim == rhs.mZPrim; + } + + float mXDist, mYDist, mZDist; + Index32 mXPrim, mYPrim, mZPrim; + }; + + typedef tree::Tree4::Type TreeType; + typedef tree::ValueAccessor Accessor; + + + ////////// + + + MeshToVoxelEdgeData(); + + + /// @brief Threaded method to extract voxel edge data, the closest + /// intersection point and corresponding primitive index, + /// from the given mesh. + /// + /// @param pointList List of points in grid index space, preferably unique + /// and shared by different polygons. + /// @param polygonList List of triangles and/or quads. + void convert(const std::vector& pointList, const std::vector& polygonList); + + + /// @brief Returns intersection points with corresponding primitive + /// indices for the given @c ijk voxel. + void getEdgeData(Accessor& acc, const Coord& ijk, + std::vector& points, std::vector& primitives); + + /// @return An accessor of @c MeshToVoxelEdgeData::Accessor type that + /// provides random read access to the internal tree. + Accessor getAccessor() { return Accessor(mTree); } + +private: + void operator=(const MeshToVoxelEdgeData&) {} + TreeType mTree; + class GenEdgeData; +}; + + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// + + +// Internal utility objects and implementation details + +namespace mesh_to_volume_internal { + +template +struct TransformPoints { + + TransformPoints(const PointType* pointsIn, PointType* pointsOut, + const math::Transform& xform) + : mPointsIn(pointsIn), mPointsOut(pointsOut), mXform(&xform) + { + } + + void operator()(const tbb::blocked_range& range) const { + + Vec3d pos; + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + const PointType& wsP = mPointsIn[n]; + pos[0] = double(wsP[0]); + pos[1] = double(wsP[1]); + pos[2] = double(wsP[2]); + + pos = mXform->worldToIndex(pos); + + PointType& isP = mPointsOut[n]; + isP[0] = typename PointType::value_type(pos[0]); + isP[1] = typename PointType::value_type(pos[1]); + isP[2] = typename PointType::value_type(pos[2]); + } + } + + PointType const * const mPointsIn; + PointType * const mPointsOut; + math::Transform const * const mXform; +}; // TransformPoints + + +template +struct Tolerance +{ + static ValueType epsilon() { return ValueType(1e-7); } + static ValueType minNarrowBandWidth() { return ValueType(1.0 + 1e-6); } +}; + + +//////////////////////////////////////// + + +template +class CombineLeafNodes +{ +public: + + typedef typename TreeType::template ValueConverter::Type Int32TreeType; + + typedef typename TreeType::LeafNodeType LeafNodeType; + typedef typename Int32TreeType::LeafNodeType Int32LeafNodeType; + + CombineLeafNodes(TreeType& lhsDistTree, Int32TreeType& lhsIdxTree, + LeafNodeType ** rhsDistNodes, Int32LeafNodeType ** rhsIdxNodes) + : mDistTree(&lhsDistTree) + , mIdxTree(&lhsIdxTree) + , mRhsDistNodes(rhsDistNodes) + , mRhsIdxNodes(rhsIdxNodes) + { + } + + void operator()(const tbb::blocked_range& range) const { + + tree::ValueAccessor distAcc(*mDistTree); + tree::ValueAccessor idxAcc(*mIdxTree); + + typedef typename LeafNodeType::ValueType DistValueType; + typedef typename Int32LeafNodeType::ValueType IndexValueType; + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + const Coord& origin = mRhsDistNodes[n]->origin(); + + LeafNodeType* lhsDistNode = distAcc.probeLeaf(origin); + Int32LeafNodeType* lhsIdxNode = idxAcc.probeLeaf(origin); + + DistValueType* lhsDistData = lhsDistNode->buffer().data(); + IndexValueType* lhsIdxData = lhsIdxNode->buffer().data(); + + const DistValueType* rhsDistData = mRhsDistNodes[n]->buffer().data(); + const IndexValueType* rhsIdxData = mRhsIdxNodes[n]->buffer().data(); + + + for (Index32 offset = 0; offset < LeafNodeType::SIZE; ++offset) { + + if (rhsIdxData[offset] != Int32(util::INVALID_IDX)) { + + const DistValueType& lhsValue = lhsDistData[offset]; + const DistValueType& rhsValue = rhsDistData[offset]; + + if (rhsValue < lhsValue) { + lhsDistNode->setValueOn(offset, rhsValue); + lhsIdxNode->setValueOn(offset, rhsIdxData[offset]); + } else if (math::isExactlyEqual(rhsValue, lhsValue)) { + lhsIdxNode->setValueOn(offset, + std::min(lhsIdxData[offset], rhsIdxData[offset])); + } + } + } + + delete mRhsDistNodes[n]; + delete mRhsIdxNodes[n]; + } + } + +private: + + TreeType * const mDistTree; + Int32TreeType * const mIdxTree; + + LeafNodeType ** const mRhsDistNodes; + Int32LeafNodeType ** const mRhsIdxNodes; +}; // class CombineLeafNodes + + +//////////////////////////////////////// + + +template +struct StashOriginAndStoreOffset +{ + typedef typename TreeType::LeafNodeType LeafNodeType; + + StashOriginAndStoreOffset(std::vector& nodes, Coord* coordinates) + : mNodes(nodes.empty() ? NULL : &nodes[0]), mCoordinates(coordinates) + { + } + + void operator()(const tbb::blocked_range& range) const { + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + Coord& origin = const_cast(mNodes[n]->origin()); + mCoordinates[n] = origin; + origin[0] = static_cast(n); + } + } + + LeafNodeType ** const mNodes; + Coord * const mCoordinates; +}; + + +template +struct RestoreOrigin +{ + typedef typename TreeType::LeafNodeType LeafNodeType; + + RestoreOrigin(std::vector& nodes, const Coord* coordinates) + : mNodes(nodes.empty() ? NULL : &nodes[0]), mCoordinates(coordinates) + { + } + + void operator()(const tbb::blocked_range& range) const { + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + Coord& origin = const_cast(mNodes[n]->origin()); + origin[0] = mCoordinates[n][0]; + } + } + + LeafNodeType ** const mNodes; + Coord const * const mCoordinates; +}; + + +template +class ComputeNodeConnectivity +{ +public: + typedef typename TreeType::LeafNodeType LeafNodeType; + + ComputeNodeConnectivity(const TreeType& tree, const Coord* coordinates, + size_t* offsets, size_t numNodes, const CoordBBox& bbox) + : mTree(&tree) + , mCoordinates(coordinates) + , mOffsets(offsets) + , mNumNodes(numNodes) + , mBBox(bbox) + { + } + + void operator()(const tbb::blocked_range& range) const { + + size_t* offsetsNextX = mOffsets; + size_t* offsetsPrevX = mOffsets + mNumNodes; + size_t* offsetsNextY = mOffsets + mNumNodes * 2; + size_t* offsetsPrevY = mOffsets + mNumNodes * 3; + size_t* offsetsNextZ = mOffsets + mNumNodes * 4; + size_t* offsetsPrevZ = mOffsets + mNumNodes * 5; + + tree::ValueAccessor acc(*mTree); + Coord ijk; + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + const Coord& origin = mCoordinates[n]; + offsetsNextX[n] = findNeighbourNode(acc, origin, Coord(LeafNodeType::DIM, 0, 0)); + offsetsPrevX[n] = findNeighbourNode(acc, origin, Coord(-LeafNodeType::DIM, 0, 0)); + offsetsNextY[n] = findNeighbourNode(acc, origin, Coord(0, LeafNodeType::DIM, 0)); + offsetsPrevY[n] = findNeighbourNode(acc, origin, Coord(0, -LeafNodeType::DIM, 0)); + offsetsNextZ[n] = findNeighbourNode(acc, origin, Coord(0, 0, LeafNodeType::DIM)); + offsetsPrevZ[n] = findNeighbourNode(acc, origin, Coord(0, 0, -LeafNodeType::DIM)); + } + } + + size_t findNeighbourNode(tree::ValueAccessor& acc, const Coord& start, const Coord& step) const { + + Coord ijk = start + step; + CoordBBox bbox(mBBox); + + while (bbox.isInside(ijk)) { + const LeafNodeType* node = acc.probeConstLeaf(ijk); + if (node) return static_cast(node->origin()[0]); + ijk += step; + } + + return boost::integer_traits::const_max; + } + + +private: + // Disallow assignment + ComputeNodeConnectivity& operator=(const ComputeNodeConnectivity&); + + TreeType const * const mTree; + Coord const * const mCoordinates; + size_t * const mOffsets; + + const size_t mNumNodes; + const CoordBBox mBBox; +}; // class ComputeNodeConnectivity + + +template +struct LeafNodeConnectivityTable { + + enum { INVALID_OFFSET = boost::integer_traits::const_max }; + + typedef typename TreeType::LeafNodeType LeafNodeType; + + LeafNodeConnectivityTable(TreeType& tree) + : mLeafNodes() + , mOffsets(NULL) + { + mLeafNodes.reserve(tree.leafCount()); + tree.getNodes(mLeafNodes); + + if (mLeafNodes.empty()) return; + + CoordBBox bbox; + tree.evalLeafBoundingBox(bbox); + + const tbb::blocked_range range(0, mLeafNodes.size()); + + // stash the leafnode origin coordinate and temporarily store the + // linear offset in the origin.x variable. + boost::scoped_array coordinates(new Coord[mLeafNodes.size()]); + tbb::parallel_for(range, StashOriginAndStoreOffset(mLeafNodes, coordinates.get())); + + // build the leafnode offset table + mOffsets.reset(new size_t[mLeafNodes.size() * 6]); + + + tbb::parallel_for(range, + ComputeNodeConnectivity(tree, coordinates.get(), mOffsets.get(), mLeafNodes.size(), bbox)); + + // restore the leafnode origin coordinate + tbb::parallel_for(range, RestoreOrigin(mLeafNodes, coordinates.get())); + } + + size_t size() const { return mLeafNodes.size(); } + + std::vector& nodes() { return mLeafNodes; } + const std::vector& nodes() const { return mLeafNodes; } + + + const size_t* offsetsNextX() const { return mOffsets.get(); } + const size_t* offsetsPrevX() const { return mOffsets.get() + mLeafNodes.size(); } + + const size_t* offsetsNextY() const { return mOffsets.get() + mLeafNodes.size() * 2; } + const size_t* offsetsPrevY() const { return mOffsets.get() + mLeafNodes.size() * 3; } + + const size_t* offsetsNextZ() const { return mOffsets.get() + mLeafNodes.size() * 4; } + const size_t* offsetsPrevZ() const { return mOffsets.get() + mLeafNodes.size() * 5; } + +private: + std::vector mLeafNodes; + boost::scoped_array mOffsets; +}; // struct LeafNodeConnectivityTable + + +template +class SweepExteriorSign +{ +public: + + enum Axis { X_AXIS = 0, Y_AXIS = 1, Z_AXIS = 2 }; + + typedef typename TreeType::ValueType ValueType; + typedef typename TreeType::LeafNodeType LeafNodeType; + typedef LeafNodeConnectivityTable ConnectivityTable; + + SweepExteriorSign(Axis axis, const std::vector& startNodeIndices, ConnectivityTable& connectivity) + : mStartNodeIndices(startNodeIndices.empty() ? NULL : &startNodeIndices[0]) + , mConnectivity(&connectivity) + , mAxis(axis) + { + } + + void operator()(const tbb::blocked_range& range) const { + + std::vector& nodes = mConnectivity->nodes(); + + // Z Axis + size_t idxA = 0, idxB = 1; + Index step = 1; + + const size_t* nextOffsets = mConnectivity->offsetsNextZ(); + const size_t* prevOffsets = mConnectivity->offsetsPrevZ(); + + if (mAxis == Y_AXIS) { + + idxA = 0; + idxB = 2; + step = LeafNodeType::DIM; + + nextOffsets = mConnectivity->offsetsNextY(); + prevOffsets = mConnectivity->offsetsPrevY(); + + } else if (mAxis == X_AXIS) { + + idxA = 1; + idxB = 2; + step = LeafNodeType::DIM * LeafNodeType::DIM; + + nextOffsets = mConnectivity->offsetsNextX(); + prevOffsets = mConnectivity->offsetsPrevX(); + } + + Coord ijk(0, 0, 0); + + int& a = ijk[idxA]; + int& b = ijk[idxB]; + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + size_t startOffset = mStartNodeIndices[n]; + size_t lastOffset = startOffset; + + Index pos(0); + + for (a = 0; a < int(LeafNodeType::DIM); ++a) { + for (b = 0; b < int(LeafNodeType::DIM); ++b) { + + pos = LeafNodeType::coordToOffset(ijk); + size_t offset = startOffset; + + // sweep in +axis direction until a boundary voxel is hit. + while ( offset != ConnectivityTable::INVALID_OFFSET && + traceVoxelLine(*nodes[offset], pos, step) ) { + + lastOffset = offset; + offset = nextOffsets[offset]; + } + + // find last leafnode in +axis direction + offset = lastOffset; + while (offset != ConnectivityTable::INVALID_OFFSET) { + lastOffset = offset; + offset = nextOffsets[offset]; + } + + // sweep in -axis direction until a boundary voxel is hit. + offset = lastOffset; + pos += step * (LeafNodeType::DIM - 1); + while ( offset != ConnectivityTable::INVALID_OFFSET && + traceVoxelLine(*nodes[offset], pos, -step)) { + offset = prevOffsets[offset]; + } + } + } + } + } + + + bool traceVoxelLine(LeafNodeType& node, Index pos, Index step) const { + + ValueType* data = node.buffer().data(); + + bool isOutside = true; + + for (Index i = 0; i < LeafNodeType::DIM; ++i) { + + ValueType& dist = data[pos]; + + if (dist < ValueType(0.0)) { + isOutside = true; + } else { + // Boundary voxel check. (Voxel that intersects the surface) + if (!(dist > ValueType(0.75))) isOutside = false; + + if (isOutside) dist = ValueType(-dist); + } + + pos += step; + } + + return isOutside; + } + + +private: + size_t const * const mStartNodeIndices; + ConnectivityTable * const mConnectivity; + + const Axis mAxis; +}; // class SweepExteriorSign + + +template +inline void +seedFill(LeafNodeType& node) +{ + typedef typename LeafNodeType::ValueType ValueType; + typedef std::deque Queue; + + + ValueType* data = node.buffer().data(); + + // find seed points + Queue seedPoints; + for (Index pos = 0; pos < LeafNodeType::SIZE; ++pos) { + if (data[pos] < 0.0) seedPoints.push_back(pos); + } + + if (seedPoints.empty()) return; + + // clear sign information + for (Queue::iterator it = seedPoints.begin(); it != seedPoints.end(); ++it) { + ValueType& dist = data[*it]; + dist = -dist; + } + + // flood fill + + Coord ijk(0, 0, 0); + Index pos(0), nextPos(0); + + while (!seedPoints.empty()) { + + pos = seedPoints.back(); + seedPoints.pop_back(); + + ValueType& dist = data[pos]; + + if (!(dist < ValueType(0.0))) { + + dist = -dist; // flip sign + + ijk = LeafNodeType::offsetToLocalCoord(pos); + + if (ijk[0] != 0) { // i - 1, j, k + nextPos = pos - LeafNodeType::DIM * LeafNodeType::DIM; + if (data[nextPos] > ValueType(0.75)) seedPoints.push_back(nextPos); + } + + if (ijk[0] != (LeafNodeType::DIM - 1)) { // i + 1, j, k + nextPos = pos + LeafNodeType::DIM * LeafNodeType::DIM; + if (data[nextPos] > ValueType(0.75)) seedPoints.push_back(nextPos); + } + + if (ijk[1] != 0) { // i, j - 1, k + nextPos = pos - LeafNodeType::DIM; + if (data[nextPos] > ValueType(0.75)) seedPoints.push_back(nextPos); + } + + if (ijk[1] != (LeafNodeType::DIM - 1)) { // i, j + 1, k + nextPos = pos + LeafNodeType::DIM; + if (data[nextPos] > ValueType(0.75)) seedPoints.push_back(nextPos); + } + + if (ijk[2] != 0) { // i, j, k - 1 + nextPos = pos - 1; + if (data[nextPos] > ValueType(0.75)) seedPoints.push_back(nextPos); + } + + if (ijk[2] != (LeafNodeType::DIM - 1)) { // i, j, k + 1 + nextPos = pos + 1; + if (data[nextPos] > ValueType(0.75)) seedPoints.push_back(nextPos); + } + } + } +} // seedFill() + + +template +inline bool +scanFill(LeafNodeType& node) +{ + bool updatedNode = false; + + typedef typename LeafNodeType::ValueType ValueType; + ValueType* data = node.buffer().data(); + + Coord ijk(0, 0, 0); + + bool updatedSign = true; + while (updatedSign) { + + updatedSign = false; + + for (Index pos = 0; pos < LeafNodeType::SIZE; ++pos) { + + ValueType& dist = data[pos]; + + if (!(dist < ValueType(0.0)) && dist > ValueType(0.75)) { + + ijk = LeafNodeType::offsetToLocalCoord(pos); + + // i, j, k - 1 + if (ijk[2] != 0 && data[pos - 1] < ValueType(0.0)) { + updatedSign = true; + dist = ValueType(-dist); + + // i, j, k + 1 + } else if (ijk[2] != (LeafNodeType::DIM - 1) && data[pos + 1] < ValueType(0.0)) { + updatedSign = true; + dist = ValueType(-dist); + + // i, j - 1, k + } else if (ijk[1] != 0 && data[pos - LeafNodeType::DIM] < ValueType(0.0)) { + updatedSign = true; + dist = ValueType(-dist); + + // i, j + 1, k + } else if (ijk[1] != (LeafNodeType::DIM - 1) && data[pos + LeafNodeType::DIM] < ValueType(0.0)) { + updatedSign = true; + dist = ValueType(-dist); + + // i - 1, j, k + } else if (ijk[0] != 0 && data[pos - LeafNodeType::DIM * LeafNodeType::DIM] < ValueType(0.0)) { + updatedSign = true; + dist = ValueType(-dist); + + // i + 1, j, k + } else if (ijk[0] != (LeafNodeType::DIM - 1) && data[pos + LeafNodeType::DIM * LeafNodeType::DIM] < ValueType(0.0)) { + updatedSign = true; + dist = ValueType(-dist); + } + } + } // end value loop + + updatedNode |= updatedSign; + } // end update loop + + return updatedNode; +} // scanFill() + + +template +class SeedFillExteriorSign +{ +public: + typedef typename TreeType::ValueType ValueType; + typedef typename TreeType::LeafNodeType LeafNodeType; + + SeedFillExteriorSign(std::vector& nodes, bool* changedNodeMask) + : mNodes(nodes.empty() ? NULL : &nodes[0]) + , mChangedNodeMask(changedNodeMask) + { + } + + void operator()(const tbb::blocked_range& range) const { + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + if (mChangedNodeMask[n]) { + //seedFill(*mNodes[n]); + mChangedNodeMask[n] = scanFill(*mNodes[n]); + } + } + } + + LeafNodeType ** const mNodes; + bool * const mChangedNodeMask; +}; + + +template +struct FillArray +{ + FillArray(ValueType* array, const ValueType v) : mArray(array), mValue(v) { } + + void operator()(const tbb::blocked_range& range) const { + const ValueType v = mValue; + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + mArray[n] = v; + } + } + + ValueType * const mArray; + const ValueType mValue; +}; + + +template +inline void +fillArray(ValueType* array, const ValueType val, const size_t length) +{ + const size_t grainSize = length / tbb::task_scheduler_init::default_num_threads(); + const tbb::blocked_range range(0, length, grainSize); + tbb::parallel_for(range, FillArray(array, val), tbb::simple_partitioner()); +} + + +template +class SyncVoxelMask +{ +public: + typedef typename TreeType::ValueType ValueType; + typedef typename TreeType::LeafNodeType LeafNodeType; + + SyncVoxelMask(std::vector& nodes, const bool* changedNodeMask, bool* changedVoxelMask) + : mNodes(nodes.empty() ? NULL : &nodes[0]) + , mChangedNodeMask(changedNodeMask) + , mChangedVoxelMask(changedVoxelMask) + { + } + + void operator()(const tbb::blocked_range& range) const { + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + if (mChangedNodeMask[n]) { + bool* mask = &mChangedVoxelMask[n * LeafNodeType::SIZE]; + + ValueType* data = mNodes[n]->buffer().data(); + + for (Index pos = 0; pos < LeafNodeType::SIZE; ++pos) { + if (mask[pos]) { + data[pos] = ValueType(-data[pos]); + mask[pos] = false; + } + } + } + } + } + + LeafNodeType ** const mNodes; + bool const * const mChangedNodeMask; + bool * const mChangedVoxelMask; +}; + + +template +class SeedPoints +{ +public: + typedef typename TreeType::ValueType ValueType; + typedef typename TreeType::LeafNodeType LeafNodeType; + typedef LeafNodeConnectivityTable ConnectivityTable; + + SeedPoints(ConnectivityTable& connectivity, bool* changedNodeMask, bool* nodeMask, bool* changedVoxelMask) + : mConnectivity(&connectivity) + , mChangedNodeMask(changedNodeMask) + , mNodeMask(nodeMask) + , mChangedVoxelMask(changedVoxelMask) + { + } + + void operator()(const tbb::blocked_range& range) const { + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + if (!mChangedNodeMask[n]) { + + bool changedValue = false; + + changedValue |= processZ(n, /*firstFace=*/true); + changedValue |= processZ(n, /*firstFace=*/false); + + changedValue |= processY(n, /*firstFace=*/true); + changedValue |= processY(n, /*firstFace=*/false); + + changedValue |= processX(n, /*firstFace=*/true); + changedValue |= processX(n, /*firstFace=*/false); + + mNodeMask[n] = changedValue; + } + } + } + + + bool processZ(const size_t n, bool firstFace) const + { + const size_t offset = firstFace ? mConnectivity->offsetsPrevZ()[n] : mConnectivity->offsetsNextZ()[n]; + if (offset != ConnectivityTable::INVALID_OFFSET && mChangedNodeMask[offset]) { + + bool* mask = &mChangedVoxelMask[n * LeafNodeType::SIZE]; + + const ValueType* lhsData = mConnectivity->nodes()[n]->buffer().data(); + const ValueType* rhsData = mConnectivity->nodes()[offset]->buffer().data(); + + const Index lastOffset = LeafNodeType::DIM - 1; + const Index lhsOffset = firstFace ? 0 : lastOffset, rhsOffset = firstFace ? lastOffset : 0; + + Index tmpPos(0), pos(0); + bool changedValue = false; + + for (Index x = 0; x < LeafNodeType::DIM; ++x) { + tmpPos = x << (2 * LeafNodeType::LOG2DIM); + for (Index y = 0; y < LeafNodeType::DIM; ++y) { + pos = tmpPos + (y << LeafNodeType::LOG2DIM); + + if (lhsData[pos + lhsOffset] > ValueType(0.75)) { + if (rhsData[pos + rhsOffset] < ValueType(0.0)) { + changedValue = true; + mask[pos + lhsOffset] = true; + } + } + } + } + + return changedValue; + } + + return false; + } + + bool processY(const size_t n, bool firstFace) const + { + const size_t offset = firstFace ? mConnectivity->offsetsPrevY()[n] : mConnectivity->offsetsNextY()[n]; + if (offset != ConnectivityTable::INVALID_OFFSET && mChangedNodeMask[offset]) { + + bool* mask = &mChangedVoxelMask[n * LeafNodeType::SIZE]; + + const ValueType* lhsData = mConnectivity->nodes()[n]->buffer().data(); + const ValueType* rhsData = mConnectivity->nodes()[offset]->buffer().data(); + + const Index lastOffset = LeafNodeType::DIM * (LeafNodeType::DIM - 1); + const Index lhsOffset = firstFace ? 0 : lastOffset, rhsOffset = firstFace ? lastOffset : 0; + + Index tmpPos(0), pos(0); + bool changedValue = false; + + for (Index x = 0; x < LeafNodeType::DIM; ++x) { + tmpPos = x << (2 * LeafNodeType::LOG2DIM); + for (Index z = 0; z < LeafNodeType::DIM; ++z) { + pos = tmpPos + z; + + if (lhsData[pos + lhsOffset] > ValueType(0.75)) { + if (rhsData[pos + rhsOffset] < ValueType(0.0)) { + changedValue = true; + mask[pos + lhsOffset] = true; + } + } + } + } + + return changedValue; + } + + return false; + } + + bool processX(const size_t n, bool firstFace) const + { + const size_t offset = firstFace ? mConnectivity->offsetsPrevX()[n] : mConnectivity->offsetsNextX()[n]; + if (offset != ConnectivityTable::INVALID_OFFSET && mChangedNodeMask[offset]) { + + bool* mask = &mChangedVoxelMask[n * LeafNodeType::SIZE]; + + const ValueType* lhsData = mConnectivity->nodes()[n]->buffer().data(); + const ValueType* rhsData = mConnectivity->nodes()[offset]->buffer().data(); + + const Index lastOffset = LeafNodeType::DIM * LeafNodeType::DIM * (LeafNodeType::DIM - 1); + const Index lhsOffset = firstFace ? 0 : lastOffset, rhsOffset = firstFace ? lastOffset : 0; + + Index tmpPos(0), pos(0); + bool changedValue = false; + + for (Index y = 0; y < LeafNodeType::DIM; ++y) { + tmpPos = y << LeafNodeType::LOG2DIM; + for (Index z = 0; z < LeafNodeType::DIM; ++z) { + pos = tmpPos + z; + + if (lhsData[pos + lhsOffset] > ValueType(0.75)) { + if (rhsData[pos + rhsOffset] < ValueType(0.0)) { + changedValue = true; + mask[pos + lhsOffset] = true; + } + } + } + } + + return changedValue; + } + + return false; + } + + ConnectivityTable * const mConnectivity; + bool * const mChangedNodeMask; + bool * const mNodeMask; + bool * const mChangedVoxelMask; +}; + + +//////////////////////////////////////// + +template +struct ComputeIntersectingVoxelSign +{ + typedef typename TreeType::ValueType ValueType; + typedef typename TreeType::LeafNodeType LeafNodeType; + typedef typename TreeType::template ValueConverter::Type Int32TreeType; + typedef typename Int32TreeType::LeafNodeType Int32LeafNodeType; + + typedef std::pair, boost::shared_array > LocalData; + typedef tbb::enumerable_thread_specific LocalDataTable; + + ComputeIntersectingVoxelSign( + std::vector& distNodes, + const TreeType& distTree, + const Int32TreeType& indexTree, + const MeshDataAdapter& mesh) + : mDistNodes(distNodes.empty() ? NULL : &distNodes[0]) + , mDistTree(&distTree) + , mIndexTree(&indexTree) + , mMesh(&mesh) + , mLocalDataTable(new LocalDataTable()) + { + } + + + void operator()(const tbb::blocked_range& range) const { + + tree::ValueAccessor distAcc(*mDistTree); + tree::ValueAccessor idxAcc(*mIndexTree); + + ValueType nval; + CoordBBox bbox; + Index xPos(0), yPos(0); + Coord ijk, nijk, nodeMin, nodeMax; + Vec3d cp, xyz, nxyz, dir1, dir2; + + LocalData& localData = mLocalDataTable->local(); + + boost::shared_array& points = localData.first; + if (!points) points.reset(new Vec3d[LeafNodeType::SIZE * 2]); + + boost::shared_array& mask = localData.second; + if (!mask) mask.reset(new bool[LeafNodeType::SIZE]); + + + typename LeafNodeType::ValueOnCIter it; + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + LeafNodeType& node = *mDistNodes[n]; + ValueType* data = node.buffer().data(); + + const Int32LeafNodeType* idxNode = idxAcc.probeConstLeaf(node.origin()); + const Int32* idxData = idxNode->buffer().data(); + + nodeMin = node.origin(); + nodeMax = nodeMin.offsetBy(LeafNodeType::DIM - 1); + + // reset computed voxel mask. + memset(mask.get(), 0, sizeof(bool) * LeafNodeType::SIZE); + + for (it = node.cbeginValueOn(); it; ++it) { + Index pos = it.pos(); + + ValueType& dist = data[pos]; + if (dist < 0.0 || dist > 0.75) continue; + + ijk = node.offsetToGlobalCoord(pos); + + xyz[0] = double(ijk[0]); + xyz[1] = double(ijk[1]); + xyz[2] = double(ijk[2]); + + + bbox.min() = Coord::maxComponent(ijk.offsetBy(-1), nodeMin); + bbox.max() = Coord::minComponent(ijk.offsetBy(1), nodeMax); + + bool flipSign = false; + + for (nijk[0] = bbox.min()[0]; nijk[0] <= bbox.max()[0] && !flipSign; ++nijk[0]) { + xPos = (nijk[0] & (LeafNodeType::DIM - 1u)) << (2 * LeafNodeType::LOG2DIM); + for (nijk[1] = bbox.min()[1]; nijk[1] <= bbox.max()[1] && !flipSign; ++nijk[1]) { + yPos = xPos + ((nijk[1] & (LeafNodeType::DIM - 1u)) << LeafNodeType::LOG2DIM); + for (nijk[2] = bbox.min()[2]; nijk[2] <= bbox.max()[2]; ++nijk[2]) { + pos = yPos + (nijk[2] & (LeafNodeType::DIM - 1u)); + + const Int32& polyIdx = idxData[pos]; + + if (polyIdx == Int32(util::INVALID_IDX) || !(data[pos] < -0.75)) continue; + + const Index pointIndex = pos * 2; + + if (!mask[pos]) { + + mask[pos] = true; + + nxyz[0] = double(nijk[0]); + nxyz[1] = double(nijk[1]); + nxyz[2] = double(nijk[2]); + + Vec3d& point = points[pointIndex]; + + point = closestPoint(nxyz, polyIdx); + + Vec3d& direction = points[pointIndex + 1]; + direction = nxyz - point; + direction.normalize(); + } + + dir1 = xyz - points[pointIndex]; + dir1.normalize(); + + if (points[pointIndex + 1].dot(dir1) > 0.0) { + flipSign = true; + break; + } + } + } + } + + if (flipSign) { + dist = -dist; + } else { + for (Int32 m = 0; m < 26; ++m) { + nijk = ijk + util::COORD_OFFSETS[m]; + + if (!bbox.isInside(nijk) && distAcc.probeValue(nijk, nval) && nval < -0.75) { + nxyz[0] = double(nijk[0]); + nxyz[1] = double(nijk[1]); + nxyz[2] = double(nijk[2]); + + cp = closestPoint(nxyz, idxAcc.getValue(nijk)); + + dir1 = xyz - cp; + dir1.normalize(); + + dir2 = nxyz - cp; + dir2.normalize(); + + if (dir2.dot(dir1) > 0.0) { + dist = -dist; + break; + } + } + } + } + + } // active voxel loop + } // leaf node loop + } + +private: + + Vec3d closestPoint(const Vec3d& center, Int32 polyIdx) const + { + Vec3d a, b, c, cp, uvw; + + const size_t polygon = size_t(polyIdx); + mMesh->getIndexSpacePoint(polygon, 0, a); + mMesh->getIndexSpacePoint(polygon, 1, b); + mMesh->getIndexSpacePoint(polygon, 2, c); + + cp = closestPointOnTriangleToPoint(a, c, b, center, uvw); + + if (4 == mMesh->vertexCount(polygon)) { + + mMesh->getIndexSpacePoint(polygon, 3, b); + + c = closestPointOnTriangleToPoint(a, b, c, center, uvw); + + if ((center - c).lengthSqr() < (center - cp).lengthSqr()) { + cp = c; + } + } + + return cp; + } + + + LeafNodeType ** const mDistNodes; + TreeType const * const mDistTree; + Int32TreeType const * const mIndexTree; + MeshDataAdapter const * const mMesh; + + boost::shared_ptr mLocalDataTable; +}; // ComputeIntersectingVoxelSign + + +//////////////////////////////////////// + + +template +inline void +maskNodeInternalNeighbours(const Index pos, bool (&mask)[26]) +{ + typedef LeafNodeType NodeT; + + const Coord ijk = NodeT::offsetToLocalCoord(pos); + + // Face adjacent neighbours + // i+1, j, k + mask[0] = ijk[0] != (NodeT::DIM - 1); + // i-1, j, k + mask[1] = ijk[0] != 0; + // i, j+1, k + mask[2] = ijk[1] != (NodeT::DIM - 1); + // i, j-1, k + mask[3] = ijk[1] != 0; + // i, j, k+1 + mask[4] = ijk[2] != (NodeT::DIM - 1); + // i, j, k-1 + mask[5] = ijk[2] != 0; + + // Edge adjacent neighbour + // i+1, j, k-1 + mask[6] = mask[0] && mask[5]; + // i-1, j, k-1 + mask[7] = mask[1] && mask[5]; + // i+1, j, k+1 + mask[8] = mask[0] && mask[4]; + // i-1, j, k+1 + mask[9] = mask[1] && mask[4]; + // i+1, j+1, k + mask[10] = mask[0] && mask[2]; + // i-1, j+1, k + mask[11] = mask[1] && mask[2]; + // i+1, j-1, k + mask[12] = mask[0] && mask[3]; + // i-1, j-1, k + mask[13] = mask[1] && mask[3]; + // i, j-1, k+1 + mask[14] = mask[3] && mask[4]; + // i, j-1, k-1 + mask[15] = mask[3] && mask[5]; + // i, j+1, k+1 + mask[16] = mask[2] && mask[4]; + // i, j+1, k-1 + mask[17] = mask[2] && mask[5]; + + // Corner adjacent neighbours + // i-1, j-1, k-1 + mask[18] = mask[1] && mask[3] && mask[5]; + // i-1, j-1, k+1 + mask[19] = mask[1] && mask[3] && mask[4]; + // i+1, j-1, k+1 + mask[20] = mask[0] && mask[3] && mask[4]; + // i+1, j-1, k-1 + mask[21] = mask[0] && mask[3] && mask[5]; + // i-1, j+1, k-1 + mask[22] = mask[1] && mask[2] && mask[5]; + // i-1, j+1, k+1 + mask[23] = mask[1] && mask[2] && mask[4]; + // i+1, j+1, k+1 + mask[24] = mask[0] && mask[2] && mask[4]; + // i+1, j+1, k-1 + mask[25] = mask[0] && mask[2] && mask[5]; +} + + +template +inline bool +checkNeighbours(const Index pos, const typename LeafNodeType::ValueType * data, bool (&mask)[26]) +{ + typedef LeafNodeType NodeT; + + // i, j, k - 1 + if (mask[5] && Compare::check(data[pos - 1])) return true; + // i, j, k + 1 + if (mask[4] && Compare::check(data[pos + 1])) return true; + // i, j - 1, k + if (mask[3] && Compare::check(data[pos - NodeT::DIM])) return true; + // i, j + 1, k + if (mask[2] && Compare::check(data[pos + NodeT::DIM])) return true; + // i - 1, j, k + if (mask[1] && Compare::check(data[pos - NodeT::DIM * NodeT::DIM])) return true; + // i + 1, j, k + if (mask[0] && Compare::check(data[pos + NodeT::DIM * NodeT::DIM])) return true; + // i+1, j, k-1 + if (mask[6] && Compare::check(data[pos + NodeT::DIM * NodeT::DIM])) return true; + // i-1, j, k-1 + if (mask[7] && Compare::check(data[pos - NodeT::DIM * NodeT::DIM - 1])) return true; + // i+1, j, k+1 + if (mask[8] && Compare::check(data[pos + NodeT::DIM * NodeT::DIM + 1])) return true; + // i-1, j, k+1 + if (mask[9] && Compare::check(data[pos - NodeT::DIM * NodeT::DIM + 1])) return true; + // i+1, j+1, k + if (mask[10] && Compare::check(data[pos + NodeT::DIM * NodeT::DIM + NodeT::DIM])) return true; + // i-1, j+1, k + if (mask[11] && Compare::check(data[pos - NodeT::DIM * NodeT::DIM + NodeT::DIM])) return true; + // i+1, j-1, k + if (mask[12] && Compare::check(data[pos + NodeT::DIM * NodeT::DIM - NodeT::DIM])) return true; + // i-1, j-1, k + if (mask[13] && Compare::check(data[pos - NodeT::DIM * NodeT::DIM - NodeT::DIM])) return true; + // i, j-1, k+1 + if (mask[14] && Compare::check(data[pos - NodeT::DIM + 1])) return true; + // i, j-1, k-1 + if (mask[15] && Compare::check(data[pos - NodeT::DIM - 1])) return true; + // i, j+1, k+1 + if (mask[16] && Compare::check(data[pos + NodeT::DIM + 1])) return true; + // i, j+1, k-1 + if (mask[17] && Compare::check(data[pos + NodeT::DIM - 1])) return true; + // i-1, j-1, k-1 + if (mask[18] && Compare::check(data[pos - NodeT::DIM * NodeT::DIM - NodeT::DIM - 1])) return true; + // i-1, j-1, k+1 + if (mask[19] && Compare::check(data[pos - NodeT::DIM * NodeT::DIM - NodeT::DIM + 1])) return true; + // i+1, j-1, k+1 + if (mask[20] && Compare::check(data[pos + NodeT::DIM * NodeT::DIM - NodeT::DIM + 1])) return true; + // i+1, j-1, k-1 + if (mask[21] && Compare::check(data[pos + NodeT::DIM * NodeT::DIM - NodeT::DIM - 1])) return true; + // i-1, j+1, k-1 + if (mask[22] && Compare::check(data[pos - NodeT::DIM * NodeT::DIM + NodeT::DIM - 1])) return true; + // i-1, j+1, k+1 + if (mask[23] && Compare::check(data[pos - NodeT::DIM * NodeT::DIM + NodeT::DIM + 1])) return true; + // i+1, j+1, k+1 + if (mask[24] && Compare::check(data[pos + NodeT::DIM * NodeT::DIM + NodeT::DIM + 1])) return true; + // i+1, j+1, k-1 + if (mask[25] && Compare::check(data[pos + NodeT::DIM * NodeT::DIM + NodeT::DIM - 1])) return true; + + return false; +} + + +template +inline bool +checkNeighbours(const Coord& ijk, AccessorType& acc, bool (&mask)[26]) +{ + for (Int32 m = 0; m < 26; ++m) { + if (!mask[m] && Compare::check(acc.getValue(ijk + util::COORD_OFFSETS[m]))) { + return true; + } + } + + return false; +} + + +template +struct ValidateIntersectingVoxels +{ + typedef typename TreeType::ValueType ValueType; + typedef typename TreeType::LeafNodeType LeafNodeType; + + struct IsNegative { static bool check(const ValueType v) { return v < ValueType(0.0); } }; + + ValidateIntersectingVoxels(TreeType& tree, std::vector& nodes) + : mTree(&tree) + , mNodes(nodes.empty() ? NULL : &nodes[0]) + { + } + + void operator()(const tbb::blocked_range& range) const + { + tree::ValueAccessor acc(*mTree); + bool neighbourMask[26]; + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + LeafNodeType& node = *mNodes[n]; + ValueType* data = node.buffer().data(); + + typename LeafNodeType::ValueOnCIter it; + for (it = node.cbeginValueOn(); it; ++it) { + + const Index pos = it.pos(); + + ValueType& dist = data[pos]; + if (dist < 0.0 || dist > 0.75) continue; + + // Mask node internal neighbours + maskNodeInternalNeighbours(pos, neighbourMask); + + const bool hasNegativeNeighbour = + checkNeighbours(pos, data, neighbourMask) || + checkNeighbours(node.offsetToGlobalCoord(pos), acc, neighbourMask); + + if (!hasNegativeNeighbour) { + // push over boundary voxel distance + dist = ValueType(0.75) + Tolerance::epsilon(); + } + } + } + } + + TreeType * const mTree; + LeafNodeType ** const mNodes; +}; // ValidateIntersectingVoxels + + +template +struct RemoveSelfIntersectingSurface +{ + typedef typename TreeType::ValueType ValueType; + typedef typename TreeType::LeafNodeType LeafNodeType; + typedef typename TreeType::template ValueConverter::Type Int32TreeType; + + struct Comp { static bool check(const ValueType v) { return !(v > ValueType(0.75)); } }; + + RemoveSelfIntersectingSurface(std::vector& nodes, + TreeType& distTree, Int32TreeType& indexTree) + : mNodes(nodes.empty() ? NULL : &nodes[0]) + , mDistTree(&distTree) + , mIndexTree(&indexTree) + { + } + + void operator()(const tbb::blocked_range& range) const + { + tree::ValueAccessor distAcc(*mDistTree); + tree::ValueAccessor idxAcc(*mIndexTree); + bool neighbourMask[26]; + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + LeafNodeType& distNode = *mNodes[n]; + ValueType* data = distNode.buffer().data(); + + typename Int32TreeType::LeafNodeType* idxNode = + idxAcc.probeLeaf(distNode.origin()); + + typename LeafNodeType::ValueOnCIter it; + for (it = distNode.cbeginValueOn(); it; ++it) { + + const Index pos = it.pos(); + + if (!(data[pos] > 0.75)) continue; + + // Mask node internal neighbours + maskNodeInternalNeighbours(pos, neighbourMask); + + const bool hasBoundaryNeighbour = + checkNeighbours(pos, data, neighbourMask) || + checkNeighbours(distNode.offsetToGlobalCoord(pos), distAcc, neighbourMask); + + if (!hasBoundaryNeighbour) { + distNode.setValueOff(pos); + idxNode->setValueOff(pos); + } + } + } + } + + LeafNodeType * * const mNodes; + TreeType * const mDistTree; + Int32TreeType * const mIndexTree; +}; // RemoveSelfIntersectingSurface + + +//////////////////////////////////////// + + +template +struct ReleaseChildNodes +{ + ReleaseChildNodes(NodeType ** nodes) : mNodes(nodes) {} + + void operator()(const tbb::blocked_range& range) const { + + typedef typename NodeType::NodeMaskType NodeMaskType; + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + const_cast(mNodes[n]->getChildMask()).setOff(); + } + } + + NodeType ** const mNodes; +}; + + +template +inline void +releaseLeafNodes(TreeType& tree) +{ + typedef typename TreeType::RootNodeType RootNodeType; + typedef typename RootNodeType::NodeChainType NodeChainType; + typedef typename boost::mpl::at >::type InternalNodeType; + + std::vector nodes; + tree.getNodes(nodes); + + tbb::parallel_for(tbb::blocked_range(0, nodes.size()), + ReleaseChildNodes(nodes.empty() ? NULL : &nodes[0])); +} + + +template +struct StealUniqueLeafNodes +{ + typedef typename TreeType::LeafNodeType LeafNodeType; + + StealUniqueLeafNodes(TreeType& lhsTree, TreeType& rhsTree, + std::vector& overlappingNodes) + : mLhsTree(&lhsTree) + , mRhsTree(&rhsTree) + , mNodes(&overlappingNodes) + { + } + + void operator()() const { + + std::vector rhsLeafNodes; + + rhsLeafNodes.reserve(mRhsTree->leafCount()); + //mRhsTree->getNodes(rhsLeafNodes); + //releaseLeafNodes(*mRhsTree); + mRhsTree->stealNodes(rhsLeafNodes); + + tree::ValueAccessor acc(*mLhsTree); + + for (size_t n = 0, N = rhsLeafNodes.size(); n < N; ++n) { + if (!acc.probeLeaf(rhsLeafNodes[n]->origin())) { + acc.addLeaf(rhsLeafNodes[n]); + } else { + mNodes->push_back(rhsLeafNodes[n]); + } + } + } + +private: + TreeType * const mLhsTree; + TreeType * const mRhsTree; + std::vector * const mNodes; +}; + + +template +inline void +combineData(DistTreeType& lhsDist, IndexTreeType& lhsIdx, + DistTreeType& rhsDist, IndexTreeType& rhsIdx) +{ + typedef typename DistTreeType::LeafNodeType DistLeafNodeType; + typedef typename IndexTreeType::LeafNodeType IndexLeafNodeType; + + std::vector overlappingDistNodes; + std::vector overlappingIdxNodes; + + // Steal unique leafnodes + tbb::task_group tasks; + tasks.run(StealUniqueLeafNodes(lhsDist, rhsDist, overlappingDistNodes)); + tasks.run(StealUniqueLeafNodes(lhsIdx, rhsIdx, overlappingIdxNodes)); + tasks.wait(); + + // Combine overlapping leaf nodes + if (!overlappingDistNodes.empty() && !overlappingIdxNodes.empty()) { + tbb::parallel_for(tbb::blocked_range(0, overlappingDistNodes.size()), + CombineLeafNodes(lhsDist, lhsIdx, &overlappingDistNodes[0], &overlappingIdxNodes[0])); + } +} + +/// @brief TBB body object to voxelize a mesh of triangles and/or quads into a collection +/// of VDB grids, namely a squared distance grid, a closest primitive grid and an +/// intersecting voxels grid (masks the mesh intersecting voxels) +/// @note Only the leaf nodes that intersect the mesh are allocated, and only voxels in +/// a narrow band (of two to three voxels in proximity to the mesh's surface) are activated. +/// They are populated with distance values and primitive indices. +template +struct VoxelizationData { + + typedef boost::scoped_ptr Ptr; + typedef typename TreeType::ValueType ValueType; + + typedef typename TreeType::template ValueConverter::Type Int32TreeType; + typedef typename TreeType::template ValueConverter::Type UCharTreeType; + + typedef tree::ValueAccessor FloatTreeAcc; + typedef tree::ValueAccessor Int32TreeAcc; + typedef tree::ValueAccessor UCharTreeAcc; + + + VoxelizationData() + : distTree(std::numeric_limits::max()) + , distAcc(distTree) + , indexTree(Int32(util::INVALID_IDX)) + , indexAcc(indexTree) + , primIdTree(MaxPrimId) + , primIdAcc(primIdTree) + , mPrimCount(0) + { + } + + TreeType distTree; + FloatTreeAcc distAcc; + + Int32TreeType indexTree; + Int32TreeAcc indexAcc; + + UCharTreeType primIdTree; + UCharTreeAcc primIdAcc; + + unsigned char getNewPrimId() { + + if (mPrimCount == MaxPrimId || primIdTree.leafCount() > 1000) { + mPrimCount = 0; + primIdTree.clear(); + } + + return mPrimCount++; + } + +private: + + enum { MaxPrimId = 100 }; + + unsigned char mPrimCount; +}; + + +template +class VoxelizePolygons +{ +public: + + typedef VoxelizationData VoxelizationDataType; + typedef tbb::enumerable_thread_specific DataTable; + + VoxelizePolygons(DataTable& dataTable, + const MeshDataAdapter& mesh, + Interrupter* interrupter = NULL) + : mDataTable(&dataTable) + , mMesh(&mesh) + , mInterrupter(interrupter) + { + } + + void operator()(const tbb::blocked_range& range) const { + + typename VoxelizationDataType::Ptr& dataPtr = mDataTable->local(); + if (!dataPtr) dataPtr.reset(new VoxelizationDataType()); + + Triangle prim; + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + if (this->wasInterrupted()) { + tbb::task::self().cancel_group_execution(); + break; + } + + const size_t numVerts = mMesh->vertexCount(n); + + // rasterize triangles and quads. + if (numVerts == 3 || numVerts == 4) { + + prim.index = Int32(n); + + mMesh->getIndexSpacePoint(n, 0, prim.a); + mMesh->getIndexSpacePoint(n, 1, prim.b); + mMesh->getIndexSpacePoint(n, 2, prim.c); + + evalTriangle(prim, *dataPtr); + + if (numVerts == 4) { + mMesh->getIndexSpacePoint(n, 3, prim.b); + evalTriangle(prim, *dataPtr); + } + } + } + } + +private: + + bool wasInterrupted() const { return mInterrupter && mInterrupter->wasInterrupted(); } + + struct Triangle { Vec3d a, b, c; Int32 index; }; + + struct SubTask + { + enum { POLYGON_LIMIT = 1000 }; + + SubTask(const Triangle& prim, DataTable& dataTable, int subdivisionCount, size_t polygonCount) + : mLocalDataTable(&dataTable) + , mPrim(prim) + , mSubdivisionCount(subdivisionCount) + , mPolygonCount(polygonCount) + { + } + + void operator()() const + { + if (mSubdivisionCount <= 0 || mPolygonCount >= POLYGON_LIMIT) { + + typename VoxelizationDataType::Ptr& dataPtr = mLocalDataTable->local(); + if (!dataPtr) dataPtr.reset(new VoxelizationDataType()); + + voxelizeTriangle(mPrim, *dataPtr); + + } else { + spawnTasks(mPrim, *mLocalDataTable, mSubdivisionCount, mPolygonCount); + } + } + + DataTable * const mLocalDataTable; + Triangle const mPrim; + int const mSubdivisionCount; + size_t const mPolygonCount; + }; // struct SubTask + + inline static int evalSubdivisionCount(const Triangle& prim) + { + const double ax = prim.a[0], bx = prim.b[0], cx = prim.c[0]; + const double dx = std::max(ax, std::max(bx, cx)) - std::min(ax, std::min(bx, cx)); + + const double ay = prim.a[1], by = prim.b[1], cy = prim.c[1]; + const double dy = std::max(ay, std::max(by, cy)) - std::min(ay, std::min(by, cy)); + + const double az = prim.a[2], bz = prim.b[2], cz = prim.c[2]; + const double dz = std::max(az, std::max(bz, cz)) - std::min(az, std::min(bz, cz)); + + return int(std::max(dx, std::max(dy, dz)) / double(TreeType::LeafNodeType::DIM * 2)); + } + + void evalTriangle(const Triangle& prim, VoxelizationDataType& data) const + { + const size_t polygonCount = mMesh->polygonCount(); + const int subdivisionCount = polygonCount < SubTask::POLYGON_LIMIT ? evalSubdivisionCount(prim) : 0; + + if (subdivisionCount <= 0) { + voxelizeTriangle(prim, data); + } else { + spawnTasks(prim, *mDataTable, subdivisionCount, polygonCount); + } + } + + static void spawnTasks( + const Triangle& mainPrim, DataTable& dataTable, int subdivisionCount, size_t polygonCount) + { + subdivisionCount -= 1; + polygonCount *= 4; + + tbb::task_group tasks; + + const Vec3d ac = (mainPrim.a + mainPrim.c) * 0.5; + const Vec3d bc = (mainPrim.b + mainPrim.c) * 0.5; + const Vec3d ab = (mainPrim.a + mainPrim.b) * 0.5; + + Triangle prim; + prim.index = mainPrim.index; + + prim.a = mainPrim.a; + prim.b = ab; + prim.c = ac; + tasks.run(SubTask(prim, dataTable, subdivisionCount, polygonCount)); + + prim.a = ab; + prim.b = bc; + prim.c = ac; + tasks.run(SubTask(prim, dataTable, subdivisionCount, polygonCount)); + + prim.a = ab; + prim.b = mainPrim.b; + prim.c = bc; + tasks.run(SubTask(prim, dataTable, subdivisionCount, polygonCount)); + + prim.a = ac; + prim.b = bc; + prim.c = mainPrim.c; + tasks.run(SubTask(prim, dataTable, subdivisionCount, polygonCount)); + + tasks.wait(); + } + + static void voxelizeTriangle(const Triangle& prim, VoxelizationDataType& data) + { + std::deque coordList; + Coord ijk, nijk; + + ijk = Coord::floor(prim.a); + coordList.push_back(ijk); + + computeDistance(ijk, prim, data); + + unsigned char primId = data.getNewPrimId(); + data.primIdAcc.setValueOnly(ijk, primId); + + while (!coordList.empty()) { + ijk = coordList.back(); + coordList.pop_back(); + + for (Int32 i = 0; i < 26; ++i) { + nijk = ijk + util::COORD_OFFSETS[i]; + if (primId != data.primIdAcc.getValue(nijk)) { + data.primIdAcc.setValueOnly(nijk, primId); + if(computeDistance(nijk, prim, data)) coordList.push_back(nijk); + } + } + } + } + + static bool computeDistance(const Coord& ijk, const Triangle& prim, VoxelizationDataType& data) + { + Vec3d uvw, voxelCenter(ijk[0], ijk[1], ijk[2]); + + typedef typename TreeType::ValueType ValueType; + + const ValueType dist = ValueType((voxelCenter - + closestPointOnTriangleToPoint(prim.a, prim.c, prim.b, voxelCenter, uvw)).lengthSqr()); + + const ValueType oldDist = data.distAcc.getValue(ijk); + + if (dist < oldDist) { + data.distAcc.setValue(ijk, dist); + data.indexAcc.setValue(ijk, prim.index); + } else if (math::isExactlyEqual(dist, oldDist)) { + // makes reduction deterministic when different polygons + // produce the same distance value. + data.indexAcc.setValueOnly(ijk, std::min(prim.index, data.indexAcc.getValue(ijk))); + } + + return !(dist > 0.75); // true if the primitive intersects the voxel. + } + + DataTable * const mDataTable; + MeshDataAdapter const * const mMesh; + Interrupter * const mInterrupter; +}; // VoxelizePolygons + + +//////////////////////////////////////// + + +template +struct DiffLeafNodeMask +{ + typedef typename tree::ValueAccessor AccessorType; + typedef typename TreeType::LeafNodeType LeafNodeType; + + typedef typename TreeType::template ValueConverter::Type BoolTreeType; + typedef typename BoolTreeType::LeafNodeType BoolLeafNodeType; + + DiffLeafNodeMask(const TreeType& rhsTree, + std::vector& lhsNodes) + : mRhsTree(&rhsTree), mLhsNodes(lhsNodes.empty() ? NULL : &lhsNodes[0]) + { + } + + void operator()(const tbb::blocked_range& range) const { + + tree::ValueAccessor acc(*mRhsTree); + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + BoolLeafNodeType* lhsNode = mLhsNodes[n]; + const LeafNodeType* rhsNode = acc.probeConstLeaf(lhsNode->origin()); + + if (rhsNode) lhsNode->topologyDifference(*rhsNode, false); + } + } + +private: + TreeType const * const mRhsTree; + BoolLeafNodeType ** const mLhsNodes; +}; + + +template +struct UnionValueMasks +{ + UnionValueMasks(std::vector& nodesA, std::vector& nodesB) + : mNodesA(nodesA.empty() ? NULL : &nodesA[0]) + , mNodesB(nodesB.empty() ? NULL : &nodesB[0]) + { + } + + void operator()(const tbb::blocked_range& range) const { + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + mNodesA[n]->topologyUnion(*mNodesB[n]); + } + } + +private: + LeafNodeTypeA ** const mNodesA; + LeafNodeTypeB ** const mNodesB; +}; + + +template +struct ConstructVoxelMask +{ + typedef typename TreeType::LeafNodeType LeafNodeType; + + typedef typename TreeType::template ValueConverter::Type BoolTreeType; + typedef typename BoolTreeType::LeafNodeType BoolLeafNodeType; + + ConstructVoxelMask(BoolTreeType& maskTree, const TreeType& tree, std::vector& nodes) + : mTree(&tree) + , mNodes(nodes.empty() ? NULL : &nodes[0]) + , mLocalMaskTree(false) + , mMaskTree(&maskTree) + { + } + + ConstructVoxelMask(ConstructVoxelMask& rhs, tbb::split) + : mTree(rhs.mTree) + , mNodes(rhs.mNodes) + , mLocalMaskTree(false) + , mMaskTree(&mLocalMaskTree) + { + } + + void operator()(const tbb::blocked_range& range) + { + typedef typename LeafNodeType::ValueOnCIter Iterator; + + tree::ValueAccessor acc(*mTree); + tree::ValueAccessor maskAcc(*mMaskTree); + + Coord ijk, nijk, localCorod; + Index pos, npos; + + for (size_t n = range.begin(); n != range.end(); ++n) { + + LeafNodeType& node = *mNodes[n]; + + CoordBBox bbox = node.getNodeBoundingBox(); + bbox.expand(-1); + + BoolLeafNodeType& maskNode = *maskAcc.touchLeaf(node.origin()); + + for (Iterator it = node.cbeginValueOn(); it; ++it) { + ijk = it.getCoord(); + pos = it.pos(); + + localCorod = LeafNodeType::offsetToLocalCoord(pos); + + if (localCorod[2] < int(LeafNodeType::DIM - 1)) { + npos = pos + 1; + if (!node.isValueOn(npos)) maskNode.setValueOn(npos); + } else { + nijk = ijk.offsetBy(0, 0, 1); + if (!acc.isValueOn(nijk)) maskAcc.setValueOn(nijk); + } + + if (localCorod[2] > 0) { + npos = pos - 1; + if (!node.isValueOn(npos)) maskNode.setValueOn(npos); + } else { + nijk = ijk.offsetBy(0, 0, -1); + if (!acc.isValueOn(nijk)) maskAcc.setValueOn(nijk); + } + + if (localCorod[1] < int(LeafNodeType::DIM - 1)) { + npos = pos + LeafNodeType::DIM; + if (!node.isValueOn(npos)) maskNode.setValueOn(npos); + } else { + nijk = ijk.offsetBy(0, 1, 0); + if (!acc.isValueOn(nijk)) maskAcc.setValueOn(nijk); + } + + if (localCorod[1] > 0) { + npos = pos - LeafNodeType::DIM; + if (!node.isValueOn(npos)) maskNode.setValueOn(npos); + } else { + nijk = ijk.offsetBy(0, -1, 0); + if (!acc.isValueOn(nijk)) maskAcc.setValueOn(nijk); + } + + if (localCorod[0] < int(LeafNodeType::DIM - 1)) { + npos = pos + LeafNodeType::DIM * LeafNodeType::DIM; + if (!node.isValueOn(npos)) maskNode.setValueOn(npos); + } else { + nijk = ijk.offsetBy(1, 0, 0); + if (!acc.isValueOn(nijk)) maskAcc.setValueOn(nijk); + } + + if (localCorod[0] > 0) { + npos = pos - LeafNodeType::DIM * LeafNodeType::DIM; + if (!node.isValueOn(npos)) maskNode.setValueOn(npos); + } else { + nijk = ijk.offsetBy(-1, 0, 0); + if (!acc.isValueOn(nijk)) maskAcc.setValueOn(nijk); + } + } + } + } + + void join(ConstructVoxelMask& rhs) { mMaskTree->merge(*rhs.mMaskTree); } + +private: + TreeType const * const mTree; + LeafNodeType ** const mNodes; + + BoolTreeType mLocalMaskTree; + BoolTreeType * const mMaskTree; +}; + + +/// @note The interior and exterior widths should be in world space units and squared. +template +struct ExpandNarrowband +{ + typedef typename TreeType::ValueType ValueType; + typedef typename TreeType::LeafNodeType LeafNodeType; + typedef typename LeafNodeType::NodeMaskType NodeMaskType; + typedef typename TreeType::template ValueConverter::Type Int32TreeType; + typedef typename Int32TreeType::LeafNodeType Int32LeafNodeType; + typedef typename TreeType::template ValueConverter::Type BoolTreeType; + typedef typename BoolTreeType::LeafNodeType BoolLeafNodeType; + + struct Fragment + { + Int32 idx, x, y, z; + ValueType dist; + + Fragment() : idx(0), x(0), y(0), z(0), dist(0.0) {} + + Fragment(Int32 idx_, Int32 x_, Int32 y_, Int32 z_, ValueType dist_) + : idx(idx_), x(x_), y(y_), z(z_), dist(dist_) + { + } + + bool operator<(const Fragment& rhs) const { return idx < rhs.idx; } + }; // struct Fragment + + //////////////////// + + ExpandNarrowband( + std::vector& maskNodes, + BoolTreeType& maskTree, + TreeType& distTree, + Int32TreeType& indexTree, + const MeshDataAdapter& mesh, + ValueType exteriorBandWidth, + ValueType interiorBandWidth, + ValueType voxelSize) + : mMaskNodes(maskNodes.empty() ? NULL : &maskNodes[0]) + , mMaskTree(&maskTree) + , mDistTree(&distTree) + , mIndexTree(&indexTree) + , mMesh(&mesh) + , mNewMaskTree(false) + , mDistNodes() + , mUpdatedDistNodes() + , mIndexNodes() + , mUpdatedIndexNodes() + , mExteriorBandWidth(exteriorBandWidth) + , mInteriorBandWidth(interiorBandWidth) + , mVoxelSize(voxelSize) + { + } + + ExpandNarrowband(const ExpandNarrowband& rhs, tbb::split) + : mMaskNodes(rhs.mMaskNodes) + , mMaskTree(rhs.mMaskTree) + , mDistTree(rhs.mDistTree) + , mIndexTree(rhs.mIndexTree) + , mMesh(rhs.mMesh) + , mNewMaskTree(false) + , mDistNodes() + , mUpdatedDistNodes() + , mIndexNodes() + , mUpdatedIndexNodes() + , mExteriorBandWidth(rhs.mExteriorBandWidth) + , mInteriorBandWidth(rhs.mInteriorBandWidth) + , mVoxelSize(rhs.mVoxelSize) + { + } + + void join(ExpandNarrowband& rhs) + { + mDistNodes.insert(mDistNodes.end(), rhs.mDistNodes.begin(), rhs.mDistNodes.end()); + mIndexNodes.insert(mIndexNodes.end(), rhs.mIndexNodes.begin(), rhs.mIndexNodes.end()); + + mUpdatedDistNodes.insert(mUpdatedDistNodes.end(), + rhs.mUpdatedDistNodes.begin(), rhs.mUpdatedDistNodes.end()); + + mUpdatedIndexNodes.insert(mUpdatedIndexNodes.end(), + rhs.mUpdatedIndexNodes.begin(), rhs.mUpdatedIndexNodes.end()); + + mNewMaskTree.merge(rhs.mNewMaskTree); + } + + void operator()(const tbb::blocked_range& range) + { + tree::ValueAccessor newMaskAcc(mNewMaskTree); + tree::ValueAccessor distAcc(*mDistTree); + tree::ValueAccessor indexAcc(*mIndexTree); + + std::vector fragments; + fragments.reserve(256); + + LeafNodeType * newDistNodePt = NULL; + Int32LeafNodeType * newIndexNodePt = NULL; + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + BoolLeafNodeType& maskNode = *mMaskNodes[n]; + if (maskNode.isEmpty()) continue; + + // Setup local caches + + const Coord& origin = maskNode.origin(); + + LeafNodeType * distNodePt = distAcc.probeLeaf(origin); + Int32LeafNodeType * indexNodePt = indexAcc.probeLeaf(origin); + + assert(!distNodePt == !indexNodePt); + + bool usingNewNodes = false; + + if (!distNodePt && !indexNodePt) { + + const ValueType backgroundDist = distAcc.getValue(origin); + + if (!newDistNodePt && !newIndexNodePt) { + newDistNodePt = new LeafNodeType(origin, backgroundDist); + newIndexNodePt = new Int32LeafNodeType(origin, indexAcc.getValue(origin)); + } else { + + if ((backgroundDist < ValueType(0.0)) != + (newDistNodePt->getValue(0) < ValueType(0.0))) { + newDistNodePt->buffer().fill(backgroundDist); + } + + newDistNodePt->setOrigin(origin); + newIndexNodePt->setOrigin(origin); + } + + distNodePt = newDistNodePt; + indexNodePt = newIndexNodePt; + + usingNewNodes = true; + } + + + // Gather neighbour information + + CoordBBox bbox(Coord::max(), Coord::min()); + for (typename BoolLeafNodeType::ValueOnIter it = maskNode.beginValueOn(); it; ++it) { + bbox.expand(it.getCoord()); + } + + bbox.expand(1); + + gatherFragments(fragments, bbox, distAcc, indexAcc); + + + // Compute first voxel layer + + bbox = maskNode.getNodeBoundingBox(); + NodeMaskType mask; + bool updatedLeafNodes = false; + + for (typename BoolLeafNodeType::ValueOnIter it = maskNode.beginValueOn(); it; ++it) { + + const Coord ijk = it.getCoord(); + + if (updateVoxel(ijk, 5, fragments, *distNodePt, *indexNodePt, &updatedLeafNodes)) { + + for (Int32 i = 0; i < 6; ++i) { + const Coord nijk = ijk + util::COORD_OFFSETS[i]; + if (bbox.isInside(nijk)) { + mask.setOn(BoolLeafNodeType::coordToOffset(nijk)); + } else { + newMaskAcc.setValueOn(nijk); + } + } + + for (Int32 i = 6; i < 26; ++i) { + const Coord nijk = ijk + util::COORD_OFFSETS[i]; + if (bbox.isInside(nijk)) { + mask.setOn(BoolLeafNodeType::coordToOffset(nijk)); + } + } + } + } + + if (updatedLeafNodes) { + + // Compute second voxel layer + mask -= indexNodePt->getValueMask(); + + for (typename NodeMaskType::OnIterator it = mask.beginOn(); it; ++it) { + + const Index pos = it.pos(); + const Coord ijk = maskNode.origin() + LeafNodeType::offsetToLocalCoord(pos); + + if (updateVoxel(ijk, 6, fragments, *distNodePt, *indexNodePt)) { + for (Int32 i = 0; i < 6; ++i) { + newMaskAcc.setValueOn(ijk + util::COORD_OFFSETS[i]); + } + } + } + + // Export new distance values + if (usingNewNodes) { + distNodePt->topologyUnion(*indexNodePt); + + mDistNodes.push_back(distNodePt); + mIndexNodes.push_back(indexNodePt); + + newDistNodePt = NULL; + newIndexNodePt = NULL; + } else { + mUpdatedDistNodes.push_back(distNodePt); + mUpdatedIndexNodes.push_back(indexNodePt); + } + } + } // end leafnode loop + } + + ////////// + + BoolTreeType& newMaskTree() { return mNewMaskTree; } + + std::vector& newDistNodes() { return mDistNodes; } + std::vector& updatedDistNodes() { return mUpdatedDistNodes; } + + std::vector& newIndexNodes() { return mIndexNodes; } + std::vector& updatedIndexNodes() { return mUpdatedIndexNodes; } + +private: + + /// @note The output fragment list is ordered by the primitive index + void + gatherFragments(std::vector& fragments, const CoordBBox& bbox, + tree::ValueAccessor& distAcc, tree::ValueAccessor& indexAcc) + { + fragments.clear(); + const Coord nodeMin = bbox.min() & ~(LeafNodeType::DIM - 1); + const Coord nodeMax = bbox.max() & ~(LeafNodeType::DIM - 1); + + CoordBBox region; + Coord ijk; + + for (ijk[0] = nodeMin[0]; ijk[0] <= nodeMax[0]; ijk[0] += LeafNodeType::DIM) { + for (ijk[1] = nodeMin[1]; ijk[1] <= nodeMax[1]; ijk[1] += LeafNodeType::DIM) { + for (ijk[2] = nodeMin[2]; ijk[2] <= nodeMax[2]; ijk[2] += LeafNodeType::DIM) { + if (LeafNodeType* distleaf = distAcc.probeLeaf(ijk)) { + region.min() = Coord::maxComponent(bbox.min(), ijk); + region.max() = Coord::minComponent(bbox.max(), + ijk.offsetBy(LeafNodeType::DIM - 1)); + gatherFragments(fragments, region, *distleaf, *indexAcc.probeLeaf(ijk)); + } + } + } + } + + std::sort(fragments.begin(), fragments.end()); + } + + void + gatherFragments(std::vector& fragments, const CoordBBox& bbox, + const LeafNodeType& distLeaf, const Int32LeafNodeType& idxLeaf) const + { + const typename LeafNodeType::NodeMaskType& mask = distLeaf.getValueMask(); + const ValueType* distData = distLeaf.buffer().data(); + const Int32* idxData = idxLeaf.buffer().data(); + + for (int x = bbox.min()[0]; x <= bbox.max()[0]; ++x) { + const Index xPos = (x & (LeafNodeType::DIM - 1u)) << (2 * LeafNodeType::LOG2DIM); + for (int y = bbox.min()[1]; y <= bbox.max()[1]; ++y) { + const Index yPos = xPos + ((y & (LeafNodeType::DIM - 1u)) << LeafNodeType::LOG2DIM); + for (int z = bbox.min()[2]; z <= bbox.max()[2]; ++z) { + const Index pos = yPos + (z & (LeafNodeType::DIM - 1u)); + if (mask.isOn(pos)) { + fragments.push_back(Fragment(idxData[pos],x,y,z, std::abs(distData[pos]))); + } + } + } + } + } + + /// @note This method expects the fragment list to be ordered by the primitive index + /// to avoid redundant distance computations. + ValueType + computeDistance(const Coord& ijk, const Int32 manhattanLimit, + const std::vector& fragments, Int32& closestPrimIdx) const + { + Vec3d a, b, c, uvw, voxelCenter(ijk[0], ijk[1], ijk[2]); + double primDist, tmpDist, dist = std::numeric_limits::max(); + Int32 lastIdx = Int32(util::INVALID_IDX); + + for (size_t n = 0, N = fragments.size(); n < N; ++n) { + + const Fragment& fragment = fragments[n]; + if (lastIdx == fragment.idx) continue; + + const Int32 dx = std::abs(fragment.x - ijk[0]); + const Int32 dy = std::abs(fragment.y - ijk[1]); + const Int32 dz = std::abs(fragment.z - ijk[2]); + + const Int32 manhattan = dx + dy + dz; + if (manhattan > manhattanLimit) continue; + + lastIdx = fragment.idx; + + const size_t polygon = size_t(lastIdx); + + mMesh->getIndexSpacePoint(polygon, 0, a); + mMesh->getIndexSpacePoint(polygon, 1, b); + mMesh->getIndexSpacePoint(polygon, 2, c); + + primDist = (voxelCenter - + closestPointOnTriangleToPoint(a, c, b, voxelCenter, uvw)).lengthSqr(); + + // Split quad into a second triangle + if (4 == mMesh->vertexCount(polygon)) { + + mMesh->getIndexSpacePoint(polygon, 3, b); + + tmpDist = (voxelCenter - closestPointOnTriangleToPoint( + a, b, c, voxelCenter, uvw)).lengthSqr(); + + if (tmpDist < primDist) primDist = tmpDist; + } + + if (primDist < dist) { + dist = primDist; + closestPrimIdx = lastIdx; + } + } + + return ValueType(std::sqrt(dist)) * mVoxelSize; + } + + /// @note Returns true if the current voxel was updated and neighbouring + /// voxels need to be evaluated. + bool + updateVoxel(const Coord& ijk, const Int32 manhattanLimit, + const std::vector& fragments, + LeafNodeType& distLeaf, Int32LeafNodeType& idxLeaf, bool* updatedLeafNodes = NULL) + { + Int32 closestPrimIdx = 0; + const ValueType distance = computeDistance(ijk, manhattanLimit, fragments, closestPrimIdx); + + const Index pos = LeafNodeType::coordToOffset(ijk); + const bool inside = distLeaf.getValue(pos) < ValueType(0.0); + + bool activateNeighbourVoxels = false; + + if (!inside && distance < mExteriorBandWidth) { + if (updatedLeafNodes) *updatedLeafNodes = true; + activateNeighbourVoxels = (distance + mVoxelSize) < mExteriorBandWidth; + distLeaf.setValueOnly(pos, distance); + idxLeaf.setValueOn(pos, closestPrimIdx); + } else if (inside && distance < mInteriorBandWidth) { + if (updatedLeafNodes) *updatedLeafNodes = true; + activateNeighbourVoxels = (distance + mVoxelSize) < mInteriorBandWidth; + distLeaf.setValueOnly(pos, -distance); + idxLeaf.setValueOn(pos, closestPrimIdx); + } + + return activateNeighbourVoxels; + } + + ////////// + + BoolLeafNodeType ** const mMaskNodes; + BoolTreeType * const mMaskTree; + TreeType * const mDistTree; + Int32TreeType * const mIndexTree; + + MeshDataAdapter const * const mMesh; + + BoolTreeType mNewMaskTree; + + std::vector mDistNodes, mUpdatedDistNodes; + std::vector mIndexNodes, mUpdatedIndexNodes; + + const ValueType mExteriorBandWidth, mInteriorBandWidth, mVoxelSize; +}; // struct ExpandNarrowband + + +template +struct AddNodes { + typedef typename TreeType::LeafNodeType LeafNodeType; + + AddNodes(TreeType& tree, std::vector& nodes) + : mTree(&tree) , mNodes(&nodes) + { + } + + void operator()() const { + tree::ValueAccessor acc(*mTree); + std::vector& nodes = *mNodes; + for (size_t n = 0, N = nodes.size(); n < N; ++n) { + acc.addLeaf(nodes[n]); + } + } + + TreeType * const mTree; + std::vector * const mNodes; +}; // AddNodes + + +template +inline void +expandNarrowband( + TreeType& distTree, + Int32TreeType& indexTree, + BoolTreeType& maskTree, + std::vector& maskNodes, + const MeshDataAdapter& mesh, + typename TreeType::ValueType exteriorBandWidth, + typename TreeType::ValueType interiorBandWidth, + typename TreeType::ValueType voxelSize) +{ + ExpandNarrowband expandOp(maskNodes, maskTree, + distTree, indexTree, mesh, exteriorBandWidth, interiorBandWidth, voxelSize); + + tbb::parallel_reduce(tbb::blocked_range(0, maskNodes.size()), expandOp); + + tbb::parallel_for(tbb::blocked_range(0, expandOp.updatedIndexNodes().size()), + UnionValueMasks( + expandOp.updatedDistNodes(), expandOp.updatedIndexNodes())); + + tbb::task_group tasks; + tasks.run(AddNodes(distTree, expandOp.newDistNodes())); + tasks.run(AddNodes(indexTree, expandOp.newIndexNodes())); + tasks.wait(); + + maskTree.clear(); + maskTree.merge(expandOp.newMaskTree()); +} + + +//////////////////////////////////////// + + +// Transform values (sqrt, world space scaling and sign flip if sdf) +template +struct TransformValues +{ + typedef typename TreeType::LeafNodeType LeafNodeType; + typedef typename TreeType::ValueType ValueType; + + TransformValues(std::vector& nodes, + ValueType voxelSize, bool unsignedDist) + : mNodes(&nodes[0]) + , mVoxelSize(voxelSize) + , mUnsigned(unsignedDist) + { + } + + void operator()(const tbb::blocked_range& range) const { + + typename LeafNodeType::ValueOnIter iter; + + const bool udf = mUnsigned; + const ValueType w[2] = { -mVoxelSize, mVoxelSize }; + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + for (iter = mNodes[n]->beginValueOn(); iter; ++iter) { + ValueType& val = const_cast(iter.getValue()); + val = w[udf || (val < ValueType(0.0))] * std::sqrt(std::abs(val)); + } + } + } + +private: + LeafNodeType * * const mNodes; + const ValueType mVoxelSize; + const bool mUnsigned; +}; + + +// Inactivate values outside the (exBandWidth, inBandWidth) range. +template +struct InactivateValues +{ + typedef typename TreeType::LeafNodeType LeafNodeType; + typedef typename TreeType::ValueType ValueType; + + InactivateValues(std::vector& nodes, + ValueType exBandWidth, ValueType inBandWidth) + : mNodes(nodes.empty() ? NULL : &nodes[0]) + , mExBandWidth(exBandWidth) + , mInBandWidth(inBandWidth) + { + } + + void operator()(const tbb::blocked_range& range) const { + + typename LeafNodeType::ValueOnIter iter; + const ValueType exVal = mExBandWidth; + const ValueType inVal = -mInBandWidth; + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + for (iter = mNodes[n]->beginValueOn(); iter; ++iter) { + + ValueType& val = const_cast(iter.getValue()); + + const bool inside = val < ValueType(0.0); + + if (inside && !(val > inVal)) { + val = inVal; + iter.setValueOff(); + } else if (!inside && !(val < exVal)) { + val = exVal; + iter.setValueOff(); + } + } + } + } + +private: + LeafNodeType * * const mNodes; + const ValueType mExBandWidth, mInBandWidth; +}; + + +template +struct OffsetValues +{ + typedef typename TreeType::LeafNodeType LeafNodeType; + typedef typename TreeType::ValueType ValueType; + + OffsetValues(std::vector& nodes, ValueType offset) + : mNodes(nodes.empty() ? NULL : &nodes[0]), mOffset(offset) + { + } + + void operator()(const tbb::blocked_range& range) const { + + const ValueType offset = mOffset; + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + typename LeafNodeType::ValueOnIter iter = mNodes[n]->beginValueOn(); + + for (; iter; ++iter) { + ValueType& val = const_cast(iter.getValue()); + val += offset; + } + } + } + +private: + LeafNodeType * * const mNodes; + const ValueType mOffset; +}; + + +template +struct Renormalize +{ + typedef typename TreeType::LeafNodeType LeafNodeType; + typedef typename TreeType::ValueType ValueType; + + Renormalize(const TreeType& tree, const std::vector& nodes, ValueType* buffer, ValueType voxelSize) + : mTree(&tree) + , mNodes(nodes.empty() ? NULL : &nodes[0]) + , mBuffer(buffer) + , mVoxelSize(voxelSize) + { + } + + void operator()(const tbb::blocked_range& range) const + { + typedef math::Vec3 Vec3Type; + + tree::ValueAccessor acc(*mTree); + + Coord ijk; + Vec3Type up, down; + + const ValueType dx = mVoxelSize, invDx = ValueType(1.0) / mVoxelSize; + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + ValueType* bufferData = &mBuffer[n * LeafNodeType::SIZE]; + + typename LeafNodeType::ValueOnCIter iter = mNodes[n]->cbeginValueOn(); + for (; iter; ++iter) { + + const ValueType phi0 = *iter; + + ijk = iter.getCoord(); + + up[0] = acc.getValue(ijk.offsetBy(1, 0, 0)) - phi0; + up[1] = acc.getValue(ijk.offsetBy(0, 1, 0)) - phi0; + up[2] = acc.getValue(ijk.offsetBy(0, 0, 1)) - phi0; + + down[0] = phi0 - acc.getValue(ijk.offsetBy(-1, 0, 0)); + down[1] = phi0 - acc.getValue(ijk.offsetBy(0, -1, 0)); + down[2] = phi0 - acc.getValue(ijk.offsetBy(0, 0, -1)); + + const ValueType normSqGradPhi = math::GodunovsNormSqrd(phi0 > 0.0, down, up); + + const ValueType diff = math::Sqrt(normSqGradPhi) * invDx - ValueType(1.0); + const ValueType S = phi0 / (math::Sqrt(math::Pow2(phi0) + normSqGradPhi)); + + bufferData[iter.pos()] = phi0 - dx * S * diff; + } + } + } + +private: + TreeType const * const mTree; + LeafNodeType const * const * const mNodes; + ValueType * const mBuffer; + + const ValueType mVoxelSize; +}; + + +template +struct MinCombine +{ + typedef typename TreeType::LeafNodeType LeafNodeType; + typedef typename TreeType::ValueType ValueType; + + MinCombine(std::vector& nodes, const ValueType* buffer) + : mNodes(nodes.empty() ? NULL : &nodes[0]), mBuffer(buffer) + { + } + + void operator()(const tbb::blocked_range& range) const { + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + const ValueType* bufferData = &mBuffer[n * LeafNodeType::SIZE]; + + typename LeafNodeType::ValueOnIter iter = mNodes[n]->beginValueOn(); + + for (; iter; ++iter) { + ValueType& val = const_cast(iter.getValue()); + val = std::min(val, bufferData[iter.pos()]); + } + } + } + +private: + LeafNodeType * * const mNodes; + ValueType const * const mBuffer; +}; + + +} // mesh_to_volume_internal namespace + + +//////////////////////////////////////// + +// Utility method implementation + + +template +inline void +traceExteriorBoundaries(FloatTreeT& tree) +{ + typedef mesh_to_volume_internal::LeafNodeConnectivityTable ConnectivityTable; + + ConnectivityTable nodeConnectivity(tree); + + std::vector zStartNodes, yStartNodes, xStartNodes; + + for (size_t n = 0; n < nodeConnectivity.size(); ++n) { + if (ConnectivityTable::INVALID_OFFSET == nodeConnectivity.offsetsPrevX()[n]) { + xStartNodes.push_back(n); + } + + if (ConnectivityTable::INVALID_OFFSET == nodeConnectivity.offsetsPrevY()[n]) { + yStartNodes.push_back(n); + } + + if (ConnectivityTable::INVALID_OFFSET == nodeConnectivity.offsetsPrevZ()[n]) { + zStartNodes.push_back(n); + } + } + + typedef mesh_to_volume_internal::SweepExteriorSign SweepingOp; + + tbb::parallel_for(tbb::blocked_range(0, zStartNodes.size()), + SweepingOp(SweepingOp::Z_AXIS, zStartNodes, nodeConnectivity)); + + tbb::parallel_for(tbb::blocked_range(0, yStartNodes.size()), + SweepingOp(SweepingOp::Y_AXIS, yStartNodes, nodeConnectivity)); + + tbb::parallel_for(tbb::blocked_range(0, xStartNodes.size()), + SweepingOp(SweepingOp::X_AXIS, xStartNodes, nodeConnectivity)); + + const size_t numLeafNodes = nodeConnectivity.size(); + const size_t numVoxels = numLeafNodes * FloatTreeT::LeafNodeType::SIZE; + + boost::scoped_array changedNodeMaskA(new bool[numLeafNodes]); + boost::scoped_array changedNodeMaskB(new bool[numLeafNodes]); + boost::scoped_array changedVoxelMask(new bool[numVoxels]); + + memset(changedNodeMaskA.get(), 1, sizeof(bool) * numLeafNodes); + mesh_to_volume_internal::fillArray(changedVoxelMask.get(), false, numVoxels); + + const tbb::blocked_range nodeRange(0, numLeafNodes); + + bool nodesUpdated = false; + do { + tbb::parallel_for(nodeRange, mesh_to_volume_internal::SeedFillExteriorSign( + nodeConnectivity.nodes(), changedNodeMaskA.get())); + + tbb::parallel_for(nodeRange, mesh_to_volume_internal::SeedPoints(nodeConnectivity, + changedNodeMaskA.get(), changedNodeMaskB.get(), changedVoxelMask.get())); + + changedNodeMaskA.swap(changedNodeMaskB); + + nodesUpdated = false; + for (size_t n = 0; n < numLeafNodes; ++n) { + nodesUpdated |= changedNodeMaskA[n]; + if (nodesUpdated) break; + } + + if (nodesUpdated) { + tbb::parallel_for(nodeRange, mesh_to_volume_internal::SyncVoxelMask( + nodeConnectivity.nodes(), changedNodeMaskA.get(), changedVoxelMask.get())); + } + } while (nodesUpdated); + +} // void traceExteriorBoundaries() + + +//////////////////////////////////////// + + +template +inline typename GridType::Ptr +meshToVolume( + Interrupter& interrupter, + const MeshDataAdapter& mesh, + const math::Transform& transform, + float exteriorBandWidth, + float interiorBandWidth, + int flags, + typename GridType::template ValueConverter::Type * polygonIndexGrid) +{ + typedef typename GridType::Ptr GridTypePtr; + typedef typename GridType::TreeType TreeType; + typedef typename TreeType::LeafNodeType LeafNodeType; + typedef typename GridType::ValueType ValueType; + + typedef typename GridType::template ValueConverter::Type Int32GridType; + typedef typename Int32GridType::TreeType Int32TreeType; + + typedef typename TreeType::template ValueConverter::Type BoolTreeType; + + ////////// + + // Setup + + GridTypePtr distGrid(new GridType(std::numeric_limits::max())); + distGrid->setTransform(transform.copy()); + + ValueType exteriorWidth = ValueType(exteriorBandWidth); + ValueType interiorWidth = ValueType(interiorBandWidth); + + // Note: inf interior width is all right, this value makes the converter fill + // interior regions with distance values. + if (!boost::math::isfinite(exteriorWidth) || boost::math::isnan(interiorWidth)) { + std::stringstream msg; + msg << "Illegal narrow band width: exterior = " << exteriorWidth + << ", interior = " << interiorWidth; + OPENVDB_LOG_DEBUG(msg.str()); + return distGrid; + } + + const ValueType voxelSize = ValueType(transform.voxelSize()[0]); + + if (!boost::math::isfinite(voxelSize) || math::isZero(voxelSize)) { + std::stringstream msg; + msg << "Illegal transform, voxel size = " << voxelSize; + OPENVDB_LOG_DEBUG(msg.str()); + return distGrid; + } + + // Convert narrow band width from voxel units to world space units. + exteriorWidth *= voxelSize; + // Avoid the unit conversion if the interior band width is set to + // inf or std::numeric_limits::max(). + if (interiorWidth < std::numeric_limits::max()) { + interiorWidth *= voxelSize; + } + + const bool computeSignedDistanceField = (flags & UNSIGNED_DISTANCE_FIELD) == 0; + const bool removeIntersectingVoxels = (flags & DISABLE_INTERSECTING_VOXEL_REMOVAL) == 0; + const bool renormalizeValues = (flags & DISABLE_RENORMALIZATION) == 0; + const bool trimNarrowBand = (flags & DISABLE_NARROW_BAND_TRIMMING) == 0; + + Int32GridType* indexGrid = NULL; + + typename Int32GridType::Ptr temporaryIndexGrid; + + if (polygonIndexGrid) { + indexGrid = polygonIndexGrid; + } else { + temporaryIndexGrid.reset(new Int32GridType(Int32(util::INVALID_IDX))); + indexGrid = temporaryIndexGrid.get(); + } + + indexGrid->newTree(); + indexGrid->setTransform(transform.copy()); + + if (computeSignedDistanceField) { + distGrid->setGridClass(GRID_LEVEL_SET); + } else { + distGrid->setGridClass(GRID_UNKNOWN); + interiorWidth = ValueType(0.0); + } + + TreeType& distTree = distGrid->tree(); + Int32TreeType& indexTree = indexGrid->tree(); + + + ////////// + + // Voxelize mesh + + { + typedef mesh_to_volume_internal::VoxelizationData VoxelizationDataType; + typedef tbb::enumerable_thread_specific DataTable; + + DataTable data; + typedef mesh_to_volume_internal::VoxelizePolygons Voxelizer; + + const tbb::blocked_range polygonRange(0, mesh.polygonCount()); + + tbb::parallel_for(polygonRange, Voxelizer(data, mesh, &interrupter)); + + for (typename DataTable::iterator i = data.begin(); i != data.end(); ++i) { + VoxelizationDataType& dataItem = **i; + mesh_to_volume_internal::combineData( + distTree, indexTree, dataItem.distTree, dataItem.indexTree); + } + } + + // The progress estimates are based on the observed average time for a few different + // test cases and is only intended to provide some rough progression feedback to the user. + if (interrupter.wasInterrupted(30)) return distGrid; + + + ////////// + + // Classify interior and exterior regions + + if (computeSignedDistanceField) { + + // Determines the inside/outside state for the narrow band of voxels. + traceExteriorBoundaries(distTree); + + std::vector nodes; + nodes.reserve(distTree.leafCount()); + distTree.getNodes(nodes); + + const tbb::blocked_range nodeRange(0, nodes.size()); + + typedef mesh_to_volume_internal::ComputeIntersectingVoxelSign SignOp; + + tbb::parallel_for(nodeRange, SignOp(nodes, distTree, indexTree, mesh)); + + if (interrupter.wasInterrupted(45)) return distGrid; + + // Remove voxels created by self intersecting portions of the mesh. + if (removeIntersectingVoxels) { + + tbb::parallel_for(nodeRange, + mesh_to_volume_internal::ValidateIntersectingVoxels(distTree, nodes)); + + tbb::parallel_for(nodeRange, + mesh_to_volume_internal::RemoveSelfIntersectingSurface( + nodes, distTree, indexTree)); + + tools::pruneInactive(distTree, /*threading=*/true); + tools::pruneInactive(indexTree, /*threading=*/true); + } + } + + if (interrupter.wasInterrupted(50)) return distGrid; + + if (distTree.activeVoxelCount() == 0) { + distGrid.reset((new GridType(ValueType(0.0)))); + return distGrid; + } + + // Transform values (world space scaling etc.). + { + std::vector nodes; + nodes.reserve(distTree.leafCount()); + distTree.getNodes(nodes); + + tbb::parallel_for(tbb::blocked_range(0, nodes.size()), + mesh_to_volume_internal::TransformValues( + nodes, voxelSize, !computeSignedDistanceField)); + } + + // Propagate sign information into tile regions. + if (computeSignedDistanceField) { + distTree.root().setBackground(exteriorWidth, /*updateChildNodes=*/false); + tools::signedFloodFillWithValues(distTree, exteriorWidth, -interiorWidth); + } else { + tools::changeBackground(distTree, exteriorWidth); + } + + if (interrupter.wasInterrupted(54)) return distGrid; + + + ////////// + + // Expand the narrow band region + + const ValueType minBandWidth = voxelSize * ValueType(2.0); + + if (interiorWidth > minBandWidth || exteriorWidth > minBandWidth) { + + // Create the initial voxel mask. + BoolTreeType maskTree(false); + + { + std::vector nodes; + nodes.reserve(distTree.leafCount()); + distTree.getNodes(nodes); + + mesh_to_volume_internal::ConstructVoxelMask op(maskTree, distTree, nodes); + tbb::parallel_reduce(tbb::blocked_range(0, nodes.size()), op); + } + + // Progress estimation + unsigned maxIterations = std::numeric_limits::max(); + + float progress = 54.0f, step = 0.0f; + double estimated = + 2.0 * std::ceil((std::max(interiorWidth, exteriorWidth) - minBandWidth) / voxelSize); + + if (estimated < double(maxIterations)) { + maxIterations = unsigned(estimated); + step = 40.0f / float(maxIterations); + } + + std::vector maskNodes; + + unsigned count = 0; + while (true) { + + if (interrupter.wasInterrupted(int(progress))) return distGrid; + + const size_t maskNodeCount = maskTree.leafCount(); + if (maskNodeCount == 0) break; + + maskNodes.clear(); + maskNodes.reserve(maskNodeCount); + maskTree.getNodes(maskNodes); + + const tbb::blocked_range range(0, maskNodes.size()); + + tbb::parallel_for(range, + mesh_to_volume_internal::DiffLeafNodeMask(distTree, maskNodes)); + + mesh_to_volume_internal::expandNarrowband(distTree, indexTree, maskTree, maskNodes, + mesh, exteriorWidth, interiorWidth, voxelSize); + + if ((++count) >= maxIterations) break; + progress += step; + } + } + + if (interrupter.wasInterrupted(94)) return distGrid; + + if (!polygonIndexGrid) indexGrid->clear(); + + + ///////// + + // Renormalize distances to smooth out bumps caused by self intersecting + // and overlapping portions of the mesh and renormalize the level set. + + if (computeSignedDistanceField && renormalizeValues) { + + std::vector nodes; + nodes.reserve(distTree.leafCount()); + distTree.getNodes(nodes); + + boost::scoped_array buffer(new ValueType[LeafNodeType::SIZE * nodes.size()]); + + const ValueType offset = ValueType(0.8 * voxelSize); + + tbb::parallel_for(tbb::blocked_range(0, nodes.size()), + mesh_to_volume_internal::OffsetValues(nodes, -offset)); + + tbb::parallel_for(tbb::blocked_range(0, nodes.size()), + mesh_to_volume_internal::Renormalize( + distTree, nodes, buffer.get(), voxelSize)); + + tbb::parallel_for(tbb::blocked_range(0, nodes.size()), + mesh_to_volume_internal::MinCombine(nodes, buffer.get())); + + tbb::parallel_for(tbb::blocked_range(0, nodes.size()), + mesh_to_volume_internal::OffsetValues( + nodes, offset - mesh_to_volume_internal::Tolerance::epsilon())); + } + + if (interrupter.wasInterrupted(99)) return distGrid; + + + ///////// + + // Remove active voxels that exceed the narrow band limits + + if (trimNarrowBand && std::min(interiorWidth, exteriorWidth) < voxelSize * ValueType(4.0)) { + + std::vector nodes; + nodes.reserve(distTree.leafCount()); + distTree.getNodes(nodes); + + tbb::parallel_for(tbb::blocked_range(0, nodes.size()), + mesh_to_volume_internal::InactivateValues( + nodes, exteriorWidth, computeSignedDistanceField ? interiorWidth : exteriorWidth)); + + tools::pruneLevelSet( + distTree, exteriorWidth, computeSignedDistanceField ? -interiorWidth : -exteriorWidth); + } + + return distGrid; +} + + +template +inline typename GridType::Ptr +meshToVolume( + const MeshDataAdapter& mesh, + const math::Transform& transform, + float exteriorBandWidth, + float interiorBandWidth, + int flags, + typename GridType::template ValueConverter::Type * polygonIndexGrid) +{ + util::NullInterrupter nullInterrupter; + return meshToVolume(nullInterrupter, mesh, transform, + exteriorBandWidth, interiorBandWidth, flags, polygonIndexGrid); +} + + +//////////////////////////////////////// + + +/// @internal This overload is enabled only for grids with a scalar, floating-point ValueType. +template +inline typename boost::enable_if, +typename GridType::Ptr>::type +doMeshConversion( + const openvdb::math::Transform& xform, + const std::vector& points, + const std::vector& triangles, + const std::vector& quads, + float exBandWidth, + float inBandWidth, + bool unsignedDistanceField = false) +{ + if (points.empty()) { + return typename GridType::Ptr(new GridType(typename GridType::ValueType(exBandWidth))); + } + + const size_t numPoints = points.size(); + boost::scoped_array indexSpacePoints(new Vec3s[numPoints]); + + // transform points to local grid index space + tbb::parallel_for(tbb::blocked_range(0, numPoints), + mesh_to_volume_internal::TransformPoints( + &points[0], indexSpacePoints.get(), xform)); + + const int conversionFlags = unsignedDistanceField ? UNSIGNED_DISTANCE_FIELD : 0; + + if (quads.empty()) { + + QuadAndTriangleDataAdapter + mesh(indexSpacePoints.get(), numPoints, &triangles[0], triangles.size()); + + return meshToVolume(mesh, xform, exBandWidth, inBandWidth, conversionFlags); + + } else if (triangles.empty()) { + + QuadAndTriangleDataAdapter + mesh(indexSpacePoints.get(), numPoints, &quads[0], quads.size()); + + return meshToVolume(mesh, xform, exBandWidth, inBandWidth, conversionFlags); + } + + // pack primitives + + const size_t numPrimitives = triangles.size() + quads.size(); + boost::scoped_array prims(new Vec4I[numPrimitives]); + + for (size_t n = 0, N = triangles.size(); n < N; ++n) { + const Vec3I& triangle = triangles[n]; + Vec4I& prim = prims[n]; + prim[0] = triangle[0]; + prim[1] = triangle[1]; + prim[2] = triangle[2]; + prim[3] = util::INVALID_IDX; + } + + const size_t offset = triangles.size(); + for (size_t n = 0, N = quads.size(); n < N; ++n) { + prims[offset + n] = quads[n]; + } + + QuadAndTriangleDataAdapter + mesh(indexSpacePoints.get(), numPoints, prims.get(), numPrimitives); + + return meshToVolume(mesh, xform, exBandWidth, inBandWidth, conversionFlags); +} + + +/// @internal This overload is enabled only for grids that do not have a scalar, +/// floating-point ValueType. +template +inline typename boost::disable_if, +typename GridType::Ptr>::type +doMeshConversion( + const math::Transform& /*xform*/, + const std::vector& /*points*/, + const std::vector& /*triangles*/, + const std::vector& /*quads*/, + float /*exBandWidth*/, + float /*inBandWidth*/, + bool /*unsignedDistanceField*/ = false) +{ + OPENVDB_THROW(TypeError, + "mesh to volume conversion is supported only for scalar floating-point grids"); +} + + +//////////////////////////////////////// + + +template +inline typename GridType::Ptr +meshToLevelSet( + const openvdb::math::Transform& xform, + const std::vector& points, + const std::vector& triangles, + float halfWidth) +{ + std::vector quads(0); + return doMeshConversion(xform, points, triangles, quads, + halfWidth, halfWidth); +} + + +template +inline typename GridType::Ptr +meshToLevelSet( + const openvdb::math::Transform& xform, + const std::vector& points, + const std::vector& quads, + float halfWidth) +{ + std::vector triangles(0); + return doMeshConversion(xform, points, triangles, quads, + halfWidth, halfWidth); +} + + +template +inline typename GridType::Ptr +meshToLevelSet( + const openvdb::math::Transform& xform, + const std::vector& points, + const std::vector& triangles, + const std::vector& quads, + float halfWidth) +{ + return doMeshConversion(xform, points, triangles, quads, + halfWidth, halfWidth); +} + + +template +inline typename GridType::Ptr +meshToSignedDistanceField( + const openvdb::math::Transform& xform, + const std::vector& points, + const std::vector& triangles, + const std::vector& quads, + float exBandWidth, + float inBandWidth) +{ + return doMeshConversion(xform, points, triangles, + quads, exBandWidth, inBandWidth); +} + + +template +inline typename GridType::Ptr +meshToUnsignedDistanceField( + const openvdb::math::Transform& xform, + const std::vector& points, + const std::vector& triangles, + const std::vector& quads, + float bandWidth) +{ + return doMeshConversion(xform, points, triangles, quads, + bandWidth, bandWidth, true); +} + + +//////////////////////////////////////////////////////////////////////////////// + + +// Required by several of the tree nodes +inline std::ostream& +operator<<(std::ostream& ostr, const MeshToVoxelEdgeData::EdgeData& rhs) +{ + ostr << "{[ " << rhs.mXPrim << ", " << rhs.mXDist << "]"; + ostr << " [ " << rhs.mYPrim << ", " << rhs.mYDist << "]"; + ostr << " [ " << rhs.mZPrim << ", " << rhs.mZDist << "]}"; + return ostr; +} + +// Required by math::Abs +inline MeshToVoxelEdgeData::EdgeData +Abs(const MeshToVoxelEdgeData::EdgeData& x) +{ + return x; +} + + +//////////////////////////////////////// + + +class MeshToVoxelEdgeData::GenEdgeData +{ +public: + + GenEdgeData( + const std::vector& pointList, + const std::vector& polygonList); + + void run(bool threaded = true); + + GenEdgeData(GenEdgeData& rhs, tbb::split); + inline void operator() (const tbb::blocked_range &range); + inline void join(GenEdgeData& rhs); + + inline TreeType& tree() { return mTree; } + +private: + void operator=(const GenEdgeData&) {} + + struct Primitive { Vec3d a, b, c, d; Int32 index; }; + + template + inline void voxelize(const Primitive&); + + template + inline bool evalPrimitive(const Coord&, const Primitive&); + + inline bool rayTriangleIntersection( const Vec3d& origin, const Vec3d& dir, + const Vec3d& a, const Vec3d& b, const Vec3d& c, double& t); + + + TreeType mTree; + Accessor mAccessor; + + const std::vector& mPointList; + const std::vector& mPolygonList; + + // Used internally for acceleration + typedef TreeType::ValueConverter::Type IntTreeT; + IntTreeT mLastPrimTree; + tree::ValueAccessor mLastPrimAccessor; +}; // class MeshToVoxelEdgeData::GenEdgeData + + +inline +MeshToVoxelEdgeData::GenEdgeData::GenEdgeData( + const std::vector& pointList, + const std::vector& polygonList) + : mTree(EdgeData()) + , mAccessor(mTree) + , mPointList(pointList) + , mPolygonList(polygonList) + , mLastPrimTree(Int32(util::INVALID_IDX)) + , mLastPrimAccessor(mLastPrimTree) +{ +} + + +inline +MeshToVoxelEdgeData::GenEdgeData::GenEdgeData(GenEdgeData& rhs, tbb::split) + : mTree(EdgeData()) + , mAccessor(mTree) + , mPointList(rhs.mPointList) + , mPolygonList(rhs.mPolygonList) + , mLastPrimTree(Int32(util::INVALID_IDX)) + , mLastPrimAccessor(mLastPrimTree) +{ +} + + +inline void +MeshToVoxelEdgeData::GenEdgeData::run(bool threaded) +{ + if (threaded) { + tbb::parallel_reduce(tbb::blocked_range(0, mPolygonList.size()), *this); + } else { + (*this)(tbb::blocked_range(0, mPolygonList.size())); + } +} + + +inline void +MeshToVoxelEdgeData::GenEdgeData::join(GenEdgeData& rhs) +{ + typedef TreeType::RootNodeType RootNodeType; + typedef RootNodeType::NodeChainType NodeChainType; + BOOST_STATIC_ASSERT(boost::mpl::size::value > 1); + typedef boost::mpl::at >::type InternalNodeType; + + Coord ijk; + Index offset; + + rhs.mTree.clearAllAccessors(); + + TreeType::LeafIter leafIt = rhs.mTree.beginLeaf(); + for ( ; leafIt; ++leafIt) { + ijk = leafIt->origin(); + + TreeType::LeafNodeType* lhsLeafPt = mTree.probeLeaf(ijk); + + if (!lhsLeafPt) { + + mAccessor.addLeaf(rhs.mAccessor.probeLeaf(ijk)); + InternalNodeType* node = rhs.mAccessor.getNode(); + node->stealNode(ijk, EdgeData(), false); + rhs.mAccessor.clear(); + + } else { + + TreeType::LeafNodeType::ValueOnCIter it = leafIt->cbeginValueOn(); + for ( ; it; ++it) { + + offset = it.pos(); + const EdgeData& rhsValue = it.getValue(); + + if (!lhsLeafPt->isValueOn(offset)) { + lhsLeafPt->setValueOn(offset, rhsValue); + } else { + + EdgeData& lhsValue = const_cast(lhsLeafPt->getValue(offset)); + + if (rhsValue.mXDist < lhsValue.mXDist) { + lhsValue.mXDist = rhsValue.mXDist; + lhsValue.mXPrim = rhsValue.mXPrim; + } + + if (rhsValue.mYDist < lhsValue.mYDist) { + lhsValue.mYDist = rhsValue.mYDist; + lhsValue.mYPrim = rhsValue.mYPrim; + } + + if (rhsValue.mZDist < lhsValue.mZDist) { + lhsValue.mZDist = rhsValue.mZDist; + lhsValue.mZPrim = rhsValue.mZPrim; + } + + } + } // end value iteration + } + } // end leaf iteration +} + + +inline void +MeshToVoxelEdgeData::GenEdgeData::operator()(const tbb::blocked_range &range) +{ + Primitive prim; + + for (size_t n = range.begin(); n < range.end(); ++n) { + + const Vec4I& verts = mPolygonList[n]; + + prim.index = Int32(n); + prim.a = Vec3d(mPointList[verts[0]]); + prim.b = Vec3d(mPointList[verts[1]]); + prim.c = Vec3d(mPointList[verts[2]]); + + if (util::INVALID_IDX != verts[3]) { + prim.d = Vec3d(mPointList[verts[3]]); + voxelize(prim); + } else { + voxelize(prim); + } + } +} + + +template +inline void +MeshToVoxelEdgeData::GenEdgeData::voxelize(const Primitive& prim) +{ + std::deque coordList; + Coord ijk, nijk; + + ijk = Coord::floor(prim.a); + coordList.push_back(ijk); + + evalPrimitive(ijk, prim); + + while (!coordList.empty()) { + + ijk = coordList.back(); + coordList.pop_back(); + + for (Int32 i = 0; i < 26; ++i) { + nijk = ijk + util::COORD_OFFSETS[i]; + + if (prim.index != mLastPrimAccessor.getValue(nijk)) { + mLastPrimAccessor.setValue(nijk, prim.index); + if(evalPrimitive(nijk, prim)) coordList.push_back(nijk); + } + } + } +} + + +template +inline bool +MeshToVoxelEdgeData::GenEdgeData::evalPrimitive(const Coord& ijk, const Primitive& prim) +{ + Vec3d uvw, org(ijk[0], ijk[1], ijk[2]); + bool intersecting = false; + double t; + + EdgeData edgeData; + mAccessor.probeValue(ijk, edgeData); + + // Evaluate first triangle + double dist = (org - + closestPointOnTriangleToPoint(prim.a, prim.c, prim.b, org, uvw)).lengthSqr(); + + if (rayTriangleIntersection(org, Vec3d(1.0, 0.0, 0.0), prim.a, prim.c, prim.b, t)) { + if (t < edgeData.mXDist) { + edgeData.mXDist = float(t); + edgeData.mXPrim = prim.index; + intersecting = true; + } + } + + if (rayTriangleIntersection(org, Vec3d(0.0, 1.0, 0.0), prim.a, prim.c, prim.b, t)) { + if (t < edgeData.mYDist) { + edgeData.mYDist = float(t); + edgeData.mYPrim = prim.index; + intersecting = true; + } + } + + if (rayTriangleIntersection(org, Vec3d(0.0, 0.0, 1.0), prim.a, prim.c, prim.b, t)) { + if (t < edgeData.mZDist) { + edgeData.mZDist = float(t); + edgeData.mZPrim = prim.index; + intersecting = true; + } + } + + if (IsQuad) { + // Split quad into a second triangle and calculate distance. + double secondDist = (org - + closestPointOnTriangleToPoint(prim.a, prim.d, prim.c, org, uvw)).lengthSqr(); + + if (secondDist < dist) dist = secondDist; + + if (rayTriangleIntersection(org, Vec3d(1.0, 0.0, 0.0), prim.a, prim.d, prim.c, t)) { + if (t < edgeData.mXDist) { + edgeData.mXDist = float(t); + edgeData.mXPrim = prim.index; + intersecting = true; + } + } + + if (rayTriangleIntersection(org, Vec3d(0.0, 1.0, 0.0), prim.a, prim.d, prim.c, t)) { + if (t < edgeData.mYDist) { + edgeData.mYDist = float(t); + edgeData.mYPrim = prim.index; + intersecting = true; + } + } + + if (rayTriangleIntersection(org, Vec3d(0.0, 0.0, 1.0), prim.a, prim.d, prim.c, t)) { + if (t < edgeData.mZDist) { + edgeData.mZDist = float(t); + edgeData.mZPrim = prim.index; + intersecting = true; + } + } + } + + if (intersecting) mAccessor.setValue(ijk, edgeData); + + return (dist < 0.86602540378443861); +} + + +inline bool +MeshToVoxelEdgeData::GenEdgeData::rayTriangleIntersection( + const Vec3d& origin, const Vec3d& dir, + const Vec3d& a, const Vec3d& b, const Vec3d& c, + double& t) +{ + // Check if ray is parallel with triangle + + Vec3d e1 = b - a; + Vec3d e2 = c - a; + Vec3d s1 = dir.cross(e2); + + double divisor = s1.dot(e1); + if (!(std::abs(divisor) > 0.0)) return false; + + // Compute barycentric coordinates + + double inv_divisor = 1.0 / divisor; + Vec3d d = origin - a; + double b1 = d.dot(s1) * inv_divisor; + + if (b1 < 0.0 || b1 > 1.0) return false; + + Vec3d s2 = d.cross(e1); + double b2 = dir.dot(s2) * inv_divisor; + + if (b2 < 0.0 || (b1 + b2) > 1.0) return false; + + // Compute distance to intersection point + + t = e2.dot(s2) * inv_divisor; + return (t < 0.0) ? false : true; +} + + +//////////////////////////////////////// + + +inline +MeshToVoxelEdgeData::MeshToVoxelEdgeData() + : mTree(EdgeData()) +{ +} + + +inline void +MeshToVoxelEdgeData::convert( + const std::vector& pointList, + const std::vector& polygonList) +{ + GenEdgeData converter(pointList, polygonList); + converter.run(); + + mTree.clear(); + mTree.merge(converter.tree()); +} + + +inline void +MeshToVoxelEdgeData::getEdgeData( + Accessor& acc, + const Coord& ijk, + std::vector& points, + std::vector& primitives) +{ + EdgeData data; + Vec3d point; + + Coord coord = ijk; + + if (acc.probeValue(coord, data)) { + + if (data.mXPrim != util::INVALID_IDX) { + point[0] = double(coord[0]) + data.mXDist; + point[1] = double(coord[1]); + point[2] = double(coord[2]); + + points.push_back(point); + primitives.push_back(data.mXPrim); + } + + if (data.mYPrim != util::INVALID_IDX) { + point[0] = double(coord[0]); + point[1] = double(coord[1]) + data.mYDist; + point[2] = double(coord[2]); + + points.push_back(point); + primitives.push_back(data.mYPrim); + } + + if (data.mZPrim != util::INVALID_IDX) { + point[0] = double(coord[0]); + point[1] = double(coord[1]); + point[2] = double(coord[2]) + data.mZDist; + + points.push_back(point); + primitives.push_back(data.mZPrim); + } + + } + + coord[0] += 1; + + if (acc.probeValue(coord, data)) { + + if (data.mYPrim != util::INVALID_IDX) { + point[0] = double(coord[0]); + point[1] = double(coord[1]) + data.mYDist; + point[2] = double(coord[2]); + + points.push_back(point); + primitives.push_back(data.mYPrim); + } + + if (data.mZPrim != util::INVALID_IDX) { + point[0] = double(coord[0]); + point[1] = double(coord[1]); + point[2] = double(coord[2]) + data.mZDist; + + points.push_back(point); + primitives.push_back(data.mZPrim); + } + } + + coord[2] += 1; + + if (acc.probeValue(coord, data)) { + if (data.mYPrim != util::INVALID_IDX) { + point[0] = double(coord[0]); + point[1] = double(coord[1]) + data.mYDist; + point[2] = double(coord[2]); + + points.push_back(point); + primitives.push_back(data.mYPrim); + } + } + + coord[0] -= 1; + + if (acc.probeValue(coord, data)) { + + if (data.mXPrim != util::INVALID_IDX) { + point[0] = double(coord[0]) + data.mXDist; + point[1] = double(coord[1]); + point[2] = double(coord[2]); + + points.push_back(point); + primitives.push_back(data.mXPrim); + } + + if (data.mYPrim != util::INVALID_IDX) { + point[0] = double(coord[0]); + point[1] = double(coord[1]) + data.mYDist; + point[2] = double(coord[2]); + + points.push_back(point); + primitives.push_back(data.mYPrim); + } + } + + + coord[1] += 1; + + if (acc.probeValue(coord, data)) { + + if (data.mXPrim != util::INVALID_IDX) { + point[0] = double(coord[0]) + data.mXDist; + point[1] = double(coord[1]); + point[2] = double(coord[2]); + + points.push_back(point); + primitives.push_back(data.mXPrim); + } + } + + coord[2] -= 1; + + if (acc.probeValue(coord, data)) { + + if (data.mXPrim != util::INVALID_IDX) { + point[0] = double(coord[0]) + data.mXDist; + point[1] = double(coord[1]); + point[2] = double(coord[2]); + + points.push_back(point); + primitives.push_back(data.mXPrim); + } + + if (data.mZPrim != util::INVALID_IDX) { + point[0] = double(coord[0]); + point[1] = double(coord[1]); + point[2] = double(coord[2]) + data.mZDist; + + points.push_back(point); + primitives.push_back(data.mZPrim); + } + } + + coord[0] += 1; + + if (acc.probeValue(coord, data)) { + + if (data.mZPrim != util::INVALID_IDX) { + point[0] = double(coord[0]); + point[1] = double(coord[1]); + point[2] = double(coord[2]) + data.mZDist; + + points.push_back(point); + primitives.push_back(data.mZPrim); + } + } +} + + +template +inline typename GridType::Ptr +createLevelSetBox(const math::BBox& bbox, + const openvdb::math::Transform& xform, + typename VecType::ValueType halfWidth) +{ + const Vec3s pmin = Vec3s(xform.worldToIndex(bbox.min())); + const Vec3s pmax = Vec3s(xform.worldToIndex(bbox.max())); + + Vec3s points[8]; + points[0] = Vec3s(pmin[0], pmin[1], pmin[2]); + points[1] = Vec3s(pmin[0], pmin[1], pmax[2]); + points[2] = Vec3s(pmax[0], pmin[1], pmax[2]); + points[3] = Vec3s(pmax[0], pmin[1], pmin[2]); + points[4] = Vec3s(pmin[0], pmax[1], pmin[2]); + points[5] = Vec3s(pmin[0], pmax[1], pmax[2]); + points[6] = Vec3s(pmax[0], pmax[1], pmax[2]); + points[7] = Vec3s(pmax[0], pmax[1], pmin[2]); + + Vec4I faces[6]; + faces[0] = Vec4I(0, 1, 2, 3); // bottom + faces[1] = Vec4I(7, 6, 5, 4); // top + faces[2] = Vec4I(4, 5, 1, 0); // front + faces[3] = Vec4I(6, 7, 3, 2); // back + faces[4] = Vec4I(0, 3, 7, 4); // left + faces[5] = Vec4I(1, 5, 6, 2); // right + + QuadAndTriangleDataAdapter mesh(points, 8, faces, 6); + + return meshToVolume(mesh, xform, halfWidth, halfWidth); +} + + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_MESH_TO_VOLUME_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/Morphology.h b/nuparu/include/openvdb/include/openvdb/tools/Morphology.h new file mode 100644 index 00000000..9fac07cb --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/Morphology.h @@ -0,0 +1,1097 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file Morphology.h +/// +/// @brief Implementation of morphological dilation and erosion. +/// +/// @note By design the morphological operations only change the +/// state of voxels, not their values. If one desires to +/// change the values of voxels that change state an efficient +/// technique is to construct a boolean mask by performing a +/// topology difference between the original and final grids. +/// +/// @todo Extend erosion with 18 and 26 neighbors (coming soon!) +/// +/// @author Ken Museth +/// + +#ifndef OPENVDB_TOOLS_MORPHOLOGY_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_MORPHOLOGY_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include // for isApproxEqual() +#include +#include +#include +#include +#include +#include +#include +#include "Prune.h"// for pruneLevelSet +#include "ValueTransformer.h" // for foreach() + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief Voxel topology of nearest neighbors +/// @details +///
+///
NN_FACE +///
face adjacency (6 nearest neighbors, defined as all neighbor +/// voxels connected along one of the primary axes) +/// +///
NN_FACE_EDGE +///
face and edge adjacency (18 nearest neighbors, defined as all +/// neighbor voxels connected along either one or two of the primary axes) +/// +///
NN_FACE_EDGE_VERTEX +///
face, edge and vertex adjacency (26 nearest neighbors, defined +/// as all neighbor voxels connected along either one, two or all +/// three of the primary axes) +///
+enum NearestNeighbors { NN_FACE = 6, NN_FACE_EDGE = 18, NN_FACE_EDGE_VERTEX = 26 }; + +/// @brief Different policies when dilating trees with active tiles +/// @details +///
+///
IGNORE_TILES +///
Active tiles are ignores, i.e. only active voxels are dilates. +/// +///
EXPAND_TILES +///
Active tiles are expanded into active voxels and then dilated. +/// +///
PRESERVE_TILES +///
Active tiles remain unchanged but they still contribute to the +/// dilation as if they were active voxels. +///
+enum TilePolicy { IGNORE_TILES, EXPAND_TILES, PRESERVE_TILES }; + +/// @brief Topologically dilate all active values (i.e. both voxels +/// and tiles) in a tree using one of three nearest neighbor +/// connectivity patterns. +/// @note This method is fully multi-threaded and support active tiles! +/// +/// @param tree tree to be dilated +/// @param iterations number of iterations to apply the dilation +/// @param nn connectivity pattern of the dilation: either +/// face-adjacent (6 nearest neighbors), face- and edge-adjacent +/// (18 nearest neighbors) or face-, edge- and vertex-adjacent (26 +/// nearest neighbors). +/// @param mode Defined the policy for handling active tiles +/// (see above for details) +/// +/// @note The values of any voxels are unchanged. +template OPENVDB_STATIC_SPECIALIZATION +inline void dilateActiveValues(TreeType& tree, + int iterations = 1, + NearestNeighbors nn = NN_FACE, + TilePolicy mode = PRESERVE_TILES); + +/// @brief Topologically dilate all active values (i.e. both voxels +/// and tiles) in a tree using one of three nearest neighbor +/// connectivity patterns. +/// +/// @warning Unlike the method above this one takes a LeafManger, +/// however (unlike dilateVoxels method below) it offers no performance +/// advantage over the one that takes a tree. Its merely included for +/// API compatability. The leaf nodes in the manger are updated +/// after the dilation, which incurres a (very small) overhead. +/// +/// @note This method is fully multi-threaded and support active tiles! +/// +/// @param manager Leaf node manager for the tree to be dilated +/// @param iterations number of iterations to apply the dilation +/// @param nn connectivity pattern of the dilation: either +/// face-adjacent (6 nearest neighbors), face- and edge-adjacent +/// (18 nearest neighbors) or face-, edge- and vertex-adjacent (26 +/// nearest neighbors). +/// @param mode Defined the policy for handling active tiles +/// (see above for details) +/// +/// @note The values of any voxels are unchanged. +template OPENVDB_STATIC_SPECIALIZATION +inline void dilateActiveValues(tree::LeafManager& manager, + int iterations = 1, + NearestNeighbors nn = NN_FACE, + TilePolicy mode = PRESERVE_TILES); + + +/// @brief Topologically dilate all leaf-level active voxels in a tree +/// using one of three nearest neighbor connectivity patterns. +/// @warning This method is NOT multi-threaded and ignores active tiles! +/// +/// @param tree tree to be dilated +/// @param iterations number of iterations to apply the dilation +/// @param nn connectivity pattern of the dilation: either +/// face-adjacent (6 nearest neighbors), face- and edge-adjacent +/// (18 nearest neighbors) or face-, edge- and vertex-adjacent (26 +/// nearest neighbors). +/// +/// @note The values of any voxels are unchanged. +template OPENVDB_STATIC_SPECIALIZATION +inline void dilateVoxels(TreeType& tree, + int iterations = 1, + NearestNeighbors nn = NN_FACE); + +/// @brief Topologically dilate all leaf-level active voxels in a tree +/// using one of three nearest neighbor connectivity patterns. +/// @warning This method is NOT multi-threaded and ignores active tiles! +/// +/// @param manager LeafManager containing the tree to be dilated. +/// @param iterations number of iterations to apply the dilation +/// @param nn connectivity pattern of the dilation: either +/// face-adjacent (6 nearest neighbors), face- and edge-adjacent +/// (18 nearest neighbors) or face-, edge- and vertex-adjacent (26 +/// nearest neighbors). +/// +/// @note The values of any voxels are unchanged. +template OPENVDB_STATIC_SPECIALIZATION +inline void dilateVoxels(tree::LeafManager& manager, + int iterations = 1, + NearestNeighbors nn = NN_FACE); + + +//@{ +/// @brief Topologically erode all leaf-level active voxels in the given tree. +/// @details That is, shrink the set of active voxels by @a iterations voxels +/// in the +x, -x, +y, -y, +z and -z directions, but don't change the values +/// of any voxels, only their active states. +/// @todo Currently operates only on leaf voxels; need to extend to tiles. +template OPENVDB_STATIC_SPECIALIZATION +inline void erodeVoxels(TreeType& tree, + int iterations=1, + NearestNeighbors nn = NN_FACE); + +template OPENVDB_STATIC_SPECIALIZATION +inline void erodeVoxels(tree::LeafManager& manager, + int iterations = 1, + NearestNeighbors nn = NN_FACE); +//@} + + +/// @brief Mark as active any inactive tiles or voxels in the given grid or tree +/// whose values are equal to @a value (optionally to within the given @a tolerance). +template +inline void activate( + GridOrTree&, + const typename GridOrTree::ValueType& value, + const typename GridOrTree::ValueType& tolerance = zeroVal() +); + + +/// @brief Mark as inactive any active tiles or voxels in the given grid or tree +/// whose values are equal to @a value (optionally to within the given @a tolerance). +template +inline void deactivate( + GridOrTree&, + const typename GridOrTree::ValueType& value, + const typename GridOrTree::ValueType& tolerance = zeroVal() +); + + +//////////////////////////////////////// + + +/// Mapping from a Log2Dim to a data type of size 2^Log2Dim bits +template struct DimToWord {}; +template<> struct DimToWord<3> { typedef uint8_t Type; }; +template<> struct DimToWord<4> { typedef uint16_t Type; }; +template<> struct DimToWord<5> { typedef uint32_t Type; }; +template<> struct DimToWord<6> { typedef uint64_t Type; }; + + +//////////////////////////////////////// + + +template +class Morphology +{ +public: + typedef tree::LeafManager ManagerType; + + Morphology(TreeType& tree): + mOwnsManager(true), mManager(new ManagerType(tree)), mAcc(tree), mSteps(1) {} + Morphology(ManagerType* mgr): + mOwnsManager(false), mManager(mgr), mAcc(mgr->tree()), mSteps(1) {} + virtual ~Morphology() { if (mOwnsManager) delete mManager; } + + /// @brief Face-adjacent dilation pattern + void dilateVoxels6(); + /// @brief Face- and edge-adjacent dilation pattern. + void dilateVoxels18(); + /// @brief Face-, edge- and vertex-adjacent dilation pattern. + void dilateVoxels26(); + void dilateVoxels(int iterations = 1, NearestNeighbors nn = NN_FACE); + + /// @brief Face-adjacent erosion pattern. + void erodeVoxels6() { mSteps = 1; this->doErosion(NN_FACE); } + /// @brief Face- and edge-adjacent erosion pattern. + void erodeVoxels18() { mSteps = 1; this->doErosion(NN_FACE_EDGE); } + /// @brief Face-, edge- and vertex-adjacent erosion pattern. + void erodeVoxels26() { mSteps = 1; this->doErosion(NN_FACE_EDGE_VERTEX); } + void erodeVoxels(int iterations = 1, NearestNeighbors nn = NN_FACE) + { + mSteps = iterations; + this->doErosion(nn); + } + +protected: + + void doErosion(NearestNeighbors nn); + + typedef typename TreeType::LeafNodeType LeafType; + typedef typename LeafType::NodeMaskType MaskType; + typedef tree::ValueAccessor AccessorType; + + const bool mOwnsManager; + ManagerType* mManager; + AccessorType mAcc; + int mSteps; + + static const int LEAF_DIM = LeafType::DIM; + static const int LEAF_LOG2DIM = LeafType::LOG2DIM; + typedef typename DimToWord::Type Word; + + struct Neighbor { + LeafType* leaf;//null if a tile + bool init;//true if initialization is required + bool isOn;//true if an active tile + Neighbor() : leaf(NULL), init(true) {} + inline void clear() { leaf = NULL; init = true; } + template + void scatter(AccessorType& acc, const Coord &xyz, int indx, Word mask) + { + if (init) { + init = false; + Coord orig = xyz.offsetBy(DX*LEAF_DIM, DY*LEAF_DIM, DZ*LEAF_DIM); + leaf = acc.probeLeaf(orig); + if (leaf==NULL && !acc.isValueOn(orig)) leaf = acc.touchLeaf(orig); + } +#ifndef _MSC_VER // Visual C++ doesn't guarantee thread-safe initialization of local statics + static +#endif + const int N = (LEAF_DIM - 1)*(DY + DX*LEAF_DIM); + if (leaf) leaf->getValueMask().template getWord(indx-N) |= mask; + } + + template + Word gather(AccessorType& acc, const Coord &xyz, int indx) + { + if (init) { + init = false; + Coord orig = xyz.offsetBy(DX*LEAF_DIM, DY*LEAF_DIM, DZ*LEAF_DIM); + leaf = acc.probeLeaf(orig); + isOn = leaf ? false : acc.isValueOn(orig); + } +#ifndef _MSC_VER // Visual C++ doesn't guarantee thread-safe initialization of local statics + static +#endif + const int N = (LEAF_DIM -1 )*(DY + DX*LEAF_DIM); + return leaf ? leaf->getValueMask().template getWord(indx-N) + : isOn ? ~Word(0) : Word(0); + } + };// Neighbor + + struct LeafCache + { + LeafCache(size_t n, TreeType& tree) : size(n), leafs(new LeafType*[n]), acc(tree) + { + onTile.setValuesOn(); + this->clear(); + } + ~LeafCache() { delete [] leafs; } + LeafType*& operator[](int offset) { return leafs[offset]; } + inline void clear() { for (size_t i=0; igetValueMask().template getWord(indx) |= mask; + } + template + inline void scatter(int n, int indx) + { + if (!leafs[n]) { + const Coord xyz = origin->offsetBy(DX*LEAF_DIM, DY*LEAF_DIM, DZ*LEAF_DIM); + leafs[n] = acc.probeLeaf(xyz); + if (!leafs[n]) leafs[n] = acc.isValueOn(xyz) ? &onTile : acc.touchLeaf(xyz); + } + this->scatter(n, indx - (LEAF_DIM - 1)*(DY + DX*LEAF_DIM)); + } + inline Word gather(int n, int indx) + { + assert(leafs[n]); + return leafs[n]->getValueMask().template getWord(indx); + } + template + inline Word gather(int n, int indx) + { + if (!leafs[n]) { + const Coord xyz = origin->offsetBy(DX*LEAF_DIM, DY*LEAF_DIM, DZ*LEAF_DIM); + leafs[n] = acc.probeLeaf(xyz); + if (!leafs[n]) leafs[n] = acc.isValueOn(xyz) ? &onTile : &offTile; + } + return this->gather(n, indx - (LEAF_DIM -1 )*(DY + DX*LEAF_DIM)); + } + // Scatters in the xy face-directions relative to leaf i1 + void scatterFacesXY(int x, int y, int i1, int n, int i2); + + // Scatters in the xy edge-directions relative to leaf i1 + void scatterEdgesXY(int x, int y, int i1, int n, int i2); + + Word gatherFacesXY(int x, int y, int i1, int n, int i2); + + Word gatherEdgesXY(int x, int y, int i1, int n, int i2); + + const Coord* origin; + size_t size; + LeafType** leafs; + LeafType onTile, offTile; + AccessorType acc; + Word mask; + };// LeafCache + + struct ErodeVoxelsOp { + typedef tbb::blocked_range RangeT; + ErodeVoxelsOp(std::vector& masks, ManagerType& manager) + : mTask(0), mSavedMasks(masks) , mManager(manager) {} + void runParallel(NearestNeighbors nn); + void operator()(const RangeT& r) const {mTask(const_cast(this), r);} + void erode6( const RangeT&) const; + void erode18(const RangeT&) const; + void erode26(const RangeT&) const; + private: + typedef typename boost::function FuncT; + FuncT mTask; + std::vector& mSavedMasks; + ManagerType& mManager; + };// ErodeVoxelsOp + + struct MaskManager { + MaskManager(std::vector& masks, ManagerType& manager) + : mMasks(masks) , mManager(manager), mSaveMasks(true) {} + + void save() { mSaveMasks = true; tbb::parallel_for(mManager.getRange(), *this); } + void update() { mSaveMasks = false; tbb::parallel_for(mManager.getRange(), *this); } + void operator()(const tbb::blocked_range& range) const + { + if (mSaveMasks) { + for (size_t i = range.begin(); i < range.end(); ++i) { + mMasks[i] = mManager.leaf(i).getValueMask(); + } + } else { + for (size_t i = range.begin(); i < range.end(); ++i) { + mManager.leaf(i).setValueMask(mMasks[i]); + } + } + } + private: + std::vector& mMasks; + ManagerType& mManager; + bool mSaveMasks; + };// MaskManager + + struct UpdateMasks { + UpdateMasks(const std::vector& masks, ManagerType& manager) + : mMasks(masks), mManager(manager) {} + void update() { tbb::parallel_for(mManager.getRange(), *this); } + void operator()(const tbb::blocked_range& r) const { + for (size_t i=r.begin(); i& mMasks; + ManagerType& mManager; + }; + struct CopyMasks { + CopyMasks(std::vector& masks, const ManagerType& manager) + : mMasks(masks), mManager(manager) {} + void copy() { tbb::parallel_for(mManager.getRange(), *this); } + void operator()(const tbb::blocked_range& r) const { + for (size_t i=r.begin(); i& mMasks; + const ManagerType& mManager; + }; + void copyMasks(std::vector& a, const ManagerType& b) {CopyMasks c(a, b); c.copy();} +};// Morphology + + +template +inline void +Morphology::dilateVoxels(int iterations, NearestNeighbors nn) +{ + for (int i=0; idilateVoxels18(); + break; + case NN_FACE_EDGE_VERTEX: + this->dilateVoxels26(); + break; + default: + this->dilateVoxels6(); + } + } +} + + +template +inline void +Morphology::dilateVoxels6() +{ + /// @todo Currently operates only on leaf voxels; need to extend to tiles. + const int leafCount = static_cast(mManager->leafCount()); + + // Save the value masks of all leaf nodes. + std::vector savedMasks(leafCount); + this->copyMasks(savedMasks, *mManager); + LeafCache cache(7, mManager->tree()); + for (int leafIdx = 0; leafIdx < leafCount; ++leafIdx) { + const MaskType& oldMask = savedMasks[leafIdx];//original bit-mask of current leaf node + cache[0] = &mManager->leaf(leafIdx); + cache.setOrigin(cache[0]->origin()); + for (int x = 0; x < LEAF_DIM; ++x ) { + for (int y = 0, n = (x << LEAF_LOG2DIM); y < LEAF_DIM; ++y, ++n) { + // Extract the portion of the original mask that corresponds to a row in z. + if (const Word w = oldMask.template getWord(n)) { + + // Dilate the current leaf in the +z and -z direction + cache.mask = Word(w | (w>>1) | (w<<1)); cache.scatter(0, n); + + // Dilate into neighbor leaf in the -z direction + if ( (cache.mask = Word(w<<(LEAF_DIM-1))) ) { + cache.template scatter< 0, 0,-1>(1, n); + } + // Dilate into neighbor leaf in the +z direction + if ( (cache.mask = Word(w>>(LEAF_DIM-1))) ) { + cache.template scatter< 0, 0, 1>(2, n); + } + // Dilate in the xy-face directions relative to the center leaf + cache.mask = w; cache.scatterFacesXY(x, y, 0, n, 3); + } + }// loop over y + }//loop over x + cache.clear(); + }//loop over leafs + + mManager->rebuildLeafArray(); +}//dilateVoxels6 + + +template +inline void +Morphology::dilateVoxels18() +{ + /// @todo Currently operates only on leaf voxels; need to extend to tiles. + const int leafCount = static_cast(mManager->leafCount()); + + // Save the value masks of all leaf nodes. + std::vector savedMasks(leafCount); + this->copyMasks(savedMasks, *mManager); + LeafCache cache(19, mManager->tree()); + Coord orig_mz, orig_pz;//origins of neighbor leaf nodes in the -z and +z directions + for (int leafIdx = 0; leafIdx < leafCount; ++leafIdx) { + const MaskType& oldMask = savedMasks[leafIdx];//original bit-mask of current leaf node + cache[0] = &mManager->leaf(leafIdx); + orig_mz = cache[0]->origin().offsetBy(0, 0, -LEAF_DIM); + orig_pz = cache[0]->origin().offsetBy(0, 0, LEAF_DIM); + for (int x = 0; x < LEAF_DIM; ++x ) { + for (int y = 0, n = (x << LEAF_LOG2DIM); y < LEAF_DIM; ++y, ++n) { + if (const Word w = oldMask.template getWord(n)) { + { + cache.mask = Word(w | (w>>1) | (w<<1)); + cache.setOrigin(cache[0]->origin()); + cache.scatter(0, n); + cache.scatterFacesXY(x, y, 0, n, 3); + cache.mask = w; + cache.scatterEdgesXY(x, y, 0, n, 3); + } + if ( (cache.mask = Word(w<<(LEAF_DIM-1))) ) { + cache.setOrigin(cache[0]->origin()); + cache.template scatter< 0, 0,-1>(1, n); + cache.setOrigin(orig_mz); + cache.scatterFacesXY(x, y, 1, n, 11); + } + if ( (cache.mask = Word(w>>(LEAF_DIM-1))) ) { + cache.setOrigin(cache[0]->origin()); + cache.template scatter< 0, 0, 1>(2, n); + cache.setOrigin(orig_pz); + cache.scatterFacesXY(x, y, 2, n, 15); + } + } + }// loop over y + }//loop over x + cache.clear(); + }//loop over leafs + + mManager->rebuildLeafArray(); +}// dilateVoxels18 + + +template +inline void +Morphology::dilateVoxels26() +{ + const int leafCount = static_cast(mManager->leafCount()); + + // Save the value masks of all leaf nodes. + std::vector savedMasks(leafCount); + this->copyMasks(savedMasks, *mManager); + LeafCache cache(27, mManager->tree()); + Coord orig_mz, orig_pz;//origins of neighbor leaf nodes in the -z and +z directions + for (int leafIdx = 0; leafIdx < leafCount; ++leafIdx) { + const MaskType& oldMask = savedMasks[leafIdx];//original bit-mask of current leaf node + cache[0] = &mManager->leaf(leafIdx); + orig_mz = cache[0]->origin().offsetBy(0, 0, -LEAF_DIM); + orig_pz = cache[0]->origin().offsetBy(0, 0, LEAF_DIM); + for (int x = 0; x < LEAF_DIM; ++x ) { + for (int y = 0, n = (x << LEAF_LOG2DIM); y < LEAF_DIM; ++y, ++n) { + if (const Word w = oldMask.template getWord(n)) { + { + cache.mask = Word(w | (w>>1) | (w<<1)); + cache.setOrigin(cache[0]->origin()); + cache.scatter(0, n); + cache.scatterFacesXY(x, y, 0, n, 3); + cache.scatterEdgesXY(x, y, 0, n, 3); + } + if ( (cache.mask = Word(w<<(LEAF_DIM-1))) ) { + cache.setOrigin(cache[0]->origin()); + cache.template scatter< 0, 0,-1>(1, n); + cache.setOrigin(orig_mz); + cache.scatterFacesXY(x, y, 1, n, 11); + cache.scatterEdgesXY(x, y, 1, n, 11); + } + if ( (cache.mask = Word(w>>(LEAF_DIM-1))) ) { + cache.setOrigin(cache[0]->origin()); + cache.template scatter< 0, 0, 1>(2, n); + cache.setOrigin(orig_pz); + cache.scatterFacesXY(x, y, 2, n, 19); + cache.scatterEdgesXY(x, y, 2, n, 19); + } + } + }// loop over y + }//loop over x + cache.clear(); + }//loop over leafs + + mManager->rebuildLeafArray(); +}// dilateVoxels26 + + +template +inline void +Morphology::LeafCache::scatterFacesXY(int x, int y, int i1, int n, int i2) +{ + // dilate current leaf or neighbor in the -x direction + if (x > 0) { + this->scatter(i1, n-LEAF_DIM); + } else { + this->template scatter<-1, 0, 0>(i2, n); + } + // dilate current leaf or neighbor in the +x direction + if (x < LEAF_DIM-1) { + this->scatter(i1, n+LEAF_DIM); + } else { + this->template scatter< 1, 0, 0>(i2+1, n); + } + // dilate current leaf or neighbor in the -y direction + if (y > 0) { + this->scatter(i1, n-1); + } else { + this->template scatter< 0,-1, 0>(i2+2, n); + } + // dilate current leaf or neighbor in the +y direction + if (y < LEAF_DIM-1) { + this->scatter(i1, n+1); + } else { + this->template scatter< 0, 1, 0>(i2+3, n); + } +} + + +template +inline void +Morphology::LeafCache::scatterEdgesXY(int x, int y, int i1, int n, int i2) +{ + if (x > 0) { + if (y > 0) { + this->scatter(i1, n-LEAF_DIM-1); + } else { + this->template scatter< 0,-1, 0>(i2+2, n-LEAF_DIM); + } + if (y < LEAF_DIM-1) { + this->scatter(i1, n-LEAF_DIM+1); + } else { + this->template scatter< 0, 1, 0>(i2+3, n-LEAF_DIM); + } + } else { + if (y < LEAF_DIM-1) { + this->template scatter<-1, 0, 0>(i2 , n+1); + } else { + this->template scatter<-1, 1, 0>(i2+7, n ); + } + if (y > 0) { + this->template scatter<-1, 0, 0>(i2 , n-1); + } else { + this->template scatter<-1,-1, 0>(i2+4, n ); + } + } + if (x < LEAF_DIM-1) { + if (y > 0) { + this->scatter(i1, n+LEAF_DIM-1); + } else { + this->template scatter< 0,-1, 0>(i2+2, n+LEAF_DIM); + } + if (y < LEAF_DIM-1) { + this->scatter(i1, n+LEAF_DIM+1); + } else { + this->template scatter< 0, 1, 0>(i2+3, n+LEAF_DIM); + } + } else { + if (y > 0) { + this->template scatter< 1, 0, 0>(i2+1, n-1); + } else { + this->template scatter< 1,-1, 0>(i2+6, n ); + } + if (y < LEAF_DIM-1) { + this->template scatter< 1, 0, 0>(i2+1, n+1); + } else { + this->template scatter< 1, 1, 0>(i2+5, n ); + } + } +} + + +template +inline void +Morphology::ErodeVoxelsOp::runParallel(NearestNeighbors nn) +{ + switch (nn) { + case NN_FACE_EDGE: + mTask = boost::bind(&ErodeVoxelsOp::erode18, _1, _2); + break; + case NN_FACE_EDGE_VERTEX: + mTask = boost::bind(&ErodeVoxelsOp::erode26, _1, _2); + break; + default: + mTask = boost::bind(&ErodeVoxelsOp::erode6, _1, _2); + } + tbb::parallel_for(mManager.getRange(), *this); +} + + +template +inline typename Morphology::Word +Morphology::LeafCache::gatherFacesXY(int x, int y, int i1, int n, int i2) +{ + // erode current leaf or neighbor in negative x-direction + Word w = x>0 ? this->gather(i1,n-LEAF_DIM) : this->template gather<-1,0,0>(i2, n); + + // erode current leaf or neighbor in positive x-direction + w = Word(w & (xgather(i1,n+LEAF_DIM):this->template gather<1,0,0>(i2+1,n))); + + // erode current leaf or neighbor in negative y-direction + w = Word(w & (y>0 ? this->gather(i1, n-1) : this->template gather<0,-1,0>(i2+2, n))); + + // erode current leaf or neighbor in positive y-direction + w = Word(w & (ygather(i1, n+1) : this->template gather<0,1,0>(i2+3, n))); + + return w; +} + + +template +inline typename Morphology::Word +Morphology::LeafCache::gatherEdgesXY(int x, int y, int i1, int n, int i2) +{ + Word w = ~Word(0); + + if (x > 0) { + w &= y > 0 ? this->gather(i1, n-LEAF_DIM-1) : + this->template gather< 0,-1, 0>(i2+2, n-LEAF_DIM); + w &= y < LEAF_DIM-1 ? this->gather(i1, n-LEAF_DIM+1) : + this->template gather< 0, 1, 0>(i2+3, n-LEAF_DIM); + } else { + w &= y < LEAF_DIM-1 ? this->template gather<-1, 0, 0>(i2 , n+1): + this->template gather<-1, 1, 0>(i2+7, n ); + w &= y > 0 ? this->template gather<-1, 0, 0>(i2 , n-1): + this->template gather<-1,-1, 0>(i2+4, n ); + } + if (x < LEAF_DIM-1) { + w &= y > 0 ? this->gather(i1, n+LEAF_DIM-1) : + this->template gather< 0,-1, 0>(i2+2, n+LEAF_DIM); + w &= y < LEAF_DIM-1 ? this->gather(i1, n+LEAF_DIM+1) : + this->template gather< 0, 1, 0>(i2+3, n+LEAF_DIM); + } else { + w &= y > 0 ? this->template gather< 1, 0, 0>(i2+1, n-1): + this->template gather< 1,-1, 0>(i2+6, n ); + w &= y < LEAF_DIM-1 ? this->template gather< 1, 0, 0>(i2+1, n+1): + this->template gather< 1, 1, 0>(i2+5, n ); + } + + return w; +} + + +template +inline void +Morphology::ErodeVoxelsOp::erode6(const RangeT& range) const +{ + LeafCache cache(7, mManager.tree()); + for (size_t leafIdx = range.begin(); leafIdx < range.end(); ++leafIdx) { + cache[0] = &mManager.leaf(leafIdx); + if (cache[0]->isEmpty()) continue; + cache.setOrigin(cache[0]->origin()); + MaskType& newMask = mSavedMasks[leafIdx];//original bit-mask of current leaf node + for (int x = 0; x < LEAF_DIM; ++x ) { + for (int y = 0, n = (x << LEAF_LOG2DIM); y < LEAF_DIM; ++y, ++n) { + // Extract the portion of the original mask that corresponds to a row in z. + if (Word& w = newMask.template getWord(n)) { + + // erode in two z directions (this is first since it uses the original w) + w = Word(w & + (Word(w<<1 | (cache.template gather<0,0,-1>(1, n)>>(LEAF_DIM-1))) & + Word(w>>1 | (cache.template gather<0,0, 1>(2, n)<<(LEAF_DIM-1))))); + + w = Word(w & cache.gatherFacesXY(x, y, 0, n, 3)); + } + }// loop over y + }//loop over x + cache.clear(); + }//loop over leafs +} + + +template +inline void +Morphology::ErodeVoxelsOp::erode18(const RangeT&) const +{ + OPENVDB_THROW(NotImplementedError, "tools::erode18 is not implemented yet!"); +} + + +template +inline void +Morphology::ErodeVoxelsOp::erode26(const RangeT&) const +{ + OPENVDB_THROW(NotImplementedError, "tools::erode26 is not implemented yet!"); +} + + +template +inline void +Morphology::doErosion(NearestNeighbors nn) +{ + /// @todo Currently operates only on leaf voxels; need to extend to tiles. + const size_t leafCount = mManager->leafCount(); + + // Save the value masks of all leaf nodes. + std::vector savedMasks(leafCount); + this->copyMasks(savedMasks, *mManager); + UpdateMasks a(savedMasks, *mManager); + ErodeVoxelsOp erode(savedMasks, *mManager); + + for (int i = 0; i < mSteps; ++i) { + erode.runParallel(nn); + a.update(); + } + + tools::pruneLevelSet(mManager->tree()); +} + + +//////////////////////////////////////// + + +template +OPENVDB_STATIC_SPECIALIZATION inline void +dilateVoxels(tree::LeafManager& manager, int iterations, NearestNeighbors nn) +{ + if (iterations > 0 ) { + Morphology m(&manager); + m.dilateVoxels(iterations, nn); + } +} + +template +OPENVDB_STATIC_SPECIALIZATION inline void +dilateVoxels(TreeType& tree, int iterations, NearestNeighbors nn) +{ + if (iterations > 0 ) { + Morphology m(tree); + m.dilateVoxels(iterations, nn); + } +} + +template +OPENVDB_STATIC_SPECIALIZATION inline void +erodeVoxels(tree::LeafManager& manager, int iterations, NearestNeighbors nn) +{ + if (iterations > 0 ) { + Morphology m(&manager); + m.erodeVoxels(iterations, nn); + } +} + +template +OPENVDB_STATIC_SPECIALIZATION inline void +erodeVoxels(TreeType& tree, int iterations, NearestNeighbors nn) +{ + if (iterations > 0 ) { + Morphology m(tree); + m.erodeVoxels(iterations, nn); + } +} + + +//////////////////////////////////////// + + +namespace activation { + +template +class ActivationOp +{ +public: + typedef typename TreeType::ValueType ValueT; + + ActivationOp(bool state, const ValueT& val, const ValueT& tol) + : mActivate(state) + , mValue(val) + , mTolerance(tol) + {} + + void operator()(const typename TreeType::ValueOnIter& it) const + { + if (math::isApproxEqual(*it, mValue, mTolerance)) { + it.setValueOff(); + } + } + + void operator()(const typename TreeType::ValueOffIter& it) const + { + if (math::isApproxEqual(*it, mValue, mTolerance)) { + it.setActiveState(/*on=*/true); + } + } + + void operator()(const typename TreeType::LeafIter& lit) const + { + typedef typename TreeType::LeafNodeType LeafT; + LeafT& leaf = *lit; + if (mActivate) { + for (typename LeafT::ValueOffIter it = leaf.beginValueOff(); it; ++it) { + if (math::isApproxEqual(*it, mValue, mTolerance)) { + leaf.setValueOn(it.pos()); + } + } + } else { + for (typename LeafT::ValueOnIter it = leaf.beginValueOn(); it; ++it) { + if (math::isApproxEqual(*it, mValue, mTolerance)) { + leaf.setValueOff(it.pos()); + } + } + } + } + +private: + bool mActivate; + const ValueT mValue, mTolerance; +}; // class ActivationOp + +} // namespace activation + + +template +inline void +activate(GridOrTree& gridOrTree, const typename GridOrTree::ValueType& value, + const typename GridOrTree::ValueType& tolerance) +{ + typedef TreeAdapter Adapter; + typedef typename Adapter::TreeType TreeType; + + TreeType& tree = Adapter::tree(gridOrTree); + + activation::ActivationOp op(/*activate=*/true, value, tolerance); + + // Process all leaf nodes in parallel. + foreach(tree.beginLeaf(), op); + + // Process all other inactive values serially (because changing active states + // is not thread-safe unless no two threads modify the same node). + typename TreeType::ValueOffIter it = tree.beginValueOff(); + it.setMaxDepth(tree.treeDepth() - 2); + foreach(it, op, /*threaded=*/false); +} + + +template +inline void +deactivate(GridOrTree& gridOrTree, const typename GridOrTree::ValueType& value, + const typename GridOrTree::ValueType& tolerance) +{ + typedef TreeAdapter Adapter; + typedef typename Adapter::TreeType TreeType; + + TreeType& tree = Adapter::tree(gridOrTree); + + activation::ActivationOp op(/*activate=*/false, value, tolerance); + + // Process all leaf nodes in parallel. + foreach(tree.beginLeaf(), op); + + // Process all other active values serially (because changing active states + // is not thread-safe unless no two threads modify the same node). + typename TreeType::ValueOnIter it = tree.beginValueOn(); + it.setMaxDepth(tree.treeDepth() - 2); + foreach(it, op, /*threaded=*/false); +} + +/// @brief Class that performs multi-threaded dilation with support for active tiles. +/// @warning Dont use this class directly, instead call the function dilateActiveValues! +template +class DilationOp +{ + typedef typename TreeT::template ValueConverter::Type MaskT; + typedef tbb::enumerable_thread_specific PoolT; + typedef typename MaskT::LeafNodeType LeafT; + + // Very light-weight member data + const int mIter;// number of iterations + const tools::NearestNeighbors mNN;//enum to specify the dilation scheme + PoolT *mPool;// pointer to the thread-local pool of mask trees + LeafT **mLeafs;// raw array of pointers to leaf nodes + +public: + + DilationOp(TreeT &tree, int iterations, NearestNeighbors nn, TilePolicy mode) + : mIter(iterations), mNN(nn), mPool(NULL), mLeafs(NULL) + { + const size_t numLeafs = this->init( tree, mode ); + const size_t numThreads = size_t(tbb::task_scheduler_init::default_num_threads()); + const size_t grainSize = math::Max(size_t(1), numLeafs/(2*numThreads)); + + MaskT mask; + PoolT pool(mask);// Scoped thread-local storage of mask trees + mPool = &pool; + + tbb::parallel_for(tbb::blocked_range(mLeafs, mLeafs+numLeafs, grainSize), *this); + + delete [] mLeafs;// no more need for the array of leaf node pointers + + typedef typename PoolT::iterator IterT; + for (IterT it=pool.begin(); it!=pool.end(); ++it) mask.merge(*it);// fast stealing + + if (mode == PRESERVE_TILES) tools::prune(mask);//multithreaded + + tree.topologyUnion(mask);//multithreaded + } + + // This is required by tbb and should never be called directly + void operator()(const tbb::blocked_range &r) const + { + MaskT mask;// thread-local temporary mask tree + for (LeafT** it=r.begin(); it!=r.end(); ++it) mask.addLeaf( **it ); + tree::LeafManager manager(mask, r.begin(), r.end()); + tools::dilateVoxels(manager, mIter, mNN);// serial dilation of active voxels + mPool->local().merge(mask, MERGE_ACTIVE_STATES); + } +private: + + // Simple wrapper of a raw double-pointer to mimic a std container + struct MyArray { + typedef LeafT* value_type;//required by Tree::stealNodes + value_type* ptr; + MyArray(value_type* array) : ptr(array) {} + void push_back(value_type leaf) { *ptr++ = leaf; }//required by Tree::stealNodes + }; + + // Convert active tiles to leafs and de-construct the tree into a linear array of leafs. + size_t linearize(MaskT& mask, TilePolicy mode) + { + if (mode != IGNORE_TILES) mask.voxelizeActiveTiles();// light-weight since this is a mask tree + const size_t numLeafs = mask.leafCount(); + mLeafs = new LeafT*[numLeafs];// fast pre-allocation + MyArray tmp(mLeafs); + mask.stealNodes(tmp);// serializes the mask tree and leaves it empty + return numLeafs; + } + + template + typename boost::enable_if,size_t>::type init(T& tree, TilePolicy mode) + { + return this->linearize(tree, mode); + } + + template + typename boost::disable_if,size_t>::type init(const T& tree, TilePolicy mode) + { + MaskT mask(tree, false, true, TopologyCopy()); + return this->linearize(mask, mode); + } + +};// DilationOp + +template +OPENVDB_STATIC_SPECIALIZATION inline void +dilateActiveValues(TreeType& tree, int iterations, NearestNeighbors nn, TilePolicy mode) +{ + if (iterations > 0 ) DilationOp tmp(tree, iterations, nn, mode); +} + +template +OPENVDB_STATIC_SPECIALIZATION inline void +dilateActiveValues(tree::LeafManager& manager, + int iterations, + NearestNeighbors nn, + TilePolicy mode) +{ + if (iterations > 0 ) { + DilationOp tmp(manager.tree(), iterations, nn, mode); + manager.rebuildLeafArray(); + } +} + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_MORPHOLOGY_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/MultiResGrid.h b/nuparu/include/openvdb/include/openvdb/tools/MultiResGrid.h new file mode 100644 index 00000000..1a5fb57e --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/MultiResGrid.h @@ -0,0 +1,981 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////// +/// +/// @file MultiResGrid.h +/// +/// @brief Ken Museth +/// +/// @warning This class is fairly new and as such has not seen a lot of +/// use in production. Please report any issues or request for new +/// features directly to ken.museth@dreamworks.com. +/// +/// @brief Multi-resolution grid that contains LoD sequences of trees +/// with powers of two refinements. +/// +/// @note While this class can arguably be used to implement a sparse +/// Multi-Grid solver it is currently intented as a means to +/// efficiently compute LoD levels for applications like rendering +/// +/// @note Prolongation means interpolation from coarse -> fine +/// @note Restriction means interpolation (or remapping) from fine -> coarse +/// + +#ifndef OPENVDB_TOOLS_MULTIRESGRID_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_MULTIRESGRID_HAS_BEEN_INCLUDED + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include + +class TestMultiResGrid; + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +template +class MultiResGrid: public MetaMap +{ +public: + + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + typedef typename TreeType::ValueType ValueType; + typedef typename TreeType::ValueOnCIter ValueOnCIter; + typedef typename TreeType::ValueOnIter ValueOnIter; + typedef typename TreeType::Ptr TreePtr; + typedef typename TreeType::ConstPtr ConstTreePtr; + typedef typename Grid::Ptr GridPtr; + typedef typename Grid::ConstPtr ConstGridPtr; + + ////////////////////////////////////////////////////////////////////// + + /// @brief Constructor of empty grids + /// @param levels The number of trees in this MultiResGrid + /// @param background Background value + /// @param voxelSize Size of a (uniform voxel). Defaults to one. + /// @note The multiple grids are all empty. + MultiResGrid(size_t levels, ValueType background, double voxelSize = 1.0); + + /// @brief Given an initial high-resolution grid this constructor + /// generates all the coarser grids by means of restriction. + /// @param levels The number of trees in this MultiResGrid + /// @param grid High-resolution inout grid + /// @param useInjection Use restruction by injection, vs + /// full-weighting. It defaults to false and should rarely to used. + /// @note This constructor will perform a deep copy of the input + /// grid and use it as the highest level grid. + MultiResGrid(size_t levels, const Grid &grid, bool useInjection = false); + + /// @brief Given an initial high-resolution grid this constructor + /// generates all the coarser grids by means of restriction. + /// @param levels The number of trees in this MultiResGrid + /// @param grid High-resolution inout grid + /// @param useInjection Use restruction by injection, vs + /// full-weighting. It defaults to false and should rarely to used. + /// @note This constructor will steal the input input + /// grid and use it as the highest level grid. On output the grid + /// is empty. + MultiResGrid(size_t levels, GridPtr grid, bool useInjection = false); + + ////////////////////////////////////////////////////////////////////// + + /// @brief Return the number of levels, i.e. trees, in this MultiResGrid + /// @note level 0 is the finest level and numLevels()-1 is the coarsest + /// level. + size_t numLevels() const { return mTrees.size(); } + + /// @brief Return the level of the finest grid (always 0) + static size_t finestLevel() { return 0; } + + /// @brief Return the level of the coarest grid, i.e. numLevels()-1 + size_t coarsestLevel() const { return mTrees.size()-1; } + + ////////////////////////////////////////////////////////////////////// + + /// @brief Return a reference to the tree at the specified level + /// @param level The level of the tree to be returned + /// @note Level 0 is by definition the finest tree. + TreeType& tree(size_t level); + + /// @brief Return a const reference to the tree at the specified level + /// @param level The level of the tree to be returned + /// @note Level 0 is by definition the finest tree. + const TreeType& constTree(size_t level) const; + + /// @brief Return a shared pointer to the tree at the specified level + /// @param level The level of the tree to be returned + /// @note Level 0 is by definition the finest tree. + TreePtr treePtr(size_t level); + + /// @brief Return a const shared pointer to the tree at the specified level + /// @param level The level of the tree to be returned + /// @note Level 0 is by definition the finest tree. + ConstTreePtr constTreePtr(size_t level) const; + + /// @brief Return a reference to the tree at the finest level + TreeType& finestTree() { return *mTrees.front(); } + + /// @brief Return a const reference to the tree at the finest level + const TreeType& finestConstTree() const { return *mTrees.front(); } + + /// @brief Return a shared pointer to the tree at the finest level + TreePtr finestTreePtr() { return mTrees.front(); } + + /// @brief Return a const shared pointer to the tree at the finest level + ConstTreePtr finestConstTreePtr() const { return mTrees.front(); } + + /// @brief Return a reference to the tree at the coarsest level + TreeType& coarsestTree() { return *mTrees.back(); } + + /// @brief Return a const reference to the tree at the coarsest level + const TreeType& coarsestConstTree() const { return *mTrees.back(); } + + /// @brief Return a shared pointer to the tree at the coarsest level + TreePtr coarsestTreePtr() { return mTrees.back(); } + + /// @brief Return a const shared pointer to the tree at the coarsest level + ConstTreePtr coarsestConstTreePtr() const { return mTrees.back(); } + + ////////////////////////////////////////////////////////////////////// + + /// @brief Return a shared pointer to the grid at the specified integer level + /// @param level Integer level of the grid to be returned + /// @note Level 0 is by definition the finest grid. + GridPtr grid(size_t level); + + /// @brief Return a const shared pointer to the grid at the specified level + /// @param level The level of the grid to be returned + /// @note Level 0 is by definition the finest grid. + ConstGridPtr grid(size_t level) const; + + /// @brief Return a shared pointer to a new grid at the specified + /// floating-point level. + /// @param level Floating-point level of the grid to be returned + /// @param grainSize Grain size for the multi-threading + /// @details Interpolation of the specified order is performed + /// between the bracketing integer levels. + /// @note Level 0 is by definition the finest grid. + template + GridPtr createGrid(float level, size_t grainSize = 1) const; + + /// @brief Return a shared pointer to a vector of all the base + /// grids in this instance of the MultiResGrid. + /// @brief This method is useful for I/O + GridPtrVecPtr grids(); + + /// @brief Return a const shared pointer to a vector of all the base + /// grids in this instance of the MultiResGrid. + /// @brief This method is useful for I/O + GridCPtrVecPtr grids() const; + + ////////////////////////////////////////////////////////////////////// + + /// @brief Write all the grids to a file + /// @param filename Name of the files to write to + void write(const std::string &filename) const; + + ////////////////////////////////////////////////////////////////////// + + //@{ + /// @brief Return a reference to the finist grid's transform, which might be + /// shared with other grids. + /// @note Calling setTransform() on this grid invalidates all references + /// previously returned by this method. + /// @warning The transform is relative to the finest level (=0) grid! + math::Transform& transform() { return *mTransform; } + const math::Transform& transform() const { return *mTransform; } + const math::Transform& constTransform() const { return *mTransform; } + //@} + + ////////////////////////////////////////////////////////////////////// + + //@{ + /// @brief Return the floating-point index coordiate at out_level given + /// the index coordinate in_xyz at in_level. + static Vec3R xyz(const Coord& in_ijk, size_t in_level, size_t out_level); + static Vec3R xyz(const Vec3R& in_xyz, size_t in_level, size_t out_level); + static Vec3R xyz(const Vec3R& in_xyz, double in_level, double out_level); + //@} + + ////////////////////////////////////////////////////////////////////// + + //@{ + /// @brief Return the value at the specified coordinate position using + /// interpolation of the specified order into the tree at the out_level. + /// + /// @details First in_ijk is mapped from index space at in_level to + /// out_level, and then a value is interpolated from the tree at out_level. + /// + /// @param in_ijk Index coordinate position relative to tree at in_level + /// @param in_level Integer level of the input coordinate in_ijk + /// @param out_level Integer level of the interpolated value + template + ValueType sampleValue(const Coord& in_ijk, size_t in_level, size_t out_level) const; + template + ValueType sampleValue(const Vec3R& in_ijk, size_t in_level, size_t out_level) const; + //@} + + /// @brief Return the value at the specified integer coordinate position + /// and level using interpolation of the specified order. + /// @param ijk Integer coordinate position relative to the highest level (=0) grid + /// @param level Floating-point level from which to interpolate the value. + /// @brief Non-integer values of the level will use linear-interpolation + /// between the neighboring integer levels. + template + ValueType sampleValue(const Coord& ijk, double level) const; + + /// @brief Return the value at the specified floating-point coordinate position + /// and level using interpolation of the specified order. + /// @param xyz Floating-point coordinate position relative to the highest level grid + /// @param level Floating-point level from which to interpolate + /// the value. + /// @brief Non-integer values of the level will use linear-interpolation + /// between the neighboring integer levels. + template + ValueType sampleValue(const Vec3R& xyz, double level) const; + + ////////////////////////////////////////////////////////////////////// + + /// @brief Return the value at coordinate location in @a level tree + /// from the coarser tree at @a level+1 using trilinear interpolation + /// @param coords input coords relative to the fine tree at level + /// @param level The fine level to receive values from the coarser + /// level-1 + /// @note Prolongation means to interpolation from coarse -> fine + ValueType prolongate(const Coord& coords, const size_t level) const; + + + /// (coarse->fine) Poplulates all the active voxel values in a fine (@a level) tree + /// from the coarse (@a level+1) tree using linear interpolation + /// This transforms multiple values of the tree in parallel + void prolongateActiveVoxels(size_t destlevel, size_t grainSize = 1); + + ////////////////////////////////////////////////////////////////////// + + /// Populate a coordinate location in @a level (coarse) tree + /// from the @a level-1 (fine) tree using trilinear interpolation + /// input coords are relative to the mTree[level] (coarse) + /// @note Restriction means remapping from fine -> coarse + ValueType restrict(Coord ijk, const size_t level, bool useInjection = false) const; + + /// (fine->coarse) Poplulates all the active voxel values in the coarse (@a level) tree + /// from the fine (@a level-1) tree using trilinear interpolation. + /// For cell-centered data, this is equivalent to an average + /// For vertex-centered data this is equivalent to transfering the data + /// from the fine vertex directly above the coarse vertex. + /// This transforms multiple values of the tree in parallel + void restrictActiveVoxels(size_t destlevel, size_t grainSize = 1); + + /// Output a human-readable description of this MultiResGrid + void print(std::ostream& = std::cout, int verboseLevel = 1) const; + + /// @brief Return a string with the name of this MultiResGrid + std::string getName() const + { + if (Metadata::ConstPtr meta = (*this)[GridBase::META_GRID_NAME]) return meta->str(); + return ""; + } + + /// @brief Set the name of this MultiResGrid + void setName(const std::string& name) + { + this->removeMeta(GridBase::META_GRID_NAME); + this->insertMeta(GridBase::META_GRID_NAME, StringMetadata(name)); + } + + /// Return the class of volumetric data (level set, fog volume, etc.) stored in this grid. + GridClass getGridClass() const + { + typename StringMetadata::ConstPtr s = + this->getMetadata(GridBase::META_GRID_CLASS); + return s ? GridBase::stringToGridClass(s->value()) : GRID_UNKNOWN; + } + + /// Specify the class of volumetric data (level set, fog volume, etc.) stored in this grid. + void setGridClass(GridClass cls) + { + this->insertMeta(GridBase::META_GRID_CLASS, StringMetadata(GridBase::gridClassToString(cls))); + } + + /// Remove the setting specifying the class of this grid's volumetric data. + void clearGridClass() { this->removeMeta(GridBase::META_GRID_CLASS); } + +private: + + MultiResGrid(const MultiResGrid& other);//disallow copy construction + MultiResGrid& operator=(const MultiResGrid& other);//disallow copy assignment + + friend class ::TestMultiResGrid; + + // For optimal performance we disable registration of the ValueAccessor + typedef tree::ValueAccessor Accessor; + typedef tree::ValueAccessor ConstAccessor; + + void topDownRestrict(bool useInjection); + + inline void initMeta(); + + // Private struct that concurrently creates a mask of active voxel + // in a coarse tree from the active voxels in a fine tree + struct MaskOp; + + /// Private struct that performs multi-threaded restruction + struct RestrictOp; + + /// Private struct that performs multi-threaded prolongation + struct ProlongateOp; + + // Private struct that performs multi-threaded computation of grids a fraction levels + template + struct FractionOp; + + /// Private template struct that performs the actual multi-threading + template struct CookOp; + + // Array of shared pointer to trees, level 0 has the highest resolution. + std::vector mTrees; + // Shared point to a transform associated with the finest level grid + typename math::Transform::Ptr mTransform; +};// MultiResGrid + +template +MultiResGrid:: +MultiResGrid(size_t levels, ValueType background, double voxelSize) + : mTrees(levels) + , mTransform(math::Transform::createLinearTransform( voxelSize )) +{ + this->initMeta(); + for (size_t i=0; i +MultiResGrid:: +MultiResGrid(size_t levels, const Grid &grid, bool useInjection) + : MetaMap(grid) + , mTrees(levels) + , mTransform( grid.transform().copy() ) +{ + this->initMeta(); + mTrees[0].reset( new TreeType( grid.tree() ) );// deep copy input tree + mTrees[0]->voxelizeActiveTiles(); + this->topDownRestrict(useInjection); +} + +template +MultiResGrid:: +MultiResGrid(size_t levels, GridPtr grid, bool useInjection) + : MetaMap(*grid) + , mTrees(levels) + , mTransform( grid->transform().copy() ) +{ + this->initMeta(); + mTrees[0] = grid->treePtr();// steal tree from input grid + mTrees[0]->voxelizeActiveTiles(); + grid->newTree(); + this->topDownRestrict(useInjection); +} + +template +inline TreeType& MultiResGrid:: +tree(size_t level) +{ + assert( level < mTrees.size() ); + return *mTrees[level]; +} + +template +inline const TreeType& MultiResGrid:: +constTree(size_t level) const +{ + assert( level < mTrees.size() ); + return *mTrees[level]; +} + +template +inline typename TreeType::Ptr MultiResGrid:: +treePtr(size_t level) +{ + assert( level < mTrees.size() ); + return mTrees[level]; +} + +template +inline typename TreeType::ConstPtr MultiResGrid:: +constTreePtr(size_t level) const +{ + assert( level < mTrees.size() ); + return mTrees[level]; +} + +template +typename Grid::Ptr MultiResGrid:: +grid(size_t level) +{ + typename Grid::Ptr grid = Grid::create(this->treePtr(level)); + math::Transform::Ptr xform = mTransform->copy(); + if (level>0) xform->preScale( Real(1 << level) ); + grid->setTransform( xform ); + grid->insertMeta( *this->copyMeta() ); + grid->insertMeta( "MultiResGrid_Level", Int64Metadata(level)); + std::stringstream ss; + ss << this->getName() << "_level_" << level; + grid->setName( ss.str() ); + return grid; +} + +template +inline typename Grid::ConstPtr MultiResGrid:: +grid(size_t level) const +{ + return const_cast(this)->grid(level); +} + +template +template +typename Grid::Ptr MultiResGrid:: +createGrid(float level, size_t grainSize) const +{ + assert( level >= 0.0f && level <= float(mTrees.size()-1) ); + + typename Grid::Ptr grid(new Grid(this->constTree(0).background())); + math::Transform::Ptr xform = mTransform->copy(); + xform->preScale( math::Pow(2.0f, level) ); + grid->setTransform( xform ); + grid->insertMeta( *(this->copyMeta()) ); + grid->insertMeta( "MultiResGrid_Level", FloatMetadata(level) ); + std::stringstream ss; + ss << this->getName() << "_level_" << level; + grid->setName( ss.str() ); + + if ( size_t(floorf(level)) == size_t(ceilf(level)) ) { + grid->setTree( this->constTree( size_t(floorf(level))).copy() ); + } else { + FractionOp tmp(*this, grid->tree(), level, grainSize); + if ( grid->getGridClass() == GRID_LEVEL_SET ) { + signedFloodFill( grid->tree() ); + pruneLevelSet( grid->tree() );//only creates inactive tiles + } + } + + return grid; +} + +template +GridPtrVecPtr MultiResGrid:: +grids() +{ + GridPtrVecPtr grids( new GridPtrVec ); + for (size_t level=0; levelpush_back(this->grid(level)); + return grids; +} + +template +GridCPtrVecPtr MultiResGrid:: +grids() const +{ + GridCPtrVecPtr grids( new GridCPtrVec ); + for (size_t level=0; levelpush_back(this->grid(level)); + return grids; +} + +template +void MultiResGrid:: +write(const std::string &filename) const +{ + io::File file( filename ); + file.write( *this->grids() ); + file.close(); +} + +template +Vec3R MultiResGrid:: +xyz(const Coord& in_ijk, size_t in_level, size_t out_level) +{ + return Vec3R( in_ijk.data() ) * Real(1 << in_level) / Real(1 << out_level); +} + +template +Vec3R MultiResGrid:: +xyz(const Vec3R& in_xyz, size_t in_level, size_t out_level) +{ + return in_xyz * Real(1 << in_level) / Real(1 << out_level); +} + +template +Vec3R MultiResGrid:: +xyz(const Vec3R& in_xyz, double in_level, double out_level) +{ + return in_xyz * math::Pow(2.0, in_level - out_level); + +} + +template +template +typename TreeType::ValueType MultiResGrid:: +sampleValue(const Coord& in_ijk, size_t in_level, size_t out_level) const +{ + assert( in_level >= 0 && in_level < mTrees.size() ); + assert( out_level >= 0 && out_level < mTrees.size() ); + const ConstAccessor acc(*mTrees[out_level]);// has disabled registration! + return tools::Sampler::sample( acc, this->xyz(in_ijk, in_level, out_level) ); +} + +template +template +typename TreeType::ValueType MultiResGrid:: +sampleValue(const Vec3R& in_xyz, size_t in_level, size_t out_level) const +{ + assert( in_level >= 0 && in_level < mTrees.size() ); + assert( out_level >= 0 && out_level < mTrees.size() ); + const ConstAccessor acc(*mTrees[out_level]);// has disabled registration! + return tools::Sampler::sample( acc, this->xyz(in_xyz, in_level, out_level) ); +} + +template +template +typename TreeType::ValueType MultiResGrid:: +sampleValue(const Coord& ijk, double level) const +{ + assert( level >= 0.0 && level <= double(mTrees.size()-1) ); + const size_t level0 = size_t(floor(level)), level1 = size_t(ceil(level)); + const ValueType v0 = this->template sampleValue( ijk, 0, level0 ); + if ( level0 == level1 ) return v0; + assert( level1 - level0 == 1 ); + const ValueType v1 = this->template sampleValue( ijk, 0, level1 ); + const ValueType a = ValueType(level1 - level); + return a * v0 + (ValueType(1) - a) * v1; +} + +template +template +typename TreeType::ValueType MultiResGrid:: +sampleValue(const Vec3R& xyz, double level) const +{ + assert( level >= 0.0 && level <= double(mTrees.size()-1) ); + const size_t level0 = size_t(floor(level)), level1 = size_t(ceil(level)); + const ValueType v0 = this->template sampleValue( xyz, 0, level0 ); + if ( level0 == level1 ) return v0; + assert( level1 - level0 == 1 ); + const ValueType v1 = this->template sampleValue( xyz, 0, level1 ); + const ValueType a = ValueType(level1 - level); + return a * v0 + (ValueType(1) - a) * v1; +} + +template +typename TreeType::ValueType MultiResGrid:: +prolongate(const Coord& ijk, const size_t level) const +{ + assert( level+1 < mTrees.size() ); + const ConstAccessor acc(*mTrees[level + 1]);// has disabled registration! + return ProlongateOp::run(ijk, acc); +} + +template +void MultiResGrid:: +prolongateActiveVoxels(size_t destlevel, size_t grainSize) +{ + assert( destlevel < mTrees.size()-1 ); + TreeType &fineTree = *mTrees[ destlevel ]; + const TreeType &coarseTree = *mTrees[ destlevel+1 ]; + CookOp tmp( coarseTree, fineTree, grainSize ); + +}; + +template +typename TreeType::ValueType MultiResGrid:: +restrict(Coord ijk, const size_t destlevel, bool useInjection) const +{ + assert( destlevel > 0 && destlevel < mTrees.size() ); + const TreeType &fineTree = *mTrees[ destlevel-1 ]; + if ( useInjection ) return fineTree.getValue(ijk<<1); + const ConstAccessor acc( fineTree );// has disabled registration! + return RestrictOp::run( ijk, acc); +}; + +template +void MultiResGrid:: +restrictActiveVoxels(size_t destlevel, size_t grainSize) +{ + assert( destlevel > 0 && destlevel < mTrees.size() ); + const TreeType &fineTree = *mTrees[ destlevel-1 ]; + TreeType &coarseTree = *mTrees[ destlevel ]; + CookOp tmp( fineTree, coarseTree, grainSize ); +}; + +template +void MultiResGrid:: +print(std::ostream& os, int verboseLevel) const +{ + os << "MultiResGrid with " << mTrees.size() << " levels\n"; + for (size_t i=0; iprint(os, verboseLevel); + } + + if ( MetaMap::metaCount() > 0) { + os << "Additional metadata:" << std::endl; + for (ConstMetaIterator it = beginMeta(), end = endMeta(); it != end; ++it) { + os << " " << it->first; + if (it->second) { + const std::string value = it->second->str(); + if (!value.empty()) os << ": " << value; + } + os << "\n"; + } + } + + os << "Transform:" << std::endl; + transform().print(os, /*indent=*/" "); + os << std::endl; +} + +template +void MultiResGrid:: +initMeta() +{ + const size_t levels = this->numLevels(); + if (levels < 2) { + OPENVDB_THROW(ValueError, "MultiResGrid: at least two levels are required"); + } + this->insertMeta("MultiResGrid_Levels", Int64Metadata( levels ) ); +} + +template +void MultiResGrid:: +topDownRestrict(bool useInjection) +{ + const bool isLevelSet = this->getGridClass() == GRID_LEVEL_SET; + for (size_t n=1; n> 1, *it ); + } + } else {// Restriction by full-weighting + MaskOp tmp(fineTree, coarseTree, 128); + this->restrictActiveVoxels(n, 64); + } + if ( isLevelSet ) { + tools::signedFloodFill( coarseTree ); + tools::pruneLevelSet( coarseTree );//only creates inactive tiles + } + }// loop over grid levels +} + +template +struct MultiResGrid::MaskOp +{ + typedef typename TreeType::template ValueConverter::Type MaskT; + typedef tbb::enumerable_thread_specific PoolType; + typedef tree::LeafManager ManagerT; + typedef typename ManagerT::LeafRange RangeT; + typedef typename ManagerT::LeafNodeType::ValueOnCIter VoxelIterT; + + MaskOp(const TreeType& fineTree, TreeType& coarseTree, size_t grainSize = 1) + : mPool(new PoolType( coarseTree ) )// empty coarse tree acts as examplar + { + assert( coarseTree.empty() ); + + // Create Mask of restruction performed on fineTree + MaskT mask(fineTree, false, true, TopologyCopy() ); + + // Muli-threaded dilation which also linearizes the tree to leaf nodes + tools::dilateActiveValues(mask, 1, NN_FACE_EDGE_VERTEX, EXPAND_TILES); + + // Restriction by injection using thread-local storage of coarse tree masks + ManagerT leafs( mask ); + tbb::parallel_for(leafs.leafRange( grainSize ), *this); + + // multithreaded union of thread-local coarse tree masks with the coarse tree + typedef typename PoolType::const_iterator IterT; + for (IterT it=mPool->begin(); it!=mPool->end(); ++it) coarseTree.topologyUnion( *it ); + delete mPool; + } + void operator()(const RangeT& range) const + { + Accessor coarseAcc( mPool->local() );// disabled registration + for (typename RangeT::Iterator leafIter = range.begin(); leafIter; ++leafIter) { + for (VoxelIterT voxelIter = leafIter->cbeginValueOn(); voxelIter; ++voxelIter) { + Coord ijk = voxelIter.getCoord(); + if ( (ijk[2] & 1) || (ijk[1] & 1) || (ijk[0] & 1) ) continue;//no overlap + coarseAcc.setValueOn( ijk >> 1 );//injection from fine to coarse level + }//loop over active voxels in the fine tree + }// loop over leaf nodes in the fine tree + } + PoolType* mPool; +};// MaskOp + +template +template +struct MultiResGrid::FractionOp +{ + typedef typename TreeType::template ValueConverter::Type MaskT; + typedef tbb::enumerable_thread_specific PoolType; + typedef typename PoolType::iterator PoolIterT; + typedef tree::LeafManager Manager1; + typedef tree::LeafManager Manager2; + typedef typename Manager1::LeafRange Range1; + typedef typename Manager2::LeafRange Range2; + + FractionOp(const MultiResGrid& parent, + TreeType& midTree, + float level, + size_t grainSize = 1) + : mLevel( level ) + , mPool( NULL ) + , mTree0( &*(parent.mTrees[size_t(floorf(level))]) )//high-resolution + , mTree1( &*(parent.mTrees[size_t(ceilf(level))]) ) //low-resolution + { + assert( midTree.empty() ); + assert( mTree0 != mTree1 ); + + // Create a pool of thread-local masks + MaskT examplar( false ); + mPool = new PoolType( examplar ); + + {// create mask from re-mapping coarse tree to mid-level tree + tree::LeafManager manager( *mTree1 ); + tbb::parallel_for( manager.leafRange(grainSize), *this ); + } + + // Multi-threaded dilation of mask + tbb::parallel_for(tbb::blocked_range(mPool->begin(),mPool->end(),1), *this); + + // Union thread-local coarse tree masks into the coarse tree + for (PoolIterT it=mPool->begin(); it!=mPool->end(); ++it) midTree.topologyUnion( *it ); + delete mPool; + + {// Interpolate values into the static mid level tree + Manager2 manager( midTree ); + tbb::parallel_for(manager.leafRange(grainSize), *this); + } + } + void operator()(const Range1& range) const + { + typedef typename Manager1::LeafNodeType::ValueOnCIter VoxelIter; + // Let mLevel = level + frac, where + // level is integer part of mLevel and frac is the fractional part + // low-res voxel size in world units = dx1 = 2^(level + 1) + // mid-res voxel size in world units = dx = 2^(mLevel) = 2^(level + frac) + // low-res index -> world: ijk * dx1 + // world -> mid-res index: world / dx + // low-res index -> mid-res index: (ijk * dx1) / dx = ijk * scale where + // scale = dx1/dx = 2^(level+1)/2^(level+frac) = 2^(1-frac) + const float scale = math::Pow(2.0f, 1.0f - math::FractionalPart(mLevel)); + tree::ValueAccessor acc( mPool->local() );// disabled registration + for (typename Range1::Iterator leafIter = range.begin(); leafIter; ++leafIter) { + for (VoxelIter voxelIter = leafIter->cbeginValueOn(); voxelIter; ++voxelIter) { + Coord ijk = voxelIter.getCoord(); + ijk[0] = int(math::Round(ijk[0] * scale)); + ijk[1] = int(math::Round(ijk[1] * scale)); + ijk[2] = int(math::Round(ijk[2] * scale)); + acc.setValueOn( ijk ); + }//loop over active voxels in the fine tree + }// loop over leaf nodes in the fine tree + } + void operator()(const tbb::blocked_range& range) const + { + for (PoolIterT it=range.begin(); it!=range.end(); ++it) { + tools::dilateVoxels( *it, 1, NN_FACE_EDGE_VERTEX); + } + } + void operator()(const Range2 &r) const + { + typedef typename TreeType::LeafNodeType::ValueOnIter VoxelIter; + // Let mLevel = level + frac, where + // level is integer part of mLevel and frac is the fractional part + // high-res voxel size in world units = dx0 = 2^(level) + // low-res voxel size in world units = dx1 = 2^(level+1) + // mid-res voxel size in world units = dx = 2^(mLevel) = 2^(level + frac) + // mid-res index -> world: ijk * dx + // world -> high-res index: world / dx0 + // world -> low-res index: world / dx1 + // mid-res index -> high-res index: (ijk * dx) / dx0 = ijk * scale0 where + // scale0 = dx/dx0 = 2^(level+frac)/2^(level) = 2^(frac) + // mid-res index -> low-res index: (ijk * dx) / dx1 = ijk * scale1 where + // scale1 = dx/dx1 = 2^(level+frac)/2^(level+1) = 2^(frac-1) + const float b = math::FractionalPart(mLevel), a = 1.0f - b; + const float scale0 = math::Pow( 2.0f, b ); + const float scale1 = math::Pow( 2.0f,-a ); + ConstAccessor acc0( *mTree0 ), acc1( *mTree1 ); + for (typename Range2::Iterator leafIter = r.begin(); leafIter; ++leafIter) { + for (VoxelIter voxelIter = leafIter->beginValueOn(); voxelIter; ++voxelIter) { + const Vec3R xyz = Vec3R( voxelIter.getCoord().data() );// mid level coord + const ValueType v0 = tools::Sampler::sample( acc0, xyz * scale0 ); + const ValueType v1 = tools::Sampler::sample( acc1, xyz * scale1 ); + voxelIter.setValue( ValueType(a*v0 + b*v1) ); + } + } + } + const float mLevel; + PoolType* mPool; + const TreeType *mTree0, *mTree1; +};// FractionOp + +template +template +struct MultiResGrid::CookOp +{ + typedef tree::LeafManager ManagerT; + typedef typename ManagerT::LeafRange RangeT; + CookOp(const TreeType& srcTree, TreeType& dstTree, size_t grainSize) : acc( srcTree ) + { + ManagerT leafs( dstTree ); + tbb::parallel_for( leafs.leafRange( grainSize ), *this ); + } + CookOp(const CookOp &other) : acc( other.acc.tree() ) {} + void operator()(const RangeT& range) const + { + typedef typename RangeT::Iterator LeafIterT; + typedef typename ManagerT::LeafNodeType::ValueOnIter VoxelIterT; + for (LeafIterT leaf = range.begin(); leaf; ++leaf) { + ValueType* phi = leaf.buffer(0).data();// avoids small overhead of out-of-core + for (VoxelIterT voxel = leaf->beginValueOn(); voxel; ++voxel) { + phi[ voxel.pos() ] = OperatorType::run(voxel.getCoord(), acc); + } + } + } + const ConstAccessor acc; +};// CookOp + +template +struct MultiResGrid::RestrictOp +{ + /// @brief Static method that performs restriction by full weighting + /// @param ijk Coordinate location on the coarse tree + /// @param acc ValueAccessor to the fine tree + static ValueType run(Coord ijk, const ConstAccessor &acc) + { + ijk <<= 1; + // Overlapping grid point + ValueType v = 8*acc.getValue(ijk); + // neighbors in one axial direction + v += 4*(acc.getValue(ijk.offsetBy(-1, 0, 0)) + acc.getValue(ijk.offsetBy( 1, 0, 0)) +// x + acc.getValue(ijk.offsetBy( 0,-1, 0)) + acc.getValue(ijk.offsetBy( 0, 1, 0)) +// y + acc.getValue(ijk.offsetBy( 0, 0,-1)) + acc.getValue(ijk.offsetBy( 0, 0, 1)));// z + // neighbors in two axial directions + v += 2*(acc.getValue(ijk.offsetBy(-1,-1, 0)) + acc.getValue(ijk.offsetBy(-1, 1, 0)) +// xy + acc.getValue(ijk.offsetBy( 1,-1, 0)) + acc.getValue(ijk.offsetBy( 1, 1, 0)) +// xy + acc.getValue(ijk.offsetBy(-1, 0,-1)) + acc.getValue(ijk.offsetBy(-1, 0, 1)) +// xz + acc.getValue(ijk.offsetBy( 1, 0,-1)) + acc.getValue(ijk.offsetBy( 1, 0, 1)) +// xz + acc.getValue(ijk.offsetBy( 0,-1,-1)) + acc.getValue(ijk.offsetBy( 0,-1, 1)) +// yz + acc.getValue(ijk.offsetBy( 0, 1,-1)) + acc.getValue(ijk.offsetBy( 0, 1, 1)));// yz + // neighbors in three axial directions + for (int i=-1; i<=1; i+=2) { + for (int j=-1; j<=1; j+=2) { + for (int k=-1; k<=1; k+=2) v += acc.getValue(ijk.offsetBy(i,j,k));// xyz + } + } + v *= ValueType(1.0f/64.0f); + return v; + } +};// RestrictOp + +template +struct MultiResGrid::ProlongateOp +{ + /// @brief Interpolate values from a coarse grid (acc) into the index space (ijk) of a fine grid + /// @param ijk Coordinate location on the fine tree + /// @param acc ValueAccessor to the coarse tree + static ValueType run(const Coord& ijk, const ConstAccessor &acc) + { + switch ( (ijk[0] & 1) | ((ijk[1] & 1) << 1) | ((ijk[2] & 1) << 2) ) { + case 0:// all even + return acc.getValue(ijk>>1); + case 1:// x is odd + return ValueType(0.5)*(acc.getValue(ijk.offsetBy(-1,0,0)>>1) + + acc.getValue(ijk.offsetBy( 1,0,0)>>1)); + case 2:// y is odd + return ValueType(0.5)*(acc.getValue(ijk.offsetBy(0,-1,0)>>1) + + acc.getValue(ijk.offsetBy(0, 1,0)>>1)); + case 3:// x&y are odd + return ValueType(0.25)*(acc.getValue(ijk.offsetBy(-1,-1,0)>>1) + + acc.getValue(ijk.offsetBy(-1, 1,0)>>1) + + acc.getValue(ijk.offsetBy( 1,-1,0)>>1) + + acc.getValue(ijk.offsetBy( 1, 1,0)>>1)); + case 4:// z is odd + return ValueType(0.5)*(acc.getValue(ijk.offsetBy(0,0,-1)>>1) + + acc.getValue(ijk.offsetBy(0,0, 1)>>1)); + case 5:// x&z are odd + return ValueType(0.25)*(acc.getValue(ijk.offsetBy(-1,0,-1)>>1) + + acc.getValue(ijk.offsetBy(-1,0, 1)>>1) + + acc.getValue(ijk.offsetBy( 1,0,-1)>>1) + + acc.getValue(ijk.offsetBy( 1,0, 1)>>1)); + case 6:// y&z are odd + return ValueType(0.25)*(acc.getValue(ijk.offsetBy(0,-1,-1)>>1) + + acc.getValue(ijk.offsetBy(0,-1, 1)>>1) + + acc.getValue(ijk.offsetBy(0, 1,-1)>>1) + + acc.getValue(ijk.offsetBy(0, 1, 1)>>1)); + } + // all are odd + ValueType v = zeroVal(); + for (int i=-1; i<=1; i+=2) { + for (int j=-1; j<=1; j+=2) { + for (int k=-1; k<=1; k+=2) v += acc.getValue(ijk.offsetBy(i,j,k)>>1);// xyz + } + } + return ValueType(0.125) * v; + } +};// ProlongateOp + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_MULTIRESGRID_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/ParticleAtlas.h b/nuparu/include/openvdb/include/openvdb/tools/ParticleAtlas.h new file mode 100644 index 00000000..d98e0b54 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/ParticleAtlas.h @@ -0,0 +1,1052 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file ParticleAtlas.h +/// +/// @brief Space-partitioning acceleration structure for particles, points with +/// radius. Partitions particle indices into voxels to accelerate range +/// and nearest neighbor searches. +/// +/// @note   This acceleration structure only stores integer offsets into an external particle +/// data structure that conforms to the ParticleArray interface.  +/// +/// @details Constructs and maintains a sequence of @c PointIndexGrids each of progressively +/// lower resolution. Particles are uniquely assigned to a particular resolution +/// level based on their radius. This strategy has proven efficient for accelerating +/// spatial queries on particle data sets with varying radii. +/// +/// @details The data structure automatically detects and adapts to particle data sets with +/// uniform radii. The construction is simplified and spatial queries pre-cache the +/// uniform particle radius to avoid redundant access calls to the +/// ParticleArray::getRadius method. +/// +/// @author Mihai Alden + + +#ifndef OPENVDB_TOOLS_PARTICLE_ATLAS_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_PARTICLE_ATLAS_HAS_BEEN_INCLUDED + +#include "PointIndexGrid.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + + +//////////////////////////////////////// + + +/// @brief Partition particles and performs range and nearest-neighbor searches. +/// +/// @interface ParticleArray +/// Expected interface for the ParticleArray container: +/// @code +/// template +/// struct ParticleArray +/// { +/// // The type used to represent world-space positions +/// typedef VectorType PosType; +/// typedef typename PosType::value_type ScalarType; +/// +/// // Return the number of particles in the array +/// size_t size() const; +/// +/// // Return the world-space position for the nth particle. +/// void getPos(size_t n, PosType& xyz) const; +/// +/// // Return the world-space radius for the nth particle. +/// void getRadius(size_t n, ScalarType& radius) const; +/// }; +/// @endcode +/// +/// @details Constructs a collection of @c PointIndexGrids of different resolutions +/// to accelerate spatial searches for particles with varying radius. +template +struct ParticleAtlas +{ + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + typedef typename PointIndexGridType::Ptr PointIndexGridPtr; + typedef typename PointIndexGridType::ValueType IndexType; + + struct Iterator; + + ////////// + + ParticleAtlas() : mIndexGridArray(), mMinRadiusArray(), mMaxRadiusArray() {} + + /// @brief Partitions particle indices + /// + /// @param particles container conforming to the ParticleArray interface + /// @param minVoxelSize minimum voxel size limit + /// @param maxLevels maximum number of resolution levels + template + void construct(const ParticleArrayType& particles, double minVoxelSize, size_t maxLevels = 50); + + /// @brief Create a new @c ParticleAtlas from the given @a particles. + /// + /// @param particles container conforming to the ParticleArray interface + /// @param minVoxelSize minimum voxel size limit + /// @param maxLevels maximum number of resolution levels + template + static Ptr create(const ParticleArrayType& particles, double minVoxelSize, size_t maxLevels = 50); + + /// @brief Returns the number of resolution levels. + size_t levels() const { return mIndexGridArray.size(); } + /// @brief true if the container size is 0, false otherwise. + bool empty() const { return mIndexGridArray.empty(); } + + /// @brief Returns minimum particle radius for level @a n. + double minRadius(size_t n) const { return mMinRadiusArray[n]; } + /// @brief Returns maximum particle radius for level @a n. + double maxRadius(size_t n) const { return mMaxRadiusArray[n]; } + + /// @brief Returns the @c PointIndexGrid that represents the given level @a n. + PointIndexGridType& pointIndexGrid(size_t n) { return *mIndexGridArray[n]; } + /// @brief Returns the @c PointIndexGrid that represents the given level @a n. + const PointIndexGridType& pointIndexGrid(size_t n) const { return *mIndexGridArray[n]; } + +private: + // Disallow copying + ParticleAtlas(const ParticleAtlas&); + ParticleAtlas& operator=(const ParticleAtlas&); + + std::vector mIndexGridArray; + std::vector mMinRadiusArray, mMaxRadiusArray; +}; // struct ParticleAtlas + + +typedef ParticleAtlas ParticleIndexAtlas; + + +//////////////////////////////////////// + + +/// @brief Provides accelerated range and nearest-neighbor searches for +/// particles that are partitioned using the ParticleAtlas. +/// +/// @note Prefer to construct the iterator object once and reuse it +/// for subsequent queries. +template +struct ParticleAtlas::Iterator +{ + typedef typename PointIndexGridType::TreeType TreeType; + typedef tree::ValueAccessor ConstAccessor; + typedef boost::scoped_ptr ConstAccessorPtr; + + ///// + + /// @brief Construct an iterator from the given @a atlas. + explicit Iterator(const ParticleAtlas& atlas); + + /// @brief Clear the iterator and update it with the result of the given + /// world-space radial query. + /// @param center world-space center + /// @param radius world-space search radius + /// @param particles container conforming to the ParticleArray interface + template + void worldSpaceSearchAndUpdate(const Vec3d& center, double radius, const ParticleArrayType& particles); + + /// @brief Clear the iterator and update it with the result of the given + /// world-space radial query. + /// @param bbox world-space bounding box + /// @param particles container conforming to the ParticleArray interface + template + void worldSpaceSearchAndUpdate(const BBoxd& bbox, const ParticleArrayType& particles); + + /// @brief Returns the total number of resolution levels. + size_t levels() const { return mAtlas->levels(); } + + /// @brief Clear the iterator and update it with all particles that reside + /// at the given resolution @a level. + void updateFromLevel(size_t level); + + /// Reset the iterator to point to the first item. + void reset(); + + /// Return a const reference to the item to which this iterator is pointing. + const IndexType& operator*() const { return *mRange.first; } + + /// @{ + /// @brief Return @c true if this iterator is not yet exhausted. + bool test() const { return mRange.first < mRange.second || mIter != mRangeList.end(); } + operator bool() const { return this->test(); } + /// @} + + /// Advance iterator to next item. + void increment(); + + /// Advance iterator to next item. + void operator++() { this->increment(); } + + /// @brief Advance iterator to next item. + /// @return @c true if this iterator is not yet exhausted. + bool next(); + + /// Return the number of point indices in the iterator range. + size_t size() const; + + /// Return @c true if both iterators point to the same element. + bool operator==(const Iterator& p) const { return mRange.first == p.mRange.first; } + bool operator!=(const Iterator& p) const { return !this->operator==(p); } + +private: + Iterator(const Iterator& rhs); + Iterator& operator=(const Iterator& rhs); + + void clear(); + + typedef std::pair Range; + typedef std::deque RangeDeque; + typedef typename RangeDeque::const_iterator RangeDequeCIter; + typedef boost::scoped_array IndexArray; + + ParticleAtlas const * const mAtlas; + boost::scoped_array mAccessorList; + + // Primary index collection + Range mRange; + RangeDeque mRangeList; + RangeDequeCIter mIter; + // Secondary index collection + IndexArray mIndexArray; + size_t mIndexArraySize, mAccessorListSize; +}; // struct ParticleAtlas::Iterator + + +//////////////////////////////////////// + +// Internal operators and implementation details + + +namespace particle_atlas_internal { + + +template +struct ComputeExtremas { + typedef typename ParticleArrayT::PosType PosType; + typedef typename PosType::value_type ScalarType; + + ComputeExtremas(const ParticleArrayT& particles) + : particleArray(&particles) + , minRadius(std::numeric_limits::max()) + , maxRadius(-std::numeric_limits::max()) + { + } + + ComputeExtremas(ComputeExtremas& rhs, tbb::split) + : particleArray(rhs.particleArray) + , minRadius(std::numeric_limits::max()) + , maxRadius(-std::numeric_limits::max()) + { + } + + void operator()(const tbb::blocked_range& range) { + + ScalarType radius, tmpMin = minRadius, tmpMax = maxRadius; + + for (size_t n = range.begin(), N = range.end(); n != N; ++n) { + particleArray->getRadius(n, radius); + tmpMin = std::min(radius, tmpMin); + tmpMax = std::max(radius, tmpMax); + } + + minRadius = std::min(minRadius, tmpMin); + maxRadius = std::max(maxRadius, tmpMax); + } + + void join(const ComputeExtremas& rhs) { + minRadius = std::min(minRadius, rhs.minRadius); + maxRadius = std::max(maxRadius, rhs.maxRadius); + } + + ParticleArrayT const * const particleArray; + ScalarType minRadius, maxRadius; +}; // struct ComputeExtremas + + +template +struct SplittableParticleArray +{ + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + typedef ParticleArrayT ParticleArray; + + typedef typename ParticleArray::PosType PosType; + typedef typename PosType::value_type ScalarType; + + SplittableParticleArray(const ParticleArrayT& particles) + : mIndexMap(), mParticleArray(&particles), mSize(particles.size()) + { + updateExtremas(); + } + + SplittableParticleArray(const ParticleArrayT& particles, double minR, double maxR) + : mIndexMap(), mParticleArray(&particles), mSize(particles.size()) + { + mMinRadius = ScalarType(minR); + mMaxRadius = ScalarType(maxR); + } + + const ParticleArrayT& particleArray() const { return *mParticleArray; } + + size_t size() const { return mSize; } + + void getPos(size_t n, PosType& xyz) const { return mParticleArray->getPos(getGlobalIndex(n), xyz); } + void getRadius(size_t n, ScalarType& radius) const { return mParticleArray->getRadius(getGlobalIndex(n), radius); } + + ScalarType minRadius() const { return mMinRadius; } + ScalarType maxRadius() const { return mMaxRadius; } + + size_t getGlobalIndex(size_t n) const { return mIndexMap ? size_t(mIndexMap[n]) : n; } + + /// Move all particle indices that have a radius larger or equal to @a maxRadiusLimit + /// into a separate container. + Ptr split(ScalarType maxRadiusLimit) { + + if (mMaxRadius < maxRadiusLimit) return Ptr(); + + boost::scoped_array mask(new bool[mSize]); + + tbb::parallel_for(tbb::blocked_range(0, mSize), + MaskParticles(*this, mask, maxRadiusLimit)); + + Ptr output(new SplittableParticleArray(*this, mask)); + if (output->size() == 0) return Ptr(); + + size_t newSize = 0; + for (size_t n = 0, N = mSize; n < N; ++n) { + newSize += size_t(!mask[n]); + } + + boost::scoped_array newIndexMap(new PointIndex[newSize]); + + setIndexMap(newIndexMap, mask, false); + + mSize = newSize; + mIndexMap.swap(newIndexMap); + updateExtremas(); + + return output; + } + + +private: + // Disallow copying + SplittableParticleArray(const SplittableParticleArray&); + SplittableParticleArray& operator=(const SplittableParticleArray&); + + // Masked copy constructor + SplittableParticleArray(const SplittableParticleArray& other, const boost::scoped_array& mask) + : mIndexMap(), mParticleArray(&other.particleArray()), mSize(0) + { + for (size_t n = 0, N = other.size(); n < N; ++n) { + mSize += size_t(mask[n]); + } + + if (mSize != 0) { + mIndexMap.reset(new PointIndex[mSize]); + other.setIndexMap(mIndexMap, mask, true); + } + + updateExtremas(); + } + + struct MaskParticles { + MaskParticles(const SplittableParticleArray& particles, + const boost::scoped_array& mask, ScalarType radius) + : particleArray(&particles) + , particleMask(mask.get()) + , radiusLimit(radius) + { + } + + void operator()(const tbb::blocked_range& range) const { + const ScalarType maxRadius = radiusLimit; + ScalarType radius; + for (size_t n = range.begin(), N = range.end(); n != N; ++n) { + particleArray->getRadius(n, radius); + particleMask[n] = !(radius < maxRadius); + } + } + + SplittableParticleArray const * const particleArray; + bool * const particleMask; + ScalarType const radiusLimit; + }; // struct MaskParticles + + inline void updateExtremas() { + ComputeExtremas op(*this); + tbb::parallel_reduce(tbb::blocked_range(0, mSize), op); + mMinRadius = op.minRadius; + mMaxRadius = op.maxRadius; + } + + void setIndexMap(boost::scoped_array& newIndexMap, + const boost::scoped_array& mask, bool maskValue) const + { + if (mIndexMap.get() != NULL) { + const PointIndex* indices = mIndexMap.get(); + for (size_t idx = 0, n = 0, N = mSize; n < N; ++n) { + if (mask[n] == maskValue) newIndexMap[idx++] = indices[n]; + } + } else { + for (size_t idx = 0, n = 0, N = mSize; n < N; ++n) { + if (mask[n] == maskValue) newIndexMap[idx++] = PointIndex(n); + } + } + } + + + ////////// + + boost::scoped_array mIndexMap; + ParticleArrayT const * const mParticleArray; + size_t mSize; + ScalarType mMinRadius, mMaxRadius; +}; // struct SplittableParticleArray + + +template +struct RemapIndices { + + RemapIndices(const ParticleArrayType& particles, std::vector nodes) + : mParticles(&particles) + , mNodes(nodes.empty() ? NULL : &nodes.front()) + { + } + + void operator()(const tbb::blocked_range& range) const { + typedef typename PointIndexLeafNodeType::ValueType PointIndexType; + for (size_t n = range.begin(), N = range.end(); n != N; ++n) { + + PointIndexLeafNodeType& node = *mNodes[n]; + const size_t numIndices = node.indices().size(); + + if (numIndices > 0) { + PointIndexType* begin = &node.indices().front(); + const PointIndexType* end = begin + numIndices; + + while (begin < end) { + *begin = PointIndexType(mParticles->getGlobalIndex(*begin)); + ++begin; + } + } + } + } + + ParticleArrayType const * const mParticles; + PointIndexLeafNodeType * const * const mNodes; +}; // struct RemapIndices + + +template +struct RadialRangeFilter +{ + typedef typename ParticleArrayType::PosType PosType; + typedef typename PosType::value_type ScalarType; + + typedef std::pair Range; + typedef std::deque RangeDeque; + typedef std::deque IndexDeque; + + RadialRangeFilter(RangeDeque& ranges, IndexDeque& indices, const PosType& xyz, + ScalarType radius, const ParticleArrayType& particles, bool hasUniformRadius = false) + : mRanges(ranges) + , mIndices(indices) + , mCenter(xyz) + , mRadius(radius) + , mParticles(&particles) + , mHasUniformRadius(hasUniformRadius) + { + if (mHasUniformRadius) { + ScalarType uniformRadius; + mParticles->getRadius(0, uniformRadius); + mRadius = mRadius + uniformRadius; + mRadius *= mRadius; + } + } + + template + void filterLeafNode(const LeafNodeType& leaf) + { + const size_t numIndices = leaf.indices().size(); + if (numIndices > 0) { + const IndexT* begin = &leaf.indices().front(); + filterVoxel(leaf.origin(), begin, begin + numIndices); + } + } + + void filterVoxel(const Coord&, const IndexT* begin, const IndexT* end) + { + PosType pos; + + if (mHasUniformRadius) { + + const ScalarType searchRadiusSqr = mRadius; + + while (begin < end) { + mParticles->getPos(size_t(*begin), pos); + const ScalarType distSqr = (mCenter - pos).lengthSqr(); + if (distSqr < searchRadiusSqr) { + mIndices.push_back(*begin); + } + ++begin; + } + } else { + while (begin < end) { + const size_t idx = size_t(*begin); + mParticles->getPos(idx, pos); + + ScalarType radius; + mParticles->getRadius(idx, radius); + + ScalarType searchRadiusSqr = mRadius + radius; + searchRadiusSqr *= searchRadiusSqr; + + const ScalarType distSqr = (mCenter - pos).lengthSqr(); + + if (distSqr < searchRadiusSqr) { + mIndices.push_back(*begin); + } + + ++begin; + } + } + } + +private: + RadialRangeFilter(const RadialRangeFilter&); + RadialRangeFilter& operator=(const RadialRangeFilter&); + + RangeDeque& mRanges; + IndexDeque& mIndices; + PosType const mCenter; + ScalarType mRadius; + ParticleArrayType const * const mParticles; + bool const mHasUniformRadius; +}; // struct RadialRangeFilter + + +template +struct BBoxFilter +{ + typedef typename ParticleArrayType::PosType PosType; + typedef typename PosType::value_type ScalarType; + + typedef std::pair Range; + typedef std::deque RangeDeque; + typedef std::deque IndexDeque; + + BBoxFilter(RangeDeque& ranges, IndexDeque& indices, + const BBoxd& bbox, const ParticleArrayType& particles, bool hasUniformRadius = false) + : mRanges(ranges) + , mIndices(indices) + , mBBox(PosType(bbox.min()), PosType(bbox.max())) + , mCenter(mBBox.getCenter()) + , mParticles(&particles) + , mHasUniformRadius(hasUniformRadius) + , mUniformRadiusSqr(ScalarType(0.0)) + { + if (mHasUniformRadius) { + mParticles->getRadius(0, mUniformRadiusSqr); + mUniformRadiusSqr *= mUniformRadiusSqr; + } + } + + template + void filterLeafNode(const LeafNodeType& leaf) + { + const size_t numIndices = leaf.indices().size(); + if (numIndices > 0) { + const IndexT* begin = &leaf.indices().front(); + filterVoxel(leaf.origin(), begin, begin + numIndices); + } + } + + void filterVoxel(const Coord&, const IndexT* begin, const IndexT* end) + { + PosType pos; + + if (mHasUniformRadius) { + const ScalarType radiusSqr = mUniformRadiusSqr; + + while (begin < end) { + + mParticles->getPos(size_t(*begin), pos); + if (mBBox.isInside(pos)) { + mIndices.push_back(*begin++); + continue; + } + + const ScalarType distSqr = pointToBBoxDistSqr(pos); + if (!(distSqr > radiusSqr)) { + mIndices.push_back(*begin); + } + + ++begin; + } + + } else { + while (begin < end) { + + const size_t idx = size_t(*begin); + mParticles->getPos(idx, pos); + if (mBBox.isInside(pos)) { + mIndices.push_back(*begin++); + continue; + } + + ScalarType radius; + mParticles->getRadius(idx, radius); + const ScalarType distSqr = pointToBBoxDistSqr(pos); + if (!(distSqr > (radius * radius))) { + mIndices.push_back(*begin); + } + + ++begin; + } + } + } + +private: + BBoxFilter(const BBoxFilter&); + BBoxFilter& operator=(const BBoxFilter&); + + ScalarType pointToBBoxDistSqr(const PosType& pos) const + { + ScalarType distSqr = ScalarType(0.0); + + for (int i = 0; i < 3; ++i) { + + const ScalarType a = pos[i]; + + ScalarType b = mBBox.min()[i]; + if (a < b) { + ScalarType delta = b - a; + distSqr += delta * delta; + } + + b = mBBox.max()[i]; + if (a > b) { + ScalarType delta = a - b; + distSqr += delta * delta; + } + } + + return distSqr; + } + + RangeDeque& mRanges; + IndexDeque& mIndices; + math::BBox const mBBox; + PosType const mCenter; + ParticleArrayType const * const mParticles; + bool const mHasUniformRadius; + ScalarType mUniformRadiusSqr; +}; // struct BBoxFilter + + +} // namespace particle_atlas_internal + + +//////////////////////////////////////// + + +template +template +inline void +ParticleAtlas::construct( + const ParticleArrayType& particles, double minVoxelSize, size_t maxLevels) +{ + typedef typename particle_atlas_internal:: + SplittableParticleArray SplittableParticleArray; + typedef typename SplittableParticleArray::Ptr SplittableParticleArrayPtr; + typedef typename ParticleArrayType::ScalarType ScalarType; + + ///// + + particle_atlas_internal::ComputeExtremas extremas(particles); + tbb::parallel_reduce(tbb::blocked_range(0, particles.size()), extremas); + const double firstMin = extremas.minRadius; + const double firstMax = extremas.maxRadius; + const double firstVoxelSize = std::max(minVoxelSize, firstMin); + + if (!(firstMax < (firstVoxelSize * double(2.0))) && maxLevels > 1) { + + std::vector levels; + levels.push_back(SplittableParticleArrayPtr( + new SplittableParticleArray(particles, firstMin, firstMax))); + + std::vector voxelSizeArray; + voxelSizeArray.push_back(firstVoxelSize); + + for (size_t n = 0; n < maxLevels; ++n) { + + const double maxParticleRadius = double(levels.back()->maxRadius()); + const double particleRadiusLimit = voxelSizeArray.back() * double(2.0); + if (maxParticleRadius < particleRadiusLimit) break; + + SplittableParticleArrayPtr newLevel = levels.back()->split(ScalarType(particleRadiusLimit)); + if (!newLevel) break; + + levels.push_back(newLevel); + voxelSizeArray.push_back(double(newLevel->minRadius())); + } + + size_t numPoints = 0; + + typedef typename PointIndexGridType::TreeType PointIndexTreeType; + typedef typename PointIndexTreeType::LeafNodeType PointIndexLeafNodeType; + + std::vector nodes; + + for (size_t n = 0, N = levels.size(); n < N; ++n) { + + const SplittableParticleArray& particleArray = *levels[n]; + + numPoints += particleArray.size(); + + mMinRadiusArray.push_back(double(particleArray.minRadius())); + mMaxRadiusArray.push_back(double(particleArray.maxRadius())); + + PointIndexGridPtr grid = createPointIndexGrid(particleArray, voxelSizeArray[n]); + + nodes.clear(); + grid->tree().getNodes(nodes); + + tbb::parallel_for(tbb::blocked_range(0, nodes.size()), + particle_atlas_internal::RemapIndices + (particleArray, nodes)); + + mIndexGridArray.push_back(grid); + } + + } else { + mMinRadiusArray.push_back(firstMin); + mMaxRadiusArray.push_back(firstMax); + mIndexGridArray.push_back( + createPointIndexGrid(particles, firstVoxelSize)); + } +} + + +template +template +inline typename ParticleAtlas::Ptr +ParticleAtlas::create( + const ParticleArrayType& particles, double minVoxelSize, size_t maxLevels) +{ + Ptr ret(new ParticleAtlas()); + ret->construct(particles, minVoxelSize, maxLevels); + return ret; +} + + +//////////////////////////////////////// + +// ParticleAtlas::Iterator implementation + +template +inline +ParticleAtlas::Iterator::Iterator(const ParticleAtlas& atlas) + : mAtlas(&atlas) + , mAccessorList() + , mRange(static_cast(NULL), static_cast(NULL)) + , mRangeList() + , mIter(mRangeList.begin()) + , mIndexArray() + , mIndexArraySize(0) + , mAccessorListSize(atlas.levels()) +{ + if (mAccessorListSize > 0) { + mAccessorList.reset(new ConstAccessorPtr[mAccessorListSize]); + for (size_t n = 0, N = mAccessorListSize; n < N; ++n) { + mAccessorList[n].reset(new ConstAccessor(atlas.pointIndexGrid(n).tree())); + } + } +} + + +template +inline void +ParticleAtlas::Iterator::reset() +{ + mIter = mRangeList.begin(); + if (!mRangeList.empty()) { + mRange = mRangeList.front(); + } else if (mIndexArray) { + mRange.first = mIndexArray.get(); + mRange.second = mRange.first + mIndexArraySize; + } else { + mRange.first = static_cast(NULL); + mRange.second = static_cast(NULL); + } +} + + +template +inline void +ParticleAtlas::Iterator::increment() +{ + ++mRange.first; + if (mRange.first >= mRange.second && mIter != mRangeList.end()) { + ++mIter; + if (mIter != mRangeList.end()) { + mRange = *mIter; + } else if (mIndexArray) { + mRange.first = mIndexArray.get(); + mRange.second = mRange.first + mIndexArraySize; + } + } +} + + +template +inline bool +ParticleAtlas::Iterator::next() +{ + if (!this->test()) return false; + this->increment(); + return this->test(); +} + + +template +inline size_t +ParticleAtlas::Iterator::size() const +{ + size_t count = 0; + typename RangeDeque::const_iterator it = + mRangeList.begin(), end = mRangeList.end(); + + for ( ; it != end; ++it) { + count += it->second - it->first; + } + + return count + mIndexArraySize; +} + + +template +inline void +ParticleAtlas::Iterator::clear() +{ + mRange.first = static_cast(NULL); + mRange.second = static_cast(NULL); + mRangeList.clear(); + mIter = mRangeList.end(); + mIndexArray.reset(); + mIndexArraySize = 0; +} + + +template +inline void +ParticleAtlas::Iterator::updateFromLevel(size_t level) +{ + typedef typename PointIndexGridType::TreeType TreeType; + typedef typename TreeType::LeafNodeType LeafNodeType; + + this->clear(); + + if (mAccessorListSize > 0) { + const size_t levelIdx = std::min(mAccessorListSize - 1, level); + + const TreeType& tree = mAtlas->pointIndexGrid(levelIdx).tree(); + + + std::vector nodes; + tree.getNodes(nodes); + + for (size_t n = 0, N = nodes.size(); n < N; ++n) { + + const LeafNodeType& node = *nodes[n]; + const size_t numIndices = node.indices().size(); + + if (numIndices > 0) { + const IndexType* begin = &node.indices().front(); + mRangeList.push_back(Range(begin, (begin + numIndices))); + } + } + } + + this->reset(); +} + + +template +template +inline void +ParticleAtlas::Iterator::worldSpaceSearchAndUpdate( + const Vec3d& center, double radius, const ParticleArrayType& particles) +{ + typedef typename ParticleArrayType::PosType PosType; + typedef typename ParticleArrayType::ScalarType ScalarType; + + ///// + + this->clear(); + + std::deque filteredIndices; + std::vector searchRegions; + + const double iRadius = radius * double(1.0 / std::sqrt(3.0)); + + const Vec3d ibMin(center[0] - iRadius, center[1] - iRadius, center[2] - iRadius); + const Vec3d ibMax(center[0] + iRadius, center[1] + iRadius, center[2] + iRadius); + + const Vec3d bMin(center[0] - radius, center[1] - radius, center[2] - radius); + const Vec3d bMax(center[0] + radius, center[1] + radius, center[2] + radius); + + const PosType pos = PosType(center); + const ScalarType dist = ScalarType(radius); + + for (size_t n = 0, N = mAccessorListSize; n < N; ++n) { + + const double maxRadius = mAtlas->maxRadius(n); + const bool uniformRadius = math::isApproxEqual(mAtlas->minRadius(n), maxRadius); + + const openvdb::math::Transform& xform = mAtlas->pointIndexGrid(n).transform(); + + ConstAccessor& acc = *mAccessorList[n]; + + openvdb::CoordBBox inscribedRegion( + xform.worldToIndexCellCentered(ibMin), + xform.worldToIndexCellCentered(ibMax)); + + inscribedRegion.expand(-1); // erode by one voxel + + // collect indices that don't need to be tested + point_index_grid_internal::pointIndexSearch(mRangeList, acc, inscribedRegion); + + searchRegions.clear(); + + const openvdb::CoordBBox region( + xform.worldToIndexCellCentered(bMin - maxRadius), + xform.worldToIndexCellCentered(bMax + maxRadius)); + + inscribedRegion.expand(1); + point_index_grid_internal::constructExclusiveRegions(searchRegions, region, inscribedRegion); + + typedef particle_atlas_internal::RadialRangeFilter FilterType; + FilterType filter(mRangeList, filteredIndices, pos, dist, particles, uniformRadius); + + for (size_t i = 0, I = searchRegions.size(); i < I; ++i) { + point_index_grid_internal::filteredPointIndexSearch(filter, acc, searchRegions[i]); + } + } + + point_index_grid_internal::dequeToArray(filteredIndices, mIndexArray, mIndexArraySize); + + this->reset(); +} + + +template +template +inline void +ParticleAtlas::Iterator::worldSpaceSearchAndUpdate( + const BBoxd& bbox, const ParticleArrayType& particles) +{ + typedef typename ParticleArrayType::PosType PosType; + typedef typename ParticleArrayType::ScalarType ScalarType; + + ///// + + this->clear(); + + std::deque filteredIndices; + std::vector searchRegions; + + for (size_t n = 0, N = mAccessorListSize; n < N; ++n) { + + const double maxRadius = mAtlas->maxRadius(n); + const bool uniformRadius = math::isApproxEqual(mAtlas->minRadius(n), maxRadius); + const openvdb::math::Transform& xform = mAtlas->pointIndexGrid(n).transform(); + + ConstAccessor& acc = *mAccessorList[n]; + + openvdb::CoordBBox inscribedRegion( + xform.worldToIndexCellCentered(bbox.min()), + xform.worldToIndexCellCentered(bbox.max())); + + inscribedRegion.expand(-1); // erode by one voxel + + // collect indices that don't need to be tested + point_index_grid_internal::pointIndexSearch(mRangeList, acc, inscribedRegion); + + searchRegions.clear(); + + const openvdb::CoordBBox region( + xform.worldToIndexCellCentered(bbox.min() - maxRadius), + xform.worldToIndexCellCentered(bbox.max() + maxRadius)); + + inscribedRegion.expand(1); + point_index_grid_internal::constructExclusiveRegions(searchRegions, region, inscribedRegion); + + typedef particle_atlas_internal::BBoxFilter FilterType; + FilterType filter(mRangeList, filteredIndices, bbox, particles, uniformRadius); + + for (size_t i = 0, I = searchRegions.size(); i < I; ++i) { + point_index_grid_internal::filteredPointIndexSearch(filter, acc, searchRegions[i]); + } + } + + point_index_grid_internal::dequeToArray(filteredIndices, mIndexArray, mIndexArraySize); + + this->reset(); +} + + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_PARTICLE_ATLAS_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/ParticlesToLevelSet.h b/nuparu/include/openvdb/include/openvdb/tools/ParticlesToLevelSet.h new file mode 100644 index 00000000..5570f19a --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/ParticlesToLevelSet.h @@ -0,0 +1,924 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @author Ken Museth +/// +/// @file ParticlesToLevelSet.h +/// +/// @brief This tool converts particles (with position, radius and velocity) +/// into a signed distance field encoded as a narrow band level set. +/// Optionally, arbitrary attributes on the particles can be transferred +/// resulting in an additional attribute grid with the same topology +/// as the level set grid. +/// +/// @note This fast particle to level set converter is always intended +/// to be combined with some kind of surface post processing, +/// i.e. tools::Filter. Without such post processing the generated +/// surface is typically too noisy and blobby. However it serves as a +/// great and fast starting point for subsequent level set surface +/// processing and convolution. +/// +/// The @c ParticleListT template argument below refers to any class +/// with the following interface (see unittest/TestParticlesToLevelSet.cc +/// and SOP_DW_OpenVDBParticleVoxelizer for practical examples): +/// @code +/// +/// class ParticleList { +/// ... +/// public: +/// typedef openvdb::Vec3R PosType; +/// +/// // Return the total number of particles in list. +/// // Always required! +/// size_t size() const; +/// +/// // Get the world space position of the nth particle. +/// // Required by ParticledToLevelSet::rasterizeSphere(*this,radius). +/// void getPos(size_t n, Vec3R& xyz) const; +/// +/// // Get the world space position and radius of the nth particle. +/// // Required by ParticledToLevelSet::rasterizeSphere(*this). +/// void getPosRad(size_t n, Vec3R& xyz, Real& rad) const; +/// +/// // Get the world space position, radius and velocity of the nth particle. +/// // Required by ParticledToLevelSet::rasterizeSphere(*this,radius). +/// void getPosRadVel(size_t n, Vec3R& xyz, Real& rad, Vec3R& vel) const; +/// +/// // Get the attribute of the nth particle. AttributeType is user-defined! +/// // Only required if attribute transfer is enabled in ParticlesToLevelSet. +/// void getAtt(size_t n, AttributeType& att) const; +/// }; +/// @endcode +/// +/// @note See unittest/TestParticlesToLevelSet.cc for an example. +/// +/// The @c InterruptT template argument below refers to any class +/// with the following interface: +/// @code +/// class Interrupter { +/// ... +/// public: +/// void start(const char* name = NULL)// called when computations begin +/// void end() // called when computations end +/// bool wasInterrupted(int percent=-1)// return true to break computation +/// }; +/// @endcode +/// +/// @note If no template argument is provided for this InterruptT +/// the util::NullInterrupter is used which implies that all +/// interrupter calls are no-ops (i.e. incurs no computational overhead). + +#ifndef OPENVDB_TOOLS_PARTICLES_TO_LEVELSET_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_PARTICLES_TO_LEVELSET_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "Composite.h" // for csgUnion() +#include "PointMaskGrid.h" +#include "PointPartitioner.h" +#include "Morphology.h" // for {dilate|erode}Voxels +#include "Prune.h" +#include "SignedFloodFill.h" +#include "LevelSetTracker.h" +#include "MaskToLevelSet.h" + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +namespace { +// This is a simple type that combines a distance value and a particle +// attribute. It's required for attribute transfer which is performed +// in the ParticlesToLevelSet::Raster member class defined below. +template class BlindData; +}// unnamed namespace + + +template +class ParticlesToLevelSet +{ +public: + typedef typename boost::is_void::type DisableT; + typedef InterrupterT InterrupterType; + + typedef SdfGridT SdfGridType; + typedef typename SdfGridT::ValueType SdfType; + + typedef typename boost::mpl::if_::type AttType; + typedef typename SdfGridT::template ValueConverter::Type AttGridType; + + BOOST_STATIC_ASSERT(boost::is_floating_point::value); + + /// @brief Constructor using an exiting signed distance, + /// i.e. narrow band level set, grid. + /// + /// @param grid Level set grid in which particles are rasterized + /// @param interrupt Callback to interrupt a long-running process + /// + /// @note The input grid is assumed to be a valid level set and if + /// it already contains voxels (with SDF values) particles are unioned + /// onto the existing level set surface. However, if attribute transfer + /// is enabled, i.e. AttributeT != void, attributes are only + /// generated for voxels that overlap with particles, not the existing + /// voxels in the input grid (for which no attributes exist!). + /// + /// @details The width in voxel units of the generated narrow band level set is + /// given by 2*background/dx, where background is the background value + /// stored in the grid, and dx is the voxel size derived from the + /// transform also stored in the grid. Also note that -background + /// corresponds to the constant value inside the generated narrow + /// band level sets. Finally the default NullInterrupter should + /// compile out interruption checks during optimization, thus + /// incurring no run-time overhead. + explicit ParticlesToLevelSet(SdfGridT& grid, InterrupterT* interrupt = NULL); + + /// Destructor + ~ParticlesToLevelSet() { delete mBlindGrid; } + + /// @brief This methods syncs up the level set and attribute grids + /// and therefore needs to be called before any of these grids are + /// used and after the last call to any of the rasterizer methods. + /// + /// @note Avoid calling this method more than once and only after + /// all the particles have been rasterized. It has no effect or + /// overhead if attribute transfer is disabled, i.e. AttributeT = + /// void and prune is false. + void finalize(bool prune = false); + + /// @brief Return a shared pointer to the grid containing the + /// (optional) attribute. + /// + /// @warning If attribute transfer was disabled, i.e. AttributeT = + /// void, or finalize() was not called the pointer is NULL! + typename AttGridType::Ptr attributeGrid() { return mAttGrid; } + + /// @brief Return the size of a voxel in world units + Real getVoxelSize() const { return mDx; } + + /// @brief Return the half-width of the narrow band in voxel units + Real getHalfWidth() const { return mHalfWidth; } + + /// @brief Return the smallest radius allowed in voxel units + Real getRmin() const { return mRmin; } + /// @brief Return the largest radius allowed in voxel units + Real getRmax() const { return mRmax; } + + /// @brief Return true if any particles were ignored due to their size + bool ignoredParticles() const { return mMinCount>0 || mMaxCount>0; } + /// @brief Return number of small particles that were ignore due to Rmin + size_t getMinCount() const { return mMinCount; } + /// @brief Return number of large particles that were ignore due to Rmax + size_t getMaxCount() const { return mMaxCount; } + + /// @brief set the smallest radius allowed in voxel units + void setRmin(Real Rmin) { mRmin = math::Max(Real(0),Rmin); } + /// @brief set the largest radius allowed in voxel units + void setRmax(Real Rmax) { mRmax = math::Max(mRmin,Rmax); } + + /// @brief Returns the grain-size used for multi-threading + int getGrainSize() const { return mGrainSize; } + /// @brief Set the grain-size used for multi-threading. + /// @note A grainsize of 0 or less disables multi-threading! + void setGrainSize(int grainSize) { mGrainSize = grainSize; } + + /// @brief Very fast generation of a level set from the active + /// mask of an input grid, e.g. a MaskGrid generated from points. + /// + /// @param grid Points with radius (no radius required). + /// @param dilationInVoxels Dilation in voxel units. + /// @param erosionInVoxels Erosion in voxel units. It is + /// recommended that erosionInVoxels <= dilationInVoxels. + template + void rasterizeMask(const GridT& grid, + const int dilationInVoxels = 1, + const int erosionInVoxels = 1); + + /// @brief Very fast generation of a level set from points + /// (e.g. particles without a radius). It employes a MaskGrid + /// an various bit-wise topology operations. + /// + /// @param points Points with radius (no radius required). + /// @param dilationInVoxels Dilation in voxel units. + /// @param erosionInVoxels Erosion in voxel units. It is + /// recommended that erosionInVoxels <= dilationInVoxels. + template + void rasterizePoints(const PointListT& points, + const int dilationInVoxels = 1, + const int erosionInVoxels = 1); + + /// @brief Rasterize a sphere per particle derived from their + /// position and radius. All spheres are CSG unioned. + /// + /// @param pa Particles with position and radius. + template + void rasterizeSpheres(const ParticleListT& pa); + + /// @brief Rasterize a sphere per particle derived from their + /// position and constant radius. All spheres are CSG unioned. + /// + /// @param pa Particles with position. + /// @param radius Constant particle radius in world units. + template + void rasterizeSpheres(const ParticleListT& pa, Real radius); + + /// @brief Rasterize a trail per particle derived from their + /// position, radius and velocity. Each trail is generated + /// as CSG unions of sphere instances with decreasing radius. + /// + /// @param pa particles with position, radius and velocity. + /// @param delta controls distance between sphere instances + /// (default=1). Be careful not to use too small values since this + /// can lead to excessive computation per trail (which the + /// interrupter can't stop). + /// + /// @note The direction of a trail is inverse to the direction of + /// the velocity vector, and the length is given by |V|. The radius + /// at the head of the trail is given by the radius of the particle + /// and the radius at the tail of the trail is Rmin voxel units which + /// has a default value of 1.5 corresponding to the Nyquist + /// frequency! + template + void rasterizeTrails(const ParticleListT& pa, Real delta=1.0); + +private: + typedef BlindData BlindType; + typedef typename SdfGridT::template ValueConverter::Type BlindGridType; + + /// Class with multi-threaded implementation of particle rasterization + template struct Raster; + + SdfGridType* mSdfGrid; + typename AttGridType::Ptr mAttGrid; + BlindGridType* mBlindGrid; + InterrupterT* mInterrupter; + Real mDx, mHalfWidth; + Real mRmin, mRmax;//ignore particles outside this range of radii in voxel + size_t mMinCount, mMaxCount;//counters for ignored particles! + int mGrainSize; + +};//end of ParticlesToLevelSet class + +template +inline ParticlesToLevelSet:: +ParticlesToLevelSet(SdfGridT& grid, InterrupterT* interrupter) : + mSdfGrid(&grid), + mBlindGrid(NULL), + mInterrupter(interrupter), + mDx(grid.voxelSize()[0]), + mHalfWidth(grid.background()/mDx), + mRmin(1.5),// corresponds to the Nyquist grid sampling frequency + mRmax(100.0),// corresponds to a huge particle (probably too large!) + mMinCount(0), + mMaxCount(0), + mGrainSize(1) +{ + if (!mSdfGrid->hasUniformVoxels() ) { + OPENVDB_THROW(RuntimeError, + "ParticlesToLevelSet only supports uniform voxels!"); + } + if (mSdfGrid->getGridClass() != GRID_LEVEL_SET) { + OPENVDB_THROW(RuntimeError, + "ParticlesToLevelSet only supports level sets!" + "\nUse Grid::setGridClass(openvdb::GRID_LEVEL_SET)"); + } + + if (!DisableT::value) { + mBlindGrid = new BlindGridType(BlindType(grid.background())); + mBlindGrid->setTransform(mSdfGrid->transform().copy()); + } +} + +namespace { + +template struct DilationHandler +{ + DilationHandler(TreeT& t, int n) : tree(&t), size(n) {} + void operator()() const { dilateVoxels( *tree, size); } + TreeT* tree; + const int size; +}; +template struct ErosionHandler +{ + ErosionHandler(TreeT& t, int n) : tree(&t), size(n) {} + void operator()() const { erodeVoxels( *tree, size); } + TreeT* tree; + const int size; +}; + +} + +template +template +inline void ParticlesToLevelSet:: +rasterizeMask(const MaskGrid& maskGrid, int dilation, int erosion) +{ + // Generate a level set from the mask + mSdfGrid->setTree( maskToLevelSet + ( maskGrid, int(mHalfWidth), dilation, erosion, mInterrupter )->treePtr() ); +} + +template +template +inline void ParticlesToLevelSet:: +rasterizePoints(const PointListT& points, int dilation, int erosion) +{ + typedef typename SdfGridT::template ValueConverter::Type MaskGrid; + typedef typename MaskGrid::TreeType MaskTree; + typedef typename MaskTree::Ptr MaskTreePtr; + + // Generate a mask grid of the points + MaskGrid maskGrid(MaskTreePtr(new MaskTree(mSdfGrid->tree(), false, TopologyCopy()))); + maskGrid.setTransform( mSdfGrid->transform().copy() ); + PointMaskGrid pmg( maskGrid, mInterrupter ); + pmg.addPoints( points ); + // Generate a level set from the mask + this->rasterizeMask( maskGrid, dilation, erosion ); +} + +template +template +inline void ParticlesToLevelSet:: +rasterizeSpheres(const ParticleListT& pa) +{ + if (DisableT::value) { + Raster r(*this, mSdfGrid, pa); + r.rasterizeSpheres(); + } else { + Raster r(*this, mBlindGrid, pa); + r.rasterizeSpheres(); + } +} + +template +template +inline void ParticlesToLevelSet:: +rasterizeSpheres(const ParticleListT& pa, Real radius) +{ + if (DisableT::value) { + Raster r(*this, mSdfGrid, pa); + r.rasterizeSpheres(radius/mDx); + } else { + Raster r(*this, mBlindGrid, pa); + r.rasterizeSpheres(radius/mDx); + } +} + +template +template +inline void ParticlesToLevelSet:: +rasterizeTrails(const ParticleListT& pa, Real delta) +{ + if (DisableT::value) { + Raster r(*this, mSdfGrid, pa); + r.rasterizeTrails(delta); + } else { + Raster r(*this, mBlindGrid, pa); + r.rasterizeTrails(delta); + } +} + +template +inline void +ParticlesToLevelSet::finalize(bool prune) +{ + if (mBlindGrid==NULL) { + if (prune) tools::pruneLevelSet(mSdfGrid->tree()); + return; + } else { + if (prune) tools::prune(mBlindGrid->tree()); + } + + typedef typename SdfGridType::TreeType SdfTreeT; + typedef typename AttGridType::TreeType AttTreeT; + typedef typename BlindGridType::TreeType BlindTreeT; + // Use topology copy constructors since output grids have the same topology as mBlindDataGrid + const BlindTreeT& tree = mBlindGrid->tree(); + + // New level set tree + typename SdfTreeT::Ptr sdfTree(new SdfTreeT( + tree, tree.background().visible(), openvdb::TopologyCopy())); + + // Note this overwrites any existing attribute grids! + typename AttTreeT::Ptr attTree(new AttTreeT( + tree, tree.background().blind(), openvdb::TopologyCopy())); + mAttGrid = typename AttGridType::Ptr(new AttGridType(attTree)); + mAttGrid->setTransform(mBlindGrid->transform().copy()); + + // Extract the level set and IDs from mBlindDataGrid. We will + // explore the fact that by design active values always live + // at the leaf node level, i.e. level sets have no active tiles! + typedef typename BlindTreeT::LeafCIter LeafIterT; + typedef typename BlindTreeT::LeafNodeType LeafT; + typedef typename SdfTreeT::LeafNodeType SdfLeafT; + typedef typename AttTreeT::LeafNodeType AttLeafT; + for (LeafIterT n = tree.cbeginLeaf(); n; ++n) { + const LeafT& leaf = *n; + const openvdb::Coord xyz = leaf.origin(); + // Get leafnodes that were allocated during topology construction! + SdfLeafT* sdfLeaf = sdfTree->probeLeaf(xyz); + AttLeafT* attLeaf = attTree->probeLeaf(xyz); + // Use linear offset (vs coordinate) access for better performance! + typename LeafT::ValueOnCIter m=leaf.cbeginValueOn(); + if (!m) {//no active values in leaf node so copy everything + for (openvdb::Index k = 0; k!=LeafT::SIZE; ++k) { + const BlindType& v = leaf.getValue(k); + sdfLeaf->setValueOnly(k, v.visible()); + attLeaf->setValueOnly(k, v.blind()); + } + } else {//only copy active values (using flood fill for the inactive values) + for(; m; ++m) { + const openvdb::Index k = m.pos(); + const BlindType& v = *m; + sdfLeaf->setValueOnly(k, v.visible()); + attLeaf->setValueOnly(k, v.blind()); + } + } + } + + tools::signedFloodFill(*sdfTree);//required since we only transferred active voxels! + + if (mSdfGrid->empty()) { + mSdfGrid->setTree(sdfTree); + } else { + tools::csgUnion(mSdfGrid->tree(), *sdfTree, /*prune=*/true); + } +} + +/////////////////////////////////////////////////////////// + +template +template +struct ParticlesToLevelSet::Raster +{ + typedef typename boost::is_void::type DisableT; + typedef ParticlesToLevelSet ParticlesToLevelSetT; + typedef typename ParticlesToLevelSetT::SdfType SdfT;//type of signed distance values + typedef typename ParticlesToLevelSetT::AttType AttT;//type of particle attribute + typedef typename GridT::ValueType ValueT; + typedef typename GridT::Accessor AccessorT; + typedef typename GridT::TreeType TreeT; + typedef typename TreeT::LeafNodeType LeafNodeT; + typedef PointPartitioner PointPartitionerT; + + + /// @brief Main constructor + Raster(ParticlesToLevelSetT& parent, GridT* grid, const ParticleListT& particles) + : mParent(parent) + , mParticles(particles) + , mGrid(grid) + , mMap(*(mGrid->transform().baseMap())) + , mMinCount(0) + , mMaxCount(0) + , mIsCopy(false) + { + mPointPartitioner = new PointPartitionerT(); + mPointPartitioner->construct(particles, mGrid->transform()); + } + + /// @brief Copy constructor called by tbb threads + Raster(Raster& other, tbb::split) + : mParent(other.mParent) + , mParticles(other.mParticles) + , mGrid(new GridT(*other.mGrid, openvdb::ShallowCopy())) + , mMap(other.mMap) + , mMinCount(0) + , mMaxCount(0) + , mTask(other.mTask) + , mIsCopy(true) + , mPointPartitioner(other.mPointPartitioner) + { + mGrid->newTree(); + } + + virtual ~Raster() { + + // Copies construct temporary grids that have to be deleted + // but the original has ownership of the bucket array + if (mIsCopy) { + delete mGrid; + } else { + delete mPointPartitioner; + } + } + + /// @brief Rasterize a sphere per particle derived from their + /// position and radius. All spheres are CSG unioned. + void rasterizeSpheres() + { + mMinCount = mMaxCount = 0; + if (mParent.mInterrupter) { + mParent.mInterrupter->start("Rasterizing particles to level set using spheres"); + } + mTask = boost::bind(&Raster::rasterSpheres, _1, _2); + this->cook(); + if (mParent.mInterrupter) mParent.mInterrupter->end(); + } + /// @brief Rasterize a sphere per particle derived from their + /// position and constant radius. All spheres are CSG unioned. + /// @param radius constant radius of all particles in voxel units. + void rasterizeSpheres(Real radius) + { + mMinCount = radius < mParent.mRmin ? mParticles.size() : 0; + mMaxCount = radius > mParent.mRmax ? mParticles.size() : 0; + if (mMinCount>0 || mMaxCount>0) {//skipping all particles! + mParent.mMinCount = mMinCount; + mParent.mMaxCount = mMaxCount; + } else { + if (mParent.mInterrupter) { + mParent.mInterrupter->start( + "Rasterizing particles to level set using const spheres"); + } + mTask = boost::bind(&Raster::rasterFixedSpheres, _1, _2, SdfT(radius)); + this->cook(); + if (mParent.mInterrupter) mParent.mInterrupter->end(); + } + } + /// @brief Rasterize a trail per particle derived from their + /// position, radius and velocity. Each trail is generated + /// as CSG unions of sphere instances with decreasing radius. + /// + /// @param delta controls distance between sphere instances + /// (default=1). Be careful not to use too small values since this + /// can lead to excessive computation per trail (which the + /// interrupter can't stop). + /// + /// @note The direction of a trail is inverse to the direction of + /// the velocity vector, and the length is given by |V|. The radius + /// at the head of the trail is given by the radius of the particle + /// and the radius at the tail of the trail is Rmin voxel units which + /// has a default value of 1.5 corresponding to the Nyquist frequency! + void rasterizeTrails(Real delta=1.0) + { + mMinCount = mMaxCount = 0; + if (mParent.mInterrupter) { + mParent.mInterrupter->start("Rasterizing particles to level set using trails"); + } + mTask = boost::bind(&Raster::rasterTrails, _1, _2, SdfT(delta)); + this->cook(); + if (mParent.mInterrupter) mParent.mInterrupter->end(); + } + + /// @brief Kicks off the optionally multithreaded computation + void operator()(const tbb::blocked_range& r) + { + assert(mTask); + mTask(this, r); + mParent.mMinCount = mMinCount; + mParent.mMaxCount = mMaxCount; + } + + /// @brief Reguired by tbb::parallel_reduce + void join(Raster& other) + { + tools::csgUnion(*mGrid, *other.mGrid, /*prune=*/true); + mMinCount += other.mMinCount; + mMaxCount += other.mMaxCount; + } +private: + /// Disallow assignment since some of the members are references + Raster& operator=(const Raster&) { return *this; } + + /// @return true if the particle is too small or too large + bool ignoreParticle(SdfT R) + { + if (R < mParent.mRmin) {// below the cutoff radius + ++mMinCount; + return true; + } + if (R > mParent.mRmax) {// above the cutoff radius + ++mMaxCount; + return true; + } + return false; + } + /// @brief Reguired by tbb::parallel_reduce to multithreaded + /// rasterization of particles as spheres with variable radius + /// + /// @param r tbb's default range referring to the list of particles + void rasterSpheres(const tbb::blocked_range& r) + { + AccessorT acc = mGrid->getAccessor(); // local accessor + bool run = true; + const SdfT invDx = SdfT(1/mParent.mDx); + AttT att; + Vec3R pos; + Real rad; + + // Loop over buckets + for (size_t n = r.begin(), N = r.end(); n < N; ++n) { + // Loop over particles in bucket n. + typename PointPartitionerT::IndexIterator iter = mPointPartitioner->indices(n); + for ( ; run && iter; ++iter) { + const Index32& id = *iter; + mParticles.getPosRad(id, pos, rad); + const SdfT R = SdfT(invDx * rad);// in voxel units + if (this->ignoreParticle(R)) continue; + const Vec3R P = mMap.applyInverseMap(pos); + this->getAtt(id, att); + run = this->makeSphere(P, R, att, acc); + }//end loop over particles + }//end loop over buckets + } + + /// @brief Reguired by tbb::parallel_reduce to multithreaded + /// rasterization of particles as spheres with a fixed radius + /// + /// @param r tbb's default range referring to the list of particles + void rasterFixedSpheres(const tbb::blocked_range& r, SdfT R) + { + const SdfT + dx = static_cast(mParent.mDx), + w = static_cast(mParent.mHalfWidth); // in voxel units + AccessorT acc = mGrid->getAccessor(); // local accessor + const ValueT inside = -mGrid->background(); + const SdfT max = R + w;// maximum distance in voxel units + const SdfT max2 = math::Pow2(max);//square of maximum distance in voxel units + const SdfT min2 = math::Pow2(math::Max(SdfT(0), R - w));//square of minimum distance + ValueT v; + size_t count = 0; + AttT att; + Vec3R pos; + + // Loop over buckets + for (size_t n = r.begin(), N = r.end(); n < N; ++n) { + // Loop over particles in bucket n. + typename PointPartitionerT::IndexIterator iter = mPointPartitioner->indices(n); + for ( ; iter; ++iter) { + const Index32& id = *iter; + this->getAtt(id, att); + mParticles.getPos(id, pos); + const Vec3R P = mMap.applyInverseMap(pos); + const Coord a(math::Floor(P[0]-max),math::Floor(P[1]-max),math::Floor(P[2]-max)); + const Coord b(math::Ceil( P[0]+max),math::Ceil( P[1]+max),math::Ceil( P[2]+max)); + for (Coord c = a; c.x() <= b.x(); ++c.x()) { + //only check interrupter every 32'th scan in x + if (!(count++ & ((1<<5)-1)) && util::wasInterrupted(mParent.mInterrupter)) { + tbb::task::self().cancel_group_execution(); + return; + } + SdfT x2 = static_cast(math::Pow2(c.x() - P[0])); + for (c.y() = a.y(); c.y() <= b.y(); ++c.y()) { + SdfT x2y2 = static_cast(x2 + math::Pow2(c.y() - P[1])); + for (c.z() = a.z(); c.z() <= b.z(); ++c.z()) { + SdfT x2y2z2 = static_cast( + x2y2 + math::Pow2(c.z()- P[2])); // square distance from c to P + if (x2y2z2 >= max2 || (!acc.probeValue(c,v) && v& r, SdfT delta) + { + AccessorT acc = mGrid->getAccessor(); // local accessor + bool run = true; + AttT att; + Vec3R pos, vel; + Real rad; + const Vec3R origin = mMap.applyInverseMap(Vec3R(0,0,0)); + const SdfT Rmin = SdfT(mParent.mRmin), invDx = SdfT(1/mParent.mDx); + + // Loop over buckets + for (size_t n = r.begin(), N = r.end(); n < N; ++n) { + // Loop over particles in bucket n. + typename PointPartitionerT::IndexIterator iter = mPointPartitioner->indices(n); + for ( ; run && iter; ++iter) { + const Index32& id = *iter; + mParticles.getPosRadVel(id, pos, rad, vel); + const SdfT R0 = SdfT(invDx*rad); + if (this->ignoreParticle(R0)) continue; + this->getAtt(id, att); + const Vec3R P0 = mMap.applyInverseMap(pos); + const Vec3R V = mMap.applyInverseMap(vel) - origin;//exclude translation + const SdfT speed = SdfT(V.length()), inv_speed = SdfT(1.0/speed); + const Vec3R Nrml = -V*inv_speed;// inverse normalized direction + Vec3R P = P0;// local position of instance + SdfT R = R0, d=0;// local radius and length of trail + for (size_t m=0; run && d <= speed ; ++m) { + run = this->makeSphere(P, R, att, acc); + P += 0.5*delta*R*Nrml;// adaptive offset along inverse velocity direction + d = SdfT((P-P0).length());// current length of trail + R = R0-(R0-Rmin)*d*inv_speed;// R = R0 -> mRmin(e.g. 1.5) + }//end loop over sphere instances + }//end loop over particles + }//end loop over buckets + } + + void cook() + { + // parallelize over the point buckets + const Index32 bucketCount = Index32(mPointPartitioner->size()); + + if (mParent.mGrainSize>0) { + tbb::parallel_reduce( + tbb::blocked_range(0, bucketCount, mParent.mGrainSize), *this); + } else { + (*this)(tbb::blocked_range(0, bucketCount)); + } + } + + /// @brief Rasterize sphere at position P and radius R into a + /// narrow-band level set with half-width, mHalfWidth. + /// @return false if it was interrupted + /// + /// @param P coordinates of the particle position in voxel units + /// @param R radius of particle in voxel units + /// @param id + /// @param accessor grid accessor with a private copy of the grid + /// + /// @note For best performance all computations are performed in + /// voxel-space with the important exception of the final level set + /// value that is converted to world units (e.g. the grid stores + /// the closest Euclidean signed distances measured in world + /// units). Also note we use the convention of positive distances + /// outside the surface and negative distances inside the surface. + bool makeSphere(const Vec3R &P, SdfT R, const AttT& att, AccessorT& acc) + { + const ValueT inside = -mGrid->background(); + const SdfT dx = SdfT(mParent.mDx), w = SdfT(mParent.mHalfWidth); + const SdfT max = R + w;// maximum distance in voxel units + const Coord a(math::Floor(P[0]-max),math::Floor(P[1]-max),math::Floor(P[2]-max)); + const Coord b(math::Ceil( P[0]+max),math::Ceil( P[1]+max),math::Ceil( P[2]+max)); + const SdfT max2 = math::Pow2(max);//square of maximum distance in voxel units + const SdfT min2 = math::Pow2(math::Max(SdfT(0), R - w));//square of minimum distance + ValueT v; + size_t count = 0; + for ( Coord c = a; c.x() <= b.x(); ++c.x() ) { + //only check interrupter every 32'th scan in x + if (!(count++ & ((1<<5)-1)) && util::wasInterrupted(mParent.mInterrupter)) { + tbb::task::self().cancel_group_execution(); + return false; + } + SdfT x2 = SdfT(math::Pow2(c.x() - P[0])); + for (c.y() = a.y(); c.y() <= b.y(); ++c.y()) { + SdfT x2y2 = SdfT(x2 + math::Pow2(c.y() - P[1])); + for (c.z() = a.z(); c.z() <= b.z(); ++c.z()) { + SdfT x2y2z2 = SdfT(x2y2 + math::Pow2(c.z()-P[2]));//square distance from c to P + if (x2y2z2 >= max2 || (!acc.probeValue(c,v) && v&)> FuncType; + + template + typename boost::enable_if::type + getAtt(size_t, AttT&) const {;} + + template + typename boost::disable_if::type + getAtt(size_t n, AttT& a) const { mParticles.getAtt(n, a); } + + template + typename boost::enable_if, ValueT>::type + Merge(T s, const AttT&) const { return s; } + + template + typename boost::disable_if, ValueT>::type + Merge(T s, const AttT& a) const { return ValueT(s,a); } + + ParticlesToLevelSetT& mParent; + const ParticleListT& mParticles;//list of particles + GridT* mGrid; + const math::MapBase& mMap; + size_t mMinCount, mMaxCount;//counters for ignored particles! + FuncType mTask; + const bool mIsCopy; + PointPartitionerT* mPointPartitioner; +};//end of Raster struct + + +///////////////////// YOU CAN SAFELY IGNORE THIS SECTION ///////////////////// + +namespace { + +// This is a simple type that combines a distance value and a particle +// attribute. It's required for attribute transfer which is defined in the +// Raster class above. +template +class BlindData +{ +public: + typedef VisibleT type; + typedef VisibleT VisibleType; + typedef BlindT BlindType; + + BlindData() {} + explicit BlindData(VisibleT v) : mVisible(v), mBlind(zeroVal()) {} + BlindData(VisibleT v, BlindT b) : mVisible(v), mBlind(b) {} + BlindData& operator=(const BlindData& rhs) + { + mVisible = rhs.mVisible; + mBlind = rhs.mBlind; + return *this; + } + const VisibleT& visible() const { return mVisible; } + const BlindT& blind() const { return mBlind; } + OPENVDB_NO_FP_EQUALITY_WARNING_BEGIN + bool operator==(const BlindData& rhs) const { return mVisible == rhs.mVisible; } + OPENVDB_NO_FP_EQUALITY_WARNING_END + bool operator< (const BlindData& rhs) const { return mVisible < rhs.mVisible; } + bool operator> (const BlindData& rhs) const { return mVisible > rhs.mVisible; } + BlindData operator+(const BlindData& rhs) const { return BlindData(mVisible + rhs.mVisible); } + BlindData operator+(const VisibleT& rhs) const { return BlindData(mVisible + rhs); } + BlindData operator-(const BlindData& rhs) const { return BlindData(mVisible - rhs.mVisible); } + BlindData operator-() const { return BlindData(-mVisible, mBlind); } + +protected: + VisibleT mVisible; + BlindT mBlind; +}; + +// Required by several of the tree nodes +template +inline std::ostream& operator<<(std::ostream& ostr, const BlindData& rhs) +{ + ostr << rhs.visible(); + return ostr; +} + +// Required by math::Abs +template +inline BlindData Abs(const BlindData& x) +{ + return BlindData(math::Abs(x.visible()), x.blind()); +} + +} // unnamed namespace + +////////////////////////////////////////////////////////////////////////////// + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_PARTICLES_TO_LEVELSET_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/PointAdvect.h b/nuparu/include/openvdb/include/openvdb/tools/PointAdvect.h new file mode 100644 index 00000000..80df623c --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/PointAdvect.h @@ -0,0 +1,424 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @author Ken Museth, D.J. Hill (openvdb port, added staggered grid support) +/// @file PointAdvect.h +/// +/// @brief Class PointAdvect advects points (with position) in a static velocity field + +#ifndef OPENVDB_TOOLS_POINT_ADVECT_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_POINT_ADVECT_HAS_BEEN_INCLUDED + +#include +#include // min +#include // Vec3 types and version number +#include // grid +#include +#include "Interpolation.h" // sampling +#include "VelocityFields.h" // VelocityIntegrator + +#include +#include // threading +#include // threading +#include // for cancel + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// Class that holds a Vec3 grid, to be interpreted as the closest point to a constraint +/// surface. Supports a method to allow a point to be projected onto the closest point +/// on the constraint surface. Uses Caching. +template +class ClosestPointProjector +{ +public: + typedef CptGridT CptGridType; + typedef typename CptGridType::ConstAccessor CptAccessor; + typedef typename CptGridType::ValueType CptValueType; + + ClosestPointProjector(): + mCptIterations(0) + { + } + ClosestPointProjector(const CptGridType& cptGrid, int n): + mCptGrid(&cptGrid), + mCptAccessor(cptGrid.getAccessor()), + mCptIterations(n) + { + } + ClosestPointProjector(const ClosestPointProjector &other): + mCptGrid(other.mCptGrid), + mCptAccessor(mCptGrid->getAccessor()), + mCptIterations(other.mCptIterations) + { + } + void setConstraintIterations(unsigned int cptIterations) { mCptIterations = cptIterations; } + unsigned int numIterations() { return mCptIterations; } + + // point constraint + template + inline void projectToConstraintSurface(LocationType& W) const + { + /// Entries in the CPT tree are the closest point to the constraint surface. + /// The interpolation step in sample introduces error so that the result + /// of a single sample may not lie exactly on the surface. The iterations + /// in the loop exist to minimize this error. + CptValueType result(W[0], W[1],W[2]); + for (unsigned int i = 0; i < mCptIterations; ++i) { + const Vec3R location = mCptGrid->worldToIndex(Vec3R(result[0], result[1], result[2])); + BoxSampler::sample(mCptAccessor, location, result); + } + W[0] = result[0]; + W[1] = result[1]; + W[2] = result[2]; + } + +private: + const CptGridType* mCptGrid; // Closest-Point-Transform vector field + CptAccessor mCptAccessor; + unsigned int mCptIterations; +};// end of ClosestPointProjector class + +//////////////////////////////////////// + + +/// Performs passive or constrained advection of points in a velocity field +/// represented by an OpenVDB grid and an optional closest-point-transform (CPT) +/// represented in another OpenVDB grid. Note the CPT is assumed to be +/// in world coordinates and NOT index coordinates! +/// Supports both collocated velocity grids and staggered velocity grids +/// +/// The @c PointListT template argument refers to any class with the following +/// interface (e.g., std::vector): +/// @code +/// class PointList { +/// ... +/// public: +/// typedef internal_vector3_type value_type; // must support [] component access +/// openvdb::Index size() const; // number of points in list +/// value_type& operator[](int n); // world space position of nth point +/// }; +/// @endcode +/// +/// @note All methods (except size) are assumed to be thread-safe and +/// the positions are returned as non-const references since the +/// advection method needs to modify them! +template, + bool StaggeredVelocity = false, + typename InterrupterType = util::NullInterrupter> +class PointAdvect +{ +public: + typedef GridT GridType; + typedef PointListT PointListType; + typedef typename PointListT::value_type LocationType; + typedef VelocityIntegrator VelocityFieldIntegrator; + + PointAdvect(const GridT& velGrid, InterrupterType* interrupter=NULL) : + mVelGrid(&velGrid), + mPoints(NULL), + mIntegrationOrder(1), + mThreaded(true), + mInterrupter(interrupter) + { + } + PointAdvect(const PointAdvect &other) : + mVelGrid(other.mVelGrid), + mPoints(other.mPoints), + mDt(other.mDt), + mAdvIterations(other.mAdvIterations), + mIntegrationOrder(other.mIntegrationOrder), + mThreaded(other.mThreaded), + mInterrupter(other.mInterrupter) + { + } + virtual ~PointAdvect() + { + } + /// If the order of the integration is set to zero no advection is performed + bool earlyOut() const { return (mIntegrationOrder==0);} + /// get & set + void setThreaded(bool threaded) { mThreaded = threaded; } + bool getThreaded() { return mThreaded; } + void setIntegrationOrder(unsigned int order) {mIntegrationOrder = order;} + + /// Constrained advection of a list of points over a time = dt * advIterations + void advect(PointListT& points, float dt, unsigned int advIterations = 1) + { + if (this->earlyOut()) return; // nothing to do! + mPoints = &points; + mDt = dt; + mAdvIterations = advIterations; + + if (mInterrupter) mInterrupter->start("Advecting points by OpenVDB velocity field: "); + if (mThreaded) { + tbb::parallel_for(tbb::blocked_range(0, mPoints->size()), *this); + } else { + (*this)(tbb::blocked_range(0, mPoints->size())); + } + if (mInterrupter) mInterrupter->end(); + } + + /// Never call this method directly - it is use by TBB and has to be public! + void operator() (const tbb::blocked_range &range) const + { + if (mInterrupter && mInterrupter->wasInterrupted()) { + tbb::task::self().cancel_group_execution(); + } + + VelocityFieldIntegrator velField(*mVelGrid); + switch (mIntegrationOrder) { + case 1: + { + for (size_t n = range.begin(); n != range.end(); ++n) { + LocationType& X0 = (*mPoints)[n]; + // loop over number of time steps + for (unsigned int i = 0; i < mAdvIterations; ++i) { + velField.template rungeKutta<1>(mDt, X0); + } + } + } + break; + case 2: + { + for (size_t n = range.begin(); n != range.end(); ++n) { + LocationType& X0 = (*mPoints)[n]; + // loop over number of time steps + for (unsigned int i = 0; i < mAdvIterations; ++i) { + velField.template rungeKutta<2>(mDt, X0); + } + } + } + break; + case 3: + { + for (size_t n = range.begin(); n != range.end(); ++n) { + LocationType& X0 = (*mPoints)[n]; + // loop over number of time steps + for (unsigned int i = 0; i < mAdvIterations; ++i) { + velField.template rungeKutta<3>(mDt, X0); + } + } + } + break; + case 4: + { + for (size_t n = range.begin(); n != range.end(); ++n) { + LocationType& X0 = (*mPoints)[n]; + // loop over number of time steps + for (unsigned int i = 0; i < mAdvIterations; ++i) { + velField.template rungeKutta<4>(mDt, X0); + } + } + } + break; + } + } + +private: + // the velocity field + const GridType* mVelGrid; + + // vertex list of all the points + PointListT* mPoints; + + // time integration parameters + float mDt; // time step + unsigned int mAdvIterations; // number of time steps + unsigned int mIntegrationOrder; + + // operational parameters + bool mThreaded; + InterrupterType* mInterrupter; + +};//end of PointAdvect class + + +template, + bool StaggeredVelocity = false, + typename CptGridType = GridT, + typename InterrupterType = util::NullInterrupter> +class ConstrainedPointAdvect +{ +public: + typedef GridT GridType; + typedef typename PointListT::value_type LocationType; + typedef VelocityIntegrator VelocityIntegratorType; + typedef ClosestPointProjector ClosestPointProjectorType; + typedef PointListT PointListType; + + ConstrainedPointAdvect(const GridType& velGrid, + const GridType& cptGrid, int cptn, InterrupterType* interrupter = NULL): + mVelGrid(&velGrid), + mCptGrid(&cptGrid), + mCptIter(cptn), + mInterrupter(interrupter) + { + } + ConstrainedPointAdvect(const ConstrainedPointAdvect& other): + mVelGrid(other.mVelGrid), + mCptGrid(other.mCptGrid), + mCptIter(other.mCptIter), + mPoints(other.mPoints), + mDt(other.mDt), + mAdvIterations(other.mAdvIterations), + mIntegrationOrder(other.mIntegrationOrder), + mThreaded(other.mThreaded), + mInterrupter(other.mInterrupter) + { + } + virtual ~ConstrainedPointAdvect(){} + + void setConstraintIterations(unsigned int cptIter) {mCptIter = cptIter;} + void setIntegrationOrder(unsigned int order) {mIntegrationOrder = order;} + + void setThreaded(bool threaded) { mThreaded = threaded; } + bool getThreaded() { return mThreaded; } + + /// Constrained Advection a list of points over a time = dt * advIterations + void advect(PointListT& points, float dt, unsigned int advIterations = 1) + { + mPoints = &points; + mDt = dt; + + if (mIntegrationOrder==0 && mCptIter == 0) { + return; // nothing to do! + } + (mIntegrationOrder>0) ? mAdvIterations = advIterations : mAdvIterations = 1; + + if (mInterrupter) mInterrupter->start("Advecting points by OpenVDB velocity field: "); + const size_t N = mPoints->size(); + + if (mThreaded) { + tbb::parallel_for(tbb::blocked_range(0, N), *this); + } else { + (*this)(tbb::blocked_range(0, N)); + } + if (mInterrupter) mInterrupter->end(); + } + + + /// Never call this method directly - it is use by TBB and has to be public! + void operator() (const tbb::blocked_range &range) const + { + if (mInterrupter && mInterrupter->wasInterrupted()) { + tbb::task::self().cancel_group_execution(); + } + + VelocityIntegratorType velField(*mVelGrid); + ClosestPointProjectorType cptField(*mCptGrid, mCptIter); + switch (mIntegrationOrder) { + case 0://pure CPT projection + { + for (size_t n = range.begin(); n != range.end(); ++n) { + LocationType& X0 = (*mPoints)[n]; + for (unsigned int i = 0; i < mAdvIterations; ++i) { + cptField.projectToConstraintSurface(X0); + } + } + } + break; + case 1://1'th order advection and CPT projection + { + for (size_t n = range.begin(); n != range.end(); ++n) { + LocationType& X0 = (*mPoints)[n]; + for (unsigned int i = 0; i < mAdvIterations; ++i) { + velField.template rungeKutta<1>(mDt, X0); + cptField.projectToConstraintSurface(X0); + } + } + } + break; + case 2://2'nd order advection and CPT projection + { + for (size_t n = range.begin(); n != range.end(); ++n) { + LocationType& X0 = (*mPoints)[n]; + for (unsigned int i = 0; i < mAdvIterations; ++i) { + velField.template rungeKutta<2>(mDt, X0); + cptField.projectToConstraintSurface(X0); + } + } + } + break; + + case 3://3'rd order advection and CPT projection + { + for (size_t n = range.begin(); n != range.end(); ++n) { + LocationType& X0 = (*mPoints)[n]; + for (unsigned int i = 0; i < mAdvIterations; ++i) { + velField.template rungeKutta<3>(mDt, X0); + cptField.projectToConstraintSurface(X0); + } + } + } + break; + case 4://4'th order advection and CPT projection + { + for (size_t n = range.begin(); n != range.end(); ++n) { + LocationType& X0 = (*mPoints)[n]; + for (unsigned int i = 0; i < mAdvIterations; ++i) { + velField.template rungeKutta<4>(mDt, X0); + cptField.projectToConstraintSurface(X0); + } + } + } + break; + } + } + +private: + const GridType* mVelGrid; // the velocity field + const GridType* mCptGrid; + int mCptIter; + PointListT* mPoints; // vertex list of all the points + + // time integration parameters + float mDt; // time step + unsigned int mAdvIterations; // number of time steps + unsigned int mIntegrationOrder; // order of Runge-Kutta integration + // operational parameters + bool mThreaded; + InterrupterType* mInterrupter; +};// end of ConstrainedPointAdvect class + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_POINT_ADVECT_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/PointIndexGrid.h b/nuparu/include/openvdb/include/openvdb/tools/PointIndexGrid.h new file mode 100644 index 00000000..c903017b --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/PointIndexGrid.h @@ -0,0 +1,1822 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file PointIndexGrid.h +/// +/// @brief Space-partitioning acceleration structure for points. Partitions +/// the points into voxels to accelerate range and nearest neighbor +/// searches. +/// +/// @note Leaf nodes store a single point-index array and the voxels are only +/// integer offsets into that array. The actual points are never stored +/// in the acceleration structure, only offsets into an external array. +/// +/// @author Mihai Alden + +#ifndef OPENVDB_TOOLS_POINT_INDEX_GRID_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_POINT_INDEX_GRID_HAS_BEEN_INCLUDED + + +#include +#include +#include +#include +#include +#include +#include "PointPartitioner.h" + +#include +#include +#include +#include +#include +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { + +namespace tree { +template struct SameLeafConfig; // forward declaration +} + +namespace tools { + +template struct PointIndexLeafNode; // forward declaration + +/// Point index tree configured to match the default OpenVDB tree configuration +typedef tree::Tree, 4>, 5> > > PointIndexTree; + +/// Point index grid +typedef Grid PointIndexGrid; + + +//////////////////////////////////////// + + +/// @interface PointArray +/// Expected interface for the PointArray container: +/// @code +/// template +/// struct PointArray +/// { +/// // The type used to represent world-space point positions +/// typedef VectorType PosType; +/// +/// // Return the number of points in the array +/// size_t size() const; +/// +/// // Return the world-space position of the nth point in the array. +/// void getPos(size_t n, PosType& xyz) const; +/// }; +/// @endcode + + +//////////////////////////////////////// + + +/// @brief Partition points into a point index grid to accelerate range and +/// nearest-neighbor searches. +/// +/// @param points world-space point array conforming to the PointArray interface +/// @param voxelSize voxel size in world units +template +inline typename GridT::Ptr +createPointIndexGrid(const PointArrayT& points, double voxelSize); + + +/// @brief Partition points into a point index grid to accelerate range and +/// nearest-neighbor searches. +/// +/// @param points world-space point array conforming to the PointArray interface +/// @param xform world-to-index-space transform +template +inline typename GridT::Ptr +createPointIndexGrid(const PointArrayT& points, const math::Transform& xform); + + +/// @brief Return @c true if the given point index grid represents a valid partitioning +/// of the given point array. +/// +/// @param points world-space point array conforming to the PointArray interface +/// @param grid point index grid to validate +template +inline bool +isValidPartition(const PointArrayT& points, const GridT& grid); + + +/// Repartition the @a points if needed, otherwise return the input @a grid. +template +inline typename GridT::ConstPtr +getValidPointIndexGrid(const PointArrayT& points, const typename GridT::ConstPtr& grid); + +/// Repartition the @a points if needed, otherwise return the input @a grid. +template +inline typename GridT::Ptr +getValidPointIndexGrid(const PointArrayT& points, const typename GridT::Ptr& grid); + + +//////////////////////////////////////// + + +/// Accelerated range and nearest-neighbor searches for point index grids +template +struct PointIndexIterator +{ + typedef tree::ValueAccessor ConstAccessor; + typedef typename TreeType::LeafNodeType LeafNodeType; + typedef typename TreeType::ValueType ValueType; + + + PointIndexIterator(); + PointIndexIterator(const PointIndexIterator& rhs); + PointIndexIterator& operator=(const PointIndexIterator& rhs); + + + /// @brief Construct an iterator over the indices of the points contained in voxel (i, j, k). + /// @param ijk the voxel containing the points over which to iterate + /// @param acc an accessor for the grid or tree that holds the point indices + PointIndexIterator(const Coord& ijk, ConstAccessor& acc); + + + /// @brief Construct an iterator over the indices of the points contained in + /// the given bounding box. + /// @param bbox the bounding box of the voxels containing the points over which to iterate + /// @param acc an accessor for the grid or tree that holds the point indices + /// @note The range of the @a bbox is inclusive. Thus, a bounding box with + /// min = max is not empty but rather encloses a single voxel. + PointIndexIterator(const CoordBBox& bbox, ConstAccessor& acc); + + + /// @brief Clear the iterator and update it with the result of the given voxel query. + /// @param ijk the voxel containing the points over which to iterate + /// @param acc an accessor for the grid or tree that holds the point indices + void searchAndUpdate(const Coord& ijk, ConstAccessor& acc); + + + /// @brief Clear the iterator and update it with the result of the given voxel region query. + /// @param bbox the bounding box of the voxels containing the points over which to iterate + /// @param acc an accessor for the grid or tree that holds the point indices + /// @note The range of the @a bbox is inclusive. Thus, a bounding box with + /// min = max is not empty but rather encloses a single voxel. + void searchAndUpdate(const CoordBBox& bbox, ConstAccessor& acc); + + + /// @brief Clear the iterator and update it with the result of the given + /// index-space bounding box query. + /// @param bbox index-space bounding box + /// @param acc an accessor for the grid or tree that holds the point indices + /// @param points world-space point array conforming to the PointArray interface + /// @param xform linear, uniform-scale transform (i.e., cubical voxels) + template + void searchAndUpdate(const BBoxd& bbox, ConstAccessor& acc, + const PointArray& points, const math::Transform& xform); + + + /// @brief Clear the iterator and update it with the result of the given + /// index-space radial query. + /// @param center index-space center + /// @param radius index-space radius + /// @param acc an accessor for the grid or tree that holds the point indices + /// @param points world-space point array conforming to the PointArray interface + /// @param xform linear, uniform-scale transform (i.e., cubical voxels) + /// @param subvoxelAccuracy if true, check individual points against the search region, + /// otherwise return all points that reside in voxels that are inside + /// or intersect the search region + template + void searchAndUpdate(const Vec3d& center, double radius, ConstAccessor& acc, + const PointArray& points, const math::Transform& xform, bool subvoxelAccuracy = true); + + + /// @brief Clear the iterator and update it with the result of the given + /// world-space bounding box query. + /// @param bbox world-space bounding box + /// @param acc an accessor for the grid or tree that holds the point indices + /// @param points world-space point array conforming to the PointArray interface + /// @param xform linear, uniform-scale transform (i.e., cubical voxels) + template + void worldSpaceSearchAndUpdate(const BBoxd& bbox, ConstAccessor& acc, + const PointArray& points, const math::Transform& xform); + + + /// @brief Clear the iterator and update it with the result of the given + /// world-space radial query. + /// @param center world-space center + /// @param radius world-space radius + /// @param acc an accessor for the grid or tree that holds the point indices + /// @param points world-space point array conforming to the PointArray interface + /// @param xform linear, uniform-scale transform (i.e., cubical voxels) + /// @param subvoxelAccuracy if true, check individual points against the search region, + /// otherwise return all points that reside in voxels that are inside + /// or intersect the search region + template + void worldSpaceSearchAndUpdate(const Vec3d& center, double radius, ConstAccessor& acc, + const PointArray& points, const math::Transform& xform, bool subvoxelAccuracy = true); + + + /// Reset the iterator to point to the first item. + void reset(); + + /// Return a const reference to the item to which this iterator is pointing. + const ValueType& operator*() const { return *mRange.first; } + + /// @{ + /// @brief Return @c true if this iterator is not yet exhausted. + bool test() const { return mRange.first < mRange.second || mIter != mRangeList.end(); } + operator bool() const { return this->test(); } + /// @} + + /// Advance iterator to next item. + void increment(); + + /// Advance iterator to next item. + void operator++() { this->increment(); } + + + /// @brief Advance iterator to next item. + /// @return @c true if this iterator is not yet exhausted. + bool next(); + + /// Return the number of point indices in the iterator range. + size_t size() const; + + /// Return @c true if both iterators point to the same element. + bool operator==(const PointIndexIterator& p) const { return mRange.first == p.mRange.first; } + bool operator!=(const PointIndexIterator& p) const { return !this->operator==(p); } + + +private: + typedef std::pair Range; + typedef std::deque RangeDeque; + typedef typename RangeDeque::const_iterator RangeDequeCIter; + typedef boost::scoped_array IndexArray; + + void clear(); + + // Primary index collection + Range mRange; + RangeDeque mRangeList; + RangeDequeCIter mIter; + // Secondary index collection + IndexArray mIndexArray; + size_t mIndexArraySize; +}; // struct PointIndexIterator + + +/// @brief Selectively extract and filter point data using a custom filter operator. +/// +/// @par FilterType example: +/// @interface FilterType +/// @code +/// template +/// struct WeightedAverageAccumulator { +/// typedef T ValueType; +/// +/// WeightedAverageAccumulator(T const * const array, const T radius) +/// : mValues(array), mInvRadius(1.0/radius), mWeightSum(0.0), mValueSum(0.0) {} +/// +/// void reset() { mWeightSum = mValueSum = T(0.0); } +/// +/// // the following method is invoked by the PointIndexFilter +/// void operator()(const T distSqr, const size_t pointIndex) { +/// const T weight = T(1.0) - openvdb::math::Sqrt(distSqr) * mInvRadius; +/// mWeightSum += weight; +/// mValueSum += weight * mValues[pointIndex]; +/// } +/// +/// T result() const { return mWeightSum > T(0.0) ? mValueSum / mWeightSum : T(0.0); } +/// +/// private: +/// T const * const mValues; +/// const T mInvRadius; +/// T mWeightSum, mValueSum; +/// }; // struct WeightedAverageAccumulator +/// @endcode +template +struct PointIndexFilter +{ + typedef typename PointArray::PosType PosType; + typedef typename PosType::value_type ScalarType; + typedef tree::ValueAccessor ConstAccessor; + + /// @brief Constructor + /// @param points world-space point array conforming to the PointArray interface + /// @param tree a point index tree + /// @param xform linear, uniform-scale transform (i.e., cubical voxels) + PointIndexFilter(const PointArray& points, const TreeType& tree, const math::Transform& xform); + + /// Thread safe copy constructor + PointIndexFilter(const PointIndexFilter& rhs); + + /// @brief Perform a radial search query and apply the given filter + /// operator to the selected points. + /// @param center world-space center + /// @param radius world-space radius + /// @param op custom filter operator (see the FilterType example for interface details) + template + void searchAndApply(const PosType& center, ScalarType radius, FilterType& op); + +private: + PointArray const * const mPoints; + ConstAccessor mAcc; + const math::Transform mXform; + const ScalarType mInvVoxelSize; + PointIndexIterator mIter; +}; // struct PointIndexFilter + + +//////////////////////////////////////// + +// Internal operators and implementation details + + +namespace point_index_grid_internal { + +template +struct ValidPartitioningOp +{ + ValidPartitioningOp(tbb::atomic& hasChanged, + const PointArrayT& points, const math::Transform& xform) + : mPoints(&points) + , mTransform(&xform) + , mHasChanged(&hasChanged) + { + } + + template + void operator()(LeafT &leaf, size_t /*leafIndex*/) const + { + if ((*mHasChanged)) { + tbb::task::self().cancel_group_execution(); + return; + } + + typedef typename LeafT::IndexArray IndexArrayT; + typedef typename IndexArrayT::value_type IndexT; + typedef typename PointArrayT::PosType PosType; + + typename LeafT::ValueOnCIter iter; + Coord voxelCoord; + PosType point; + + const IndexT *begin = static_cast(NULL), *end = static_cast(NULL); + + for (iter = leaf.cbeginValueOn(); iter; ++iter) { + + if ((*mHasChanged)) break; + + voxelCoord = iter.getCoord(); + leaf.getIndices(iter.pos(), begin, end); + + while (begin < end) { + + mPoints->getPos(*begin, point); + if (voxelCoord != mTransform->worldToIndexCellCentered(point)) { + mHasChanged->fetch_and_store(true); + break; + } + + ++begin; + } + } + } + +private: + PointArrayT const * const mPoints; + math::Transform const * const mTransform; + tbb::atomic * const mHasChanged; +}; + + +template +struct PopulateLeafNodesOp +{ + typedef uint32_t IndexT; + typedef PointPartitioner Partitioner; + + PopulateLeafNodesOp(boost::scoped_array& leafNodes, + const Partitioner& partitioner) + : mLeafNodes(leafNodes.get()) + , mPartitioner(&partitioner) + { + } + + void operator()(const tbb::blocked_range& range) const { + + typedef typename Partitioner::VoxelOffsetType VoxelOffsetT; + + size_t maxPointCount = 0; + for (size_t n = range.begin(), N = range.end(); n != N; ++n) { + maxPointCount = std::max(maxPointCount, mPartitioner->indices(n).size()); + } + + const IndexT voxelCount = LeafNodeT::SIZE; + + // allocate histogram buffers + boost::scoped_array offsets(new VoxelOffsetT[maxPointCount]); + boost::scoped_array histogram(new IndexT[voxelCount]); + + VoxelOffsetT const * const voxelOffsets = mPartitioner->voxelOffsets().get(); + + for (size_t n = range.begin(), N = range.end(); n != N; ++n) { + + LeafNodeT* node = new LeafNodeT(); + node->setOrigin(mPartitioner->origin(n)); + + typename Partitioner::IndexIterator it = mPartitioner->indices(n); + + const size_t pointCount = it.size(); + IndexT const * const indices = &*it; + + // local copy of voxel offsets. + for (IndexT i = 0; i < pointCount; ++i) { + offsets[i] = voxelOffsets[ indices[i] ]; + } + + // compute voxel-offset histogram + memset(&histogram[0], 0, voxelCount * sizeof(IndexT)); + for (IndexT i = 0; i < pointCount; ++i) { + ++histogram[ offsets[i] ]; + } + + typename LeafNodeT::NodeMaskType& mask = node->getValueMask(); + typename LeafNodeT::Buffer& buffer = node->buffer(); + + // scan histogram (all-prefix-sums) + IndexT count = 0, startOffset; + for (int i = 0; i < int(voxelCount); ++i) { + if (histogram[i] > 0) { + startOffset = count; + count += histogram[i]; + histogram[i] = startOffset; + mask.setOn(i); + } + buffer.setValue(i, count); + } + + // allocate point-index array + node->indices().resize(pointCount); + typename LeafNodeT::ValueType * const orderedIndices = node->indices().data(); + + // rank and permute + for (IndexT i = 0; i < pointCount; ++i) { + orderedIndices[ histogram[ offsets[i] ]++ ] = indices[i]; + } + + mLeafNodes[n] = node; + } + } + + ////////// + + LeafNodeT* * const mLeafNodes; + Partitioner const * const mPartitioner; +}; + + +/// Construct a @c PointIndexTree +template +inline void +constructPointTree(TreeType& tree, const math::Transform& xform, const PointArray& points) +{ + typedef typename TreeType::LeafNodeType LeafType; + + boost::scoped_array leafNodes; + size_t leafNodeCount = 0; + + { + PointPartitioner partitioner; + partitioner.construct(points, xform, /*voxelOrder=*/false, /*recordVoxelOffsets=*/true); + + leafNodeCount = partitioner.size(); + leafNodes.reset(new LeafType*[leafNodeCount]); + + const tbb::blocked_range range(0, leafNodeCount); + tbb::parallel_for(range, PopulateLeafNodesOp(leafNodes, partitioner)); + } + + tree::ValueAccessor acc(tree); + for (size_t n = 0; n < leafNodeCount; ++n) { + acc.addLeaf(leafNodes[n]); + } +} + + +//////////////////////////////////////// + + +template +inline void +dequeToArray(const std::deque& d, boost::scoped_array& a, size_t& size) +{ + size = d.size(); + a.reset(new T[size]); + typename std::deque::const_iterator it = d.begin(), itEnd = d.end(); + T* item = a.get(); + for ( ; it != itEnd; ++it, ++item) *item = *it; +} + + +inline void +constructExclusiveRegions(std::vector& regions, + const CoordBBox& bbox, const CoordBBox& ibox) +{ + regions.clear(); + regions.reserve(6); + Coord cmin = ibox.min(); + Coord cmax = ibox.max(); + + // left-face bbox + regions.push_back(bbox); + regions.back().max().z() = cmin.z(); + + // right-face bbox + regions.push_back(bbox); + regions.back().min().z() = cmax.z(); + + --cmax.z(); // accounting for cell centered bucketing. + ++cmin.z(); + + // front-face bbox + regions.push_back(bbox); + CoordBBox* lastRegion = ®ions.back(); + lastRegion->min().z() = cmin.z(); + lastRegion->max().z() = cmax.z(); + lastRegion->max().x() = cmin.x(); + + // back-face bbox + regions.push_back(*lastRegion); + lastRegion = ®ions.back(); + lastRegion->min().x() = cmax.x(); + lastRegion->max().x() = bbox.max().x(); + + --cmax.x(); + ++cmin.x(); + + // bottom-face bbox + regions.push_back(*lastRegion); + lastRegion = ®ions.back(); + lastRegion->min().x() = cmin.x(); + lastRegion->max().x() = cmax.x(); + lastRegion->max().y() = cmin.y(); + + // top-face bbox + regions.push_back(*lastRegion); + lastRegion = ®ions.back(); + lastRegion->min().y() = cmax.y(); + lastRegion->max().y() = bbox.max().y(); +} + + +template +struct BBoxFilter +{ + typedef typename PointArray::PosType PosType; + typedef typename PosType::value_type ScalarType; + typedef std::pair Range; + typedef std::deque RangeDeque; + typedef std::deque IndexDeque; + + BBoxFilter(RangeDeque& ranges, IndexDeque& indices, const BBoxd& bbox, + const PointArray& points, const math::Transform& xform) + : mRanges(ranges) + , mIndices(indices) + , mRegion(bbox) + , mPoints(points) + , mMap(*xform.baseMap()) + { + } + + template + void filterLeafNode(const LeafNodeType& leaf) + { + typename LeafNodeType::ValueOnCIter iter; + const IndexT *begin = static_cast(NULL), *end = static_cast(NULL); + for (iter = leaf.cbeginValueOn(); iter; ++iter) { + leaf.getIndices(iter.pos(), begin, end); + filterVoxel(iter.getCoord(), begin, end); + } + } + + void filterVoxel(const Coord&, const IndexT* begin, const IndexT* end) + { + PosType vec; + + for (; begin < end; ++begin) { + mPoints.getPos(*begin, vec); + + if (mRegion.isInside(mMap.applyInverseMap(vec))) { + mIndices.push_back(*begin); + } + } + } + +private: + RangeDeque& mRanges; + IndexDeque& mIndices; + const BBoxd mRegion; + const PointArray& mPoints; + const math::MapBase& mMap; +}; + + +template +struct RadialRangeFilter +{ + typedef typename PointArray::PosType PosType; + typedef typename PosType::value_type ScalarType; + typedef std::pair Range; + typedef std::deque RangeDeque; + typedef std::deque IndexDeque; + + RadialRangeFilter(RangeDeque& ranges, IndexDeque& indices, const Vec3d& xyz, double radius, + const PointArray& points, const math::Transform& xform, + const double leafNodeDim, const bool subvoxelAccuracy) + : mRanges(ranges) + , mIndices(indices) + , mCenter(xyz) + , mWSCenter(xform.indexToWorld(xyz)) + , mVoxelDist1(ScalarType(0.0)) + , mVoxelDist2(ScalarType(0.0)) + , mLeafNodeDist1(ScalarType(0.0)) + , mLeafNodeDist2(ScalarType(0.0)) + , mWSRadiusSqr(ScalarType(radius * xform.voxelSize()[0])) + , mPoints(points) + , mSubvoxelAccuracy(subvoxelAccuracy) + { + const ScalarType voxelRadius = ScalarType(std::sqrt(3.0) * 0.5); + mVoxelDist1 = voxelRadius + ScalarType(radius); + mVoxelDist1 *= mVoxelDist1; + + if (radius > voxelRadius) { + mVoxelDist2 = ScalarType(radius) - voxelRadius; + mVoxelDist2 *= mVoxelDist2; + } + + const ScalarType leafNodeRadius = ScalarType(leafNodeDim * std::sqrt(3.0) * 0.5); + mLeafNodeDist1 = leafNodeRadius + ScalarType(radius); + mLeafNodeDist1 *= mLeafNodeDist1; + + if (radius > leafNodeRadius) { + mLeafNodeDist2 = ScalarType(radius) - leafNodeRadius; + mLeafNodeDist2 *= mLeafNodeDist2; + } + + mWSRadiusSqr *= mWSRadiusSqr; + } + + template + void filterLeafNode(const LeafNodeType& leaf) + { + { + const Coord& ijk = leaf.origin(); + PosType vec; + vec[0] = ScalarType(ijk[0]); + vec[1] = ScalarType(ijk[1]); + vec[2] = ScalarType(ijk[2]); + vec += ScalarType(LeafNodeType::DIM - 1) * 0.5; + vec -= mCenter; + + const ScalarType dist = vec.lengthSqr(); + if (dist > mLeafNodeDist1) return; + + if (mLeafNodeDist2 > 0.0 && dist < mLeafNodeDist2) { + const IndexT* begin = &leaf.indices().front(); + mRanges.push_back(Range(begin, begin + leaf.indices().size())); + return; + } + } + + typename LeafNodeType::ValueOnCIter iter; + const IndexT *begin = static_cast(NULL), *end = static_cast(NULL); + for (iter = leaf.cbeginValueOn(); iter; ++iter) { + leaf.getIndices(iter.pos(), begin, end); + filterVoxel(iter.getCoord(), begin, end); + } + } + + void filterVoxel(const Coord& ijk, const IndexT* begin, const IndexT* end) + { + PosType vec; + + { + vec[0] = mCenter[0] - ScalarType(ijk[0]); + vec[1] = mCenter[1] - ScalarType(ijk[1]); + vec[2] = mCenter[2] - ScalarType(ijk[2]); + + const ScalarType dist = vec.lengthSqr(); + if (dist > mVoxelDist1) return; + + if (!mSubvoxelAccuracy || (mVoxelDist2 > 0.0 && dist < mVoxelDist2)) { + if (!mRanges.empty() && mRanges.back().second == begin) { + mRanges.back().second = end; + } else { + mRanges.push_back(Range(begin, end)); + } + return; + } + } + + + while (begin < end) { + mPoints.getPos(*begin, vec); + vec = mWSCenter - vec; + + if (vec.lengthSqr() < mWSRadiusSqr) { + mIndices.push_back(*begin); + } + ++begin; + } + } + +private: + RangeDeque& mRanges; + IndexDeque& mIndices; + const PosType mCenter, mWSCenter; + ScalarType mVoxelDist1, mVoxelDist2, mLeafNodeDist1, mLeafNodeDist2, mWSRadiusSqr; + const PointArray& mPoints; + const bool mSubvoxelAccuracy; +}; // struct RadialRangeFilter + + +//////////////////////////////////////// + + +template +inline void +filteredPointIndexSearchVoxels(RangeFilterType& filter, + const LeafNodeType& leaf, const Coord& min, const Coord& max) +{ + typedef typename LeafNodeType::ValueType PointIndexT; + Index xPos(0), yPos(0), pos(0); + Coord ijk(0); + + const PointIndexT* dataPtr = &leaf.indices().front(); + PointIndexT beginOffset, endOffset; + + for (ijk[0] = min[0]; ijk[0] <= max[0]; ++ijk[0]) { + xPos = (ijk[0] & (LeafNodeType::DIM - 1u)) << (2 * LeafNodeType::LOG2DIM); + for (ijk[1] = min[1]; ijk[1] <= max[1]; ++ijk[1]) { + yPos = xPos + ((ijk[1] & (LeafNodeType::DIM - 1u)) << LeafNodeType::LOG2DIM); + for (ijk[2] = min[2]; ijk[2] <= max[2]; ++ijk[2]) { + pos = yPos + (ijk[2] & (LeafNodeType::DIM - 1u)); + + beginOffset = (pos == 0 ? PointIndexT(0) : leaf.getValue(pos - 1)); + endOffset = leaf.getValue(pos); + + if (endOffset > beginOffset) { + filter.filterVoxel(ijk, dataPtr + beginOffset, dataPtr + endOffset); + } + } + } + } +} + + +template +inline void +filteredPointIndexSearch(RangeFilterType& filter, ConstAccessor& acc, const CoordBBox& bbox) +{ + typedef typename ConstAccessor::TreeType::LeafNodeType LeafNodeType; + Coord ijk(0), ijkMax(0), ijkA(0), ijkB(0); + const Coord leafMin = bbox.min() & ~(LeafNodeType::DIM - 1); + const Coord leafMax = bbox.max() & ~(LeafNodeType::DIM - 1); + + for (ijk[0] = leafMin[0]; ijk[0] <= leafMax[0]; ijk[0] += LeafNodeType::DIM) { + for (ijk[1] = leafMin[1]; ijk[1] <= leafMax[1]; ijk[1] += LeafNodeType::DIM) { + for (ijk[2] = leafMin[2]; ijk[2] <= leafMax[2]; ijk[2] += LeafNodeType::DIM) { + + if (const LeafNodeType* leaf = acc.probeConstLeaf(ijk)) { + ijkMax = ijk; + ijkMax.offset(LeafNodeType::DIM - 1); + + // intersect leaf bbox with search region. + ijkA = Coord::maxComponent(bbox.min(), ijk); + ijkB = Coord::minComponent(bbox.max(), ijkMax); + + if (ijkA != ijk || ijkB != ijkMax) { + filteredPointIndexSearchVoxels(filter, *leaf, ijkA, ijkB); + } else { // leaf bbox is inside the search region + filter.filterLeafNode(*leaf); + } + } + } + } + } +} + + +//////////////////////////////////////// + + +template +inline void +pointIndexSearchVoxels(RangeDeque& rangeList, + const LeafNodeType& leaf, const Coord& min, const Coord& max) +{ + typedef typename LeafNodeType::ValueType PointIndexT; + typedef typename PointIndexT::IntType IntT; + typedef typename RangeDeque::value_type Range; + + Index xPos(0), pos(0), zStride = Index(max[2] - min[2]); + const PointIndexT* dataPtr = &leaf.indices().front(); + PointIndexT beginOffset(0), endOffset(0), + previousOffset(static_cast(leaf.indices().size() + 1u)); + Coord ijk(0); + + for (ijk[0] = min[0]; ijk[0] <= max[0]; ++ijk[0]) { + xPos = (ijk[0] & (LeafNodeType::DIM - 1u)) << (2 * LeafNodeType::LOG2DIM); + + for (ijk[1] = min[1]; ijk[1] <= max[1]; ++ijk[1]) { + pos = xPos + ((ijk[1] & (LeafNodeType::DIM - 1u)) << LeafNodeType::LOG2DIM); + pos += (min[2] & (LeafNodeType::DIM - 1u)); + + beginOffset = (pos == 0 ? PointIndexT(0) : leaf.getValue(pos - 1)); + endOffset = leaf.getValue(pos+zStride); + + if (endOffset > beginOffset) { + + if (beginOffset == previousOffset) { + rangeList.back().second = dataPtr + endOffset; + } else { + rangeList.push_back(Range(dataPtr + beginOffset, dataPtr + endOffset)); + } + + previousOffset = endOffset; + } + } + } +} + + +template +inline void +pointIndexSearch(RangeDeque& rangeList, ConstAccessor& acc, const CoordBBox& bbox) +{ + typedef typename ConstAccessor::TreeType::LeafNodeType LeafNodeType; + typedef typename LeafNodeType::ValueType PointIndexT; + typedef typename RangeDeque::value_type Range; + + Coord ijk(0), ijkMax(0), ijkA(0), ijkB(0); + const Coord leafMin = bbox.min() & ~(LeafNodeType::DIM - 1); + const Coord leafMax = bbox.max() & ~(LeafNodeType::DIM - 1); + + for (ijk[0] = leafMin[0]; ijk[0] <= leafMax[0]; ijk[0] += LeafNodeType::DIM) { + for (ijk[1] = leafMin[1]; ijk[1] <= leafMax[1]; ijk[1] += LeafNodeType::DIM) { + for (ijk[2] = leafMin[2]; ijk[2] <= leafMax[2]; ijk[2] += LeafNodeType::DIM) { + + if (const LeafNodeType* leaf = acc.probeConstLeaf(ijk)) { + ijkMax = ijk; + ijkMax.offset(LeafNodeType::DIM - 1); + + // intersect leaf bbox with search region. + ijkA = Coord::maxComponent(bbox.min(), ijk); + ijkB = Coord::minComponent(bbox.max(), ijkMax); + + if (ijkA != ijk || ijkB != ijkMax) { + pointIndexSearchVoxels(rangeList, *leaf, ijkA, ijkB); + } else { + // leaf bbox is inside the search region, add all indices. + const PointIndexT* begin = &leaf->indices().front(); + rangeList.push_back(Range(begin, (begin + leaf->indices().size()))); + } + } + } + } + } +} + + +} // namespace point_index_grid_internal + + +// PointIndexIterator implementation + +template +inline +PointIndexIterator::PointIndexIterator() + : mRange(static_cast(NULL), static_cast(NULL)) + , mRangeList() + , mIter(mRangeList.begin()) + , mIndexArray() + , mIndexArraySize(0) +{ +} + + +template +inline +PointIndexIterator::PointIndexIterator(const PointIndexIterator& rhs) + : mRange(rhs.mRange) + , mRangeList(rhs.mRangeList) + , mIter(mRangeList.begin()) + , mIndexArray() + , mIndexArraySize(rhs.mIndexArraySize) +{ + if (rhs.mIndexArray) { + mIndexArray.reset(new ValueType[mIndexArraySize]); + memcpy(mIndexArray.get(), rhs.mIndexArray.get(), mIndexArraySize * sizeof(ValueType)); + } +} + + +template +inline PointIndexIterator& +PointIndexIterator::operator=(const PointIndexIterator& rhs) +{ + if (&rhs != this) { + mRange = rhs.mRange; + mRangeList = rhs.mRangeList; + mIter = mRangeList.begin(); + mIndexArray.reset(); + mIndexArraySize = rhs.mIndexArraySize; + + if (rhs.mIndexArray) { + mIndexArray.reset(new ValueType[mIndexArraySize]); + memcpy(mIndexArray.get(), rhs.mIndexArray.get(), mIndexArraySize * sizeof(ValueType)); + } + } + return *this; +} + + +template +inline +PointIndexIterator::PointIndexIterator(const Coord& ijk, ConstAccessor& acc) + : mRange(static_cast(NULL), static_cast(NULL)) + , mRangeList() + , mIter(mRangeList.begin()) + , mIndexArray() + , mIndexArraySize(0) +{ + const LeafNodeType* leaf = acc.probeConstLeaf(ijk); + if (leaf && leaf->getIndices(ijk, mRange.first, mRange.second)) { + mRangeList.push_back(mRange); + mIter = mRangeList.begin(); + } +} + + +template +inline +PointIndexIterator::PointIndexIterator(const CoordBBox& bbox, ConstAccessor& acc) + : mRange(static_cast(NULL), static_cast(NULL)) + , mRangeList() + , mIter(mRangeList.begin()) + , mIndexArray() + , mIndexArraySize(0) +{ + point_index_grid_internal::pointIndexSearch(mRangeList, acc, bbox); + + if (!mRangeList.empty()) { + mIter = mRangeList.begin(); + mRange = mRangeList.front(); + } +} + + +template +inline void +PointIndexIterator::reset() +{ + mIter = mRangeList.begin(); + if (!mRangeList.empty()) { + mRange = mRangeList.front(); + } else if (mIndexArray) { + mRange.first = mIndexArray.get(); + mRange.second = mRange.first + mIndexArraySize; + } else { + mRange.first = static_cast(NULL); + mRange.second = static_cast(NULL); + } +} + + +template +inline void +PointIndexIterator::increment() +{ + ++mRange.first; + if (mRange.first >= mRange.second && mIter != mRangeList.end()) { + ++mIter; + if (mIter != mRangeList.end()) { + mRange = *mIter; + } else if (mIndexArray) { + mRange.first = mIndexArray.get(); + mRange.second = mRange.first + mIndexArraySize; + } + } +} + + +template +inline bool +PointIndexIterator::next() +{ + if (!this->test()) return false; + this->increment(); + return this->test(); +} + + +template +inline size_t +PointIndexIterator::size() const +{ + size_t count = 0; + typename RangeDeque::const_iterator it = mRangeList.begin(); + + for ( ; it != mRangeList.end(); ++it) { + count += it->second - it->first; + } + + return count + mIndexArraySize; +} + + +template +inline void +PointIndexIterator::clear() +{ + mRange.first = static_cast(NULL); + mRange.second = static_cast(NULL); + mRangeList.clear(); + mIter = mRangeList.end(); + mIndexArray.reset(); + mIndexArraySize = 0; +} + + +template +inline void +PointIndexIterator::searchAndUpdate(const Coord& ijk, ConstAccessor& acc) +{ + this->clear(); + const LeafNodeType* leaf = acc.probeConstLeaf(ijk); + if (leaf && leaf->getIndices(ijk, mRange.first, mRange.second)) { + mRangeList.push_back(mRange); + mIter = mRangeList.begin(); + } +} + + +template +inline void +PointIndexIterator::searchAndUpdate(const CoordBBox& bbox, ConstAccessor& acc) +{ + this->clear(); + point_index_grid_internal::pointIndexSearch(mRangeList, acc, bbox); + + if (!mRangeList.empty()) { + mIter = mRangeList.begin(); + mRange = mRangeList.front(); + } +} + + +template +template +inline void +PointIndexIterator::searchAndUpdate(const BBoxd& bbox, ConstAccessor& acc, + const PointArray& points, const math::Transform& xform) +{ + this->clear(); + + std::vector searchRegions; + CoordBBox region(Coord::round(bbox.min()), Coord::round(bbox.max())); + + const Coord dim = region.dim(); + const int minExtent = std::min(dim[0], std::min(dim[1], dim[2])); + + if (minExtent > 2) { + // collect indices that don't need to be tested + CoordBBox ibox = region; + ibox.expand(-1); + + point_index_grid_internal::pointIndexSearch(mRangeList, acc, ibox); + + // define regions for the filtered search + ibox.expand(1); + point_index_grid_internal::constructExclusiveRegions(searchRegions, region, ibox); + } else { + searchRegions.push_back(region); + } + + // filtered search + std::deque filteredIndices; + point_index_grid_internal::BBoxFilter + filter(mRangeList, filteredIndices, bbox, points, xform); + + for (size_t n = 0, N = searchRegions.size(); n < N; ++n) { + point_index_grid_internal::filteredPointIndexSearch(filter, acc, searchRegions[n]); + } + + point_index_grid_internal::dequeToArray(filteredIndices, mIndexArray, mIndexArraySize); + + this->reset(); +} + + +template +template +inline void +PointIndexIterator::searchAndUpdate(const Vec3d& center, double radius, + ConstAccessor& acc, const PointArray& points, const math::Transform& xform, + bool subvoxelAccuracy) +{ + this->clear(); + std::vector searchRegions; + + // bounding box + CoordBBox bbox( + Coord::round(Vec3d(center[0] - radius, center[1] - radius, center[2] - radius)), + Coord::round(Vec3d(center[0] + radius, center[1] + radius, center[2] + radius))); + bbox.expand(1); + + const double iRadius = radius * double(1.0 / std::sqrt(3.0)); + if (iRadius > 2.0) { + // inscribed box + CoordBBox ibox( + Coord::round(Vec3d(center[0] - iRadius, center[1] - iRadius, center[2] - iRadius)), + Coord::round(Vec3d(center[0] + iRadius, center[1] + iRadius, center[2] + iRadius))); + ibox.expand(-1); + + // collect indices that don't need to be tested + point_index_grid_internal::pointIndexSearch(mRangeList, acc, ibox); + + ibox.expand(1); + point_index_grid_internal::constructExclusiveRegions(searchRegions, bbox, ibox); + } else { + searchRegions.push_back(bbox); + } + + // filtered search + std::deque filteredIndices; + const double leafNodeDim = double(TreeType::LeafNodeType::DIM); + + typedef point_index_grid_internal::RadialRangeFilter FilterT; + + FilterT filter(mRangeList, filteredIndices, + center, radius, points, xform, leafNodeDim, subvoxelAccuracy); + + for (size_t n = 0, N = searchRegions.size(); n < N; ++n) { + point_index_grid_internal::filteredPointIndexSearch(filter, acc, searchRegions[n]); + } + + point_index_grid_internal::dequeToArray(filteredIndices, mIndexArray, mIndexArraySize); + + this->reset(); +} + + +template +template +inline void +PointIndexIterator::worldSpaceSearchAndUpdate(const BBoxd& bbox, ConstAccessor& acc, + const PointArray& points, const math::Transform& xform) +{ + this->searchAndUpdate( + BBoxd(xform.worldToIndex(bbox.min()), xform.worldToIndex(bbox.max())), acc, points, xform); +} + + +template +template +inline void +PointIndexIterator::worldSpaceSearchAndUpdate(const Vec3d& center, double radius, + ConstAccessor& acc, const PointArray& points, const math::Transform& xform, + bool subvoxelAccuracy) +{ + this->searchAndUpdate(xform.worldToIndex(center), + (radius / xform.voxelSize()[0]), acc, points, xform, subvoxelAccuracy); +} + + +//////////////////////////////////////// + +// PointIndexFilter implementation + +template +inline +PointIndexFilter::PointIndexFilter( + const PointArray& points, const TreeType& tree, const math::Transform& xform) + : mPoints(&points), mAcc(tree), mXform(xform), mInvVoxelSize(1.0/xform.voxelSize()[0]) +{ +} + + +template +inline +PointIndexFilter::PointIndexFilter(const PointIndexFilter& rhs) + : mPoints(rhs.mPoints) + , mAcc(rhs.mAcc.tree()) + , mXform(rhs.mXform) + , mInvVoxelSize(rhs.mInvVoxelSize) +{ +} + + +template +template +inline void +PointIndexFilter::searchAndApply( + const PosType& center, ScalarType radius, FilterType& op) +{ + if (radius * mInvVoxelSize < ScalarType(8.0)) { + mIter.searchAndUpdate(openvdb::CoordBBox( + mXform.worldToIndexCellCentered(center - radius), + mXform.worldToIndexCellCentered(center + radius)), mAcc); + } else { + mIter.worldSpaceSearchAndUpdate( + center, radius, mAcc, *mPoints, mXform, /*subvoxelAccuracy=*/false); + } + + const ScalarType radiusSqr = radius * radius; + ScalarType distSqr = 0.0; + PosType pos; + for (; mIter; ++mIter) { + mPoints->getPos(*mIter, pos); + pos -= center; + distSqr = pos.lengthSqr(); + + if (distSqr < radiusSqr) { + op(distSqr, *mIter); + } + } +} + + +//////////////////////////////////////// + + +template +inline typename GridT::Ptr +createPointIndexGrid(const PointArrayT& points, const math::Transform& xform) +{ + typename GridT::Ptr grid = GridT::create(typename GridT::ValueType(0)); + grid->setTransform(xform.copy()); + + if (points.size() > 0) { + point_index_grid_internal::constructPointTree( + grid->tree(), grid->transform(), points); + } + + return grid; +} + + +template +inline typename GridT::Ptr +createPointIndexGrid(const PointArrayT& points, double voxelSize) +{ + math::Transform::Ptr xform = math::Transform::createLinearTransform(voxelSize); + return createPointIndexGrid(points, *xform); +} + + +template +inline bool +isValidPartition(const PointArrayT& points, const GridT& grid) +{ + tree::LeafManager leafs(grid.tree()); + + size_t pointCount = 0; + for (size_t n = 0, N = leafs.leafCount(); n < N; ++n) { + pointCount += leafs.leaf(n).indices().size(); + } + + if (points.size() != pointCount) { + return false; + } + + tbb::atomic changed; + changed = false; + + point_index_grid_internal::ValidPartitioningOp + op(changed, points, grid.transform()); + + leafs.foreach(op); + + return !bool(changed); +} + + +template +inline typename GridT::ConstPtr +getValidPointIndexGrid(const PointArrayT& points, const typename GridT::ConstPtr& grid) +{ + if (isValidPartition(points, *grid)) { + return grid; + } + + return createPointIndexGrid(points, grid->transform()); +} + + +template +inline typename GridT::Ptr +getValidPointIndexGrid(const PointArrayT& points, const typename GridT::Ptr& grid) +{ + if (isValidPartition(points, *grid)) { + return grid; + } + + return createPointIndexGrid(points, grid->transform()); +} + + +//////////////////////////////////////// + + +template +struct PointIndexLeafNode : public tree::LeafNode +{ + typedef PointIndexLeafNode LeafNodeType; + typedef boost::shared_ptr Ptr; + + typedef T ValueType; + typedef std::vector IndexArray; + + + IndexArray& indices() { return mIndices; } + const IndexArray& indices() const { return mIndices; } + + bool getIndices(const Coord& ijk, const ValueType*& begin, const ValueType*& end) const; + bool getIndices(Index offset, const ValueType*& begin, const ValueType*& end) const; + + void setOffsetOn(Index offset, const ValueType& val); + void setOffsetOnly(Index offset, const ValueType& val); + + bool isEmpty(const CoordBBox& bbox) const; + +private: + IndexArray mIndices; + + //////////////////////////////////////// + + // The following methods had to be copied from the LeafNode class + // to make the derived PointIndexLeafNode class compatible with the tree structure. + +public: + typedef tree::LeafNode BaseLeaf; + typedef util::NodeMask NodeMaskType; + + using BaseLeaf::LOG2DIM; + using BaseLeaf::TOTAL; + using BaseLeaf::DIM; + using BaseLeaf::NUM_VALUES; + using BaseLeaf::NUM_VOXELS; + using BaseLeaf::SIZE; + using BaseLeaf::LEVEL; + + /// Default constructor + PointIndexLeafNode() : BaseLeaf(), mIndices() {} + + explicit + PointIndexLeafNode(const Coord& coords, const T& value = zeroVal(), bool active = false) + : BaseLeaf(coords, value, active) + , mIndices() + { + } + +#ifndef OPENVDB_2_ABI_COMPATIBLE + PointIndexLeafNode(PartialCreate, const Coord& coords, + const T& value = zeroVal(), bool active = false) + : BaseLeaf(PartialCreate(), coords, value, active) + , mIndices() + { + } +#endif + + /// Deep copy constructor + PointIndexLeafNode(const PointIndexLeafNode& rhs) : BaseLeaf(rhs), mIndices(rhs.mIndices) {} + + /// @brief Return @c true if the given node (which may have a different @c ValueType + /// than this node) has the same active value topology as this node. + template + bool hasSameTopology(const PointIndexLeafNode* other) const { + return BaseLeaf::hasSameTopology(other); + } + + /// Check for buffer, state and origin equivalence. + bool operator==(const PointIndexLeafNode& other) const { return BaseLeaf::operator==(other); } + + bool operator!=(const PointIndexLeafNode& other) const { return !(other == *this); } + + template void merge(const PointIndexLeafNode& rhs) { + BaseLeaf::merge(rhs); + } + template void merge(const ValueType& tileValue, bool tileActive) { + BaseLeaf::template merge(tileValue, tileActive); + } + + template + void merge(const PointIndexLeafNode& other, + const ValueType& /*bg*/, const ValueType& /*otherBG*/) + { + BaseLeaf::template merge(other); + } + + void addLeaf(PointIndexLeafNode*) {} + template + void addLeafAndCache(PointIndexLeafNode*, AccessorT&) {} + + //@{ + /// @brief Return a pointer to this node. + PointIndexLeafNode* touchLeaf(const Coord&) { return this; } + template + PointIndexLeafNode* touchLeafAndCache(const Coord&, AccessorT&) { return this; } + + template + NodeT* probeNodeAndCache(const Coord&, AccessorT&) + { + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (!(boost::is_same::value)) return NULL; + return reinterpret_cast(this); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + PointIndexLeafNode* probeLeaf(const Coord&) { return this; } + template + PointIndexLeafNode* probeLeafAndCache(const Coord&, AccessorT&) { return this; } + //@} + + //@{ + /// @brief Return a @const pointer to this node. + const PointIndexLeafNode* probeConstLeaf(const Coord&) const { return this; } + template + const PointIndexLeafNode* probeConstLeafAndCache(const Coord&, AccessorT&) const {return this;} + template + const PointIndexLeafNode* probeLeafAndCache(const Coord&, AccessorT&) const { return this; } + const PointIndexLeafNode* probeLeaf(const Coord&) const { return this; } + template + const NodeT* probeConstNodeAndCache(const Coord&, AccessorT&) const + { + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (!(boost::is_same::value)) return NULL; + return reinterpret_cast(this); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + //@} + + + // I/O methods + + void readBuffers(std::istream& is, bool fromHalf = false); + void readBuffers(std::istream& is, const CoordBBox&, bool fromHalf = false); + void writeBuffers(std::ostream& os, bool toHalf = false) const; + + + Index64 memUsage() const; + + + //////////////////////////////////////// + + // Disable all write methods to avoid unintentional changes + // to the point-array offsets. + + void assertNonmodifiable() { + assert(false && "Cannot modify voxel values in a PointIndexTree."); + } + + void setActiveState(const Coord&, bool) { assertNonmodifiable(); } + void setActiveState(Index, bool) { assertNonmodifiable(); } + + void setValueOnly(const Coord&, const ValueType&) { assertNonmodifiable(); } + void setValueOnly(Index, const ValueType&) { assertNonmodifiable(); } + + void setValueOff(const Coord&) { assertNonmodifiable(); } + void setValueOff(Index) { assertNonmodifiable(); } + + void setValueOff(const Coord&, const ValueType&) { assertNonmodifiable(); } + void setValueOff(Index, const ValueType&) { assertNonmodifiable(); } + + void setValueOn(const Coord&) { assertNonmodifiable(); } + void setValueOn(Index) { assertNonmodifiable(); } + + void setValueOn(const Coord&, const ValueType&) { assertNonmodifiable(); } + void setValueOn(Index, const ValueType&) { assertNonmodifiable(); } + + void setValue(const Coord&, const ValueType&) { assertNonmodifiable(); } + + void setValuesOn() { assertNonmodifiable(); } + void setValuesOff() { assertNonmodifiable(); } + + template + void modifyValue(Index, const ModifyOp&) { assertNonmodifiable(); } + + template + void modifyValue(const Coord&, const ModifyOp&) { assertNonmodifiable(); } + + template + void modifyValueAndActiveState(const Coord&, const ModifyOp&) { assertNonmodifiable(); } + + void clip(const CoordBBox&, const ValueType&) { assertNonmodifiable(); } + + void fill(const CoordBBox&, const ValueType&, bool) { assertNonmodifiable(); } + void fill(const ValueType&) {} + void fill(const ValueType&, bool) { assertNonmodifiable(); } + + template + void setValueOnlyAndCache(const Coord&, const ValueType&, AccessorT&) {assertNonmodifiable();} + + template + void modifyValueAndActiveStateAndCache(const Coord&, const ModifyOp&, AccessorT&) { + assertNonmodifiable(); + } + + template + void setValueOffAndCache(const Coord&, const ValueType&, AccessorT&) { assertNonmodifiable(); } + + template + void setActiveStateAndCache(const Coord&, bool, AccessorT&) { assertNonmodifiable(); } + + void resetBackground(const ValueType&, const ValueType&) { assertNonmodifiable(); } + + void signedFloodFill(const ValueType&) { assertNonmodifiable(); } + void signedFloodFill(const ValueType&, const ValueType&) { assertNonmodifiable(); } + + void negate() { assertNonmodifiable(); } + +protected: + typedef typename BaseLeaf::ValueOn ValueOn; + typedef typename BaseLeaf::ValueOff ValueOff; + typedef typename BaseLeaf::ValueAll ValueAll; + typedef typename BaseLeaf::ChildOn ChildOn; + typedef typename BaseLeaf::ChildOff ChildOff; + typedef typename BaseLeaf::ChildAll ChildAll; + + typedef typename NodeMaskType::OnIterator MaskOnIterator; + typedef typename NodeMaskType::OffIterator MaskOffIterator; + typedef typename NodeMaskType::DenseIterator MaskDenseIterator; + + // During topology-only construction, access is needed + // to protected/private members of other template instances. + template friend struct PointIndexLeafNode; + + friend class tree::IteratorBase; + friend class tree::IteratorBase; + friend class tree::IteratorBase; + +public: + + + typedef typename BaseLeaf::template ValueIter< + MaskOnIterator, PointIndexLeafNode, const ValueType, ValueOn> ValueOnIter; + typedef typename BaseLeaf::template ValueIter< + MaskOnIterator, const PointIndexLeafNode, const ValueType, ValueOn> ValueOnCIter; + typedef typename BaseLeaf::template ValueIter< + MaskOffIterator, PointIndexLeafNode, const ValueType, ValueOff> ValueOffIter; + typedef typename BaseLeaf::template ValueIter< + MaskOffIterator,const PointIndexLeafNode,const ValueType,ValueOff> ValueOffCIter; + typedef typename BaseLeaf::template ValueIter< + MaskDenseIterator, PointIndexLeafNode, const ValueType, ValueAll> ValueAllIter; + typedef typename BaseLeaf::template ValueIter< + MaskDenseIterator,const PointIndexLeafNode,const ValueType,ValueAll> ValueAllCIter; + typedef typename BaseLeaf::template ChildIter< + MaskOnIterator, PointIndexLeafNode, ChildOn> ChildOnIter; + typedef typename BaseLeaf::template ChildIter< + MaskOnIterator, const PointIndexLeafNode, ChildOn> ChildOnCIter; + typedef typename BaseLeaf::template ChildIter< + MaskOffIterator, PointIndexLeafNode, ChildOff> ChildOffIter; + typedef typename BaseLeaf::template ChildIter< + MaskOffIterator, const PointIndexLeafNode, ChildOff> ChildOffCIter; + typedef typename BaseLeaf::template DenseIter< + PointIndexLeafNode, ValueType, ChildAll> ChildAllIter; + typedef typename BaseLeaf::template DenseIter< + const PointIndexLeafNode, const ValueType, ChildAll> ChildAllCIter; + +#define VMASK_ this->getValueMask() + ValueOnCIter cbeginValueOn() const { return ValueOnCIter(VMASK_.beginOn(), this); } + ValueOnCIter beginValueOn() const { return ValueOnCIter(VMASK_.beginOn(), this); } + ValueOnIter beginValueOn() { return ValueOnIter(VMASK_.beginOn(), this); } + ValueOffCIter cbeginValueOff() const { return ValueOffCIter(VMASK_.beginOff(), this); } + ValueOffCIter beginValueOff() const { return ValueOffCIter(VMASK_.beginOff(), this); } + ValueOffIter beginValueOff() { return ValueOffIter(VMASK_.beginOff(), this); } + ValueAllCIter cbeginValueAll() const { return ValueAllCIter(VMASK_.beginDense(), this); } + ValueAllCIter beginValueAll() const { return ValueAllCIter(VMASK_.beginDense(), this); } + ValueAllIter beginValueAll() { return ValueAllIter(VMASK_.beginDense(), this); } + + ValueOnCIter cendValueOn() const { return ValueOnCIter(VMASK_.endOn(), this); } + ValueOnCIter endValueOn() const { return ValueOnCIter(VMASK_.endOn(), this); } + ValueOnIter endValueOn() { return ValueOnIter(VMASK_.endOn(), this); } + ValueOffCIter cendValueOff() const { return ValueOffCIter(VMASK_.endOff(), this); } + ValueOffCIter endValueOff() const { return ValueOffCIter(VMASK_.endOff(), this); } + ValueOffIter endValueOff() { return ValueOffIter(VMASK_.endOff(), this); } + ValueAllCIter cendValueAll() const { return ValueAllCIter(VMASK_.endDense(), this); } + ValueAllCIter endValueAll() const { return ValueAllCIter(VMASK_.endDense(), this); } + ValueAllIter endValueAll() { return ValueAllIter(VMASK_.endDense(), this); } + + ChildOnCIter cbeginChildOn() const { return ChildOnCIter(VMASK_.endOn(), this); } + ChildOnCIter beginChildOn() const { return ChildOnCIter(VMASK_.endOn(), this); } + ChildOnIter beginChildOn() { return ChildOnIter(VMASK_.endOn(), this); } + ChildOffCIter cbeginChildOff() const { return ChildOffCIter(VMASK_.endOff(), this); } + ChildOffCIter beginChildOff() const { return ChildOffCIter(VMASK_.endOff(), this); } + ChildOffIter beginChildOff() { return ChildOffIter(VMASK_.endOff(), this); } + ChildAllCIter cbeginChildAll() const { return ChildAllCIter(VMASK_.beginDense(), this); } + ChildAllCIter beginChildAll() const { return ChildAllCIter(VMASK_.beginDense(), this); } + ChildAllIter beginChildAll() { return ChildAllIter(VMASK_.beginDense(), this); } + + ChildOnCIter cendChildOn() const { return ChildOnCIter(VMASK_.endOn(), this); } + ChildOnCIter endChildOn() const { return ChildOnCIter(VMASK_.endOn(), this); } + ChildOnIter endChildOn() { return ChildOnIter(VMASK_.endOn(), this); } + ChildOffCIter cendChildOff() const { return ChildOffCIter(VMASK_.endOff(), this); } + ChildOffCIter endChildOff() const { return ChildOffCIter(VMASK_.endOff(), this); } + ChildOffIter endChildOff() { return ChildOffIter(VMASK_.endOff(), this); } + ChildAllCIter cendChildAll() const { return ChildAllCIter(VMASK_.endDense(), this); } + ChildAllCIter endChildAll() const { return ChildAllCIter(VMASK_.endDense(), this); } + ChildAllIter endChildAll() { return ChildAllIter(VMASK_.endDense(), this); } +#undef VMASK_ +}; // struct PointIndexLeafNode + + +template +inline bool +PointIndexLeafNode::getIndices(const Coord& ijk, + const ValueType*& begin, const ValueType*& end) const +{ + return getIndices(LeafNodeType::coordToOffset(ijk), begin, end); +} + + +template +inline bool +PointIndexLeafNode::getIndices(Index offset, + const ValueType*& begin, const ValueType*& end) const +{ + if (this->isValueMaskOn(offset)) { + const ValueType* dataPtr = &mIndices.front(); + begin = dataPtr + (offset == 0 ? ValueType(0) : this->buffer()[offset - 1]); + end = dataPtr + this->buffer()[offset]; + return true; + } + return false; +} + + +template +inline void +PointIndexLeafNode::setOffsetOn(Index offset, const ValueType& val) +{ + this->buffer().setValue(offset, val); + this->setValueMaskOn(offset); +} + + +template +inline void +PointIndexLeafNode::setOffsetOnly(Index offset, const ValueType& val) +{ + this->buffer().setValue(offset, val); +} + + +template +inline bool +PointIndexLeafNode::isEmpty(const CoordBBox& bbox) const +{ + Index xPos, pos, zStride = Index(bbox.max()[2] - bbox.min()[2]); + Coord ijk; + + for (ijk[0] = bbox.min()[0]; ijk[0] <= bbox.max()[0]; ++ijk[0]) { + xPos = (ijk[0] & (DIM - 1u)) << (2 * LOG2DIM); + + for (ijk[1] = bbox.min()[1]; ijk[1] <= bbox.max()[1]; ++ijk[1]) { + pos = xPos + ((ijk[1] & (DIM - 1u)) << LOG2DIM); + pos += (bbox.min()[2] & (DIM - 1u)); + + if (this->buffer()[pos+zStride] > (pos == 0 ? T(0) : this->buffer()[pos - 1])) { + return false; + } + } + } + + return true; +} + + +template +inline void +PointIndexLeafNode::readBuffers(std::istream& is, bool fromHalf) +{ + BaseLeaf::readBuffers(is, fromHalf); + + Index64 numIndices = Index64(0); + is.read(reinterpret_cast(&numIndices), sizeof(Index64)); + + mIndices.resize(size_t(numIndices)); + is.read(reinterpret_cast(mIndices.data()), numIndices * sizeof(T)); +} + + +template +inline void +PointIndexLeafNode::readBuffers(std::istream& is, const CoordBBox& bbox, bool fromHalf) +{ + // Read and clip voxel values. + BaseLeaf::readBuffers(is, bbox, fromHalf); + + Index64 numIndices = Index64(0); + is.read(reinterpret_cast(&numIndices), sizeof(Index64)); + + const Index64 numBytes = numIndices * sizeof(T); + + if (bbox.hasOverlap(this->getNodeBoundingBox())) { + mIndices.resize(size_t(numIndices)); + is.read(reinterpret_cast(mIndices.data()), numBytes); + + /// @todo If any voxels were deactivated as a result of clipping in the call to + /// BaseLeaf::readBuffers(), the point index list will need to be regenerated. + } else { + // Read and discard voxel values. + boost::scoped_array buf(new char[numBytes]); + is.read(buf.get(), numBytes); + } + + // Reserved for future use + Index64 auxDataBytes = Index64(0); + is.read(reinterpret_cast(&auxDataBytes), sizeof(Index64)); + if (auxDataBytes > 0) { + // For now, read and discard any auxiliary data. + boost::scoped_array auxData(new char[auxDataBytes]); + is.read(auxData.get(), auxDataBytes); + } +} + + +template +inline void +PointIndexLeafNode::writeBuffers(std::ostream& os, bool toHalf) const +{ + BaseLeaf::writeBuffers(os, toHalf); + + Index64 numIndices = Index64(mIndices.size()); + os.write(reinterpret_cast(&numIndices), sizeof(Index64)); + os.write(reinterpret_cast(mIndices.data()), numIndices * sizeof(T)); + + // Reserved for future use + const Index64 auxDataBytes = Index64(0); + os.write(reinterpret_cast(&auxDataBytes), sizeof(Index64)); +} + + +template +inline Index64 +PointIndexLeafNode::memUsage() const +{ + return BaseLeaf::memUsage() + Index64((sizeof(T)*mIndices.capacity()) + sizeof(mIndices)); +} + +} // namespace tools + + +//////////////////////////////////////// + + +namespace tree { + +/// Helper metafunction used to implement LeafNode::SameConfiguration +/// (which, as an inner class, can't be independently specialized) +template +struct SameLeafConfig > +{ + static const bool value = true; +}; + +} // namespace tree +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_POINT_INDEX_GRID_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/PointMaskGrid.h b/nuparu/include/openvdb/include/openvdb/tools/PointMaskGrid.h new file mode 100644 index 00000000..bd896f2c --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/PointMaskGrid.h @@ -0,0 +1,283 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @author Ken Museth +/// +/// @file PointMaskGrid.h +/// +/// @brief This tool produces a grid where every voxel that contains a +/// point is active. It employes thread-local storage for best performance. +/// +/// The @c PointListT template argument below refers to any class +/// with the following interface (see unittest/TestPointMaskGrid.cc +/// and SOP_OpenVDB_From_Particles.cc for practical examples): +/// @code +/// +/// class PointList { +/// ... +/// public: +/// +/// // Return the total number of particles in list. +/// size_t size() const; +/// +/// // Get the world space position of the nth particle. +/// void getPos(size_t n, Vec3R& xyz) const; +/// }; +/// @endcode +/// +/// @note See unittest/TestPointMaskGrid.cc for an example. +/// +/// The @c InterruptT template argument below refers to any class +/// with the following interface: +/// @code +/// class Interrupter { +/// ... +/// public: +/// void start(const char* name = NULL)// called when computations begin +/// void end() // called when computations end +/// bool wasInterrupted(int percent=-1)// return true to break computation +/// }; +/// @endcode +/// +/// @note If no template argument is provided for this InterruptT +/// the util::NullInterrupter is used which implies that all +/// interrupter calls are no-ops (i.e. incurs no computational overhead). + +#ifndef OPENVDB_TOOLS_POINT_MASK_GRID_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_POINT_MASK_GRID_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +// Forward declaration of main class +template +class PointMaskGrid; + +/// @brief Makes every voxel of the @c grid active if it contains a point. +/// +/// @param points points that active the voxels of @c grid +/// @param grid on out its voxels with points are active +template +inline void +pointMaskGrid(const PointListT& points, GridT& grid) +{ + PointMaskGrid tmp(grid, NULL); + tmp.addPoints(points); +} + +/// @brief Return a MaskGrid where each binary voxel value +/// is on if the voxel contains one (or more) points (i.e. +/// the 3D position of a point is closer to this voxel than +/// any other voxels). +/// +/// @param points points that active the voxels in the returned grid. +/// @param xform transform from world space to voxels in grid space. +template +inline MaskGrid::Ptr +createPointMaskGrid(const PointListT& points, const math::Transform& xform) +{ + MaskGrid::Ptr grid = createGrid( false ); + grid->setTransform( xform.copy() ); + pointMaskGrid( points, *grid ); + return grid; +} + +//////////////////////////////////////// + +/// @brief Makes every voxel of a grid active if it contains a point. +template +class PointMaskGrid +{ +public: + typedef typename GridT::ValueType ValueT; + + /// @brief Constructor from a grid and optional interrupter + /// + /// @param grid Grid whoes voxels will have their state activated by points. + /// @param interrupter Optional interrupter to prematurely terminate execution. + explicit PointMaskGrid(GridT& grid, InterrupterT* interrupter = NULL) + : mGrid(&grid) + , mInterrupter(interrupter) + { + } + + /// @brief Activates the state of any voxel in the input grid that contains a point. + /// + /// @param points List of points that active the voxels in the input grid. + /// @param grainSize Set the grain-size used for multi-threading. A value of 0 + /// disables multi-threading! + template + void addPoints(const PointListT& points, size_t grainSize = 1024) + { + if (mInterrupter) mInterrupter->start("PointMaskGrid: adding points"); + if (grainSize>0) { + typename GridT::Ptr examplar = mGrid->copy( CP_NEW ); + PoolType pool( *examplar );//thread local storage pool of grids + AddPoints tmp(points, pool, grainSize, *this ); + if ( this->interrupt() ) return; + ReducePool reducePool(pool, mGrid, size_t(0)); + } else { + const math::Transform& xform = mGrid->transform(); + typename GridT::Accessor acc = mGrid->getAccessor(); + Vec3R wPos; + for (size_t i = 0, n = points.size(); i < n; ++i) { + if ( this->interrupt() ) break; + points.getPos(i, wPos); + acc.setValueOn( xform.worldToIndexCellCentered( wPos ) ); + } + } + if (mInterrupter) mInterrupter->end(); + } + +private: + // Disallow copy construction and copy by assignment! + PointMaskGrid(const PointMaskGrid&);// not implemented + PointMaskGrid& operator=(const PointMaskGrid&);// not implemented + + bool interrupt() const + { + if (mInterrupter && util::wasInterrupted(mInterrupter)) { + tbb::task::self().cancel_group_execution(); + return true; + } + return false; + } + + // Private struct that implements concurrent thread-local + // insersion of points into a grid + typedef tbb::enumerable_thread_specific PoolType; + template struct AddPoints; + + // Private class that implements concurrent reduction of a thread-local pool + struct ReducePool; + + GridT* mGrid; + InterrupterT* mInterrupter; +};// PointMaskGrid + +// Private member class that implements concurrent thread-local +// insersion of points into a grid +template +template +struct PointMaskGrid::AddPoints +{ + AddPoints(const PointListT& points, + PoolType& pool, + size_t grainSize, + const PointMaskGrid& parent) + : mPoints(&points) + , mParent(&parent) + , mPool(&pool) + { + tbb::parallel_for(tbb::blocked_range(0, mPoints->size(), grainSize), *this); + } + void operator()(const tbb::blocked_range& range) const + { + if (mParent->interrupt()) return; + GridT& grid = mPool->local(); + const math::Transform& xform = grid.transform(); + typename GridT::Accessor acc = grid.getAccessor(); + Vec3R wPos; + for (size_t i=range.begin(), n=range.end(); i!=n; ++i) { + mPoints->getPos(i, wPos); + acc.setValueOn( xform.worldToIndexCellCentered( wPos ) ); + } + } + const PointListT* mPoints; + const PointMaskGrid* mParent; + PoolType* mPool; + +};// end of private member class AddPoints + +// Private member class that implements concurrent reduction of a thread-local pool +template +struct PointMaskGrid::ReducePool +{ + typedef std::vector VecT; + typedef typename VecT::iterator IterT; + typedef tbb::blocked_range RangeT; + + ReducePool(PoolType& pool, GridT* grid, size_t grainSize = 1) + : mOwnsGrid(false) + , mGrid(grid) + { + if ( grainSize == 0 ) { + typedef typename PoolType::const_iterator IterT; + for (IterT i=pool.begin(); i!=pool.end(); ++i) mGrid->topologyUnion( *i ); + } else { + VecT grids( pool.size() ); + typename PoolType::iterator i = pool.begin(); + for (size_t j=0; j != pool.size(); ++i, ++j) grids[j] = &(*i); + tbb::parallel_reduce( RangeT( grids.begin(), grids.end(), grainSize ), *this ); + } + } + + ReducePool(const ReducePool&, tbb::split) + : mOwnsGrid(true) + , mGrid(new GridT()) + { + } + + ~ReducePool() { if (mOwnsGrid) delete mGrid; } + + void operator()(const RangeT& r) + { + for (IterT i=r.begin(); i!=r.end(); ++i) mGrid->topologyUnion( *(*i) ); + } + + void join(ReducePool& other) { mGrid->topologyUnion(*other.mGrid); } + + const bool mOwnsGrid; + GridT* mGrid; +};// end of private member class ReducePool + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif //OPENVDB_TOOLS_POINT_MASK_GRID_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/PointPartitioner.h b/nuparu/include/openvdb/include/openvdb/tools/PointPartitioner.h new file mode 100644 index 00000000..9ada5210 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/PointPartitioner.h @@ -0,0 +1,1038 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file PointPartitioner.h +/// +/// @brief Spatially partitions points using a parallel radix-based +/// sorting algorithm. +/// +/// @details Performs a stable deterministic sort; partitioning the same +/// point sequence will produce the same result each time. +/// @details The algorithm is unbounded meaning that points may be +/// distributed anywhere in index space. +/// @details The actual points are never stored in the tool, only +/// offsets into an external array. +/// +/// @author Mihai Alden + +#ifndef OPENVDB_TOOLS_POINT_PARTITIONER_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_POINT_PARTITIONER_HAS_BEEN_INCLUDED + + +#include +#include + +#include +#include +#include +#include // std::pair +#include + +#include // boost::int_t::least +#include +#include +#include // boost::math::isfinite + +#include +#include +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + + +//////////////////////////////////////// + + +/// @brief Partitions points into @c BucketLog2Dim aligned buckets +/// using a parallel radix-based sorting algorithm. +/// +/// @interface PointArray +/// Expected interface for the PointArray container: +/// @code +/// template +/// struct PointArray +/// { +/// // The type used to represent world-space point positions +/// typedef VectorType PosType; +/// +/// // Return the number of points in the array +/// size_t size() const; +/// +/// // Return the world-space position of the nth point in the array. +/// void getPos(size_t n, PosType& xyz) const; +/// }; +/// @endcode +/// +/// @details Performs a stable deterministic sort; partitioning the same +/// point sequence will produce the same result each time. +/// @details The algorithm is unbounded meaning that points may be +/// distributed anywhere in index space. +/// @details The actual points are never stored in the tool, only +/// offsets into an external array. +/// @details @c BucketLog2Dim defines the bucket coordinate dimensions, +/// i.e. BucketLog2Dim = 3 corresponds to a bucket that spans +/// a (2^3)^3 = 8^3 voxel region. +template +class PointPartitioner +{ +public: + enum { LOG2DIM = BucketLog2Dim }; + + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + typedef PointIndexType IndexType; + typedef typename boost::int_t<1 + (3 * BucketLog2Dim)>::least VoxelOffsetType; + typedef boost::scoped_array VoxelOffsetArray; + + class IndexIterator; + + ////////// + + PointPartitioner(); + + /// @brief Partitions point indices into @c BucketLog2Dim aligned buckets. + /// + /// @param points list of world space points. + /// @param xform world to index space transform. + /// @param voxelOrder sort point indices by local voxel offsets. + /// @param recordVoxelOffsets construct local voxel offsets + template + void construct(const PointArray& points, const math::Transform& xform, + bool voxelOrder = false, bool recordVoxelOffsets = false); + + + /// @brief Partitions point indices into @c BucketLog2Dim aligned buckets. + /// + /// @param points list of world space points. + /// @param xform world to index space transform. + /// @param voxelOrder sort point indices by local voxel offsets. + /// @param recordVoxelOffsets construct local voxel offsets + template + static Ptr create(const PointArray& points, const math::Transform& xform, + bool voxelOrder = false, bool recordVoxelOffsets = false); + + + /// @brief Returns the number of buckets. + size_t size() const { return mPageCount; } + + /// @brief true if the container size is 0, false otherwise. + bool empty() const { return mPageCount == 0; } + + /// @brief Removes all data and frees up memory. + void clear(); + + /// @brief Exchanges the content of the container by another. + void swap(PointPartitioner&); + + /// @brief Returns the point indices for bucket @a n + IndexIterator indices(size_t n) const; + + /// @brief Returns the coordinate-aligned bounding box for bucket @a n + CoordBBox getBBox(size_t n) const { + return CoordBBox::createCube(mPageCoordinates[n], (1u << BucketLog2Dim)); + } + + /// @brief Returns the origin coordinate for bucket @a n + const Coord& origin(size_t n) const { return mPageCoordinates[n]; } + + /// @brief Returns a list of @c LeafNode voxel offsets for the points. + /// @note The list is optionally constructed. + const VoxelOffsetArray& voxelOffsets() const { return mVoxelOffsets; } + +private: + // Disallow copying + PointPartitioner(const PointPartitioner&); + PointPartitioner& operator=(const PointPartitioner&); + + boost::scoped_array mPointIndices; + VoxelOffsetArray mVoxelOffsets; + + boost::scoped_array mPageOffsets; + boost::scoped_array mPageCoordinates; + IndexType mPageCount; +}; // class PointPartitioner + + +typedef PointPartitioner UInt32PointPartitioner; + + +template +class PointPartitioner::IndexIterator +{ +public: + typedef PointIndexType IndexType; + + IndexIterator(IndexType* begin = NULL, IndexType* end = NULL) + : mBegin(begin), mEnd(end), mItem(begin) {} + + /// @brief Rewind to first item. + void reset() { mItem = mBegin; } + + /// @brief Number of point indices in the iterator range. + size_t size() const { return mEnd - mBegin; } + + /// @brief Returns the item to which this iterator is currently pointing. + IndexType& operator*() { assert(mItem != NULL); return *mItem; } + const IndexType& operator*() const { assert(mItem != NULL); return *mItem; } + + /// @brief Return @c true if this iterator is not yet exhausted. + operator bool() const { return mItem < mEnd; } + bool test() const { return mItem < mEnd; } + + /// @brief Advance to the next item. + IndexIterator& operator++() { assert(this->test()); ++mItem; return *this; } + + /// @brief Advance to the next item. + bool next() { this->operator++(); return this->test(); } + bool increment() { this->next(); return this->test(); } + + /// @brief Equality operators + bool operator==(const IndexIterator& other) const { return mItem == other.mItem; } + bool operator!=(const IndexIterator& other) const { return !this->operator==(other); } + +private: + IndexType * const mBegin, * const mEnd; + IndexType * mItem; +}; // class PointPartitioner::IndexIterator + + +//////////////////////////////////////// +//////////////////////////////////////// + +// Implementation details + + +namespace point_partitioner_internal { + + +template +struct ComputePointOrderOp +{ + ComputePointOrderOp(PointIndexType* pointOrder, + const PointIndexType* bucketCounters, const PointIndexType* bucketOffsets) + : mPointOrder(pointOrder) + , mBucketCounters(bucketCounters) + , mBucketOffsets(bucketOffsets) + { + } + + void operator()(const tbb::blocked_range& range) const { + for (size_t n = range.begin(), N = range.end(); n != N; ++n) { + mPointOrder[n] += mBucketCounters[mBucketOffsets[n]]; + } + } + + PointIndexType * const mPointOrder; + PointIndexType const * const mBucketCounters; + PointIndexType const * const mBucketOffsets; +}; // struct ComputePointOrderOp + + +template +struct CreateOrderedPointIndexArrayOp +{ + CreateOrderedPointIndexArrayOp(PointIndexType* orderedIndexArray, + const PointIndexType* pointOrder, const PointIndexType* indices) + : mOrderedIndexArray(orderedIndexArray) + , mPointOrder(pointOrder) + , mIndices(indices) + { + } + + void operator()(const tbb::blocked_range& range) const { + for (size_t n = range.begin(), N = range.end(); n != N; ++n) { + mOrderedIndexArray[mPointOrder[n]] = mIndices[n]; + } + } + + PointIndexType * const mOrderedIndexArray; + PointIndexType const * const mPointOrder; + PointIndexType const * const mIndices; +}; // struct CreateOrderedPointIndexArrayOp + + +template +struct VoxelOrderOp +{ + typedef typename boost::int_t<1 + (3 * BucketLog2Dim)>::least VoxelOffsetType; + typedef boost::scoped_array VoxelOffsetArray; + typedef boost::scoped_array IndexArray; + + VoxelOrderOp(IndexArray& indices, const IndexArray& pages,const VoxelOffsetArray& offsets) + : mIndices(indices.get()) + , mPages(pages.get()) + , mVoxelOffsets(offsets.get()) + { + } + + void operator()(const tbb::blocked_range& range) const { + + PointIndexType pointCount = 0; + for (size_t n(range.begin()), N(range.end()); n != N; ++n) { + pointCount = std::max(pointCount, (mPages[n + 1] - mPages[n])); + } + + const PointIndexType voxelCount = 1 << (3 * BucketLog2Dim); + + // allocate histogram buffers + boost::scoped_array offsets(new VoxelOffsetType[pointCount]); + boost::scoped_array sortedIndices(new PointIndexType[pointCount]); + boost::scoped_array histogram(new PointIndexType[voxelCount]); + + for (size_t n(range.begin()), N(range.end()); n != N; ++n) { + + PointIndexType * const indices = mIndices + mPages[n]; + pointCount = mPages[n + 1] - mPages[n]; + + // local copy of voxel offsets. + for (PointIndexType i = 0; i < pointCount; ++i) { + offsets[i] = mVoxelOffsets[ indices[i] ]; + } + + // reset histogram + memset(&histogram[0], 0, voxelCount * sizeof(PointIndexType)); + + // compute histogram + for (PointIndexType i = 0; i < pointCount; ++i) { + ++histogram[ offsets[i] ]; + } + + PointIndexType count = 0, startOffset; + for (int i = 0; i < int(voxelCount); ++i) { + if (histogram[i] > 0) { + startOffset = count; + count += histogram[i]; + histogram[i] = startOffset; + } + } + + // sort indices based on voxel offset + for (PointIndexType i = 0; i < pointCount; ++i) { + sortedIndices[ histogram[ offsets[i] ]++ ] = indices[i]; + } + + memcpy(&indices[0], &sortedIndices[0], sizeof(PointIndexType) * pointCount); + } + } + + PointIndexType * const mIndices; + PointIndexType const * const mPages; + VoxelOffsetType const * const mVoxelOffsets; +}; // struct VoxelOrderOp + + +template +struct LeafNodeOriginOp +{ + typedef boost::scoped_array IndexArray; + typedef boost::scoped_array CoordArray; + + LeafNodeOriginOp(CoordArray& coordinates, + const IndexArray& indices, const IndexArray& pages, + const PointArray& points, const math::Transform& m, int log2dim) + : mCoordinates(coordinates.get()) + , mIndices(indices.get()) + , mPages(pages.get()) + , mPoints(&points) + , mXForm(m) + , mLog2Dim(log2dim) + { + } + + void operator()(const tbb::blocked_range& range) const { + + typedef typename PointArray::PosType PosType; + + const int mask = ~((1 << mLog2Dim) - 1); + Coord ijk; + PosType pos; + + for (size_t n = range.begin(), N = range.end(); n != N; ++n) { + + mPoints->getPos(mIndices[mPages[n]], pos); + + if (boost::math::isfinite(pos[0]) && + boost::math::isfinite(pos[1]) && + boost::math::isfinite(pos[2])) { + + ijk = mXForm.worldToIndexCellCentered(pos); + + ijk[0] &= mask; + ijk[1] &= mask; + ijk[2] &= mask; + + mCoordinates[n] = ijk; + } + } + } + + Coord * const mCoordinates; + PointIndexType const * const mIndices; + PointIndexType const * const mPages; + PointArray const * const mPoints; + math::Transform const mXForm; + int const mLog2Dim; +}; // struct LeafNodeOriginOp + + +//////////////////////////////////////// + + +template +struct Array +{ + typedef boost::shared_ptr Ptr; + + Array(size_t size) : mSize(size), mData(new T[size]) { } + + size_t size() const { return mSize; } + + T* data() { return mData.get(); } + const T* data() const { return mData.get(); } + + void clear() { mSize = 0; mData.reset(); } + +private: + size_t mSize; + boost::scoped_array mData; +}; // struct Array + + +template +struct MoveSegmentDataOp +{ + typedef Array Segment; + typedef typename Segment::Ptr SegmentPtr; + + MoveSegmentDataOp(std::vector& indexLists, SegmentPtr* segments) + : mIndexLists(&indexLists[0]), mSegments(segments) + { + } + + void operator()(const tbb::blocked_range& range) const { + for (size_t n(range.begin()), N(range.end()); n != N; ++n) { + PointIndexType* indices = mIndexLists[n]; + SegmentPtr& segment = mSegments[n]; + + tbb::parallel_for(tbb::blocked_range(0, segment->size()), + CopyData(indices, segment->data())); + + segment.reset(); // clear data + } + } + +private: + + struct CopyData + { + CopyData(PointIndexType* lhs, const PointIndexType* rhs) : mLhs(lhs), mRhs(rhs) { } + + void operator()(const tbb::blocked_range& range) const { + for (size_t n = range.begin(), N = range.end(); n != N; ++n) { + mLhs[n] = mRhs[n]; + } + } + + PointIndexType * const mLhs; + PointIndexType const * const mRhs; + }; + + PointIndexType * const * const mIndexLists; + SegmentPtr * const mSegments; +}; // struct MoveSegmentDataOp + + +template +struct MergeBinsOp +{ + typedef Array Segment; + typedef typename Segment::Ptr SegmentPtr; + + typedef std::pair IndexPair; + typedef std::deque IndexPairList; + typedef boost::shared_ptr IndexPairListPtr; + typedef std::map IndexPairListMap; + typedef boost::shared_ptr IndexPairListMapPtr; + + MergeBinsOp(IndexPairListMapPtr* bins, + SegmentPtr* indexSegments, + SegmentPtr* offsetSegments, + Coord* coords, + size_t numSegments) + : mBins(bins) + , mIndexSegments(indexSegments) + , mOffsetSegments(offsetSegments) + , mCoords(coords) + , mNumSegments(numSegments) + { + } + + void operator()(const tbb::blocked_range& range) const { + + std::vector data; + std::vector arrayOffsets; + + for (size_t n = range.begin(), N = range.end(); n != N; ++n) { + + const Coord& ijk = mCoords[n]; + size_t numIndices = 0; + + data.clear(); + + for (size_t i = 0, I = mNumSegments; i < I; ++i) { + + IndexPairListMap& idxMap = *mBins[i]; + typename IndexPairListMap::iterator iter = idxMap.find(ijk); + + if (iter != idxMap.end() && iter->second) { + IndexPairListPtr& idxListPtr = iter->second; + + data.push_back(&idxListPtr); + numIndices += idxListPtr->size(); + } + } + + if (data.empty() || numIndices == 0) continue; + + SegmentPtr& indexSegment = mIndexSegments[n]; + SegmentPtr& offsetSegment = mOffsetSegments[n]; + + indexSegment.reset(new Segment(numIndices)); + offsetSegment.reset(new Segment(numIndices)); + + arrayOffsets.clear(); + arrayOffsets.reserve(data.size()); + + for (size_t i = 0, count = 0, I = data.size(); i < I; ++i) { + arrayOffsets.push_back(PointIndexType(count)); + count += (*data[i])->size(); + } + + tbb::parallel_for(tbb::blocked_range(0, data.size()), + CopyData(&data[0], &arrayOffsets[0], indexSegment->data(), offsetSegment->data())); + } + } + +private: + + struct CopyData + { + CopyData(IndexPairListPtr** indexLists, + const PointIndexType* arrayOffsets, + PointIndexType* indices, + PointIndexType* offsets) + : mIndexLists(indexLists) + , mArrayOffsets(arrayOffsets) + , mIndices(indices) + , mOffsets(offsets) + { + } + + void operator()(const tbb::blocked_range& range) const { + + typedef typename IndexPairList::const_iterator CIter; + + for (size_t n = range.begin(), N = range.end(); n != N; ++n) { + + const PointIndexType arrayOffset = mArrayOffsets[n]; + PointIndexType* indexPtr = &mIndices[arrayOffset]; + PointIndexType* offsetPtr = &mOffsets[arrayOffset]; + + IndexPairListPtr& list = *mIndexLists[n]; + + for (CIter it = list->begin(), end = list->end(); it != end; ++it) { + const IndexPair& data = *it; + *indexPtr++ = data.first; + *offsetPtr++ = data.second; + } + + list.reset(); // clear data + } + } + + IndexPairListPtr * const * const mIndexLists; + PointIndexType const * const mArrayOffsets; + PointIndexType * const mIndices; + PointIndexType * const mOffsets; + }; // struct CopyData + + IndexPairListMapPtr * const mBins; + SegmentPtr * const mIndexSegments; + SegmentPtr * const mOffsetSegments; + Coord const * const mCoords; + size_t const mNumSegments; +}; // struct MergeBinsOp + + +template +struct BinPointIndicesOp +{ + typedef typename PointArray::PosType PosType; + typedef std::pair IndexPair; + typedef std::deque IndexPairList; + typedef boost::shared_ptr IndexPairListPtr; + typedef std::map IndexPairListMap; + typedef boost::shared_ptr IndexPairListMapPtr; + + BinPointIndicesOp(IndexPairListMapPtr* data, + const PointArray& points, + VoxelOffsetType* voxelOffsets, + const math::Transform& m, + Index binLog2Dim, + Index bucketLog2Dim, + size_t numSegments) + : mData(data) + , mPoints(&points) + , mVoxelOffsets(voxelOffsets) + , mXForm(m) + , mBinLog2Dim(binLog2Dim) + , mBucketLog2Dim(bucketLog2Dim) + , mNumSegments(numSegments) + { + } + + void operator()(const tbb::blocked_range& range) const { + + const Index log2dim = mBucketLog2Dim; + const Index log2dim2 = 2 * log2dim; + const Index bucketMask = (1u << log2dim) - 1u; + + const Index binLog2dim = mBinLog2Dim; + const Index binLog2dim2 = 2 * binLog2dim; + + const Index binMask = (1u << (log2dim + binLog2dim)) - 1u; + const Index invBinMask = ~binMask; + + IndexPairList * idxList = NULL; + Coord ijk(0, 0, 0), loc(0, 0, 0), binCoord(0, 0, 0), lastBinCoord(1, 2, 3); + PosType pos; + + PointIndexType bucketOffset = 0; + VoxelOffsetType voxelOffset = 0; + + const size_t numPoints = mPoints->size(); + const size_t segmentSize = numPoints / mNumSegments; + + for (size_t n = range.begin(), N = range.end(); n != N; ++n) { + + IndexPairListMapPtr& dataPtr = mData[n]; + if (!dataPtr) dataPtr.reset(new IndexPairListMap()); + IndexPairListMap& idxMap = *dataPtr; + + const bool isLastSegment = (n + 1) >= mNumSegments; + + const size_t start = n * segmentSize; + const size_t end = isLastSegment ? numPoints : (start + segmentSize); + + for (size_t i = start; i != end; ++i) { + + mPoints->getPos(i, pos); + + if (boost::math::isfinite(pos[0]) && + boost::math::isfinite(pos[1]) && + boost::math::isfinite(pos[2])) { + + ijk = mXForm.worldToIndexCellCentered(pos); + + if (mVoxelOffsets) { + loc[0] = ijk[0] & bucketMask; + loc[1] = ijk[1] & bucketMask; + loc[2] = ijk[2] & bucketMask; + voxelOffset = VoxelOffsetType((loc[0] << log2dim2) + (loc[1] << log2dim) + loc[2]); + } + + binCoord[0] = ijk[0] & invBinMask; + binCoord[1] = ijk[1] & invBinMask; + binCoord[2] = ijk[2] & invBinMask; + + ijk[0] &= binMask; + ijk[1] &= binMask; + ijk[2] &= binMask; + + ijk[0] >>= log2dim; + ijk[1] >>= log2dim; + ijk[2] >>= log2dim; + + bucketOffset = PointIndexType((ijk[0] << binLog2dim2) + (ijk[1] << binLog2dim) + ijk[2]); + + if (lastBinCoord != binCoord) { + lastBinCoord = binCoord; + IndexPairListPtr& idxListPtr = idxMap[lastBinCoord]; + if (!idxListPtr) idxListPtr.reset(new IndexPairList()); + idxList = idxListPtr.get(); + } + + idxList->push_back(IndexPair(PointIndexType(i), bucketOffset)); + if (mVoxelOffsets) mVoxelOffsets[i] = voxelOffset; + } + } + } + } + + IndexPairListMapPtr * const mData; + PointArray const * const mPoints; + VoxelOffsetType * const mVoxelOffsets; + math::Transform const mXForm; + Index const mBinLog2Dim; + Index const mBucketLog2Dim; + size_t const mNumSegments; +}; // struct BinPointIndicesOp + + +template +struct OrderSegmentsOp +{ + typedef boost::scoped_array IndexArray; + typedef typename Array::Ptr SegmentPtr; + + OrderSegmentsOp(SegmentPtr* indexSegments, SegmentPtr* offestSegments, + IndexArray* pageOffsetArrays, Index binVolume) + : mIndexSegments(indexSegments) + , mOffsetSegments(offestSegments) + , mPageOffsetArrays(pageOffsetArrays) + , mBinVolume(binVolume) + { + } + + void operator()(const tbb::blocked_range& range) const { + + const size_t bucketCountersSize = size_t(mBinVolume); + IndexArray bucketCounters(new PointIndexType[bucketCountersSize]); + + size_t maxSegmentSize = 0; + for (size_t n = range.begin(), N = range.end(); n != N; ++n) { + maxSegmentSize = std::max(maxSegmentSize, mIndexSegments[n]->size()); + } + + IndexArray bucketIndices(new PointIndexType[maxSegmentSize]); + + + for (size_t n = range.begin(), N = range.end(); n != N; ++n) { + + memset(bucketCounters.get(), 0, sizeof(PointIndexType) * bucketCountersSize); + + const size_t segmentSize = mOffsetSegments[n]->size(); + PointIndexType* offsets = mOffsetSegments[n]->data(); + + // Count the number of points per bucket and assign a local bucket index + // to each point. + for (size_t i = 0; i < segmentSize; ++i) { + bucketIndices[i] = bucketCounters[offsets[i]]++; + } + + PointIndexType nonemptyBucketCount = 0; + for (size_t i = 0; i < bucketCountersSize; ++i) { + nonemptyBucketCount += static_cast(bucketCounters[i] != 0); + } + + + IndexArray& pageOffsets = mPageOffsetArrays[n]; + pageOffsets.reset(new PointIndexType[nonemptyBucketCount + 1]); + pageOffsets[0] = nonemptyBucketCount + 1; // stores array size in first element + + // Compute bucket counter prefix sum + PointIndexType count = 0, idx = 1; + for (size_t i = 0; i < bucketCountersSize; ++i) { + if (bucketCounters[i] != 0) { + pageOffsets[idx] = bucketCounters[i]; + bucketCounters[i] = count; + count += pageOffsets[idx]; + ++idx; + } + } + + PointIndexType* indices = mIndexSegments[n]->data(); + const tbb::blocked_range segmentRange(0, segmentSize); + + // Compute final point order by incrementing the local bucket point index + // with the prefix sum offset. + tbb::parallel_for(segmentRange, ComputePointOrderOp( + bucketIndices.get(), bucketCounters.get(), offsets)); + + tbb::parallel_for(segmentRange, CreateOrderedPointIndexArrayOp( + offsets, bucketIndices.get(), indices)); + + mIndexSegments[n]->clear(); // clear data + } + } + + SegmentPtr * const mIndexSegments; + SegmentPtr * const mOffsetSegments; + IndexArray * const mPageOffsetArrays; + Index const mBinVolume; +}; // struct OrderSegmentsOp + + +//////////////////////////////////////// + + +/// @brief Segment points using one level of least significant digit radix bins. +template +inline void binAndSegment( + const PointArray& points, + const math::Transform& xform, + boost::scoped_array::Ptr>& indexSegments, + boost::scoped_array::Ptr>& offsetSegments, + size_t& segmentCount, + const Index binLog2Dim, + const Index bucketLog2Dim, + VoxelOffsetType* voxelOffsets = NULL) +{ + typedef std::pair IndexPair; + typedef std::deque IndexPairList; + typedef boost::shared_ptr IndexPairListPtr; + typedef std::map IndexPairListMap; + typedef boost::shared_ptr IndexPairListMapPtr; + + size_t numTasks = 1, numThreads = size_t(tbb::task_scheduler_init::default_num_threads()); + if (points.size() > (numThreads * 2)) numTasks = numThreads * 2; + else if (points.size() > numThreads) numTasks = numThreads; + + boost::scoped_array bins(new IndexPairListMapPtr[numTasks]); + + typedef BinPointIndicesOp BinOp; + + tbb::parallel_for(tbb::blocked_range(0, numTasks), + BinOp(bins.get(), points, voxelOffsets, xform, binLog2Dim, bucketLog2Dim, numTasks)); + + std::set uniqueCoords; + + for (size_t i = 0; i < numTasks; ++i) { + IndexPairListMap& idxMap = *bins[i]; + for (typename IndexPairListMap::iterator it = idxMap.begin(); it != idxMap.end(); ++it) { + uniqueCoords.insert(it->first); + } + } + + std::vector coords(uniqueCoords.begin(), uniqueCoords.end()); + uniqueCoords.clear(); + + segmentCount = coords.size(); + + typedef typename Array::Ptr SegmentPtr; + + indexSegments.reset(new SegmentPtr[segmentCount]); + offsetSegments.reset(new SegmentPtr[segmentCount]); + + typedef MergeBinsOp MergeOp; + + tbb::parallel_for(tbb::blocked_range(0, segmentCount), + MergeOp(bins.get(), indexSegments.get(), offsetSegments.get(), &coords[0], numTasks)); +} + + +template +inline void partition( + const PointArray& points, + const math::Transform& xform, + const Index bucketLog2Dim, + boost::scoped_array& pointIndices, + boost::scoped_array& pageOffsets, + PointIndexType& pageCount, + boost::scoped_array& voxelOffsets, + bool recordVoxelOffsets) +{ + if (recordVoxelOffsets) voxelOffsets.reset(new VoxelOffsetType[points.size()]); + else voxelOffsets.reset(); + + const Index binLog2Dim = 5u; + // note: Bins span a (2^(binLog2Dim + bucketLog2Dim))^3 voxel region, + // i.e. bucketLog2Dim = 3 and binLog2Dim = 5 corresponds to a + // (2^8)^3 = 256^3 voxel region. + + + size_t numSegments = 0; + + boost::scoped_array::Ptr> indexSegments; + boost::scoped_array::Ptr> offestSegments; + + binAndSegment(points, xform, + indexSegments, offestSegments, numSegments, binLog2Dim, bucketLog2Dim, voxelOffsets.get()); + + const tbb::blocked_range segmentRange(0, numSegments); + + typedef boost::scoped_array IndexArray; + boost::scoped_array pageOffsetArrays(new IndexArray[numSegments]); + + const Index binVolume = 1u << (3u * binLog2Dim); + + tbb::parallel_for(segmentRange, OrderSegmentsOp + (indexSegments.get(), offestSegments.get(), pageOffsetArrays.get(), binVolume)); + + indexSegments.reset(); + + pageCount = 0; + for (size_t n = 0; n < numSegments; ++n) { + pageCount += pageOffsetArrays[n][0] - 1; + } + + pageOffsets.reset(new PointIndexType[pageCount + 1]); + + PointIndexType count = 0; + for (size_t n = 0, idx = 0; n < numSegments; ++n) { + + PointIndexType* offsets = pageOffsetArrays[n].get(); + size_t size = size_t(offsets[0]); + + for (size_t i = 1; i < size; ++i) { + pageOffsets[idx++] = count; + count += offsets[i]; + } + } + + pageOffsets[pageCount] = count; + + pointIndices.reset(new PointIndexType[points.size()]); + + std::vector indexArray; + indexArray.reserve(numSegments); + + PointIndexType* index = pointIndices.get(); + for (size_t n = 0; n < numSegments; ++n) { + indexArray.push_back(index); + index += offestSegments[n]->size(); + } + + tbb::parallel_for(segmentRange, MoveSegmentDataOp(indexArray, offestSegments.get())); +} + + +} // namespace point_partitioner_internal + + +//////////////////////////////////////// + + +template +inline PointPartitioner::PointPartitioner() + : mPointIndices(NULL) + , mVoxelOffsets(NULL) + , mPageOffsets(NULL) + , mPageCoordinates(NULL) + , mPageCount(0) +{ +} + + +template +inline void +PointPartitioner::clear() +{ + mPageCount = 0; + mPointIndices.reset(); + mVoxelOffsets.reset(); + mPageOffsets.reset(); + mPageCoordinates.reset(); +} + + +template +inline void +PointPartitioner::swap(PointPartitioner& rhs) +{ + const IndexType tmpLhsPageCount = mPageCount; + mPageCount = rhs.mPageCount; + rhs.mPageCount = tmpLhsPageCount; + + mPointIndices.swap(rhs.mPointIndices); + mVoxelOffsets.swap(rhs.mVoxelOffsets); + mPageOffsets.swap(rhs.mPageOffsets); + mPageCoordinates.swap(rhs.mPageCoordinates); +} + + +template +inline typename PointPartitioner::IndexIterator +PointPartitioner::indices(size_t n) const +{ + assert(bool(mPointIndices) && bool(mPageCount)); + return IndexIterator( + mPointIndices.get() + mPageOffsets[n], + mPointIndices.get() + mPageOffsets[n + 1]); +} + + +template +template +inline void +PointPartitioner::construct(const PointArray& points, + const math::Transform& xform, bool voxelOrder, bool recordVoxelOffsets) +{ + point_partitioner_internal::partition(points, xform, BucketLog2Dim, + mPointIndices, mPageOffsets, mPageCount, mVoxelOffsets, (voxelOrder || recordVoxelOffsets)); + + const tbb::blocked_range pageRange(0, mPageCount); + mPageCoordinates.reset(new Coord[mPageCount]); + + tbb::parallel_for(pageRange, + point_partitioner_internal::LeafNodeOriginOp + (mPageCoordinates, mPointIndices, mPageOffsets, points, xform, BucketLog2Dim)); + + if (mVoxelOffsets && voxelOrder) { + tbb::parallel_for(pageRange, point_partitioner_internal::VoxelOrderOp< + IndexType, BucketLog2Dim>(mPointIndices, mPageOffsets, mVoxelOffsets)); + } + + if (mVoxelOffsets && !recordVoxelOffsets) { + mVoxelOffsets.reset(); + } +} + + +template +template +inline typename PointPartitioner::Ptr +PointPartitioner::create(const PointArray& points, const math::Transform& xform, + bool voxelOrder, bool recordVoxelOffsets) +{ + Ptr ret(new PointPartitioner()); + ret->construct(points, xform, voxelOrder, recordVoxelOffsets); + return ret; +} + + +//////////////////////////////////////// + + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + + +#endif // OPENVDB_TOOLS_POINT_PARTITIONER_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/PointScatter.h b/nuparu/include/openvdb/include/openvdb/tools/PointScatter.h new file mode 100644 index 00000000..6ba9e76b --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/PointScatter.h @@ -0,0 +1,437 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @author Ken Museth +/// +/// @file PointScatter.h +/// +/// @brief We offer three different algorithms (each in its own class) +/// for scattering of point in active voxels: +/// +/// 1) UniformPointScatter. Has two modes: Either randomly distributes +/// a fixed number of points in the active voxels, or the user can +/// specify a fixed probability of having a points per unit of volume. +/// +/// 2) DenseUniformPointScatter. Randomly distributes points in active +/// voxels using a fixed number of points per voxel. +/// +/// 3) NonIniformPointScatter. Define the local probability of having +/// a point in a voxel as the product of a global density and the +/// value of the voxel itself. + +#ifndef OPENVDB_TOOLS_POINT_SCATTER_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_POINT_SCATTER_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// Forward declaration of base class +template +class BasePointScatter; + +/// @brief The two point scatters UniformPointScatter and +/// NonUniformPointScatter depend on the following two classes: +/// +/// The @c PointAccessorType template argument below refers to any class +/// with the following interface: +/// @code +/// class PointAccessor { +/// ... +/// public: +/// void add(const openvdb::Vec3R &pos);// appends point with world positions pos +/// }; +/// @endcode +/// +/// +/// The @c InterruptType template argument below refers to any class +/// with the following interface: +/// @code +/// class Interrupter { +/// ... +/// public: +/// void start(const char* name = NULL)// called when computations begin +/// void end() // called when computations end +/// bool wasInterrupted(int percent=-1)// return true to break computation +///}; +/// @endcode +/// +/// @note If no template argument is provided for this InterruptType +/// the util::NullInterrupter is used which implies that all +/// interrupter calls are no-ops (i.e. incurs no computational overhead). + + +/// @brief Uniform scatters of point in the active voxels. +/// The point count is either explicitly defined or implicitly +/// through the specification of a global density (=points-per-volume) +/// +/// @note This uniform scattering technique assumes that the number of +/// points is generally smaller than the number of active voxels +/// (including virtual active voxels in active tiles). +template +class UniformPointScatter : public BasePointScatter +{ +public: + typedef BasePointScatter BaseT; + + UniformPointScatter(PointAccessorType& points, + Index64 pointCount, + RandomGenerator& randGen, + InterruptType* interrupt = NULL) + : BaseT(points, randGen, interrupt) + , mTargetPointCount(pointCount) + , mPointsPerVolume(0.0f) + { + } + UniformPointScatter(PointAccessorType& points, + float pointsPerVolume, + RandomGenerator& randGen, + InterruptType* interrupt = NULL) + : BaseT(points, randGen, interrupt) + , mTargetPointCount(0) + , mPointsPerVolume(pointsPerVolume) + { + } + + /// @brief This is the main functor method implementing the actual + /// scattering of points. + template + bool operator()(const GridT& grid) + { + mVoxelCount = grid.activeVoxelCount(); + if (mVoxelCount == 0) return false; + const Vec3d dim = grid.voxelSize(); + if (mPointsPerVolume>0) { + BaseT::start("Uniform scattering with fixed point density"); + mTargetPointCount = Index64(mPointsPerVolume*dim[0]*dim[1]*dim[2])*mVoxelCount; + } else if (mTargetPointCount>0) { + BaseT::start("Uniform scattering with fixed point count"); + mPointsPerVolume = mTargetPointCount/float(dim[0]*dim[1]*dim[2] * mVoxelCount); + } else { + return false; + } + + boost::scoped_array list(new Index64[mTargetPointCount]); + math::RandInt rand(BaseT::mRand01.engine(), 0, mVoxelCount-1); + for (Index64 i=0; i +class DenseUniformPointScatter : public BasePointScatter +{ +public: + typedef BasePointScatter BaseT; + + DenseUniformPointScatter(PointAccessorType& points, + float pointsPerVoxel, + RandomGenerator& randGen, + InterruptType* interrupt = NULL) + : BaseT(points, randGen, interrupt) + , mPointsPerVoxel(pointsPerVoxel) + { + } + + /// This is the main functor method implementing the actual scattering of points. + template + bool operator()(const GridT& grid) + { + typedef typename GridT::ValueOnCIter ValueIter; + if (mPointsPerVoxel < 1.0e-6) return false; + mVoxelCount = grid.activeVoxelCount(); + if (mVoxelCount == 0) return false; + BaseT::start("Dense uniform scattering with fixed point count"); + CoordBBox bbox; + const Vec3R offset(0.5, 0.5, 0.5); + + const int ppv = math::Floor(mPointsPerVoxel); + const double delta = mPointsPerVoxel - ppv; + const bool fractional = !math::isApproxZero(delta, 1.0e-6); + + for (ValueIter iter = grid.cbeginValueOn(); iter; ++iter) { + if (BaseT::interrupt()) return false; + if (iter.isVoxelValue()) {// a majority is expected to be voxels + const Vec3R dmin = iter.getCoord() - offset; + for (int n = 0; n != ppv; ++n) BaseT::addPoint(grid, dmin); + if (fractional && BaseT::getRand() < delta) BaseT::addPoint(grid, dmin); + } else {// tiles contain multiple (virtual) voxels + iter.getBoundingBox(bbox); + const Coord size(bbox.extents()); + const Vec3R dmin = bbox.min() - offset; + const double d = mPointsPerVoxel * iter.getVoxelCount(); + const int m = math::Floor(d); + for (int n = 0; n != m; ++n) BaseT::addPoint(grid, dmin, size); + if (BaseT::getRand() < d - m) BaseT::addPoint(grid, dmin, size); + } + }//loop over all the active voxels and tiles + + BaseT::end(); + return true; + } + + // The following methods should only be called after the + // the operator() method was called + void print(const std::string &name, std::ostream& os = std::cout) const + { + os << "Dense uniformly scattered " << mPointCount << " points into " << mVoxelCount + << " active voxels in \"" << name << "\" corresponding to " + << mPointsPerVoxel << " points per voxel." << std::endl; + } + + float getPointsPerVoxel() const { return mPointsPerVoxel; } + +private: + using BaseT::mPointCount; + using BaseT::mVoxelCount; + float mPointsPerVoxel; +}; // class DenseUniformPointScatter + +/// @brief Non-uniform scatters of point in the active voxels. +/// The local point count is implicitly defined as a product of +/// of a global density (called pointsPerVolume) and the local voxel +/// (or tile) value. +/// +/// @note This scattering technique can be significantly slower +/// than a uniform scattering since its computational complexity +/// is proportional to the active voxel (and tile) count. +template +class NonUniformPointScatter : public BasePointScatter +{ +public: + typedef BasePointScatter BaseT; + + NonUniformPointScatter(PointAccessorType& points, + float pointsPerVolume, + RandomGenerator& randGen, + InterruptType* interrupt = NULL) + : BaseT(points, randGen, interrupt) + , mPointsPerVolume(pointsPerVolume)//note this is merely a + //multiplier for the local point density + { + } + + /// This is the main functor method implementing the actual scattering of points. + template + bool operator()(const GridT& grid) + { + if (mPointsPerVolume <= 0.0f) return false; + mVoxelCount = grid.activeVoxelCount(); + if (mVoxelCount == 0) return false; + BaseT::start("Non-uniform scattering with local point density"); + const Vec3d dim = grid.voxelSize(); + const double volumePerVoxel = dim[0]*dim[1]*dim[2], + pointsPerVoxel = mPointsPerVolume * volumePerVoxel; + CoordBBox bbox; + const Vec3R offset(0.5, 0.5, 0.5); + for (typename GridT::ValueOnCIter iter = grid.cbeginValueOn(); iter; ++iter) { + if (BaseT::interrupt()) return false; + const double d = (*iter) * pointsPerVoxel * iter.getVoxelCount(); + const int n = int(d); + if (iter.isVoxelValue()) { // a majority is expected to be voxels + const Vec3R dmin =iter.getCoord() - offset; + for (int i = 0; i < n; ++i) BaseT::addPoint(grid, dmin); + if (BaseT::getRand() < (d - n)) BaseT::addPoint(grid, dmin); + } else { // tiles contain multiple (virtual) voxels + iter.getBoundingBox(bbox); + const Coord size(bbox.extents()); + const Vec3R dmin = bbox.min() - offset; + for (int i = 0; i < n; ++i) BaseT::addPoint(grid, dmin, size); + if (BaseT::getRand() < (d - n)) BaseT::addPoint(grid, dmin, size); + } + }//loop over all the active voxels and tiles + BaseT::end(); + return true; + } + + // The following methods should only be called after the + // the operator() method was called + void print(const std::string &name, std::ostream& os = std::cout) const + { + os << "Non-uniformly scattered " << mPointCount << " points into " << mVoxelCount + << " active voxels in \"" << name << "\"." << std::endl; + } + + float getPointPerVolume() const { return mPointsPerVolume; } + +private: + using BaseT::mPointCount; + using BaseT::mVoxelCount; + float mPointsPerVolume; + +}; // class NonUniformPointScatter + +/// Base class of all the point scattering classes defined above +template +class BasePointScatter +{ +public: + + Index64 getPointCount() const { return mPointCount; } + Index64 getVoxelCount() const { return mVoxelCount; } + +protected: + + /// This is a base class so the constructor is protected + BasePointScatter(PointAccessorType& points, + RandomGenerator& randGen, + InterruptType* interrupt = NULL) + : mPoints(points) + , mInterrupter(interrupt) + , mPointCount(0) + , mVoxelCount(0) + , mInterruptCount(0) + , mRand01(randGen) + { + } + + PointAccessorType& mPoints; + InterruptType* mInterrupter; + Index64 mPointCount; + Index64 mVoxelCount; + Index64 mInterruptCount; + math::Rand01 mRand01; + + inline void start(const char* name) + { + if (mInterrupter) mInterrupter->start(name); + } + + inline void end() + { + if (mInterrupter) mInterrupter->end(); + } + + inline bool interrupt() + { + //only check interrupter for every 32'th call + return !(mInterruptCount++ & ((1<<5)-1)) && util::wasInterrupted(mInterrupter); + } + + inline double getRand() { return mRand01(); } + + template + inline void addPoint(const GridT &grid, const Vec3R &dmin) + { + const Vec3R pos(dmin[0] + this->getRand(), + dmin[1] + this->getRand(), + dmin[2] + this->getRand()); + mPoints.add(grid.indexToWorld(pos)); + ++mPointCount; + } + + template + inline void addPoint(const GridT &grid, const Vec3R &dmin, const Coord &size) + { + const Vec3R pos(dmin[0] + size[0]*this->getRand(), + dmin[1] + size[1]*this->getRand(), + dmin[2] + size[2]*this->getRand()); + mPoints.add(grid.indexToWorld(pos)); + ++mPointCount; + } +};// class BasePointScatter + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_POINT_SCATTER_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/PoissonSolver.h b/nuparu/include/openvdb/include/openvdb/tools/PoissonSolver.h new file mode 100644 index 00000000..60a1f6d6 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/PoissonSolver.h @@ -0,0 +1,774 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file PoissonSolver.h +/// +/// @authors D.J. Hill, Peter Cucka +/// +/// @brief Solve Poisson's equation ∇2x = b +/// for x, where @e b is a vector comprising the values of all of the active voxels +/// in a grid. +/// +/// @par Example: +/// Solve for the pressure in a cubic tank of liquid, assuming uniform boundary conditions: +/// @code +/// FloatTree source(/*background=*/0.0f); +/// // Activate voxels to indicate that they contain liquid. +/// source.fill(CoordBBox(Coord(0, -10, 0), Coord(10, 0, 10)), /*value=*/0.0f); +/// +/// math::pcg::State state = math::pcg::terminationDefaults(); +/// FloatTree::Ptr solution = tools::poisson::solve(source, state); +/// @endcode +/// +/// @par Example: +/// Solve for the pressure, P, in a cubic tank of liquid that is open at the top. +/// Boundary conditions are P = 0 at the top, +/// ∂P/∂y = −1 at the bottom +/// and ∂P/∂x = 0 at the sides: +///
+///                P = 0
+///             +--------+ (N,0,N)
+///            /|       /|
+///   (0,0,0) +--------+ |
+///           | |      | | dP/dx = 0
+/// dP/dx = 0 | +------|-+
+///           |/       |/
+///  (0,-N,0) +--------+ (N,-N,N)
+///           dP/dy = -1
+/// 
+/// @code +/// const int N = 10; +/// DoubleTree source(/*background=*/0.0); +/// // Activate voxels to indicate that they contain liquid. +/// source.fill(CoordBBox(Coord(0, -N, 0), Coord(N, 0, N)), /*value=*/0.0); +/// +/// // C++11 +/// auto boundary = [](const openvdb::Coord& ijk, const openvdb::Coord& neighbor, +/// double& source, double& diagonal) +/// { +/// if (neighbor.x() == ijk.x() && neighbor.z() == ijk.z()) { +/// if (neighbor.y() < ijk.y()) source -= 1.0; +/// else diagonal -= 1.0; +/// } +/// }; +/// +/// math::pcg::State state = math::pcg::terminationDefaults(); +/// util::NullInterrupter interrupter; +/// +/// DoubleTree::Ptr solution = tools::poisson::solveWithBoundaryConditions( +/// source, boundary, state, interrupter); +/// @endcode + +#ifndef OPENVDB_TOOLS_POISSONSOLVER_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_POISSONSOLVER_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include + +#include "Morphology.h" // for erodeVoxels + +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { +namespace poisson { + +// This type should be at least as wide as math::pcg::SizeType. +typedef Int32 VIndex; + +/// The type of a matrix used to represent a three-dimensional Laplacian operator +typedef math::pcg::SparseStencilMatrix LaplacianMatrix; + + +//@{ +/// @brief Solve ∇2x = b for x, +/// where @e b is a vector comprising the values of all of the active voxels +/// in the input tree. +/// @return a new tree, with the same active voxel topology as the input tree, +/// whose voxel values are the elements of the solution vector x. +/// @details On input, the State object should specify convergence criteria +/// (minimum error and maximum number of iterations); on output, it gives +/// the actual termination conditions. +/// @details The solution is computed using the conjugate gradient method +/// with (where possible) incomplete Cholesky preconditioning, falling back +/// to Jacobi preconditioning. +/// @sa solveWithBoundaryConditions +template +inline typename TreeType::Ptr +solve(const TreeType&, math::pcg::State&); + +template +inline typename TreeType::Ptr +solve(const TreeType&, math::pcg::State&, Interrupter&); +//@} + + +//@{ +/// @brief Solve ∇2x = b for x +/// with user-specified boundary conditions, where @e b is a vector comprising +/// the values of all of the active voxels in the input tree or domain mask if provided +/// @return a new tree, with the same active voxel topology as the input tree, +/// whose voxel values are the elements of the solution vector x. +/// @details On input, the State object should specify convergence criteria +/// (minimum error and maximum number of iterations); on output, it gives +/// the actual termination conditions. +/// @details The solution is computed using the conjugate gradient method with +/// the specified type of preconditioner (default: incomplete Cholesky), +/// falling back to Jacobi preconditioning if necessary. +/// @details Each thread gets its own copy of the BoundaryOp, which should be +/// a functor of the form +/// @code +/// struct BoundaryOp { +/// typedef LaplacianMatrix::ValueType ValueType; +/// void operator()( +/// const Coord& ijk, // coordinates of a boundary voxel +/// const Coord& ijkNeighbor, // coordinates of an exterior neighbor of ijk +/// ValueType& source, // element of b corresponding to ijk +/// ValueType& diagonal // element of Laplacian matrix corresponding to ijk +/// ) const; +/// }; +/// @endcode +/// The functor is called for each of the exterior neighbors of each boundary voxel @ijk, +/// and it must specify a boundary condition for @ijk by modifying one or both of two +/// provided values: the entry in the source vector @e b corresponding to @ijk and +/// the weighting coefficient for @ijk in the Laplacian operator matrix. +/// +/// @sa solve +template +inline typename TreeType::Ptr +solveWithBoundaryConditions(const TreeType&, const BoundaryOp&, math::pcg::State&, Interrupter&); + +template +inline typename TreeType::Ptr +solveWithBoundaryConditionsAndPreconditioner(const TreeType&, const BoundaryOp&, + math::pcg::State&, Interrupter&); + +template +inline typename TreeType::Ptr +solveWithBoundaryConditionsAndPreconditioner(const TreeType&, const DomainTreeType&, const BoundaryOp&, + math::pcg::State&, Interrupter&); +//@} + + +/// @name Low-level functions +//@{ +// The following are low-level routines that can be used to assemble custom solvers. + +/// @brief Overwrite each active voxel in the given scalar tree +/// with a sequential index, starting from zero. +template +inline void populateIndexTree(VIndexTreeType&); + +/// @brief Iterate over the active voxels of the input tree and for each one +/// assign its index in the iteration sequence to the corresponding voxel +/// of an integer-valued output tree. +template +inline typename TreeType::template ValueConverter::Type::Ptr +createIndexTree(const TreeType&); + + +/// @brief Return a vector of the active voxel values of the scalar-valued @a source tree. +/// @details The nth element of the vector corresponds to the voxel whose value +/// in the @a index tree is @e n. +/// @param source a tree with a scalar value type +/// @param index a tree of the same configuration as @a source but with +/// value type VIndex that maps voxels to elements of the output vector +template +inline typename math::pcg::Vector::Ptr +createVectorFromTree( + const SourceTreeType& source, + const typename SourceTreeType::template ValueConverter::Type& index); + + +/// @brief Return a tree with the same active voxel topology as the @a index tree +/// but whose voxel values are taken from the the given vector. +/// @details The voxel whose value in the @a index tree is @e n gets assigned +/// the nth element of the vector. +/// @param index a tree with value type VIndex that maps voxels to elements of @a values +/// @param values a vector of values with which to populate the active voxels of the output tree +/// @param background the value for the inactive voxels of the output tree +template +inline typename VIndexTreeType::template ValueConverter::Type::Ptr +createTreeFromVector( + const math::pcg::Vector& values, + const VIndexTreeType& index, + const TreeValueType& background); + + +/// @brief Generate a sparse matrix of the index-space (Δx = 1) Laplacian operator +/// using second-order finite differences. +/// @details This construction assumes homogeneous Dirichlet boundary conditions +/// (exterior grid points are zero). +template +inline LaplacianMatrix::Ptr +createISLaplacian( + const typename BoolTreeType::template ValueConverter::Type& vectorIndexTree, + const BoolTreeType& interiorMask); + + +/// @brief Generate a sparse matrix of the index-space (Δx = 1) Laplacian operator +/// with user-specified boundary conditions using second-order finite differences. +/// @details Each thread gets its own copy of @a boundaryOp, which should be +/// a functor of the form +/// @code +/// struct BoundaryOp { +/// typedef LaplacianMatrix::ValueType ValueType; +/// void operator()( +/// const Coord& ijk, // coordinates of a boundary voxel +/// const Coord& ijkNeighbor, // coordinates of an exterior neighbor of ijk +/// ValueType& source, // element of source vector corresponding to ijk +/// ValueType& diagonal // element of Laplacian matrix corresponding to ijk +/// ) const; +/// }; +/// @endcode +/// The functor is called for each of the exterior neighbors of each boundary voxel @ijk, +/// and it must specify a boundary condition for @ijk by modifying one or both of two +/// provided values: an entry in the given @a source vector corresponding to @ijk and +/// the weighting coefficient for @ijk in the Laplacian matrix. +template +inline LaplacianMatrix::Ptr +createISLaplacianWithBoundaryConditions( + const typename BoolTreeType::template ValueConverter::Type& vectorIndexTree, + const BoolTreeType& interiorMask, + const BoundaryOp& boundaryOp, + typename math::pcg::Vector& source); + +//@} + + +//////////////////////////////////////// + + +namespace internal { + +/// @brief Functor for use with LeafManager::foreach() to populate an array +/// with per-leaf active voxel counts +template +struct LeafCountOp +{ + VIndex* count; + LeafCountOp(VIndex* count_): count(count_) {} + void operator()(const LeafType& leaf, size_t leafIdx) const { + count[leafIdx] = static_cast(leaf.onVoxelCount()); + } +}; + + +/// @brief Functor for use with LeafManager::foreach() to populate +/// active leaf voxels with sequential indices +template +struct LeafIndexOp +{ + const VIndex* count; + LeafIndexOp(const VIndex* count_): count(count_) {} + void operator()(LeafType& leaf, size_t leafIdx) const { + VIndex idx = (leafIdx == 0) ? 0 : count[leafIdx - 1]; + for (typename LeafType::ValueOnIter it = leaf.beginValueOn(); it; ++it) { + it.setValue(idx++); + } + } +}; + +} // namespace internal + + +template +inline void +populateIndexTree(VIndexTreeType& result) +{ + typedef typename VIndexTreeType::LeafNodeType LeafT; + typedef typename tree::LeafManager LeafMgrT; + + // Linearize the tree. + LeafMgrT leafManager(result); + const size_t leafCount = leafManager.leafCount(); + + // Count the number of active voxels in each leaf node. + boost::scoped_array perLeafCount(new VIndex[leafCount]); + VIndex* perLeafCountPtr = perLeafCount.get(); + leafManager.foreach(internal::LeafCountOp(perLeafCountPtr)); + + // The starting index for each leaf node is the total number + // of active voxels in all preceding leaf nodes. + for (size_t i = 1; i < leafCount; ++i) { + perLeafCount[i] += perLeafCount[i - 1]; + } + + // The last accumulated value should be the total of all active voxels. + assert(Index64(perLeafCount[leafCount-1]) == result.activeVoxelCount()); + + // Parallelize over the leaf nodes of the tree, storing a unique index + // in each active voxel. + leafManager.foreach(internal::LeafIndexOp(perLeafCountPtr)); +} + + +template +inline typename TreeType::template ValueConverter::Type::Ptr +createIndexTree(const TreeType& tree) +{ + typedef typename TreeType::template ValueConverter::Type VIdxTreeT; + + // Construct an output tree with the same active voxel topology as the input tree. + const VIndex invalidIdx = -1; + typename VIdxTreeT::Ptr result( + new VIdxTreeT(tree, /*background=*/invalidIdx, TopologyCopy())); + + // All active voxels are degrees of freedom, including voxels contained in active tiles. + result->voxelizeActiveTiles(); + + populateIndexTree(*result); + + return result; +} + + +//////////////////////////////////////// + + +namespace internal { + +/// @brief Functor for use with LeafManager::foreach() to populate a vector +/// with the values of a tree's active voxels +template +struct CopyToVecOp +{ + typedef typename SourceTreeType::template ValueConverter::Type VIdxTreeT; + typedef typename VIdxTreeT::LeafNodeType VIdxLeafT; + typedef typename SourceTreeType::LeafNodeType LeafT; + typedef typename SourceTreeType::ValueType TreeValueT; + typedef typename math::pcg::Vector VectorT; + + const SourceTreeType* tree; + VectorT* vector; + + CopyToVecOp(const SourceTreeType& t, VectorT& v): tree(&t), vector(&v) {} + + void operator()(const VIdxLeafT& idxLeaf, size_t /*leafIdx*/) const + { + VectorT& vec = *vector; + if (const LeafT* leaf = tree->probeLeaf(idxLeaf.origin())) { + // If a corresponding leaf node exists in the source tree, + // copy voxel values from the source node to the output vector. + for (typename VIdxLeafT::ValueOnCIter it = idxLeaf.cbeginValueOn(); it; ++it) { + vec[*it] = leaf->getValue(it.pos()); + } + } else { + // If no corresponding leaf exists in the source tree, + // fill the vector with a uniform value. + const TreeValueT& value = tree->getValue(idxLeaf.origin()); + for (typename VIdxLeafT::ValueOnCIter it = idxLeaf.cbeginValueOn(); it; ++it) { + vec[*it] = value; + } + } + } +}; + +} // namespace internal + + +template +inline typename math::pcg::Vector::Ptr +createVectorFromTree(const SourceTreeType& tree, + const typename SourceTreeType::template ValueConverter::Type& idxTree) +{ + typedef typename SourceTreeType::template ValueConverter::Type VIdxTreeT; + typedef tree::LeafManager VIdxLeafMgrT; + typedef typename math::pcg::Vector VectorT; + + // Allocate the vector. + const size_t numVoxels = idxTree.activeVoxelCount(); + typename VectorT::Ptr result(new VectorT(static_cast(numVoxels))); + + // Parallelize over the leaf nodes of the index tree, filling the output vector + // with values from corresponding voxels of the source tree. + VIdxLeafMgrT leafManager(idxTree); + leafManager.foreach(internal::CopyToVecOp(tree, *result)); + + return result; +} + + +//////////////////////////////////////// + + +namespace internal { + +/// @brief Functor for use with LeafManager::foreach() to populate a tree +/// with values from a vector +template +struct CopyFromVecOp +{ + typedef typename VIndexTreeType::template ValueConverter::Type OutTreeT; + typedef typename OutTreeT::LeafNodeType OutLeafT; + typedef typename VIndexTreeType::LeafNodeType VIdxLeafT; + typedef typename math::pcg::Vector VectorT; + + const VectorT* vector; + OutTreeT* tree; + + CopyFromVecOp(const VectorT& v, OutTreeT& t): vector(&v), tree(&t) {} + + void operator()(const VIdxLeafT& idxLeaf, size_t /*leafIdx*/) const + { + const VectorT& vec = *vector; + OutLeafT* leaf = tree->probeLeaf(idxLeaf.origin()); + assert(leaf != NULL); + for (typename VIdxLeafT::ValueOnCIter it = idxLeaf.cbeginValueOn(); it; ++it) { + leaf->setValueOnly(it.pos(), static_cast(vec[*it])); + } + } +}; + +} // namespace internal + + +template +inline typename VIndexTreeType::template ValueConverter::Type::Ptr +createTreeFromVector( + const math::pcg::Vector& vector, + const VIndexTreeType& idxTree, + const TreeValueType& background) +{ + typedef typename VIndexTreeType::template ValueConverter::Type OutTreeT; + typedef typename tree::LeafManager VIdxLeafMgrT; + + // Construct an output tree with the same active voxel topology as the index tree. + typename OutTreeT::Ptr result(new OutTreeT(idxTree, background, TopologyCopy())); + OutTreeT& tree = *result; + + // Parallelize over the leaf nodes of the index tree, populating voxels + // of the output tree with values from the input vector. + VIdxLeafMgrT leafManager(idxTree); + leafManager.foreach( + internal::CopyFromVecOp(vector, tree)); + + return result; +} + + +//////////////////////////////////////// + + +namespace internal { + +/// Constant boundary condition functor +template +struct DirichletOp { + inline void operator()( + const Coord&, const Coord&, ValueType&, ValueType& diag) const { diag -= 1; } +}; + + +/// Functor for use with LeafManager::foreach() to populate a sparse Laplacian matrix +template +struct ISLaplacianOp +{ + typedef typename BoolTreeType::template ValueConverter::Type VIdxTreeT; + typedef typename VIdxTreeT::LeafNodeType VIdxLeafT; + typedef LaplacianMatrix::ValueType ValueT; + typedef typename math::pcg::Vector VectorT; + + LaplacianMatrix* laplacian; + const VIdxTreeT* idxTree; + const BoolTreeType* interiorMask; + const BoundaryOp boundaryOp; + VectorT* source; + + ISLaplacianOp(LaplacianMatrix& m, const VIdxTreeT& idx, + const BoolTreeType& mask, const BoundaryOp& op, VectorT& src): + laplacian(&m), idxTree(&idx), interiorMask(&mask), boundaryOp(op), source(&src) {} + + void operator()(const VIdxLeafT& idxLeaf, size_t /*leafIdx*/) const + { + // Local accessors + typename tree::ValueAccessor interior(*interiorMask); + typename tree::ValueAccessor vectorIdx(*idxTree); + + Coord ijk; + VIndex column; + const ValueT diagonal = -6.f, offDiagonal = 1.f; + + // Loop over active voxels in this leaf. + for (typename VIdxLeafT::ValueOnCIter it = idxLeaf.cbeginValueOn(); it; ++it) { + assert(it.getValue() > -1); + const math::pcg::SizeType rowNum = static_cast(it.getValue()); + + LaplacianMatrix::RowEditor row = laplacian->getRowEditor(rowNum); + + ijk = it.getCoord(); + if (interior.isValueOn(ijk)) { + // The current voxel is an interior voxel. + // All of its neighbors are in the solution domain. + + // -x direction + row.setValue(vectorIdx.getValue(ijk.offsetBy(-1, 0, 0)), offDiagonal); + // -y direction + row.setValue(vectorIdx.getValue(ijk.offsetBy(0, -1, 0)), offDiagonal); + // -z direction + row.setValue(vectorIdx.getValue(ijk.offsetBy(0, 0, -1)), offDiagonal); + // diagonal + row.setValue(rowNum, diagonal); + // +z direction + row.setValue(vectorIdx.getValue(ijk.offsetBy(0, 0, 1)), offDiagonal); + // +y direction + row.setValue(vectorIdx.getValue(ijk.offsetBy(0, 1, 0)), offDiagonal); + // +x direction + row.setValue(vectorIdx.getValue(ijk.offsetBy(1, 0, 0)), offDiagonal); + + } else { + // The current voxel is a boundary voxel. + // At least one of its neighbors is outside the solution domain. + + ValueT modifiedDiagonal = 0.f; + + // -x direction + if (vectorIdx.probeValue(ijk.offsetBy(-1, 0, 0), column)) { + row.setValue(column, offDiagonal); + modifiedDiagonal -= 1; + } else { + boundaryOp(ijk, ijk.offsetBy(-1, 0, 0), source->at(rowNum), modifiedDiagonal); + } + // -y direction + if (vectorIdx.probeValue(ijk.offsetBy(0, -1, 0), column)) { + row.setValue(column, offDiagonal); + modifiedDiagonal -= 1; + } else { + boundaryOp(ijk, ijk.offsetBy(0, -1, 0), source->at(rowNum), modifiedDiagonal); + } + // -z direction + if (vectorIdx.probeValue(ijk.offsetBy(0, 0, -1), column)) { + row.setValue(column, offDiagonal); + modifiedDiagonal -= 1; + } else { + boundaryOp(ijk, ijk.offsetBy(0, 0, -1), source->at(rowNum), modifiedDiagonal); + } + // +z direction + if (vectorIdx.probeValue(ijk.offsetBy(0, 0, 1), column)) { + row.setValue(column, offDiagonal); + modifiedDiagonal -= 1; + } else { + boundaryOp(ijk, ijk.offsetBy(0, 0, 1), source->at(rowNum), modifiedDiagonal); + } + // +y direction + if (vectorIdx.probeValue(ijk.offsetBy(0, 1, 0), column)) { + row.setValue(column, offDiagonal); + modifiedDiagonal -= 1; + } else { + boundaryOp(ijk, ijk.offsetBy(0, 1, 0), source->at(rowNum), modifiedDiagonal); + } + // +x direction + if (vectorIdx.probeValue(ijk.offsetBy(1, 0, 0), column)) { + row.setValue(column, offDiagonal); + modifiedDiagonal -= 1; + } else { + boundaryOp(ijk, ijk.offsetBy(1, 0, 0), source->at(rowNum), modifiedDiagonal); + } + // diagonal + row.setValue(rowNum, modifiedDiagonal); + } + } // end loop over voxels + } +}; + +} // namespace internal + + +template +inline LaplacianMatrix::Ptr +createISLaplacian(const typename BoolTreeType::template ValueConverter::Type& idxTree, + const BoolTreeType& interiorMask) +{ + typedef LaplacianMatrix::ValueType ValueT; + math::pcg::Vector unused( + static_cast(idxTree.activeVoxelCount())); + internal::DirichletOp op; + return createISLaplacianWithBoundaryConditions(idxTree, interiorMask, op, unused); +} + + +template +inline LaplacianMatrix::Ptr +createISLaplacianWithBoundaryConditions( + const typename BoolTreeType::template ValueConverter::Type& idxTree, + const BoolTreeType& interiorMask, + const BoundaryOp& boundaryOp, + typename math::pcg::Vector& source) +{ + typedef typename BoolTreeType::template ValueConverter::Type VIdxTreeT; + typedef typename tree::LeafManager VIdxLeafMgrT; + + // The number of active voxels is the number of degrees of freedom. + const Index64 numDoF = idxTree.activeVoxelCount(); + + // Construct the matrix. + LaplacianMatrix::Ptr laplacianPtr( + new LaplacianMatrix(static_cast(numDoF))); + LaplacianMatrix& laplacian = *laplacianPtr; + + // Populate the matrix using a second-order, 7-point CD stencil. + VIdxLeafMgrT idxLeafManager(idxTree); + idxLeafManager.foreach(internal::ISLaplacianOp( + laplacian, idxTree, interiorMask, boundaryOp, source)); + + return laplacianPtr; +} + + +//////////////////////////////////////// + + +template +inline typename TreeType::Ptr +solve(const TreeType& inTree, math::pcg::State& state) +{ + util::NullInterrupter interrupter; + return solve(inTree, state, interrupter); +} + + +template +inline typename TreeType::Ptr +solve(const TreeType& inTree, math::pcg::State& state, Interrupter& interrupter) +{ + internal::DirichletOp boundaryOp; + return solveWithBoundaryConditions(inTree, boundaryOp, state, interrupter); +} + + +template +inline typename TreeType::Ptr +solveWithBoundaryConditions(const TreeType& inTree, const BoundaryOp& boundaryOp, + math::pcg::State& state, Interrupter& interrupter) +{ + typedef math::pcg::IncompleteCholeskyPreconditioner DefaultPrecondT; + return solveWithBoundaryConditionsAndPreconditioner( + inTree, boundaryOp, state, interrupter); +} + + +template +inline typename TreeType::Ptr +solveWithBoundaryConditionsAndPreconditioner(const TreeType& inTree, + const BoundaryOp& boundaryOp, math::pcg::State& state, Interrupter& interrupter) +{ + + return solveWithBoundaryConditionsAndPreconditioner(inTree /*source*/, inTree /*domain mask*/, + boundaryOp, state, interrupter); +} + +template +inline typename TreeType::Ptr +solveWithBoundaryConditionsAndPreconditioner(const TreeType& inTree, + const DomainTreeType& domainMask, + const BoundaryOp& boundaryOp, + math::pcg::State& state, Interrupter& interrupter) +{ + + typedef typename TreeType::ValueType TreeValueT; + typedef LaplacianMatrix::ValueType VecValueT; + typedef typename math::pcg::Vector VectorT; + typedef typename TreeType::template ValueConverter::Type VIdxTreeT; + typedef typename TreeType::template ValueConverter::Type MaskTreeT; + + // 1. Create a mapping from active voxels of the input tree to elements of a vector. + typename VIdxTreeT::ConstPtr idxTree = createIndexTree(domainMask); + + // 2. Populate a vector with values from the input tree. + typename VectorT::Ptr b = createVectorFromTree(inTree, *idxTree); + + // 3. Create a mask of the interior voxels of the input tree (from the densified index tree). + typename MaskTreeT::Ptr interiorMask( + new MaskTreeT(*idxTree, /*background=*/false, TopologyCopy())); + tools::erodeVoxels(*interiorMask, /*iterations=*/1, tools::NN_FACE); + + // 4. Create the Laplacian matrix. + LaplacianMatrix::Ptr laplacian = createISLaplacianWithBoundaryConditions( + *idxTree, *interiorMask, boundaryOp, *b); + + // 5. Solve the Poisson equation. + laplacian->scale(-1.0); // matrix is negative-definite; solve -M x = -b + b->scale(-1.0); + typename VectorT::Ptr x(new VectorT(b->size(), zeroVal())); + typename math::pcg::Preconditioner::Ptr precond( + new PreconditionerType(*laplacian)); + if (!precond->isValid()) { + precond.reset(new math::pcg::JacobiPreconditioner(*laplacian)); + } + + state = math::pcg::solve(*laplacian, *b, *x, *precond, interrupter, state); + + // 6. Populate the output tree with values from the solution vector. + /// @todo if (state.success) ... ? + return createTreeFromVector(*x, *idxTree, /*background=*/zeroVal()); +} + +} // namespace poisson +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_POISSONSOLVER_HAS_BEEN_INCLUDED + +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// diff --git a/nuparu/include/openvdb/include/openvdb/tools/Prune.h b/nuparu/include/openvdb/include/openvdb/tools/Prune.h new file mode 100644 index 00000000..1c6d48d8 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/Prune.h @@ -0,0 +1,417 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file Prune.h +/// +/// @brief Defined various multi-threaded utility functions for trees +/// +/// @author Ken Museth + +#ifndef OPENVDB_TOOLS_PRUNE_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_PRUNE_HAS_BEEN_INCLUDED + +#include +#include +#include + +#include // for isNegative and negative +#include // for Index typedef +#include +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief Reduce the memory footprint of a @a tree by replacing with tiles +/// any nodes whose values are all the same (optionally to within a tolerance) +/// and have the same active state. +/// +/// @note For trees with floating-point values a child node with (approximately) +/// constant values are replaced with a tile value corresponding to the average +/// of the extrema values in said child node. Else the first value encountered +/// in the child node is used. +/// +/// @param tree the tree to be pruned +/// @param tolerance tolerance within which values are considered to be equal +/// @param threaded enable or disable threading (threading is enabled by default) +/// @param grainSize used to control the threading granularity (default is 1) +template +inline void +prune(TreeT& tree, + typename TreeT::ValueType tolerance = zeroVal(), + bool threaded = true, + size_t grainSize = 1); + + +/// @brief Reduce the memory footprint of a @a tree by replacing with tiles +/// any non-leaf nodes whose values are all the same (optionally to within a tolerance) +/// and have the same active state. +/// +/// @param tree the tree to be pruned +/// @param tolerance tolerance within which values are considered to be equal +/// @param threaded enable or disable threading (threading is enabled by default) +/// @param grainSize used to control the threading granularity (default is 1) +template +inline void +pruneTiles(TreeT& tree, + typename TreeT::ValueType tolerance = zeroVal(), + bool threaded = true, + size_t grainSize = 1); + + +/// @brief Reduce the memory footprint of a @a tree by replacing with +/// background tiles any nodes whose values are all inactive. +/// +/// @param tree the tree to be pruned +/// @param threaded enable or disable threading (threading is enabled by default) +/// @param grainSize used to control the threading granularity (default is 1) +template +inline void +pruneInactive(TreeT& tree, bool threaded = true, size_t grainSize = 1); + + +/// @brief Reduce the memory footprint of a @a tree by replacing any nodes +/// whose values are all inactive with tiles of the given @a value. +/// +/// @param tree the tree to be pruned +/// @param value value assigned to inactive tiles created during pruning +/// @param threaded enable or disable threading (threading is enabled by default) +/// @param grainSize used to control the threading granularity (default is 1) +template +inline void +pruneInactiveWithValue( + TreeT& tree, + const typename TreeT::ValueType& value, + bool threaded = true, + size_t grainSize = 1); + + +/// @brief Reduce the memory footprint of a @a tree by replacing nodes +/// whose values are all inactive with inactive tiles having a value equal to +/// the first value encountered in the (inactive) child. +/// @details This method is faster than tolerance-based prune and +/// useful for narrow-band level set applications where inactive +/// values are limited to either an inside or an outside value. +/// +/// @param tree the tree to be pruned +/// @param threaded enable or disable threading (threading is enabled by default) +/// @param grainSize used to control the threading granularity (default is 1) +/// +/// @throw ValueError if the background of the @a tree is negative (as defined by math::isNegative) +template +inline void +pruneLevelSet(TreeT& tree, + bool threaded = true, + size_t grainSize = 1); + + +/// @brief Reduce the memory footprint of a @a tree by replacing nodes whose voxel values +/// are all inactive with inactive tiles having the value -| @a insideWidth | +/// if the voxel values are negative and | @a outsideWidth | otherwise. +/// +/// @details This method is faster than tolerance-based prune and +/// useful for narrow-band level set applications where inactive +/// values are limited to either an inside or an outside value. +/// +/// @param tree the tree to be pruned +/// @param outsideWidth the width of the outside of the narrow band +/// @param insideWidth the width of the inside of the narrow band +/// @param threaded enable or disable threading (threading is enabled by default) +/// @param grainSize used to control the threading granularity (default is 1) +/// +/// @throw ValueError if @a outsideWidth is negative or @a insideWidth is +/// not negative (as defined by math::isNegative). +template +inline void +pruneLevelSet(TreeT& tree, + const typename TreeT::ValueType& outsideWidth, + const typename TreeT::ValueType& insideWidth, + bool threaded = true, + size_t grainSize = 1); + + +//////////////////////////////////////////////// + + +template +class InactivePruneOp +{ +public: + typedef typename TreeT::ValueType ValueT; + typedef typename TreeT::RootNodeType RootT; + typedef typename TreeT::LeafNodeType LeafT; + BOOST_STATIC_ASSERT(RootT::LEVEL > TerminationLevel); + + InactivePruneOp(TreeT& tree) : mValue(tree.background()) + { + tree.clearAllAccessors();//clear cache of nodes that could be pruned + } + + InactivePruneOp(TreeT& tree, const ValueT& v) : mValue(v) + { + tree.clearAllAccessors();//clear cache of nodes that could be pruned + } + + // Nothing to do at the leaf node level + void operator()(LeafT&) const {} + // Prune the child nodes of the internal nodes + template + void operator()(NodeT& node) const + { + if (NodeT::LEVEL > TerminationLevel) { + for (typename NodeT::ChildOnIter it=node.beginChildOn(); it; ++it) { + if (it->isInactive()) node.addTile(it.pos(), mValue, false); + } + } + } + // Prune the child nodes of the root node + void operator()(RootT& root) const + { + for (typename RootT::ChildOnIter it = root.beginChildOn(); it; ++it) { + if (it->isInactive()) root.addTile(it.getCoord(), mValue, false); + } + root.eraseBackgroundTiles(); + } +private: + + const ValueT mValue; +};// InactivePruneOp + + +template +class TolerancePruneOp +{ +public: + typedef typename TreeT::ValueType ValueT; + typedef typename TreeT::RootNodeType RootT; + typedef typename TreeT::LeafNodeType LeafT; + BOOST_STATIC_ASSERT(RootT::LEVEL > TerminationLevel); + + TolerancePruneOp(TreeT& tree, const ValueT& t) : mTolerance(t) + { + tree.clearAllAccessors();//clear cache of nodes that could be pruned + } + + // Prune the child nodes of the root node + inline void operator()(RootT& root) const + { + ValueT value; + bool state; + for (typename RootT::ChildOnIter it = root.beginChildOn(); it; ++it) { + if (this->isConstant(*it, value, state)) root.addTile(it.getCoord(), value, state); + } + root.eraseBackgroundTiles(); + } + + // Prune the child nodes of the internal nodes + template + inline void operator()(NodeT& node) const + { + if (NodeT::LEVEL > TerminationLevel) { + ValueT value; + bool state; + for (typename NodeT::ChildOnIter it=node.beginChildOn(); it; ++it) { + if (this->isConstant(*it, value, state)) node.addTile(it.pos(), value, state); + } + } + } + + // Nothing to do at the leaf node level + inline void operator()(LeafT&) const {} + +private: + + // For floating-point value types set tile values to + // the mean of the extrema values of the constant node + template + inline + typename boost::enable_if, bool>::type + isConstant(const NodeT& node, ValueT& value, bool& state) const + { + ValueT tmp; + const bool test = node.isConstant(value, tmp, state, mTolerance); + if (test) value = ValueT(0.5f)*(value + tmp); + return test; + } + + // For non-floating-point value types set tile values to + // the first value encountered in the constant node + template + inline + typename boost::disable_if, bool>::type + isConstant(const NodeT& node, ValueT& value, bool& state) const + { + return node.isConstant(value, state, mTolerance); + } + + const ValueT mTolerance; +};// TolerancePruneOp + + +template +class LevelSetPruneOp +{ +public: + typedef typename TreeT::ValueType ValueT; + typedef typename TreeT::RootNodeType RootT; + typedef typename TreeT::LeafNodeType LeafT; + BOOST_STATIC_ASSERT(RootT::LEVEL > TerminationLevel); + + LevelSetPruneOp(TreeT& tree) + : mOutside(tree.background()) + , mInside(math::negative(mOutside)) + { + if (math::isNegative(mOutside)) { + OPENVDB_THROW(ValueError, + "LevelSetPruneOp: the background value cannot be negative!"); + } + tree.clearAllAccessors();//clear cache of nodes that could be pruned + } + LevelSetPruneOp(TreeT& tree, const ValueT& outside, const ValueT& inside) + : mOutside(outside) + , mInside(inside) + { + if (math::isNegative(mOutside)) { + OPENVDB_THROW(ValueError, + "LevelSetPruneOp: the outside value cannot be negative!"); + } + if (!math::isNegative(mInside)) { + OPENVDB_THROW(ValueError, + "LevelSetPruneOp: the inside value must be negative!"); + } + tree.clearAllAccessors();//clear cache of nodes that could be pruned + } + // Nothing to do at the leaf node level + void operator()(LeafT&) const {} + // Prune the child nodes of the internal nodes + template + void operator()(NodeT& node) const + { + if (NodeT::LEVEL > TerminationLevel) { + for (typename NodeT::ChildOnIter it=node.beginChildOn(); it; ++it) { + if (it->isInactive()) node.addTile(it.pos(), this->getTileValue(it), false); + } + } + } + // Prune the child nodes of the root node + void operator()(RootT& root) const + { + for (typename RootT::ChildOnIter it = root.beginChildOn(); it; ++it) { + if (it->isInactive()) root.addTile(it.getCoord(), this->getTileValue(it), false); + } + root.eraseBackgroundTiles(); + } + +private: + template + inline ValueT getTileValue(const IterT& iter) const + { + return math::isNegative(iter->getFirstValue()) ? mInside : mOutside; + } + + const ValueT mOutside, mInside; +};// LevelSetPruneOp + + +template +inline void +prune(TreeT& tree, typename TreeT::ValueType tol, bool threaded, size_t grainSize) +{ + tree::NodeManager nodes(tree); + TolerancePruneOp op(tree, tol); + nodes.foreachBottomUp(op, threaded, grainSize); +} + + +template +inline void +pruneTiles(TreeT& tree, typename TreeT::ValueType tol, bool threaded, size_t grainSize) +{ + tree::NodeManager nodes(tree); + TolerancePruneOp op(tree, tol); + nodes.foreachBottomUp(op, threaded, grainSize); +} + + +template +inline void +pruneInactive(TreeT& tree, bool threaded, size_t grainSize) +{ + tree::NodeManager nodes(tree); + InactivePruneOp op(tree); + nodes.foreachBottomUp(op, threaded, grainSize); +} + + +template +inline void +pruneInactiveWithValue(TreeT& tree, const typename TreeT::ValueType& v, + bool threaded, size_t grainSize) +{ + tree::NodeManager nodes(tree); + InactivePruneOp op(tree, v); + nodes.foreachBottomUp(op, threaded, grainSize); +} + + +template +inline void +pruneLevelSet(TreeT& tree, + const typename TreeT::ValueType& outside, + const typename TreeT::ValueType& inside, + bool threaded, + size_t grainSize) +{ + tree::NodeManager nodes(tree); + LevelSetPruneOp op(tree, outside, inside); + nodes.foreachBottomUp(op, threaded, grainSize); +} + + +template +inline void +pruneLevelSet(TreeT& tree, bool threaded, size_t grainSize) +{ + tree::NodeManager nodes(tree); + LevelSetPruneOp op(tree); + nodes.foreachBottomUp(op, threaded, grainSize); +} + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_PRUNE_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/RayIntersector.h b/nuparu/include/openvdb/include/openvdb/tools/RayIntersector.h new file mode 100644 index 00000000..0f177517 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/RayIntersector.h @@ -0,0 +1,701 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +/// +/// @file RayIntersector.h +/// +/// @author Ken Museth +/// +/// @brief Accelerated intersection of a ray with a narrow-band level +/// set or a generic (e.g. density) volume. This will of course be +/// useful for respectively surface and volume rendering. +/// +/// @details This file defines two main classes, +/// LevelSetRayIntersector and VolumeRayIntersector, as well as the +/// three support classes LevelSetHDDA, VolumeHDDA and LinearSearchImpl. +/// The LevelSetRayIntersector is templated on the LinearSearchImpl class +/// and calls instances of the LevelSetHDDA class. The reason to split +/// level set ray intersection into three classes is twofold. First +/// LevelSetRayIntersector defines the public API for client code and +/// LinearSearchImpl defines the actual algorithm used for the +/// ray level-set intersection. In other words this design will allow +/// for the public API to be fixed while the intersection algorithm +/// can change without resolving to (slow) virtual methods. Second, +/// LevelSetHDDA, which implements a hierarchical Differential Digital +/// Analyzer, relies on partial template specialization, so it has to +/// be a standalone class (as opposed to a member class of +/// LevelSetRayIntersector). The VolumeRayIntersector is conceptually +/// much simpler than the LevelSetRayIntersector, and hence it only +/// depends on VolumeHDDA that implements the hierarchical +/// Differential Digital Analyzer. + + +#ifndef OPENVDB_TOOLS_RAYINTERSECTOR_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_RAYINTERSECTOR_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include "Morphology.h" +#include +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +// Helper class that implements the actual search of the zero-crossing +// of the level set along the direction of a ray. This particular +// implementation uses iterative linear search. +template +class LinearSearchImpl; + + +///////////////////////////////////// LevelSetRayIntersector ///////////////////////////////////// + + +/// @brief This class provides the public API for intersecting a ray +/// with a narrow-band level set. +/// +/// @details It wraps a SearchImplT with a simple public API and +/// performs the actual hierarchical tree node and voxel traversal. +/// +/// @warning Use the (default) copy-constructor to make sure each +/// computational thread has their own instance of this class. This is +/// important since the SearchImplT contains a ValueAccessor that is +/// not thread-safe. However copying is very efficient. +/// +/// @see tools/RayTracer.h for examples of intended usage. +/// +/// @todo Add TrilinearSearchImpl, as an alternative to LinearSearchImpl, +/// that performs analytical 3D trilinear intersection tests, i.e., solves +/// cubic equations. This is slower but also more accurate than the 1D +/// linear interpolation in LinearSearchImpl. +template, + int NodeLevel = GridT::TreeType::RootNodeType::ChildNodeType::LEVEL, + typename RayT = math::Ray > +class LevelSetRayIntersector +{ +public: + typedef GridT GridType; + typedef RayT RayType; + typedef typename RayT::RealType RealType; + typedef typename RayT::Vec3T Vec3Type; + typedef typename GridT::ValueType ValueT; + typedef typename GridT::TreeType TreeT; + + BOOST_STATIC_ASSERT( NodeLevel >= -1 && NodeLevel < int(TreeT::DEPTH)-1); + BOOST_STATIC_ASSERT(boost::is_floating_point::value); + + /// @brief Constructor + /// @param grid level set grid to intersect rays against. + /// @param isoValue optional iso-value for the ray-intersection. + LevelSetRayIntersector(const GridT& grid, const ValueT& isoValue = zeroVal()) + : mTester(grid, isoValue) + { + if (!grid.hasUniformVoxels() ) { + OPENVDB_THROW(RuntimeError, + "LevelSetRayIntersector only supports uniform voxels!"); + } + if (grid.getGridClass() != GRID_LEVEL_SET) { + OPENVDB_THROW(RuntimeError, + "LevelSetRayIntersector only supports level sets!" + "\nUse Grid::setGridClass(openvdb::GRID_LEVEL_SET)"); + } + } + + /// @brief Return the iso-value used for ray-intersections + const ValueT& getIsoValue() const { return mTester.getIsoValue(); } + + /// @brief Return @c true if the index-space ray intersects the level set. + /// @param iRay ray represented in index space. + bool intersectsIS(const RayType& iRay) const + { + if (!mTester.setIndexRay(iRay)) return false;//missed bbox + return math::LevelSetHDDA::test(mTester); + } + + /// @brief Return @c true if the index-space ray intersects the level set + /// @param iRay ray represented in index space. + /// @param iTime if an intersection was found it is assigned the time of the + /// intersection along the index ray. + bool intersectsIS(const RayType& iRay, RealType &iTime) const + { + if (!mTester.setIndexRay(iRay)) return false;//missed bbox + iTime = mTester.getIndexTime(); + return math::LevelSetHDDA::test(mTester); + } + + /// @brief Return @c true if the index-space ray intersects the level set. + /// @param iRay ray represented in index space. + /// @param xyz if an intersection was found it is assigned the + /// intersection point in index space, otherwise it is unchanged. + bool intersectsIS(const RayType& iRay, Vec3Type& xyz) const + { + if (!mTester.setIndexRay(iRay)) return false;//missed bbox + if (!math::LevelSetHDDA::test(mTester)) return false;//missed level set + mTester.getIndexPos(xyz); + return true; + } + + /// @brief Return @c true if the index-space ray intersects the level set. + /// @param iRay ray represented in index space. + /// @param xyz if an intersection was found it is assigned the + /// intersection point in index space, otherwise it is unchanged. + /// @param iTime if an intersection was found it is assigned the time of the + /// intersection along the index ray. + bool intersectsIS(const RayType& iRay, Vec3Type& xyz, RealType &iTime) const + { + if (!mTester.setIndexRay(iRay)) return false;//missed bbox + if (!math::LevelSetHDDA::test(mTester)) return false;//missed level set + mTester.getIndexPos(xyz); + iTime = mTester.getIndexTime(); + return true; + } + + /// @brief Return @c true if the world-space ray intersects the level set. + /// @param wRay ray represented in world space. + bool intersectsWS(const RayType& wRay) const + { + if (!mTester.setWorldRay(wRay)) return false;//missed bbox + return math::LevelSetHDDA::test(mTester); + } + + /// @brief Return @c true if the world-space ray intersects the level set. + /// @param wRay ray represented in world space. + /// @param wTime if an intersection was found it is assigned the time of the + /// intersection along the world ray. + bool intersectsWS(const RayType& wRay, RealType &wTime) const + { + if (!mTester.setWorldRay(wRay)) return false;//missed bbox + wTime = mTester.getWorldTime(); + return math::LevelSetHDDA::test(mTester); + } + + /// @brief Return @c true if the world-space ray intersects the level set. + /// @param wRay ray represented in world space. + /// @param world if an intersection was found it is assigned the + /// intersection point in world space, otherwise it is unchanged + bool intersectsWS(const RayType& wRay, Vec3Type& world) const + { + if (!mTester.setWorldRay(wRay)) return false;//missed bbox + if (!math::LevelSetHDDA::test(mTester)) return false;//missed level set + mTester.getWorldPos(world); + return true; + } + + /// @brief Return @c true if the world-space ray intersects the level set. + /// @param wRay ray represented in world space. + /// @param world if an intersection was found it is assigned the + /// intersection point in world space, otherwise it is unchanged. + /// @param wTime if an intersection was found it is assigned the time of the + /// intersection along the world ray. + bool intersectsWS(const RayType& wRay, Vec3Type& world, RealType &wTime) const + { + if (!mTester.setWorldRay(wRay)) return false;//missed bbox + if (!math::LevelSetHDDA::test(mTester)) return false;//missed level set + mTester.getWorldPos(world); + wTime = mTester.getWorldTime(); + return true; + } + + /// @brief Return @c true if the world-space ray intersects the level set. + /// @param wRay ray represented in world space. + /// @param world if an intersection was found it is assigned the + /// intersection point in world space, otherwise it is unchanged. + /// @param normal if an intersection was found it is assigned the normal + /// of the level set surface in world space, otherwise it is unchanged. + bool intersectsWS(const RayType& wRay, Vec3Type& world, Vec3Type& normal) const + { + if (!mTester.setWorldRay(wRay)) return false;//missed bbox + if (!math::LevelSetHDDA::test(mTester)) return false;//missed level set + mTester.getWorldPosAndNml(world, normal); + return true; + } + + /// @brief Return @c true if the world-space ray intersects the level set. + /// @param wRay ray represented in world space. + /// @param world if an intersection was found it is assigned the + /// intersection point in world space, otherwise it is unchanged. + /// @param normal if an intersection was found it is assigned the normal + /// of the level set surface in world space, otherwise it is unchanged. + /// @param wTime if an intersection was found it is assigned the time of the + /// intersection along the world ray. + bool intersectsWS(const RayType& wRay, Vec3Type& world, Vec3Type& normal, RealType &wTime) const + { + if (!mTester.setWorldRay(wRay)) return false;//missed bbox + if (!math::LevelSetHDDA::test(mTester)) return false;//missed level set + mTester.getWorldPosAndNml(world, normal); + wTime = mTester.getWorldTime(); + return true; + } + +private: + + mutable SearchImplT mTester; + +};// LevelSetRayIntersector + + +////////////////////////////////////// VolumeRayIntersector ////////////////////////////////////// + + +/// @brief This class provides the public API for intersecting a ray +/// with a generic (e.g. density) volume. +/// @details Internally it performs the actual hierarchical tree node traversal. +/// @warning Use the (default) copy-constructor to make sure each +/// computational thread has their own instance of this class. This is +/// important since it contains a ValueAccessor that is +/// not thread-safe and a CoordBBox of the active voxels that should +/// not be re-computed for each thread. However copying is very efficient. +/// @par Example: +/// @code +/// // Create an instance for the master thread +/// VolumeRayIntersector inter(grid); +/// // For each additional thread use the copy constructor. This +/// // amortizes the overhead of computing the bbox of the active voxels! +/// VolumeRayIntersector inter2(inter); +/// // Before each ray-traversal set the index ray. +/// iter.setIndexRay(ray); +/// // or world ray +/// iter.setWorldRay(ray); +/// // Now you can begin the ray-marching using consecutive calls to VolumeRayIntersector::march +/// double t0=0, t1=0;// note the entry and exit times are with respect to the INDEX ray +/// while ( inter.march(t0, t1) ) { +/// // perform line-integration between t0 and t1 +/// }} +/// @endcode +template > +class VolumeRayIntersector +{ +public: + typedef GridT GridType; + typedef RayT RayType; + typedef typename RayT::RealType RealType; + typedef typename GridT::TreeType::RootNodeType RootType; + typedef tree::Tree::Type> TreeT; + + BOOST_STATIC_ASSERT( NodeLevel >= 0 && NodeLevel < int(TreeT::DEPTH)-1); + + /// @brief Grid constructor + /// @param grid Generic grid to intersect rays against. + /// @param dilationCount The number of voxel dilations performed + /// on (a boolean copy of) the input grid. This allows the + /// intersector to account for the size of interpolation kernels + /// in client code. + /// @throw RuntimeError if the voxels of the grid are not uniform + /// or the grid is empty. + VolumeRayIntersector(const GridT& grid, int dilationCount = 0) + : mIsMaster(true) + , mTree(new TreeT(grid.tree(), false, TopologyCopy())) + , mGrid(&grid) + , mAccessor(*mTree) + { + if (!grid.hasUniformVoxels() ) { + OPENVDB_THROW(RuntimeError, + "VolumeRayIntersector only supports uniform voxels!"); + } + if ( grid.empty() ) { + OPENVDB_THROW(RuntimeError, "LinearSearchImpl does not supports empty grids"); + } + + // Dilate active voxels to better account for the size of interpolation kernels + tools::dilateVoxels(*mTree, dilationCount); + + mTree->root().evalActiveBoundingBox(mBBox, /*visit individual voxels*/false); + + mBBox.max().offset(1);//padding so the bbox of a node becomes (origin,origin + node_dim) + } + + /// @brief Grid and BBox constructor + /// @param grid Generic grid to intersect rays against. + /// @param bbox The axis-aligned bounding-box in the index space of the grid. + /// @warning It is assumed that bbox = (min, min + dim) where min denotes + /// to the smallest grid coordinates and dim are the integer length of the bbox. + /// @throw RuntimeError if the voxels of the grid are not uniform + /// or the grid is empty. + VolumeRayIntersector(const GridT& grid, const math::CoordBBox& bbox) + : mIsMaster(true) + , mTree(new TreeT(grid.tree(), false, TopologyCopy())) + , mGrid(&grid) + , mAccessor(*mTree) + , mBBox(bbox) + { + if (!grid.hasUniformVoxels() ) { + OPENVDB_THROW(RuntimeError, + "VolumeRayIntersector only supports uniform voxels!"); + } + if ( grid.empty() ) { + OPENVDB_THROW(RuntimeError, "LinearSearchImpl does not supports empty grids"); + } + } + + /// @brief Shallow copy constructor + /// @warning This copy constructor creates shallow copies of data + /// members of the instance passed as the argument. For + /// performance reasons we are not using shared pointers (their + /// mutex-lock impairs multi-threading). + VolumeRayIntersector(const VolumeRayIntersector& other) + : mIsMaster(false) + , mTree(other.mTree)//shallow copy + , mGrid(other.mGrid)//shallow copy + , mAccessor(*mTree)//initialize new (vs deep copy) + , mRay(other.mRay)//deep copy + , mTmax(other.mTmax)//deep copy + , mBBox(other.mBBox)//deep copy + { + } + + /// @brief Destructor + ~VolumeRayIntersector() { if (mIsMaster) delete mTree; } + + /// @brief Return @c false if the index ray misses the bbox of the grid. + /// @param iRay Ray represented in index space. + /// @warning Call this method (or setWorldRay) before the ray + /// traversal starts and use the return value to decide if further + /// marching is required. + inline bool setIndexRay(const RayT& iRay) + { + mRay = iRay; + const bool hit = mRay.clip(mBBox); + if (hit) mTmax = mRay.t1(); + return hit; + } + + /// @brief Return @c false if the world ray misses the bbox of the grid. + /// @param wRay Ray represented in world space. + /// @warning Call this method (or setIndexRay) before the ray + /// traversal starts and use the return value to decide if further + /// marching is required. + /// @details Since hit times are computed with respect to the ray + /// represented in index space of the current grid, it is + /// recommended that either the client code uses getIndexPos to + /// compute index position from hit times or alternatively keeps + /// an instance of the index ray and instead uses setIndexRay to + /// initialize the ray. + inline bool setWorldRay(const RayT& wRay) + { + return this->setIndexRay(wRay.worldToIndex(*mGrid)); + } + + inline typename RayT::TimeSpan march() + { + const typename RayT::TimeSpan t = mHDDA.march(mRay, mAccessor); + if (t.t1>0) mRay.setTimes(t.t1 + math::Delta::value(), mTmax); + return t; + } + + /// @brief Return @c true if the ray intersects active values, + /// i.e. either active voxels or tiles. Only when a hit is + /// detected are t0 and t1 updated with the corresponding entry + /// and exit times along the INDEX ray! + /// @note Note that t0 and t1 are only resolved at the node level + /// (e.g. a LeafNode with active voxels) as opposed to the individual + /// active voxels. + /// @param t0 If the return value > 0 this is the time of the + /// first hit of an active tile or leaf. + /// @param t1 If the return value > t0 this is the time of the + /// first hit (> t0) of an inactive tile or exit point of the + /// BBOX for the leaf nodes. + /// @warning t0 and t1 are computed with respect to the ray represented in + /// index space of the current grid, not world space! + inline bool march(RealType& t0, RealType& t1) + { + const typename RayT::TimeSpan t = this->march(); + t.get(t0, t1); + return t.valid(); + } + + /// @brief Generates a list of hits along the ray. + /// + /// @param list List of hits represented as time spans. + /// + /// @note ListType is a list of RayType::TimeSpan and is required to + /// have the two methods: clear() and push_back(). Thus, it could + /// be std::vector or + /// std::deque. + template + inline void hits(ListType& list) + { + mHDDA.hits(mRay, mAccessor, list); + } + + /// @brief Return the floating-point index position along the + /// current index ray at the specified time. + inline Vec3R getIndexPos(RealType time) const { return mRay(time); } + + /// @brief Return the floating-point world position along the + /// current index ray at the specified time. + inline Vec3R getWorldPos(RealType time) const { return mGrid->indexToWorld(mRay(time)); } + + inline RealType getWorldTime(RealType time) const + { + return time*mGrid->transform().baseMap()->applyJacobian(mRay.dir()).length(); + } + + /// @brief Return a const reference to the input grid. + const GridT& grid() const { return *mGrid; } + + /// @brief Return a const reference to the (potentially dilated) + /// bool tree used to accelerate the ray marching. + const TreeT& tree() const { return *mTree; } + + /// @brief Return a const reference to the BBOX of the grid + const math::CoordBBox& bbox() const { return mBBox; } + + /// @brief Print bbox, statistics, memory usage and other information. + /// @param os a stream to which to write textual information + /// @param verboseLevel 1: print bbox only; 2: include boolean tree + /// statistics; 3: include memory usage + void print(std::ostream& os = std::cout, int verboseLevel = 1) + { + if (verboseLevel>0) { + os << "BBox: " << mBBox << std::endl; + if (verboseLevel==2) { + mTree->print(os, 1); + } else if (verboseLevel>2) { + mTree->print(os, 2); + } + } + } + +private: + + typedef typename tree::ValueAccessor AccessorT; + + const bool mIsMaster; + TreeT* mTree; + const GridT* mGrid; + AccessorT mAccessor; + RayT mRay; + RealType mTmax; + math::CoordBBox mBBox; + math::VolumeHDDA mHDDA; + +};// VolumeRayIntersector + + +//////////////////////////////////////// LinearSearchImpl //////////////////////////////////////// + + +/// @brief Implements linear iterative search for an iso-value of +/// the level set along the direction of the ray. +/// +/// @note Since this class is used internally in +/// LevelSetRayIntersector (define above) and LevelSetHDDA (defined below) +/// client code should never interact directly with its API. This also +/// explains why we are not concerned with the fact that several of +/// its methods are unsafe to call unless roots were already detected. +/// +/// @details It is approximate due to the limited number of iterations +/// which can can be defined with a template parameter. However the default value +/// has proven surprisingly accurate and fast. In fact more iterations +/// are not guaranteed to give significantly better results. +/// +/// @warning Since the root-searching algorithm is approximate +/// (first-order) it is possible to miss intersections if the +/// iso-value is too close to the inside or outside of the narrow +/// band (typically a distance less than a voxel unit). +/// +/// @warning Since this class internally stores a ValueAccessor it is NOT thread-safe, +/// so make sure to give each thread its own instance. This of course also means that +/// the cost of allocating an instance should (if possible) be amortized over +/// as many ray intersections as possible. +template +class LinearSearchImpl +{ +public: + typedef math::Ray RayT; + typedef typename GridT::ValueType ValueT; + typedef typename GridT::ConstAccessor AccessorT; + typedef math::BoxStencil StencilT; + + /// @brief Constructor from a grid. + /// @throw RunTimeError if the grid is empty. + /// @throw ValueError if the isoValue is not inside the narrow-band. + LinearSearchImpl(const GridT& grid, const ValueT& isoValue = zeroVal()) + : mStencil(grid), + mIsoValue(isoValue), + mMinValue(isoValue - ValueT(2 * grid.voxelSize()[0])), + mMaxValue(isoValue + ValueT(2 * grid.voxelSize()[0])) + { + if ( grid.empty() ) { + OPENVDB_THROW(RuntimeError, "LinearSearchImpl does not supports empty grids"); + } + if (mIsoValue<= -grid.background() || + mIsoValue>= grid.background() ){ + OPENVDB_THROW(ValueError, "The iso-value must be inside the narrow-band!"); + } + grid.tree().root().evalActiveBoundingBox(mBBox, /*visit individual voxels*/false); + } + + /// @brief Return the iso-value used for ray-intersections + const ValueT& getIsoValue() const { return mIsoValue; } + + /// @brief Return @c false if the ray misses the bbox of the grid. + /// @param iRay Ray represented in index space. + /// @warning Call this method before the ray traversal starts. + inline bool setIndexRay(const RayT& iRay) + { + mRay = iRay; + return mRay.clip(mBBox);//did it hit the bbox + } + + /// @brief Return @c false if the ray misses the bbox of the grid. + /// @param wRay Ray represented in world space. + /// @warning Call this method before the ray traversal starts. + inline bool setWorldRay(const RayT& wRay) + { + mRay = wRay.worldToIndex(mStencil.grid()); + return mRay.clip(mBBox);//did it hit the bbox + } + + /// @brief Get the intersection point in index space. + /// @param xyz The position in index space of the intersection. + inline void getIndexPos(Vec3d& xyz) const { xyz = mRay(mTime); } + + /// @brief Get the intersection point in world space. + /// @param xyz The position in world space of the intersection. + inline void getWorldPos(Vec3d& xyz) const { xyz = mStencil.grid().indexToWorld(mRay(mTime)); } + + /// @brief Get the intersection point and normal in world space + /// @param xyz The position in world space of the intersection. + /// @param nml The surface normal in world space of the intersection. + inline void getWorldPosAndNml(Vec3d& xyz, Vec3d& nml) + { + this->getIndexPos(xyz); + mStencil.moveTo(xyz); + nml = mStencil.gradient(xyz); + nml.normalize(); + xyz = mStencil.grid().indexToWorld(xyz); + } + + /// @brief Return the time of intersection along the index ray. + inline RealT getIndexTime() const { return mTime; } + + /// @brief Return the time of intersection along the world ray. + inline RealT getWorldTime() const + { + return mTime*mStencil.grid().transform().baseMap()->applyJacobian(mRay.dir()).length(); + } + +private: + + /// @brief Initiate the local voxel intersection test. + /// @warning Make sure to call this method before the local voxel intersection test. + inline void init(RealT t0) + { + mT[0] = t0; + mV[0] = static_cast(this->interpValue(t0)); + } + + inline void setRange(RealT t0, RealT t1) { mRay.setTimes(t0, t1); } + + /// @brief Return a const reference to the ray. + inline const RayT& ray() const { return mRay; } + + /// @brief Return true if a node of the specified type exists at ijk. + template + inline bool hasNode(const Coord& ijk) + { + return mStencil.accessor().template probeConstNode(ijk) != NULL; + } + + /// @brief Return @c true if an intersection is detected. + /// @param ijk Grid coordinate of the node origin or voxel being tested. + /// @param time Time along the index ray being tested. + /// @warning Only if an intersection is detected is it safe to + /// call getIndexPos, getWorldPos and getWorldPosAndNml! + inline bool operator()(const Coord& ijk, RealT time) + { + ValueT V; + if (mStencil.accessor().probeValue(ijk, V) &&//within narrow band + V>mMinValue && V(this->interpValue(time)); + if (math::ZeroCrossing(mV[0], mV[1])) { + mTime = this->interpTime(); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + for (int n=0; Iterations>0 && n(this->interpValue(mTime)); + const int m = math::ZeroCrossing(mV[0], V) ? 1 : 0; + mV[m] = V; + mT[m] = mTime; + mTime = this->interpTime(); + } + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + return true; + } + mT[0] = mT[1]; + mV[0] = mV[1]; + } + return false; + } + + inline RealT interpTime() + { + assert(math::isApproxLarger(mT[1], mT[0], 1e-6)); + return mT[0]+(mT[1]-mT[0])*mV[0]/(mV[0]-mV[1]); + } + + inline RealT interpValue(RealT time) + { + const Vec3R pos = mRay(time); + mStencil.moveTo(pos); + return mStencil.interpolation(pos) - mIsoValue; + } + + template friend struct math::LevelSetHDDA; + + RayT mRay; + StencilT mStencil; + RealT mTime;//time of intersection + ValueT mV[2]; + RealT mT[2]; + const ValueT mIsoValue, mMinValue, mMaxValue; + math::CoordBBox mBBox; +};// LinearSearchImpl + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_RAYINTERSECTOR_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/RayTracer.h b/nuparu/include/openvdb/include/openvdb/tools/RayTracer.h new file mode 100644 index 00000000..ac035e57 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/RayTracer.h @@ -0,0 +1,1102 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +/// +/// @file RayTracer.h +/// +/// @author Ken Museth +/// +/// @brief Defines two simple but multithreaded renders, a level-set +/// ray tracer and a volume render. To support these renders we also define +/// perspective and orthographic cameras (both designed to mimic a Houdini camera), +/// a Film class and some rather naive shaders. +/// +/// @note These classes are included mainly as reference implementations for +/// ray-tracing of OpenVDB volumes. In other words they are not intended for +/// production-quality rendering, but could be used for fast pre-visualization +/// or as a starting point for a more serious render. + +#ifndef OPENVDB_TOOLS_RAYTRACER_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_RAYTRACER_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef OPENVDB_TOOLS_RAYTRACER_USE_EXR +#include +#include +#include +#include +#include +#endif + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +// Forward declarations +class BaseCamera; +class BaseShader; + +/// @brief Ray-trace a volume. +template +inline void rayTrace(const GridT&, + const BaseShader&, + BaseCamera&, + size_t pixelSamples = 1, + unsigned int seed = 0, + bool threaded = true); + +/// @brief Ray-trace a volume using a given ray intersector. +template +inline void rayTrace(const GridT&, + const IntersectorT&, + const BaseShader&, + BaseCamera&, + size_t pixelSamples = 1, + unsigned int seed = 0, + bool threaded = true); + + +///////////////////////////////LEVEL SET RAY TRACER /////////////////////////////////////// + +/// @brief A (very) simple multithreaded ray tracer specifically for narrow-band level sets. +/// @details Included primarily as a reference implementation. +template > +class LevelSetRayTracer +{ +public: + typedef GridT GridType; + typedef typename IntersectorT::Vec3Type Vec3Type; + typedef typename IntersectorT::RayType RayType; + + /// @brief Constructor based on an instance of the grid to be rendered. + LevelSetRayTracer(const GridT& grid, + const BaseShader& shader, + BaseCamera& camera, + size_t pixelSamples = 1, + unsigned int seed = 0); + + /// @brief Constructor based on an instance of the intersector + /// performing the ray-intersections. + LevelSetRayTracer(const IntersectorT& inter, + const BaseShader& shader, + BaseCamera& camera, + size_t pixelSamples = 1, + unsigned int seed = 0); + + /// @brief Copy constructor + LevelSetRayTracer(const LevelSetRayTracer& other); + + /// @brief Destructor + ~LevelSetRayTracer(); + + /// @brief Set the level set grid to be ray-traced + void setGrid(const GridT& grid); + + /// @brief Set the intersector that performs the actual + /// intersection of the rays against the narrow-band level set. + void setIntersector(const IntersectorT& inter); + + /// @brief Set the shader derived from the abstract BaseShader class. + /// + /// @note The shader is not assumed to be thread-safe so each + /// thread will get its only deep copy. For instance it could + /// contains a ValueAccessor into another grid with auxiliary + /// shading information. Thus, make sure it is relatively + /// light-weight and efficient to copy (which is the case for ValueAccesors). + void setShader(const BaseShader& shader); + + /// @brief Set the camera derived from the abstract BaseCamera class. + void setCamera(BaseCamera& camera); + + /// @brief Set the number of pixel samples and the seed for + /// jittered sub-rays. A value larger than one implies + /// anti-aliasing by jittered super-sampling. + /// @throw ValueError if pixelSamples is equal to zero. + void setPixelSamples(size_t pixelSamples, unsigned int seed = 0); + + /// @brief Perform the actual (potentially multithreaded) ray-tracing. + void render(bool threaded = true) const; + + /// @brief Public method required by tbb::parallel_for. + /// @warning Never call it directly. + void operator()(const tbb::blocked_range& range) const; + +private: + const bool mIsMaster; + double* mRand; + IntersectorT mInter; + boost::scoped_ptr mShader; + BaseCamera* mCamera; + size_t mSubPixels; +};// LevelSetRayTracer + + +///////////////////////////////VOLUME RENDER /////////////////////////////////////// + +/// @brief A (very) simple multithreaded volume render specifically for scalar density. +/// @details Included primarily as a reference implementation. +/// @note It will only compile if the IntersectorT is templated on a Grid with a +/// floating-point voxel type. +template +class VolumeRender +{ +public: + + typedef typename IntersectorT::GridType GridType; + typedef typename IntersectorT::RayType RayType; + typedef typename GridType::ValueType ValueType; + typedef typename GridType::ConstAccessor AccessorType; + typedef tools::GridSampler SamplerType; + BOOST_STATIC_ASSERT(boost::is_floating_point::value); + + /// @brief Constructor taking an intersector and a base camera. + VolumeRender(const IntersectorT& inter, BaseCamera& camera); + + /// @brief Copy constructor which creates a thread-safe clone + VolumeRender(const VolumeRender& other); + + /// @brief Perform the actual (potentially multithreaded) volume rendering. + void render(bool threaded=true) const; + + /// @brief Set the camera derived from the abstract BaseCamera class. + void setCamera(BaseCamera& camera) { mCamera = &camera; } + + /// @brief Set the intersector that performs the actual + /// intersection of the rays against the volume. + void setIntersector(const IntersectorT& inter); + + /// @brief Set the vector components of a directional light source + /// @throw ArithmeticError if input is a null vector. + void setLightDir(Real x, Real y, Real z) { mLightDir = Vec3R(x,y,z).unit(); } + + /// @brief Set the color of the directional light source. + void setLightColor(Real r, Real g, Real b) { mLightColor = Vec3R(r,g,b); } + + /// @brief Set the integration step-size in voxel units for the primay ray. + void setPrimaryStep(Real primaryStep) { mPrimaryStep = primaryStep; } + + /// @brief Set the integration step-size in voxel units for the primay ray. + void setShadowStep(Real shadowStep) { mShadowStep = shadowStep; } + + /// @brief Set Scattering coefficients. + void setScattering(Real x, Real y, Real z) { mScattering = Vec3R(x,y,z); } + + /// @brief Set absorption coefficients. + void setAbsorption(Real x, Real y, Real z) { mAbsorption = Vec3R(x,y,z); } + + /// @brief Set parameter that imitates multi-scattering. A value + /// of zero implies no multi-scattering. + void setLightGain(Real gain) { mLightGain = gain; } + + /// @brief Set the cut-off value for density and transmittance. + void setCutOff(Real cutOff) { mCutOff = cutOff; } + + /// @brief Print parameters, statistics, memory usage and other information. + /// @param os a stream to which to write textual information + /// @param verboseLevel 1: print parameters only; 2: include grid + /// statistics; 3: include memory usage + void print(std::ostream& os = std::cout, int verboseLevel = 1); + + /// @brief Public method required by tbb::parallel_for. + /// @warning Never call it directly. + void operator()(const tbb::blocked_range& range) const; + +private: + + AccessorType mAccessor; + BaseCamera* mCamera; + boost::scoped_ptr mPrimary, mShadow; + Real mPrimaryStep, mShadowStep, mCutOff, mLightGain; + Vec3R mLightDir, mLightColor, mAbsorption, mScattering; +};//VolumeRender + +//////////////////////////////////////// FILM //////////////////////////////////////// + +/// @brief A simple class that allows for concurrent writes to pixels in an image, +/// background initialization of the image, and PPM or EXR file output. +class Film +{ +public: + /// @brief Floating-point RGBA components in the range [0, 1]. + /// @details This is our preferred representation for color processing. + struct RGBA + { + typedef float ValueT; + + RGBA() : r(0), g(0), b(0), a(1) {} + explicit RGBA(ValueT intensity) : r(intensity), g(intensity), b(intensity), a(1) {} + RGBA(ValueT _r, ValueT _g, ValueT _b, ValueT _a = static_cast(1.0)): + r(_r), g(_g), b(_b), a(_a) + {} + + RGBA operator* (ValueT scale) const { return RGBA(r*scale, g*scale, b*scale);} + RGBA operator+ (const RGBA& rhs) const { return RGBA(r+rhs.r, g+rhs.g, b+rhs.b);} + RGBA operator* (const RGBA& rhs) const { return RGBA(r*rhs.r, g*rhs.g, b*rhs.b);} + RGBA& operator+=(const RGBA& rhs) { r+=rhs.r; g+=rhs.g; b+=rhs.b, a+=rhs.a; return *this;} + + void over(const RGBA& rhs) + { + const float s = rhs.a*(1.0f-a); + r = a*r+s*rhs.r; + g = a*g+s*rhs.g; + b = a*b+s*rhs.b; + a = a + s; + } + + ValueT r, g, b, a; + }; + + + Film(size_t width, size_t height) + : mWidth(width), mHeight(height), mSize(width*height), mPixels(new RGBA[mSize]) + { + } + Film(size_t width, size_t height, const RGBA& bg) + : mWidth(width), mHeight(height), mSize(width*height), mPixels(new RGBA[mSize]) + { + this->fill(bg); + } + + const RGBA& pixel(size_t w, size_t h) const + { + assert(w < mWidth); + assert(h < mHeight); + return mPixels[w + h*mWidth]; + } + + RGBA& pixel(size_t w, size_t h) + { + assert(w < mWidth); + assert(h < mHeight); + return mPixels[w + h*mWidth]; + } + + void fill(const RGBA& rgb=RGBA(0)) { for (size_t i=0; i buffer(new unsigned char[3*mSize]); + unsigned char *tmp = buffer.get(), *q = tmp; + RGBA* p = mPixels.get(); + size_t n = mSize; + while (n--) { + *q++ = static_cast(255.0f*(*p ).r); + *q++ = static_cast(255.0f*(*p ).g); + *q++ = static_cast(255.0f*(*p++).b); + } + + std::ofstream os(name.c_str(), std::ios_base::binary); + if (!os.is_open()) { + std::cerr << "Error opening PPM file \"" << name << "\"" << std::endl; + return; + } + + os << "P6\n" << mWidth << " " << mHeight << "\n255\n"; + os.write((const char *)&(*tmp), 3*mSize*sizeof(unsigned char)); + } + +#ifdef OPENVDB_TOOLS_RAYTRACER_USE_EXR + void saveEXR(const std::string& fileName, size_t compression = 2, size_t threads = 8) + { + std::string name(fileName); + if (name.find_last_of(".") == std::string::npos) name.append(".exr"); + + if (threads>0) Imf::setGlobalThreadCount(threads); + Imf::Header header(mWidth, mHeight); + if (compression==0) header.compression() = Imf::NO_COMPRESSION; + if (compression==1) header.compression() = Imf::RLE_COMPRESSION; + if (compression>=2) header.compression() = Imf::ZIP_COMPRESSION; + header.channels().insert("R", Imf::Channel(Imf::FLOAT)); + header.channels().insert("G", Imf::Channel(Imf::FLOAT)); + header.channels().insert("B", Imf::Channel(Imf::FLOAT)); + header.channels().insert("A", Imf::Channel(Imf::FLOAT)); + + Imf::FrameBuffer framebuffer; + framebuffer.insert("R", Imf::Slice( Imf::FLOAT, (char *) &(mPixels[0].r), + sizeof (RGBA), sizeof (RGBA) * mWidth)); + framebuffer.insert("G", Imf::Slice( Imf::FLOAT, (char *) &(mPixels[0].g), + sizeof (RGBA), sizeof (RGBA) * mWidth)); + framebuffer.insert("B", Imf::Slice( Imf::FLOAT, (char *) &(mPixels[0].b), + sizeof (RGBA), sizeof (RGBA) * mWidth)); + framebuffer.insert("A", Imf::Slice( Imf::FLOAT, (char *) &(mPixels[0].a), + sizeof (RGBA), sizeof (RGBA) * mWidth)); + + Imf::OutputFile file(name.c_str(), header); + file.setFrameBuffer(framebuffer); + file.writePixels(mHeight); + } +#endif + + size_t width() const { return mWidth; } + size_t height() const { return mHeight; } + size_t numPixels() const { return mSize; } + const RGBA* pixels() const { return mPixels.get(); } + +private: + size_t mWidth, mHeight, mSize; + boost::scoped_array mPixels; +};// Film + + +//////////////////////////////////////// CAMERAS //////////////////////////////////////// + +/// Abstract base class for the perspective and orthographic cameras +class BaseCamera +{ +public: + BaseCamera(Film& film, const Vec3R& rotation, const Vec3R& translation, + double frameWidth, double nearPlane, double farPlane) + : mFilm(&film) + , mScaleWidth(frameWidth) + , mScaleHeight(frameWidth * double(film.height()) / double(film.width())) + { + assert(nearPlane > 0 && farPlane > nearPlane); + mScreenToWorld.accumPostRotation(math::X_AXIS, rotation[0] * M_PI / 180.0); + mScreenToWorld.accumPostRotation(math::Y_AXIS, rotation[1] * M_PI / 180.0); + mScreenToWorld.accumPostRotation(math::Z_AXIS, rotation[2] * M_PI / 180.0); + mScreenToWorld.accumPostTranslation(translation); + this->initRay(nearPlane, farPlane); + } + + virtual ~BaseCamera() {} + + Film::RGBA& pixel(size_t i, size_t j) { return mFilm->pixel(i, j); } + + size_t width() const { return mFilm->width(); } + size_t height() const { return mFilm->height(); } + + /// Rotate the camera so its negative z-axis points at xyz and its + /// y axis is in the plane of the xyz and up vectors. In other + /// words the camera will look at xyz and use up as the + /// horizontal direction. + void lookAt(const Vec3R& xyz, const Vec3R& up = Vec3R(0.0, 1.0, 0.0)) + { + const Vec3R orig = mScreenToWorld.applyMap(Vec3R(0.0)); + const Vec3R dir = orig - xyz; + try { + Mat4d xform = math::aim(dir, up); + xform.postTranslate(orig); + mScreenToWorld = math::AffineMap(xform); + this->initRay(mRay.t0(), mRay.t1()); + } catch (...) {} + } + + Vec3R rasterToScreen(double i, double j, double z) const + { + return Vec3R( (2 * i / double(mFilm->width()) - 1) * mScaleWidth, + (1 - 2 * j / double(mFilm->height())) * mScaleHeight, z ); + } + + /// @brief Return a Ray in world space given the pixel indices and + /// optional offsets in the range [0, 1]. An offset of 0.5 corresponds + /// to the center of the pixel. + virtual math::Ray getRay( + size_t i, size_t j, double iOffset = 0.5, double jOffset = 0.5) const = 0; + +protected: + void initRay(double t0, double t1) + { + mRay.setTimes(t0, t1); + mRay.setEye(mScreenToWorld.applyMap(Vec3R(0.0))); + mRay.setDir(mScreenToWorld.applyJacobian(Vec3R(0.0, 0.0, -1.0))); + } + + Film* mFilm; + double mScaleWidth, mScaleHeight; + math::Ray mRay; + math::AffineMap mScreenToWorld; +};// BaseCamera + + +class PerspectiveCamera: public BaseCamera +{ + public: + /// @brief Constructor + /// @param film film (i.e. image) defining the pixel resolution + /// @param rotation rotation in degrees of the camera in world space + /// (applied in x, y, z order) + /// @param translation translation of the camera in world-space units, + /// applied after rotation + /// @param focalLength focal length of the camera in mm + /// (the default of 50mm corresponds to Houdini's default camera) + /// @param aperture width in mm of the frame, i.e., the visible field + /// (the default 41.2136 mm corresponds to Houdini's default camera) + /// @param nearPlane depth of the near clipping plane in world-space units + /// @param farPlane depth of the far clipping plane in world-space units + /// + /// @details If no rotation or translation is provided, the camera is placed + /// at (0,0,0) in world space and points in the direction of the negative z axis. + PerspectiveCamera(Film& film, + const Vec3R& rotation = Vec3R(0.0), + const Vec3R& translation = Vec3R(0.0), + double focalLength = 50.0, + double aperture = 41.2136, + double nearPlane = 1e-3, + double farPlane = std::numeric_limits::max()) + : BaseCamera(film, rotation, translation, 0.5*aperture/focalLength, nearPlane, farPlane) + { + } + + virtual ~PerspectiveCamera() {} + + /// @brief Return a Ray in world space given the pixel indices and + /// optional offsets in the range [0,1]. An offset of 0.5 corresponds + /// to the center of the pixel. + virtual math::Ray getRay( + size_t i, size_t j, double iOffset = 0.5, double jOffset = 0.5) const + { + math::Ray ray(mRay); + Vec3R dir = BaseCamera::rasterToScreen(Real(i) + iOffset, Real(j) + jOffset, -1.0); + dir = BaseCamera::mScreenToWorld.applyJacobian(dir); + dir.normalize(); + ray.scaleTimes(1.0/dir.dot(ray.dir())); + ray.setDir(dir); + return ray; + } + + /// @brief Return the horizontal field of view in degrees given a + /// focal lenth in mm and the specified aperture in mm. + static double focalLengthToFieldOfView(double length, double aperture) + { + return 360.0 / M_PI * atan(aperture/(2.0*length)); + } + /// @brief Return the focal length in mm given a horizontal field of + /// view in degrees and the specified aperture in mm. + static double fieldOfViewToFocalLength(double fov, double aperture) + { + return aperture/(2.0*(tan(fov * M_PI / 360.0))); + } +};// PerspectiveCamera + + +class OrthographicCamera: public BaseCamera +{ +public: + /// @brief Constructor + /// @param film film (i.e. image) defining the pixel resolution + /// @param rotation rotation in degrees of the camera in world space + /// (applied in x, y, z order) + /// @param translation translation of the camera in world-space units, + /// applied after rotation + /// @param frameWidth width in of the frame in world-space units + /// @param nearPlane depth of the near clipping plane in world-space units + /// @param farPlane depth of the far clipping plane in world-space units + /// + /// @details If no rotation or translation is provided, the camera is placed + /// at (0,0,0) in world space and points in the direction of the negative z axis. + OrthographicCamera(Film& film, + const Vec3R& rotation = Vec3R(0.0), + const Vec3R& translation = Vec3R(0.0), + double frameWidth = 1.0, + double nearPlane = 1e-3, + double farPlane = std::numeric_limits::max()) + : BaseCamera(film, rotation, translation, 0.5*frameWidth, nearPlane, farPlane) + { + } + virtual ~OrthographicCamera() {} + + virtual math::Ray getRay( + size_t i, size_t j, double iOffset = 0.5, double jOffset = 0.5) const + { + math::Ray ray(mRay); + Vec3R eye = BaseCamera::rasterToScreen(Real(i) + iOffset, Real(j) + jOffset, 0.0); + ray.setEye(BaseCamera::mScreenToWorld.applyMap(eye)); + return ray; + } +};// OrthographicCamera + + +//////////////////////////////////////// SHADERS //////////////////////////////////////// + + +/// Abstract base class for the shaders +class BaseShader +{ +public: + typedef math::Ray RayT; + BaseShader() {} + virtual ~BaseShader() {} + /// @brief Defines the interface of the virtual function that returns a RGB color. + /// @param xyz World position of the intersection point. + /// @param nml Normal in world space at the intersection point. + /// @param dir Direction of the ray in world space. + virtual Film::RGBA operator()(const Vec3R& xyz, const Vec3R& nml, const Vec3R& dir) const = 0; + virtual BaseShader* copy() const = 0; +}; + + +/// @brief Shader that produces a simple matte. +/// +/// @details The color can either be constant (if GridT = +/// Film::RGBA which is the default) or defined in a separate Vec3 +/// color grid. Use SamplerType to define the order of interpolation +/// (default is zero order, i.e. closes-point). +template +class MatteShader: public BaseShader +{ +public: + MatteShader(const GridT& grid) : mAcc(grid.getAccessor()), mXform(&grid.transform()) {} + virtual ~MatteShader() {} + virtual Film::RGBA operator()(const Vec3R& xyz, const Vec3R&, const Vec3R&) const + { + typename GridT::ValueType v = zeroVal(); + SamplerType::sample(mAcc, mXform->worldToIndex(xyz), v); + return Film::RGBA( + static_cast(v[0]), + static_cast(v[1]), + static_cast(v[2])); + } + virtual BaseShader* copy() const { return new MatteShader(*this); } + +private: + typename GridT::ConstAccessor mAcc; + const math::Transform* mXform; +}; +// Template specialization using a constant color of the material. +template +class MatteShader: public BaseShader +{ +public: + MatteShader(const Film::RGBA& c = Film::RGBA(1.0f)): mRGBA(c) {} + virtual ~MatteShader() {} + virtual Film::RGBA operator()(const Vec3R&, const Vec3R&, const Vec3R&) const + { + return mRGBA; + } + virtual BaseShader* copy() const { return new MatteShader(*this); } + +private: + const Film::RGBA mRGBA; +}; + + +/// @brief Color shader that treats the surface normal (x, y, z) as an +/// RGB color. +/// +/// @details The color can either be constant (if GridT = +/// Film::RGBA which is the default) or defined in a separate Vec3 +/// color grid. Use SamplerType to define the order of interpolation +/// (default is zero order, i.e. closes-point). +template +class NormalShader: public BaseShader +{ +public: + NormalShader(const GridT& grid) : mAcc(grid.getAccessor()), mXform(&grid.transform()) {} + virtual ~NormalShader() {} + virtual Film::RGBA operator()(const Vec3R& xyz, const Vec3R& normal, const Vec3R&) const + { + typename GridT::ValueType v = zeroVal(); + SamplerType::sample(mAcc, mXform->worldToIndex(xyz), v); + return Film::RGBA(v[0]*(normal[0]+1.0f), v[1]*(normal[1]+1.0f), v[2]*(normal[2]+1.0f)); + } + virtual BaseShader* copy() const { return new NormalShader(*this); } + +private: + typename GridT::ConstAccessor mAcc; + const math::Transform* mXform; +}; +// Template specialization using a constant color of the material. +template +class NormalShader: public BaseShader +{ +public: + NormalShader(const Film::RGBA& c = Film::RGBA(1.0f)) : mRGBA(c*0.5f) {} + virtual ~NormalShader() {} + virtual Film::RGBA operator()(const Vec3R&, const Vec3R& normal, const Vec3R&) const + { + return mRGBA*Film::RGBA(normal[0]+1.0f, normal[1]+1.0f, normal[2]+1.0f); + } + virtual BaseShader* copy() const { return new NormalShader(*this); } + +private: + const Film::RGBA mRGBA; +}; + + +/// @brief Color shader that treats position (x, y, z) as an RGB color in a +/// cube defined from an axis-aligned bounding box in world space. +/// +/// @details The color can either be constant (if GridT = +/// Film::RGBA which is the default) or defined in a separate Vec3 +/// color grid. Use SamplerType to define the order of interpolation +/// (default is zero order, i.e. closes-point). +template +class PositionShader: public BaseShader +{ +public: + PositionShader(const math::BBox& bbox, const GridT& grid) + : mMin(bbox.min()) + , mInvDim(1.0/bbox.extents()) + , mAcc(grid.getAccessor()) + , mXform(&grid.transform()) + { + } + virtual ~PositionShader() {} + virtual Film::RGBA operator()(const Vec3R& xyz, const Vec3R&, const Vec3R&) const + { + typename GridT::ValueType v = zeroVal(); + SamplerType::sample(mAcc, mXform->worldToIndex(xyz), v); + const Vec3R rgb = (xyz - mMin)*mInvDim; + return Film::RGBA(v[0],v[1],v[2]) * Film::RGBA(rgb[0], rgb[1], rgb[2]); + } + virtual BaseShader* copy() const { return new PositionShader(*this); } + +private: + const Vec3R mMin, mInvDim; + typename GridT::ConstAccessor mAcc; + const math::Transform* mXform; +}; +// Template specialization using a constant color of the material. +template +class PositionShader: public BaseShader +{ +public: + PositionShader(const math::BBox& bbox, const Film::RGBA& c = Film::RGBA(1.0f)) + : mMin(bbox.min()), mInvDim(1.0/bbox.extents()), mRGBA(c) {} + virtual ~PositionShader() {} + virtual Film::RGBA operator()(const Vec3R& xyz, const Vec3R&, const Vec3R&) const + { + const Vec3R rgb = (xyz - mMin)*mInvDim; + return mRGBA*Film::RGBA(rgb[0], rgb[1], rgb[2]); + } + virtual BaseShader* copy() const { return new PositionShader(*this); } + +private: + const Vec3R mMin, mInvDim; + const Film::RGBA mRGBA; +}; + +/// @brief Simple diffuse Lambertian surface shader. +/// +/// @details The diffuse color can either be constant (if GridT = +/// Film::RGBA which is the default) or defined in a separate Vec3 +/// color grid. Lambertian implies that the (radiant) intensity is +/// directly proportional to the cosine of the angle between the +/// surface normal and the direction of the light source. Use +/// SamplerType to define the order of interpolation (default is +/// zero order, i.e. closes-point). +template +class DiffuseShader: public BaseShader +{ +public: + DiffuseShader(const GridT& grid): mAcc(grid.getAccessor()), mXform(&grid.transform()) {} + virtual ~DiffuseShader() {} + virtual Film::RGBA operator()(const Vec3R& xyz, const Vec3R& normal, const Vec3R& rayDir) const + { + typename GridT::ValueType v = zeroVal(); + SamplerType::sample(mAcc, mXform->worldToIndex(xyz), v); + // We take the abs of the dot product corresponding to having + // light sources at +/- rayDir, i.e., two-sided shading. + return Film::RGBA(v[0],v[1],v[2]) * math::Abs(normal.dot(rayDir)); + } + virtual BaseShader* copy() const { return new DiffuseShader(*this); } + +private: + typename GridT::ConstAccessor mAcc; + const math::Transform* mXform; +}; +// Template specialization using a constant color of the material. +template +class DiffuseShader: public BaseShader +{ +public: + DiffuseShader(const Film::RGBA& d = Film::RGBA(1.0f)): mRGBA(d) {} + virtual ~DiffuseShader() {} + virtual Film::RGBA operator()(const Vec3R&, const Vec3R& normal, const Vec3R& rayDir) const + { + // We assume a single directional light source at the camera, + // so the cosine of the angle between the surface normal and the + // direction of the light source becomes the dot product of the + // surface normal and inverse direction of the ray. We also ignore + // negative dot products, corresponding to strict one-sided shading. + //return mRGBA * math::Max(0.0, normal.dot(-rayDir)); + + // We take the abs of the dot product corresponding to having + // light sources at +/- rayDir, i.e., two-sided shading. + return mRGBA * math::Abs(normal.dot(rayDir)); + } + virtual BaseShader* copy() const { return new DiffuseShader(*this); } + +private: + const Film::RGBA mRGBA; +}; + +//////////////////////////////////////// RAYTRACER //////////////////////////////////////// + +template +inline void rayTrace(const GridT& grid, + const BaseShader& shader, + BaseCamera& camera, + size_t pixelSamples, + unsigned int seed, + bool threaded) +{ + LevelSetRayTracer > + tracer(grid, shader, camera, pixelSamples, seed); + tracer.render(threaded); +} + + +template +inline void rayTrace(const GridT&, + const IntersectorT& inter, + const BaseShader& shader, + BaseCamera& camera, + size_t pixelSamples, + unsigned int seed, + bool threaded) +{ + LevelSetRayTracer tracer(inter, shader, camera, pixelSamples, seed); + tracer.render(threaded); +} + + +//////////////////////////////////////// LevelSetRayTracer //////////////////////////////////////// + + +template +inline LevelSetRayTracer:: +LevelSetRayTracer(const GridT& grid, + const BaseShader& shader, + BaseCamera& camera, + size_t pixelSamples, + unsigned int seed) + : mIsMaster(true), + mRand(NULL), + mInter(grid), + mShader(shader.copy()), + mCamera(&camera) +{ + this->setPixelSamples(pixelSamples, seed); +} + +template +inline LevelSetRayTracer:: +LevelSetRayTracer(const IntersectorT& inter, + const BaseShader& shader, + BaseCamera& camera, + size_t pixelSamples, + unsigned int seed) + : mIsMaster(true), + mRand(NULL), + mInter(inter), + mShader(shader.copy()), + mCamera(&camera) +{ + this->setPixelSamples(pixelSamples, seed); +} + +template +inline LevelSetRayTracer:: +LevelSetRayTracer(const LevelSetRayTracer& other) : + mIsMaster(false), + mRand(other.mRand), + mInter(other.mInter), + mShader(other.mShader->copy()), + mCamera(other.mCamera), + mSubPixels(other.mSubPixels) +{ +} + +template +inline LevelSetRayTracer:: +~LevelSetRayTracer() +{ + if (mIsMaster) delete [] mRand; +} + +template +inline void LevelSetRayTracer:: +setGrid(const GridT& grid) +{ + assert(mIsMaster); + mInter = IntersectorT(grid); +} + +template +inline void LevelSetRayTracer:: +setIntersector(const IntersectorT& inter) +{ + assert(mIsMaster); + mInter = inter; +} + +template +inline void LevelSetRayTracer:: +setShader(const BaseShader& shader) +{ + assert(mIsMaster); + mShader.reset(shader.copy()); +} + +template +inline void LevelSetRayTracer:: +setCamera(BaseCamera& camera) +{ + assert(mIsMaster); + mCamera = &camera; +} + +template +inline void LevelSetRayTracer:: +setPixelSamples(size_t pixelSamples, unsigned int seed) +{ + assert(mIsMaster); + if (pixelSamples == 0) { + OPENVDB_THROW(ValueError, "pixelSamples must be larger than zero!"); + } + mSubPixels = pixelSamples - 1; + delete [] mRand; + if (mSubPixels > 0) { + mRand = new double[16]; + math::Rand01 rand(seed);//offsets for anti-aliaing by jittered super-sampling + for (size_t i=0; i<16; ++i) mRand[i] = rand(); + } else { + mRand = NULL; + } +} + +template +inline void LevelSetRayTracer:: +render(bool threaded) const +{ + tbb::blocked_range range(0, mCamera->height()); + threaded ? tbb::parallel_for(range, *this) : (*this)(range); +} + +template +inline void LevelSetRayTracer:: +operator()(const tbb::blocked_range& range) const +{ + const BaseShader& shader = *mShader; + Vec3Type xyz, nml; + const float frac = 1.0f / (1.0f + mSubPixels); + for (size_t j=range.begin(), n=0, je = range.end(); jwidth(); ipixel(i,j); + RayType ray = mCamera->getRay(i, j);//primary ray + Film::RGBA c = mInter.intersectsWS(ray, xyz, nml) ? shader(xyz, nml, ray.dir()) : bg; + for (size_t k=0; kgetRay(i, j, mRand[n & 15], mRand[(n+1) & 15]); + c += mInter.intersectsWS(ray, xyz, nml) ? shader(xyz, nml, ray.dir()) : bg; + }//loop over sub-pixels + bg = c*frac; + }//loop over image height + }//loop over image width +} + +//////////////////////////////////////// VolumeRender //////////////////////////////////////// + +template +inline VolumeRender:: +VolumeRender(const IntersectorT& inter, BaseCamera& camera) + : mAccessor(inter.grid().getConstAccessor()) + , mCamera(&camera) + , mPrimary(new IntersectorT(inter)) + , mShadow(new IntersectorT(inter)) + , mPrimaryStep(1.0) + , mShadowStep(3.0) + , mCutOff(0.005) + , mLightGain(0.2) + , mLightDir(Vec3R(0.3, 0.3, 0).unit()) + , mLightColor(0.7, 0.7, 0.7) + , mAbsorption(0.1) + , mScattering(1.5) +{ +} + +template +inline VolumeRender:: +VolumeRender(const VolumeRender& other) + : mAccessor(other.mAccessor) + , mCamera(other.mCamera) + , mPrimary(new IntersectorT(*(other.mPrimary))) + , mShadow(new IntersectorT(*(other.mShadow))) + , mPrimaryStep(other.mPrimaryStep) + , mShadowStep(other.mShadowStep) + , mCutOff(other.mCutOff) + , mLightGain(other.mLightGain) + , mLightDir(other.mLightDir) + , mLightColor(other.mLightColor) + , mAbsorption(other.mAbsorption) + , mScattering(other.mScattering) +{ +} + +template +inline void VolumeRender:: +print(std::ostream& os, int verboseLevel) +{ + if (verboseLevel>0) { + os << "\nPrimary step: " << mPrimaryStep + << "\nShadow step: " << mShadowStep + << "\nCutoff: " << mCutOff + << "\nLightGain: " << mLightGain + << "\nLightDir: " << mLightDir + << "\nLightColor: " << mLightColor + << "\nAbsorption: " << mAbsorption + << "\nScattering: " << mScattering << std::endl; + } + mPrimary->print(os, verboseLevel); +} + +template +inline void VolumeRender:: +setIntersector(const IntersectorT& inter) +{ + mPrimary.reset(new IntersectorT(inter)); + mShadow.reset( new IntersectorT(inter)); +} + +template +inline void VolumeRender:: +render(bool threaded) const +{ + tbb::blocked_range range(0, mCamera->height()); + threaded ? tbb::parallel_for(range, *this) : (*this)(range); +} + +template +inline void VolumeRender:: +operator()(const tbb::blocked_range& range) const +{ + SamplerType sampler(mAccessor, mShadow->grid().transform());//light-weight wrapper + + // Any variable prefixed with p (or s) means it's associated with a primary (or shadow) ray + const Vec3R extinction = -mScattering-mAbsorption, One(1.0); + const Vec3R albedo = mLightColor*mScattering/(mScattering+mAbsorption);//single scattering + const Real sGain = mLightGain;//in-scattering along shadow ray + const Real pStep = mPrimaryStep;//Integration step along primary ray in voxel units + const Real sStep = mShadowStep;//Integration step along shadow ray in voxel units + const Real cutoff = mCutOff;//Cutoff for density and transmittance + + // For the sake of completeness we show how to use two different + // methods (hits/march) in VolumeRayIntersector that produce + // segments along the ray that intersects active values. Comment out + // the line below to use VolumeRayIntersector::march instead of + // VolumeRayIntersector::hits. +#define USE_HITS +#ifdef USE_HITS + std::vector pTS, sTS; + //std::deque pTS, sTS; +#endif + + RayType sRay(Vec3R(0), mLightDir);//Shadow ray + for (size_t j=range.begin(), je = range.end(); jwidth(); ipixel(i, j); + bg.a = bg.r = bg.g = bg.b = 0; + RayType pRay = mCamera->getRay(i, j);// Primary ray + if( !mPrimary->setWorldRay(pRay)) continue; + Vec3R pTrans(1.0), pLumi(0.0); +#ifndef USE_HITS + Real pT0, pT1; + while (mPrimary->march(pT0, pT1)) { + for (Real pT = pStep*ceil(pT0/pStep); pT <= pT1; pT += pStep) { +#else + mPrimary->hits(pTS); + for (size_t k=0; kgetWorldPos(pT); + const Real density = sampler.wsSample(pPos); + if (density < cutoff) continue; + const Vec3R dT = math::Exp(extinction * density * pStep); + Vec3R sTrans(1.0); + sRay.setEye(pPos); + if( !mShadow->setWorldRay(sRay)) continue; +#ifndef USE_HITS + Real sT0, sT1; + while (mShadow->march(sT0, sT1)) { + for (Real sT = sStep*ceil(sT0/sStep); sT <= sT1; sT+= sStep) { +#else + mShadow->hits(sTS); + for (size_t l=0; lgetWorldPos(sT)); + if (d < cutoff) continue; + sTrans *= math::Exp(extinction * d * sStep/(1.0+sT*sGain)); + if (sTrans.lengthSqr()(pLumi[0]); + bg.g = static_cast(pLumi[1]); + bg.b = static_cast(pLumi[2]); + bg.a = static_cast(1.0f - pTrans.sum()/3.0f); + }//Horizontal pixel scan + }//Vertical pixel scan +} + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_RAYTRACER_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/SignedFloodFill.h b/nuparu/include/openvdb/include/openvdb/tools/SignedFloodFill.h new file mode 100644 index 00000000..d75ba1d9 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/SignedFloodFill.h @@ -0,0 +1,311 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file SignedFloodFill.h +/// +/// @brief Propagates the sign of distance values from the active +/// voxels in the narrow band to the inactive values outside the +/// narrow band. +/// +/// @author Ken Museth + +#ifndef OPENVDB_TOOLS_SIGNEDFLOODFILL_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_SIGNEDFLOODFILL_HAS_BEEN_INCLUDED + +#include +#include // for math::negative +#include // for Index typedef +#include +#include +#include + +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief Set the values of all inactive voxels and tiles of a narrow-band +/// level set from the signs of the active voxels, setting outside values to +/// +background and inside values to -background. +/// +/// @warning This method should only be used on closed, symmetric narrow-band level sets. +/// +/// @note If a LeafManager is used the cached leaf nodes are reused, +/// resulting in slightly better overall performance. +/// +/// @param tree Tree or LeafManager that will be flood filled. +/// @param threaded enable or disable threading (threading is enabled by default) +/// @param grainSize used to control the threading granularity (default is 1) +/// @param minLevel Specify the lowest tree level to process (leafnode level = 0) +/// +/// @throw TypeError if the ValueType of @a tree is not floating-point. +template +inline void +signedFloodFill(TreeOrLeafManagerT& tree, bool threaded = true, + size_t grainSize = 1, Index minLevel = 0); + + +/// @brief Set the values of all inactive voxels and tiles of a narrow-band +/// level set from the signs of the active voxels, setting exterior values to +/// @a outsideWidth and interior values to @a insideWidth. Set the background value +/// of this tree to @a outsideWidth. +/// +/// @warning This method should only be used on closed, narrow-band level sets. +/// +/// @note If a LeafManager is used the cached leaf nodes are reused +/// resulting in slightly better overall performance. +/// +/// @param tree Tree or LeafManager that will be flood filled +/// @param outsideWidth the width of the outside of the narrow band +/// @param insideWidth the width of the inside of the narrow band +/// @param threaded enable or disable threading (threading is enabled by default) +/// @param grainSize used to control the threading granularity (default is 1) +/// @param minLevel Specify the lowest tree level to process (leafnode level = 0) +/// +/// @throw TypeError if the ValueType of @a tree is not floating-point. +template +inline void +signedFloodFillWithValues( + TreeOrLeafManagerT& tree, + const typename TreeOrLeafManagerT::ValueType& outsideWidth, + const typename TreeOrLeafManagerT::ValueType& insideWidth, + bool threaded = true, + size_t grainSize = 1, + Index minLevel = 0); + + +////////////////////////// Implementation of SignedFloodFill //////////////////////////// + + +template +class SignedFloodFillOp +{ +public: + typedef typename TreeOrLeafManagerT::ValueType ValueT; + typedef typename TreeOrLeafManagerT::RootNodeType RootT; + typedef typename TreeOrLeafManagerT::LeafNodeType LeafT; + BOOST_STATIC_ASSERT(boost::is_floating_point::value || boost::is_signed::value); + + SignedFloodFillOp(const TreeOrLeafManagerT& tree, Index minLevel = 0) + : mOutside(ValueT(math::Abs(tree.background()))) + , mInside(ValueT(math::negative(mOutside))) + , mMinLevel(minLevel) + { + } + + SignedFloodFillOp(ValueT outsideValue, ValueT insideValue, Index minLevel = 0) + : mOutside(ValueT(math::Abs(outsideValue))) + , mInside(ValueT(math::negative(math::Abs(insideValue)))) + , mMinLevel(minLevel) + { + } + + // Nothing to do at the leaf node level + void operator()(LeafT& leaf) const + { + if (LeafT::LEVEL < mMinLevel) return; + +#ifndef OPENVDB_2_ABI_COMPATIBLE + if (!leaf.allocate()) return;//this assures that the buffer is allocated and in-memory +#endif + const typename LeafT::NodeMaskType& valueMask = leaf.getValueMask(); + // WARNING: "Never do what you're about to see at home, we're what you call experts!" + typename LeafT::ValueType* buffer = + const_cast(&(leaf.getFirstValue())); + + const Index first = valueMask.findFirstOn(); + if (first < LeafT::SIZE) { + bool xInside = buffer[first]<0, yInside = xInside, zInside = xInside; + for (Index x = 0; x != (1 << LeafT::LOG2DIM); ++x) { + const Index x00 = x << (2 * LeafT::LOG2DIM); + if (valueMask.isOn(x00)) xInside = buffer[x00] < 0; // element(x, 0, 0) + yInside = xInside; + for (Index y = 0; y != (1 << LeafT::LOG2DIM); ++y) { + const Index xy0 = x00 + (y << LeafT::LOG2DIM); + if (valueMask.isOn(xy0)) yInside = buffer[xy0] < 0; // element(x, y, 0) + zInside = yInside; + for (Index z = 0; z != (1 << LeafT::LOG2DIM); ++z) { + const Index xyz = xy0 + z; // element(x, y, z) + if (valueMask.isOn(xyz)) { + zInside = buffer[xyz] < 0; + } else { + buffer[xyz] = zInside ? mInside : mOutside; + } + } + } + } + } else {// if no active voxels exist simply use the sign of the first value + leaf.fill(buffer[0] < 0 ? mInside : mOutside); + } + } + + // Prune the child nodes of the internal nodes + template + void operator()(NodeT& node) const + { + if (NodeT::LEVEL < mMinLevel) return; + // We assume the child nodes have already been flood filled! + const typename NodeT::NodeMaskType& childMask = node.getChildMask(); + // WARNING: "Never do what you're about to see at home, we're what you call experts!" + typename NodeT::UnionType* table = const_cast(node.getTable()); + + const Index first = childMask.findFirstOn(); + if (first < NodeT::NUM_VALUES) { + bool xInside = table[first].getChild()->getFirstValue()<0; + bool yInside = xInside, zInside = xInside; + for (Index x = 0; x != (1 << NodeT::LOG2DIM); ++x) { + const int x00 = x << (2 * NodeT::LOG2DIM); // offset for block(x, 0, 0) + if (childMask.isOn(x00)) xInside = table[x00].getChild()->getLastValue()<0; + yInside = xInside; + for (Index y = 0; y != (1 << NodeT::LOG2DIM); ++y) { + const Index xy0 = x00 + (y << NodeT::LOG2DIM); // offset for block(x, y, 0) + if (childMask.isOn(xy0)) yInside = table[xy0].getChild()->getLastValue()<0; + zInside = yInside; + for (Index z = 0; z != (1 << NodeT::LOG2DIM); ++z) { + const Index xyz = xy0 + z; // offset for block(x, y, z) + if (childMask.isOn(xyz)) { + zInside = table[xyz].getChild()->getLastValue()<0; + } else { + table[xyz].setValue(zInside ? mInside : mOutside); + } + } + } + } + } else {//no child nodes exist simply use the sign of the first tile value. + const ValueT v = table[0].getValue()<0 ? mInside : mOutside; + for (Index i = 0; i < NodeT::NUM_VALUES; ++i) table[i].setValue(v); + } + } + + // Prune the child nodes of the root node + void operator()(RootT& root) const + { + if (RootT::LEVEL < mMinLevel) return; + typedef typename RootT::ChildNodeType ChildT; + // Insert the child nodes into a map sorted according to their origin + std::map nodeKeys; + typename RootT::ChildOnIter it = root.beginChildOn(); + for (; it; ++it) nodeKeys.insert(std::pair(it.getCoord(), &(*it))); + static const Index DIM = RootT::ChildNodeType::DIM; + + // We employ a simple z-scanline algorithm that inserts inactive tiles with + // the inside value if they are sandwiched between inside child nodes only! + typename std::map::const_iterator b = nodeKeys.begin(), e = nodeKeys.end(); + if ( b == e ) return; + for (typename std::map::const_iterator a = b++; b != e; ++a, ++b) { + Coord d = b->first - a->first; // delta of neighboring coordinates + if (d[0]!=0 || d[1]!=0 || d[2]==Int32(DIM)) continue;// not same z-scanline or neighbors + const ValueT fill[] = { a->second->getLastValue(), b->second->getFirstValue() }; + if (!(fill[0] < 0) || !(fill[1] < 0)) continue; // scanline isn't inside + Coord c = a->first + Coord(0u, 0u, DIM); + for (; c[2] != b->first[2]; c[2] += DIM) root.addTile(c, mInside, false); + } + root.setBackground(mOutside, /*updateChildNodes=*/false); + } + +private: + const ValueT mOutside, mInside; + const Index mMinLevel; +};// SignedFloodFillOp + + +template +inline +typename boost::enable_if_c< + boost::is_floating_point::value || + boost::is_signed::value, void>::type +doSignedFloodFill(TreeOrLeafManagerT& tree, + typename TreeOrLeafManagerT::ValueType outsideValue, + typename TreeOrLeafManagerT::ValueType insideValue, + bool threaded, + size_t grainSize, + Index minLevel) +{ + tree::NodeManager nodes(tree); + SignedFloodFillOp op(outsideValue, insideValue, minLevel); + nodes.foreachBottomUp(op, threaded, grainSize); +} + +// Dummy (no-op) implementation for non-float types +template +inline +typename boost::disable_if_c< + boost::is_floating_point::value || + boost::is_signed::value, void>::type +doSignedFloodFill(TreeOrLeafManagerT&, + const typename TreeOrLeafManagerT::ValueType&, + const typename TreeOrLeafManagerT::ValueType&, + bool, + size_t, + Index) +{ + OPENVDB_THROW(TypeError, + "signedFloodFill is supported only for signed value grids"); +} + + +// If the narrow-band is symmetric and unchanged +template +inline void +signedFloodFillWithValues( + TreeOrLeafManagerT& tree, + const typename TreeOrLeafManagerT::ValueType& outsideValue, + const typename TreeOrLeafManagerT::ValueType& insideValue, + bool threaded, + size_t grainSize, + Index minLevel) +{ + doSignedFloodFill(tree, outsideValue, insideValue, threaded, grainSize, minLevel); +} + + +template +inline void +signedFloodFill(TreeOrLeafManagerT& tree, + bool threaded, + size_t grainSize, + Index minLevel) +{ + const typename TreeOrLeafManagerT::ValueType v = tree.root().background(); + doSignedFloodFill(tree, v, math::negative(v), threaded, grainSize, minLevel); +} + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_RESETBACKGROUND_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/Statistics.h b/nuparu/include/openvdb/include/openvdb/tools/Statistics.h new file mode 100644 index 00000000..f979c4af --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/Statistics.h @@ -0,0 +1,438 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file Statistics.h +/// +/// @brief Functions to efficiently compute histograms, extremas +/// (min/max) and statistics (mean, variance, etc.) of grid values + +#ifndef OPENVDB_TOOLS_STATISTICS_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_STATISTICS_HAS_BEEN_INCLUDED + +#include +#include +#include +#include "ValueTransformer.h" + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief Iterate over a scalar grid and compute a histogram of the values +/// of the voxels that are visited, or iterate over a vector-valued grid +/// and compute a histogram of the magnitudes of the vectors. +/// @param iter an iterator over the values of a grid or its tree +/// (@c Grid::ValueOnCIter, @c Tree::ValueOffIter, etc.) +/// @param minVal the smallest value that can be added to the histogram +/// @param maxVal the largest value that can be added to the histogram +/// @param numBins the number of histogram bins +/// @param threaded if true, iterate over the grid in parallel +template +inline math::Histogram +histogram(const IterT& iter, double minVal, double maxVal, + size_t numBins = 10, bool threaded = true); + +/// @brief Iterate over a scalar grid and compute extrema (min/max) of the +/// values of the voxels that are visited, or iterate over a vector-valued grid +/// and compute extrema of the magnitudes of the vectors. +/// @param iter an iterator over the values of a grid or its tree +/// (@c Grid::ValueOnCIter, @c Tree::ValueOffIter, etc.) +/// @param threaded if true, iterate over the grid in parallel +template +inline math::Extrema +extrema(const IterT& iter, bool threaded = true); + +/// @brief Iterate over a scalar grid and compute statistics (mean, variance, etc.) +/// of the values of the voxels that are visited, or iterate over a vector-valued grid +/// and compute statistics of the magnitudes of the vectors. +/// @param iter an iterator over the values of a grid or its tree +/// (@c Grid::ValueOnCIter, @c Tree::ValueOffIter, etc.) +/// @param threaded if true, iterate over the grid in parallel +template +inline math::Stats +statistics(const IterT& iter, bool threaded = true); + +/// @brief Iterate over a grid and compute extrema (min/max) of +/// the values produced by applying the given functor at each voxel that is visited. +/// @param iter an iterator over the values of a grid or its tree +/// (@c Grid::ValueOnCIter, @c Tree::ValueOffIter, etc.) +/// @param op a functor of the form void op(const IterT&, math::Stats&), +/// where @c IterT is the type of @a iter, that inserts zero or more +/// floating-point values into the provided @c math::Stats object +/// @param threaded if true, iterate over the grid in parallel +/// @note When @a threaded is true, each thread gets its own copy of the functor. +/// +/// @par Example: +/// Compute statistics of just the active and positive-valued voxels of a scalar, +/// floating-point grid. +/// @code +/// struct Local { +/// static inline +/// void addIfPositive(const FloatGrid::ValueOnCIter& iter, math::Extrema& ex) +/// { +/// const float f = *iter; +/// if (f > 0.0) { +/// if (iter.isVoxelValue()) ex.add(f); +/// else ex.add(f, iter.getVoxelCount()); +/// } +/// } +/// }; +/// FloatGrid grid = ...; +/// math::Extrema stats = +/// tools::extrema(grid.cbeginValueOn(), Local::addIfPositive, /*threaded=*/true); +/// @endcode +template +inline math::Extrema +extrema(const IterT& iter, const ValueOp& op, bool threaded); + +/// @brief Iterate over a grid and compute statistics (mean, variance, etc.) of +/// the values produced by applying the given functor at each voxel that is visited. +/// @param iter an iterator over the values of a grid or its tree +/// (@c Grid::ValueOnCIter, @c Tree::ValueOffIter, etc.) +/// @param op a functor of the form void op(const IterT&, math::Stats&), +/// where @c IterT is the type of @a iter, that inserts zero or more +/// floating-point values into the provided @c math::Stats object +/// @param threaded if true, iterate over the grid in parallel +/// @note When @a threaded is true, each thread gets its own copy of the functor. +/// +/// @par Example: +/// Compute statistics of just the active and positive-valued voxels of a scalar, +/// floating-point grid. +/// @code +/// struct Local { +/// static inline +/// void addIfPositive(const FloatGrid::ValueOnCIter& iter, math::Stats& stats) +/// { +/// const float f = *iter; +/// if (f > 0.0) { +/// if (iter.isVoxelValue()) stats.add(f); +/// else stats.add(f, iter.getVoxelCount()); +/// } +/// } +/// }; +/// FloatGrid grid = ...; +/// math::Stats stats = +/// tools::statistics(grid.cbeginValueOn(), Local::addIfPositive, /*threaded=*/true); +/// @endcode +template +inline math::Stats +statistics(const IterT& iter, const ValueOp& op, bool threaded); + + +/// @brief Iterate over a grid and compute statistics (mean, variance, etc.) +/// of the values produced by applying a given operator (see math/Operators.h) +/// at each voxel that is visited. +/// @param iter an iterator over the values of a grid or its tree +/// (@c Grid::ValueOnCIter, @c Tree::ValueOffIter, etc.) +/// @param op an operator object with a method of the form +/// double result(Accessor&, const Coord&) +/// @param threaded if true, iterate over the grid in parallel +/// @note World-space operators, whose @c result() methods are of the form +/// double result(const Map&, Accessor&, const Coord&), must be wrapped +/// in a math::MapAdapter. +/// @note Vector-valued operators like math::Gradient must be wrapped in an adapter +/// such as math::OpMagnitude. +/// +/// @par Example: +/// Compute statistics of the magnitude of the gradient at the active voxels of +/// a scalar, floating-point grid. (Note the use of the math::MapAdapter and +/// math::OpMagnitude adapters.) +/// @code +/// FloatGrid grid = ...; +/// +/// // Assume that we know that the grid has a uniform scale map. +/// typedef math::UniformScaleMap MapType; +/// // Specify a world-space gradient operator that uses first-order differencing. +/// typedef math::Gradient GradientOp; +/// // Wrap the operator with an adapter that computes the magnitude of the gradient. +/// typedef math::OpMagnitude MagnitudeOp; +/// // Wrap the operator with an adapter that associates a map with it. +/// typedef math::MapAdapter CompoundOp; +/// +/// if (MapType::Ptr map = grid.constTransform().constMap()) { +/// math::Stats stats = tools::opStatistics(grid.cbeginValueOn(), CompoundOp(*map)); +/// } +/// @endcode +/// +/// @par Example: +/// Compute statistics of the divergence at the active voxels of a vector-valued grid. +/// @code +/// Vec3SGrid grid = ...; +/// +/// // Assume that we know that the grid has a uniform scale map. +/// typedef math::UniformScaleMap MapType; +/// // Specify a world-space divergence operator that uses first-order differencing. +/// typedef math::Divergence DivergenceOp; +/// // Wrap the operator with an adapter that associates a map with it. +/// typedef math::MapAdapter CompoundOp; +/// +/// if (MapType::Ptr map = grid.constTransform().constMap()) { +/// math::Stats stats = tools::opStatistics(grid.cbeginValueOn(), CompoundOp(*map)); +/// } +/// @endcode +/// +/// @par Example: +/// As above, but computing the divergence in index space. +/// @code +/// Vec3SGrid grid = ...; +/// +/// // Specify an index-space divergence operator that uses first-order differencing. +/// typedef math::ISDivergence DivergenceOp; +/// +/// math::Stats stats = tools::opStatistics(grid.cbeginValueOn(), DivergenceOp()); +/// @endcode +template +inline math::Stats +opStatistics(const IterT& iter, const OperatorT& op = OperatorT(), bool threaded = true); + +/// @brief Same as opStatistics except it returns a math::Extrema vs a math::Stats +template +inline math::Extrema +opExtrema(const IterT& iter, const OperatorT& op = OperatorT(), bool threaded = true); + +//////////////////////////////////////// + + +namespace stats_internal { + +/// @todo This traits class is needed because tree::TreeValueIteratorBase uses +/// the name ValueT for the type of the value to which the iterator points, +/// whereas node-level iterators use the name ValueType. +template +struct IterTraits { + typedef typename IterT::ValueType ValueType; +}; + +template +struct IterTraits > { + typedef typename tree::TreeValueIteratorBase::ValueT ValueType; +}; + + +// Helper class to compute a scalar value from either a scalar or a vector value +// (the latter by computing the vector's magnitude) +template struct GetValImpl; + +template +struct GetValImpl { + static inline double get(const T& val) { return double(val); } +}; + +template +struct GetValImpl { + static inline double get(const T& val) { return val.length(); } +}; + + +// Helper class to compute a scalar value from a tree or node iterator +// that points to a value in either a scalar or a vector grid, and to +// add that value to a math::Stats object. +template +struct GetVal +{ + typedef typename IterTraits::ValueType ValueT; + typedef GetValImpl::IsVec> ImplT; + + inline void operator()(const IterT& iter, StatsT& stats) const { + if (iter.isVoxelValue()) stats.add(ImplT::get(*iter)); + else stats.add(ImplT::get(*iter), iter.getVoxelCount()); + } +}; + +// Helper class to accumulate scalar voxel values or vector voxel magnitudes +// into a math::Stats object +template +struct StatsOp +{ + StatsOp(const ValueOp& op): getValue(op) {} + + // Accumulate voxel and tile values into this functor's Stats object. + inline void operator()(const IterT& iter) { getValue(iter, stats); } + + // Accumulate another functor's Stats object into this functor's. + inline void join(StatsOp& other) { stats.add(other.stats); } + + StatsT stats; + ValueOp getValue; +}; + + +// Helper class to accumulate scalar voxel values or vector voxel magnitudes +// into a math::Histogram object +template +struct HistOp +{ + HistOp(const ValueOp& op, double vmin, double vmax, size_t bins): + hist(vmin, vmax, bins), getValue(op) + {} + + // Accumulate voxel and tile values into this functor's Histogram object. + inline void operator()(const IterT& iter) { getValue(iter, hist); } + + // Accumulate another functor's Histogram object into this functor's. + inline void join(HistOp& other) { hist.add(other.hist); } + + math::Histogram hist; + ValueOp getValue; +}; + + +// Helper class to apply an operator such as math::Gradient or math::Laplacian +// to voxels and accumulate the scalar results or the magnitudes of vector results +// into a math::Stats object +template +struct MathOp +{ + typedef typename IterT::TreeT TreeT; + typedef typename TreeT::ValueType ValueT; + typedef typename tree::ValueAccessor ConstAccessor; + + // Each thread gets its own accessor and its own copy of the operator. + ConstAccessor mAcc; + OpT mOp; + StatsT mStats; + + template + static inline TreeT* THROW_IF_NULL(TreeT* ptr) { + if (ptr == NULL) OPENVDB_THROW(ValueError, "iterator references a null tree"); + return ptr; + } + + MathOp(const IterT& iter, const OpT& op): + mAcc(*THROW_IF_NULL(iter.getTree())), mOp(op) + {} + + // Accumulate voxel and tile values into this functor's Stats object. + void operator()(const IterT& it) + { + if (it.isVoxelValue()) { + // Add the magnitude of the gradient at a single voxel. + mStats.add(mOp.result(mAcc, it.getCoord())); + } else { + // Iterate over the voxels enclosed by a tile and add the results + // of applying the operator at each voxel. + /// @todo This could be specialized to be done more efficiently for some operators. + /// For example, all voxels in the interior of a tile (i.e., not on the borders) + /// have gradient zero, so there's no need to apply the operator to every voxel. + CoordBBox bbox = it.getBoundingBox(); + Coord xyz; + int &x = xyz.x(), &y = xyz.y(), &z = xyz.z(); + for (x = bbox.min().x(); x <= bbox.max().x(); ++x) { + for (y = bbox.min().y(); y <= bbox.max().y(); ++y) { + for (z = bbox.min().z(); z <= bbox.max().z(); ++z) { + mStats.add(mOp.result(mAcc, it.getCoord())); + } + } + } + } + } + + // Accumulate another functor's Stats object into this functor's. + inline void join(MathOp& other) { mStats.add(other.mStats); } +}; // struct MathOp + +} // namespace stats_internal + + +template +inline math::Histogram +histogram(const IterT& iter, double vmin, double vmax, size_t numBins, bool threaded) +{ + typedef stats_internal::GetVal ValueOp; + ValueOp valOp; + stats_internal::HistOp op(valOp, vmin, vmax, numBins); + tools::accumulate(iter, op, threaded); + return op.hist; +} + +template +inline math::Extrema +extrema(const IterT& iter, bool threaded) +{ + stats_internal::GetVal valOp; + return extrema(iter, valOp, threaded); +} + +template +inline math::Stats +statistics(const IterT& iter, bool threaded) +{ + stats_internal::GetVal valOp; + return statistics(iter, valOp, threaded); +} + +template +inline math::Extrema +extrema(const IterT& iter, const ValueOp& valOp, bool threaded) +{ + stats_internal::StatsOp op(valOp); + tools::accumulate(iter, op, threaded); + return op.stats; +} + +template +inline math::Stats +statistics(const IterT& iter, const ValueOp& valOp, bool threaded) +{ + stats_internal::StatsOp op(valOp); + tools::accumulate(iter, op, threaded); + return op.stats; +} + + +template +inline math::Extrema +opExtrema(const IterT& iter, const OperatorT& op, bool threaded) +{ + stats_internal::MathOp func(iter, op); + tools::accumulate(iter, func, threaded); + return func.mStats; +} + +template +inline math::Stats +opStatistics(const IterT& iter, const OperatorT& op, bool threaded) +{ + stats_internal::MathOp func(iter, op); + tools::accumulate(iter, func, threaded); + return func.mStats; +} + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_STATISTICS_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/TopologyToLevelSet.h b/nuparu/include/openvdb/include/openvdb/tools/TopologyToLevelSet.h new file mode 100644 index 00000000..1ae83f7a --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/TopologyToLevelSet.h @@ -0,0 +1,284 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file TopologyToLevelSet.h +/// +/// @brief This tool converts active grid topology to a into a signed +/// distance field encoded as a narrow band level set. +/// +/// @details The boundary between active and inactive voxels is treated +/// as the zero crossing for the level set. +/// +/// @par Example: +/// Combine with @c tools::createPointMaskGrid for fast point cloud to level set conversion. +/// +/// @author D.J. Hill + +#ifndef OPENVDB_TOOLS_TOPOLOGY_TO_LEVELSET_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_TOPOLOGY_TO_LEVELSET_HAS_BEEN_INCLUDED + +#include "LevelSetFilter.h" +#include "Morphology.h" // for {dilate|erode}Voxels +#include "Prune.h"// for pruneInactive +#include "SignedFloodFill.h" // for signedFloodFill + +#include +#include +#include // for math::BiasedGradientScheme +#include + +#include +#include + +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + + +/// @brief Compute the narrow-band signed distance to the boundary +/// between active and inactive voxels in the input grid. +/// +/// @return A shared pointer to a new signed distance field of type @c float +/// +/// @param grid Input grid of arbitrary type whose active voxels are used +/// in constructing the level set. +/// @param halfBandWidth Half the width of the narrow band, in voxel units +/// @param closingWidth Number of iterations used to first expand and then shrink +/// the filled voxel region. +/// This causes holes and valleys to be filled. +/// @param dilation Number of iterations used to expand the filled voxel region. +/// @param smoothingSteps Number of smoothing interations +template +inline typename GridType::template ValueConverter::Type::Ptr +topologyToLevelSet(const GridType& grid, int halfBandWidth = 3, int closingWidth = 1, + int dilation = 0, int smoothingSteps = 0); + + +/// @brief Compute the narrow-band signed distance to the boundary +/// between active and inactive voxels in the input grid. +/// +/// @return A shared pointer to a new signed distance field of type @c float +/// +/// @param grid Input grid of arbitrary type whose active voxels are used +/// in constructing the level set. +/// @param halfBandWidth Half the width of the narrow band, in voxel units +/// @param closingWidth Number of iterations used to first expand and then shrink +/// the filled voxel region. +/// This causes holes and valleys to be filled. +/// @param dilation Number of iterations used to expand the filled voxel region. +/// @param smoothingSteps Number of smoothing interations +/// @param interrupt Optional object adhering to the util::NullInterrupter interface. +template +inline typename GridType::template ValueConverter::Type::Ptr +topologyToLevelSet(const GridType& grid, int halfBandWidth = 3, int closingWidth = 1, + int dilation = 0, int smoothingSteps = 0, InterrupterType* interrupt = NULL); + + +//////////////////////////////////////// +//////////////////////////////////////// + +// Implementation details + + +namespace ttls_internal { + + +template +struct OffsetAndMinComp +{ + typedef typename TreeType::LeafNodeType LeafNodeType; + typedef typename TreeType::ValueType ValueType; + + OffsetAndMinComp(std::vector& lhsNodes, const TreeType& rhsTree, ValueType offset) + : mLhsNodes(lhsNodes.empty() ? NULL : &lhsNodes[0]), mRhsTree(&rhsTree), mOffset(offset) + { + } + + void operator()(const tbb::blocked_range& range) const + { + typedef typename LeafNodeType::ValueOnIter Iterator; + + tree::ValueAccessor rhsAcc(*mRhsTree); + const ValueType offset = mOffset; + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + + LeafNodeType& lhsNode = *mLhsNodes[n]; + const LeafNodeType * rhsNodePt = rhsAcc.probeConstLeaf(lhsNode.origin()); + if (!rhsNodePt) continue; + + for (Iterator it = lhsNode.beginValueOn(); it; ++it) { + ValueType& val = const_cast(it.getValue()); + val = std::min(val, offset + rhsNodePt->getValue(it.pos())); + } + } + } + +private: + LeafNodeType * * const mLhsNodes; + TreeType const * const mRhsTree; + ValueType const mOffset; +}; // struct OffsetAndMinComp + + +template +inline void +normalizeLevelSet(GridType& grid, const int halfWidthInVoxels, InterrupterType* interrupt = NULL) +{ + LevelSetFilter filter(grid, interrupt); + filter.setSpatialScheme(math::FIRST_BIAS); + filter.setNormCount(halfWidthInVoxels); + filter.normalize(); + filter.prune(); +} + + +template +inline void +smoothLevelSet(GridType& grid, int iterations, int halfBandWidthInVoxels, InterrupterType* interrupt = NULL) +{ + typedef typename GridType::ValueType ValueType; + typedef typename GridType::TreeType TreeType; + typedef typename TreeType::LeafNodeType LeafNodeType; + + GridType filterGrid(grid); + + LevelSetFilter filter(filterGrid, interrupt); + filter.setSpatialScheme(math::FIRST_BIAS); + + for (int n = 0; n < iterations; ++n) { + if (interrupt && interrupt->wasInterrupted()) break; + filter.mean(1); + } + + std::vector nodes; + grid.tree().getNodes(nodes); + + const ValueType offset = ValueType(double(0.5) * grid.transform().voxelSize()[0]); + + tbb::parallel_for(tbb::blocked_range(0, nodes.size()), + OffsetAndMinComp(nodes, filterGrid.tree(), -offset)); + + // Clean up any damanage that was done by the min operation + normalizeLevelSet(grid, halfBandWidthInVoxels, interrupt); +} + + +} // namespace ttls_internal + + +//////////////////////////////////////// + + +template +inline typename GridType::template ValueConverter::Type::Ptr +topologyToLevelSet(const GridType& grid, int halfBandWidth, int closingWidth, + int dilation, int smoothingSteps, InterrupterType* interrupt) +{ + typedef typename GridType::template ValueConverter::Type FloatGridType; + typedef typename FloatGridType::TreeType FloatTreeType; + typedef typename FloatTreeType::template ValueConverter::Type MaskTreeType; + + halfBandWidth = std::max(halfBandWidth, 1); + closingWidth = std::max(closingWidth, 0); + + MaskTreeType regionMask(grid.tree(), false, TopologyCopy()); + + // closing operation and padding + openvdb::tools::dilateVoxels(regionMask, closingWidth + dilation); + openvdb::tools::erodeVoxels(regionMask, closingWidth); + + + // Construct inside band mask + + MaskTreeType coreMask(regionMask); + openvdb::tools::erodeVoxels(coreMask, halfBandWidth); + + regionMask.topologyDifference(coreMask); + tools::pruneInactive(regionMask, /*threading=*/true); + + // Generate a volume with an implicit zero crossing at the boundary + // between active and inactive values in the input grid. + + const float width = float(grid.transform().voxelSize()[0] * double(halfBandWidth)); + + typename FloatTreeType::Ptr resultTree( + new FloatTreeType(regionMask, /*inactive=*/width, /*active=*/-width, openvdb::TopologyCopy())); + + // Construct outside band mask + openvdb::tools::dilateVoxels(regionMask, halfBandWidth); + regionMask.topologyDifference(coreMask); + tools::pruneInactive(regionMask, /*threading=*/true); + + // Activate outside band + resultTree->topologyUnion(regionMask); + + // Update interior sign + tools::signedFloodFill(*resultTree); + + // Embed the tree in a grid to define a transform and voxel size. + typename FloatGridType::Ptr resultGrid = FloatGridType::create(resultTree); + resultGrid->setTransform(grid.transform().copy()); + resultGrid->setGridClass(GRID_LEVEL_SET); + + // Use a PDE based scheme to propagate distance values from the + // implicit zero crossing. + ttls_internal::normalizeLevelSet(*resultGrid, 3*halfBandWidth, interrupt); + + // Optinal smooting operation + if (smoothingSteps > 0) { + ttls_internal::smoothLevelSet(*resultGrid, smoothingSteps, halfBandWidth, interrupt); + } + + return resultGrid; +} + + +template +inline typename GridType::template ValueConverter::Type::Ptr +topologyToLevelSet(const GridType& grid, int halfBandWidth, int closingWidth, int dilation, int smoothingSteps) +{ + util::NullInterrupter interrupt; + return topologyToLevelSet(grid, halfBandWidth, closingWidth, dilation, smoothingSteps, &interrupt); +} + + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif //OPENVDB_TOOLS_DENSESPARSETOOLS_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/ValueTransformer.h b/nuparu/include/openvdb/include/openvdb/tools/ValueTransformer.h new file mode 100644 index 00000000..7f51cd8b --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/ValueTransformer.h @@ -0,0 +1,707 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file ValueTransformer.h +/// +/// @author Peter Cucka +/// +/// tools::foreach() and tools::transformValues() transform the values in a grid +/// by iterating over the grid with a user-supplied iterator and applying a +/// user-supplied functor at each step of the iteration. With tools::foreach(), +/// the transformation is done in-place on the input grid, whereas with +/// tools::transformValues(), transformed values are written to an output grid +/// (which can, for example, have a different value type than the input grid). +/// Both functions can optionally transform multiple values of the grid in parallel. +/// +/// tools::accumulate() can be used to accumulate the results of applying a functor +/// at each step of a grid iteration. (The functor is responsible for storing and +/// updating intermediate results.) When the iteration is done serially the behavior is +/// the same as with tools::foreach(), but when multiple values are processed in parallel, +/// an additional step is performed: when any two threads finish processing, +/// @c op.join(otherOp) is called on one thread's functor to allow it to coalesce +/// its intermediate result with the other thread's. +/// +/// Finally, tools::setValueOnMin(), tools::setValueOnMax(), tools::setValueOnSum() +/// and tools::setValueOnMult() are wrappers around Tree::modifyValue() (or +/// ValueAccessor::modifyValue()) for some commmon in-place operations. +/// These are typically significantly faster than calling getValue() followed by setValue(). + +#ifndef OPENVDB_TOOLS_VALUETRANSFORMER_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_VALUETRANSFORMER_HAS_BEEN_INCLUDED + +#include // for std::min(), std::max() +#include +#include +#include +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// 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 void op(const IterT&), where @c IterT is +/// the type of @a iter +/// @param threaded if true, transform multiple values of the grid in parallel +/// @param shareOp if true and @a threaded is true, all threads use the same functor; +/// otherwise, each thread gets its own copy of the @e original functor +/// +/// @par Example: +/// Multiply all values (both set and unset) of a scalar, floating-point grid by two. +/// @code +/// struct Local { +/// static inline void op(const FloatGrid::ValueAllIter& iter) { +/// iter.setValue(*iter * 2); +/// } +/// }; +/// FloatGrid grid = ...; +/// tools::foreach(grid.beginValueAll(), Local::op); +/// @endcode +/// +/// @par Example: +/// Rotate all active vectors of a vector grid by 45 degrees about the y axis. +/// @code +/// namespace { +/// struct MatMul { +/// math::Mat3s M; +/// MatMul(const math::Mat3s& mat): M(mat) {} +/// inline void operator()(const VectorGrid::ValueOnIter& iter) const { +/// iter.setValue(M.transform(*iter)); +/// } +/// }; +/// } +/// { +/// VectorGrid grid = ...; +/// tools::foreach(grid.beginValueOn(), +/// MatMul(math::rotation(math::Y, M_PI_4))); +/// } +/// @endcode +/// +/// @note For more complex operations that require finer control over threading, +/// consider using @c tbb::parallel_for() or @c tbb::parallel_reduce() in conjunction +/// with a tree::IteratorRange that wraps a grid or tree iterator. +template +inline void foreach(const IterT& iter, XformOp& op, + bool threaded = true, bool shareOp = true); + +template +inline void foreach(const IterT& iter, const XformOp& op, + bool threaded = true, bool shareOp = true); + + +/// Iterate over a grid and at each step call op(iter, accessor) 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-const or (preferably) @c const iterator over an +/// input grid or its tree (@c Grid::ValueOnCIter, @c Tree::NodeIter, etc.) +/// @param outGrid an empty grid to be populated +/// @param op a functor of the form +/// void op(const InIterT&, OutGridT::ValueAccessor&), +/// where @c InIterT is the type of @a inIter +/// @param threaded if true, transform multiple values of the input grid in parallel +/// @param shareOp if true and @a threaded is true, all threads use the same functor; +/// otherwise, each thread gets its own copy of the @e original functor +/// @param merge how to merge intermediate results from multiple threads (see Types.h) +/// +/// @par Example: +/// Populate a scalar floating-point grid with the lengths of the vectors from all +/// active voxels of a vector-valued input grid. +/// @code +/// struct Local { +/// static void op( +/// const Vec3fGrid::ValueOnCIter& iter, +/// FloatGrid::ValueAccessor& accessor) +/// { +/// if (iter.isVoxelValue()) { // set a single voxel +/// accessor.setValue(iter.getCoord(), iter->length()); +/// } else { // fill an entire tile +/// CoordBBox bbox; +/// iter.getBoundingBox(bbox); +/// accessor.getTree()->fill(bbox, iter->length()); +/// } +/// } +/// }; +/// Vec3fGrid inGrid = ...; +/// FloatGrid outGrid; +/// tools::transformValues(inGrid.cbeginValueOn(), outGrid, Local::op); +/// @endcode +/// +/// @note For more complex operations that require finer control over threading, +/// consider using @c tbb::parallel_for() or @c tbb::parallel_reduce() in conjunction +/// with a tree::IteratorRange that wraps a grid or tree iterator. +template +inline void transformValues(const InIterT& inIter, OutGridT& outGrid, + XformOp& op, bool threaded = true, bool shareOp = true, + MergePolicy merge = MERGE_ACTIVE_STATES); + +#ifndef _MSC_VER +template +inline void transformValues(const InIterT& inIter, OutGridT& outGrid, + const XformOp& op, bool threaded = true, bool shareOp = true, + MergePolicy merge = MERGE_ACTIVE_STATES); +#endif + + +/// Iterate over a grid and at each step call @c op(iter). If threading is enabled, +/// call @c op.join(otherOp) to accumulate intermediate results from pairs of threads. +/// @param iter an iterator over a grid or its tree (@c Grid::ValueOnCIter, +/// @c Tree::NodeIter, etc.) +/// @param op a functor with a join method of the form void join(XformOp&) +/// and a call method of the form void op(const IterT&), +/// where @c IterT is the type of @a iter +/// @param threaded if true, transform multiple values of the grid in parallel +/// @note If @a threaded is true, each thread gets its own copy of the @e original functor. +/// The order in which threads are joined is unspecified. +/// @note If @a threaded is false, the join method is never called. +/// +/// @par Example: +/// Compute the average of the active values of a scalar, floating-point grid +/// using the math::Stats class. +/// @code +/// namespace { +/// struct Average { +/// math::Stats stats; +/// +/// // Accumulate voxel and tile values into this functor's Stats object. +/// inline void operator()(const FloatGrid::ValueOnCIter& iter) { +/// if (iter.isVoxelValue()) stats.add(*iter); +/// else stats.add(*iter, iter.getVoxelCount()); +/// } +/// +/// // Accumulate another functor's Stats object into this functor's. +/// inline void join(Average& other) { stats.add(other.stats); } +/// +/// // Return the cumulative result. +/// inline double average() const { return stats.mean(); } +/// }; +/// } +/// { +/// FloatGrid grid = ...; +/// Average op; +/// tools::accumulate(grid.cbeginValueOn(), op); +/// double average = op.average(); +/// } +/// @endcode +/// +/// @note For more complex operations that require finer control over threading, +/// consider using @c tbb::parallel_for() or @c tbb::parallel_reduce() in conjunction +/// with a tree::IteratorRange that wraps a grid or tree iterator. +template +inline void accumulate(const IterT& iter, XformOp& op, bool threaded = true); + + +/// @brief Set the value of the voxel at the given coordinates in @a tree to +/// the minimum of its current value and @a value, and mark the voxel as active. +/// @details This is typically significantly faster than calling getValue() +/// followed by setValueOn(). +/// @note @a TreeT can be either a Tree or a ValueAccessor. +template +inline void setValueOnMin(TreeT& tree, const Coord& xyz, const typename TreeT::ValueType& value); + +/// @brief Set the value of the voxel at the given coordinates in @a tree to +/// the maximum of its current value and @a value, and mark the voxel as active. +/// @details This is typically significantly faster than calling getValue() +/// followed by setValueOn(). +/// @note @a TreeT can be either a Tree or a ValueAccessor. +template +inline void setValueOnMax(TreeT& tree, const Coord& xyz, const typename TreeT::ValueType& value); + +/// @brief Set the value of the voxel at the given coordinates in @a tree to +/// the sum of its current value and @a value, and mark the voxel as active. +/// @details This is typically significantly faster than calling getValue() +/// followed by setValueOn(). +/// @note @a TreeT can be either a Tree or a ValueAccessor. +template +inline void setValueOnSum(TreeT& tree, const Coord& xyz, const typename TreeT::ValueType& value); + +/// @brief Set the value of the voxel at the given coordinates in @a tree to +/// the product of its current value and @a value, and mark the voxel as active. +/// @details This is typically significantly faster than calling getValue() +/// followed by setValueOn(). +/// @note @a TreeT can be either a Tree or a ValueAccessor. +template +inline void setValueOnMult(TreeT& tree, const Coord& xyz, const typename TreeT::ValueType& value); + + +//////////////////////////////////////// + + +namespace valxform { + +template +struct MinOp { + const ValueType val; + MinOp(const ValueType& v): val(v) {} + inline void operator()(ValueType& v) const { v = std::min(v, val); } +}; + +template +struct MaxOp { + const ValueType val; + MaxOp(const ValueType& v): val(v) {} + inline void operator()(ValueType& v) const { v = std::max(v, val); } +}; + +template +struct SumOp { + const ValueType val; + SumOp(const ValueType& v): val(v) {} + inline void operator()(ValueType& v) const { v += val; } +}; + +template +struct MultOp { + const ValueType val; + MultOp(const ValueType& v): val(v) {} + inline void operator()(ValueType& v) const { v *= val; } +}; + +} + + +template +inline void +setValueOnMin(TreeT& tree, const Coord& xyz, const typename TreeT::ValueType& value) +{ + tree.modifyValue(xyz, valxform::MinOp(value)); +} + + +template +inline void +setValueOnMax(TreeT& tree, const Coord& xyz, const typename TreeT::ValueType& value) +{ + tree.modifyValue(xyz, valxform::MaxOp(value)); +} + + +template +inline void +setValueOnSum(TreeT& tree, const Coord& xyz, const typename TreeT::ValueType& value) +{ + tree.modifyValue(xyz, valxform::SumOp(value)); +} + + +template +inline void +setValueOnMult(TreeT& tree, const Coord& xyz, const typename TreeT::ValueType& value) +{ + tree.modifyValue(xyz, valxform::MultOp(value)); +} + + +//////////////////////////////////////// + + +namespace valxform { + +template +class SharedOpApplier +{ +public: + typedef typename tree::IteratorRange IterRange; + + SharedOpApplier(const IterT& iter, OpT& op): mIter(iter), mOp(op) {} + + void process(bool threaded = true) + { + IterRange range(mIter); + if (threaded) { + tbb::parallel_for(range, *this); + } else { + (*this)(range); + } + } + + void operator()(IterRange& r) const { for ( ; r; ++r) mOp(r.iterator()); } + +private: + IterT mIter; + OpT& mOp; +}; + + +template +class CopyableOpApplier +{ +public: + typedef typename tree::IteratorRange IterRange; + + CopyableOpApplier(const IterT& iter, const OpT& op): mIter(iter), mOp(op), mOrigOp(&op) {} + + // When splitting this task, give the subtask a copy of the original functor, + // not of this task's functor, which might have been modified arbitrarily. + CopyableOpApplier(const CopyableOpApplier& other): + mIter(other.mIter), mOp(*other.mOrigOp), mOrigOp(other.mOrigOp) {} + + void process(bool threaded = true) + { + IterRange range(mIter); + if (threaded) { + tbb::parallel_for(range, *this); + } else { + (*this)(range); + } + } + + void operator()(IterRange& r) const { for ( ; r; ++r) mOp(r.iterator()); } + +private: + IterT mIter; + OpT mOp; // copy of original functor + OpT const * const mOrigOp; // pointer to original functor +}; + +} // namespace valxform + + +template +inline void +foreach(const IterT& iter, XformOp& op, bool threaded, bool shared) +{ + if (shared) { + typename valxform::SharedOpApplier proc(iter, op); + proc.process(threaded); + } else { + typedef typename valxform::CopyableOpApplier Processor; + Processor proc(iter, op); + proc.process(threaded); + } +} + +template +inline void +foreach(const IterT& iter, const XformOp& op, bool threaded, bool /*shared*/) +{ + // Const ops are shared across threads, not copied. + typename valxform::SharedOpApplier proc(iter, op); + proc.process(threaded); +} + + +//////////////////////////////////////// + + +namespace valxform { + +template +class SharedOpTransformer +{ +public: + typedef typename InIterT::TreeT InTreeT; + typedef typename tree::IteratorRange IterRange; + typedef typename OutTreeT::ValueType OutValueT; + + SharedOpTransformer(const InIterT& inIter, OutTreeT& outTree, OpT& op, MergePolicy merge): + mIsRoot(true), + mInputIter(inIter), + mInputTree(inIter.getTree()), + mOutputTree(&outTree), + mOp(op), + mMergePolicy(merge) + { + if (static_cast(mInputTree) == static_cast(mOutputTree)) { + OPENVDB_LOG_INFO("use tools::foreach(), not transformValues()," + " to transform a grid in place"); + } + } + + /// Splitting constructor + SharedOpTransformer(SharedOpTransformer& other, tbb::split): + mIsRoot(false), + mInputIter(other.mInputIter), + mInputTree(other.mInputTree), + mOutputTree(new OutTreeT(zeroVal())), + mOp(other.mOp), + mMergePolicy(other.mMergePolicy) + {} + + ~SharedOpTransformer() + { + // Delete the output tree only if it was allocated locally + // (the top-level output tree was supplied by the caller). + if (!mIsRoot) { + delete mOutputTree; + mOutputTree = NULL; + } + } + + void process(bool threaded = true) + { + if (!mInputTree || !mOutputTree) return; + + IterRange range(mInputIter); + + // Independently transform elements in the iterator range, + // either in parallel or serially. + if (threaded) { + tbb::parallel_reduce(range, *this); + } else { + (*this)(range); + } + } + + /// Transform each element in the given range. + void operator()(IterRange& range) const + { + if (!mOutputTree) return; + typename tree::ValueAccessor outAccessor(*mOutputTree); + for ( ; range; ++range) { + mOp(range.iterator(), outAccessor); + } + } + + void join(const SharedOpTransformer& other) + { + if (mOutputTree && other.mOutputTree) { + mOutputTree->merge(*other.mOutputTree, mMergePolicy); + } + } + +private: + bool mIsRoot; + InIterT mInputIter; + const InTreeT* mInputTree; + OutTreeT* mOutputTree; + OpT& mOp; + MergePolicy mMergePolicy; +}; // class SharedOpTransformer + + +template +class CopyableOpTransformer +{ +public: + typedef typename InIterT::TreeT InTreeT; + typedef typename tree::IteratorRange IterRange; + typedef typename OutTreeT::ValueType OutValueT; + + CopyableOpTransformer(const InIterT& inIter, OutTreeT& outTree, + const OpT& op, MergePolicy merge): + mIsRoot(true), + mInputIter(inIter), + mInputTree(inIter.getTree()), + mOutputTree(&outTree), + mOp(op), + mOrigOp(&op), + mMergePolicy(merge) + { + if (static_cast(mInputTree) == static_cast(mOutputTree)) { + OPENVDB_LOG_INFO("use tools::foreach(), not transformValues()," + " to transform a grid in place"); + } + } + + // When splitting this task, give the subtask a copy of the original functor, + // not of this task's functor, which might have been modified arbitrarily. + CopyableOpTransformer(CopyableOpTransformer& other, tbb::split): + mIsRoot(false), + mInputIter(other.mInputIter), + mInputTree(other.mInputTree), + mOutputTree(new OutTreeT(zeroVal())), + mOp(*other.mOrigOp), + mOrigOp(other.mOrigOp), + mMergePolicy(other.mMergePolicy) + {} + + ~CopyableOpTransformer() + { + // Delete the output tree only if it was allocated locally + // (the top-level output tree was supplied by the caller). + if (!mIsRoot) { + delete mOutputTree; + mOutputTree = NULL; + } + } + + void process(bool threaded = true) + { + if (!mInputTree || !mOutputTree) return; + + IterRange range(mInputIter); + + // Independently transform elements in the iterator range, + // either in parallel or serially. + if (threaded) { + tbb::parallel_reduce(range, *this); + } else { + (*this)(range); + } + } + + /// Transform each element in the given range. + void operator()(IterRange& range) + { + if (!mOutputTree) return; + typename tree::ValueAccessor outAccessor(*mOutputTree); + for ( ; range; ++range) { + mOp(range.iterator(), outAccessor); + } + } + + void join(const CopyableOpTransformer& other) + { + if (mOutputTree && other.mOutputTree) { + mOutputTree->merge(*other.mOutputTree, mMergePolicy); + } + } + +private: + bool mIsRoot; + InIterT mInputIter; + const InTreeT* mInputTree; + OutTreeT* mOutputTree; + OpT mOp; // copy of original functor + OpT const * const mOrigOp; // pointer to original functor + MergePolicy mMergePolicy; +}; // class CopyableOpTransformer + +} // namespace valxform + + +//////////////////////////////////////// + + +template +inline void +transformValues(const InIterT& inIter, OutGridT& outGrid, XformOp& op, + bool threaded, bool shared, MergePolicy merge) +{ + typedef TreeAdapter Adapter; + typedef typename Adapter::TreeType OutTreeT; + if (shared) { + typedef typename valxform::SharedOpTransformer Processor; + Processor proc(inIter, Adapter::tree(outGrid), op, merge); + proc.process(threaded); + } else { + typedef typename valxform::CopyableOpTransformer Processor; + Processor proc(inIter, Adapter::tree(outGrid), op, merge); + proc.process(threaded); + } +} + +#ifndef _MSC_VER +template +inline void +transformValues(const InIterT& inIter, OutGridT& outGrid, const XformOp& op, + bool threaded, bool /*share*/, MergePolicy merge) +{ + typedef TreeAdapter Adapter; + typedef typename Adapter::TreeType OutTreeT; + // Const ops are shared across threads, not copied. + typedef typename valxform::SharedOpTransformer Processor; + Processor proc(inIter, Adapter::tree(outGrid), op, merge); + proc.process(threaded); +} +#endif + + +//////////////////////////////////////// + + +namespace valxform { + +template +class OpAccumulator +{ +public: + typedef typename tree::IteratorRange IterRange; + + // The root task makes a const copy of the original functor (mOrigOp) + // and keeps a pointer to the original functor (mOp), which it then modifies. + // Each subtask keeps a const pointer to the root task's mOrigOp + // and makes and then modifies a non-const copy (mOp) of it. + OpAccumulator(const IterT& iter, OpT& op): + mIsRoot(true), + mIter(iter), + mOp(&op), + mOrigOp(new OpT(op)) + {} + + // When splitting this task, give the subtask a copy of the original functor, + // not of this task's functor, which might have been modified arbitrarily. + OpAccumulator(OpAccumulator& other, tbb::split): + mIsRoot(false), + mIter(other.mIter), + mOp(new OpT(*other.mOrigOp)), + mOrigOp(other.mOrigOp) + {} + + ~OpAccumulator() { if (mIsRoot) delete mOrigOp; else delete mOp; } + + void process(bool threaded = true) + { + IterRange range(mIter); + if (threaded) { + tbb::parallel_reduce(range, *this); + } else { + (*this)(range); + } + } + + void operator()(IterRange& r) { for ( ; r; ++r) (*mOp)(r.iterator()); } + + void join(OpAccumulator& other) { mOp->join(*other.mOp); } + +private: + const bool mIsRoot; + const IterT mIter; + OpT* mOp; // pointer to original functor, which might get modified + OpT const * const mOrigOp; // const copy of original functor +}; // class OpAccumulator + +} // namespace valxform + + +//////////////////////////////////////// + + +template +inline void +accumulate(const IterT& iter, XformOp& op, bool threaded) +{ + typename valxform::OpAccumulator proc(iter, op); + proc.process(threaded); +} + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_VALUETRANSFORMER_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/VectorTransformer.h b/nuparu/include/openvdb/include/openvdb/tools/VectorTransformer.h new file mode 100644 index 00000000..1a3e56a5 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/VectorTransformer.h @@ -0,0 +1,158 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file VectorTransformer.h + +#ifndef OPENVDB_TOOLS_VECTORTRANSFORMER_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_VECTORTRANSFORMER_HAS_BEEN_INCLUDED + +#include +#include +#include +#include "ValueTransformer.h" // for tools::foreach() +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief Apply an affine transform to the voxel values of a vector-valued grid +/// in accordance with the grid's vector type (covariant, contravariant, etc.). +/// @throw TypeError if the grid is not vector-valued +template +inline void +transformVectors(GridType&, const Mat4d&); + + +//////////////////////////////////////// + + +// Functors for use with tools::foreach() to transform vector voxel values + +struct HomogeneousMatMul +{ + const Mat4d mat; + HomogeneousMatMul(const Mat4d& _mat): mat(_mat) {} + template void operator()(const TreeIterT& it) const + { + Vec3d v(*it); + it.setValue(mat.transformH(v)); + } +}; + +struct MatMul +{ + const Mat4d mat; + MatMul(const Mat4d& _mat): mat(_mat) {} + template + void operator()(const TreeIterT& it) const + { + Vec3d v(*it); + it.setValue(mat.transform3x3(v)); + } +}; + +struct MatMulNormalize +{ + const Mat4d mat; + MatMulNormalize(const Mat4d& _mat): mat(_mat) {} + template + void operator()(const TreeIterT& it) const + { + Vec3d v(*it); + v = mat.transform3x3(v); + v.normalize(); + it.setValue(v); + } +}; + + +/// @internal This overload is enabled only for scalar-valued grids. +template inline +typename boost::disable_if_c::IsVec, void>::type +doTransformVectors(GridType&, const Mat4d&) +{ + OPENVDB_THROW(TypeError, "tools::transformVectors() requires a vector-valued grid"); +} + +/// @internal This overload is enabled only for vector-valued grids. +template inline +typename boost::enable_if_c::IsVec, void>::type +doTransformVectors(GridType& grid, const Mat4d& mat) +{ + if (!grid.isInWorldSpace()) return; + + const VecType vecType = grid.getVectorType(); + switch (vecType) { + case VEC_COVARIANT: + case VEC_COVARIANT_NORMALIZE: + { + Mat4d invmat = mat.inverse(); + invmat = invmat.transpose(); + + if (vecType == VEC_COVARIANT_NORMALIZE) { + foreach(grid.beginValueAll(), MatMulNormalize(invmat)); + } else { + foreach(grid.beginValueAll(), MatMul(invmat)); + } + break; + } + + case VEC_CONTRAVARIANT_RELATIVE: + foreach(grid.beginValueAll(), MatMul(mat)); + break; + + case VEC_CONTRAVARIANT_ABSOLUTE: + foreach(grid.beginValueAll(), HomogeneousMatMul(mat)); + break; + + case VEC_INVARIANT: + break; + } +} + + +template +inline void +transformVectors(GridType& grid, const Mat4d& mat) +{ + doTransformVectors(grid, mat); +} + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_VECTORTRANSFORMER_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/VelocityFields.h b/nuparu/include/openvdb/include/openvdb/tools/VelocityFields.h new file mode 100644 index 00000000..7cb0539c --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/VelocityFields.h @@ -0,0 +1,305 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/////////////////////////////////////////////////////////////////////////// +// +/// @author Ken Museth +/// +/// @file VelocityFields.h +/// +/// @brief Defines two simple wrapper classes for advection velocity +/// fields as well as VelocitySampler and VelocityIntegrator +/// +/// +/// @details DiscreteField wraps a velocity grid and EnrightField is mostly +/// intended for debugging (it's an analytical divergence free and +/// periodic field). They both share the same API required by the +/// LevelSetAdvection class defined in LevelSetAdvect.h. Thus, any +/// class with this API should work with LevelSetAdvection. +/// +/// @warning Note the Field wrapper classes below always assume the velocity +/// is represented in the world-frame of reference. For DiscreteField +/// this implies the input grid must contain velocities in world +/// coordinates. + +#ifndef OPENVDB_TOOLS_VELOCITY_FIELDS_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_VELOCITY_FIELDS_HAS_BEEN_INCLUDED + +#include +#include +#include "Interpolation.h" // for Sampler, etc. +#include +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief Thin wrapper class for a velocity grid +/// @note Consider replacing BoxSampler with StaggeredBoxSampler +template +class DiscreteField +{ +public: + typedef typename VelGridT::ValueType VectorType; + typedef typename VectorType::ValueType ValueType; + BOOST_STATIC_ASSERT(boost::is_floating_point::value); + + DiscreteField(const VelGridT &vel) + : mAccessor(vel.tree()) + , mTransform(&vel.transform()) + { + } + + /// @brief Copy constructor + DiscreteField(const DiscreteField& other) + : mAccessor(other.mAccessor.tree()) + , mTransform(other.mTransform) + { + } + + /// @return const reference to the transform between world and index space + /// @note Use this method to determine if a client grid is + /// aligned with the coordinate space of the velocity grid. + const math::Transform& transform() const { return *mTransform; } + + /// @return the interpolated velocity at the world space position xyz + /// + /// @warning Not threadsafe since it uses a ValueAccessor! So use + /// one instance per thread (which is fine since its lightweight). + inline VectorType operator() (const Vec3d& xyz, ValueType/*dummy time*/) const + { + return Interpolator::sample(mAccessor, mTransform->worldToIndex(xyz)); + } + + /// @return the velocity at the coordinate space position ijk + /// + /// @warning Not threadsafe since it uses a ValueAccessor! So use + /// one instance per thread (which is fine since its lightweight). + inline VectorType operator() (const Coord& ijk, ValueType/*dummy time*/) const + { + return mAccessor.getValue(ijk); + } + +private: + const typename VelGridT::ConstAccessor mAccessor;//Not thread-safe + const math::Transform* mTransform; + +}; // end of DiscreteField + +/////////////////////////////////////////////////////////////////////// + +/// @brief Analytical, divergence-free and periodic velocity field +/// @note Primarily intended for debugging! +/// @warning This analytical velocity only produce meaningful values +/// in the unit box in world space. In other words make sure any level +/// set surface is fully enclosed in the axis aligned bounding box +/// spanning 0->1 in world units. +template +class EnrightField +{ +public: + typedef ScalarT ValueType; + typedef math::Vec3 VectorType; + BOOST_STATIC_ASSERT(boost::is_floating_point::value); + + EnrightField() {} + + /// @return const reference to the identity transform between world and index space + /// @note Use this method to determine if a client grid is + /// aligned with the coordinate space of this velocity field + math::Transform transform() const { return math::Transform(); } + + /// @return the velocity in world units, evaluated at the world + /// position xyz and at the specified time + inline VectorType operator() (const Vec3d& xyz, ValueType time) const; + + /// @return the velocity at the coordinate space position ijk + inline VectorType operator() (const Coord& ijk, ValueType time) const + { + return (*this)(ijk.asVec3d(), time); + } +}; // end of EnrightField + +template +inline math::Vec3 +EnrightField::operator() (const Vec3d& xyz, ValueType time) const +{ + const ScalarT pi = boost::math::constants::pi(); + const ScalarT phase = pi / ScalarT(3.0); + const ScalarT Px = pi * ScalarT(xyz[0]), Py = pi * ScalarT(xyz[1]), Pz = pi * ScalarT(xyz[2]); + const ScalarT tr = cos(ScalarT(time) * phase); + const ScalarT a = sin(ScalarT(2.0)*Py); + const ScalarT b = -sin(ScalarT(2.0)*Px); + const ScalarT c = sin(ScalarT(2.0)*Pz); + return math::Vec3( + tr * ( ScalarT(2) * math::Pow2(sin(Px)) * a * c ), + tr * ( b * math::Pow2(sin(Py)) * c ), + tr * ( b * a * math::Pow2(sin(Pz)) )); +} + + +/////////////////////////////////////////////////////////////////////// + +/// Class to hold a Vec3 field interpreted as a velocity field. +/// Primarily exists to provide a method(s) that integrate a passive +/// point forward in the velocity field for a single time-step (dt) +template +class VelocitySampler +{ +public: + typedef typename GridT::ConstAccessor AccessorType; + typedef typename GridT::ValueType ValueType; + + /// @brief Constructor from a grid + VelocitySampler(const GridT& grid): + mGrid(&grid), + mAcc(grid.getAccessor()) + { + } + /// @brief Copy-constructor + VelocitySampler(const VelocitySampler& other): + mGrid(other.mGrid), + mAcc(mGrid->getAccessor()) + { + } + /// @brief Samples the velocity at world position onto result. Supports both + /// staggered (i.e. MAC) and collocated velocity grids. + /// + /// @return @c true if any one of the sampled values is active. + /// + /// @warning Not threadsafe since it uses a ValueAccessor! So use + /// one instance per thread (which is fine since its lightweight). + template + inline bool sample(const LocationType& world, ValueType& result) const + { + const Vec3R xyz = mGrid->worldToIndex(Vec3R(world[0], world[1], world[2])); + bool active = Sampler::sample(mAcc, xyz, result); + return active; + } + + /// @brief Samples the velocity at world position onto result. Supports both + /// staggered (i.e. MAC) and co-located velocity grids. + /// + /// @warning Not threadsafe since it uses a ValueAccessor! So use + /// one instance per thread (which is fine since its lightweight). + template + inline ValueType sample(const LocationType& world) const + { + const Vec3R xyz = mGrid->worldToIndex(Vec3R(world[0], world[1], world[2])); + return Sampler::sample(mAcc, xyz); + } + +private: + // holding the Grids for the transforms + const GridT* mGrid; // Velocity vector field + AccessorType mAcc; +};// end of VelocitySampler class + +/////////////////////////////////////////////////////////////////////// + +/// @brief Performs Runge-Kutta time integration of variable order in +/// a static velocity field. +/// +/// @note Note that the order of the velocity sampling is controlled +/// with the SampleOrder template parameter, which defaults +/// to one, i.e. a tri-linear interpolation kernel. +template +class VelocityIntegrator +{ +public: + typedef typename GridT::ValueType VecType; + typedef typename VecType::ValueType ElementType; + + VelocityIntegrator(const GridT& velGrid): + mVelSampler(velGrid) + { + } + /// @brief Variable order Runge-Kutta time integration for a single time step + /// + /// @param dt Time sub-step for the Runge-Kutte integrator of order OrderRK + /// @param world Location in world space coordinates (both input and output) + template + inline void rungeKutta(const ElementType dt, LocationType& world) const + { + BOOST_STATIC_ASSERT(OrderRK <= 4); + VecType P(static_cast(world[0]), + static_cast(world[1]), + static_cast(world[2])); + // Note the if-branching below is optimized away at compile time + if (OrderRK == 0) { + return;// do nothing + } else if (OrderRK == 1) { + VecType V0; + mVelSampler.sample(P, V0); + P = dt * V0; + } else if (OrderRK == 2) { + VecType V0, V1; + mVelSampler.sample(P, V0); + mVelSampler.sample(P + ElementType(0.5) * dt * V0, V1); + P = dt * V1; + } else if (OrderRK == 3) { + VecType V0, V1, V2; + mVelSampler.sample(P, V0); + mVelSampler.sample(P + ElementType(0.5) * dt * V0, V1); + mVelSampler.sample(P + dt * (ElementType(2.0) * V1 - V0), V2); + P = dt * (V0 + ElementType(4.0) * V1 + V2) * ElementType(1.0 / 6.0); + } else if (OrderRK == 4) { + VecType V0, V1, V2, V3; + mVelSampler.sample(P, V0); + mVelSampler.sample(P + ElementType(0.5) * dt * V0, V1); + mVelSampler.sample(P + ElementType(0.5) * dt * V1, V2); + mVelSampler.sample(P + dt * V2, V3); + P = dt * (V0 + ElementType(2.0) * (V1 + V2) + V3) * ElementType(1.0 / 6.0); + } + typedef typename LocationType::ValueType OutType; + world += LocationType(static_cast(P[0]), + static_cast(P[1]), + static_cast(P[2])); + } +private: + VelocitySampler mVelSampler; +};// end of VelocityIntegrator class + + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_VELOCITY_FIELDS_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/VolumeAdvect.h b/nuparu/include/openvdb/include/openvdb/tools/VolumeAdvect.h new file mode 100644 index 00000000..b29d3128 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/VolumeAdvect.h @@ -0,0 +1,571 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/////////////////////////////////////////////////////////////////////////// +// +/// @author Ken Museth +/// +/// @file VolumeAdvect.h +/// +/// @brief Sparse hyperbolic advection of volumes, e.g. a density or +/// velocity (vs a level set interface). + +#ifndef OPENVDB_TOOLS_VOLUME_ADVECT_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_VOLUME_ADVECT_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include "Interpolation.h"// for Sampler +#include "VelocityFields.h" // for VelocityIntegrator +#include "Morphology.h"//for dilateActiveValues and dilateVoxels +#include "Prune.h"// for prune +#include "Statistics.h" // for extrema + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + + +namespace Scheme { + /// @brief Numerical advections schemes. + enum SemiLagrangian { SEMI, MID, RK3, RK4, MAC, BFECC }; + /// @brief Flux-limiters employed to stabalize the second-order + /// advection schemes MacCormack and BFECC. + enum Limiter { NO_LIMITER, CLAMP, REVERT }; +} + +/// @brief Performs advections of an arbitrary type of volume in a +/// static velocity field. The advections are performed by means +/// of various derivatives of Semi-Lagrangian integration, i.e. +/// backwards tracking along the hyperbolic characteristics +/// followed by interpolation. +/// +/// @note Optionally a limiter can be combined with the higher-order +/// integration schemes MacCormack and BFECC. There are two +/// types of limiters (CLAMP and REVERT) that supress +/// non-physical oscillations by means of either claminging or +/// reverting to a first-order schemes when the function is not +/// bounded by the cell values used for tri-linear interpolation. +/// +/// @verbatim The supported integrations schemes: +/// +/// ================================================================ +/// | Lable | Accuracy | Integration Scheme | Interpolations | +/// | |Time/Space| | velocity/volume | +/// ================================================================ +/// | SEMI | 1/1 | Semi-Lagrangian | 1/1 | +/// | MID | 2/1 | Mid-Point | 2/1 | +/// | RK3 | 3/1 | 3rd Order Runge-Kutta | 3/1 | +/// | RK4 | 4/1 | 4th Order Runge-Kutta | 4/1 | +/// | MAC | 2/2 | MacCormack | 2/2 | +/// | BFECC | 2/2 | BFECC | 3/2 | +/// ================================================================ +/// @endverbatim + +template +class VolumeAdvection +{ +public: + + /// @brief Constructor + /// + /// @param velGrid Velocity grid responsible for the (passive) advection. + /// @param interrupter Optional interrupter used to prematurely end computations. + /// + /// @note The velocity field is assumed to be constant for the duration of the + /// advection. + VolumeAdvection(const VelocityGridT& velGrid, InterrupterType* interrupter = NULL) + : mVelGrid(velGrid) + , mInterrupter(interrupter) + , mIntegrator( Scheme::SEMI ) + , mLimiter( Scheme::CLAMP ) + , mGrainSize( 128 ) + , mSubSteps( 1 ) + { + math::Extrema e = extrema(velGrid.cbeginValueAll(), /*threading*/true); + e.add(velGrid.background().length()); + mMaxVelocity = e.max(); + } + + virtual ~VolumeAdvection() + { + } + + /// @brief Return the spatial order of accuracy of the advection scheme + /// + /// @note This is the optimal order in smooth regions. In + /// non-smooth regions the flux-limiter will drop the order of + /// accuracy to add numerical dissipation. + int spatialOrder() const { return (mIntegrator == Scheme::MAC || + mIntegrator == Scheme::BFECC) ? 2 : 1; } + + /// @brief Return the temporal order of accuracy of the advection scheme + /// + /// @note This is the optimal order in smooth regions. In + /// non-smooth regions the flux-limiter will drop the order of + /// accuracy to add numerical dissipation. + int temporalOrder() const { + switch (mIntegrator) { + case Scheme::SEMI: return 1; + case Scheme::MID: return 2; + case Scheme::RK3: return 3; + case Scheme::RK4: return 4; + case Scheme::BFECC:return 2; + case Scheme::MAC: return 2; + } + return 0;//should never reach this point + } + + /// @brief Set the integrator (see details in the table above) + void setIntegrator(Scheme::SemiLagrangian integrator) { mIntegrator = integrator; } + + /// @brief Return the integrator (see details in the table above) + Scheme::SemiLagrangian getIntegrator() const { return mIntegrator; } + + /// @brief Set the limiter (see details above) + void setLimiter(Scheme::Limiter limiter) { mLimiter = limiter; } + + /// @brief Retrun the limiter (see details above) + Scheme::Limiter getLimiter() const { return mLimiter; } + + /// @brief Return @c true if a limiter will be applied based on + /// the current settings. + bool isLimiterOn() const { return this->spatialOrder()>1 && + mLimiter != Scheme::NO_LIMITER; } + + /// @return the grain-size used for multi-threading + /// @note A grainsize of 0 implies serial execution + size_t getGrainSize() const { return mGrainSize; } + + /// @brief Set the grain-size used for multi-threading + /// @note A grainsize of 0 disables multi-threading + /// @warning A small grainsize can degrade performance, + /// both in terms of time and memory footprint! + void setGrainSize(size_t grainsize) { mGrainSize = grainsize; } + + /// @return the number of sub-steps per integration (always larger + /// than or equal to 1). + int getSubSteps() const { return mSubSteps; } + + /// @brief Set the number of sub-steps per integration. + /// @note The only reason to increase the sub-step above its + /// default value of one is to reduce the memory footprint + /// due to significant dilation. Values smaller than 1 will + /// be clamped to 1! + void setSubSteps(int substeps) { mSubSteps = math::Max(1, substeps); } + + /// @brief Return the maximum magnitude of the velocity in the + /// advection velocity field defined during construction. + double getMaxVelocity() const { return mMaxVelocity; } + + /// @return Returns the maximum distance in voxel units of @a inGrid + /// that a particle can travel in the time-step @a dt when advected + /// in the velocity field defined during construction. + /// + /// @details This method is useful when dilating sparse volume + /// grids to pad boundary regions. Excessive dilation can be + /// computationally expensive so use this method to prevent + /// or warn against run-away computation. + /// + /// @throw RuntimeError if @a inGrid does not have uniform voxels. + template + int getMaxDistance(const VolumeGridT& inGrid, double dt) const + { + if (!inGrid.hasUniformVoxels()) { + OPENVDB_THROW(RuntimeError, "Volume grid does not have uniform voxels!"); + } + const double d = mMaxVelocity*math::Abs(dt)/inGrid.voxelSize()[0]; + return static_cast( math::RoundUp(d) ); + } + + /// @return Returns a new grid that is the result of passive advection + /// of all the active values the input grid by @a timeStep. + /// + /// @param inGrid The input grid to be advected (unmodified) + /// @param timeStep Time-step of the Runge-Kutta integrator. + /// + /// @details This method will advect all of the active values in + /// the input @a inGrid. To achieve this a + /// deep-copy is dilated to account for the material + /// transport. This dilation step can be slow for large + /// time steps @a dt or a velocity field with large magnitudes. + /// + /// @warning If the VolumeSamplerT is of higher order than one + /// (i.e. tri-linear interpolation) instabilities are + /// known to occure. To suppress those monotonicity + /// constrains or flux-limiters need to be applies. + /// + /// @throw RuntimeError if @a inGrid does not have uniform voxels. + template//only C++11 allows for a default argument + typename VolumeGridT::Ptr advect(const VolumeGridT& inGrid, double timeStep) + { + typename VolumeGridT::Ptr outGrid = inGrid.deepCopy(); + const double dt = timeStep/mSubSteps; + const int n = this->getMaxDistance(inGrid, dt); + dilateActiveValues( outGrid->tree(), n, NN_FACE, EXPAND_TILES); + this->template cook(*outGrid, inGrid, dt); + for (int step = 1; step < mSubSteps; ++step) { + typename VolumeGridT::Ptr tmpGrid = outGrid->deepCopy(); + dilateActiveValues( tmpGrid->tree(), n, NN_FACE, EXPAND_TILES); + this->template cook(*tmpGrid, *outGrid, dt); + outGrid.swap( tmpGrid ); + } + + return outGrid; + } + + /// @return Returns a new grid that is the result of + /// passive advection of the active values in @a inGrid + /// that intersect the active values in @c mask. The time + /// of the output grid is incremented by @a timeStep. + /// + /// @param inGrid The input grid to be advected (unmodified). + /// @param mask The mask of active values defining the active voxels + /// in @c inGrid on which to perform advection. Only + /// if a value is active in both grids will it be modified. + /// @param timeStep Time-step for a single Runge-Kutta integration step. + /// + /// + /// @details This method will advect all of the active values in + /// the input @a inGrid that intersects with the + /// active values in @a mask. To achieve this a + /// deep-copy is dilated to account for the material + /// transport and finally cropped to the intersection + /// with @a mask. The dilation step can be slow for large + /// time steps @a dt or fast moving velocity fields. + /// + /// @warning If the VolumeSamplerT is of higher order the one + /// (i.e. tri-linear interpolation) instabilities are + /// known to occure. To suppress those monotonicity + /// constrains or flux-limiters need to be applies. + /// + /// @throw RuntimeError if @a inGrid is not aligned with @a mask + /// or if its voxels are not uniform. + template//only C++11 allows for a default argument + typename VolumeGridT::Ptr advect(const VolumeGridT& inGrid, const MaskGridT& mask, double timeStep) + { + if (inGrid.transform() != mask.transform()) { + OPENVDB_THROW(RuntimeError, "Volume grid and mask grid are misaligned! Consider " + "resampling either of the two grids into the index space of the other."); + } + typename VolumeGridT::Ptr outGrid = inGrid.deepCopy(); + const double dt = timeStep/mSubSteps; + const int n = this->getMaxDistance(inGrid, dt); + dilateActiveValues( outGrid->tree(), n, NN_FACE, EXPAND_TILES); + outGrid->topologyIntersection( mask ); + pruneInactive( outGrid->tree(), mGrainSize>0, mGrainSize ); + this->template cook(*outGrid, inGrid, dt); + outGrid->topologyUnion( inGrid ); + + for (int step = 1; step < mSubSteps; ++step) { + typename VolumeGridT::Ptr tmpGrid = outGrid->deepCopy(); + dilateActiveValues( tmpGrid->tree(), n, NN_FACE, EXPAND_TILES); + tmpGrid->topologyIntersection( mask ); + pruneInactive( tmpGrid->tree(), mGrainSize>0, mGrainSize ); + this->template cook(*tmpGrid, *outGrid, dt); + tmpGrid->topologyUnion( inGrid ); + outGrid.swap( tmpGrid ); + } + return outGrid; + } + +private: + // disallow copy construction and copy by assignment! + VolumeAdvection(const VolumeAdvection&);// not implemented + VolumeAdvection& operator=(const VolumeAdvection&);// not implemented + + void start(const char* str) const + { + if (mInterrupter) mInterrupter->start(str); + } + void stop() const + { + if (mInterrupter) mInterrupter->end(); + } + bool interrupt() const + { + if (mInterrupter && util::wasInterrupted(mInterrupter)) { + tbb::task::self().cancel_group_execution(); + return true; + } + return false; + } + + template + void cook(VolumeGridT& outGrid, const VolumeGridT& inGrid, double dt) + { + switch (mIntegrator) { + case Scheme::SEMI: { + Advect adv(inGrid, *this); + adv.cook(outGrid, dt); + break; + } + case Scheme::MID: { + Advect adv(inGrid, *this); + adv.cook(outGrid, dt); + break; + } + case Scheme::RK3: { + Advect adv(inGrid, *this); + adv.cook(outGrid, dt); + break; + } + case Scheme::RK4: { + Advect adv(inGrid, *this); + adv.cook(outGrid, dt); + break; + } + case Scheme::BFECC: { + Advect adv(inGrid, *this); + adv.cook(outGrid, dt); + break; + } + case Scheme::MAC: { + Advect adv(inGrid, *this); + adv.cook(outGrid, dt); + break; + } + default: + OPENVDB_THROW(ValueError, "Spatial difference scheme not supported!"); + } + pruneInactive(outGrid.tree(), mGrainSize>0, mGrainSize); + } + + // Private class that implements the multi-threaded advection + template struct Advect; + + // Private member data of VolumeAdvection + const VelocityGridT& mVelGrid; + double mMaxVelocity; + InterrupterType* mInterrupter; + Scheme::SemiLagrangian mIntegrator; + Scheme::Limiter mLimiter; + size_t mGrainSize; + int mSubSteps; +};//end of VolumeAdvection class + +// Private class that implements the multi-threaded advection +template +template +struct VolumeAdvection::Advect +{ + typedef typename VolumeGridT::TreeType TreeT; + typedef typename VolumeGridT::ConstAccessor AccT; + typedef typename TreeT::ValueType ValueT; + typedef typename tree::LeafManager LeafManagerT; + typedef typename LeafManagerT::LeafNodeType LeafNodeT; + typedef typename LeafManagerT::LeafRange LeafRangeT; + typedef VelocityIntegrator VelocityIntegratorT; + typedef typename VelocityIntegratorT::ElementType RealT; + typedef typename TreeT::LeafNodeType::ValueOnIter VoxelIterT; + + Advect(const VolumeGridT& inGrid, const VolumeAdvection& parent) + : mTask(0) + , mInGrid(&inGrid) + , mVelocityInt(parent.mVelGrid) + , mParent(&parent) + { + } + inline void cook(const LeafRangeT& range) + { + if (mParent->mGrainSize > 0) { + tbb::parallel_for(range, *this); + } else { + (*this)(range); + } + } + void operator()(const LeafRangeT& range) const + { + assert(mTask); + mTask(const_cast(this), range); + } + void cook(VolumeGridT& outGrid, double time_step) + { + mParent->start("Advecting volume"); + LeafManagerT manager(outGrid.tree(), mParent->spatialOrder()==2 ? 1 : 0); + const LeafRangeT range = manager.leafRange(mParent->mGrainSize); + const RealT dt = static_cast(-time_step);//method of characteristics backtracks + if (mParent->mIntegrator == Scheme::MAC) { + mTask = boost::bind(&Advect::rk, _1, _2, dt, 0, mInGrid);//out[0]=forward + this->cook(range); + mTask = boost::bind(&Advect::rk, _1, _2,-dt, 1, &outGrid);//out[1]=backward + this->cook(range); + mTask = boost::bind(&Advect::mac, _1, _2);//out[0] = out[0] + (in[0] - out[1])/2 + this->cook(range); + } else if (mParent->mIntegrator == Scheme::BFECC) { + mTask = boost::bind(&Advect::rk, _1, _2, dt, 0, mInGrid);//out[0]=forward + this->cook(range); + mTask = boost::bind(&Advect::rk, _1, _2,-dt, 1, &outGrid);//out[1]=backward + this->cook(range); + mTask = boost::bind(&Advect::bfecc, _1, _2);//out[0] = (3*in[0] - out[1])/2 + this->cook(range); + mTask = boost::bind(&Advect::rk, _1, _2, dt, 1, &outGrid);//out[1]=forward + this->cook(range); + manager.swapLeafBuffer(1);// out[0] = out[1] + } else {// SEMI, MID, RK3 and RK4 + mTask = boost::bind(&Advect::rk, _1, _2, dt, 0, mInGrid);//forward + this->cook(range); + } + + if (mParent->spatialOrder()==2) manager.removeAuxBuffers(); + + mTask = boost::bind(&Advect::limiter, _1, _2, dt);// out[0] = limiter( out[0] ) + this->cook(range); + + mParent->stop(); + } + // Last step of the MacCormack scheme: out[0] = out[0] + (in[0] - out[1])/2 + void mac(const LeafRangeT& range) const + { + if (mParent->interrupt()) return; + assert( mParent->mIntegrator == Scheme::MAC ); + AccT acc = mInGrid->getAccessor(); + for (typename LeafRangeT::Iterator leafIter = range.begin(); leafIter; ++leafIter) { + ValueT* out0 = leafIter.buffer( 0 ).data();// forward + const ValueT* out1 = leafIter.buffer( 1 ).data();// backward + const LeafNodeT* leaf = acc.probeConstLeaf( leafIter->origin() ); + if (leaf !=NULL) { + const ValueT* in0 = leaf->buffer().data(); + for (VoxelIterT voxelIter = leafIter->beginValueOn(); voxelIter; ++voxelIter) { + const Index i = voxelIter.pos(); + out0[i] += RealT(0.5) * ( in0[i] - out1[i] ); + } + } else { + for (VoxelIterT voxelIter = leafIter->beginValueOn(); voxelIter; ++voxelIter) { + const Index i = voxelIter.pos(); + out0[i] += RealT(0.5) * ( acc.getValue(voxelIter.getCoord()) - out1[i] ); + }//loop over active voxels + } + }//loop over leaf nodes + } + // Intermediate step in the BFECC scheme: out[0] = (3*in[0] - out[1])/2 + void bfecc(const LeafRangeT& range) const + { + if (mParent->interrupt()) return; + assert( mParent->mIntegrator == Scheme::BFECC ); + AccT acc = mInGrid->getAccessor(); + for (typename LeafRangeT::Iterator leafIter = range.begin(); leafIter; ++leafIter) { + ValueT* out0 = leafIter.buffer( 0 ).data();// forward + const ValueT* out1 = leafIter.buffer( 1 ).data();// backward + const LeafNodeT* leaf = acc.probeConstLeaf(leafIter->origin()); + if (leaf !=NULL) { + const ValueT* in0 = leaf->buffer().data(); + for (VoxelIterT voxelIter = leafIter->beginValueOn(); voxelIter; ++voxelIter) { + const Index i = voxelIter.pos(); + out0[i] = RealT(0.5)*( RealT(3)*in0[i] - out1[i] ); + }//loop over active voxels + } else { + for (VoxelIterT voxelIter = leafIter->beginValueOn(); voxelIter; ++voxelIter) { + const Index i = voxelIter.pos(); + out0[i] = RealT(0.5)*( RealT(3)*acc.getValue(voxelIter.getCoord()) - out1[i] ); + }//loop over active voxels + } + }//loop over leaf nodes + } + // Semi-Lagrangian integration with Runge-Kutta of various orders (1->4) + void rk(const LeafRangeT& range, RealT dt, size_t n, const VolumeGridT* grid) const + { + if (mParent->interrupt()) return; + const math::Transform& xform = mInGrid->transform(); + AccT acc = grid->getAccessor(); + for (typename LeafRangeT::Iterator leafIter = range.begin(); leafIter; ++leafIter) { + ValueT* phi = leafIter.buffer( n ).data(); + for (VoxelIterT voxelIter = leafIter->beginValueOn(); voxelIter; ++voxelIter) { + ValueT& value = phi[voxelIter.pos()]; + Vec3d wPos = xform.indexToWorld(voxelIter.getCoord()); + mVelocityInt.template rungeKutta(dt, wPos); + value = SamplerT::sample(acc, xform.worldToIndex(wPos)); + }//loop over active voxels + }//loop over leaf nodes + } + void limiter(const LeafRangeT& range, RealT dt) const + { + if (mParent->interrupt()) return; + const bool doLimiter = mParent->isLimiterOn(); + const bool doClamp = mParent->mLimiter == Scheme::CLAMP; + ValueT data[2][2][2], vMin, vMax; + const math::Transform& xform = mInGrid->transform(); + AccT acc = mInGrid->getAccessor(); + const ValueT backg = mInGrid->background(); + for (typename LeafRangeT::Iterator leafIter = range.begin(); leafIter; ++leafIter) { + ValueT* phi = leafIter.buffer( 0 ).data(); + for (VoxelIterT voxelIter = leafIter->beginValueOn(); voxelIter; ++voxelIter) { + ValueT& value = phi[voxelIter.pos()]; + + if ( doLimiter ) { + assert(OrderRK == 1); + Vec3d wPos = xform.indexToWorld(voxelIter.getCoord()); + mVelocityInt.template rungeKutta<1, Vec3d>(dt, wPos);// Explicit Euler + Vec3d iPos = xform.worldToIndex(wPos); + Coord ijk = Coord::floor( iPos ); + BoxSampler::getValues(data, acc, ijk); + BoxSampler::extrema(data, vMin, vMax); + if ( doClamp ) { + value = math::Clamp( value, vMin, vMax); + } else if (value < vMin || value > vMax ) { + iPos -= Vec3R(ijk[0], ijk[1], ijk[2]);//unit coordinates + value = BoxSampler::trilinearInterpolation( data, iPos ); + } + } + + if (math::isApproxEqual(value, backg, math::Delta::value())) { + value = backg; + leafIter->setValueOff( voxelIter.pos() ); + } + }//loop over active voxels + }//loop over leaf nodes + } + // Public member data of the private Advect class + + typename boost::function mTask; + const VolumeGridT* mInGrid; + const VelocityIntegratorT mVelocityInt;// lightweight! + const VolumeAdvection* mParent; +};// end of private member class Advect + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_VOLUME_ADVECT_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/VolumeToMesh.h b/nuparu/include/openvdb/include/openvdb/tools/VolumeToMesh.h new file mode 100644 index 00000000..f162941e --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/VolumeToMesh.h @@ -0,0 +1,4690 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_TOOLS_VOLUME_TO_MESH_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_VOLUME_TO_MESH_HAS_BEEN_INCLUDED + +#include // for OPENVDB_HAS_CXX11 +#include +#include // for COORD_OFFSETS +#include // for ISGradient +#include // for dilateVoxels() +#include +#include "Prune.h" // for pruneInactive + +#include +#include +#include +#include +#include +#include +#include + +#include +#include // for auto_ptr/unique_ptr + + +////////// + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + + +//////////////////////////////////////// + + +// Wrapper functions for the VolumeToMesh converter + + +/// @brief Uniformly mesh any scalar grid that has a continuous isosurface. +/// +/// @param grid a scalar grid to mesh +/// @param points output list of world space points +/// @param quads output quad index list +/// @param isovalue determines which isosurface to mesh +/// +/// @throw TypeError if @a grid does not have a scalar value type +template +inline void +volumeToMesh( + const GridType& grid, + std::vector& points, + std::vector& quads, + double isovalue = 0.0); + + +/// @brief Adaptively mesh any scalar grid that has a continuous isosurface. +/// +/// @param grid a scalar grid to mesh +/// @param points output list of world space points +/// @param triangles output triangle index list +/// @param quads output quad index list +/// @param isovalue determines which isosurface to mesh +/// @param adaptivity surface adaptivity threshold [0 to 1] +/// +/// @throw TypeError if @a grid does not have a scalar value type +template +inline void +volumeToMesh( + const GridType& grid, + std::vector& points, + std::vector& triangles, + std::vector& quads, + double isovalue = 0.0, + double adaptivity = 0.0); + + +//////////////////////////////////////// + + +/// @brief Polygon flags, used for reference based meshing. +enum { POLYFLAG_EXTERIOR = 0x1, POLYFLAG_FRACTURE_SEAM = 0x2, POLYFLAG_SUBDIVIDED = 0x4}; + + +/// @brief Collection of quads and triangles +class PolygonPool +{ +public: + + inline PolygonPool(); + inline PolygonPool(const size_t numQuads, const size_t numTriangles); + + + inline void copy(const PolygonPool& rhs); + + inline void resetQuads(size_t size); + inline void clearQuads(); + + inline void resetTriangles(size_t size); + inline void clearTriangles(); + + + // polygon accessor methods + + const size_t& numQuads() const { return mNumQuads; } + + openvdb::Vec4I& quad(size_t n) { return mQuads[n]; } + const openvdb::Vec4I& quad(size_t n) const { return mQuads[n]; } + + + const size_t& numTriangles() const { return mNumTriangles; } + + openvdb::Vec3I& triangle(size_t n) { return mTriangles[n]; } + const openvdb::Vec3I& triangle(size_t n) const { return mTriangles[n]; } + + + // polygon flags accessor methods + + char& quadFlags(size_t n) { return mQuadFlags[n]; } + const char& quadFlags(size_t n) const { return mQuadFlags[n]; } + + char& triangleFlags(size_t n) { return mTriangleFlags[n]; } + const char& triangleFlags(size_t n) const { return mTriangleFlags[n]; } + + + // reduce the polygon containers, n has to + // be smaller than the current container size. + + inline bool trimQuads(const size_t n, bool reallocate = false); + inline bool trimTrinagles(const size_t n, bool reallocate = false); + +private: + // disallow copy by assignment + void operator=(const PolygonPool&) {} + + size_t mNumQuads, mNumTriangles; + boost::scoped_array mQuads; + boost::scoped_array mTriangles; + boost::scoped_array mQuadFlags, mTriangleFlags; +}; + + +/// @{ +/// @brief Point and primitive list types. +typedef boost::scoped_array PointList; +typedef boost::scoped_array PolygonPoolList; +/// @} + + +//////////////////////////////////////// + + +/// @brief Mesh any scalar grid that has a continuous isosurface. +class VolumeToMesh +{ +public: + + /// @param isovalue Determines which isosurface to mesh. + /// @param adaptivity Adaptivity threshold [0 to 1] + VolumeToMesh(double isovalue = 0, double adaptivity = 0); + + + ////////// + + // Mesh data accessors + + const size_t& pointListSize() const; + PointList& pointList(); + + const size_t& polygonPoolListSize() const; + PolygonPoolList& polygonPoolList(); + const PolygonPoolList& polygonPoolList() const; + + std::vector& pointFlags(); + const std::vector& pointFlags() const; + + + ////////// + + + /// @brief Main call + /// @note Call with scalar typed grid. + template + void operator()(const GridT&); + + + ////////// + + + /// @brief When surfacing fractured SDF fragments, the original unfractured + /// SDF grid can be used to eliminate seam lines and tag polygons that are + /// coincident with the reference surface with the @c POLYFLAG_EXTERIOR + /// flag and polygons that are in proximity to the seam lines with the + /// @c POLYFLAG_FRACTURE_SEAM flag. (The performance cost for using this + /// reference based scheme compared to the regular meshing scheme is + /// approximately 15% for the first fragment and neglect-able for + /// subsequent fragments.) + /// + /// @note Attributes from the original asset such as uv coordinates, normals etc. + /// are typically transfered to polygons that are marked with the + /// @c POLYFLAG_EXTERIOR flag. Polygons that are not marked with this flag + /// are interior to reference surface and might need projected UV coordinates + /// or a different material. Polygons marked as @c POLYFLAG_FRACTURE_SEAM can + /// be used to drive secondary elements such as debris and dust in a FX pipeline. + /// + /// @param grid reference surface grid of @c GridT type. + /// @param secAdaptivity Secondary adaptivity threshold [0 to 1]. Used in regions + /// that do not exist in the reference grid. (Parts of the + /// fragment surface that are not coincident with the + /// reference surface.) + void setRefGrid(const GridBase::ConstPtr& grid, double secAdaptivity = 0); + + + /// @param mask A boolean grid whose active topology defines the region to mesh. + /// @param invertMask Toggle to mesh the complement of the mask. + /// @note The mask's tree configuration has to match @c GridT's tree configuration. + void setSurfaceMask(const GridBase::ConstPtr& mask, bool invertMask = false); + + /// @param grid A scalar grid used as a spatial multiplier for the adaptivity threshold. + /// @note The grid's tree configuration has to match @c GridT's tree configuration. + void setSpatialAdaptivity(const GridBase::ConstPtr& grid); + + + /// @param tree A boolean tree whose active topology defines the adaptivity mask. + /// @note The tree configuration has to match @c GridT's tree configuration. + void setAdaptivityMask(const TreeBase::ConstPtr& tree); + + + /// @brief Subdivide volume and mesh into disjoint parts + /// @param partitions Number of partitions. + /// @param activePart Specific partition to mesh, 0 to @c partitions - 1. + void partition(unsigned partitions = 1, unsigned activePart = 0); + +private: + + PointList mPoints; + PolygonPoolList mPolygons; + + size_t mPointListSize, mSeamPointListSize, mPolygonPoolListSize; + double mIsovalue, mPrimAdaptivity, mSecAdaptivity; + + GridBase::ConstPtr mRefGrid, mSurfaceMaskGrid, mAdaptivityGrid; + TreeBase::ConstPtr mAdaptivityMaskTree; + + TreeBase::Ptr mRefSignTree, mRefIdxTree; + + bool mInvertSurfaceMask; + unsigned mPartitions, mActivePart; + + boost::scoped_array mQuantizedSeamPoints; + + std::vector mPointFlags; +}; + + +//////////////////////////////////////// + + +/// @brief Given a set of tangent elements, @c points with corresponding @c normals, +/// this method returns the intersection point of all tangent elements. +/// +/// @note Used to extract surfaces with sharp edges and corners from volume data, +/// see the following paper for details: "Feature Sensitive Surface +/// Extraction from Volume Data, Kobbelt et al. 2001". +inline Vec3d findFeaturePoint( + const std::vector& points, + const std::vector& normals) +{ + typedef math::Mat3d Mat3d; + + Vec3d avgPos(0.0); + + if (points.empty()) return avgPos; + + for (size_t n = 0, N = points.size(); n < N; ++n) { + avgPos += points[n]; + } + + avgPos /= double(points.size()); + + // Unique components of the 3x3 A^TA matrix, where A is + // the matrix of normals. + double m00=0,m01=0,m02=0, + m11=0,m12=0, + m22=0; + + // The rhs vector, A^Tb, where b = n dot p + Vec3d rhs(0.0); + + for (size_t n = 0, N = points.size(); n < N; ++n) { + + const Vec3d& n_ref = normals[n]; + + // A^TA + m00 += n_ref[0] * n_ref[0]; // diagonal + m11 += n_ref[1] * n_ref[1]; + m22 += n_ref[2] * n_ref[2]; + + m01 += n_ref[0] * n_ref[1]; // Upper-tri + m02 += n_ref[0] * n_ref[2]; + m12 += n_ref[1] * n_ref[2]; + + // A^Tb (centered around the origin) + rhs += n_ref * n_ref.dot(points[n] - avgPos); + } + + Mat3d A(m00,m01,m02, + m01,m11,m12, + m02,m12,m22); + + /* + // Inverse + const double det = A.det(); + if (det > 0.01) { + Mat3d A_inv = A.adjoint(); + A_inv *= (1.0 / det); + + return avgPos + A_inv * rhs; + } + */ + + // Compute the pseudo inverse + + math::Mat3d eigenVectors; + Vec3d eigenValues; + + diagonalizeSymmetricMatrix(A, eigenVectors, eigenValues, 300); + + Mat3d D = Mat3d::identity(); + + + double tolerance = std::max(std::abs(eigenValues[0]), std::abs(eigenValues[1])); + tolerance = std::max(tolerance, std::abs(eigenValues[2])); + tolerance *= 0.01; + + int clamped = 0; + for (int i = 0; i < 3; ++i ) { + if (std::abs(eigenValues[i]) < tolerance) { + D[i][i] = 0.0; + ++clamped; + } else { + D[i][i] = 1.0 / eigenValues[i]; + } + } + + // Assemble the pseudo inverse and calc. the intersection point + if (clamped < 3) { + Mat3d pseudoInv = eigenVectors * D * eigenVectors.transpose(); + return avgPos + pseudoInv * rhs; + } + + return avgPos; +} + + +//////////////////////////////////////// + + +// Internal utility methods +namespace internal { + +template +struct UniquePtr +{ +#ifdef OPENVDB_HAS_CXX11 + typedef std::unique_ptr type; +#else + typedef std::auto_ptr type; +#endif +}; + + +/// @brief Bit-flags used to classify cells. +enum { SIGNS = 0xFF, EDGES = 0xE00, INSIDE = 0x100, + XEDGE = 0x200, YEDGE = 0x400, ZEDGE = 0x800, SEAM = 0x1000}; + + +/// @brief Used to quickly determine if a given cell is adaptable. +const bool sAdaptable[256] = { + 1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,1,0,1,0,0,0,1,0,1,0,1,0,1,0,1, + 1,0,1,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,0,1, + 1,0,0,0,1,0,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 1,0,1,1,1,0,1,1,0,0,0,0,1,0,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0,1, + 1,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,0,1,0,0,0,0,1,1,0,1,1,1,0,1, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,0,1,0,0,0,1, + 1,0,0,0,1,0,1,0,1,1,0,0,1,1,1,1,1,1,0,0,1,0,0,0,1,1,0,0,1,1,0,1, + 1,0,1,0,1,0,1,0,1,0,0,0,1,0,1,1,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1}; + + +/// @brief Contains the ambiguous face index for certain cell configuration. +const unsigned char sAmbiguousFace[256] = { + 0,0,0,0,0,5,0,0,0,0,5,0,0,0,0,0,0,0,1,0,0,5,1,0,4,0,0,0,4,0,0,0, + 0,1,0,0,2,0,0,0,0,1,5,0,2,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,0,0,0,0, + 0,0,2,2,0,5,0,0,3,3,0,0,0,0,0,0,6,6,0,0,6,0,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,4,0,4,3,0,3,0,0,0,5,0,0,0,0,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0, + 6,0,6,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,4,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; + + +/// @brief Lookup table for different cell sign configurations. The first entry specifies +/// the total number of points that need to be generated inside a cell and the +/// remaining 12 entries indicate different edge groups. +const unsigned char sEdgeGroupTable[256][13] = { + {0,0,0,0,0,0,0,0,0,0,0,0,0},{1,1,0,0,1,0,0,0,0,1,0,0,0},{1,1,1,0,0,0,0,0,0,0,1,0,0}, + {1,0,1,0,1,0,0,0,0,1,1,0,0},{1,0,1,1,0,0,0,0,0,0,0,1,0},{1,1,1,1,1,0,0,0,0,1,0,1,0}, + {1,1,0,1,0,0,0,0,0,0,1,1,0},{1,0,0,1,1,0,0,0,0,1,1,1,0},{1,0,0,1,1,0,0,0,0,0,0,0,1}, + {1,1,0,1,0,0,0,0,0,1,0,0,1},{1,1,1,1,1,0,0,0,0,0,1,0,1},{1,0,1,1,0,0,0,0,0,1,1,0,1}, + {1,0,1,0,1,0,0,0,0,0,0,1,1},{1,1,1,0,0,0,0,0,0,1,0,1,1},{1,1,0,0,1,0,0,0,0,0,1,1,1}, + {1,0,0,0,0,0,0,0,0,1,1,1,1},{1,0,0,0,0,1,0,0,1,1,0,0,0},{1,1,0,0,1,1,0,0,1,0,0,0,0}, + {1,1,1,0,0,1,0,0,1,1,1,0,0},{1,0,1,0,1,1,0,0,1,0,1,0,0},{2,0,1,1,0,2,0,0,2,2,0,1,0}, + {1,1,1,1,1,1,0,0,1,0,0,1,0},{1,1,0,1,0,1,0,0,1,1,1,1,0},{1,0,0,1,1,1,0,0,1,0,1,1,0}, + {1,0,0,1,1,1,0,0,1,1,0,0,1},{1,1,0,1,0,1,0,0,1,0,0,0,1},{2,2,1,1,2,1,0,0,1,2,1,0,1}, + {1,0,1,1,0,1,0,0,1,0,1,0,1},{1,0,1,0,1,1,0,0,1,1,0,1,1},{1,1,1,0,0,1,0,0,1,0,0,1,1}, + {2,1,0,0,1,2,0,0,2,1,2,2,2},{1,0,0,0,0,1,0,0,1,0,1,1,1},{1,0,0,0,0,1,1,0,0,0,1,0,0}, + {1,1,0,0,1,1,1,0,0,1,1,0,0},{1,1,1,0,0,1,1,0,0,0,0,0,0},{1,0,1,0,1,1,1,0,0,1,0,0,0}, + {1,0,1,1,0,1,1,0,0,0,1,1,0},{2,2,2,1,1,1,1,0,0,1,2,1,0},{1,1,0,1,0,1,1,0,0,0,0,1,0}, + {1,0,0,1,1,1,1,0,0,1,0,1,0},{2,0,0,2,2,1,1,0,0,0,1,0,2},{1,1,0,1,0,1,1,0,0,1,1,0,1}, + {1,1,1,1,1,1,1,0,0,0,0,0,1},{1,0,1,1,0,1,1,0,0,1,0,0,1},{1,0,1,0,1,1,1,0,0,0,1,1,1}, + {2,1,1,0,0,2,2,0,0,2,1,2,2},{1,1,0,0,1,1,1,0,0,0,0,1,1},{1,0,0,0,0,1,1,0,0,1,0,1,1}, + {1,0,0,0,0,0,1,0,1,1,1,0,0},{1,1,0,0,1,0,1,0,1,0,1,0,0},{1,1,1,0,0,0,1,0,1,1,0,0,0}, + {1,0,1,0,1,0,1,0,1,0,0,0,0},{1,0,1,1,0,0,1,0,1,1,1,1,0},{2,1,1,2,2,0,2,0,2,0,1,2,0}, + {1,1,0,1,0,0,1,0,1,1,0,1,0},{1,0,0,1,1,0,1,0,1,0,0,1,0},{1,0,0,1,1,0,1,0,1,1,1,0,1}, + {1,1,0,1,0,0,1,0,1,0,1,0,1},{2,1,2,2,1,0,2,0,2,1,0,0,2},{1,0,1,1,0,0,1,0,1,0,0,0,1}, + {2,0,2,0,2,0,1,0,1,2,2,1,1},{2,2,2,0,0,0,1,0,1,0,2,1,1},{2,2,0,0,2,0,1,0,1,2,0,1,1}, + {1,0,0,0,0,0,1,0,1,0,0,1,1},{1,0,0,0,0,0,1,1,0,0,0,1,0},{2,1,0,0,1,0,2,2,0,1,0,2,0}, + {1,1,1,0,0,0,1,1,0,0,1,1,0},{1,0,1,0,1,0,1,1,0,1,1,1,0},{1,0,1,1,0,0,1,1,0,0,0,0,0}, + {1,1,1,1,1,0,1,1,0,1,0,0,0},{1,1,0,1,0,0,1,1,0,0,1,0,0},{1,0,0,1,1,0,1,1,0,1,1,0,0}, + {1,0,0,1,1,0,1,1,0,0,0,1,1},{1,1,0,1,0,0,1,1,0,1,0,1,1},{2,1,2,2,1,0,1,1,0,0,1,2,1}, + {2,0,1,1,0,0,2,2,0,2,2,1,2},{1,0,1,0,1,0,1,1,0,0,0,0,1},{1,1,1,0,0,0,1,1,0,1,0,0,1}, + {1,1,0,0,1,0,1,1,0,0,1,0,1},{1,0,0,0,0,0,1,1,0,1,1,0,1},{1,0,0,0,0,1,1,1,1,1,0,1,0}, + {1,1,0,0,1,1,1,1,1,0,0,1,0},{2,1,1,0,0,2,2,1,1,1,2,1,0},{2,0,2,0,2,1,1,2,2,0,1,2,0}, + {1,0,1,1,0,1,1,1,1,1,0,0,0},{2,2,2,1,1,2,2,1,1,0,0,0,0},{2,2,0,2,0,1,1,2,2,2,1,0,0}, + {2,0,0,1,1,2,2,1,1,0,2,0,0},{2,0,0,1,1,1,1,2,2,1,0,1,2},{2,2,0,2,0,2,2,1,1,0,0,2,1}, + {4,3,2,2,3,4,4,1,1,3,4,2,1},{3,0,2,2,0,1,1,3,3,0,1,2,3},{2,0,2,0,2,2,2,1,1,2,0,0,1}, + {2,1,1,0,0,1,1,2,2,0,0,0,2},{3,1,0,0,1,2,2,3,3,1,2,0,3},{2,0,0,0,0,1,1,2,2,0,1,0,2}, + {1,0,0,0,0,1,0,1,0,0,1,1,0},{1,1,0,0,1,1,0,1,0,1,1,1,0},{1,1,1,0,0,1,0,1,0,0,0,1,0}, + {1,0,1,0,1,1,0,1,0,1,0,1,0},{1,0,1,1,0,1,0,1,0,0,1,0,0},{2,1,1,2,2,2,0,2,0,2,1,0,0}, + {1,1,0,1,0,1,0,1,0,0,0,0,0},{1,0,0,1,1,1,0,1,0,1,0,0,0},{1,0,0,1,1,1,0,1,0,0,1,1,1}, + {2,2,0,2,0,1,0,1,0,1,2,2,1},{2,2,1,1,2,2,0,2,0,0,0,1,2},{2,0,2,2,0,1,0,1,0,1,0,2,1}, + {1,0,1,0,1,1,0,1,0,0,1,0,1},{2,2,2,0,0,1,0,1,0,1,2,0,1},{1,1,0,0,1,1,0,1,0,0,0,0,1}, + {1,0,0,0,0,1,0,1,0,1,0,0,1},{1,0,0,0,0,0,0,1,1,1,1,1,0},{1,1,0,0,1,0,0,1,1,0,1,1,0}, + {1,1,1,0,0,0,0,1,1,1,0,1,0},{1,0,1,0,1,0,0,1,1,0,0,1,0},{1,0,1,1,0,0,0,1,1,1,1,0,0}, + {2,2,2,1,1,0,0,1,1,0,2,0,0},{1,1,0,1,0,0,0,1,1,1,0,0,0},{1,0,0,1,1,0,0,1,1,0,0,0,0}, + {2,0,0,2,2,0,0,1,1,2,2,2,1},{2,1,0,1,0,0,0,2,2,0,1,1,2},{3,2,1,1,2,0,0,3,3,2,0,1,3}, + {2,0,1,1,0,0,0,2,2,0,0,1,2},{2,0,1,0,1,0,0,2,2,1,1,0,2},{2,1,1,0,0,0,0,2,2,0,1,0,2}, + {2,1,0,0,1,0,0,2,2,1,0,0,2},{1,0,0,0,0,0,0,1,1,0,0,0,1},{1,0,0,0,0,0,0,1,1,0,0,0,1}, + {1,1,0,0,1,0,0,1,1,1,0,0,1},{2,1,1,0,0,0,0,2,2,0,1,0,2},{1,0,1,0,1,0,0,1,1,1,1,0,1}, + {1,0,1,1,0,0,0,1,1,0,0,1,1},{2,1,1,2,2,0,0,1,1,1,0,1,2},{1,1,0,1,0,0,0,1,1,0,1,1,1}, + {2,0,0,1,1,0,0,2,2,2,2,2,1},{1,0,0,1,1,0,0,1,1,0,0,0,0},{1,1,0,1,0,0,0,1,1,1,0,0,0}, + {1,1,1,1,1,0,0,1,1,0,1,0,0},{1,0,1,1,0,0,0,1,1,1,1,0,0},{1,0,1,0,1,0,0,1,1,0,0,1,0}, + {1,1,1,0,0,0,0,1,1,1,0,1,0},{1,1,0,0,1,0,0,1,1,0,1,1,0},{1,0,0,0,0,0,0,1,1,1,1,1,0}, + {1,0,0,0,0,1,0,1,0,1,0,0,1},{1,1,0,0,1,1,0,1,0,0,0,0,1},{1,1,1,0,0,1,0,1,0,1,1,0,1}, + {1,0,1,0,1,1,0,1,0,0,1,0,1},{1,0,1,1,0,1,0,1,0,1,0,1,1},{2,2,2,1,1,2,0,2,0,0,0,2,1}, + {2,1,0,1,0,2,0,2,0,1,2,2,1},{2,0,0,2,2,1,0,1,0,0,1,1,2},{1,0,0,1,1,1,0,1,0,1,0,0,0}, + {1,1,0,1,0,1,0,1,0,0,0,0,0},{2,1,2,2,1,2,0,2,0,1,2,0,0},{1,0,1,1,0,1,0,1,0,0,1,0,0}, + {1,0,1,0,1,1,0,1,0,1,0,1,0},{1,1,1,0,0,1,0,1,0,0,0,1,0},{2,2,0,0,2,1,0,1,0,2,1,1,0}, + {1,0,0,0,0,1,0,1,0,0,1,1,0},{1,0,0,0,0,1,1,1,1,0,1,0,1},{2,1,0,0,1,2,1,1,2,2,1,0,1}, + {1,1,1,0,0,1,1,1,1,0,0,0,1},{2,0,2,0,2,1,2,2,1,1,0,0,2},{2,0,1,1,0,1,2,2,1,0,1,2,1}, + {4,1,1,3,3,2,4,4,2,2,1,4,3},{2,2,0,2,0,2,1,1,2,0,0,1,2},{3,0,0,1,1,2,3,3,2,2,0,3,1}, + {1,0,0,1,1,1,1,1,1,0,1,0,0},{2,2,0,2,0,1,2,2,1,1,2,0,0},{2,2,1,1,2,2,1,1,2,0,0,0,0}, + {2,0,1,1,0,2,1,1,2,2,0,0,0},{2,0,2,0,2,2,1,1,2,0,2,1,0},{3,1,1,0,0,3,2,2,3,3,1,2,0}, + {2,1,0,0,1,1,2,2,1,0,0,2,0},{2,0,0,0,0,2,1,1,2,2,0,1,0},{1,0,0,0,0,0,1,1,0,1,1,0,1}, + {1,1,0,0,1,0,1,1,0,0,1,0,1},{1,1,1,0,0,0,1,1,0,1,0,0,1},{1,0,1,0,1,0,1,1,0,0,0,0,1}, + {2,0,2,2,0,0,1,1,0,2,2,1,2},{3,1,1,2,2,0,3,3,0,0,1,3,2},{2,1,0,1,0,0,2,2,0,1,0,2,1}, + {2,0,0,1,1,0,2,2,0,0,0,2,1},{1,0,0,1,1,0,1,1,0,1,1,0,0},{1,1,0,1,0,0,1,1,0,0,1,0,0}, + {2,2,1,1,2,0,1,1,0,2,0,0,0},{1,0,1,1,0,0,1,1,0,0,0,0,0},{2,0,1,0,1,0,2,2,0,1,1,2,0}, + {2,1,1,0,0,0,2,2,0,0,1,2,0},{2,1,0,0,1,0,2,2,0,1,0,2,0},{1,0,0,0,0,0,1,1,0,0,0,1,0}, + {1,0,0,0,0,0,1,0,1,0,0,1,1},{1,1,0,0,1,0,1,0,1,1,0,1,1},{1,1,1,0,0,0,1,0,1,0,1,1,1}, + {2,0,2,0,2,0,1,0,1,1,1,2,2},{1,0,1,1,0,0,1,0,1,0,0,0,1},{2,2,2,1,1,0,2,0,2,2,0,0,1}, + {1,1,0,1,0,0,1,0,1,0,1,0,1},{2,0,0,2,2,0,1,0,1,1,1,0,2},{1,0,0,1,1,0,1,0,1,0,0,1,0}, + {1,1,0,1,0,0,1,0,1,1,0,1,0},{2,2,1,1,2,0,2,0,2,0,2,1,0},{2,0,2,2,0,0,1,0,1,1,1,2,0}, + {1,0,1,0,1,0,1,0,1,0,0,0,0},{1,1,1,0,0,0,1,0,1,1,0,0,0},{1,1,0,0,1,0,1,0,1,0,1,0,0}, + {1,0,0,0,0,0,1,0,1,1,1,0,0},{1,0,0,0,0,1,1,0,0,1,0,1,1},{1,1,0,0,1,1,1,0,0,0,0,1,1}, + {2,2,2,0,0,1,1,0,0,2,1,2,2},{2,0,1,0,1,2,2,0,0,0,2,1,1},{1,0,1,1,0,1,1,0,0,1,0,0,1}, + {2,1,1,2,2,1,1,0,0,0,0,0,2},{2,1,0,1,0,2,2,0,0,1,2,0,1},{2,0,0,2,2,1,1,0,0,0,1,0,2}, + {1,0,0,1,1,1,1,0,0,1,0,1,0},{1,1,0,1,0,1,1,0,0,0,0,1,0},{3,1,2,2,1,3,3,0,0,1,3,2,0}, + {2,0,1,1,0,2,2,0,0,0,2,1,0},{1,0,1,0,1,1,1,0,0,1,0,0,0},{1,1,1,0,0,1,1,0,0,0,0,0,0}, + {2,2,0,0,2,1,1,0,0,2,1,0,0},{1,0,0,0,0,1,1,0,0,0,1,0,0},{1,0,0,0,0,1,0,0,1,0,1,1,1}, + {2,2,0,0,2,1,0,0,1,1,2,2,2},{1,1,1,0,0,1,0,0,1,0,0,1,1},{2,0,1,0,1,2,0,0,2,2,0,1,1}, + {1,0,1,1,0,1,0,0,1,0,1,0,1},{3,1,1,3,3,2,0,0,2,2,1,0,3},{1,1,0,1,0,1,0,0,1,0,0,0,1}, + {2,0,0,2,2,1,0,0,1,1,0,0,2},{1,0,0,1,1,1,0,0,1,0,1,1,0},{2,1,0,1,0,2,0,0,2,2,1,1,0}, + {2,1,2,2,1,1,0,0,1,0,0,2,0},{2,0,1,1,0,2,0,0,2,2,0,1,0},{1,0,1,0,1,1,0,0,1,0,1,0,0}, + {2,1,1,0,0,2,0,0,2,2,1,0,0},{1,1,0,0,1,1,0,0,1,0,0,0,0},{1,0,0,0,0,1,0,0,1,1,0,0,0}, + {1,0,0,0,0,0,0,0,0,1,1,1,1},{1,1,0,0,1,0,0,0,0,0,1,1,1},{1,1,1,0,0,0,0,0,0,1,0,1,1}, + {1,0,1,0,1,0,0,0,0,0,0,1,1},{1,0,1,1,0,0,0,0,0,1,1,0,1},{2,1,1,2,2,0,0,0,0,0,1,0,2}, + {1,1,0,1,0,0,0,0,0,1,0,0,1},{1,0,0,1,1,0,0,0,0,0,0,0,1},{1,0,0,1,1,0,0,0,0,1,1,1,0}, + {1,1,0,1,0,0,0,0,0,0,1,1,0},{2,1,2,2,1,0,0,0,0,1,0,2,0},{1,0,1,1,0,0,0,0,0,0,0,1,0}, + {1,0,1,0,1,0,0,0,0,1,1,0,0},{1,1,1,0,0,0,0,0,0,0,1,0,0},{1,1,0,0,1,0,0,0,0,1,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0}}; + + +//////////////////////////////////////// + +inline bool +isPlanarQuad( + const Vec3d& p0, const Vec3d& p1, + const Vec3d& p2, const Vec3d& p3, + double epsilon = 0.001) +{ + // compute representative plane + Vec3d normal = (p2-p0).cross(p1-p3); + normal.normalize(); + const Vec3d centroid = (p0 + p1 + p2 + p3); + const double d = centroid.dot(normal) * 0.25; + + + // test vertice distance to plane + double absDist = std::abs(p0.dot(normal) - d); + if (absDist > epsilon) return false; + + absDist = std::abs(p1.dot(normal) - d); + if (absDist > epsilon) return false; + + absDist = std::abs(p2.dot(normal) - d); + if (absDist > epsilon) return false; + + absDist = std::abs(p3.dot(normal) - d); + if (absDist > epsilon) return false; + + return true; +} + + +//////////////////////////////////////// + + +/// @{ +/// @brief Utility methods for point quantization. + +enum { + MASK_FIRST_10_BITS = 0x000003FF, + MASK_DIRTY_BIT = 0x80000000, + MASK_INVALID_BIT = 0x40000000 +}; + +inline uint32_t +packPoint(const Vec3d& v) +{ + uint32_t data = 0; + + // values are expected to be in the [0.0 to 1.0] range. + assert(!(v.x() > 1.0) && !(v.y() > 1.0) && !(v.z() > 1.0)); + assert(!(v.x() < 0.0) && !(v.y() < 0.0) && !(v.z() < 0.0)); + + data |= (uint32_t(v.x() * 1023.0) & MASK_FIRST_10_BITS) << 20; + data |= (uint32_t(v.y() * 1023.0) & MASK_FIRST_10_BITS) << 10; + data |= (uint32_t(v.z() * 1023.0) & MASK_FIRST_10_BITS); + + return data; +} + +inline Vec3d +unpackPoint(uint32_t data) +{ + Vec3d v; + v.z() = double(data & MASK_FIRST_10_BITS) * 0.0009775171; + data = data >> 10; + v.y() = double(data & MASK_FIRST_10_BITS) * 0.0009775171; + data = data >> 10; + v.x() = double(data & MASK_FIRST_10_BITS) * 0.0009775171; + + return v; +} + +/// @} + +//////////////////////////////////////// + + +/// @brief General method that computes the cell-sign configuration at the given +/// @c ijk coordinate. +template +inline unsigned char +evalCellSigns(const AccessorT& accessor, const Coord& ijk, typename AccessorT::ValueType iso) +{ + unsigned signs = 0; + Coord coord = ijk; // i, j, k + if (accessor.getValue(coord) < iso) signs |= 1u; + coord[0] += 1; // i+1, j, k + if (accessor.getValue(coord) < iso) signs |= 2u; + coord[2] += 1; // i+1, j, k+1 + if (accessor.getValue(coord) < iso) signs |= 4u; + coord[0] = ijk[0]; // i, j, k+1 + if (accessor.getValue(coord) < iso) signs |= 8u; + coord[1] += 1; coord[2] = ijk[2]; // i, j+1, k + if (accessor.getValue(coord) < iso) signs |= 16u; + coord[0] += 1; // i+1, j+1, k + if (accessor.getValue(coord) < iso) signs |= 32u; + coord[2] += 1; // i+1, j+1, k+1 + if (accessor.getValue(coord) < iso) signs |= 64u; + coord[0] = ijk[0]; // i, j+1, k+1 + if (accessor.getValue(coord) < iso) signs |= 128u; + return uint8_t(signs); +} + + +/// @brief Leaf node optimized method that computes the cell-sign configuration +/// at the given local @c offset +template +inline unsigned char +evalCellSigns(const LeafT& leaf, const Index offset, typename LeafT::ValueType iso) +{ + unsigned char signs = 0; + + // i, j, k + if (leaf.getValue(offset) < iso) signs |= 1u; + + // i, j, k+1 + if (leaf.getValue(offset + 1) < iso) signs |= 8u; + + // i, j+1, k + if (leaf.getValue(offset + LeafT::DIM) < iso) signs |= 16u; + + // i, j+1, k+1 + if (leaf.getValue(offset + LeafT::DIM + 1) < iso) signs |= 128u; + + // i+1, j, k + if (leaf.getValue(offset + (LeafT::DIM * LeafT::DIM) ) < iso) signs |= 2u; + + // i+1, j, k+1 + if (leaf.getValue(offset + (LeafT::DIM * LeafT::DIM) + 1) < iso) signs |= 4u; + + // i+1, j+1, k + if (leaf.getValue(offset + (LeafT::DIM * LeafT::DIM) + LeafT::DIM) < iso) signs |= 32u; + + // i+1, j+1, k+1 + if (leaf.getValue(offset + (LeafT::DIM * LeafT::DIM) + LeafT::DIM + 1) < iso) signs |= 64u; + + return signs; +} + + +/// @brief Used to correct topological ambiguities related to two adjacent cells +/// that share an ambiguous face. +template +inline void +correctCellSigns(unsigned char& signs, unsigned char face, + const AccessorT& acc, Coord ijk, typename AccessorT::ValueType iso) +{ + if (face == 1) { + ijk[2] -= 1; + if (sAmbiguousFace[evalCellSigns(acc, ijk, iso)] == 3) signs = uint8_t(~signs); + } else if (face == 3) { + ijk[2] += 1; + if (sAmbiguousFace[evalCellSigns(acc, ijk, iso)] == 1) signs = uint8_t(~signs); + } else if (face == 2) { + ijk[0] += 1; + if (sAmbiguousFace[evalCellSigns(acc, ijk, iso)] == 4) signs = uint8_t(~signs); + } else if (face == 4) { + ijk[0] -= 1; + if (sAmbiguousFace[evalCellSigns(acc, ijk, iso)] == 2) signs = uint8_t(~signs); + } else if (face == 5) { + ijk[1] -= 1; + if (sAmbiguousFace[evalCellSigns(acc, ijk, iso)] == 6) signs = uint8_t(~signs); + } else if (face == 6) { + ijk[1] += 1; + if (sAmbiguousFace[evalCellSigns(acc, ijk, iso)] == 5) signs = uint8_t(~signs); + } +} + + +template +inline bool +isNonManifold(const AccessorT& accessor, const Coord& ijk, + typename AccessorT::ValueType isovalue, const int dim) +{ + int hDim = dim >> 1; + bool m, p[8]; // Corner signs + + Coord coord = ijk; // i, j, k + p[0] = accessor.getValue(coord) < isovalue; + coord[0] += dim; // i+dim, j, k + p[1] = accessor.getValue(coord) < isovalue; + coord[2] += dim; // i+dim, j, k+dim + p[2] = accessor.getValue(coord) < isovalue; + coord[0] = ijk[0]; // i, j, k+dim + p[3] = accessor.getValue(coord) < isovalue; + coord[1] += dim; coord[2] = ijk[2]; // i, j+dim, k + p[4] = accessor.getValue(coord) < isovalue; + coord[0] += dim; // i+dim, j+dim, k + p[5] = accessor.getValue(coord) < isovalue; + coord[2] += dim; // i+dim, j+dim, k+dim + p[6] = accessor.getValue(coord) < isovalue; + coord[0] = ijk[0]; // i, j+dim, k+dim + p[7] = accessor.getValue(coord) < isovalue; + + // Check if the corner sign configuration is ambiguous + unsigned signs = 0; + if (p[0]) signs |= 1u; + if (p[1]) signs |= 2u; + if (p[2]) signs |= 4u; + if (p[3]) signs |= 8u; + if (p[4]) signs |= 16u; + if (p[5]) signs |= 32u; + if (p[6]) signs |= 64u; + if (p[7]) signs |= 128u; + if (!sAdaptable[signs]) return true; + + // Manifold check + + // Evaluate edges + int i = ijk[0], ip = ijk[0] + hDim, ipp = ijk[0] + dim; + int j = ijk[1], jp = ijk[1] + hDim, jpp = ijk[1] + dim; + int k = ijk[2], kp = ijk[2] + hDim, kpp = ijk[2] + dim; + + // edge 1 + coord.reset(ip, j, k); + m = accessor.getValue(coord) < isovalue; + if (p[0] != m && p[1] != m) return true; + + // edge 2 + coord.reset(ipp, j, kp); + m = accessor.getValue(coord) < isovalue; + if (p[1] != m && p[2] != m) return true; + + // edge 3 + coord.reset(ip, j, kpp); + m = accessor.getValue(coord) < isovalue; + if (p[2] != m && p[3] != m) return true; + + // edge 4 + coord.reset(i, j, kp); + m = accessor.getValue(coord) < isovalue; + if (p[0] != m && p[3] != m) return true; + + // edge 5 + coord.reset(ip, jpp, k); + m = accessor.getValue(coord) < isovalue; + if (p[4] != m && p[5] != m) return true; + + // edge 6 + coord.reset(ipp, jpp, kp); + m = accessor.getValue(coord) < isovalue; + if (p[5] != m && p[6] != m) return true; + + // edge 7 + coord.reset(ip, jpp, kpp); + m = accessor.getValue(coord) < isovalue; + if (p[6] != m && p[7] != m) return true; + + // edge 8 + coord.reset(i, jpp, kp); + m = accessor.getValue(coord) < isovalue; + if (p[7] != m && p[4] != m) return true; + + // edge 9 + coord.reset(i, jp, k); + m = accessor.getValue(coord) < isovalue; + if (p[0] != m && p[4] != m) return true; + + // edge 10 + coord.reset(ipp, jp, k); + m = accessor.getValue(coord) < isovalue; + if (p[1] != m && p[5] != m) return true; + + // edge 11 + coord.reset(ipp, jp, kpp); + m = accessor.getValue(coord) < isovalue; + if (p[2] != m && p[6] != m) return true; + + + // edge 12 + coord.reset(i, jp, kpp); + m = accessor.getValue(coord) < isovalue; + if (p[3] != m && p[7] != m) return true; + + + // Evaluate faces + + // face 1 + coord.reset(ip, jp, k); + m = accessor.getValue(coord) < isovalue; + if (p[0] != m && p[1] != m && p[4] != m && p[5] != m) return true; + + // face 2 + coord.reset(ipp, jp, kp); + m = accessor.getValue(coord) < isovalue; + if (p[1] != m && p[2] != m && p[5] != m && p[6] != m) return true; + + // face 3 + coord.reset(ip, jp, kpp); + m = accessor.getValue(coord) < isovalue; + if (p[2] != m && p[3] != m && p[6] != m && p[7] != m) return true; + + // face 4 + coord.reset(i, jp, kp); + m = accessor.getValue(coord) < isovalue; + if (p[0] != m && p[3] != m && p[4] != m && p[7] != m) return true; + + // face 5 + coord.reset(ip, j, kp); + m = accessor.getValue(coord) < isovalue; + if (p[0] != m && p[1] != m && p[2] != m && p[3] != m) return true; + + // face 6 + coord.reset(ip, jpp, kp); + m = accessor.getValue(coord) < isovalue; + if (p[4] != m && p[5] != m && p[6] != m && p[7] != m) return true; + + // test cube center + coord.reset(ip, jp, kp); + m = accessor.getValue(coord) < isovalue; + if (p[0] != m && p[1] != m && p[2] != m && p[3] != m && + p[4] != m && p[5] != m && p[6] != m && p[7] != m) return true; + + return false; +} + + +//////////////////////////////////////// + + +template +inline void +mergeVoxels(LeafType& leaf, const Coord& start, int dim, int regionId) +{ + Coord ijk, end = start; + end[0] += dim; + end[1] += dim; + end[2] += dim; + + for (ijk[0] = start[0]; ijk[0] < end[0]; ++ijk[0]) { + for (ijk[1] = start[1]; ijk[1] < end[1]; ++ijk[1]) { + for (ijk[2] = start[2]; ijk[2] < end[2]; ++ijk[2]) { + leaf.setValueOnly(ijk, regionId); + } + } + } +} + + +// Note that we must use ValueType::value_type or else Visual C++ gets confused +// thinking that it is a constructor. +template +inline bool +isMergable(LeafType& leaf, const Coord& start, int dim, + typename LeafType::ValueType::value_type adaptivity) +{ + if (adaptivity < 1e-6) return false; + + typedef typename LeafType::ValueType VecT; + Coord ijk, end = start; + end[0] += dim; + end[1] += dim; + end[2] += dim; + + std::vector norms; + for (ijk[0] = start[0]; ijk[0] < end[0]; ++ijk[0]) { + for (ijk[1] = start[1]; ijk[1] < end[1]; ++ijk[1]) { + for (ijk[2] = start[2]; ijk[2] < end[2]; ++ijk[2]) { + + if(!leaf.isValueOn(ijk)) continue; + norms.push_back(leaf.getValue(ijk)); + } + } + } + + size_t N = norms.size(); + for (size_t ni = 0; ni < N; ++ni) { + VecT n_i = norms[ni]; + for (size_t nj = 0; nj < N; ++nj) { + VecT n_j = norms[nj]; + if ((1.0 - n_i.dot(n_j)) > adaptivity) return false; + } + } + return true; +} + + +//////////////////////////////////////// + + +template +class SignData +{ +public: + typedef typename TreeT::ValueType ValueT; + typedef tree::ValueAccessor AccessorT; + + typedef typename TreeT::template ValueConverter::Type IntTreeT; + typedef tree::ValueAccessor IntAccessorT; + + typedef typename TreeT::template ValueConverter::Type Int16TreeT; + typedef tree::ValueAccessor Int16AccessorT; + + ////////// + + + SignData(const TreeT& distTree, const LeafManagerT& leafs, ValueT iso); + + void run(bool threaded = true); + + typename Int16TreeT::Ptr signTree() const { return mSignTree; } + typename IntTreeT::Ptr idxTree() const { return mIdxTree; } + + ////////// + + SignData(SignData&, tbb::split); + void operator()(const tbb::blocked_range&); + void join(const SignData& rhs) + { + mSignTree->merge(*rhs.mSignTree); + mIdxTree->merge(*rhs.mIdxTree); + } + +private: + + const TreeT& mDistTree; + AccessorT mDistAcc; + + const LeafManagerT& mLeafs; + ValueT mIsovalue; + + typename Int16TreeT::Ptr mSignTree; + Int16AccessorT mSignAcc; + + typename IntTreeT::Ptr mIdxTree; + IntAccessorT mIdxAcc; + +}; + + +template +SignData::SignData(const TreeT& distTree, + const LeafManagerT& leafs, ValueT iso) + : mDistTree(distTree) + , mDistAcc(mDistTree) + , mLeafs(leafs) + , mIsovalue(iso) + , mSignTree(new Int16TreeT(0)) + , mSignAcc(*mSignTree) + , mIdxTree(new IntTreeT(int(util::INVALID_IDX))) + , mIdxAcc(*mIdxTree) +{ +} + + +template +SignData::SignData(SignData& rhs, tbb::split) + : mDistTree(rhs.mDistTree) + , mDistAcc(mDistTree) + , mLeafs(rhs.mLeafs) + , mIsovalue(rhs.mIsovalue) + , mSignTree(new Int16TreeT(0)) + , mSignAcc(*mSignTree) + , mIdxTree(new IntTreeT(int(util::INVALID_IDX))) + , mIdxAcc(*mIdxTree) +{ +} + + +template +void +SignData::run(bool threaded) +{ + if (threaded) tbb::parallel_reduce(mLeafs.getRange(), *this); + else (*this)(mLeafs.getRange()); +} + +template +void +SignData::operator()(const tbb::blocked_range& range) +{ + typedef typename Int16TreeT::LeafNodeType Int16LeafT; + typedef typename IntTreeT::LeafNodeType IntLeafT; + typename LeafManagerT::TreeType::LeafNodeType::ValueOnCIter iter; + unsigned char signs, face; + Coord ijk, coord; + + typename internal::UniquePtr::type signLeafPt(new Int16LeafT(ijk, 0)); + + for (size_t n = range.begin(); n != range.end(); ++n) { + + bool collectedData = false; + + coord = mLeafs.leaf(n).origin(); + + if (!signLeafPt.get()) signLeafPt.reset(new Int16LeafT(coord, 0)); + else signLeafPt->setOrigin(coord); + + const typename TreeT::LeafNodeType *leafPt = mDistAcc.probeConstLeaf(coord); + + coord.offset(TreeT::LeafNodeType::DIM - 1); + + for (iter = mLeafs.leaf(n).cbeginValueOn(); iter; ++iter) { + + ijk = iter.getCoord(); + + if (leafPt && ijk[0] < coord[0] && ijk[1] < coord[1] && ijk[2] < coord[2]) { + signs = evalCellSigns(*leafPt, iter.pos(), mIsovalue); + } else { + signs = evalCellSigns(mDistAcc, ijk, mIsovalue); + } + + if (signs != 0 && signs != 0xFF) { + Int16 flags = (signs & 0x1) ? INSIDE : 0; + + if (bool(signs & 0x1) != bool(signs & 0x2)) flags |= XEDGE; + if (bool(signs & 0x1) != bool(signs & 0x10)) flags |= YEDGE; + if (bool(signs & 0x1) != bool(signs & 0x8)) flags |= ZEDGE; + + face = internal::sAmbiguousFace[signs]; + if (face != 0) correctCellSigns(signs, face, mDistAcc, ijk, mIsovalue); + + flags = Int16(flags | Int16(signs)); + + signLeafPt->setValue(ijk, flags); + collectedData = true; + } + } + + if (collectedData) { + + IntLeafT* idxLeaf = mIdxAcc.touchLeaf(coord); + idxLeaf->topologyUnion(*signLeafPt); + typename IntLeafT::ValueOnIter it = idxLeaf->beginValueOn(); + for (; it; ++it) { + it.setValue(0); + } + + mSignAcc.addLeaf(signLeafPt.release()); + } + } +} + + +//////////////////////////////////////// + + +/// @brief Counts the total number of points per leaf, accounts for cells with multiple points. +class CountPoints +{ +public: + CountPoints(std::vector& pointList) : mPointList(pointList) {} + + template + void operator()(LeafNodeType &leaf, size_t leafIndex) const + { + size_t points = 0; + + typename LeafNodeType::ValueOnCIter iter = leaf.cbeginValueOn(); + for (; iter; ++iter) { + points += size_t(sEdgeGroupTable[(SIGNS & iter.getValue())][0]); + } + + mPointList[leafIndex] = points; + } + +private: + std::vector& mPointList; +}; + + +/// @brief Computes the point list indices for the index tree. +template +class MapPoints +{ +public: + typedef tree::ValueAccessor Int16AccessorT; + + MapPoints(std::vector& pointList, const Int16TreeT& signTree) + : mPointList(pointList) + , mSignAcc(signTree) + { + } + + template + void operator()(LeafNodeType &leaf, size_t leafIndex) const + { + size_t ptnIdx = mPointList[leafIndex]; + typename LeafNodeType::ValueOnIter iter = leaf.beginValueOn(); + + const typename Int16TreeT::LeafNodeType *signLeafPt = + mSignAcc.probeConstLeaf(leaf.origin()); + + for (; iter; ++iter) { + iter.setValue(static_cast(ptnIdx)); + unsigned signs = SIGNS & signLeafPt->getValue(iter.pos()); + ptnIdx += size_t(sEdgeGroupTable[signs][0]); + } + } + +private: + std::vector& mPointList; + Int16AccessorT mSignAcc; +}; + + +/// @brief Counts the total number of points per collapsed region +template +class CountRegions +{ +public: + typedef tree::ValueAccessor IntAccessorT; + typedef typename IntTreeT::LeafNodeType IntLeafT; + + CountRegions(IntTreeT& idxTree, std::vector& regions) + : mIdxAcc(idxTree) + , mRegions(regions) + { + } + + template + void operator()(LeafNodeType &leaf, size_t leafIndex) const + { + + size_t regions = 0; + + IntLeafT tmpLeaf(*mIdxAcc.probeConstLeaf(leaf.origin())); + + typename IntLeafT::ValueOnIter iter = tmpLeaf.beginValueOn(); + for (; iter; ++iter) { + if(iter.getValue() == 0) { + iter.setValueOff(); + regions += size_t(sEdgeGroupTable[(SIGNS & leaf.getValue(iter.pos()))][0]); + } + } + + int onVoxelCount = int(tmpLeaf.onVoxelCount()); + while (onVoxelCount > 0) { + ++regions; + iter = tmpLeaf.beginValueOn(); + int regionId = iter.getValue(); + for (; iter; ++iter) { + if (iter.getValue() == regionId) { + iter.setValueOff(); + --onVoxelCount; + } + } + } + + mRegions[leafIndex] = regions; + } + +private: + IntAccessorT mIdxAcc; + std::vector& mRegions; +}; + + +//////////////////////////////////////// + + +// @brief linear interpolation. +inline double evalRoot(double v0, double v1, double iso) { return (iso - v0) / (v1 - v0); } + + +/// @brief Extracts the eight corner values for leaf inclusive cells. +template +inline void +collectCornerValues(const LeafT& leaf, const Index offset, std::vector& values) +{ + values[0] = double(leaf.getValue(offset)); // i, j, k + values[3] = double(leaf.getValue(offset + 1)); // i, j, k+1 + values[4] = double(leaf.getValue(offset + LeafT::DIM)); // i, j+1, k + values[7] = double(leaf.getValue(offset + LeafT::DIM + 1)); // i, j+1, k+1 + values[1] = double(leaf.getValue(offset + (LeafT::DIM * LeafT::DIM))); // i+1, j, k + values[2] = double(leaf.getValue(offset + (LeafT::DIM * LeafT::DIM) + 1)); // i+1, j, k+1 + values[5] = double(leaf.getValue(offset + (LeafT::DIM * LeafT::DIM) + LeafT::DIM)); // i+1, j+1, k + values[6] = double(leaf.getValue(offset + (LeafT::DIM * LeafT::DIM) + LeafT::DIM + 1)); // i+1, j+1, k+1 +} + + +/// @brief Extracts the eight corner values for a cell starting at the given @ijk coordinate. +template +inline void +collectCornerValues(const AccessorT& acc, const Coord& ijk, std::vector& values) +{ + Coord coord = ijk; + values[0] = double(acc.getValue(coord)); // i, j, k + + coord[0] += 1; + values[1] = double(acc.getValue(coord)); // i+1, j, k + + coord[2] += 1; + values[2] = double(acc.getValue(coord)); // i+i, j, k+1 + + coord[0] = ijk[0]; + values[3] = double(acc.getValue(coord)); // i, j, k+1 + + coord[1] += 1; coord[2] = ijk[2]; + values[4] = double(acc.getValue(coord)); // i, j+1, k + + coord[0] += 1; + values[5] = double(acc.getValue(coord)); // i+1, j+1, k + + coord[2] += 1; + values[6] = double(acc.getValue(coord)); // i+1, j+1, k+1 + + coord[0] = ijk[0]; + values[7] = double(acc.getValue(coord)); // i, j+1, k+1 +} + + +/// @brief Computes the average cell point for a given edge group. +inline Vec3d +computePoint(const std::vector& values, unsigned char signs, + unsigned char edgeGroup, double iso) +{ + Vec3d avg(0.0, 0.0, 0.0); + int samples = 0; + + if (sEdgeGroupTable[signs][1] == edgeGroup) { // Edged: 0 - 1 + avg[0] += evalRoot(values[0], values[1], iso); + ++samples; + } + + if (sEdgeGroupTable[signs][2] == edgeGroup) { // Edged: 1 - 2 + avg[0] += 1.0; + avg[2] += evalRoot(values[1], values[2], iso); + ++samples; + } + + if (sEdgeGroupTable[signs][3] == edgeGroup) { // Edged: 3 - 2 + avg[0] += evalRoot(values[3], values[2], iso); + avg[2] += 1.0; + ++samples; + } + + if (sEdgeGroupTable[signs][4] == edgeGroup) { // Edged: 0 - 3 + avg[2] += evalRoot(values[0], values[3], iso); + ++samples; + } + + if (sEdgeGroupTable[signs][5] == edgeGroup) { // Edged: 4 - 5 + avg[0] += evalRoot(values[4], values[5], iso); + avg[1] += 1.0; + ++samples; + } + + if (sEdgeGroupTable[signs][6] == edgeGroup) { // Edged: 5 - 6 + avg[0] += 1.0; + avg[1] += 1.0; + avg[2] += evalRoot(values[5], values[6], iso); + ++samples; + } + + if (sEdgeGroupTable[signs][7] == edgeGroup) { // Edged: 7 - 6 + avg[0] += evalRoot(values[7], values[6], iso); + avg[1] += 1.0; + avg[2] += 1.0; + ++samples; + } + + if (sEdgeGroupTable[signs][8] == edgeGroup) { // Edged: 4 - 7 + avg[1] += 1.0; + avg[2] += evalRoot(values[4], values[7], iso); + ++samples; + } + + if (sEdgeGroupTable[signs][9] == edgeGroup) { // Edged: 0 - 4 + avg[1] += evalRoot(values[0], values[4], iso); + ++samples; + } + + if (sEdgeGroupTable[signs][10] == edgeGroup) { // Edged: 1 - 5 + avg[0] += 1.0; + avg[1] += evalRoot(values[1], values[5], iso); + ++samples; + } + + if (sEdgeGroupTable[signs][11] == edgeGroup) { // Edged: 2 - 6 + avg[0] += 1.0; + avg[1] += evalRoot(values[2], values[6], iso); + avg[2] += 1.0; + ++samples; + } + + if (sEdgeGroupTable[signs][12] == edgeGroup) { // Edged: 3 - 7 + avg[1] += evalRoot(values[3], values[7], iso); + avg[2] += 1.0; + ++samples; + } + + if (samples > 1) { + double w = 1.0 / double(samples); + avg[0] *= w; + avg[1] *= w; + avg[2] *= w; + } + + return avg; +} + + +/// @brief Computes the average cell point for a given edge group, ignoring edge +/// samples present in the @c signsMask configuration. +inline int +computeMaskedPoint(Vec3d& avg, const std::vector& values, unsigned char signs, + unsigned char signsMask, unsigned char edgeGroup, double iso) +{ + avg = Vec3d(0.0, 0.0, 0.0); + int samples = 0; + + if (sEdgeGroupTable[signs][1] == edgeGroup + && sEdgeGroupTable[signsMask][1] == 0) { // Edged: 0 - 1 + avg[0] += evalRoot(values[0], values[1], iso); + ++samples; + } + + if (sEdgeGroupTable[signs][2] == edgeGroup + && sEdgeGroupTable[signsMask][2] == 0) { // Edged: 1 - 2 + avg[0] += 1.0; + avg[2] += evalRoot(values[1], values[2], iso); + ++samples; + } + + if (sEdgeGroupTable[signs][3] == edgeGroup + && sEdgeGroupTable[signsMask][3] == 0) { // Edged: 3 - 2 + avg[0] += evalRoot(values[3], values[2], iso); + avg[2] += 1.0; + ++samples; + } + + if (sEdgeGroupTable[signs][4] == edgeGroup + && sEdgeGroupTable[signsMask][4] == 0) { // Edged: 0 - 3 + avg[2] += evalRoot(values[0], values[3], iso); + ++samples; + } + + if (sEdgeGroupTable[signs][5] == edgeGroup + && sEdgeGroupTable[signsMask][5] == 0) { // Edged: 4 - 5 + avg[0] += evalRoot(values[4], values[5], iso); + avg[1] += 1.0; + ++samples; + } + + if (sEdgeGroupTable[signs][6] == edgeGroup + && sEdgeGroupTable[signsMask][6] == 0) { // Edged: 5 - 6 + avg[0] += 1.0; + avg[1] += 1.0; + avg[2] += evalRoot(values[5], values[6], iso); + ++samples; + } + + if (sEdgeGroupTable[signs][7] == edgeGroup + && sEdgeGroupTable[signsMask][7] == 0) { // Edged: 7 - 6 + avg[0] += evalRoot(values[7], values[6], iso); + avg[1] += 1.0; + avg[2] += 1.0; + ++samples; + } + + if (sEdgeGroupTable[signs][8] == edgeGroup + && sEdgeGroupTable[signsMask][8] == 0) { // Edged: 4 - 7 + avg[1] += 1.0; + avg[2] += evalRoot(values[4], values[7], iso); + ++samples; + } + + if (sEdgeGroupTable[signs][9] == edgeGroup + && sEdgeGroupTable[signsMask][9] == 0) { // Edged: 0 - 4 + avg[1] += evalRoot(values[0], values[4], iso); + ++samples; + } + + if (sEdgeGroupTable[signs][10] == edgeGroup + && sEdgeGroupTable[signsMask][10] == 0) { // Edged: 1 - 5 + avg[0] += 1.0; + avg[1] += evalRoot(values[1], values[5], iso); + ++samples; + } + + if (sEdgeGroupTable[signs][11] == edgeGroup + && sEdgeGroupTable[signsMask][11] == 0) { // Edged: 2 - 6 + avg[0] += 1.0; + avg[1] += evalRoot(values[2], values[6], iso); + avg[2] += 1.0; + ++samples; + } + + if (sEdgeGroupTable[signs][12] == edgeGroup + && sEdgeGroupTable[signsMask][12] == 0) { // Edged: 3 - 7 + avg[1] += evalRoot(values[3], values[7], iso); + avg[2] += 1.0; + ++samples; + } + + if (samples > 1) { + double w = 1.0 / double(samples); + avg[0] *= w; + avg[1] *= w; + avg[2] *= w; + } + + return samples; +} + + +/// @brief Computes the average cell point for a given edge group, by computing +/// convex weights based on the distance from the sample point @c p. +inline Vec3d +computeWeightedPoint(const Vec3d& p, const std::vector& values, + unsigned char signs, unsigned char edgeGroup, double iso) +{ + std::vector samples; + samples.reserve(8); + + std::vector weights; + weights.reserve(8); + + Vec3d avg(0.0, 0.0, 0.0); + + if (sEdgeGroupTable[signs][1] == edgeGroup) { // Edged: 0 - 1 + avg[0] = evalRoot(values[0], values[1], iso); + avg[1] = 0.0; + avg[2] = 0.0; + + samples.push_back(avg); + weights.push_back((avg-p).lengthSqr()); + } + + if (sEdgeGroupTable[signs][2] == edgeGroup) { // Edged: 1 - 2 + avg[0] = 1.0; + avg[1] = 0.0; + avg[2] = evalRoot(values[1], values[2], iso); + + samples.push_back(avg); + weights.push_back((avg-p).lengthSqr()); + } + + if (sEdgeGroupTable[signs][3] == edgeGroup) { // Edged: 3 - 2 + avg[0] = evalRoot(values[3], values[2], iso); + avg[1] = 0.0; + avg[2] = 1.0; + + samples.push_back(avg); + weights.push_back((avg-p).lengthSqr()); + } + + if (sEdgeGroupTable[signs][4] == edgeGroup) { // Edged: 0 - 3 + avg[0] = 0.0; + avg[1] = 0.0; + avg[2] = evalRoot(values[0], values[3], iso); + + samples.push_back(avg); + weights.push_back((avg-p).lengthSqr()); + } + + if (sEdgeGroupTable[signs][5] == edgeGroup) { // Edged: 4 - 5 + avg[0] = evalRoot(values[4], values[5], iso); + avg[1] = 1.0; + avg[2] = 0.0; + + samples.push_back(avg); + weights.push_back((avg-p).lengthSqr()); + } + + if (sEdgeGroupTable[signs][6] == edgeGroup) { // Edged: 5 - 6 + avg[0] = 1.0; + avg[1] = 1.0; + avg[2] = evalRoot(values[5], values[6], iso); + + samples.push_back(avg); + weights.push_back((avg-p).lengthSqr()); + } + + if (sEdgeGroupTable[signs][7] == edgeGroup) { // Edged: 7 - 6 + avg[0] = evalRoot(values[7], values[6], iso); + avg[1] = 1.0; + avg[2] = 1.0; + + samples.push_back(avg); + weights.push_back((avg-p).lengthSqr()); + } + + if (sEdgeGroupTable[signs][8] == edgeGroup) { // Edged: 4 - 7 + avg[0] = 0.0; + avg[1] = 1.0; + avg[2] = evalRoot(values[4], values[7], iso); + + samples.push_back(avg); + weights.push_back((avg-p).lengthSqr()); + } + + if (sEdgeGroupTable[signs][9] == edgeGroup) { // Edged: 0 - 4 + avg[0] = 0.0; + avg[1] = evalRoot(values[0], values[4], iso); + avg[2] = 0.0; + + samples.push_back(avg); + weights.push_back((avg-p).lengthSqr()); + } + + if (sEdgeGroupTable[signs][10] == edgeGroup) { // Edged: 1 - 5 + avg[0] = 1.0; + avg[1] = evalRoot(values[1], values[5], iso); + avg[2] = 0.0; + + samples.push_back(avg); + weights.push_back((avg-p).lengthSqr()); + } + + if (sEdgeGroupTable[signs][11] == edgeGroup) { // Edged: 2 - 6 + avg[0] = 1.0; + avg[1] = evalRoot(values[2], values[6], iso); + avg[2] = 1.0; + + samples.push_back(avg); + weights.push_back((avg-p).lengthSqr()); + } + + if (sEdgeGroupTable[signs][12] == edgeGroup) { // Edged: 3 - 7 + avg[0] = 0.0; + avg[1] = evalRoot(values[3], values[7], iso); + avg[2] = 1.0; + + samples.push_back(avg); + weights.push_back((avg-p).lengthSqr()); + } + + + double minWeight = std::numeric_limits::max(); + double maxWeight = -std::numeric_limits::max(); + + for (size_t i = 0, I = weights.size(); i < I; ++i) { + minWeight = std::min(minWeight, weights[i]); + maxWeight = std::max(maxWeight, weights[i]); + } + + const double offset = maxWeight + minWeight * 0.1; + for (size_t i = 0, I = weights.size(); i < I; ++i) { + weights[i] = offset - weights[i]; + } + + + double weightSum = 0.0; + for (size_t i = 0, I = weights.size(); i < I; ++i) { + weightSum += weights[i]; + } + + avg[0] = 0.0; + avg[1] = 0.0; + avg[2] = 0.0; + + if (samples.size() > 1) { + for (size_t i = 0, I = samples.size(); i < I; ++i) { + avg += samples[i] * (weights[i] / weightSum); + } + } else { + avg = samples.front(); + } + + return avg; +} + + +/// @brief Computes the average cell points defined by the sign configuration +/// @c signs and the given corner values @c values. +inline void +computeCellPoints(std::vector& points, + const std::vector& values, unsigned char signs, double iso) +{ + for (size_t n = 1, N = sEdgeGroupTable[signs][0] + 1; n < N; ++n) { + points.push_back(computePoint(values, signs, uint8_t(n), iso)); + } +} + + +/// @brief Given a sign configuration @c lhsSigns and an edge group @c groupId, +/// finds the corresponding edge group in a different sign configuration +/// @c rhsSigns. Returns -1 if no match is found. +inline int +matchEdgeGroup(unsigned char groupId, unsigned char lhsSigns, unsigned char rhsSigns) +{ + int id = -1; + for (size_t i = 1; i <= 12; ++i) { + if (sEdgeGroupTable[lhsSigns][i] == groupId && sEdgeGroupTable[rhsSigns][i] != 0) { + id = sEdgeGroupTable[rhsSigns][i]; + break; + } + } + return id; +} + + +/// @brief Computes the average cell points defined by the sign configuration +/// @c signs and the given corner values @c values. Combines data from +/// two different level sets to eliminate seam lines when meshing +/// fractured segments. +inline void +computeCellPoints(std::vector& points, std::vector& weightedPointMask, + const std::vector& lhsValues, const std::vector& rhsValues, + unsigned char lhsSigns, unsigned char rhsSigns, + double iso, size_t pointIdx, const boost::scoped_array& seamPoints) +{ + for (size_t n = 1, N = sEdgeGroupTable[lhsSigns][0] + 1; n < N; ++n) { + + int id = matchEdgeGroup(uint8_t(n), lhsSigns, rhsSigns); + + if (id != -1) { + + const unsigned char e = uint8_t(id); + uint32_t& quantizedPoint = seamPoints[pointIdx + (id - 1)]; + + if ((quantizedPoint & MASK_DIRTY_BIT) && !(quantizedPoint & MASK_INVALID_BIT)) { + Vec3d p = unpackPoint(quantizedPoint); + points.push_back(computeWeightedPoint(p, rhsValues, rhsSigns, e, iso)); + weightedPointMask.push_back(true); + } else { + points.push_back(computePoint(rhsValues, rhsSigns, e, iso)); + weightedPointMask.push_back(false); + } + + } else { + points.push_back(computePoint(lhsValues, lhsSigns, uint8_t(n), iso)); + weightedPointMask.push_back(false); + } + } +} + + +template +class GenPoints +{ +public: + typedef tree::ValueAccessor AccessorT; + + typedef typename TreeT::template ValueConverter::Type IntTreeT; + typedef tree::ValueAccessor IntAccessorT; + typedef tree::ValueAccessor IntCAccessorT; + + typedef typename TreeT::template ValueConverter::Type Int16TreeT; + typedef tree::ValueAccessor Int16CAccessorT; + + typedef boost::scoped_array QuantizedPointList; + + ////////// + + + GenPoints(const LeafManagerT& signLeafs, const TreeT& distTree, + IntTreeT& idxTree, PointList& points, std::vector& indices, + const math::Transform& xform, double iso); + + void run(bool threaded = true); + + void setRefData(const Int16TreeT* refSignTree = NULL, const TreeT* refDistTree = NULL, + IntTreeT* refIdxTree = NULL, const QuantizedPointList* seamPoints = NULL, + std::vector* mSeamPointMaskPt = NULL); + + ////////// + + + void operator()(const tbb::blocked_range&) const; + +private: + const LeafManagerT& mSignLeafs; + + AccessorT mDistAcc; + IntTreeT& mIdxTree; + + PointList& mPoints; + std::vector& mIndices; + const math::Transform& mTransform; + const double mIsovalue; + + // reference data + const Int16TreeT *mRefSignTreePt; + const TreeT* mRefDistTreePt; + const IntTreeT* mRefIdxTreePt; + const QuantizedPointList* mSeamPointsPt; + std::vector* mSeamPointMaskPt; +}; + + +template +GenPoints::GenPoints(const LeafManagerT& signLeafs, + const TreeT& distTree, IntTreeT& idxTree, PointList& points, + std::vector& indices, const math::Transform& xform, double iso) + : mSignLeafs(signLeafs) + , mDistAcc(distTree) + , mIdxTree(idxTree) + , mPoints(points) + , mIndices(indices) + , mTransform(xform) + , mIsovalue(iso) + , mRefSignTreePt(NULL) + , mRefDistTreePt(NULL) + , mRefIdxTreePt(NULL) + , mSeamPointsPt(NULL) + , mSeamPointMaskPt(NULL) +{ +} + + +template +void +GenPoints::run(bool threaded) +{ + if (threaded) tbb::parallel_for(mSignLeafs.getRange(), *this); + else (*this)(mSignLeafs.getRange()); +} + + +template +void +GenPoints::setRefData( + const Int16TreeT *refSignTree, + const TreeT *refDistTree, + IntTreeT* refIdxTree, + const QuantizedPointList* seamPoints, + std::vector* seamPointMask) +{ + mRefSignTreePt = refSignTree; + mRefDistTreePt = refDistTree; + mRefIdxTreePt = refIdxTree; + mSeamPointsPt = seamPoints; + mSeamPointMaskPt = seamPointMask; +} + + +template +void +GenPoints::operator()(const tbb::blocked_range& range) const +{ + typename IntTreeT::LeafNodeType::ValueOnIter iter; + unsigned char signs, refSigns; + Index offset; + Coord ijk, coord; + std::vector points(4); + std::vector weightedPointMask(4); + std::vector values(8), refValues(8); + + + IntAccessorT idxAcc(mIdxTree); + + // reference data accessors + boost::scoped_ptr refSignAcc; + if (mRefSignTreePt) refSignAcc.reset(new Int16CAccessorT(*mRefSignTreePt)); + + boost::scoped_ptr refIdxAcc; + if (mRefIdxTreePt) refIdxAcc.reset(new IntCAccessorT(*mRefIdxTreePt)); + + boost::scoped_ptr refDistAcc; + if (mRefDistTreePt) refDistAcc.reset(new AccessorT(*mRefDistTreePt)); + + + for (size_t n = range.begin(); n != range.end(); ++n) { + + coord = mSignLeafs.leaf(n).origin(); + + const typename TreeT::LeafNodeType *leafPt = mDistAcc.probeConstLeaf(coord); + typename IntTreeT::LeafNodeType *idxLeafPt = idxAcc.probeLeaf(coord); + + + // reference data leafs + const typename Int16TreeT::LeafNodeType *refSignLeafPt = NULL; + if (refSignAcc) refSignLeafPt = refSignAcc->probeConstLeaf(coord); + + const typename IntTreeT::LeafNodeType *refIdxLeafPt = NULL; + if (refIdxAcc) refIdxLeafPt = refIdxAcc->probeConstLeaf(coord); + + const typename TreeT::LeafNodeType *refDistLeafPt = NULL; + if (refDistAcc) refDistLeafPt = refDistAcc->probeConstLeaf(coord); + + + // generate cell points + size_t ptnIdx = mIndices[n]; + coord.offset(TreeT::LeafNodeType::DIM - 1); + + + + for (iter = idxLeafPt->beginValueOn(); iter; ++iter) { + + if(iter.getValue() != 0) continue; + + iter.setValue(static_cast(ptnIdx)); + iter.setValueOff(); + offset = iter.pos(); + ijk = iter.getCoord(); + + const bool inclusiveCell = ijk[0] < coord[0] && ijk[1] < coord[1] && ijk[2] < coord[2]; + + const Int16& flags = mSignLeafs.leaf(n).getValue(offset); + signs = uint8_t(SIGNS & flags); + refSigns = 0; + + if ((flags & SEAM) && refSignLeafPt && refIdxLeafPt) { + if (refSignLeafPt->isValueOn(offset)) { + refSigns = uint8_t(SIGNS & refSignLeafPt->getValue(offset)); + } + } + + + if (inclusiveCell) collectCornerValues(*leafPt, offset, values); + else collectCornerValues(mDistAcc, ijk, values); + + + points.clear(); + weightedPointMask.clear(); + + if (refSigns == 0) { + computeCellPoints(points, values, signs, mIsovalue); + } else { + + if (inclusiveCell) collectCornerValues(*refDistLeafPt, offset, refValues); + else collectCornerValues(*refDistAcc, ijk, refValues); + + computeCellPoints(points, weightedPointMask, values, refValues, signs, refSigns, + mIsovalue, refIdxLeafPt->getValue(offset), *mSeamPointsPt); + } + + + for (size_t i = 0, I = points.size(); i < I; ++i) { + + // offset by cell-origin + points[i][0] += double(ijk[0]); + points[i][1] += double(ijk[1]); + points[i][2] += double(ijk[2]); + + + points[i] = mTransform.indexToWorld(points[i]); + + mPoints[ptnIdx][0] = float(points[i][0]); + mPoints[ptnIdx][1] = float(points[i][1]); + mPoints[ptnIdx][2] = float(points[i][2]); + + if (mSeamPointMaskPt && !weightedPointMask.empty() && weightedPointMask[i]) { + (*mSeamPointMaskPt)[ptnIdx] = 1; + } + + ++ptnIdx; + } + } + + // generate collapsed region points + int onVoxelCount = int(idxLeafPt->onVoxelCount()); + while (onVoxelCount > 0) { + + iter = idxLeafPt->beginValueOn(); + int regionId = iter.getValue(), count = 0; + + Vec3d avg(0.0), point; + + for (; iter; ++iter) { + if (iter.getValue() != regionId) continue; + + iter.setValue(static_cast(ptnIdx)); + iter.setValueOff(); + --onVoxelCount; + + ijk = iter.getCoord(); + offset = iter.pos(); + + signs = uint8_t(SIGNS & mSignLeafs.leaf(n).getValue(offset)); + + if (ijk[0] < coord[0] && ijk[1] < coord[1] && ijk[2] < coord[2]) { + collectCornerValues(*leafPt, offset, values); + } else { + collectCornerValues(mDistAcc, ijk, values); + } + + points.clear(); + computeCellPoints(points, values, signs, mIsovalue); + + avg[0] += double(ijk[0]) + points[0][0]; + avg[1] += double(ijk[1]) + points[0][1]; + avg[2] += double(ijk[2]) + points[0][2]; + + ++count; + } + + + if (count > 1) { + double w = 1.0 / double(count); + avg[0] *= w; + avg[1] *= w; + avg[2] *= w; + } + + avg = mTransform.indexToWorld(avg); + + mPoints[ptnIdx][0] = float(avg[0]); + mPoints[ptnIdx][1] = float(avg[1]); + mPoints[ptnIdx][2] = float(avg[2]); + + ++ptnIdx; + } + } +} + + +//////////////////////////////////////// + + +template +class SeamWeights +{ +public: + typedef tree::ValueAccessor AccessorT; + + typedef typename TreeT::template ValueConverter::Type IntTreeT; + typedef tree::ValueAccessor IntAccessorT; + + typedef typename TreeT::template ValueConverter::Type Int16TreeT; + typedef tree::ValueAccessor Int16AccessorT; + + typedef boost::scoped_array QuantizedPointList; + + ////////// + + SeamWeights(const TreeT& distTree, const Int16TreeT& refSignTree, + IntTreeT& refIdxTree, QuantizedPointList& points, double iso); + + template + void operator()(LeafNodeType &signLeaf, size_t leafIndex) const; + +private: + AccessorT mDistAcc; + Int16AccessorT mRefSignAcc; + IntAccessorT mRefIdxAcc; + + QuantizedPointList& mPoints; + const double mIsovalue; +}; + + +template +SeamWeights::SeamWeights(const TreeT& distTree, const Int16TreeT& refSignTree, + IntTreeT& refIdxTree, QuantizedPointList& points, double iso) + : mDistAcc(distTree) + , mRefSignAcc(refSignTree) + , mRefIdxAcc(refIdxTree) + , mPoints(points) + , mIsovalue(iso) +{ +} + + +template +template +void +SeamWeights::operator()(LeafNodeType &signLeaf, size_t /*leafIndex*/) const +{ + Coord coord = signLeaf.origin(); + const typename Int16TreeT::LeafNodeType *refSignLeafPt = mRefSignAcc.probeConstLeaf(coord); + + if (!refSignLeafPt) return; + + const typename TreeT::LeafNodeType *distLeafPt = mDistAcc.probeConstLeaf(coord); + const typename IntTreeT::LeafNodeType *refIdxLeafPt = mRefIdxAcc.probeConstLeaf(coord); + + std::vector values(8); + unsigned char lhsSigns, rhsSigns; + Vec3d point; + Index offset; + + Coord ijk; + coord.offset(TreeT::LeafNodeType::DIM - 1); + + typename LeafNodeType::ValueOnCIter iter = signLeaf.cbeginValueOn(); + for (; iter; ++iter) { + + offset = iter.pos(); + ijk = iter.getCoord(); + + const bool inclusiveCell = ijk[0] < coord[0] && ijk[1] < coord[1] && ijk[2] < coord[2]; + + if ((iter.getValue() & SEAM) && refSignLeafPt->isValueOn(offset)) { + + lhsSigns = uint8_t(SIGNS & iter.getValue()); + rhsSigns = uint8_t(SIGNS & refSignLeafPt->getValue(offset)); + + + if (inclusiveCell) { + collectCornerValues(*distLeafPt, offset, values); + } else { + collectCornerValues(mDistAcc, ijk, values); + } + + + for (size_t n = 1, N = sEdgeGroupTable[lhsSigns][0] + 1; n < N; ++n) { + + int id = matchEdgeGroup(uint8_t(n), lhsSigns, rhsSigns); + + if (id != -1) { + + uint32_t& data = mPoints[refIdxLeafPt->getValue(offset) + (id - 1)]; + + if (!(data & MASK_DIRTY_BIT)) { + + int smaples = computeMaskedPoint( + point, values, lhsSigns, rhsSigns, uint8_t(n), mIsovalue); + + if (smaples > 0) data = packPoint(point); + else data = MASK_INVALID_BIT; + + data |= MASK_DIRTY_BIT; + } + } + } + } + } +} + + +//////////////////////////////////////// + + +template +class MergeVoxelRegions +{ +public: + typedef typename TreeT::ValueType ValueT; + typedef tree::ValueAccessor AccessorT; + + typedef typename TreeT::template ValueConverter::Type IntTreeT; + typedef tree::ValueAccessor IntAccessorT; + + typedef typename TreeT::template ValueConverter::Type BoolTreeT; + + typedef typename LeafManagerT::TreeType::template ValueConverter::Type Int16TreeT; + typedef tree::ValueAccessor Int16AccessorT; + + typedef typename TreeT::template ValueConverter::Type FloatTreeT; + typedef Grid FloatGridT; + + + ////////// + + MergeVoxelRegions(const LeafManagerT& signLeafs, const Int16TreeT& signTree, + const TreeT& distTree, IntTreeT& idxTree, ValueT iso, ValueT adaptivity); + + void run(bool threaded = true); + + void setSpatialAdaptivity( + const math::Transform& distGridXForm, const FloatGridT& adaptivityField); + + void setAdaptivityMask(const BoolTreeT* mask); + + void setRefData(const Int16TreeT* signTree, ValueT adaptivity); + + ////////// + + + void operator()(const tbb::blocked_range&) const; + +private: + + const LeafManagerT& mSignLeafs; + + const Int16TreeT& mSignTree; + Int16AccessorT mSignAcc; + + const TreeT& mDistTree; + AccessorT mDistAcc; + + IntTreeT& mIdxTree; + ValueT mIsovalue, mSurfaceAdaptivity, mInternalAdaptivity; + + const math::Transform* mTransform; + const FloatGridT* mAdaptivityGrid; + const BoolTreeT* mAdaptivityMask; + + const Int16TreeT* mRefSignTree; +}; + + +template +MergeVoxelRegions::MergeVoxelRegions( + const LeafManagerT& signLeafs, const Int16TreeT& signTree, + const TreeT& distTree, IntTreeT& idxTree, ValueT iso, ValueT adaptivity) + : mSignLeafs(signLeafs) + , mSignTree(signTree) + , mSignAcc(mSignTree) + , mDistTree(distTree) + , mDistAcc(mDistTree) + , mIdxTree(idxTree) + , mIsovalue(iso) + , mSurfaceAdaptivity(adaptivity) + , mInternalAdaptivity(adaptivity) + , mTransform(NULL) + , mAdaptivityGrid(NULL) + , mAdaptivityMask(NULL) + , mRefSignTree(NULL) +{ +} + + +template +void +MergeVoxelRegions::run(bool threaded) +{ + if (threaded) tbb::parallel_for(mSignLeafs.getRange(), *this); + else (*this)(mSignLeafs.getRange()); +} + + +template +void +MergeVoxelRegions::setSpatialAdaptivity( + const math::Transform& distGridXForm, const FloatGridT& adaptivityField) +{ + mTransform = &distGridXForm; + mAdaptivityGrid = &adaptivityField; +} + + +template +void +MergeVoxelRegions::setAdaptivityMask(const BoolTreeT* mask) +{ + mAdaptivityMask = mask; +} + +template +void +MergeVoxelRegions::setRefData(const Int16TreeT* signTree, ValueT adaptivity) +{ + mRefSignTree = signTree; + mInternalAdaptivity = adaptivity; +} + + +template +void +MergeVoxelRegions::operator()(const tbb::blocked_range& range) const +{ + typedef math::Vec3 Vec3T; + + typedef typename TreeT::LeafNodeType LeafT; + typedef typename IntTreeT::LeafNodeType IntLeafT; + typedef typename BoolTreeT::LeafNodeType BoolLeafT; + typedef typename LeafT::template ValueConverter::Type Vec3LeafT; + + const int LeafDim = LeafT::DIM; + + IntAccessorT idxAcc(mIdxTree); + + typename LeafManagerT::TreeType::LeafNodeType::ValueOnCIter iter; + + typedef typename tree::ValueAccessor FloatTreeCAccessorT; + boost::scoped_ptr adaptivityAcc; + if (mAdaptivityGrid) { + adaptivityAcc.reset(new FloatTreeCAccessorT(mAdaptivityGrid->tree())); + } + + typedef typename tree::ValueAccessor Int16TreeCAccessorT; + boost::scoped_ptr refAcc; + if (mRefSignTree) { + refAcc.reset(new Int16TreeCAccessorT(*mRefSignTree)); + } + + typedef typename tree::ValueAccessor BoolTreeCAccessorT; + boost::scoped_ptr maskAcc; + if (mAdaptivityMask) { + maskAcc.reset(new BoolTreeCAccessorT(*mAdaptivityMask)); + } + + + BoolLeafT mask; + Vec3LeafT gradients; + Coord ijk, end; + + for (size_t n = range.begin(); n != range.end(); ++n) { + + mask.setValuesOff(); + + const Coord& origin = mSignLeafs.leaf(n).origin(); + + ValueT adaptivity = (refAcc && !refAcc->probeConstLeaf(origin)) ? + mInternalAdaptivity : mSurfaceAdaptivity; + + IntLeafT& idxLeaf = *idxAcc.probeLeaf(origin); + + end[0] = origin[0] + LeafDim; + end[1] = origin[1] + LeafDim; + end[2] = origin[2] + LeafDim; + + // Mask off seam line adjacent voxels + if (maskAcc) { + const BoolLeafT* maskLeaf = maskAcc->probeConstLeaf(origin); + if (maskLeaf != NULL) { + typename BoolLeafT::ValueOnCIter it; + for (it = maskLeaf->cbeginValueOn(); it; ++it) { + mask.setActiveState(it.getCoord() & ~1u, true); + } + } + } + + // Set region adaptivity + LeafT adaptivityLeaf(origin, adaptivity); + if (mAdaptivityGrid) { + for (Index offset = 0; offset < LeafT::NUM_VALUES; ++offset) { + ijk = adaptivityLeaf.offsetToGlobalCoord(offset); + Vec3d xyz = mAdaptivityGrid->transform().worldToIndex( + mTransform->indexToWorld(ijk)); + ValueT tmpA = ValueT(adaptivityAcc->getValue(util::nearestCoord(xyz))); + adaptivityLeaf.setValueOnly(offset, tmpA * adaptivity); + } + } + + // Mask off ambiguous voxels + for (iter = mSignLeafs.leaf(n).cbeginValueOn(); iter; ++iter) { + unsigned char signs = static_cast(SIGNS & int(iter.getValue())); + if (!sAdaptable[signs] || sEdgeGroupTable[signs][0] > 1) { + mask.setActiveState(iter.getCoord() & ~1u, true); + } + } + + // Mask off topologically ambiguous 2x2x2 voxel sub-blocks + int dim = 2; + for (ijk[0] = origin[0]; ijk[0] < end[0]; ijk[0] += dim) { + for (ijk[1] = origin[1]; ijk[1] < end[1]; ijk[1] += dim) { + for (ijk[2] = origin[2]; ijk[2] < end[2]; ijk[2] += dim) { + if (!mask.isValueOn(ijk) & isNonManifold(mDistAcc, ijk, mIsovalue, dim)) { + mask.setActiveState(ijk, true); + } + } + } + } + + // Compute the gradient for the remaining voxels + gradients.setValuesOff(); + for (iter = mSignLeafs.leaf(n).cbeginValueOn(); iter; ++iter) { + ijk = iter.getCoord(); + if(!mask.isValueOn(ijk & ~1u)) { + Vec3T dir(math::ISGradient::result(mDistAcc, ijk)); + dir.normalize(); + gradients.setValueOn(iter.pos(), dir); + } + } + + // Merge regions + int regionId = 1; + for ( ; dim <= LeafDim; dim = dim << 1) { + const unsigned coordMask = ~((dim << 1) - 1); + for (ijk[0] = origin[0]; ijk[0] < end[0]; ijk[0] += dim) { + for (ijk[1] = origin[1]; ijk[1] < end[1]; ijk[1] += dim) { + for (ijk[2] = origin[2]; ijk[2] < end[2]; ijk[2] += dim) { + + adaptivity = adaptivityLeaf.getValue(ijk); + + if (mask.isValueOn(ijk) || isNonManifold(mDistAcc, ijk, mIsovalue, dim) + || !isMergable(gradients, ijk, dim, adaptivity)) { + mask.setActiveState(ijk & coordMask, true); + } else { + mergeVoxels(idxLeaf, ijk, dim, regionId++); + } + } + } + } + } + } +} + + +//////////////////////////////////////// + + +// Constructs qudas +struct UniformPrimBuilder +{ + UniformPrimBuilder(): mIdx(0), mPolygonPool(NULL) {} + + void init(const size_t upperBound, PolygonPool& quadPool) + { + mPolygonPool = &quadPool; + mPolygonPool->resetQuads(upperBound); + mIdx = 0; + } + + void addPrim(const Vec4I& verts, bool reverse, char flags = 0) + { + if (!reverse) { + mPolygonPool->quad(mIdx) = verts; + } else { + Vec4I& quad = mPolygonPool->quad(mIdx); + quad[0] = verts[3]; + quad[1] = verts[2]; + quad[2] = verts[1]; + quad[3] = verts[0]; + } + mPolygonPool->quadFlags(mIdx) = flags; + ++mIdx; + } + + void done() + { + mPolygonPool->trimQuads(mIdx); + } + +private: + size_t mIdx; + PolygonPool* mPolygonPool; +}; + + +// Constructs qudas and triangles +struct AdaptivePrimBuilder +{ + AdaptivePrimBuilder() : mQuadIdx(0), mTriangleIdx(0), mPolygonPool(NULL) {} + + void init(const size_t upperBound, PolygonPool& polygonPool) + { + mPolygonPool = &polygonPool; + mPolygonPool->resetQuads(upperBound); + mPolygonPool->resetTriangles(upperBound); + + mQuadIdx = 0; + mTriangleIdx = 0; + } + + void addPrim(const Vec4I& verts, bool reverse, char flags = 0) + { + if (verts[0] != verts[1] && verts[0] != verts[2] && verts[0] != verts[3] + && verts[1] != verts[2] && verts[1] != verts[3] && verts[2] != verts[3]) { + mPolygonPool->quadFlags(mQuadIdx) = flags; + addQuad(verts, reverse); + } else if ( + verts[0] == verts[3] && + verts[1] != verts[2] && + verts[1] != verts[0] && + verts[2] != verts[0]) { + mPolygonPool->triangleFlags(mTriangleIdx) = flags; + addTriangle(verts[0], verts[1], verts[2], reverse); + } else if ( + verts[1] == verts[2] && + verts[0] != verts[3] && + verts[0] != verts[1] && + verts[3] != verts[1]) { + mPolygonPool->triangleFlags(mTriangleIdx) = flags; + addTriangle(verts[0], verts[1], verts[3], reverse); + } else if ( + verts[0] == verts[1] && + verts[2] != verts[3] && + verts[2] != verts[0] && + verts[3] != verts[0]) { + mPolygonPool->triangleFlags(mTriangleIdx) = flags; + addTriangle(verts[0], verts[2], verts[3], reverse); + } else if ( + verts[2] == verts[3] && + verts[0] != verts[1] && + verts[0] != verts[2] && + verts[1] != verts[2]) { + mPolygonPool->triangleFlags(mTriangleIdx) = flags; + addTriangle(verts[0], verts[1], verts[2], reverse); + } + } + + + void done() + { + mPolygonPool->trimQuads(mQuadIdx, /*reallocate=*/true); + mPolygonPool->trimTrinagles(mTriangleIdx, /*reallocate=*/true); + } + +private: + + void addQuad(const Vec4I& verts, bool reverse) + { + if (!reverse) { + mPolygonPool->quad(mQuadIdx) = verts; + } else { + Vec4I& quad = mPolygonPool->quad(mQuadIdx); + quad[0] = verts[3]; + quad[1] = verts[2]; + quad[2] = verts[1]; + quad[3] = verts[0]; + } + ++mQuadIdx; + } + + void addTriangle(unsigned v0, unsigned v1, unsigned v2, bool reverse) + { + Vec3I& prim = mPolygonPool->triangle(mTriangleIdx); + + prim[1] = v1; + + if (!reverse) { + prim[0] = v0; + prim[2] = v2; + } else { + prim[0] = v2; + prim[2] = v0; + } + ++mTriangleIdx; + } + + size_t mQuadIdx, mTriangleIdx; + PolygonPool *mPolygonPool; +}; + + +template +inline void +constructPolygons(Int16 flags, Int16 refFlags, const Vec4i& offsets, const Coord& ijk, + const SignAccT& signAcc, const IdxAccT& idxAcc, PrimBuilder& mesher, Index32 pointListSize) +{ + const Index32 v0 = idxAcc.getValue(ijk); + if (v0 == util::INVALID_IDX) return; + + char tag[2]; + tag[0] = (flags & SEAM) ? POLYFLAG_FRACTURE_SEAM : 0; + tag[1] = tag[0] | char(POLYFLAG_EXTERIOR); + + const bool isInside = flags & INSIDE; + + Coord coord; + openvdb::Vec4I quad; + unsigned char cell; + Index32 tmpIdx = 0; + + if (flags & XEDGE) { + + quad[0] = v0 + offsets[0]; + + // i, j-1, k + coord[0] = ijk[0]; + coord[1] = ijk[1] - 1; + coord[2] = ijk[2]; + + quad[1] = idxAcc.getValue(coord); + cell = uint8_t(SIGNS & signAcc.getValue(coord)); + if (sEdgeGroupTable[cell][0] > 1) { + tmpIdx = quad[1] + Index32(sEdgeGroupTable[cell][5] - 1); + if (tmpIdx < pointListSize) quad[1] = tmpIdx; + } + + // i, j-1, k-1 + coord[2] -= 1; + + quad[2] = idxAcc.getValue(coord); + cell = uint8_t(SIGNS & signAcc.getValue(coord)); + if (sEdgeGroupTable[cell][0] > 1) { + tmpIdx = quad[2] + Index32(sEdgeGroupTable[cell][7] - 1); + if (tmpIdx < pointListSize) quad[2] = tmpIdx; + } + + // i, j, k-1 + coord[1] = ijk[1]; + + quad[3] = idxAcc.getValue(coord); + cell = uint8_t(SIGNS & signAcc.getValue(coord)); + if (sEdgeGroupTable[cell][0] > 1) { + tmpIdx = quad[3] + Index32(sEdgeGroupTable[cell][3] - 1); + if (tmpIdx < pointListSize) quad[3] = tmpIdx; + } + + if (quad[1] != util::INVALID_IDX && + quad[2] != util::INVALID_IDX && quad[3] != util::INVALID_IDX) { + mesher.addPrim(quad, isInside, tag[bool(refFlags & XEDGE)]); + } + } + + + if (flags & YEDGE) { + + quad[0] = v0 + offsets[1]; + + // i, j, k-1 + coord[0] = ijk[0]; + coord[1] = ijk[1]; + coord[2] = ijk[2] - 1; + + quad[1] = idxAcc.getValue(coord); + cell = uint8_t(SIGNS & signAcc.getValue(coord)); + if (sEdgeGroupTable[cell][0] > 1) { + tmpIdx = quad[1] + Index32(sEdgeGroupTable[cell][12] - 1); + if (tmpIdx < pointListSize) quad[1] = tmpIdx; + } + + // i-1, j, k-1 + coord[0] -= 1; + + quad[2] = idxAcc.getValue(coord); + cell = uint8_t(SIGNS & signAcc.getValue(coord)); + if (sEdgeGroupTable[cell][0] > 1) { + tmpIdx = quad[2] + Index32(sEdgeGroupTable[cell][11] - 1); + if (tmpIdx < pointListSize) quad[2] = tmpIdx; + } + + // i-1, j, k + coord[2] = ijk[2]; + + quad[3] = idxAcc.getValue(coord); + cell = uint8_t(SIGNS & signAcc.getValue(coord)); + if (sEdgeGroupTable[cell][0] > 1) { + tmpIdx = quad[3] + Index32(sEdgeGroupTable[cell][10] - 1); + if (tmpIdx < pointListSize) quad[3] = tmpIdx; + } + + if (quad[1] != util::INVALID_IDX && + quad[2] != util::INVALID_IDX && quad[3] != util::INVALID_IDX) { + mesher.addPrim(quad, isInside, tag[bool(refFlags & YEDGE)]); + } + } + + if (flags & ZEDGE) { + + quad[0] = v0 + offsets[2]; + + // i, j-1, k + coord[0] = ijk[0]; + coord[1] = ijk[1] - 1; + coord[2] = ijk[2]; + + quad[1] = idxAcc.getValue(coord); + cell = uint8_t(SIGNS & signAcc.getValue(coord)); + if (sEdgeGroupTable[cell][0] > 1) { + tmpIdx = quad[1] + Index32(sEdgeGroupTable[cell][8] - 1); + if (tmpIdx < pointListSize) quad[1] = tmpIdx; + } + + // i-1, j-1, k + coord[0] -= 1; + + quad[2] = idxAcc.getValue(coord); + cell = uint8_t(SIGNS & signAcc.getValue(coord)); + if (sEdgeGroupTable[cell][0] > 1) { + tmpIdx = quad[2] + Index32(sEdgeGroupTable[cell][6] - 1); + if (tmpIdx < pointListSize) quad[2] = tmpIdx; + } + + // i-1, j, k + coord[1] = ijk[1]; + + quad[3] = idxAcc.getValue(coord); + cell = uint8_t(SIGNS & signAcc.getValue(coord)); + if (sEdgeGroupTable[cell][0] > 1) { + tmpIdx = quad[3] + Index32(sEdgeGroupTable[cell][2] - 1); + if (tmpIdx < pointListSize) quad[3] = tmpIdx; + } + + if (quad[1] != util::INVALID_IDX && + quad[2] != util::INVALID_IDX && quad[3] != util::INVALID_IDX) { + mesher.addPrim(quad, !isInside, tag[bool(refFlags & ZEDGE)]); + } + } +} + + +//////////////////////////////////////// + + +template +class GenPolygons +{ +public: + typedef typename LeafManagerT::TreeType::template ValueConverter::Type IntTreeT; + typedef typename LeafManagerT::TreeType::template ValueConverter::Type Int16TreeT; + + typedef tree::ValueAccessor IntAccessorT; + typedef tree::ValueAccessor Int16AccessorT; + + ////////// + + + GenPolygons(const LeafManagerT& signLeafs, const Int16TreeT& signTree, + const IntTreeT& idxTree, PolygonPoolList& polygons, Index32 pointListSize); + + void run(bool threaded = true); + + + void setRefSignTree(const Int16TreeT *r) { mRefSignTree = r; } + + ////////// + + + void operator()(const tbb::blocked_range&) const; + +private: + const LeafManagerT& mSignLeafs; + const Int16TreeT& mSignTree; + const IntTreeT& mIdxTree; + const PolygonPoolList& mPolygonPoolList; + const Index32 mPointListSize; + + const Int16TreeT *mRefSignTree; + }; + + +template +GenPolygons::GenPolygons(const LeafManagerT& signLeafs, + const Int16TreeT& signTree, const IntTreeT& idxTree, PolygonPoolList& polygons, + Index32 pointListSize) + : mSignLeafs(signLeafs) + , mSignTree(signTree) + , mIdxTree(idxTree) + , mPolygonPoolList(polygons) + , mPointListSize(pointListSize) + , mRefSignTree(NULL) +{ +} + +template +void +GenPolygons::run(bool threaded) +{ + if (threaded) tbb::parallel_for(mSignLeafs.getRange(), *this); + else (*this)(mSignLeafs.getRange()); +} + +template +void +GenPolygons::operator()( + const tbb::blocked_range& range) const +{ + typename LeafManagerT::TreeType::LeafNodeType::ValueOnCIter iter; + IntAccessorT idxAcc(mIdxTree); + Int16AccessorT signAcc(mSignTree); + + + PrimBuilder mesher; + size_t edgeCount; + Coord ijk, origin; + + + // reference data + boost::scoped_ptr refSignAcc; + if (mRefSignTree) refSignAcc.reset(new Int16AccessorT(*mRefSignTree)); + + + for (size_t n = range.begin(); n != range.end(); ++n) { + + origin = mSignLeafs.leaf(n).origin(); + + // Get an upper bound on the number of primitives. + edgeCount = 0; + iter = mSignLeafs.leaf(n).cbeginValueOn(); + for (; iter; ++iter) { + if (iter.getValue() & XEDGE) ++edgeCount; + if (iter.getValue() & YEDGE) ++edgeCount; + if (iter.getValue() & ZEDGE) ++edgeCount; + } + + if(edgeCount == 0) continue; + + mesher.init(edgeCount, mPolygonPoolList[n]); + + const typename Int16TreeT::LeafNodeType *signleafPt = signAcc.probeConstLeaf(origin); + const typename IntTreeT::LeafNodeType *idxLeafPt = idxAcc.probeConstLeaf(origin); + + if (!signleafPt || !idxLeafPt) continue; + + + const typename Int16TreeT::LeafNodeType *refSignLeafPt = NULL; + if (refSignAcc) refSignLeafPt = refSignAcc->probeConstLeaf(origin); + + Vec4i offsets; + + iter = mSignLeafs.leaf(n).cbeginValueOn(); + for (; iter; ++iter) { + ijk = iter.getCoord(); + + Int16 flags = iter.getValue(); + + if (!(flags & 0xE00)) continue; + + Int16 refFlags = 0; + if (refSignLeafPt) { + refFlags = refSignLeafPt->getValue(iter.pos()); + } + + offsets[0] = 0; + offsets[1] = 0; + offsets[2] = 0; + + const unsigned char cell = uint8_t(SIGNS & flags); + + if (sEdgeGroupTable[cell][0] > 1) { + offsets[0] = (sEdgeGroupTable[cell][1] - 1); + offsets[1] = (sEdgeGroupTable[cell][9] - 1); + offsets[2] = (sEdgeGroupTable[cell][4] - 1); + } + + if (ijk[0] > origin[0] && ijk[1] > origin[1] && ijk[2] > origin[2]) { + constructPolygons(flags, refFlags, offsets, ijk, + *signleafPt, *idxLeafPt, mesher, mPointListSize); + } else { + constructPolygons(flags, refFlags, offsets, ijk, + signAcc, idxAcc, mesher, mPointListSize); + } + } + + mesher.done(); + } +} + + +//////////////////////////////////////// + +// Masking and mesh partitioning + +struct PartOp +{ + + PartOp(size_t leafCount, size_t partitions, size_t activePart) + { + size_t leafSegments = leafCount / partitions; + mStart = leafSegments * activePart; + mEnd = activePart >= (partitions - 1) ? leafCount : mStart + leafSegments; + } + + template + void operator()(LeafNodeType &leaf, size_t leafIndex) const + { + if (leafIndex < mStart || leafIndex >= mEnd) leaf.setValuesOff(); + } + +private: + size_t mStart, mEnd; +}; + + +//////////////////////////////////////// + + +template +class PartGen +{ +public: + typedef tree::LeafManager LeafManagerT; + typedef typename SrcTreeT::template ValueConverter::Type BoolTreeT; + typedef tree::ValueAccessor BoolAccessorT; + + ////////// + + + PartGen(const LeafManagerT& leafs, size_t partitions, size_t activePart); + + void run(bool threaded = true); + + BoolTreeT& tree() { return mTree; } + + + ////////// + + PartGen(PartGen&, tbb::split); + void operator()(const tbb::blocked_range&); + void join(PartGen& rhs) { mTree.merge(rhs.mTree); } + +private: + const LeafManagerT& mLeafManager; + BoolTreeT mTree; + size_t mStart, mEnd; +}; + +template +PartGen::PartGen(const LeafManagerT& leafs, size_t partitions, size_t activePart) + : mLeafManager(leafs) + , mTree(false) + , mStart(0) + , mEnd(0) +{ + size_t leafCount = leafs.leafCount(); + size_t leafSegments = leafCount / partitions; + mStart = leafSegments * activePart; + mEnd = activePart >= (partitions - 1) ? leafCount : mStart + leafSegments; +} + +template +PartGen::PartGen(PartGen& rhs, tbb::split) + : mLeafManager(rhs.mLeafManager) + , mTree(false) + , mStart(rhs.mStart) + , mEnd(rhs.mEnd) +{ +} + + +template +void +PartGen::run(bool threaded) +{ + if (threaded) tbb::parallel_reduce(mLeafManager.getRange(), *this); + else (*this)(mLeafManager.getRange()); +} + + +template +void +PartGen::operator()(const tbb::blocked_range& range) +{ + Coord ijk; + BoolAccessorT acc(mTree); + + typedef typename BoolTreeT::LeafNodeType BoolLeafT; + typename SrcTreeT::LeafNodeType::ValueOnCIter iter; + + for (size_t n = range.begin(); n != range.end(); ++n) { + if (n < mStart || n >= mEnd) continue; + BoolLeafT* leaf = acc.touchLeaf(mLeafManager.leaf(n).origin()); + leaf->topologyUnion(mLeafManager.leaf(n)); + } +} + + +//////////////////////////////////////// + + +template +class GenSeamMask +{ +public: + typedef typename TreeT::template ValueConverter::Type BoolTreeT; + + ////////// + + GenSeamMask(const LeafManagerT& leafs, const TreeT& tree); + + void run(bool threaded = true); + + BoolTreeT& mask() { return mMaskTree; } + + ////////// + + GenSeamMask(GenSeamMask&, tbb::split); + void operator()(const tbb::blocked_range&); + void join(GenSeamMask& rhs) { mMaskTree.merge(rhs.mMaskTree); } + +private: + + const LeafManagerT& mLeafManager; + const TreeT& mTree; + + BoolTreeT mMaskTree; +}; + + +template +GenSeamMask::GenSeamMask(const LeafManagerT& leafs, const TreeT& tree) + : mLeafManager(leafs) + , mTree(tree) + , mMaskTree(false) +{ +} + + +template +GenSeamMask::GenSeamMask(GenSeamMask& rhs, tbb::split) + : mLeafManager(rhs.mLeafManager) + , mTree(rhs.mTree) + , mMaskTree(false) +{ +} + + +template +void +GenSeamMask::run(bool threaded) +{ + if (threaded) tbb::parallel_reduce(mLeafManager.getRange(), *this); + else (*this)(mLeafManager.getRange()); +} + + +template +void +GenSeamMask::operator()(const tbb::blocked_range& range) +{ + Coord ijk; + tree::ValueAccessor acc(mTree); + tree::ValueAccessor maskAcc(mMaskTree); + + typename LeafManagerT::TreeType::LeafNodeType::ValueOnCIter it; + + for (size_t n = range.begin(); n != range.end(); ++n) { + + it = mLeafManager.leaf(n).cbeginValueOn(); + + for (; it; ++it) { + + ijk = it.getCoord(); + + unsigned char rhsSigns = uint8_t(acc.getValue(ijk) & SIGNS); + + if (sEdgeGroupTable[rhsSigns][0] > 0) { + unsigned char lhsSigns = uint8_t(it.getValue() & SIGNS); + if (rhsSigns != lhsSigns) { + maskAcc.setValueOn(ijk); + } + } + } + } +} + + +//////////////////////////////////////// + + +template +class TagSeamEdges +{ +public: + typedef tree::ValueAccessor AccessorT; + + TagSeamEdges(const TreeT& tree) : mAcc(tree) {} + + template + void operator()(LeafNodeType &leaf, size_t/*leafIndex*/) const + { + const typename TreeT::LeafNodeType *maskLeaf = + mAcc.probeConstLeaf(leaf.origin()); + + if (!maskLeaf) return; + + typename LeafNodeType::ValueOnIter it = leaf.beginValueOn(); + + for (; it; ++it) { + + if (maskLeaf->isValueOn(it.pos())) { + it.setValue(it.getValue() | SEAM); + } + } + } + +private: + AccessorT mAcc; +}; + + + +template +struct MaskEdges +{ + typedef tree::ValueAccessor BoolAccessorT; + + MaskEdges(const BoolTreeT& valueMask) : mMaskAcc(valueMask) {} + + template + void operator()(LeafNodeType &leaf, size_t /*leafIndex*/) const + { + typename LeafNodeType::ValueOnIter it = leaf.beginValueOn(); + + const typename BoolTreeT::LeafNodeType * maskLeaf = + mMaskAcc.probeConstLeaf(leaf.origin()); + + if (maskLeaf) { + for (; it; ++it) { + if (!maskLeaf->isValueOn(it.pos())) { + it.setValue(0x1FF & it.getValue()); + } + } + } else { + for (; it; ++it) { + it.setValue(0x1FF & it.getValue()); + } + } + } + +private: + BoolAccessorT mMaskAcc; +}; + + +class FlagUsedPoints +{ +public: + ////////// + + FlagUsedPoints(const PolygonPoolList& polygons, size_t polyListCount, + std::vector& usedPointMask) + : mPolygons(polygons) + , mPolyListCount(polyListCount) + , mUsedPointMask(usedPointMask) + { + } + + void run(bool threaded = true) + { + if (threaded) { + tbb::parallel_for(tbb::blocked_range(0, mPolyListCount), *this); + } else { + (*this)(tbb::blocked_range(0, mPolyListCount)); + } + } + + ////////// + + void operator()(const tbb::blocked_range& range) const + { + // Concurrent writes to same memory address can occur, but + // all threads are writing the same value and char is atomic. + for (size_t n = range.begin(); n != range.end(); ++n) { + const PolygonPool& polygons = mPolygons[n]; + for (size_t i = 0; i < polygons.numQuads(); ++i) { + const Vec4I& quad = polygons.quad(i); + mUsedPointMask[quad[0]] = 1; + mUsedPointMask[quad[1]] = 1; + mUsedPointMask[quad[2]] = 1; + mUsedPointMask[quad[3]] = 1; + } + + for (size_t i = 0; i < polygons.numTriangles(); ++i) { + const Vec3I& triangle = polygons.triangle(i); + mUsedPointMask[triangle[0]] = 1; + mUsedPointMask[triangle[1]] = 1; + mUsedPointMask[triangle[2]] = 1; + } + } + } + + +private: + const PolygonPoolList& mPolygons; + size_t mPolyListCount; + std::vector& mUsedPointMask; +}; + +class RemapIndices +{ +public: + ////////// + + RemapIndices(PolygonPoolList& polygons, + size_t polyListCount, const std::vector& indexMap) + : mPolygons(polygons) + , mPolyListCount(polyListCount) + , mIndexMap(indexMap) + { + } + + void run(bool threaded = true) + { + if (threaded) { + tbb::parallel_for(tbb::blocked_range(0, mPolyListCount), *this); + } else { + (*this)(tbb::blocked_range(0, mPolyListCount)); + } + } + + ////////// + + void operator()(const tbb::blocked_range& range) const + { + for (size_t n = range.begin(); n != range.end(); ++n) { + PolygonPool& polygons = mPolygons[n]; + for (size_t i = 0; i < polygons.numQuads(); ++i) { + Vec4I& quad = polygons.quad(i); + quad[0] = mIndexMap[quad[0]]; + quad[1] = mIndexMap[quad[1]]; + quad[2] = mIndexMap[quad[2]]; + quad[3] = mIndexMap[quad[3]]; + } + + for (size_t i = 0; i < polygons.numTriangles(); ++i) { + Vec3I& triangle = polygons.triangle(i); + triangle[0] = mIndexMap[triangle[0]]; + triangle[1] = mIndexMap[triangle[1]]; + triangle[2] = mIndexMap[triangle[2]]; + } + } + } + + +private: + PolygonPoolList& mPolygons; + size_t mPolyListCount; + const std::vector& mIndexMap; +}; + + +class MovePoints +{ +public: + ////////// + + MovePoints( + internal::UniquePtr::type& newPointList, + const PointList& oldPointList, + const std::vector& indexMap, + const std::vector& usedPointMask) + : mNewPointList(newPointList) + , mOldPointList(oldPointList) + , mIndexMap(indexMap) + , mUsedPointMask(usedPointMask) + { + } + + void run(bool threaded = true) + { + if (threaded) { + tbb::parallel_for(tbb::blocked_range(0, mIndexMap.size()), *this); + } else { + (*this)(tbb::blocked_range(0, mIndexMap.size())); + } + } + + ////////// + + void operator()(const tbb::blocked_range& range) const + { + for (size_t n = range.begin(); n != range.end(); ++n) { + if (mUsedPointMask[n]) { + const size_t index = mIndexMap[n]; + mNewPointList.get()[index] = mOldPointList[n]; + } + } + } + +private: + internal::UniquePtr::type& mNewPointList; + const PointList& mOldPointList; + const std::vector& mIndexMap; + const std::vector& mUsedPointMask; +}; + + +//////////////////////////////////////// + + +template +class GenTopologyMask +{ +public: + typedef tree::LeafManager LeafManagerT; + typedef typename SrcTreeT::template ValueConverter::Type BoolTreeT; + typedef tree::ValueAccessor SrcAccessorT; + typedef tree::ValueAccessor BoolAccessorT; + typedef Grid BoolGridT; + + + ////////// + + + GenTopologyMask(const BoolGridT& mask, const LeafManagerT& srcLeafs, + const math::Transform& srcXForm, bool invertMask); + + void run(bool threaded = true); + + BoolTreeT& tree() { return mTree; } + + + ////////// + + GenTopologyMask(GenTopologyMask&, tbb::split); + + void operator()(const tbb::blocked_range&); + + void join(GenTopologyMask& rhs) { mTree.merge(rhs.mTree); } + +private: + + const BoolGridT& mMask; + const LeafManagerT& mLeafManager; + const math::Transform& mSrcXForm; + bool mInvertMask; + BoolTreeT mTree; +}; + + +template +GenTopologyMask::GenTopologyMask(const BoolGridT& mask, const LeafManagerT& srcLeafs, + const math::Transform& srcXForm, bool invertMask) + : mMask(mask) + , mLeafManager(srcLeafs) + , mSrcXForm(srcXForm) + , mInvertMask(invertMask) + , mTree(false) +{ +} + + +template +GenTopologyMask::GenTopologyMask(GenTopologyMask& rhs, tbb::split) + : mMask(rhs.mMask) + , mLeafManager(rhs.mLeafManager) + , mSrcXForm(rhs.mSrcXForm) + , mInvertMask(rhs.mInvertMask) + , mTree(false) +{ +} + + +template +void +GenTopologyMask::run(bool threaded) +{ + if (threaded) { + tbb::parallel_reduce(mLeafManager.getRange(), *this); + } else { + (*this)(mLeafManager.getRange()); + } +} + + +template +void +GenTopologyMask::operator()(const tbb::blocked_range& range) +{ + Coord ijk; + Vec3d xyz; + typedef typename BoolTreeT::LeafNodeType BoolLeafT; + const math::Transform& maskXForm = mMask.transform(); + tree::ValueAccessor maskAcc(mMask.tree()); + tree::ValueAccessor acc(mTree); + + typename SrcTreeT::LeafNodeType::ValueOnCIter iter; + for (size_t n = range.begin(); n != range.end(); ++n) { + + ijk = mLeafManager.leaf(n).origin(); + BoolLeafT* leaf = new BoolLeafT(ijk, false); + bool addLeaf = false; + + if (maskXForm == mSrcXForm) { + + const BoolLeafT* maskLeaf = maskAcc.probeConstLeaf(ijk); + + if (maskLeaf) { + + for (iter = mLeafManager.leaf(n).cbeginValueOn(); iter; ++iter) { + Index pos = iter.pos(); + if(maskLeaf->isValueOn(pos) != mInvertMask) { + leaf->setValueOn(pos); + addLeaf = true; + } + } + + } else if (maskAcc.isValueOn(ijk) != mInvertMask) { + leaf->topologyUnion(mLeafManager.leaf(n)); + addLeaf = true; + } + + } else { + for (iter = mLeafManager.leaf(n).cbeginValueOn(); iter; ++iter) { + ijk = iter.getCoord(); + xyz = maskXForm.worldToIndex(mSrcXForm.indexToWorld(ijk)); + if(maskAcc.isValueOn(util::nearestCoord(xyz)) != mInvertMask) { + leaf->setValueOn(iter.pos()); + addLeaf = true; + } + } + } + + if (addLeaf) acc.addLeaf(leaf); + else delete leaf; + } +} + + +//////////////////////////////////////// + + +template +class GenBoundaryMask +{ +public: + typedef typename SrcTreeT::template ValueConverter::Type IntTreeT; + typedef typename SrcTreeT::template ValueConverter::Type BoolTreeT; + typedef tree::LeafManager LeafManagerT; + + ////////// + + GenBoundaryMask(const LeafManagerT& leafs, const BoolTreeT&, const IntTreeT&); + + void run(bool threaded = true); + + BoolTreeT& tree() { return mTree; } + + ////////// + + GenBoundaryMask(GenBoundaryMask&, tbb::split); + void operator()(const tbb::blocked_range&); + void join(GenBoundaryMask& rhs) { mTree.merge(rhs.mTree); } + +private: + // This typedef is needed for Windows + typedef tree::ValueAccessor IntTreeAccessorT; + + bool neighboringLeaf(const Coord&, const IntTreeAccessorT&) const; + + const LeafManagerT& mLeafManager; + const BoolTreeT& mMaskTree; + const IntTreeT& mIdxTree; + BoolTreeT mTree; + CoordBBox mLeafBBox; +}; + + +template +GenBoundaryMask::GenBoundaryMask(const LeafManagerT& leafs, + const BoolTreeT& maskTree, const IntTreeT& auxTree) + : mLeafManager(leafs) + , mMaskTree(maskTree) + , mIdxTree(auxTree) + , mTree(false) +{ + mIdxTree.evalLeafBoundingBox(mLeafBBox); + mLeafBBox.expand(IntTreeT::LeafNodeType::DIM); +} + + +template +GenBoundaryMask::GenBoundaryMask(GenBoundaryMask& rhs, tbb::split) + : mLeafManager(rhs.mLeafManager) + , mMaskTree(rhs.mMaskTree) + , mIdxTree(rhs.mIdxTree) + , mTree(false) + , mLeafBBox(rhs.mLeafBBox) +{ +} + + +template +void +GenBoundaryMask::run(bool threaded) +{ + if (threaded) { + tbb::parallel_reduce(mLeafManager.getRange(), *this); + } else { + (*this)(mLeafManager.getRange()); + } +} + + +template +bool +GenBoundaryMask::neighboringLeaf(const Coord& ijk, const IntTreeAccessorT& acc) const +{ + if (acc.probeConstLeaf(ijk)) return true; + + const int dim = IntTreeT::LeafNodeType::DIM; + + // face adjacent neghbours + if (acc.probeConstLeaf(Coord(ijk[0] + dim, ijk[1], ijk[2]))) return true; + if (acc.probeConstLeaf(Coord(ijk[0] - dim, ijk[1], ijk[2]))) return true; + if (acc.probeConstLeaf(Coord(ijk[0], ijk[1] + dim, ijk[2]))) return true; + if (acc.probeConstLeaf(Coord(ijk[0], ijk[1] - dim, ijk[2]))) return true; + if (acc.probeConstLeaf(Coord(ijk[0], ijk[1], ijk[2] + dim))) return true; + if (acc.probeConstLeaf(Coord(ijk[0], ijk[1], ijk[2] - dim))) return true; + + // edge adjacent neighbors + if (acc.probeConstLeaf(Coord(ijk[0] + dim, ijk[1], ijk[2] - dim))) return true; + if (acc.probeConstLeaf(Coord(ijk[0] - dim, ijk[1], ijk[2] - dim))) return true; + if (acc.probeConstLeaf(Coord(ijk[0] + dim, ijk[1], ijk[2] + dim))) return true; + if (acc.probeConstLeaf(Coord(ijk[0] - dim, ijk[1], ijk[2] + dim))) return true; + if (acc.probeConstLeaf(Coord(ijk[0] + dim, ijk[1] + dim, ijk[2]))) return true; + if (acc.probeConstLeaf(Coord(ijk[0] - dim, ijk[1] + dim, ijk[2]))) return true; + if (acc.probeConstLeaf(Coord(ijk[0] + dim, ijk[1] - dim, ijk[2]))) return true; + if (acc.probeConstLeaf(Coord(ijk[0] - dim, ijk[1] - dim, ijk[2]))) return true; + if (acc.probeConstLeaf(Coord(ijk[0], ijk[1] - dim, ijk[2] + dim))) return true; + if (acc.probeConstLeaf(Coord(ijk[0], ijk[1] - dim, ijk[2] - dim))) return true; + if (acc.probeConstLeaf(Coord(ijk[0], ijk[1] + dim, ijk[2] + dim))) return true; + if (acc.probeConstLeaf(Coord(ijk[0], ijk[1] + dim, ijk[2] - dim))) return true; + + // corner adjacent neighbors + if (acc.probeConstLeaf(Coord(ijk[0] - dim, ijk[1] - dim, ijk[2] - dim))) return true; + if (acc.probeConstLeaf(Coord(ijk[0] - dim, ijk[1] - dim, ijk[2] + dim))) return true; + if (acc.probeConstLeaf(Coord(ijk[0] + dim, ijk[1] - dim, ijk[2] + dim))) return true; + if (acc.probeConstLeaf(Coord(ijk[0] + dim, ijk[1] - dim, ijk[2] - dim))) return true; + if (acc.probeConstLeaf(Coord(ijk[0] - dim, ijk[1] + dim, ijk[2] - dim))) return true; + if (acc.probeConstLeaf(Coord(ijk[0] - dim, ijk[1] + dim, ijk[2] + dim))) return true; + if (acc.probeConstLeaf(Coord(ijk[0] + dim, ijk[1] + dim, ijk[2] + dim))) return true; + if (acc.probeConstLeaf(Coord(ijk[0] + dim, ijk[1] + dim, ijk[2] - dim))) return true; + + return false; +} + + +template +void +GenBoundaryMask::operator()(const tbb::blocked_range& range) +{ + Coord ijk; + tree::ValueAccessor maskAcc(mMaskTree); + tree::ValueAccessor idxAcc(mIdxTree); + tree::ValueAccessor acc(mTree); + + typename SrcTreeT::LeafNodeType::ValueOnCIter iter; + + for (size_t n = range.begin(); n != range.end(); ++n) { + + const typename SrcTreeT::LeafNodeType& + leaf = mLeafManager.leaf(n); + + ijk = leaf.origin(); + + if (!mLeafBBox.isInside(ijk) || !neighboringLeaf(ijk, idxAcc)) continue; + + const typename BoolTreeT::LeafNodeType* + maskLeaf = maskAcc.probeConstLeaf(ijk); + + if (!maskLeaf || !leaf.hasSameTopology(maskLeaf)) { + acc.touchLeaf(ijk)->topologyUnion(leaf); + } + } +} + + +//////////////////////////////////////// + + +template +class GenTileMask +{ +public: + typedef typename TreeT::template ValueConverter::Type BoolTreeT; + + typedef typename TreeT::ValueType ValueT; + + ////////// + + GenTileMask(const std::vector& tiles, const TreeT& distTree, ValueT iso); + + void run(bool threaded = true); + + BoolTreeT& tree() { return mTree; } + + ////////// + + GenTileMask(GenTileMask&, tbb::split); + void operator()(const tbb::blocked_range&); + void join(GenTileMask& rhs) { mTree.merge(rhs.mTree); } + +private: + + const std::vector& mTiles; + const TreeT& mDistTree; + ValueT mIsovalue; + + BoolTreeT mTree; +}; + + +template +GenTileMask::GenTileMask( + const std::vector& tiles, const TreeT& distTree, ValueT iso) + : mTiles(tiles) + , mDistTree(distTree) + , mIsovalue(iso) + , mTree(false) +{ +} + + +template +GenTileMask::GenTileMask(GenTileMask& rhs, tbb::split) + : mTiles(rhs.mTiles) + , mDistTree(rhs.mDistTree) + , mIsovalue(rhs.mIsovalue) + , mTree(false) +{ +} + + +template +void +GenTileMask::run(bool threaded) +{ + if (threaded) tbb::parallel_reduce(tbb::blocked_range(0, mTiles.size()), *this); + else (*this)(tbb::blocked_range(0, mTiles.size())); +} + + +template +void +GenTileMask::operator()(const tbb::blocked_range& range) +{ + tree::ValueAccessor distAcc(mDistTree); + CoordBBox region, bbox; + Coord ijk, nijk; + bool processRegion = true; + ValueT value; + + + for (size_t n = range.begin(); n != range.end(); ++n) { + + const Vec4i& tile = mTiles[n]; + + bbox.min()[0] = tile[0]; + bbox.min()[1] = tile[1]; + bbox.min()[2] = tile[2]; + + bbox.max() = bbox.min(); + bbox.max().offset(tile[3]); + + const bool thisInside = (distAcc.getValue(bbox.min()) < mIsovalue); + const int thisDepth = distAcc.getValueDepth(bbox.min()); + + // eval x-edges + + ijk = bbox.max(); + nijk = ijk; + ++nijk[0]; + + processRegion = true; + if (thisDepth >= distAcc.getValueDepth(nijk)) { + processRegion = thisInside != (distAcc.getValue(nijk) < mIsovalue); + } + + + if (processRegion) { + region = bbox; + region.min()[0] = region.max()[0] = ijk[0]; + mTree.fill(region, true); + } + + + ijk = bbox.min(); + --ijk[0]; + + processRegion = true; + if (thisDepth >= distAcc.getValueDepth(ijk)) { + processRegion = !distAcc.probeValue(ijk, value) && thisInside != (value < mIsovalue); + } + + if (processRegion) { + region = bbox; + region.min()[0] = region.max()[0] = ijk[0]; + mTree.fill(region, true); + } + + + // eval y-edges + + ijk = bbox.max(); + nijk = ijk; + ++nijk[1]; + + processRegion = true; + if (thisDepth >= distAcc.getValueDepth(nijk)) { + processRegion = thisInside != (distAcc.getValue(nijk) < mIsovalue); + } + + if (processRegion) { + region = bbox; + region.min()[1] = region.max()[1] = ijk[1]; + mTree.fill(region, true); + } + + + ijk = bbox.min(); + --ijk[1]; + + processRegion = true; + if (thisDepth >= distAcc.getValueDepth(ijk)) { + processRegion = !distAcc.probeValue(ijk, value) && thisInside != (value < mIsovalue); + } + + if (processRegion) { + region = bbox; + region.min()[1] = region.max()[1] = ijk[1]; + mTree.fill(region, true); + } + + + // eval z-edges + + ijk = bbox.max(); + nijk = ijk; + ++nijk[2]; + + processRegion = true; + if (thisDepth >= distAcc.getValueDepth(nijk)) { + processRegion = thisInside != (distAcc.getValue(nijk) < mIsovalue); + } + + if (processRegion) { + region = bbox; + region.min()[2] = region.max()[2] = ijk[2]; + mTree.fill(region, true); + } + + ijk = bbox.min(); + --ijk[2]; + + processRegion = true; + if (thisDepth >= distAcc.getValueDepth(ijk)) { + processRegion = !distAcc.probeValue(ijk, value) && thisInside != (value < mIsovalue); + } + + if (processRegion) { + region = bbox; + region.min()[2] = region.max()[2] = ijk[2]; + mTree.fill(region, true); + } + + + ijk = bbox.min(); + --ijk[1]; + --ijk[2]; + + processRegion = true; + if (thisDepth >= distAcc.getValueDepth(ijk)) { + processRegion = !distAcc.probeValue(ijk, value) && thisInside != (value < mIsovalue); + } + + if (processRegion) { + region = bbox; + region.min()[1] = region.max()[1] = ijk[1]; + region.min()[2] = region.max()[2] = ijk[2]; + mTree.fill(region, true); + } + + + ijk = bbox.min(); + --ijk[0]; + --ijk[1]; + + processRegion = true; + if (thisDepth >= distAcc.getValueDepth(ijk)) { + processRegion = !distAcc.probeValue(ijk, value) && thisInside != (value < mIsovalue); + } + + if (processRegion) { + region = bbox; + region.min()[1] = region.max()[1] = ijk[1]; + region.min()[0] = region.max()[0] = ijk[0]; + mTree.fill(region, true); + } + + ijk = bbox.min(); + --ijk[0]; + --ijk[2]; + + processRegion = true; + if (thisDepth >= distAcc.getValueDepth(ijk)) { + processRegion = !distAcc.probeValue(ijk, value) && thisInside != (value < mIsovalue); + } + + if (processRegion) { + region = bbox; + region.min()[2] = region.max()[2] = ijk[2]; + region.min()[0] = region.max()[0] = ijk[0]; + mTree.fill(region, true); + } + } +} + + +//////////////////////////////////////// + + +template +inline void +tileData(const DistTreeT& distTree, SignTreeT& signTree, IdxTreeT& idxTree, double iso) +{ + typename DistTreeT::ValueOnCIter tileIter(distTree); + tileIter.setMaxDepth(DistTreeT::ValueOnCIter::LEAF_DEPTH - 1); + + if (!tileIter) return; // volume has no active tiles. + + size_t tileCount = 0; + for ( ; tileIter; ++tileIter) { + ++tileCount; + } + + std::vector tiles(tileCount); + + tileCount = 0; + tileIter = distTree.cbeginValueOn(); + tileIter.setMaxDepth(DistTreeT::ValueOnCIter::LEAF_DEPTH - 1); + + CoordBBox bbox; + for (; tileIter; ++tileIter) { + Vec4i& tile = tiles[tileCount++]; + tileIter.getBoundingBox(bbox); + tile[0] = bbox.min()[0]; + tile[1] = bbox.min()[1]; + tile[2] = bbox.min()[2]; + tile[3] = bbox.max()[0] - bbox.min()[0]; + } + + typename DistTreeT::ValueType isovalue = typename DistTreeT::ValueType(iso); + + GenTileMask tileMask(tiles, distTree, isovalue); + tileMask.run(); + + typedef typename DistTreeT::template ValueConverter::Type BoolTreeT; + typedef tree::LeafManager BoolLeafManagerT; + + BoolLeafManagerT leafs(tileMask.tree()); + + + internal::SignData op(distTree, leafs, isovalue); + op.run(); + + signTree.merge(*op.signTree()); + idxTree.merge(*op.idxTree()); +} + + +//////////////////////////////////////// + + +// Utility class for the volumeToMesh wrapper +class PointListCopy +{ +public: + PointListCopy(const PointList& pointsIn, std::vector& pointsOut) + : mPointsIn(pointsIn) , mPointsOut(pointsOut) + { + } + + void operator()(const tbb::blocked_range& range) const + { + for (size_t n = range.begin(); n < range.end(); ++n) { + mPointsOut[n] = mPointsIn[n]; + } + } + +private: + const PointList& mPointsIn; + std::vector& mPointsOut; +}; + + +// Checks if the isovalue is in proximity to the active voxel boundary. +template +inline bool +needsActiveVoxePadding(const LeafManagerT& leafs, double iso, double voxelSize) +{ + double interiorWidth = 0.0, exteriorWidth = 0.0; + { + typename LeafManagerT::TreeType::LeafNodeType::ValueOffCIter it; + bool foundInterior = false, foundExterior = false; + for (size_t n = 0, N = leafs.leafCount(); n < N; ++n) { + + for (it = leafs.leaf(n).cbeginValueOff(); it; ++it) { + double value = double(it.getValue()); + if (value < 0.0) { + interiorWidth = value; + foundInterior = true; + } else if (value > 0.0) { + exteriorWidth = value; + foundExterior = true; + } + + if (foundInterior && foundExterior) break; + } + + if (foundInterior && foundExterior) break; + } + + } + + double minDist = std::min(std::abs(interiorWidth - iso), std::abs(exteriorWidth - iso)); + return !(minDist > (2.0 * voxelSize)); +} + + +} // end namespace internal + + +//////////////////////////////////////// + + +inline +PolygonPool::PolygonPool() + : mNumQuads(0) + , mNumTriangles(0) + , mQuads(NULL) + , mTriangles(NULL) + , mQuadFlags(NULL) + , mTriangleFlags(NULL) +{ +} + + +inline +PolygonPool::PolygonPool(const size_t numQuads, const size_t numTriangles) + : mNumQuads(numQuads) + , mNumTriangles(numTriangles) + , mQuads(new openvdb::Vec4I[mNumQuads]) + , mTriangles(new openvdb::Vec3I[mNumTriangles]) + , mQuadFlags(new char[mNumQuads]) + , mTriangleFlags(new char[mNumTriangles]) +{ +} + + +inline void +PolygonPool::copy(const PolygonPool& rhs) +{ + resetQuads(rhs.numQuads()); + resetTriangles(rhs.numTriangles()); + + for (size_t i = 0; i < mNumQuads; ++i) { + mQuads[i] = rhs.mQuads[i]; + mQuadFlags[i] = rhs.mQuadFlags[i]; + } + + for (size_t i = 0; i < mNumTriangles; ++i) { + mTriangles[i] = rhs.mTriangles[i]; + mTriangleFlags[i] = rhs.mTriangleFlags[i]; + } +} + + +inline void +PolygonPool::resetQuads(size_t size) +{ + mNumQuads = size; + mQuads.reset(new openvdb::Vec4I[mNumQuads]); + mQuadFlags.reset(new char[mNumQuads]); +} + + +inline void +PolygonPool::clearQuads() +{ + mNumQuads = 0; + mQuads.reset(NULL); + mQuadFlags.reset(NULL); +} + + +inline void +PolygonPool::resetTriangles(size_t size) +{ + mNumTriangles = size; + mTriangles.reset(new openvdb::Vec3I[mNumTriangles]); + mTriangleFlags.reset(new char[mNumTriangles]); +} + + +inline void +PolygonPool::clearTriangles() +{ + mNumTriangles = 0; + mTriangles.reset(NULL); + mTriangleFlags.reset(NULL); +} + + +inline bool +PolygonPool::trimQuads(const size_t n, bool reallocate) +{ + if (!(n < mNumQuads)) return false; + + if (reallocate) { + + if (n == 0) { + mQuads.reset(NULL); + } else { + + boost::scoped_array quads(new openvdb::Vec4I[n]); + boost::scoped_array flags(new char[n]); + + for (size_t i = 0; i < n; ++i) { + quads[i] = mQuads[i]; + flags[i] = mQuadFlags[i]; + } + + mQuads.swap(quads); + mQuadFlags.swap(flags); + } + } + + mNumQuads = n; + return true; +} + + +inline bool +PolygonPool::trimTrinagles(const size_t n, bool reallocate) +{ + if (!(n < mNumTriangles)) return false; + + if (reallocate) { + + if (n == 0) { + mTriangles.reset(NULL); + } else { + + boost::scoped_array triangles(new openvdb::Vec3I[n]); + boost::scoped_array flags(new char[n]); + + for (size_t i = 0; i < n; ++i) { + triangles[i] = mTriangles[i]; + flags[i] = mTriangleFlags[i]; + } + + mTriangles.swap(triangles); + mTriangleFlags.swap(flags); + } + } + + mNumTriangles = n; + return true; +} + + +//////////////////////////////////////// + + +inline VolumeToMesh::VolumeToMesh(double isovalue, double adaptivity) + : mPoints(NULL) + , mPolygons() + , mPointListSize(0) + , mSeamPointListSize(0) + , mPolygonPoolListSize(0) + , mIsovalue(isovalue) + , mPrimAdaptivity(adaptivity) + , mSecAdaptivity(0.0) + , mRefGrid(GridBase::ConstPtr()) + , mSurfaceMaskGrid(GridBase::ConstPtr()) + , mAdaptivityGrid(GridBase::ConstPtr()) + , mAdaptivityMaskTree(TreeBase::ConstPtr()) + , mRefSignTree(TreeBase::Ptr()) + , mRefIdxTree(TreeBase::Ptr()) + , mInvertSurfaceMask(false) + , mPartitions(1) + , mActivePart(0) + , mQuantizedSeamPoints(NULL) + , mPointFlags(0) +{ +} + + +inline PointList& +VolumeToMesh::pointList() +{ + return mPoints; +} + + +inline const size_t& +VolumeToMesh::pointListSize() const +{ + return mPointListSize; +} + + +inline PolygonPoolList& +VolumeToMesh::polygonPoolList() +{ + return mPolygons; +} + + +inline const PolygonPoolList& +VolumeToMesh::polygonPoolList() const +{ + return mPolygons; +} + + +inline const size_t& +VolumeToMesh::polygonPoolListSize() const +{ + return mPolygonPoolListSize; +} + + +inline void +VolumeToMesh::setRefGrid(const GridBase::ConstPtr& grid, double secAdaptivity) +{ + mRefGrid = grid; + mSecAdaptivity = secAdaptivity; + + // Clear out old auxiliary data + mRefSignTree = TreeBase::Ptr(); + mRefIdxTree = TreeBase::Ptr(); + mSeamPointListSize = 0; + mQuantizedSeamPoints.reset(NULL); +} + + +inline void +VolumeToMesh::setSurfaceMask(const GridBase::ConstPtr& mask, bool invertMask) +{ + mSurfaceMaskGrid = mask; + mInvertSurfaceMask = invertMask; +} + + +inline void +VolumeToMesh::setSpatialAdaptivity(const GridBase::ConstPtr& grid) +{ + mAdaptivityGrid = grid; +} + + +inline void +VolumeToMesh::setAdaptivityMask(const TreeBase::ConstPtr& tree) +{ + mAdaptivityMaskTree = tree; +} + + +inline void +VolumeToMesh::partition(unsigned partitions, unsigned activePart) +{ + mPartitions = std::max(partitions, unsigned(1)); + mActivePart = std::min(activePart, mPartitions-1); +} + + +inline std::vector& +VolumeToMesh::pointFlags() +{ + return mPointFlags; +} + + +inline const std::vector& +VolumeToMesh::pointFlags() const +{ + return mPointFlags; +} + + +template +inline void +VolumeToMesh::operator()(const GridT& distGrid) +{ + typedef typename GridT::TreeType DistTreeT; + typedef tree::LeafManager DistLeafManagerT; + typedef typename DistTreeT::ValueType DistValueT; + + typedef typename DistTreeT::template ValueConverter::Type BoolTreeT; + typedef tree::LeafManager BoolLeafManagerT; + typedef Grid BoolGridT; + + typedef typename DistTreeT::template ValueConverter::Type Int16TreeT; + typedef tree::LeafManager Int16LeafManagerT; + + typedef typename DistTreeT::template ValueConverter::Type IntTreeT; + typedef typename DistTreeT::template ValueConverter::Type FloatTreeT; + typedef Grid FloatGridT; + + + const openvdb::math::Transform& transform = distGrid.transform(); + const DistTreeT& distTree = distGrid.tree(); + const DistValueT isovalue = DistValueT(mIsovalue); + + typename Int16TreeT::Ptr signTreePt; + typename IntTreeT::Ptr idxTreePt; + typename BoolTreeT::Ptr pointMask; + + BoolTreeT valueMask(false), seamMask(false); + const bool adaptive = mPrimAdaptivity > 1e-7 || mSecAdaptivity > 1e-7; + bool maskEdges = false; + + + const BoolGridT * surfaceMask = NULL; + if (mSurfaceMaskGrid && mSurfaceMaskGrid->type() == BoolGridT::gridType()) { + surfaceMask = static_cast(mSurfaceMaskGrid.get()); + } + + const FloatGridT * adaptivityField = NULL; + if (mAdaptivityGrid && mAdaptivityGrid->type() == FloatGridT::gridType()) { + adaptivityField = static_cast(mAdaptivityGrid.get()); + } + + if (mAdaptivityMaskTree && mAdaptivityMaskTree->type() == BoolTreeT::treeType()) { + const BoolTreeT *adaptivityMaskPt = + static_cast(mAdaptivityMaskTree.get()); + seamMask.topologyUnion(*adaptivityMaskPt); + } + + + // Collect auxiliary data + { + DistLeafManagerT distLeafs(distTree); + + // Check if the isovalue is in proximity to the active voxel boundary. + bool padActiveVoxels = false; + int padVoxels = 3; + + if (distGrid.getGridClass() != GRID_LEVEL_SET) { + padActiveVoxels = true; + } else { + padActiveVoxels = internal::needsActiveVoxePadding(distLeafs, + mIsovalue, transform.voxelSize()[0]); + } + + // always pad the active region for small volumes (the performance hit is neglectable). + if (!padActiveVoxels) { + Coord dim; + distTree.evalActiveVoxelDim(dim); + int maxDim = std::max(std::max(dim[0], dim[1]), dim[2]); + if (maxDim < 1000) { + padActiveVoxels = true; + padVoxels = 1; + } + } + + if (surfaceMask || mPartitions > 1) { + + maskEdges = true; + + if (surfaceMask) { + + { // Mask + internal::GenTopologyMask masking( + *surfaceMask, distLeafs, transform, mInvertSurfaceMask); + masking.run(); + valueMask.merge(masking.tree()); + } + + if (mPartitions > 1) { // Partition + tree::LeafManager leafs(valueMask); + leafs.foreach(internal::PartOp(leafs.leafCount() , mPartitions, mActivePart)); + tools::pruneInactive(valueMask); + } + + } else { // Partition + + internal::PartGen partitioner(distLeafs, mPartitions, mActivePart); + partitioner.run(); + valueMask.merge(partitioner.tree()); + } + + { + if (padActiveVoxels) tools::dilateVoxels(valueMask, padVoxels); + BoolLeafManagerT leafs(valueMask); + + internal::SignData + signDataOp(distTree, leafs, isovalue); + signDataOp.run(); + + signTreePt = signDataOp.signTree(); + idxTreePt = signDataOp.idxTree(); + } + + { + internal::GenBoundaryMask boundary(distLeafs, valueMask, *idxTreePt); + boundary.run(); + + BoolLeafManagerT bleafs(boundary.tree()); + + internal::SignData + signDataOp(distTree, bleafs, isovalue); + signDataOp.run(); + + signTreePt->merge(*signDataOp.signTree()); + idxTreePt->merge(*signDataOp.idxTree()); + } + + } else { + + // Collect voxel-sign configurations + if (padActiveVoxels) { + + BoolTreeT regionMask(false); + regionMask.topologyUnion(distTree); + tools::dilateVoxels(regionMask, padVoxels); + + BoolLeafManagerT leafs(regionMask); + + internal::SignData + signDataOp(distTree, leafs, isovalue); + signDataOp.run(); + + signTreePt = signDataOp.signTree(); + idxTreePt = signDataOp.idxTree(); + } else { + + internal::SignData + signDataOp(distTree, distLeafs, isovalue); + signDataOp.run(); + + signTreePt = signDataOp.signTree(); + idxTreePt = signDataOp.idxTree(); + } + } + + } + + + // Collect auxiliary data from active tiles + internal::tileData(distTree, *signTreePt, *idxTreePt, static_cast(isovalue)); + + // Optionally collect auxiliary data from a reference level set. + Int16TreeT *refSignTreePt = NULL; + IntTreeT *refIdxTreePt = NULL; + const DistTreeT *refDistTreePt = NULL; + + if (mRefGrid && mRefGrid->type() == GridT::gridType()) { + + const GridT* refGrid = static_cast(mRefGrid.get()); + refDistTreePt = &refGrid->tree(); + + // Collect and cache auxiliary data from the reference grid. + if (!mRefSignTree && !mRefIdxTree) { + + DistLeafManagerT refDistLeafs(*refDistTreePt); + internal::SignData + signDataOp(*refDistTreePt, refDistLeafs, isovalue); + + signDataOp.run(); + + mRefSignTree = signDataOp.signTree(); + mRefIdxTree = signDataOp.idxTree(); + } + + // Get cached auxiliary data + if (mRefSignTree && mRefIdxTree) { + refSignTreePt = static_cast(mRefSignTree.get()); + refIdxTreePt = static_cast(mRefIdxTree.get()); + } + } + + + // Process auxiliary data + Int16LeafManagerT signLeafs(*signTreePt); + + if (maskEdges) { + signLeafs.foreach(internal::MaskEdges(valueMask)); + valueMask.clear(); + } + + + // Generate the seamline mask + if (refSignTreePt) { + internal::GenSeamMask seamOp(signLeafs, *refSignTreePt); + seamOp.run(); + + tools::dilateVoxels(seamOp.mask(), 3); + signLeafs.foreach(internal::TagSeamEdges(seamOp.mask())); + + seamMask.merge(seamOp.mask()); + } + + + std::vector regions(signLeafs.leafCount(), 0); + if (regions.empty()) { + mPointListSize = 0; + mPoints.reset(); + mPolygonPoolListSize = 0; + mPolygons.reset(); + mPointFlags.clear(); + return; + } + + if (adaptive) { + + internal::MergeVoxelRegions merge( + signLeafs, *signTreePt, distTree, *idxTreePt, isovalue, DistValueT(mPrimAdaptivity)); + + if (adaptivityField) { + merge.setSpatialAdaptivity(transform, *adaptivityField); + } + + if (refSignTreePt || mAdaptivityMaskTree) { + merge.setAdaptivityMask(&seamMask); + } + + if (refSignTreePt) { + merge.setRefData(refSignTreePt, DistValueT(mSecAdaptivity)); + } + + merge.run(); + + signLeafs.foreach(internal::CountRegions(*idxTreePt, regions)); + + } else { + signLeafs.foreach(internal::CountPoints(regions)); + } + + + { + mPointListSize = 0; + size_t tmp = 0; + for (size_t n = 0, N = regions.size(); n < N; ++n) { + tmp = regions[n]; + regions[n] = mPointListSize; + mPointListSize += tmp; + } + } + + + // Generate the unique point list + mPoints.reset(new openvdb::Vec3s[mPointListSize]); + mPointFlags.clear(); + + // Generate seam line sample points + if (refSignTreePt && refIdxTreePt) { + + if (mSeamPointListSize == 0) { + + std::vector pointMap; + + { + Int16LeafManagerT refSignLeafs(*refSignTreePt); + pointMap.resize(refSignLeafs.leafCount(), 0); + + refSignLeafs.foreach(internal::CountPoints(pointMap)); + + size_t tmp = 0; + for (size_t n = 0, N = pointMap.size(); n < N; ++n) { + tmp = pointMap[n]; + pointMap[n] = mSeamPointListSize; + mSeamPointListSize += tmp; + } + } + + if (!pointMap.empty() && mSeamPointListSize != 0) { + + mQuantizedSeamPoints.reset(new uint32_t[mSeamPointListSize]); + memset(mQuantizedSeamPoints.get(), 0, sizeof(uint32_t) * mSeamPointListSize); + + typedef tree::LeafManager IntLeafManagerT; + + IntLeafManagerT refIdxLeafs(*refIdxTreePt); + refIdxLeafs.foreach(internal::MapPoints(pointMap, *refSignTreePt)); + } + } + + if (mSeamPointListSize != 0) { + signLeafs.foreach(internal::SeamWeights( + distTree, *refSignTreePt, *refIdxTreePt, mQuantizedSeamPoints, mIsovalue)); + } + } + + + internal::GenPoints + pointOp(signLeafs, distTree, *idxTreePt, mPoints, regions, transform, mIsovalue); + + + if (mSeamPointListSize != 0) { + mPointFlags.resize(mPointListSize); + pointOp.setRefData(refSignTreePt, refDistTreePt, refIdxTreePt, + &mQuantizedSeamPoints, &mPointFlags); + } + + pointOp.run(); + + + mPolygonPoolListSize = signLeafs.leafCount(); + mPolygons.reset(new PolygonPool[mPolygonPoolListSize]); + + + if (adaptive) { + + internal::GenPolygons + mesher(signLeafs, *signTreePt, *idxTreePt, mPolygons, Index32(mPointListSize)); + + mesher.setRefSignTree(refSignTreePt); + mesher.run(); + + } else { + + internal::GenPolygons + mesher(signLeafs, *signTreePt, *idxTreePt, mPolygons, Index32(mPointListSize)); + + mesher.setRefSignTree(refSignTreePt); + mesher.run(); + } + + // Clean up unused points, only necessary if masking and/or + // automatic mesh partitioning is enabled. + if ((surfaceMask || mPartitions > 1) && mPointListSize > 0) { + + // Flag used points + std::vector usedPointMask(mPointListSize, 0); + + internal::FlagUsedPoints flagPoints(mPolygons, mPolygonPoolListSize, usedPointMask); + flagPoints.run(); + + // Create index map + std::vector indexMap(mPointListSize); + size_t usedPointCount = 0; + for (size_t p = 0; p < mPointListSize; ++p) { + if (usedPointMask[p]) indexMap[p] = static_cast(usedPointCount++); + } + + if (usedPointCount < mPointListSize) { + + // move points + internal::UniquePtr::type + newPointList(new openvdb::Vec3s[usedPointCount]); + + internal::MovePoints movePoints(newPointList, mPoints, indexMap, usedPointMask); + movePoints.run(); + + mPointListSize = usedPointCount; + mPoints.reset(newPointList.release()); + + // update primitives + internal::RemapIndices remap(mPolygons, mPolygonPoolListSize, indexMap); + remap.run(); + } + } + + + // Subdivide nonplanar quads near the seamline edges + // todo: thread and clean up + if (refSignTreePt || refIdxTreePt || refDistTreePt) { + std::vector newPoints; + + for (size_t n = 0; n < mPolygonPoolListSize; ++n) { + + PolygonPool& polygons = mPolygons[n]; + + std::vector nonPlanarQuads; + nonPlanarQuads.reserve(polygons.numQuads()); + + for (size_t i = 0; i < polygons.numQuads(); ++i) { + + char& flags = polygons.quadFlags(i); + + if ((flags & POLYFLAG_FRACTURE_SEAM) && !(flags & POLYFLAG_EXTERIOR)) { + + openvdb::Vec4I& quad = polygons.quad(i); + + const bool edgePoly = mPointFlags[quad[0]] || mPointFlags[quad[1]] + || mPointFlags[quad[2]] || mPointFlags[quad[3]]; + + if (!edgePoly) continue; + + const Vec3s& p0 = mPoints[quad[0]]; + const Vec3s& p1 = mPoints[quad[1]]; + const Vec3s& p2 = mPoints[quad[2]]; + const Vec3s& p3 = mPoints[quad[3]]; + + if (!internal::isPlanarQuad(p0, p1, p2, p3, 1e-6f)) { + nonPlanarQuads.push_back(i); + } + } + } + + + if (!nonPlanarQuads.empty()) { + + PolygonPool tmpPolygons; + + tmpPolygons.resetQuads(polygons.numQuads() - nonPlanarQuads.size()); + tmpPolygons.resetTriangles(polygons.numTriangles() + 4 * nonPlanarQuads.size()); + + size_t triangleIdx = 0; + for (size_t i = 0; i < nonPlanarQuads.size(); ++i) { + + size_t& quadIdx = nonPlanarQuads[i]; + + openvdb::Vec4I& quad = polygons.quad(quadIdx); + char& quadFlags = polygons.quadFlags(quadIdx); + //quadFlags |= POLYFLAG_SUBDIVIDED; + + Vec3s centroid = (mPoints[quad[0]] + mPoints[quad[1]] + + mPoints[quad[2]] + mPoints[quad[3]]) * 0.25; + + size_t pointIdx = newPoints.size() + mPointListSize; + + newPoints.push_back(centroid); + + + { + Vec3I& triangle = tmpPolygons.triangle(triangleIdx); + + triangle[0] = quad[0]; + triangle[1] = static_cast(pointIdx); + triangle[2] = quad[3]; + + tmpPolygons.triangleFlags(triangleIdx) = quadFlags; + + if (mPointFlags[triangle[0]] || mPointFlags[triangle[2]]) { + tmpPolygons.triangleFlags(triangleIdx) |= POLYFLAG_SUBDIVIDED; + } + } + + ++triangleIdx; + + { + Vec3I& triangle = tmpPolygons.triangle(triangleIdx); + + triangle[0] = quad[0]; + triangle[1] = quad[1]; + triangle[2] = static_cast(pointIdx); + + tmpPolygons.triangleFlags(triangleIdx) = quadFlags; + + if (mPointFlags[triangle[0]] || mPointFlags[triangle[1]]) { + tmpPolygons.triangleFlags(triangleIdx) |= POLYFLAG_SUBDIVIDED; + } + } + + ++triangleIdx; + + { + Vec3I& triangle = tmpPolygons.triangle(triangleIdx); + + triangle[0] = quad[1]; + triangle[1] = quad[2]; + triangle[2] = static_cast(pointIdx); + + tmpPolygons.triangleFlags(triangleIdx) = quadFlags; + + if (mPointFlags[triangle[0]] || mPointFlags[triangle[1]]) { + tmpPolygons.triangleFlags(triangleIdx) |= POLYFLAG_SUBDIVIDED; + } + } + + + ++triangleIdx; + + { + Vec3I& triangle = tmpPolygons.triangle(triangleIdx); + + triangle[0] = quad[2]; + triangle[1] = quad[3]; + triangle[2] = static_cast(pointIdx); + + tmpPolygons.triangleFlags(triangleIdx) = quadFlags; + + if (mPointFlags[triangle[0]] || mPointFlags[triangle[1]]) { + tmpPolygons.triangleFlags(triangleIdx) |= POLYFLAG_SUBDIVIDED; + } + } + + ++triangleIdx; + + quad[0] = util::INVALID_IDX; + } + + + for (size_t i = 0; i < polygons.numTriangles(); ++i) { + tmpPolygons.triangle(triangleIdx) = polygons.triangle(i); + tmpPolygons.triangleFlags(triangleIdx) = polygons.triangleFlags(i); + ++triangleIdx; + } + + + size_t quadIdx = 0; + for (size_t i = 0; i < polygons.numQuads(); ++i) { + openvdb::Vec4I& quad = polygons.quad(i); + + if (quad[0] != util::INVALID_IDX) { + tmpPolygons.quad(quadIdx) = quad; + tmpPolygons.quadFlags(quadIdx) = polygons.quadFlags(i); + ++quadIdx; + } + } + + + polygons.copy(tmpPolygons); + } + + } + + + if (!newPoints.empty()) { + + size_t newPointCount = newPoints.size() + mPointListSize; + + internal::UniquePtr::type + newPointList(new openvdb::Vec3s[newPointCount]); + + for (size_t i = 0; i < mPointListSize; ++i) { + newPointList.get()[i] = mPoints[i]; + } + + for (size_t i = mPointListSize; i < newPointCount; ++i) { + newPointList.get()[i] = newPoints[i - mPointListSize]; + } + + mPointListSize = newPointCount; + mPoints.reset(newPointList.release()); + mPointFlags.resize(mPointListSize, 0); + } + } +} + + +//////////////////////////////////////// + + +/// @internal This overload is enabled only for grids with a scalar ValueType. +template +inline typename boost::enable_if, void>::type +doVolumeToMesh( + const GridType& grid, + std::vector& points, + std::vector& triangles, + std::vector& quads, + double isovalue, + double adaptivity) +{ + VolumeToMesh mesher(isovalue, adaptivity); + mesher(grid); + + // Preallocate the point list + points.clear(); + points.resize(mesher.pointListSize()); + + { // Copy points + internal::PointListCopy ptnCpy(mesher.pointList(), points); + tbb::parallel_for(tbb::blocked_range(0, points.size()), ptnCpy); + mesher.pointList().reset(NULL); + } + + PolygonPoolList& polygonPoolList = mesher.polygonPoolList(); + + { // Preallocate primitive lists + size_t numQuads = 0, numTriangles = 0; + for (size_t n = 0, N = mesher.polygonPoolListSize(); n < N; ++n) { + openvdb::tools::PolygonPool& polygons = polygonPoolList[n]; + numTriangles += polygons.numTriangles(); + numQuads += polygons.numQuads(); + } + + triangles.clear(); + triangles.resize(numTriangles); + quads.clear(); + quads.resize(numQuads); + } + + // Copy primitives + size_t qIdx = 0, tIdx = 0; + for (size_t n = 0, N = mesher.polygonPoolListSize(); n < N; ++n) { + openvdb::tools::PolygonPool& polygons = polygonPoolList[n]; + + for (size_t i = 0, I = polygons.numQuads(); i < I; ++i) { + quads[qIdx++] = polygons.quad(i); + } + + for (size_t i = 0, I = polygons.numTriangles(); i < I; ++i) { + triangles[tIdx++] = polygons.triangle(i); + } + } +} + +/// @internal This overload is enabled only for grids that do not have a scalar ValueType. +template +inline typename boost::disable_if, void>::type +doVolumeToMesh( + const GridType&, + std::vector&, + std::vector&, + std::vector&, + double, + double) +{ + OPENVDB_THROW(TypeError, "volume to mesh conversion is supported only for scalar grids"); +} + + +template +inline void +volumeToMesh( + const GridType& grid, + std::vector& points, + std::vector& triangles, + std::vector& quads, + double isovalue, + double adaptivity) +{ + doVolumeToMesh(grid, points, triangles, quads, isovalue, adaptivity); +} + + +template +inline void +volumeToMesh( + const GridType& grid, + std::vector& points, + std::vector& quads, + double isovalue) +{ + std::vector triangles; + doVolumeToMesh(grid, points, triangles, quads, isovalue, 0.0); +} + + +//////////////////////////////////////// + + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_VOLUME_TO_MESH_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tools/VolumeToSpheres.h b/nuparu/include/openvdb/include/openvdb/tools/VolumeToSpheres.h new file mode 100644 index 00000000..fe94293d --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tools/VolumeToSpheres.h @@ -0,0 +1,1034 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_TOOLS_VOLUME_TO_SPHERES_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_VOLUME_TO_SPHERES_HAS_BEEN_INCLUDED + +#include +#include +#include // for erodeVoxels() + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include // std::numeric_limits + +////////// + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + + +/// @brief Threaded method to fill a closed level set or fog volume +/// with adaptively sized spheres. +/// +/// @param grid a scalar gird to fill with spheres. +/// +/// @param spheres a @c Vec4 array representing the spheres that returned by this +/// method. The first three components specify the sphere center +/// and the fourth is the radius. The spheres in this array are +/// ordered by radius, biggest to smallest. +/// +/// @param maxSphereCount no more than this number of spheres are generated. +/// +/// @param overlapping toggle to allow spheres to overlap/intersect +/// +/// @param minRadius determines the smallest sphere size in voxel units. +/// +/// @param maxRadius determines the largest sphere size in voxel units. +/// +/// @param isovalue the crossing point of the volume values that is considered +/// the surface. The zero default value works for signed distance +/// fields while fog volumes require a larger positive value, +/// 0.5 is a good initial guess. +/// +/// @param instanceCount how many interior points to consider for the sphere placement, +/// increasing this count increases the chances of finding optimal +/// sphere sizes. +/// +/// @param interrupter a pointer adhering to the util::NullInterrupter interface +/// +template +inline void +fillWithSpheres( + const GridT& grid, + std::vector& spheres, + int maxSphereCount, + bool overlapping = false, + float minRadius = 1.0, + float maxRadius = std::numeric_limits::max(), + float isovalue = 0.0, + int instanceCount = 10000, + InterrupterT* interrupter = NULL); + + +/// @brief @c fillWithSpheres method variant that automatically infers +/// the util::NullInterrupter. +template +inline void +fillWithSpheres( + const GridT& grid, + std::vector& spheres, + int maxSphereCount, + bool overlapping = false, + float minRadius = 1.0, + float maxRadius = std::numeric_limits::max(), + float isovalue = 0.0, + int instanceCount = 10000) +{ + fillWithSpheres(grid, spheres, + maxSphereCount, overlapping, minRadius, maxRadius, isovalue, instanceCount); +} + + +//////////////////////////////////////// + + +/// @brief Accelerated closest surface point queries for narrow band level sets. +/// Supports queries that originate at arbitrary world-space locations, is +/// not confined to the narrow band region of the input volume geometry. +template +class ClosestSurfacePoint +{ +public: + typedef typename GridT::TreeType TreeT; + typedef typename TreeT::template ValueConverter::Type IntTreeT; + typedef typename TreeT::template ValueConverter::Type Int16TreeT; + + + ClosestSurfacePoint(); + + + /// @brief Extracts the surface points and constructs a spatial acceleration structure. + /// + /// @param grid a scalar gird, level set or fog volume. + /// + /// @param isovalue the crossing point of the volume values that is considered + /// the surface. The zero default value works for signed distance + /// fields while fog volumes require a larger positive value, + /// 0.5 is a good initial guess. + /// + /// @param interrupter a pointer adhering to the util::NullInterrupter interface. + /// + template + void initialize(const GridT& grid, float isovalue = 0.0, InterrupterT* interrupter = NULL); + + + /// @brief @c initialize method variant that automatically infers + /// the util::NullInterrupter. + void initialize(const GridT& grid, float isovalue = 0.0); + + + + /// @brief Computes distance to closest surface. + /// + /// @param points search locations in world space. + /// + /// @param distances list of closest surface point distances, populated by this method. + /// + bool search(const std::vector& points, std::vector& distances); + + + /// @brief Performs closest point searches. + /// + /// @param points search locations in world space to be replaced by their closest + /// surface point. + /// + /// @param distances list of closest surface point distances, populated by this method. + /// + bool searchAndReplace(std::vector& points, std::vector& distances); + + + /// @{ + /// @brief Tree accessors + const IntTreeT& indexTree() const { return *mIdxTreePt; } + const Int16TreeT& signTree() const { return *mSignTreePt; } + /// @} + +private: + typedef typename IntTreeT::LeafNodeType IntLeafT; + typedef std::pair IndexRange; + + bool mIsInitialized; + std::vector mLeafBoundingSpheres, mNodeBoundingSpheres; + std::vector mLeafRanges; + std::vector mLeafNodes; + PointList mSurfacePointList; + size_t mPointListSize, mMaxNodeLeafs; + float mMaxRadiusSqr; + typename IntTreeT::Ptr mIdxTreePt; + typename Int16TreeT::Ptr mSignTreePt; + + bool search(std::vector&, std::vector&, bool transformPoints); +}; + + +//////////////////////////////////////// + + + + +// Internal utility methods + + +namespace internal { + +struct PointAccessor +{ + PointAccessor(std::vector& points) + : mPoints(points) + { + } + + void add(const Vec3R &pos) + { + mPoints.push_back(pos); + } +private: + std::vector& mPoints; +}; + + +template +class LeafBS +{ +public: + + LeafBS(std::vector& leafBoundingSpheres, + const std::vector& leafNodes, + const math::Transform& transform, + const PointList& surfacePointList); + + void run(bool threaded = true); + + + void operator()(const tbb::blocked_range&) const; + +private: + std::vector& mLeafBoundingSpheres; + const std::vector& mLeafNodes; + const math::Transform& mTransform; + const PointList& mSurfacePointList; +}; + +template +LeafBS::LeafBS( + std::vector& leafBoundingSpheres, + const std::vector& leafNodes, + const math::Transform& transform, + const PointList& surfacePointList) + : mLeafBoundingSpheres(leafBoundingSpheres) + , mLeafNodes(leafNodes) + , mTransform(transform) + , mSurfacePointList(surfacePointList) +{ +} + +template +void +LeafBS::run(bool threaded) +{ + if (threaded) { + tbb::parallel_for(tbb::blocked_range(0, mLeafNodes.size()), *this); + } else { + (*this)(tbb::blocked_range(0, mLeafNodes.size())); + } +} + +template +void +LeafBS::operator()(const tbb::blocked_range& range) const +{ + typename IntLeafT::ValueOnCIter iter; + Vec3s avg; + + for (size_t n = range.begin(); n != range.end(); ++n) { + + avg[0] = 0.0; + avg[1] = 0.0; + avg[2] = 0.0; + + int count = 0; + for (iter = mLeafNodes[n]->cbeginValueOn(); iter; ++iter) { + avg += mSurfacePointList[iter.getValue()]; + ++count; + } + + if (count > 1) avg *= float(1.0 / double(count)); + + float maxDist = 0.0; + + for (iter = mLeafNodes[n]->cbeginValueOn(); iter; ++iter) { + float tmpDist = (mSurfacePointList[iter.getValue()] - avg).lengthSqr(); + if (tmpDist > maxDist) maxDist = tmpDist; + } + + Vec4R& sphere = mLeafBoundingSpheres[n]; + + sphere[0] = avg[0]; + sphere[1] = avg[1]; + sphere[2] = avg[2]; + sphere[3] = maxDist * 2.0; // padded radius + } +} + + +class NodeBS +{ +public: + typedef std::pair IndexRange; + + NodeBS(std::vector& nodeBoundingSpheres, + const std::vector& leafRanges, + const std::vector& leafBoundingSpheres); + + inline void run(bool threaded = true); + + inline void operator()(const tbb::blocked_range&) const; + +private: + std::vector& mNodeBoundingSpheres; + const std::vector& mLeafRanges; + const std::vector& mLeafBoundingSpheres; +}; + +inline +NodeBS::NodeBS(std::vector& nodeBoundingSpheres, + const std::vector& leafRanges, + const std::vector& leafBoundingSpheres) + : mNodeBoundingSpheres(nodeBoundingSpheres) + , mLeafRanges(leafRanges) + , mLeafBoundingSpheres(leafBoundingSpheres) +{ +} + +inline void +NodeBS::run(bool threaded) +{ + if (threaded) { + tbb::parallel_for(tbb::blocked_range(0, mLeafRanges.size()), *this); + } else { + (*this)(tbb::blocked_range(0, mLeafRanges.size())); + } +} + +inline void +NodeBS::operator()(const tbb::blocked_range& range) const +{ + Vec3d avg, pos; + + for (size_t n = range.begin(); n != range.end(); ++n) { + + avg[0] = 0.0; + avg[1] = 0.0; + avg[2] = 0.0; + + int count = int(mLeafRanges[n].second) - int(mLeafRanges[n].first); + + for (size_t i = mLeafRanges[n].first; i < mLeafRanges[n].second; ++i) { + avg[0] += mLeafBoundingSpheres[i][0]; + avg[1] += mLeafBoundingSpheres[i][1]; + avg[2] += mLeafBoundingSpheres[i][2]; + } + + if (count > 1) avg *= float(1.0 / double(count)); + + + double maxDist = 0.0; + + for (size_t i = mLeafRanges[n].first; i < mLeafRanges[n].second; ++i) { + pos[0] = mLeafBoundingSpheres[i][0]; + pos[1] = mLeafBoundingSpheres[i][1]; + pos[2] = mLeafBoundingSpheres[i][2]; + + double tmpDist = (pos - avg).lengthSqr() + mLeafBoundingSpheres[i][3]; + if (tmpDist > maxDist) maxDist = tmpDist; + } + + Vec4R& sphere = mNodeBoundingSpheres[n]; + + sphere[0] = avg[0]; + sphere[1] = avg[1]; + sphere[2] = avg[2]; + sphere[3] = maxDist * 2.0; // padded radius + } +} + + + +//////////////////////////////////////// + + +template +class ClosestPointDist +{ +public: + typedef std::pair IndexRange; + + ClosestPointDist( + std::vector& instancePoints, + std::vector& instanceDistances, + const PointList& surfacePointList, + const std::vector& leafNodes, + const std::vector& leafRanges, + const std::vector& leafBoundingSpheres, + const std::vector& nodeBoundingSpheres, + size_t maxNodeLeafs, + bool transformPoints = false); + + + void run(bool threaded = true); + + + void operator()(const tbb::blocked_range&) const; + +private: + + void evalLeaf(size_t index, const IntLeafT& leaf) const; + void evalNode(size_t pointIndex, size_t nodeIndex) const; + + + std::vector& mInstancePoints; + std::vector& mInstanceDistances; + + const PointList& mSurfacePointList; + + const std::vector& mLeafNodes; + const std::vector& mLeafRanges; + const std::vector& mLeafBoundingSpheres; + const std::vector& mNodeBoundingSpheres; + + std::vector mLeafDistances, mNodeDistances; + + const bool mTransformPoints; + size_t mClosestPointIndex; +}; + + +template +ClosestPointDist::ClosestPointDist( + std::vector& instancePoints, + std::vector& instanceDistances, + const PointList& surfacePointList, + const std::vector& leafNodes, + const std::vector& leafRanges, + const std::vector& leafBoundingSpheres, + const std::vector& nodeBoundingSpheres, + size_t maxNodeLeafs, + bool transformPoints) + : mInstancePoints(instancePoints) + , mInstanceDistances(instanceDistances) + , mSurfacePointList(surfacePointList) + , mLeafNodes(leafNodes) + , mLeafRanges(leafRanges) + , mLeafBoundingSpheres(leafBoundingSpheres) + , mNodeBoundingSpheres(nodeBoundingSpheres) + , mLeafDistances(maxNodeLeafs, 0.0) + , mNodeDistances(leafRanges.size(), 0.0) + , mTransformPoints(transformPoints) + , mClosestPointIndex(0) +{ +} + + +template +void +ClosestPointDist::run(bool threaded) +{ + if (threaded) { + tbb::parallel_for(tbb::blocked_range(0, mInstancePoints.size()), *this); + } else { + (*this)(tbb::blocked_range(0, mInstancePoints.size())); + } +} + +template +void +ClosestPointDist::evalLeaf(size_t index, const IntLeafT& leaf) const +{ + typename IntLeafT::ValueOnCIter iter; + const Vec3s center = mInstancePoints[index]; + size_t& closestPointIndex = const_cast(mClosestPointIndex); + + for (iter = leaf.cbeginValueOn(); iter; ++iter) { + + const Vec3s& point = mSurfacePointList[iter.getValue()]; + float tmpDist = (point - center).lengthSqr(); + + if (tmpDist < mInstanceDistances[index]) { + mInstanceDistances[index] = tmpDist; + closestPointIndex = iter.getValue(); + } + } +} + + +template +void +ClosestPointDist::evalNode(size_t pointIndex, size_t nodeIndex) const +{ + const Vec3R& pos = mInstancePoints[pointIndex]; + float minDist = mInstanceDistances[pointIndex]; + size_t minDistIdx = 0; + Vec3R center; + bool updatedDist = false; + + for (size_t i = mLeafRanges[nodeIndex].first, n = 0; + i < mLeafRanges[nodeIndex].second; ++i, ++n) + { + float& distToLeaf = const_cast(mLeafDistances[n]); + + center[0] = mLeafBoundingSpheres[i][0]; + center[1] = mLeafBoundingSpheres[i][1]; + center[2] = mLeafBoundingSpheres[i][2]; + + distToLeaf = float((pos - center).lengthSqr() - mLeafBoundingSpheres[i][3]); + + if (distToLeaf < minDist) { + minDist = distToLeaf; + minDistIdx = i; + updatedDist = true; + } + } + + if (!updatedDist) return; + + evalLeaf(pointIndex, *mLeafNodes[minDistIdx]); + + for (size_t i = mLeafRanges[nodeIndex].first, n = 0; + i < mLeafRanges[nodeIndex].second; ++i, ++n) + { + if (mLeafDistances[n] < mInstanceDistances[pointIndex] && i != minDistIdx) { + evalLeaf(pointIndex, *mLeafNodes[i]); + } + } +} + + +template +void +ClosestPointDist::operator()(const tbb::blocked_range& range) const +{ + Vec3R center; + for (size_t n = range.begin(); n != range.end(); ++n) { + + const Vec3R& pos = mInstancePoints[n]; + float minDist = mInstanceDistances[n]; + size_t minDistIdx = 0; + + for (size_t i = 0, I = mNodeDistances.size(); i < I; ++i) { + float& distToNode = const_cast(mNodeDistances[i]); + + center[0] = mNodeBoundingSpheres[i][0]; + center[1] = mNodeBoundingSpheres[i][1]; + center[2] = mNodeBoundingSpheres[i][2]; + + distToNode = float((pos - center).lengthSqr() - mNodeBoundingSpheres[i][3]); + + if (distToNode < minDist) { + minDist = distToNode; + minDistIdx = i; + } + } + + evalNode(n, minDistIdx); + + for (size_t i = 0, I = mNodeDistances.size(); i < I; ++i) { + if (mNodeDistances[i] < mInstanceDistances[n] && i != minDistIdx) { + evalNode(n, i); + } + } + + mInstanceDistances[n] = std::sqrt(mInstanceDistances[n]); + + if (mTransformPoints) mInstancePoints[n] = mSurfacePointList[mClosestPointIndex]; + } +} + + +class UpdatePoints +{ +public: + UpdatePoints( + const Vec4s& sphere, + const std::vector& points, + std::vector& distances, + std::vector& mask, + bool overlapping); + + float radius() const { return mRadius; } + int index() const { return mIndex; } + + inline void run(bool threaded = true); + + + UpdatePoints(UpdatePoints&, tbb::split); + inline void operator()(const tbb::blocked_range& range); + void join(const UpdatePoints& rhs) + { + if (rhs.mRadius > mRadius) { + mRadius = rhs.mRadius; + mIndex = rhs.mIndex; + } + } + +private: + + const Vec4s& mSphere; + const std::vector& mPoints; + + std::vector& mDistances; + std::vector& mMask; + + bool mOverlapping; + float mRadius; + int mIndex; +}; + +inline +UpdatePoints::UpdatePoints( + const Vec4s& sphere, + const std::vector& points, + std::vector& distances, + std::vector& mask, + bool overlapping) + : mSphere(sphere) + , mPoints(points) + , mDistances(distances) + , mMask(mask) + , mOverlapping(overlapping) + , mRadius(0.0) + , mIndex(0) +{ +} + +inline +UpdatePoints::UpdatePoints(UpdatePoints& rhs, tbb::split) + : mSphere(rhs.mSphere) + , mPoints(rhs.mPoints) + , mDistances(rhs.mDistances) + , mMask(rhs.mMask) + , mOverlapping(rhs.mOverlapping) + , mRadius(rhs.mRadius) + , mIndex(rhs.mIndex) +{ +} + +inline void +UpdatePoints::run(bool threaded) +{ + if (threaded) { + tbb::parallel_reduce(tbb::blocked_range(0, mPoints.size()), *this); + } else { + (*this)(tbb::blocked_range(0, mPoints.size())); + } +} + +inline void +UpdatePoints::operator()(const tbb::blocked_range& range) +{ + Vec3s pos; + for (size_t n = range.begin(); n != range.end(); ++n) { + if (mMask[n]) continue; + + pos.x() = float(mPoints[n].x()) - mSphere[0]; + pos.y() = float(mPoints[n].y()) - mSphere[1]; + pos.z() = float(mPoints[n].z()) - mSphere[2]; + + float dist = pos.length(); + + if (dist < mSphere[3]) { + mMask[n] = 1; + continue; + } + + if (!mOverlapping) { + mDistances[n] = std::min(mDistances[n], (dist - mSphere[3])); + } + + if (mDistances[n] > mRadius) { + mRadius = mDistances[n]; + mIndex = int(n); + } + } +} + + +} // namespace internal + + +//////////////////////////////////////// + + +template +inline void +fillWithSpheres( + const GridT& grid, + std::vector& spheres, + int maxSphereCount, + bool overlapping, + float minRadius, + float maxRadius, + float isovalue, + int instanceCount, + InterrupterT* interrupter) +{ + spheres.clear(); + spheres.reserve(maxSphereCount); + + const bool addNBPoints = grid.activeVoxelCount() < 10000; + int instances = std::max(instanceCount, maxSphereCount); + + typedef typename GridT::TreeType TreeT; + typedef typename GridT::ValueType ValueT; + + typedef typename TreeT::template ValueConverter::Type BoolTreeT; + typedef typename TreeT::template ValueConverter::Type IntTreeT; + typedef typename TreeT::template ValueConverter::Type Int16TreeT; + + typedef boost::mt11213b RandGen; + RandGen mtRand(/*seed=*/0); + + const TreeT& tree = grid.tree(); + const math::Transform& transform = grid.transform(); + + std::vector instancePoints; + + { // Scatter candidate sphere centroids (instancePoints) + typename Grid::Ptr interiorMaskPtr; + + if (grid.getGridClass() == GRID_LEVEL_SET) { + interiorMaskPtr = sdfInteriorMask(grid, ValueT(isovalue)); + } else { + interiorMaskPtr = typename Grid::Ptr(Grid::create(false)); + interiorMaskPtr->setTransform(transform.copy()); + interiorMaskPtr->tree().topologyUnion(tree); + } + + if (interrupter && interrupter->wasInterrupted()) return; + + erodeVoxels(interiorMaskPtr->tree(), 1); + + instancePoints.reserve(instances); + internal::PointAccessor ptnAcc(instancePoints); + + UniformPointScatter scatter( + ptnAcc, Index64(addNBPoints ? (instances / 2) : instances), mtRand, interrupter); + + scatter(*interiorMaskPtr); + } + + if (interrupter && interrupter->wasInterrupted()) return; + + std::vector instanceRadius; + + ClosestSurfacePoint csp; + csp.initialize(grid, isovalue, interrupter); + + // add extra instance points in the interior narrow band. + if (instancePoints.size() < size_t(instances)) { + const Int16TreeT& signTree = csp.signTree(); + typename Int16TreeT::LeafNodeType::ValueOnCIter it; + typename Int16TreeT::LeafCIter leafIt = signTree.cbeginLeaf(); + + for (; leafIt; ++leafIt) { + for (it = leafIt->cbeginValueOn(); it; ++it) { + const int flags = it.getValue(); + if (!(0xE00 & flags) && (flags & 0x100)) { + instancePoints.push_back(transform.indexToWorld(it.getCoord())); + } + + if (instancePoints.size() == size_t(instances)) break; + } + if (instancePoints.size() == size_t(instances)) break; + } + } + + + if (interrupter && interrupter->wasInterrupted()) return; + + if (!csp.search(instancePoints, instanceRadius)) return; + + std::vector instanceMask(instancePoints.size(), 0); + float largestRadius = 0.0; + int largestRadiusIdx = 0; + + for (size_t n = 0, N = instancePoints.size(); n < N; ++n) { + if (instanceRadius[n] > largestRadius) { + largestRadius = instanceRadius[n]; + largestRadiusIdx = int(n); + } + } + + Vec3s pos; + Vec4s sphere; + minRadius = float(minRadius * transform.voxelSize()[0]); + maxRadius = float(maxRadius * transform.voxelSize()[0]); + + for (size_t s = 0, S = std::min(size_t(maxSphereCount), instancePoints.size()); s < S; ++s) { + + if (interrupter && interrupter->wasInterrupted()) return; + + largestRadius = std::min(maxRadius, largestRadius); + + if (s != 0 && largestRadius < minRadius) break; + + sphere[0] = float(instancePoints[largestRadiusIdx].x()); + sphere[1] = float(instancePoints[largestRadiusIdx].y()); + sphere[2] = float(instancePoints[largestRadiusIdx].z()); + sphere[3] = largestRadius; + + spheres.push_back(sphere); + instanceMask[largestRadiusIdx] = 1; + + internal::UpdatePoints op( + sphere, instancePoints, instanceRadius, instanceMask, overlapping); + op.run(); + + largestRadius = op.radius(); + largestRadiusIdx = op.index(); + } +} + +//////////////////////////////////////// + + +template +ClosestSurfacePoint::ClosestSurfacePoint() + : mIsInitialized(false) + , mLeafBoundingSpheres(0) + , mNodeBoundingSpheres(0) + , mLeafRanges(0) + , mLeafNodes(0) + , mSurfacePointList() + , mPointListSize(0) + , mMaxNodeLeafs(0) + , mMaxRadiusSqr(0.0) + , mIdxTreePt() +{ +} + +template +void +ClosestSurfacePoint::initialize(const GridT& grid, float isovalue) +{ + initialize(grid, isovalue, NULL); +} + + +template +template +void +ClosestSurfacePoint::initialize( + const GridT& grid, float isovalue, InterrupterT* interrupter) +{ + mIsInitialized = false; + typedef tree::LeafManager LeafManagerT; + typedef tree::LeafManager IntLeafManagerT; + typedef tree::LeafManager Int16LeafManagerT; + typedef typename GridT::ValueType ValueT; + + const TreeT& tree = grid.tree(); + const math::Transform& transform = grid.transform(); + + { // Extract surface point cloud + + { + LeafManagerT leafs(tree); + internal::SignData + signDataOp(tree, leafs, ValueT(isovalue)); + + signDataOp.run(); + + mSignTreePt = signDataOp.signTree(); + mIdxTreePt = signDataOp.idxTree(); + } + + if (interrupter && interrupter->wasInterrupted()) return; + + Int16LeafManagerT signLeafs(*mSignTreePt); + + std::vector regions(signLeafs.leafCount(), 0); + signLeafs.foreach(internal::CountPoints(regions)); + + mPointListSize = 0; + for (size_t tmp = 0, n = 0, N = regions.size(); n < N; ++n) { + tmp = regions[n]; + regions[n] = mPointListSize; + mPointListSize += tmp; + } + + if (mPointListSize == 0) return; + + mSurfacePointList.reset(new Vec3s[mPointListSize]); + + internal::GenPoints + pointOp(signLeafs, tree, *mIdxTreePt, mSurfacePointList, regions, transform, isovalue); + + pointOp.run(); + + mIdxTreePt->topologyUnion(*mSignTreePt); + } + + if (interrupter && interrupter->wasInterrupted()) return; + + // estimate max sphere radius (sqr dist) + CoordBBox bbox = grid.evalActiveVoxelBoundingBox(); + + Vec3s dim = transform.indexToWorld(bbox.min()) - + transform.indexToWorld(bbox.max()); + + dim[0] = std::abs(dim[0]); + dim[1] = std::abs(dim[1]); + dim[2] = std::abs(dim[2]); + + mMaxRadiusSqr = std::min(std::min(dim[0], dim[1]), dim[2]); + mMaxRadiusSqr *= 0.51f; + mMaxRadiusSqr *= mMaxRadiusSqr; + + + IntLeafManagerT idxLeafs(*mIdxTreePt); + + + typedef typename IntTreeT::RootNodeType IntRootNodeT; + typedef typename IntRootNodeT::NodeChainType IntNodeChainT; + BOOST_STATIC_ASSERT(boost::mpl::size::value > 1); + typedef typename boost::mpl::at >::type IntInternalNodeT; + + + typename IntTreeT::NodeCIter nIt = mIdxTreePt->cbeginNode(); + nIt.setMinDepth(IntTreeT::NodeCIter::LEAF_DEPTH - 1); + nIt.setMaxDepth(IntTreeT::NodeCIter::LEAF_DEPTH - 1); + + std::vector internalNodes; + + const IntInternalNodeT* node = NULL; + for (; nIt; ++nIt) { + nIt.getNode(node); + if (node) internalNodes.push_back(node); + } + + std::vector().swap(mLeafRanges); + mLeafRanges.resize(internalNodes.size()); + + std::vector().swap(mLeafNodes); + mLeafNodes.reserve(idxLeafs.leafCount()); + + typename IntInternalNodeT::ChildOnCIter leafIt; + mMaxNodeLeafs = 0; + for (size_t n = 0, N = internalNodes.size(); n < N; ++n) { + + mLeafRanges[n].first = mLeafNodes.size(); + + size_t leafCount = 0; + for (leafIt = internalNodes[n]->cbeginChildOn(); leafIt; ++leafIt) { + mLeafNodes.push_back(&(*leafIt)); + ++leafCount; + } + + mMaxNodeLeafs = std::max(leafCount, mMaxNodeLeafs); + + mLeafRanges[n].second = mLeafNodes.size(); + } + + std::vector().swap(mLeafBoundingSpheres); + mLeafBoundingSpheres.resize(mLeafNodes.size()); + + internal::LeafBS leafBS( + mLeafBoundingSpheres, mLeafNodes, transform, mSurfacePointList); + leafBS.run(); + + + std::vector().swap(mNodeBoundingSpheres); + mNodeBoundingSpheres.resize(internalNodes.size()); + + internal::NodeBS nodeBS(mNodeBoundingSpheres, mLeafRanges, mLeafBoundingSpheres); + nodeBS.run(); + mIsInitialized = true; +} + + +template +bool +ClosestSurfacePoint::search(std::vector& points, + std::vector& distances, bool transformPoints) +{ + if (!mIsInitialized) return false; + + distances.clear(); + distances.resize(points.size(), mMaxRadiusSqr); + + internal::ClosestPointDist cpd(points, distances, mSurfacePointList, + mLeafNodes, mLeafRanges, mLeafBoundingSpheres, mNodeBoundingSpheres, + mMaxNodeLeafs, transformPoints); + + cpd.run(); + + return true; +} + + +template +bool +ClosestSurfacePoint::search(const std::vector& points, std::vector& distances) +{ + return search(const_cast& >(points), distances, false); +} + + +template +bool +ClosestSurfacePoint::searchAndReplace(std::vector& points, + std::vector& distances) +{ + return search(points, distances, true); +} + + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TOOLS_VOLUME_TO_MESH_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tree/InternalNode.h b/nuparu/include/openvdb/include/openvdb/tree/InternalNode.h new file mode 100644 index 00000000..44fd6295 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tree/InternalNode.h @@ -0,0 +1,3201 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file InternalNode.h +/// +/// @brief Internal table nodes for OpenVDB trees +/// +/// @todo Multi-thred topologyDifference + +#ifndef OPENVDB_TREE_INTERNALNODE_HAS_BEEN_INCLUDED +#define OPENVDB_TREE_INTERNALNODE_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // for io::readData(), etc. +#include // for Abs(), isExactlyEqual() +#include +#include +#include "Iterator.h" +#include "NodeUnion.h" + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tree { + +template struct SameInternalConfig; // forward declaration + + +template +class InternalNode +{ +public: + typedef _ChildNodeType ChildNodeType; + typedef typename ChildNodeType::LeafNodeType LeafNodeType; + typedef typename ChildNodeType::ValueType ValueType; + typedef typename ChildNodeType::BuildType BuildType; + typedef NodeUnion UnionType; + typedef util::NodeMask NodeMaskType; + + static const Index + LOG2DIM = Log2Dim, + TOTAL = Log2Dim + ChildNodeType::TOTAL, + DIM = 1 << TOTAL, + NUM_VALUES = 1 << (3 * Log2Dim), + LEVEL = 1 + ChildNodeType::LEVEL; // level 0 = leaf + static const Index64 + NUM_VOXELS = uint64_t(1) << (3 * TOTAL); // total # of voxels represented by this node + + /// @brief ValueConverter::Type is the type of an InternalNode having the same + /// child hierarchy and dimensions as this node but a different value type, T. + template + struct ValueConverter { + typedef InternalNode::Type, Log2Dim> Type; + }; + + /// @brief SameConfiguration::value is @c true if and only if OtherNodeType + /// is the type of an InternalNode with the same dimensions as this node and whose + /// ChildNodeType has the same configuration as this node's ChildNodeType. + template + struct SameConfiguration { + static const bool value = + SameInternalConfig::value; + }; + + + InternalNode() {} + + explicit InternalNode(const ValueType& offValue); + + InternalNode(const Coord&, const ValueType& fillValue, bool active = false); + +#ifndef OPENVDB_2_ABI_COMPATIBLE + InternalNode(PartialCreate, const Coord&, const ValueType& fillValue, bool active = false); +#endif + + /// @brief Deep copy constructor + /// + /// @note This method is multi-threaded! + InternalNode(const InternalNode&); + + /// @brief Value conversion copy constructor + /// + /// @note This method is multi-threaded! + template + explicit InternalNode(const InternalNode& other); + + /// @brief Topology copy constructor + /// + /// @note This method is multi-threaded! + template + InternalNode(const InternalNode& other, + const ValueType& background, TopologyCopy); + + /// @brief Topology copy constructor + /// + /// @note This method is multi-threaded! + template + InternalNode(const InternalNode& other, + const ValueType& offValue, const ValueType& onValue, TopologyCopy); + + virtual ~InternalNode(); + +protected: + typedef typename NodeMaskType::OnIterator MaskOnIterator; + typedef typename NodeMaskType::OffIterator MaskOffIterator; + typedef typename NodeMaskType::DenseIterator MaskDenseIterator; + + // Type tags to disambiguate template instantiations + struct ValueOn {}; struct ValueOff {}; struct ValueAll {}; + struct ChildOn {}; struct ChildOff {}; struct ChildAll {}; + + // The following class templates implement the iterator interfaces specified in Iterator.h + // by providing getItem(), setItem() and/or modifyItem() methods. + + template + struct ChildIter: public SparseIteratorBase< + MaskIterT, ChildIter, NodeT, ChildT> + { + ChildIter() {} + ChildIter(const MaskIterT& iter, NodeT* parent): SparseIteratorBase< + MaskIterT, ChildIter, NodeT, ChildT>(iter, parent) {} + + ChildT& getItem(Index pos) const + { + assert(this->parent().isChildMaskOn(pos)); + return *(this->parent().getChildNode(pos)); + } + + // Note: setItem() can't be called on const iterators. + void setItem(Index pos, const ChildT& c) const { this->parent().resetChildNode(pos, &c); } + + // Note: modifyItem() isn't implemented, since it's not useful for child node pointers. + };// ChildIter + + template + struct ValueIter: public SparseIteratorBase< + MaskIterT, ValueIter, NodeT, ValueT> + { + ValueIter() {} + ValueIter(const MaskIterT& iter, NodeT* parent): SparseIteratorBase< + MaskIterT, ValueIter, NodeT, ValueT>(iter, parent) {} + + const ValueT& getItem(Index pos) const { return this->parent().mNodes[pos].getValue(); } + + // Note: setItem() can't be called on const iterators. + void setItem(Index pos, const ValueT& v) const { this->parent().mNodes[pos].setValue(v); } + + // Note: modifyItem() can't be called on const iterators. + template + void modifyItem(Index pos, const ModifyOp& op) const + { + op(this->parent().mNodes[pos].getValue()); + } + };// ValueIter + + template + struct DenseIter: public DenseIteratorBase< + MaskDenseIterator, DenseIter, NodeT, ChildT, ValueT> + { + typedef DenseIteratorBase BaseT; + typedef typename BaseT::NonConstValueType NonConstValueT; + + DenseIter() {} + DenseIter(const MaskDenseIterator& iter, NodeT* parent): + DenseIteratorBase(iter, parent) {} + + bool getItem(Index pos, ChildT*& child, NonConstValueT& value) const + { + if (this->parent().isChildMaskOn(pos)) { + child = this->parent().getChildNode(pos); + return true; + } + child = NULL; + value = this->parent().mNodes[pos].getValue(); + return false; + } + + // Note: setItem() can't be called on const iterators. + void setItem(Index pos, ChildT* child) const + { + this->parent().resetChildNode(pos, child); + } + + // Note: unsetItem() can't be called on const iterators. + void unsetItem(Index pos, const ValueT& value) const + { + this->parent().unsetChildNode(pos, value); + } + };// DenseIter + +public: + // Iterators (see Iterator.h for usage) + typedef ChildIter ChildOnIter; + typedef ChildIter ChildOnCIter; + typedef ValueIter ChildOffIter; + typedef ValueIter ChildOffCIter; + typedef DenseIter ChildAllIter; + typedef DenseIter ChildAllCIter; + + typedef ValueIter ValueOnIter; + typedef ValueIter ValueOnCIter; + typedef ValueIter ValueOffIter; + typedef ValueIter ValueOffCIter; + typedef ValueIter ValueAllIter; + typedef ValueIter ValueAllCIter; + + ChildOnCIter cbeginChildOn() const { return ChildOnCIter(mChildMask.beginOn(), this); } + ChildOffCIter cbeginChildOff() const { return ChildOffCIter(mChildMask.beginOff(), this); } + ChildAllCIter cbeginChildAll() const { return ChildAllCIter(mChildMask.beginDense(), this); } + ChildOnCIter beginChildOn() const { return cbeginChildOn(); } + ChildOffCIter beginChildOff() const { return cbeginChildOff(); } + ChildAllCIter beginChildAll() const { return cbeginChildAll(); } + ChildOnIter beginChildOn() { return ChildOnIter(mChildMask.beginOn(), this); } + ChildOffIter beginChildOff() { return ChildOffIter(mChildMask.beginOff(), this); } + ChildAllIter beginChildAll() { return ChildAllIter(mChildMask.beginDense(), this); } + + ValueOnCIter cbeginValueOn() const { return ValueOnCIter(mValueMask.beginOn(), this); } + /// @warning This iterator will also visit child nodes so use isChildMaskOn to skip them! + ValueOffCIter cbeginValueOff() const { return ValueOffCIter(mValueMask.beginOff(), this); } + ValueAllCIter cbeginValueAll() const { return ValueAllCIter(mChildMask.beginOff(), this); } + ValueOnCIter beginValueOn() const { return cbeginValueOn(); } + /// @warning This iterator will also visit child nodes so use isChildMaskOn to skip them! + ValueOffCIter beginValueOff() const { return cbeginValueOff(); } + ValueAllCIter beginValueAll() const { return cbeginValueAll(); } + ValueOnIter beginValueOn() { return ValueOnIter(mValueMask.beginOn(), this); } + /// @warning This iterator will also visit child nodes so use isChildMaskOn to skip them! + ValueOffIter beginValueOff() { return ValueOffIter(mValueMask.beginOff(), this); } + ValueAllIter beginValueAll() { return ValueAllIter(mChildMask.beginOff(), this); } + + + static Index dim() { return DIM; } + static Index getLevel() { return LEVEL; } + static void getNodeLog2Dims(std::vector& dims); + static Index getChildDim() { return ChildNodeType::DIM; } + + /// Return the linear table offset of the given global or local coordinates. + static Index coordToOffset(const Coord& xyz); + /// @brief Return the local coordinates for a linear table offset, + /// where offset 0 has coordinates (0, 0, 0). + static void offsetToLocalCoord(Index n, Coord& xyz); + /// Return the global coordinates for a linear table offset. + Coord offsetToGlobalCoord(Index n) const; + + /// Return the grid index coordinates of this node's local origin. + const Coord& origin() const { return mOrigin; } + /// Set the grid index coordinates of this node's local origin. + void setOrigin(const Coord& origin) { mOrigin = origin; } + + Index32 leafCount() const; + Index32 nonLeafCount() const; + Index64 onVoxelCount() const; + Index64 offVoxelCount() const; + Index64 onLeafVoxelCount() const; + Index64 offLeafVoxelCount() const; + Index64 onTileCount() const; + + /// Return the total amount of memory in bytes occupied by this node and its children. + Index64 memUsage() const; + + /// @brief Expand the specified bounding box so that it includes the active tiles + /// of this internal node as well as all the active values in its child nodes. + /// If visitVoxels is false LeafNodes will be approximated as dense, i.e. with all + /// voxels active. Else the individual active voxels are visited to produce a tight bbox. + void evalActiveBoundingBox(CoordBBox& bbox, bool visitVoxels = true) const; + + /// @brief Return the bounding box of this node, i.e., the full index space + /// spanned by the node regardless of its content. + CoordBBox getNodeBoundingBox() const { return CoordBBox::createCube(mOrigin, DIM); } + + bool isEmpty() const { return mChildMask.isOff(); } + + /// Return @c true if all of this node's table entries have the same active state + /// and the same constant value to within the given tolerance, + /// and return that value in @a constValue and the active state in @a state. + /// + /// @note This method also returns @c false if this node contains any child nodes. + bool isConstant(ValueType& constValue, bool& state, + const ValueType& tolerance = zeroVal()) const; + + /// Return @c true if all of this node's tables entries have + /// the same active @a state and the values are in the range + /// (@a maxValue + @a minValue)/2 +/- @a tolerance. + /// + /// @param minValue Is updated with the minimum of all values IF method + /// returns @c true. Else the value is undefined! + /// @param maxValue Is updated with the maximum of all values IF method + /// returns @c true. Else the value is undefined! + /// @param state Is updated with the state of all values IF method + /// returns @c true. Else the value is undefined! + /// @param tolerance The tolerance used to determine if values are + /// approximatly constant. + /// + /// @note This method also returns @c false if this node contains any child nodes. + bool isConstant(ValueType& minValue, ValueType& maxValue, + bool& state, const ValueType& tolerance = zeroVal()) const; + + /// Return @c true if this node has no children and only contains inactive values. + bool isInactive() const { return this->isChildMaskOff() && this->isValueMaskOff(); } + + /// Return @c true if the voxel at the given coordinates is active. + bool isValueOn(const Coord& xyz) const; + /// Return @c true if the voxel at the given offset is active. + bool isValueOn(Index offset) const { return mValueMask.isOn(offset); } + + /// Return @c true if this node or any of its child nodes have any active tiles. + bool hasActiveTiles() const; + + const ValueType& getValue(const Coord& xyz) const; + bool probeValue(const Coord& xyz, ValueType& value) const; + + /// @brief Return the level of the tree (0 = leaf) at which the value + /// at the given coordinates resides. + Index getValueLevel(const Coord& xyz) const; + + /// @brief If the first entry in this node's table is a tile, return the tile's value. + /// Otherwise, return the result of calling getFirstValue() on the child. + const ValueType& getFirstValue() const; + /// @brief If the last entry in this node's table is a tile, return the tile's value. + /// Otherwise, return the result of calling getLastValue() on the child. + const ValueType& getLastValue() const; + + /// Set the active state of the voxel at the given coordinates but don't change its value. + void setActiveState(const Coord& xyz, bool on); + /// Set the value of the voxel at the given coordinates but don't change its active state. + void setValueOnly(const Coord& xyz, const ValueType& value); + /// Mark the voxel at the given coordinates as active but don't change its value. + void setValueOn(const Coord& xyz); + /// Set the value of the voxel at the given coordinates and mark the voxel as active. + void setValueOn(const Coord& xyz, const ValueType& value); + /// Mark the voxel at the given coordinates as inactive but don't change its value. + void setValueOff(const Coord& xyz); + /// Set the value of the voxel at the given coordinates and mark the voxel as inactive. + void setValueOff(const Coord& xyz, const ValueType& value); + + /// @brief Apply a functor to the value of the voxel at the given coordinates + /// and mark the voxel as active. + template + void modifyValue(const Coord& xyz, const ModifyOp& op); + /// Apply a functor to the voxel at the given coordinates. + template + void modifyValueAndActiveState(const Coord& xyz, const ModifyOp& op); + + /// Return the value of the voxel at the given coordinates and, if necessary, update + /// the accessor with pointers to the nodes along the path from the root node to + /// the node containing the voxel. + /// @note Used internally by ValueAccessor. + template + const ValueType& getValueAndCache(const Coord& xyz, AccessorT&) const; + + /// Return @c true if the voxel at the given coordinates is active and, if necessary, + /// update the accessor with pointers to the nodes along the path from the root node + /// to the node containing the voxel. + /// @note Used internally by ValueAccessor. + template + bool isValueOnAndCache(const Coord& xyz, AccessorT&) const; + + /// Change the value of the voxel at the given coordinates and mark it as active. + /// If necessary, update the accessor with pointers to the nodes along the path + /// from the root node to the node containing the voxel. + /// @note Used internally by ValueAccessor. + template + void setValueAndCache(const Coord& xyz, const ValueType& value, AccessorT&); + + /// Set the value of the voxel at the given coordinate but preserves its active state. + /// If necessary, update the accessor with pointers to the nodes along the path + /// from the root node to the node containing the voxel. + /// @note Used internally by ValueAccessor. + template + void setValueOnlyAndCache(const Coord& xyz, const ValueType& value, AccessorT&); + + /// @brief Apply a functor to the value of the voxel at the given coordinates + /// and mark the voxel as active. + /// If necessary, update the accessor with pointers to the nodes along the path + /// from the root node to the node containing the voxel. + /// @note Used internally by ValueAccessor. + template + void modifyValueAndCache(const Coord& xyz, const ModifyOp& op, AccessorT&); + + /// Apply a functor to the voxel at the given coordinates. + /// If necessary, update the accessor with pointers to the nodes along the path + /// from the root node to the node containing the voxel. + /// @note Used internally by ValueAccessor. + template + void modifyValueAndActiveStateAndCache(const Coord& xyz, const ModifyOp& op, AccessorT&); + + /// Change the value of the voxel at the given coordinates and mark it as inactive. + /// If necessary, update the accessor with pointers to the nodes along the path + /// from the root node to the node containing the voxel. + /// @note Used internally by ValueAccessor. + template + void setValueOffAndCache(const Coord& xyz, const ValueType& value, AccessorT&); + + /// Set the active state of the voxel at the given coordinates without changing its value. + /// If necessary, update the accessor with pointers to the nodes along the path + /// from the root node to the node containing the voxel. + /// @note Used internally by ValueAccessor. + template + void setActiveStateAndCache(const Coord& xyz, bool on, AccessorT&); + + /// Return, in @a value, the value of the voxel at the given coordinates and, + /// if necessary, update the accessor with pointers to the nodes along + /// the path from the root node to the node containing the voxel. + /// @return @c true if the voxel at the given coordinates is active + /// @note Used internally by ValueAccessor. + template + bool probeValueAndCache(const Coord& xyz, ValueType& value, AccessorT&) const; + + /// @brief Return the level of the tree (0 = leaf) at which the value + /// at the given coordinates resides. + /// + /// If necessary, update the accessor with pointers to the nodes along the path + /// from the root node to the node containing the voxel. + /// @note Used internally by ValueAccessor. + template + Index getValueLevelAndCache(const Coord& xyz, AccessorT&) const; + + /// Mark all values (both tiles and voxels) as active. + void setValuesOn(); + + // + // I/O + // + void writeTopology(std::ostream&, bool toHalf = false) const; + void readTopology(std::istream&, bool fromHalf = false); + void writeBuffers(std::ostream&, bool toHalf = false) const; + void readBuffers(std::istream&, bool fromHalf = false); + void readBuffers(std::istream&, const CoordBBox&, bool fromHalf = false); + + + // + // Aux methods + // + /// @brief Set all voxels within an axis-aligned box to a constant value. + /// (The min and max coordinates are inclusive.) + void fill(const CoordBBox& bbox, const ValueType&, bool active = true); + + /// Change the sign of all the values represented in this node and + /// its child nodes. + void negate(); + + /// @brief Densify active tiles, i.e., replace them with leaf-level active voxels. + /// @param threaded if true, this operation is multi-threaded (over the internal nodes). + void voxelizeActiveTiles(bool threaded = true); + + /// @brief Copy into a dense grid the values of the voxels that lie within + /// a given bounding box. + /// @param bbox inclusive bounding box of the voxels to be copied into the dense grid + /// @param dense dense grid with a stride in @e z of one (see tools::Dense + /// in tools/Dense.h for the required API) + /// @note @a bbox is assumed to be identical to or contained in the coordinate domains + /// of both the dense grid and this node, i.e., no bounds checking is performed. + template + void copyToDense(const CoordBBox& bbox, DenseT& dense) const; + + /// @brief Efficiently merge another tree into this tree using one of several schemes. + /// @warning This operation cannibalizes the other tree. + template + void merge(InternalNode& other, const ValueType& background, const ValueType& otherBackground); + + /// @brief Merge, using one of several schemes, this node (and its descendants) + /// with a tile of the same dimensions and the given value and active state. + template void merge(const ValueType& tileValue, bool tileActive); + + /// @brief Union this branch's set of active values with the other branch's + /// active values. The value type of the other branch can be different. + /// @details The resulting state of a value is active if the corresponding value + /// was already active OR if it is active in the other tree. Also, a resulting + /// value maps to a voxel if the corresponding value already mapped to a voxel + /// OR if it is a voxel in the other tree. Thus, a resulting value can only + /// map to a tile if the corresponding value already mapped to a tile + /// AND if it is a tile value in other tree. + /// + /// Specifically, active tiles and voxels in this branch are not changed, and + /// tiles or voxels that were inactive in this branch but active in the other branch + /// are marked as active in this branch but left with their original values. + template + void topologyUnion(const InternalNode& other); + + /// @brief Intersects this tree's set of active values with the active values + /// of the other tree, whose @c ValueType may be different. + /// @details The resulting state of a value is active only if the corresponding + /// value was already active AND if it is active in the other tree. Also, a + /// resulting value maps to a voxel if the corresponding value + /// already mapped to an active voxel in either of the two grids + /// and it maps to an active tile or voxel in the other grid. + /// + /// @note This operation can delete branches in this grid if they + /// overlap with inactive tiles in the other grid. Likewise active + /// voxels can be turned into unactive voxels resulting in leaf + /// nodes with no active values. Thus, it is recommended to + /// subsequently call prune. + template + void topologyIntersection(const InternalNode& other, + const ValueType& background); + + /// @brief Difference this node's set of active values with the active values + /// of the other node, whose @c ValueType may be different. So a + /// resulting voxel will be active only if the original voxel is + /// active in this node and inactive in the other node. + /// + /// @details The last dummy argument is required to match the signature + /// for InternalNode::topologyDifference. + /// + /// @note This operation modifies only active states, not + /// values. Also note that this operation can result in all voxels + /// being inactive so consider subsequnetly calling prune. + template + void topologyDifference(const InternalNode& other, + const ValueType& background); + + template + void combine(InternalNode& other, CombineOp&); + template + void combine(const ValueType& value, bool valueIsActive, CombineOp&); + + template + void combine2(const InternalNode& other0, const OtherNodeType& other1, CombineOp&); + template + void combine2(const ValueType& value, const OtherNodeType& other, bool valIsActive, CombineOp&); + template + void combine2(const InternalNode& other, const OtherValueType&, bool valIsActive, CombineOp&); + + /// @brief Calls the templated functor BBoxOp with bounding box + /// information for all active tiles and leaf nodes in this node. + /// An additional level argument is provided for each callback. + /// + /// @note The bounding boxes are guarenteed to be non-overlapping. + template void visitActiveBBox(BBoxOp&) const; + + template void visit(VisitorOp&); + template void visit(VisitorOp&) const; + + template + void visit2Node(OtherNodeType& other, VisitorOp&); + template + void visit2Node(OtherNodeType& other, VisitorOp&) const; + template + void visit2(IterT& otherIter, VisitorOp&, bool otherIsLHS = false); + template + void visit2(IterT& otherIter, VisitorOp&, bool otherIsLHS = false) const; + + /// Set all voxels that lie outside the given axis-aligned box to the background. + void clip(const CoordBBox&, const ValueType& background); + + /// @brief Reduce the memory footprint of this tree by replacing with tiles + /// any nodes whose values are all the same (optionally to within a tolerance) + /// and have the same active state. + void prune(const ValueType& tolerance = zeroVal()); + + /// @brief Add the specified leaf to this node, possibly creating a child branch + /// in the process. If the leaf node already exists, replace it. + void addLeaf(LeafNodeType* leaf); + + /// @brief Same as addLeaf() except, if necessary, update the accessor with pointers + /// to the nodes along the path from the root node to the node containing the coordinate. + template + void addLeafAndCache(LeafNodeType* leaf, AccessorT&); + + /// @brief Return a pointer to the node of type @c NodeT that contains voxel (x, y, z) + /// and replace it with a tile of the specified value and state. + /// If no such node exists, leave the tree unchanged and return @c NULL. + /// + /// @note The caller takes ownership of the node and is responsible for deleting it. + /// + /// @warning Since this method potentially removes nodes and branches of the tree, + /// it is important to clear the caches of all ValueAccessors associated with this tree. + template + NodeT* stealNode(const Coord& xyz, const ValueType& value, bool state); + + /// @brief Add a tile at the specified tree level that contains voxel (x, y, z), + /// possibly creating a parent branch or deleting a child branch in the process. + void addTile(Index level, const Coord& xyz, const ValueType& value, bool state); + + /// @brief Delete any existing child branch at the specified offset and add a tile. + void addTile(Index offset, const ValueType& value, bool state); + + /// @brief Same as addTile() except, if necessary, update the accessor with pointers + /// to the nodes along the path from the root node to the node containing (x, y, z). + template + void addTileAndCache(Index level, const Coord& xyz, const ValueType&, bool state, AccessorT&); + + //@{ + /// @brief Return a pointer to the node that contains voxel (x, y, z). + /// If no such node exists, return NULL. + template NodeType* probeNode(const Coord& xyz); + template const NodeType* probeConstNode(const Coord& xyz) const; + //@} + + //@{ + /// @brief Same as probeNode() except, if necessary, update the accessor with pointers + /// to the nodes along the path from the root node to the node containing (x, y, z). + template + NodeType* probeNodeAndCache(const Coord& xyz, AccessorT&); + template + const NodeType* probeConstNodeAndCache(const Coord& xyz, AccessorT&) const; + //@} + + //@{ + /// @brief Return a pointer to the leaf node that contains voxel (x, y, z). + /// If no such node exists, return NULL. + LeafNodeType* probeLeaf(const Coord& xyz); + const LeafNodeType* probeConstLeaf(const Coord& xyz) const; + const LeafNodeType* probeLeaf(const Coord& xyz) const; + //@} + + //@{ + /// @brief Same as probeLeaf() except, if necessary, update the accessor with pointers + /// to the nodes along the path from the root node to the node containing (x, y, z). + template + LeafNodeType* probeLeafAndCache(const Coord& xyz, AccessorT& acc); + template + const LeafNodeType* probeConstLeafAndCache(const Coord& xyz, AccessorT& acc) const; + template + const LeafNodeType* probeLeafAndCache(const Coord& xyz, AccessorT& acc) const; + //@} + + /// @brief Return the leaf node that contains voxel (x, y, z). + /// If no such node exists, create one, but preserve the values and + /// active states of all voxels. + /// + /// @details Use this method to preallocate a static tree topology + /// over which to safely perform multithreaded processing. + LeafNodeType* touchLeaf(const Coord& xyz); + + /// @brief Same as touchLeaf() except, if necessary, update the accessor with pointers + /// to the nodes along the path from the root node to the node containing the coordinate. + template + LeafNodeType* touchLeafAndCache(const Coord& xyz, AccessorT&); + + //@{ + /// @brief Adds all nodes of a certain type to a container with the following API: + /// @code + /// struct ArrayT { + /// typedef value_type;// defines the type of nodes to be added to the array + /// void push_back(value_type nodePtr);// method that add nodes to the array + /// }; + /// @endcode + /// @details An example of a wrapper around a c-style array is: + /// @code + /// struct MyArray { + /// typedef LeafType* value_type; + /// value_type* ptr; + /// MyArray(value_type* array) : ptr(array) {} + /// void push_back(value_type leaf) { *ptr++ = leaf; } + ///}; + /// @endcode + /// @details An example that constructs a list of pointer to all leaf nodes is: + /// @code + /// std::vector array;//most std contains have the required API + /// array.reserve(tree.leafCount());//this is a fast preallocation. + /// tree.getNodes(array); + /// @endcode + template + void getNodes(ArrayT& array); + template + void getNodes(ArrayT& array) const; + //@} + + /// @brief Steals all nodes of a certain type from the tree and + /// adds them to a container with the following API: + /// @code + /// struct ArrayT { + /// typedef value_type;// defines the type of nodes to be added to the array + /// void push_back(value_type nodePtr);// method that add nodes to the array + /// }; + /// @endcode + /// @details An example of a wrapper around a c-style array is: + /// @code + /// struct MyArray { + /// typedef LeafType* value_type; + /// value_type* ptr; + /// MyArray(value_type* array) : ptr(array) {} + /// void push_back(value_type leaf) { *ptr++ = leaf; } + ///}; + /// @endcode + /// @details An example that constructs a list of pointer to all leaf nodes is: + /// @code + /// std::vector array;//most std contains have the required API + /// array.reserve(tree.leafCount());//this is a fast preallocation. + /// tree.stealNodes(array); + /// @endcode + template + void stealNodes(ArrayT& array, const ValueType& value, bool state); + + /// @brief Change inactive tiles or voxels with value oldBackground to newBackground + /// or -oldBackground to -newBackground. Active values are unchanged. + void resetBackground(const ValueType& oldBackground, const ValueType& newBackground); + + /// @brief Return @c true if the given tree branch has the same node and active value + /// topology as this tree branch (but possibly a different @c ValueType). + template + bool hasSameTopology(const InternalNode* other) const; + +protected: + //@{ + /// Allow iterators to call mask accessor methods (setValueMask(), setChildMask(), etc.). + /// @todo Make mask accessors public? + friend class IteratorBase; + friend class IteratorBase; + friend class IteratorBase; + //@} + + /// @brief During topology-only construction, access is needed + /// to protected/private members of other template instances. + template friend class InternalNode; + + // Mask accessors +public: + bool isValueMaskOn(Index n) const { return mValueMask.isOn(n); } + bool isValueMaskOn() const { return mValueMask.isOn(); } + bool isValueMaskOff(Index n) const { return mValueMask.isOff(n); } + bool isValueMaskOff() const { return mValueMask.isOff(); } + bool isChildMaskOn(Index n) const { return mChildMask.isOn(n); } + bool isChildMaskOff(Index n) const { return mChildMask.isOff(n); } + bool isChildMaskOff() const { return mChildMask.isOff(); } + const NodeMaskType& getValueMask() const { return mValueMask; } + const NodeMaskType& getChildMask() const { return mChildMask; } + NodeMaskType getValueOffMask() const + { + NodeMaskType mask = mValueMask; + mask |= mChildMask; + mask.toggle(); + return mask; + } + const UnionType* getTable() const { return mNodes; } +protected: + //@{ + /// Use a mask accessor to ensure consistency between the child and value masks; + /// i.e., the value mask should always be off wherever the child mask is on. + void setValueMask(Index n, bool on) { mValueMask.set(n, mChildMask.isOn(n) ? false : on); } + //@} + + void makeChildNodeEmpty(Index n, const ValueType& value); + void setChildNode( Index i, ChildNodeType* child);//assumes a tile + void resetChildNode(Index i, ChildNodeType* child);//checks for an existing child + ChildNodeType* unsetChildNode(Index i, const ValueType& value); + + template + static inline void doVisit(NodeT&, VisitorOp&); + + template + static inline void doVisit2Node(NodeT&, OtherNodeT&, VisitorOp&); + + template + static inline void doVisit2(NodeT&, OtherChildAllIterT&, VisitorOp&, bool otherIsLHS); + + ///@{ + /// @brief Returns a pointer to the child node at the linear offset n. + /// @warning This protected method assumes that a child node exists at + /// the specified linear offset! + ChildNodeType* getChildNode(Index n); + const ChildNodeType* getChildNode(Index n) const; + ///@} + + ///@{ + /// @brief Protected member classes for recursive multi-threading + struct VoxelizeActiveTiles; + template struct DeepCopy; + template struct TopologyCopy1; + template struct TopologyCopy2; + template struct TopologyUnion; + template struct TopologyDifference; + template struct TopologyIntersection; + ///@} + + UnionType mNodes[NUM_VALUES]; + NodeMaskType mChildMask, mValueMask; + /// Global grid index coordinates (x,y,z) of the local origin of this node + Coord mOrigin; +}; // class InternalNode + + +//////////////////////////////////////// + + +//@{ +/// Helper metafunction used to implement InternalNode::SameConfiguration +/// (which, as an inner class, can't be independently specialized) +template +struct SameInternalConfig { + static const bool value = false; +}; + +template +struct SameInternalConfig > { + static const bool value = ChildT1::template SameConfiguration::value; +}; +//@} + + +//////////////////////////////////////// + + +template +inline +InternalNode::InternalNode(const ValueType& background) +{ + for (Index i = 0; i < NUM_VALUES; ++i) mNodes[i].setValue(background); +} + + +template +inline +InternalNode::InternalNode(const Coord& origin, const ValueType& val, bool active): + mOrigin(origin[0] & ~(DIM - 1), // zero out the low-order bits + origin[1] & ~(DIM - 1), + origin[2] & ~(DIM - 1)) +{ + if (active) mValueMask.setOn(); + for (Index i = 0; i < NUM_VALUES; ++i) mNodes[i].setValue(val); +} + + +#ifndef OPENVDB_2_ABI_COMPATIBLE +// For InternalNodes, the PartialCreate constructor is identical to its +// non-PartialCreate counterpart. +template +inline +InternalNode::InternalNode(PartialCreate, + const Coord& origin, const ValueType& val, bool active) + : mOrigin(origin[0] & ~(DIM-1), origin[1] & ~(DIM-1), origin[2] & ~(DIM-1)) +{ + if (active) mValueMask.setOn(); + for (Index i = 0; i < NUM_VALUES; ++i) mNodes[i].setValue(val); +} +#endif + +template +template +struct InternalNode::DeepCopy +{ + DeepCopy(const OtherInternalNode* source, InternalNode* target) : s(source), t(target) { + tbb::parallel_for(tbb::blocked_range(0, NUM_VALUES), *this); + //(*this)(tbb::blocked_range(0, NUM_VALUES));//serial + } + void operator()(const tbb::blocked_range &r) const { + for (Index i = r.begin(), end=r.end(); i!=end; ++i) { + if (s->mChildMask.isOff(i)) { + t->mNodes[i].setValue(ValueType(s->mNodes[i].getValue())); + } else { + t->mNodes[i].setChild(new ChildNodeType(*(s->mNodes[i].getChild()))); + } + } + } + const OtherInternalNode* s; + InternalNode* t; +};// DeepCopy + +template +inline +InternalNode::InternalNode(const InternalNode& other): + mChildMask(other.mChildMask), + mValueMask(other.mValueMask), + mOrigin(other.mOrigin) +{ + DeepCopy > tmp(&other, this); +} + + +// Copy-construct from a node with the same configuration but a different ValueType. +template +template +inline +InternalNode::InternalNode(const InternalNode& other) + : mChildMask(other.mChildMask) + , mValueMask(other.mValueMask) + , mOrigin(other.mOrigin) +{ + DeepCopy > tmp(&other, this); +} + +template +template +struct InternalNode::TopologyCopy1 +{ + TopologyCopy1(const OtherInternalNode* source, InternalNode* target, + const ValueType& background) : s(source), t(target), b(background) { + tbb::parallel_for(tbb::blocked_range(0, NUM_VALUES), *this); + //(*this)(tbb::blocked_range(0, NUM_VALUES));//serial + } + void operator()(const tbb::blocked_range &r) const { + for (Index i = r.begin(), end=r.end(); i!=end; ++i) { + if (s->isChildMaskOn(i)) { + t->mNodes[i].setChild(new ChildNodeType(*(s->mNodes[i].getChild()), + b, TopologyCopy())); + } else { + t->mNodes[i].setValue(b); + } + } + } + const OtherInternalNode* s; + InternalNode* t; + const ValueType &b; +};// TopologyCopy1 + +template +template +inline +InternalNode::InternalNode(const InternalNode& other, + const ValueType& background, TopologyCopy): + mChildMask(other.mChildMask), + mValueMask(other.mValueMask), + mOrigin(other.mOrigin) +{ + TopologyCopy1 > tmp(&other, this, background); +} + +template +template +struct InternalNode::TopologyCopy2 +{ + TopologyCopy2(const OtherInternalNode* source, InternalNode* target, + const ValueType& offValue, const ValueType& onValue) + : s(source), t(target), offV(offValue), onV(onValue) { + tbb::parallel_for(tbb::blocked_range(0, NUM_VALUES), *this); + } + void operator()(const tbb::blocked_range &r) const { + for (Index i = r.begin(), end=r.end(); i!=end; ++i) { + if (s->isChildMaskOn(i)) { + t->mNodes[i].setChild(new ChildNodeType(*(s->mNodes[i].getChild()), + offV, onV, TopologyCopy())); + } else { + t->mNodes[i].setValue(s->isValueMaskOn(i) ? onV : offV); + } + } + } + const OtherInternalNode* s; + InternalNode* t; + const ValueType &offV, &onV; + };// TopologyCopy2 + +template +template +inline +InternalNode::InternalNode(const InternalNode& other, + const ValueType& offValue, + const ValueType& onValue, TopologyCopy): + mChildMask(other.mChildMask), + mValueMask(other.mValueMask), + mOrigin(other.mOrigin) +{ + TopologyCopy2 > tmp(&other, this, offValue, onValue); +} + + +template +inline +InternalNode::~InternalNode() +{ + for (ChildOnIter iter = this->beginChildOn(); iter; ++iter) { + delete mNodes[iter.pos()].getChild(); + } +} + + +//////////////////////////////////////// + + +template +inline Index32 +InternalNode::leafCount() const +{ + if (ChildNodeType::getLevel() == 0) return mChildMask.countOn(); + Index32 sum = 0; + for (ChildOnCIter iter = this->cbeginChildOn(); iter; ++iter) { + sum += iter->leafCount(); + } + return sum; +} + + +template +inline Index32 +InternalNode::nonLeafCount() const +{ + Index32 sum = 1; + if (ChildNodeType::getLevel() == 0) return sum; + for (ChildOnCIter iter = this->cbeginChildOn(); iter; ++iter) { + sum += iter->nonLeafCount(); + } + return sum; +} + + +template +inline Index64 +InternalNode::onVoxelCount() const +{ + Index64 sum = ChildT::NUM_VOXELS * mValueMask.countOn(); + for (ChildOnCIter iter = this->cbeginChildOn(); iter; ++iter) { + sum += iter->onVoxelCount(); + } + return sum; +} + + +template +inline Index64 +InternalNode::offVoxelCount() const +{ + Index64 sum = ChildT::NUM_VOXELS * (NUM_VALUES-mValueMask.countOn()-mChildMask.countOn()); + for (ChildOnCIter iter = this->cbeginChildOn(); iter; ++iter) { + sum += iter->offVoxelCount(); + } + return sum; +} + + +template +inline Index64 +InternalNode::onLeafVoxelCount() const +{ + Index64 sum = 0; + for (ChildOnCIter iter = this->beginChildOn(); iter; ++iter) { + sum += mNodes[iter.pos()].getChild()->onLeafVoxelCount(); + } + return sum; +} + + +template +inline Index64 +InternalNode::offLeafVoxelCount() const +{ + Index64 sum = 0; + for (ChildOnCIter iter = this->beginChildOn(); iter; ++iter) { + sum += mNodes[iter.pos()].getChild()->offLeafVoxelCount(); + } + return sum; +} + +template +inline Index64 +InternalNode::onTileCount() const +{ + Index64 sum = mValueMask.countOn(); + for (ChildOnCIter iter = this->cbeginChildOn(); LEVEL>1 && iter; ++iter) { + sum += iter->onTileCount(); + } + return sum; +} + +template +inline Index64 +InternalNode::memUsage() const +{ + Index64 sum = NUM_VALUES * sizeof(UnionType) + mChildMask.memUsage() + + mValueMask.memUsage() + sizeof(mOrigin); + for (ChildOnCIter iter = this->cbeginChildOn(); iter; ++iter) { + sum += iter->memUsage(); + } + return sum; +} + + +template +inline void +InternalNode::evalActiveBoundingBox(CoordBBox& bbox, bool visitVoxels) const +{ + if (bbox.isInside(this->getNodeBoundingBox())) return; + + for (ValueOnCIter i = this->cbeginValueOn(); i; ++i) { + bbox.expand(i.getCoord(), ChildT::DIM); + } + for (ChildOnCIter i = this->cbeginChildOn(); i; ++i) { + i->evalActiveBoundingBox(bbox, visitVoxels); + } +} + + +//////////////////////////////////////// + + +template +inline void +InternalNode::prune(const ValueType& tolerance) +{ + bool state = false; + ValueType value = zeroVal(); + for (ChildOnIter iter = this->beginChildOn(); iter; ++iter) { + const Index i = iter.pos(); + ChildT* child = mNodes[i].getChild(); + child->prune(tolerance); + if (child->isConstant(value, state, tolerance)) { + delete child; + mChildMask.setOff(i); + mValueMask.set(i, state); + mNodes[i].setValue(value); + } + } +} + + +//////////////////////////////////////// + + +template +template +inline NodeT* +InternalNode::stealNode(const Coord& xyz, const ValueType& value, bool state) +{ + if ((NodeT::LEVEL == ChildT::LEVEL && !(boost::is_same::value)) || + NodeT::LEVEL > ChildT::LEVEL) return NULL; + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + const Index n = this->coordToOffset(xyz); + if (mChildMask.isOff(n)) return NULL; + ChildT* child = mNodes[n].getChild(); + if (boost::is_same::value) { + mChildMask.setOff(n); + mValueMask.set(n, state); + mNodes[n].setValue(value); + } + return (boost::is_same::value) + ? reinterpret_cast(child) + : child->template stealNode(xyz, value, state); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END +} + + +//////////////////////////////////////// + + +template +template +inline NodeT* +InternalNode::probeNode(const Coord& xyz) +{ + if ((NodeT::LEVEL == ChildT::LEVEL && !(boost::is_same::value)) || + NodeT::LEVEL > ChildT::LEVEL) return NULL; + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + const Index n = this->coordToOffset(xyz); + if (mChildMask.isOff(n)) return NULL; + ChildT* child = mNodes[n].getChild(); + return (boost::is_same::value) + ? reinterpret_cast(child) + : child->template probeNode(xyz); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END +} + + +template +template +inline NodeT* +InternalNode::probeNodeAndCache(const Coord& xyz, AccessorT& acc) +{ + if ((NodeT::LEVEL == ChildT::LEVEL && !(boost::is_same::value)) || + NodeT::LEVEL > ChildT::LEVEL) return NULL; + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + const Index n = this->coordToOffset(xyz); + if (mChildMask.isOff(n)) return NULL; + ChildT* child = mNodes[n].getChild(); + acc.insert(xyz, child); + return (boost::is_same::value) + ? reinterpret_cast(child) + : child->template probeNodeAndCache(xyz, acc); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END +} + + +template +template +inline const NodeT* +InternalNode::probeConstNode(const Coord& xyz) const +{ + if ((NodeT::LEVEL == ChildT::LEVEL && !(boost::is_same::value)) || + NodeT::LEVEL > ChildT::LEVEL) return NULL; + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + const Index n = this->coordToOffset(xyz); + if (mChildMask.isOff(n)) return NULL; + const ChildT* child = mNodes[n].getChild(); + return (boost::is_same::value) + ? reinterpret_cast(child) + : child->template probeConstNode(xyz); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END +} + + +template +template +inline const NodeT* +InternalNode::probeConstNodeAndCache(const Coord& xyz, AccessorT& acc) const +{ + if ((NodeT::LEVEL == ChildT::LEVEL && !(boost::is_same::value)) || + NodeT::LEVEL > ChildT::LEVEL) return NULL; + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + const Index n = this->coordToOffset(xyz); + if (mChildMask.isOff(n)) return NULL; + const ChildT* child = mNodes[n].getChild(); + acc.insert(xyz, child); + return (boost::is_same::value) + ? reinterpret_cast(child) + : child->template probeConstNodeAndCache(xyz, acc); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END +} + + +//////////////////////////////////////// + + +template +inline typename ChildT::LeafNodeType* +InternalNode::probeLeaf(const Coord& xyz) +{ + return this->template probeNode(xyz); +} + + +template +template +inline typename ChildT::LeafNodeType* +InternalNode::probeLeafAndCache(const Coord& xyz, AccessorT& acc) +{ + return this->template probeNodeAndCache(xyz, acc); +} + + +template +template +inline const typename ChildT::LeafNodeType* +InternalNode::probeLeafAndCache(const Coord& xyz, AccessorT& acc) const +{ + return this->probeConstLeafAndCache(xyz, acc); +} + + +template +inline const typename ChildT::LeafNodeType* +InternalNode::probeConstLeaf(const Coord& xyz) const +{ + return this->template probeConstNode(xyz); +} + + +template +template +inline const typename ChildT::LeafNodeType* +InternalNode::probeConstLeafAndCache(const Coord& xyz, AccessorT& acc) const +{ + return this->template probeConstNodeAndCache(xyz, acc); +} + + +//////////////////////////////////////// + + +template +inline void +InternalNode::addLeaf(LeafNodeType* leaf) +{ + assert(leaf != NULL); + const Coord& xyz = leaf->origin(); + const Index n = this->coordToOffset(xyz); + ChildT* child = NULL; + if (mChildMask.isOff(n)) { + if (ChildT::LEVEL>0) { + child = new ChildT(xyz, mNodes[n].getValue(), mValueMask.isOn(n)); + } else { + child = reinterpret_cast(leaf); + } + this->setChildNode(n, child); + } else { + if (ChildT::LEVEL>0) { + child = mNodes[n].getChild(); + } else { + delete mNodes[n].getChild(); + child = reinterpret_cast(leaf); + mNodes[n].setChild(child); + } + } + child->addLeaf(leaf); +} + + +template +template +inline void +InternalNode::addLeafAndCache(LeafNodeType* leaf, AccessorT& acc) +{ + assert(leaf != NULL); + const Coord& xyz = leaf->origin(); + const Index n = this->coordToOffset(xyz); + ChildT* child = NULL; + if (mChildMask.isOff(n)) { + if (ChildT::LEVEL>0) { + child = new ChildT(xyz, mNodes[n].getValue(), mValueMask.isOn(n)); + acc.insert(xyz, child);//we only cache internal nodes + } else { + child = reinterpret_cast(leaf); + } + this->setChildNode(n, child); + } else { + if (ChildT::LEVEL>0) { + child = mNodes[n].getChild(); + acc.insert(xyz, child);//we only cache internal nodes + } else { + delete mNodes[n].getChild(); + child = reinterpret_cast(leaf); + mNodes[n].setChild(child); + } + } + child->addLeafAndCache(leaf, acc); +} + + +//////////////////////////////////////// + + +template +inline void +InternalNode::addTile(Index n, const ValueType& value, bool state) +{ + assert(n < NUM_VALUES); + this->makeChildNodeEmpty(n, value); + mValueMask.set(n, state); +} + + +template +inline void +InternalNode::addTile(Index level, const Coord& xyz, + const ValueType& value, bool state) +{ + if (LEVEL >= level) { + const Index n = this->coordToOffset(xyz); + if (mChildMask.isOff(n)) {// tile case + if (LEVEL > level) { + ChildT* child = new ChildT(xyz, mNodes[n].getValue(), mValueMask.isOn(n)); + this->setChildNode(n, child); + child->addTile(level, xyz, value, state); + } else { + mValueMask.set(n, state); + mNodes[n].setValue(value); + } + } else {// child branch case + ChildT* child = mNodes[n].getChild(); + if (LEVEL > level) { + child->addTile(level, xyz, value, state); + } else { + delete child; + mChildMask.setOff(n); + mValueMask.set(n, state); + mNodes[n].setValue(value); + } + } + } +} + + +template +template +inline void +InternalNode::addTileAndCache(Index level, const Coord& xyz, + const ValueType& value, bool state, AccessorT& acc) +{ + if (LEVEL >= level) { + const Index n = this->coordToOffset(xyz); + if (mChildMask.isOff(n)) {// tile case + if (LEVEL > level) { + ChildT* child = new ChildT(xyz, mNodes[n].getValue(), mValueMask.isOn(n)); + this->setChildNode(n, child); + acc.insert(xyz, child); + child->addTileAndCache(level, xyz, value, state, acc); + } else { + mValueMask.set(n, state); + mNodes[n].setValue(value); + } + } else {// child branch case + ChildT* child = mNodes[n].getChild(); + if (LEVEL > level) { + acc.insert(xyz, child); + child->addTileAndCache(level, xyz, value, state, acc); + } else { + delete child; + mChildMask.setOff(n); + mValueMask.set(n, state); + mNodes[n].setValue(value); + } + } + } +} + + +//////////////////////////////////////// + + +template +inline typename ChildT::LeafNodeType* +InternalNode::touchLeaf(const Coord& xyz) +{ + const Index n = this->coordToOffset(xyz); + ChildT* child = NULL; + if (mChildMask.isOff(n)) { + child = new ChildT(xyz, mNodes[n].getValue(), mValueMask.isOn(n)); + this->setChildNode(n, child); + } else { + child = mNodes[n].getChild(); + } + return child->touchLeaf(xyz); +} + + +template +template +inline typename ChildT::LeafNodeType* +InternalNode::touchLeafAndCache(const Coord& xyz, AccessorT& acc) +{ + const Index n = this->coordToOffset(xyz); + if (mChildMask.isOff(n)) { + this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), mValueMask.isOn(n))); + } + acc.insert(xyz, mNodes[n].getChild()); + return mNodes[n].getChild()->touchLeafAndCache(xyz, acc); +} + + +//////////////////////////////////////// + + +template +inline bool +InternalNode::isConstant(ValueType& value, bool& state, + const ValueType& tolerance) const +{ + if ( !(mChildMask.isOff()) ) return false; + + state = mValueMask.isOn(); + if (!(state || mValueMask.isOff())) return false;// Are values neither active nor inactive? + + value = mNodes[0].getValue(); + for (Index i = 1; i < NUM_VALUES; ++i) { + if ( !math::isApproxEqual(mNodes[i].getValue(), value, tolerance) ) return false; + } + return true; +} + +//////////////////////////////////////// + + +template +inline bool +InternalNode::isConstant(ValueType& minValue, ValueType& maxValue, + bool& state, const ValueType& tolerance) const +{ + if ( !(mChildMask.isOff()) ) return false; + + state = mValueMask.isOn(); + if (!(state || mValueMask.isOff())) return false;// Are values neither active nor inactive? + + const ValueType range = 2 * tolerance; + minValue = maxValue = mNodes[0].getValue(); + for (Index i = 1; i < NUM_VALUES; ++i) { + const ValueType& v = mNodes[i].getValue(); + if (v < minValue) { + if ((maxValue - v) > range) return false; + minValue = v; + } else if (v > maxValue) { + if ((v - minValue) > range) return false; + maxValue = v; + } + } + return true; +} + + +//////////////////////////////////////// + + +template +inline bool +InternalNode::hasActiveTiles() const +{ + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + const bool anyActiveTiles = !mValueMask.isOff(); + if (LEVEL==1 || anyActiveTiles) return anyActiveTiles; + for (ChildOnCIter iter = this->cbeginChildOn(); iter; ++iter) { + if (iter->hasActiveTiles()) return true; + } + return false; + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END +} + + +template +inline bool +InternalNode::isValueOn(const Coord& xyz) const +{ + const Index n = this->coordToOffset(xyz); + if (this->isChildMaskOff(n)) return this->isValueMaskOn(n); + return mNodes[n].getChild()->isValueOn(xyz); +} + +template +template +inline bool +InternalNode::isValueOnAndCache(const Coord& xyz, AccessorT& acc) const +{ + const Index n = this->coordToOffset(xyz); + if (this->isChildMaskOff(n)) return this->isValueMaskOn(n); + acc.insert(xyz, mNodes[n].getChild()); + return mNodes[n].getChild()->isValueOnAndCache(xyz, acc); +} + + +template +inline const typename ChildT::ValueType& +InternalNode::getValue(const Coord& xyz) const +{ + const Index n = this->coordToOffset(xyz); + return this->isChildMaskOff(n) ? mNodes[n].getValue() + : mNodes[n].getChild()->getValue(xyz); +} + +template +template +inline const typename ChildT::ValueType& +InternalNode::getValueAndCache(const Coord& xyz, AccessorT& acc) const +{ + const Index n = this->coordToOffset(xyz); + if (this->isChildMaskOn(n)) { + acc.insert(xyz, mNodes[n].getChild()); + return mNodes[n].getChild()->getValueAndCache(xyz, acc); + } + return mNodes[n].getValue(); +} + + +template +inline Index +InternalNode::getValueLevel(const Coord& xyz) const +{ + const Index n = this->coordToOffset(xyz); + return this->isChildMaskOff(n) ? LEVEL : mNodes[n].getChild()->getValueLevel(xyz); +} + +template +template +inline Index +InternalNode::getValueLevelAndCache(const Coord& xyz, AccessorT& acc) const +{ + const Index n = this->coordToOffset(xyz); + if (this->isChildMaskOn(n)) { + acc.insert(xyz, mNodes[n].getChild()); + return mNodes[n].getChild()->getValueLevelAndCache(xyz, acc); + } + return LEVEL; +} + + +template +inline bool +InternalNode::probeValue(const Coord& xyz, ValueType& value) const +{ + const Index n = this->coordToOffset(xyz); + if (this->isChildMaskOff(n)) { + value = mNodes[n].getValue(); + return this->isValueMaskOn(n); + } + return mNodes[n].getChild()->probeValue(xyz, value); +} + +template +template +inline bool +InternalNode::probeValueAndCache(const Coord& xyz, + ValueType& value, AccessorT& acc) const +{ + const Index n = this->coordToOffset(xyz); + if (this->isChildMaskOn(n)) { + acc.insert(xyz, mNodes[n].getChild()); + return mNodes[n].getChild()->probeValueAndCache(xyz, value, acc); + } + value = mNodes[n].getValue(); + return this->isValueMaskOn(n); +} + + +template +inline void +InternalNode::setValueOff(const Coord& xyz) +{ + const Index n = this->coordToOffset(xyz); + bool hasChild = this->isChildMaskOn(n); + if (!hasChild && this->isValueMaskOn(n)) { + // If the voxel belongs to a constant tile that is active, + // a child subtree must be constructed. + hasChild = true; + this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), /*active=*/true)); + } + if (hasChild) mNodes[n].getChild()->setValueOff(xyz); +} + + +template +inline void +InternalNode::setValueOn(const Coord& xyz) +{ + const Index n = this->coordToOffset(xyz); + bool hasChild = this->isChildMaskOn(n); + if (!hasChild && !this->isValueMaskOn(n)) { + // If the voxel belongs to a constant tile that is inactive, + // a child subtree must be constructed. + hasChild = true; + this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), /*active=*/false)); + } + if (hasChild) mNodes[n].getChild()->setValueOn(xyz); +} + + +template +inline void +InternalNode::setValueOff(const Coord& xyz, const ValueType& value) +{ + const Index n = InternalNode::coordToOffset(xyz); + bool hasChild = this->isChildMaskOn(n); + if (!hasChild) { + const bool active = this->isValueMaskOn(n); + if (active || !math::isExactlyEqual(mNodes[n].getValue(), value)) { + // If the voxel belongs to a tile that is either active or that + // has a constant value that is different from the one provided, + // a child subtree must be constructed. + hasChild = true; + this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), active)); + } + } + if (hasChild) mNodes[n].getChild()->setValueOff(xyz, value); +} + +template +template +inline void +InternalNode::setValueOffAndCache(const Coord& xyz, + const ValueType& value, AccessorT& acc) +{ + const Index n = InternalNode::coordToOffset(xyz); + bool hasChild = this->isChildMaskOn(n); + if (!hasChild) { + const bool active = this->isValueMaskOn(n); + if (active || !math::isExactlyEqual(mNodes[n].getValue(), value)) { + // If the voxel belongs to a tile that is either active or that + // has a constant value that is different from the one provided, + // a child subtree must be constructed. + hasChild = true; + this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), active)); + } + } + if (hasChild) { + ChildT* child = mNodes[n].getChild(); + acc.insert(xyz, child); + child->setValueOffAndCache(xyz, value, acc); + } +} + + +template +inline void +InternalNode::setValueOn(const Coord& xyz, const ValueType& value) +{ + const Index n = this->coordToOffset(xyz); + bool hasChild = this->isChildMaskOn(n); + if (!hasChild) { + const bool active = this->isValueMaskOn(n); // tile's active state + if (!active || !math::isExactlyEqual(mNodes[n].getValue(), value)) { + // If the voxel belongs to a tile that is either inactive or that + // has a constant value that is different from the one provided, + // a child subtree must be constructed. + hasChild = true; + this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), active)); + } + } + if (hasChild) mNodes[n].getChild()->setValueOn(xyz, value); +} + +template +template +inline void +InternalNode::setValueAndCache(const Coord& xyz, + const ValueType& value, AccessorT& acc) +{ + const Index n = this->coordToOffset(xyz); + bool hasChild = this->isChildMaskOn(n); + if (!hasChild) { + const bool active = this->isValueMaskOn(n); + if (!active || !math::isExactlyEqual(mNodes[n].getValue(), value)) { + // If the voxel belongs to a tile that is either inactive or that + // has a constant value that is different from the one provided, + // a child subtree must be constructed. + hasChild = true; + this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), active)); + } + } + if (hasChild) { + acc.insert(xyz, mNodes[n].getChild()); + mNodes[n].getChild()->setValueAndCache(xyz, value, acc); + } +} + + +template +inline void +InternalNode::setValueOnly(const Coord& xyz, const ValueType& value) +{ + const Index n = this->coordToOffset(xyz); + bool hasChild = this->isChildMaskOn(n); + if (!hasChild && !math::isExactlyEqual(mNodes[n].getValue(), value)) { + // If the voxel has a tile value that is different from the one provided, + // a child subtree must be constructed. + const bool active = this->isValueMaskOn(n); + hasChild = true; + this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), active)); + } + if (hasChild) mNodes[n].getChild()->setValueOnly(xyz, value); +} + +template +template +inline void +InternalNode::setValueOnlyAndCache(const Coord& xyz, + const ValueType& value, AccessorT& acc) +{ + const Index n = this->coordToOffset(xyz); + bool hasChild = this->isChildMaskOn(n); + if (!hasChild && !math::isExactlyEqual(mNodes[n].getValue(), value)) { + // If the voxel has a tile value that is different from the one provided, + // a child subtree must be constructed. + const bool active = this->isValueMaskOn(n); + hasChild = true; + this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), active)); + } + if (hasChild) { + acc.insert(xyz, mNodes[n].getChild()); + mNodes[n].getChild()->setValueOnlyAndCache(xyz, value, acc); + } +} + + +template +inline void +InternalNode::setActiveState(const Coord& xyz, bool on) +{ + const Index n = this->coordToOffset(xyz); + bool hasChild = this->isChildMaskOn(n); + if (!hasChild) { + if (on != this->isValueMaskOn(n)) { + // If the voxel belongs to a tile with the wrong active state, + // then a child subtree must be constructed. + // 'on' is the voxel's new state, therefore '!on' is the tile's current state + hasChild = true; + this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), !on)); + } + } + if (hasChild) mNodes[n].getChild()->setActiveState(xyz, on); +} + +template +template +inline void +InternalNode::setActiveStateAndCache(const Coord& xyz, bool on, AccessorT& acc) +{ + const Index n = this->coordToOffset(xyz); + bool hasChild = this->isChildMaskOn(n); + if (!hasChild) { + if (on != this->isValueMaskOn(n)) { + // If the voxel belongs to a tile with the wrong active state, + // then a child subtree must be constructed. + // 'on' is the voxel's new state, therefore '!on' is the tile's current state + hasChild = true; + this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), !on)); + } + } + if (hasChild) { + ChildT* child = mNodes[n].getChild(); + acc.insert(xyz, child); + child->setActiveStateAndCache(xyz, on, acc); + } +} + + +template +inline void +InternalNode::setValuesOn() +{ + mValueMask = !mChildMask; + for (ChildOnIter iter = this->beginChildOn(); iter; ++iter) { + mNodes[iter.pos()].getChild()->setValuesOn(); + } +} + + +template +template +inline void +InternalNode::modifyValue(const Coord& xyz, const ModifyOp& op) +{ + const Index n = InternalNode::coordToOffset(xyz); + bool hasChild = this->isChildMaskOn(n); + if (!hasChild) { + // Need to create a child if the tile is inactive, + // in order to activate voxel (x, y, z). + const bool active = this->isValueMaskOn(n); + bool createChild = !active; + if (!createChild) { + // Need to create a child if applying the functor + // to the tile value produces a different value. + const ValueType& tileVal = mNodes[n].getValue(); + ValueType modifiedVal = tileVal; + op(modifiedVal); + createChild = !math::isExactlyEqual(tileVal, modifiedVal); + } + if (createChild) { + hasChild = true; + this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), active)); + } + } + if (hasChild) mNodes[n].getChild()->modifyValue(xyz, op); +} + +template +template +inline void +InternalNode::modifyValueAndCache(const Coord& xyz, const ModifyOp& op, + AccessorT& acc) +{ + const Index n = InternalNode::coordToOffset(xyz); + bool hasChild = this->isChildMaskOn(n); + if (!hasChild) { + // Need to create a child if the tile is inactive, + // in order to activate voxel (x, y, z). + const bool active = this->isValueMaskOn(n); + bool createChild = !active; + if (!createChild) { + // Need to create a child if applying the functor + // to the tile value produces a different value. + const ValueType& tileVal = mNodes[n].getValue(); + ValueType modifiedVal = tileVal; + op(modifiedVal); + createChild = !math::isExactlyEqual(tileVal, modifiedVal); + } + if (createChild) { + hasChild = true; + this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), active)); + } + } + if (hasChild) { + ChildNodeType* child = mNodes[n].getChild(); + acc.insert(xyz, child); + child->modifyValueAndCache(xyz, op, acc); + } +} + + +template +template +inline void +InternalNode::modifyValueAndActiveState(const Coord& xyz, const ModifyOp& op) +{ + const Index n = InternalNode::coordToOffset(xyz); + bool hasChild = this->isChildMaskOn(n); + if (!hasChild) { + const bool tileState = this->isValueMaskOn(n); + const ValueType& tileVal = mNodes[n].getValue(); + bool modifiedState = !tileState; + ValueType modifiedVal = tileVal; + op(modifiedVal, modifiedState); + // Need to create a child if applying the functor to the tile + // produces a different value or active state. + if (modifiedState != tileState || !math::isExactlyEqual(modifiedVal, tileVal)) { + hasChild = true; + this->setChildNode(n, new ChildNodeType(xyz, tileVal, tileState)); + } + } + if (hasChild) mNodes[n].getChild()->modifyValueAndActiveState(xyz, op); +} + +template +template +inline void +InternalNode::modifyValueAndActiveStateAndCache( + const Coord& xyz, const ModifyOp& op, AccessorT& acc) +{ + const Index n = InternalNode::coordToOffset(xyz); + bool hasChild = this->isChildMaskOn(n); + if (!hasChild) { + const bool tileState = this->isValueMaskOn(n); + const ValueType& tileVal = mNodes[n].getValue(); + bool modifiedState = !tileState; + ValueType modifiedVal = tileVal; + op(modifiedVal, modifiedState); + // Need to create a child if applying the functor to the tile + // produces a different value or active state. + if (modifiedState != tileState || !math::isExactlyEqual(modifiedVal, tileVal)) { + hasChild = true; + this->setChildNode(n, new ChildNodeType(xyz, tileVal, tileState)); + } + } + if (hasChild) { + ChildNodeType* child = mNodes[n].getChild(); + acc.insert(xyz, child); + child->modifyValueAndActiveStateAndCache(xyz, op, acc); + } +} + + +//////////////////////////////////////// + + +template +inline void +InternalNode::clip(const CoordBBox& clipBBox, const ValueType& background) +{ + CoordBBox nodeBBox = this->getNodeBoundingBox(); + if (!clipBBox.hasOverlap(nodeBBox)) { + // This node lies completely outside the clipping region. Fill it with background tiles. + this->fill(nodeBBox, background, /*active=*/false); + } else if (clipBBox.isInside(nodeBBox)) { + // This node lies completely inside the clipping region. Leave it intact. + return; + } + + // This node isn't completely contained inside the clipping region. + // Clip tiles and children, and replace any that lie outside the region + // with background tiles. + + for (Index pos = 0; pos < NUM_VALUES; ++pos) { + const Coord xyz = this->offsetToGlobalCoord(pos); // tile or child origin + CoordBBox tileBBox(xyz, xyz.offsetBy(ChildT::DIM - 1)); // tile or child bounds + if (!clipBBox.hasOverlap(tileBBox)) { + // This table entry lies completely outside the clipping region. + // Replace it with a background tile. + this->makeChildNodeEmpty(pos, background); + mValueMask.setOff(pos); + } else if (!clipBBox.isInside(tileBBox)) { + // This table entry does not lie completely inside the clipping region + // and must be clipped. + if (this->isChildMaskOn(pos)) { + mNodes[pos].getChild()->clip(clipBBox, background); + } else { + // Replace this tile with a background tile, then fill the clip region + // with the tile's original value. (This might create a child branch.) + tileBBox.intersect(clipBBox); + const ValueType val = mNodes[pos].getValue(); + const bool on = this->isValueMaskOn(pos); + mNodes[pos].setValue(background); + mValueMask.setOff(pos); + this->fill(tileBBox, val, on); + } + } else { + // This table entry lies completely inside the clipping region. Leave it intact. + } + } +} + + +//////////////////////////////////////// + + +template +inline void +InternalNode::fill(const CoordBBox& bbox, const ValueType& value, bool active) +{ + Coord xyz, tileMin, tileMax; + for (int x = bbox.min().x(); x <= bbox.max().x(); x = tileMax.x() + 1) { + xyz.setX(x); + for (int y = bbox.min().y(); y <= bbox.max().y(); y = tileMax.y() + 1) { + xyz.setY(y); + for (int z = bbox.min().z(); z <= bbox.max().z(); z = tileMax.z() + 1) { + xyz.setZ(z); + + // Get the bounds of the tile that contains voxel (x, y, z). + const Index n = this->coordToOffset(xyz); + tileMin = this->offsetToGlobalCoord(n); + tileMax = tileMin.offsetBy(ChildT::DIM - 1); + + if (xyz != tileMin || Coord::lessThan(bbox.max(), tileMax)) { + // If the box defined by (xyz, bbox.max()) doesn't completely enclose + // the tile to which xyz belongs, create a child node (or retrieve + // the existing one). + ChildT* child = NULL; + if (this->isChildMaskOff(n)) { + // Replace the tile with a newly-created child that is initialized + // with the tile's value and active state. + child = new ChildT(xyz, mNodes[n].getValue(), this->isValueMaskOn(n)); + this->setChildNode(n, child); + } else { + child = mNodes[n].getChild(); + } + + // Forward the fill request to the child. + if (child) { + child->fill(CoordBBox(xyz, Coord::minComponent(bbox.max(), tileMax)), + value, active); + } + + } else { + // If the box given by (xyz, bbox.max()) completely encloses + // the tile to which xyz belongs, create the tile (if it + // doesn't already exist) and give it the fill value. + this->makeChildNodeEmpty(n, value); + mValueMask.set(n, active); + } + } + } + } +} + + +//////////////////////////////////////// + + +template +template +inline void +InternalNode::copyToDense(const CoordBBox& bbox, DenseT& dense) const +{ + typedef typename DenseT::ValueType DenseValueType; + + const size_t xStride = dense.xStride(), yStride = dense.yStride(), zStride = dense.zStride(); + const Coord& min = dense.bbox().min(); + for (Coord xyz = bbox.min(), max; xyz[0] <= bbox.max()[0]; xyz[0] = max[0] + 1) { + for (xyz[1] = bbox.min()[1]; xyz[1] <= bbox.max()[1]; xyz[1] = max[1] + 1) { + for (xyz[2] = bbox.min()[2]; xyz[2] <= bbox.max()[2]; xyz[2] = max[2] + 1) { + const Index n = this->coordToOffset(xyz); + // Get max coordinates of the child node that contains voxel xyz. + max = this->offsetToGlobalCoord(n).offsetBy(ChildT::DIM-1); + + // Get the bbox of the interection of bbox and the child node + CoordBBox sub(xyz, Coord::minComponent(bbox.max(), max)); + + if (this->isChildMaskOn(n)) {//is a child + mNodes[n].getChild()->copyToDense(sub, dense); + } else {//a tile value + const ValueType value = mNodes[n].getValue(); + sub.translate(-min); + DenseValueType* a0 = dense.data() + zStride*sub.min()[2]; + for (Int32 x=sub.min()[0], ex=sub.max()[0]+1; x +inline void +InternalNode::writeTopology(std::ostream& os, bool toHalf) const +{ + mChildMask.save(os); + mValueMask.save(os); + + { + // Copy all of this node's values into an array. + boost::shared_array values(new ValueType[NUM_VALUES]); + const ValueType zero = zeroVal(); + for (Index i = 0; i < NUM_VALUES; ++i) { + values[i] = (mChildMask.isOff(i) ? mNodes[i].getValue() : zero); + } + // Compress (optionally) and write out the contents of the array. + io::writeCompressedValues(os, values.get(), NUM_VALUES, mValueMask, mChildMask, toHalf); + } + // Write out the child nodes in order. + for (ChildOnCIter iter = this->cbeginChildOn(); iter; ++iter) { + iter->writeTopology(os, toHalf); + } +} + + +template +inline void +InternalNode::readTopology(std::istream& is, bool fromHalf) +{ +#ifndef OPENVDB_2_ABI_COMPATIBLE + const ValueType background = (!io::getGridBackgroundValuePtr(is) ? zeroVal() + : *static_cast(io::getGridBackgroundValuePtr(is))); +#endif + + mChildMask.load(is); + mValueMask.load(is); + + if (io::getFormatVersion(is) < OPENVDB_FILE_VERSION_INTERNALNODE_COMPRESSION) { + for (Index i = 0; i < NUM_VALUES; ++i) { + if (this->isChildMaskOn(i)) { + ChildNodeType* child = +#ifdef OPENVDB_2_ABI_COMPATIBLE + new ChildNodeType(offsetToGlobalCoord(i), zeroVal()); +#else + new ChildNodeType(PartialCreate(), offsetToGlobalCoord(i), background); +#endif + mNodes[i].setChild(child); + child->readTopology(is); + } else { + ValueType value; + is.read(reinterpret_cast(&value), sizeof(ValueType)); + mNodes[i].setValue(value); + } + } + } else { + const bool oldVersion = + (io::getFormatVersion(is) < OPENVDB_FILE_VERSION_NODE_MASK_COMPRESSION); + const Index numValues = (oldVersion ? mChildMask.countOff() : NUM_VALUES); + { + // Read in (and uncompress, if necessary) all of this node's values + // into a contiguous array. + boost::shared_array values(new ValueType[numValues]); + io::readCompressedValues(is, values.get(), numValues, mValueMask, fromHalf); + + // Copy values from the array into this node's table. + if (oldVersion) { + Index n = 0; + for (ValueAllIter iter = this->beginValueAll(); iter; ++iter) { + mNodes[iter.pos()].setValue(values[n++]); + } + assert(n == numValues); + } else { + for (ValueAllIter iter = this->beginValueAll(); iter; ++iter) { + mNodes[iter.pos()].setValue(values[iter.pos()]); + } + } + } + // Read in all child nodes and insert them into the table at their proper locations. + for (ChildOnIter iter = this->beginChildOn(); iter; ++iter) { +#ifdef OPENVDB_2_ABI_COMPATIBLE + ChildNodeType* child = new ChildNodeType(iter.getCoord(), zeroVal()); +#else + ChildNodeType* child = new ChildNodeType(PartialCreate(), iter.getCoord(), background); +#endif + mNodes[iter.pos()].setChild(child); + child->readTopology(is, fromHalf); + } + } +} + + +//////////////////////////////////////// + + +template +inline const typename ChildT::ValueType& +InternalNode::getFirstValue() const +{ + return (this->isChildMaskOn(0) ? mNodes[0].getChild()->getFirstValue() : mNodes[0].getValue()); +} + + +template +inline const typename ChildT::ValueType& +InternalNode::getLastValue() const +{ + const Index n = NUM_VALUES - 1; + return (this->isChildMaskOn(n) ? mNodes[n].getChild()->getLastValue() : mNodes[n].getValue()); +} + + +//////////////////////////////////////// + + +template +inline void +InternalNode::negate() +{ + for (Index i = 0; i < NUM_VALUES; ++i) { + if (this->isChildMaskOn(i)) { + mNodes[i].getChild()->negate(); + } else { + mNodes[i].setValue(math::negative(mNodes[i].getValue())); + } + } + +} + +//////////////////////////////////////// + +template +struct InternalNode::VoxelizeActiveTiles +{ + VoxelizeActiveTiles(InternalNode &node) : mNode(&node) { + //(*this)(tbb::blocked_range(0, NUM_VALUES));//single thread for debugging + tbb::parallel_for(tbb::blocked_range(0, NUM_VALUES), *this); + + node.mChildMask |= node.mValueMask; + node.mValueMask.setOff(); + } + void operator()(const tbb::blocked_range &r) const + { + for (Index i = r.begin(), end=r.end(); i!=end; ++i) { + if (mNode->mChildMask.isOn(i)) {// Loop over node's child nodes + mNode->mNodes[i].getChild()->voxelizeActiveTiles(true); + } else if (mNode->mValueMask.isOn(i)) {// Loop over node's active tiles + const Coord &ijk = mNode->offsetToGlobalCoord(i); + ChildNodeType *child = new ChildNodeType(ijk, mNode->mNodes[i].getValue(), true); + child->voxelizeActiveTiles(true); + mNode->mNodes[i].setChild(child); + } + } + } + InternalNode* mNode; +};// VoxelizeActiveTiles + +template +inline void +InternalNode::voxelizeActiveTiles(bool threaded) +{ + if (threaded) { + VoxelizeActiveTiles tmp(*this); + } else { + for (ValueOnIter iter = this->beginValueOn(); iter; ++iter) { + this->setChildNode(iter.pos(), new ChildNodeType(iter.getCoord(), iter.getValue(), true)); + } + for (ChildOnIter iter = this->beginChildOn(); iter; ++iter) + iter->voxelizeActiveTiles(false); + } +} + + +//////////////////////////////////////// + + +template +template +inline void +InternalNode::merge(InternalNode& other, + const ValueType& background, const ValueType& otherBackground) +{ + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + + switch (Policy) { + + case MERGE_ACTIVE_STATES: + default: + { + for (ChildOnIter iter = other.beginChildOn(); iter; ++iter) { + const Index n = iter.pos(); + if (mChildMask.isOn(n)) { + // Merge this node's child with the other node's child. + mNodes[n].getChild()->template merge(*iter, + background, otherBackground); + } else if (mValueMask.isOff(n)) { + // Replace this node's inactive tile with the other node's child + // and replace the other node's child with a tile of undefined value + // (which is okay since the other tree is assumed to be cannibalized + // in the process of merging). + ChildNodeType* child = other.mNodes[n].getChild(); + other.mChildMask.setOff(n); + child->resetBackground(otherBackground, background); + this->setChildNode(n, child); + } + } + + // Copy active tile values. + for (ValueOnCIter iter = other.cbeginValueOn(); iter; ++iter) { + const Index n = iter.pos(); + if (mValueMask.isOff(n)) { + // Replace this node's child or inactive tile with the other node's active tile. + this->makeChildNodeEmpty(n, iter.getValue()); + mValueMask.setOn(n); + } + } + break; + } + + case MERGE_NODES: + { + for (ChildOnIter iter = other.beginChildOn(); iter; ++iter) { + const Index n = iter.pos(); + if (mChildMask.isOn(n)) { + // Merge this node's child with the other node's child. + mNodes[n].getChild()->template merge(*iter, background, otherBackground); + } else { + // Replace this node's tile (regardless of its active state) with + // the other node's child and replace the other node's child with + // a tile of undefined value (which is okay since the other tree + // is assumed to be cannibalized in the process of merging). + ChildNodeType* child = other.mNodes[n].getChild(); + other.mChildMask.setOff(n); + child->resetBackground(otherBackground, background); + this->setChildNode(n, child); + } + } + break; + } + + case MERGE_ACTIVE_STATES_AND_NODES: + { + // Transfer children from the other tree to this tree. + for (ChildOnIter iter = other.beginChildOn(); iter; ++iter) { + const Index n = iter.pos(); + if (mChildMask.isOn(n)) { + // Merge this node's child with the other node's child. + mNodes[n].getChild()->template merge(*iter, background, otherBackground); + } else { + // Replace this node's tile with the other node's child, leaving the other + // node with an inactive tile of undefined value (which is okay since + // the other tree is assumed to be cannibalized in the process of merging). + ChildNodeType* child = other.mNodes[n].getChild(); + other.mChildMask.setOff(n); + child->resetBackground(otherBackground, background); + if (mValueMask.isOn(n)) { + // Merge the child with this node's active tile. + child->template merge(mNodes[n].getValue(), /*on=*/true); + mValueMask.setOff(n); + } + mChildMask.setOn(n); + mNodes[n].setChild(child); + } + } + + // Merge active tiles into this tree. + for (ValueOnCIter iter = other.cbeginValueOn(); iter; ++iter) { + const Index n = iter.pos(); + if (mChildMask.isOn(n)) { + // Merge the other node's active tile into this node's child. + mNodes[n].getChild()->template merge(iter.getValue(), /*on=*/true); + } else if (mValueMask.isOff(n)) { + // Replace this node's inactive tile with the other node's active tile. + mNodes[n].setValue(iter.getValue()); + mValueMask.setOn(n); + } + } + break; + } + + } + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END +} + + +template +template +inline void +InternalNode::merge(const ValueType& tileValue, bool tileActive) +{ + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + + if (Policy != MERGE_ACTIVE_STATES_AND_NODES) return; + + // For MERGE_ACTIVE_STATES_AND_NODES, inactive tiles in the other tree are ignored. + if (!tileActive) return; + + // Iterate over this node's children and inactive tiles. + for (ValueOffIter iter = this->beginValueOff(); iter; ++iter) { + const Index n = iter.pos(); + if (mChildMask.isOn(n)) { + // Merge the other node's active tile into this node's child. + mNodes[n].getChild()->template merge(tileValue, /*on=*/true); + } else { + // Replace this node's inactive tile with the other node's active tile. + iter.setValue(tileValue); + mValueMask.setOn(n); + } + } + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END +} + +//////////////////////////////////////// + +template +template +struct InternalNode::TopologyUnion +{ + typedef typename NodeMaskType::Word W; + struct A { inline void operator()(W &tV, const W& sV, const W& tC) const + { tV = (tV | sV) & ~tC; } + }; + TopologyUnion(const OtherInternalNode* source, InternalNode* target) : s(source), t(target) { + //(*this)(tbb::blocked_range(0, NUM_VALUES));//single thread for debugging + tbb::parallel_for(tbb::blocked_range(0, NUM_VALUES), *this); + + // Bit processing is done in a single thread! + t->mChildMask |= s->mChildMask;//serial but very fast bitwise post-process + A op; + t->mValueMask.foreach(s->mValueMask, t->mChildMask, op); + assert((t->mValueMask & t->mChildMask).isOff());//no overlapping active tiles and child nodes + } + void operator()(const tbb::blocked_range &r) const { + for (Index i = r.begin(), end=r.end(); i!=end; ++i) { + if (s->mChildMask.isOn(i)) {// Loop over other node's child nodes + const typename OtherInternalNode::ChildNodeType& other = *(s->mNodes[i].getChild()); + if (t->mChildMask.isOn(i)) {//this has a child node + t->mNodes[i].getChild()->topologyUnion(other); + } else {// this is a tile so replace it with a child branch with identical topology + ChildT* child = new ChildT(other, t->mNodes[i].getValue(), TopologyCopy()); + if (t->mValueMask.isOn(i)) child->setValuesOn();//activate all values + t->mNodes[i].setChild(child); + } + } else if (s->mValueMask.isOn(i) && t->mChildMask.isOn(i)) { + t->mNodes[i].getChild()->setValuesOn(); + } + } + } + const OtherInternalNode* s; + InternalNode* t; +};// TopologyUnion + +template +template +inline void +InternalNode::topologyUnion(const InternalNode& other) +{ + TopologyUnion > tmp(&other, this); +} + +template +template +struct InternalNode::TopologyIntersection +{ + typedef typename NodeMaskType::Word W; + struct A { inline void operator()(W &tC, const W& sC, const W& sV, const W& tV) const + { tC = (tC & (sC | sV)) | (tV & sC); } + }; + TopologyIntersection(const OtherInternalNode* source, InternalNode* target, + const ValueType& background) : s(source), t(target), b(background) { + //(*this)(tbb::blocked_range(0, NUM_VALUES));//single thread for debugging + tbb::parallel_for(tbb::blocked_range(0, NUM_VALUES), *this); + + // Bit processing is done in a single thread! + A op; + t->mChildMask.foreach(s->mChildMask, s->mValueMask, t->mValueMask, op); + + t->mValueMask &= s->mValueMask; + assert((t->mValueMask & t->mChildMask).isOff());//no overlapping active tiles and child nodes + } + void operator()(const tbb::blocked_range &r) const { + for (Index i = r.begin(), end=r.end(); i!=end; ++i) { + if (t->mChildMask.isOn(i)) {// Loop over this node's child nodes + ChildT* child = t->mNodes[i].getChild(); + if (s->mChildMask.isOn(i)) {//other also has a child node + child->topologyIntersection(*(s->mNodes[i].getChild()), b); + } else if (s->mValueMask.isOff(i)) {//other is an inactive tile + delete child;//convert child to an inactive tile + t->mNodes[i].setValue(b); + } + } else if (t->mValueMask.isOn(i) && s->mChildMask.isOn(i)) {//active tile -> a branch + t->mNodes[i].setChild(new ChildT(*(s->mNodes[i].getChild()), + t->mNodes[i].getValue(), TopologyCopy())); + } + } + } + const OtherInternalNode* s; + InternalNode* t; + const ValueType& b; +};// TopologyIntersection + +template +template +inline void +InternalNode::topologyIntersection(const InternalNode& other, + const ValueType& background) +{ + TopologyIntersection > tmp(&other, this, background); +} + +template +template +struct InternalNode::TopologyDifference +{ + typedef typename NodeMaskType::Word W; + struct A {inline void operator()(W &tC, const W& sC, const W& sV, const W& tV) const + { tC = (tC & (sC | ~sV)) | (tV & sC); } + }; + struct B {inline void operator()(W &tV, const W& sC, const W& sV, const W& tC) const + { tV &= ~((tC & sV) | (sC | sV)); } + }; + TopologyDifference(const OtherInternalNode* source, InternalNode* target, + const ValueType& background) : s(source), t(target), b(background) { + //(*this)(tbb::blocked_range(0, NUM_VALUES));//single thread for debugging + tbb::parallel_for(tbb::blocked_range(0, NUM_VALUES), *this); + + // Bit processing is done in a single thread! + const NodeMaskType oldChildMask(t->mChildMask);//important to avoid cross pollution + A op1; + t->mChildMask.foreach(s->mChildMask, s->mValueMask, t->mValueMask, op1); + + B op2; + t->mValueMask.foreach(t->mChildMask, s->mValueMask, oldChildMask, op2); + assert((t->mValueMask & t->mChildMask).isOff());//no overlapping active tiles and child nodes + } + void operator()(const tbb::blocked_range &r) const { + for (Index i = r.begin(), end=r.end(); i!=end; ++i) { + if (t->mChildMask.isOn(i)) {// Loop over this node's child nodes + ChildT* child = t->mNodes[i].getChild(); + if (s->mChildMask.isOn(i)) { + child->topologyDifference(*(s->mNodes[i].getChild()), b); + } else if (s->mValueMask.isOn(i)) { + delete child;//convert child to an inactive tile + t->mNodes[i].setValue(b); + } + } else if (t->mValueMask.isOn(i)) {//this is an active tile + if (s->mChildMask.isOn(i)) { + const typename OtherInternalNode::ChildNodeType& other = *(s->mNodes[i].getChild()); + ChildT* child = new ChildT(other.origin(), t->mNodes[i].getValue(), true); + child->topologyDifference(other, b); + t->mNodes[i].setChild(child);//replace the active tile with a child branch + } + } + } + } + const OtherInternalNode* s; + InternalNode* t; + const ValueType& b; +};// TopologyDifference + +template +template +inline void +InternalNode::topologyDifference(const InternalNode& other, + const ValueType& background) +{ + TopologyDifference > tmp(&other, this, background); +} + +//////////////////////////////////////// + + +template +template +inline void +InternalNode::combine(InternalNode& other, CombineOp& op) +{ + const ValueType zero = zeroVal(); + + CombineArgs args; + + for (Index i = 0; i < NUM_VALUES; ++i) { + if (this->isChildMaskOff(i) && other.isChildMaskOff(i)) { + // Both this node and the other node have constant values (tiles). + // Combine the two values and store the result as this node's new tile value. + op(args.setARef(mNodes[i].getValue()) + .setAIsActive(isValueMaskOn(i)) + .setBRef(other.mNodes[i].getValue()) + .setBIsActive(other.isValueMaskOn(i))); + mNodes[i].setValue(args.result()); + mValueMask.set(i, args.resultIsActive()); + } else if (this->isChildMaskOn(i) && other.isChildMaskOff(i)) { + // Combine this node's child with the other node's constant value. + ChildNodeType* child = mNodes[i].getChild(); + assert(child); + if (child) { + child->combine(other.mNodes[i].getValue(), other.isValueMaskOn(i), op); + } + } else if (this->isChildMaskOff(i) && other.isChildMaskOn(i)) { + // Combine this node's constant value with the other node's child. + ChildNodeType* child = other.mNodes[i].getChild(); + assert(child); + if (child) { + // Combine this node's constant value with the other node's child, + // but use a new functor in which the A and B values are swapped, + // since the constant value is the A value, not the B value. + SwappedCombineOp swappedOp(op); + child->combine(mNodes[i].getValue(), isValueMaskOn(i), swappedOp); + + // Steal the other node's child. + other.mChildMask.setOff(i); + other.mNodes[i].setValue(zero); + this->setChildNode(i, child); + } + + } else /*if (isChildMaskOn(i) && other.isChildMaskOn(i))*/ { + // Combine this node's child with the other node's child. + ChildNodeType + *child = mNodes[i].getChild(), + *otherChild = other.mNodes[i].getChild(); + assert(child); + assert(otherChild); + if (child && otherChild) { + child->combine(*otherChild, op); + } + } + } +} + + +template +template +inline void +InternalNode::combine(const ValueType& value, bool valueIsActive, CombineOp& op) +{ + CombineArgs args; + + for (Index i = 0; i < NUM_VALUES; ++i) { + if (this->isChildMaskOff(i)) { + // Combine this node's constant value with the given constant value. + op(args.setARef(mNodes[i].getValue()) + .setAIsActive(isValueMaskOn(i)) + .setBRef(value) + .setBIsActive(valueIsActive)); + mNodes[i].setValue(args.result()); + mValueMask.set(i, args.resultIsActive()); + } else /*if (isChildMaskOn(i))*/ { + // Combine this node's child with the given constant value. + ChildNodeType* child = mNodes[i].getChild(); + assert(child); + if (child) child->combine(value, valueIsActive, op); + } + } +} + + +//////////////////////////////////////// + + +template +template +inline void +InternalNode::combine2(const InternalNode& other0, const OtherNodeType& other1, + CombineOp& op) +{ + CombineArgs args; + + for (Index i = 0; i < NUM_VALUES; ++i) { + if (other0.isChildMaskOff(i) && other1.isChildMaskOff(i)) { + op(args.setARef(other0.mNodes[i].getValue()) + .setAIsActive(other0.isValueMaskOn(i)) + .setBRef(other1.mNodes[i].getValue()) + .setBIsActive(other1.isValueMaskOn(i))); + // Replace child i with a constant value. + this->makeChildNodeEmpty(i, args.result()); + mValueMask.set(i, args.resultIsActive()); + } else { + if (this->isChildMaskOff(i)) { + // Add a new child with the same coordinates, etc. as the other node's child. + const Coord& childOrigin = other0.isChildMaskOn(i) + ? other0.mNodes[i].getChild()->origin() + : other1.mNodes[i].getChild()->origin(); + this->setChildNode(i, new ChildNodeType(childOrigin, mNodes[i].getValue())); + } + + if (other0.isChildMaskOff(i)) { + // Combine node1's child with node0's constant value + // and write the result into child i. + mNodes[i].getChild()->combine2(other0.mNodes[i].getValue(), + *other1.mNodes[i].getChild(), other0.isValueMaskOn(i), op); + } else if (other1.isChildMaskOff(i)) { + // Combine node0's child with node1's constant value + // and write the result into child i. + mNodes[i].getChild()->combine2(*other0.mNodes[i].getChild(), + other1.mNodes[i].getValue(), other1.isValueMaskOn(i), op); + } else { + // Combine node0's child with node1's child + // and write the result into child i. + mNodes[i].getChild()->combine2(*other0.mNodes[i].getChild(), + *other1.mNodes[i].getChild(), op); + } + } + } +} + + +template +template +inline void +InternalNode::combine2(const ValueType& value, const OtherNodeType& other, + bool valueIsActive, CombineOp& op) +{ + CombineArgs args; + + for (Index i = 0; i < NUM_VALUES; ++i) { + if (other.isChildMaskOff(i)) { + op(args.setARef(value) + .setAIsActive(valueIsActive) + .setBRef(other.mNodes[i].getValue()) + .setBIsActive(other.isValueMaskOn(i))); + // Replace child i with a constant value. + this->makeChildNodeEmpty(i, args.result()); + mValueMask.set(i, args.resultIsActive()); + } else { + typename OtherNodeType::ChildNodeType* otherChild = other.mNodes[i].getChild(); + assert(otherChild); + if (this->isChildMaskOff(i)) { + // Add a new child with the same coordinates, etc. + // as the other node's child. + this->setChildNode(i, new ChildNodeType(*otherChild)); + } + // Combine the other node's child with a constant value + // and write the result into child i. + mNodes[i].getChild()->combine2(value, *otherChild, valueIsActive, op); + } + } +} + + +template +template +inline void +InternalNode::combine2(const InternalNode& other, const OtherValueType& value, + bool valueIsActive, CombineOp& op) +{ + CombineArgs args; + + for (Index i = 0; i < NUM_VALUES; ++i) { + if (other.isChildMaskOff(i)) { + op(args.setARef(other.mNodes[i].getValue()) + .setAIsActive(other.isValueMaskOn(i)) + .setBRef(value) + .setBIsActive(valueIsActive)); + // Replace child i with a constant value. + this->makeChildNodeEmpty(i, args.result()); + mValueMask.set(i, args.resultIsActive()); + } else { + ChildNodeType* otherChild = other.mNodes[i].getChild(); + assert(otherChild); + if (this->isChildMaskOff(i)) { + // Add a new child with the same coordinates, etc. as the other node's child. + this->setChildNode(i, + new ChildNodeType(otherChild->origin(), mNodes[i].getValue())); + } + // Combine the other node's child with a constant value + // and write the result into child i. + mNodes[i].getChild()->combine2(*otherChild, value, valueIsActive, op); + } + } +} + + +//////////////////////////////////////// + + +template +template +inline void +InternalNode::visitActiveBBox(BBoxOp& op) const +{ + for (ValueOnCIter i = this->cbeginValueOn(); i; ++i) { +#ifdef _MSC_VER + op.operator()(CoordBBox::createCube(i.getCoord(), ChildNodeType::DIM)); +#else + op.template operator()(CoordBBox::createCube(i.getCoord(), ChildNodeType::DIM)); +#endif + } + if (op.template descent()) { + for (ChildOnCIter i = this->cbeginChildOn(); i; ++i) i->visitActiveBBox(op); + } else { + for (ChildOnCIter i = this->cbeginChildOn(); i; ++i) { +#ifdef _MSC_VER + op.operator()(i->getNodeBoundingBox()); +#else + op.template operator()(i->getNodeBoundingBox()); +#endif + } + } +} + + +template +template +inline void +InternalNode::visit(VisitorOp& op) +{ + doVisit(*this, op); +} + + +template +template +inline void +InternalNode::visit(VisitorOp& op) const +{ + doVisit(*this, op); +} + + +template +template +inline void +InternalNode::doVisit(NodeT& self, VisitorOp& op) +{ + typename NodeT::ValueType val; + for (ChildAllIterT iter = self.beginChildAll(); iter; ++iter) { + if (op(iter)) continue; + if (typename ChildAllIterT::ChildNodeType* child = iter.probeChild(val)) { + child->visit(op); + } + } +} + + +//////////////////////////////////////// + + +template +template +inline void +InternalNode::visit2Node(OtherNodeType& other, VisitorOp& op) +{ + doVisit2Node(*this, other, op); +} + + +template +template +inline void +InternalNode::visit2Node(OtherNodeType& other, VisitorOp& op) const +{ + doVisit2Node(*this, other, op); +} + + +template +template< + typename NodeT, + typename OtherNodeT, + typename VisitorOp, + typename ChildAllIterT, + typename OtherChildAllIterT> +inline void +InternalNode::doVisit2Node(NodeT& self, OtherNodeT& other, VisitorOp& op) +{ + // Allow the two nodes to have different ValueTypes, but not different dimensions. + BOOST_STATIC_ASSERT(OtherNodeT::NUM_VALUES == NodeT::NUM_VALUES); + BOOST_STATIC_ASSERT(OtherNodeT::LEVEL == NodeT::LEVEL); + + typename NodeT::ValueType val; + typename OtherNodeT::ValueType otherVal; + + ChildAllIterT iter = self.beginChildAll(); + OtherChildAllIterT otherIter = other.beginChildAll(); + + for ( ; iter && otherIter; ++iter, ++otherIter) + { + const size_t skipBranch = static_cast(op(iter, otherIter)); + + typename ChildAllIterT::ChildNodeType* child = + (skipBranch & 1U) ? NULL : iter.probeChild(val); + typename OtherChildAllIterT::ChildNodeType* otherChild = + (skipBranch & 2U) ? NULL : otherIter.probeChild(otherVal); + + if (child != NULL && otherChild != NULL) { + child->visit2Node(*otherChild, op); + } else if (child != NULL) { + child->visit2(otherIter, op); + } else if (otherChild != NULL) { + otherChild->visit2(iter, op, /*otherIsLHS=*/true); + } + } +} + + +//////////////////////////////////////// + + +template +template +inline void +InternalNode::visit2(OtherChildAllIterType& otherIter, + VisitorOp& op, bool otherIsLHS) +{ + doVisit2( + *this, otherIter, op, otherIsLHS); +} + + +template +template +inline void +InternalNode::visit2(OtherChildAllIterType& otherIter, + VisitorOp& op, bool otherIsLHS) const +{ + doVisit2( + *this, otherIter, op, otherIsLHS); +} + + +template +template +inline void +InternalNode::doVisit2(NodeT& self, OtherChildAllIterT& otherIter, + VisitorOp& op, bool otherIsLHS) +{ + if (!otherIter) return; + + const size_t skipBitMask = (otherIsLHS ? 2U : 1U); + + typename NodeT::ValueType val; + for (ChildAllIterT iter = self.beginChildAll(); iter; ++iter) { + const size_t skipBranch = static_cast( + otherIsLHS ? op(otherIter, iter) : op(iter, otherIter)); + + typename ChildAllIterT::ChildNodeType* child = + (skipBranch & skipBitMask) ? NULL : iter.probeChild(val); + + if (child != NULL) child->visit2(otherIter, op, otherIsLHS); + } +} + + +//////////////////////////////////////// + + +template +inline void +InternalNode::writeBuffers(std::ostream& os, bool toHalf) const +{ + for (ChildOnCIter iter = this->cbeginChildOn(); iter; ++iter) { + iter->writeBuffers(os, toHalf); + } +} + + +template +inline void +InternalNode::readBuffers(std::istream& is, bool fromHalf) +{ + for (ChildOnIter iter = this->beginChildOn(); iter; ++iter) { + iter->readBuffers(is, fromHalf); + } +} + + +template +inline void +InternalNode::readBuffers(std::istream& is, + const CoordBBox& clipBBox, bool fromHalf) +{ + for (ChildOnIter iter = this->beginChildOn(); iter; ++iter) { + // Stream in the branch rooted at this child. + // (We can't skip over children that lie outside the clipping region, + // because buffers are serialized in depth-first order and need to be + // unserialized in the same order.) + iter->readBuffers(is, clipBBox, fromHalf); + } + + // Get this tree's background value. + ValueType background = zeroVal(); + if (const void* bgPtr = io::getGridBackgroundValuePtr(is)) { + background = *static_cast(bgPtr); + } + this->clip(clipBBox, background); +} + + +//////////////////////////////////////// + + +template +void +InternalNode::getNodeLog2Dims(std::vector& dims) +{ + dims.push_back(Log2Dim); + ChildNodeType::getNodeLog2Dims(dims); +} + + +template +inline void +InternalNode::offsetToLocalCoord(Index n, Coord &xyz) +{ + assert(n<(1<<3*Log2Dim)); + xyz.setX(n >> 2*Log2Dim); + n &= ((1<<2*Log2Dim)-1); + xyz.setY(n >> Log2Dim); + xyz.setZ(n & ((1< +inline Index +InternalNode::coordToOffset(const Coord& xyz) +{ + return (((xyz[0] & (DIM-1u)) >> ChildNodeType::TOTAL) << 2*Log2Dim) + + (((xyz[1] & (DIM-1u)) >> ChildNodeType::TOTAL) << Log2Dim) + + ((xyz[2] & (DIM-1u)) >> ChildNodeType::TOTAL); +} + + +template +inline Coord +InternalNode::offsetToGlobalCoord(Index n) const +{ + Coord local; + this->offsetToLocalCoord(n, local); + local <<= ChildT::TOTAL; + return local + this->origin(); +} + +//////////////////////////////////////// + +template +template +inline void +InternalNode::getNodes(ArrayT& array) +{ + typedef typename ArrayT::value_type T; + BOOST_STATIC_ASSERT(boost::is_pointer::value); + typedef typename boost::mpl::if_::type>, + const ChildT, ChildT>::type ArrayChildT; + for (ChildOnIter iter = this->beginChildOn(); iter; ++iter) { + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (boost::is_same::value) { + array.push_back(reinterpret_cast(mNodes[iter.pos()].getChild())); + } else { + iter->getNodes(array);//descent + } + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } +} + +template +template +inline void +InternalNode::getNodes(ArrayT& array) const +{ + typedef typename ArrayT::value_type T; + BOOST_STATIC_ASSERT(boost::is_pointer::value); + BOOST_STATIC_ASSERT(boost::is_const::type>::value); + for (ChildOnCIter iter = this->cbeginChildOn(); iter; ++iter) { + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (boost::is_same::value) { + array.push_back(reinterpret_cast(mNodes[iter.pos()].getChild())); + } else { + iter->getNodes(array);//descent + } + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } +} + +//////////////////////////////////////// + +template +template +inline void +InternalNode::stealNodes(ArrayT& array, const ValueType& value, bool state) +{ + typedef typename ArrayT::value_type T; + BOOST_STATIC_ASSERT(boost::is_pointer::value); + typedef typename boost::mpl::if_::type>, + const ChildT, ChildT>::type ArrayChildT; + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + for (ChildOnIter iter = this->beginChildOn(); iter; ++iter) { + const Index n = iter.pos(); + if (boost::is_same::value) { + array.push_back(reinterpret_cast(mNodes[n].getChild())); + mValueMask.set(n, state); + mNodes[n].setValue(value); + } else { + iter->stealNodes(array, value, state);//descent + } + } + if (boost::is_same::value) mChildMask.setOff(); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END +} + +//////////////////////////////////////// + + +template +inline void +InternalNode::resetBackground(const ValueType& oldBackground, + const ValueType& newBackground) +{ + if (math::isExactlyEqual(oldBackground, newBackground)) return; + for (Index i = 0; i < NUM_VALUES; ++i) { + if (this->isChildMaskOn(i)) { + mNodes[i].getChild()->resetBackground(oldBackground, newBackground); + } else if (this->isValueMaskOff(i)) { + if (math::isApproxEqual(mNodes[i].getValue(), oldBackground)) { + mNodes[i].setValue(newBackground); + } else if (math::isApproxEqual(mNodes[i].getValue(), math::negative(oldBackground))) { + mNodes[i].setValue(math::negative(newBackground)); + } + } + } +} + +template +template +inline bool +InternalNode::hasSameTopology( + const InternalNode* other) const +{ + if (Log2Dim != OtherLog2Dim || mChildMask != other->mChildMask || + mValueMask != other->mValueMask) return false; + for (ChildOnCIter iter = this->cbeginChildOn(); iter; ++iter) { + if (!iter->hasSameTopology(other->mNodes[iter.pos()].getChild())) return false; + } + return true; +} + + +template +inline void +InternalNode::resetChildNode(Index i, ChildNodeType* child) +{ + assert(child); + if (this->isChildMaskOn(i)) { + delete mNodes[i].getChild(); + } else { + mChildMask.setOn(i); + mValueMask.setOff(i); + } + mNodes[i].setChild(child); +} + +template +inline void +InternalNode::setChildNode(Index i, ChildNodeType* child) +{ + assert(child); + assert(mChildMask.isOff(i)); + mChildMask.setOn(i); + mValueMask.setOff(i); + mNodes[i].setChild(child); +} + + +template +inline ChildT* +InternalNode::unsetChildNode(Index i, const ValueType& value) +{ + if (this->isChildMaskOff(i)) { + mNodes[i].setValue(value); + return NULL; + } + ChildNodeType* child = mNodes[i].getChild(); + mChildMask.setOff(i); + mNodes[i].setValue(value); + return child; +} + + +template +inline void +InternalNode::makeChildNodeEmpty(Index n, const ValueType& value) +{ + delete this->unsetChildNode(n, value); +} + +template +inline ChildT* +InternalNode::getChildNode(Index n) +{ + assert(this->isChildMaskOn(n)); + return mNodes[n].getChild(); +} + + +template +inline const ChildT* +InternalNode::getChildNode(Index n) const +{ + assert(this->isChildMaskOn(n)); + return mNodes[n].getChild(); +} + +} // namespace tree +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TREE_INTERNALNODE_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tree/Iterator.h b/nuparu/include/openvdb/include/openvdb/tree/Iterator.h new file mode 100644 index 00000000..41fa104d --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tree/Iterator.h @@ -0,0 +1,290 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file Iterator.h +/// +/// @author Peter Cucka and Ken Museth + +#ifndef OPENVDB_TREE_ITERATOR_HAS_BEEN_INCLUDED +#define OPENVDB_TREE_ITERATOR_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tree { + +/// @brief Base class for iterators over internal and leaf nodes +/// +/// This class is typically not instantiated directly, since it doesn't provide methods +/// to dereference the iterator. Those methods (@vdblink::tree::SparseIteratorBase::operator*() +/// operator*()@endlink, @vdblink::tree::SparseIteratorBase::setValue() setValue()@endlink, etc.) +/// are implemented in the @vdblink::tree::SparseIteratorBase sparse@endlink and +/// @vdblink::tree::DenseIteratorBase dense@endlink iterator subclasses. +template +class IteratorBase +{ +public: + IteratorBase(): mParentNode(NULL) {} + IteratorBase(const MaskIterT& iter, NodeT* parent): + mParentNode(parent), mMaskIter(iter) {} + + void operator=(const IteratorBase& other) + { + mParentNode = other.mParentNode; + mMaskIter = other.mMaskIter; + } + + bool operator==(const IteratorBase& other) const + { + return (mParentNode == other.mParentNode) && (mMaskIter == other.mMaskIter); + } + bool operator!=(const IteratorBase& other) const + { + return !(*this == other); + } + + /// Return a pointer to the node (if any) over which this iterator is iterating. + NodeT* getParentNode() const { return mParentNode; } + /// @brief Return a reference to the node over which this iterator is iterating. + /// @throw ValueError if there is no parent node. + NodeT& parent() const + { + if (!mParentNode) OPENVDB_THROW(ValueError, "iterator references a null node"); + return *mParentNode; + } + + /// Return this iterator's position as an index into the parent node's table. + Index offset() const { return mMaskIter.offset(); } + + /// Identical to offset + Index pos() const { return mMaskIter.offset(); } + + /// Return @c true if this iterator is not yet exhausted. + bool test() const { return mMaskIter.test(); } + /// Return @c true if this iterator is not yet exhausted. + operator bool() const { return this->test(); } + + /// Advance to the next item in the parent node's table. + bool next() { return mMaskIter.next(); } + /// Advance to the next item in the parent node's table. + void increment() { mMaskIter.increment(); } + /// Advance to the next item in the parent node's table. + IteratorBase& operator++() { this->increment(); return *this; } + /// Advance @a n items in the parent node's table. + void increment(Index n) { mMaskIter.increment(n); } + + /// @brief Return @c true if this iterator is pointing to an active value. + /// Return @c false if it is pointing to either an inactive value or a child node. + bool isValueOn() const { return parent().isValueMaskOn(this->pos()); } + /// @brief If this iterator is pointing to a value, set the value's active state. + /// Otherwise, do nothing. + void setValueOn(bool on = true) const { parent().setValueMask(this->pos(), on); } + /// @brief If this iterator is pointing to a value, mark the value as inactive. + /// @details If this iterator is pointing to a child node, then the current item + /// in the parent node's table is required to be inactive. In that case, + /// this method has no effect. + void setValueOff() const { parent().mValueMask.setOff(this->pos()); } + + /// Return the coordinates of the item to which this iterator is pointing. + Coord getCoord() const { return parent().offsetToGlobalCoord(this->pos()); } + /// Return in @a xyz the coordinates of the item to which this iterator is pointing. + void getCoord(Coord& xyz) const { xyz = this->getCoord(); } + +private: + /// @note This parent node pointer is mutable, because setValueOn() and + /// setValueOff(), though const, need to call non-const methods on the parent. + /// There is a distinction between a const iterator (e.g., const ValueOnIter), + /// which is an iterator that can't be incremented, and an iterator over + /// a const node (e.g., ValueOnCIter), which might be const or non-const itself + /// but can't call non-const methods like setValue() on the node. + mutable NodeT* mParentNode; + MaskIterT mMaskIter; +}; // class IteratorBase + + +//////////////////////////////////////// + + +/// @brief Base class for sparse iterators over internal and leaf nodes +template< + typename MaskIterT, // mask iterator type (OnIterator, OffIterator, etc.) + typename IterT, // SparseIteratorBase subclass (the "Curiously Recurring Template Pattern") + typename NodeT, // type of node over which to iterate + typename ItemT> // type of value to which this iterator points +struct SparseIteratorBase: public IteratorBase +{ + typedef NodeT NodeType; + typedef ItemT ValueType; + typedef typename boost::remove_const::type NonConstNodeType; + typedef typename boost::remove_const::type NonConstValueType; + static const bool IsSparseIterator = true, IsDenseIterator = false; + + SparseIteratorBase() {} + SparseIteratorBase(const MaskIterT& iter, NodeT* parent): + IteratorBase(iter, parent) {} + + /// @brief Return the item at the given index in the parent node's table. + /// @note All subclasses must implement this accessor. + ItemT& getItem(Index) const; + /// @brief Set the value of the item at the given index in the parent node's table. + /// @note All non-const iterator subclasses must implement this accessor. + void setItem(Index, const ItemT&) const; + + /// Return a reference to the item to which this iterator is pointing. + ItemT& operator*() const { return this->getValue(); } + /// Return a pointer to the item to which this iterator is pointing. + ItemT* operator->() const { return &(this->operator*()); } + + /// Return the item to which this iterator is pointing. + ItemT& getValue() const + { + return static_cast(this)->getItem(this->pos()); // static polymorphism + } + /// @brief Set the value of the item to which this iterator is pointing. + /// (Not valid for const iterators.) + void setValue(const ItemT& value) const + { + BOOST_STATIC_ASSERT(!boost::is_const::value); + static_cast(this)->setItem(this->pos(), value); // static polymorphism + } + /// @brief Apply a functor to the item to which this iterator is pointing. + /// (Not valid for const iterators.) + /// @param op a functor of the form void op(ValueType&) const that modifies + /// its argument in place + /// @see Tree::modifyValue() + template + void modifyValue(const ModifyOp& op) const + { + BOOST_STATIC_ASSERT(!boost::is_const::value); + static_cast(this)->modifyItem(this->pos(), op); // static polymorphism + } +}; // class SparseIteratorBase + + +//////////////////////////////////////// + + +/// @brief Base class for dense iterators over internal and leaf nodes +/// @note Dense iterators have no @c %operator*() or @c %operator->(), +/// because their return type would have to vary depending on whether +/// the iterator is pointing to a value or a child node. +template< + typename MaskIterT, // mask iterator type (typically a DenseIterator) + typename IterT, // DenseIteratorBase subclass (the "Curiously Recurring Template Pattern") + typename NodeT, // type of node over which to iterate + typename SetItemT, // type of set value (ChildNodeType, for non-leaf nodes) + typename UnsetItemT> // type of unset value (ValueType, usually) +struct DenseIteratorBase: public IteratorBase +{ + typedef NodeT NodeType; + typedef UnsetItemT ValueType; + typedef SetItemT ChildNodeType; + typedef typename boost::remove_const::type NonConstNodeType; + typedef typename boost::remove_const::type NonConstValueType; + typedef typename boost::remove_const::type NonConstChildNodeType; + static const bool IsSparseIterator = false, IsDenseIterator = true; + + DenseIteratorBase() {} + DenseIteratorBase(const MaskIterT& iter, NodeT* parent): + IteratorBase(iter, parent) {} + + /// @brief Return @c true if the item at the given index in the parent node's table + /// is a set value and return either the set value in @a child or the unset value + /// in @a value. + /// @note All subclasses must implement this accessor. + bool getItem(Index, SetItemT*& child, NonConstValueType& value) const; + /// @brief Set the value of the item at the given index in the parent node's table. + /// @note All non-const iterator subclasses must implement this accessor. + void setItem(Index, SetItemT*) const; + /// @brief "Unset" the value of the item at the given index in the parent node's table. + /// @note All non-const iterator subclasses must implement this accessor. + void unsetItem(Index, const UnsetItemT&) const; + + /// Return @c true if this iterator is pointing to a child node. + bool isChildNode() const { return this->parent().isChildMaskOn(this->pos()); } + + /// @brief If this iterator is pointing to a child node, return a pointer to the node. + /// Otherwise, return NULL and, in @a value, the value to which this iterator is pointing. + SetItemT* probeChild(NonConstValueType& value) const + { + SetItemT* child = NULL; + static_cast(this)->getItem(this->pos(), child, value); // static polymorphism + return child; + } + /// @brief If this iterator is pointing to a child node, return @c true and return + /// a pointer to the child node in @a child. Otherwise, return @c false and return + /// the value to which this iterator is pointing in @a value. + bool probeChild(SetItemT*& child, NonConstValueType& value) const + { + child = probeChild(value); + return (child != NULL); + } + + /// @brief Return @c true if this iterator is pointing to a value and return + /// the value in @a value. Otherwise, return @c false. + bool probeValue(NonConstValueType& value) const + { + SetItemT* child = NULL; + const bool isChild = static_cast(this)-> // static polymorphism + getItem(this->pos(), child, value); + return !isChild; + } + + /// @brief Replace with the given child node the item in the parent node's table + /// to which this iterator is pointing. + void setChild(SetItemT* child) const + { + static_cast(this)->setItem(this->pos(), child); // static polymorphism + } + + /// @brief Replace with the given value the item in the parent node's table + /// to which this iterator is pointing. + void setValue(const UnsetItemT& value) const + { + static_cast(this)->unsetItem(this->pos(), value); // static polymorphism + } +}; // struct DenseIteratorBase + +} // namespace tree +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TREE_ITERATOR_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tree/LeafManager.h b/nuparu/include/openvdb/include/openvdb/tree/LeafManager.h new file mode 100644 index 00000000..c06a0243 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tree/LeafManager.h @@ -0,0 +1,846 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file LeafManager.h +/// +/// @brief A LeafManager manages a linear array of pointers to a given tree's +/// leaf nodes, as well as optional auxiliary buffers (one or more per leaf) +/// that can be swapped with the leaf nodes' voxel data buffers. +/// @details The leaf array is useful for multithreaded computations over +/// leaf voxels in a tree with static topology but varying voxel values. +/// The auxiliary buffers are convenient for temporal integration. +/// Efficient methods are provided for multithreaded swapping and synching +/// (i.e., copying the contents) of these buffers. + +#ifndef OPENVDB_TREE_LEAFMANAGER_HAS_BEEN_INCLUDED +#define OPENVDB_TREE_LEAFMANAGER_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "TreeIterator.h" // for CopyConstness + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tree { + +namespace leafmgr { + +//@{ +/// Useful traits for Tree types +template struct TreeTraits { + static const bool IsConstTree = false; + typedef typename TreeT::LeafIter LeafIterType; +}; +template struct TreeTraits { + static const bool IsConstTree = true; + typedef typename TreeT::LeafCIter LeafIterType; +}; +//@} + +} // namespace leafmgr + + +/// This helper class implements LeafManager methods that need to be +/// specialized for const vs. non-const trees. +template +struct LeafManagerImpl +{ + typedef typename ManagerT::RangeType RangeT; + typedef typename ManagerT::LeafType LeafT; + typedef typename ManagerT::BufferType BufT; + + static inline void doSwapLeafBuffer(const RangeT& r, size_t auxBufferIdx, + LeafT** leafs, BufT* bufs, size_t bufsPerLeaf) + { + for (size_t n = r.begin(), m = r.end(), N = bufsPerLeaf; n != m; ++n) { + leafs[n]->swap(bufs[n * N + auxBufferIdx]); + } + } +}; + + +//////////////////////////////////////// + + +/// @brief This class manages a linear array of pointers to a given tree's +/// leaf nodes, as well as optional auxiliary buffers (one or more per leaf) +/// that can be swapped with the leaf nodes' voxel data buffers. +/// @details The leaf array is useful for multithreaded computations over +/// leaf voxels in a tree with static topology but varying voxel values. +/// The auxiliary buffers are convenient for temporal integration. +/// Efficient methods are provided for multithreaded swapping and sync'ing +/// (i.e., copying the contents) of these buffers. +/// +/// @note Buffer index 0 denotes a leaf node's internal voxel data buffer. +/// Any auxiliary buffers are indexed starting from one. +template +class LeafManager +{ +public: + typedef TreeT TreeType; + typedef typename TreeT::ValueType ValueType; + typedef typename TreeT::RootNodeType RootNodeType; + typedef typename TreeType::LeafNodeType NonConstLeafType; + typedef typename CopyConstness::Type LeafType; + typedef LeafType LeafNodeType; + typedef typename leafmgr::TreeTraits::LeafIterType LeafIterType; + typedef typename LeafType::Buffer NonConstBufferType; + typedef typename CopyConstness::Type BufferType; + typedef tbb::blocked_range RangeType;//leaf index range + static const Index DEPTH = 2;//root + leafs + + static const bool IsConstTree = leafmgr::TreeTraits::IsConstTree; + + class LeafRange + { + public: + class Iterator + { + public: + Iterator(const LeafRange& range, size_t pos): mRange(range), mPos(pos) + { + assert(this->isValid()); + } + Iterator& operator=(const Iterator& other) + { + mRange = other.mRange; mPos = other.mPos; return *this; + } + /// Advance to the next leaf node. + Iterator& operator++() { ++mPos; return *this; } + /// Return a reference to the leaf node to which this iterator is pointing. + LeafType& operator*() const { return mRange.mLeafManager.leaf(mPos); } + /// Return a pointer to the leaf node to which this iterator is pointing. + LeafType* operator->() const { return &(this->operator*()); } + /// @brief Return the nth buffer for the leaf node to which this iterator is pointing, + /// where n = @a bufferIdx and n = 0 corresponds to the leaf node's own buffer. + BufferType& buffer(size_t bufferIdx) + { + return mRange.mLeafManager.getBuffer(mPos, bufferIdx); + } + /// Return the index into the leaf array of the current leaf node. + size_t pos() const { return mPos; } + /// Return @c true if the position of this iterator is in a valid range. + bool isValid() const { return mPos>=mRange.mBegin && mPos<=mRange.mEnd; } + /// Return @c true if this iterator is not yet exhausted. + bool test() const { return mPos < mRange.mEnd; } + /// Return @c true if this iterator is not yet exhausted. + operator bool() const { return this->test(); } + /// Return @c true if this iterator is exhausted. + bool empty() const { return !this->test(); } + bool operator!=(const Iterator& other) const + { + return (mPos != other.mPos) || (&mRange != &other.mRange); + } + bool operator==(const Iterator& other) const { return !(*this != other); } + const LeafRange& leafRange() const { return mRange; } + + private: + const LeafRange& mRange; + size_t mPos; + };// end Iterator + + LeafRange(size_t begin, size_t end, const LeafManager& leafManager, size_t grainSize=1) + : mEnd(end) + , mBegin(begin) + , mGrainSize(grainSize) + , mLeafManager(leafManager) + { + } + + Iterator begin() const {return Iterator(*this, mBegin);} + + Iterator end() const {return Iterator(*this, mEnd);} + + size_t size() const { return mEnd - mBegin; } + + size_t grainsize() const { return mGrainSize; } + + const LeafManager& leafManager() const { return mLeafManager; } + + bool empty() const {return !(mBegin < mEnd);} + + bool is_divisible() const {return mGrainSize < this->size();} + + LeafRange(LeafRange& r, tbb::split) + : mEnd(r.mEnd) + , mBegin(doSplit(r)) + , mGrainSize(r.mGrainSize) + , mLeafManager(r.mLeafManager) + { + } + + private: + size_t mEnd, mBegin, mGrainSize; + const LeafManager& mLeafManager; + + static size_t doSplit(LeafRange& r) + { + assert(r.is_divisible()); + size_t middle = r.mBegin + (r.mEnd - r.mBegin) / 2u; + r.mEnd = middle; + return middle; + } + };// end of LeafRange + + /// @brief Constructor from a tree reference and an auxiliary buffer count + /// (default is no auxiliary buffers) + LeafManager(TreeType& tree, size_t auxBuffersPerLeaf=0, bool serial=false) + : mTree(&tree) + , mLeafCount(0) + , mAuxBufferCount(0) + , mAuxBuffersPerLeaf(auxBuffersPerLeaf) + , mLeafs(NULL) + , mAuxBuffers(NULL) + , mTask(0) + , mIsMaster(true) + { + this->rebuild(serial); + } + + /// @brief Constructor from a tree reference and an existing array + /// of pointers to LeafNodes from said tree. This c-tor is only + /// intended for experts that try to squice out a + LeafManager(TreeType& tree, LeafType** begin, LeafType** end, + size_t auxBuffersPerLeaf=0, bool serial=false) + : mTree(&tree) + , mLeafCount(end-begin) + , mAuxBufferCount(0) + , mAuxBuffersPerLeaf(auxBuffersPerLeaf) + , mLeafs(new LeafType*[mLeafCount]) + , mAuxBuffers(NULL) + , mTask(0) + , mIsMaster(true) + { + size_t n = mLeafCount; + LeafType **target = mLeafs, **source = begin; + while (n--) *target++ = *source++; + if (auxBuffersPerLeaf) this->initAuxBuffers(serial); + } + + /// Shallow copy constructor called by tbb::parallel_for() threads + /// + /// @note This should never get called directly + LeafManager(const LeafManager& other) + : mTree(other.mTree) + , mLeafCount(other.mLeafCount) + , mAuxBufferCount(other.mAuxBufferCount) + , mAuxBuffersPerLeaf(other.mAuxBuffersPerLeaf) + , mLeafs(other.mLeafs) + , mAuxBuffers(other.mAuxBuffers) + , mTask(other.mTask) + , mIsMaster(false) + { + } + + virtual ~LeafManager() + { + if (mIsMaster) { + delete [] mLeafs; + delete [] mAuxBuffers; + } + } + + /// @brief (Re)initialize by resizing (if necessary) and repopulating the leaf array + /// and by deleting existing auxiliary buffers and allocating new ones. + /// @details Call this method if the tree's topology, and therefore the number + /// of leaf nodes, changes. New auxiliary buffers are initialized with copies + /// of corresponding leaf node buffers. + void rebuild(bool serial=false) + { + this->initLeafArray(); + this->initAuxBuffers(serial); + } + //@{ + /// Repopulate the leaf array and delete and reallocate auxiliary buffers. + void rebuild(size_t auxBuffersPerLeaf, bool serial=false) + { + mAuxBuffersPerLeaf = auxBuffersPerLeaf; + this->rebuild(serial); + } + void rebuild(TreeType& tree, bool serial=false) + { + mTree = &tree; + this->rebuild(serial); + } + void rebuild(TreeType& tree, size_t auxBuffersPerLeaf, bool serial=false) + { + mTree = &tree; + mAuxBuffersPerLeaf = auxBuffersPerLeaf; + this->rebuild(serial); + } + //@} + /// @brief Change the number of auxiliary buffers. + /// @details If auxBuffersPerLeaf is 0, all existing auxiliary buffers are deleted. + /// New auxiliary buffers are initialized with copies of corresponding leaf node buffers. + /// This method does not rebuild the leaf array. + void rebuildAuxBuffers(size_t auxBuffersPerLeaf, bool serial=false) + { + mAuxBuffersPerLeaf = auxBuffersPerLeaf; + this->initAuxBuffers(serial); + } + /// @brief Remove the auxiliary buffers, but don't rebuild the leaf array. + void removeAuxBuffers() { this->rebuildAuxBuffers(0); } + + /// @brief Remove the auxiliary buffers and rebuild the leaf array. + void rebuildLeafArray() + { + this->removeAuxBuffers(); + this->initLeafArray(); + } + + /// Return the total number of allocated auxiliary buffers. + size_t auxBufferCount() const { return mAuxBufferCount; } + /// Return the number of auxiliary buffers per leaf node. + size_t auxBuffersPerLeaf() const { return mAuxBuffersPerLeaf; } + + /// Return the number of leaf nodes. + size_t leafCount() const { return mLeafCount; } + + /// Return a const reference to tree associated with this manager. + const TreeType& tree() const { return *mTree; } + + /// Return a reference to the tree associated with this manager. + TreeType& tree() { return *mTree; } + + /// Return a const reference to root node associated with this manager. + const RootNodeType& root() const { return mTree->root(); } + + /// Return a reference to the root node associated with this manager. + RootNodeType& root() { return mTree->root(); } + + /// Return @c true if the tree associated with this manager is immutable. + bool isConstTree() const { return this->IsConstTree; } + + /// @brief Return a pointer to the leaf node at index @a leafIdx in the array. + /// @note For performance reasons no range check is performed (other than an assertion)! + LeafType& leaf(size_t leafIdx) const { assert(leafIdx 0), + /// but it is not safe to modify the leaf buffer (@a bufferIdx = 0). + BufferType& getBuffer(size_t leafIdx, size_t bufferIdx) const + { + assert(leafIdx < mLeafCount); + assert(bufferIdx == 0 || bufferIdx - 1 < mAuxBuffersPerLeaf); + return bufferIdx == 0 ? mLeafs[leafIdx]->buffer() + : mAuxBuffers[leafIdx * mAuxBuffersPerLeaf + bufferIdx - 1]; + } + + /// @brief Return a @c tbb::blocked_range of leaf array indices. + /// + /// @note Consider using leafRange() instead, which provides access methods + /// to leaf nodes and buffers. + RangeType getRange(size_t grainsize = 1) const { return RangeType(0, mLeafCount, grainsize); } + + /// Return a TBB-compatible LeafRange. + LeafRange leafRange(size_t grainsize = 1) const + { + return LeafRange(0, mLeafCount, *this, grainsize); + } + + /// @brief Swap each leaf node's buffer with the nth corresponding auxiliary buffer, + /// where n = @a bufferIdx. + /// @return @c true if the swap was successful + /// @param bufferIdx index of the buffer that will be swapped with + /// the corresponding leaf node buffer + /// @param serial if false, swap buffers in parallel using multiple threads. + /// @note Recall that the indexing of auxiliary buffers is 1-based, since + /// buffer index 0 denotes the leaf node buffer. So buffer index 1 denotes + /// the first auxiliary buffer. + bool swapLeafBuffer(size_t bufferIdx, bool serial = false) + { + if (bufferIdx == 0 || bufferIdx > mAuxBuffersPerLeaf || this->isConstTree()) return false; + mTask = boost::bind(&LeafManager::doSwapLeafBuffer, _1, _2, bufferIdx - 1); + this->cook(serial ? 0 : 512); + return true;//success + } + /// @brief Swap any two buffers for each leaf node. + /// @note Recall that the indexing of auxiliary buffers is 1-based, since + /// buffer index 0 denotes the leaf node buffer. So buffer index 1 denotes + /// the first auxiliary buffer. + bool swapBuffer(size_t bufferIdx1, size_t bufferIdx2, bool serial = false) + { + const size_t b1 = std::min(bufferIdx1, bufferIdx2); + const size_t b2 = std::max(bufferIdx1, bufferIdx2); + if (b1 == b2 || b2 > mAuxBuffersPerLeaf) return false; + if (b1 == 0) { + if (this->isConstTree()) return false; + mTask = boost::bind(&LeafManager::doSwapLeafBuffer, _1, _2, b2-1); + } else { + mTask = boost::bind(&LeafManager::doSwapAuxBuffer, _1, _2, b1-1, b2-1); + } + this->cook(serial ? 0 : 512); + return true;//success + } + + /// @brief Sync up the specified auxiliary buffer with the corresponding leaf node buffer. + /// @return @c true if the sync was successful + /// @param bufferIdx index of the buffer that will contain a + /// copy of the corresponding leaf node buffer + /// @param serial if false, sync buffers in parallel using multiple threads. + /// @note Recall that the indexing of auxiliary buffers is 1-based, since + /// buffer index 0 denotes the leaf node buffer. So buffer index 1 denotes + /// the first auxiliary buffer. + bool syncAuxBuffer(size_t bufferIdx, bool serial = false) + { + if (bufferIdx == 0 || bufferIdx > mAuxBuffersPerLeaf) return false; + mTask = boost::bind(&LeafManager::doSyncAuxBuffer, _1, _2, bufferIdx - 1); + this->cook(serial ? 0 : 64); + return true;//success + } + + /// @brief Sync up all auxiliary buffers with their corresponding leaf node buffers. + /// @return true if the sync was successful + /// @param serial if false, sync buffers in parallel using multiple threads. + bool syncAllBuffers(bool serial = false) + { + switch (mAuxBuffersPerLeaf) { + case 0: return false;//nothing to do + case 1: mTask = boost::bind(&LeafManager::doSyncAllBuffers1, _1, _2); break; + case 2: mTask = boost::bind(&LeafManager::doSyncAllBuffers2, _1, _2); break; + default: mTask = boost::bind(&LeafManager::doSyncAllBuffersN, _1, _2); break; + } + this->cook(serial ? 0 : 64); + return true;//success + } + + /// @brief Threaded method that applies a user-supplied functor + /// to each leaf node in the LeafManager. + /// + /// @details The user-supplied functor needs to define the methods + /// required for tbb::parallel_for. + /// + /// @param op user-supplied functor, see examples for interface details. + /// @param threaded optional toggle to disable threading, on by default. + /// @param grainSize optional parameter to specify the grainsize + /// for threading, one by default. + /// + /// @warning The functor object is deep-copied to create TBB tasks. + /// This allows the function to use non-thread-safe members + /// like a ValueAccessor. + /// + /// @par Example: + /// @code + /// // Functor to offset a tree's voxel values with values from another tree. + /// template + /// struct OffsetOp + /// { + /// typedef tree::ValueAccessor Accessor; + /// + /// OffsetOp(const TreeType& tree): mRhsTreeAcc(tree) {} + /// + /// template + /// void operator()(LeafNodeType &lhsLeaf, size_t) const + /// { + /// const LeafNodeType *rhsLeaf = mRhsTreeAcc.probeConstLeaf(lhsLeaf.origin()); + /// if (rhsLeaf) { + /// typename LeafNodeType::ValueOnIter iter = lhsLeaf.beginValueOn(); + /// for (; iter; ++iter) { + /// iter.setValue(iter.getValue() + rhsLeaf->getValue(iter.pos())); + /// } + /// } + /// } + /// Accessor mRhsTreeAcc; + /// }; + /// + /// // usage: + /// tree::LeafManager leafNodes(lhsTree); + /// leafNodes.foreach(OffsetOp(rhsTree)); + /// + /// // A functor that performs a min operation between different auxiliary buffers. + /// template + /// struct MinOp + /// { + /// typedef typename LeafManagerType::BufferType BufferType; + /// + /// MinOp(LeafManagerType& leafNodes): mLeafs(leafNodes) {} + /// + /// template + /// void operator()(LeafNodeType &leaf, size_t leafIndex) const + /// { + /// // get the first buffer + /// BufferType& buffer = mLeafs.getBuffer(leafIndex, 1); + /// + /// // min ... + /// } + /// LeafManagerType& mLeafs; + /// }; + /// @endcode + template + void foreach(const LeafOp& op, bool threaded = true, size_t grainSize=1) + { + LeafTransformer transform(op); + transform.run(this->leafRange(grainSize), threaded); + } + + /// @brief Threaded method that applies a user-supplied functor + /// to each leaf node in the LeafManager. Unlike foreach + /// (defined above) this method performs a reduction on + /// all the leaf nodes. + /// + /// @details The user-supplied functor needs to define the methods + /// required for tbb::parallel_reduce. + /// + /// @param op user-supplied functor, see examples for interface details. + /// @param threaded optional toggle to disable threading, on by default. + /// @param grainSize optional parameter to specify the grainsize + /// for threading, one by default. + /// + /// @warning The functor object is deep-copied to create TBB tasks. + /// This allows the function to use non-thread-safe members + /// like a ValueAccessor. + /// + /// @par Example: + /// @code + /// // Functor to count the number of negative (active) leaf values + /// struct CountOp + /// { + /// CountOp() : mCounter(0) {} + /// CountOp(const CountOp &other) : mCounter(other.mCounter) {} + /// CountOp(const CountOp &other, tbb::split) : mCounter(0) {} + /// template + /// void operator()(LeafNodeType &leaf, size_t) + /// { + /// typename LeafNodeType::ValueOnIter iter = leaf.beginValueOn(); + /// for (; iter; ++iter) if (*iter < 0.0f) ++mCounter; + /// } + /// void join(const CountOp &other) {mCounter += other.mCounter;} + /// size_t mCounter; + /// }; + /// + /// // usage: + /// tree::LeafManager leafNodes(tree); + /// MinValueOp min; + /// leafNodes.reduce(min); + /// std::cerr << "Number of negative active voxels = " << min.mCounter << std::endl; + /// + /// @endcode + template + void reduce(LeafOp& op, bool threaded = true, size_t grainSize=1) + { + LeafReducer transform(op); + transform.run(this->leafRange(grainSize), threaded); + } + + + /// @brief Insert pointers to nodes of the specified type into the array. + /// @details The type of node pointer is defined by the type + /// ArrayT::value_type. If the node type is a LeafNode the nodes + /// are inserted from this LeafManager, else of the corresponding tree. + template + void getNodes(ArrayT& array) + { + typedef typename ArrayT::value_type T; + BOOST_STATIC_ASSERT(boost::is_pointer::value); + typedef typename boost::mpl::if_::type>, + const LeafType, LeafType>::type LeafT; + + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (boost::is_same::value) { + array.resize(mLeafCount); + for (size_t i=0; i(mLeafs[i]); + } else { + mTree->getNodes(array); + } + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + + /// @brief Insert node pointers of the specified type into the array. + /// @details The type of node pointer is defined by the type + /// ArrayT::value_type. If the node type is a LeafNode the nodes + /// are inserted from this LeafManager, else of the corresponding tree. + template + void getNodes(ArrayT& array) const + { + typedef typename ArrayT::value_type T; + BOOST_STATIC_ASSERT(boost::is_pointer::value); + BOOST_STATIC_ASSERT(boost::is_const::type>::value); + + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (boost::is_same::value) { + array.resize(mLeafCount); + for (size_t i=0; i(mLeafs[i]); + } else { + mTree->getNodes(array); + } + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + + /// @brief Generate a linear array of pre-fix sums of offsets into the + /// active voxels in the leafs. So @a offsets[n]+m is the offset to the + /// mth active voxel in the nth leaf node (useful for + /// user-managed value buffers, e.g. in tools/LevelSetAdvect.h). + /// @return The total number of active values in the leaf nodes + /// @param offsets Array of pre-fix sums of offsets to active voxels + /// @param size On input the size of @a offsets, and on ouput + /// the new size of @a offsets. + /// @param grainSize Optional parameter to specify the grainsize + /// for threading, one by default. + /// @details If @a offsets is NULL or @a size is smaller than the + /// total number of active voxels (the return value) then @a offsets + /// is re-allocated and @a size equals the total number of active voxels. + size_t getPreFixSum(size_t*& offsets, size_t& size, size_t grainSize=1) const + { + if (offsets == NULL || size < mLeafCount) { + delete [] offsets; + offsets = new size_t[mLeafCount]; + size = mLeafCount; + } + size_t prefix = 0; + if ( grainSize > 0 ) { + PreFixSum tmp(this->leafRange( grainSize ), offsets, prefix); + } else {// serial + for (size_t i=0; ionVoxelCount(); + } + } + return prefix; + } + + //////////////////////////////////////////////////////////////////////////////////// + // All methods below are for internal use only and should never be called directly + + /// Used internally by tbb::parallel_for() - never call it directly! + void operator()(const RangeType& r) const + { + if (mTask) mTask(const_cast(this), r); + else OPENVDB_THROW(ValueError, "task is undefined"); + } + + private: + + // This a simple wrapper for a c-style array so it mimics the api + // of a std container, e.g. std::vector or std::deque, and can be + // passed to Tree::getNodes(). + struct MyArray { + typedef LeafType* value_type;//required by Tree::getNodes + value_type* ptr; + MyArray(value_type* array) : ptr(array) {} + void push_back(value_type leaf) { *ptr++ = leaf; }//required by Tree::getNodes + }; + + void initLeafArray() + { + const size_t leafCount = mTree->leafCount(); + if (leafCount != mLeafCount) { + delete [] mLeafs; + mLeafs = (leafCount == 0) ? NULL : new LeafType*[leafCount]; + mLeafCount = leafCount; + } + MyArray a(mLeafs); + mTree->getNodes(a); + } + + void initAuxBuffers(bool serial) + { + const size_t auxBufferCount = mLeafCount * mAuxBuffersPerLeaf; + if (auxBufferCount != mAuxBufferCount) { + delete [] mAuxBuffers; + mAuxBuffers = (auxBufferCount == 0) ? NULL : new NonConstBufferType[auxBufferCount]; + mAuxBufferCount = auxBufferCount; + } + this->syncAllBuffers(serial); + } + + void cook(size_t grainsize) + { + if (grainsize>0) { + tbb::parallel_for(this->getRange(grainsize), *this); + } else { + (*this)(this->getRange()); + } + } + + void doSwapLeafBuffer(const RangeType& r, size_t auxBufferIdx) + { + LeafManagerImpl::doSwapLeafBuffer( + r, auxBufferIdx, mLeafs, mAuxBuffers, mAuxBuffersPerLeaf); + } + + void doSwapAuxBuffer(const RangeType& r, size_t auxBufferIdx1, size_t auxBufferIdx2) + { + for (size_t N = mAuxBuffersPerLeaf, n = N*r.begin(), m = N*r.end(); n != m; n+=N) { + mAuxBuffers[n + auxBufferIdx1].swap(mAuxBuffers[n + auxBufferIdx2]); + } + } + + void doSyncAuxBuffer(const RangeType& r, size_t auxBufferIdx) + { + for (size_t n = r.begin(), m = r.end(), N = mAuxBuffersPerLeaf; n != m; ++n) { + mAuxBuffers[n*N + auxBufferIdx] = mLeafs[n]->buffer(); + } + } + + void doSyncAllBuffers1(const RangeType& r) + { + for (size_t n = r.begin(), m = r.end(); n != m; ++n) { + mAuxBuffers[n] = mLeafs[n]->buffer(); + } + } + + void doSyncAllBuffers2(const RangeType& r) + { + for (size_t n = r.begin(), m = r.end(); n != m; ++n) { + const BufferType& leafBuffer = mLeafs[n]->buffer(); + mAuxBuffers[2*n ] = leafBuffer; + mAuxBuffers[2*n+1] = leafBuffer; + } + } + + void doSyncAllBuffersN(const RangeType& r) + { + for (size_t n = r.begin(), m = r.end(), N = mAuxBuffersPerLeaf; n != m; ++n) { + const BufferType& leafBuffer = mLeafs[n]->buffer(); + for (size_t i=n*N, j=i+N; i!=j; ++i) mAuxBuffers[i] = leafBuffer; + } + } + + /// @brief Private member class that applies a user-defined + /// functor to perform parallel_for on all the leaf nodes. + template + struct LeafTransformer + { + LeafTransformer(const LeafOp &leafOp) : mLeafOp(leafOp) + { + } + void run(const LeafRange &range, bool threaded) const + { + threaded ? tbb::parallel_for(range, *this) : (*this)(range); + } + void operator()(const LeafRange &range) const + { + for (typename LeafRange::Iterator it = range.begin(); it; ++it) mLeafOp(*it, it.pos()); + } + const LeafOp mLeafOp; + };// LeafTransformer + + /// @brief Private member class that applies a user-defined + /// functor to perform parallel_reduce on all the leaf nodes. + template + struct LeafReducer + { + LeafReducer(LeafOp &leafOp) : mLeafOp(&leafOp), mOwnsOp(false) + { + } + LeafReducer(const LeafReducer &other, tbb::split) + : mLeafOp(new LeafOp(*(other.mLeafOp), tbb::split())), mOwnsOp(true) + { + } + ~LeafReducer() { if (mOwnsOp) delete mLeafOp; } + void run(const LeafRange& range, bool threaded) + { + threaded ? tbb::parallel_reduce(range, *this) : (*this)(range); + } + void operator()(const LeafRange& range) + { + LeafOp &op = *mLeafOp;//local registry + for (typename LeafRange::Iterator it = range.begin(); it; ++it) op(*it, it.pos()); + } + void join(const LeafReducer& other) { mLeafOp->join(*(other.mLeafOp)); } + LeafOp *mLeafOp; + const bool mOwnsOp; + };// LeafReducer + + // Helper class to compute a pre-fix sum of offsets to active voxels + struct PreFixSum + { + PreFixSum(const LeafRange& r, size_t* offsets, size_t& prefix) + : mOffsets(offsets) + { + tbb::parallel_for( r, *this); + for (size_t i=0, leafCount = r.size(); ionVoxelCount(); + } + } + size_t* mOffsets; + };// PreFixSum + + typedef typename boost::function FuncType; + + TreeType* mTree; + size_t mLeafCount, mAuxBufferCount, mAuxBuffersPerLeaf; + LeafType** mLeafs;//array of LeafNode pointers + NonConstBufferType* mAuxBuffers;//array of auxiliary buffers + FuncType mTask; + const bool mIsMaster; +};//end of LeafManager class + + +// Partial specializations of LeafManager methods for const trees +template +struct LeafManagerImpl > +{ + typedef LeafManager ManagerT; + typedef typename ManagerT::RangeType RangeT; + typedef typename ManagerT::LeafType LeafT; + typedef typename ManagerT::BufferType BufT; + + static inline void doSwapLeafBuffer(const RangeT&, size_t /*auxBufferIdx*/, + LeafT**, BufT*, size_t /*bufsPerLeaf*/) + { + // Buffers can't be swapped into const trees. + } +}; + +} // namespace tree +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TREE_LEAFMANAGER_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tree/LeafNode.h b/nuparu/include/openvdb/include/openvdb/tree/LeafNode.h new file mode 100644 index 00000000..33d0f80b --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tree/LeafNode.h @@ -0,0 +1,2219 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_TREE_LEAFNODE_HAS_BEEN_INCLUDED +#define OPENVDB_TREE_LEAFNODE_HAS_BEEN_INCLUDED + +#include +#include // for std::swap +#include // for std::memcpy() +#include +#include +#include +#include +#include +#include +#include +#include +#include // for io::readData(), etc. +#include "Iterator.h" + + +class TestLeaf; +template class TestLeafIO; + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tree { + +template struct SameLeafConfig; // forward declaration + + +/// @brief Templated block class to hold specific data types and a fixed +/// number of values determined by Log2Dim. The actual coordinate +/// dimension of the block is 2^Log2Dim, i.e. Log2Dim=3 corresponds to +/// a LeafNode that spans a 8^3 block. +template +class LeafNode +{ +public: + typedef T BuildType; + typedef T ValueType; + typedef LeafNode LeafNodeType; + typedef boost::shared_ptr Ptr; + typedef util::NodeMask NodeMaskType; + + static const Index + LOG2DIM = Log2Dim, // needed by parent nodes + TOTAL = Log2Dim, // needed by parent nodes + DIM = 1 << TOTAL, // dimension along one coordinate direction + NUM_VALUES = 1 << 3 * Log2Dim, + NUM_VOXELS = NUM_VALUES, // total number of voxels represented by this node + SIZE = NUM_VALUES, + LEVEL = 0; // level 0 = leaf + + /// @brief ValueConverter::Type is the type of a LeafNode having the same + /// dimensions as this node but a different value type, T. + template + struct ValueConverter { + typedef LeafNode Type; + }; + + /// @brief SameConfiguration::value is @c true if and only if + /// OtherNodeType is the type of a LeafNode with the same dimensions as this node. + template + struct SameConfiguration { + static const bool value = SameLeafConfig::value; + }; + +#ifndef OPENVDB_2_ABI_COMPATIBLE + struct FileInfo + { + FileInfo(): bufpos(0) , maskpos(0) {} + std::streamoff bufpos; + std::streamoff maskpos; + io::MappedFile::Ptr mapping; + boost::shared_ptr meta; + }; +#endif + + /// @brief Array of fixed size @f$2^{3 \times {\rm Log2Dim}}@f$ that stores + /// the voxel values of a LeafNode + class Buffer + { + public: +#ifdef OPENVDB_2_ABI_COMPATIBLE + /// Default constructor + Buffer(): mData(new ValueType[SIZE]) {} + /// Construct a buffer populated with the specified value. + explicit Buffer(const ValueType& val): mData(new ValueType[SIZE]) { this->fill(val); } + /// Copy constructor + Buffer(const Buffer& other): mData(new ValueType[SIZE]) { *this = other; } + /// Destructor + ~Buffer() { delete[] mData; } + + /// Return @c true if this buffer's values have not yet been read from disk. + bool isOutOfCore() const { return false; } + /// Return @c true if memory for this buffer has not yet been allocated. + bool empty() const { return (mData == NULL); } +#else + typedef ValueType WordType; + static const Index WORD_COUNT = SIZE; + /// Default constructor + Buffer(): mData(new ValueType[SIZE]), mOutOfCore(0) {} + /// Construct a buffer populated with the specified value. + explicit Buffer(const ValueType& val): mData(new ValueType[SIZE]), mOutOfCore(0) + { + this->fill(val); + } + /// Copy constructor + Buffer(const Buffer& other): mData(NULL), mOutOfCore(other.mOutOfCore) + { + if (other.isOutOfCore()) { + mFileInfo = new FileInfo(*other.mFileInfo); + } else { + this->allocate(); + ValueType* target = mData; + const ValueType* source = other.mData; + Index n = SIZE; + while (n--) *target++ = *source++; + } + } + /// Construct a buffer but don't allocate memory for the full array of values. + Buffer(PartialCreate, const ValueType&): mData(NULL), mOutOfCore(0) {} + /// Destructor + ~Buffer() + { + if (this->isOutOfCore()) { + this->detachFromFile(); + } else { + this->deallocate(); + } + } + + /// Return @c true if this buffer's values have not yet been read from disk. + bool isOutOfCore() const { return bool(mOutOfCore); } + /// Return @c true if memory for this buffer has not yet been allocated. + bool empty() const { return !mData || this->isOutOfCore(); } +#endif + /// Allocate memory for this buffer if it has not already been allocated. + bool allocate() { if (mData == NULL) mData = new ValueType[SIZE]; return !this->empty(); } + + /// Populate this buffer with a constant value. + void fill(const ValueType& val) + { + this->detachFromFile(); + if (mData != NULL) { + ValueType* target = mData; + Index n = SIZE; + while (n--) *target++ = val; + } + } + + /// Return a const reference to the i'th element of this buffer. + const ValueType& getValue(Index i) const { return this->at(i); } + /// Return a const reference to the i'th element of this buffer. + const ValueType& operator[](Index i) const { return this->at(i); } + /// Set the i'th value of this buffer to the specified value. + void setValue(Index i, const ValueType& val) + { + assert(i < SIZE); +#ifdef OPENVDB_2_ABI_COMPATIBLE + mData[i] = val; +#else + this->loadValues(); + if (mData) mData[i] = val; +#endif + } + + /// Copy the other buffer's values into this buffer. + Buffer& operator=(const Buffer& other) + { + if (&other != this) { +#ifndef OPENVDB_2_ABI_COMPATIBLE + if (this->isOutOfCore()) { + this->detachFromFile(); + } else { + if (other.isOutOfCore()) this->deallocate(); + } + if (other.isOutOfCore()) { + mOutOfCore = other.mOutOfCore; + mFileInfo = new FileInfo(*other.mFileInfo); + } else { +#endif + this->allocate(); + ValueType* target = mData; + const ValueType* source = other.mData; + Index n = SIZE; + while (n--) *target++ = *source++; +#ifndef OPENVDB_2_ABI_COMPATIBLE + } +#endif + } + return *this; + } + + /// @brief Return @c true if the contents of the other buffer + /// exactly equal the contents of this buffer. + bool operator==(const Buffer& other) const + { + this->loadValues(); + other.loadValues(); + const ValueType *target = mData, *source = other.mData; + if (!target && !source) return true; + if (!target || !source) return false; + Index n = SIZE; + while (n && math::isExactlyEqual(*target++, *source++)) --n; + return n == 0; + } + /// @brief Return @c true if the contents of the other buffer + /// are not exactly equal to the contents of this buffer. + bool operator!=(const Buffer& other) const { return !(other == *this); } + + /// Exchange this buffer's values with the other buffer's values. + void swap(Buffer& other) + { + std::swap(mData, other.mData); +#ifndef OPENVDB_2_ABI_COMPATIBLE + std::swap(mOutOfCore, other.mOutOfCore); +#endif + } + + /// Return the memory footprint of this buffer in bytes. + Index memUsage() const + { + size_t n = sizeof(*this); +#ifdef OPENVDB_2_ABI_COMPATIBLE + if (mData) n += SIZE * sizeof(ValueType); +#else + if (this->isOutOfCore()) n += sizeof(FileInfo); + else if (mData) n += SIZE * sizeof(ValueType); +#endif + return static_cast(n); + } + /// Return the number of values contained in this buffer. + static Index size() { return SIZE; } + + /// @brief Return a const pointer to the array of voxel values. + /// @details This method guarantees that the buffer is allocated and loaded. + /// @warning This method should only be used by experts seeking low-level optimizations. + const ValueType* data() const + { +#ifndef OPENVDB_2_ABI_COMPATIBLE + this->loadValues(); + if (mData == NULL) { + Buffer* self = const_cast(this); + // This lock will be contended at most once. + tbb::spin_mutex::scoped_lock lock(self->mMutex); + if (mData == NULL) self->mData = new ValueType[SIZE]; + } +#endif + return mData; + } + + /// @brief Return a pointer to the array of voxel values. + /// @details This method guarantees that the buffer is allocated and loaded. + /// @warning This method should only be used by experts seeking low-level optimizations. + ValueType* data() + { +#ifndef OPENVDB_2_ABI_COMPATIBLE + this->loadValues(); + if (mData == NULL) { + // This lock will be contended at most once. + tbb::spin_mutex::scoped_lock lock(mMutex); + if (mData == NULL) mData = new ValueType[SIZE]; + } +#endif + return mData; + } + + private: + /// If this buffer is empty, return zero, otherwise return the value at index @ i. + const ValueType& at(Index i) const + { + assert(i < SIZE); +#ifdef OPENVDB_2_ABI_COMPATIBLE + return mData[i]; +#else + this->loadValues(); + // We can't use the ternary operator here, otherwise Visual C++ returns + // a reference to a temporary. + if (mData) return mData[i]; else return sZero; +#endif + } + + /// @brief Return a non-const reference to the value at index @a i. + /// @details This method is private since it makes assumptions about the + /// buffer's memory layout. Buffers associated with custom leaf node types + /// (e.g., a bool buffer implemented as a bitmask) might not be able to + /// return non-const references to their values. + ValueType& operator[](Index i) { return const_cast(this->at(i)); } + + bool deallocate() + { + if (mData != NULL && !this->isOutOfCore()) { + delete[] mData; + mData = NULL; + return true; + } + return false; + } + +#ifdef OPENVDB_2_ABI_COMPATIBLE + void setOutOfCore(bool) {} + void loadValues() const {} + void doLoad() const {} + bool detachFromFile() { return false; } +#else + inline void setOutOfCore(bool b) { mOutOfCore = b; } + // To facilitate inlining in the common case in which the buffer is in-core, + // the loading logic is split into a separate function, doLoad(). + inline void loadValues() const { if (this->isOutOfCore()) this->doLoad(); } + inline void doLoad() const; + inline bool detachFromFile() + { + if (this->isOutOfCore()) { + delete mFileInfo; + mFileInfo = NULL; + this->setOutOfCore(false); + return true; + } + return false; + } +#endif + + friend class ::TestLeaf; + // Allow the parent LeafNode to access this buffer's data pointer. + friend class LeafNode; + +#ifdef OPENVDB_2_ABI_COMPATIBLE + ValueType* mData; +#else + union { + ValueType* mData; + FileInfo* mFileInfo; + }; + Index32 mOutOfCore; // currently interpreted as bool; extra bits reserved for future use + tbb::spin_mutex mMutex; // 1 byte + //int8_t mReserved[3]; // padding for alignment + + static const ValueType sZero; +#endif + }; // class Buffer + + + /// Default constructor + LeafNode(); + + /// @brief Constructor + /// @param coords the grid index coordinates of a voxel + /// @param value a value with which to fill the buffer + /// @param active the active state to which to initialize all voxels + explicit LeafNode(const Coord& coords, + const ValueType& value = zeroVal(), + bool active = false); + + +#ifndef OPENVDB_2_ABI_COMPATIBLE + /// @brief "Partial creation" constructor used during file input + /// @param coords the grid index coordinates of a voxel + /// @param value a value with which to fill the buffer + /// @param active the active state to which to initialize all voxels + /// @details This constructor does not allocate memory for voxel values. + LeafNode(PartialCreate, + const Coord& coords, + const ValueType& value = zeroVal(), + bool active = false); +#endif + + /// Deep copy constructor + LeafNode(const LeafNode&); + + /// Value conversion copy constructor + template + explicit LeafNode(const LeafNode& other); + + /// Topology copy constructor + template + LeafNode(const LeafNode& other, + const ValueType& offValue, const ValueType& onValue, TopologyCopy); + + /// Topology copy constructor + template + LeafNode(const LeafNode& other, + const ValueType& background, TopologyCopy); + + /// Destructor. + ~LeafNode(); + + // + // Statistics + // + /// Return log2 of the dimension of this LeafNode, e.g. 3 if dimensions are 8^3 + static Index log2dim() { return Log2Dim; } + /// Return the number of voxels in each coordinate dimension. + static Index dim() { return DIM; } + /// Return the total number of voxels represented by this LeafNode + static Index size() { return SIZE; } + /// Return the total number of voxels represented by this LeafNode + static Index numValues() { return SIZE; } + /// Return the level of this node, which by definition is zero for LeafNodes + static Index getLevel() { return LEVEL; } + /// Append the Log2Dim of this LeafNode to the specified vector + static void getNodeLog2Dims(std::vector& dims) { dims.push_back(Log2Dim); } + /// Return the dimension of child nodes of this LeafNode, which is one for voxels. + static Index getChildDim() { return 1; } + /// Return the leaf count for this node, which is one. + static Index32 leafCount() { return 1; } + /// Return the non-leaf count for this node, which is zero. + static Index32 nonLeafCount() { return 0; } + + /// Return the number of voxels marked On. + Index64 onVoxelCount() const { return mValueMask.countOn(); } + /// Return the number of voxels marked Off. + Index64 offVoxelCount() const { return mValueMask.countOff(); } + Index64 onLeafVoxelCount() const { return onVoxelCount(); } + Index64 offLeafVoxelCount() const { return offVoxelCount(); } + static Index64 onTileCount() { return 0; } + static Index64 offTileCount() { return 0; } + /// Return @c true if this node has no active voxels. + bool isEmpty() const { return mValueMask.isOff(); } + /// Return @c true if this node contains only active voxels. + bool isDense() const { return mValueMask.isOn(); } + +#ifndef OPENVDB_2_ABI_COMPATIBLE + /// Return @c true if memory for this node's buffer has been allocated. + bool isAllocated() const { return !mBuffer.isOutOfCore() && !mBuffer.empty(); } + /// Allocate memory for this node's buffer if it has not already been allocated. + bool allocate() { return mBuffer.allocate(); } +#endif + + /// Return the memory in bytes occupied by this node. + Index64 memUsage() const; + + /// Expand the given bounding box so that it includes this leaf node's active voxels. + /// If visitVoxels is false this LeafNode will be approximated as dense, i.e. with all + /// voxels active. Else the individual active voxels are visited to produce a tight bbox. + void evalActiveBoundingBox(CoordBBox& bbox, bool visitVoxels = true) const; + + /// @brief Return the bounding box of this node, i.e., the full index space + /// spanned by this leaf node. + CoordBBox getNodeBoundingBox() const { return CoordBBox::createCube(mOrigin, DIM); } + + /// Set the grid index coordinates of this node's local origin. + void setOrigin(const Coord& origin) { mOrigin = origin; } + //@{ + /// Return the grid index coordinates of this node's local origin. + const Coord& origin() const { return mOrigin; } + void getOrigin(Coord& origin) const { origin = mOrigin; } + void getOrigin(Int32& x, Int32& y, Int32& z) const { mOrigin.asXYZ(x, y, z); } + //@} + + /// Return the linear table offset of the given global or local coordinates. + static Index coordToOffset(const Coord& xyz); + /// @brief Return the local coordinates for a linear table offset, + /// where offset 0 has coordinates (0, 0, 0). + static Coord offsetToLocalCoord(Index n); + /// Return the global coordinates for a linear table offset. + Coord offsetToGlobalCoord(Index n) const; + + /// Return a string representation of this node. + std::string str() const; + + /// @brief Return @c true if the given node (which may have a different @c ValueType + /// than this node) has the same active value topology as this node. + template + bool hasSameTopology(const LeafNode* other) const; + + /// Check for buffer, state and origin equivalence. + bool operator==(const LeafNode& other) const; + bool operator!=(const LeafNode& other) const { return !(other == *this); } + +protected: + typedef typename NodeMaskType::OnIterator MaskOnIterator; + typedef typename NodeMaskType::OffIterator MaskOffIterator; + typedef typename NodeMaskType::DenseIterator MaskDenseIterator; + + // Type tags to disambiguate template instantiations + struct ValueOn {}; struct ValueOff {}; struct ValueAll {}; + struct ChildOn {}; struct ChildOff {}; struct ChildAll {}; + + template + struct ValueIter: + // Derives from SparseIteratorBase, but can also be used as a dense iterator, + // if MaskIterT is a dense mask iterator type. + public SparseIteratorBase< + MaskIterT, ValueIter, NodeT, ValueT> + { + typedef SparseIteratorBase BaseT; + + ValueIter() {} + ValueIter(const MaskIterT& iter, NodeT* parent): BaseT(iter, parent) {} + + ValueT& getItem(Index pos) const { return this->parent().getValue(pos); } + ValueT& getValue() const { return this->parent().getValue(this->pos()); } + + // Note: setItem() can't be called on const iterators. + void setItem(Index pos, const ValueT& value) const + { + this->parent().setValueOnly(pos, value); + } + // Note: setValue() can't be called on const iterators. + void setValue(const ValueT& value) const + { + this->parent().setValueOnly(this->pos(), value); + } + + // Note: modifyItem() can't be called on const iterators. + template + void modifyItem(Index n, const ModifyOp& op) const { this->parent().modifyValue(n, op); } + // Note: modifyValue() can't be called on const iterators. + template + void modifyValue(const ModifyOp& op) const { this->parent().modifyValue(this->pos(), op); } + }; + + /// Leaf nodes have no children, so their child iterators have no get/set accessors. + template + struct ChildIter: + public SparseIteratorBase, NodeT, ValueType> + { + ChildIter() {} + ChildIter(const MaskIterT& iter, NodeT* parent): SparseIteratorBase< + MaskIterT, ChildIter, NodeT, ValueType>(iter, parent) {} + }; + + template + struct DenseIter: public DenseIteratorBase< + MaskDenseIterator, DenseIter, NodeT, /*ChildT=*/void, ValueT> + { + typedef DenseIteratorBase BaseT; + typedef typename BaseT::NonConstValueType NonConstValueT; + + DenseIter() {} + DenseIter(const MaskDenseIterator& iter, NodeT* parent): BaseT(iter, parent) {} + + bool getItem(Index pos, void*& child, NonConstValueT& value) const + { + value = this->parent().getValue(pos); + child = NULL; + return false; // no child + } + + // Note: setItem() can't be called on const iterators. + //void setItem(Index pos, void* child) const {} + + // Note: unsetItem() can't be called on const iterators. + void unsetItem(Index pos, const ValueT& value) const + { + this->parent().setValueOnly(pos, value); + } + }; + +public: + typedef ValueIter ValueOnIter; + typedef ValueIter ValueOnCIter; + typedef ValueIter ValueOffIter; + typedef ValueIter ValueOffCIter; + typedef ValueIter ValueAllIter; + typedef ValueIter ValueAllCIter; + typedef ChildIter ChildOnIter; + typedef ChildIter ChildOnCIter; + typedef ChildIter ChildOffIter; + typedef ChildIter ChildOffCIter; + typedef DenseIter ChildAllIter; + typedef DenseIter ChildAllCIter; + + ValueOnCIter cbeginValueOn() const { return ValueOnCIter(mValueMask.beginOn(), this); } + ValueOnCIter beginValueOn() const { return ValueOnCIter(mValueMask.beginOn(), this); } + ValueOnIter beginValueOn() { return ValueOnIter(mValueMask.beginOn(), this); } + ValueOffCIter cbeginValueOff() const { return ValueOffCIter(mValueMask.beginOff(), this); } + ValueOffCIter beginValueOff() const { return ValueOffCIter(mValueMask.beginOff(), this); } + ValueOffIter beginValueOff() { return ValueOffIter(mValueMask.beginOff(), this); } + ValueAllCIter cbeginValueAll() const { return ValueAllCIter(mValueMask.beginDense(), this); } + ValueAllCIter beginValueAll() const { return ValueAllCIter(mValueMask.beginDense(), this); } + ValueAllIter beginValueAll() { return ValueAllIter(mValueMask.beginDense(), this); } + + ValueOnCIter cendValueOn() const { return ValueOnCIter(mValueMask.endOn(), this); } + ValueOnCIter endValueOn() const { return ValueOnCIter(mValueMask.endOn(), this); } + ValueOnIter endValueOn() { return ValueOnIter(mValueMask.endOn(), this); } + ValueOffCIter cendValueOff() const { return ValueOffCIter(mValueMask.endOff(), this); } + ValueOffCIter endValueOff() const { return ValueOffCIter(mValueMask.endOff(), this); } + ValueOffIter endValueOff() { return ValueOffIter(mValueMask.endOff(), this); } + ValueAllCIter cendValueAll() const { return ValueAllCIter(mValueMask.endDense(), this); } + ValueAllCIter endValueAll() const { return ValueAllCIter(mValueMask.endDense(), this); } + ValueAllIter endValueAll() { return ValueAllIter(mValueMask.endDense(), this); } + + // Note that [c]beginChildOn() and [c]beginChildOff() actually return end iterators, + // because leaf nodes have no children. + ChildOnCIter cbeginChildOn() const { return ChildOnCIter(mValueMask.endOn(), this); } + ChildOnCIter beginChildOn() const { return ChildOnCIter(mValueMask.endOn(), this); } + ChildOnIter beginChildOn() { return ChildOnIter(mValueMask.endOn(), this); } + ChildOffCIter cbeginChildOff() const { return ChildOffCIter(mValueMask.endOff(), this); } + ChildOffCIter beginChildOff() const { return ChildOffCIter(mValueMask.endOff(), this); } + ChildOffIter beginChildOff() { return ChildOffIter(mValueMask.endOff(), this); } + ChildAllCIter cbeginChildAll() const { return ChildAllCIter(mValueMask.beginDense(), this); } + ChildAllCIter beginChildAll() const { return ChildAllCIter(mValueMask.beginDense(), this); } + ChildAllIter beginChildAll() { return ChildAllIter(mValueMask.beginDense(), this); } + + ChildOnCIter cendChildOn() const { return ChildOnCIter(mValueMask.endOn(), this); } + ChildOnCIter endChildOn() const { return ChildOnCIter(mValueMask.endOn(), this); } + ChildOnIter endChildOn() { return ChildOnIter(mValueMask.endOn(), this); } + ChildOffCIter cendChildOff() const { return ChildOffCIter(mValueMask.endOff(), this); } + ChildOffCIter endChildOff() const { return ChildOffCIter(mValueMask.endOff(), this); } + ChildOffIter endChildOff() { return ChildOffIter(mValueMask.endOff(), this); } + ChildAllCIter cendChildAll() const { return ChildAllCIter(mValueMask.endDense(), this); } + ChildAllCIter endChildAll() const { return ChildAllCIter(mValueMask.endDense(), this); } + ChildAllIter endChildAll() { return ChildAllIter(mValueMask.endDense(), this); } + + // + // Buffer management + // + /// @brief Exchange this node's data buffer with the given data buffer + /// without changing the active states of the values. + void swap(Buffer& other) { mBuffer.swap(other); } + const Buffer& buffer() const { return mBuffer; } + Buffer& buffer() { return mBuffer; } + + // + // I/O methods + // + /// @brief Read in just the topology. + /// @param is the stream from which to read + /// @param fromHalf if true, floating-point input values are assumed to be 16-bit + void readTopology(std::istream& is, bool fromHalf = false); + /// @brief Write out just the topology. + /// @param os the stream to which to write + /// @param toHalf if true, output floating-point values as 16-bit half floats + void writeTopology(std::ostream& os, bool toHalf = false) const; + + /// @brief Read buffers from a stream. + /// @param is the stream from which to read + /// @param fromHalf if true, floating-point input values are assumed to be 16-bit + void readBuffers(std::istream& is, bool fromHalf = false); + /// @brief Read buffers that intersect the given bounding box. + /// @param is the stream from which to read + /// @param bbox an index-space bounding box + /// @param fromHalf if true, floating-point input values are assumed to be 16-bit + void readBuffers(std::istream& is, const CoordBBox& bbox, bool fromHalf = false); + /// @brief Write buffers to a stream. + /// @param os the stream to which to write + /// @param toHalf if true, output floating-point values as 16-bit half floats + void writeBuffers(std::ostream& os, bool toHalf = false) const; + + size_t streamingSize(bool toHalf = false) const; + + // + // Accessor methods + // + /// Return the value of the voxel at the given coordinates. + const ValueType& getValue(const Coord& xyz) const; + /// Return the value of the voxel at the given linear offset. + const ValueType& getValue(Index offset) const; + + /// @brief Return @c true if the voxel at the given coordinates is active. + /// @param xyz the coordinates of the voxel to be probed + /// @param[out] val the value of the voxel at the given coordinates + bool probeValue(const Coord& xyz, ValueType& val) const; + /// @brief Return @c true if the voxel at the given offset is active. + /// @param offset the linear offset of the voxel to be probed + /// @param[out] val the value of the voxel at the given coordinates + bool probeValue(Index offset, ValueType& val) const; + + /// Return the level (i.e., 0) at which leaf node values reside. + static Index getValueLevel(const Coord&) { return LEVEL; } + + /// Set the active state of the voxel at the given coordinates but don't change its value. + void setActiveState(const Coord& xyz, bool on); + /// Set the active state of the voxel at the given offset but don't change its value. + void setActiveState(Index offset, bool on) { assert(offsetsetValueOn(LeafNode::coordToOffset(xyz), val); + } + /// Set the value of the voxel at the given coordinates and mark the voxel as active. + void setValue(const Coord& xyz, const ValueType& val) { this->setValueOn(xyz, val); } + /// Set the value of the voxel at the given offset and mark the voxel as active. + void setValueOn(Index offset, const ValueType& val) { + mBuffer.setValue(offset, val); + mValueMask.setOn(offset); + } + + /// @brief Apply a functor to the value of the voxel at the given offset + /// and mark the voxel as active. + template + void modifyValue(Index offset, const ModifyOp& op) + { + ValueType val = mBuffer[offset]; + op(val); + mBuffer.setValue(offset, val); + mValueMask.setOn(offset); + } + /// @brief Apply a functor to the value of the voxel at the given coordinates + /// and mark the voxel as active. + template + void modifyValue(const Coord& xyz, const ModifyOp& op) + { + this->modifyValue(this->coordToOffset(xyz), op); + } + + /// Apply a functor to the voxel at the given coordinates. + template + void modifyValueAndActiveState(const Coord& xyz, const ModifyOp& op) + { + const Index offset = this->coordToOffset(xyz); + bool state = mValueMask.isOn(offset); + ValueType val = mBuffer[offset]; + op(val, state); + mBuffer.setValue(offset, val); + mValueMask.set(offset, state); + } + + /// Mark all voxels as active but don't change their values. + void setValuesOn() { mValueMask.setOn(); } + /// Mark all voxels as inactive but don't change their values. + void setValuesOff() { mValueMask.setOff(); } + + /// Return @c true if the voxel at the given coordinates is active. + bool isValueOn(const Coord& xyz) const {return this->isValueOn(LeafNode::coordToOffset(xyz));} + /// Return @c true if the voxel at the given offset is active. + bool isValueOn(Index offset) const { return mValueMask.isOn(offset); } + + /// Return @c false since leaf nodes never contain tiles. + static bool hasActiveTiles() { return false; } + + /// Set all voxels that lie outside the given axis-aligned box to the background. + void clip(const CoordBBox&, const ValueType& background); + + /// Set all voxels within an axis-aligned box to the specified value and active state. + void fill(const CoordBBox& bbox, const ValueType&, bool active = true); + + /// Set all voxels to the specified value but don't change their active states. + void fill(const ValueType& value); + /// Set all voxels to the specified value and active state. + void fill(const ValueType& value, bool active); + + /// @brief Copy into a dense grid the values of the voxels that lie within + /// a given bounding box. + /// + /// @param bbox inclusive bounding box of the voxels to be copied into the dense grid + /// @param dense dense grid with a stride in @e z of one (see tools::Dense + /// in tools/Dense.h for the required API) + /// + /// @note @a bbox is assumed to be identical to or contained in the coordinate domains + /// of both the dense grid and this node, i.e., no bounds checking is performed. + /// @note Consider using tools::CopyToDense in tools/Dense.h + /// instead of calling this method directly. + template + void copyToDense(const CoordBBox& bbox, DenseT& dense) const; + + /// @brief Copy from a dense grid into this node the values of the voxels + /// that lie within a given bounding box. + /// @details Only values that are different (by more than the given tolerance) + /// from the background value will be active. Other values are inactive + /// and truncated to the background value. + /// + /// @param bbox inclusive bounding box of the voxels to be copied into this node + /// @param dense dense grid with a stride in @e z of one (see tools::Dense + /// in tools/Dense.h for the required API) + /// @param background background value of the tree that this node belongs to + /// @param tolerance tolerance within which a value equals the background value + /// + /// @note @a bbox is assumed to be identical to or contained in the coordinate domains + /// of both the dense grid and this node, i.e., no bounds checking is performed. + /// @note Consider using tools::CopyFromDense in tools/Dense.h + /// instead of calling this method directly. + template + void copyFromDense(const CoordBBox& bbox, const DenseT& dense, + const ValueType& background, const ValueType& tolerance); + + /// @brief Return the value of the voxel at the given coordinates. + /// @note Used internally by ValueAccessor. + template + const ValueType& getValueAndCache(const Coord& xyz, AccessorT&) const + { + return this->getValue(xyz); + } + + /// @brief Return @c true if the voxel at the given coordinates is active. + /// @note Used internally by ValueAccessor. + template + bool isValueOnAndCache(const Coord& xyz, AccessorT&) const { return this->isValueOn(xyz); } + + /// @brief Change the value of the voxel at the given coordinates and mark it as active. + /// @note Used internally by ValueAccessor. + template + void setValueAndCache(const Coord& xyz, const ValueType& val, AccessorT&) + { + this->setValueOn(xyz, val); + } + + /// @brief Change the value of the voxel at the given coordinates + /// but preserve its state. + /// @note Used internally by ValueAccessor. + template + void setValueOnlyAndCache(const Coord& xyz, const ValueType& val, AccessorT&) + { + this->setValueOnly(xyz, val); + } + + /// @brief Apply a functor to the value of the voxel at the given coordinates + /// and mark the voxel as active. + /// @note Used internally by ValueAccessor. + template + void modifyValueAndCache(const Coord& xyz, const ModifyOp& op, AccessorT&) + { + this->modifyValue(xyz, op); + } + + /// Apply a functor to the voxel at the given coordinates. + /// @note Used internally by ValueAccessor. + template + void modifyValueAndActiveStateAndCache(const Coord& xyz, const ModifyOp& op, AccessorT&) + { + this->modifyValueAndActiveState(xyz, op); + } + + /// @brief Change the value of the voxel at the given coordinates and mark it as inactive. + /// @note Used internally by ValueAccessor. + template + void setValueOffAndCache(const Coord& xyz, const ValueType& value, AccessorT&) + { + this->setValueOff(xyz, value); + } + + /// @brief Set the active state of the voxel at the given coordinates + /// without changing its value. + /// @note Used internally by ValueAccessor. + template + void setActiveStateAndCache(const Coord& xyz, bool on, AccessorT&) + { + this->setActiveState(xyz, on); + } + + /// @brief Return @c true if the voxel at the given coordinates is active + /// and return the voxel value in @a val. + /// @note Used internally by ValueAccessor. + template + bool probeValueAndCache(const Coord& xyz, ValueType& val, AccessorT&) const + { + return this->probeValue(xyz, val); + } + + /// @brief Return the value of the voxel at the given coordinates and return + /// its active state and level (i.e., 0) in @a state and @a level. + /// @note Used internally by ValueAccessor. + template + const ValueType& getValue(const Coord& xyz, bool& state, int& level, AccessorT&) const + { + const Index offset = this->coordToOffset(xyz); + state = mValueMask.isOn(offset); + level = LEVEL; + return mBuffer[offset]; + } + + /// @brief Return the LEVEL (=0) at which leaf node values reside. + /// @note Used internally by ValueAccessor (note last argument is a dummy). + template + static Index getValueLevelAndCache(const Coord&, AccessorT&) { return LEVEL; } + + /// @brief Return a const reference to the first value in the buffer. + /// @note Though it is potentially risky you can convert this + /// to a non-const pointer by means of const_case&. + const ValueType& getFirstValue() const { return mBuffer[0]; } + /// Return a const reference to the last value in the buffer. + const ValueType& getLastValue() const { return mBuffer[SIZE - 1]; } + + /// @brief Replace inactive occurrences of @a oldBackground with @a newBackground, + /// and inactive occurrences of @a -oldBackground with @a -newBackground. + void resetBackground(const ValueType& oldBackground, const ValueType& newBackground); + + void negate(); + + /// @brief No-op + /// @details This function exists only to enable template instantiation. + void voxelizeActiveTiles(bool = true) {} + + template void merge(const LeafNode&); + template void merge(const ValueType& tileValue, bool tileActive); + template + void merge(const LeafNode& other, const ValueType& /*bg*/, const ValueType& /*otherBG*/); + + /// @brief Union this node's set of active values with the active values + /// of the other node, whose @c ValueType may be different. So a + /// resulting voxel will be active if either of the original voxels + /// were active. + /// + /// @note This operation modifies only active states, not values. + template + void topologyUnion(const LeafNode& other); + + /// @brief Intersect this node's set of active values with the active values + /// of the other node, whose @c ValueType may be different. So a + /// resulting voxel will be active only if both of the original voxels + /// were active. + /// + /// @details The last dummy argument is required to match the signature + /// for InternalNode::topologyIntersection. + /// + /// @note This operation modifies only active states, not + /// values. Also note that this operation can result in all voxels + /// being inactive so consider subsequnetly calling prune. + template + void topologyIntersection(const LeafNode& other, const ValueType&); + + /// @brief Difference this node's set of active values with the active values + /// of the other node, whose @c ValueType may be different. So a + /// resulting voxel will be active only if the original voxel is + /// active in this LeafNode and inactive in the other LeafNode. + /// + /// @details The last dummy argument is required to match the signature + /// for InternalNode::topologyDifference. + /// + /// @note This operation modifies only active states, not values. + /// Also, because it can deactivate all of this node's voxels, + /// consider subsequently calling prune. + template + void topologyDifference(const LeafNode& other, const ValueType&); + + template + void combine(const LeafNode& other, CombineOp& op); + template + void combine(const ValueType& value, bool valueIsActive, CombineOp& op); + + template + void combine2(const LeafNode& other, const OtherType&, bool valueIsActive, CombineOp&); + template + void combine2(const ValueType&, const OtherNodeT& other, bool valueIsActive, CombineOp&); + template + void combine2(const LeafNode& b0, const OtherNodeT& b1, CombineOp&); + + /// @brief Calls the templated functor BBoxOp with bounding box + /// information. An additional level argument is provided to the + /// callback. + /// + /// @note The bounding boxes are guarenteed to be non-overlapping. + template void visitActiveBBox(BBoxOp&) const; + + template void visit(VisitorOp&); + template void visit(VisitorOp&) const; + + template + void visit2Node(OtherLeafNodeType& other, VisitorOp&); + template + void visit2Node(OtherLeafNodeType& other, VisitorOp&) const; + template + void visit2(IterT& otherIter, VisitorOp&, bool otherIsLHS = false); + template + void visit2(IterT& otherIter, VisitorOp&, bool otherIsLHS = false) const; + + //@{ + /// This function exists only to enable template instantiation. + void prune(const ValueType& /*tolerance*/ = zeroVal()) {} + void addLeaf(LeafNode*) {} + template + void addLeafAndCache(LeafNode*, AccessorT&) {} + template + NodeT* stealNode(const Coord&, const ValueType&, bool) { return NULL; } + template + NodeT* probeNode(const Coord&) { return NULL; } + template + const NodeT* probeConstNode(const Coord&) const { return NULL; } + template void getNodes(ArrayT&) const {} + template void stealNodes(ArrayT&, const ValueType&, bool) {} + //@} + + void addTile(Index level, const Coord&, const ValueType&, bool); + void addTile(Index offset, const ValueType&, bool); + template + void addTileAndCache(Index, const Coord&, const ValueType&, bool, AccessorT&); + + //@{ + /// @brief Return a pointer to this node. + LeafNode* touchLeaf(const Coord&) { return this; } + template + LeafNode* touchLeafAndCache(const Coord&, AccessorT&) { return this; } + template + NodeT* probeNodeAndCache(const Coord&, AccessorT&) + { + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (!(boost::is_same::value)) return NULL; + return reinterpret_cast(this); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + LeafNode* probeLeaf(const Coord&) { return this; } + template + LeafNode* probeLeafAndCache(const Coord&, AccessorT&) { return this; } + //@} + //@{ + /// @brief Return a @const pointer to this node. + const LeafNode* probeConstLeaf(const Coord&) const { return this; } + template + const LeafNode* probeConstLeafAndCache(const Coord&, AccessorT&) const { return this; } + template + const LeafNode* probeLeafAndCache(const Coord&, AccessorT&) const { return this; } + const LeafNode* probeLeaf(const Coord&) const { return this; } + template + const NodeT* probeConstNodeAndCache(const Coord&, AccessorT&) const + { + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (!(boost::is_same::value)) return NULL; + return reinterpret_cast(this); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + //@} + + /// Return @c true if all of this node's values have the same active state + /// and are in the range this->getFirstValue() +/- @a tolerance. + /// + /// + /// @param constValue Is updated with the first value of this leaf node. + /// @param state Is updated with the state of all values IF method + /// returns @c true. Else the value is undefined! + /// @param tolerance The tolerance used to determine if values are + /// approximatly equal to the for value. + bool isConstant(ValueType& constValue, bool& state, + const ValueType& tolerance = zeroVal()) const; + + /// Return @c true if all of this node's values have the same active state + /// and are in the range (@a maxValue + @a minValue)/2 +/- @a tolerance. + /// + /// @param minValue Is updated with the minimum of all values IF method + /// returns @c true. Else the value is undefined! + /// @param maxValue Is updated with the maximum of all values IF method + /// returns @c true. Else the value is undefined! + /// @param state Is updated with the state of all values IF method + /// returns @c true. Else the value is undefined! + /// @param tolerance The tolerance used to determine if values are + /// approximatly constant. + bool isConstant(ValueType& minValue, ValueType& maxValue, + bool& state, const ValueType& tolerance = zeroVal()) const; + + /// Return @c true if all of this node's values are inactive. + bool isInactive() const { return mValueMask.isOff(); } + +protected: + friend class ::TestLeaf; + template friend class ::TestLeafIO; + + // During topology-only construction, access is needed + // to protected/private members of other template instances. + template friend class LeafNode; + + friend struct ValueIter; + friend struct ValueIter; + friend struct ValueIter; + friend struct ValueIter; + friend struct ValueIter; + friend struct ValueIter; + + // Allow iterators to call mask accessor methods (see below). + /// @todo Make mask accessors public? + friend class IteratorBase; + friend class IteratorBase; + friend class IteratorBase; + + // Mask accessors +public: + bool isValueMaskOn(Index n) const { return mValueMask.isOn(n); } + bool isValueMaskOn() const { return mValueMask.isOn(); } + bool isValueMaskOff(Index n) const { return mValueMask.isOff(n); } + bool isValueMaskOff() const { return mValueMask.isOff(); } + const NodeMaskType& getValueMask() const { return mValueMask; } + NodeMaskType& getValueMask() { return mValueMask; } + const NodeMaskType& valueMask() const { return mValueMask; } + void setValueMask(const NodeMaskType& mask) { mValueMask = mask; } + bool isChildMaskOn(Index) const { return false; } // leaf nodes have no children + bool isChildMaskOff(Index) const { return true; } + bool isChildMaskOff() const { return true; } +protected: + void setValueMask(Index n, bool on) { mValueMask.set(n, on); } + void setValueMaskOn(Index n) { mValueMask.setOn(n); } + void setValueMaskOff(Index n) { mValueMask.setOff(n); } + + /// Compute the origin of the leaf node that contains the voxel with the given coordinates. + static void evalNodeOrigin(Coord& xyz) { xyz &= ~(DIM - 1); } + + template + static inline void doVisit(NodeT&, VisitorOp&); + + template + static inline void doVisit2Node(NodeT& self, OtherNodeT& other, VisitorOp&); + + template + static inline void doVisit2(NodeT& self, OtherChildAllIterT&, VisitorOp&, bool otherIsLHS); + +private: + /// Buffer containing the actual data values + Buffer mBuffer; + /// Bitmask that determines which voxels are active + NodeMaskType mValueMask; + /// Global grid index coordinates (x,y,z) of the local origin of this node + Coord mOrigin; +}; // end of LeafNode class + + +#ifndef OPENVDB_2_ABI_COMPATIBLE +template +const T LeafNode::Buffer::sZero = zeroVal(); +#endif + + +//////////////////////////////////////// + + +//@{ +/// Helper metafunction used to implement LeafNode::SameConfiguration +/// (which, as an inner class, can't be independently specialized) +template +struct SameLeafConfig { static const bool value = false; }; + +template +struct SameLeafConfig > { static const bool value = true; }; +//@} + + +//////////////////////////////////////// + + +template +inline +LeafNode::LeafNode(): + mValueMask(),//default is off! + mOrigin(0, 0, 0) +{ +} + + +template +inline +LeafNode::LeafNode(const Coord& xyz, const ValueType& val, bool active): + mBuffer(val), + mValueMask(active), + mOrigin(xyz & (~(DIM - 1))) +{ +} + + +#ifndef OPENVDB_2_ABI_COMPATIBLE +template +inline +LeafNode::LeafNode(PartialCreate, const Coord& xyz, const ValueType& val, bool active): + mBuffer(PartialCreate(), val), + mValueMask(active), + mOrigin(xyz & (~(DIM - 1))) +{ +} +#endif + + +template +inline +LeafNode::LeafNode(const LeafNode &other): + mBuffer(other.mBuffer), + mValueMask(other.valueMask()), + mOrigin(other.mOrigin) +{ +} + + +// Copy-construct from a leaf node with the same configuration but a different ValueType. +template +template +inline +LeafNode::LeafNode(const LeafNode& other): + mValueMask(other.valueMask()), + mOrigin(other.mOrigin) +{ + struct Local { + /// @todo Consider using a value conversion functor passed as an argument instead. + static inline ValueType convertValue(const OtherValueType& val) { return ValueType(val); } + }; + + for (Index i = 0; i < SIZE; ++i) { + mBuffer[i] = Local::convertValue(other.mBuffer[i]); + } +} + + +template +template +inline +LeafNode::LeafNode(const LeafNode& other, + const ValueType& background, TopologyCopy): + mBuffer(background), + mValueMask(other.valueMask()), + mOrigin(other.mOrigin) +{ +} + + +template +template +inline +LeafNode::LeafNode(const LeafNode& other, + const ValueType& offValue, const ValueType& onValue, TopologyCopy): + mValueMask(other.valueMask()), + mOrigin(other.mOrigin) +{ + for (Index i = 0; i < SIZE; ++i) { + mBuffer[i] = (mValueMask.isOn(i) ? onValue : offValue); + } +} + + +template +inline +LeafNode::~LeafNode() +{ +} + + +template +inline std::string +LeafNode::str() const +{ + std::ostringstream ostr; + ostr << "LeafNode @" << mOrigin << ": " << mBuffer; + return ostr.str(); +} + + +//////////////////////////////////////// + + +template +inline Index +LeafNode::coordToOffset(const Coord& xyz) +{ + assert ((xyz[0] & (DIM-1u)) < DIM && (xyz[1] & (DIM-1u)) < DIM && (xyz[2] & (DIM-1u)) < DIM); + return ((xyz[0] & (DIM-1u)) << 2*Log2Dim) + + ((xyz[1] & (DIM-1u)) << Log2Dim) + + (xyz[2] & (DIM-1u)); +} + +template +inline Coord +LeafNode::offsetToLocalCoord(Index n) +{ + assert(n<(1<< 3*Log2Dim)); + Coord xyz; + xyz.setX(n >> 2*Log2Dim); + n &= ((1<<2*Log2Dim)-1); + xyz.setY(n >> Log2Dim); + xyz.setZ(n & ((1< +inline Coord +LeafNode::offsetToGlobalCoord(Index n) const +{ + return (this->offsetToLocalCoord(n) + this->origin()); +} + + +//////////////////////////////////////// + + +template +inline const ValueT& +LeafNode::getValue(const Coord& xyz) const +{ + return this->getValue(LeafNode::coordToOffset(xyz)); +} + +template +inline const ValueT& +LeafNode::getValue(Index offset) const +{ + assert(offset < SIZE); + return mBuffer[offset]; +} + + +template +inline bool +LeafNode::probeValue(const Coord& xyz, ValueType& val) const +{ + return this->probeValue(LeafNode::coordToOffset(xyz), val); +} + +template +inline bool +LeafNode::probeValue(Index offset, ValueType& val) const +{ + assert(offset < SIZE); + val = mBuffer[offset]; + return mValueMask.isOn(offset); +} + + +template +inline void +LeafNode::setValueOff(const Coord& xyz, const ValueType& val) +{ + this->setValueOff(LeafNode::coordToOffset(xyz), val); +} + +template +inline void +LeafNode::setValueOff(Index offset, const ValueType& val) +{ + assert(offset < SIZE); + mBuffer.setValue(offset, val); + mValueMask.setOff(offset); +} + + +template +inline void +LeafNode::setActiveState(const Coord& xyz, bool on) +{ + mValueMask.set(this->coordToOffset(xyz), on); +} + + +template +inline void +LeafNode::setValueOnly(const Coord& xyz, const ValueType& val) +{ + this->setValueOnly(LeafNode::coordToOffset(xyz), val); +} + +template +inline void +LeafNode::setValueOnly(Index offset, const ValueType& val) +{ + assert(offset +inline void +LeafNode::clip(const CoordBBox& clipBBox, const T& background) +{ + CoordBBox nodeBBox = this->getNodeBoundingBox(); + if (!clipBBox.hasOverlap(nodeBBox)) { + // This node lies completely outside the clipping region. Fill it with the background. + this->fill(background, /*active=*/false); + } else if (clipBBox.isInside(nodeBBox)) { + // This node lies completely inside the clipping region. Leave it intact. + return; + } + + // This node isn't completely contained inside the clipping region. + // Set any voxels that lie outside the region to the background value. + + // Construct a boolean mask that is on inside the clipping region and off outside it. + NodeMaskType mask; + nodeBBox.intersect(clipBBox); + Coord xyz; + int &x = xyz.x(), &y = xyz.y(), &z = xyz.z(); + for (x = nodeBBox.min().x(); x <= nodeBBox.max().x(); ++x) { + for (y = nodeBBox.min().y(); y <= nodeBBox.max().y(); ++y) { + for (z = nodeBBox.min().z(); z <= nodeBBox.max().z(); ++z) { + mask.setOn(static_cast(this->coordToOffset(xyz))); + } + } + } + + // Set voxels that lie in the inactive region of the mask (i.e., outside + // the clipping region) to the background value. + for (MaskOffIterator maskIter = mask.beginOff(); maskIter; ++maskIter) { + this->setValueOff(maskIter.pos(), background); + } +} + + +//////////////////////////////////////// + + +template +inline void +LeafNode::fill(const CoordBBox& bbox, const ValueType& value, bool active) +{ +#ifndef OPENVDB_2_ABI_COMPATIBLE + if (!this->allocate()) return; +#endif + + for (Int32 x = bbox.min().x(); x <= bbox.max().x(); ++x) { + const Index offsetX = (x & (DIM-1u)) << 2*Log2Dim; + for (Int32 y = bbox.min().y(); y <= bbox.max().y(); ++y) { + const Index offsetXY = offsetX + ((y & (DIM-1u)) << Log2Dim); + for (Int32 z = bbox.min().z(); z <= bbox.max().z(); ++z) { + const Index offset = offsetXY + (z & (DIM-1u)); + mBuffer[offset] = value; + mValueMask.set(offset, active); + } + } + } +} + +template +inline void +LeafNode::fill(const ValueType& value) +{ + mBuffer.fill(value); +} + +template +inline void +LeafNode::fill(const ValueType& value, bool active) +{ + mBuffer.fill(value); + mValueMask.set(active); +} + + +//////////////////////////////////////// + + +template +template +inline void +LeafNode::copyToDense(const CoordBBox& bbox, DenseT& dense) const +{ +#ifndef OPENVDB_2_ABI_COMPATIBLE + if (!this->isAllocated()) return; +#endif + + typedef typename DenseT::ValueType DenseValueType; + + const size_t xStride = dense.xStride(), yStride = dense.yStride(), zStride = dense.zStride(); + const Coord& min = dense.bbox().min(); + DenseValueType* t0 = dense.data() + zStride * (bbox.min()[2] - min[2]); // target array + const T* s0 = &mBuffer[bbox.min()[2] & (DIM-1u)]; // source array + for (Int32 x = bbox.min()[0], ex = bbox.max()[0] + 1; x < ex; ++x) { + DenseValueType* t1 = t0 + xStride * (x - min[0]); + const T* s1 = s0 + ((x & (DIM-1u)) << 2*Log2Dim); + for (Int32 y = bbox.min()[1], ey = bbox.max()[1] + 1; y < ey; ++y) { + DenseValueType* t2 = t1 + yStride * (y - min[1]); + const T* s2 = s1 + ((y & (DIM-1u)) << Log2Dim); + for (Int32 z = bbox.min()[2], ez = bbox.max()[2] + 1; z < ez; ++z, t2 += zStride) { + *t2 = DenseValueType(*s2++); + } + } + } +} + + +template +template +inline void +LeafNode::copyFromDense(const CoordBBox& bbox, const DenseT& dense, + const ValueType& background, const ValueType& tolerance) +{ +#ifndef OPENVDB_2_ABI_COMPATIBLE + if (!this->allocate()) return; +#endif + + typedef typename DenseT::ValueType DenseValueType; + + const size_t xStride = dense.xStride(), yStride = dense.yStride(), zStride = dense.zStride(); + const Coord& min = dense.bbox().min(); + + const DenseValueType* s0 = dense.data() + zStride * (bbox.min()[2] - min[2]); // source + const Int32 n0 = bbox.min()[2] & (DIM-1u); + for (Int32 x = bbox.min()[0], ex = bbox.max()[0]+1; x < ex; ++x) { + const DenseValueType* s1 = s0 + xStride * (x - min[0]); + const Int32 n1 = n0 + ((x & (DIM-1u)) << 2*LOG2DIM); + for (Int32 y = bbox.min()[1], ey = bbox.max()[1]+1; y < ey; ++y) { + const DenseValueType* s2 = s1 + yStride * (y - min[1]); + Int32 n2 = n1 + ((y & (DIM-1u)) << LOG2DIM); + for (Int32 z = bbox.min()[2], ez = bbox.max()[2]+1; z < ez; ++z, ++n2, s2 += zStride) { + if (math::isApproxEqual(background, ValueType(*s2), tolerance)) { + mValueMask.setOff(n2); + mBuffer[n2] = background; + } else { + mValueMask.setOn(n2); + mBuffer[n2] = ValueType(*s2); + } + } + } + } +} + + +//////////////////////////////////////// + + +template +inline void +LeafNode::readTopology(std::istream& is, bool /*fromHalf*/) +{ + mValueMask.load(is); +} + + +template +inline void +LeafNode::writeTopology(std::ostream& os, bool /*toHalf*/) const +{ + mValueMask.save(os); +} + + +//////////////////////////////////////// + + +#ifndef OPENVDB_2_ABI_COMPATIBLE +template +inline void +LeafNode::Buffer::doLoad() const +{ + if (!this->isOutOfCore()) return; + + Buffer* self = const_cast(this); + + // This lock will be contended at most once, after which this buffer + // will no longer be out-of-core. + tbb::spin_mutex::scoped_lock lock(self->mMutex); + if (!this->isOutOfCore()) return; + + boost::scoped_ptr info(self->mFileInfo); + assert(info.get() != NULL); + assert(info->mapping.get() != NULL); + assert(info->meta.get() != NULL); + + /// @todo For now, we have to clear the mData pointer in order for allocate() to take effect. + self->mData = NULL; + self->allocate(); + + boost::shared_ptr buf = info->mapping->createBuffer(); + std::istream is(buf.get()); + + io::setStreamMetadataPtr(is, info->meta, /*transfer=*/true); + + NodeMaskType mask; + is.seekg(info->maskpos); + mask.load(is); + + is.seekg(info->bufpos); + io::readCompressedValues(is, self->mData, SIZE, mask, io::getHalfFloat(is)); + + self->setOutOfCore(false); +} +#endif + + +//////////////////////////////////////// + + +template +inline void +LeafNode::readBuffers(std::istream& is, bool fromHalf) +{ + this->readBuffers(is, CoordBBox::inf(), fromHalf); +} + + +template +inline void +LeafNode::readBuffers(std::istream& is, const CoordBBox& clipBBox, bool fromHalf) +{ +#ifndef OPENVDB_2_ABI_COMPATIBLE + std::streamoff maskpos = is.tellg(); +#endif + + // Read in the value mask. + mValueMask.load(is); + + int8_t numBuffers = 1; + if (io::getFormatVersion(is) < OPENVDB_FILE_VERSION_NODE_MASK_COMPRESSION) { + // Read in the origin. + is.read(reinterpret_cast(&mOrigin), sizeof(Coord::ValueType) * 3); + + // Read in the number of buffers, which should now always be one. + is.read(reinterpret_cast(&numBuffers), sizeof(int8_t)); + } + + CoordBBox nodeBBox = this->getNodeBoundingBox(); + if (!clipBBox.hasOverlap(nodeBBox)) { + // This node lies completely outside the clipping region. + // Read and discard its voxel values. + Buffer temp; + io::readCompressedValues(is, temp.mData, SIZE, mValueMask, fromHalf); + mValueMask.setOff(); + mBuffer.setOutOfCore(false); + } else { +#ifndef OPENVDB_2_ABI_COMPATIBLE + // If this node lies completely inside the clipping region and it is being read + // from a memory-mapped file, delay loading of its buffer until the buffer + // is actually accessed. (If this node requires clipping, its buffer + // must be accessed and therefore must be loaded.) + io::MappedFile::Ptr mappedFile = io::getMappedFilePtr(is); + const bool delayLoad = ((mappedFile.get() != NULL) && clipBBox.isInside(nodeBBox)); + + if (delayLoad) { + mBuffer.setOutOfCore(true); + mBuffer.mFileInfo = new FileInfo; + mBuffer.mFileInfo->bufpos = is.tellg(); + mBuffer.mFileInfo->mapping = mappedFile; + // Save the offset to the value mask, because the in-memory copy + // might change before the value buffer gets read. + mBuffer.mFileInfo->maskpos = maskpos; + + mBuffer.mFileInfo->meta = io::getStreamMetadataPtr(is); + + // Read and discard voxel values. + Buffer temp; + io::readCompressedValues(is, temp.mData, SIZE, mValueMask, fromHalf); + } else { +#endif + mBuffer.allocate(); + io::readCompressedValues(is, mBuffer.mData, SIZE, mValueMask, fromHalf); + mBuffer.setOutOfCore(false); + + // Get this tree's background value. + T background = zeroVal(); + if (const void* bgPtr = io::getGridBackgroundValuePtr(is)) { + background = *static_cast(bgPtr); + } + this->clip(clipBBox, background); +#ifndef OPENVDB_2_ABI_COMPATIBLE + } +#endif + } + + if (numBuffers > 1) { + // Read in and discard auxiliary buffers that were created with earlier + // versions of the library. (Auxiliary buffers are not mask compressed.) + const bool zipped = io::getDataCompression(is) & io::COMPRESS_ZIP; + Buffer temp; + for (int i = 1; i < numBuffers; ++i) { + if (fromHalf) { + io::HalfReader::isReal, T>::read(is, temp.mData, SIZE, zipped); + } else { + io::readData(is, temp.mData, SIZE, zipped); + } + } + } +} + + +template +inline void +LeafNode::writeBuffers(std::ostream& os, bool toHalf) const +{ + // Write out the value mask. + mValueMask.save(os); + + mBuffer.loadValues(); + + io::writeCompressedValues(os, mBuffer.mData, SIZE, + mValueMask, /*childMask=*/NodeMaskType(), toHalf); +} + + +//////////////////////////////////////// + + +template +inline bool +LeafNode::operator==(const LeafNode& other) const +{ + return mOrigin == other.mOrigin && + mValueMask == other.valueMask() && + mBuffer == other.mBuffer; +} + + +template +inline Index64 +LeafNode::memUsage() const +{ + // Use sizeof(*this) to capture alignment-related padding + // (but note that sizeof(*this) includes sizeof(mBuffer)). + return sizeof(*this) + mBuffer.memUsage() - sizeof(mBuffer); +} + + +template +inline void +LeafNode::evalActiveBoundingBox(CoordBBox& bbox, bool visitVoxels) const +{ + CoordBBox this_bbox = this->getNodeBoundingBox(); + if (bbox.isInside(this_bbox)) return;//this LeafNode is already enclosed in the bbox + if (ValueOnCIter iter = this->cbeginValueOn()) {//any active values? + if (visitVoxels) {//use voxel granularity? + this_bbox.reset(); + for(; iter; ++iter) this_bbox.expand(this->offsetToLocalCoord(iter.pos())); + this_bbox.translate(this->origin()); + } + bbox.expand(this_bbox); + } +} + + +template +template +inline bool +LeafNode::hasSameTopology(const LeafNode* other) const +{ + assert(other); + return (Log2Dim == OtherLog2Dim && mValueMask == other->getValueMask()); +} + + +template +inline bool +LeafNode::isConstant(ValueType& value, bool& state, + const ValueType& tolerance) const +{ + state = mValueMask.isOn(); + if (!(state || mValueMask.isOff())) return false;// Are values neither active nor inactive? + + value = mBuffer[0]; + for (Index i = 1; i < SIZE; ++i) { + if ( !math::isApproxEqual(mBuffer[i], value, tolerance) ) return false; + } + return true; +} + +template +inline bool +LeafNode::isConstant(ValueType& minValue, ValueType& maxValue, + bool& state, const ValueType& tolerance) const +{ + state = mValueMask.isOn(); + if (!(state || mValueMask.isOff())) return false;// Are values neither active nor inactive? + + const T range = 2 * tolerance; + minValue = maxValue = mBuffer[0]; + for (Index i = 1; i < SIZE; ++i) {// early termination + const T& v = mBuffer[i]; + if (v < minValue) { + if ((maxValue - v) > range) return false; + minValue = v; + } else if (v > maxValue) { + if ((v - minValue) > range) return false; + maxValue = v; + } + } + return true; +} + +//////////////////////////////////////// + + +template +inline void +LeafNode::addTile(Index /*level*/, const Coord& xyz, const ValueType& val, bool active) +{ + this->addTile(this->coordToOffset(xyz), val, active); +} + +template +inline void +LeafNode::addTile(Index offset, const ValueType& val, bool active) +{ + assert(offset < SIZE); + setValueOnly(offset, val); + setActiveState(offset, active); +} + +template +template +inline void +LeafNode::addTileAndCache(Index level, const Coord& xyz, + const ValueType& val, bool active, AccessorT&) +{ + this->addTile(level, xyz, val, active); +} + + +//////////////////////////////////////// + + +template +inline void +LeafNode::resetBackground(const ValueType& oldBackground, + const ValueType& newBackground) +{ +#ifndef OPENVDB_2_ABI_COMPATIBLE + if (!this->allocate()) return; +#endif + + typename NodeMaskType::OffIterator iter; + // For all inactive values... + for (iter = this->mValueMask.beginOff(); iter; ++iter) { + ValueType &inactiveValue = mBuffer[iter.pos()]; + if (math::isApproxEqual(inactiveValue, oldBackground)) { + inactiveValue = newBackground; + } else if (math::isApproxEqual(inactiveValue, math::negative(oldBackground))) { + inactiveValue = math::negative(newBackground); + } + } +} + + +template +template +inline void +LeafNode::merge(const LeafNode& other) +{ +#ifndef OPENVDB_2_ABI_COMPATIBLE + if (!this->allocate()) return; +#endif + + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (Policy == MERGE_NODES) return; + typename NodeMaskType::OnIterator iter = other.valueMask().beginOn(); + for (; iter; ++iter) { + const Index n = iter.pos(); + if (mValueMask.isOff(n)) { + mBuffer[n] = other.mBuffer[n]; + mValueMask.setOn(n); + } + } + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END +} + +template +template +inline void +LeafNode::merge(const LeafNode& other, + const ValueType& /*bg*/, const ValueType& /*otherBG*/) +{ + this->template merge(other); +} + +template +template +inline void +LeafNode::merge(const ValueType& tileValue, bool tileActive) +{ +#ifndef OPENVDB_2_ABI_COMPATIBLE + if (!this->allocate()) return; +#endif + + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (Policy != MERGE_ACTIVE_STATES_AND_NODES) return; + if (!tileActive) return; + // Replace all inactive values with the active tile value. + for (typename NodeMaskType::OffIterator iter = mValueMask.beginOff(); iter; ++iter) { + const Index n = iter.pos(); + mBuffer[n] = tileValue; + mValueMask.setOn(n); + } + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END +} + + +template +template +inline void +LeafNode::topologyUnion(const LeafNode& other) +{ + mValueMask |= other.valueMask(); +} + +template +template +inline void +LeafNode::topologyIntersection(const LeafNode& other, + const ValueType&) +{ + mValueMask &= other.valueMask(); +} + +template +template +inline void +LeafNode::topologyDifference(const LeafNode& other, + const ValueType&) +{ + mValueMask &= !other.valueMask(); +} + +template +inline void +LeafNode::negate() +{ +#ifndef OPENVDB_2_ABI_COMPATIBLE + if (!this->allocate()) return; +#endif + for (Index i = 0; i < SIZE; ++i) { + mBuffer[i] = -mBuffer[i]; + } +} + + +//////////////////////////////////////// + + +template +template +inline void +LeafNode::combine(const LeafNode& other, CombineOp& op) +{ +#ifndef OPENVDB_2_ABI_COMPATIBLE + if (!this->allocate()) return; +#endif + CombineArgs args; + for (Index i = 0; i < SIZE; ++i) { + op(args.setARef(mBuffer[i]) + .setAIsActive(mValueMask.isOn(i)) + .setBRef(other.mBuffer[i]) + .setBIsActive(other.valueMask().isOn(i)) + .setResultRef(mBuffer[i])); + mValueMask.set(i, args.resultIsActive()); + } +} + + +template +template +inline void +LeafNode::combine(const ValueType& value, bool valueIsActive, CombineOp& op) +{ +#ifndef OPENVDB_2_ABI_COMPATIBLE + if (!this->allocate()) return; +#endif + CombineArgs args; + args.setBRef(value).setBIsActive(valueIsActive); + for (Index i = 0; i < SIZE; ++i) { + op(args.setARef(mBuffer[i]) + .setAIsActive(mValueMask.isOn(i)) + .setResultRef(mBuffer[i])); + mValueMask.set(i, args.resultIsActive()); + } +} + + +//////////////////////////////////////// + + +template +template +inline void +LeafNode::combine2(const LeafNode& other, const OtherType& value, + bool valueIsActive, CombineOp& op) +{ +#ifndef OPENVDB_2_ABI_COMPATIBLE + if (!this->allocate()) return; +#endif + CombineArgs args; + args.setBRef(value).setBIsActive(valueIsActive); + for (Index i = 0; i < SIZE; ++i) { + op(args.setARef(other.mBuffer[i]) + .setAIsActive(other.valueMask().isOn(i)) + .setResultRef(mBuffer[i])); + mValueMask.set(i, args.resultIsActive()); + } +} + + +template +template +inline void +LeafNode::combine2(const ValueType& value, const OtherNodeT& other, + bool valueIsActive, CombineOp& op) +{ +#ifndef OPENVDB_2_ABI_COMPATIBLE + if (!this->allocate()) return; +#endif + CombineArgs args; + args.setARef(value).setAIsActive(valueIsActive); + for (Index i = 0; i < SIZE; ++i) { + op(args.setBRef(other.mBuffer[i]) + .setBIsActive(other.valueMask().isOn(i)) + .setResultRef(mBuffer[i])); + mValueMask.set(i, args.resultIsActive()); + } +} + + +template +template +inline void +LeafNode::combine2(const LeafNode& b0, const OtherNodeT& b1, CombineOp& op) +{ +#ifndef OPENVDB_2_ABI_COMPATIBLE + if (!this->allocate()) return; +#endif + CombineArgs args; + for (Index i = 0; i < SIZE; ++i) { + mValueMask.set(i, b0.valueMask().isOn(i) || b1.valueMask().isOn(i)); + op(args.setARef(b0.mBuffer[i]) + .setAIsActive(b0.valueMask().isOn(i)) + .setBRef(b1.mBuffer[i]) + .setBIsActive(b1.valueMask().isOn(i)) + .setResultRef(mBuffer[i])); + mValueMask.set(i, args.resultIsActive()); + } +} + + +//////////////////////////////////////// + + +template +template +inline void +LeafNode::visitActiveBBox(BBoxOp& op) const +{ + if (op.template descent()) { + for (ValueOnCIter i=this->cbeginValueOn(); i; ++i) { +#ifdef _MSC_VER + op.operator()(CoordBBox::createCube(i.getCoord(), 1)); +#else + op.template operator()(CoordBBox::createCube(i.getCoord(), 1)); +#endif + } + } else { +#ifdef _MSC_VER + op.operator()(this->getNodeBoundingBox()); +#else + op.template operator()(this->getNodeBoundingBox()); +#endif + } +} + + +template +template +inline void +LeafNode::visit(VisitorOp& op) +{ + doVisit(*this, op); +} + + +template +template +inline void +LeafNode::visit(VisitorOp& op) const +{ + doVisit(*this, op); +} + + +template +template +inline void +LeafNode::doVisit(NodeT& self, VisitorOp& op) +{ + for (ChildAllIterT iter = self.beginChildAll(); iter; ++iter) { + op(iter); + } +} + + +//////////////////////////////////////// + + +template +template +inline void +LeafNode::visit2Node(OtherLeafNodeType& other, VisitorOp& op) +{ + doVisit2Node(*this, other, op); +} + + +template +template +inline void +LeafNode::visit2Node(OtherLeafNodeType& other, VisitorOp& op) const +{ + doVisit2Node(*this, other, op); +} + + +template +template< + typename NodeT, + typename OtherNodeT, + typename VisitorOp, + typename ChildAllIterT, + typename OtherChildAllIterT> +inline void +LeafNode::doVisit2Node(NodeT& self, OtherNodeT& other, VisitorOp& op) +{ + // Allow the two nodes to have different ValueTypes, but not different dimensions. + BOOST_STATIC_ASSERT(OtherNodeT::SIZE == NodeT::SIZE); + BOOST_STATIC_ASSERT(OtherNodeT::LEVEL == NodeT::LEVEL); + + ChildAllIterT iter = self.beginChildAll(); + OtherChildAllIterT otherIter = other.beginChildAll(); + + for ( ; iter && otherIter; ++iter, ++otherIter) { + op(iter, otherIter); + } +} + + +//////////////////////////////////////// + + +template +template +inline void +LeafNode::visit2(IterT& otherIter, VisitorOp& op, bool otherIsLHS) +{ + doVisit2( + *this, otherIter, op, otherIsLHS); +} + + +template +template +inline void +LeafNode::visit2(IterT& otherIter, VisitorOp& op, bool otherIsLHS) const +{ + doVisit2( + *this, otherIter, op, otherIsLHS); +} + + +template +template< + typename NodeT, + typename VisitorOp, + typename ChildAllIterT, + typename OtherChildAllIterT> +inline void +LeafNode::doVisit2(NodeT& self, OtherChildAllIterT& otherIter, + VisitorOp& op, bool otherIsLHS) +{ + if (!otherIter) return; + + if (otherIsLHS) { + for (ChildAllIterT iter = self.beginChildAll(); iter; ++iter) { + op(otherIter, iter); + } + } else { + for (ChildAllIterT iter = self.beginChildAll(); iter; ++iter) { + op(iter, otherIter); + } + } +} + + +//////////////////////////////////////// + + +template +inline std::ostream& +operator<<(std::ostream& os, const typename LeafNode::Buffer& buf) +{ + for (Index32 i = 0, N = buf.size(); i < N; ++i) os << buf.mData[i] << ", "; + return os; +} + +} // namespace tree +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + + +//////////////////////////////////////// + + +// Specialization for LeafNodes of type bool +#include "LeafNodeBool.h" + +// Specialization for LeafNodes with mask information only +#include "LeafNodeMask.h" + +#endif // OPENVDB_TREE_LEAFNODE_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tree/LeafNodeBool.h b/nuparu/include/openvdb/include/openvdb/tree/LeafNodeBool.h new file mode 100644 index 00000000..8591b6c1 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tree/LeafNodeBool.h @@ -0,0 +1,1773 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_TREE_LEAF_NODE_BOOL_HAS_BEEN_INCLUDED +#define OPENVDB_TREE_LEAF_NODE_BOOL_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include // for io::readData(), etc. +#include // for math::isZero() +#include +#include "LeafNode.h" +#include "Iterator.h" + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tree { + +/// @brief LeafNode specialization for values of type bool that stores both +/// the active states and the values of (2^Log2Dim)^3 voxels as bit masks +template +class LeafNode +{ +public: + typedef LeafNode LeafNodeType; + typedef boost::shared_ptr Ptr; + typedef bool BuildType; + typedef bool ValueType; + typedef util::NodeMask NodeMaskType; + + // These static declarations must be on separate lines to avoid VC9 compiler errors. + static const Index LOG2DIM = Log2Dim; // needed by parent nodes + static const Index TOTAL = Log2Dim; // needed by parent nodes + static const Index DIM = 1 << TOTAL; // dimension along one coordinate direction + static const Index NUM_VALUES = 1 << 3 * Log2Dim; + static const Index NUM_VOXELS = NUM_VALUES; // total number of voxels represented by this node + static const Index SIZE = NUM_VALUES; + static const Index LEVEL = 0; // level 0 = leaf + + /// @brief ValueConverter::Type is the type of a LeafNode having the same + /// dimensions as this node but a different value type, T. + template + struct ValueConverter { typedef LeafNode Type; }; + + /// @brief SameConfiguration::value is @c true if and only if + /// OtherNodeType is the type of a LeafNode with the same dimensions as this node. + template + struct SameConfiguration { + static const bool value = SameLeafConfig::value; + }; + + + class Buffer + { + public: + typedef typename NodeMaskType::Word WordType; + static const Index WORD_COUNT = NodeMaskType::WORD_COUNT; + Buffer() {} + Buffer(bool on) : mData(on) {} + Buffer(const NodeMaskType& other): mData(other) {} + Buffer(const Buffer& other): mData(other.mData) {} + ~Buffer() {} + void fill(bool val) { mData.set(val); } + Buffer& operator=(const Buffer& b) { if (&b != this) { mData = b.mData; } return *this; } + + const bool& getValue(Index i) const + { + assert(i < SIZE); + // We can't use the ternary operator here, otherwise Visual C++ returns + // a reference to a temporary. + if (mData.isOn(i)) return LeafNode::sOn; else return LeafNode::sOff; + } + const bool& operator[](Index i) const { return this->getValue(i); } + + bool operator==(const Buffer& other) const { return mData == other.mData; } + bool operator!=(const Buffer& other) const { return mData != other.mData; } + + void setValue(Index i, bool val) { assert(i < SIZE); mData.set(i, val); } + + void swap(Buffer& other) { if (&other != this) std::swap(mData, other.mData); } + + Index memUsage() const { return mData.memUsage(); } + static Index size() { return SIZE; } + + /// Return a point to the c-style array of words encoding the bits. + /// @warning This method should only be used by experts that + /// seek low-level optimizations. + WordType* data() + { + return &(mData.template getWord(0)); + } + /// Return a const point to the c-style array of words + /// encoding the bits. + /// @warning This method should only be used by experts that + /// seek low-level optimizations. + const WordType* data() const + { + return const_cast(this)->data(); + } + + private: + friend class ::TestLeaf; + // Allow the parent LeafNode to access this Buffer's bit mask. + friend class LeafNode; + + NodeMaskType mData; + }; // class Buffer + + + /// Default constructor + LeafNode(); + + /// Constructor + /// @param xyz the coordinates of a voxel that lies within the node + /// @param value the initial value for all of this node's voxels + /// @param active the active state to which to initialize all voxels + explicit LeafNode(const Coord& xyz, bool value = false, bool active = false); + +#ifndef OPENVDB_2_ABI_COMPATIBLE + /// "Partial creation" constructor used during file input + LeafNode(PartialCreate, const Coord& xyz, bool value = false, bool active = false); +#endif + + /// Deep copy constructor + LeafNode(const LeafNode&); + + /// Value conversion copy constructor + template + explicit LeafNode(const LeafNode& other); + + /// Topology copy constructor + template + LeafNode(const LeafNode& other, TopologyCopy); + + //@{ + /// @brief Topology copy constructor + /// @note This variant exists mainly to enable template instantiation. + template + LeafNode(const LeafNode& other, bool offValue, bool onValue, TopologyCopy); + template + LeafNode(const LeafNode& other, bool background, TopologyCopy); + //@} + + /// Destructor + ~LeafNode(); + + // + // Statistics + // + /// Return log2 of the size of the buffer storage. + static Index log2dim() { return Log2Dim; } + /// Return the number of voxels in each dimension. + static Index dim() { return DIM; } + static Index size() { return SIZE; } + static Index numValues() { return SIZE; } + static Index getLevel() { return LEVEL; } + static void getNodeLog2Dims(std::vector& dims) { dims.push_back(Log2Dim); } + static Index getChildDim() { return 1; } + + static Index32 leafCount() { return 1; } + static Index32 nonLeafCount() { return 0; } + + /// Return the number of active voxels. + Index64 onVoxelCount() const { return mValueMask.countOn(); } + /// Return the number of inactive voxels. + Index64 offVoxelCount() const { return mValueMask.countOff(); } + Index64 onLeafVoxelCount() const { return onVoxelCount(); } + Index64 offLeafVoxelCount() const { return offVoxelCount(); } + static Index64 onTileCount() { return 0; } + static Index64 offTileCount() { return 0; } + + /// Return @c true if this node has no active voxels. + bool isEmpty() const { return mValueMask.isOff(); } + /// Return @c true if this node only contains active voxels. + bool isDense() const { return mValueMask.isOn(); } + +#ifndef OPENVDB_2_ABI_COMPATIBLE + /// @brief Return @c true if memory for this node's buffer has been allocated. + /// @details Currently, boolean leaf nodes don't support partial creation, + /// so this always returns @c true. + bool isAllocated() const { return true; } + /// @brief Allocate memory for this node's buffer if it has not already been allocated. + /// @details Currently, boolean leaf nodes don't support partial creation, + /// so this has no effect. + bool allocate() { return true; } +#endif + + /// Return the memory in bytes occupied by this node. + Index64 memUsage() const; + + /// Expand the given bounding box so that it includes this leaf node's active voxels. + /// If visitVoxels is false this LeafNode will be approximated as dense, i.e. with all + /// voxels active. Else the individual active voxels are visited to produce a tight bbox. + void evalActiveBoundingBox(CoordBBox& bbox, bool visitVoxels = true) const; + + /// @brief Return the bounding box of this node, i.e., the full index space + /// spanned by this leaf node. + CoordBBox getNodeBoundingBox() const { return CoordBBox::createCube(mOrigin, DIM); } + + /// Set the grid index coordinates of this node's local origin. + void setOrigin(const Coord& origin) { mOrigin = origin; } + //@{ + /// Return the grid index coordinates of this node's local origin. + const Coord& origin() const { return mOrigin; } + void getOrigin(Coord& origin) const { origin = mOrigin; } + void getOrigin(Int32& x, Int32& y, Int32& z) const { mOrigin.asXYZ(x, y, z); } + //@} + + /// Return the linear table offset of the given global or local coordinates. + static Index coordToOffset(const Coord& xyz); + /// @brief Return the local coordinates for a linear table offset, + /// where offset 0 has coordinates (0, 0, 0). + static Coord offsetToLocalCoord(Index n); + /// Return the global coordinates for a linear table offset. + Coord offsetToGlobalCoord(Index n) const; + + /// Return a string representation of this node. + std::string str() const; + + /// @brief Return @c true if the given node (which may have a different @c ValueType + /// than this node) has the same active value topology as this node. + template + bool hasSameTopology(const LeafNode* other) const; + + /// Check for buffer equivalence by value. + bool operator==(const LeafNode&) const; + bool operator!=(const LeafNode&) const; + + // + // Buffer management + // + /// @brief Exchange this node's data buffer with the given data buffer + /// without changing the active states of the values. + void swap(Buffer& other) { mBuffer.swap(other); } + const Buffer& buffer() const { return mBuffer; } + Buffer& buffer() { return mBuffer; } + + // + // I/O methods + // + /// Read in just the topology. + void readTopology(std::istream&, bool fromHalf = false); + /// Write out just the topology. + void writeTopology(std::ostream&, bool toHalf = false) const; + + /// Read in the topology and the origin. + void readBuffers(std::istream&, bool fromHalf = false); + void readBuffers(std::istream& is, const CoordBBox&, bool fromHalf = false); + /// Write out the topology and the origin. + void writeBuffers(std::ostream&, bool toHalf = false) const; + + // + // Accessor methods + // + /// Return the value of the voxel at the given coordinates. + const bool& getValue(const Coord& xyz) const; + /// Return the value of the voxel at the given offset. + const bool& getValue(Index offset) const; + + /// @brief Return @c true if the voxel at the given coordinates is active. + /// @param xyz the coordinates of the voxel to be probed + /// @param[out] val the value of the voxel at the given coordinates + bool probeValue(const Coord& xyz, bool& val) const; + + /// Return the level (0) at which leaf node values reside. + static Index getValueLevel(const Coord&) { return LEVEL; } + + /// Set the active state of the voxel at the given coordinates but don't change its value. + void setActiveState(const Coord& xyz, bool on); + /// Set the active state of the voxel at the given offset but don't change its value. + void setActiveState(Index offset, bool on) { assert(offsetcoordToOffset(xyz)); } + /// Mark the voxel at the given offset as inactive but don't change its value. + void setValueOff(Index offset) { assert(offset < SIZE); mValueMask.setOff(offset); } + + /// Set the value of the voxel at the given coordinates and mark the voxel as inactive. + void setValueOff(const Coord& xyz, bool val); + /// Set the value of the voxel at the given offset and mark the voxel as inactive. + void setValueOff(Index offset, bool val); + + /// Mark the voxel at the given coordinates as active but don't change its value. + void setValueOn(const Coord& xyz) { mValueMask.setOn(this->coordToOffset(xyz)); } + /// Mark the voxel at the given offset as active but don't change its value. + void setValueOn(Index offset) { assert(offset < SIZE); mValueMask.setOn(offset); } + + /// Set the value of the voxel at the given coordinates and mark the voxel as active. + void setValueOn(const Coord& xyz, bool val); + /// Set the value of the voxel at the given coordinates and mark the voxel as active. + void setValue(const Coord& xyz, bool val) { this->setValueOn(xyz, val); } + /// Set the value of the voxel at the given offset and mark the voxel as active. + void setValueOn(Index offset, bool val); + + /// @brief Apply a functor to the value of the voxel at the given offset + /// and mark the voxel as active. + template + void modifyValue(Index offset, const ModifyOp& op); + /// @brief Apply a functor to the value of the voxel at the given coordinates + /// and mark the voxel as active. + template + void modifyValue(const Coord& xyz, const ModifyOp& op); + + /// Apply a functor to the voxel at the given coordinates. + template + void modifyValueAndActiveState(const Coord& xyz, const ModifyOp& op); + + /// Mark all voxels as active but don't change their values. + void setValuesOn() { mValueMask.setOn(); } + /// Mark all voxels as inactive but don't change their values. + void setValuesOff() { mValueMask.setOff(); } + + /// Return @c true if the voxel at the given coordinates is active. + bool isValueOn(const Coord& xyz) const { return mValueMask.isOn(this->coordToOffset(xyz)); } + /// Return @c true if the voxel at the given offset is active. + bool isValueOn(Index offset) const { assert(offset < SIZE); return mValueMask.isOn(offset); } + + /// Return @c false since leaf nodes never contain tiles. + static bool hasActiveTiles() { return false; } + + /// Set all voxels that lie outside the given axis-aligned box to the background. + void clip(const CoordBBox&, bool background); + + /// Set all voxels within an axis-aligned box to the specified value and active state. + void fill(const CoordBBox& bbox, bool value, bool active = true); + + /// Set all voxels to the specified value but don't change their active states. + void fill(const bool& value); + /// Set all voxels to the specified value and active state. + void fill(const bool& value, bool active); + + /// @brief Copy into a dense grid the values of the voxels that lie within + /// a given bounding box. + /// + /// @param bbox inclusive bounding box of the voxels to be copied into the dense grid + /// @param dense dense grid with a stride in @e z of one (see tools::Dense + /// in tools/Dense.h for the required API) + /// + /// @note @a bbox is assumed to be identical to or contained in the coordinate domains + /// of both the dense grid and this node, i.e., no bounds checking is performed. + /// @note Consider using tools::CopyToDense in tools/Dense.h + /// instead of calling this method directly. + template + void copyToDense(const CoordBBox& bbox, DenseT& dense) const; + + /// @brief Copy from a dense grid into this node the values of the voxels + /// that lie within a given bounding box. + /// @details Only values that are different (by more than the given tolerance) + /// from the background value will be active. Other values are inactive + /// and truncated to the background value. + /// + /// @param bbox inclusive bounding box of the voxels to be copied into this node + /// @param dense dense grid with a stride in @e z of one (see tools::Dense + /// in tools/Dense.h for the required API) + /// @param background background value of the tree that this node belongs to + /// @param tolerance tolerance within which a value equals the background value + /// + /// @note @a bbox is assumed to be identical to or contained in the coordinate domains + /// of both the dense grid and this node, i.e., no bounds checking is performed. + /// @note Consider using tools::CopyFromDense in tools/Dense.h + /// instead of calling this method directly. + template + void copyFromDense(const CoordBBox& bbox, const DenseT& dense, bool background, bool tolerance); + + /// @brief Return the value of the voxel at the given coordinates. + /// @note Used internally by ValueAccessor. + template + const bool& getValueAndCache(const Coord& xyz, AccessorT&) const {return this->getValue(xyz);} + + /// @brief Return @c true if the voxel at the given coordinates is active. + /// @note Used internally by ValueAccessor. + template + bool isValueOnAndCache(const Coord& xyz, AccessorT&) const { return this->isValueOn(xyz); } + + /// @brief Change the value of the voxel at the given coordinates and mark it as active. + /// @note Used internally by ValueAccessor. + template + void setValueAndCache(const Coord& xyz, bool val, AccessorT&) { this->setValueOn(xyz, val); } + + /// @brief Change the value of the voxel at the given coordinates + /// but preserve its state. + /// @note Used internally by ValueAccessor. + template + void setValueOnlyAndCache(const Coord& xyz, bool val, AccessorT&) {this->setValueOnly(xyz,val);} + + /// @brief Change the value of the voxel at the given coordinates and mark it as inactive. + /// @note Used internally by ValueAccessor. + template + void setValueOffAndCache(const Coord& xyz, bool value, AccessorT&) + { + this->setValueOff(xyz, value); + } + + /// @brief Apply a functor to the value of the voxel at the given coordinates + /// and mark the voxel as active. + /// @note Used internally by ValueAccessor. + template + void modifyValueAndCache(const Coord& xyz, const ModifyOp& op, AccessorT&) + { + this->modifyValue(xyz, op); + } + + /// Apply a functor to the voxel at the given coordinates. + /// @note Used internally by ValueAccessor. + template + void modifyValueAndActiveStateAndCache(const Coord& xyz, const ModifyOp& op, AccessorT&) + { + this->modifyValueAndActiveState(xyz, op); + } + + /// @brief Set the active state of the voxel at the given coordinates + /// without changing its value. + /// @note Used internally by ValueAccessor. + template + void setActiveStateAndCache(const Coord& xyz, bool on, AccessorT&) + { + this->setActiveState(xyz, on); + } + + /// @brief Return @c true if the voxel at the given coordinates is active + /// and return the voxel value in @a val. + /// @note Used internally by ValueAccessor. + template + bool probeValueAndCache(const Coord& xyz, bool& val, AccessorT&) const + { + return this->probeValue(xyz, val); + } + + /// @brief Return the LEVEL (=0) at which leaf node values reside. + /// @note Used internally by ValueAccessor. + template + static Index getValueLevelAndCache(const Coord&, AccessorT&) { return LEVEL; } + + /// @brief Return a const reference to the first entry in the buffer. + /// @note Since it's actually a reference to a static data member + /// it should not be converted to a non-const pointer! + const bool& getFirstValue() const { if (mValueMask.isOn(0)) return sOn; else return sOff; } + /// @brief Return a const reference to the last entry in the buffer. + /// @note Since it's actually a reference to a static data member + /// it should not be converted to a non-const pointer! + const bool& getLastValue() const { if (mValueMask.isOn(SIZE-1)) return sOn; else return sOff; } + + /// 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; + /// Return @c true if all of this node's values are inactive. + bool isInactive() const { return mValueMask.isOff(); } + + void resetBackground(bool oldBackground, bool newBackground); + + void negate() { mBuffer.mData.toggle(); } + + template + void merge(const LeafNode& other, bool bg = false, bool otherBG = false); + template void merge(bool tileValue, bool tileActive); + + /// @brief No-op + /// @details This function exists only to enable template instantiation. + void voxelizeActiveTiles(bool = true) {} + + /// @brief Union this node's set of active values with the active values + /// of the other node, whose @c ValueType may be different. So a + /// resulting voxel will be active if either of the original voxels + /// were active. + /// + /// @note This operation modifies only active states, not values. + template + void topologyUnion(const LeafNode& other); + + /// @brief Intersect this node's set of active values with the active values + /// of the other node, whose @c ValueType may be different. So a + /// resulting voxel will be active only if both of the original voxels + /// were active. + /// + /// @details The last dummy argument is required to match the signature + /// for InternalNode::topologyIntersection. + /// + /// @note This operation modifies only active states, not + /// values. Also note that this operation can result in all voxels + /// being inactive so consider subsequnetly calling prune. + template + void topologyIntersection(const LeafNode& other, const bool&); + + /// @brief Difference this node's set of active values with the active values + /// of the other node, whose @c ValueType may be different. So a + /// resulting voxel will be active only if the original voxel is + /// active in this LeafNode and inactive in the other LeafNode. + /// + /// @details The last dummy argument is required to match the signature + /// for InternalNode::topologyDifference. + /// + /// @note This operation modifies only active states, not values. + /// Also, because it can deactivate all of this node's voxels, + /// consider subsequently calling prune. + template + void topologyDifference(const LeafNode& other, const bool&); + + template + void combine(const LeafNode& other, CombineOp& op); + template + void combine(bool, bool valueIsActive, CombineOp& op); + + template + void combine2(const LeafNode& other, const OtherType&, bool valueIsActive, CombineOp&); + template + void combine2(bool, const OtherNodeT& other, bool valueIsActive, CombineOp&); + template + void combine2(const LeafNode& b0, const OtherNodeT& b1, CombineOp&); + + /// @brief Calls the templated functor BBoxOp with bounding box information. + /// An additional level argument is provided to the callback. + /// + /// @note The bounding boxes are guarenteed to be non-overlapping. + template void visitActiveBBox(BBoxOp&) const; + + template void visit(VisitorOp&); + template void visit(VisitorOp&) const; + + template + void visit2Node(OtherLeafNodeType& other, VisitorOp&); + template + void visit2Node(OtherLeafNodeType& other, VisitorOp&) const; + template + void visit2(IterT& otherIter, VisitorOp&, bool otherIsLHS = false); + template + void visit2(IterT& otherIter, VisitorOp&, bool otherIsLHS = false) const; + + //@{ + /// This function exists only to enable template instantiation. + void prune(const ValueType& /*tolerance*/ = zeroVal()) {} + void addLeaf(LeafNode*) {} + template + void addLeafAndCache(LeafNode*, AccessorT&) {} + template + NodeT* stealNode(const Coord&, const ValueType&, bool) { return NULL; } + template + NodeT* probeNode(const Coord&) { return NULL; } + template + const NodeT* probeConstNode(const Coord&) const { return NULL; } + template void getNodes(ArrayT&) const {} + template void stealNodes(ArrayT&, const ValueType&, bool) {} + //@} + + void addTile(Index level, const Coord&, bool val, bool active); + void addTile(Index offset, bool val, bool active); + template + void addTileAndCache(Index level, const Coord&, bool val, bool active, AccessorT&); + + //@{ + /// @brief Return a pointer to this node. + LeafNode* touchLeaf(const Coord&) { return this; } + template + LeafNode* touchLeafAndCache(const Coord&, AccessorT&) { return this; } + LeafNode* probeLeaf(const Coord&) { return this; } + template + LeafNode* probeLeafAndCache(const Coord&, AccessorT&) { return this; } + template + NodeT* probeNodeAndCache(const Coord&, AccessorT&) + { + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (!(boost::is_same::value)) return NULL; + return reinterpret_cast(this); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + //@} + //@{ + /// @brief Return a @const pointer to this node. + const LeafNode* probeLeaf(const Coord&) const { return this; } + template + const LeafNode* probeLeafAndCache(const Coord&, AccessorT&) const { return this; } + const LeafNode* probeConstLeaf(const Coord&) const { return this; } + template + const LeafNode* probeConstLeafAndCache(const Coord&, AccessorT&) const { return this; } + template + const NodeT* probeConstNodeAndCache(const Coord&, AccessorT&) const + { + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (!(boost::is_same::value)) return NULL; + return reinterpret_cast(this); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + //@} + + // + // Iterators + // +protected: + typedef typename NodeMaskType::OnIterator MaskOnIter; + typedef typename NodeMaskType::OffIterator MaskOffIter; + typedef typename NodeMaskType::DenseIterator MaskDenseIter; + + template + struct ValueIter: + // Derives from SparseIteratorBase, but can also be used as a dense iterator, + // if MaskIterT is a dense mask iterator type. + public SparseIteratorBase, NodeT, ValueT> + { + typedef SparseIteratorBase BaseT; + + ValueIter() {} + ValueIter(const MaskIterT& iter, NodeT* parent): BaseT(iter, parent) {} + + const bool& getItem(Index pos) const { return this->parent().getValue(pos); } + const bool& getValue() const { return this->getItem(this->pos()); } + + // Note: setItem() can't be called on const iterators. + void setItem(Index pos, bool value) const { this->parent().setValueOnly(pos, value); } + // Note: setValue() can't be called on const iterators. + void setValue(bool value) const { this->setItem(this->pos(), value); } + + // Note: modifyItem() can't be called on const iterators. + template + void modifyItem(Index n, const ModifyOp& op) const { this->parent().modifyValue(n, op); } + // Note: modifyValue() can't be called on const iterators. + template + void modifyValue(const ModifyOp& op) const { this->modifyItem(this->pos(), op); } + }; + + /// Leaf nodes have no children, so their child iterators have no get/set accessors. + template + struct ChildIter: + public SparseIteratorBase, NodeT, bool> + { + ChildIter() {} + ChildIter(const MaskIterT& iter, NodeT* parent): SparseIteratorBase< + MaskIterT, ChildIter, NodeT, bool>(iter, parent) {} + }; + + template + struct DenseIter: public DenseIteratorBase< + MaskDenseIter, DenseIter, NodeT, /*ChildT=*/void, ValueT> + { + typedef DenseIteratorBase BaseT; + typedef typename BaseT::NonConstValueType NonConstValueT; + + DenseIter() {} + DenseIter(const MaskDenseIter& iter, NodeT* parent): BaseT(iter, parent) {} + + bool getItem(Index pos, void*& child, NonConstValueT& value) const + { + value = this->parent().getValue(pos); + child = NULL; + return false; // no child + } + + // Note: setItem() can't be called on const iterators. + //void setItem(Index pos, void* child) const {} + + // Note: unsetItem() can't be called on const iterators. + void unsetItem(Index pos, const ValueT& val) const {this->parent().setValueOnly(pos, val);} + }; + +public: + typedef ValueIter ValueOnIter; + typedef ValueIter ValueOnCIter; + typedef ValueIter ValueOffIter; + typedef ValueIter ValueOffCIter; + typedef ValueIter ValueAllIter; + typedef ValueIter ValueAllCIter; + typedef ChildIter ChildOnIter; + typedef ChildIter ChildOnCIter; + typedef ChildIter ChildOffIter; + typedef ChildIter ChildOffCIter; + typedef DenseIter ChildAllIter; + typedef DenseIter ChildAllCIter; + + ValueOnCIter cbeginValueOn() const { return ValueOnCIter(mValueMask.beginOn(), this); } + ValueOnCIter beginValueOn() const { return ValueOnCIter(mValueMask.beginOn(), this); } + ValueOnIter beginValueOn() { return ValueOnIter(mValueMask.beginOn(), this); } + ValueOffCIter cbeginValueOff() const { return ValueOffCIter(mValueMask.beginOff(), this); } + ValueOffCIter beginValueOff() const { return ValueOffCIter(mValueMask.beginOff(), this); } + ValueOffIter beginValueOff() { return ValueOffIter(mValueMask.beginOff(), this); } + ValueAllCIter cbeginValueAll() const { return ValueAllCIter(mValueMask.beginDense(), this); } + ValueAllCIter beginValueAll() const { return ValueAllCIter(mValueMask.beginDense(), this); } + ValueAllIter beginValueAll() { return ValueAllIter(mValueMask.beginDense(), this); } + + ValueOnCIter cendValueOn() const { return ValueOnCIter(mValueMask.endOn(), this); } + ValueOnCIter endValueOn() const { return ValueOnCIter(mValueMask.endOn(), this); } + ValueOnIter endValueOn() { return ValueOnIter(mValueMask.endOn(), this); } + ValueOffCIter cendValueOff() const { return ValueOffCIter(mValueMask.endOff(), this); } + ValueOffCIter endValueOff() const { return ValueOffCIter(mValueMask.endOff(), this); } + ValueOffIter endValueOff() { return ValueOffIter(mValueMask.endOff(), this); } + ValueAllCIter cendValueAll() const { return ValueAllCIter(mValueMask.endDense(), this); } + ValueAllCIter endValueAll() const { return ValueAllCIter(mValueMask.endDense(), this); } + ValueAllIter endValueAll() { return ValueAllIter(mValueMask.endDense(), this); } + + // Note that [c]beginChildOn() and [c]beginChildOff() actually return end iterators, + // because leaf nodes have no children. + ChildOnCIter cbeginChildOn() const { return ChildOnCIter(mValueMask.endOn(), this); } + ChildOnCIter beginChildOn() const { return ChildOnCIter(mValueMask.endOn(), this); } + ChildOnIter beginChildOn() { return ChildOnIter(mValueMask.endOn(), this); } + ChildOffCIter cbeginChildOff() const { return ChildOffCIter(mValueMask.endOff(), this); } + ChildOffCIter beginChildOff() const { return ChildOffCIter(mValueMask.endOff(), this); } + ChildOffIter beginChildOff() { return ChildOffIter(mValueMask.endOff(), this); } + ChildAllCIter cbeginChildAll() const { return ChildAllCIter(mValueMask.beginDense(), this); } + ChildAllCIter beginChildAll() const { return ChildAllCIter(mValueMask.beginDense(), this); } + ChildAllIter beginChildAll() { return ChildAllIter(mValueMask.beginDense(), this); } + + ChildOnCIter cendChildOn() const { return ChildOnCIter(mValueMask.endOn(), this); } + ChildOnCIter endChildOn() const { return ChildOnCIter(mValueMask.endOn(), this); } + ChildOnIter endChildOn() { return ChildOnIter(mValueMask.endOn(), this); } + ChildOffCIter cendChildOff() const { return ChildOffCIter(mValueMask.endOff(), this); } + ChildOffCIter endChildOff() const { return ChildOffCIter(mValueMask.endOff(), this); } + ChildOffIter endChildOff() { return ChildOffIter(mValueMask.endOff(), this); } + ChildAllCIter cendChildAll() const { return ChildAllCIter(mValueMask.endDense(), this); } + ChildAllCIter endChildAll() const { return ChildAllCIter(mValueMask.endDense(), this); } + ChildAllIter endChildAll() { return ChildAllIter(mValueMask.endDense(), this); } + + // + // Mask accessors + // + bool isValueMaskOn(Index n) const { return mValueMask.isOn(n); } + bool isValueMaskOn() const { return mValueMask.isOn(); } + bool isValueMaskOff(Index n) const { return mValueMask.isOff(n); } + bool isValueMaskOff() const { return mValueMask.isOff(); } + const NodeMaskType& getValueMask() const { return mValueMask; } + const NodeMaskType& valueMask() const { return mValueMask; } + NodeMaskType& getValueMask() { return mValueMask; } + void setValueMask(const NodeMaskType& mask) { mValueMask = mask; } + bool isChildMaskOn(Index) const { return false; } // leaf nodes have no children + bool isChildMaskOff(Index) const { return true; } + bool isChildMaskOff() const { return true; } +protected: + void setValueMask(Index n, bool on) { mValueMask.set(n, on); } + void setValueMaskOn(Index n) { mValueMask.setOn(n); } + void setValueMaskOff(Index n) { mValueMask.setOff(n); } + + /// Compute the origin of the leaf node that contains the voxel with the given coordinates. + static void evalNodeOrigin(Coord& xyz) { xyz &= ~(DIM - 1); } + + template + static inline void doVisit(NodeT&, VisitorOp&); + + template + static inline void doVisit2Node(NodeT& self, OtherNodeT& other, VisitorOp&); + + template + static inline void doVisit2(NodeT& self, OtherChildAllIterT&, VisitorOp&, bool otherIsLHS); + + + /// Bitmask that determines which voxels are active + NodeMaskType mValueMask; + /// Bitmask representing the values of voxels + Buffer mBuffer; + /// Global grid index coordinates (x,y,z) of the local origin of this node + Coord mOrigin; + + // These static declarations must be on separate lines to avoid VC9 compiler errors. + static const bool sOn; + static const bool sOff; + +private: + /// @brief During topology-only construction, access is needed + /// to protected/private members of other template instances. + template friend class LeafNode; + + friend struct ValueIter; + friend struct ValueIter; + friend struct ValueIter; + friend struct ValueIter; + friend struct ValueIter; + friend struct ValueIter; + + //@{ + /// Allow iterators to call mask accessor methods (see below). + /// @todo Make mask accessors public? + friend class IteratorBase; + friend class IteratorBase; + friend class IteratorBase; + //@} + +}; // class LeafNode + + +/// @internal For consistency with other nodes and with iterators, methods like +/// LeafNode::getValue() return a reference to a value. Since it's not possible +/// to return a reference to a bit in a node mask, we return a reference to one +/// of the following static values instead. +template const bool LeafNode::sOn = true; +template const bool LeafNode::sOff = false; + + +//////////////////////////////////////// + + +template +inline +LeafNode::LeafNode() + : mOrigin(0, 0, 0) +{ +} + + +template +inline +LeafNode::LeafNode(const Coord& xyz, bool value, bool active) + : mValueMask(active) + , mBuffer(value) + , mOrigin(xyz & (~(DIM - 1))) +{ +} + + +#ifndef OPENVDB_2_ABI_COMPATIBLE +template +inline +LeafNode::LeafNode(PartialCreate, const Coord& xyz, bool value, bool active) + : mValueMask(active) + , mBuffer(value) + , mOrigin(xyz & (~(DIM - 1))) +{ + /// @todo For now, this is identical to the non-PartialCreate constructor. + /// Consider modifying the Buffer class to allow it to be constructed + /// without allocating a bitmask. +} +#endif + + +template +inline +LeafNode::LeafNode(const LeafNode &other) + : mValueMask(other.valueMask()) + , mBuffer(other.mBuffer) + , mOrigin(other.mOrigin) +{ +} + + +// Copy-construct from a leaf node with the same configuration but a different ValueType. +template +template +inline +LeafNode::LeafNode(const LeafNode& other) + : mValueMask(other.valueMask()) + , mOrigin(other.origin()) +{ + struct Local { + /// @todo Consider using a value conversion functor passed as an argument instead. + static inline bool convertValue(const ValueT& val) { return bool(val); } + }; + + for (Index i = 0; i < SIZE; ++i) { + mBuffer.setValue(i, Local::convertValue(other.mBuffer[i])); + } +} + + +template +template +inline +LeafNode::LeafNode(const LeafNode& other, + bool background, TopologyCopy) + : mValueMask(other.valueMask()) + , mBuffer(background) + , mOrigin(other.origin()) +{ +} + + +template +template +inline +LeafNode::LeafNode(const LeafNode& other, TopologyCopy) + : mValueMask(other.valueMask()) + , mBuffer(other.valueMask())// value = active state + , mOrigin(other.origin()) +{ +} + + +template +template +inline +LeafNode::LeafNode(const LeafNode& other, + bool offValue, bool onValue, TopologyCopy) + : mValueMask(other.valueMask()) + , mBuffer(other.valueMask()) + , mOrigin(other.origin()) +{ + if (offValue) { if (!onValue) mBuffer.mData.toggle(); else mBuffer.mData.setOn(); } +} + + +template +inline +LeafNode::~LeafNode() +{ +} + + +//////////////////////////////////////// + + +template +inline Index64 +LeafNode::memUsage() const +{ + return sizeof(mOrigin) + mValueMask.memUsage() + mBuffer.memUsage(); +} + + +template +inline void +LeafNode::evalActiveBoundingBox(CoordBBox& bbox, bool visitVoxels) const +{ + CoordBBox this_bbox = this->getNodeBoundingBox(); + if (bbox.isInside(this_bbox)) return;//this LeafNode is already enclosed in the bbox + if (ValueOnCIter iter = this->cbeginValueOn()) {//any active values? + if (visitVoxels) {//use voxel granularity? + this_bbox.reset(); + for(; iter; ++iter) this_bbox.expand(this->offsetToLocalCoord(iter.pos())); + this_bbox.translate(this->origin()); + } + bbox.expand(this_bbox); + } +} + + +template +template +inline bool +LeafNode::hasSameTopology(const LeafNode* other) const +{ + assert(other); + return (Log2Dim == OtherLog2Dim && mValueMask == other->getValueMask()); +} + + +template +inline std::string +LeafNode::str() const +{ + std::ostringstream ostr; + ostr << "LeafNode @" << mOrigin << ": "; + for (Index32 n = 0; n < SIZE; ++n) ostr << (mValueMask.isOn(n) ? '#' : '.'); + return ostr.str(); +} + + +//////////////////////////////////////// + + +template +inline Index +LeafNode::coordToOffset(const Coord& xyz) +{ + assert ((xyz[0] & (DIM-1u)) < DIM && (xyz[1] & (DIM-1u)) < DIM && (xyz[2] & (DIM-1u)) < DIM); + return ((xyz[0] & (DIM-1u)) << 2*Log2Dim) + + ((xyz[1] & (DIM-1u)) << Log2Dim) + + (xyz[2] & (DIM-1u)); +} + + +template +inline Coord +LeafNode::offsetToLocalCoord(Index n) +{ + assert(n < (1 << 3*Log2Dim)); + Coord xyz; + xyz.setX(n >> 2*Log2Dim); + n &= ((1 << 2*Log2Dim) - 1); + xyz.setY(n >> Log2Dim); + xyz.setZ(n & ((1 << Log2Dim) - 1)); + return xyz; +} + + +template +inline Coord +LeafNode::offsetToGlobalCoord(Index n) const +{ + return (this->offsetToLocalCoord(n) + this->origin()); +} + + +//////////////////////////////////////// + + +template +inline void +LeafNode::readTopology(std::istream& is, bool /*fromHalf*/) +{ + mValueMask.load(is); +} + + +template +inline void +LeafNode::writeTopology(std::ostream& os, bool /*toHalf*/) const +{ + mValueMask.save(os); +} + + +template +inline void +LeafNode::readBuffers(std::istream& is, const CoordBBox& clipBBox, bool fromHalf) +{ + // Boolean LeafNodes don't currently implement lazy loading. + // Instead, load the full buffer, then clip it. + + this->readBuffers(is, fromHalf); + + // Get this tree's background value. + bool background = false; + if (const void* bgPtr = io::getGridBackgroundValuePtr(is)) { + background = *static_cast(bgPtr); + } + this->clip(clipBBox, background); +} + + +template +inline void +LeafNode::readBuffers(std::istream& is, bool /*fromHalf*/) +{ + // Read in the value mask. + mValueMask.load(is); + // Read in the origin. + is.read(reinterpret_cast(&mOrigin), sizeof(Coord::ValueType) * 3); + + if (io::getFormatVersion(is) >= OPENVDB_FILE_VERSION_BOOL_LEAF_OPTIMIZATION) { + // Read in the mask for the voxel values. + mBuffer.mData.load(is); + } else { + // Older files stored one or more bool arrays. + + // Read in the number of buffers, which should now always be one. + int8_t numBuffers = 0; + is.read(reinterpret_cast(&numBuffers), sizeof(int8_t)); + + // Read in the buffer. + // (Note: prior to the bool leaf optimization, buffers were always compressed.) + boost::shared_array buf(new bool[SIZE]); + io::readData(is, buf.get(), SIZE, /*isCompressed=*/true); + + // Transfer values to mBuffer. + mBuffer.mData.setOff(); + for (Index i = 0; i < SIZE; ++i) { + if (buf[i]) mBuffer.mData.setOn(i); + } + + if (numBuffers > 1) { + // Read in and discard auxiliary buffers that were created with + // earlier versions of the library. + for (int i = 1; i < numBuffers; ++i) { + io::readData(is, buf.get(), SIZE, /*isCompressed=*/true); + } + } + } +} + + +template +inline void +LeafNode::writeBuffers(std::ostream& os, bool /*toHalf*/) const +{ + // Write out the value mask. + mValueMask.save(os); + // Write out the origin. + os.write(reinterpret_cast(&mOrigin), sizeof(Coord::ValueType) * 3); + // Write out the voxel values. + mBuffer.mData.save(os); +} + + +//////////////////////////////////////// + + +template +inline bool +LeafNode::operator==(const LeafNode& other) const +{ + return mOrigin == other.mOrigin && + mValueMask == other.valueMask() && + mBuffer == other.mBuffer; +} + + +template +inline bool +LeafNode::operator!=(const LeafNode& other) const +{ + return !(this->operator==(other)); +} + + +//////////////////////////////////////// + + +template +inline bool +LeafNode::isConstant(bool& constValue, bool& state, bool tolerance) const +{ + state = mValueMask.isOn(); + + if (!(state || mValueMask.isOff())) return false; + + // Note: if tolerance is true (i.e., 1), then all boolean values compare equal. + if (!tolerance && !(mBuffer.mData.isOn() || mBuffer.mData.isOff())) return false; + + constValue = mBuffer.mData.isOn(); + return true; +} + + +//////////////////////////////////////// + + +template +inline void +LeafNode::addTile(Index /*level*/, const Coord& xyz, bool val, bool active) +{ + this->addTile(this->coordToOffset(xyz), val, active); +} + +template +inline void +LeafNode::addTile(Index offset, bool val, bool active) +{ + assert(offset < SIZE); + this->setValueOnly(offset, val); + this->setActiveState(offset, active); +} + +template +template +inline void +LeafNode::addTileAndCache(Index level, const Coord& xyz, + bool val, bool active, AccessorT&) +{ + this->addTile(level, xyz, val, active); +} + + +//////////////////////////////////////// + + +template +inline const bool& +LeafNode::getValue(const Coord& xyz) const +{ + // This *CANNOT* use operator ? because Visual C++ + if (mBuffer.mData.isOn(this->coordToOffset(xyz))) return sOn; else return sOff; +} + + +template +inline const bool& +LeafNode::getValue(Index offset) const +{ + assert(offset < SIZE); + // This *CANNOT* use operator ? for Windows + if (mBuffer.mData.isOn(offset)) return sOn; else return sOff; +} + + +template +inline bool +LeafNode::probeValue(const Coord& xyz, bool& val) const +{ + const Index offset = this->coordToOffset(xyz); + val = mBuffer.mData.isOn(offset); + return mValueMask.isOn(offset); +} + + +template +inline void +LeafNode::setValueOn(const Coord& xyz, bool val) +{ + this->setValueOn(this->coordToOffset(xyz), val); +} + + +template +inline void +LeafNode::setValueOn(Index offset, bool val) +{ + assert(offset < SIZE); + mValueMask.setOn(offset); + mBuffer.mData.set(offset, val); +} + + +template +inline void +LeafNode::setValueOnly(const Coord& xyz, bool val) +{ + this->setValueOnly(this->coordToOffset(xyz), val); +} + + +template +inline void +LeafNode::setActiveState(const Coord& xyz, bool on) +{ + mValueMask.set(this->coordToOffset(xyz), on); +} + + +template +inline void +LeafNode::setValueOff(const Coord& xyz, bool val) +{ + this->setValueOff(this->coordToOffset(xyz), val); +} + + +template +inline void +LeafNode::setValueOff(Index offset, bool val) +{ + assert(offset < SIZE); + mValueMask.setOff(offset); + mBuffer.mData.set(offset, val); +} + + +template +template +inline void +LeafNode::modifyValue(Index offset, const ModifyOp& op) +{ + bool val = mBuffer.mData.isOn(offset); + op(val); + mBuffer.mData.set(offset, val); + mValueMask.setOn(offset); +} + + +template +template +inline void +LeafNode::modifyValue(const Coord& xyz, const ModifyOp& op) +{ + this->modifyValue(this->coordToOffset(xyz), op); +} + + +template +template +inline void +LeafNode::modifyValueAndActiveState(const Coord& xyz, const ModifyOp& op) +{ + const Index offset = this->coordToOffset(xyz); + bool val = mBuffer.mData.isOn(offset), state = mValueMask.isOn(offset); + op(val, state); + mBuffer.mData.set(offset, val); + mValueMask.set(offset, state); +} + + +//////////////////////////////////////// + + +template +inline void +LeafNode::resetBackground(bool oldBackground, bool newBackground) +{ + if (newBackground != oldBackground) { + // Flip mBuffer's background bits and zero its foreground bits. + NodeMaskType bgMask = !(mBuffer.mData | mValueMask); + // Overwrite mBuffer's background bits, leaving its foreground bits intact. + mBuffer.mData = (mBuffer.mData & mValueMask) | bgMask; + } +} + + +//////////////////////////////////////// + + +template +template +inline void +LeafNode::merge(const LeafNode& other, bool /*bg*/, bool /*otherBG*/) +{ + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (Policy == MERGE_NODES) return; + for (typename NodeMaskType::OnIterator iter = other.valueMask().beginOn(); iter; ++iter) { + const Index n = iter.pos(); + if (mValueMask.isOff(n)) { + mBuffer.mData.set(n, other.mBuffer.mData.isOn(n)); + mValueMask.setOn(n); + } + } + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END +} + +template +template +inline void +LeafNode::merge(bool tileValue, bool tileActive) +{ + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (Policy != MERGE_ACTIVE_STATES_AND_NODES) return; + if (!tileActive) return; + // Replace all inactive values with the active tile value. + if (tileValue) mBuffer.mData |= !mValueMask; // -0=>1, +0=>0, -1=>1, +1=>1 (-,+ = off,on) + else mBuffer.mData &= mValueMask; // -0=>0, +0=>0, -1=>0, +1=>1 + mValueMask.setOn(); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END +} + + +//////////////////////////////////////// + + +template +template +inline void +LeafNode::topologyUnion(const LeafNode& other) +{ + mValueMask |= other.valueMask(); +} + + +template +template +inline void +LeafNode::topologyIntersection(const LeafNode& other, + const bool&) +{ + mValueMask &= other.valueMask(); +} + + +template +template +inline void +LeafNode::topologyDifference(const LeafNode& other, + const bool&) +{ + mValueMask &= !other.valueMask(); +} + + +//////////////////////////////////////// + + +template +inline void +LeafNode::clip(const CoordBBox& clipBBox, bool background) +{ + CoordBBox nodeBBox = this->getNodeBoundingBox(); + if (!clipBBox.hasOverlap(nodeBBox)) { + // This node lies completely outside the clipping region. Fill it with background tiles. + this->fill(nodeBBox, background, /*active=*/false); + } else if (clipBBox.isInside(nodeBBox)) { + // This node lies completely inside the clipping region. Leave it intact. + return; + } + + // This node isn't completely contained inside the clipping region. + // Set any voxels that lie outside the region to the background value. + + // Construct a boolean mask that is on inside the clipping region and off outside it. + NodeMaskType mask; + nodeBBox.intersect(clipBBox); + Coord xyz; + int &x = xyz.x(), &y = xyz.y(), &z = xyz.z(); + for (x = nodeBBox.min().x(); x <= nodeBBox.max().x(); ++x) { + for (y = nodeBBox.min().y(); y <= nodeBBox.max().y(); ++y) { + for (z = nodeBBox.min().z(); z <= nodeBBox.max().z(); ++z) { + mask.setOn(static_cast(this->coordToOffset(xyz))); + } + } + } + + // Set voxels that lie in the inactive region of the mask (i.e., outside + // the clipping region) to the background value. + for (MaskOffIter maskIter = mask.beginOff(); maskIter; ++maskIter) { + this->setValueOff(maskIter.pos(), background); + } +} + + +//////////////////////////////////////// + + +template +inline void +LeafNode::fill(const CoordBBox& bbox, bool value, bool active) +{ + for (Int32 x = bbox.min().x(); x <= bbox.max().x(); ++x) { + const Index offsetX = (x & (DIM-1u))<<2*Log2Dim; + for (Int32 y = bbox.min().y(); y <= bbox.max().y(); ++y) { + const Index offsetXY = offsetX + ((y & (DIM-1u))<< Log2Dim); + for (Int32 z = bbox.min().z(); z <= bbox.max().z(); ++z) { + const Index offset = offsetXY + (z & (DIM-1u)); + mValueMask.set(offset, active); + mBuffer.mData.set(offset, value); + } + } + } +} + +template +inline void +LeafNode::fill(const bool& value) +{ + mBuffer.fill(value); +} + +template +inline void +LeafNode::fill(const bool& value, bool active) +{ + mBuffer.fill(value); + mValueMask.set(active); +} + + +//////////////////////////////////////// + + +template +template +inline void +LeafNode::copyToDense(const CoordBBox& bbox, DenseT& dense) const +{ + typedef typename DenseT::ValueType DenseValueType; + + const size_t xStride = dense.xStride(), yStride = dense.yStride(), zStride = dense.zStride(); + const Coord& min = dense.bbox().min(); + DenseValueType* t0 = dense.data() + zStride * (bbox.min()[2] - min[2]); // target array + const Int32 n0 = bbox.min()[2] & (DIM-1u); + for (Int32 x = bbox.min()[0], ex = bbox.max()[0] + 1; x < ex; ++x) { + DenseValueType* t1 = t0 + xStride * (x - min[0]); + const Int32 n1 = n0 + ((x & (DIM-1u)) << 2*LOG2DIM); + for (Int32 y = bbox.min()[1], ey = bbox.max()[1] + 1; y < ey; ++y) { + DenseValueType* t2 = t1 + yStride * (y - min[1]); + Int32 n2 = n1 + ((y & (DIM-1u)) << LOG2DIM); + for (Int32 z = bbox.min()[2], ez = bbox.max()[2] + 1; z < ez; ++z, t2 += zStride) { + *t2 = DenseValueType(mBuffer.mData.isOn(n2++)); + } + } + } +} + + +template +template +inline void +LeafNode::copyFromDense(const CoordBBox& bbox, const DenseT& dense, + bool background, bool tolerance) +{ + typedef typename DenseT::ValueType DenseValueType; + struct Local { + inline static bool toBool(const DenseValueType& v) { return !math::isZero(v); } + }; + + const size_t xStride = dense.xStride(), yStride = dense.yStride(), zStride = dense.zStride(); + const Coord& min = dense.bbox().min(); + const DenseValueType* s0 = dense.data() + zStride * (bbox.min()[2] - min[2]); // source + const Int32 n0 = bbox.min()[2] & (DIM-1u); + for (Int32 x = bbox.min()[0], ex = bbox.max()[0] + 1; x < ex; ++x) { + const DenseValueType* s1 = s0 + xStride * (x - min[0]); + const Int32 n1 = n0 + ((x & (DIM-1u)) << 2*LOG2DIM); + for (Int32 y = bbox.min()[1], ey = bbox.max()[1] + 1; y < ey; ++y) { + const DenseValueType* s2 = s1 + yStride * (y - min[1]); + Int32 n2 = n1 + ((y & (DIM-1u)) << LOG2DIM); + for (Int32 z = bbox.min()[2], ez = bbox.max()[2]+1; z < ez; ++z, ++n2, s2 += zStride) { + // Note: if tolerance is true (i.e., 1), then all boolean values compare equal. + if (tolerance || (background == Local::toBool(*s2))) { + mValueMask.setOff(n2); + mBuffer.mData.set(n2, background); + } else { + mValueMask.setOn(n2); + mBuffer.mData.set(n2, Local::toBool(*s2)); + } + } + } + } +} + + +//////////////////////////////////////// + + +template +template +inline void +LeafNode::combine(const LeafNode& other, CombineOp& op) +{ + CombineArgs args; + for (Index i = 0; i < SIZE; ++i) { + bool result = false, aVal = mBuffer.mData.isOn(i), bVal = other.mBuffer.mData.isOn(i); + op(args.setARef(aVal) + .setAIsActive(mValueMask.isOn(i)) + .setBRef(bVal) + .setBIsActive(other.valueMask().isOn(i)) + .setResultRef(result)); + mValueMask.set(i, args.resultIsActive()); + mBuffer.mData.set(i, result); + } +} + + +template +template +inline void +LeafNode::combine(bool value, bool valueIsActive, CombineOp& op) +{ + CombineArgs args; + args.setBRef(value).setBIsActive(valueIsActive); + for (Index i = 0; i < SIZE; ++i) { + bool result = false, aVal = mBuffer.mData.isOn(i); + op(args.setARef(aVal) + .setAIsActive(mValueMask.isOn(i)) + .setResultRef(result)); + mValueMask.set(i, args.resultIsActive()); + mBuffer.mData.set(i, result); + } +} + + +//////////////////////////////////////// + + +template +template +inline void +LeafNode::combine2(const LeafNode& other, const OtherType& value, + bool valueIsActive, CombineOp& op) +{ + CombineArgs args; + args.setBRef(value).setBIsActive(valueIsActive); + for (Index i = 0; i < SIZE; ++i) { + bool result = false, aVal = other.mBuffer.mData.isOn(i); + op(args.setARef(aVal) + .setAIsActive(other.valueMask().isOn(i)) + .setResultRef(result)); + mValueMask.set(i, args.resultIsActive()); + mBuffer.mData.set(i, result); + } +} + + +template +template +inline void +LeafNode::combine2(bool value, const OtherNodeT& other, + bool valueIsActive, CombineOp& op) +{ + CombineArgs args; + args.setARef(value).setAIsActive(valueIsActive); + for (Index i = 0; i < SIZE; ++i) { + bool result = false, bVal = other.mBuffer.mData.isOn(i); + op(args.setBRef(bVal) + .setBIsActive(other.valueMask().isOn(i)) + .setResultRef(result)); + mValueMask.set(i, args.resultIsActive()); + mBuffer.mData.set(i, result); + } +} + + +template +template +inline void +LeafNode::combine2(const LeafNode& b0, const OtherNodeT& b1, CombineOp& op) +{ + CombineArgs args; + for (Index i = 0; i < SIZE; ++i) { + // Default behavior: output voxel is active if either input voxel is active. + mValueMask.set(i, b0.valueMask().isOn(i) || b1.valueMask().isOn(i)); + + bool result = false, b0Val = b0.mBuffer.mData.isOn(i), b1Val = b1.mBuffer.mData.isOn(i); + op(args.setARef(b0Val) + .setAIsActive(b0.valueMask().isOn(i)) + .setBRef(b1Val) + .setBIsActive(b1.valueMask().isOn(i)) + .setResultRef(result)); + mValueMask.set(i, args.resultIsActive()); + mBuffer.mData.set(i, result); + } +} + + +//////////////////////////////////////// + +template +template +inline void +LeafNode::visitActiveBBox(BBoxOp& op) const +{ + if (op.template descent()) { + for (ValueOnCIter i=this->cbeginValueOn(); i; ++i) { +#ifdef _MSC_VER + op.operator()(CoordBBox::createCube(i.getCoord(), 1)); +#else + op.template operator()(CoordBBox::createCube(i.getCoord(), 1)); +#endif + } + } else { +#ifdef _MSC_VER + op.operator()(this->getNodeBoundingBox()); +#else + op.template operator()(this->getNodeBoundingBox()); +#endif + } +} + + +template +template +inline void +LeafNode::visit(VisitorOp& op) +{ + doVisit(*this, op); +} + + +template +template +inline void +LeafNode::visit(VisitorOp& op) const +{ + doVisit(*this, op); +} + + +template +template +inline void +LeafNode::doVisit(NodeT& self, VisitorOp& op) +{ + for (ChildAllIterT iter = self.beginChildAll(); iter; ++iter) { + op(iter); + } +} + + +//////////////////////////////////////// + + +template +template +inline void +LeafNode::visit2Node(OtherLeafNodeType& other, VisitorOp& op) +{ + doVisit2Node(*this, other, op); +} + + +template +template +inline void +LeafNode::visit2Node(OtherLeafNodeType& other, VisitorOp& op) const +{ + doVisit2Node(*this, other, op); +} + + +template +template< + typename NodeT, + typename OtherNodeT, + typename VisitorOp, + typename ChildAllIterT, + typename OtherChildAllIterT> +inline void +LeafNode::doVisit2Node(NodeT& self, OtherNodeT& other, VisitorOp& op) +{ + // Allow the two nodes to have different ValueTypes, but not different dimensions. + BOOST_STATIC_ASSERT(OtherNodeT::SIZE == NodeT::SIZE); + BOOST_STATIC_ASSERT(OtherNodeT::LEVEL == NodeT::LEVEL); + + ChildAllIterT iter = self.beginChildAll(); + OtherChildAllIterT otherIter = other.beginChildAll(); + + for ( ; iter && otherIter; ++iter, ++otherIter) { + op(iter, otherIter); + } +} + + +//////////////////////////////////////// + + +template +template +inline void +LeafNode::visit2(IterT& otherIter, VisitorOp& op, bool otherIsLHS) +{ + doVisit2(*this, otherIter, op, otherIsLHS); +} + + +template +template +inline void +LeafNode::visit2(IterT& otherIter, VisitorOp& op, bool otherIsLHS) const +{ + doVisit2(*this, otherIter, op, otherIsLHS); +} + + +template +template< + typename NodeT, + typename VisitorOp, + typename ChildAllIterT, + typename OtherChildAllIterT> +inline void +LeafNode::doVisit2(NodeT& self, OtherChildAllIterT& otherIter, + VisitorOp& op, bool otherIsLHS) +{ + if (!otherIter) return; + + if (otherIsLHS) { + for (ChildAllIterT iter = self.beginChildAll(); iter; ++iter) { + op(otherIter, iter); + } + } else { + for (ChildAllIterT iter = self.beginChildAll(); iter; ++iter) { + op(iter, otherIter); + } + } +} + +} // namespace tree +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TREE_LEAF_NODE_BOOL_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tree/LeafNodeMask.h b/nuparu/include/openvdb/include/openvdb/tree/LeafNodeMask.h new file mode 100644 index 00000000..46aa78d3 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tree/LeafNodeMask.h @@ -0,0 +1,1687 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_TREE_LEAF_NODE_MASK_HAS_BEEN_INCLUDED +#define OPENVDB_TREE_LEAF_NODE_MASK_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include // for io::readData(), etc. +#include // for math::isZero() +#include +#include "LeafNode.h" +#include "Iterator.h" + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tree { + +/// @brief LeafNode specialization for values of type ValueMask that encodes both +/// the active states and the boolean values of (2^Log2Dim)^3 voxels +/// in a single bit mask, i.e. voxel values and states are indistinguishable! +template +class LeafNode +{ +public: + typedef LeafNode LeafNodeType; + typedef boost::shared_ptr Ptr; + typedef ValueMask BuildType;// this is a rare case where + typedef bool ValueType;// value type != build type + typedef util::NodeMask NodeMaskType; + + // These static declarations must be on separate lines to avoid VC9 compiler errors. + static const Index LOG2DIM = Log2Dim; // needed by parent nodes + static const Index TOTAL = Log2Dim; // needed by parent nodes + static const Index DIM = 1 << TOTAL; // dimension along one coordinate direction + static const Index NUM_VALUES = 1 << 3 * Log2Dim; + static const Index NUM_VOXELS = NUM_VALUES; // total number of voxels represented by this node + static const Index SIZE = NUM_VALUES; + static const Index LEVEL = 0; // level 0 = leaf + + /// @brief ValueConverter::Type is the type of a LeafNode having the same + /// dimensions as this node but a different value type, T. + template + struct ValueConverter { + typedef LeafNode Type; + }; + + /// @brief SameConfiguration::value is @c true if and only if + /// OtherNodeType is the type of a LeafNode with the same dimensions as this node. + template + struct SameConfiguration { + static const bool value = SameLeafConfig::value; + }; + + class Buffer + { + public: + typedef typename NodeMaskType::Word WordType; + static const Index WORD_COUNT = NodeMaskType::WORD_COUNT; + Buffer() {} + explicit Buffer(bool on) : mData(on) {} + Buffer(const NodeMaskType& other): mData(other) {} + Buffer(const Buffer& other): mData(other.mData) {} + ~Buffer() {} + void fill(bool val) { mData.set(val); } + Buffer& operator=(const Buffer& b) + { + if (&b != this) mData = b.mData; + return *this; + } + + const bool& getValue(Index i) const + { + assert(i < SIZE); + // We can't use the ternary operator here, otherwise Visual C++ returns + // a reference to a temporary. + if (mData.isOn(i)) return LeafNode::sOn; + return LeafNode::sOff; + } + const bool& operator[](Index i) const { return this->getValue(i); } + + bool operator==(const Buffer& other) const { return mData == other.mData; } + bool operator!=(const Buffer& other) const { return mData != other.mData; } + + void setValue(Index i, bool val) { assert(i < SIZE); mData.set(i, val); } + + void swap(Buffer& other) { if (&other != this) std::swap(mData, other.mData); } + + Index memUsage() const { return mData.memUsage(); } + static Index size() { return SIZE; } + + /// Return a point to the c-style array of words encoding the bits. + /// @warning This method should only be used by experts that + /// seek low-level optimizations. + WordType* data() + { + return &(mData.template getWord(0)); + } + /// Return a const point to the c-style array of words + /// encoding the bits. + /// @warning This method should only be used by experts that + /// seek low-level optimizations. + const WordType* data() const + { + return const_cast(this)->data(); + } + + private: + friend class ::TestLeaf; + // Allow the parent LeafNode to access this Buffer's bit mask. + friend class LeafNode; + + NodeMaskType mData; + }; // class Buffer + + + /// Default constructor + LeafNode(); + + /// Constructor + /// @param xyz the coordinates of a voxel that lies within the node + /// @param value the initial value = state for all of this node's voxels + /// @param dummy dummy value + explicit LeafNode(const Coord& xyz, bool value = false, bool dummy = false); + +#ifndef OPENVDB_2_ABI_COMPATIBLE + /// "Partial creation" constructor used during file input + LeafNode(PartialCreate, const Coord& xyz, bool value = false, bool dummy = false); +#endif + + /// Deep copy constructor + LeafNode(const LeafNode&); + + /// Value conversion copy constructor + template + explicit LeafNode(const LeafNode& other); + + /// Topology copy constructor + template + LeafNode(const LeafNode& other, TopologyCopy); + + //@{ + /// @brief Topology copy constructor + /// @note This variant exists mainly to enable template instantiation. + template + LeafNode(const LeafNode& other, bool offValue, bool onValue, TopologyCopy); + template + LeafNode(const LeafNode& other, bool background, TopologyCopy); + //@} + + /// Destructor + ~LeafNode(); + + // + // Statistics + // + /// Return log2 of the size of the buffer storage. + static Index log2dim() { return Log2Dim; } + /// Return the number of voxels in each dimension. + static Index dim() { return DIM; } + /// Return the total number of voxels represented by this LeafNode + static Index size() { return SIZE; } + /// Return the total number of voxels represented by this LeafNode + static Index numValues() { return SIZE; } + /// Return the level of this node, which by definition is zero for LeafNodes + static Index getLevel() { return LEVEL; } + /// Append the Log2Dim of this LeafNode to the specified vector + static void getNodeLog2Dims(std::vector& dims) { dims.push_back(Log2Dim); } + /// Return the dimension of child nodes of this LeafNode, which is one for voxels. + static Index getChildDim() { return 1; } + /// Return the leaf count for this node, which is one. + static Index32 leafCount() { return 1; } + /// Return the non-leaf count for this node, which is zero. + static Index32 nonLeafCount() { return 0; } + + /// Return the number of active voxels. + Index64 onVoxelCount() const { return mBuffer.mData.countOn(); } + /// Return the number of inactive voxels. + Index64 offVoxelCount() const { return mBuffer.mData.countOff(); } + Index64 onLeafVoxelCount() const { return this->onVoxelCount(); } + Index64 offLeafVoxelCount() const { return this->offVoxelCount(); } + static Index64 onTileCount() { return 0; } + static Index64 offTileCount() { return 0; } + + /// Return @c true if this node has no active voxels. + bool isEmpty() const { return mBuffer.mData.isOff(); } + /// Return @c true if this node only contains active voxels. + bool isDense() const { return mBuffer.mData.isOn(); } + +#ifndef OPENVDB_2_ABI_COMPATIBLE + /// @brief Return @c true if memory for this node's buffer has been allocated. + /// @details Currently, boolean leaf nodes don't support partial creation, + /// so this always returns @c true. + bool isAllocated() const { return true; } + /// @brief Allocate memory for this node's buffer if it has not already been allocated. + /// @details Currently, boolean leaf nodes don't support partial creation, + /// so this has no effect. + bool allocate() { return true; } +#endif + + /// Return the memory in bytes occupied by this node. + Index64 memUsage() const; + + /// Expand the given bounding box so that it includes this leaf node's active voxels. + /// If visitVoxels is false this LeafNode will be approximated as dense, i.e. with all + /// voxels active. Else the individual active voxels are visited to produce a tight bbox. + void evalActiveBoundingBox(CoordBBox& bbox, bool visitVoxels = true) const; + + /// @brief Return the bounding box of this node, i.e., the full index space + /// spanned by this leaf node. + CoordBBox getNodeBoundingBox() const { return CoordBBox::createCube(mOrigin, DIM); } + + /// Set the grid index coordinates of this node's local origin. + void setOrigin(const Coord& origin) { mOrigin = origin; } + //@{ + /// Return the grid index coordinates of this node's local origin. + const Coord& origin() const { return mOrigin; } + void getOrigin(Coord& origin) const { origin = mOrigin; } + void getOrigin(Int32& x, Int32& y, Int32& z) const { mOrigin.asXYZ(x, y, z); } + //@} + + /// Return the linear table offset of the given global or local coordinates. + static Index coordToOffset(const Coord& xyz); + /// @brief Return the local coordinates for a linear table offset, + /// where offset 0 has coordinates (0, 0, 0). + static Coord offsetToLocalCoord(Index n); + /// Return the global coordinates for a linear table offset. + Coord offsetToGlobalCoord(Index n) const; + + /// Return a string representation of this node. + std::string str() const; + + /// @brief Return @c true if the given node (which may have a different @c ValueType + /// than this node) has the same active value topology as this node. + template + bool hasSameTopology(const LeafNode* other) const; + + /// Check for buffer equivalence by value. + bool operator==(const LeafNode&) const; + bool operator!=(const LeafNode&) const; + + // + // Buffer management + // + /// @brief Exchange this node's data buffer with the given data buffer + /// without changing the active states of the values. + void swap(Buffer& other) { mBuffer.swap(other); } + const Buffer& buffer() const { return mBuffer; } + Buffer& buffer() { return mBuffer; } + + // + // I/O methods + // + /// Read in just the topology. + void readTopology(std::istream&, bool fromHalf = false); + /// Write out just the topology. + void writeTopology(std::ostream&, bool toHalf = false) const; + + /// Read in the topology and the origin. + void readBuffers(std::istream&, bool fromHalf = false); + void readBuffers(std::istream& is, const CoordBBox&, bool fromHalf = false); + /// Write out the topology and the origin. + void writeBuffers(std::ostream&, bool toHalf = false) const; + + // + // Accessor methods + // + /// Return the value of the voxel at the given coordinates. + const bool& getValue(const Coord& xyz) const; + /// Return the value of the voxel at the given offset. + const bool& getValue(Index offset) const; + + /// @brief Return @c true if the voxel at the given coordinates is active. + /// @param xyz the coordinates of the voxel to be probed + /// @param[out] val the value of the voxel at the given coordinates + bool probeValue(const Coord& xyz, bool& val) const; + + /// Return the level (0) at which leaf node values reside. + static Index getValueLevel(const Coord&) { return LEVEL; } + + /// Set the active state of the voxel at the given coordinates but don't change its value. + void setActiveState(const Coord& xyz, bool on); + /// Set the active state of the voxel at the given offset but don't change its value. + void setActiveState(Index offset, bool on) { assert(offsetcoordToOffset(xyz)); } + /// Mark the voxel at the given offset as inactive but don't change its value. + void setValueOff(Index offset) { assert(offset < SIZE); mBuffer.mData.setOff(offset); } + + /// Set the value of the voxel at the given coordinates and mark the voxel as inactive. + void setValueOff(const Coord& xyz, bool val); + /// Set the value of the voxel at the given offset and mark the voxel as inactive. + void setValueOff(Index offset, bool val); + + /// Mark the voxel at the given coordinates as active but don't change its value. + void setValueOn(const Coord& xyz) { mBuffer.mData.setOn(this->coordToOffset(xyz)); } + /// Mark the voxel at the given offset as active but don't change its value. + void setValueOn(Index offset) { assert(offset < SIZE); mBuffer.mData.setOn(offset); } + + /// Set the value of the voxel at the given coordinates and mark the voxel as active. + void setValueOn(const Coord& xyz, bool val); + /// Set the value of the voxel at the given coordinates and mark the voxel as active. + void setValue(const Coord& xyz, bool val) { this->setValueOn(xyz, val); } + /// Set the value of the voxel at the given offset and mark the voxel as active. + void setValueOn(Index offset, bool val); + + /// @brief Apply a functor to the value of the voxel at the given offset + /// and mark the voxel as active. + template + void modifyValue(Index offset, const ModifyOp& op); + /// @brief Apply a functor to the value of the voxel at the given coordinates + /// and mark the voxel as active. + template + void modifyValue(const Coord& xyz, const ModifyOp& op); + + /// Apply a functor to the voxel at the given coordinates. + template + void modifyValueAndActiveState(const Coord& xyz, const ModifyOp& op); + + /// Mark all voxels as active but don't change their values. + void setValuesOn() { mBuffer.mData.setOn(); } + /// Mark all voxels as inactive but don't change their values. + void setValuesOff() { mBuffer.mData.setOff(); } + + /// Return @c true if the voxel at the given coordinates is active. + bool isValueOn(const Coord& xyz) const { return mBuffer.mData.isOn(this->coordToOffset(xyz)); } + /// Return @c true if the voxel at the given offset is active. + bool isValueOn(Index offset) const { assert(offset < SIZE); return mBuffer.mData.isOn(offset); } + + /// Return @c false since leaf nodes never contain tiles. + static bool hasActiveTiles() { return false; } + + /// Set all voxels that lie outside the given axis-aligned box to the background. + void clip(const CoordBBox&, bool background); + + /// Set all voxels within an axis-aligned box to the specified value and active state. + void fill(const CoordBBox& bbox, bool value, bool dummy = false); + + /// Set the state of all voxels to the specified active state. + void fill(const bool& value, bool dummy = false); + + /// @brief Copy into a dense grid the values of the voxels that lie within + /// a given bounding box. + /// + /// @param bbox inclusive bounding box of the voxels to be copied into the dense grid + /// @param dense dense grid with a stride in @e z of one (see tools::Dense + /// in tools/Dense.h for the required API) + /// + /// @note @a bbox is assumed to be identical to or contained in the coordinate domains + /// of both the dense grid and this node, i.e., no bounds checking is performed. + /// @note Consider using tools::CopyToDense in tools/Dense.h + /// instead of calling this method directly. + template + void copyToDense(const CoordBBox& bbox, DenseT& dense) const; + + /// @brief Copy from a dense grid into this node the values of the voxels + /// that lie within a given bounding box. + /// @details Only values that are different (by more than the given tolerance) + /// from the background value will be active. Other values are inactive + /// and truncated to the background value. + /// + /// @param bbox inclusive bounding box of the voxels to be copied into this node + /// @param dense dense grid with a stride in @e z of one (see tools::Dense + /// in tools/Dense.h for the required API) + /// @param background background value of the tree that this node belongs to + /// @param tolerance tolerance within which a value equals the background value + /// + /// @note @a bbox is assumed to be identical to or contained in the coordinate domains + /// of both the dense grid and this node, i.e., no bounds checking is performed. + /// @note Consider using tools::CopyFromDense in tools/Dense.h + /// instead of calling this method directly. + template + void copyFromDense(const CoordBBox& bbox, const DenseT& dense, bool background, bool tolerance); + + /// @brief Return the value of the voxel at the given coordinates. + /// @note Used internally by ValueAccessor. + template + const bool& getValueAndCache(const Coord& xyz, AccessorT&) const {return this->getValue(xyz);} + + /// @brief Return @c true if the voxel at the given coordinates is active. + /// @note Used internally by ValueAccessor. + template + bool isValueOnAndCache(const Coord& xyz, AccessorT&) const { return this->isValueOn(xyz); } + + /// @brief Change the value of the voxel at the given coordinates and mark it as active. + /// @note Used internally by ValueAccessor. + template + void setValueAndCache(const Coord& xyz, bool val, AccessorT&) { this->setValueOn(xyz, val); } + + /// @brief Change the value of the voxel at the given coordinates + /// but preserve its state. + /// @note Used internally by ValueAccessor. + template + void setValueOnlyAndCache(const Coord& xyz, bool val, AccessorT&) {this->setValueOnly(xyz,val);} + + /// @brief Change the value of the voxel at the given coordinates and mark it as inactive. + /// @note Used internally by ValueAccessor. + template + void setValueOffAndCache(const Coord& xyz, bool value, AccessorT&) + { + this->setValueOff(xyz, value); + } + + /// @brief Apply a functor to the value of the voxel at the given coordinates + /// and mark the voxel as active. + /// @note Used internally by ValueAccessor. + template + void modifyValueAndCache(const Coord& xyz, const ModifyOp& op, AccessorT&) + { + this->modifyValue(xyz, op); + } + + /// Apply a functor to the voxel at the given coordinates. + /// @note Used internally by ValueAccessor. + template + void modifyValueAndActiveStateAndCache(const Coord& xyz, const ModifyOp& op, AccessorT&) + { + this->modifyValueAndActiveState(xyz, op); + } + + /// @brief Set the active state of the voxel at the given coordinates + /// without changing its value. + /// @note Used internally by ValueAccessor. + template + void setActiveStateAndCache(const Coord& xyz, bool on, AccessorT&) + { + this->setActiveState(xyz, on); + } + + /// @brief Return @c true if the voxel at the given coordinates is active + /// and return the voxel value in @a val. + /// @note Used internally by ValueAccessor. + template + bool probeValueAndCache(const Coord& xyz, bool& val, AccessorT&) const + { + return this->probeValue(xyz, val); + } + + /// @brief Return the LEVEL (=0) at which leaf node values reside. + /// @note Used internally by ValueAccessor. + template + static Index getValueLevelAndCache(const Coord&, AccessorT&) { return LEVEL; } + + /// @brief Return a const reference to the first entry in the buffer. + /// @note Since it's actually a reference to a static data member + /// it should not be converted to a non-const pointer! + const bool& getFirstValue() const { if (mBuffer.mData.isOn(0)) return sOn; else return sOff; } + /// @brief Return a const reference to the last entry in the buffer. + /// @note Since it's actually a reference to a static data member + /// it should not be converted to a non-const pointer! + const bool& getLastValue() const { if (mBuffer.mData.isOn(SIZE-1)) return sOn; else return sOff; } + + /// 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; + /// Return @c true if all of this node's values are inactive. + bool isInactive() const { return mBuffer.mData.isOff(); } + + /// @brief no-op since for this temaplte specialization voxel + /// values and states are indistinguishable. + void resetBackground(bool, bool) {} + + /// @brief Invert the bits of the voxels, i.e. states and values + void negate() { mBuffer.mData.toggle(); } + + template + void merge(const LeafNode& other, bool bg = false, bool otherBG = false); + template void merge(bool tileValue, bool tileActive=false); + + /// @brief No-op + /// @details This function exists only to enable template instantiation. + void voxelizeActiveTiles(bool = true) {} + + /// @brief Union this node's set of active values with the active values + /// of the other node, whose @c ValueType may be different. So a + /// resulting voxel will be active if either of the original voxels + /// were active. + /// + /// @note This operation modifies only active states, not values. + template + void topologyUnion(const LeafNode& other); + + /// @brief Intersect this node's set of active values with the active values + /// of the other node, whose @c ValueType may be different. So a + /// resulting voxel will be active only if both of the original voxels + /// were active. + /// + /// @details The last dummy argument is required to match the signature + /// for InternalNode::topologyIntersection. + /// + /// @note This operation modifies only active states, not + /// values. Also note that this operation can result in all voxels + /// being inactive so consider subsequnetly calling prune. + template + void topologyIntersection(const LeafNode& other, const bool&); + + /// @brief Difference this node's set of active values with the active values + /// of the other node, whose @c ValueType may be different. So a + /// resulting voxel will be active only if the original voxel is + /// active in this LeafNode and inactive in the other LeafNode. + /// + /// @details The last dummy argument is required to match the signature + /// for InternalNode::topologyDifference. + /// + /// @note This operation modifies only active states, not values. + /// Also, because it can deactivate all of this node's voxels, + /// consider subsequently calling prune. + template + void topologyDifference(const LeafNode& other, const bool&); + + template + void combine(const LeafNode& other, CombineOp& op); + template + void combine(bool, bool valueIsActive, CombineOp& op); + + template + void combine2(const LeafNode& other, const OtherType&, bool valueIsActive, CombineOp&); + template + void combine2(bool, const OtherNodeT& other, bool valueIsActive, CombineOp&); + template + void combine2(const LeafNode& b0, const OtherNodeT& b1, CombineOp&); + + /// @brief Calls the templated functor BBoxOp with bounding box information. + /// An additional level argument is provided to the callback. + /// + /// @note The bounding boxes are guarenteed to be non-overlapping. + template void visitActiveBBox(BBoxOp&) const; + + template void visit(VisitorOp&); + template void visit(VisitorOp&) const; + + template + void visit2Node(OtherLeafNodeType& other, VisitorOp&); + template + void visit2Node(OtherLeafNodeType& other, VisitorOp&) const; + template + void visit2(IterT& otherIter, VisitorOp&, bool otherIsLHS = false); + template + void visit2(IterT& otherIter, VisitorOp&, bool otherIsLHS = false) const; + + //@{ + /// This function exists only to enable template instantiation. + void prune(const ValueType& /*tolerance*/ = zeroVal()) {} + void addLeaf(LeafNode*) {} + template + void addLeafAndCache(LeafNode*, AccessorT&) {} + template + NodeT* stealNode(const Coord&, const ValueType&, bool) { return NULL; } + template + NodeT* probeNode(const Coord&) { return NULL; } + template + const NodeT* probeConstNode(const Coord&) const { return NULL; } + template void getNodes(ArrayT&) const {} + template void stealNodes(ArrayT&, const ValueType&, bool) {} + //@} + + void addTile(Index level, const Coord&, bool val, bool active); + void addTile(Index offset, bool val, bool active); + template + void addTileAndCache(Index level, const Coord&, bool val, bool active, AccessorT&); + + //@{ + /// @brief Return a pointer to this node. + LeafNode* touchLeaf(const Coord&) { return this; } + template + LeafNode* touchLeafAndCache(const Coord&, AccessorT&) { return this; } + LeafNode* probeLeaf(const Coord&) { return this; } + template + LeafNode* probeLeafAndCache(const Coord&, AccessorT&) { return this; } + template + NodeT* probeNodeAndCache(const Coord&, AccessorT&) + { + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (!(boost::is_same::value)) return NULL; + return reinterpret_cast(this); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + //@} + //@{ + /// @brief Return a @const pointer to this node. + const LeafNode* probeLeaf(const Coord&) const { return this; } + template + const LeafNode* probeLeafAndCache(const Coord&, AccessorT&) const { return this; } + const LeafNode* probeConstLeaf(const Coord&) const { return this; } + template + const LeafNode* probeConstLeafAndCache(const Coord&, AccessorT&) const { return this; } + template + const NodeT* probeConstNodeAndCache(const Coord&, AccessorT&) const + { + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (!(boost::is_same::value)) return NULL; + return reinterpret_cast(this); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + //@} + + // + // Iterators + // +protected: + typedef typename NodeMaskType::OnIterator MaskOnIter; + typedef typename NodeMaskType::OffIterator MaskOffIter; + typedef typename NodeMaskType::DenseIterator MaskDenseIter; + + template + struct ValueIter: + // Derives from SparseIteratorBase, but can also be used as a dense iterator, + // if MaskIterT is a dense mask iterator type. + public SparseIteratorBase, NodeT, ValueT> + { + typedef SparseIteratorBase BaseT; + + ValueIter() {} + ValueIter(const MaskIterT& iter, NodeT* parent): BaseT(iter, parent) {} + + const bool& getItem(Index pos) const { return this->parent().getValue(pos); } + const bool& getValue() const { return this->getItem(this->pos()); } + + // Note: setItem() can't be called on const iterators. + void setItem(Index pos, bool value) const { this->parent().setValueOnly(pos, value); } + // Note: setValue() can't be called on const iterators. + void setValue(bool value) const { this->setItem(this->pos(), value); } + + // Note: modifyItem() can't be called on const iterators. + template + void modifyItem(Index n, const ModifyOp& op) const { this->parent().modifyValue(n, op); } + // Note: modifyValue() can't be called on const iterators. + template + void modifyValue(const ModifyOp& op) const { this->modifyItem(this->pos(), op); } + }; + + /// Leaf nodes have no children, so their child iterators have no get/set accessors. + template + struct ChildIter: + public SparseIteratorBase, NodeT, bool> + { + ChildIter() {} + ChildIter(const MaskIterT& iter, NodeT* parent): SparseIteratorBase< + MaskIterT, ChildIter, NodeT, bool>(iter, parent) {} + }; + + template + struct DenseIter: public DenseIteratorBase< + MaskDenseIter, DenseIter, NodeT, /*ChildT=*/void, ValueT> + { + typedef DenseIteratorBase BaseT; + typedef typename BaseT::NonConstValueType NonConstValueT; + + DenseIter() {} + DenseIter(const MaskDenseIter& iter, NodeT* parent): BaseT(iter, parent) {} + + bool getItem(Index pos, void*& child, NonConstValueT& value) const + { + value = this->parent().getValue(pos); + child = NULL; + return false; // no child + } + + // Note: setItem() can't be called on const iterators. + //void setItem(Index pos, void* child) const {} + + // Note: unsetItem() can't be called on const iterators. + void unsetItem(Index pos, const ValueT& val) const {this->parent().setValueOnly(pos, val);} + }; + +public: + typedef ValueIter ValueOnIter; + typedef ValueIter ValueOnCIter; + typedef ValueIter ValueOffIter; + typedef ValueIter ValueOffCIter; + typedef ValueIter ValueAllIter; + typedef ValueIter ValueAllCIter; + typedef ChildIter ChildOnIter; + typedef ChildIter ChildOnCIter; + typedef ChildIter ChildOffIter; + typedef ChildIter ChildOffCIter; + typedef DenseIter ChildAllIter; + typedef DenseIter ChildAllCIter; + + ValueOnCIter cbeginValueOn() const { return ValueOnCIter(mBuffer.mData.beginOn(), this); } + ValueOnCIter beginValueOn() const { return ValueOnCIter(mBuffer.mData.beginOn(), this); } + ValueOnIter beginValueOn() { return ValueOnIter(mBuffer.mData.beginOn(), this); } + ValueOffCIter cbeginValueOff() const { return ValueOffCIter(mBuffer.mData.beginOff(), this); } + ValueOffCIter beginValueOff() const { return ValueOffCIter(mBuffer.mData.beginOff(), this); } + ValueOffIter beginValueOff() { return ValueOffIter(mBuffer.mData.beginOff(), this); } + ValueAllCIter cbeginValueAll() const { return ValueAllCIter(mBuffer.mData.beginDense(), this); } + ValueAllCIter beginValueAll() const { return ValueAllCIter(mBuffer.mData.beginDense(), this); } + ValueAllIter beginValueAll() { return ValueAllIter(mBuffer.mData.beginDense(), this); } + + ValueOnCIter cendValueOn() const { return ValueOnCIter(mBuffer.mData.endOn(), this); } + ValueOnCIter endValueOn() const { return ValueOnCIter(mBuffer.mData.endOn(), this); } + ValueOnIter endValueOn() { return ValueOnIter(mBuffer.mData.endOn(), this); } + ValueOffCIter cendValueOff() const { return ValueOffCIter(mBuffer.mData.endOff(), this); } + ValueOffCIter endValueOff() const { return ValueOffCIter(mBuffer.mData.endOff(), this); } + ValueOffIter endValueOff() { return ValueOffIter(mBuffer.mData.endOff(), this); } + ValueAllCIter cendValueAll() const { return ValueAllCIter(mBuffer.mData.endDense(), this); } + ValueAllCIter endValueAll() const { return ValueAllCIter(mBuffer.mData.endDense(), this); } + ValueAllIter endValueAll() { return ValueAllIter(mBuffer.mData.endDense(), this); } + + // Note that [c]beginChildOn() and [c]beginChildOff() actually return end iterators, + // because leaf nodes have no children. + ChildOnCIter cbeginChildOn() const { return ChildOnCIter(mBuffer.mData.endOn(), this); } + ChildOnCIter beginChildOn() const { return ChildOnCIter(mBuffer.mData.endOn(), this); } + ChildOnIter beginChildOn() { return ChildOnIter(mBuffer.mData.endOn(), this); } + ChildOffCIter cbeginChildOff() const { return ChildOffCIter(mBuffer.mData.endOff(), this); } + ChildOffCIter beginChildOff() const { return ChildOffCIter(mBuffer.mData.endOff(), this); } + ChildOffIter beginChildOff() { return ChildOffIter(mBuffer.mData.endOff(), this); } + ChildAllCIter cbeginChildAll() const { return ChildAllCIter(mBuffer.mData.beginDense(), this); } + ChildAllCIter beginChildAll() const { return ChildAllCIter(mBuffer.mData.beginDense(), this); } + ChildAllIter beginChildAll() { return ChildAllIter(mBuffer.mData.beginDense(), this); } + + ChildOnCIter cendChildOn() const { return ChildOnCIter(mBuffer.mData.endOn(), this); } + ChildOnCIter endChildOn() const { return ChildOnCIter(mBuffer.mData.endOn(), this); } + ChildOnIter endChildOn() { return ChildOnIter(mBuffer.mData.endOn(), this); } + ChildOffCIter cendChildOff() const { return ChildOffCIter(mBuffer.mData.endOff(), this); } + ChildOffCIter endChildOff() const { return ChildOffCIter(mBuffer.mData.endOff(), this); } + ChildOffIter endChildOff() { return ChildOffIter(mBuffer.mData.endOff(), this); } + ChildAllCIter cendChildAll() const { return ChildAllCIter(mBuffer.mData.endDense(), this); } + ChildAllCIter endChildAll() const { return ChildAllCIter(mBuffer.mData.endDense(), this); } + ChildAllIter endChildAll() { return ChildAllIter(mBuffer.mData.endDense(), this); } + + // + // Mask accessors + // + bool isValueMaskOn(Index n) const { return mBuffer.mData.isOn(n); } + bool isValueMaskOn() const { return mBuffer.mData.isOn(); } + bool isValueMaskOff(Index n) const { return mBuffer.mData.isOff(n); } + bool isValueMaskOff() const { return mBuffer.mData.isOff(); } + const NodeMaskType& getValueMask() const { return mBuffer.mData; } + const NodeMaskType& valueMask() const { return mBuffer.mData; } + NodeMaskType& getValueMask() { return mBuffer.mData; } + void setValueMask(const NodeMaskType& mask) { mBuffer.mData = mask; } + bool isChildMaskOn(Index) const { return false; } // leaf nodes have no children + bool isChildMaskOff(Index) const { return true; } + bool isChildMaskOff() const { return true; } +protected: + void setValueMask(Index n, bool on) { mBuffer.mData.set(n, on); } + void setValueMaskOn(Index n) { mBuffer.mData.setOn(n); } + void setValueMaskOff(Index n) { mBuffer.mData.setOff(n); } + + /// Compute the origin of the leaf node that contains the voxel with the given coordinates. + static void evalNodeOrigin(Coord& xyz) { xyz &= ~(DIM - 1); } + + template + static inline void doVisit(NodeT&, VisitorOp&); + + template + static inline void doVisit2Node(NodeT& self, OtherNodeT& other, VisitorOp&); + + template + static inline void doVisit2(NodeT& self, OtherChildAllIterT&, VisitorOp&, bool otherIsLHS); + + /// Bitmask representing the values AND state of voxels + Buffer mBuffer; + + /// Global grid index coordinates (x,y,z) of the local origin of this node + Coord mOrigin; + + // These static declarations must be on separate lines to avoid VC9 compiler errors. + static const bool sOn; + static const bool sOff; + +private: + /// @brief During topology-only construction, access is needed + /// to protected/private members of other template instances. + template friend class LeafNode; + + friend struct ValueIter; + friend struct ValueIter; + friend struct ValueIter; + friend struct ValueIter; + friend struct ValueIter; + friend struct ValueIter; + + //@{ + /// Allow iterators to call mask accessor methods (see below). + /// @todo Make mask accessors public? + friend class IteratorBase; + friend class IteratorBase; + friend class IteratorBase; + //@} + +}; // class LeafNode + + +/// @internal For consistency with other nodes and with iterators, methods like +/// LeafNode::getValue() return a reference to a value. Since it's not possible +/// to return a reference to a bit in a node mask, we return a reference to one +/// of the following static values instead. +template const bool LeafNode::sOn = true; +template const bool LeafNode::sOff = false; + + +//////////////////////////////////////// + + +template +inline +LeafNode::LeafNode() + : mOrigin(0, 0, 0) +{ +} + +template +inline +LeafNode::LeafNode(const Coord& xyz, bool value, bool) + : mBuffer(value) + , mOrigin(xyz & (~(DIM - 1))) +{ +} + + +#ifndef OPENVDB_2_ABI_COMPATIBLE +template +inline +LeafNode::LeafNode(PartialCreate, const Coord& xyz, bool value, bool) + : mBuffer(value) + , mOrigin(xyz & (~(DIM - 1))) +{ +} +#endif + + +template +inline +LeafNode::LeafNode(const LeafNode &other) + : mBuffer(other.mBuffer) + , mOrigin(other.mOrigin) +{ +} + + +// Copy-construct from a leaf node with the same configuration but a different ValueType. +template +template +inline +LeafNode::LeafNode(const LeafNode& other) + : mBuffer(other.valueMask()) + , mOrigin(other.origin()) +{ +} + + +template +template +inline +LeafNode::LeafNode(const LeafNode& other, + bool, TopologyCopy) + : mBuffer(other.valueMask())// value = active state + , mOrigin(other.origin()) +{ +} + + +template +template +inline +LeafNode::LeafNode(const LeafNode& other, TopologyCopy) + : mBuffer(other.valueMask())// value = active state + , mOrigin(other.origin()) +{ +} + + +template +template +inline +LeafNode::LeafNode(const LeafNode& other, + bool offValue, bool onValue, TopologyCopy) + : mBuffer(other.valueMask()) + , mOrigin(other.origin()) +{ + if (offValue==true) { + if (onValue==false) { + mBuffer.mData.toggle(); + } else { + mBuffer.mData.setOn(); + } + } +} + + +template +inline +LeafNode::~LeafNode() +{ +} + + +//////////////////////////////////////// + + +template +inline Index64 +LeafNode::memUsage() const +{ + return sizeof(mOrigin) + mBuffer.memUsage(); +} + + +template +inline void +LeafNode::evalActiveBoundingBox(CoordBBox& bbox, bool visitVoxels) const +{ + CoordBBox this_bbox = this->getNodeBoundingBox(); + if (bbox.isInside(this_bbox)) return;//this LeafNode is already enclosed in the bbox + if (ValueOnCIter iter = this->cbeginValueOn()) {//any active values? + if (visitVoxels) {//use voxel granularity? + this_bbox.reset(); + for(; iter; ++iter) this_bbox.expand(this->offsetToLocalCoord(iter.pos())); + this_bbox.translate(this->origin()); + } + bbox.expand(this_bbox); + } +} + + +template +template +inline bool +LeafNode::hasSameTopology(const LeafNode* other) const +{ + assert(other); + return (Log2Dim == OtherLog2Dim && mBuffer.mData == other->getValueMask()); +} + + +template +inline std::string +LeafNode::str() const +{ + std::ostringstream ostr; + ostr << "LeafNode @" << mOrigin << ": "; + for (Index32 n = 0; n < SIZE; ++n) ostr << (mBuffer.mData.isOn(n) ? '#' : '.'); + return ostr.str(); +} + + +//////////////////////////////////////// + + +template +inline Index +LeafNode::coordToOffset(const Coord& xyz) +{ + assert ((xyz[0] & (DIM-1u)) < DIM && (xyz[1] & (DIM-1u)) < DIM && (xyz[2] & (DIM-1u)) < DIM); + return ((xyz[0] & (DIM-1u)) << 2*Log2Dim) + + ((xyz[1] & (DIM-1u)) << Log2Dim) + + (xyz[2] & (DIM-1u)); +} + + +template +inline Coord +LeafNode::offsetToLocalCoord(Index n) +{ + assert(n < (1 << 3*Log2Dim)); + Coord xyz; + xyz.setX(n >> 2*Log2Dim); + n &= ((1 << 2*Log2Dim) - 1); + xyz.setY(n >> Log2Dim); + xyz.setZ(n & ((1 << Log2Dim) - 1)); + return xyz; +} + + +template +inline Coord +LeafNode::offsetToGlobalCoord(Index n) const +{ + return (this->offsetToLocalCoord(n) + this->origin()); +} + + +//////////////////////////////////////// + + +template +inline void +LeafNode::readTopology(std::istream& is, bool /*fromHalf*/) +{ + mBuffer.mData.load(is); +} + + +template +inline void +LeafNode::writeTopology(std::ostream& os, bool /*toHalf*/) const +{ + mBuffer.mData.save(os); +} + + +template +inline void +LeafNode::readBuffers(std::istream& is, const CoordBBox& clipBBox, bool fromHalf) +{ + // Boolean LeafNodes don't currently implement lazy loading. + // Instead, load the full buffer, then clip it. + + this->readBuffers(is, fromHalf); + + // Get this tree's background value. + bool background = false; + if (const void* bgPtr = io::getGridBackgroundValuePtr(is)) { + background = *static_cast(bgPtr); + } + this->clip(clipBBox, background); +} + + +template +inline void +LeafNode::readBuffers(std::istream& is, bool /*fromHalf*/) +{ + // Read in the value mask = buffer. + mBuffer.mData.load(is); + // Read in the origin. + is.read(reinterpret_cast(&mOrigin), sizeof(Coord::ValueType) * 3); +} + + +template +inline void +LeafNode::writeBuffers(std::ostream& os, bool /*toHalf*/) const +{ + // Write out the value mask = buffer. + mBuffer.mData.save(os); + // Write out the origin. + os.write(reinterpret_cast(&mOrigin), sizeof(Coord::ValueType) * 3); +} + + +//////////////////////////////////////// + + +template +inline bool +LeafNode::operator==(const LeafNode& other) const +{ + return mOrigin == other.mOrigin && mBuffer == other.mBuffer; +} + + +template +inline bool +LeafNode::operator!=(const LeafNode& other) const +{ + return !(this->operator==(other)); +} + + +//////////////////////////////////////// + + +template +inline bool +LeafNode::isConstant(bool& constValue, bool& state, bool) const +{ + state = mBuffer.mData.isOn(); + + if (!(state || mBuffer.mData.isOff())) return false; + + constValue = state; + return true; +} + + +//////////////////////////////////////// + + +template +inline void +LeafNode::addTile(Index /*level*/, const Coord& xyz, bool val, bool active) +{ + this->addTile(this->coordToOffset(xyz), val, active); +} + +template +inline void +LeafNode::addTile(Index offset, bool val, bool active) +{ + assert(offset < SIZE); + this->setValueOnly(offset, val); + this->setActiveState(offset, active); +} + +template +template +inline void +LeafNode::addTileAndCache(Index level, const Coord& xyz, + bool val, bool active, AccessorT&) +{ + this->addTile(level, xyz, val, active); +} + + +//////////////////////////////////////// + + +template +inline const bool& +LeafNode::getValue(const Coord& xyz) const +{ + // This *CANNOT* use operator ? because Visual C++ + if (mBuffer.mData.isOn(this->coordToOffset(xyz))) return sOn; else return sOff; +} + + +template +inline const bool& +LeafNode::getValue(Index offset) const +{ + assert(offset < SIZE); + // This *CANNOT* use operator ? for Windows + if (mBuffer.mData.isOn(offset)) return sOn; else return sOff; +} + + +template +inline bool +LeafNode::probeValue(const Coord& xyz, bool& val) const +{ + const Index offset = this->coordToOffset(xyz); + val = mBuffer.mData.isOn(offset); + return val; +} + + +template +inline void +LeafNode::setValueOn(const Coord& xyz, bool val) +{ + this->setValueOn(this->coordToOffset(xyz), val); +} + + +template +inline void +LeafNode::setValueOn(Index offset, bool val) +{ + assert(offset < SIZE); + mBuffer.mData.set(offset, val); +} + + +template +inline void +LeafNode::setValueOnly(const Coord& xyz, bool val) +{ + this->setValueOnly(this->coordToOffset(xyz), val); +} + + +template +inline void +LeafNode::setActiveState(const Coord& xyz, bool on) +{ + mBuffer.mData.set(this->coordToOffset(xyz), on); +} + + +template +inline void +LeafNode::setValueOff(const Coord& xyz, bool val) +{ + this->setValueOff(this->coordToOffset(xyz), val); +} + + +template +inline void +LeafNode::setValueOff(Index offset, bool val) +{ + assert(offset < SIZE); + mBuffer.mData.set(offset, val); +} + + +template +template +inline void +LeafNode::modifyValue(Index offset, const ModifyOp& op) +{ + bool val = mBuffer.mData.isOn(offset); + op(val); + mBuffer.mData.set(offset, val); +} + + +template +template +inline void +LeafNode::modifyValue(const Coord& xyz, const ModifyOp& op) +{ + this->modifyValue(this->coordToOffset(xyz), op); +} + + +template +template +inline void +LeafNode::modifyValueAndActiveState(const Coord& xyz, const ModifyOp& op) +{ + const Index offset = this->coordToOffset(xyz); + bool val = mBuffer.mData.isOn(offset), state = val; + op(val, state); + mBuffer.mData.set(offset, val); +} + + +//////////////////////////////////////// + + +template +template +inline void +LeafNode::merge(const LeafNode& other, bool /*bg*/, bool /*otherBG*/) +{ + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (Policy == MERGE_NODES) return; + mBuffer.mData |= other.mBuffer.mData; + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END +} + +template +template +inline void +LeafNode::merge(bool tileValue, bool) +{ + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (Policy != MERGE_ACTIVE_STATES_AND_NODES) return; + if (tileValue) mBuffer.mData.setOn(); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END +} + + +//////////////////////////////////////// + + +template +template +inline void +LeafNode::topologyUnion(const LeafNode& other) +{ + mBuffer.mData |= other.valueMask(); +} + + +template +template +inline void +LeafNode::topologyIntersection(const LeafNode& other, + const bool&) +{ + mBuffer.mData &= other.valueMask(); +} + + +template +template +inline void +LeafNode::topologyDifference(const LeafNode& other, + const bool&) +{ + mBuffer.mData &= !other.valueMask(); +} + + +//////////////////////////////////////// + + +template +inline void +LeafNode::clip(const CoordBBox& clipBBox, bool background) +{ + CoordBBox nodeBBox = this->getNodeBoundingBox(); + if (!clipBBox.hasOverlap(nodeBBox)) { + // This node lies completely outside the clipping region. Fill it with background tiles. + this->fill(nodeBBox, background, /*active=*/false); + } else if (clipBBox.isInside(nodeBBox)) { + // This node lies completely inside the clipping region. Leave it intact. + return; + } + + // This node isn't completely contained inside the clipping region. + // Set any voxels that lie outside the region to the background value. + + // Construct a boolean mask that is on inside the clipping region and off outside it. + NodeMaskType mask; + nodeBBox.intersect(clipBBox); + Coord xyz; + int &x = xyz.x(), &y = xyz.y(), &z = xyz.z(); + for (x = nodeBBox.min().x(); x <= nodeBBox.max().x(); ++x) { + for (y = nodeBBox.min().y(); y <= nodeBBox.max().y(); ++y) { + for (z = nodeBBox.min().z(); z <= nodeBBox.max().z(); ++z) { + mask.setOn(static_cast(this->coordToOffset(xyz))); + } + } + } + + // Set voxels that lie in the inactive region of the mask (i.e., outside + // the clipping region) to the background value. + for (MaskOffIter maskIter = mask.beginOff(); maskIter; ++maskIter) { + this->setValueOff(maskIter.pos(), background); + } +} + + +//////////////////////////////////////// + + +template +inline void +LeafNode::fill(const CoordBBox& bbox, bool value, bool) +{ + for (Int32 x = bbox.min().x(); x <= bbox.max().x(); ++x) { + const Index offsetX = (x & (DIM-1u))<<2*Log2Dim; + for (Int32 y = bbox.min().y(); y <= bbox.max().y(); ++y) { + const Index offsetXY = offsetX + ((y & (DIM-1u))<< Log2Dim); + for (Int32 z = bbox.min().z(); z <= bbox.max().z(); ++z) { + const Index offset = offsetXY + (z & (DIM-1u)); + mBuffer.mData.set(offset, value); + } + } + } +} + +template +inline void +LeafNode::fill(const bool& value, bool) +{ + mBuffer.fill(value); +} + + +//////////////////////////////////////// + + +template +template +inline void +LeafNode::copyToDense(const CoordBBox& bbox, DenseT& dense) const +{ + typedef typename DenseT::ValueType DenseValueType; + + const size_t xStride = dense.xStride(), yStride = dense.yStride(), zStride = dense.zStride(); + const Coord& min = dense.bbox().min(); + DenseValueType* t0 = dense.data() + zStride * (bbox.min()[2] - min[2]); // target array + const Int32 n0 = bbox.min()[2] & (DIM-1u); + for (Int32 x = bbox.min()[0], ex = bbox.max()[0] + 1; x < ex; ++x) { + DenseValueType* t1 = t0 + xStride * (x - min[0]); + const Int32 n1 = n0 + ((x & (DIM-1u)) << 2*LOG2DIM); + for (Int32 y = bbox.min()[1], ey = bbox.max()[1] + 1; y < ey; ++y) { + DenseValueType* t2 = t1 + yStride * (y - min[1]); + Int32 n2 = n1 + ((y & (DIM-1u)) << LOG2DIM); + for (Int32 z = bbox.min()[2], ez = bbox.max()[2] + 1; z < ez; ++z, t2 += zStride) { + *t2 = DenseValueType(mBuffer.mData.isOn(n2++)); + } + } + } +} + + +template +template +inline void +LeafNode::copyFromDense(const CoordBBox& bbox, const DenseT& dense, + bool background, bool tolerance) +{ + typedef typename DenseT::ValueType DenseValueType; + struct Local { + inline static bool toBool(const DenseValueType& v) { return !math::isZero(v); } + }; + + const size_t xStride = dense.xStride(), yStride = dense.yStride(), zStride = dense.zStride(); + const Coord& min = dense.bbox().min(); + const DenseValueType* s0 = dense.data() + zStride * (bbox.min()[2] - min[2]); // source + const Int32 n0 = bbox.min()[2] & (DIM-1u); + for (Int32 x = bbox.min()[0], ex = bbox.max()[0] + 1; x < ex; ++x) { + const DenseValueType* s1 = s0 + xStride * (x - min[0]); + const Int32 n1 = n0 + ((x & (DIM-1u)) << 2*LOG2DIM); + for (Int32 y = bbox.min()[1], ey = bbox.max()[1] + 1; y < ey; ++y) { + const DenseValueType* s2 = s1 + yStride * (y - min[1]); + Int32 n2 = n1 + ((y & (DIM-1u)) << LOG2DIM); + for (Int32 z = bbox.min()[2], ez = bbox.max()[2]+1; z < ez; ++z, ++n2, s2 += zStride) { + // Note: if tolerance is true (i.e., 1), then all boolean values compare equal. + if (tolerance || (background == Local::toBool(*s2))) { + mBuffer.mData.set(n2, background); + } else { + mBuffer.mData.set(n2, Local::toBool(*s2)); + } + } + } + } +} + + +//////////////////////////////////////// + + +template +template +inline void +LeafNode::combine(const LeafNode& other, CombineOp& op) +{ + CombineArgs args; + for (Index i = 0; i < SIZE; ++i) { + bool result = false, aVal = mBuffer.mData.isOn(i), bVal = other.mBuffer.mData.isOn(i); + op(args.setARef(aVal) + .setAIsActive(aVal) + .setBRef(bVal) + .setBIsActive(bVal) + .setResultRef(result)); + mBuffer.mData.set(i, result); + } +} + + +template +template +inline void +LeafNode::combine(bool value, bool valueIsActive, CombineOp& op) +{ + CombineArgs args; + args.setBRef(value).setBIsActive(valueIsActive); + for (Index i = 0; i < SIZE; ++i) { + bool result = false, aVal = mBuffer.mData.isOn(i); + op(args.setARef(aVal) + .setAIsActive(aVal) + .setResultRef(result)); + mBuffer.mData.set(i, result); + } +} + + +//////////////////////////////////////// + + +template +template +inline void +LeafNode::combine2(const LeafNode& other, const OtherType& value, + bool valueIsActive, CombineOp& op) +{ + CombineArgs args; + args.setBRef(value).setBIsActive(valueIsActive); + for (Index i = 0; i < SIZE; ++i) { + bool result = false, aVal = other.mBuffer.mData.isOn(i); + op(args.setARef(aVal) + .setAIsActive(aVal) + .setResultRef(result)); + mBuffer.mData.set(i, result); + } +} + + +template +template +inline void +LeafNode::combine2(bool value, const OtherNodeT& other, + bool valueIsActive, CombineOp& op) +{ + CombineArgs args; + args.setARef(value).setAIsActive(valueIsActive); + for (Index i = 0; i < SIZE; ++i) { + bool result = false, bVal = other.mBuffer.mData.isOn(i); + op(args.setBRef(bVal) + .setBIsActive(bVal) + .setResultRef(result)); + mBuffer.mData.set(i, result); + } +} + + +template +template +inline void +LeafNode::combine2(const LeafNode& b0, const OtherNodeT& b1, CombineOp& op) +{ + CombineArgs args; + for (Index i = 0; i < SIZE; ++i) { + bool result = false, b0Val = b0.mBuffer.mData.isOn(i), b1Val = b1.mBuffer.mData.isOn(i); + op(args.setARef(b0Val) + .setAIsActive(b0Val) + .setBRef(b1Val) + .setBIsActive(b1Val) + .setResultRef(result)); + mBuffer.mData.set(i, result); + } +} + + +//////////////////////////////////////// + +template +template +inline void +LeafNode::visitActiveBBox(BBoxOp& op) const +{ + if (op.template descent()) { + for (ValueOnCIter i=this->cbeginValueOn(); i; ++i) { +#ifdef _MSC_VER + op.operator()(CoordBBox::createCube(i.getCoord(), 1)); +#else + op.template operator()(CoordBBox::createCube(i.getCoord(), 1)); +#endif + } + } else { +#ifdef _MSC_VER + op.operator()(this->getNodeBoundingBox()); +#else + op.template operator()(this->getNodeBoundingBox()); +#endif + } +} + + +template +template +inline void +LeafNode::visit(VisitorOp& op) +{ + doVisit(*this, op); +} + + +template +template +inline void +LeafNode::visit(VisitorOp& op) const +{ + doVisit(*this, op); +} + + +template +template +inline void +LeafNode::doVisit(NodeT& self, VisitorOp& op) +{ + for (ChildAllIterT iter = self.beginChildAll(); iter; ++iter) { + op(iter); + } +} + + +//////////////////////////////////////// + + +template +template +inline void +LeafNode::visit2Node(OtherLeafNodeType& other, VisitorOp& op) +{ + doVisit2Node(*this, other, op); +} + + +template +template +inline void +LeafNode::visit2Node(OtherLeafNodeType& other, VisitorOp& op) const +{ + doVisit2Node(*this, other, op); +} + + +template +template< + typename NodeT, + typename OtherNodeT, + typename VisitorOp, + typename ChildAllIterT, + typename OtherChildAllIterT> +inline void +LeafNode::doVisit2Node(NodeT& self, OtherNodeT& other, VisitorOp& op) +{ + // Allow the two nodes to have different ValueTypes, but not different dimensions. + BOOST_STATIC_ASSERT(OtherNodeT::SIZE == NodeT::SIZE); + BOOST_STATIC_ASSERT(OtherNodeT::LEVEL == NodeT::LEVEL); + + ChildAllIterT iter = self.beginChildAll(); + OtherChildAllIterT otherIter = other.beginChildAll(); + + for ( ; iter && otherIter; ++iter, ++otherIter) { + op(iter, otherIter); + } +} + + +//////////////////////////////////////// + + +template +template +inline void +LeafNode::visit2(IterT& otherIter, VisitorOp& op, bool otherIsLHS) +{ + doVisit2(*this, otherIter, op, otherIsLHS); +} + + +template +template +inline void +LeafNode::visit2(IterT& otherIter, VisitorOp& op, bool otherIsLHS) const +{ + doVisit2(*this, otherIter, op, otherIsLHS); +} + + +template +template< + typename NodeT, + typename VisitorOp, + typename ChildAllIterT, + typename OtherChildAllIterT> +inline void +LeafNode::doVisit2(NodeT& self, OtherChildAllIterT& otherIter, + VisitorOp& op, bool otherIsLHS) +{ + if (!otherIter) return; + + if (otherIsLHS) { + for (ChildAllIterT iter = self.beginChildAll(); iter; ++iter) { + op(otherIter, iter); + } + } else { + for (ChildAllIterT iter = self.beginChildAll(); iter; ++iter) { + op(iter, otherIter); + } + } +} + +} // namespace tree +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TREE_LEAF_NODE_MASK_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tree/NodeManager.h b/nuparu/include/openvdb/include/openvdb/tree/NodeManager.h new file mode 100644 index 00000000..08cb0683 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tree/NodeManager.h @@ -0,0 +1,1128 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file NodeManager.h +/// +/// @author Ken Museth +/// +/// @brief NodeManager produces linear arrays of all tree nodes +/// allowing for efficient threading and bottom-up processing. +/// +/// @note A NodeManager can be constructed from a Tree or LeafManager. +/// The latter is slightly more efficient since the cached leaf nodes will be reused. + +#ifndef OPENVDB_TREE_NODEMANAGER_HAS_BEEN_INCLUDED +#define OPENVDB_TREE_NODEMANAGER_HAS_BEEN_INCLUDED + +#include +#include +#include +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tree { + +// Produce linear arrays of all tree nodes, to facilitate efficient threading +// and bottom-up processing. +template +class NodeManager; + + +//////////////////////////////////////// + + +/// @brief This class caches tree nodes of a specific type in a linear array. +/// +/// @note It is for internal use and should rarely be used directly. +template +class NodeList +{ +public: + typedef NodeT* value_type; + typedef std::deque ListT; + + NodeList() {} + + void push_back(NodeT* node) { mList.push_back(node); } + + NodeT& operator()(size_t n) const { assert(nsize();} + + class Iterator + { + public: + Iterator(const NodeRange& range, size_t pos): mRange(range), mPos(pos) + { + assert(this->isValid()); + } + Iterator& operator=(const Iterator& other) + { + mRange = other.mRange; mPos = other.mPos; return *this; + } + /// Advance to the next node. + Iterator& operator++() { ++mPos; return *this; } + /// Return a reference to the node to which this iterator is pointing. + NodeT& operator*() const { return mRange.mNodeList(mPos); } + /// Return a pointer to the node to which this iterator is pointing. + NodeT* operator->() const { return &(this->operator*()); } + /// Return the index into the list of the current node. + size_t pos() const { return mPos; } + bool isValid() const { return mPos>=mRange.mBegin && mPos<=mRange.mEnd; } + /// Return @c true if this iterator is not yet exhausted. + bool test() const { return mPos < mRange.mEnd; } + /// Return @c true if this iterator is not yet exhausted. + operator bool() const { return this->test(); } + /// Return @c true if this iterator is exhausted. + bool empty() const { return !this->test(); } + bool operator!=(const Iterator& other) const + { + return (mPos != other.mPos) || (&mRange != &other.mRange); + } + bool operator==(const Iterator& other) const { return !(*this != other); } + const NodeRange& nodeRange() const { return mRange; } + + private: + const NodeRange& mRange; + size_t mPos; + };// NodeList::NodeRange::Iterator + + Iterator begin() const {return Iterator(*this, mBegin);} + + Iterator end() const {return Iterator(*this, mEnd);} + + private: + size_t mEnd, mBegin, mGrainSize; + const NodeList& mNodeList; + + static size_t doSplit(NodeRange& r) + { + assert(r.is_divisible()); + size_t middle = r.mBegin + (r.mEnd - r.mBegin) / 2u; + r.mEnd = middle; + return middle; + } + };// NodeList::NodeRange + + /// Return a TBB-compatible NodeRange. + NodeRange nodeRange(size_t grainsize = 1) const + { + return NodeRange(0, this->nodeCount(), *this, grainsize); + } + + template + void foreach(const NodeOp& op, bool threaded = true, size_t grainSize=1) + { + NodeTransformer transform(op); + transform.run(this->nodeRange(grainSize), threaded); + } + + template + void reduce(NodeOp& op, bool threaded = true, size_t grainSize=1) + { + NodeReducer transform(op); + transform.run(this->nodeRange(grainSize), threaded); + } + +private: + + // Private struct of NodeList that performs parallel_for + template + struct NodeTransformer + { + NodeTransformer(const NodeOp& nodeOp) : mNodeOp(nodeOp) + { + } + void run(const NodeRange& range, bool threaded = true) + { + threaded ? tbb::parallel_for(range, *this) : (*this)(range); + } + void operator()(const NodeRange& range) const + { + for (typename NodeRange::Iterator it = range.begin(); it; ++it) mNodeOp(*it); + } + const NodeOp mNodeOp; + };// NodeList::NodeTransformer + + // Private struct of NodeList that performs parallel_reduce + template + struct NodeReducer + { + NodeReducer(NodeOp& nodeOp) : mNodeOp(&nodeOp), mOwnsOp(false) + { + } + NodeReducer(const NodeReducer& other, tbb::split) : + mNodeOp(new NodeOp(*(other.mNodeOp), tbb::split())), mOwnsOp(true) + { + } + ~NodeReducer() { if (mOwnsOp) delete mNodeOp; } + void run(const NodeRange& range, bool threaded = true) + { + threaded ? tbb::parallel_reduce(range, *this) : (*this)(range); + } + void operator()(const NodeRange& range) + { + NodeOp &op = *mNodeOp; + for (typename NodeRange::Iterator it = range.begin(); it; ++it) op(*it); + } + void join(const NodeReducer& other) + { + mNodeOp->join(*(other.mNodeOp)); + } + NodeOp *mNodeOp; + const bool mOwnsOp; + };// NodeList::NodeReducer + + +protected: + ListT mList; +};// NodeList + + +///////////////////////////////////////////// + + +/// @brief This class is a link in a chain that each caches tree nodes +/// of a specific type in a linear array. +/// +/// @note It is for internal use and should rarely be used directly. +template +class NodeManagerLink +{ +public: + NodeManagerLink() {} + + virtual ~NodeManagerLink() {} + + void clear() { mList.clear(); mNext.clear(); } + + template + void init(ParentT& parent, TreeOrLeafManagerT& tree) + { + parent.getNodes(mList); + for (size_t i=0, n=mList.nodeCount(); i + void rebuild(ParentT& parent) + { + mList.clear(); + parent.getNodes(mList); + for (size_t i=0, n=mList.nodeCount(); i + void foreachBottomUp(const NodeOp& op, bool threaded, size_t grainSize) + { + mNext.foreachBottomUp(op, threaded, grainSize); + mList.foreach(op, threaded, grainSize); + } + + template + void foreachTopDown(const NodeOp& op, bool threaded, size_t grainSize) + { + mList.foreach(op, threaded, grainSize); + mNext.foreachTopDown(op, threaded, grainSize); + } + + template + OPENVDB_DEPRECATED void processBottomUp(const NodeOp& op, bool threaded, size_t grainSize) + { + this->foreachBottomUp(op, threaded, grainSize); + } + + template + OPENVDB_DEPRECATED void processTopDown(const NodeOp& op, bool threaded, size_t grainSize) + { + this->foreachTopDown(op, threaded, grainSize); + } + + template + void reduceBottomUp(NodeOp& op, bool threaded, size_t grainSize) + { + mNext.reduceBottomUp(op, threaded, grainSize); + mList.reduce(op, threaded, grainSize); + } + + template + void reduceTopDown(NodeOp& op, bool threaded, size_t grainSize) + { + mList.reduce(op, threaded, grainSize); + mNext.reduceTopDown(op, threaded, grainSize); + } + +protected: + NodeList mList; + NodeManagerLink mNext; +};// NodeManagerLink class + + +//////////////////////////////////////// + + +/// @brief Specialization that terminates the chain of cached tree nodes +/// +/// @note It is for internal use and should rarely be used directly. +template +class NodeManagerLink +{ +public: + NodeManagerLink() {} + + virtual ~NodeManagerLink() {} + + /// @brief Clear all the cached tree nodes + void clear() { mList.clear(); } + + template + void rebuild(ParentT& parent) { mList.clear(); parent.getNodes(mList); } + + Index64 nodeCount() const { return mList.nodeCount(); } + + Index64 nodeCount(Index) const { return mList.nodeCount(); } + + template + void foreachBottomUp(const NodeOp& op, bool threaded, size_t grainSize) + { + mList.foreach(op, threaded, grainSize); + } + + template + void foreachTopDown(const NodeOp& op, bool threaded, size_t grainSize) + { + mList.foreach(op, threaded, grainSize); + } + + template + OPENVDB_DEPRECATED void processBottomUp(const NodeOp& op, bool threaded, size_t grainSize) + { + this->foreachBottomUp(op, threaded, grainSize); + } + + template + OPENVDB_DEPRECATED void processTopDown(const NodeOp& op, bool threaded, size_t grainSize) + { + this->foreachTopDown(op, threaded, grainSize); + } + + template + void reduceBottomUp(NodeOp& op, bool threaded, size_t grainSize) + { + mList.reduce(op, threaded, grainSize); + } + + template + void reduceTopDown(NodeOp& op, bool threaded, size_t grainSize) + { + mList.reduce(op, threaded, grainSize); + } + + template + void init(ParentT& parent, TreeOrLeafManagerT& tree) + { + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (TreeOrLeafManagerT::DEPTH == 2 && NodeT::LEVEL == 0) { + tree.getNodes(mList); + } else { + parent.getNodes(mList); + } + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } +protected: + NodeList mList; +};// NodeManagerLink class + + +//////////////////////////////////////// + + +/// @brief To facilitate threading over the nodes of a tree, cache +/// node pointers in linear arrays, one for each level of the tree. +/// +/// @details This implementation works with trees of any depth, but +/// optimized specializations are provided for the most typical tree depths. +template +class NodeManager +{ +public: + static const Index LEVELS = _LEVELS; + BOOST_STATIC_ASSERT(LEVELS > 0);//special implementation below + typedef typename TreeOrLeafManagerT::RootNodeType RootNodeType; + BOOST_STATIC_ASSERT(RootNodeType::LEVEL >= LEVELS); + + NodeManager(TreeOrLeafManagerT& tree) : mRoot(tree.root()) { mChain.init(mRoot, tree); } + + virtual ~NodeManager() {} + + /// @brief Clear all the cached tree nodes + void clear() { mChain.clear(); } + + /// @brief Clear and recache all the tree nodes from the + /// tree. This is required if tree nodes have been added or removed. + void rebuild() { mChain.rebuild(mRoot); } + + /// @brief Return a reference to the root node. + const RootNodeType& root() const { return mRoot; } + + /// @brief Return the total number of cached nodes (excluding the root node) + Index64 nodeCount() const { return mChain.nodeCount(); } + + /// @brief Return the number of cached nodes at level @a i, where + /// 0 corresponds to the lowest level. + Index64 nodeCount(Index i) const { return mChain.nodeCount(i); } + + //@{ + /// @brief Threaded method that applies a user-supplied functor + /// to all the nodes in the tree. + /// + /// @param op user-supplied functor, see examples for interface details. + /// @param threaded optional toggle to disable threading, on by default. + /// @param grainSize optional parameter to specify the grainsize + /// for threading, one by default. + /// + /// @warning The functor object is deep-copied to create TBB tasks. + /// + /// @par Example: + /// @code + /// // Functor to offset all the inactive values of a tree. Note + /// // this implementation also illustrates how different + /// // computation can be applied to the different node types. + /// template + /// struct OffsetOp + /// { + /// typedef typename TreeT::ValueType ValueT; + /// typedef typename TreeT::RootNodeType RootT; + /// typedef typename TreeT::LeafNodeType LeafT; + /// OffsetOp(const ValueT& v) : mOffset(v) {} + /// + /// // Processes the root node. Required by the NodeManager + /// void operator()(RootT& root) const + /// { + /// for (typename RootT::ValueOffIter i = root.beginValueOff(); i; ++i) *i += mOffset; + /// } + /// // Processes the leaf nodes. Required by the NodeManager + /// void operator()(LeafT& leaf) const + /// { + /// for (typename LeafT::ValueOffIter i = leaf.beginValueOff(); i; ++i) *i += mOffset; + /// } + /// // Processes the internal nodes. Required by the NodeManager + /// template + /// void operator()(NodeT& node) const + /// { + /// for (typename NodeT::ValueOffIter i = node.beginValueOff(); i; ++i) *i += mOffset; + /// } + /// private: + /// const ValueT mOffset; + /// }; + /// + /// // usage: + /// OffsetOp op(3.0f); + /// tree::NodeManager nodes(tree); + /// nodes.foreachBottomUp(op); + /// + /// // or if a LeafManager already exists + /// typedef tree::LeafManager T; + /// OffsetOp op(3.0f); + /// tree::NodeManager nodes(leafManager); + /// nodes.foreachBottomUp(op); + /// + /// @endcode + template + void foreachBottomUp(const NodeOp& op, bool threaded = true, size_t grainSize=1) + { + mChain.foreachBottomUp(op, threaded, grainSize); + op(mRoot); + } + template + void foreachTopDown(const NodeOp& op, bool threaded = true, size_t grainSize=1) + { + op(mRoot); + mChain.foreachTopDown(op, threaded, grainSize); + } + template + OPENVDB_DEPRECATED void processBottomUp(const NodeOp& op, bool threaded = true, size_t grainSize=1) + { + this->foreachBottomUp(op, threaded, grainSize); + } + template + OPENVDB_DEPRECATED void processTopDown(const NodeOp& op, bool threaded = true, size_t grainSize=1) + { + this->foreachTopDown(op, threaded, grainSize); + } + //@} + + //@{ + /// @brief Threaded method that processes nodes with a user supplied functor + /// + /// @param op user-supplied functor, see examples for interface details. + /// @param threaded optional toggle to disable threading, on by default. + /// @param grainSize optional parameter to specify the grainsize + /// for threading, one by default. + /// + /// @warning The functor object is deep-copied to create TBB tasks. + /// + /// @par Example: + /// @code + /// // Functor to count nodes in a tree + /// template + /// struct NodeCountOp + /// { + /// NodeCountOp() : nodeCount(TreeType::DEPTH, 0), totalCount(0) + /// { + /// } + /// NodeCountOp(const NodeCountOp& other, tbb::split) : + /// nodeCount(TreeType::DEPTH, 0), totalCount(0) + /// { + /// } + /// void join(const NodeCountOp& other) + /// { + /// for (size_t i = 0; i < nodeCount.size(); ++i) { + /// nodeCount[i] += other.nodeCount[i]; + /// } + /// totalCount += other.totalCount; + /// } + /// // do nothing for the root node + /// void operator()(const typename TreeT::RootNodeType& node) + /// { + /// } + /// // count the internal and leaf nodes + /// template + /// void operator()(const NodeT& node) + /// { + /// ++(nodeCount[NodeT::LEVEL]); + /// ++totalCount; + /// } + /// std::vector nodeCount; + /// openvdb::Index64 totalCount; + /// }; + /// + /// // usage: + /// NodeCountOp op; + /// tree::NodeManager nodes(tree); + /// nodes.reduceBottomUp(op); + /// + /// // or if a LeafManager already exists + /// NodeCountOp op; + /// typedef tree::LeafManager T; + /// T leafManager(tree); + /// tree::NodeManager nodes(leafManager); + /// nodes.reduceBottomUp(op); + /// + /// @endcode + template + void reduceBottomUp(NodeOp& op, bool threaded = true, size_t grainSize=1) + { + mChain.reduceBottomUp(op, threaded, grainSize); + op(mRoot); + } + + template + void reduceTopDown(NodeOp& op, bool threaded = true, size_t grainSize=1) + { + op(mRoot); + mChain.reduceTopDown(op, threaded, grainSize); + } + //@} + +protected: + RootNodeType& mRoot; + NodeManagerLink mChain; + +private: + NodeManager(const NodeManager&) {}//disallow copy-construction +};// NodeManager class + + +//////////////////////////////////////////// + + +/// Template specialization of the NodeManager with no caching of nodes +template +class NodeManager +{ +public: + typedef typename TreeOrLeafManagerT::RootNodeType RootNodeType; + static const Index LEVELS = 0; + + NodeManager(TreeOrLeafManagerT& tree) : mRoot(tree.root()) {} + + virtual ~NodeManager() {} + + /// @brief Clear all the cached tree nodes + void clear() {} + + /// @brief Clear and recache all the tree nodes from the + /// tree. This is required if tree nodes have been added or removed. + void rebuild() {} + + /// @brief Return a reference to the root node. + const RootNodeType& root() const { return mRoot; } + + /// @brief Return the total number of cached nodes (excluding the root node) + Index64 nodeCount() const { return 0; } + + Index64 nodeCount(Index) const { return 0; } + + template + OPENVDB_DEPRECATED void processBottomUp(const NodeOp& op, bool, size_t) { op(mRoot); } + + template + OPENVDB_DEPRECATED void processTopDown(const NodeOp& op, bool, size_t) { op(mRoot); } + + template + void foreachBottomUp(const NodeOp& op, bool, size_t) { op(mRoot); } + + template + void foreachTopDown(const NodeOp& op, bool, size_t) { op(mRoot); } + + template + void reduceBottomUp(NodeOp& op, bool, size_t) { op(mRoot); } + + template + void reduceTopDown(NodeOp& op, bool, size_t) { op(mRoot); } + +protected: + RootNodeType& mRoot; + +private: + NodeManager(const NodeManager&) {} // disallow copy-construction +}; // NodeManager<0> + + +//////////////////////////////////////////// + + +/// Template specialization of the NodeManager with one level of nodes +template +class NodeManager +{ +public: + typedef typename TreeOrLeafManagerT::RootNodeType RootNodeType; + BOOST_STATIC_ASSERT(RootNodeType::LEVEL > 0); + static const Index LEVELS = 1; + + NodeManager(TreeOrLeafManagerT& tree) : mRoot(tree.root()) + { + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (TreeOrLeafManagerT::DEPTH == 2 && NodeT0::LEVEL == 0) { + tree.getNodes(mList0); + } else { + mRoot.getNodes(mList0); + } + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + + virtual ~NodeManager() {} + + /// @brief Clear all the cached tree nodes + void clear() { mList0.clear(); } + + /// @brief Clear and recache all the tree nodes from the + /// tree. This is required if tree nodes have been added or removed. + void rebuild() { mList0.clear(); mRoot.getNodes(mList0); } + + /// @brief Return a reference to the root node. + const RootNodeType& root() const { return mRoot; } + + /// @brief Return the total number of cached nodes (excluding the root node) + Index64 nodeCount() const { return mList0.nodeCount(); } + + /// @brief Return the number of cached nodes at level @a i, where + /// 0 corresponds to the lowest level. + Index64 nodeCount(Index i) const { return i==0 ? mList0.nodeCount() : 0; } + + template + void foreachBottomUp(const NodeOp& op, bool threaded = true, size_t grainSize=1) + { + mList0.foreach(op, threaded, grainSize); + op(mRoot); + } + + template + void foreachTopDown(const NodeOp& op, bool threaded = true, size_t grainSize=1) + { + op(mRoot); + mList0.foreach(op, threaded, grainSize); + } + template + OPENVDB_DEPRECATED void processBottomUp(const NodeOp& op, bool threaded = true, size_t grainSize=1) + { + this->foreachBottomUp(op, threaded, grainSize); + } + + template + OPENVDB_DEPRECATED void processTopDown(const NodeOp& op, bool threaded = true, size_t grainSize=1) + { + this->foreachTopDown(op, threaded, grainSize); + } + + template + void reduceBottomUp(NodeOp& op, bool threaded = true, size_t grainSize=1) + { + mList0.reduce(op, threaded, grainSize); + op(mRoot); + } + + template + void reduceTopDown(NodeOp& op, bool threaded = true, size_t grainSize=1) + { + op(mRoot); + mList0.reduce(op, threaded, grainSize); + } + +protected: + typedef RootNodeType NodeT1; + typedef typename NodeT1::ChildNodeType NodeT0; + typedef NodeList ListT0; + + NodeT1& mRoot; + ListT0 mList0; + +private: + NodeManager(const NodeManager&) {} // disallow copy-construction +}; // NodeManager<1> + + +//////////////////////////////////////////// + + +/// Template specialization of the NodeManager with two levels of nodes +template +class NodeManager +{ +public: + typedef typename TreeOrLeafManagerT::RootNodeType RootNodeType; + BOOST_STATIC_ASSERT(RootNodeType::LEVEL > 1); + static const Index LEVELS = 2; + + NodeManager(TreeOrLeafManagerT& tree) : mRoot(tree.root()) + { + mRoot.getNodes(mList1); + + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (TreeOrLeafManagerT::DEPTH == 2 && NodeT0::LEVEL == 0) { + tree.getNodes(mList0); + } else { + for (size_t i=0, n=mList1.nodeCount(); iclear(); + mRoot.getNodes(mList1); + for (size_t i=0, n=mList1.nodeCount(); i + void foreachBottomUp(const NodeOp& op, bool threaded = true, size_t grainSize=1) + { + mList0.foreach(op, threaded, grainSize); + mList1.foreach(op, threaded, grainSize); + op(mRoot); + } + + template + void foreachTopDown(const NodeOp& op, bool threaded = true, size_t grainSize=1) + { + op(mRoot); + mList1.foreach(op, threaded, grainSize); + mList0.foreach(op, threaded, grainSize); + } + + template + OPENVDB_DEPRECATED void processBottomUp(const NodeOp& op, bool threaded = true, size_t grainSize=1) + { + this->foreachBottomUp(op, threaded, grainSize); + } + + template + OPENVDB_DEPRECATED void processTopDown(const NodeOp& op, bool threaded = true, size_t grainSize=1) + { + this->foreachTopDown(op, threaded, grainSize); + } + + template + void reduceBottomUp(NodeOp& op, bool threaded = true, size_t grainSize=1) + { + mList0.reduce(op, threaded, grainSize); + mList1.reduce(op, threaded, grainSize); + op(mRoot); + } + + template + void reduceTopDown(NodeOp& op, bool threaded = true, size_t grainSize=1) + { + op(mRoot); + mList1.reduce(op, threaded, grainSize); + mList0.reduce(op, threaded, grainSize); + } + +protected: + typedef RootNodeType NodeT2; + typedef typename NodeT2::ChildNodeType NodeT1;//upper level + typedef typename NodeT1::ChildNodeType NodeT0;//lower level + + typedef NodeList ListT1;//upper level + typedef NodeList ListT0;//lower level + + NodeT2& mRoot; + ListT1 mList1; + ListT0 mList0; + +private: + NodeManager(const NodeManager&) {} // disallow copy-construction +}; // NodeManager<2> + + +//////////////////////////////////////////// + + +/// Template specialization of the NodeManager with three levels of nodes +template +class NodeManager +{ +public: + typedef typename TreeOrLeafManagerT::RootNodeType RootNodeType; + BOOST_STATIC_ASSERT(RootNodeType::LEVEL > 2); + static const Index LEVELS = 3; + + NodeManager(TreeOrLeafManagerT& tree) : mRoot(tree.root()) + { + mRoot.getNodes(mList2); + for (size_t i=0, n=mList2.nodeCount(); iclear(); + mRoot.getNodes(mList2); + for (size_t i=0, n=mList2.nodeCount(); i + void foreachBottomUp(const NodeOp& op, bool threaded = true, size_t grainSize=1) + { + mList0.foreach(op, threaded, grainSize); + mList1.foreach(op, threaded, grainSize); + mList2.foreach(op, threaded, grainSize); + op(mRoot); + } + + template + void foreachTopDown(const NodeOp& op, bool threaded = true, size_t grainSize=1) + { + op(mRoot); + mList2.foreach(op, threaded, grainSize); + mList1.foreach(op, threaded, grainSize); + mList0.foreach(op, threaded, grainSize); + } + + template + OPENVDB_DEPRECATED void processBottomUp(const NodeOp& op, bool threaded = true, size_t grainSize=1) + { + this->foreachBottomUp(op, threaded, grainSize); + } + + template + OPENVDB_DEPRECATED void processTopDown(const NodeOp& op, bool threaded = true, size_t grainSize=1) + { + this->foreachTopDown(op, threaded, grainSize); + } + + template + void reduceBottomUp(NodeOp& op, bool threaded = true, size_t grainSize=1) + { + mList0.reduce(op, threaded, grainSize); + mList1.reduce(op, threaded, grainSize); + mList2.reduce(op, threaded, grainSize); + op(mRoot); + } + + template + void reduceTopDown(NodeOp& op, bool threaded = true, size_t grainSize=1) + { + op(mRoot); + mList2.reduce(op, threaded, grainSize); + mList1.reduce(op, threaded, grainSize); + mList0.reduce(op, threaded, grainSize); + } + +protected: + typedef RootNodeType NodeT3; + typedef typename NodeT3::ChildNodeType NodeT2;//upper level + typedef typename NodeT2::ChildNodeType NodeT1;//mid level + typedef typename NodeT1::ChildNodeType NodeT0;//lower level + + typedef NodeList ListT2;//upper level of internal nodes + typedef NodeList ListT1;//lower level of internal nodes + typedef NodeList ListT0;//lower level of internal nodes or leafs + + NodeT3& mRoot; + ListT2 mList2; + ListT1 mList1; + ListT0 mList0; + +private: + NodeManager(const NodeManager&) {} // disallow copy-construction +}; // NodeManager<3> + + +//////////////////////////////////////////// + + +/// Template specialization of the NodeManager with four levels of nodes +template +class NodeManager +{ +public: + typedef typename TreeOrLeafManagerT::RootNodeType RootNodeType; + BOOST_STATIC_ASSERT(RootNodeType::LEVEL > 3); + static const Index LEVELS = 4; + + NodeManager(TreeOrLeafManagerT& tree) : mRoot(tree.root()) + { + mRoot.getNodes(mList3); + for (size_t i=0, n=mList3.nodeCount(); iclear(); + mRoot.getNodes(mList3); + for (size_t i=0, n=mList3.nodeCount(); i + void foreachBottomUp(const NodeOp& op, bool threaded = true, size_t grainSize=1) + { + mList0.foreach(op, threaded, grainSize); + mList1.foreach(op, threaded, grainSize); + mList2.foreach(op, threaded, grainSize); + mList3.foreach(op, threaded, grainSize); + op(mRoot); + } + + template + void foreachTopDown(const NodeOp& op, bool threaded = true, size_t grainSize=1) + { + op(mRoot); + mList3.foreach(op, threaded, grainSize); + mList2.foreach(op, threaded, grainSize); + mList1.foreach(op, threaded, grainSize); + mList0.foreach(op, threaded, grainSize); + } + + template + OPENVDB_DEPRECATED void processBottomUp(const NodeOp& op, bool threaded = true, size_t grainSize=1) + { + this->foreachBottomUp(op, threaded, grainSize); + } + + template + OPENVDB_DEPRECATED void processTopDown(const NodeOp& op, bool threaded = true, size_t grainSize=1) + { + this->foreachTopDown(op, threaded, grainSize); + } + + template + void reduceBottomUp(NodeOp& op, bool threaded = true, size_t grainSize=1) + { + mList0.reduce(op, threaded, grainSize); + mList1.reduce(op, threaded, grainSize); + mList2.reduce(op, threaded, grainSize); + mList3.reduce(op, threaded, grainSize); + op(mRoot); + } + + template + void reduceTopDown(NodeOp& op, bool threaded = true, size_t grainSize=1) + { + op(mRoot); + mList3.reduce(op, threaded, grainSize); + mList2.reduce(op, threaded, grainSize); + mList1.reduce(op, threaded, grainSize); + mList0.reduce(op, threaded, grainSize); + } + +protected: + typedef RootNodeType NodeT4; + typedef typename NodeT4::ChildNodeType NodeT3;//upper level + typedef typename NodeT3::ChildNodeType NodeT2;//upper mid level + typedef typename NodeT2::ChildNodeType NodeT1;//lower mid level + typedef typename NodeT1::ChildNodeType NodeT0;//lower level + + typedef NodeList ListT3;//upper level of internal nodes + typedef NodeList ListT2;//upper mid level of internal nodes + typedef NodeList ListT1;//lower mid level of internal nodes + typedef NodeList ListT0;//lower level of internal nodes or leafs + + NodeT4& mRoot; + ListT3 mList3; + ListT2 mList2; + ListT1 mList1; + ListT0 mList0; + +private: + NodeManager(const NodeManager&) {} // disallow copy-construction +}; // NodeManager<4> + +} // namespace tree +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TREE_NODEMANAGER_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tree/NodeUnion.h b/nuparu/include/openvdb/include/openvdb/tree/NodeUnion.h new file mode 100644 index 00000000..c2e4097d --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tree/NodeUnion.h @@ -0,0 +1,137 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file NodeUnion.h +/// +/// @author Peter Cucka +/// +/// NodeUnion is a templated helper class that controls access to either +/// the child node pointer or the value for a particular element of a root +/// or internal node. For space efficiency, the child pointer and the value +/// are unioned, since the two are never in use simultaneously. +/// Template specializations of NodeUnion allow for values of either POD +/// (int, float, pointer, etc.) or class (std::string, math::Vec, etc.) types. +/// (The latter cannot be stored directly in a union.) + +#ifndef OPENVDB_TREE_NODEUNION_HAS_BEEN_INCLUDED +#define OPENVDB_TREE_NODEUNION_HAS_BEEN_INCLUDED + +#include +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tree { + +// Internal implementation of a union of a child node pointer and a value +template class NodeUnionImpl; + + +// Partial specialization for values of non-class types +// (int, float, pointer, etc.) that stores elements by value +template +class NodeUnionImpl +{ +private: + union { ChildT* child; ValueT value; } mUnion; + +public: + NodeUnionImpl() { setChild(NULL); } + + ChildT* getChild() const { return mUnion.child; } + const ValueT& getValue() const { return mUnion.value; } + ValueT& getValue() { return mUnion.value; } + void setChild(ChildT* child) { mUnion.child = child; } + void setValue(const ValueT& val) { mUnion.value = val; } +}; + + +// Partial specialization for values of class types (std::string, +// math::Vec, etc.) that stores elements by pointer +template +class NodeUnionImpl +{ +private: + union { ChildT* child; ValueT* value; } mUnion; + bool mHasChild; + +public: + NodeUnionImpl(): mHasChild(true) { setChild(NULL); } + NodeUnionImpl(const NodeUnionImpl& other) + { + if (other.mHasChild) setChild(other.getChild()); + else setValue(other.getValue()); + } + NodeUnionImpl& operator=(const NodeUnionImpl& other) + { + if (other.mHasChild) setChild(other.getChild()); + else setValue(other.getValue()); + } + ~NodeUnionImpl() { setChild(NULL); } + + ChildT* getChild() const + { return mHasChild ? mUnion.child : NULL; } + void setChild(ChildT* child) + { + if (!mHasChild) delete mUnion.value; + mUnion.child = child; + mHasChild = true; + } + + const ValueT& getValue() const { return *mUnion.value; } + ValueT& getValue() { return *mUnion.value; } + void setValue(const ValueT& val) + { + /// @todo To minimize storage across nodes, intern and reuse + /// common values, using, e.g., boost::flyweight. + if (!mHasChild) delete mUnion.value; + mUnion.value = new ValueT(val); + mHasChild = false; + } +}; + + +template +struct NodeUnion: public NodeUnionImpl< + boost::is_class::value, ValueT, ChildT> +{ + NodeUnion() {} +}; + +} // namespace tree +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TREE_NODEUNION_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tree/RootNode.h b/nuparu/include/openvdb/include/openvdb/tree/RootNode.h new file mode 100644 index 00000000..c8f28594 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tree/RootNode.h @@ -0,0 +1,3411 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +/// +/// @file RootNode.h +/// +/// @brief The root node of an OpenVDB tree + +#ifndef OPENVDB_TREE_ROOTNODE_HAS_BEEN_INCLUDED +#define OPENVDB_TREE_ROOTNODE_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include //for boost::mpl::vector +#include +#include +#include +#include +#include +#include +#include // for truncateRealToHalf() +#include // for isZero(), isExactlyEqual(), etc. +#include +#include // for backward compatibility only (see readTopology()) +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tree { + +// Forward declarations +template struct NodeChain; +template struct SameRootConfig; +template struct RootNodeCopyHelper; +template struct RootNodeCombineHelper; + + +template +class RootNode +{ +public: + typedef ChildType ChildNodeType; + typedef typename ChildType::LeafNodeType LeafNodeType; + typedef typename ChildType::ValueType ValueType; + typedef typename ChildType::BuildType BuildType; + + static const Index LEVEL = 1 + ChildType::LEVEL; // level 0 = leaf + + /// NodeChainType is a list of this tree's node types, from LeafNodeType to RootNode. + typedef typename NodeChain::Type NodeChainType; + BOOST_STATIC_ASSERT(boost::mpl::size::value == LEVEL + 1); + + /// @brief ValueConverter::Type is the type of a RootNode having the same + /// child hierarchy as this node but a different value type, T. + template + struct ValueConverter { + typedef RootNode::Type> Type; + }; + + /// @brief SameConfiguration::value is @c true if and only if + /// OtherNodeType is the type of a RootNode whose ChildNodeType has the same + /// configuration as this node's ChildNodeType. + template + struct SameConfiguration { + static const bool value = SameRootConfig::value; + }; + + + /// Construct a new tree with a background value of 0. + RootNode(); + + /// Construct a new tree with the given background value. + explicit RootNode(const ValueType& background); + + RootNode(const RootNode& other) { *this = other; } + + /// @brief Construct a new tree that reproduces the topology and active states + /// of a tree of a different ValueType but the same configuration (levels, + /// node dimensions and branching factors). Cast the other tree's values to + /// this tree's ValueType. + /// @throw TypeError if the other tree's configuration doesn't match this tree's + /// or if this tree's ValueType is not constructible from the other tree's ValueType. + template + explicit RootNode(const RootNode& other) { *this = other; } + + /// @brief Construct a new tree that reproduces the topology and active states of + /// another tree (which may have a different ValueType), but not the other tree's values. + /// @details All tiles and voxels that are active in the other tree are set to + /// @a foreground in the new tree, and all inactive tiles and voxels are set to @a background. + /// @param other the root node of a tree having (possibly) a different ValueType + /// @param background the value to which inactive tiles and voxels are initialized + /// @param foreground the value to which active tiles and voxels are initialized + /// @throw TypeError if the other tree's configuration doesn't match this tree's. + template + RootNode(const RootNode& other, + const ValueType& background, const ValueType& foreground, TopologyCopy); + + /// @brief Construct a new tree that reproduces the topology and active states of + /// another tree (which may have a different ValueType), but not the other tree's values. + /// All tiles and voxels in the new tree are set to @a background regardless of + /// their active states in the other tree. + /// @param other the root node of a tree having (possibly) a different ValueType + /// @param background the value to which inactive tiles and voxels are initialized + /// @note This copy constructor is generally faster than the one that takes both + /// a foreground and a background value. Its main application is in multithreaded + /// operations where the topology of the output tree exactly matches the input tree. + /// @throw TypeError if the other tree's configuration doesn't match this tree's. + template + RootNode(const RootNode& other, const ValueType& background, TopologyCopy); + + /// @brief Copy a root node of the same type as this node. + RootNode& operator=(const RootNode& other); + /// @brief Copy a root node of the same tree configuration as this node + /// but a different ValueType. + /// @throw TypeError if the other tree's configuration doesn't match this tree's. + /// @note This node's ValueType must be constructible from the other node's ValueType. + /// For example, a root node with values of type float can be assigned to a root node + /// with values of type Vec3s, because a Vec3s can be constructed from a float. + /// But a Vec3s root node cannot be assigned to a float root node. + template + RootNode& operator=(const RootNode& other); + + ~RootNode() { this->clear(); } + +private: + struct Tile { + Tile(): value(zeroVal()), active(false) {} + Tile(const ValueType& v, bool b): value(v), active(b) {} + ValueType value; + bool active; + }; + + // This lightweight struct pairs child pointers and tiles. + struct NodeStruct { + ChildType* child; + Tile tile; + + NodeStruct(): child(NULL) {} + NodeStruct(ChildType& c): child(&c) {} + NodeStruct(const Tile& t): child(NULL), tile(t) {} + ~NodeStruct() {} ///< @note doesn't delete child + + bool isChild() const { return child != NULL; } + bool isTile() const { return child == NULL; } + bool isTileOff() const { return isTile() && !tile.active; } + bool isTileOn() const { return isTile() && tile.active; } + + void set(ChildType& c) { delete child; child = &c; } + void set(const Tile& t) { delete child; child = NULL; tile = t; } + ChildType& steal(const Tile& t) { ChildType* c = child; child = NULL; tile = t; return *c; } + }; + + typedef std::map MapType; + typedef typename MapType::iterator MapIter; + typedef typename MapType::const_iterator MapCIter; + + typedef std::set CoordSet; + typedef typename CoordSet::iterator CoordSetIter; + typedef typename CoordSet::const_iterator CoordSetCIter; + + static void setTile(const MapIter& i, const Tile& t) { i->second.set(t); } + static void setChild(const MapIter& i, ChildType& c) { i->second.set(c); } + static Tile& getTile(const MapIter& i) { return i->second.tile; } + static const Tile& getTile(const MapCIter& i) { return i->second.tile; } + static ChildType& getChild(const MapIter& i) { return *(i->second.child); } + static const ChildType& getChild(const MapCIter& i) { return *(i->second.child); } + static ChildType& stealChild(const MapIter& i, const Tile& t) {return i->second.steal(t);} + static const ChildType& stealChild(const MapCIter& i,const Tile& t) {return i->second.steal(t);} + + static bool isChild(const MapCIter& i) { return i->second.isChild(); } + static bool isChild(const MapIter& i) { return i->second.isChild(); } + static bool isTile(const MapCIter& i) { return i->second.isTile(); } + static bool isTile(const MapIter& i) { return i->second.isTile(); } + static bool isTileOff(const MapCIter& i) { return i->second.isTileOff(); } + static bool isTileOff(const MapIter& i) { return i->second.isTileOff(); } + static bool isTileOn(const MapCIter& i) { return i->second.isTileOn(); } + static bool isTileOn(const MapIter& i) { return i->second.isTileOn(); } + + struct NullPred { + static inline bool test(const MapIter&) { return true; } + static inline bool test(const MapCIter&) { return true; } + }; + struct ValueOnPred { + static inline bool test(const MapIter& i) { return isTileOn(i); } + static inline bool test(const MapCIter& i) { return isTileOn(i); } + }; + struct ValueOffPred { + static inline bool test(const MapIter& i) { return isTileOff(i); } + static inline bool test(const MapCIter& i) { return isTileOff(i); } + }; + struct ValueAllPred { + static inline bool test(const MapIter& i) { return isTile(i); } + static inline bool test(const MapCIter& i) { return isTile(i); } + }; + struct ChildOnPred { + static inline bool test(const MapIter& i) { return isChild(i); } + static inline bool test(const MapCIter& i) { return isChild(i); } + }; + struct ChildOffPred { + static inline bool test(const MapIter& i) { return isTile(i); } + static inline bool test(const MapCIter& i) { return isTile(i); } + }; + + template + class BaseIter + { + public: + typedef _RootNodeT RootNodeT; + typedef _MapIterT MapIterT; // either MapIter or MapCIter + + bool operator==(const BaseIter& other) const + { + return (mParentNode == other.mParentNode) && (mIter == other.mIter); + } + bool operator!=(const BaseIter& other) const { return !(*this == other); } + + RootNodeT* getParentNode() const { return mParentNode; } + /// Return a reference to the node over which this iterator iterates. + RootNodeT& parent() const + { + if (!mParentNode) OPENVDB_THROW(ValueError, "iterator references a null parent node"); + return *mParentNode; + } + + bool test() const { assert(mParentNode); return mIter != mParentNode->mTable.end(); } + operator bool() const { return this->test(); } + + void increment() { ++mIter; this->skip(); } + bool next() { this->increment(); return this->test(); } + void increment(Index n) { for (int i = 0; i < n && this->next(); ++i) {} } + + /// @brief Return this iterator's position as an offset from + /// the beginning of the parent node's map. + Index pos() const + { + return !mParentNode ? 0U : Index(std::distance(mParentNode->mTable.begin(), mIter)); + } + + bool isValueOn() const { return RootNodeT::isTileOn(mIter); } + bool isValueOff() const { return RootNodeT::isTileOff(mIter); } + void setValueOn(bool on = true) const { mIter->second.tile.active = on; } + void setValueOff() const { mIter->second.tile.active = false; } + + /// Return the coordinates of the item to which this iterator is pointing. + Coord getCoord() const { return mIter->first; } + /// Return in @a xyz the coordinates of the item to which this iterator is pointing. + void getCoord(Coord& xyz) const { xyz = this->getCoord(); } + + protected: + BaseIter(): mParentNode(NULL) {} + BaseIter(RootNodeT& parent, const MapIterT& iter): mParentNode(&parent), mIter(iter) {} + + void skip() { while (this->test() && !FilterPredT::test(mIter)) ++mIter; } + + RootNodeT* mParentNode; + MapIterT mIter; + }; // BaseIter + + template + class ChildIter: public BaseIter + { + public: + typedef BaseIter BaseT; + typedef RootNodeT NodeType; + typedef NodeType ValueType; + typedef ChildNodeT ChildNodeType; + typedef typename boost::remove_const::type NonConstNodeType; + typedef typename boost::remove_const::type NonConstValueType; + typedef typename boost::remove_const::type NonConstChildNodeType; + using BaseT::mIter; + + ChildIter() {} + ChildIter(RootNodeT& parent, const MapIterT& iter): BaseT(parent, iter) { BaseT::skip(); } + + ChildIter& operator++() { BaseT::increment(); return *this; } + + ChildNodeT& getValue() const { return getChild(mIter); } + ChildNodeT& operator*() const { return this->getValue(); } + ChildNodeT* operator->() const { return &this->getValue(); } + }; // ChildIter + + template + class ValueIter: public BaseIter + { + public: + typedef BaseIter BaseT; + typedef RootNodeT NodeType; + typedef ValueT ValueType; + typedef typename boost::remove_const::type NonConstNodeType; + typedef typename boost::remove_const::type NonConstValueType; + using BaseT::mIter; + + ValueIter() {} + ValueIter(RootNodeT& parent, const MapIterT& iter): BaseT(parent, iter) { BaseT::skip(); } + + ValueIter& operator++() { BaseT::increment(); return *this; } + + ValueT& getValue() const { return getTile(mIter).value; } + ValueT& operator*() const { return this->getValue(); } + ValueT* operator->() const { return &(this->getValue()); } + + void setValue(const ValueT& v) const { assert(isTile(mIter)); getTile(mIter).value = v; } + + template + void modifyValue(const ModifyOp& op) const + { + assert(isTile(mIter)); + op(getTile(mIter).value); + } + }; // ValueIter + + template + class DenseIter: public BaseIter + { + public: + typedef BaseIter BaseT; + typedef RootNodeT NodeType; + typedef ValueT ValueType; + typedef ChildNodeT ChildNodeType; + typedef typename boost::remove_const::type NonConstNodeType; + typedef typename boost::remove_const::type NonConstValueType; + typedef typename boost::remove_const::type NonConstChildNodeType; + using BaseT::mIter; + + DenseIter() {} + DenseIter(RootNodeT& parent, const MapIterT& iter): BaseT(parent, iter) {} + + DenseIter& operator++() { BaseT::increment(); return *this; } + + bool isChildNode() const { return isChild(mIter); } + + ChildNodeT* probeChild(NonConstValueType& value) const + { + if (isChild(mIter)) return &getChild(mIter); + value = getTile(mIter).value; + return NULL; + } + bool probeChild(ChildNodeT*& child, NonConstValueType& value) const + { + child = this->probeChild(value); + return child != NULL; + } + bool probeValue(NonConstValueType& value) const { return !this->probeChild(value); } + + void setChild(ChildNodeT& c) const { RootNodeT::setChild(mIter, c); } + void setChild(ChildNodeT* c) const { assert(c != NULL); RootNodeT::setChild(mIter, *c); } + void setValue(const ValueT& v) const + { + if (isTile(mIter)) getTile(mIter).value = v; + /// @internal For consistency with iterators for other node types + /// (see, e.g., InternalNode::DenseIter::unsetItem()), we don't call + /// setTile() here, because that would also delete the child. + else stealChild(mIter, Tile(v, /*active=*/true)); + } + }; // DenseIter + +public: + typedef ChildIter ChildOnIter; + typedef ChildIter ChildOnCIter; + typedef ValueIter ChildOffIter; + typedef ValueIter ChildOffCIter; + typedef DenseIter ChildAllIter; + typedef DenseIter ChildAllCIter; + + typedef ValueIter ValueOnIter; + typedef ValueIter ValueOnCIter; + typedef ValueIter ValueOffIter; + typedef ValueIter ValueOffCIter; + typedef ValueIter ValueAllIter; + typedef ValueIter ValueAllCIter; + + + ChildOnCIter cbeginChildOn() const { return ChildOnCIter(*this, mTable.begin()); } + ChildOffCIter cbeginChildOff() const { return ChildOffCIter(*this, mTable.begin()); } + ChildAllCIter cbeginChildAll() const { return ChildAllCIter(*this, mTable.begin()); } + ChildOnCIter beginChildOn() const { return cbeginChildOn(); } + ChildOffCIter beginChildOff() const { return cbeginChildOff(); } + ChildAllCIter beginChildAll() const { return cbeginChildAll(); } + ChildOnIter beginChildOn() { return ChildOnIter(*this, mTable.begin()); } + ChildOffIter beginChildOff() { return ChildOffIter(*this, mTable.begin()); } + ChildAllIter beginChildAll() { return ChildAllIter(*this, mTable.begin()); } + + ValueOnCIter cbeginValueOn() const { return ValueOnCIter(*this, mTable.begin()); } + ValueOffCIter cbeginValueOff() const { return ValueOffCIter(*this, mTable.begin()); } + ValueAllCIter cbeginValueAll() const { return ValueAllCIter(*this, mTable.begin()); } + ValueOnCIter beginValueOn() const { return cbeginValueOn(); } + ValueOffCIter beginValueOff() const { return cbeginValueOff(); } + ValueAllCIter beginValueAll() const { return cbeginValueAll(); } + ValueOnIter beginValueOn() { return ValueOnIter(*this, mTable.begin()); } + ValueOffIter beginValueOff() { return ValueOffIter(*this, mTable.begin()); } + ValueAllIter beginValueAll() { return ValueAllIter(*this, mTable.begin()); } + + /// Return the total amount of memory in bytes occupied by this node and its children. + Index64 memUsage() const; + + /// @brief Expand the specified bbox so it includes the active tiles of + /// this root node as well as all the active values in its child + /// nodes. If visitVoxels is false LeafNodes will be approximated + /// as dense, i.e. with all voxels active. Else the individual + /// active voxels are visited to produce a tight bbox. + void evalActiveBoundingBox(CoordBBox& bbox, bool visitVoxels = true) const; + + /// Return the bounding box of this RootNode, i.e., an infinite bounding box. + static CoordBBox getNodeBoundingBox() { return CoordBBox::inf(); } + + /// @brief Change inactive tiles or voxels with a value equal to +/- the + /// old background to the specified value (with the same sign). Active values + /// are unchanged. + /// + /// @param value The new background value + /// @param updateChildNodes If true the background values of the + /// child nodes is also updated. Else only the background value + /// stored in the RootNode itself is changed. + /// + /// @note Instead of setting @a updateChildNodes to true, consider + /// using tools::changeBackground or + /// tools::changeLevelSetBackground which are multi-threaded! + void setBackground(const ValueType& value, bool updateChildNodes); + + /// Return this node's background value. + const ValueType& background() const { return mBackground; } + + /// Return @c true if the given tile is inactive and has the background value. + bool isBackgroundTile(const Tile&) const; + //@{ + /// Return @c true if the given iterator points to an inactive tile with the background value. + bool isBackgroundTile(const MapIter&) const; + bool isBackgroundTile(const MapCIter&) const; + //@} + + /// Return the number of background tiles. + size_t numBackgroundTiles() const; + /// @brief Remove all background tiles. + /// @return the number of tiles removed. + size_t eraseBackgroundTiles(); + inline void clear(); + + /// Return @c true if this node's table is either empty or contains only background tiles. + bool empty() const { return mTable.size() == numBackgroundTiles(); } + + /// @brief Expand this node's table so that (x, y, z) is included in the index range. + /// @return @c true if an expansion was performed (i.e., if (x, y, z) was not already + /// included in the index range). + bool expand(const Coord& xyz); + + static Index getLevel() { return LEVEL; } + static void getNodeLog2Dims(std::vector& dims); + static Index getChildDim() { return ChildType::DIM; } + + /// Return the number of entries in this node's table. + Index getTableSize() const { return static_cast(mTable.size()); } + + Index getWidth() const { return this->getMaxIndex()[0] - this->getMinIndex()[0]; } + Index getHeight() const { return this->getMaxIndex()[1] - this->getMinIndex()[1]; } + Index getDepth() const { return this->getMaxIndex()[2] - this->getMinIndex()[2]; } + + /// Return the smallest index of the current tree. + Coord getMinIndex() const; + /// Return the largest index of the current tree. + Coord getMaxIndex() const; + /// Return the current index range. Both min and max are inclusive. + void getIndexRange(CoordBBox& bbox) const; + + /// @brief Return @c true if the given tree has the same node and active value + /// topology as this tree (but possibly a different @c ValueType). + template + bool hasSameTopology(const RootNode& other) const; + + /// Return @c false if the other node's dimensions don't match this node's. + template + static bool hasSameConfiguration(const RootNode& other); + + /// Return @c true if values of the other node's ValueType can be converted + /// to values of this node's ValueType. + template + static bool hasCompatibleValueType(const RootNode& other); + + Index32 leafCount() const; + Index32 nonLeafCount() const; + Index64 onVoxelCount() const; + Index64 offVoxelCount() const; + Index64 onLeafVoxelCount() const; + Index64 offLeafVoxelCount() const; + Index64 onTileCount() const; + + bool isValueOn(const Coord& xyz) const; + + bool hasActiveTiles() const; + + const ValueType& getValue(const Coord& xyz) const; + bool probeValue(const Coord& xyz, ValueType& value) const; + + /// @brief Return the tree depth (0 = root) at which the value of voxel (x, y, z) resides. + /// @details If (x, y, z) isn't explicitly represented in the tree (i.e., + /// it is implicitly a background voxel), return -1. + int getValueDepth(const Coord& xyz) const; + + /// Set the active state of the voxel at the given coordinates but don't change its value. + void setActiveState(const Coord& xyz, bool on); + /// Set the value of the voxel at the given coordinates but don't change its active state. + void setValueOnly(const Coord& xyz, const ValueType& value); + /// Set the value of the voxel at the given coordinates and mark the voxel as active. + void setValueOn(const Coord& xyz, const ValueType& value); + /// Mark the voxel at the given coordinates as inactive but don't change its value. + void setValueOff(const Coord& xyz); + /// Set the value of the voxel at the given coordinates and mark the voxel as inactive. + void setValueOff(const Coord& xyz, const ValueType& value); + + /// @brief Apply a functor to the value of the voxel at the given coordinates + /// and mark the voxel as active. + template + void modifyValue(const Coord& xyz, const ModifyOp& op); + /// Apply a functor to the voxel at the given coordinates. + template + void modifyValueAndActiveState(const Coord& xyz, const ModifyOp& op); + + /// @brief Set all voxels within a given box to a constant value, if necessary + /// subdividing tiles that intersect the box. + /// @param bbox inclusive coordinates of opposite corners of an axis-aligned box + /// @param value the value to which to set voxels within the box + /// @param active if true, mark voxels within the box as active, + /// otherwise mark them as inactive. Defaults to true. + /// @param sparse if false, active tiles are voxelized, i.e. only active voxels + /// are generated from the fill operation. Defaults to true. + void fill(const CoordBBox& bbox, const ValueType& value, bool active = true, bool sparse = true); + + /// @brief Copy into a dense grid the values of all voxels, both active and inactive, + /// that intersect a given bounding box. + /// @param bbox inclusive bounding box of the voxels to be copied into the dense grid + /// @param dense dense grid with a stride in @e z of one (see tools::Dense + /// in tools/Dense.h for the required API) + template + void copyToDense(const CoordBBox& bbox, DenseT& dense) const; + + + // + // I/O + // + bool writeTopology(std::ostream&, bool toHalf = false) const; + bool readTopology(std::istream&, bool fromHalf = false); + + void writeBuffers(std::ostream&, bool toHalf = false) const; + void readBuffers(std::istream&, bool fromHalf = false); + void readBuffers(std::istream&, const CoordBBox&, bool fromHalf = false); + + + // + // Voxel access + // + /// Return the value of the voxel at the given coordinates and, if necessary, update + /// the accessor with pointers to the nodes along the path from the root node to + /// the node containing the voxel. + /// @note Used internally by ValueAccessor. + template + const ValueType& getValueAndCache(const Coord& xyz, AccessorT&) const; + /// Return @c true if the voxel at the given coordinates is active and, if necessary, + /// update the accessor with pointers to the nodes along the path from the root node + /// to the node containing the voxel. + /// @note Used internally by ValueAccessor. + template + bool isValueOnAndCache(const Coord& xyz, AccessorT&) const; + + /// Change the value of the voxel at the given coordinates and mark it as active. + /// If necessary, update the accessor with pointers to the nodes along the path + /// from the root node to the node containing the voxel. + /// @note Used internally by ValueAccessor. + template + void setValueAndCache(const Coord& xyz, const ValueType& value, AccessorT&); + + /// Set the value of the voxel at the given coordinates without changing its active state. + /// If necessary, update the accessor with pointers to the nodes along the path + /// from the root node to the node containing the voxel. + /// @note Used internally by ValueAccessor. + template + void setValueOnlyAndCache(const Coord& xyz, const ValueType& value, AccessorT&); + + /// Apply a functor to the value of the voxel at the given coordinates + /// and mark the voxel as active. + /// If necessary, update the accessor with pointers to the nodes along the path + /// from the root node to the node containing the voxel. + /// @note Used internally by ValueAccessor. + template + void modifyValueAndCache(const Coord& xyz, const ModifyOp& op, AccessorT&); + + /// Apply a functor to the voxel at the given coordinates. + /// If necessary, update the accessor with pointers to the nodes along the path + /// from the root node to the node containing the voxel. + /// @note Used internally by ValueAccessor. + template + void modifyValueAndActiveStateAndCache(const Coord& xyz, const ModifyOp& op, AccessorT&); + + /// Change the value of the voxel at the given coordinates and mark it as inactive. + /// If necessary, update the accessor with pointers to the nodes along the path + /// from the root node to the node containing the voxel. + /// @note Used internally by ValueAccessor. + template + void setValueOffAndCache(const Coord& xyz, const ValueType& value, AccessorT&); + + /// Set the active state of the voxel at the given coordinates without changing its value. + /// If necessary, update the accessor with pointers to the nodes along the path + /// from the root node to the node containing the voxel. + /// @note Used internally by ValueAccessor. + template + void setActiveStateAndCache(const Coord& xyz, bool on, AccessorT&); + + /// Return, in @a value, the value of the voxel at the given coordinates and, + /// if necessary, update the accessor with pointers to the nodes along + /// the path from the root node to the node containing the voxel. + /// @return @c true if the voxel at the given coordinates is active + /// @note Used internally by ValueAccessor. + template + bool probeValueAndCache(const Coord& xyz, ValueType& value, AccessorT&) const; + + /// Return the tree depth (0 = root) at which the value of voxel (x, y, z) resides. + /// If (x, y, z) isn't explicitly represented in the tree (i.e., it is implicitly + /// a background voxel), return -1. If necessary, update the accessor with pointers + /// to the nodes along the path from the root node to the node containing the voxel. + /// @note Used internally by ValueAccessor. + template + int getValueDepthAndCache(const Coord& xyz, AccessorT&) const; + + /// Set all voxels that lie outside the given axis-aligned box to the background. + void clip(const CoordBBox&); + + /// @brief Reduce the memory footprint of this tree by replacing with tiles + /// any nodes whose values are all the same (optionally to within a tolerance) + /// and have the same active state. + /// + /// @note Consider instead using tools::prune which is multi-threaded! + void prune(const ValueType& tolerance = zeroVal()); + + /// @brief Add the given leaf node to this tree, creating a new branch if necessary. + /// If a leaf node with the same origin already exists, replace it. + void addLeaf(LeafNodeType* leaf); + + /// @brief Same as addLeaf() but, if necessary, update the given accessor with pointers + /// to the nodes along the path from the root node to the node containing the coordinate. + template + void addLeafAndCache(LeafNodeType* leaf, AccessorT&); + + /// @brief Return a pointer to the node of type @c NodeT that contains voxel (x, y, z) + /// and replace it with a tile of the specified value and state. + /// If no such node exists, leave the tree unchanged and return @c NULL. + /// + /// @note The caller takes ownership of the node and is responsible for deleting it. + /// + /// @warning Since this method potentially removes nodes and branches of the tree, + /// it is important to clear the caches of all ValueAccessors associated with this tree. + template + NodeT* stealNode(const Coord& xyz, const ValueType& value, bool state); + + /// @brief Add a tile containing voxel (x, y, z) at the root level, + /// deleting the existing branch if necessary. + void addTile(const Coord& xyz, const ValueType& value, bool state); + + /// @brief Add a tile containing voxel (x, y, z) at the specified tree level, + /// creating a new branch if necessary. Delete any existing lower-level nodes + /// that contain (x, y, z). + void addTile(Index level, const Coord& xyz, const ValueType& value, bool state); + + /// @brief Same as addTile() but, if necessary, update the given accessor with pointers + /// to the nodes along the path from the root node to the node containing the coordinate. + template + void addTileAndCache(Index level, const Coord& xyz, const ValueType&, bool state, AccessorT&); + + /// @brief Return a pointer to the leaf node that contains voxel (x, y, z). + /// If no such node exists, create one that preserves the values and + /// active states of all voxels. + /// @details Use this method to preallocate a static tree topology + /// over which to safely perform multithreaded processing. + LeafNodeType* touchLeaf(const Coord& xyz); + + /// @brief Same as touchLeaf() but, if necessary, update the given accessor with pointers + /// to the nodes along the path from the root node to the node containing the coordinate. + template + LeafNodeType* touchLeafAndCache(const Coord& xyz, AccessorT& acc); + + //@{ + /// @brief Return a pointer to the node that contains voxel (x, y, z). + /// If no such node exists, return NULL. + template + NodeT* probeNode(const Coord& xyz); + template + const NodeT* probeConstNode(const Coord& xyz) const; + //@} + + //@{ + /// @brief Same as probeNode() but, if necessary, update the given accessor with pointers + /// to the nodes along the path from the root node to the node containing the coordinate. + template + NodeT* probeNodeAndCache(const Coord& xyz, AccessorT& acc); + template + const NodeT* probeConstNodeAndCache(const Coord& xyz, AccessorT& acc) const; + //@} + + //@{ + /// @brief Return a pointer to the leaf node that contains voxel (x, y, z). + /// If no such node exists, return NULL. + LeafNodeType* probeLeaf(const Coord& xyz); + const LeafNodeType* probeConstLeaf(const Coord& xyz) const; + const LeafNodeType* probeLeaf(const Coord& xyz) const; + //@} + + //@{ + /// @brief Same as probeLeaf() but, if necessary, update the given accessor with pointers + /// to the nodes along the path from the root node to the node containing the coordinate. + template + LeafNodeType* probeLeafAndCache(const Coord& xyz, AccessorT& acc); + template + const LeafNodeType* probeConstLeafAndCache(const Coord& xyz, AccessorT& acc) const; + template + const LeafNodeType* probeLeafAndCache(const Coord& xyz, AccessorT& acc) const; + //@} + + + // + // Aux methods + // + + //@{ + /// @brief Adds all nodes of a certain type to a container with the following API: + /// @code + /// struct ArrayT { + /// typedef value_type;// defines the type of nodes to be added to the array + /// void push_back(value_type nodePtr);// method that add nodes to the array + /// }; + /// @endcode + /// @details An example of a wrapper around a c-style array is: + /// @code + /// struct MyArray { + /// typedef LeafType* value_type; + /// value_type* ptr; + /// MyArray(value_type* array) : ptr(array) {} + /// void push_back(value_type leaf) { *ptr++ = leaf; } + ///}; + /// @endcode + /// @details An example that constructs a list of pointer to all leaf nodes is: + /// @code + /// std::vector array;//most std contains have the required API + /// array.reserve(tree.leafCount());//this is a fast preallocation. + /// tree.getNodes(array); + /// @endcode + template void getNodes(ArrayT& array); + template void getNodes(ArrayT& array) const; + //@} + + //@{ + /// @brief Steals all nodes of a certain type from the tree and + /// adds them to a container with the following API: + /// @code + /// struct ArrayT { + /// typedef value_type;// defines the type of nodes to be added to the array + /// void push_back(value_type nodePtr);// method that add nodes to the array + /// }; + /// @endcode + /// @details An example of a wrapper around a c-style array is: + /// @code + /// struct MyArray { + /// typedef LeafType* value_type; + /// value_type* ptr; + /// MyArray(value_type* array) : ptr(array) {} + /// void push_back(value_type leaf) { *ptr++ = leaf; } + ///}; + /// @endcode + /// @details An example that constructs a list of pointer to all leaf nodes is: + /// @code + /// std::vector array;//most std contains have the required API + /// array.reserve(tree.leafCount());//this is a fast preallocation. + /// tree.stealNodes(array); + /// @endcode + template + void stealNodes(ArrayT& array, const ValueType& value, bool state); + template + void stealNodes(ArrayT& array) { this->stealNodes(array, mBackground, false); } + //@} + + /// @brief Densify active tiles, i.e., replace them with leaf-level active voxels. + /// + /// @param threaded if true, this operation is multi-threaded (over the internal nodes). + /// + /// @warning This method can explode the tree's memory footprint, especially if it + /// contains active tiles at the upper levels, e.g. root level! + void voxelizeActiveTiles(bool threaded = true); + + /// @brief Efficiently merge another tree into this tree using one of several schemes. + /// @details This operation is primarily intended to combine trees that are mostly + /// non-overlapping (for example, intermediate trees from computations that are + /// parallelized across disjoint regions of space). + /// @note This operation is not guaranteed to produce an optimally sparse tree. + /// Follow merge() with prune() for optimal sparseness. + /// @warning This operation always empties the other tree. + template void merge(RootNode& other); + + /// @brief Union this tree's set of active values with the active values + /// of the other tree, whose @c ValueType may be different. + /// @details The resulting state of a value is active if the corresponding value + /// was already active OR if it is active in the other tree. Also, a resulting + /// value maps to a voxel if the corresponding value already mapped to a voxel + /// OR if it is a voxel in the other tree. Thus, a resulting value can only + /// map to a tile if the corresponding value already mapped to a tile + /// AND if it is a tile value in other tree. + /// + /// @note This operation modifies only active states, not values. + /// Specifically, active tiles and voxels in this tree are not changed, and + /// tiles or voxels that were inactive in this tree but active in the other tree + /// are marked as active in this tree but left with their original values. + template + void topologyUnion(const RootNode& other); + + /// @brief Intersects this tree's set of active values with the active values + /// of the other tree, whose @c ValueType may be different. + /// @details The resulting state of a value is active only if the corresponding + /// value was already active AND if it is active in the other tree. Also, a + /// resulting value maps to a voxel if the corresponding value + /// already mapped to an active voxel in either of the two grids + /// and it maps to an active tile or voxel in the other grid. + /// + /// @note This operation can delete branches in this grid if they + /// overlap with inactive tiles in the other grid. Likewise active + /// voxels can be turned into inactive voxels resulting in leaf + /// nodes with no active values. Thus, it is recommended to + /// subsequently call prune. + template + void topologyIntersection(const RootNode& other); + + /// @brief Difference this tree's set of active values with the active values + /// of the other tree, whose @c ValueType may be different. So a + /// resulting voxel will be active only if the original voxel is + /// active in this tree and inactive in the other tree. + /// + /// @note This operation can delete branches in this grid if they + /// overlap with active tiles in the other grid. Likewise active + /// voxels can be turned into inactive voxels resulting in leaf + /// nodes with no active values. Thus, it is recommended to + /// subsequently call prune. + template + void topologyDifference(const RootNode& other); + + template + void combine(RootNode& other, CombineOp&, bool prune = false); + + template + void combine2(const RootNode& other0, const OtherRootNode& other1, + CombineOp& op, bool prune = false); + + /// @brief Call the templated functor BBoxOp with bounding box + /// information for all active tiles and leaf nodes in the tree. + /// An additional level argument is provided for each callback. + /// + /// @note The bounding boxes are guaranteed to be non-overlapping. + template void visitActiveBBox(BBoxOp&) const; + + template void visit(VisitorOp&); + template void visit(VisitorOp&) const; + + template + void visit2(OtherRootNodeType& other, VisitorOp&); + template + void visit2(OtherRootNodeType& other, VisitorOp&) const; + +private: + /// During topology-only construction, access is needed + /// to protected/private members of other template instances. + template friend class RootNode; + + template friend struct RootNodeCopyHelper; + template friend struct RootNodeCombineHelper; + + /// Currently no-op, but can be used to define empty and delete keys for mTable + void initTable() {} + //@{ + /// @internal Used by doVisit2(). + void resetTable(MapType& table) { mTable.swap(table); table.clear(); } + void resetTable(const MapType&) const {} + //@} + + Index getChildCount() const; + Index getTileCount() const; + Index getActiveTileCount() const; + Index getInactiveTileCount() const; + + /// Return a MapType key for the given coordinates. + static Coord coordToKey(const Coord& xyz) { return xyz & ~(ChildType::DIM - 1); } + + /// Insert this node's mTable keys into the given set. + void insertKeys(CoordSet&) const; + + /// Return @c true if this node's mTable contains the given key. + bool hasKey(const Coord& key) const { return mTable.find(key) != mTable.end(); } + //@{ + /// @brief Look up the given key in this node's mTable. + /// @return an iterator pointing to the matching mTable entry or to mTable.end(). + MapIter findKey(const Coord& key) { return mTable.find(key); } + MapCIter findKey(const Coord& key) const { return mTable.find(key); } + //@} + //@{ + /// @brief Convert the given coordinates to a key and look the key up in this node's mTable. + /// @return an iterator pointing to the matching mTable entry or to mTable.end(). + MapIter findCoord(const Coord& xyz) { return mTable.find(coordToKey(xyz)); } + MapCIter findCoord(const Coord& xyz) const { return mTable.find(coordToKey(xyz)); } + //@} + /// @brief Convert the given coordinates to a key and look the key up in this node's mTable. + /// @details If the key is not found, insert a background tile with that key. + /// @return an iterator pointing to the matching mTable entry. + MapIter findOrAddCoord(const Coord& xyz); + + /// @brief Verify that the tree rooted at @a other has the same configuration + /// (levels, branching factors and node dimensions) as this tree, but allow + /// their ValueTypes to differ. + /// @throw TypeError if the other tree's configuration doesn't match this tree's. + template + static void enforceSameConfiguration(const RootNode& other); + + /// @brief Verify that @a other has values of a type that can be converted + /// to this node's ValueType. + /// @details For example, values of type float are compatible with values of type Vec3s, + /// because a Vec3s can be constructed from a float. But the reverse is not true. + /// @throw TypeError if the other node's ValueType is not convertible into this node's. + template + static void enforceCompatibleValueTypes(const RootNode& other); + + template + void doCombine2(const RootNode&, const OtherRootNode&, CombineOp&, bool prune); + + template + static inline void doVisit(RootNodeT&, VisitorOp&); + + template + static inline void doVisit2(RootNodeT&, OtherRootNodeT&, VisitorOp&); + + + MapType mTable; + ValueType mBackground; +}; // end of RootNode class + + +//////////////////////////////////////// + + +/// @brief NodeChain::Type is a boost::mpl::vector +/// that lists the types of the nodes of the tree rooted at RootNodeType in reverse order, +/// from LeafNode to RootNode. +/// @details For example, if RootNodeType is +/// @code +/// RootNode > > +/// @endcode +/// then NodeChain::Type is +/// @code +/// boost::mpl::vector< +/// LeafNode, +/// InternalNode, +/// InternalNode >, +/// RootNode > > > +/// @endcode +/// +/// @note Use the following to get the Nth node type, where N=0 is the LeafNodeType: +/// @code +/// boost::mpl::at >::type +/// @endcode +template +struct NodeChain { + typedef typename NodeChain::Type SubtreeT; + typedef typename boost::mpl::push_back::type Type; +}; + +/// Specialization to terminate NodeChain +template +struct NodeChain { + typedef typename boost::mpl::vector::type Type; +}; + + +//////////////////////////////////////// + + +//@{ +/// Helper metafunction used to implement RootNode::SameConfiguration +/// (which, as an inner class, can't be independently specialized) +template +struct SameRootConfig { + static const bool value = false; +}; + +template +struct SameRootConfig > { + static const bool value = ChildT1::template SameConfiguration::value; +}; +//@} + + +//////////////////////////////////////// + + +template +inline +RootNode::RootNode(): mBackground(zeroVal()) +{ + this->initTable(); +} + + +template +inline +RootNode::RootNode(const ValueType& background): mBackground(background) +{ + this->initTable(); +} + + +template +template +inline +RootNode::RootNode(const RootNode& other, + const ValueType& backgd, const ValueType& foregd, TopologyCopy): + mBackground(backgd) +{ + typedef RootNode OtherRootT; + + enforceSameConfiguration(other); + + const Tile bgTile(backgd, /*active=*/false), fgTile(foregd, true); + this->initTable(); + + for (typename OtherRootT::MapCIter i=other.mTable.begin(), e=other.mTable.end(); i != e; ++i) { + mTable[i->first] = OtherRootT::isTile(i) + ? NodeStruct(OtherRootT::isTileOn(i) ? fgTile : bgTile) + : NodeStruct(*(new ChildT(OtherRootT::getChild(i), backgd, foregd, TopologyCopy()))); + } +} + + +template +template +inline +RootNode::RootNode(const RootNode& other, + const ValueType& backgd, TopologyCopy): + mBackground(backgd) +{ + typedef RootNode OtherRootT; + + enforceSameConfiguration(other); + + const Tile bgTile(backgd, /*active=*/false), fgTile(backgd, true); + this->initTable(); + for (typename OtherRootT::MapCIter i=other.mTable.begin(), e=other.mTable.end(); i != e; ++i) { + mTable[i->first] = OtherRootT::isTile(i) + ? NodeStruct(OtherRootT::isTileOn(i) ? fgTile : bgTile) + : NodeStruct(*(new ChildT(OtherRootT::getChild(i), backgd, TopologyCopy()))); + } +} + + +//////////////////////////////////////// + + +// This helper class is a friend of RootNode and is needed so that assignment +// with value conversion can be specialized for compatible and incompatible +// pairs of RootNode types. +template +struct RootNodeCopyHelper +{ + static inline void copyWithValueConversion(RootT& self, const OtherRootT& other) + { + // If the two root nodes have different configurations or incompatible ValueTypes, + // throw an exception. + self.enforceSameConfiguration(other); + self.enforceCompatibleValueTypes(other); + // One of the above two tests should throw, so we should never get here: + std::ostringstream ostr; + ostr << "cannot convert a " << typeid(OtherRootT).name() + << " to a " << typeid(RootT).name(); + OPENVDB_THROW(TypeError, ostr.str()); + } +}; + +// Specialization for root nodes of compatible types +template +struct RootNodeCopyHelper +{ + static inline void copyWithValueConversion(RootT& self, const OtherRootT& other) + { + typedef typename RootT::ValueType ValueT; + typedef typename RootT::ChildNodeType ChildT; + typedef typename RootT::NodeStruct NodeStruct; + typedef typename RootT::Tile Tile; + typedef typename OtherRootT::ValueType OtherValueT; + typedef typename OtherRootT::MapCIter OtherMapCIter; + typedef typename OtherRootT::Tile OtherTile; + + struct Local { + /// @todo Consider using a value conversion functor passed as an argument instead. + static inline ValueT convertValue(const OtherValueT& val) { return ValueT(val); } + }; + + self.mBackground = Local::convertValue(other.mBackground); + + self.clear(); + self.initTable(); + + for (OtherMapCIter i = other.mTable.begin(), e = other.mTable.end(); i != e; ++i) { + if (other.isTile(i)) { + // Copy the other node's tile, but convert its value to this node's ValueType. + const OtherTile& otherTile = other.getTile(i); + self.mTable[i->first] = NodeStruct( + Tile(Local::convertValue(otherTile.value), otherTile.active)); + } else { + // Copy the other node's child, but convert its values to this node's ValueType. + self.mTable[i->first] = NodeStruct(*(new ChildT(other.getChild(i)))); + } + } + } +}; + + +// Overload for root nodes of the same type as this node +template +inline RootNode& +RootNode::operator=(const RootNode& other) +{ + if (&other != this) { + mBackground = other.mBackground; + + this->clear(); + this->initTable(); + + for (MapCIter i = other.mTable.begin(), e = other.mTable.end(); i != e; ++i) { + mTable[i->first] = + isTile(i) ? NodeStruct(getTile(i)) : NodeStruct(*(new ChildT(getChild(i)))); + } + } + return *this; +} + +// Overload for root nodes of different types +template +template +inline RootNode& +RootNode::operator=(const RootNode& other) +{ + typedef RootNode OtherRootT; + typedef typename OtherRootT::ValueType OtherValueT; + static const bool compatible = (SameConfiguration::value + && CanConvertType::value); + RootNodeCopyHelper::copyWithValueConversion(*this, other); + return *this; +} + + +//////////////////////////////////////// + +template +inline void +RootNode::setBackground(const ValueType& background, bool updateChildNodes) +{ + if (math::isExactlyEqual(background, mBackground)) return; + + if (updateChildNodes) { + // Traverse the tree, replacing occurrences of mBackground with background + // and -mBackground with -background. + for (MapIter iter=mTable.begin(); iter!=mTable.end(); ++iter) { + ChildT *child = iter->second.child; + if (child) { + child->resetBackground(/*old=*/mBackground, /*new=*/background); + } else { + Tile& tile = getTile(iter); + if (tile.active) continue;//only change inactive tiles + if (math::isApproxEqual(tile.value, mBackground)) { + tile.value = background; + } else if (math::isApproxEqual(tile.value, math::negative(mBackground))) { + tile.value = math::negative(background); + } + } + } + } + mBackground = background; +} + +template +inline bool +RootNode::isBackgroundTile(const Tile& tile) const +{ + return !tile.active && math::isApproxEqual(tile.value, mBackground); +} + +template +inline bool +RootNode::isBackgroundTile(const MapIter& iter) const +{ + return isTileOff(iter) && math::isApproxEqual(getTile(iter).value, mBackground); +} + +template +inline bool +RootNode::isBackgroundTile(const MapCIter& iter) const +{ + return isTileOff(iter) && math::isApproxEqual(getTile(iter).value, mBackground); +} + + +template +inline size_t +RootNode::numBackgroundTiles() const +{ + size_t count = 0; + for (MapCIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + if (this->isBackgroundTile(i)) ++count; + } + return count; +} + + +template +inline size_t +RootNode::eraseBackgroundTiles() +{ + std::set keysToErase; + for (MapCIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + if (this->isBackgroundTile(i)) keysToErase.insert(i->first); + } + for (std::set::iterator i = keysToErase.begin(), e = keysToErase.end(); i != e; ++i) { + mTable.erase(*i); + } + return keysToErase.size(); +} + + +//////////////////////////////////////// + + +template +inline void +RootNode::insertKeys(CoordSet& keys) const +{ + for (MapCIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + keys.insert(i->first); + } +} + + +template +inline typename RootNode::MapIter +RootNode::findOrAddCoord(const Coord& xyz) +{ + const Coord key = coordToKey(xyz); + std::pair result = mTable.insert( + typename MapType::value_type(key, NodeStruct(Tile(mBackground, /*active=*/false)))); + return result.first; +} + + +template +inline bool +RootNode::expand(const Coord& xyz) +{ + const Coord key = coordToKey(xyz); + std::pair result = mTable.insert( + typename MapType::value_type(key, NodeStruct(Tile(mBackground, /*active=*/false)))); + return result.second; // return true if the key did not already exist +} + + +//////////////////////////////////////// + + +template +inline void +RootNode::getNodeLog2Dims(std::vector& dims) +{ + dims.push_back(0); // magic number; RootNode has no Log2Dim + ChildT::getNodeLog2Dims(dims); +} + + +template +inline Coord +RootNode::getMinIndex() const +{ + return mTable.empty() ? Coord(0) : mTable.begin()->first; +} + +template +inline Coord +RootNode::getMaxIndex() const +{ + return mTable.empty() ? Coord(0) : mTable.rbegin()->first + Coord(ChildT::DIM - 1); +} + + +template +inline void +RootNode::getIndexRange(CoordBBox& bbox) const +{ + bbox.min() = this->getMinIndex(); + bbox.max() = this->getMaxIndex(); +} + + +//////////////////////////////////////// + + +template +template +inline bool +RootNode::hasSameTopology(const RootNode& other) const +{ + typedef RootNode OtherRootT; + typedef typename OtherRootT::MapType OtherMapT; + typedef typename OtherRootT::MapIter OtherIterT; + typedef typename OtherRootT::MapCIter OtherCIterT; + + if (!hasSameConfiguration(other)) return false; + + // Create a local copy of the other node's table. + OtherMapT copyOfOtherTable = other.mTable; + + // For each entry in this node's table... + for (MapCIter thisIter = mTable.begin(); thisIter != mTable.end(); ++thisIter) { + if (this->isBackgroundTile(thisIter)) continue; // ignore background tiles + + // Fail if there is no corresponding entry in the other node's table. + OtherCIterT otherIter = other.findKey(thisIter->first); + if (otherIter == other.mTable.end()) return false; + + // Fail if this entry is a tile and the other is a child or vice-versa. + if (isChild(thisIter)) {//thisIter points to a child + if (OtherRootT::isTile(otherIter)) return false; + // Fail if both entries are children, but the children have different topology. + if (!getChild(thisIter).hasSameTopology(&OtherRootT::getChild(otherIter))) return false; + } else {//thisIter points to a tile + if (OtherRootT::isChild(otherIter)) return false; + if (getTile(thisIter).active != OtherRootT::getTile(otherIter).active) return false; + } + + // Remove tiles and child nodes with matching topology from + // the copy of the other node's table. This is required since + // the two root tables can include an arbitrary number of + // background tiles and still have the same topology! + copyOfOtherTable.erase(otherIter->first); + } + // Fail if the remaining entries in copyOfOtherTable are not all background tiles. + for (OtherIterT i = copyOfOtherTable.begin(), e = copyOfOtherTable.end(); i != e; ++i) { + if (!other.isBackgroundTile(i)) return false; + } + return true; +} + + +template +template +inline bool +RootNode::hasSameConfiguration(const RootNode&) +{ + std::vector thisDims, otherDims; + RootNode::getNodeLog2Dims(thisDims); + RootNode::getNodeLog2Dims(otherDims); + return (thisDims == otherDims); +} + + +template +template +inline void +RootNode::enforceSameConfiguration(const RootNode&) +{ + std::vector thisDims, otherDims; + RootNode::getNodeLog2Dims(thisDims); + RootNode::getNodeLog2Dims(otherDims); + if (thisDims != otherDims) { + std::ostringstream ostr; + ostr << "grids have incompatible configurations (" << thisDims[0]; + for (size_t i = 1, N = thisDims.size(); i < N; ++i) ostr << " x " << thisDims[i]; + ostr << " vs. " << otherDims[0]; + for (size_t i = 1, N = otherDims.size(); i < N; ++i) ostr << " x " << otherDims[i]; + ostr << ")"; + OPENVDB_THROW(TypeError, ostr.str()); + } +} + + +template +template +inline bool +RootNode::hasCompatibleValueType(const RootNode&) +{ + typedef typename OtherChildType::ValueType OtherValueType; + return CanConvertType::value; +} + + +template +template +inline void +RootNode::enforceCompatibleValueTypes(const RootNode&) +{ + typedef typename OtherChildType::ValueType OtherValueType; + if (!CanConvertType::value) { + std::ostringstream ostr; + ostr << "values of type " << typeNameAsString() + << " cannot be converted to type " << typeNameAsString(); + OPENVDB_THROW(TypeError, ostr.str()); + } +} + + +//////////////////////////////////////// + + +template +inline Index64 +RootNode::memUsage() const +{ + Index64 sum = sizeof(*this); + for (MapCIter iter=mTable.begin(); iter!=mTable.end(); ++iter) { + if (const ChildT *child = iter->second.child) { + sum += child->memUsage(); + } + } + return sum; +} + + +template +inline void +RootNode::clear() +{ + for (MapIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + delete i->second.child; + } + mTable.clear(); +} + + +template +inline void +RootNode::evalActiveBoundingBox(CoordBBox& bbox, bool visitVoxels) const +{ + for (MapCIter iter=mTable.begin(); iter!=mTable.end(); ++iter) { + if (const ChildT *child = iter->second.child) { + child->evalActiveBoundingBox(bbox, visitVoxels); + } else if (isTileOn(iter)) { + bbox.expand(iter->first, ChildT::DIM); + } + } +} + + +template +inline Index +RootNode::getChildCount() const { + Index sum = 0; + for (MapCIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + if (isChild(i)) ++sum; + } + return sum; +} + + +template +inline Index +RootNode::getTileCount() const +{ + Index sum = 0; + for (MapCIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + if (isTile(i)) ++sum; + } + return sum; +} + + +template +inline Index +RootNode::getActiveTileCount() const +{ + Index sum = 0; + for (MapCIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + if (isTileOn(i)) ++sum; + } + return sum; +} + + +template +inline Index +RootNode::getInactiveTileCount() const +{ + Index sum = 0; + for (MapCIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + if (isTileOff(i)) ++sum; + } + return sum; +} + + +template +inline Index32 +RootNode::leafCount() const +{ + Index32 sum = 0; + for (MapCIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + if (isChild(i)) sum += getChild(i).leafCount(); + } + return sum; +} + + +template +inline Index32 +RootNode::nonLeafCount() const +{ + Index32 sum = 1; + if (ChildT::LEVEL != 0) { + for (MapCIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + if (isChild(i)) sum += getChild(i).nonLeafCount(); + } + } + return sum; +} + + +template +inline Index64 +RootNode::onVoxelCount() const +{ + Index64 sum = 0; + for (MapCIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + if (isChild(i)) { + sum += getChild(i).onVoxelCount(); + } else if (isTileOn(i)) { + sum += ChildT::NUM_VOXELS; + } + } + return sum; +} + + +template +inline Index64 +RootNode::offVoxelCount() const +{ + Index64 sum = 0; + for (MapCIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + if (isChild(i)) { + sum += getChild(i).offVoxelCount(); + } else if (isTileOff(i) && !this->isBackgroundTile(i)) { + sum += ChildT::NUM_VOXELS; + } + } + return sum; +} + + +template +inline Index64 +RootNode::onLeafVoxelCount() const +{ + Index64 sum = 0; + for (MapCIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + if (isChild(i)) sum += getChild(i).onLeafVoxelCount(); + } + return sum; +} + + +template +inline Index64 +RootNode::offLeafVoxelCount() const +{ + Index64 sum = 0; + for (MapCIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + if (isChild(i)) sum += getChild(i).offLeafVoxelCount(); + } + return sum; +} + +template +inline Index64 +RootNode::onTileCount() const +{ + Index64 sum = 0; + for (MapCIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + if (isChild(i)) { + sum += getChild(i).onTileCount(); + } else if (isTileOn(i)) { + sum += 1; + } + } + return sum; +} + +//////////////////////////////////////// + + +template +inline bool +RootNode::isValueOn(const Coord& xyz) const +{ + MapCIter iter = this->findCoord(xyz); + if (iter == mTable.end() || isTileOff(iter)) return false; + return isTileOn(iter) ? true : getChild(iter).isValueOn(xyz); +} + +template +inline bool +RootNode::hasActiveTiles() const +{ + for (MapCIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + if (isChild(i) ? getChild(i).hasActiveTiles() : getTile(i).active) return true; + } + return false; +} + +template +template +inline bool +RootNode::isValueOnAndCache(const Coord& xyz, AccessorT& acc) const +{ + MapCIter iter = this->findCoord(xyz); + if (iter == mTable.end() || isTileOff(iter)) return false; + if (isTileOn(iter)) return true; + acc.insert(xyz, &getChild(iter)); + return getChild(iter).isValueOnAndCache(xyz, acc); +} + + +template +inline const typename ChildT::ValueType& +RootNode::getValue(const Coord& xyz) const +{ + MapCIter iter = this->findCoord(xyz); + return iter == mTable.end() ? mBackground + : (isTile(iter) ? getTile(iter).value : getChild(iter).getValue(xyz)); +} + +template +template +inline const typename ChildT::ValueType& +RootNode::getValueAndCache(const Coord& xyz, AccessorT& acc) const +{ + MapCIter iter = this->findCoord(xyz); + if (iter == mTable.end()) return mBackground; + if (isChild(iter)) { + acc.insert(xyz, &getChild(iter)); + return getChild(iter).getValueAndCache(xyz, acc); + } + return getTile(iter).value; +} + + +template +inline int +RootNode::getValueDepth(const Coord& xyz) const +{ + MapCIter iter = this->findCoord(xyz); + return iter == mTable.end() ? -1 + : (isTile(iter) ? 0 : int(LEVEL) - int(getChild(iter).getValueLevel(xyz))); +} + +template +template +inline int +RootNode::getValueDepthAndCache(const Coord& xyz, AccessorT& acc) const +{ + MapCIter iter = this->findCoord(xyz); + if (iter == mTable.end()) return -1; + if (isTile(iter)) return 0; + acc.insert(xyz, &getChild(iter)); + return int(LEVEL) - int(getChild(iter).getValueLevelAndCache(xyz, acc)); +} + + +template +inline void +RootNode::setValueOff(const Coord& xyz) +{ + MapIter iter = this->findCoord(xyz); + if (iter != mTable.end() && !isTileOff(iter)) { + if (isTileOn(iter)) { + setChild(iter, *new ChildT(xyz, getTile(iter).value, /*active=*/true)); + } + getChild(iter).setValueOff(xyz); + } +} + + +template +inline void +RootNode::setActiveState(const Coord& xyz, bool on) +{ + ChildT* child = NULL; + MapIter iter = this->findCoord(xyz); + if (iter == mTable.end()) { + if (on) { + child = new ChildT(xyz, mBackground); + mTable[this->coordToKey(xyz)] = NodeStruct(*child); + } else { + // Nothing to do; (x, y, z) is background and therefore already inactive. + } + } else if (isChild(iter)) { + child = &getChild(iter); + } else if (on != getTile(iter).active) { + child = new ChildT(xyz, getTile(iter).value, !on); + setChild(iter, *child); + } + if (child) child->setActiveState(xyz, on); +} + +template +template +inline void +RootNode::setActiveStateAndCache(const Coord& xyz, bool on, AccessorT& acc) +{ + ChildT* child = NULL; + MapIter iter = this->findCoord(xyz); + if (iter == mTable.end()) { + if (on) { + child = new ChildT(xyz, mBackground); + mTable[this->coordToKey(xyz)] = NodeStruct(*child); + } else { + // Nothing to do; (x, y, z) is background and therefore already inactive. + } + } else if (isChild(iter)) { + child = &getChild(iter); + } else if (on != getTile(iter).active) { + child = new ChildT(xyz, getTile(iter).value, !on); + setChild(iter, *child); + } + if (child) { + acc.insert(xyz, child); + child->setActiveStateAndCache(xyz, on, acc); + } +} + + +template +inline void +RootNode::setValueOff(const Coord& xyz, const ValueType& value) +{ + ChildT* child = NULL; + MapIter iter = this->findCoord(xyz); + if (iter == mTable.end()) { + if (!math::isExactlyEqual(mBackground, value)) { + child = new ChildT(xyz, mBackground); + mTable[this->coordToKey(xyz)] = NodeStruct(*child); + } + } else if (isChild(iter)) { + child = &getChild(iter); + } else if (isTileOn(iter) || !math::isExactlyEqual(getTile(iter).value, value)) { + child = new ChildT(xyz, getTile(iter).value, isTileOn(iter)); + setChild(iter, *child); + } + if (child) child->setValueOff(xyz, value); +} + +template +template +inline void +RootNode::setValueOffAndCache(const Coord& xyz, const ValueType& value, AccessorT& acc) +{ + ChildT* child = NULL; + MapIter iter = this->findCoord(xyz); + if (iter == mTable.end()) { + if (!math::isExactlyEqual(mBackground, value)) { + child = new ChildT(xyz, mBackground); + mTable[this->coordToKey(xyz)] = NodeStruct(*child); + } + } else if (isChild(iter)) { + child = &getChild(iter); + } else if (isTileOn(iter) || !math::isExactlyEqual(getTile(iter).value, value)) { + child = new ChildT(xyz, getTile(iter).value, isTileOn(iter)); + setChild(iter, *child); + } + if (child) { + acc.insert(xyz, child); + child->setValueOffAndCache(xyz, value, acc); + } +} + + +template +inline void +RootNode::setValueOn(const Coord& xyz, const ValueType& value) +{ + ChildT* child = NULL; + MapIter iter = this->findCoord(xyz); + if (iter == mTable.end()) { + child = new ChildT(xyz, mBackground); + mTable[this->coordToKey(xyz)] = NodeStruct(*child); + } else if (isChild(iter)) { + child = &getChild(iter); + } else if (isTileOff(iter) || !math::isExactlyEqual(getTile(iter).value, value)) { + child = new ChildT(xyz, getTile(iter).value, isTileOn(iter)); + setChild(iter, *child); + } + if (child) child->setValueOn(xyz, value); +} + +template +template +inline void +RootNode::setValueAndCache(const Coord& xyz, const ValueType& value, AccessorT& acc) +{ + ChildT* child = NULL; + MapIter iter = this->findCoord(xyz); + if (iter == mTable.end()) { + child = new ChildT(xyz, mBackground); + mTable[this->coordToKey(xyz)] = NodeStruct(*child); + } else if (isChild(iter)) { + child = &getChild(iter); + } else if (isTileOff(iter) || !math::isExactlyEqual(getTile(iter).value, value)) { + child = new ChildT(xyz, getTile(iter).value, isTileOn(iter)); + setChild(iter, *child); + } + if (child) { + acc.insert(xyz, child); + child->setValueAndCache(xyz, value, acc); + } +} + + +template +inline void +RootNode::setValueOnly(const Coord& xyz, const ValueType& value) +{ + ChildT* child = NULL; + MapIter iter = this->findCoord(xyz); + if (iter == mTable.end()) { + child = new ChildT(xyz, mBackground); + mTable[this->coordToKey(xyz)] = NodeStruct(*child); + } else if (isChild(iter)) { + child = &getChild(iter); + } else if (!math::isExactlyEqual(getTile(iter).value, value)) { + child = new ChildT(xyz, getTile(iter).value, isTileOn(iter)); + setChild(iter, *child); + } + if (child) child->setValueOnly(xyz, value); +} + +template +template +inline void +RootNode::setValueOnlyAndCache(const Coord& xyz, const ValueType& value, AccessorT& acc) +{ + ChildT* child = NULL; + MapIter iter = this->findCoord(xyz); + if (iter == mTable.end()) { + child = new ChildT(xyz, mBackground); + mTable[this->coordToKey(xyz)] = NodeStruct(*child); + } else if (isChild(iter)) { + child = &getChild(iter); + } else if (!math::isExactlyEqual(getTile(iter).value, value)) { + child = new ChildT(xyz, getTile(iter).value, isTileOn(iter)); + setChild(iter, *child); + } + if (child) { + acc.insert(xyz, child); + child->setValueOnlyAndCache(xyz, value, acc); + } +} + + +template +template +inline void +RootNode::modifyValue(const Coord& xyz, const ModifyOp& op) +{ + ChildT* child = NULL; + MapIter iter = this->findCoord(xyz); + if (iter == mTable.end()) { + child = new ChildT(xyz, mBackground); + mTable[this->coordToKey(xyz)] = NodeStruct(*child); + } else if (isChild(iter)) { + child = &getChild(iter); + } else { + // Need to create a child if the tile is inactive, + // in order to activate voxel (x, y, z). + bool createChild = isTileOff(iter); + if (!createChild) { + // Need to create a child if applying the functor + // to the tile value produces a different value. + const ValueType& tileVal = getTile(iter).value; + ValueType modifiedVal = tileVal; + op(modifiedVal); + createChild = !math::isExactlyEqual(tileVal, modifiedVal); + } + if (createChild) { + child = new ChildT(xyz, getTile(iter).value, isTileOn(iter)); + setChild(iter, *child); + } + } + if (child) child->modifyValue(xyz, op); +} + +template +template +inline void +RootNode::modifyValueAndCache(const Coord& xyz, const ModifyOp& op, AccessorT& acc) +{ + ChildT* child = NULL; + MapIter iter = this->findCoord(xyz); + if (iter == mTable.end()) { + child = new ChildT(xyz, mBackground); + mTable[this->coordToKey(xyz)] = NodeStruct(*child); + } else if (isChild(iter)) { + child = &getChild(iter); + } else { + // Need to create a child if the tile is inactive, + // in order to activate voxel (x, y, z). + bool createChild = isTileOff(iter); + if (!createChild) { + // Need to create a child if applying the functor + // to the tile value produces a different value. + const ValueType& tileVal = getTile(iter).value; + ValueType modifiedVal = tileVal; + op(modifiedVal); + createChild = !math::isExactlyEqual(tileVal, modifiedVal); + } + if (createChild) { + child = new ChildT(xyz, getTile(iter).value, isTileOn(iter)); + setChild(iter, *child); + } + } + if (child) { + acc.insert(xyz, child); + child->modifyValueAndCache(xyz, op, acc); + } +} + + +template +template +inline void +RootNode::modifyValueAndActiveState(const Coord& xyz, const ModifyOp& op) +{ + ChildT* child = NULL; + MapIter iter = this->findCoord(xyz); + if (iter == mTable.end()) { + child = new ChildT(xyz, mBackground); + mTable[this->coordToKey(xyz)] = NodeStruct(*child); + } else if (isChild(iter)) { + child = &getChild(iter); + } else { + const Tile& tile = getTile(iter); + bool modifiedState = tile.active; + ValueType modifiedVal = tile.value; + op(modifiedVal, modifiedState); + // Need to create a child if applying the functor to the tile + // produces a different value or active state. + if (modifiedState != tile.active || !math::isExactlyEqual(modifiedVal, tile.value)) { + child = new ChildT(xyz, tile.value, tile.active); + setChild(iter, *child); + } + } + if (child) child->modifyValueAndActiveState(xyz, op); +} + +template +template +inline void +RootNode::modifyValueAndActiveStateAndCache( + const Coord& xyz, const ModifyOp& op, AccessorT& acc) +{ + ChildT* child = NULL; + MapIter iter = this->findCoord(xyz); + if (iter == mTable.end()) { + child = new ChildT(xyz, mBackground); + mTable[this->coordToKey(xyz)] = NodeStruct(*child); + } else if (isChild(iter)) { + child = &getChild(iter); + } else { + const Tile& tile = getTile(iter); + bool modifiedState = tile.active; + ValueType modifiedVal = tile.value; + op(modifiedVal, modifiedState); + // Need to create a child if applying the functor to the tile + // produces a different value or active state. + if (modifiedState != tile.active || !math::isExactlyEqual(modifiedVal, tile.value)) { + child = new ChildT(xyz, tile.value, tile.active); + setChild(iter, *child); + } + } + if (child) { + acc.insert(xyz, child); + child->modifyValueAndActiveStateAndCache(xyz, op, acc); + } +} + + +template +inline bool +RootNode::probeValue(const Coord& xyz, ValueType& value) const +{ + MapCIter iter = this->findCoord(xyz); + if (iter == mTable.end()) { + value = mBackground; + return false; + } else if (isChild(iter)) { + return getChild(iter).probeValue(xyz, value); + } + value = getTile(iter).value; + return isTileOn(iter); +} + +template +template +inline bool +RootNode::probeValueAndCache(const Coord& xyz, ValueType& value, AccessorT& acc) const +{ + MapCIter iter = this->findCoord(xyz); + if (iter == mTable.end()) { + value = mBackground; + return false; + } else if (isChild(iter)) { + acc.insert(xyz, &getChild(iter)); + return getChild(iter).probeValueAndCache(xyz, value, acc); + } + value = getTile(iter).value; + return isTileOn(iter); +} + + +//////////////////////////////////////// + + +template +inline void +RootNode::fill(const CoordBBox& bbox, const ValueType& value, bool active, bool sparse) +{ + if (bbox.empty()) return; + + Coord xyz, tileMax; + for (int x = bbox.min().x(); x <= bbox.max().x(); x = tileMax.x() + 1) { + xyz.setX(x); + for (int y = bbox.min().y(); y <= bbox.max().y(); y = tileMax.y() + 1) { + xyz.setY(y); + for (int z = bbox.min().z(); z <= bbox.max().z(); z = tileMax.z() + 1) { + xyz.setZ(z); + + // Get the bounds of the tile that contains voxel (x, y, z). + Coord tileMin = coordToKey(xyz); + tileMax = tileMin.offsetBy(ChildT::DIM - 1); + + if (xyz != tileMin || Coord::lessThan(bbox.max(), tileMax)) { + // If the box defined by (xyz, bbox.max()) doesn't completely enclose + // the tile to which xyz belongs, create a child node (or retrieve + // the existing one). + ChildT* child = NULL; + MapIter iter = this->findKey(tileMin); + if (iter == mTable.end()) { + // No child or tile exists. Create a child and initialize it + // with the background value. + child = new ChildT(xyz, mBackground); + mTable[tileMin] = NodeStruct(*child); + } else if (isTile(iter)) { + // Replace the tile with a newly-created child that is initialized + // with the tile's value and active state. + const Tile& tile = getTile(iter); + child = new ChildT(xyz, tile.value, tile.active); + mTable[tileMin] = NodeStruct(*child); + } else if (isChild(iter)) { + child = &getChild(iter); + } + // Forward the fill request to the child. + if (child) { + child->fill(CoordBBox(xyz, Coord::minComponent(bbox.max(), tileMax)), + value, active); + } + } else { + // If the box given by (xyz, bbox.max()) completely encloses + // the tile to which xyz belongs, create the tile (if it + // doesn't already exist) and give it the fill value. + MapIter iter = this->findOrAddCoord(tileMin); + setTile(iter, Tile(value, active)); + } + } + } + } + if (!sparse) this->voxelizeActiveTiles(/*multi-threaded=*/true); +} + +template +template +inline void +RootNode::copyToDense(const CoordBBox& bbox, DenseT& dense) const +{ + typedef typename DenseT::ValueType DenseValueType; + + const size_t xStride = dense.xStride(), yStride = dense.yStride(), zStride = dense.zStride(); + const Coord& min = dense.bbox().min(); + CoordBBox nodeBBox; + for (Coord xyz = bbox.min(); xyz[0] <= bbox.max()[0]; xyz[0] = nodeBBox.max()[0] + 1) { + for (xyz[1] = bbox.min()[1]; xyz[1] <= bbox.max()[1]; xyz[1] = nodeBBox.max()[1] + 1) { + for (xyz[2] = bbox.min()[2]; xyz[2] <= bbox.max()[2]; xyz[2] = nodeBBox.max()[2] + 1) { + + // Get the coordinate bbox of the child node that contains voxel xyz. + nodeBBox = CoordBBox::createCube(coordToKey(xyz), ChildT::DIM); + + // Get the coordinate bbox of the interection of inBBox and nodeBBox + CoordBBox sub(xyz, Coord::minComponent(bbox.max(), nodeBBox.max())); + + MapCIter iter = this->findKey(nodeBBox.min()); + if (iter != mTable.end() && isChild(iter)) {//is a child + getChild(iter).copyToDense(sub, dense); + } else {//is background or a tile value + const ValueType value = iter==mTable.end() ? mBackground : getTile(iter).value; + sub.translate(-min); + DenseValueType* a0 = dense.data() + zStride*sub.min()[2]; + for (Int32 x=sub.min()[0], ex=sub.max()[0]+1; x +inline bool +RootNode::writeTopology(std::ostream& os, bool toHalf) const +{ + if (!toHalf) { + os.write(reinterpret_cast(&mBackground), sizeof(ValueType)); + } else { + ValueType truncatedVal = io::truncateRealToHalf(mBackground); + os.write(reinterpret_cast(&truncatedVal), sizeof(ValueType)); + } + io::setGridBackgroundValuePtr(os, &mBackground); + + const Index numTiles = this->getTileCount(), numChildren = this->getChildCount(); + os.write(reinterpret_cast(&numTiles), sizeof(Index)); + os.write(reinterpret_cast(&numChildren), sizeof(Index)); + + if (numTiles == 0 && numChildren == 0) return false; + + // Write tiles. + for (MapCIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + if (isChild(i)) continue; + os.write(reinterpret_cast(i->first.asPointer()), 3 * sizeof(Int32)); + os.write(reinterpret_cast(&getTile(i).value), sizeof(ValueType)); + os.write(reinterpret_cast(&getTile(i).active), sizeof(bool)); + } + // Write child nodes. + for (MapCIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + if (isTile(i)) continue; + os.write(reinterpret_cast(i->first.asPointer()), 3 * sizeof(Int32)); + getChild(i).writeTopology(os, toHalf); + } + + return true; // not empty +} + + +template +inline bool +RootNode::readTopology(std::istream& is, bool fromHalf) +{ + // Delete the existing tree. + this->clear(); + + if (io::getFormatVersion(is) < OPENVDB_FILE_VERSION_ROOTNODE_MAP) { + // Read and convert an older-format RootNode. + + // For backward compatibility with older file formats, read both + // outside and inside background values. + is.read(reinterpret_cast(&mBackground), sizeof(ValueType)); + ValueType inside; + is.read(reinterpret_cast(&inside), sizeof(ValueType)); + + io::setGridBackgroundValuePtr(is, &mBackground); + + // Read the index range. + Coord rangeMin, rangeMax; + is.read(reinterpret_cast(rangeMin.asPointer()), 3 * sizeof(Int32)); + is.read(reinterpret_cast(rangeMax.asPointer()), 3 * sizeof(Int32)); + + this->initTable(); + Index tableSize = 0, log2Dim[4] = { 0, 0, 0, 0 }; + Int32 offset[3]; + for (int i = 0; i < 3; ++i) { + offset[i] = rangeMin[i] >> ChildT::TOTAL; + rangeMin[i] = offset[i] << ChildT::TOTAL; + log2Dim[i] = 1 + util::FindHighestOn((rangeMax[i] >> ChildT::TOTAL) - offset[i]); + tableSize += log2Dim[i]; + rangeMax[i] = (((1 << log2Dim[i]) + offset[i]) << ChildT::TOTAL) - 1; + } + log2Dim[3] = log2Dim[1] + log2Dim[2]; + tableSize = 1U << tableSize; + + // Read masks. + util::RootNodeMask childMask(tableSize), valueMask(tableSize); + childMask.load(is); + valueMask.load(is); + + // Read child nodes/values. + for (Index i = 0; i < tableSize; ++i) { + // Compute origin = offset2coord(i). + Index n = i; + Coord origin; + origin[0] = (n >> log2Dim[3]) + offset[0]; + n &= (1U << log2Dim[3]) - 1; + origin[1] = (n >> log2Dim[2]) + offset[1]; + origin[2] = (n & ((1U << log2Dim[2]) - 1)) + offset[1]; + origin <<= ChildT::TOTAL; + + if (childMask.isOn(i)) { + // Read in and insert a child node. +#ifdef OPENVDB_2_ABI_COMPATIBLE + ChildT* child = new ChildT(origin, mBackground); +#else + ChildT* child = new ChildT(PartialCreate(), origin, mBackground); +#endif + child->readTopology(is); + mTable[origin] = NodeStruct(*child); + } else { + // Read in a tile value and insert a tile, but only if the value + // is either active or non-background. + ValueType value; + is.read(reinterpret_cast(&value), sizeof(ValueType)); + if (valueMask.isOn(i) || (!math::isApproxEqual(value, mBackground))) { + mTable[origin] = NodeStruct(Tile(value, valueMask.isOn(i))); + } + } + } + return true; + } + + // Read a RootNode that was stored in the current format. + + is.read(reinterpret_cast(&mBackground), sizeof(ValueType)); + io::setGridBackgroundValuePtr(is, &mBackground); + + Index numTiles = 0, numChildren = 0; + is.read(reinterpret_cast(&numTiles), sizeof(Index)); + is.read(reinterpret_cast(&numChildren), sizeof(Index)); + + if (numTiles == 0 && numChildren == 0) return false; + + Int32 vec[3]; + ValueType value; + bool active; + + // Read tiles. + for (Index n = 0; n < numTiles; ++n) { + is.read(reinterpret_cast(vec), 3 * sizeof(Int32)); + is.read(reinterpret_cast(&value), sizeof(ValueType)); + is.read(reinterpret_cast(&active), sizeof(bool)); + mTable[Coord(vec)] = NodeStruct(Tile(value, active)); + } + + // Read child nodes. + for (Index n = 0; n < numChildren; ++n) { + is.read(reinterpret_cast(vec), 3 * sizeof(Int32)); + Coord origin(vec); +#ifdef OPENVDB_2_ABI_COMPATIBLE + ChildT* child = new ChildT(origin, mBackground); +#else + ChildT* child = new ChildT(PartialCreate(), origin, mBackground); +#endif + child->readTopology(is, fromHalf); + mTable[Coord(vec)] = NodeStruct(*child); + } + + return true; // not empty +} + + +template +inline void +RootNode::writeBuffers(std::ostream& os, bool toHalf) const +{ + for (MapCIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + if (isChild(i)) getChild(i).writeBuffers(os, toHalf); + } +} + + +template +inline void +RootNode::readBuffers(std::istream& is, bool fromHalf) +{ + for (MapIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + if (isChild(i)) getChild(i).readBuffers(is, fromHalf); + } +} + + +template +inline void +RootNode::readBuffers(std::istream& is, const CoordBBox& clipBBox, bool fromHalf) +{ + const Tile bgTile(mBackground, /*active=*/false); + + for (MapIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + if (isChild(i)) { + // Stream in and clip the branch rooted at this child. + // (We can't skip over children that lie outside the clipping region, + // because buffers are serialized in depth-first order and need to be + // unserialized in the same order.) + ChildT& child = getChild(i); + child.readBuffers(is, clipBBox, fromHalf); + } + } + // Clip root-level tiles and prune children that were clipped. + this->clip(clipBBox); +} + + +//////////////////////////////////////// + + +template +inline void +RootNode::clip(const CoordBBox& clipBBox) +{ + const Tile bgTile(mBackground, /*active=*/false); + + // Iterate over a copy of this node's table so that we can modify the original. + // (Copying the table copies child node pointers, not the nodes themselves.) + MapType copyOfTable(mTable); + for (MapIter i = copyOfTable.begin(), e = copyOfTable.end(); i != e; ++i) { + const Coord& xyz = i->first; // tile or child origin + CoordBBox tileBBox(xyz, xyz.offsetBy(ChildT::DIM - 1)); // tile or child bounds + if (!clipBBox.hasOverlap(tileBBox)) { + // This table entry lies completely outside the clipping region. Delete it. + setTile(this->findCoord(xyz), bgTile); // delete any existing child node first + mTable.erase(xyz); + } else if (!clipBBox.isInside(tileBBox)) { + // This table entry does not lie completely inside the clipping region + // and must be clipped. + if (isChild(i)) { + getChild(i).clip(clipBBox, mBackground); + } else { + // Replace this tile with a background tile, then fill the clip region + // with the tile's original value. (This might create a child branch.) + tileBBox.intersect(clipBBox); + const Tile& origTile = getTile(i); + setTile(this->findCoord(xyz), bgTile); + this->fill(tileBBox, origTile.value, origTile.active); + } + } else { + // This table entry lies completely inside the clipping region. Leave it intact. + } + } + this->prune(); // also erases root-level background tiles +} + + +//////////////////////////////////////// + + +template +inline void +RootNode::prune(const ValueType& tolerance) +{ + bool state = false; + ValueType value = zeroVal(); + for (MapIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + if (this->isTile(i)) continue; + this->getChild(i).prune(tolerance); + if (this->getChild(i).isConstant(value, state, tolerance)) { + this->setTile(i, Tile(value, state)); + } + } + this->eraseBackgroundTiles(); +} + + +//////////////////////////////////////// + + +template +template +inline NodeT* +RootNode::stealNode(const Coord& xyz, const ValueType& value, bool state) +{ + if ((NodeT::LEVEL == ChildT::LEVEL && !(boost::is_same::value)) || + NodeT::LEVEL > ChildT::LEVEL) return NULL; + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + MapIter iter = this->findCoord(xyz); + if (iter == mTable.end() || isTile(iter)) return NULL; + return (boost::is_same::value) + ? reinterpret_cast(&stealChild(iter, Tile(value, state))) + : getChild(iter).template stealNode(xyz, value, state); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END +} + + +//////////////////////////////////////// + + +template +inline void +RootNode::addLeaf(LeafNodeType* leaf) +{ + if (leaf == NULL) return; + ChildT* child = NULL; + const Coord& xyz = leaf->origin(); + MapIter iter = this->findCoord(xyz); + if (iter == mTable.end()) { + if (ChildT::LEVEL>0) { + child = new ChildT(xyz, mBackground, false); + } else { + child = reinterpret_cast(leaf); + } + mTable[this->coordToKey(xyz)] = NodeStruct(*child); + } else if (isChild(iter)) { + if (ChildT::LEVEL>0) { + child = &getChild(iter); + } else { + child = reinterpret_cast(leaf); + setChild(iter, *child);//this also deletes the existing child node + } + } else {//tile + if (ChildT::LEVEL>0) { + child = new ChildT(xyz, getTile(iter).value, isTileOn(iter)); + } else { + child = reinterpret_cast(leaf); + } + setChild(iter, *child); + } + child->addLeaf(leaf); +} + + +template +template +inline void +RootNode::addLeafAndCache(LeafNodeType* leaf, AccessorT& acc) +{ + if (leaf == NULL) return; + ChildT* child = NULL; + const Coord& xyz = leaf->origin(); + MapIter iter = this->findCoord(xyz); + if (iter == mTable.end()) { + if (ChildT::LEVEL>0) { + child = new ChildT(xyz, mBackground, false); + } else { + child = reinterpret_cast(leaf); + } + mTable[this->coordToKey(xyz)] = NodeStruct(*child); + } else if (isChild(iter)) { + if (ChildT::LEVEL>0) { + child = &getChild(iter); + } else { + child = reinterpret_cast(leaf); + setChild(iter, *child);//this also deletes the existing child node + } + } else {//tile + if (ChildT::LEVEL>0) { + child = new ChildT(xyz, getTile(iter).value, isTileOn(iter)); + } else { + child = reinterpret_cast(leaf); + } + setChild(iter, *child); + } + acc.insert(xyz, child); + child->addLeafAndCache(leaf, acc); +} + +template +inline void +RootNode::addTile(const Coord& xyz, const ValueType& value, bool state) +{ + MapIter iter = this->findCoord(xyz); + if (iter == mTable.end()) {//background + mTable[this->coordToKey(xyz)] = NodeStruct(Tile(value, state)); + } else {//child or tile + setTile(iter, Tile(value, state));//this also deletes the existing child node + } +} + +template +inline void +RootNode::addTile(Index level, const Coord& xyz, + const ValueType& value, bool state) +{ + if (LEVEL >= level) { + MapIter iter = this->findCoord(xyz); + if (iter == mTable.end()) {//background + if (LEVEL > level) { + ChildT* child = new ChildT(xyz, mBackground, false); + mTable[this->coordToKey(xyz)] = NodeStruct(*child); + child->addTile(level, xyz, value, state); + } else { + mTable[this->coordToKey(xyz)] = NodeStruct(Tile(value, state)); + } + } else if (isChild(iter)) {//child + if (LEVEL > level) { + getChild(iter).addTile(level, xyz, value, state); + } else { + setTile(iter, Tile(value, state));//this also deletes the existing child node + } + } else {//tile + if (LEVEL > level) { + ChildT* child = new ChildT(xyz, getTile(iter).value, isTileOn(iter)); + setChild(iter, *child); + child->addTile(level, xyz, value, state); + } else { + setTile(iter, Tile(value, state)); + } + } + } +} + + +template +template +inline void +RootNode::addTileAndCache(Index level, const Coord& xyz, const ValueType& value, + bool state, AccessorT& acc) +{ + if (LEVEL >= level) { + MapIter iter = this->findCoord(xyz); + if (iter == mTable.end()) {//background + if (LEVEL > level) { + ChildT* child = new ChildT(xyz, mBackground, false); + acc.insert(xyz, child); + mTable[this->coordToKey(xyz)] = NodeStruct(*child); + child->addTileAndCache(level, xyz, value, state, acc); + } else { + mTable[this->coordToKey(xyz)] = NodeStruct(Tile(value, state)); + } + } else if (isChild(iter)) {//child + if (LEVEL > level) { + ChildT* child = &getChild(iter); + acc.insert(xyz, child); + child->addTileAndCache(level, xyz, value, state, acc); + } else { + setTile(iter, Tile(value, state));//this also deletes the existing child node + } + } else {//tile + if (LEVEL > level) { + ChildT* child = new ChildT(xyz, getTile(iter).value, isTileOn(iter)); + acc.insert(xyz, child); + setChild(iter, *child); + child->addTileAndCache(level, xyz, value, state, acc); + } else { + setTile(iter, Tile(value, state)); + } + } + } +} + + +//////////////////////////////////////// + + +template +inline typename ChildT::LeafNodeType* +RootNode::touchLeaf(const Coord& xyz) +{ + ChildT* child = NULL; + MapIter iter = this->findCoord(xyz); + if (iter == mTable.end()) { + child = new ChildT(xyz, mBackground, false); + mTable[this->coordToKey(xyz)] = NodeStruct(*child); + } else if (isChild(iter)) { + child = &getChild(iter); + } else { + child = new ChildT(xyz, getTile(iter).value, isTileOn(iter)); + setChild(iter, *child); + } + return child->touchLeaf(xyz); +} + + +template +template +inline typename ChildT::LeafNodeType* +RootNode::touchLeafAndCache(const Coord& xyz, AccessorT& acc) +{ + ChildT* child = NULL; + MapIter iter = this->findCoord(xyz); + if (iter == mTable.end()) { + child = new ChildT(xyz, mBackground, false); + mTable[this->coordToKey(xyz)] = NodeStruct(*child); + } else if (isChild(iter)) { + child = &getChild(iter); + } else { + child = new ChildT(xyz, getTile(iter).value, isTileOn(iter)); + setChild(iter, *child); + } + acc.insert(xyz, child); + return child->touchLeafAndCache(xyz, acc); +} + + +//////////////////////////////////////// + + +template +template +inline NodeT* +RootNode::probeNode(const Coord& xyz) +{ + if ((NodeT::LEVEL == ChildT::LEVEL && !(boost::is_same::value)) || + NodeT::LEVEL > ChildT::LEVEL) return NULL; + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + MapIter iter = this->findCoord(xyz); + if (iter == mTable.end() || isTile(iter)) return NULL; + ChildT* child = &getChild(iter); + return (boost::is_same::value) + ? reinterpret_cast(child) + : child->template probeNode(xyz); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END +} + + +template +template +inline const NodeT* +RootNode::probeConstNode(const Coord& xyz) const +{ + if ((NodeT::LEVEL == ChildT::LEVEL && !(boost::is_same::value)) || + NodeT::LEVEL > ChildT::LEVEL) return NULL; + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + MapCIter iter = this->findCoord(xyz); + if (iter == mTable.end() || isTile(iter)) return NULL; + const ChildT* child = &getChild(iter); + return (boost::is_same::value) + ? reinterpret_cast(child) + : child->template probeConstNode(xyz); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END +} + + +template +inline typename ChildT::LeafNodeType* +RootNode::probeLeaf(const Coord& xyz) +{ + return this->template probeNode(xyz); +} + + +template +inline const typename ChildT::LeafNodeType* +RootNode::probeConstLeaf(const Coord& xyz) const +{ + return this->template probeConstNode(xyz); +} + + +template +template +inline typename ChildT::LeafNodeType* +RootNode::probeLeafAndCache(const Coord& xyz, AccessorT& acc) +{ + return this->template probeNodeAndCache(xyz, acc); +} + + +template +template +inline const typename ChildT::LeafNodeType* +RootNode::probeConstLeafAndCache(const Coord& xyz, AccessorT& acc) const +{ + return this->template probeConstNodeAndCache(xyz, acc); +} + + +template +template +inline const typename ChildT::LeafNodeType* +RootNode::probeLeafAndCache(const Coord& xyz, AccessorT& acc) const +{ + return this->probeConstLeafAndCache(xyz, acc); +} + + +template +template +inline NodeT* +RootNode::probeNodeAndCache(const Coord& xyz, AccessorT& acc) +{ + if ((NodeT::LEVEL == ChildT::LEVEL && !(boost::is_same::value)) || + NodeT::LEVEL > ChildT::LEVEL) return NULL; + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + MapIter iter = this->findCoord(xyz); + if (iter == mTable.end() || isTile(iter)) return NULL; + ChildT* child = &getChild(iter); + acc.insert(xyz, child); + return (boost::is_same::value) + ? reinterpret_cast(child) + : child->template probeNodeAndCache(xyz, acc); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END +} + + +template +template +inline const NodeT* +RootNode::probeConstNodeAndCache(const Coord& xyz, AccessorT& acc) const +{ + if ((NodeT::LEVEL == ChildT::LEVEL && !(boost::is_same::value)) || + NodeT::LEVEL > ChildT::LEVEL) return NULL; + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + MapCIter iter = this->findCoord(xyz); + if (iter == mTable.end() || isTile(iter)) return NULL; + const ChildT* child = &getChild(iter); + acc.insert(xyz, child); + return (boost::is_same::value) + ? reinterpret_cast(child) + : child->template probeConstNodeAndCache(xyz, acc); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END +} + + +//////////////////////////////////////// + +template +template +inline void +RootNode::getNodes(ArrayT& array) +{ + typedef typename ArrayT::value_type NodePtr; + BOOST_STATIC_ASSERT(boost::is_pointer::value); + typedef typename boost::remove_pointer::type NodeType; + typedef typename boost::remove_const::type NonConstNodeType; + typedef typename boost::mpl::contains::type result; + BOOST_STATIC_ASSERT(result::value); + typedef typename boost::mpl::if_, + const ChildT, ChildT>::type ArrayChildT; + + for (MapIter iter=mTable.begin(); iter!=mTable.end(); ++iter) { + if (ChildT* child = iter->second.child) { + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (boost::is_same::value) { + array.push_back(reinterpret_cast(iter->second.child)); + } else { + child->getNodes(array);//descent + } + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + } +} + +template +template +inline void +RootNode::getNodes(ArrayT& array) const +{ + typedef typename ArrayT::value_type NodePtr; + BOOST_STATIC_ASSERT(boost::is_pointer::value); + typedef typename boost::remove_pointer::type NodeType; + BOOST_STATIC_ASSERT(boost::is_const::value); + typedef typename boost::remove_const::type NonConstNodeType; + typedef typename boost::mpl::contains::type result; + BOOST_STATIC_ASSERT(result::value); + + for (MapCIter iter=mTable.begin(); iter!=mTable.end(); ++iter) { + if (const ChildNodeType *child = iter->second.child) { + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (boost::is_same::value) { + array.push_back(reinterpret_cast(iter->second.child)); + } else { + child->getNodes(array);//descent + } + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + } +} + +//////////////////////////////////////// + +template +template +inline void +RootNode::stealNodes(ArrayT& array, const ValueType& value, bool state) +{ + typedef typename ArrayT::value_type NodePtr; + BOOST_STATIC_ASSERT(boost::is_pointer::value); + typedef typename boost::remove_pointer::type NodeType; + typedef typename boost::remove_const::type NonConstNodeType; + typedef typename boost::mpl::contains::type result; + BOOST_STATIC_ASSERT(result::value); + typedef typename boost::mpl::if_, + const ChildT, ChildT>::type ArrayChildT; + + for (MapIter iter=mTable.begin(); iter!=mTable.end(); ++iter) { + if (ChildT* child = iter->second.child) { + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (boost::is_same::value) { + array.push_back(reinterpret_cast(&stealChild(iter, Tile(value, state)))); + } else { + child->stealNodes(array, value, state);//descent + } + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + } +} + + +//////////////////////////////////////// + + +template +inline void +RootNode::voxelizeActiveTiles(bool threaded) +{ + // These is little point in multi-threaded over the root table since + // each tile spans a huge index space (by default 4096^3) and hence we + // expect few if any at all. In fact, you're very likeky to run out + // of memory if this method is called on a tree with root-level + // active tiles! + for (MapIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + if (this->isTileOff(i)) continue; + ChildT* child = i->second.child; + if (child==NULL) { + child = new ChildT(i->first, this->getTile(i).value, true); + i->second.child = child; + } + child->voxelizeActiveTiles(threaded); + } +} + + +//////////////////////////////////////// + + +template +template +inline void +RootNode::merge(RootNode& other) +{ + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + + switch (Policy) { + + default: + case MERGE_ACTIVE_STATES: + for (MapIter i = other.mTable.begin(), e = other.mTable.end(); i != e; ++i) { + MapIter j = mTable.find(i->first); + if (other.isChild(i)) { + if (j == mTable.end()) { // insert other node's child + ChildNodeType& child = stealChild(i, Tile(other.mBackground, /*on=*/false)); + child.resetBackground(other.mBackground, mBackground); + mTable[i->first] = NodeStruct(child); + } else if (isTile(j)) { + if (isTileOff(j)) { // replace inactive tile with other node's child + ChildNodeType& child = stealChild(i, Tile(other.mBackground, /*on=*/false)); + child.resetBackground(other.mBackground, mBackground); + setChild(j, child); + } + } else { // merge both child nodes + getChild(j).template merge(getChild(i), + other.mBackground, mBackground); + } + } else if (other.isTileOn(i)) { + if (j == mTable.end()) { // insert other node's active tile + mTable[i->first] = i->second; + } else if (!isTileOn(j)) { + // Replace anything except an active tile with the other node's active tile. + setTile(j, Tile(other.getTile(i).value, true)); + } + } + } + break; + + case MERGE_NODES: + for (MapIter i = other.mTable.begin(), e = other.mTable.end(); i != e; ++i) { + MapIter j = mTable.find(i->first); + if (other.isChild(i)) { + if (j == mTable.end()) { // insert other node's child + ChildNodeType& child = stealChild(i, Tile(other.mBackground, /*on=*/false)); + child.resetBackground(other.mBackground, mBackground); + mTable[i->first] = NodeStruct(child); + } else if (isTile(j)) { // replace tile with other node's child + ChildNodeType& child = stealChild(i, Tile(other.mBackground, /*on=*/false)); + child.resetBackground(other.mBackground, mBackground); + setChild(j, child); + } else { // merge both child nodes + getChild(j).template merge( + getChild(i), other.mBackground, mBackground); + } + } + } + break; + + case MERGE_ACTIVE_STATES_AND_NODES: + for (MapIter i = other.mTable.begin(), e = other.mTable.end(); i != e; ++i) { + MapIter j = mTable.find(i->first); + if (other.isChild(i)) { + if (j == mTable.end()) { + // Steal and insert the other node's child. + ChildNodeType& child = stealChild(i, Tile(other.mBackground, /*on=*/false)); + child.resetBackground(other.mBackground, mBackground); + mTable[i->first] = NodeStruct(child); + } else if (isTile(j)) { + // Replace this node's tile with the other node's child. + ChildNodeType& child = stealChild(i, Tile(other.mBackground, /*on=*/false)); + child.resetBackground(other.mBackground, mBackground); + const Tile tile = getTile(j); + setChild(j, child); + if (tile.active) { + // Merge the other node's child with this node's active tile. + child.template merge( + tile.value, tile.active); + } + } else /*if (isChild(j))*/ { + // Merge the other node's child into this node's child. + getChild(j).template merge(getChild(i), + other.mBackground, mBackground); + } + } else if (other.isTileOn(i)) { + if (j == mTable.end()) { + // Insert a copy of the other node's active tile. + mTable[i->first] = i->second; + } else if (isTileOff(j)) { + // Replace this node's inactive tile with a copy of the other's active tile. + setTile(j, Tile(other.getTile(i).value, true)); + } else if (isChild(j)) { + // Merge the other node's active tile into this node's child. + const Tile& tile = getTile(i); + getChild(j).template merge( + tile.value, tile.active); + } + } // else if (other.isTileOff(i)) {} // ignore the other node's inactive tiles + } + break; + } + + // Empty the other tree so as not to leave it in a partially cannibalized state. + other.clear(); + + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END +} + + +//////////////////////////////////////// + + +template +template +inline void +RootNode::topologyUnion(const RootNode& other) +{ + typedef RootNode OtherRootT; + typedef typename OtherRootT::MapCIter OtherCIterT; + + enforceSameConfiguration(other); + + for (OtherCIterT i = other.mTable.begin(), e = other.mTable.end(); i != e; ++i) { + MapIter j = mTable.find(i->first); + if (other.isChild(i)) { + if (j == mTable.end()) { // create child branch with identical topology + mTable[i->first] = NodeStruct( + *(new ChildT(other.getChild(i), mBackground, TopologyCopy()))); + } else if (this->isChild(j)) { // union with child branch + this->getChild(j).topologyUnion(other.getChild(i)); + } else {// this is a tile so replace it with a child branch with identical topology + ChildT* child = new ChildT( + other.getChild(i), this->getTile(j).value, TopologyCopy()); + if (this->isTileOn(j)) child->setValuesOn();//this is an active tile + this->setChild(j, *child); + } + } else if (other.isTileOn(i)) { // other is an active tile + if (j == mTable.end()) { // insert an active tile + mTable[i->first] = NodeStruct(Tile(mBackground, true)); + } else if (this->isChild(j)) { + this->getChild(j).setValuesOn(); + } else if (this->isTileOff(j)) { + this->setTile(j, Tile(this->getTile(j).value, true)); + } + } + } +} + +template +template +inline void +RootNode::topologyIntersection(const RootNode& other) +{ + typedef RootNode OtherRootT; + typedef typename OtherRootT::MapCIter OtherCIterT; + + enforceSameConfiguration(other); + + std::set tmp;//keys to erase + for (MapIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + OtherCIterT j = other.mTable.find(i->first); + if (this->isChild(i)) { + if (j == other.mTable.end() || other.isTileOff(j)) { + tmp.insert(i->first);//delete child branch + } else if (other.isChild(j)) { // intersect with child branch + this->getChild(i).topologyIntersection(other.getChild(j), mBackground); + } + } else if (this->isTileOn(i)) { + if (j == other.mTable.end() || other.isTileOff(j)) { + this->setTile(i, Tile(this->getTile(i).value, false));//turn inactive + } else if (other.isChild(j)) { //replace with a child branch with identical topology + ChildT* child = + new ChildT(other.getChild(j), this->getTile(i).value, TopologyCopy()); + this->setChild(i, *child); + } + } + } + for (std::set::iterator i = tmp.begin(), e = tmp.end(); i != e; ++i) { + MapIter it = this->findCoord(*i); + setTile(it, Tile()); // delete any existing child node first + mTable.erase(it); + } +} + +template +template +inline void +RootNode::topologyDifference(const RootNode& other) +{ + typedef RootNode OtherRootT; + typedef typename OtherRootT::MapCIter OtherCIterT; + + enforceSameConfiguration(other); + + for (OtherCIterT i = other.mTable.begin(), e = other.mTable.end(); i != e; ++i) { + MapIter j = mTable.find(i->first); + if (other.isChild(i)) { + if (j == mTable.end() || this->isTileOff(j)) { + //do nothing + } else if (this->isChild(j)) { // difference with child branch + this->getChild(j).topologyDifference(other.getChild(i), mBackground); + } else if (this->isTileOn(j)) { + // this is an active tile so create a child node and descent + ChildT* child = new ChildT(j->first, this->getTile(j).value, true); + child->topologyDifference(other.getChild(i), mBackground); + this->setChild(j, *child); + } + } else if (other.isTileOn(i)) { // other is an active tile + if (j == mTable.end() || this->isTileOff(j)) { + // do nothing + } else if (this->isChild(j)) { + setTile(j, Tile()); // delete any existing child node first + mTable.erase(j); + } else if (this->isTileOn(j)) { + this->setTile(j, Tile(this->getTile(j).value, false)); + } + } + } +} + +//////////////////////////////////////// + + +template +template +inline void +RootNode::combine(RootNode& other, CombineOp& op, bool prune) +{ + CombineArgs args; + + CoordSet keys; + this->insertKeys(keys); + other.insertKeys(keys); + + for (CoordSetCIter i = keys.begin(), e = keys.end(); i != e; ++i) { + MapIter iter = findOrAddCoord(*i), otherIter = other.findOrAddCoord(*i); + if (isTile(iter) && isTile(otherIter)) { + // Both this node and the other node have constant values (tiles). + // Combine the two values and store the result as this node's new tile value. + op(args.setARef(getTile(iter).value) + .setAIsActive(isTileOn(iter)) + .setBRef(getTile(otherIter).value) + .setBIsActive(isTileOn(otherIter))); + setTile(iter, Tile(args.result(), args.resultIsActive())); + + } else if (isChild(iter) && isTile(otherIter)) { + // Combine this node's child with the other node's constant value. + ChildT& child = getChild(iter); + child.combine(getTile(otherIter).value, isTileOn(otherIter), op); + + } else if (isTile(iter) && isChild(otherIter)) { + // Combine this node's constant value with the other node's child, + // but use a new functor in which the A and B values are swapped, + // since the constant value is the A value, not the B value. + SwappedCombineOp swappedOp(op); + ChildT& child = getChild(otherIter); + child.combine(getTile(iter).value, isTileOn(iter), swappedOp); + + // Steal the other node's child. + setChild(iter, stealChild(otherIter, Tile())); + + } else /*if (isChild(iter) && isChild(otherIter))*/ { + // Combine this node's child with the other node's child. + ChildT &child = getChild(iter), &otherChild = getChild(otherIter); + child.combine(otherChild, op); + } + if (prune && isChild(iter)) getChild(iter).prune(); + } + + // Combine background values. + op(args.setARef(mBackground).setBRef(other.mBackground)); + mBackground = args.result(); + + // Empty the other tree so as not to leave it in a partially cannibalized state. + other.clear(); +} + + +//////////////////////////////////////// + + +// This helper class is a friend of RootNode and is needed so that combine2 +// can be specialized for compatible and incompatible pairs of RootNode types. +template +struct RootNodeCombineHelper +{ + static inline void combine2(RootT& self, const RootT&, const OtherRootT& other1, + CombineOp&, bool) + { + // If the two root nodes have different configurations or incompatible ValueTypes, + // throw an exception. + self.enforceSameConfiguration(other1); + self.enforceCompatibleValueTypes(other1); + // One of the above two tests should throw, so we should never get here: + std::ostringstream ostr; + ostr << "cannot combine a " << typeid(OtherRootT).name() + << " into a " << typeid(RootT).name(); + OPENVDB_THROW(TypeError, ostr.str()); + } +}; + +// Specialization for root nodes of compatible types +template +struct RootNodeCombineHelper +{ + static inline void combine2(RootT& self, const RootT& other0, const OtherRootT& other1, + CombineOp& op, bool prune) + { + self.doCombine2(other0, other1, op, prune); + } +}; + + +template +template +inline void +RootNode::combine2(const RootNode& other0, const OtherRootNode& other1, + CombineOp& op, bool prune) +{ + typedef typename OtherRootNode::ValueType OtherValueType; + static const bool compatible = (SameConfiguration::value + && CanConvertType::value); + RootNodeCombineHelper::combine2( + *this, other0, other1, op, prune); +} + + +template +template +inline void +RootNode::doCombine2(const RootNode& other0, const OtherRootNode& other1, + CombineOp& op, bool prune) +{ + enforceSameConfiguration(other1); + + typedef typename OtherRootNode::ValueType OtherValueT; + typedef typename OtherRootNode::Tile OtherTileT; + typedef typename OtherRootNode::NodeStruct OtherNodeStructT; + typedef typename OtherRootNode::MapCIter OtherMapCIterT; + + CombineArgs args; + + CoordSet keys; + other0.insertKeys(keys); + other1.insertKeys(keys); + + const NodeStruct bg0(Tile(other0.mBackground, /*active=*/false)); + const OtherNodeStructT bg1(OtherTileT(other1.mBackground, /*active=*/false)); + + for (CoordSetCIter i = keys.begin(), e = keys.end(); i != e; ++i) { + MapIter thisIter = this->findOrAddCoord(*i); + MapCIter iter0 = other0.findKey(*i); + OtherMapCIterT iter1 = other1.findKey(*i); + const NodeStruct& ns0 = (iter0 != other0.mTable.end()) ? iter0->second : bg0; + const OtherNodeStructT& ns1 = (iter1 != other1.mTable.end()) ? iter1->second : bg1; + if (ns0.isTile() && ns1.isTile()) { + // Both input nodes have constant values (tiles). + // Combine the two values and add a new tile to this node with the result. + op(args.setARef(ns0.tile.value) + .setAIsActive(ns0.isTileOn()) + .setBRef(ns1.tile.value) + .setBIsActive(ns1.isTileOn())); + setTile(thisIter, Tile(args.result(), args.resultIsActive())); + } else { + if (!isChild(thisIter)) { + // Add a new child with the same coordinates, etc. as the other node's child. + const Coord& childOrigin = + ns0.isChild() ? ns0.child->origin() : ns1.child->origin(); + setChild(thisIter, *(new ChildT(childOrigin, getTile(thisIter).value))); + } + ChildT& child = getChild(thisIter); + + if (ns0.isTile()) { + // Combine node1's child with node0's constant value + // and write the result into this node's child. + child.combine2(ns0.tile.value, *ns1.child, ns0.isTileOn(), op); + } else if (ns1.isTile()) { + // Combine node0's child with node1's constant value + // and write the result into this node's child. + child.combine2(*ns0.child, ns1.tile.value, ns1.isTileOn(), op); + } else { + // Combine node0's child with node1's child + // and write the result into this node's child. + child.combine2(*ns0.child, *ns1.child, op); + } + } + if (prune && isChild(thisIter)) getChild(thisIter).prune(); + } + + // Combine background values. + op(args.setARef(other0.mBackground).setBRef(other1.mBackground)); + mBackground = args.result(); +} + + +//////////////////////////////////////// + + +template +template +inline void +RootNode::visitActiveBBox(BBoxOp& op) const +{ + const bool descent = op.template descent(); + for (MapCIter i = mTable.begin(), e = mTable.end(); i != e; ++i) { + if (this->isTileOff(i)) continue; + if (this->isChild(i) && descent) { + this->getChild(i).visitActiveBBox(op); + } else { +#ifdef _MSC_VER + op.operator()(CoordBBox::createCube(i->first, ChildT::DIM)); +#else + op.template operator()(CoordBBox::createCube(i->first, ChildT::DIM)); +#endif + } + } +} + + +template +template +inline void +RootNode::visit(VisitorOp& op) +{ + doVisit(*this, op); +} + + +template +template +inline void +RootNode::visit(VisitorOp& op) const +{ + doVisit(*this, op); +} + + +template +template +inline void +RootNode::doVisit(RootNodeT& self, VisitorOp& op) +{ + typename RootNodeT::ValueType val; + for (ChildAllIterT iter = self.beginChildAll(); iter; ++iter) { + if (op(iter)) continue; + if (typename ChildAllIterT::ChildNodeType* child = iter.probeChild(val)) { + child->visit(op); + } + } +} + + +//////////////////////////////////////// + + +template +template +inline void +RootNode::visit2(OtherRootNodeType& other, VisitorOp& op) +{ + doVisit2(*this, other, op); +} + + +template +template +inline void +RootNode::visit2(OtherRootNodeType& other, VisitorOp& op) const +{ + doVisit2(*this, other, op); +} + + +template +template< + typename RootNodeT, + typename OtherRootNodeT, + typename VisitorOp, + typename ChildAllIterT, + typename OtherChildAllIterT> +inline void +RootNode::doVisit2(RootNodeT& self, OtherRootNodeT& other, VisitorOp& op) +{ + enforceSameConfiguration(other); + + typename RootNodeT::ValueType val; + typename OtherRootNodeT::ValueType otherVal; + + // The two nodes are required to have corresponding table entries, + // but since that might require background tiles to be added to one or both, + // and the nodes might be const, we operate on shallow copies of the nodes instead. + RootNodeT copyOfSelf(self.mBackground); + copyOfSelf.mTable = self.mTable; + OtherRootNodeT copyOfOther(other.mBackground); + copyOfOther.mTable = other.mTable; + + // Add background tiles to both nodes as needed. + CoordSet keys; + self.insertKeys(keys); + other.insertKeys(keys); + for (CoordSetCIter i = keys.begin(), e = keys.end(); i != e; ++i) { + copyOfSelf.findOrAddCoord(*i); + copyOfOther.findOrAddCoord(*i); + } + + ChildAllIterT iter = copyOfSelf.beginChildAll(); + OtherChildAllIterT otherIter = copyOfOther.beginChildAll(); + + for ( ; iter && otherIter; ++iter, ++otherIter) + { + const size_t skipBranch = static_cast(op(iter, otherIter)); + + typename ChildAllIterT::ChildNodeType* child = + (skipBranch & 1U) ? NULL : iter.probeChild(val); + typename OtherChildAllIterT::ChildNodeType* otherChild = + (skipBranch & 2U) ? NULL : otherIter.probeChild(otherVal); + + if (child != NULL && otherChild != NULL) { + child->visit2Node(*otherChild, op); + } else if (child != NULL) { + child->visit2(otherIter, op); + } else if (otherChild != NULL) { + otherChild->visit2(iter, op, /*otherIsLHS=*/true); + } + } + // Remove any background tiles that were added above, + // as well as any that were created by the visitors. + copyOfSelf.eraseBackgroundTiles(); + copyOfOther.eraseBackgroundTiles(); + + // If either input node is non-const, replace its table with + // the (possibly modified) copy. + self.resetTable(copyOfSelf.mTable); + other.resetTable(copyOfOther.mTable); +} + +} // namespace tree +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TREE_ROOTNODE_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tree/Tree.h b/nuparu/include/openvdb/include/openvdb/tree/Tree.h new file mode 100644 index 00000000..8becf8f1 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tree/Tree.h @@ -0,0 +1,2337 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file tree/Tree.h + +#ifndef OPENVDB_TREE_TREE_HAS_BEEN_INCLUDED +#define OPENVDB_TREE_TREE_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "RootNode.h" +#include "InternalNode.h" +#include "LeafNode.h" +#include "TreeIterator.h" +#include "ValueAccessor.h" + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tree { + +/// @brief Base class for typed trees +class OPENVDB_API TreeBase +{ +public: + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + TreeBase() {} + virtual ~TreeBase() {} + + /// Return the name of this tree's type. + virtual const Name& type() const = 0; + + /// Return the name of the type of a voxel's value (e.g., "float" or "vec3d"). + virtual Name valueType() const = 0; + + /// Return a pointer to a deep copy of this tree + virtual TreeBase::Ptr copy() const = 0; + + // + // Tree methods + // + /// @brief Return this tree's background value wrapped as metadata. + /// @note Query the metadata object for the value's type. + virtual Metadata::Ptr getBackgroundValue() const { return Metadata::Ptr(); } + + /// @brief Return in @a bbox the axis-aligned bounding box of all + /// leaf nodes and active tiles. + /// @details This is faster than calling evalActiveVoxelBoundingBox, + /// which visits the individual active voxels, and hence + /// evalLeafBoundingBox produces a less tight, i.e. approximate, bbox. + /// @return @c false if the bounding box is empty (in which case + /// the bbox is set to its default value). + virtual bool evalLeafBoundingBox(CoordBBox& bbox) const = 0; + + /// @brief Return in @a dim the dimensions of the axis-aligned bounding box + /// of all leaf nodes. + /// @return @c false if the bounding box is empty. + virtual bool evalLeafDim(Coord& dim) const = 0; + + /// @brief Return in @a bbox the axis-aligned bounding box of all + /// active voxels and tiles. + /// @details This method produces a more accurate, i.e. tighter, + /// bounding box than evalLeafBoundingBox which is approximate but + /// faster. + /// @return @c false if the bounding box is empty (in which case + /// the bbox is set to its default value). + virtual bool evalActiveVoxelBoundingBox(CoordBBox& bbox) const = 0; + + /// @brief Return in @a dim the dimensions of the axis-aligned bounding box of all + /// active voxels. This is a tighter bounding box than the leaf node bounding box. + /// @return @c false if the bounding box is empty. + virtual bool evalActiveVoxelDim(Coord& dim) const = 0; + + virtual void getIndexRange(CoordBBox& bbox) const = 0; + +#ifndef OPENVDB_2_ABI_COMPATIBLE + /// @brief Replace with background tiles any nodes whose voxel buffers + /// have not yet been allocated. + /// @details Typically, unallocated nodes are leaf nodes whose voxel buffers + /// are not yet resident in memory because delayed loading is in effect. + /// @sa readNonresidentBuffers, io::File::open + virtual void clipUnallocatedNodes() = 0; +#endif + + + // + // Statistics + // + /// @brief Return the depth of this tree. + /// + /// A tree with only a root node and leaf nodes has depth 2, for example. + virtual Index treeDepth() const = 0; + /// Return the number of leaf nodes. + virtual Index32 leafCount() const = 0; + /// Return the number of non-leaf nodes. + virtual Index32 nonLeafCount() const = 0; + /// Return the number of active voxels stored in leaf nodes. + virtual Index64 activeLeafVoxelCount() const = 0; + /// Return the number of inactive voxels stored in leaf nodes. + virtual Index64 inactiveLeafVoxelCount() const = 0; + /// Return the total number of active voxels. + virtual Index64 activeVoxelCount() const = 0; + /// Return the number of inactive voxels within the bounding box of all active voxels. + virtual Index64 inactiveVoxelCount() const = 0; +#ifndef OPENVDB_2_ABI_COMPATIBLE + /// Return the total number of active tiles. + virtual Index64 activeTileCount() const = 0; +#endif + + /// Return the total amount of memory in bytes occupied by this tree. + virtual Index64 memUsage() const { return 0; } + + + // + // I/O methods + // + /// @brief Read the tree topology from a stream. + /// + /// This will read the tree structure and tile values, but not voxel data. + virtual void readTopology(std::istream&, bool saveFloatAsHalf = false); + /// @brief Write the tree topology to a stream. + /// + /// This will write the tree structure and tile values, but not voxel data. + virtual void writeTopology(std::ostream&, bool saveFloatAsHalf = false) const; + + /// Read all data buffers for this tree. + virtual void readBuffers(std::istream&, bool saveFloatAsHalf = false) = 0; +#ifndef OPENVDB_2_ABI_COMPATIBLE + /// Read all of this tree's data buffers that intersect the given bounding box. + virtual void readBuffers(std::istream&, const CoordBBox&, bool saveFloatAsHalf = false) = 0; + /// @brief Read all of this tree's data buffers that are not yet resident in memory + /// (because delayed loading is in effect). + /// @details If this tree was read from a memory-mapped file, this operation + /// disconnects the tree from the file. + /// @sa clipUnallocatedNodes, io::File::open, io::MappedFile + virtual void readNonresidentBuffers() const = 0; +#endif + /// Write out all the data buffers for this tree. + virtual void writeBuffers(std::ostream&, bool saveFloatAsHalf = false) const = 0; + + /// @brief Print statistics, memory usage and other information about this tree. + /// @param os a stream to which to write textual information + /// @param verboseLevel 1: print tree configuration only; + /// 2: include node and voxel statistics; + /// 3: include memory usage; + /// 4: include minimum and maximum voxel values + /// @warning @a verboseLevel 4 forces loading of any unallocated nodes. + virtual void print(std::ostream& os = std::cout, int verboseLevel = 1) const; + +private: + // Disallow copying of instances of this class. + //TreeBase(const TreeBase& other); + TreeBase& operator=(const TreeBase& other); +}; + + +//////////////////////////////////////// + + +template +class Tree: public TreeBase +{ +public: + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + typedef _RootNodeType RootNodeType; + typedef typename RootNodeType::ValueType ValueType; + typedef typename RootNodeType::BuildType BuildType; + typedef typename RootNodeType::LeafNodeType LeafNodeType; + + static const Index DEPTH = RootNodeType::LEVEL + 1; + + /// @brief ValueConverter::Type is the type of a tree having the same + /// hierarchy as this tree but a different value type, T. + /// + /// For example, FloatTree::ValueConverter::Type is equivalent to DoubleTree. + /// @note If the source tree type is a template argument, it might be necessary + /// to write "typename SourceTree::template ValueConverter::Type". + template + struct ValueConverter { + typedef Tree::Type> Type; + }; + + + Tree() {} + + /// Deep copy constructor + Tree(const Tree& other): TreeBase(other), mRoot(other.mRoot) + { + } + + /// @brief Value conversion deep copy constructor + /// + /// Deep copy a tree of the same configuration as this tree type but a different + /// ValueType, casting the other tree's values to this tree's ValueType. + /// @throw TypeError if the other tree's configuration doesn't match this tree's + /// or if this tree's ValueType is not constructible from the other tree's ValueType. + template + explicit Tree(const Tree& other): TreeBase(other), mRoot(other.root()) + { + } + + /// @brief Topology copy constructor from a tree of a different type + /// + /// Copy the structure, i.e., the active states of tiles and voxels, of another + /// tree of a possibly different type, but don't copy any tile or voxel values. + /// Instead, initialize tiles and voxels with the given active and inactive values. + /// @param other a tree having (possibly) a different ValueType + /// @param inactiveValue background value for this tree, and the value to which + /// all inactive tiles and voxels are initialized + /// @param activeValue value to which active tiles and voxels are initialized + /// @throw TypeError if the other tree's configuration doesn't match this tree's. + template + Tree(const OtherTreeType& other, + const ValueType& inactiveValue, + const ValueType& activeValue, + TopologyCopy): + TreeBase(other), + mRoot(other.root(), inactiveValue, activeValue, TopologyCopy()) + { + } + + /// @brief Topology copy constructor from a tree of a different type + /// + /// @note This topology copy constructor is generally faster than + /// the one that takes both a foreground and a background value. + /// + /// Copy the structure, i.e., the active states of tiles and voxels, of another + /// tree of a possibly different type, but don't copy any tile or voxel values. + /// Instead, initialize tiles and voxels with the given background value. + /// @param other a tree having (possibly) a different ValueType + /// @param background the value to which tiles and voxels are initialized + /// @throw TypeError if the other tree's configuration doesn't match this tree's. + template + Tree(const OtherTreeType& other, const ValueType& background, TopologyCopy): + TreeBase(other), + mRoot(other.root(), background, TopologyCopy()) + { + } + + /// Empty tree constructor + Tree(const ValueType& background): mRoot(background) {} + + virtual ~Tree() { this->clear(); releaseAllAccessors(); } + + /// Return a pointer to a deep copy of this tree + virtual TreeBase::Ptr copy() const { return TreeBase::Ptr(new Tree(*this)); } + + /// Return the name of the type of a voxel's value (e.g., "float" or "vec3d") + virtual Name valueType() const { return typeNameAsString(); } + + /// Return the name of this type of tree. + static const Name& treeType(); + /// Return the name of this type of tree. + virtual const Name& type() const { return this->treeType(); } + + bool operator==(const Tree&) const { OPENVDB_THROW(NotImplementedError, ""); } + bool operator!=(const Tree&) const { OPENVDB_THROW(NotImplementedError, ""); } + + //@{ + /// Return this tree's root node. + RootNodeType& root() { return mRoot; } + const RootNodeType& root() const { return mRoot; } + //@} + + + // + // Tree methods + // + /// @brief Return @c true if the given tree has the same node and active value + /// topology as this tree, whether or not it has the same @c ValueType. + template + bool hasSameTopology(const Tree& other) const; + + virtual bool evalLeafBoundingBox(CoordBBox& bbox) const; + virtual bool evalActiveVoxelBoundingBox(CoordBBox& bbox) const; + virtual bool evalActiveVoxelDim(Coord& dim) const; + virtual bool evalLeafDim(Coord& dim) const; + + /// @brief Traverse the type hierarchy of nodes, and return, in @a dims, a list + /// of the Log2Dims of nodes in order from RootNode to LeafNode. + /// @note Because RootNodes are resizable, the RootNode Log2Dim is 0 for all trees. + static void getNodeLog2Dims(std::vector& dims); + + + // + // I/O methods + // + /// @brief Read the tree topology from a stream. + /// + /// This will read the tree structure and tile values, but not voxel data. + virtual void readTopology(std::istream&, bool saveFloatAsHalf = false); + /// @brief Write the tree topology to a stream. + /// + /// This will write the tree structure and tile values, but not voxel data. + virtual void writeTopology(std::ostream&, bool saveFloatAsHalf = false) const; + /// Read all data buffers for this tree. + virtual void readBuffers(std::istream&, bool saveFloatAsHalf = false); +#ifndef OPENVDB_2_ABI_COMPATIBLE + /// Read all of this tree's data buffers that intersect the given bounding box. + virtual void readBuffers(std::istream&, const CoordBBox&, bool saveFloatAsHalf = false); + /// @brief Read all of this tree's data buffers that are not yet resident in memory + /// (because delayed loading is in effect). + /// @details If this tree was read from a memory-mapped file, this operation + /// disconnects the tree from the file. + /// @sa clipUnallocatedNodes, io::File::open, io::MappedFile + virtual void readNonresidentBuffers() const; +#endif + /// Write out all data buffers for this tree. + virtual void writeBuffers(std::ostream&, bool saveFloatAsHalf = false) const; + + virtual void print(std::ostream& os = std::cout, int verboseLevel = 1) const; + + + // + // Statistics + // + /// @brief Return the depth of this tree. + /// + /// A tree with only a root node and leaf nodes has depth 2, for example. + virtual Index treeDepth() const { return DEPTH; } + /// Return the number of leaf nodes. + virtual Index32 leafCount() const { return mRoot.leafCount(); } + /// Return the number of non-leaf nodes. + virtual Index32 nonLeafCount() const { return mRoot.nonLeafCount(); } + /// Return the number of active voxels stored in leaf nodes. + virtual Index64 activeLeafVoxelCount() const { return mRoot.onLeafVoxelCount(); } + /// Return the number of inactive voxels stored in leaf nodes. + virtual Index64 inactiveLeafVoxelCount() const { return mRoot.offLeafVoxelCount(); } + /// Return the total number of active voxels. + virtual Index64 activeVoxelCount() const { return mRoot.onVoxelCount(); } + /// Return the number of inactive voxels within the bounding box of all active voxels. + virtual Index64 inactiveVoxelCount() const; + /// Return the total number of active tiles. + Index64 activeTileCount() const { return mRoot.onTileCount(); } + + /// Return the minimum and maximum active values in this tree. + void evalMinMax(ValueType &min, ValueType &max) const; + + virtual Index64 memUsage() const { return sizeof(*this) + mRoot.memUsage(); } + + + // + // Voxel access methods (using signed indexing) + // + /// Return the value of the voxel at the given coordinates. + const ValueType& getValue(const Coord& xyz) const; + /// @brief Return the value of the voxel at the given coordinates + /// and update the given accessor's node cache. + template const ValueType& getValue(const Coord& xyz, AccessT&) const; + + /// @brief Return the tree depth (0 = root) at which the value of voxel (x, y, z) resides. + /// @details If (x, y, z) isn't explicitly represented in the tree (i.e., it is + /// implicitly a background voxel), return -1. + int getValueDepth(const Coord& xyz) const; + + /// Set the active state of the voxel at the given coordinates but don't change its value. + void setActiveState(const Coord& xyz, bool on); + /// Set the value of the voxel at the given coordinates but don't change its active state. + void setValueOnly(const Coord& xyz, const ValueType& value); + /// Mark the voxel at the given coordinates as active but don't change its value. + void setValueOn(const Coord& xyz); + /// Set the value of the voxel at the given coordinates and mark the voxel as active. + void setValueOn(const Coord& xyz, const ValueType& value); + /// Set the value of the voxel at the given coordinates and mark the voxel as active. + void setValue(const Coord& xyz, const ValueType& value); + /// @brief Set the value of the voxel at the given coordinates, mark the voxel as active, + /// and update the given accessor's node cache. + template void setValue(const Coord& xyz, const ValueType& value, AccessT&); + /// Mark the voxel at the given coordinates as inactive but don't change its value. + void setValueOff(const Coord& xyz); + /// Set the value of the voxel at the given coordinates and mark the voxel as inactive. + void setValueOff(const Coord& xyz, const ValueType& value); + + /// @brief Apply a functor to the value of the voxel at the given coordinates + /// and mark the voxel as active. + /// @details Provided that the functor can be inlined, this is typically + /// significantly faster than calling getValue() followed by setValueOn(). + /// @param xyz the coordinates of a voxel whose value is to be modified + /// @param op a functor of the form void op(ValueType&) const that modifies + /// its argument in place + /// @par Example: + /// @code + /// Coord xyz(1, 0, -2); + /// // Multiply the value of a voxel by a constant and mark the voxel as active. + /// floatTree.modifyValue(xyz, [](float& f) { f *= 0.25; }); // C++11 + /// // Set the value of a voxel to the maximum of its current value and 0.25, + /// // and mark the voxel as active. + /// floatTree.modifyValue(xyz, [](float& f) { f = std::max(f, 0.25f); }); // C++11 + /// @endcode + /// @note The functor is not guaranteed to be called only once. + /// @see tools::foreach() + template + void modifyValue(const Coord& xyz, const ModifyOp& op); + + /// @brief Apply a functor to the voxel at the given coordinates. + /// @details Provided that the functor can be inlined, this is typically + /// significantly faster than calling getValue() followed by setValue(). + /// @param xyz the coordinates of a voxel to be modified + /// @param op a functor of the form void op(ValueType&, bool&) const that + /// modifies its arguments, a voxel's value and active state, in place + /// @par Example: + /// @code + /// Coord xyz(1, 0, -2); + /// // Multiply the value of a voxel by a constant and mark the voxel as inactive. + /// floatTree.modifyValueAndActiveState(xyz, + /// [](float& f, bool& b) { f *= 0.25; b = false; }); // C++11 + /// // Set the value of a voxel to the maximum of its current value and 0.25, + /// // but don't change the voxel's active state. + /// floatTree.modifyValueAndActiveState(xyz, + /// [](float& f, bool&) { f = std::max(f, 0.25f); }); // C++11 + /// @endcode + /// @note The functor is not guaranteed to be called only once. + /// @see tools::foreach() + template + void modifyValueAndActiveState(const Coord& xyz, const ModifyOp& op); + + /// @brief Get the value of the voxel at the given coordinates. + /// @return @c true if the value is active. + bool probeValue(const Coord& xyz, ValueType& value) const; + + /// Return @c true if the value at the given coordinates is active. + bool isValueOn(const Coord& xyz) const { return mRoot.isValueOn(xyz); } + /// Return @c true if the value at the given coordinates is inactive. + bool isValueOff(const Coord& xyz) const { return !this->isValueOn(xyz); } + /// Return @c true if this tree has any active tiles. + bool hasActiveTiles() const { return mRoot.hasActiveTiles(); } + + /// Set all voxels that lie outside the given axis-aligned box to the background. + void clip(const CoordBBox&); + +#ifndef OPENVDB_2_ABI_COMPATIBLE + /// @brief Replace with background tiles any nodes whose voxel buffers + /// have not yet been allocated. + /// @details Typically, unallocated nodes are leaf nodes whose voxel buffers + /// are not yet resident in memory because delayed loading is in effect. + /// @sa readNonresidentBuffers, io::File::open + virtual void clipUnallocatedNodes(); +#endif + + /// @brief Set all voxels within a given axis-aligned box to a constant value. + /// If necessary, subdivide tiles that intersect the box. + /// @param bbox inclusive coordinates of opposite corners of an axis-aligned box + /// @param value the value to which to set voxels within the box + /// @param active if true, mark voxels within the box as active, + /// otherwise mark them as inactive. Defaults to true. + /// @param sparse if false, active tiles are voxelized, i.e. only active voxels + /// are generated from the fill operation. Defaults to true. + /// @note If @a sparse is true this operation generates a sparse, but not always optimally sparse, + /// representation of the filled box. Follow fill operations with a prune() + /// operation for optimal sparseness. + void fill(const CoordBBox& bbox, const ValueType& value, bool active = true, bool sparse = true); + + /// @brief Reduce the memory footprint of this tree by replacing with tiles + /// any nodes whose values are all the same (optionally to within a tolerance) + /// and have the same active state. + /// @warning Will soon be deprecated! + void prune(const ValueType& tolerance = zeroVal()) + { + this->clearAllAccessors(); + mRoot.prune(tolerance); + } + + /// @brief Add the given leaf node to this tree, creating a new branch if necessary. + /// If a leaf node with the same origin already exists, replace it. + void addLeaf(LeafNodeType& leaf) { mRoot.addLeaf(&leaf); } + + /// @brief Add a tile containing voxel (x, y, z) at the specified tree level, + /// creating a new branch if necessary. Delete any existing lower-level nodes + /// that contain (x, y, z). + /// @note @a level must be less than this tree's depth. + void addTile(Index level, const Coord& xyz, const ValueType& value, bool active); + + /// @brief Return a pointer to the node of type @c NodeT that contains voxel (x, y, z) + /// and replace it with a tile of the specified value and state. + /// If no such node exists, leave the tree unchanged and return @c NULL. + /// @note The caller takes ownership of the node and is responsible for deleting it. + template + NodeT* stealNode(const Coord& xyz, const ValueType& value, bool active); + + /// @brief Return a pointer to the leaf node that contains voxel (x, y, z). + /// If no such node exists, create one that preserves the values and + /// active states of all voxels. + /// @details Use this method to preallocate a static tree topology over which to + /// safely perform multithreaded processing. + LeafNodeType* touchLeaf(const Coord& xyz); + + //@{ + /// @brief Return a pointer to the node of type @c NodeType that contains + /// voxel (x, y, z). If no such node exists, return NULL. + template NodeType* probeNode(const Coord& xyz); + template const NodeType* probeConstNode(const Coord& xyz) const; + template const NodeType* probeNode(const Coord& xyz) const; + //@} + + //@{ + /// @brief Return a pointer to the leaf node that contains voxel (x, y, z). + /// If no such node exists, return NULL. + LeafNodeType* probeLeaf(const Coord& xyz); + const LeafNodeType* probeConstLeaf(const Coord& xyz) const; + const LeafNodeType* probeLeaf(const Coord& xyz) const { return this->probeConstLeaf(xyz); } + //@} + + //@{ + /// @brief Adds all nodes of a certain type to a container with the following API: + /// @code + /// struct ArrayT { + /// typedef value_type;// defines the type of nodes to be added to the array + /// void push_back(value_type nodePtr);// method that add nodes to the array + /// }; + /// @endcode + /// @details An example of a wrapper around a c-style array is: + /// @code + /// struct MyArray { + /// typedef LeafType* value_type; + /// value_type* ptr; + /// MyArray(value_type* array) : ptr(array) {} + /// void push_back(value_type leaf) { *ptr++ = leaf; } + ///}; + /// @endcode + /// @details An example that constructs a list of pointer to all leaf nodes is: + /// @code + /// std::vector array;//most std contains have the required API + /// array.reserve(tree.leafCount());//this is a fast preallocation. + /// tree.getNodes(array); + /// @endcode + template void getNodes(ArrayT& array) { mRoot.getNodes(array); } + template void getNodes(ArrayT& array) const { mRoot.getNodes(array); } + //@} + + /// @brief Steals all nodes of a certain type from the tree and + /// adds them to a container with the following API: + /// @code + /// struct ArrayT { + /// typedef value_type;// defines the type of nodes to be added to the array + /// void push_back(value_type nodePtr);// method that add nodes to the array + /// }; + /// @endcode + /// @details An example of a wrapper around a c-style array is: + /// @code + /// struct MyArray { + /// typedef LeafType* value_type; + /// value_type* ptr; + /// MyArray(value_type* array) : ptr(array) {} + /// void push_back(value_type leaf) { *ptr++ = leaf; } + ///}; + /// @endcode + /// @details An example that constructs a list of pointer to all leaf nodes is: + /// @code + /// std::vector array;//most std contains have the required API + /// array.reserve(tree.leafCount());//this is a fast preallocation. + /// tree.stealNodes(array); + /// @endcode + template + void stealNodes(ArrayT& array) { this->clearAllAccessors(); mRoot.stealNodes(array); } + template + void stealNodes(ArrayT& array, const ValueType& value, bool state) + { + this->clearAllAccessors(); + mRoot.stealNodes(array, value, state); + } + + // + // Aux methods + // + /// @brief Return @c true if this tree contains no nodes other than + /// the root node and no tiles other than background tiles. + bool empty() const { return mRoot.empty(); } + + /// Remove all tiles from this tree and all nodes other than the root node. + void clear(); + + /// Clear all registered accessors. + void clearAllAccessors(); + + //@{ + /// @brief Register an accessor for this tree. Registered accessors are + /// automatically cleared whenever one of this tree's nodes is deleted. + void attachAccessor(ValueAccessorBase&) const; + void attachAccessor(ValueAccessorBase&) const; + //@} + + //@{ + /// Dummy implementations + void attachAccessor(ValueAccessorBase&) const {} + void attachAccessor(ValueAccessorBase&) const {} + //@} + + //@{ + /// Deregister an accessor so that it is no longer automatically cleared. + void releaseAccessor(ValueAccessorBase&) const; + void releaseAccessor(ValueAccessorBase&) const; + //@} + + //@{ + /// Dummy implementations + void releaseAccessor(ValueAccessorBase&) const {} + void releaseAccessor(ValueAccessorBase&) const {} + //@} + + /// @brief Return this tree's background value wrapped as metadata. + /// @note Query the metadata object for the value's type. + virtual Metadata::Ptr getBackgroundValue() const; + + /// @brief Return this tree's background value. + /// + /// @note Use tools::changeBackground to efficiently modify the + /// background values. Else use tree.root().setBackground, which + /// is serial and hence slower. + const ValueType& background() const { return mRoot.background(); } + + /// Min and max are both inclusive. + virtual void getIndexRange(CoordBBox& bbox) const { mRoot.getIndexRange(bbox); } + + /// @brief Densify active tiles, i.e., replace them with leaf-level active voxels. + /// + /// @param threaded if true, this operation is multi-threaded (over the internal nodes). + /// + /// @warning This method can explode the tree's memory footprint, especially if it + /// contains active tiles at the upper levels, e.g. root level! + void voxelizeActiveTiles(bool threaded = true); + + /// @brief Efficiently merge another tree into this tree using one of several schemes. + /// @details This operation is primarily intended to combine trees that are mostly + /// non-overlapping (for example, intermediate trees from computations that are + /// parallelized across disjoint regions of space). + /// @note This operation is not guaranteed to produce an optimally sparse tree. + /// Follow merge() with prune() for optimal sparseness. + /// @warning This operation always empties the other tree. + void merge(Tree& other, MergePolicy = MERGE_ACTIVE_STATES); + + /// @brief Union this tree's set of active values with the active values + /// of the other tree, whose @c ValueType may be different. + /// @details The resulting state of a value is active if the corresponding value + /// was already active OR if it is active in the other tree. Also, a resulting + /// value maps to a voxel if the corresponding value already mapped to a voxel + /// OR if it is a voxel in the other tree. Thus, a resulting value can only + /// map to a tile if the corresponding value already mapped to a tile + /// AND if it is a tile value in other tree. + /// + /// @note This operation modifies only active states, not values. + /// Specifically, active tiles and voxels in this tree are not changed, and + /// tiles or voxels that were inactive in this tree but active in the other tree + /// are marked as active in this tree but left with their original values. + template + void topologyUnion(const Tree& other); + + /// @brief Intersects this tree's set of active values with the active values + /// of the other tree, whose @c ValueType may be different. + /// @details The resulting state of a value is active only if the corresponding + /// value was already active AND if it is active in the other tree. Also, a + /// resulting value maps to a voxel if the corresponding value + /// already mapped to an active voxel in either of the two grids + /// and it maps to an active tile or voxel in the other grid. + /// + /// @note This operation can delete branches in this grid if they + /// overlap with inactive tiles in the other grid. Likewise active + /// voxels can be turned into unactive voxels resulting in leaf + /// nodes with no active values. Thus, it is recommended to + /// subsequently call tools::pruneInactive. + template + void topologyIntersection(const Tree& other); + + /// @brief Difference this tree's set of active values with the active values + /// of the other tree, whose @c ValueType may be different. So a + /// resulting voxel will be active only if the original voxel is + /// active in this tree and inactive in the other tree. + /// + /// @note This operation can delete branches in this grid if they + /// overlap with active tiles in the other grid. Likewise active + /// voxels can be turned into inactive voxels resulting in leaf + /// nodes with no active values. Thus, it is recommended to + /// subsequently call tools::pruneInactive. + template + void topologyDifference(const Tree& other); + + /// For a given function @c f, use sparse traversal to compute f(this, other) + /// over all corresponding pairs of values (tile or voxel) of this tree and the other tree + /// and store the result in this tree. + /// This method is typically more space-efficient than the two-tree combine2(), + /// since it moves rather than copies nodes from the other tree into this tree. + /// @note This operation always empties the other tree. + /// @param other a tree of the same type as this tree + /// @param op a functor of the form void op(const T& a, const T& b, T& result), + /// where @c T is this tree's @c ValueType, that computes + /// result = f(a, b) + /// @param prune if true, prune the resulting tree one branch at a time (this is usually + /// more space-efficient than pruning the entire tree in one pass) + /// + /// @par Example: + /// Compute the per-voxel difference between two floating-point trees, + /// @c aTree and @c bTree, and store the result in @c aTree (leaving @c bTree empty). + /// @code + /// { + /// struct Local { + /// static inline void diff(const float& a, const float& b, float& result) { + /// result = a - b; + /// } + /// }; + /// aTree.combine(bTree, Local::diff); + /// } + /// @endcode + /// + /// @par Example: + /// Compute f * a + (1 - f) * b over all voxels of two floating-point trees, + /// @c aTree and @c bTree, and store the result in @c aTree (leaving @c bTree empty). + /// @code + /// namespace { + /// struct Blend { + /// Blend(float f): frac(f) {} + /// inline void operator()(const float& a, const float& b, float& result) const { + /// result = frac * a + (1.0 - frac) * b; + /// } + /// float frac; + /// }; + /// } + /// { + /// aTree.combine(bTree, Blend(0.25)); // 0.25 * a + 0.75 * b + /// } + /// @endcode + template + void combine(Tree& other, CombineOp& op, bool prune = false); +#ifndef _MSC_VER + template + void combine(Tree& other, const CombineOp& op, bool prune = false); +#endif + + /// Like combine(), but with + /// @param other a tree of the same type as this tree + /// @param op a functor of the form void op(CombineArgs& args) that + /// computes args.setResult(f(args.a(), args.b())) and, optionally, + /// args.setResultIsActive(g(args.aIsActive(), args.bIsActive())) + /// for some functions @c f and @c g + /// @param prune if true, prune the resulting tree one branch at a time (this is usually + /// more space-efficient than pruning the entire tree in one pass) + /// + /// This variant passes not only the @em a and @em b values but also the active states + /// of the @em a and @em b values to the functor, which may then return, by calling + /// @c args.setResultIsActive(), a computed active state for the result value. + /// By default, the result is active if either the @em a or the @em b value is active. + /// + /// @see openvdb/Types.h for the definition of the CombineArgs struct. + /// + /// @par Example: + /// Replace voxel values in floating-point @c aTree with corresponding values + /// from floating-point @c bTree (leaving @c bTree empty) wherever the @c bTree + /// values are larger. Also, preserve the active states of any transferred values. + /// @code + /// { + /// struct Local { + /// static inline void max(CombineArgs& args) { + /// if (args.b() > args.a()) { + /// // Transfer the B value and its active state. + /// args.setResult(args.b()); + /// args.setResultIsActive(args.bIsActive()); + /// } else { + /// // Preserve the A value and its active state. + /// args.setResult(args.a()); + /// args.setResultIsActive(args.aIsActive()); + /// } + /// } + /// }; + /// aTree.combineExtended(bTree, Local::max); + /// } + /// @endcode + template + void combineExtended(Tree& other, ExtendedCombineOp& op, bool prune = false); +#ifndef _MSC_VER + template + void combineExtended(Tree& other, const ExtendedCombineOp& op, bool prune = false); +#endif + + /// For a given function @c f, use sparse traversal to compute f(a, b) over all + /// corresponding pairs of values (tile or voxel) of trees A and B and store the result + /// in this tree. + /// @param a,b two trees with the same configuration (levels and node dimensions) + /// as this tree but with the B tree possibly having a different value type + /// @param op a functor of the form void op(const T1& a, const T2& b, T1& result), + /// where @c T1 is this tree's and the A tree's @c ValueType and @c T2 is the + /// B tree's @c ValueType, that computes result = f(a, b) + /// @param prune if true, prune the resulting tree one branch at a time (this is usually + /// more space-efficient than pruning the entire tree in one pass) + /// + /// @throw TypeError if the B tree's configuration doesn't match this tree's + /// or if this tree's ValueType is not constructible from the B tree's ValueType. + /// + /// @par Example: + /// Compute the per-voxel difference between two floating-point trees, + /// @c aTree and @c bTree, and store the result in a third tree. + /// @code + /// { + /// struct Local { + /// static inline void diff(const float& a, const float& b, float& result) { + /// result = a - b; + /// } + /// }; + /// FloatTree resultTree; + /// resultTree.combine2(aTree, bTree, Local::diff); + /// } + /// @endcode + template + void combine2(const Tree& a, const OtherTreeType& b, CombineOp& op, bool prune = false); +#ifndef _MSC_VER + template + void combine2(const Tree& a, const OtherTreeType& b, const CombineOp& op, bool prune = false); +#endif + + /// Like combine2(), but with + /// @param a,b two trees with the same configuration (levels and node dimensions) + /// as this tree but with the B tree possibly having a different value type + /// @param op a functor of the form void op(CombineArgs& args), where + /// @c T1 is this tree's and the A tree's @c ValueType and @c T2 is the B tree's + /// @c ValueType, that computes args.setResult(f(args.a(), args.b())) + /// and, optionally, + /// args.setResultIsActive(g(args.aIsActive(), args.bIsActive())) + /// for some functions @c f and @c g + /// @param prune if true, prune the resulting tree one branch at a time (this is usually + /// more space-efficient than pruning the entire tree in one pass) + /// This variant passes not only the @em a and @em b values but also the active states + /// of the @em a and @em b values to the functor, which may then return, by calling + /// args.setResultIsActive(), a computed active state for the result value. + /// By default, the result is active if either the @em a or the @em b value is active. + /// + /// @throw TypeError if the B tree's configuration doesn't match this tree's + /// or if this tree's ValueType is not constructible from the B tree's ValueType. + /// + /// @see openvdb/Types.h for the definition of the CombineArgs struct. + /// + /// @par Example: + /// Compute the per-voxel maximum values of two single-precision floating-point trees, + /// @c aTree and @c bTree, and store the result in a third tree. Set the active state + /// of each output value to that of the larger of the two input values. + /// @code + /// { + /// struct Local { + /// static inline void max(CombineArgs& args) { + /// if (args.b() > args.a()) { + /// // Transfer the B value and its active state. + /// args.setResult(args.b()); + /// args.setResultIsActive(args.bIsActive()); + /// } else { + /// // Preserve the A value and its active state. + /// args.setResult(args.a()); + /// args.setResultIsActive(args.aIsActive()); + /// } + /// } + /// }; + /// FloatTree aTree = ...; + /// FloatTree bTree = ...; + /// FloatTree resultTree; + /// resultTree.combine2Extended(aTree, bTree, Local::max); + /// } + /// @endcode + /// + /// @par Example: + /// Compute the per-voxel maximum values of a double-precision and a single-precision + /// floating-point tree, @c aTree and @c bTree, and store the result in a third, + /// double-precision tree. Set the active state of each output value to that of + /// the larger of the two input values. + /// @code + /// { + /// struct Local { + /// static inline void max(CombineArgs& args) { + /// if (args.b() > args.a()) { + /// // Transfer the B value and its active state. + /// args.setResult(args.b()); + /// args.setResultIsActive(args.bIsActive()); + /// } else { + /// // Preserve the A value and its active state. + /// args.setResult(args.a()); + /// args.setResultIsActive(args.aIsActive()); + /// } + /// } + /// }; + /// DoubleTree aTree = ...; + /// FloatTree bTree = ...; + /// DoubleTree resultTree; + /// resultTree.combine2Extended(aTree, bTree, Local::max); + /// } + /// @endcode + template + void combine2Extended(const Tree& a, const OtherTreeType& b, ExtendedCombineOp& op, + bool prune = false); +#ifndef _MSC_VER + template + void combine2Extended(const Tree& a, const OtherTreeType& b, const ExtendedCombineOp&, + bool prune = false); +#endif + + /// @brief Use sparse traversal to call the given functor with bounding box + /// information for all active tiles and leaf nodes or active voxels in the tree. + /// + /// @note The bounding boxes are guaranteed to be non-overlapping. + /// @param op a functor with a templated call operator of the form + /// template void operator()(const CoordBBox& bbox), + /// where bbox is the bounding box of either an active tile + /// (if @c LEVEL > 0), a leaf node or an active voxel. + /// The functor must also provide a templated method of the form + /// template bool descent() that returns @c false + /// if bounding boxes below the specified tree level are not to be visited. + /// In such cases of early tree termination, a bounding box is instead + /// derived from each terminating child node. + /// + /// @par Example: + /// Visit and process all active tiles and leaf nodes in a tree, but don't + /// descend to the active voxels. The smallest bounding boxes that will be + /// visited are those of leaf nodes or level-1 active tiles. + /// @code + /// { + /// struct ProcessTilesAndLeafNodes { + /// // Descend to leaf nodes, but no further. + /// template inline bool descent() { return LEVEL > 0; } + /// // Use this version to descend to voxels: + /// //template inline bool descent() { return true; } + /// + /// template + /// inline void operator()(const CoordBBox &bbox) { + /// if (LEVEL > 0) { + /// // code to process an active tile + /// } else { + /// // code to process a leaf node + /// } + /// } + /// }; + /// ProcessTilesAndLeafNodes op; + /// aTree.visitActiveBBox(op); + /// } + /// @endcode + /// @see openvdb/unittest/TestTree.cc for another example. + template void visitActiveBBox(BBoxOp& op) const { mRoot.visitActiveBBox(op); } + + /// Traverse this tree in depth-first order, and at each node call the given functor + /// with a @c DenseIterator (see Iterator.h) that points to either a child node or a + /// tile value. If the iterator points to a child node and the functor returns true, + /// do not descend to the child node; instead, continue the traversal at the next + /// iterator position. + /// @param op a functor of the form template bool op(IterT&), + /// where @c IterT is either a RootNode::ChildAllIter, + /// an InternalNode::ChildAllIter or a LeafNode::ChildAllIter + /// + /// @note There is no iterator that points to a RootNode, so to visit the root node, + /// retrieve the @c parent() of a RootNode::ChildAllIter. + /// + /// @par Example: + /// Print information about the nodes and tiles of a tree, but not individual voxels. + /// @code + /// namespace { + /// template + /// struct PrintTreeVisitor + /// { + /// typedef typename TreeT::RootNodeType RootT; + /// bool visitedRoot; + /// + /// PrintTreeVisitor(): visitedRoot(false) {} + /// + /// template + /// inline bool operator()(IterT& iter) + /// { + /// if (!visitedRoot && iter.parent().getLevel() == RootT::LEVEL) { + /// visitedRoot = true; + /// std::cout << "Level-" << RootT::LEVEL << " node" << std::endl; + /// } + /// typename IterT::NonConstValueType value; + /// typename IterT::ChildNodeType* child = iter.probeChild(value); + /// if (child == NULL) { + /// std::cout << "Tile with value " << value << std::endl; + /// return true; // no child to visit, so stop descending + /// } + /// std::cout << "Level-" << child->getLevel() << " node" << std::endl; + /// return (child->getLevel() == 0); // don't visit leaf nodes + /// } + /// + /// // The generic method, above, calls iter.probeChild(), which is not defined + /// // for LeafNode::ChildAllIter. These overloads ensure that the generic + /// // method template doesn't get instantiated for LeafNode iterators. + /// bool operator()(typename TreeT::LeafNodeType::ChildAllIter&) { return true; } + /// bool operator()(typename TreeT::LeafNodeType::ChildAllCIter&) { return true; } + /// }; + /// } + /// { + /// PrintTreeVisitor visitor; + /// tree.visit(visitor); + /// } + /// @endcode + template void visit(VisitorOp& op); + template void visit(const VisitorOp& op); + + /// Like visit(), but using @c const iterators, i.e., with + /// @param op a functor of the form template bool op(IterT&), + /// where @c IterT is either a RootNode::ChildAllCIter, + /// an InternalNode::ChildAllCIter or a LeafNode::ChildAllCIter + template void visit(VisitorOp& op) const; + template void visit(const VisitorOp& op) const; + + /// Traverse this tree and another tree in depth-first order, and for corresponding + /// subregions of index space call the given functor with two @c DenseIterators + /// (see Iterator.h), each of which points to either a child node or a tile value + /// of this tree and the other tree. If the A iterator points to a child node + /// and the functor returns a nonzero value with bit 0 set (e.g., 1), do not descend + /// to the child node; instead, continue the traversal at the next A iterator position. + /// Similarly, if the B iterator points to a child node and the functor returns a value + /// with bit 1 set (e.g., 2), continue the traversal at the next B iterator position. + /// @note The other tree must have the same index space and fan-out factors as + /// this tree, but it may have a different @c ValueType and a different topology. + /// @param other a tree of the same type as this tree + /// @param op a functor of the form + /// template int op(AIterT&, BIterT&), + /// where @c AIterT and @c BIterT are any combination of a + /// RootNode::ChildAllIter, an InternalNode::ChildAllIter or a + /// LeafNode::ChildAllIter with an @c OtherTreeType::RootNode::ChildAllIter, + /// an @c OtherTreeType::InternalNode::ChildAllIter + /// or an @c OtherTreeType::LeafNode::ChildAllIter + /// + /// @par Example: + /// Given two trees of the same type, @c aTree and @c bTree, replace leaf nodes of + /// @c aTree with corresponding leaf nodes of @c bTree, leaving @c bTree partially empty. + /// @code + /// namespace { + /// template + /// inline int stealLeafNodes(AIterT& aIter, BIterT& bIter) + /// { + /// typename AIterT::NonConstValueType aValue; + /// typename AIterT::ChildNodeType* aChild = aIter.probeChild(aValue); + /// typename BIterT::NonConstValueType bValue; + /// typename BIterT::ChildNodeType* bChild = bIter.probeChild(bValue); + /// + /// const Index aLevel = aChild->getLevel(), bLevel = bChild->getLevel(); + /// if (aChild && bChild && aLevel == 0 && bLevel == 0) { // both are leaf nodes + /// aIter.setChild(bChild); // give B's child to A + /// bIter.setValue(bValue); // replace B's child with a constant tile value + /// } + /// // Don't iterate over leaf node voxels of either A or B. + /// int skipBranch = (aLevel == 0) ? 1 : 0; + /// if (bLevel == 0) skipBranch = skipBranch | 2; + /// return skipBranch; + /// } + /// } + /// { + /// aTree.visit2(bTree, stealLeafNodes); + /// } + /// @endcode + template + void visit2(OtherTreeType& other, VisitorOp& op); + template + void visit2(OtherTreeType& other, const VisitorOp& op); + + /// Like visit2(), but using @c const iterators, i.e., with + /// @param other a tree of the same type as this tree + /// @param op a functor of the form + /// template int op(AIterT&, BIterT&), + /// where @c AIterT and @c BIterT are any combination of a + /// RootNode::ChildAllCIter, an InternalNode::ChildAllCIter + /// or a LeafNode::ChildAllCIter with an + /// @c OtherTreeType::RootNode::ChildAllCIter, + /// an @c OtherTreeType::InternalNode::ChildAllCIter + /// or an @c OtherTreeType::LeafNode::ChildAllCIter + template + void visit2(OtherTreeType& other, VisitorOp& op) const; + template + void visit2(OtherTreeType& other, const VisitorOp& op) const; + + + // + // Iteration + // + //@{ + /// Return an iterator over children of the root node. + typename RootNodeType::ChildOnCIter beginRootChildren() const { return mRoot.cbeginChildOn(); } + typename RootNodeType::ChildOnCIter cbeginRootChildren() const { return mRoot.cbeginChildOn(); } + typename RootNodeType::ChildOnIter beginRootChildren() { return mRoot.beginChildOn(); } + //@} + + //@{ + /// Return an iterator over non-child entries of the root node's table. + typename RootNodeType::ChildOffCIter beginRootTiles() const { return mRoot.cbeginChildOff(); } + typename RootNodeType::ChildOffCIter cbeginRootTiles() const { return mRoot.cbeginChildOff(); } + typename RootNodeType::ChildOffIter beginRootTiles() { return mRoot.beginChildOff(); } + //@} + + //@{ + /// Return an iterator over all entries of the root node's table. + typename RootNodeType::ChildAllCIter beginRootDense() const { return mRoot.cbeginChildAll(); } + typename RootNodeType::ChildAllCIter cbeginRootDense() const { return mRoot.cbeginChildAll(); } + typename RootNodeType::ChildAllIter beginRootDense() { return mRoot.beginChildAll(); } + //@} + + + //@{ + /// Iterator over all nodes in this tree + typedef NodeIteratorBase NodeIter; + typedef NodeIteratorBase NodeCIter; + //@} + + //@{ + /// Iterator over all leaf nodes in this tree + typedef LeafIteratorBase LeafIter; + typedef LeafIteratorBase LeafCIter; + //@} + + //@{ + /// Return an iterator over all nodes in this tree. + NodeIter beginNode() { return NodeIter(*this); } + NodeCIter beginNode() const { return NodeCIter(*this); } + NodeCIter cbeginNode() const { return NodeCIter(*this); } + //@} + + //@{ + /// Return an iterator over all leaf nodes in this tree. + LeafIter beginLeaf() { return LeafIter(*this); } + LeafCIter beginLeaf() const { return LeafCIter(*this); } + LeafCIter cbeginLeaf() const { return LeafCIter(*this); } + //@} + + typedef TreeValueIteratorBase ValueAllIter; + typedef TreeValueIteratorBase ValueAllCIter; + typedef TreeValueIteratorBase ValueOnIter; + typedef TreeValueIteratorBase ValueOnCIter; + typedef TreeValueIteratorBase ValueOffIter; + typedef TreeValueIteratorBase ValueOffCIter; + + //@{ + /// Return an iterator over all values (tile and voxel) across all nodes. + ValueAllIter beginValueAll() { return ValueAllIter(*this); } + ValueAllCIter beginValueAll() const { return ValueAllCIter(*this); } + ValueAllCIter cbeginValueAll() const { return ValueAllCIter(*this); } + //@} + //@{ + /// Return an iterator over active values (tile and voxel) across all nodes. + ValueOnIter beginValueOn() { return ValueOnIter(*this); } + ValueOnCIter beginValueOn() const { return ValueOnCIter(*this); } + ValueOnCIter cbeginValueOn() const { return ValueOnCIter(*this); } + //@} + //@{ + /// Return an iterator over inactive values (tile and voxel) across all nodes. + ValueOffIter beginValueOff() { return ValueOffIter(*this); } + ValueOffCIter beginValueOff() const { return ValueOffCIter(*this); } + ValueOffCIter cbeginValueOff() const { return ValueOffCIter(*this); } + //@} + + /// @brief Return an iterator of type @c IterT (for example, begin() is + /// equivalent to beginValueOn()). + template IterT begin(); + /// @brief Return a const iterator of type CIterT (for example, cbegin() + /// is equivalent to cbeginValueOn()). + template CIterT cbegin() const; + + +protected: + typedef tbb::concurrent_hash_map*, bool> AccessorRegistry; + typedef tbb::concurrent_hash_map*, bool> ConstAccessorRegistry; + + // Disallow assignment of instances of this class. + Tree& operator=(const Tree&); + + /// @brief Notify all registered accessors, by calling ValueAccessor::release(), + /// that this tree is about to be deleted. + void releaseAllAccessors(); + + // TBB body object used to deallocates leafnodes in parallel. + struct DeallocateLeafNodes { + DeallocateLeafNodes(std::vector& nodes) + : mNodes(nodes.empty() ? NULL : &nodes.front()) { } + void operator()(const tbb::blocked_range& range) const { + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + delete mNodes[n]; mNodes[n] = NULL; + } + } + LeafNodeType ** const mNodes; + }; + + // + // Data members + // + RootNodeType mRoot; // root node of the tree + mutable AccessorRegistry mAccessorRegistry; + mutable ConstAccessorRegistry mConstAccessorRegistry; + + static tbb::atomic sTreeTypeName; +}; // end of Tree class + +template +tbb::atomic Tree<_RootNodeType>::sTreeTypeName; + + +/// @brief Tree3::Type is the type of a three-level tree +/// (Root, Internal, Leaf) with value type T and +/// internal and leaf node log dimensions N1 and N2, respectively. +/// @note This is NOT the standard tree configuration (Tree4 is). +template +struct Tree3 { + typedef Tree, N1> > > Type; +}; + + +/// @brief Tree4::Type is the type of a four-level tree +/// (Root, Internal, Internal, Leaf) with value type T and +/// internal and leaf node log dimensions N1, N2 and N3, respectively. +/// @note This is the standard tree configuration. +template +struct Tree4 { + typedef Tree, N2>, N1> > > Type; +}; + +/// @brief Tree5::Type is the type of a five-level tree +/// (Root, Internal, Internal, Internal, Leaf) with value type T and +/// internal and leaf node log dimensions N1, N2, N3 and N4, respectively. +/// @note This is NOT the standard tree configuration (Tree4 is). +template +struct Tree5 { + typedef Tree, N3>, N2>, N1> > > + Type; +}; + + +//////////////////////////////////////// + + +inline void +TreeBase::readTopology(std::istream& is, bool /*saveFloatAsHalf*/) +{ + int32_t bufferCount; + is.read(reinterpret_cast(&bufferCount), sizeof(int32_t)); + if (bufferCount != 1) OPENVDB_LOG_WARN("multi-buffer trees are no longer supported"); +} + + +inline void +TreeBase::writeTopology(std::ostream& os, bool /*saveFloatAsHalf*/) const +{ + int32_t bufferCount = 1; + os.write(reinterpret_cast(&bufferCount), sizeof(int32_t)); +} + + +inline void +TreeBase::print(std::ostream& os, int /*verboseLevel*/) const +{ + os << " Tree Type: " << type() + << " Active Voxel Count: " << activeVoxelCount() << std::endl +#ifndef OPENVDB_2_ABI_COMPATIBLE + << " Active tile Count: " << activeTileCount() << std::endl +#endif + << " Inactive Voxel Count: " << inactiveVoxelCount() << std::endl + << " Leaf Node Count: " << leafCount() << std::endl + << " Non-leaf Node Count: " << nonLeafCount() << std::endl; +} + + +//////////////////////////////////////// + + +// +// Type traits for tree iterators +// + +/// @brief TreeIterTraits provides, for all tree iterators, a begin(tree) function +/// that returns an iterator over a tree of arbitrary type. +template struct TreeIterTraits; + +template struct TreeIterTraits { + static typename TreeT::RootNodeType::ChildOnIter begin(TreeT& tree) { + return tree.beginRootChildren(); + } +}; + +template struct TreeIterTraits { + static typename TreeT::RootNodeType::ChildOnCIter begin(const TreeT& tree) { + return tree.cbeginRootChildren(); + } +}; + +template struct TreeIterTraits { + static typename TreeT::RootNodeType::ChildOffIter begin(TreeT& tree) { + return tree.beginRootTiles(); + } +}; + +template struct TreeIterTraits { + static typename TreeT::RootNodeType::ChildOffCIter begin(const TreeT& tree) { + return tree.cbeginRootTiles(); + } +}; + +template struct TreeIterTraits { + static typename TreeT::RootNodeType::ChildAllIter begin(TreeT& tree) { + return tree.beginRootDense(); + } +}; + +template struct TreeIterTraits { + static typename TreeT::RootNodeType::ChildAllCIter begin(const TreeT& tree) { + return tree.cbeginRootDense(); + } +}; + +template struct TreeIterTraits { + static typename TreeT::NodeIter begin(TreeT& tree) { return tree.beginNode(); } +}; + +template struct TreeIterTraits { + static typename TreeT::NodeCIter begin(const TreeT& tree) { return tree.cbeginNode(); } +}; + +template struct TreeIterTraits { + static typename TreeT::LeafIter begin(TreeT& tree) { return tree.beginLeaf(); } +}; + +template struct TreeIterTraits { + static typename TreeT::LeafCIter begin(const TreeT& tree) { return tree.cbeginLeaf(); } +}; + +template struct TreeIterTraits { + static typename TreeT::ValueOnIter begin(TreeT& tree) { return tree.beginValueOn(); } +}; + +template struct TreeIterTraits { + static typename TreeT::ValueOnCIter begin(const TreeT& tree) { return tree.cbeginValueOn(); } +}; + +template struct TreeIterTraits { + static typename TreeT::ValueOffIter begin(TreeT& tree) { return tree.beginValueOff(); } +}; + +template struct TreeIterTraits { + static typename TreeT::ValueOffCIter begin(const TreeT& tree) { return tree.cbeginValueOff(); } +}; + +template struct TreeIterTraits { + static typename TreeT::ValueAllIter begin(TreeT& tree) { return tree.beginValueAll(); } +}; + +template struct TreeIterTraits { + static typename TreeT::ValueAllCIter begin(const TreeT& tree) { return tree.cbeginValueAll(); } +}; + + +template +template +inline IterT +Tree::begin() +{ + return TreeIterTraits::begin(*this); +} + + +template +template +inline IterT +Tree::cbegin() const +{ + return TreeIterTraits::begin(*this); +} + + +//////////////////////////////////////// + + +template +void +Tree::readTopology(std::istream& is, bool saveFloatAsHalf) +{ + this->clearAllAccessors(); + TreeBase::readTopology(is, saveFloatAsHalf); + mRoot.readTopology(is, saveFloatAsHalf); +} + + +template +void +Tree::writeTopology(std::ostream& os, bool saveFloatAsHalf) const +{ + TreeBase::writeTopology(os, saveFloatAsHalf); + mRoot.writeTopology(os, saveFloatAsHalf); +} + + +template +inline void +Tree::readBuffers(std::istream &is, bool saveFloatAsHalf) +{ + this->clearAllAccessors(); + mRoot.readBuffers(is, saveFloatAsHalf); +} + + +#ifndef OPENVDB_2_ABI_COMPATIBLE + +template +inline void +Tree::readBuffers(std::istream &is, const CoordBBox& bbox, bool saveFloatAsHalf) +{ + this->clearAllAccessors(); + mRoot.readBuffers(is, bbox, saveFloatAsHalf); +} + + +template +inline void +Tree::readNonresidentBuffers() const +{ + for (LeafCIter it = this->cbeginLeaf(); it; ++it) { + // Retrieving the value of a leaf voxel forces loading of the leaf node's voxel buffer. + it->getValue(Index(0)); + } +} + +#endif // !OPENVDB_2_ABI_COMPATIBLE + + +template +inline void +Tree::writeBuffers(std::ostream &os, bool saveFloatAsHalf) const +{ + mRoot.writeBuffers(os, saveFloatAsHalf); +} + + +template +inline void +Tree::clear() +{ + std::vector leafnodes; + this->stealNodes(leafnodes); + mRoot.clear(); + + tbb::parallel_for(tbb::blocked_range(0, leafnodes.size()), + DeallocateLeafNodes(leafnodes)); + + this->clearAllAccessors(); +} + + +//////////////////////////////////////// + + +template +inline void +Tree::attachAccessor(ValueAccessorBase& accessor) const +{ + typename AccessorRegistry::accessor a; + mAccessorRegistry.insert(a, &accessor); +} + + +template +inline void +Tree::attachAccessor(ValueAccessorBase& accessor) const +{ + typename ConstAccessorRegistry::accessor a; + mConstAccessorRegistry.insert(a, &accessor); +} + + +template +inline void +Tree::releaseAccessor(ValueAccessorBase& accessor) const +{ + mAccessorRegistry.erase(&accessor); +} + + +template +inline void +Tree::releaseAccessor(ValueAccessorBase& accessor) const +{ + mConstAccessorRegistry.erase(&accessor); +} + + +template +inline void +Tree::clearAllAccessors() +{ + for (typename AccessorRegistry::iterator it = mAccessorRegistry.begin(); + it != mAccessorRegistry.end(); ++it) + { + if (it->first) it->first->clear(); + } + + for (typename ConstAccessorRegistry::iterator it = mConstAccessorRegistry.begin(); + it != mConstAccessorRegistry.end(); ++it) + { + if (it->first) it->first->clear(); + } +} + + +template +inline void +Tree::releaseAllAccessors() +{ + mAccessorRegistry.erase(NULL); + for (typename AccessorRegistry::iterator it = mAccessorRegistry.begin(); + it != mAccessorRegistry.end(); ++it) + { + it->first->release(); + } + mAccessorRegistry.clear(); + + mAccessorRegistry.erase(NULL); + for (typename ConstAccessorRegistry::iterator it = mConstAccessorRegistry.begin(); + it != mConstAccessorRegistry.end(); ++it) + { + it->first->release(); + } + mConstAccessorRegistry.clear(); +} + + +//////////////////////////////////////// + + +template +inline const typename RootNodeType::ValueType& +Tree::getValue(const Coord& xyz) const +{ + return mRoot.getValue(xyz); +} + + +template +template +inline const typename RootNodeType::ValueType& +Tree::getValue(const Coord& xyz, AccessT& accessor) const +{ + return accessor.getValue(xyz); +} + + +template +inline int +Tree::getValueDepth(const Coord& xyz) const +{ + return mRoot.getValueDepth(xyz); +} + + +template +inline void +Tree::setValueOff(const Coord& xyz) +{ + mRoot.setValueOff(xyz); +} + + +template +inline void +Tree::setValueOff(const Coord& xyz, const ValueType& value) +{ + mRoot.setValueOff(xyz, value); +} + + +template +inline void +Tree::setActiveState(const Coord& xyz, bool on) +{ + mRoot.setActiveState(xyz, on); +} + + +template +inline void +Tree::setValue(const Coord& xyz, const ValueType& value) +{ + mRoot.setValueOn(xyz, value); +} + +template +inline void +Tree::setValueOnly(const Coord& xyz, const ValueType& value) +{ + mRoot.setValueOnly(xyz, value); +} + +template +template +inline void +Tree::setValue(const Coord& xyz, const ValueType& value, AccessT& accessor) +{ + accessor.setValue(xyz, value); +} + + +template +inline void +Tree::setValueOn(const Coord& xyz) +{ + mRoot.setActiveState(xyz, true); +} + + +template +inline void +Tree::setValueOn(const Coord& xyz, const ValueType& value) +{ + mRoot.setValueOn(xyz, value); +} + + +template +template +inline void +Tree::modifyValue(const Coord& xyz, const ModifyOp& op) +{ + mRoot.modifyValue(xyz, op); +} + + +template +template +inline void +Tree::modifyValueAndActiveState(const Coord& xyz, const ModifyOp& op) +{ + mRoot.modifyValueAndActiveState(xyz, op); +} + + +template +inline bool +Tree::probeValue(const Coord& xyz, ValueType& value) const +{ + return mRoot.probeValue(xyz, value); +} + + +//////////////////////////////////////// + + +template +inline void +Tree::addTile(Index level, const Coord& xyz, + const ValueType& value, bool active) +{ + mRoot.addTile(level, xyz, value, active); +} + + +template +template +inline NodeT* +Tree::stealNode(const Coord& xyz, const ValueType& value, bool active) +{ + this->clearAllAccessors(); + return mRoot.template stealNode(xyz, value, active); +} + + +template +inline typename RootNodeType::LeafNodeType* +Tree::touchLeaf(const Coord& xyz) +{ + return mRoot.touchLeaf(xyz); +} + + +template +inline typename RootNodeType::LeafNodeType* +Tree::probeLeaf(const Coord& xyz) +{ + return mRoot.probeLeaf(xyz); +} + + +template +inline const typename RootNodeType::LeafNodeType* +Tree::probeConstLeaf(const Coord& xyz) const +{ + return mRoot.probeConstLeaf(xyz); +} + + +template +template +inline NodeType* +Tree::probeNode(const Coord& xyz) +{ + return mRoot.template probeNode(xyz); +} + + +template +template +inline const NodeType* +Tree::probeNode(const Coord& xyz) const +{ + return this->template probeConstNode(xyz); +} + + +template +template +inline const NodeType* +Tree::probeConstNode(const Coord& xyz) const +{ + return mRoot.template probeConstNode(xyz); +} + + +//////////////////////////////////////// + + +template +inline void +Tree::clip(const CoordBBox& bbox) +{ + this->clearAllAccessors(); + return mRoot.clip(bbox); +} + + +#ifndef OPENVDB_2_ABI_COMPATIBLE +template +inline void +Tree::clipUnallocatedNodes() +{ + this->clearAllAccessors(); + for (LeafIter it = this->beginLeaf(); it; ) { + const LeafNodeType* leaf = it.getLeaf(); + ++it; // advance the iterator before deleting the leaf node + if (!leaf->isAllocated()) { + this->addTile(/*level=*/0, leaf->origin(), this->background(), /*active=*/false); + } + } +} +#endif + + +template +inline void +Tree::fill(const CoordBBox& bbox, const ValueType& value, bool active, bool sparse) +{ + this->clearAllAccessors(); + return mRoot.fill(bbox, value, active, sparse); +} + + +template +Metadata::Ptr +Tree::getBackgroundValue() const +{ + Metadata::Ptr result; + if (Metadata::isRegisteredType(valueType())) { + typedef TypedMetadata MetadataT; + result = Metadata::createMetadata(valueType()); + if (result->typeName() == MetadataT::staticTypeName()) { + MetadataT* m = static_cast(result.get()); + m->value() = mRoot.background(); + } + } + return result; +} + + +//////////////////////////////////////// + + +template +inline void +Tree::voxelizeActiveTiles(bool threaded) +{ + this->clearAllAccessors(); + mRoot.voxelizeActiveTiles(threaded); +} + + +template +inline void +Tree::merge(Tree& other, MergePolicy policy) +{ + this->clearAllAccessors(); + other.clearAllAccessors(); + switch (policy) { + case MERGE_ACTIVE_STATES: + mRoot.template merge(other.mRoot); break; + case MERGE_NODES: + mRoot.template merge(other.mRoot); break; + case MERGE_ACTIVE_STATES_AND_NODES: + mRoot.template merge(other.mRoot); break; + } +} + + +template +template +inline void +Tree::topologyUnion(const Tree& other) +{ + this->clearAllAccessors(); + mRoot.topologyUnion(other.root()); +} + +template +template +inline void +Tree::topologyIntersection(const Tree& other) +{ + this->clearAllAccessors(); + mRoot.topologyIntersection(other.root()); +} + +template +template +inline void +Tree::topologyDifference(const Tree& other) +{ + this->clearAllAccessors(); + mRoot.topologyDifference(other.root()); +} + +//////////////////////////////////////// + + +/// @brief Helper class to adapt a three-argument (a, b, result) CombineOp functor +/// into a single-argument functor that accepts a CombineArgs struct +template +struct CombineOpAdapter +{ + CombineOpAdapter(CombineOp& _op): op(_op) {} + + void operator()(CombineArgs& args) const { + op(args.a(), args.b(), args.result()); + } + + CombineOp& op; +}; + + +template +template +inline void +Tree::combine(Tree& other, CombineOp& op, bool prune) +{ + CombineOpAdapter extendedOp(op); + this->combineExtended(other, extendedOp, prune); +} + + +/// @internal This overload is needed (for ICC and GCC, but not for VC) to disambiguate +/// code like this: aTree.combine(bTree, MyCombineOp(...)). +#ifndef _MSC_VER +template +template +inline void +Tree::combine(Tree& other, const CombineOp& op, bool prune) +{ + CombineOpAdapter extendedOp(op); + this->combineExtended(other, extendedOp, prune); +} +#endif + + +template +template +inline void +Tree::combineExtended(Tree& other, ExtendedCombineOp& op, bool prune) +{ + this->clearAllAccessors(); + mRoot.combine(other.root(), op, prune); +} + + +/// @internal This overload is needed (for ICC and GCC, but not for VC) to disambiguate +/// code like this: aTree.combineExtended(bTree, MyCombineOp(...)). +#ifndef _MSC_VER +template +template +inline void +Tree::combineExtended(Tree& other, const ExtendedCombineOp& op, bool prune) +{ + this->clearAllAccessors(); + mRoot.template combine(other.mRoot, op, prune); +} +#endif + + +template +template +inline void +Tree::combine2(const Tree& a, const OtherTreeType& b, CombineOp& op, bool prune) +{ + CombineOpAdapter extendedOp(op); + this->combine2Extended(a, b, extendedOp, prune); +} + + +/// @internal This overload is needed (for ICC and GCC, but not for VC) to disambiguate +/// code like this: tree.combine2(aTree, bTree, MyCombineOp(...)). +#ifndef _MSC_VER +template +template +inline void +Tree::combine2(const Tree& a, const OtherTreeType& b, const CombineOp& op, bool prune) +{ + CombineOpAdapter extendedOp(op); + this->combine2Extended(a, b, extendedOp, prune); +} +#endif + + +template +template +inline void +Tree::combine2Extended(const Tree& a, const OtherTreeType& b, + ExtendedCombineOp& op, bool prune) +{ + this->clearAllAccessors(); + mRoot.combine2(a.root(), b.root(), op, prune); +} + + +/// @internal This overload is needed (for ICC and GCC, but not for VC) to disambiguate +/// code like the following, where the functor argument is a temporary: +/// tree.combine2Extended(aTree, bTree, MyCombineOp(...)). +#ifndef _MSC_VER +template +template +inline void +Tree::combine2Extended(const Tree& a, const OtherTreeType& b, + const ExtendedCombineOp& op, bool prune) +{ + this->clearAllAccessors(); + mRoot.template combine2(a.root(), b.root(), op, prune); +} +#endif + + +//////////////////////////////////////// + + +template +template +inline void +Tree::visit(VisitorOp& op) +{ + this->clearAllAccessors(); + mRoot.template visit(op); +} + + +template +template +inline void +Tree::visit(VisitorOp& op) const +{ + mRoot.template visit(op); +} + + +/// @internal This overload is needed (for ICC and GCC, but not for VC) to disambiguate +/// code like this: tree.visit(MyVisitorOp(...)). +template +template +inline void +Tree::visit(const VisitorOp& op) +{ + this->clearAllAccessors(); + mRoot.template visit(op); +} + + +/// @internal This overload is needed (for ICC and GCC, but not for VC) to disambiguate +/// code like this: tree.visit(MyVisitorOp(...)). +template +template +inline void +Tree::visit(const VisitorOp& op) const +{ + mRoot.template visit(op); +} + + +//////////////////////////////////////// + + +template +template +inline void +Tree::visit2(OtherTreeType& other, VisitorOp& op) +{ + this->clearAllAccessors(); + typedef typename OtherTreeType::RootNodeType OtherRootNodeType; + mRoot.template visit2(other.root(), op); +} + + +template +template +inline void +Tree::visit2(OtherTreeType& other, VisitorOp& op) const +{ + typedef typename OtherTreeType::RootNodeType OtherRootNodeType; + mRoot.template visit2(other.root(), op); +} + + +/// @internal This overload is needed (for ICC and GCC, but not for VC) to disambiguate +/// code like this: aTree.visit2(bTree, MyVisitorOp(...)). +template +template +inline void +Tree::visit2(OtherTreeType& other, const VisitorOp& op) +{ + this->clearAllAccessors(); + typedef typename OtherTreeType::RootNodeType OtherRootNodeType; + mRoot.template visit2(other.root(), op); +} + + +/// @internal This overload is needed (for ICC and GCC, but not for VC) to disambiguate +/// code like this: aTree.visit2(bTree, MyVisitorOp(...)). +template +template +inline void +Tree::visit2(OtherTreeType& other, const VisitorOp& op) const +{ + typedef typename OtherTreeType::RootNodeType OtherRootNodeType; + mRoot.template visit2(other.root(), op); +} + + +//////////////////////////////////////// + + +template +inline const Name& +Tree::treeType() +{ + if (sTreeTypeName == NULL) { + std::vector dims; + Tree::getNodeLog2Dims(dims); + std::ostringstream ostr; + ostr << "Tree_" << typeNameAsString(); + for (size_t i = 1, N = dims.size(); i < N; ++i) { // start from 1 to skip the RootNode + ostr << "_" << dims[i]; + } + Name* s = new Name(ostr.str()); + if (sTreeTypeName.compare_and_swap(s, NULL) != NULL) delete s; + } + return *sTreeTypeName; +} + + +template +template +inline bool +Tree::hasSameTopology(const Tree& other) const +{ + return mRoot.hasSameTopology(other.root()); +} + + +template +Index64 +Tree::inactiveVoxelCount() const +{ + Coord dim(0, 0, 0); + this->evalActiveVoxelDim(dim); + const Index64 + totalVoxels = dim.x() * dim.y() * dim.z(), + activeVoxels = this->activeVoxelCount(); + assert(totalVoxels >= activeVoxels); + return totalVoxels - activeVoxels; +} + + +template +inline bool +Tree::evalLeafBoundingBox(CoordBBox& bbox) const +{ + bbox.reset(); // default invalid bbox + + if (this->empty()) return false; // empty + + mRoot.evalActiveBoundingBox(bbox, false); + + return true;// not empty +} + +template +inline bool +Tree::evalActiveVoxelBoundingBox(CoordBBox& bbox) const +{ + bbox.reset(); // default invalid bbox + + if (this->empty()) return false; // empty + + mRoot.evalActiveBoundingBox(bbox, true); + + return true;// not empty +} + + +template +inline bool +Tree::evalActiveVoxelDim(Coord& dim) const +{ + CoordBBox bbox; + bool notEmpty = this->evalActiveVoxelBoundingBox(bbox); + dim = bbox.extents(); + return notEmpty; +} + + +template +inline bool +Tree::evalLeafDim(Coord& dim) const +{ + CoordBBox bbox; + bool notEmpty = this->evalLeafBoundingBox(bbox); + dim = bbox.extents(); + return notEmpty; +} + + +template +inline void +Tree::evalMinMax(ValueType& minVal, ValueType& maxVal) const +{ + minVal = maxVal = zeroVal(); + if (ValueOnCIter iter = this->cbeginValueOn()) { + minVal = maxVal = *iter; + for (++iter; iter; ++iter) { + const ValueType& val = *iter; + if (val < minVal) minVal = val; + if (val > maxVal) maxVal = val; + } + } +} + + +template +inline void +Tree::getNodeLog2Dims(std::vector& dims) +{ + dims.clear(); + RootNodeType::getNodeLog2Dims(dims); +} + + +template +inline void +Tree::print(std::ostream& os, int verboseLevel) const +{ + if (verboseLevel <= 0) return; + + /// @todo Consider using boost::io::ios_precision_saver instead. + struct OnExit { + std::ostream& os; + std::streamsize savedPrecision; + OnExit(std::ostream& _os): os(_os), savedPrecision(os.precision()) {} + ~OnExit() { os.precision(savedPrecision); } + }; + OnExit restorePrecision(os); + + std::vector dims; + Tree::getNodeLog2Dims(dims); + + os << "Information about Tree:\n" + << " Type: " << this->type() << "\n"; + + os << " Configuration:\n"; + + if (verboseLevel <= 1) { + // Print node types and sizes. + os << " Root(" << mRoot.getTableSize() << ")"; + if (dims.size() > 1) { + for (size_t i = 1, N = dims.size() - 1; i < N; ++i) { + os << ", Internal(" << (1 << dims[i]) << "^3)"; + } + os << ", Leaf(" << (1 << *dims.rbegin()) << "^3)\n"; + } + os << " Background value: " << mRoot.background() << "\n"; + return; + } + + // The following is tree information that is expensive to extract. + + ValueType minVal = zeroVal(), maxVal = zeroVal(); + if (verboseLevel > 3) { + // This forces loading of all non-resident nodes. + this->evalMinMax(minVal, maxVal); + } + + std::vector nodeCount(dims.size()); +#ifndef OPENVDB_2_ABI_COMPATIBLE + Index64 unallocatedLeafCount = 0; +#endif + for (NodeCIter it = cbeginNode(); it; ++it) { + ++(nodeCount[it.getDepth()]); + +#ifndef OPENVDB_2_ABI_COMPATIBLE + if (it.getLevel() == 0) { + const LeafNodeType* leaf = NULL; + it.getNode(leaf); + if (leaf && !leaf->isAllocated()) ++unallocatedLeafCount; + } +#endif + } + Index64 totalNodeCount = 0; + for (size_t i = 0; i < nodeCount.size(); ++i) totalNodeCount += nodeCount[i]; + + // Print node types, counts and sizes. + os << " Root(1 x " << mRoot.getTableSize() << ")"; + if (dims.size() > 1) { + for (size_t i = 1, N = dims.size() - 1; i < N; ++i) { + os << ", Internal(" << util::formattedInt(nodeCount[i]); + os << " x " << (1 << dims[i]) << "^3)"; + } + os << ", Leaf(" << util::formattedInt(*nodeCount.rbegin()); + os << " x " << (1 << *dims.rbegin()) << "^3)\n"; + } + os << " Background value: " << mRoot.background() << "\n"; + + // Statistics of topology and values + + if (verboseLevel > 3) { + os << " Min value: " << minVal << "\n"; + os << " Max value: " << maxVal << "\n"; + } + + const uint64_t + leafCount = *nodeCount.rbegin(), + numActiveVoxels = this->activeVoxelCount(), + numActiveLeafVoxels = this->activeLeafVoxelCount(), + numActiveTiles = this->activeTileCount(); + + os << " Number of active voxels: " << util::formattedInt(numActiveVoxels) << "\n"; + os << " Number of active tiles: " << util::formattedInt(numActiveTiles) << "\n"; + + Coord dim(0, 0, 0); + uint64_t totalVoxels = 0; + if (numActiveVoxels) { // nonempty + CoordBBox bbox; + this->evalActiveVoxelBoundingBox(bbox); + dim = bbox.extents(); + totalVoxels = dim.x() * uint64_t(dim.y()) * dim.z(); + + os << " Bounding box of active voxels: " << bbox << "\n"; + os << " Dimensions of active voxels: " + << dim[0] << " x " << dim[1] << " x " << dim[2] << "\n"; + + const double activeRatio = (100.0 * double(numActiveVoxels)) / double(totalVoxels); + os << " Percentage of active voxels: " << std::setprecision(3) << activeRatio << "%\n"; + + if (leafCount > 0) { + const double fillRatio = (100.0 * double(numActiveLeafVoxels)) + / (double(leafCount) * double(LeafNodeType::NUM_VOXELS)); + os << " Average leaf node fill ratio: " << fillRatio << "%\n"; + } + +#ifndef OPENVDB_2_ABI_COMPATIBLE + if (verboseLevel > 2) { + os << " Number of unallocated nodes: " + << util::formattedInt(unallocatedLeafCount) << " (" + << (100.0 * double(unallocatedLeafCount) / double(totalNodeCount)) << "%)\n"; + } +#endif + } else { + os << " Tree is empty!\n"; + } + os << std::flush; + + if (verboseLevel == 2) return; + + // Memory footprint in bytes + const uint64_t + actualMem = this->memUsage(), + denseMem = sizeof(ValueType) * totalVoxels, + voxelsMem = sizeof(ValueType) * numActiveLeafVoxels; + ///< @todo not accurate for BoolTree (and probably should count tile values) + + os << "Memory footprint:\n"; + util::printBytes(os, actualMem, " Actual: "); + util::printBytes(os, voxelsMem, " Active leaf voxels: "); + + if (numActiveVoxels) { + util::printBytes(os, denseMem, " Dense equivalent: "); + os << " Actual footprint is " << (100.0 * double(actualMem) / double(denseMem)) + << "% of an equivalent dense volume\n"; + os << " Leaf voxel footprint is " << (100.0 * double(voxelsMem) / double(actualMem)) + << "% of actual footprint\n"; + } +} + +} // namespace tree +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TREE_TREE_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tree/TreeIterator.h b/nuparu/include/openvdb/include/openvdb/tree/TreeIterator.h new file mode 100644 index 00000000..aadc1414 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tree/TreeIterator.h @@ -0,0 +1,1405 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file TreeIterator.h + +#ifndef OPENVDB_TREE_TREEITERATOR_HAS_BEEN_INCLUDED +#define OPENVDB_TREE_TREEITERATOR_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Prior to 0.96.1, depth-bounded value iterators always descended to the leaf level +// and iterated past leaf nodes. Now, they never descend past the maximum depth. +// Comment out the following line to restore the older, less-efficient behavior: +#define ENABLE_TREE_VALUE_DEPTH_BOUND_OPTIMIZATION + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tree { + +/// CopyConstness::Type is either const T2 or T2 with no const qualifier, +/// depending on whether T1 is const. For example, +/// - CopyConstness::Type is int +/// - CopyConstness::Type is int +/// - CopyConstness::Type is const int +/// - CopyConstness::Type is const int +template struct CopyConstness { + typedef typename boost::remove_const::type Type; +}; +template struct CopyConstness { + typedef const ToType Type; +}; + + +//////////////////////////////////////// + + +namespace iter { + +template +struct InvertedTree { + typedef typename InvertedTree::Type SubtreeT; + typedef typename boost::mpl::push_back::type Type; +}; +template +struct InvertedTree { + typedef typename boost::mpl::vector::type Type; +}; + +} // namespace iter + + +//////////////////////////////////////// + + +/// IterTraits provides the following for iterators of the standard types, +/// i.e., for {Child,Value}{On,Off,All}{Iter,CIter}: +/// - a NodeConverter template to convert an iterator for one type of node +/// to an iterator of the same type for another type of node; for example, +/// IterTraits::NodeConverter::Type +/// is synonymous with LeafNode::ValueOnIter. +/// - a begin(node) function that returns a begin iterator for a node of arbitrary type; +/// for example, IterTraits::begin(leaf) returns +/// leaf.beginValueOn() +/// - a getChild() function that returns a pointer to the child node to which the iterator +/// is currently pointing (always NULL if the iterator is a Value iterator) +template +struct IterTraits +{ + template static ChildT* getChild(const IterT&) { return NULL; } +}; + +template +struct IterTraits +{ + typedef typename NodeT::ChildOnIter IterT; + static IterT begin(NodeT& node) { return node.beginChildOn(); } + template static ChildT* getChild(const IterT& iter) { + return &iter.getValue(); + } + template struct NodeConverter { + typedef typename OtherNodeT::ChildOnIter Type; + }; +}; + +template +struct IterTraits +{ + typedef typename NodeT::ChildOnCIter IterT; + static IterT begin(const NodeT& node) { return node.cbeginChildOn(); } + template static const ChildT* getChild(const IterT& iter) { + return &iter.getValue(); + } + template struct NodeConverter { + typedef typename OtherNodeT::ChildOnCIter Type; + }; +}; + +template +struct IterTraits +{ + typedef typename NodeT::ChildOffIter IterT; + static IterT begin(NodeT& node) { return node.beginChildOff(); } + template struct NodeConverter { + typedef typename OtherNodeT::ChildOffIter Type; + }; +}; + +template +struct IterTraits +{ + typedef typename NodeT::ChildOffCIter IterT; + static IterT begin(const NodeT& node) { return node.cbeginChildOff(); } + template struct NodeConverter { + typedef typename OtherNodeT::ChildOffCIter Type; + }; +}; + +template +struct IterTraits +{ + typedef typename NodeT::ChildAllIter IterT; + static IterT begin(NodeT& node) { return node.beginChildAll(); } + template static ChildT* getChild(const IterT& iter) { + typename IterT::NonConstValueType val; + return iter.probeChild(val); + } + template struct NodeConverter { + typedef typename OtherNodeT::ChildAllIter Type; + }; +}; + +template +struct IterTraits +{ + typedef typename NodeT::ChildAllCIter IterT; + static IterT begin(const NodeT& node) { return node.cbeginChildAll(); } + template static ChildT* getChild(const IterT& iter) { + typename IterT::NonConstValueType val; + return iter.probeChild(val); + } + template struct NodeConverter { + typedef typename OtherNodeT::ChildAllCIter Type; + }; +}; + +template +struct IterTraits +{ + typedef typename NodeT::ValueOnIter IterT; + static IterT begin(NodeT& node) { return node.beginValueOn(); } + template struct NodeConverter { + typedef typename OtherNodeT::ValueOnIter Type; + }; +}; + +template +struct IterTraits +{ + typedef typename NodeT::ValueOnCIter IterT; + static IterT begin(const NodeT& node) { return node.cbeginValueOn(); } + template struct NodeConverter { + typedef typename OtherNodeT::ValueOnCIter Type; + }; +}; + +template +struct IterTraits +{ + typedef typename NodeT::ValueOffIter IterT; + static IterT begin(NodeT& node) { return node.beginValueOff(); } + template struct NodeConverter { + typedef typename OtherNodeT::ValueOffIter Type; + }; +}; + +template +struct IterTraits +{ + typedef typename NodeT::ValueOffCIter IterT; + static IterT begin(const NodeT& node) { return node.cbeginValueOff(); } + template struct NodeConverter { + typedef typename OtherNodeT::ValueOffCIter Type; + }; +}; + +template +struct IterTraits +{ + typedef typename NodeT::ValueAllIter IterT; + static IterT begin(NodeT& node) { return node.beginValueAll(); } + template struct NodeConverter { + typedef typename OtherNodeT::ValueAllIter Type; + }; +}; + +template +struct IterTraits +{ + typedef typename NodeT::ValueAllCIter IterT; + static IterT begin(const NodeT& node) { return node.cbeginValueAll(); } + template struct NodeConverter { + typedef typename OtherNodeT::ValueAllCIter Type; + }; +}; + + +//////////////////////////////////////// + + +/// @brief An IterListItem is an element of a compile-time linked list of iterators +/// to nodes of different types. +/// +/// The list is constructed by traversing the template hierarchy of a Tree in reverse order, +/// so typically the elements will be a LeafNode iterator of some type (e.g., ValueOnCIter), +/// followed by one or more InternalNode iterators of the same type, followed by a RootNode +/// iterator of the same type. +/// +/// The length of the list is fixed at compile time, and because it is implemented using +/// nested, templated classes, much of the list traversal logic can be optimized away. +template +class IterListItem +{ +public: + /// The type of iterator stored in the previous list item + typedef typename PrevItemT::IterT PrevIterT; + /// The type of node (non-const) whose iterator is stored in this list item + typedef typename boost::mpl::front::type _NodeT; + /// The type of iterator stored in this list item (e.g., InternalNode::ValueOnCIter) + typedef typename IterTraits::template + NodeConverter<_NodeT>::Type IterT; + + /// The type of node (const or non-const) over which IterT iterates (e.g., const RootNode<...>) + typedef typename IterT::NodeType NodeT; + /// The type of the node with const qualifiers removed ("Non-Const") + typedef typename IterT::NonConstNodeType NCNodeT; + /// The type of value (with const qualifiers removed) to which the iterator points + typedef typename IterT::NonConstValueType NCValueT; + /// NodeT's child node type, with the same constness (e.g., const InternalNode<...>) + typedef typename CopyConstness::Type ChildT; + /// NodeT's child node type with const qualifiers removed + typedef typename CopyConstness::Type NCChildT; + typedef IterTraits ITraits; + /// NodeT's level in its tree (0 = LeafNode) + static const Index Level = _Level; + + IterListItem(PrevItemT* prev): mNext(this), mPrev(prev) {} + + IterListItem(const IterListItem& other): mIter(other.mIter), mNext(other.mNext), mPrev(NULL) {} + IterListItem& operator=(const IterListItem& other) + { + if (&other != this) { + mIter = other.mIter; + mNext = other.mNext; + mPrev = NULL; ///< @note external call to updateBackPointers() required + } + return *this; + } + + void updateBackPointers(PrevItemT* prev) { mPrev = prev; mNext.updateBackPointers(this); } + + void setIter(const IterT& iter) { mIter = iter; } + template + void setIter(const OtherIterT& iter) { mNext.setIter(iter); } + + /// Return the node over which this list element's iterator iterates. + void getNode(Index lvl, NodeT*& node) const + { + node = (lvl <= Level) ? mIter.getParentNode() : NULL; + } + /// Return the node over which one of the following list elements' iterator iterates. + template + void getNode(Index lvl, OtherNodeT*& node) const { mNext.getNode(lvl, node); } + + /// @brief Initialize the iterator for level @a lvl of the tree with the node + /// over which the corresponding iterator of @a otherListItem is iterating. + /// + /// For example, if @a otherListItem contains a LeafNode::ValueOnIter, + /// initialize this list's leaf iterator with the same LeafNode. + template + void initLevel(Index lvl, OtherIterListItemT& otherListItem) + { + if (lvl == Level) { + const NodeT* node = NULL; + otherListItem.getNode(lvl, node); + mIter = (node == NULL) ? IterT() : ITraits::begin(*const_cast(node)); + } else { + // Forward to one of the following list elements. + mNext.initLevel(lvl, otherListItem); + } + } + + /// Return The table offset of the iterator at level @a lvl of the tree. + Index pos(Index lvl) const { return (lvl == Level) ? mIter.pos() : mNext.pos(lvl); } + + /// Return @c true if the iterator at level @a lvl of the tree has not yet reached its end. + bool test(Index lvl) const { return (lvl == Level) ? mIter.test() : mNext.test(lvl); } + + /// Increment the iterator at level @a lvl of the tree. + bool next(Index lvl) { return (lvl == Level) ? mIter.next() : mNext.next(lvl); } + + /// @brief If the iterator at level @a lvl of the tree points to a child node, + /// initialize the next iterator in this list with that child node. + bool down(Index lvl) + { + if (lvl == Level && mPrev != NULL && mIter) { + if (ChildT* child = ITraits::template getChild(mIter)) { + mPrev->setIter(PrevItemT::ITraits::begin(*child)); + return true; + } + } + return (lvl > Level) ? mNext.down(lvl) : false; + } + + /// @brief Return the global coordinates of the voxel or tile to which the iterator + /// at level @a lvl of the tree is currently pointing. + Coord getCoord(Index lvl) const + { + return (lvl == Level) ? mIter.getCoord() : mNext.getCoord(lvl); + } + Index getChildDim(Index lvl) const + { + return (lvl == Level) ? NodeT::getChildDim() : mNext.getChildDim(lvl); + } + /// Return the number of (virtual) voxels spanned by a tile value or child node + Index64 getVoxelCount(Index lvl) const + { + return (lvl == Level) ? ChildT::NUM_VOXELS : mNext.getVoxelCount(lvl); + } + + /// Return @c true if the iterator at level @a lvl of the tree points to an active value. + bool isValueOn(Index lvl) const + { + return (lvl == Level) ? mIter.isValueOn() : mNext.isValueOn(lvl); + } + + /// Return the value to which the iterator at level @a lvl of the tree points. + const NCValueT& getValue(Index lvl) const + { + if (lvl == Level) return mIter.getValue(); + return mNext.getValue(lvl); + } + + /// @brief Set the value (to @a val) to which the iterator at level @a lvl + /// of the tree points and mark the value as active. + /// @note Not valid when @c IterT is a const iterator type + void setValue(Index lvl, const NCValueT& val) const + { + if (lvl == Level) mIter.setValue(val); else mNext.setValue(lvl, val); + } + /// @brief Set the value (to @a val) to which the iterator at level @a lvl of the tree + /// points and mark the value as active if @a on is @c true, or inactive otherwise. + /// @note Not valid when @c IterT is a const iterator type + void setValueOn(Index lvl, bool on = true) const + { + if (lvl == Level) mIter.setValueOn(on); else mNext.setValueOn(lvl, on); + } + /// @brief Mark the value to which the iterator at level @a lvl of the tree points + /// as inactive. + /// @note Not valid when @c IterT is a const iterator type + void setValueOff(Index lvl) const + { + if (lvl == Level) mIter.setValueOff(); else mNext.setValueOff(lvl); + } + + /// @brief Apply a functor to the item to which this iterator is pointing. + /// @note Not valid when @c IterT is a const iterator type + template + void modifyValue(Index lvl, const ModifyOp& op) const + { + if (lvl == Level) mIter.modifyValue(op); else mNext.modifyValue(lvl, op); + } + +private: + typedef typename boost::mpl::pop_front::type RestT; // NodeVecT minus its first item + typedef IterListItem NextItem; + + IterT mIter; + NextItem mNext; + PrevItemT* mPrev; +}; + + +/// The initial element of a compile-time linked list of iterators to nodes of different types +template +class IterListItem +{ +public: + /// The type of iterator stored in the previous list item + typedef typename PrevItemT::IterT PrevIterT; + /// The type of node (non-const) whose iterator is stored in this list item + typedef typename boost::mpl::front::type _NodeT; + /// The type of iterator stored in this list item (e.g., InternalNode::ValueOnCIter) + typedef typename IterTraits::template + NodeConverter<_NodeT>::Type IterT; + + /// The type of node (const or non-const) over which IterT iterates (e.g., const RootNode<...>) + typedef typename IterT::NodeType NodeT; + /// The type of the node with const qualifiers removed ("Non-Const") + typedef typename IterT::NonConstNodeType NCNodeT; + /// The type of value (with const qualifiers removed) to which the iterator points + typedef typename IterT::NonConstValueType NCValueT; + typedef IterTraits ITraits; + /// NodeT's level in its tree (0 = LeafNode) + static const Index Level = 0; + + IterListItem(PrevItemT*): mNext(this), mPrev(NULL) {} + + IterListItem(const IterListItem& other): mIter(other.mIter), mNext(other.mNext), mPrev(NULL) {} + IterListItem& operator=(const IterListItem& other) + { + if (&other != this) { + mIter = other.mIter; + mNext = other.mNext; + mPrev = NULL; + } + return *this; + } + + void updateBackPointers(PrevItemT* = NULL) { mPrev = NULL; mNext.updateBackPointers(this); } + + void setIter(const IterT& iter) { mIter = iter; } + template + void setIter(const OtherIterT& iter) { mNext.setIter(iter); } + + void getNode(Index lvl, NodeT*& node) const + { + node = (lvl == 0) ? mIter.getParentNode() : NULL; + } + template + void getNode(Index lvl, OtherNodeT*& node) const { mNext.getNode(lvl, node); } + + template + void initLevel(Index lvl, OtherIterListItemT& otherListItem) + { + if (lvl == 0) { + const NodeT* node = NULL; + otherListItem.getNode(lvl, node); + mIter = (node == NULL) ? IterT() : ITraits::begin(*const_cast(node)); + } else { + mNext.initLevel(lvl, otherListItem); + } + } + + Index pos(Index lvl) const { return (lvl == 0) ? mIter.pos() : mNext.pos(lvl); } + + bool test(Index lvl) const { return (lvl == 0) ? mIter.test() : mNext.test(lvl); } + + bool next(Index lvl) { return (lvl == 0) ? mIter.next() : mNext.next(lvl); } + + bool down(Index lvl) { return (lvl == 0) ? false : mNext.down(lvl); } + + Coord getCoord(Index lvl) const + { + return (lvl == 0) ? mIter.getCoord() : mNext.getCoord(lvl); + } + Index getChildDim(Index lvl) const + { + return (lvl == 0) ? NodeT::getChildDim() : mNext.getChildDim(lvl); + } + + Index64 getVoxelCount(Index lvl) const + { + return (lvl == 0) ? 1 : mNext.getVoxelCount(lvl); + } + + bool isValueOn(Index lvl) const + { + return (lvl == 0) ? mIter.isValueOn() : mNext.isValueOn(lvl); + } + + const NCValueT& getValue(Index lvl) const + { + if (lvl == 0) return mIter.getValue(); + return mNext.getValue(lvl); + } + + void setValue(Index lvl, const NCValueT& val) const + { + if (lvl == 0) mIter.setValue(val); else mNext.setValue(lvl, val); + } + void setValueOn(Index lvl, bool on = true) const + { + if (lvl == 0) mIter.setValueOn(on); else mNext.setValueOn(lvl, on); + } + void setValueOff(Index lvl) const + { + if (lvl == 0) mIter.setValueOff(); else mNext.setValueOff(lvl); + } + + template + void modifyValue(Index lvl, const ModifyOp& op) const + { + if (lvl == 0) mIter.modifyValue(op); else mNext.modifyValue(lvl, op); + } + +private: + typedef typename boost::mpl::pop_front::type RestT; // NodeVecT minus its first item + typedef IterListItem NextItem; + + IterT mIter; + NextItem mNext; + PrevItemT* mPrev; +}; + + +/// The final element of a compile-time linked list of iterators to nodes of different types +template +class IterListItem +{ +public: + typedef typename boost::mpl::front::type _NodeT; + /// The type of iterator stored in the previous list item + typedef typename PrevItemT::IterT PrevIterT; + /// The type of iterator stored in this list item (e.g., RootNode::ValueOnCIter) + typedef typename IterTraits::template + NodeConverter<_NodeT>::Type IterT; + + /// The type of node over which IterT iterates (e.g., const RootNode<...>) + typedef typename IterT::NodeType NodeT; + /// The type of the node with const qualifiers removed ("Non-Const") + typedef typename IterT::NonConstNodeType NCNodeT; + /// The type of value (with const qualifiers removed) to which the iterator points + typedef typename IterT::NonConstValueType NCValueT; + /// NodeT's child node type, with the same constness (e.g., const InternalNode<...>) + typedef typename CopyConstness::Type ChildT; + /// NodeT's child node type with const qualifiers removed + typedef typename CopyConstness::Type NCChildT; + typedef IterTraits ITraits; + /// NodeT's level in its tree (0 = LeafNode) + static const Index Level = _Level; + + IterListItem(PrevItemT* prev): mPrev(prev) {} + + IterListItem(const IterListItem& other): mIter(other.mIter), mPrev(NULL) {} + IterListItem& operator=(const IterListItem& other) + { + if (&other != this) { + mIter = other.mIter; + mPrev = NULL; ///< @note external call to updateBackPointers() required + } + return *this; + } + + void updateBackPointers(PrevItemT* prev) { mPrev = prev; } + + // The following method specializations differ from the default template + // implementations mainly in that they don't forward. + + void setIter(const IterT& iter) { mIter = iter; } + + void getNode(Index lvl, NodeT*& node) const + { + node = (lvl <= Level) ? mIter.getParentNode() : NULL; + } + + template + void initLevel(Index lvl, OtherIterListItemT& otherListItem) + { + if (lvl == Level) { + const NodeT* node = NULL; + otherListItem.getNode(lvl, node); + mIter = (node == NULL) ? IterT() : ITraits::begin(*const_cast(node)); + } + } + + Index pos(Index lvl) const { return (lvl == Level) ? mIter.pos() : Index(-1); } + + bool test(Index lvl) const { return (lvl == Level) ? mIter.test() : false; } + + bool next(Index lvl) { return (lvl == Level) ? mIter.next() : false; } + + bool down(Index lvl) + { + if (lvl == Level && mPrev != NULL && mIter) { + if (ChildT* child = ITraits::template getChild(mIter)) { + mPrev->setIter(PrevItemT::ITraits::begin(*child)); + return true; + } + } + return false; + } + + Coord getCoord(Index lvl) const { return (lvl == Level) ? mIter.getCoord() : Coord(); } + Index getChildDim(Index lvl) const { return (lvl == Level) ? NodeT::getChildDim() : 0; } + Index64 getVoxelCount(Index lvl) const { return (lvl == Level) ? ChildT::NUM_VOXELS : 0; } + + bool isValueOn(Index lvl) const { return (lvl == Level) ? mIter.isValueOn() : false; } + + const NCValueT& getValue(Index lvl) const + { + assert(lvl == Level); + (void)lvl; // avoid unused variable warning in optimized builds + return mIter.getValue(); + } + + void setValue(Index lvl, const NCValueT& val) const { if (lvl == Level) mIter.setValue(val); } + void setValueOn(Index lvl, bool on = true) const { if (lvl == Level) mIter.setValueOn(on); } + void setValueOff(Index lvl) const { if (lvl == Level) mIter.setValueOff(); } + + template + void modifyValue(Index lvl, const ModifyOp& op) const + { + if (lvl == Level) mIter.modifyValue(op); + } + +private: + IterT mIter; + PrevItemT* mPrev; +}; + + +//////////////////////////////////////// + + +//#define DEBUG_TREE_VALUE_ITERATOR + +/// @brief Base class for tree-traversal iterators over tile and voxel values +template +class TreeValueIteratorBase +{ +public: + typedef _TreeT TreeT; + typedef _ValueIterT ValueIterT; + typedef typename ValueIterT::NodeType NodeT; + typedef typename ValueIterT::NonConstValueType ValueT; + typedef typename NodeT::ChildOnCIter ChildOnIterT; + static const Index ROOT_LEVEL = NodeT::LEVEL; + BOOST_STATIC_ASSERT(ValueIterT::NodeType::LEVEL == ROOT_LEVEL); + static const Index LEAF_LEVEL = 0, ROOT_DEPTH = 0, LEAF_DEPTH = ROOT_LEVEL; + + TreeValueIteratorBase(TreeT&); + + TreeValueIteratorBase(const TreeValueIteratorBase& other); + TreeValueIteratorBase& operator=(const TreeValueIteratorBase& other); + + /// Specify the depth of the highest level of the tree to which to ascend (depth 0 = root). + void setMinDepth(Index minDepth); + /// Return the depth of the highest level of the tree to which this iterator ascends. + Index getMinDepth() const { return ROOT_LEVEL - Index(mMaxLevel); } + /// Specify the depth of the lowest level of the tree to which to descend (depth 0 = root). + void setMaxDepth(Index maxDepth); + /// Return the depth of the lowest level of the tree to which this iterator ascends. + Index getMaxDepth() const { return ROOT_LEVEL - Index(mMinLevel); } + + //@{ + /// Return @c true if this iterator is not yet exhausted. + bool test() const { return mValueIterList.test(mLevel); } + operator bool() const { return this->test(); } + //@} + + /// @brief Advance to the next tile or voxel value. + /// Return @c true if this iterator is not yet exhausted. + bool next(); + /// Advance to the next tile or voxel value. + TreeValueIteratorBase& operator++() { this->next(); return *this; } + + /// @brief Return the level in the tree (0 = leaf) of the node to which + /// this iterator is currently pointing. + Index getLevel() const { return mLevel; } + /// @brief Return the depth in the tree (0 = root) of the node to which + /// this iterator is currently pointing. + Index getDepth() const { return ROOT_LEVEL - mLevel; } + static Index getLeafDepth() { return LEAF_DEPTH; } + + /// @brief Return in @a node a pointer to the node over which this iterator is + /// currently iterating or one of that node's parents, as determined by @a NodeType. + /// @return a null pointer if @a NodeType specifies a node at a lower level + /// of the tree than that given by getLevel(). + template + void getNode(NodeType*& node) const { mValueIterList.getNode(mLevel, node); } + + /// @brief Return the global coordinates of the voxel or tile to which + /// this iterator is currently pointing. + Coord getCoord() const { return mValueIterList.getCoord(mLevel); } + /// @brief Return in @a bbox the axis-aligned bounding box of + /// the voxel or tile to which this iterator is currently pointing. + /// @return false if the bounding box is empty. + bool getBoundingBox(CoordBBox&) const; + /// @brief Return the axis-aligned bounding box of the voxel or tile to which + /// this iterator is currently pointing. + CoordBBox getBoundingBox() const { CoordBBox b; this->getBoundingBox(b); return b; } + + /// Return the number of (virtual) voxels corresponding to the value + Index64 getVoxelCount() const { return mValueIterList.getVoxelCount(mLevel);} + + /// Return @c true if this iterator is currently pointing to a (non-leaf) tile value. + bool isTileValue() const { return mLevel != 0 && this->test(); } + /// Return @c true if this iterator is currently pointing to a (leaf) voxel value. + bool isVoxelValue() const { return mLevel == 0 && this->test(); } + /// Return @c true if the value to which this iterator is currently pointing is active. + bool isValueOn() const { return mValueIterList.isValueOn(mLevel); } + + //@{ + /// Return the tile or voxel value to which this iterator is currently pointing. + const ValueT& getValue() const { return mValueIterList.getValue(mLevel); } + const ValueT& operator*() const { return this->getValue(); } + const ValueT* operator->() const { return &(this->operator*()); } + //@} + + /// @brief Change the tile or voxel value to which this iterator is currently pointing + /// and mark it as active. + void setValue(const ValueT& val) const { mValueIterList.setValue(mLevel, val); } + /// @brief Change the active/inactive state of the tile or voxel value to which + /// this iterator is currently pointing. + void setActiveState(bool on) const { mValueIterList.setValueOn(mLevel, on); } + /// Mark the tile or voxel value to which this iterator is currently pointing as inactive. + void setValueOff() const { mValueIterList.setValueOff(mLevel); } + + /// @brief Apply a functor to the item to which this iterator is pointing. + /// (Not valid for const iterators.) + /// @param op a functor of the form void op(ValueType&) const that modifies + /// its argument in place + /// @see Tree::modifyValue() + template + void modifyValue(const ModifyOp& op) const { mValueIterList.modifyValue(mLevel, op); } + + /// Return a pointer to the tree over which this iterator is iterating. + TreeT* getTree() const { return mTree; } + + /// Return a string (for debugging, mainly) describing this iterator's current state. + std::string summary() const; + +private: + bool advance(bool dontIncrement = false); + + typedef typename iter::InvertedTree::Type InvTreeT; + struct PrevChildItem { typedef ChildOnIterT IterT; }; + struct PrevValueItem { typedef ValueIterT IterT; }; + + IterListItem mChildIterList; + IterListItem mValueIterList; + Index mLevel; + int mMinLevel, mMaxLevel; + TreeT* mTree; +}; // class TreeValueIteratorBase + + +template +inline +TreeValueIteratorBase::TreeValueIteratorBase(TreeT& tree): + mChildIterList(NULL), + mValueIterList(NULL), + mLevel(ROOT_LEVEL), + mMinLevel(int(LEAF_LEVEL)), + mMaxLevel(int(ROOT_LEVEL)), + mTree(&tree) +{ + mChildIterList.setIter(IterTraits::begin(tree.root())); + mValueIterList.setIter(IterTraits::begin(tree.root())); + this->advance(/*dontIncrement=*/true); +} + + +template +inline +TreeValueIteratorBase::TreeValueIteratorBase(const TreeValueIteratorBase& other): + mChildIterList(other.mChildIterList), + mValueIterList(other.mValueIterList), + mLevel(other.mLevel), + mMinLevel(other.mMinLevel), + mMaxLevel(other.mMaxLevel), + mTree(other.mTree) +{ + mChildIterList.updateBackPointers(); + mValueIterList.updateBackPointers(); +} + + +template +inline TreeValueIteratorBase& +TreeValueIteratorBase::operator=(const TreeValueIteratorBase& other) +{ + if (&other != this) { + mChildIterList = other.mChildIterList; + mValueIterList = other.mValueIterList; + mLevel = other.mLevel; + mMinLevel = other.mMinLevel; + mMaxLevel = other.mMaxLevel; + mTree = other.mTree; + mChildIterList.updateBackPointers(); + mValueIterList.updateBackPointers(); + } + return *this; +} + + +template +inline void +TreeValueIteratorBase::setMinDepth(Index minDepth) +{ + mMaxLevel = int(ROOT_LEVEL - minDepth); // level = ROOT_LEVEL - depth + if (int(mLevel) > mMaxLevel) this->next(); +} + + +template +inline void +TreeValueIteratorBase::setMaxDepth(Index maxDepth) +{ + // level = ROOT_LEVEL - depth + mMinLevel = int(ROOT_LEVEL - std::min(maxDepth, this->getLeafDepth())); + if (int(mLevel) < mMinLevel) this->next(); +} + + +template +inline bool +TreeValueIteratorBase::next() +{ + do { + if (!this->advance()) return false; + } while (int(mLevel) < mMinLevel || int(mLevel) > mMaxLevel); + return true; +} + + +template +inline bool +TreeValueIteratorBase::advance(bool dontIncrement) +{ + bool recurse = false; + do { + recurse = false; + Index + vPos = mValueIterList.pos(mLevel), + cPos = mChildIterList.pos(mLevel); + if (vPos == cPos && mChildIterList.test(mLevel)) { + /// @todo Once ValueOff iterators properly skip child pointers, remove this block. + mValueIterList.next(mLevel); + vPos = mValueIterList.pos(mLevel); + } + if (vPos < cPos) { + if (dontIncrement) return true; + if (mValueIterList.next(mLevel)) { + if (mValueIterList.pos(mLevel) == cPos && mChildIterList.test(mLevel)) { + /// @todo Once ValueOff iterators properly skip child pointers, + /// remove this block. + mValueIterList.next(mLevel); + } + // If there is a next value and it precedes the next child, return. + if (mValueIterList.pos(mLevel) < cPos) return true; + } + } else { + // Advance to the next child, which may or may not precede the next value. + if (!dontIncrement) mChildIterList.next(mLevel); + } +#ifdef DEBUG_TREE_VALUE_ITERATOR + std::cout << "\n" << this->summary() << std::flush; +#endif + + // Descend to the lowest level at which the next value precedes the next child. + while (mChildIterList.pos(mLevel) < mValueIterList.pos(mLevel)) { +#ifdef ENABLE_TREE_VALUE_DEPTH_BOUND_OPTIMIZATION + if (int(mLevel) == mMinLevel) { + // If the current node lies at the lowest allowed level, none of its + // children can be visited, so just advance its child iterator. + mChildIterList.next(mLevel); + if (mValueIterList.pos(mLevel) == mChildIterList.pos(mLevel) + && mChildIterList.test(mLevel)) + { + /// @todo Once ValueOff iterators properly skip child pointers, + /// remove this block. + mValueIterList.next(mLevel); + } + } else +#endif + if (mChildIterList.down(mLevel)) { + --mLevel; // descend one level + mValueIterList.initLevel(mLevel, mChildIterList); + if (mValueIterList.pos(mLevel) == mChildIterList.pos(mLevel) + && mChildIterList.test(mLevel)) + { + /// @todo Once ValueOff iterators properly skip child pointers, + /// remove this block. + mValueIterList.next(mLevel); + } + } else break; +#ifdef DEBUG_TREE_VALUE_ITERATOR + std::cout << "\n" << this->summary() << std::flush; +#endif + } + // Ascend to the nearest level at which one of the iterators is not yet exhausted. + while (!mChildIterList.test(mLevel) && !mValueIterList.test(mLevel)) { + if (mLevel == ROOT_LEVEL) return false; + ++mLevel; + mChildIterList.next(mLevel); + dontIncrement = true; + recurse = true; + } + } while (recurse); + return true; +} + + +template +inline bool +TreeValueIteratorBase::getBoundingBox(CoordBBox& bbox) const +{ + if (!this->test()) { + bbox = CoordBBox(); + return false; + } + bbox.min() = mValueIterList.getCoord(mLevel); + bbox.max() = bbox.min().offsetBy(mValueIterList.getChildDim(mLevel) - 1); + return true; +} + + +template +inline std::string +TreeValueIteratorBase::summary() const +{ + std::ostringstream ostr; + for (int lvl = int(ROOT_LEVEL); lvl >= 0 && lvl >= int(mLevel); --lvl) { + if (lvl == 0) ostr << "leaf"; + else if (lvl == int(ROOT_LEVEL)) ostr << "root"; + else ostr << "int" << (ROOT_LEVEL - lvl); + ostr << " v" << mValueIterList.pos(lvl) + << " c" << mChildIterList.pos(lvl); + if (lvl > int(mLevel)) ostr << " / "; + } + if (this->test() && mValueIterList.pos(mLevel) < mChildIterList.pos(mLevel)) { + if (mLevel == 0) { + ostr << " " << this->getCoord(); + } else { + ostr << " " << this->getBoundingBox(); + } + } + return ostr.str(); +} + + +//////////////////////////////////////// + + +/// @brief Base class for tree-traversal iterators over all nodes +template +class NodeIteratorBase +{ +public: + typedef _TreeT TreeT; + typedef RootChildOnIterT RootIterT; + typedef typename RootIterT::NodeType RootNodeT; + typedef typename RootIterT::NonConstNodeType NCRootNodeT; + static const Index ROOT_LEVEL = RootNodeT::LEVEL; + typedef typename iter::InvertedTree::Type InvTreeT; + static const Index LEAF_LEVEL = 0, ROOT_DEPTH = 0, LEAF_DEPTH = ROOT_LEVEL; + + typedef IterTraits RootIterTraits; + + NodeIteratorBase(); + NodeIteratorBase(TreeT&); + + NodeIteratorBase(const NodeIteratorBase& other); + NodeIteratorBase& operator=(const NodeIteratorBase& other); + + /// Specify the depth of the highest level of the tree to which to ascend (depth 0 = root). + void setMinDepth(Index minDepth); + /// Return the depth of the highest level of the tree to which this iterator ascends. + Index getMinDepth() const { return ROOT_LEVEL - Index(mMaxLevel); } + /// Specify the depth of the lowest level of the tree to which to descend (depth 0 = root). + void setMaxDepth(Index maxDepth); + /// Return the depth of the lowest level of the tree to which this iterator ascends. + Index getMaxDepth() const { return ROOT_LEVEL - Index(mMinLevel); } + + //@{ + /// Return @c true if this iterator is not yet exhausted. + bool test() const { return !mDone; } + operator bool() const { return this->test(); } + //@} + + /// @brief Advance to the next tile or voxel value. + /// @return @c true if this iterator is not yet exhausted. + bool next(); + /// Advance the iterator to the next leaf node. + void increment() { this->next(); } + NodeIteratorBase& operator++() { this->increment(); return *this; } + /// Increment the iterator n times. + void increment(Index n) { for (Index i = 0; i < n && this->next(); ++i) {} } + + /// @brief Return the level in the tree (0 = leaf) of the node to which + /// this iterator is currently pointing. + Index getLevel() const { return mLevel; } + /// @brief Return the depth in the tree (0 = root) of the node to which + /// this iterator is currently pointing. + Index getDepth() const { return ROOT_LEVEL - mLevel; } + static Index getLeafDepth() { return LEAF_DEPTH; } + + /// @brief Return the global coordinates of the voxel or tile to which + /// this iterator is currently pointing. + Coord getCoord() const; + /// @brief Return in @a bbox the axis-aligned bounding box of + /// the voxel or tile to which this iterator is currently pointing. + /// @return false if the bounding box is empty. + bool getBoundingBox(CoordBBox& bbox) const; + /// @brief Return the axis-aligned bounding box of the voxel or tile to which + /// this iterator is currently pointing. + CoordBBox getBoundingBox() const { CoordBBox b; this->getBoundingBox(b); return b; } + + //@{ + /// @brief Return the node to which the iterator is pointing. + /// @note This iterator doesn't have the usual dereference operators (* and ->), + /// because they would have to be overloaded by the returned node type. + template + void getNode(NodeT*& node) const { node = NULL; mIterList.getNode(mLevel, node); } + template + void getNode(const NodeT*& node) const { node = NULL; mIterList.getNode(mLevel, node); } + //@} + + TreeT* getTree() const { return mTree; } + + std::string summary() const; + +private: + struct PrevItem { typedef RootIterT IterT; }; + + IterListItem mIterList; + Index mLevel; + int mMinLevel, mMaxLevel; + bool mDone; + TreeT* mTree; +}; // class NodeIteratorBase + + +template +inline +NodeIteratorBase::NodeIteratorBase(): + mIterList(NULL), + mLevel(ROOT_LEVEL), + mMinLevel(int(LEAF_LEVEL)), + mMaxLevel(int(ROOT_LEVEL)), + mDone(true), + mTree(NULL) +{ +} + + +template +inline +NodeIteratorBase::NodeIteratorBase(TreeT& tree): + mIterList(NULL), + mLevel(ROOT_LEVEL), + mMinLevel(int(LEAF_LEVEL)), + mMaxLevel(int(ROOT_LEVEL)), + mDone(false), + mTree(&tree) +{ + mIterList.setIter(RootIterTraits::begin(tree.root())); +} + + +template +inline +NodeIteratorBase::NodeIteratorBase(const NodeIteratorBase& other): + mIterList(other.mIterList), + mLevel(other.mLevel), + mMinLevel(other.mMinLevel), + mMaxLevel(other.mMaxLevel), + mDone(other.mDone), + mTree(other.mTree) +{ + mIterList.updateBackPointers(); +} + + +template +inline NodeIteratorBase& +NodeIteratorBase::operator=(const NodeIteratorBase& other) +{ + if (&other != this) { + mLevel = other.mLevel; + mMinLevel = other.mMinLevel; + mMaxLevel = other.mMaxLevel; + mDone = other.mDone; + mTree = other.mTree; + mIterList = other.mIterList; + mIterList.updateBackPointers(); + } + return *this; +} + + +template +inline void +NodeIteratorBase::setMinDepth(Index minDepth) +{ + mMaxLevel = int(ROOT_LEVEL - minDepth); // level = ROOT_LEVEL - depth + if (int(mLevel) > mMaxLevel) this->next(); +} + + +template +inline void +NodeIteratorBase::setMaxDepth(Index maxDepth) +{ + // level = ROOT_LEVEL - depth + mMinLevel = int(ROOT_LEVEL - std::min(maxDepth, this->getLeafDepth())); + if (int(mLevel) < mMinLevel) this->next(); +} + + +template +inline bool +NodeIteratorBase::next() +{ + do { + if (mDone) return false; + + // If the iterator over the current node points to a child, + // descend to the child (depth-first traversal). + if (int(mLevel) > mMinLevel && mIterList.test(mLevel)) { + if (!mIterList.down(mLevel)) return false; + --mLevel; + } else { + // Ascend to the nearest ancestor that has other children. + while (!mIterList.test(mLevel)) { + if (mLevel == ROOT_LEVEL) { + // Can't ascend higher than the root. + mDone = true; + return false; + } + ++mLevel; // ascend one level + mIterList.next(mLevel); // advance to the next child, if there is one + } + // Descend to the child. + if (!mIterList.down(mLevel)) return false; + --mLevel; + } + } while (int(mLevel) < mMinLevel || int(mLevel) > mMaxLevel); + return true; +} + + +template +inline Coord +NodeIteratorBase::getCoord() const +{ + if (mLevel != ROOT_LEVEL) return mIterList.getCoord(mLevel + 1); + RootNodeT* root = NULL; + this->getNode(root); + return root ? root->getMinIndex() : Coord::min(); +} + + +template +inline bool +NodeIteratorBase::getBoundingBox(CoordBBox& bbox) const +{ + if (mLevel == ROOT_LEVEL) { + RootNodeT* root = NULL; + this->getNode(root); + if (root == NULL) { + bbox = CoordBBox(); + return false; + } + root->getIndexRange(bbox); + return true; + } + bbox.min() = mIterList.getCoord(mLevel + 1); + bbox.max() = bbox.min().offsetBy(mIterList.getChildDim(mLevel + 1) - 1); + return true; +} + + +template +inline std::string +NodeIteratorBase::summary() const +{ + std::ostringstream ostr; + for (int lvl = int(ROOT_LEVEL); lvl >= 0 && lvl >= int(mLevel); --lvl) { + if (lvl == 0) ostr << "leaf"; + else if (lvl == int(ROOT_LEVEL)) ostr << "root"; + else ostr << "int" << (ROOT_LEVEL - lvl); + ostr << " c" << mIterList.pos(lvl); + if (lvl > int(mLevel)) ostr << " / "; + } + CoordBBox bbox; + this->getBoundingBox(bbox); + ostr << " " << bbox; + return ostr.str(); +} + + +//////////////////////////////////////// + + +/// @brief Base class for tree-traversal iterators over all leaf nodes (but not leaf voxels) +template +class LeafIteratorBase +{ +public: + typedef RootChildOnIterT RootIterT; + typedef typename RootIterT::NodeType RootNodeT; + typedef typename RootIterT::NonConstNodeType NCRootNodeT; + static const Index ROOT_LEVEL = RootNodeT::LEVEL; + typedef typename iter::InvertedTree::Type InvTreeT; + typedef typename boost::mpl::front::type NCLeafNodeT; + typedef typename CopyConstness::Type LeafNodeT; + static const Index LEAF_LEVEL = 0, LEAF_PARENT_LEVEL = LEAF_LEVEL + 1; + + typedef IterTraits RootIterTraits; + + LeafIteratorBase(): mIterList(NULL), mTree(NULL) {} + + LeafIteratorBase(TreeT& tree): mIterList(NULL), mTree(&tree) + { + // Initialize the iterator list with a root node iterator. + mIterList.setIter(RootIterTraits::begin(tree.root())); + // Descend along the first branch, initializing the node iterator at each level. + Index lvl = ROOT_LEVEL; + for ( ; lvl > 0 && mIterList.down(lvl); --lvl) {} + // If the first branch terminated above the leaf level, backtrack to the next branch. + if (lvl > 0) this->next(); + } + + LeafIteratorBase(const LeafIteratorBase& other): mIterList(other.mIterList), mTree(other.mTree) + { + mIterList.updateBackPointers(); + } + LeafIteratorBase& operator=(const LeafIteratorBase& other) + { + if (&other != this) { + mTree = other.mTree; + mIterList = other.mIterList; + mIterList.updateBackPointers(); + } + return *this; + } + + //@{ + /// Return the leaf node to which the iterator is pointing. + LeafNodeT* getLeaf() const { LeafNodeT* n = NULL; mIterList.getNode(LEAF_LEVEL, n); return n; } + LeafNodeT& operator*() const { return *this->getLeaf(); } + LeafNodeT* operator->() const { return this->getLeaf(); } + //@} + + bool test() const { return mIterList.test(LEAF_PARENT_LEVEL); } + operator bool() const { return this->test(); } + + //@{ + /// Advance the iterator to the next leaf node. + bool next(); + void increment() { this->next(); } + LeafIteratorBase& operator++() { this->increment(); return *this; } + //@} + /// Increment the iterator n times. + void increment(Index n) { for (Index i = 0; i < n && this->next(); ++i) {} } + + TreeT* getTree() const { return mTree; } + +private: + struct PrevItem { typedef RootIterT IterT; }; + + /// @note Even though a LeafIterator doesn't iterate over leaf voxels, + /// the first item of this linked list of node iterators is a leaf node iterator, + /// whose purpose is only to provide access to its parent leaf node. + IterListItem mIterList; + TreeT* mTree; +}; // class LeafIteratorBase + + +template +inline bool +LeafIteratorBase::next() +{ + // If the iterator is valid for the current node one level above the leaf level, + // advance the iterator to the node's next child. + if (mIterList.test(LEAF_PARENT_LEVEL) && mIterList.next(LEAF_PARENT_LEVEL)) { + mIterList.down(LEAF_PARENT_LEVEL); // initialize the leaf iterator + return true; + } + + Index lvl = LEAF_PARENT_LEVEL; + while (!mIterList.test(LEAF_PARENT_LEVEL)) { + if (mIterList.test(lvl)) { + mIterList.next(lvl); + } else { + do { + // Ascend to the nearest level at which + // one of the iterators is not yet exhausted. + if (lvl == ROOT_LEVEL) return false; + ++lvl; + if (mIterList.test(lvl)) mIterList.next(lvl); + } while (!mIterList.test(lvl)); + } + // Descend to the lowest child, but not as far as the leaf iterator. + while (lvl > LEAF_PARENT_LEVEL && mIterList.down(lvl)) --lvl; + } + mIterList.down(LEAF_PARENT_LEVEL); // initialize the leaf iterator + return true; +} + + +//////////////////////////////////////// + + +/// An IteratorRange wraps a tree or node iterator, giving the iterator TBB +/// splittable range semantics. +template +class IteratorRange +{ +public: + IteratorRange(const IterT& iter, size_t grainSize = 8): + mIter(iter), + mGrainSize(grainSize), + mSize(0) + { + mSize = this->size(); + } + IteratorRange(IteratorRange& other, tbb::split): + mIter(other.mIter), + mGrainSize(other.mGrainSize), + mSize(other.mSize >> 1) + { + other.increment(mSize); + } + + /// @brief Return a reference to this range's iterator. + /// @note The reference is const, because the iterator should not be + /// incremented directly. Use this range object's increment() instead. + const IterT& iterator() const { return mIter; } + + bool empty() const { return mSize == 0 || !mIter.test(); } + bool test() const { return !this->empty(); } + operator bool() const { return !this->empty(); } + + /// @brief Return @c true if this range is splittable (i.e., if the iterator + /// can be advanced more than mGrainSize times). + bool is_divisible() const { return mSize > mGrainSize; } + + /// Advance the iterator @a n times. + void increment(Index n = 1) { for ( ; n > 0 && mSize > 0; --n, --mSize, ++mIter) {} } + /// Advance the iterator to the next item. + IteratorRange& operator++() { this->increment(); return *this; } + /// @brief Advance the iterator to the next item. + /// @return @c true if the iterator is not yet exhausted. + bool next() { this->increment(); return this->test(); } + +private: + Index size() const { Index n = 0; for (IterT it(mIter); it.test(); ++n, ++it) {} return n; } + + IterT mIter; + size_t mGrainSize; + /// @note mSize is only an estimate of the number of times mIter can be incremented + /// before it is exhausted (because the topology of the underlying tree could change + /// during iteration). For the purpose of range splitting, though, that should be + /// sufficient, since the two halves need not be of exactly equal size. + Index mSize; +}; + + +//////////////////////////////////////// + + +/// @brief Base class for tree-traversal iterators over real and virtual voxel values +/// @todo class TreeVoxelIteratorBase; + +} // namespace tree +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TREE_TREEITERATOR_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/tree/ValueAccessor.h b/nuparu/include/openvdb/include/openvdb/tree/ValueAccessor.h new file mode 100644 index 00000000..87c3f41e --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/tree/ValueAccessor.h @@ -0,0 +1,2666 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file ValueAccessor.h +/// +/// When traversing a grid in a spatially coherent pattern (e.g., iterating +/// over neighboring voxels), request a @c ValueAccessor from the grid +/// (with Grid::getAccessor()) and use the accessor's @c getValue() and +/// @c setValue() methods. These will typically be significantly faster +/// than accessing voxels directly in the grid's tree. +/// +/// @par Example: +/// +/// @code +/// FloatGrid grid; +/// FloatGrid::Accessor acc = grid.getAccessor(); +/// // First access is slow: +/// acc.setValue(Coord(0, 0, 0), 100); +/// // Subsequent nearby accesses are fast, since the accessor now holds pointers +/// // to nodes that contain (0, 0, 0) along the path from the root of the grid's +/// // tree to the leaf: +/// acc.setValue(Coord(0, 0, 1), 100); +/// acc.getValue(Coord(0, 2, 0), 100); +/// // Slow, because the accessor must be repopulated: +/// acc.getValue(Coord(-1, -1, -1)); +/// // Fast: +/// acc.getValue(Coord(-1, -1, -2)); +/// acc.setValue(Coord(-1, -2, 0), -100); +/// @endcode + +#ifndef OPENVDB_TREE_VALUEACCESSOR_HAS_BEEN_INCLUDED +#define OPENVDB_TREE_VALUEACCESSOR_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tree { + +// Forward declarations of local classes that are not intended for general use +// The IsSafe template parameter is explained in the warning below. +template +class ValueAccessor0; +template +class ValueAccessor1; +template +class ValueAccessor2; +template +class ValueAccessor3; +template class CacheItem; + + +/// @brief This base class for ValueAccessors manages registration of an accessor +/// with a tree so that the tree can automatically clear the accessor whenever +/// one of its nodes is deleted. +/// +/// @internal A base class is needed because ValueAccessor is templated on both +/// a Tree type and a mutex type. The various instantiations of the template +/// are distinct, unrelated types, so they can't easily be stored in a container +/// such as the Tree's CacheRegistry. This base class, in contrast, is templated +/// only on the Tree type, so for any given Tree, only two distinct instantiations +/// are possible, ValueAccessorBase and ValueAccessorBase. +/// +/// @warning If IsSafe = false then the ValueAccessor will not register itself +/// with the tree from which it is constructed. While in some rare cases this can +/// lead to better performance (since it avoids the small overhead of insertion +/// on creation and deletion on destruction) it is also unsafe if the tree is +/// modified. So unless you're an expert it is highly recommended to set +/// IsSafe = true, which is the default in all derived ValueAccessors defined +/// below. However if you know that the tree is no being modifed for the lifespan +/// of the ValueAccessor AND the work performed per ValueAccessor is small relative +/// to overhead of registering it you should consider setting IsSafe = false. If +/// this turns out to improve performance you should really rewrite your code so as +/// to better amortize the construction of the ValueAccessor, i.e. reuse it as much +/// as possible! +template +class ValueAccessorBase +{ +public: + static const bool IsConstTree = boost::is_const::value; + + /// @brief Return true if this accessor is safe, i.e. registered + /// by the tree from which it is constructed. Un-registered + /// accessors can in rare cases be faster because it avoids the + /// (small) overhead of registration, but they are unsafe if the + /// tree is modified. So unless you're an expert it is highly + /// recommended to set IsSafe = true (which is the default). + static bool isSafe() { return IsSafe; } + + ValueAccessorBase(TreeType& tree): mTree(&tree) + { + if (IsSafe) tree.attachAccessor(*this); + } + + virtual ~ValueAccessorBase() { if (IsSafe && mTree) mTree->releaseAccessor(*this); } + + /// @brief Return a pointer to the tree associated with this accessor. + /// @details The pointer will be null only if the tree from which this accessor + /// was constructed was subsequently deleted (which generally leaves the + /// accessor in an unsafe state). + TreeType* getTree() const { return mTree; } + /// Return a reference to the tree associated with this accessor. + TreeType& tree() const { assert(mTree); return *mTree; } + + ValueAccessorBase(const ValueAccessorBase& other): mTree(other.mTree) + { + if (IsSafe && mTree) mTree->attachAccessor(*this); + } + + ValueAccessorBase& operator=(const ValueAccessorBase& other) + { + if (&other != this) { + if (IsSafe && mTree) mTree->releaseAccessor(*this); + mTree = other.mTree; + if (IsSafe && mTree) mTree->attachAccessor(*this); + } + return *this; + } + + virtual void clear() = 0; + +protected: + // Allow trees to deregister themselves. + template friend class Tree; + + virtual void release() { mTree = NULL; } + + TreeType* mTree; +}; // class ValueAccessorBase + + +//////////////////////////////////////// + + +/// When traversing a grid in a spatially coherent pattern (e.g., iterating +/// over neighboring voxels), request a @c ValueAccessor from the grid +/// (with Grid::getAccessor()) and use the accessor's @c getValue() and +/// @c setValue() methods. These will typically be significantly faster +/// than accessing voxels directly in the grid's tree. +/// +/// A ValueAccessor caches pointers to tree nodes along the path to a voxel (x, y, z). +/// A subsequent access to voxel (x', y', z') starts from the cached leaf node and +/// moves up until a cached node that encloses (x', y', z') is found, then traverses +/// down the tree from that node to a leaf, updating the cache with the new path. +/// This leads to significant acceleration of spatially-coherent accesses. +/// +/// @param _TreeType the type of the tree to be accessed [required] +/// @param IsSafe if IsSafe = false then the ValueAccessor will +/// not register itself with the tree from which +/// it is consturcted (see warning). +/// @param CacheLevels the number of nodes to be cached, starting from the leaf level +/// and not including the root (i.e., CacheLevels < DEPTH), +/// and defaulting to all non-root nodes +/// @param MutexType the type of mutex to use (see note) +/// +/// @warning If IsSafe = false then the ValueAccessor will not register itself +/// with the tree from which it is constructed. While in some rare cases this can +/// lead to better performance (since it avoids the small overhead of insertion +/// on creation and deletion on destruction) it is also unsafe if the tree is +/// modified. So unless you're an expert it is highly recommended to set +/// IsSafe = true, which is the default. However if you know that the tree is no +/// being modifed for the lifespan of the ValueAccessor AND the work performed +/// per ValueAccessor is small relative to overhead of registering it you should +/// consider setting IsSafe = false. If this improves performance you should +/// really rewrite your code so as to better amortize the construction of the +/// ValueAccessor, i.e. reuse it as much as possible! +/// +/// @note If @c MutexType is a TBB-compatible mutex, then multiple threads may +/// safely access a single, shared accessor. However, it is highly recommended +/// that, instead, each thread be assigned its own, non-mutex-protected accessor. +template +class ValueAccessor: public ValueAccessorBase<_TreeType, IsSafe> +{ +public: + BOOST_STATIC_ASSERT(CacheLevels < _TreeType::DEPTH); + + typedef _TreeType TreeType; + typedef typename TreeType::RootNodeType RootNodeT; + typedef typename TreeType::LeafNodeType LeafNodeT; + typedef typename RootNodeT::ValueType ValueType; + typedef ValueAccessorBase BaseT; + typedef typename MutexType::scoped_lock LockT; + using BaseT::IsConstTree; + + ValueAccessor(TreeType& tree): BaseT(tree), mCache(*this) + { + mCache.insert(Coord(), &tree.root()); + } + + ValueAccessor(const ValueAccessor& other): BaseT(other), mCache(*this, other.mCache) {} + + ValueAccessor& operator=(const ValueAccessor& other) + { + if (&other != this) { + this->BaseT::operator=(other); + mCache.copy(*this, other.mCache); + } + return *this; + } + virtual ~ValueAccessor() {} + + /// Return the number of cache levels employed by this accessor. + static Index numCacheLevels() { return CacheLevels; } + + /// Return @c true if nodes along the path to the given voxel have been cached. + bool isCached(const Coord& xyz) const { LockT lock(mMutex); return mCache.isCached(xyz); } + + /// Return the value of the voxel at the given coordinates. + const ValueType& getValue(const Coord& xyz) const + { + LockT lock(mMutex); + return mCache.getValue(xyz); + } + + /// Return the active state of the voxel at the given coordinates. + bool isValueOn(const Coord& xyz) const { LockT lock(mMutex); return mCache.isValueOn(xyz); } + + /// Return the active state of the voxel as well as its value + bool probeValue(const Coord& xyz, ValueType& value) const + { + LockT lock(mMutex); + return mCache.probeValue(xyz,value); + } + + /// Return the tree depth (0 = root) at which the value of voxel (x, y, z) resides, + /// or -1 if (x, y, z) isn't explicitly represented in the tree (i.e., if it is + /// implicitly a background voxel). + int getValueDepth(const Coord& xyz) const + { + LockT lock(mMutex); + return mCache.getValueDepth(xyz); + } + + /// Return @c true if the value of voxel (x, y, z) resides at the leaf level + /// of the tree, i.e., if it is not a tile value. + bool isVoxel(const Coord& xyz) const { LockT lock(mMutex); return mCache.isVoxel(xyz); } + + //@{ + /// Set the value of the voxel at the given coordinates and mark the voxel as active. + void setValue(const Coord& xyz, const ValueType& value) + { + LockT lock(mMutex); + mCache.setValue(xyz, value); + } + void setValueOn(const Coord& xyz, const ValueType& value) { this->setValue(xyz, value); } + //@} + + /// Set the value of the voxel at the given coordinate but don't change its active state. + void setValueOnly(const Coord& xyz, const ValueType& value) + { + LockT lock(mMutex); + mCache.setValueOnly(xyz, value); + } + + /// Set the value of the voxel at the given coordinates and mark the voxel + /// as active. [Experimental] + void newSetValue(const Coord& xyz, const ValueType& value) + { + LockT lock(mMutex); + mCache.newSetValue(xyz, value); + } + + /// Set the value of the voxel at the given coordinates and mark the voxel as inactive. + void setValueOff(const Coord& xyz, const ValueType& value) + { + LockT lock(mMutex); + mCache.setValueOff(xyz, value); + } + + /// @brief Apply a functor to the value of the voxel at the given coordinates + /// and mark the voxel as active. + /// @details See Tree::modifyValue() for details. + template + void modifyValue(const Coord& xyz, const ModifyOp& op) + { + LockT lock(mMutex); + mCache.modifyValue(xyz, op); + } + + /// @brief Apply a functor to the voxel at the given coordinates. + /// @details See Tree::modifyValueAndActiveState() for details. + template + void modifyValueAndActiveState(const Coord& xyz, const ModifyOp& op) + { + LockT lock(mMutex); + mCache.modifyValueAndActiveState(xyz, op); + } + + /// Set the active state of the voxel at the given coordinates but don't change its value. + void setActiveState(const Coord& xyz, bool on = true) + { + LockT lock(mMutex); + mCache.setActiveState(xyz, on); + } + /// Mark the voxel at the given coordinates as active but don't change its value. + void setValueOn(const Coord& xyz) { this->setActiveState(xyz, true); } + /// Mark the voxel at the given coordinates as inactive but don't change its value. + void setValueOff(const Coord& xyz) { this->setActiveState(xyz, false); } + + /// Return the cached node of type @a NodeType. [Mainly for internal use] + template + NodeType* getNode() + { + LockT lock(mMutex); + NodeType* node = NULL; + mCache.getNode(node); + return node; + } + + /// Cache the given node, which should lie along the path from the root node to + /// the node containing voxel (x, y, z). [Mainly for internal use] + template + void insertNode(const Coord& xyz, NodeType& node) + { + LockT lock(mMutex); + mCache.insert(xyz, &node); + } + + /// If a node of the given type exists in the cache, remove it, so that + /// isCached(xyz) returns @c false for any voxel (x, y, z) contained in + /// that node. [Mainly for internal use] + template + void eraseNode() { LockT lock(mMutex); NodeType* node = NULL; mCache.erase(node); } + + /// @brief Add the specified leaf to this tree, possibly creating a child branch + /// in the process. If the leaf node already exists, replace it. + void addLeaf(LeafNodeT* leaf) + { + LockT lock(mMutex); + mCache.addLeaf(leaf); + } + + /// @brief Add a tile at the specified tree level that contains voxel (x, y, z), + /// possibly deleting existing nodes or creating new nodes in the process. + void addTile(Index level, const Coord& xyz, const ValueType& value, bool state) + { + LockT lock(mMutex); + mCache.addTile(level, xyz, value, state); + } + + /// @brief Return a pointer to the leaf node that contains voxel (x, y, z). + /// If no such node exists, create one, but preserve the values and + /// active states of all voxels. + /// @details Use this method to preallocate a static tree topology + /// over which to safely perform multithreaded processing. + LeafNodeT* touchLeaf(const Coord& xyz) + { + LockT lock(mMutex); + return mCache.touchLeaf(xyz); + } + + //@{ + /// @brief Return a pointer to the node of the specified type that contains + /// voxel (x, y, z), or NULL if no such node exists. + template + NodeT* probeNode(const Coord& xyz) + { + LockT lock(mMutex); + return mCache.template probeNode(xyz); + } + template + const NodeT* probeConstNode(const Coord& xyz) const + { + LockT lock(mMutex); + return mCache.template probeConstNode(xyz); + } + template + const NodeT* probeNode(const Coord& xyz) const + { + return this->template probeConstNode(xyz); + } + //@} + + //@{ + /// @brief Return a pointer to the leaf node that contains voxel (x, y, z), + /// or NULL if no such node exists. + LeafNodeT* probeLeaf(const Coord& xyz) + { + LockT lock(mMutex); + return mCache.probeLeaf(xyz); + } + const LeafNodeT* probeConstLeaf(const Coord& xyz) const + { + LockT lock(mMutex); + return mCache.probeConstLeaf(xyz); + } + const LeafNodeT* probeLeaf(const Coord& xyz) const { return this->probeConstLeaf(xyz); } + //@} + + /// Remove all nodes from this cache, then reinsert the root node. + virtual void clear() + { + LockT lock(mMutex); + mCache.clear(); + if (this->mTree) mCache.insert(Coord(), &(this->mTree->root())); + } + +private: + // Allow nodes to insert themselves into the cache. + template friend class RootNode; + template friend class InternalNode; + template friend class LeafNode; + // Allow trees to deregister themselves. + template friend class Tree; + + /// Prevent this accessor from calling Tree::releaseCache() on a tree that + /// no longer exists. (Called by mTree when it is destroyed.) + virtual void release() + { + LockT lock(mMutex); + this->BaseT::release(); + mCache.clear(); + } + + /// Cache the given node, which should lie along the path from the root node to + /// the node containing voxel (x, y, z). + /// @note This operation is not mutex-protected and is intended to be called + /// only by nodes and only in the context of a getValue() or setValue() call. + template + void insert(const Coord& xyz, NodeType* node) { mCache.insert(xyz, node); } + + // Define a list of all tree node types from LeafNode to RootNode + typedef typename RootNodeT::NodeChainType InvTreeT; + // Remove all tree node types that are excluded from the cache + typedef typename boost::mpl::begin::type BeginT; + typedef typename boost::mpl::advance >::type FirstT; + typedef typename boost::mpl::find::type LastT; + typedef typename boost::mpl::erase::type SubtreeT; + typedef CacheItem::value==1> CacheItemT; + + // Private member data + mutable CacheItemT mCache; + mutable MutexType mMutex; + +}; // class ValueAccessor + + +/// @brief Template specialization of the ValueAccessor with no mutex and no cache levels +/// @details This specialization is provided mainly for benchmarking. +/// Accessors with caching will almost always be faster. +template +class ValueAccessor + : public ValueAccessor0 +{ +public: + ValueAccessor(TreeType& tree): ValueAccessor0(tree) {} + ValueAccessor(const ValueAccessor& other): ValueAccessor0(other) {} + virtual ~ValueAccessor() {} +}; + + +/// Template specialization of the ValueAccessor with no mutex and one cache level +template +class ValueAccessor + : public ValueAccessor1 +{ +public: + ValueAccessor(TreeType& tree): ValueAccessor1(tree) {} + ValueAccessor(const ValueAccessor& other): ValueAccessor1(other) {} + virtual ~ValueAccessor() {} +}; + + +/// Template specialization of the ValueAccessor with no mutex and two cache levels +template +class ValueAccessor + : public ValueAccessor2 +{ +public: + ValueAccessor(TreeType& tree): ValueAccessor2(tree) {} + ValueAccessor(const ValueAccessor& other): ValueAccessor2(other) {} + virtual ~ValueAccessor() {} +}; + + +/// Template specialization of the ValueAccessor with no mutex and three cache levels +template +class ValueAccessor + : public ValueAccessor3 +{ +public: + ValueAccessor(TreeType& tree): ValueAccessor3(tree) {} + ValueAccessor(const ValueAccessor& other): ValueAccessor3(other) {} + virtual ~ValueAccessor() {} +}; + + +//////////////////////////////////////// + + +/// @brief This accessor is thread-safe (at the cost of speed) for both reading and +/// writing to a tree. That is, multiple threads may safely access a single, +/// shared ValueAccessorRW. +/// +/// @warning Since the mutex-locking employed by the ValueAccessorRW +/// can seriously impair performance of multithreaded applications, it +/// is recommended that, instead, each thread be assigned its own +/// (non-mutex protected) accessor. +template +class ValueAccessorRW: public ValueAccessor +{ +public: + ValueAccessorRW(TreeType& tree) + : ValueAccessor(tree) + { + } +}; + + +//////////////////////////////////////// + + +// +// The classes below are for internal use and should rarely be used directly. +// + +// An element of a compile-time linked list of node pointers, ordered from LeafNode to RootNode +template +class CacheItem +{ +public: + typedef typename boost::mpl::front::type NodeType; + typedef typename NodeType::ValueType ValueType; + typedef typename NodeType::LeafNodeType LeafNodeType; + typedef std::numeric_limits CoordLimits; + + CacheItem(TreeCacheT& parent): + mParent(&parent), + mHash(CoordLimits::max()), + mNode(NULL), + mNext(parent) + { + } + + //@{ + /// Copy another CacheItem's node pointers and hash keys, but not its parent pointer. + CacheItem(TreeCacheT& parent, const CacheItem& other): + mParent(&parent), + mHash(other.mHash), + mNode(other.mNode), + mNext(parent, other.mNext) + { + } + + CacheItem& copy(TreeCacheT& parent, const CacheItem& other) + { + mParent = &parent; + mHash = other.mHash; + mNode = other.mNode; + mNext.copy(parent, other.mNext); + return *this; + } + //@} + + bool isCached(const Coord& xyz) const + { + return (this->isHashed(xyz) || mNext.isCached(xyz)); + } + + /// Cache the given node at this level. + void insert(const Coord& xyz, const NodeType* node) + { + mHash = (node != NULL) ? xyz & ~(NodeType::DIM-1) : Coord::max(); + mNode = node; + } + /// Forward the given node to another level of the cache. + template + void insert(const Coord& xyz, const OtherNodeType* node) { mNext.insert(xyz, node); } + + /// Erase the node at this level. + void erase(const NodeType*) { mHash = Coord::max(); mNode = NULL; } + /// Erase the node at another level of the cache. + template + void erase(const OtherNodeType* node) { mNext.erase(node); } + + /// Erase the nodes at this and lower levels of the cache. + void clear() { mHash = Coord::max(); mNode = NULL; mNext.clear(); } + + /// Return the cached node (if any) at this level. + void getNode(const NodeType*& node) const { node = mNode; } + void getNode(const NodeType*& node) { node = mNode; } + void getNode(NodeType*& node) + { + // This combination of a static assertion and a const_cast might not be elegant, + // but it is a lot simpler than specializing TreeCache for const Trees. + BOOST_STATIC_ASSERT(!TreeCacheT::IsConstTree); + node = const_cast(mNode); + } + /// Forward the request to another level of the cache. + template + void getNode(OtherNodeType*& node) { mNext.getNode(node); } + + /// Return the value of the voxel at the given coordinates. + const ValueType& getValue(const Coord& xyz) + { + if (this->isHashed(xyz)) { + assert(mNode); + return mNode->getValueAndCache(xyz, *mParent); + } + return mNext.getValue(xyz); + } + + void addLeaf(LeafNodeType* leaf) + { + BOOST_STATIC_ASSERT(!TreeCacheT::IsConstTree); + if (NodeType::LEVEL == 0) return; + if (this->isHashed(leaf->origin())) { + assert(mNode); + return const_cast(mNode)->addLeafAndCache(leaf, *mParent); + } + mNext.addLeaf(leaf); + } + + void addTile(Index level, const Coord& xyz, const ValueType& value, bool state) + { + BOOST_STATIC_ASSERT(!TreeCacheT::IsConstTree); + if (NodeType::LEVEL < level) return; + if (this->isHashed(xyz)) { + assert(mNode); + return const_cast(mNode)->addTileAndCache( + level, xyz, value, state, *mParent); + } + mNext.addTile(level, xyz, value, state); + } + + LeafNodeType* touchLeaf(const Coord& xyz) + { + BOOST_STATIC_ASSERT(!TreeCacheT::IsConstTree); + if (this->isHashed(xyz)) { + assert(mNode); + return const_cast(mNode)->touchLeafAndCache(xyz, *mParent); + } + return mNext.touchLeaf(xyz); + } + + LeafNodeType* probeLeaf(const Coord& xyz) + { + BOOST_STATIC_ASSERT(!TreeCacheT::IsConstTree); + if (this->isHashed(xyz)) { + assert(mNode); + return const_cast(mNode)->probeLeafAndCache(xyz, *mParent); + } + return mNext.probeLeaf(xyz); + } + + const LeafNodeType* probeConstLeaf(const Coord& xyz) + { + if (this->isHashed(xyz)) { + assert(mNode); + return mNode->probeConstLeafAndCache(xyz, *mParent); + } + return mNext.probeConstLeaf(xyz); + } + + template + NodeT* probeNode(const Coord& xyz) + { + BOOST_STATIC_ASSERT(!TreeCacheT::IsConstTree); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (this->isHashed(xyz)) { + if ((boost::is_same::value)) { + assert(mNode); + return reinterpret_cast(const_cast(mNode)); + } + return const_cast(mNode)->template probeNodeAndCache(xyz, *mParent); + } + return mNext.template probeNode(xyz); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + + template + const NodeT* probeConstNode(const Coord& xyz) + { + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (this->isHashed(xyz)) { + if ((boost::is_same::value)) { + assert(mNode); + return reinterpret_cast(mNode); + } + return mNode->template probeConstNodeAndCache(xyz, *mParent); + } + return mNext.template probeConstNode(xyz); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + + /// Return the active state of the voxel at the given coordinates. + bool isValueOn(const Coord& xyz) + { + if (this->isHashed(xyz)) { + assert(mNode); + return mNode->isValueOnAndCache(xyz, *mParent); + } + return mNext.isValueOn(xyz); + } + + /// Return the active state and value of the voxel at the given coordinates. + bool probeValue(const Coord& xyz, ValueType& value) + { + if (this->isHashed(xyz)) { + assert(mNode); + return mNode->probeValueAndCache(xyz, value, *mParent); + } + return mNext.probeValue(xyz, value); + } + + int getValueDepth(const Coord& xyz) + { + if (this->isHashed(xyz)) { + assert(mNode); + return static_cast(TreeCacheT::RootNodeT::LEVEL) - + static_cast(mNode->getValueLevelAndCache(xyz, *mParent)); + } else { + return mNext.getValueDepth(xyz); + } + } + + bool isVoxel(const Coord& xyz) + { + if (this->isHashed(xyz)) { + assert(mNode); + return mNode->getValueLevelAndCache(xyz, *mParent)==0; + } else { + return mNext.isVoxel(xyz); + } + } + + /// Set the value of the voxel at the given coordinates and mark the voxel as active. + void setValue(const Coord& xyz, const ValueType& value) + { + if (this->isHashed(xyz)) { + assert(mNode); + BOOST_STATIC_ASSERT(!TreeCacheT::IsConstTree); + const_cast(mNode)->setValueAndCache(xyz, value, *mParent); + } else { + mNext.setValue(xyz, value); + } + } + void setValueOnly(const Coord& xyz, const ValueType& value) + { + if (this->isHashed(xyz)) { + assert(mNode); + BOOST_STATIC_ASSERT(!TreeCacheT::IsConstTree); + const_cast(mNode)->setValueOnlyAndCache(xyz, value, *mParent); + } else { + mNext.setValueOnly(xyz, value); + } + } + void setValueOn(const Coord& xyz, const ValueType& value) { this->setValue(xyz, value); } + + /// @brief Apply a functor to the value of the voxel at the given coordinates + /// and mark the voxel as active. + /// @details See Tree::modifyValue() for details. + template + void modifyValue(const Coord& xyz, const ModifyOp& op) + { + if (this->isHashed(xyz)) { + assert(mNode); + BOOST_STATIC_ASSERT(!TreeCacheT::IsConstTree); + const_cast(mNode)->modifyValueAndCache(xyz, op, *mParent); + } else { + mNext.modifyValue(xyz, op); + } + } + + /// @brief Apply a functor to the voxel at the given coordinates. + /// @details See Tree::modifyValueAndActiveState() for details. + template + void modifyValueAndActiveState(const Coord& xyz, const ModifyOp& op) + { + if (this->isHashed(xyz)) { + assert(mNode); + BOOST_STATIC_ASSERT(!TreeCacheT::IsConstTree); + const_cast(mNode)->modifyValueAndActiveStateAndCache(xyz, op, *mParent); + } else { + mNext.modifyValueAndActiveState(xyz, op); + } + } + + /// Set the value of the voxel at the given coordinates and mark the voxel as inactive. + void setValueOff(const Coord& xyz, const ValueType& value) + { + if (this->isHashed(xyz)) { + assert(mNode); + BOOST_STATIC_ASSERT(!TreeCacheT::IsConstTree); + const_cast(mNode)->setValueOffAndCache(xyz, value, *mParent); + } else { + mNext.setValueOff(xyz, value); + } + } + + /// Set the active state of the voxel at the given coordinates. + void setActiveState(const Coord& xyz, bool on) + { + if (this->isHashed(xyz)) { + assert(mNode); + BOOST_STATIC_ASSERT(!TreeCacheT::IsConstTree); + const_cast(mNode)->setActiveStateAndCache(xyz, on, *mParent); + } else { + mNext.setActiveState(xyz, on); + } + } + +private: + CacheItem(const CacheItem&); + CacheItem& operator=(const CacheItem&); + + bool isHashed(const Coord& xyz) const + { + return (xyz[0] & ~Coord::ValueType(NodeType::DIM-1)) == mHash[0] + && (xyz[1] & ~Coord::ValueType(NodeType::DIM-1)) == mHash[1] + && (xyz[2] & ~Coord::ValueType(NodeType::DIM-1)) == mHash[2]; + } + + TreeCacheT* mParent; + Coord mHash; + const NodeType* mNode; + typedef typename boost::mpl::pop_front::type RestT; // NodeVecT minus its first item + CacheItem::value == 1> mNext; +};// end of CacheItem + + +/// The tail of a compile-time list of cached node pointers, ordered from LeafNode to RootNode +template +class CacheItem +{ +public: + typedef typename boost::mpl::front::type RootNodeType; + typedef typename RootNodeType::ValueType ValueType; + typedef typename RootNodeType::LeafNodeType LeafNodeType; + + CacheItem(TreeCacheT& parent): mParent(&parent), mRoot(NULL) {} + CacheItem(TreeCacheT& parent, const CacheItem& other): mParent(&parent), mRoot(other.mRoot) {} + + CacheItem& copy(TreeCacheT& parent, const CacheItem& other) + { + mParent = &parent; + mRoot = other.mRoot; + return *this; + } + + bool isCached(const Coord& xyz) const { return this->isHashed(xyz); } + + void insert(const Coord&, const RootNodeType* root) { mRoot = root; } + + // Needed for node types that are not cached + template + void insert(const Coord&, const OtherNodeType*) {} + + void erase(const RootNodeType*) { mRoot = NULL; } + + void clear() { mRoot = NULL; } + + void getNode(RootNodeType*& node) + { + BOOST_STATIC_ASSERT(!TreeCacheT::IsConstTree); + node = const_cast(mRoot); + } + void getNode(const RootNodeType*& node) const { node = mRoot; } + + void addLeaf(LeafNodeType* leaf) + { + assert(mRoot); + BOOST_STATIC_ASSERT(!TreeCacheT::IsConstTree); + const_cast(mRoot)->addLeafAndCache(leaf, *mParent); + } + + void addTile(Index level, const Coord& xyz, const ValueType& value, bool state) + { + assert(mRoot); + BOOST_STATIC_ASSERT(!TreeCacheT::IsConstTree); + const_cast(mRoot)->addTileAndCache(level, xyz, value, state, *mParent); + } + + LeafNodeType* touchLeaf(const Coord& xyz) + { + assert(mRoot); + BOOST_STATIC_ASSERT(!TreeCacheT::IsConstTree); + return const_cast(mRoot)->touchLeafAndCache(xyz, *mParent); + } + + LeafNodeType* probeLeaf(const Coord& xyz) + { + assert(mRoot); + BOOST_STATIC_ASSERT(!TreeCacheT::IsConstTree); + return const_cast(mRoot)->probeLeafAndCache(xyz, *mParent); + } + + const LeafNodeType* probeConstLeaf(const Coord& xyz) + { + assert(mRoot); + return mRoot->probeConstLeafAndCache(xyz, *mParent); + } + + template + NodeType* probeNode(const Coord& xyz) + { + assert(mRoot); + BOOST_STATIC_ASSERT(!TreeCacheT::IsConstTree); + return const_cast(mRoot)->template probeNodeAndCache(xyz, *mParent); + } + + template + const NodeType* probeConstNode(const Coord& xyz) + { + assert(mRoot); + return mRoot->template probeConstNodeAndCache(xyz, *mParent); + } + + int getValueDepth(const Coord& xyz) + { + assert(mRoot); + return mRoot->getValueDepthAndCache(xyz, *mParent); + } + bool isValueOn(const Coord& xyz) + { + assert(mRoot); + return mRoot->isValueOnAndCache(xyz, *mParent); + } + + bool probeValue(const Coord& xyz, ValueType& value) + { + assert(mRoot); + return mRoot->probeValueAndCache(xyz, value, *mParent); + } + bool isVoxel(const Coord& xyz) + { + assert(mRoot); + return mRoot->getValueDepthAndCache(xyz, *mParent) == + static_cast(RootNodeType::LEVEL); + } + const ValueType& getValue(const Coord& xyz) + { + assert(mRoot); + return mRoot->getValueAndCache(xyz, *mParent); + } + + void setValue(const Coord& xyz, const ValueType& value) + { + assert(mRoot); + BOOST_STATIC_ASSERT(!TreeCacheT::IsConstTree); + const_cast(mRoot)->setValueAndCache(xyz, value, *mParent); + } + void setValueOnly(const Coord& xyz, const ValueType& value) + { + assert(mRoot); + BOOST_STATIC_ASSERT(!TreeCacheT::IsConstTree); + const_cast(mRoot)->setValueOnlyAndCache(xyz, value, *mParent); + } + void setValueOn(const Coord& xyz, const ValueType& value) { this->setValue(xyz, value); } + + template + void modifyValue(const Coord& xyz, const ModifyOp& op) + { + assert(mRoot); + BOOST_STATIC_ASSERT(!TreeCacheT::IsConstTree); + const_cast(mRoot)->modifyValueAndCache(xyz, op, *mParent); + } + + template + void modifyValueAndActiveState(const Coord& xyz, const ModifyOp& op) + { + assert(mRoot); + BOOST_STATIC_ASSERT(!TreeCacheT::IsConstTree); + const_cast(mRoot)->modifyValueAndActiveStateAndCache(xyz, op, *mParent); + } + + void setValueOff(const Coord& xyz, const ValueType& value) + { + assert(mRoot); + BOOST_STATIC_ASSERT(!TreeCacheT::IsConstTree); + const_cast(mRoot)->setValueOffAndCache(xyz, value, *mParent); + } + + void setActiveState(const Coord& xyz, bool on) + { + assert(mRoot); + BOOST_STATIC_ASSERT(!TreeCacheT::IsConstTree); + const_cast(mRoot)->setActiveStateAndCache(xyz, on, *mParent); + } + +private: + CacheItem(const CacheItem&); + CacheItem& operator=(const CacheItem&); + + bool isHashed(const Coord&) const { return false; } + + TreeCacheT* mParent; + const RootNodeType* mRoot; +};// end of CacheItem specialized for RootNode + + +//////////////////////////////////////// + + +/// @brief ValueAccessor with no mutex and no node caching. +/// @details This specialization is provided mainly for benchmarking. +/// Accessors with caching will almost always be faster. +template +class ValueAccessor0: public ValueAccessorBase<_TreeType, IsSafe> +{ +public: + typedef _TreeType TreeType; + typedef typename TreeType::ValueType ValueType; + typedef typename TreeType::RootNodeType RootNodeT; + typedef typename TreeType::LeafNodeType LeafNodeT; + typedef ValueAccessorBase BaseT; + + ValueAccessor0(TreeType& tree): BaseT(tree) {} + + ValueAccessor0(const ValueAccessor0& other): BaseT(other) {} + + /// Return the number of cache levels employed by this accessor. + static Index numCacheLevels() { return 0; } + + ValueAccessor0& operator=(const ValueAccessor0& other) + { + if (&other != this) this->BaseT::operator=(other); + return *this; + } + + virtual ~ValueAccessor0() {} + + /// Return @c true if nodes along the path to the given voxel have been cached. + bool isCached(const Coord&) const { return false; } + + /// Return the value of the voxel at the given coordinates. + const ValueType& getValue(const Coord& xyz) const + { + assert(BaseT::mTree); + return BaseT::mTree->getValue(xyz); + } + + /// Return the active state of the voxel at the given coordinates. + bool isValueOn(const Coord& xyz) const + { + assert(BaseT::mTree); + return BaseT::mTree->isValueOn(xyz); + } + + /// Return the active state and, in @a value, the value of the voxel at the given coordinates. + bool probeValue(const Coord& xyz, ValueType& value) const + { + assert(BaseT::mTree); + return BaseT::mTree->probeValue(xyz, value); + } + + /// Return the tree depth (0 = root) at which the value of voxel (x, y, z) resides, + /// or -1 if (x, y, z) isn't explicitly represented in the tree (i.e., if it is + /// implicitly a background voxel). + int getValueDepth(const Coord& xyz) const + { + assert(BaseT::mTree); + return BaseT::mTree->getValueDepth(xyz); + } + + /// Return @c true if the value of voxel (x, y, z) resides at the leaf level + /// of the tree, i.e., if it is not a tile value. + bool isVoxel(const Coord& xyz) const + { + assert(BaseT::mTree); + return BaseT::mTree->getValueDepth(xyz) == static_cast(RootNodeT::LEVEL); + } + + //@{ + /// Set the value of the voxel at the given coordinates and mark the voxel as active. + void setValue(const Coord& xyz, const ValueType& value) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + BaseT::mTree->setValue(xyz, value); + } + void setValueOn(const Coord& xyz, const ValueType& value) { this->setValue(xyz, value); } + //@} + + /// Set the value of the voxel at the given coordinate but don't change its active state. + void setValueOnly(const Coord& xyz, const ValueType& value) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + BaseT::mTree->setValueOnly(xyz, value); + } + + /// Set the value of the voxel at the given coordinates and mark the voxel as inactive. + void setValueOff(const Coord& xyz, const ValueType& value) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + BaseT::mTree->root().setValueOff(xyz, value); + } + + /// @brief Apply a functor to the value of the voxel at the given coordinates + /// and mark the voxel as active. + /// @details See Tree::modifyValue() for details. + template + void modifyValue(const Coord& xyz, const ModifyOp& op) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + BaseT::mTree->modifyValue(xyz, op); + } + + /// @brief Apply a functor to the voxel at the given coordinates. + /// @details See Tree::modifyValueAndActiveState() for details. + template + void modifyValueAndActiveState(const Coord& xyz, const ModifyOp& op) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + BaseT::mTree->modifyValueAndActiveState(xyz, op); + } + + /// Set the active state of the voxel at the given coordinates but don't change its value. + void setActiveState(const Coord& xyz, bool on = true) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + BaseT::mTree->setActiveState(xyz, on); + } + /// Mark the voxel at the given coordinates as active but don't change its value. + void setValueOn(const Coord& xyz) { this->setActiveState(xyz, true); } + /// Mark the voxel at the given coordinates as inactive but don't change its value. + void setValueOff(const Coord& xyz) { this->setActiveState(xyz, false); } + + /// Return the cached node of type @a NodeType. [Mainly for internal use] + template NodeT* getNode() { return NULL; } + + /// Cache the given node, which should lie along the path from the root node to + /// the node containing voxel (x, y, z). [Mainly for internal use] + template void insertNode(const Coord&, NodeT&) {} + + /// @brief Add the specified leaf to this tree, possibly creating a child branch + /// in the process. If the leaf node already exists, replace it. + void addLeaf(LeafNodeT* leaf) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + BaseT::mTree->root().addLeaf(leaf); + } + + /// @brief Add a tile at the specified tree level that contains voxel (x, y, z), + /// possibly deleting existing nodes or creating new nodes in the process. + void addTile(Index level, const Coord& xyz, const ValueType& value, bool state) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + BaseT::mTree->root().addTile(level, xyz, value, state); + } + + /// If a node of the given type exists in the cache, remove it, so that + /// isCached(xyz) returns @c false for any voxel (x, y, z) contained in + /// that node. [Mainly for internal use] + template void eraseNode() {} + + LeafNodeT* touchLeaf(const Coord& xyz) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + return BaseT::mTree->touchLeaf(xyz); + } + + template + NodeT* probeNode(const Coord& xyz) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + return BaseT::mTree->template probeNode(xyz); + } + + template + const NodeT* probeConstNode(const Coord& xyz) const + { + assert(BaseT::mTree); + return BaseT::mTree->template probeConstNode(xyz); + } + + LeafNodeT* probeLeaf(const Coord& xyz) + { + return this->template probeNode(xyz); + } + + const LeafNodeT* probeConstLeaf(const Coord& xyz) const + { + return this->template probeConstNode(xyz); + } + + const LeafNodeT* probeLeaf(const Coord& xyz) const + { + return this->probeConstLeaf(xyz); + } + + /// Remove all nodes from this cache, then reinsert the root node. + virtual void clear() {} + +private: + // Allow trees to deregister themselves. + template friend class Tree; + + /// Prevent this accessor from calling Tree::releaseCache() on a tree that + /// no longer exists. (Called by mTree when it is destroyed.) + virtual void release() { this->BaseT::release(); } + +}; // ValueAccessor0 + + +/// @brief Value accessor with one level of node caching. +/// @details The node cache level is specified by L0 with the default value 0 +/// (defined in the forward declaration) corresponding to a LeafNode. +/// +/// @note This class is for experts only and should rarely be used +/// directly. Instead use ValueAccessor with its default template arguments. +template +class ValueAccessor1 : public ValueAccessorBase<_TreeType, IsSafe> +{ +public: + BOOST_STATIC_ASSERT(_TreeType::DEPTH >= 2); + BOOST_STATIC_ASSERT( L0 < _TreeType::RootNodeType::LEVEL ); + typedef _TreeType TreeType; + typedef typename TreeType::ValueType ValueType; + typedef typename TreeType::RootNodeType RootNodeT; + typedef typename TreeType::LeafNodeType LeafNodeT; + typedef ValueAccessorBase BaseT; + typedef typename RootNodeT::NodeChainType InvTreeT; + typedef typename boost::mpl::at >::type NodeT0; + + /// Constructor from a tree + ValueAccessor1(TreeType& tree) : BaseT(tree), mKey0(Coord::max()), mNode0(NULL) + { + } + + /// Copy constructor + ValueAccessor1(const ValueAccessor1& other) : BaseT(other) { this->copy(other); } + + /// Return the number of cache levels employed by this ValueAccessor + static Index numCacheLevels() { return 1; } + + /// Asignment operator + ValueAccessor1& operator=(const ValueAccessor1& other) + { + if (&other != this) { + this->BaseT::operator=(other); + this->copy(other); + } + return *this; + } + + /// Virtual destructor + virtual ~ValueAccessor1() {} + + /// Return @c true if any of the nodes along the path to the given + /// voxel have been cached. + bool isCached(const Coord& xyz) const + { + assert(BaseT::mTree); + return this->isHashed(xyz); + } + + /// Return the value of the voxel at the given coordinates. + const ValueType& getValue(const Coord& xyz) const + { + assert(BaseT::mTree); + if (this->isHashed(xyz)) { + assert(mNode0); + return mNode0->getValueAndCache(xyz, this->self()); + } + return BaseT::mTree->root().getValueAndCache(xyz, this->self()); + } + + /// Return the active state of the voxel at the given coordinates. + bool isValueOn(const Coord& xyz) const + { + assert(BaseT::mTree); + if (this->isHashed(xyz)) { + assert(mNode0); + return mNode0->isValueOnAndCache(xyz, this->self()); + } + return BaseT::mTree->root().isValueOnAndCache(xyz, this->self()); + } + + /// Return the active state of the voxel as well as its value + bool probeValue(const Coord& xyz, ValueType& value) const + { + assert(BaseT::mTree); + if (this->isHashed(xyz)) { + assert(mNode0); + return mNode0->probeValueAndCache(xyz, value, this->self()); + } + return BaseT::mTree->root().probeValueAndCache(xyz, value, this->self()); + } + + /// Return the tree depth (0 = root) at which the value of voxel (x, y, z) resides, + /// or -1 if (x, y, z) isn't explicitly represented in the tree (i.e., if it is + /// implicitly a background voxel). + int getValueDepth(const Coord& xyz) const + { + assert(BaseT::mTree); + if (this->isHashed(xyz)) { + assert(mNode0); + return RootNodeT::LEVEL - mNode0->getValueLevelAndCache(xyz, this->self()); + } + return BaseT::mTree->root().getValueDepthAndCache(xyz, this->self()); + } + + /// Return @c true if the value of voxel (x, y, z) resides at the leaf level + /// of the tree, i.e., if it is not a tile value. + bool isVoxel(const Coord& xyz) const + { + assert(BaseT::mTree); + if (this->isHashed(xyz)) { + assert(mNode0); + return mNode0->getValueLevelAndCache(xyz, this->self()) == 0; + } + return BaseT::mTree->root().getValueDepthAndCache(xyz, this->self()) == + static_cast(RootNodeT::LEVEL); + } + + //@{ + /// Set the value of the voxel at the given coordinates and mark the voxel as active. + void setValue(const Coord& xyz, const ValueType& value) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed(xyz)) { + assert(mNode0); + const_cast(mNode0)->setValueAndCache(xyz, value, *this); + } else { + BaseT::mTree->root().setValueAndCache(xyz, value, *this); + } + } + void setValueOn(const Coord& xyz, const ValueType& value) { this->setValue(xyz, value); } + //@} + + /// Set the value of the voxel at the given coordinate but preserves its active state. + void setValueOnly(const Coord& xyz, const ValueType& value) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed(xyz)) { + assert(mNode0); + const_cast(mNode0)->setValueOnlyAndCache(xyz, value, *this); + } else { + BaseT::mTree->root().setValueOnlyAndCache(xyz, value, *this); + } + } + + /// Set the value of the voxel at the given coordinates and mark the voxel as inactive. + void setValueOff(const Coord& xyz, const ValueType& value) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed(xyz)) { + assert(mNode0); + const_cast(mNode0)->setValueOffAndCache(xyz, value, *this); + } else { + BaseT::mTree->root().setValueOffAndCache(xyz, value, *this); + } + } + + /// @brief Apply a functor to the value of the voxel at the given coordinates + /// and mark the voxel as active. + /// @details See Tree::modifyValue() for details. + template + void modifyValue(const Coord& xyz, const ModifyOp& op) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed(xyz)) { + assert(mNode0); + const_cast(mNode0)->modifyValueAndCache(xyz, op, *this); + } else { + BaseT::mTree->root().modifyValueAndCache(xyz, op, *this); + } + } + + /// @brief Apply a functor to the voxel at the given coordinates. + /// @details See Tree::modifyValueAndActiveState() for details. + template + void modifyValueAndActiveState(const Coord& xyz, const ModifyOp& op) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed(xyz)) { + assert(mNode0); + const_cast(mNode0)->modifyValueAndActiveStateAndCache(xyz, op, *this); + } else { + BaseT::mTree->root().modifyValueAndActiveStateAndCache(xyz, op, *this); + } + } + + /// Set the active state of the voxel at the given coordinates but don't change its value. + void setActiveState(const Coord& xyz, bool on = true) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed(xyz)) { + assert(mNode0); + const_cast(mNode0)->setActiveStateAndCache(xyz, on, *this); + } else { + BaseT::mTree->root().setActiveStateAndCache(xyz, on, *this); + } + } + /// Mark the voxel at the given coordinates as active but don't change its value. + void setValueOn(const Coord& xyz) { this->setActiveState(xyz, true); } + /// Mark the voxel at the given coordinates as inactive but don't change its value. + void setValueOff(const Coord& xyz) { this->setActiveState(xyz, false); } + + /// Return the cached node of type @a NodeType. [Mainly for internal use] + template + NodeT* getNode() + { + const NodeT* node = NULL; + this->getNode(node); + return const_cast(node); + } + + /// Cache the given node, which should lie along the path from the root node to + /// the node containing voxel (x, y, z). [Mainly for internal use] + template + void insertNode(const Coord& xyz, NodeT& node) { this->insert(xyz, &node); } + + /// If a node of the given type exists in the cache, remove it, so that + /// isCached(xyz) returns @c false for any voxel (x, y, z) contained in + /// that node. [Mainly for internal use] + template + void eraseNode() + { + const NodeT* node = NULL; + this->eraseNode(node); + } + + /// @brief Add the specified leaf to this tree, possibly creating a child branch + /// in the process. If the leaf node already exists, replace it. + void addLeaf(LeafNodeT* leaf) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + BaseT::mTree->root().addLeaf(leaf); + } + + /// @brief Add a tile at the specified tree level that contains voxel (x, y, z), + /// possibly deleting existing nodes or creating new nodes in the process. + void addTile(Index level, const Coord& xyz, const ValueType& value, bool state) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + BaseT::mTree->root().addTile(level, xyz, value, state); + } + + /// @brief @return the leaf node that contains voxel (x, y, z) and + /// if it doesn't exist, create it, but preserve the values and + /// active states of all voxels. + /// + /// Use this method to preallocate a static tree topology over which to + /// safely perform multithreaded processing. + LeafNodeT* touchLeaf(const Coord& xyz) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed(xyz)) { + assert(mNode0); + return const_cast(mNode0)->touchLeafAndCache(xyz, *this); + } + return BaseT::mTree->root().touchLeafAndCache(xyz, *this); + } + + /// @brief @return a pointer to the node of the specified type that contains + /// voxel (x, y, z) and if it doesn't exist, return NULL. + template + NodeT* probeNode(const Coord& xyz) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if ((boost::is_same::value)) { + if (this->isHashed(xyz)) { + assert(mNode0); + return reinterpret_cast(const_cast(mNode0)); + } + return BaseT::mTree->root().template probeNodeAndCache(xyz, *this); + } + return NULL; + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + LeafNodeT* probeLeaf(const Coord& xyz) + { + return this->template probeNode(xyz); + } + + /// @brief @return a const pointer to the nodeof the specified type that contains + /// voxel (x, y, z) and if it doesn't exist, return NULL. + template + const NodeT* probeConstNode(const Coord& xyz) const + { + assert(BaseT::mTree); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if ((boost::is_same::value)) { + if (this->isHashed(xyz)) { + assert(mNode0); + return reinterpret_cast(mNode0); + } + return BaseT::mTree->root().template probeConstNodeAndCache(xyz, this->self()); + } + return NULL; + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + const LeafNodeT* probeConstLeaf(const Coord& xyz) const + { + return this->template probeConstNode(xyz); + } + const LeafNodeT* probeLeaf(const Coord& xyz) const { return this->probeConstLeaf(xyz); } + + /// Remove all the cached nodes and invalidate the corresponding hash-keys. + virtual void clear() + { + mKey0 = Coord::max(); + mNode0 = NULL; + } + +private: + // Allow nodes to insert themselves into the cache. + template friend class RootNode; + template friend class InternalNode; + template friend class LeafNode; + // Allow trees to deregister themselves. + template friend class Tree; + + // This private method is merely for convenience. + inline ValueAccessor1& self() const { return const_cast(*this); } + + void getNode(const NodeT0*& node) { node = mNode0; } + void getNode(const RootNodeT*& node) + { + node = (BaseT::mTree ? &BaseT::mTree->root() : NULL); + } + template void getNode(const OtherNodeType*& node) { node = NULL; } + void eraseNode(const NodeT0*) { mKey0 = Coord::max(); mNode0 = NULL; } + template void eraseNode(const OtherNodeType*) {} + + /// Private copy method + inline void copy(const ValueAccessor1& other) + { + mKey0 = other.mKey0; + mNode0 = other.mNode0; + } + + /// Prevent this accessor from calling Tree::releaseCache() on a tree that + /// no longer exists. (Called by mTree when it is destroyed.) + virtual void release() + { + this->BaseT::release(); + this->clear(); + } + /// Cache the given node, which should lie along the path from the root node to + /// the node containing voxel (x, y, z). + /// @note This operation is not mutex-protected and is intended to be called + /// only by nodes and only in the context of a getValue() or setValue() call. + inline void insert(const Coord& xyz, const NodeT0* node) + { + assert(node); + mKey0 = xyz & ~(NodeT0::DIM-1); + mNode0 = node; + } + + /// No-op in case a tree traversal attemps to insert a node that + /// is not cached by the ValueAccessor + template inline void insert(const Coord&, const OtherNodeType*) {} + + inline bool isHashed(const Coord& xyz) const + { + return (xyz[0] & ~Coord::ValueType(NodeT0::DIM-1)) == mKey0[0] + && (xyz[1] & ~Coord::ValueType(NodeT0::DIM-1)) == mKey0[1] + && (xyz[2] & ~Coord::ValueType(NodeT0::DIM-1)) == mKey0[2]; + } + mutable Coord mKey0; + mutable const NodeT0* mNode0; +}; // ValueAccessor1 + + +/// @brief Value accessor with two levels of node caching. +/// @details The node cache levels are specified by L0 and L1 +/// with the default values 0 and 1 (defined in the forward declaration) +/// corresponding to a LeafNode and its parent InternalNode. +/// +/// @note This class is for experts only and should rarely be used directly. +/// Instead use ValueAccessor with its default template arguments. +template +class ValueAccessor2 : public ValueAccessorBase<_TreeType, IsSafe> +{ +public: + BOOST_STATIC_ASSERT(_TreeType::DEPTH >= 3); + BOOST_STATIC_ASSERT( L0 < L1 && L1 < _TreeType::RootNodeType::LEVEL ); + typedef _TreeType TreeType; + typedef typename TreeType::ValueType ValueType; + typedef typename TreeType::RootNodeType RootNodeT; + typedef typename TreeType::LeafNodeType LeafNodeT; + typedef ValueAccessorBase BaseT; + typedef typename RootNodeT::NodeChainType InvTreeT; + typedef typename boost::mpl::at >::type NodeT0; + typedef typename boost::mpl::at >::type NodeT1; + + /// Constructor from a tree + ValueAccessor2(TreeType& tree) : BaseT(tree), + mKey0(Coord::max()), mNode0(NULL), + mKey1(Coord::max()), mNode1(NULL) {} + + /// Copy constructor + ValueAccessor2(const ValueAccessor2& other) : BaseT(other) { this->copy(other); } + + /// Return the number of cache levels employed by this ValueAccessor + static Index numCacheLevels() { return 2; } + + /// Asignment operator + ValueAccessor2& operator=(const ValueAccessor2& other) + { + if (&other != this) { + this->BaseT::operator=(other); + this->copy(other); + } + return *this; + } + + /// Virtual destructor + virtual ~ValueAccessor2() {} + + /// Return @c true if any of the nodes along the path to the given + /// voxel have been cached. + bool isCached(const Coord& xyz) const + { + assert(BaseT::mTree); + return this->isHashed1(xyz) || this->isHashed0(xyz); + } + + /// Return the value of the voxel at the given coordinates. + const ValueType& getValue(const Coord& xyz) const + { + assert(BaseT::mTree); + if (this->isHashed0(xyz)) { + assert(mNode0); + return mNode0->getValueAndCache(xyz, this->self()); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + return mNode1->getValueAndCache(xyz, this->self()); + } + return BaseT::mTree->root().getValueAndCache(xyz, this->self()); + } + + /// Return the active state of the voxel at the given coordinates. + bool isValueOn(const Coord& xyz) const + { + assert(BaseT::mTree); + if (this->isHashed0(xyz)) { + assert(mNode0); + return mNode0->isValueOnAndCache(xyz, this->self()); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + return mNode1->isValueOnAndCache(xyz, this->self()); + } + return BaseT::mTree->root().isValueOnAndCache(xyz, this->self()); + } + + /// Return the active state of the voxel as well as its value + bool probeValue(const Coord& xyz, ValueType& value) const + { + assert(BaseT::mTree); + if (this->isHashed0(xyz)) { + assert(mNode0); + return mNode0->probeValueAndCache(xyz, value, this->self()); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + return mNode1->probeValueAndCache(xyz, value, this->self()); + } + return BaseT::mTree->root().probeValueAndCache(xyz, value, this->self()); + } + + /// Return the tree depth (0 = root) at which the value of voxel (x, y, z) resides, + /// or -1 if (x, y, z) isn't explicitly represented in the tree (i.e., if it is + /// implicitly a background voxel). + int getValueDepth(const Coord& xyz) const + { + assert(BaseT::mTree); + if (this->isHashed0(xyz)) { + assert(mNode0); + return RootNodeT::LEVEL - mNode0->getValueLevelAndCache(xyz, this->self()); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + return RootNodeT::LEVEL - mNode1->getValueLevelAndCache(xyz, this->self()); + } + return BaseT::mTree->root().getValueDepthAndCache(xyz, this->self()); + } + + /// Return @c true if the value of voxel (x, y, z) resides at the leaf level + /// of the tree, i.e., if it is not a tile value. + bool isVoxel(const Coord& xyz) const + { + assert(BaseT::mTree); + if (this->isHashed0(xyz)) { + assert(mNode0); + return mNode0->getValueLevelAndCache(xyz, this->self())==0; + } else if (this->isHashed1(xyz)) { + assert(mNode1); + return mNode1->getValueLevelAndCache(xyz, this->self())==0; + } + return BaseT::mTree->root().getValueDepthAndCache(xyz, this->self()) == + static_cast(RootNodeT::LEVEL); + } + + //@{ + /// Set the value of the voxel at the given coordinates and mark the voxel as active. + void setValue(const Coord& xyz, const ValueType& value) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed0(xyz)) { + assert(mNode0); + const_cast(mNode0)->setValueAndCache(xyz, value, *this); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + const_cast(mNode1)->setValueAndCache(xyz, value, *this); + } else { + BaseT::mTree->root().setValueAndCache(xyz, value, *this); + } + } + void setValueOn(const Coord& xyz, const ValueType& value) { this->setValue(xyz, value); } + //@} + + /// Set the value of the voxel at the given coordinate but preserves its active state. + void setValueOnly(const Coord& xyz, const ValueType& value) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed0(xyz)) { + assert(mNode0); + const_cast(mNode0)->setValueOnlyAndCache(xyz, value, *this); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + const_cast(mNode1)->setValueOnlyAndCache(xyz, value, *this); + } else { + BaseT::mTree->root().setValueOnlyAndCache(xyz, value, *this); + } + } + + /// Set the value of the voxel at the given coordinates and mark the voxel as inactive. + void setValueOff(const Coord& xyz, const ValueType& value) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed0(xyz)) { + assert(mNode0); + const_cast(mNode0)->setValueOffAndCache(xyz, value, *this); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + const_cast(mNode1)->setValueOffAndCache(xyz, value, *this); + } else { + BaseT::mTree->root().setValueOffAndCache(xyz, value, *this); + } + } + + /// @brief Apply a functor to the value of the voxel at the given coordinates + /// and mark the voxel as active. + /// @details See Tree::modifyValue() for details. + template + void modifyValue(const Coord& xyz, const ModifyOp& op) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed0(xyz)) { + assert(mNode0); + const_cast(mNode0)->modifyValueAndCache(xyz, op, *this); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + const_cast(mNode1)->modifyValueAndCache(xyz, op, *this); + } else { + BaseT::mTree->root().modifyValueAndCache(xyz, op, *this); + } + } + + /// @brief Apply a functor to the voxel at the given coordinates. + /// @details See Tree::modifyValueAndActiveState() for details. + template + void modifyValueAndActiveState(const Coord& xyz, const ModifyOp& op) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed0(xyz)) { + assert(mNode0); + const_cast(mNode0)->modifyValueAndActiveStateAndCache(xyz, op, *this); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + const_cast(mNode1)->modifyValueAndActiveStateAndCache(xyz, op, *this); + } else { + BaseT::mTree->root().modifyValueAndActiveStateAndCache(xyz, op, *this); + } + } + + /// Set the active state of the voxel at the given coordinates without changing its value. + void setActiveState(const Coord& xyz, bool on = true) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed0(xyz)) { + assert(mNode0); + const_cast(mNode0)->setActiveStateAndCache(xyz, on, *this); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + const_cast(mNode1)->setActiveStateAndCache(xyz, on, *this); + } else { + BaseT::mTree->root().setActiveStateAndCache(xyz, on, *this); + } + } + /// Mark the voxel at the given coordinates as active without changing its value. + void setValueOn(const Coord& xyz) { this->setActiveState(xyz, true); } + /// Mark the voxel at the given coordinates as inactive without changing its value. + void setValueOff(const Coord& xyz) { this->setActiveState(xyz, false); } + + /// Return the cached node of type @a NodeType. [Mainly for internal use] + template + NodeT* getNode() + { + const NodeT* node = NULL; + this->getNode(node); + return const_cast(node); + } + + /// Cache the given node, which should lie along the path from the root node to + /// the node containing voxel (x, y, z). [Mainly for internal use] + template + void insertNode(const Coord& xyz, NodeT& node) { this->insert(xyz, &node); } + + /// If a node of the given type exists in the cache, remove it, so that + /// isCached(xyz) returns @c false for any voxel (x, y, z) contained in + /// that node. [Mainly for internal use] + template + void eraseNode() + { + const NodeT* node = NULL; + this->eraseNode(node); + } + + /// @brief Add the specified leaf to this tree, possibly creating a child branch + /// in the process. If the leaf node already exists, replace it. + void addLeaf(LeafNodeT* leaf) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed1(leaf->origin())) { + assert(mNode1); + return const_cast(mNode1)->addLeafAndCache(leaf, *this); + } + BaseT::mTree->root().addLeafAndCache(leaf, *this); + } + + /// @brief Add a tile at the specified tree level that contains voxel (x, y, z), + /// possibly deleting existing nodes or creating new nodes in the process. + void addTile(Index level, const Coord& xyz, const ValueType& value, bool state) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed1(xyz)) { + assert(mNode1); + return const_cast(mNode1)->addTileAndCache(level, xyz, value, state, *this); + } + BaseT::mTree->root().addTileAndCache(level, xyz, value, state, *this); + } + + /// @brief @return the leaf node that contains voxel (x, y, z) and + /// if it doesn't exist, create it, but preserve the values and + /// active states of all voxels. + /// + /// Use this method to preallocate a static tree topology over which to + /// safely perform multithreaded processing. + LeafNodeT* touchLeaf(const Coord& xyz) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed0(xyz)) { + assert(mNode0); + return const_cast(mNode0)->touchLeafAndCache(xyz, *this); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + return const_cast(mNode1)->touchLeafAndCache(xyz, *this); + } + return BaseT::mTree->root().touchLeafAndCache(xyz, *this); + } + /// @brief @return a pointer to the node of the specified type that contains + /// voxel (x, y, z) and if it doesn't exist, return NULL. + template + NodeT* probeNode(const Coord& xyz) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if ((boost::is_same::value)) { + if (this->isHashed0(xyz)) { + assert(mNode0); + return reinterpret_cast(const_cast(mNode0)); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + return const_cast(mNode1)->template probeNodeAndCache(xyz, *this); + } + return BaseT::mTree->root().template probeNodeAndCache(xyz, *this); + } else if ((boost::is_same::value)) { + if (this->isHashed1(xyz)) { + assert(mNode1); + return reinterpret_cast(const_cast(mNode1)); + } + return BaseT::mTree->root().template probeNodeAndCache(xyz, *this); + } + return NULL; + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + /// @brief @return a pointer to the leaf node that contains + /// voxel (x, y, z) and if it doesn't exist, return NULL. + LeafNodeT* probeLeaf(const Coord& xyz) { return this->template probeNode(xyz); } + + /// @brief @return a const pointer to the node of the specified type that contains + /// voxel (x, y, z) and if it doesn't exist, return NULL. + template + const NodeT* probeConstLeaf(const Coord& xyz) const + { + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if ((boost::is_same::value)) { + if (this->isHashed0(xyz)) { + assert(mNode0); + return reinterpret_cast(mNode0); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + return mNode1->template probeConstNodeAndCache(xyz, this->self()); + } + return BaseT::mTree->root().template probeConstNodeAndCache(xyz, this->self()); + } else if ((boost::is_same::value)) { + if (this->isHashed1(xyz)) { + assert(mNode1); + return reinterpret_cast(mNode1); + } + return BaseT::mTree->root().template probeConstNodeAndCache(xyz, this->self()); + } + return NULL; + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + /// @brief @return a const pointer to the leaf node that contains + /// voxel (x, y, z) and if it doesn't exist, return NULL. + const LeafNodeT* probeConstLeaf(const Coord& xyz) const + { + return this->template probeConstNode(xyz); + } + const LeafNodeT* probeLeaf(const Coord& xyz) const { return this->probeConstLeaf(xyz); } + + /// @brief @return a const pointer to the node of the specified type that contains + /// voxel (x, y, z) and if it doesn't exist, return NULL. + template + const NodeT* probeConstNode(const Coord& xyz) const + { + assert(BaseT::mTree); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if ((boost::is_same::value)) { + if (this->isHashed0(xyz)) { + assert(mNode0); + return reinterpret_cast(mNode0); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + return mNode1->template probeConstNodeAndCache(xyz, this->self()); + } + return BaseT::mTree->root().template probeConstNodeAndCache(xyz, this->self()); + } else if ((boost::is_same::value)) { + if (this->isHashed1(xyz)) { + assert(mNode1); + return reinterpret_cast(mNode1); + } + return BaseT::mTree->root().template probeConstNodeAndCache(xyz, this->self()); + } + return NULL; + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + + /// Remove all the cached nodes and invalidate the corresponding hash-keys. + virtual void clear() + { + mKey0 = Coord::max(); + mNode0 = NULL; + mKey1 = Coord::max(); + mNode1 = NULL; + } + +private: + // Allow nodes to insert themselves into the cache. + template friend class RootNode; + template friend class InternalNode; + template friend class LeafNode; + // Allow trees to deregister themselves. + template friend class Tree; + + // This private method is merely for convenience. + inline ValueAccessor2& self() const { return const_cast(*this); } + + void getNode(const NodeT0*& node) { node = mNode0; } + void getNode(const NodeT1*& node) { node = mNode1; } + void getNode(const RootNodeT*& node) + { + node = (BaseT::mTree ? &BaseT::mTree->root() : NULL); + } + template void getNode(const OtherNodeType*& node) { node = NULL; } + + void eraseNode(const NodeT0*) { mKey0 = Coord::max(); mNode0 = NULL; } + void eraseNode(const NodeT1*) { mKey1 = Coord::max(); mNode1 = NULL; } + template void eraseNode(const OtherNodeType*) {} + + /// Private copy method + inline void copy(const ValueAccessor2& other) + { + mKey0 = other.mKey0; + mNode0 = other.mNode0; + mKey1 = other.mKey1; + mNode1 = other.mNode1; + } + + /// Prevent this accessor from calling Tree::releaseCache() on a tree that + /// no longer exists. (Called by mTree when it is destroyed.) + virtual void release() + { + this->BaseT::release(); + this->clear(); + } + + /// Cache the given node, which should lie along the path from the root node to + /// the node containing voxel (x, y, z). + /// @note This operation is not mutex-protected and is intended to be called + /// only by nodes and only in the context of a getValue() or setValue() call. + inline void insert(const Coord& xyz, const NodeT0* node) + { + assert(node); + mKey0 = xyz & ~(NodeT0::DIM-1); + mNode0 = node; + } + inline void insert(const Coord& xyz, const NodeT1* node) + { + assert(node); + mKey1 = xyz & ~(NodeT1::DIM-1); + mNode1 = node; + } + /// No-op in case a tree traversal attemps to insert a node that + /// is not cached by the ValueAccessor + template inline void insert(const Coord&, const NodeT*) {} + + inline bool isHashed0(const Coord& xyz) const + { + return (xyz[0] & ~Coord::ValueType(NodeT0::DIM-1)) == mKey0[0] + && (xyz[1] & ~Coord::ValueType(NodeT0::DIM-1)) == mKey0[1] + && (xyz[2] & ~Coord::ValueType(NodeT0::DIM-1)) == mKey0[2]; + } + inline bool isHashed1(const Coord& xyz) const + { + return (xyz[0] & ~Coord::ValueType(NodeT1::DIM-1)) == mKey1[0] + && (xyz[1] & ~Coord::ValueType(NodeT1::DIM-1)) == mKey1[1] + && (xyz[2] & ~Coord::ValueType(NodeT1::DIM-1)) == mKey1[2]; + } + mutable Coord mKey0; + mutable const NodeT0* mNode0; + mutable Coord mKey1; + mutable const NodeT1* mNode1; +}; // ValueAccessor2 + + +/// @brief Value accessor with three levels of node caching. +/// @details The node cache levels are specified by L0, L1, and L2 +/// with the default values 0, 1 and 2 (defined in the forward declaration) +/// corresponding to a LeafNode, its parent InternalNode, and its parent InternalNode. +/// Since the default configuration of all typed trees and grids, e.g., +/// FloatTree or FloatGrid, has a depth of four, this value accessor is the one +/// used by default. +/// +/// @note This class is for experts only and should rarely be used +/// directly. Instead use ValueAccessor with its default template arguments +template +class ValueAccessor3 : public ValueAccessorBase<_TreeType, IsSafe> +{ +public: + BOOST_STATIC_ASSERT(_TreeType::DEPTH >= 4); + BOOST_STATIC_ASSERT(L0 < L1 && L1 < L2 && L2 < _TreeType::RootNodeType::LEVEL); + typedef _TreeType TreeType; + typedef typename TreeType::ValueType ValueType; + typedef typename TreeType::RootNodeType RootNodeT; + typedef typename TreeType::LeafNodeType LeafNodeT; + typedef ValueAccessorBase BaseT; + typedef typename RootNodeT::NodeChainType InvTreeT; + typedef typename boost::mpl::at >::type NodeT0; + typedef typename boost::mpl::at >::type NodeT1; + typedef typename boost::mpl::at >::type NodeT2; + + /// Constructor from a tree + ValueAccessor3(TreeType& tree) : BaseT(tree), + mKey0(Coord::max()), mNode0(NULL), + mKey1(Coord::max()), mNode1(NULL), + mKey2(Coord::max()), mNode2(NULL) {} + + /// Copy constructor + ValueAccessor3(const ValueAccessor3& other) : BaseT(other) { this->copy(other); } + + /// Asignment operator + ValueAccessor3& operator=(const ValueAccessor3& other) + { + if (&other != this) { + this->BaseT::operator=(other); + this->copy(other); + } + return *this; + } + + /// Return the number of cache levels employed by this ValueAccessor + static Index numCacheLevels() { return 3; } + + /// Virtual destructor + virtual ~ValueAccessor3() {} + + /// Return @c true if any of the nodes along the path to the given + /// voxel have been cached. + bool isCached(const Coord& xyz) const + { + assert(BaseT::mTree); + return this->isHashed2(xyz) || this->isHashed1(xyz) || this->isHashed0(xyz); + } + + /// Return the value of the voxel at the given coordinates. + const ValueType& getValue(const Coord& xyz) const + { + assert(BaseT::mTree); + if (this->isHashed0(xyz)) { + assert(mNode0); + return mNode0->getValueAndCache(xyz, this->self()); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + return mNode1->getValueAndCache(xyz, this->self()); + } else if (this->isHashed2(xyz)) { + assert(mNode2); + return mNode2->getValueAndCache(xyz, this->self()); + } + return BaseT::mTree->root().getValueAndCache(xyz, this->self()); + } + + /// Return the active state of the voxel at the given coordinates. + bool isValueOn(const Coord& xyz) const + { + assert(BaseT::mTree); + if (this->isHashed0(xyz)) { + assert(mNode0); + return mNode0->isValueOnAndCache(xyz, this->self()); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + return mNode1->isValueOnAndCache(xyz, this->self()); + } else if (this->isHashed2(xyz)) { + assert(mNode2); + return mNode2->isValueOnAndCache(xyz, this->self()); + } + return BaseT::mTree->root().isValueOnAndCache(xyz, this->self()); + } + + /// Return the active state of the voxel as well as its value + bool probeValue(const Coord& xyz, ValueType& value) const + { + assert(BaseT::mTree); + if (this->isHashed0(xyz)) { + assert(mNode0); + return mNode0->probeValueAndCache(xyz, value, this->self()); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + return mNode1->probeValueAndCache(xyz, value, this->self()); + } else if (this->isHashed2(xyz)) { + assert(mNode2); + return mNode2->probeValueAndCache(xyz, value, this->self()); + } + return BaseT::mTree->root().probeValueAndCache(xyz, value, this->self()); + } + + /// Return the tree depth (0 = root) at which the value of voxel (x, y, z) resides, + /// or -1 if (x, y, z) isn't explicitly represented in the tree (i.e., if it is + /// implicitly a background voxel). + int getValueDepth(const Coord& xyz) const + { + assert(BaseT::mTree); + if (this->isHashed0(xyz)) { + assert(mNode0); + return RootNodeT::LEVEL - mNode0->getValueLevelAndCache(xyz, this->self()); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + return RootNodeT::LEVEL - mNode1->getValueLevelAndCache(xyz, this->self()); + } else if (this->isHashed2(xyz)) { + assert(mNode2); + return RootNodeT::LEVEL - mNode2->getValueLevelAndCache(xyz, this->self()); + } + return BaseT::mTree->root().getValueDepthAndCache(xyz, this->self()); + } + + /// Return @c true if the value of voxel (x, y, z) resides at the leaf level + /// of the tree, i.e., if it is not a tile value. + bool isVoxel(const Coord& xyz) const + { + assert(BaseT::mTree); + if (this->isHashed0(xyz)) { + assert(mNode0); + return mNode0->getValueLevelAndCache(xyz, this->self())==0; + } else if (this->isHashed1(xyz)) { + assert(mNode1); + return mNode1->getValueLevelAndCache(xyz, this->self())==0; + } else if (this->isHashed2(xyz)) { + assert(mNode2); + return mNode2->getValueLevelAndCache(xyz, this->self())==0; + } + return BaseT::mTree->root().getValueDepthAndCache(xyz, this->self()) == + static_cast(RootNodeT::LEVEL); + } + + //@{ + /// Set the value of the voxel at the given coordinates and mark the voxel as active. + void setValue(const Coord& xyz, const ValueType& value) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed0(xyz)) { + assert(mNode0); + const_cast(mNode0)->setValueAndCache(xyz, value, *this); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + const_cast(mNode1)->setValueAndCache(xyz, value, *this); + } else if (this->isHashed2(xyz)) { + assert(mNode2); + const_cast(mNode2)->setValueAndCache(xyz, value, *this); + } else { + BaseT::mTree->root().setValueAndCache(xyz, value, *this); + } + } + void setValueOn(const Coord& xyz, const ValueType& value) { this->setValue(xyz, value); } + //@} + + /// Set the value of the voxel at the given coordinate but preserves its active state. + void setValueOnly(const Coord& xyz, const ValueType& value) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed0(xyz)) { + assert(mNode0); + const_cast(mNode0)->setValueOnlyAndCache(xyz, value, *this); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + const_cast(mNode1)->setValueOnlyAndCache(xyz, value, *this); + } else if (this->isHashed2(xyz)) { + assert(mNode2); + const_cast(mNode2)->setValueOnlyAndCache(xyz, value, *this); + } else { + BaseT::mTree->root().setValueOnlyAndCache(xyz, value, *this); + } + } + + /// Set the value of the voxel at the given coordinates and mark the voxel as inactive. + void setValueOff(const Coord& xyz, const ValueType& value) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed0(xyz)) { + assert(mNode0); + const_cast(mNode0)->setValueOffAndCache(xyz, value, *this); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + const_cast(mNode1)->setValueOffAndCache(xyz, value, *this); + } else if (this->isHashed2(xyz)) { + assert(mNode2); + const_cast(mNode2)->setValueOffAndCache(xyz, value, *this); + } else { + BaseT::mTree->root().setValueOffAndCache(xyz, value, *this); + } + } + + /// @brief Apply a functor to the value of the voxel at the given coordinates + /// and mark the voxel as active. + /// @details See Tree::modifyValue() for details. + template + void modifyValue(const Coord& xyz, const ModifyOp& op) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed0(xyz)) { + assert(mNode0); + const_cast(mNode0)->modifyValueAndCache(xyz, op, *this); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + const_cast(mNode1)->modifyValueAndCache(xyz, op, *this); + } else if (this->isHashed2(xyz)) { + assert(mNode2); + const_cast(mNode2)->modifyValueAndCache(xyz, op, *this); + } else { + BaseT::mTree->root().modifyValueAndCache(xyz, op, *this); + } + } + + /// @brief Apply a functor to the voxel at the given coordinates. + /// @details See Tree::modifyValueAndActiveState() for details. + template + void modifyValueAndActiveState(const Coord& xyz, const ModifyOp& op) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed0(xyz)) { + assert(mNode0); + const_cast(mNode0)->modifyValueAndActiveStateAndCache(xyz, op, *this); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + const_cast(mNode1)->modifyValueAndActiveStateAndCache(xyz, op, *this); + } else if (this->isHashed2(xyz)) { + assert(mNode2); + const_cast(mNode2)->modifyValueAndActiveStateAndCache(xyz, op, *this); + } else { + BaseT::mTree->root().modifyValueAndActiveStateAndCache(xyz, op, *this); + } + } + + /// Set the active state of the voxel at the given coordinates without changing its value. + void setActiveState(const Coord& xyz, bool on = true) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed0(xyz)) { + assert(mNode0); + const_cast(mNode0)->setActiveStateAndCache(xyz, on, *this); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + const_cast(mNode1)->setActiveStateAndCache(xyz, on, *this); + } else if (this->isHashed2(xyz)) { + assert(mNode2); + const_cast(mNode2)->setActiveStateAndCache(xyz, on, *this); + } else { + BaseT::mTree->root().setActiveStateAndCache(xyz, on, *this); + } + } + /// Mark the voxel at the given coordinates as active without changing its value. + void setValueOn(const Coord& xyz) { this->setActiveState(xyz, true); } + /// Mark the voxel at the given coordinates as inactive without changing its value. + void setValueOff(const Coord& xyz) { this->setActiveState(xyz, false); } + + /// Return the cached node of type @a NodeType. [Mainly for internal use] + template + NodeT* getNode() + { + const NodeT* node = NULL; + this->getNode(node); + return const_cast(node); + } + + /// Cache the given node, which should lie along the path from the root node to + /// the node containing voxel (x, y, z). [Mainly for internal use] + template + void insertNode(const Coord& xyz, NodeT& node) { this->insert(xyz, &node); } + + /// If a node of the given type exists in the cache, remove it, so that + /// isCached(xyz) returns @c false for any voxel (x, y, z) contained in + /// that node. [Mainly for internal use] + template + void eraseNode() + { + const NodeT* node = NULL; + this->eraseNode(node); + } + + /// @brief Add the specified leaf to this tree, possibly creating a child branch + /// in the process. If the leaf node already exists, replace it. + void addLeaf(LeafNodeT* leaf) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed1(leaf->origin())) { + assert(mNode1); + return const_cast(mNode1)->addLeafAndCache(leaf, *this); + } else if (this->isHashed2(leaf->origin())) { + assert(mNode2); + return const_cast(mNode2)->addLeafAndCache(leaf, *this); + } + BaseT::mTree->root().addLeafAndCache(leaf, *this); + } + + /// @brief Add a tile at the specified tree level that contains voxel (x, y, z), + /// possibly deleting existing nodes or creating new nodes in the process. + void addTile(Index level, const Coord& xyz, const ValueType& value, bool state) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed1(xyz)) { + assert(mNode1); + return const_cast(mNode1)->addTileAndCache(level, xyz, value, state, *this); + } if (this->isHashed2(xyz)) { + assert(mNode2); + return const_cast(mNode2)->addTileAndCache(level, xyz, value, state, *this); + } + BaseT::mTree->root().addTileAndCache(level, xyz, value, state, *this); + } + + /// @brief @return the leaf node that contains voxel (x, y, z) and + /// if it doesn't exist, create it, but preserve the values and + /// active states of all voxels. + /// + /// Use this method to preallocate a static tree topology over which to + /// safely perform multithreaded processing. + LeafNodeT* touchLeaf(const Coord& xyz) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + if (this->isHashed0(xyz)) { + assert(mNode0); + return const_cast(mNode0); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + return const_cast(mNode1)->touchLeafAndCache(xyz, *this); + } else if (this->isHashed2(xyz)) { + assert(mNode2); + return const_cast(mNode2)->touchLeafAndCache(xyz, *this); + } + return BaseT::mTree->root().touchLeafAndCache(xyz, *this); + } + /// @brief @return a pointer to the node of the specified type that contains + /// voxel (x, y, z) and if it doesn't exist, return NULL. + template + NodeT* probeNode(const Coord& xyz) + { + assert(BaseT::mTree); + BOOST_STATIC_ASSERT(!BaseT::IsConstTree); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if ((boost::is_same::value)) { + if (this->isHashed0(xyz)) { + assert(mNode0); + return reinterpret_cast(const_cast(mNode0)); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + return const_cast(mNode1)->template probeNodeAndCache(xyz, *this); + } else if (this->isHashed2(xyz)) { + assert(mNode2); + return const_cast(mNode2)->template probeNodeAndCache(xyz, *this); + } + return BaseT::mTree->root().template probeNodeAndCache(xyz, *this); + } else if ((boost::is_same::value)) { + if (this->isHashed1(xyz)) { + assert(mNode1); + return reinterpret_cast(const_cast(mNode1)); + } else if (this->isHashed2(xyz)) { + assert(mNode2); + return const_cast(mNode2)->template probeNodeAndCache(xyz, *this); + } + return BaseT::mTree->root().template probeNodeAndCache(xyz, *this); + } else if ((boost::is_same::value)) { + if (this->isHashed2(xyz)) { + assert(mNode2); + return reinterpret_cast(const_cast(mNode2)); + } + return BaseT::mTree->root().template probeNodeAndCache(xyz, *this); + } + return NULL; + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + /// @brief @return a pointer to the leaf node that contains + /// voxel (x, y, z) and if it doesn't exist, return NULL. + LeafNodeT* probeLeaf(const Coord& xyz) { return this->template probeNode(xyz); } + + /// @brief @return a const pointer to the node of the specified type that contains + /// voxel (x, y, z) and if it doesn't exist, return NULL. + template + const NodeT* probeConstNode(const Coord& xyz) const + { + assert(BaseT::mTree); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if ((boost::is_same::value)) { + if (this->isHashed0(xyz)) { + assert(mNode0); + return reinterpret_cast(mNode0); + } else if (this->isHashed1(xyz)) { + assert(mNode1); + return mNode1->template probeConstNodeAndCache(xyz, this->self()); + } else if (this->isHashed2(xyz)) { + assert(mNode2); + return mNode2->template probeConstNodeAndCache(xyz, this->self()); + } + return BaseT::mTree->root().template probeConstNodeAndCache(xyz, this->self()); + } else if ((boost::is_same::value)) { + if (this->isHashed1(xyz)) { + assert(mNode1); + return reinterpret_cast(mNode1); + } else if (this->isHashed2(xyz)) { + assert(mNode2); + return mNode2->template probeConstNodeAndCache(xyz, this->self()); + } + return BaseT::mTree->root().template probeConstNodeAndCache(xyz, this->self()); + } else if ((boost::is_same::value)) { + if (this->isHashed2(xyz)) { + assert(mNode2); + return reinterpret_cast(mNode2); + } + return BaseT::mTree->root().template probeConstNodeAndCache(xyz, this->self()); + } + return NULL; + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + /// @brief @return a const pointer to the leaf node that contains + /// voxel (x, y, z) and if it doesn't exist, return NULL. + const LeafNodeT* probeConstLeaf(const Coord& xyz) const + { + return this->template probeConstNode(xyz); + } + const LeafNodeT* probeLeaf(const Coord& xyz) const { return this->probeConstLeaf(xyz); } + + /// Remove all the cached nodes and invalidate the corresponding hash-keys. + virtual void clear() + { + mKey0 = Coord::max(); + mNode0 = NULL; + mKey1 = Coord::max(); + mNode1 = NULL; + mKey2 = Coord::max(); + mNode2 = NULL; + } + +private: + // Allow nodes to insert themselves into the cache. + template friend class RootNode; + template friend class InternalNode; + template friend class LeafNode; + // Allow trees to deregister themselves. + template friend class Tree; + + // This private method is merely for convenience. + inline ValueAccessor3& self() const { return const_cast(*this); } + + /// Private copy method + inline void copy(const ValueAccessor3& other) + { + mKey0 = other.mKey0; + mNode0 = other.mNode0; + mKey1 = other.mKey1; + mNode1 = other.mNode1; + mKey2 = other.mKey2; + mNode2 = other.mNode2; + } + + /// Prevent this accessor from calling Tree::releaseCache() on a tree that + /// no longer exists. (Called by mTree when it is destroyed.) + virtual void release() + { + this->BaseT::release(); + this->clear(); + } + void getNode(const NodeT0*& node) { node = mNode0; } + void getNode(const NodeT1*& node) { node = mNode1; } + void getNode(const NodeT2*& node) { node = mNode2; } + void getNode(const RootNodeT*& node) + { + node = (BaseT::mTree ? &BaseT::mTree->root() : NULL); + } + template void getNode(const OtherNodeType*& node) { node = NULL; } + + void eraseNode(const NodeT0*) { mKey0 = Coord::max(); mNode0 = NULL; } + void eraseNode(const NodeT1*) { mKey1 = Coord::max(); mNode1 = NULL; } + void eraseNode(const NodeT2*) { mKey2 = Coord::max(); mNode2 = NULL; } + template void eraseNode(const OtherNodeType*) {} + + /// Cache the given node, which should lie along the path from the root node to + /// the node containing voxel (x, y, z). + /// @note This operation is not mutex-protected and is intended to be called + /// only by nodes and only in the context of a getValue() or setValue() call. + inline void insert(const Coord& xyz, const NodeT0* node) + { + assert(node); + mKey0 = xyz & ~(NodeT0::DIM-1); + mNode0 = node; + } + inline void insert(const Coord& xyz, const NodeT1* node) + { + assert(node); + mKey1 = xyz & ~(NodeT1::DIM-1); + mNode1 = node; + } + inline void insert(const Coord& xyz, const NodeT2* node) + { + assert(node); + mKey2 = xyz & ~(NodeT2::DIM-1); + mNode2 = node; + } + /// No-op in case a tree traversal attemps to insert a node that + /// is not cached by the ValueAccessor + template + inline void insert(const Coord&, const OtherNodeType*) + { + } + inline bool isHashed0(const Coord& xyz) const + { + return (xyz[0] & ~Coord::ValueType(NodeT0::DIM-1)) == mKey0[0] + && (xyz[1] & ~Coord::ValueType(NodeT0::DIM-1)) == mKey0[1] + && (xyz[2] & ~Coord::ValueType(NodeT0::DIM-1)) == mKey0[2]; + } + inline bool isHashed1(const Coord& xyz) const + { + return (xyz[0] & ~Coord::ValueType(NodeT1::DIM-1)) == mKey1[0] + && (xyz[1] & ~Coord::ValueType(NodeT1::DIM-1)) == mKey1[1] + && (xyz[2] & ~Coord::ValueType(NodeT1::DIM-1)) == mKey1[2]; + } + inline bool isHashed2(const Coord& xyz) const + { + return (xyz[0] & ~Coord::ValueType(NodeT2::DIM-1)) == mKey2[0] + && (xyz[1] & ~Coord::ValueType(NodeT2::DIM-1)) == mKey2[1] + && (xyz[2] & ~Coord::ValueType(NodeT2::DIM-1)) == mKey2[2]; + } + mutable Coord mKey0; + mutable const NodeT0* mNode0; + mutable Coord mKey1; + mutable const NodeT1* mNode1; + mutable Coord mKey2; + mutable const NodeT2* mNode2; +}; // ValueAccessor3 + +} // namespace tree +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_TREE_VALUEACCESSOR_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/util/CpuTimer.h b/nuparu/include/openvdb/include/openvdb/util/CpuTimer.h new file mode 100644 index 00000000..f3c5e5d9 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/util/CpuTimer.h @@ -0,0 +1,128 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_UTIL_CPUTIMER_HAS_BEEN_INCLUDED +#define OPENVDB_UTIL_CPUTIMER_HAS_BEEN_INCLUDED + +#include +#include +#include // for ostringstream +#include //for setprecision + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace util { + +/// @brief Simple timer for basic profiling. +/// +/// @code +/// CpuTimer timer; +/// // code here will not be timed! +/// timer.start("algorithm"); +/// // code to be timed goes here +/// timer.stop(); +/// @endcode +/// +/// or to time multiple blocks of code +/// +/// @code +/// CpuTimer timer("algorithm 1"); +/// // code to be timed goes here +/// timer.restart("algorithm 2"); +/// // code to be timed goes here +/// timer.stop(); +/// @endcode +class CpuTimer +{ +public: + + /// @brief Initiate timer + CpuTimer() : mT0(tbb::tick_count::now()) {} + + /// @brief Prints message and re-start timer. + /// + /// @note Should normally be followed by a call to stop() + CpuTimer(const std::string& msg) { this->start(msg); } + + /// @brief Start timer. + /// + /// @note Should normally be followed by a call to time() + inline void start() { mT0 = tbb::tick_count::now(); } + + /// @brief Print message and re-start timer. + /// + /// @note Should normally be followed by a call to stop() + inline void start(const std::string& msg) + { + std::cerr << msg << " ... "; + this->start(); + } + + /// @brief Stop previous timer, print message and re-start timer. + /// + /// @note Should normally be followed by a call to stop() + inline void restart(const std::string& msg) + { + this->stop(); + this->start(msg); + } + + /// Return Time diference in milliseconds since construction or start was called. + inline double delta() const + { + tbb::tick_count::interval_t dt = tbb::tick_count::now() - mT0; + return 1000.0*dt.seconds(); + } + + /// @brief Print time in milliseconds since construction or start was called. + inline void stop() const + { + const double t = this->delta(); + std::ostringstream ostr; + ostr << "completed in " << std::setprecision(3) << t << " ms\n"; + std::cerr << ostr.str(); + } + +private: + + tbb::tick_count mT0; +};// CpuTimer + +} // namespace util +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + + +#endif // OPENVDB_UTIL_CPUTIMER_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/util/Formats.h b/nuparu/include/openvdb/include/openvdb/util/Formats.h new file mode 100644 index 00000000..52a8306e --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/util/Formats.h @@ -0,0 +1,140 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @author Ken Museth +/// +/// @file Formats.h +/// +/// @brief Utility routines to output nicely-formatted numeric values + + +#ifndef OPENVDB_UTIL_FORMATS_HAS_BEEN_INCLUDED +#define OPENVDB_UTIL_FORMATS_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace util { + +/// Output a byte count with the correct binary suffix (KB, MB, GB or TB). +/// @param os the output stream +/// @param bytes the byte count to be output +/// @param head a string to be output before the numeric text +/// @param tail a string to be output after the numeric text +/// @param exact if true, also output the unmodified count, e.g., "4.6 KB (4620 Bytes)" +/// @param width a fixed width for the numeric text +/// @param precision the number of digits after the decimal point +/// @return 0, 1, 2, 3 or 4, denoting the order of magnitude of the count. +OPENVDB_API int +printBytes(std::ostream& os, uint64_t bytes, + const std::string& head = "", + const std::string& tail = "\n", + bool exact = false, int width = 8, int precision = 3); + +/// Output a number with the correct SI suffix (thousand, million, billion or trillion) +/// @param os the output stream +/// @param number the number to be output +/// @param head a string to be output before the numeric text +/// @param tail a string to be output after the numeric text +/// @param exact if true, also output the unmodified count, e.g., "4.6 Thousand (4620)" +/// @param width a fixed width for the numeric text +/// @param precision the number of digits after the decimal point +/// @return 0, 1, 2, 3 or 4, denoting the order of magnitude of the number. +OPENVDB_API int +printNumber(std::ostream& os, uint64_t number, + const std::string& head = "", + const std::string& tail = "\n", + bool exact = true, int width = 8, int precision = 3); + + +//////////////////////////////////////// + + +/// @brief I/O manipulator that formats integer values with thousands separators +template +class FormattedInt +{ +public: + static char sep() { return ','; } + + FormattedInt(IntT n): mInt(n) {} + + std::ostream& put(std::ostream& os) const + { + // Convert the integer to a string. + std::ostringstream ostr; + ostr << mInt; + std::string s = ostr.str(); + // Prefix the string with spaces if its length is not a multiple of three. + size_t padding = (s.size() % 3) ? 3 - (s.size() % 3) : 0; + s = std::string(padding, ' ') + s; + // Construct a new string in which groups of three digits are followed + // by a separator character. + ostr.str(""); + for (size_t i = 0, N = s.size(); i < N; ) { + ostr << s[i]; + ++i; + if (i >= padding && i % 3 == 0 && i < s.size()) { + ostr << sep(); + } + } + // Remove any padding that was added and output the string. + s = ostr.str(); + os << s.substr(padding, s.size()); + return os; + } + +private: + IntT mInt; +}; + +template +std::ostream& operator<<(std::ostream& os, const FormattedInt& n) { return n.put(os); } + +/// @return an I/O manipulator that formats the given integer value for output to a stream. +template +FormattedInt formattedInt(IntT n) { return FormattedInt(n); } + +} // namespace util +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_UTIL_FORMATS_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/util/MapsUtil.h b/nuparu/include/openvdb/include/openvdb/util/MapsUtil.h new file mode 100644 index 00000000..6a21ecdd --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/util/MapsUtil.h @@ -0,0 +1,321 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file MapsUtil.h + +#ifndef OPENVDB_UTIL_MAPSUTIL_HAS_BEEN_INCLUDED +#define OPENVDB_UTIL_MAPSUTIL_HAS_BEEN_INCLUDED + +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace util { + +// Utility methods for calculating bounding boxes + +/// @brief Calculate an axis-aligned bounding box in the given map's domain +/// (e.g., index space) from an axis-aligned bounding box in its range +/// (e.g., world space) +template +inline void +calculateBounds(const MapType& map, const BBoxd& in, BBoxd& out) +{ + const Vec3d& min = in.min(); + const Vec3d& max = in.max(); + + // the pre-image of the 8 corners of the box + Vec3d corners[8]; + corners[0] = in.min();; + corners[1] = Vec3d(min(0), min(1), min(2)); + corners[2] = Vec3d(max(0), max(1), min(2)); + corners[3] = Vec3d(min(0), max(1), min(2)); + corners[4] = Vec3d(min(0), min(1), max(2)); + corners[5] = Vec3d(max(0), min(1), max(2)); + corners[6] = max; + corners[7] = Vec3d(min(0), max(1), max(2)); + + Vec3d pre_image; + Vec3d& out_min = out.min(); + Vec3d& out_max = out.max(); + out_min = map.applyInverseMap(corners[0]); + out_max = min; + for (int i = 1; i < 8; ++i) { + pre_image = map.applyInverseMap(corners[i]); + for (int j = 0; j < 3; ++j) { + out_min(j) = std::min( out_min(j), pre_image(j)); + out_max(j) = std::max( out_max(j), pre_image(j)); + } + } +} + + +/// @brief Calculate an axis-aligned bounding box in the given map's domain +/// from a spherical bounding box in its range. +template +inline void +calculateBounds(const MapType& map, const Vec3d& center, const Real radius, BBoxd& out) +{ + // On return, out gives a bounding box in continuous index space + // that encloses the sphere. + // + // the image of a sphere under the inverse of the linearMap will be an ellipsoid. + + if (math::is_linear::value) { + // I want to find extrema for three functions f(x', y', z') = x', or = y', or = z' + // with the constraint that g = (x-xo)^2 + (y-yo)^2 + (z-zo)^2 = r^2. + // Where the point x,y,z is the image of x',y',z' + // Solve: \lambda Grad(g) = Grad(f) and g = r^2. + // Note: here (x,y,z) is the image of (x',y',z'), and the gradient + // is w.r.t the (') space. + // + // This can be solved exactly: e_a^T (x' -xo') =\pm r\sqrt(e_a^T J^(-1)J^(-T)e_a) + // where e_a is one of the three unit vectors. - djh. + + /// find the image of the center of the sphere + Vec3d center_pre_image = map.applyInverseMap(center); + + std::vector coordinate_units; + coordinate_units.push_back(Vec3d(1,0,0)); + coordinate_units.push_back(Vec3d(0,1,0)); + coordinate_units.push_back(Vec3d(0,0,1)); + + Vec3d& out_min = out.min(); + Vec3d& out_max = out.max(); + for (int direction = 0; direction < 3; ++direction) { + Vec3d temp = map.applyIJT(coordinate_units[direction]); + double offset = + radius * sqrt(temp.x()*temp.x() + temp.y()*temp.y() + temp.z()*temp.z()); + out_min(direction) = center_pre_image(direction) - offset; + out_max(direction) = center_pre_image(direction) + offset; + } + + } else { + // This is some unknown map type. In this case, we form an axis-aligned + // bounding box for the sphere in world space and find the pre-images of + // the corners in index space. From these corners we compute an axis-aligned + // bounding box in index space. + BBoxd bounding_box(center - radius*Vec3d(1,1,1), center + radius*Vec3d(1,1,1)); + calculateBounds(map, bounding_box, out); + } +} + + +namespace { // anonymous namespace for this helper function + +/// @brief Find the intersection of a line passing through the point +/// \f$ (x=0, z=-1/g)\f$ with the circle \f$ (x-xo)^2 + (z-zo)^2 = r^2 \f$ +/// at a point tangent to the circle. +/// @return 0 if the focal point (0, -1/g) is inside the circle, +/// 1 if the focal point touches the circle, or 2 when both points are found. +inline int +findTangentPoints(const double g, const double xo, const double zo, + const double r, double& xp, double& zp, double& xm, double& zm) +{ + double x2 = xo * xo; + double r2 = r * r; + double xd = g * xo; + double xd2 = xd*xd; + double zd = g * zo + 1.; + double zd2 = zd*zd; + double rd2 = r2*g*g; + + double distA = xd2 + zd2; + double distB = distA - rd2; + + if (distB > 0) { + double discriminate = sqrt(distB); + + xp = xo - xo*rd2/distA + r * zd *discriminate / distA; + xm = xo - xo*rd2/distA - r * zd *discriminate / distA; + + zp = (zo*zd2 + zd*g*(x2 - r2) - xo*xo*g - r*xd*discriminate) / distA; + zm = (zo*zd2 + zd*g*(x2 - r2) - xo*xo*g + r*xd*discriminate) / distA; + + return 2; + + } if (0 >= distB && distB >= -1e-9) { + // the circle touches the focal point (x=0, z = -1/g) + xp = 0; xm = 0; + zp = -1/g; zm = -1/g; + + return 1; + } + + return 0; +} + +} // end anonymous namespace + + +/// @brief Calculate an axis-aligned bounding box in index space +/// from a spherical bounding box in world space. +/// @note This specialization is optimized for a frustum map +template<> +inline void +calculateBounds(const math::NonlinearFrustumMap& frustum, + const Vec3d& center, const Real radius, BBoxd& out) +{ + // The frustum is a nonlinear map followed by a uniform scale, rotation, translation. + // First we invert the translation, rotation and scale to find the spherical pre-image + // of the sphere in "local" coordinates where the frustum is aligned with the near plane + // on the z=0 plane and the "camera" is located at (x=0, y=0, z=-1/g). + + // check that the internal map has no shear. + const math::AffineMap& secondMap = frustum.secondMap(); + // test if the linear part has shear or non-uniform scaling + if (!frustum.hasSimpleAffine()) { + + // In this case, we form an axis-aligned bounding box for sphere in world space + // and find the pre_images of the corners in voxel space. From these corners we + // compute an axis-algined bounding box in voxel-spae + BBoxd bounding_box(center - radius*Vec3d(1,1,1), center + radius*Vec3d(1,1,1)); + calculateBounds(frustum, bounding_box, out); + return; + } + + // for convenience + Vec3d& out_min = out.min(); + Vec3d& out_max = out.max(); + + Vec3d centerLS = secondMap.applyInverseMap(center); + Vec3d voxelSize = secondMap.voxelSize(); + + // all the voxels have the same size since we know this is a simple affine map + double radiusLS = radius / voxelSize(0); + + double gamma = frustum.getGamma(); + double xp; + double zp; + double xm; + double zm; + int soln_number; + + // the bounding box in index space for the points in the frustum + const BBoxd& bbox = frustum.getBBox(); + // initialize min and max + const double x_min = bbox.min().x(); + const double y_min = bbox.min().y(); + const double z_min = bbox.min().z(); + + const double x_max = bbox.max().x(); + const double y_max = bbox.max().y(); + const double z_max = bbox.max().z(); + + out_min.x() = x_min; + out_max.x() = x_max; + out_min.y() = y_min; + out_max.y() = y_max; + + Vec3d extreme; + Vec3d extreme2; + Vec3d pre_image; + // find the x-range + soln_number = findTangentPoints(gamma, centerLS.x(), centerLS.z(), radiusLS, xp, zp, xm, zm); + if (soln_number == 2) { + extreme.x() = xp; + extreme.y() = centerLS.y(); + extreme.z() = zp; + + // location in world space of the tangent point + extreme2 = secondMap.applyMap(extreme); + // convert back to voxel space + pre_image = frustum.applyInverseMap(extreme2); + out_max.x() = std::max(x_min, std::min(x_max, pre_image.x())); + + extreme.x() = xm; + extreme.y() = centerLS.y(); + extreme.z() = zm; + // location in world space of the tangent point + extreme2 = secondMap.applyMap(extreme); + + // convert back to voxel space + pre_image = frustum.applyInverseMap(extreme2); + out_min.x() = std::max(x_min, std::min(x_max, pre_image.x())); + + } else if (soln_number == 1) { + // the circle was tangent at the focal point + } else if (soln_number == 0) { + // the focal point was inside the circle + } + + // find the y-range + soln_number = findTangentPoints(gamma, centerLS.y(), centerLS.z(), radiusLS, xp, zp, xm, zm); + if (soln_number == 2) { + extreme.x() = centerLS.x(); + extreme.y() = xp; + extreme.z() = zp; + + // location in world space of the tangent point + extreme2 = secondMap.applyMap(extreme); + // convert back to voxel space + pre_image = frustum.applyInverseMap(extreme2); + out_max.y() = std::max(y_min, std::min(y_max, pre_image.y())); + + extreme.x() = centerLS.x(); + extreme.y() = xm; + extreme.z() = zm; + extreme2 = secondMap.applyMap(extreme); + + // convert back to voxel space + pre_image = frustum.applyInverseMap(extreme2); + out_min.y() = std::max(y_min, std::min(y_max, pre_image.y())); + + } else if (soln_number == 1) { + // the circle was tangent at the focal point + } else if (soln_number == 0) { + // the focal point was inside the circle + } + + // the near and far + // the closest point. The front of the frustum is at 0 in index space + double near_dist = std::max(centerLS.z() - radiusLS, 0.); + // the farthest point. The back of the frustum is at mDepth in index space + double far_dist = std::min(centerLS.z() + radiusLS, frustum.getDepth() ); + + Vec3d near_point(0.f, 0.f, near_dist); + Vec3d far_point(0.f, 0.f, far_dist); + + out_min.z() = std::max(z_min, frustum.applyInverseMap(secondMap.applyMap(near_point)).z()); + out_max.z() = std::min(z_max, frustum.applyInverseMap(secondMap.applyMap(far_point)).z()); + +} + +} // namespace util +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_UTIL_MAPSUTIL_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/util/Name.h b/nuparu/include/openvdb/include/openvdb/util/Name.h new file mode 100644 index 00000000..b5df425f --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/util/Name.h @@ -0,0 +1,72 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_UTIL_NAME_HAS_BEEN_INCLUDED +#define OPENVDB_UTIL_NAME_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { + +typedef std::string Name; + +inline Name +readString(std::istream& is) +{ + uint32_t size; + is.read(reinterpret_cast(&size), sizeof(uint32_t)); + std::string buffer(size, ' '); + if (size>0) is.read(&buffer[0], size); + return buffer; +} + + +inline void +writeString(std::ostream& os, const Name& name) +{ + uint32_t size = uint32_t(name.size()); + os.write(reinterpret_cast(&size), sizeof(uint32_t)); + os.write(&name[0], size); +} + +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_UTIL_NAME_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/util/NodeMasks.h b/nuparu/include/openvdb/include/openvdb/util/NodeMasks.h new file mode 100644 index 00000000..8c525a51 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/util/NodeMasks.h @@ -0,0 +1,1411 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @author Ken Museth +/// +/// @file NodeMasks.h + +#ifndef OPENVDB_UTIL_NODEMASKS_HAS_BEEN_INCLUDED +#define OPENVDB_UTIL_NODEMASKS_HAS_BEEN_INCLUDED + +#include +#include +#include // for cout +#include +#include +//#include +//#include // for ffs + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace util { + +/// Return the number of on bits in the given 8-bit value. +inline Index32 +CountOn(Byte v) +{ + // Simple LUT: +#ifndef _MSC_VER // Visual C++ doesn't guarantee thread-safe initialization of local statics + static +#endif + const Byte numBits[256] = { +# define B2(n) n, n+1, n+1, n+2 +# define B4(n) B2(n), B2(n+1), B2(n+1), B2(n+2) +# define B6(n) B4(n), B4(n+1), B4(n+1), B4(n+2) + B6(0), B6(1), B6(1), B6(2) + }; + return numBits[v]; + + // Sequentially clear least significant bits + //Index32 c; + //for (c = 0; v; c++) v &= v - 0x01U; + //return c; + + // This version is only fast on CPUs with fast "%" and "*" operations + //return (v * UINT64_C(0x200040008001) & UINT64_C(0x111111111111111)) % 0xF; +} +/// Return the number of off bits in the given 8-bit value. +inline Index32 CountOff(Byte v) { return CountOn(static_cast(~v)); } + +/// Return the number of on bits in the given 32-bit value. +inline Index32 +CountOn(Index32 v) +{ + v = v - ((v >> 1) & 0x55555555U); + v = (v & 0x33333333U) + ((v >> 2) & 0x33333333U); + return (((v + (v >> 4)) & 0xF0F0F0FU) * 0x1010101U) >> 24; +} + +/// Return the number of off bits in the given 32-bit value. +inline Index32 CountOff(Index32 v) { return CountOn(~v); } + +/// Return the number of on bits in the given 64-bit value. +inline Index32 +CountOn(Index64 v) +{ + v = v - ((v >> 1) & UINT64_C(0x5555555555555555)); + v = (v & UINT64_C(0x3333333333333333)) + ((v >> 2) & UINT64_C(0x3333333333333333)); + return static_cast( + (((v + (v >> 4)) & UINT64_C(0xF0F0F0F0F0F0F0F)) * UINT64_C(0x101010101010101)) >> 56); +} + +/// Return the number of off bits in the given 64-bit value. +inline Index32 CountOff(Index64 v) { return CountOn(~v); } + +/// Return the least significant on bit of the given 8-bit value. +inline Index32 +FindLowestOn(Byte v) +{ + assert(v); +#ifndef _MSC_VER // Visual C++ doesn't guarantee thread-safe initialization of local statics + static +#endif + const Byte DeBruijn[8] = {0, 1, 6, 2, 7, 5, 4, 3}; + return DeBruijn[Byte((v & -v) * 0x1DU) >> 5]; +} + +/// Return the least significant on bit of the given 32-bit value. +inline Index32 +FindLowestOn(Index32 v) +{ + assert(v); + //return ffs(v); +#ifndef _MSC_VER // Visual C++ doesn't guarantee thread-safe initialization of local statics + static +#endif + const Byte DeBruijn[32] = { + 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, + 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9 + }; + return DeBruijn[Index32((v & -v) * 0x077CB531U) >> 27]; +} + +/// Return the least significant on bit of the given 64-bit value. +inline Index32 +FindLowestOn(Index64 v) +{ + assert(v); + //return ffsll(v); +#ifndef _MSC_VER // Visual C++ doesn't guarantee thread-safe initialization of local statics + static +#endif + const Byte DeBruijn[64] = { + 0, 1, 2, 53, 3, 7, 54, 27, 4, 38, 41, 8, 34, 55, 48, 28, + 62, 5, 39, 46, 44, 42, 22, 9, 24, 35, 59, 56, 49, 18, 29, 11, + 63, 52, 6, 26, 37, 40, 33, 47, 61, 45, 43, 21, 23, 58, 17, 10, + 51, 25, 36, 32, 60, 20, 57, 16, 50, 31, 19, 15, 30, 14, 13, 12, + }; + return DeBruijn[Index64((v & -v) * UINT64_C(0x022FDD63CC95386D)) >> 58]; +} + +/// Return the most significant on bit of the given 32-bit value. +inline Index32 +FindHighestOn(Index32 v) +{ +#ifndef _MSC_VER // Visual C++ doesn't guarantee thread-safe initialization of local statics + static +#endif + const Byte DeBruijn[32] = { + 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, + 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 + }; + v |= v >> 1; // first round down to one less than a power of 2 + v |= v >> 2; + v |= v >> 4; + v |= v >> 8; + v |= v >> 16; + return DeBruijn[Index32(v * 0x07C4ACDDU) >> 27]; +} + + +//////////////////////////////////////// + + +/// Base class for the bit mask iterators +template +class BaseMaskIterator +{ +protected: + Index32 mPos;//bit position + const NodeMask* mParent;//this iterator can't change the parent_mask! +public: + BaseMaskIterator() : mPos(NodeMask::SIZE), mParent(NULL) {} + BaseMaskIterator(Index32 pos,const NodeMask *parent) : mPos(pos), mParent(parent) + { + assert( (parent==NULL && pos==0 ) || (parent!=NULL && pos<=NodeMask::SIZE) ); + } + bool operator==(const BaseMaskIterator &iter) const {return mPos == iter.mPos;} + bool operator!=(const BaseMaskIterator &iter) const {return mPos != iter.mPos;} + bool operator< (const BaseMaskIterator &iter) const {return mPos < iter.mPos;} + BaseMaskIterator& operator=(const BaseMaskIterator& iter) + { + mPos = iter.mPos; mParent = iter.mParent; return *this; + } + Index32 offset() const {return mPos;} + Index32 pos() const {return mPos;} + bool test() const + { + assert(mPos <= NodeMask::SIZE); + return (mPos != NodeMask::SIZE); + } + operator bool() const {return this->test();} +}; // class BaseMaskIterator + + +/// @note This happens to be a const-iterator! +template +class OnMaskIterator: public BaseMaskIterator +{ +private: + typedef BaseMaskIterator BaseType; + using BaseType::mPos;//bit position; + using BaseType::mParent;//this iterator can't change the parent_mask! +public: + OnMaskIterator() : BaseType() {} + OnMaskIterator(Index32 pos,const NodeMask *parent) : BaseType(pos,parent) {} + void increment() + { + assert(mParent != NULL); + mPos = mParent->findNextOn(mPos+1); + assert(mPos <= NodeMask::SIZE); + } + void increment(Index n) { while(n-- && this->next()) ; } + bool next() + { + this->increment(); + return this->test(); + } + bool operator*() const {return true;} + OnMaskIterator& operator++() + { + this->increment(); + return *this; + } +}; // class OnMaskIterator + + +template +class OffMaskIterator: public BaseMaskIterator +{ +private: + typedef BaseMaskIterator BaseType; + using BaseType::mPos;//bit position; + using BaseType::mParent;//this iterator can't change the parent_mask! +public: + OffMaskIterator() : BaseType() {} + OffMaskIterator(Index32 pos,const NodeMask *parent) : BaseType(pos,parent) {} + void increment() + { + assert(mParent != NULL); + mPos=mParent->findNextOff(mPos+1); + assert(mPos <= NodeMask::SIZE); + } + void increment(Index n) { while(n-- && this->next()) ; } + bool next() + { + this->increment(); + return this->test(); + } + bool operator*() const {return false;} + OffMaskIterator& operator++() + { + this->increment(); + return *this; + } +}; // class OffMaskIterator + + +template +class DenseMaskIterator: public BaseMaskIterator +{ +private: + typedef BaseMaskIterator BaseType; + using BaseType::mPos;//bit position; + using BaseType::mParent;//this iterator can't change the parent_mask! + +public: + DenseMaskIterator() : BaseType() {} + DenseMaskIterator(Index32 pos,const NodeMask *parent) : BaseType(pos,parent) {} + void increment() + { + assert(mParent != NULL); + mPos += 1;//careful - the increment might go beyond the end + assert(mPos<= NodeMask::SIZE); + } + void increment(Index n) { while(n-- && this->next()) ; } + bool next() + { + this->increment(); + return this->test(); + } + bool operator*() const {return mParent->isOn(mPos);} + DenseMaskIterator& operator++() + { + this->increment(); + return *this; + } +}; // class DenseMaskIterator + + +/// @brief Bit mask for the internal and leaf nodes of VDB. This +/// is a 64-bit implementation. +/// +/// @note A template specialization for Log2Dim=1 and Log2Dim=2 are +/// given below. +template +class NodeMask +{ +public: + BOOST_STATIC_ASSERT( Log2Dim>2 ); + + static const Index32 LOG2DIM = Log2Dim; + static const Index32 DIM = 1<> 6;// 2^6=64 + typedef Index64 Word; + +private: + + // The bits are represented as a linear array of Words, and the + // size of a Word is 32 or 64 bits depending on the platform. + // The BIT_MASK is defined as the number of bits in a Word - 1 + //static const Index32 BIT_MASK = sizeof(void*) == 8 ? 63 : 31; + //static const Index32 LOG2WORD = BIT_MASK == 63 ? 6 : 5; + //static const Index32 WORD_COUNT = SIZE >> LOG2WORD; + //typedef boost::mpl::if_c::type Word; + + Word mWords[WORD_COUNT];//only member data! + +public: + /// Default constructor sets all bits off + NodeMask() { this->setOff(); } + /// All bits are set to the specified state + NodeMask(bool on) { this->set(on); } + /// Copy constructor + NodeMask(const NodeMask &other) { *this = other; } + /// Destructor + ~NodeMask() {} + /// Assignment operator + NodeMask& operator=(const NodeMask& other) + { + Index32 n = WORD_COUNT; + const Word* w2 = other.mWords; + for (Word* w1 = mWords; n--; ++w1, ++w2) *w1 = *w2; + return *this; + } + + typedef OnMaskIterator OnIterator; + typedef OffMaskIterator OffIterator; + typedef DenseMaskIterator DenseIterator; + + OnIterator beginOn() const { return OnIterator(this->findFirstOn(),this); } + OnIterator endOn() const { return OnIterator(SIZE,this); } + OffIterator beginOff() const { return OffIterator(this->findFirstOff(),this); } + OffIterator endOff() const { return OffIterator(SIZE,this); } + DenseIterator beginDense() const { return DenseIterator(0,this); } + DenseIterator endDense() const { return DenseIterator(SIZE,this); } + + bool operator == (const NodeMask &other) const + { + int n = WORD_COUNT; + for (const Word *w1=mWords, *w2=other.mWords; n-- && *w1++ == *w2++;) ; + return n == -1; + } + + bool operator != (const NodeMask &other) const { return !(*this == other); } + + // + // Bitwise logical operations + // + + /// @brief Apply a functor to the words of the this and the other mask. + /// + /// @details An example that implements the "operator&=" method: + /// @code + /// struct Op { inline void operator()(W &w1, const W& w2) const { w1 &= w2; } }; + /// @endcode + template + const NodeMask& foreach(const NodeMask& other, const WordOp& op) + { + Word *w1 = mWords; + const Word *w2 = other.mWords; + for (Index32 n = WORD_COUNT; n--; ++w1, ++w2) op( *w1, *w2); + return *this; + } + template + const NodeMask& foreach(const NodeMask& other1, const NodeMask& other2, const WordOp& op) + { + Word *w1 = mWords; + const Word *w2 = other1.mWords, *w3 = other2.mWords; + for (Index32 n = WORD_COUNT; n--; ++w1, ++w2, ++w3) op( *w1, *w2, *w3); + return *this; + } + template + const NodeMask& foreach(const NodeMask& other1, const NodeMask& other2, const NodeMask& other3, + const WordOp& op) + { + Word *w1 = mWords; + const Word *w2 = other1.mWords, *w3 = other2.mWords, *w4 = other3.mWords; + for (Index32 n = WORD_COUNT; n--; ++w1, ++w2, ++w3, ++w4) op( *w1, *w2, *w3, *w4); + return *this; + } + /// @brief Bitwise intersection + const NodeMask& operator&=(const NodeMask& other) + { + Word *w1 = mWords; + const Word *w2 = other.mWords; + for (Index32 n = WORD_COUNT; n--; ++w1, ++w2) *w1 &= *w2; + return *this; + } + /// @brief Bitwise union + const NodeMask& operator|=(const NodeMask& other) + { + Word *w1 = mWords; + const Word *w2 = other.mWords; + for (Index32 n = WORD_COUNT; n--; ++w1, ++w2) *w1 |= *w2; + return *this; + } + /// @brief Bitwise difference + const NodeMask& operator-=(const NodeMask& other) + { + Word *w1 = mWords; + const Word *w2 = other.mWords; + for (Index32 n = WORD_COUNT; n--; ++w1, ++w2) *w1 &= ~*w2; + return *this; + } + /// @brief Bitwise XOR + const NodeMask& operator^=(const NodeMask& other) + { + Word *w1 = mWords; + const Word *w2 = other.mWords; + for (Index32 n = WORD_COUNT; n--; ++w1, ++w2) *w1 ^= *w2; + return *this; + } + NodeMask operator!() const { NodeMask m(*this); m.toggle(); return m; } + NodeMask operator&(const NodeMask& other) const { NodeMask m(*this); m &= other; return m; } + NodeMask operator|(const NodeMask& other) const { NodeMask m(*this); m |= other; return m; } + NodeMask operator^(const NodeMask& other) const { NodeMask m(*this); m ^= other; return m; } + + /// Return the byte size of this NodeMask + static Index32 memUsage() { return static_cast(WORD_COUNT*sizeof(Word)); } + /// Return the total number of on bits + Index32 countOn() const + { + Index32 sum = 0, n = WORD_COUNT; + for (const Word* w = mWords; n--; ++w) sum += CountOn(*w); + return sum; + } + /// Return the total number of on bits + Index32 countOff() const { return SIZE-this->countOn(); } + /// Set the nth bit on + void setOn(Index32 n) { + assert( (n >> 6) < WORD_COUNT ); + mWords[n >> 6] |= Word(1) << (n & 63); + } + /// Set the nth bit off + void setOff(Index32 n) { + assert( (n >> 6) < WORD_COUNT ); + mWords[n >> 6] &= ~(Word(1) << (n & 63)); + } + /// Set the nth bit to the specified state + void set(Index32 n, bool On) { On ? this->setOn(n) : this->setOff(n); } + /// Set all bits to the specified state + void set(bool on) + { + const Word state = on ? ~Word(0) : Word(0); + Index32 n = WORD_COUNT; + for (Word* w = mWords; n--; ++w) *w = state; + } + /// Set all bits on + void setOn() + { + Index32 n = WORD_COUNT; + for (Word* w = mWords; n--; ++w) *w = ~Word(0); + } + /// Set all bits off + void setOff() + { + Index32 n = WORD_COUNT; + for (Word* w = mWords; n--; ++w) *w = Word(0); + } + /// Toggle the state of the nth bit + void toggle(Index32 n) { + assert( (n >> 6) < WORD_COUNT ); + mWords[n >> 6] ^= Word(1) << (n & 63); + } + /// Toggle the state of all bits in the mask + void toggle() + { + Index32 n = WORD_COUNT; + for (Word* w = mWords; n--; ++w) *w = ~*w; + } + /// Set the first bit on + void setFirstOn() { this->setOn(0); } + /// Set the last bit on + void setLastOn() { this->setOn(SIZE-1); } + /// Set the first bit off + void setFirstOff() { this->setOff(0); } + /// Set the last bit off + void setLastOff() { this->setOff(SIZE-1); } + /// Return @c true if the nth bit is on + bool isOn(Index32 n) const + { + assert( (n >> 6) < WORD_COUNT ); + return 0 != (mWords[n >> 6] & (Word(1) << (n & 63))); + } + /// Return @c true if the nth bit is off + bool isOff(Index32 n) const {return !this->isOn(n); } + /// Return @c true if all the bits are on + bool isOn() const + { + int n = WORD_COUNT; + for (const Word *w = mWords; n-- && *w++ == ~Word(0);) ; + return n == -1; + } + /// Return @c true if all the bits are off + bool isOff() const + { + int n = WORD_COUNT; + for (const Word *w = mWords; n-- && *w++ == Word(0);) ; + return n == -1; + } + Index32 findFirstOn() const + { + Index32 n = 0; + const Word* w = mWords; + for (; nnth word of the bit mask, for a word of arbitrary size. + template + WordT getWord(Index n) const + { + assert(n*8*sizeof(WordT) < SIZE); + return reinterpret_cast(mWords)[n]; + } + template + WordT& getWord(Index n) + { + assert(n*8*sizeof(WordT) < SIZE); + return reinterpret_cast(mWords)[n]; + } + //@} + + void save(std::ostream& os) const + { + os.write(reinterpret_cast(mWords), this->memUsage()); + } + void load(std::istream& is) { + is.read(reinterpret_cast(mWords), this->memUsage()); + } + /// @brief simple print method for debugging + void printInfo(std::ostream& os=std::cout) const + { + os << "NodeMask: Dim=" << DIM << " Log2Dim=" << Log2Dim + << " Bit count=" << SIZE << " word count=" << WORD_COUNT << std::endl; + } + void printBits(std::ostream& os=std::cout, Index32 max_out=80u) const + { + const Index32 n=(SIZE>max_out ? max_out : SIZE); + for (Index32 i=0; i < n; ++i) { + if ( !(i & 63) ) + os << "||"; + else if ( !(i%8) ) + os << "|"; + os << this->isOn(i); + } + os << "|" << std::endl; + } + void printAll(std::ostream& os=std::cout, Index32 max_out=80u) const + { + this->printInfo(os); + this->printBits(os, max_out); + } + + Index32 findNextOn(Index32 start) const + { + Index32 n = start >> 6;//initiate + if (n >= WORD_COUNT) return SIZE; // check for out of bounds + Index32 m = start & 63; + Word b = mWords[n]; + if (b & (Word(1) << m)) return start;//simpel case: start is on + b &= ~Word(0) << m;// mask out lower bits + while(!b && ++n> 6;//initiate + if (n >= WORD_COUNT) return SIZE; // check for out of bounds + Index32 m = start & 63; + Word b = ~mWords[n]; + if (b & (Word(1) << m)) return start;//simpel case: start is on + b &= ~Word(0) << m;// mask out lower bits + while(!b && ++n +class NodeMask<1> +{ +public: + + static const Index32 LOG2DIM = 1; + static const Index32 DIM = 2; + static const Index32 SIZE = 8; + static const Index32 WORD_COUNT = 1; + typedef Byte Word; + +private: + + Byte mByte;//only member data! + +public: + /// Default constructor sets all bits off + NodeMask() : mByte(0x00U) {} + /// All bits are set to the specified state + NodeMask(bool on) : mByte(on ? 0xFFU : 0x00U) {} + /// Copy constructor + NodeMask(const NodeMask &other) : mByte(other.mByte) {} + /// Destructor + ~NodeMask() {} + /// Assignment operator + void operator = (const NodeMask &other) { mByte = other.mByte; } + + typedef OnMaskIterator OnIterator; + typedef OffMaskIterator OffIterator; + typedef DenseMaskIterator DenseIterator; + + OnIterator beginOn() const { return OnIterator(this->findFirstOn(),this); } + OnIterator endOn() const { return OnIterator(SIZE,this); } + OffIterator beginOff() const { return OffIterator(this->findFirstOff(),this); } + OffIterator endOff() const { return OffIterator(SIZE,this); } + DenseIterator beginDense() const { return DenseIterator(0,this); } + DenseIterator endDense() const { return DenseIterator(SIZE,this); } + + bool operator == (const NodeMask &other) const { return mByte == other.mByte; } + + bool operator != (const NodeMask &other) const {return mByte != other.mByte; } + + // + // Bitwise logical operations + // + + /// @brief Apply a functor to the words of the this and the other mask. + /// + /// @details An example that implements the "operator&=" method: + /// @code + /// struct Op { inline void operator()(Word &w1, const Word& w2) const { w1 &= w2; } }; + /// @endcode + template + const NodeMask& foreach(const NodeMask& other, const WordOp& op) + { + op(mByte, other.mByte); + return *this; + } + template + const NodeMask& foreach(const NodeMask& other1, const NodeMask& other2, const WordOp& op) + { + op(mByte, other1.mByte, other2.mByte); + return *this; + } + template + const NodeMask& foreach(const NodeMask& other1, const NodeMask& other2, const NodeMask& other3, + const WordOp& op) + { + op(mByte, other1.mByte, other2.mByte, other3.mByte); + return *this; + } + /// @brief Bitwise intersection + const NodeMask& operator&=(const NodeMask& other) + { + mByte &= other.mByte; + return *this; + } + /// @brief Bitwise union + const NodeMask& operator|=(const NodeMask& other) + { + mByte |= other.mByte; + return *this; + } + /// @brief Bitwise difference + const NodeMask& operator-=(const NodeMask& other) + { + mByte &= static_cast(~other.mByte); + return *this; + } + /// @brief Bitwise XOR + const NodeMask& operator^=(const NodeMask& other) + { + mByte ^= other.mByte; + return *this; + } + NodeMask operator!() const { NodeMask m(*this); m.toggle(); return m; } + NodeMask operator&(const NodeMask& other) const { NodeMask m(*this); m &= other; return m; } + NodeMask operator|(const NodeMask& other) const { NodeMask m(*this); m |= other; return m; } + NodeMask operator^(const NodeMask& other) const { NodeMask m(*this); m ^= other; return m; } + /// Return the byte size of this NodeMask + static Index32 memUsage() { return 1; } + /// Return the total number of on bits + Index32 countOn() const { return CountOn(mByte); } + /// Return the total number of on bits + Index32 countOff() const { return CountOff(mByte); } + /// Set the nth bit on + void setOn(Index32 n) { + assert( n < 8 ); + mByte = mByte | static_cast(0x01U << (n & 7)); + } + /// Set the nth bit off + void setOff(Index32 n) { + assert( n < 8 ); + mByte = mByte & static_cast(~(0x01U << (n & 7))); + } + /// Set the nth bit to the specified state + void set(Index32 n, bool On) { On ? this->setOn(n) : this->setOff(n); } + /// Set all bits to the specified state + void set(bool on) { mByte = on ? 0xFFU : 0x00U; } + /// Set all bits on + void setOn() { mByte = 0xFFU; } + /// Set all bits off + void setOff() { mByte = 0x00U; } + /// Toggle the state of the nth bit + void toggle(Index32 n) { + assert( n < 8 ); + mByte = mByte ^ static_cast(0x01U << (n & 7)); + } + /// Toggle the state of all bits in the mask + void toggle() { mByte = static_cast(~mByte); } + /// Set the first bit on + void setFirstOn() { this->setOn(0); } + /// Set the last bit on + void setLastOn() { this->setOn(7); } + /// Set the first bit off + void setFirstOff() { this->setOff(0); } + /// Set the last bit off + void setLastOff() { this->setOff(7); } + /// Return true if the nth bit is on + bool isOn(Index32 n) const + { + assert( n < 8 ); + return mByte & (0x01U << (n & 7)); + } + /// Return true if the nth bit is off + bool isOff(Index32 n) const {return !this->isOn(n); } + /// Return true if all the bits are on + bool isOn() const { return mByte == 0xFFU; } + /// Return true if all the bits are off + bool isOff() const { return mByte == 0; } + Index32 findFirstOn() const { return mByte ? FindLowestOn(mByte) : 8; } + Index32 findFirstOff() const + { + const Byte b = static_cast(~mByte); + return b ? FindLowestOn(b) : 8; + } + /* + //@{ + /// Return the nth word of the bit mask, for a word of arbitrary size. + /// @note This version assumes WordT=Byte and n=0! + template + WordT getWord(Index n) const + { + BOOST_STATIC_ASSERT(sizeof(WordT) == sizeof(Byte)); + assert(n == 0); + return reinterpret_cast(mByte); + } + template + WordT& getWord(Index n) + { + BOOST_STATIC_ASSERT(sizeof(WordT) == sizeof(Byte)); + assert(n == 0); + return reinterpret_cast(mByte); + } + //@} + */ + void save(std::ostream& os) const + { + os.write(reinterpret_cast(&mByte), 1); + } + void load(std::istream& is) { is.read(reinterpret_cast(&mByte), 1); } + /// @brief simple print method for debugging + void printInfo(std::ostream& os=std::cout) const + { + os << "NodeMask: Dim=2, Log2Dim=1, Bit count=8, Word count=1"<isOn(i); + os << "||" << std::endl; + } + void printAll(std::ostream& os=std::cout) const + { + this->printInfo(os); + this->printBits(os); + } + + Index32 findNextOn(Index32 start) const + { + if (start>=8) return 8; + const Byte b = static_cast(mByte & (0xFFU << start)); + return b ? FindLowestOn(b) : 8; + } + + Index32 findNextOff(Index32 start) const + { + if (start>=8) return 8; + const Byte b = static_cast(~mByte & (0xFFU << start)); + return b ? FindLowestOn(b) : 8; + } + +};// NodeMask<1> + + +/// @brief Template specialization of NodeMask for Log2Dim=2, i.e. 4^3 nodes +template<> +class NodeMask<2> +{ +public: + + static const Index32 LOG2DIM = 2; + static const Index32 DIM = 4; + static const Index32 SIZE = 64; + static const Index32 WORD_COUNT = 1; + typedef Index64 Word; + +private: + + Word mWord;//only member data! + +public: + /// Default constructor sets all bits off + NodeMask() : mWord(UINT64_C(0x00)) {} + /// All bits are set to the specified state + NodeMask(bool on) : mWord(on ? UINT64_C(0xFFFFFFFFFFFFFFFF) : UINT64_C(0x00)) {} + /// Copy constructor + NodeMask(const NodeMask &other) : mWord(other.mWord) {} + /// Destructor + ~NodeMask() {} + /// Assignment operator + void operator = (const NodeMask &other) { mWord = other.mWord; } + + typedef OnMaskIterator OnIterator; + typedef OffMaskIterator OffIterator; + typedef DenseMaskIterator DenseIterator; + + OnIterator beginOn() const { return OnIterator(this->findFirstOn(),this); } + OnIterator endOn() const { return OnIterator(SIZE,this); } + OffIterator beginOff() const { return OffIterator(this->findFirstOff(),this); } + OffIterator endOff() const { return OffIterator(SIZE,this); } + DenseIterator beginDense() const { return DenseIterator(0,this); } + DenseIterator endDense() const { return DenseIterator(SIZE,this); } + + bool operator == (const NodeMask &other) const { return mWord == other.mWord; } + + bool operator != (const NodeMask &other) const {return mWord != other.mWord; } + + // + // Bitwise logical operations + // + + /// @brief Apply a functor to the words of the this and the other mask. + /// + /// @details An example that implements the "operator&=" method: + /// @code + /// struct Op { inline void operator()(Word &w1, const Word& w2) const { w1 &= w2; } }; + /// @endcode + template + const NodeMask& foreach(const NodeMask& other, const WordOp& op) + { + op(mWord, other.mWord); + return *this; + } + template + const NodeMask& foreach(const NodeMask& other1, const NodeMask& other2, const WordOp& op) + { + op(mWord, other1.mWord, other2.mWord); + return *this; + } + template + const NodeMask& foreach(const NodeMask& other1, const NodeMask& other2, const NodeMask& other3, + const WordOp& op) + { + op(mWord, other1.mWord, other2.mWord, other3.mWord); + return *this; + } + /// @brief Bitwise intersection + const NodeMask& operator&=(const NodeMask& other) + { + mWord &= other.mWord; + return *this; + } + /// @brief Bitwise union + const NodeMask& operator|=(const NodeMask& other) + { + mWord |= other.mWord; + return *this; + } + /// @brief Bitwise difference + const NodeMask& operator-=(const NodeMask& other) + { + mWord &= ~other.mWord; + return *this; + } + /// @brief Bitwise XOR + const NodeMask& operator^=(const NodeMask& other) + { + mWord ^= other.mWord; + return *this; + } + NodeMask operator!() const { NodeMask m(*this); m.toggle(); return m; } + NodeMask operator&(const NodeMask& other) const { NodeMask m(*this); m &= other; return m; } + NodeMask operator|(const NodeMask& other) const { NodeMask m(*this); m |= other; return m; } + NodeMask operator^(const NodeMask& other) const { NodeMask m(*this); m ^= other; return m; } + /// Return the byte size of this NodeMask + static Index32 memUsage() { return 8; } + /// Return the total number of on bits + Index32 countOn() const { return CountOn(mWord); } + /// Return the total number of on bits + Index32 countOff() const { return CountOff(mWord); } + /// Set the nth bit on + void setOn(Index32 n) { + assert( n < 64 ); + mWord |= UINT64_C(0x01) << (n & 63); + } + /// Set the nth bit off + void setOff(Index32 n) { + assert( n < 64 ); + mWord &= ~(UINT64_C(0x01) << (n & 63)); + } + /// Set the nth bit to the specified state + void set(Index32 n, bool On) { On ? this->setOn(n) : this->setOff(n); } + /// Set all bits to the specified state + void set(bool on) { mWord = on ? UINT64_C(0xFFFFFFFFFFFFFFFF) : UINT64_C(0x00); } + /// Set all bits on + void setOn() { mWord = UINT64_C(0xFFFFFFFFFFFFFFFF); } + /// Set all bits off + void setOff() { mWord = UINT64_C(0x00); } + /// Toggle the state of the nth bit + void toggle(Index32 n) { + assert( n < 64 ); + mWord ^= UINT64_C(0x01) << (n & 63); + } + /// Toggle the state of all bits in the mask + void toggle() { mWord = ~mWord; } + /// Set the first bit on + void setFirstOn() { this->setOn(0); } + /// Set the last bit on + void setLastOn() { this->setOn(63); } + /// Set the first bit off + void setFirstOff() { this->setOff(0); } + /// Set the last bit off + void setLastOff() { this->setOff(63); } + /// Return true if the nth bit is on + bool isOn(Index32 n) const + { + assert( n < 64 ); + return 0 != (mWord & (UINT64_C(0x01) << (n & 63))); + } + /// Return true if the nth bit is off + bool isOff(Index32 n) const {return !this->isOn(n); } + /// Return true if all the bits are on + bool isOn() const { return mWord == UINT64_C(0xFFFFFFFFFFFFFFFF); } + /// Return true if all the bits are off + bool isOff() const { return mWord == 0; } + Index32 findFirstOn() const { return mWord ? FindLowestOn(mWord) : 64; } + Index32 findFirstOff() const + { + const Word w = ~mWord; + return w ? FindLowestOn(w) : 64; + } + //@{ + /// Return the nth word of the bit mask, for a word of arbitrary size. + template + WordT getWord(Index n) const + { + assert(n*8*sizeof(WordT) < SIZE); + return reinterpret_cast(&mWord)[n]; + } + template + WordT& getWord(Index n) + { + assert(n*8*sizeof(WordT) < SIZE); + return reinterpret_cast(mWord)[n]; + } + //@} + void save(std::ostream& os) const + { + os.write(reinterpret_cast(&mWord), 8); + } + void load(std::istream& is) { is.read(reinterpret_cast(&mWord), 8); } + /// @brief simple print method for debugging + void printInfo(std::ostream& os=std::cout) const + { + os << "NodeMask: Dim=4, Log2Dim=2, Bit count=64, Word count=1"<isOn(i); + } + os << "||" << std::endl; + } + void printAll(std::ostream& os=std::cout) const + { + this->printInfo(os); + this->printBits(os); + } + + Index32 findNextOn(Index32 start) const + { + if (start>=64) return 64; + const Word w = mWord & (UINT64_C(0xFFFFFFFFFFFFFFFF) << start); + return w ? FindLowestOn(w) : 64; + } + + Index32 findNextOff(Index32 start) const + { + if (start>=64) return 64; + const Word w = ~mWord & (UINT64_C(0xFFFFFFFFFFFFFFFF) << start); + return w ? FindLowestOn(w) : 64; + } + +};// NodeMask<2> + + +// Unlike NodeMask above this RootNodeMask has a run-time defined size. +// It is only included for backward compatibility and will likely be +// deprecated in the future! +// This class is 32-bit specefic, hence the use if Index32 vs Index! +class RootNodeMask +{ +protected: + Index32 mBitSize, mIntSize; + Index32 *mBits; + +public: + RootNodeMask(): mBitSize(0), mIntSize(0), mBits(NULL) {} + RootNodeMask(Index32 bit_size): + mBitSize(bit_size), mIntSize(((bit_size-1)>>5)+1), mBits(new Index32[mIntSize]) + { + for (Index32 i=0; i>5)+1; + delete [] mBits; + mBits = new Index32[mIntSize]; + for (Index32 i=0; igetBitSize()), mParent(parent) { + assert( pos<=mBitSize ); + } + bool operator==(const BaseIterator &iter) const {return mPos == iter.mPos;} + bool operator!=(const BaseIterator &iter) const {return mPos != iter.mPos;} + bool operator< (const BaseIterator &iter) const {return mPos < iter.mPos;} + BaseIterator& operator=(const BaseIterator& iter) { + mPos = iter.mPos; + mBitSize = iter.mBitSize; + mParent = iter.mParent; + return *this; + } + + Index32 offset() const {return mPos;} + + Index32 pos() const {return mPos;} + + bool test() const { + assert(mPos <= mBitSize); + return (mPos != mBitSize); + } + + operator bool() const {return this->test();} + }; // class BaseIterator + + /// @note This happens to be a const-iterator! + class OnIterator: public BaseIterator + { + protected: + using BaseIterator::mPos;//bit position; + using BaseIterator::mBitSize;//bit size; + using BaseIterator::mParent;//this iterator can't change the parent_mask! + public: + OnIterator() : BaseIterator() {} + OnIterator(Index32 pos,const RootNodeMask *parent) : BaseIterator(pos,parent) {} + void increment() { + assert(mParent!=NULL); + mPos=mParent->findNextOn(mPos+1); + assert(mPos <= mBitSize); + } + void increment(Index n) { + for (Index i=0; inext(); ++i) {} + } + bool next() { + this->increment(); + return this->test(); + } + bool operator*() const {return true;} + OnIterator& operator++() { + this->increment(); + return *this; + } + }; // class OnIterator + + class OffIterator: public BaseIterator + { + protected: + using BaseIterator::mPos;//bit position; + using BaseIterator::mBitSize;//bit size; + using BaseIterator::mParent;//this iterator can't change the parent_mask! + public: + OffIterator() : BaseIterator() {} + OffIterator(Index32 pos,const RootNodeMask *parent) : BaseIterator(pos,parent) {} + void increment() { + assert(mParent!=NULL); + mPos=mParent->findNextOff(mPos+1); + assert(mPos <= mBitSize); + } + void increment(Index n) { + for (Index i=0; inext(); ++i) {} + } + bool next() { + this->increment(); + return this->test(); + } + bool operator*() const {return true;} + OffIterator& operator++() { + this->increment(); + return *this; + } + }; // class OffIterator + + class DenseIterator: public BaseIterator + { + protected: + using BaseIterator::mPos;//bit position; + using BaseIterator::mBitSize;//bit size; + using BaseIterator::mParent;//this iterator can't change the parent_mask! + public: + DenseIterator() : BaseIterator() {} + DenseIterator(Index32 pos,const RootNodeMask *parent) : BaseIterator(pos,parent) {} + void increment() { + assert(mParent!=NULL); + mPos += 1;//carefull - the increament might go beyond the end + assert(mPos<= mBitSize); + } + void increment(Index n) { + for (Index i=0; inext(); ++i) {} + } + bool next() { + this->increment(); + return this->test(); + } + bool operator*() const {return mParent->isOn(mPos);} + DenseIterator& operator++() { + this->increment(); + return *this; + } + }; // class DenseIterator + + OnIterator beginOn() const { return OnIterator(this->findFirstOn(),this); } + OnIterator endOn() const { return OnIterator(mBitSize,this); } + OffIterator beginOff() const { return OffIterator(this->findFirstOff(),this); } + OffIterator endOff() const { return OffIterator(mBitSize,this); } + DenseIterator beginDense() const { return DenseIterator(0,this); } + DenseIterator endDense() const { return DenseIterator(mBitSize,this); } + + bool operator == (const RootNodeMask &B) const { + if (mBitSize != B.mBitSize) return false; + for (Index32 i=0; i(mIntSize*sizeof(Index32) + sizeof(*this)); + } + + Index32 countOn() const { + assert(mBits); + Index32 n=0; + for (Index32 i=0; i< mIntSize; ++i) n += CountOn(mBits[i]); + return n; + } + + Index32 countOff() const { return mBitSize-this->countOn(); } + + void setOn(Index32 i) { + assert(mBits); + assert( (i>>5) < mIntSize); + mBits[i>>5] |= 1<<(i&31); + } + + void setOff(Index32 i) { + assert(mBits); + assert( (i>>5) < mIntSize); + mBits[i>>5] &= ~(1<<(i&31)); + } + + void set(Index32 i, bool On) { On ? this->setOn(i) : this->setOff(i); } + + void setOn() { + assert(mBits); + for (Index32 i=0; i>5) < mIntSize); + mBits[i>>5] ^= 1<<(i&31); + } + void toggle() { + assert(mBits); + for (Index32 i=0; isetOn(0); } + void setLastOn() { this->setOn(mBitSize-1); } + void setFirstOff() { this->setOff(0); } + void setLastOff() { this->setOff(mBitSize-1); } + bool isOn(Index32 i) const { + assert(mBits); + assert( (i>>5) < mIntSize); + return ( mBits[i >> 5] & (1<<(i&31)) ); + } + bool isOff(Index32 i) const { + assert(mBits); + assert( (i>>5) < mIntSize); + return ( ~mBits[i >> 5] & (1<<(i&31)) ); + } + + bool isOn() const { + if (!mBits) return false;//undefined is off + for (Index32 i=0; iisOn(i); + } + os << "|" << std::endl; + } + + void printAll(std::ostream& os=std::cout, Index32 max_out=80u) const { + this->printInfo(os); + this->printBits(os,max_out); + } + + Index32 findNextOn(Index32 start) const { + assert(mBits); + Index32 n = start >> 5, m = start & 31;//initiate + if (n>=mIntSize) return mBitSize; // check for out of bounds + Index32 b = mBits[n]; + if (b & (1<> 5, m = start & 31;//initiate + if (n>=mIntSize) return mBitSize; // check for out of bounds + Index32 b = ~mBits[n]; + if (b & (1<(sizeof(Index32*)+(2+mIntSize)*sizeof(Index32));//in bytes + } +}; // class RootNodeMask + +} // namespace util +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_UTIL_NODEMASKS_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/util/NullInterrupter.h b/nuparu/include/openvdb/include/openvdb/util/NullInterrupter.h new file mode 100644 index 00000000..8022a723 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/util/NullInterrupter.h @@ -0,0 +1,90 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file NullInterrupter.h + +#ifndef OPENVDB_UTIL_NULL_INTERRUPTER_HAS_BEEN_INCLUDED +#define OPENVDB_UTIL_NULL_INTERRUPTER_HAS_BEEN_INCLUDED + +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace util { + +/// @brief Dummy NOOP interrupter class defining interface +/// +/// This shows the required interface for the @c InterrupterType template argument +/// using by several threaded applications (e.g. tools/PointAdvect.h). The host +/// application calls start() at the beginning of an interruptible operation, end() +/// at the end of the operation, and wasInterrupted() periodically during the operation. +/// If any call to wasInterrupted() returns @c true, the operation will be aborted. +/// @note This Dummy interrupter will NEVER interrupt since wasInterrupted() always +/// returns false! +struct NullInterrupter +{ + /// Default constructor + NullInterrupter () {} + /// Signal the start of an interruptible operation. + /// @param name an optional descriptive name for the operation + void start(const char* name = NULL) { (void)name; } + /// Signal the end of an interruptible operation. + void end() {} + /// Check if an interruptible operation should be aborted. + /// @param percent an optional (when >= 0) percentage indicating + /// the fraction of the operation that has been completed + /// @note this method is assumed to be thread-safe. The current + /// implementation is clearly a NOOP and should compile out during + /// optimization! + inline bool wasInterrupted(int percent = -1) { (void)percent; return false; } +}; + +/// This method allows NullInterrupter::wasInterrupted to be compiled +/// out when client code only has a pointer (vs reference) to the interrupter. +/// +/// @note This is a free-standing function since C++ doesn't allow for +/// partial template specialization (in client code of the interrupter). +template +inline bool wasInterrupted(T* i, int percent = -1) { return i && i->wasInterrupted(percent); } + +/// Specialization for NullInterrupter +template<> +inline bool wasInterrupted(util::NullInterrupter*, int) { return false; } + +} // namespace util +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_UTIL_NULL_INTERRUPTER_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/util/PagedArray.h b/nuparu/include/openvdb/include/openvdb/util/PagedArray.h new file mode 100644 index 00000000..0fbef832 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/util/PagedArray.h @@ -0,0 +1,735 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +/// +/// @file PagedArray.h +/// +/// @author Ken Museth +/// +/// @brief Concurrent page-based linear data structure with O(1) +/// random access and std-compliant iterators. It is +/// primarily intended for applications that involve +/// multi-threading of dynamically growing linear arrays with +/// fast random access. + +#ifndef OPENVDB_UTIL_PAGED_ARRAY_HAS_BEEN_INCLUDED +#define OPENVDB_UTIL_PAGED_ARRAY_HAS_BEEN_INCLUDED + + +#include +#include +#include +#include // std::swap +#include +#include +#include +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace util { + +//////////////////////////////////////// + + +/// @brief Concurrent page-based linear data structure with O(1) +/// random access and std-compliant iterators. It is +/// primarily intended for applications that involve +/// multi-threading of dynamically growing linear arrays with +/// fast random access. +/// +/// @note Multiple threads can grow the page-table and push_back +/// new elements concurrently. A ValueBuffer provides accelerated +/// and threadsafe push_back at the cost of potentially re-ordering +/// elements (when multiple instances are used). +/// +/// @details This data structure employes contiguous pages of elements +/// (like a std::deque) which avoids moving data when the +/// capacity is out-grown and new pages are allocated. The +/// size of the pages can be controlled with the Log2PageSize +/// template parameter (defaults to 1024 elements of type ValueT). +/// +/// There are three fundamentally different ways to insert elements to +/// this container - each with different advanteges and disadvanteges. +/// +/// The simplest way to insert elements is to use PagedArray::push_back e.g. +/// @code +/// PagedArray array; +/// for (int i=0; i<100000; ++i) array.push_back(i); +/// @endcode +/// or with tbb task-based multi-threading +/// @code +/// struct Functor1 { +/// Functor1(int n, PagedArray& _array) : array(&_array) { +/// tbb::parallel_for(tbb::blocked_range(0, n, PagedArray::pageSize()), *this); +/// } +/// void operator()(const tbb::blocked_range& r) const { +/// for (int i=r.begin(), n=r.end(); i!=n; ++i) array->push_back(i); +/// } +/// PagedArray* array; +/// }; +/// PagedArray array; +/// Functor1 tmp(10000, array); +/// @endcode +/// PagedArray::push_back has the advantage that it's thread-safe and +/// preserves the ordering of the inserted elements. In fact it returns +/// the linear offset to the added element which can then be used for +/// fast O(1) random access. The disadvantage is it's the slowest of +/// the three different ways of inserting elements. +/// +/// The fastest way (by far) to insert elements is to use one (or +/// more) instances of a PagedArray::ValueBuffer, e.g. +/// @code +/// PagedArray array; +/// PagedArray::ValueBuffer buffer(array); +/// for (int i=0; i<100000; ++i) buffer.push_back(i); +/// buffer.flush(); +/// @endcode +/// or +/// @code +/// PagedArray array; +/// {//local scope of a single thread +/// PagedArray::ValueBuffer buffer(array); +/// for (int i=0; i<100000; ++i) buffer.push_back(i); +/// } +/// @endcode +/// or with tbb task-based multi-threading +/// @code +/// struct Functor2 { +/// Functor2(int n, PagedArray& array) : buffer(array) { +/// tbb::parallel_for(tbb::blocked_range(0, n, PagedArray::pageSize()), *this); +/// } +/// void operator()(const tbb::blocked_range& r) const { +/// for (int i=r.begin(), n=r.end(); i!=n; ++i) buffer.push_back(i); +/// } +/// mutable typename PagedArray::ValueBuffer buffer; +/// }; +/// PagedArray array; +/// Functor2 tmp(10000, array); +/// @endcode +/// or with tbb Thread Local Storage for even better performance (due +/// to fewer concurrent instantiations of partially full ValueBuffers) +/// @code +/// struct Functor3 { +/// typedef tbb::enumerable_thread_specific::ValueBuffer> PoolType; +/// Functor3(size_t n, PoolType& _pool) : pool(&_pool) { +/// tbb::parallel_for(tbb::blocked_range(0, n, PagedArray::pageSize()), *this); +/// } +/// void operator()(const tbb::blocked_range& r) const { +/// PagedArray::ValueBuffer& buffer = pool->local(); +/// for (int i=r.begin(), n=r.end(); i!=n; ++i) buffer.push_back(i); +/// } +/// PoolType* pool; +/// }; +/// PagedArray array; +/// PagedArray::ValueBuffer exemplar(array);//dummy used for initialization +/// Functor3::PoolType pool(exemplar);//thread local storage pool of ValueBuffers +/// Functor3 tmp(10000, pool); +/// for (Functor3::PoolType::iterator i=pool.begin(); i!=pool.end(); ++i) i->flush(); +/// @endcode +/// This technique generally outperforms PagedArray::push_back, +/// std::vector::push_back, std::deque::push_back and even +/// tbb::concurrent_vector::push_back. Additionally it +/// is thread-safe as long as each thread has it's own instance of a +/// PagedArray::ValueBuffer. The only disadvantage is the ordering of +/// the elements is undefined if multiple instance of a +/// PagedArray::ValueBuffer are employed. This is typically the case +/// in the context of multi-threading, where the +/// ordering of inserts are undefined anyway. Note that a local scope +/// can be used to guarentee that the ValueBuffer has inerted all its +/// elements by the time the scope ends. Alternatively the ValueBuffer +/// can be explicitly flushed by calling ValueBuffer::flush. +/// +/// The third way to insert elements is to resize the container and use +/// random access, e.g. +/// @code +/// PagedArray array; +/// array.resize(100000); +/// for (int i=0; i<100000; ++i) array[i] = i; +/// @endcode +/// or in terms of the random access iterator +/// @code +/// PagedArray array; +/// array.resize(100000); +/// for (PagedArray::Iterator i=array.begin(); i!=array.end(); ++i) *i = i.pos(); +/// @endcode +/// While this approach is both fast and thread-safe it suffers from the +/// major disadvantage that the problem size, i.e. number of elements, needs to +/// be known in advance. If that's the case you might as well consider +/// using std::vector or a raw c-style array! In other words the +/// PagedArray is most useful in the context of applications that +/// involve multi-threading of dynamically growing linear arrays that +/// require fast random access. +template +class PagedArray { + + private: + class Page; + typedef std::deque PageTableT; + + public: + typedef ValueT ValueType; + + /// @brief Default constructor + PagedArray() : mPageTable(), mSize(), mCapacity(0), mGrowthMutex() { mSize = 0; } + + /// @brief Destructor removed all allocated pages + ~PagedArray() { this->clear(); } + + /// @brief Caches values into a local memory Page to improve + /// performance of push_back into a PagedArray. + /// + /// @note The ordering of inserted elements is undefined when + /// multiple ValueBuffers are used! + /// + /// @warning By design this ValueBuffer is not threadsafe so + /// make sure to create an instance per thread! + class ValueBuffer; + + /// Const std-compliant iterator + class ConstIterator; + + /// Non-const std-compliant iterator + class Iterator; + + /// @brief Thread safe insertion, adds a new element at + /// the end and increases the container size by one. + /// + /// @note Constant time complexity. May allocate a new page. + size_t push_back(const ValueType& value) + { + const size_t index = mSize.fetch_and_increment(); + if (index >= mCapacity) this->grow(index); + (*mPageTable[index >> Log2PageSize])[index] = value; + return index; + } + + /// @brief Slightly faster then the thread-safe push_back above. + /// + /// @note For best performance consider using the ValueBuffer! + /// + /// @warning Not thread-safe! + size_t push_back_unsafe(const ValueType& value) + { + const size_t index = mSize.fetch_and_increment(); + if (index >= mCapacity) { + mPageTable.push_back( new Page() ); + mCapacity += Page::Size; + } + (*mPageTable[index >> Log2PageSize])[index] = value; + return index; + } + + /// @brief Returns the last element, decrements the size by one. + /// + /// @details Consider subsequnetly calling shrink_to_fit to + /// reduce the page table to match the new size. + /// + /// @note Calling this method on an empty containter is + /// undefined (as is also the case for std containers). + /// + /// @warning If values were added to the container by means of + /// multiple ValueBuffers the last value might not be what you + /// expect since the ordering is generally not perserved. Only + /// PagedArray::push_back preserves the ordering (or a single + /// instance of a ValueBuffer). + ValueType pop_back() + { + assert(mSize>0); + --mSize; + return (*mPageTable[mSize >> Log2PageSize])[mSize]; + } + + /// @brief Reduce the page table to fix the current size. + /// + /// @warning Not thread-safe! + void shrink_to_fit(); + + /// @brief Return a reference to the value at the specified offset + /// + /// @note This random access has constant time complexity. + /// + /// @warning It is assumed that the i'th element is already allocated! + ValueType& operator[](size_t i) + { + assert(i>Log2PageSize])[i]; + } + + /// @brief Return a const-reference to the value at the specified offset + /// + /// @note This random access has constant time complexity. + /// + /// @warning It is assumed that the i'th element is already allocated! + const ValueType& operator[](size_t i) const + { + assert(i>Log2PageSize])[i]; + } + + /// @brief Set all elements to the specified value + void fill(const ValueType& v) + { + tbb::spin_mutex::scoped_lock lock(mGrowthMutex); + Fill tmp(this, v); + } + + /// @brief Resize this array to the specified size. + /// + /// @note This will grow or shrink the page table. + /// + /// @warning Not thread-safe! + void resize(size_t size) + { + mSize = size; + if (size > mCapacity) { + this->grow(size-1); + } else { + this->shrink_to_fit(); + } + } + + /// @brief Resize this array to the specified size and + /// set all elements to the specified value. + /// + /// @warning Not thread-safe! + void resize(size_t size, const ValueType& v) + { + this->resize(size); + this->fill(v); + } + + /// @brief Return the number of elements in this array. + size_t size() const { return mSize; } + + /// @brief Return the maximum number of elements that this array + /// can contain without allocating more memory pages. + size_t capacity() const { return mCapacity; } + + /// @brief Return the number of additional elements that can be + /// added to this array without allocating more memory pages. + size_t freeCount() const { return mCapacity - mSize; } + + /// @brief Return the number of allocated memory pages. + size_t pageCount() const { return mPageTable.size(); } + + /// @brief Return the number of elements per memory page. + static size_t pageSize() { return Page::Size; } + + /// @brief Return log2 of the number of elements per memory page. + static size_t log2PageSize() { return Log2PageSize; } + + /// @brief Return the memory footprint of this array in bytes. + size_t memUsage() const + { + return sizeof(*this) + mPageTable.size() * Page::memUsage(); + } + + /// @brief Return true if the container contains no elements. + bool isEmpty() const { return mSize == 0; } + + /// @brief Return true if the page table is partially full, i.e. the + /// last non-empty page contains less than pageSize() elements. + /// + /// @details When the page table is partially full calling merge() + /// or using a ValueBuffer will rearrange the ordering of + /// existing elements. + bool isPartiallyFull() const { return (mSize & Page::Mask) > 0; } + + /// @brief Removes all elements from the array and delete all pages. + /// + /// @warning Not thread-safe! + void clear() + { + tbb::spin_mutex::scoped_lock lock(mGrowthMutex); + for (size_t i=0, n=mPageTable.size(); ibegin(), this->end(), std::less() ); } + + /// @brief Parallel sort of all the elements in descending order. + void invSort() { tbb::parallel_sort(this->begin(), this->end(), std::greater()); } + + /// @brief Parallel sort of all the elements based on a custom + /// functor with the api: + /// @code bool operator()(const ValueT& a, const ValueT& b) @endcode + /// which returns true if a comes before b. + template + void sort() { tbb::parallel_sort(this->begin(), this->end(), Functor() ); } + + /// @brief Transfer all the elements (and pages) from the other array to this array. + /// + /// @note The other PagedArray is empty on return. + /// + /// @warning The ordering of elements is undefined if this page table is partially full! + void merge(PagedArray& other); + + /// @brief Print information for debugging + void print(std::ostream& os = std::cout) const + { + os << "PagedArray:\n" + << "\tSize: " << this->size() << " elements\n" + << "\tPage table: " << this->pageCount() << " pages\n" + << "\tPage size: " << this->pageSize() << " elements\n" + << "\tCapacity: " << this->capacity() << " elements\n" + << "\tFootrpint: " << this->memUsage() << " bytes\n"; + } + +private: + // Disallow copy construction and assignment + PagedArray(const PagedArray&);//not implemented + void operator=(const PagedArray&);//not implemented + + friend class ValueBuffer; + + // Private class for concurrent fill + struct Fill; + + void grow(size_t index) + { + tbb::spin_mutex::scoped_lock lock(mGrowthMutex); + while(index >= mCapacity) { + mPageTable.push_back( new Page() ); + mCapacity += Page::Size; + } + } + + void add_full(Page*& page, size_t size); + + void add_partially_full(Page*& page, size_t size); + + void add(Page*& page, size_t size) { + tbb::spin_mutex::scoped_lock lock(mGrowthMutex); + if (size == Page::Size) {//page is full + this->add_full(page, size); + } else if (size>0) {//page is only partially full + this->add_partially_full(page, size); + } + } + PageTableT mPageTable;//holds points to allocated pages + tbb::atomic mSize;// current number of elements in array + size_t mCapacity;//capacity of array given the current page count + tbb::spin_mutex mGrowthMutex;//Mutex-lock required to grow pages +}; // Public class PagedArray + +//////////////////////////////////////////////////////////////////////////////// + +template +void PagedArray::shrink_to_fit() +{ + if (mPageTable.size() > (mSize >> Log2PageSize) + 1) { + tbb::spin_mutex::scoped_lock lock(mGrowthMutex); + const size_t pageCount = (mSize >> Log2PageSize) + 1; + if (mPageTable.size() > pageCount) { + delete mPageTable.back(); + mPageTable.pop_back(); + mCapacity -= Page::Size; + } + } +} + +template +void PagedArray::merge(PagedArray& other) +{ + if (!other.isEmpty()) { + tbb::spin_mutex::scoped_lock lock(mGrowthMutex); + // extract last partially full page if it exists + Page* page = NULL; + const size_t size = mSize & Page::Mask; //number of elements in the last page + if ( size > 0 ) { + page = mPageTable.back(); + mPageTable.pop_back(); + mSize -= size; + } + // transfer all pages from the other page table + mPageTable.insert(mPageTable.end(), other.mPageTable.begin(), other.mPageTable.end()); + mSize += other.mSize; + mCapacity = Page::Size*mPageTable.size(); + other.mSize = 0; + other.mCapacity = 0; + PageTableT().swap(other.mPageTable); + // add back last partially full page + if (page) this->add_partially_full(page, size); + } +} + +template +void PagedArray::add_full(Page*& page, size_t size) +{ + assert(size == Page::Size);//page must be full + if (mSize & Page::Mask) {//page-table is partially full + Page*& tmp = mPageTable.back(); + std::swap(tmp, page);//swap last table entry with page + } + mPageTable.push_back( page ); + mCapacity += Page::Size; + mSize += size; + page = NULL; +} + +template +void PagedArray::add_partially_full(Page*& page, size_t size) +{ + assert(size > 0 && size < Page::Size);//page must be partially full + if (size_t m = mSize & Page::Mask) {//page table is also partially full + ValueT *s = page->data(), *t = mPageTable.back()->data() + m; + for (size_t i=std::min(mSize+size, mCapacity)-mSize; i; --i) *t++ = *s++; + if (mSize+size > mCapacity) {//grow page table + mPageTable.push_back( new Page() ); + t = mPageTable.back()->data(); + for (size_t i=mSize+size-mCapacity; i; --i) *t++ = *s++; + mCapacity += Page::Size; + } + } else {//page table is full so simply append page + mPageTable.push_back( page ); + mCapacity += Page::Size; + page = NULL; + } + mSize += size; +} + +//////////////////////////////////////////////////////////////////////////////// + +// Public member-class of PagedArray +template +class PagedArray:: +ValueBuffer +{ +public: + typedef PagedArray PagedArrayType; + /// @brief Constructor from a PageArray + ValueBuffer(PagedArray& parent) : mParent(&parent), mPage(new Page()), mSize(0) {} + /// @warning This copy-constructor is shallow in the sense that no + /// elements are copied, i.e. size = 0. + ValueBuffer(const ValueBuffer& other) : mParent(other.mParent), mPage(new Page()), mSize(0) {} + /// @brief Destructor that transfers an buffered values to the parent PagedArray. + ~ValueBuffer() { this->flush(); delete mPage; } + /// @brief Add a value to the buffer and increment the size. + /// + /// @details If the internal memory page is full it will + /// automaically flush the page to the parent PagedArray. + void push_back(const ValueT& v) { + (*mPage)[mSize++] = v; + if (mSize == Page::Size) this->flush(); + } + /// @brief Manually transfer the values in this buffer to the parent PagedArray. + /// + /// @note This method is also called by the destructor and + /// puach_back so it should only be called when manually want to + /// sync up the buffer with the array, e.g. during debugging. + void flush() { + mParent->add(mPage, mSize); + if (mPage == NULL) mPage = new Page(); + mSize = 0; + } + /// @brief Return a reference to the parent PagedArray + PagedArrayType& parent() const { return *mParent; } + /// @brief Return the current number of elements cached in this buffer. + size_t size() const { return mSize; } +private: + ValueBuffer& operator=(const ValueBuffer& other);//not implemented + PagedArray* mParent; + Page* mPage; + size_t mSize; +};// Public class PagedArray::ValueBuffer + +//////////////////////////////////////////////////////////////////////////////// + +// Const std-compliant iterator +// Public member-class of PagedArray +template +class PagedArray:: +ConstIterator : public std::iterator +{ +public: + typedef std::iterator BaseT; + typedef typename BaseT::difference_type difference_type; + // constructors and assignment + ConstIterator() : mPos(0), mParent(NULL) {} + ConstIterator(const PagedArray& parent, size_t pos=0) : mPos(pos), mParent(&parent) {} + ConstIterator(const ConstIterator& other) : mPos(other.mPos), mParent(other.mParent) {} + ConstIterator& operator=(const ConstIterator& other) { + mPos=other.mPos; + mParent=other.mParent; + return *this; + } + // prefix + ConstIterator& operator++() { ++mPos; return *this; } + ConstIterator& operator--() { --mPos; return *this; } + // postfix + ConstIterator operator++(int) { ConstIterator tmp(*this); ++mPos; return tmp; } + ConstIterator operator--(int) { ConstIterator tmp(*this); --mPos; return tmp; } + // value access + const ValueT& operator*() const { return (*mParent)[mPos]; } + const ValueT* operator->() const { return &(this->operator*()); } + const ValueT& operator[](const difference_type& pos) const { return (*mParent)[mPos+pos]; } + // offset + ConstIterator& operator+=(const difference_type& pos) { mPos += pos; return *this; } + ConstIterator& operator-=(const difference_type& pos) { mPos -= pos; return *this; } + ConstIterator operator+(const difference_type &pos) const { return Iterator(*mParent,mPos+pos); } + ConstIterator operator-(const difference_type &pos) const { return Iterator(*mParent,mPos-pos); } + difference_type operator-(const ConstIterator& other) const { return mPos - other.pos(); } + // comparisons + bool operator==(const ConstIterator& other) const { return mPos == other.mPos; } + bool operator!=(const ConstIterator& other) const { return mPos != other.mPos; } + bool operator>=(const ConstIterator& other) const { return mPos >= other.mPos; } + bool operator<=(const ConstIterator& other) const { return mPos <= other.mPos; } + bool operator< (const ConstIterator& other) const { return mPos < other.mPos; } + bool operator> (const ConstIterator& other) const { return mPos > other.mPos; } + // non-std methods + bool isValid() const { return mParent != NULL && mPos < mParent->size(); } + size_t pos() const { return mPos; } +private: + size_t mPos; + const PagedArray* mParent; +};// Public class PagedArray::ConstIterator + +//////////////////////////////////////////////////////////////////////////////// + +// Public member-class of PagedArray +template +class PagedArray:: +Iterator : public std::iterator +{ +public: + typedef std::iterator BaseT; + typedef typename BaseT::difference_type difference_type; + // constructors and assignment + Iterator() : mPos(0), mParent(NULL) {} + Iterator(PagedArray& parent, size_t pos=0) : mPos(pos), mParent(&parent) {} + Iterator(const Iterator& other) : mPos(other.mPos), mParent(other.mParent) {} + Iterator& operator=(const Iterator& other) { + mPos=other.mPos; + mParent=other.mParent; + return *this; + } + // prefix + Iterator& operator++() { ++mPos; return *this; } + Iterator& operator--() { --mPos; return *this; } + // postfix + Iterator operator++(int) { Iterator tmp(*this); ++mPos; return tmp; } + Iterator operator--(int) { Iterator tmp(*this); --mPos; return tmp; } + // value access + ValueT& operator*() const { return (*mParent)[mPos]; } + ValueT* operator->() const { return &(this->operator*()); } + ValueT& operator[](const difference_type& pos) const { return (*mParent)[mPos+pos]; } + // offset + Iterator& operator+=(const difference_type& pos) { mPos += pos; return *this; } + Iterator& operator-=(const difference_type& pos) { mPos -= pos; return *this; } + Iterator operator+(const difference_type &pos) const { return Iterator(*mParent, mPos+pos); } + Iterator operator-(const difference_type &pos) const { return Iterator(*mParent, mPos-pos); } + difference_type operator-(const Iterator& other) const { return mPos - other.pos(); } + // comparisons + bool operator==(const Iterator& other) const { return mPos == other.mPos; } + bool operator!=(const Iterator& other) const { return mPos != other.mPos; } + bool operator>=(const Iterator& other) const { return mPos >= other.mPos; } + bool operator<=(const Iterator& other) const { return mPos <= other.mPos; } + bool operator< (const Iterator& other) const { return mPos < other.mPos; } + bool operator> (const Iterator& other) const { return mPos > other.mPos; } + // non-std methods + bool isValid() const { return mParent != NULL && mPos < mParent->size(); } + size_t pos() const { return mPos; } + private: + size_t mPos; + PagedArray* mParent; +};// Public class PagedArray::Iterator + +//////////////////////////////////////////////////////////////////////////////// + +// Private member-class of PagedArray implementing a memory page +template +class PagedArray:: +Page +{ +public: + static const size_t Size = 1UL << Log2PageSize; + static const size_t Mask = Size - 1UL; + static size_t memUsage() { return sizeof(ValueT)*Size; } + Page() : mData(new ValueT[Size]) {} + ~Page() { delete [] mData; } + ValueT& operator[](const size_t i) { return mData[i & Mask]; } + const ValueT& operator[](const size_t i) const { return mData[i & Mask]; } + void fill(const ValueT& v) { ValueT* p = mData; for (size_t i=Size; i; --i) *p++ = v; } + ValueT* data() { return mData; } +protected: + Page(const Page& other);//copy construction is not implemented + Page& operator=(const Page& rhs);//copy assignment is not implemented + ValueT* mData; +};// Private class PagedArray::Page + +//////////////////////////////////////////////////////////////////////////////// + +// Private member-class of PagedArray implementing concurrent fill of a Page +template +struct PagedArray:: +Fill { + Fill(PagedArray* _d, const ValueT& _v) : d(_d), v(_v) { + tbb::parallel_for(tbb::blocked_range(0, d->pageCount()), *this); + } + void operator()(const tbb::blocked_range& r) const { + for (size_t i=r.begin(); i!=r.end(); ++i) d->mPageTable[i]->fill(v); + } + PagedArray* d; + const ValueT& v; +};// Private class PagedArray::Fill + +} // namespace util +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_UTIL_PAGED_ARRAY_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/util/Util.h b/nuparu/include/openvdb/include/openvdb/util/Util.h new file mode 100644 index 00000000..2751fcbc --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/util/Util.h @@ -0,0 +1,166 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_UTIL_UTIL_HAS_BEEN_INCLUDED +#define OPENVDB_UTIL_UTIL_HAS_BEEN_INCLUDED + +#include +#include +#include +#include // for tree::pruneInactive + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace util { + +OPENVDB_API extern const Index32 INVALID_IDX; + +/// @brief coordinate offset table for neighboring voxels +OPENVDB_API extern const Coord COORD_OFFSETS[26]; + + +//////////////////////////////////////// + + +/// Return @a voxelCoord rounded to the closest integer coordinates. +inline Coord +nearestCoord(const Vec3d& voxelCoord) +{ + Coord ijk; + ijk[0] = int(std::floor(voxelCoord[0])); + ijk[1] = int(std::floor(voxelCoord[1])); + ijk[2] = int(std::floor(voxelCoord[2])); + return ijk; +} + + +//////////////////////////////////////// + + +/// @brief Functor for use with tools::foreach() to compute the boolean intersection +/// between the value masks of corresponding leaf nodes in two trees +template +class LeafTopologyIntOp +{ +public: + LeafTopologyIntOp(const TreeType2& tree): mOtherTree(&tree) {} + + inline void operator()(const typename TreeType1::LeafIter& lIter) const + { + const Coord xyz = lIter->origin(); + const typename TreeType2::LeafNodeType* leaf = mOtherTree->probeConstLeaf(xyz); + if (leaf) {//leaf node + lIter->topologyIntersection(*leaf, zeroVal()); + } else if (!mOtherTree->isValueOn(xyz)) {//inactive tile + lIter->setValuesOff(); + } + } + +private: + const TreeType2* mOtherTree; +}; + + +/// @brief Functor for use with tools::foreach() to compute the boolean difference +/// between the value masks of corresponding leaf nodes in two trees +template +class LeafTopologyDiffOp +{ +public: + LeafTopologyDiffOp(const TreeType2& tree): mOtherTree(&tree) {} + + inline void operator()(const typename TreeType1::LeafIter& lIter) const + { + const Coord xyz = lIter->origin(); + const typename TreeType2::LeafNodeType* leaf = mOtherTree->probeConstLeaf(xyz); + if (leaf) {//leaf node + lIter->topologyDifference(*leaf, zeroVal()); + } else if (mOtherTree->isValueOn(xyz)) {//active tile + lIter->setValuesOff(); + } + } + +private: + const TreeType2* mOtherTree; +}; + + +//////////////////////////////////////// + + +/// @brief Perform a boolean intersection between two leaf nodes' topology masks. +/// @return a pointer to a new, boolean-valued tree containing the overlapping voxels. +template +inline typename TreeType1::template ValueConverter::Type::Ptr +leafTopologyIntersection(const TreeType1& lhs, const TreeType2& rhs, bool threaded = true) +{ + typedef typename TreeType1::template ValueConverter::Type BoolTreeType; + + typename BoolTreeType::Ptr topologyTree(new BoolTreeType( + lhs, /*inactiveValue=*/false, /*activeValue=*/true, TopologyCopy())); + + tools::foreach(topologyTree->beginLeaf(), + LeafTopologyIntOp(rhs), threaded); + + tools::pruneInactive(*topologyTree, threaded); + return topologyTree; +} + + +/// @brief Perform a boolean difference between two leaf nodes' topology masks. +/// @return a pointer to a new, boolean-valued tree containing the non-overlapping +/// voxels from the lhs. +template +inline typename TreeType1::template ValueConverter::Type::Ptr +leafTopologyDifference(const TreeType1& lhs, const TreeType2& rhs, bool threaded = true) +{ + typedef typename TreeType1::template ValueConverter::Type BoolTreeType; + + typename BoolTreeType::Ptr topologyTree(new BoolTreeType( + lhs, /*inactiveValue=*/false, /*activeValue=*/true, TopologyCopy())); + + tools::foreach(topologyTree->beginLeaf(), + LeafTopologyDiffOp(rhs), threaded); + + tools::pruneInactive(*topologyTree, threaded); + return topologyTree; +} + +} // namespace util +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_UTIL_UTIL_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/util/logging.h b/nuparu/include/openvdb/include/openvdb/util/logging.h new file mode 100644 index 00000000..3d5cff79 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/util/logging.h @@ -0,0 +1,83 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_UTIL_LOGGING_HAS_BEEN_INCLUDED +#define OPENVDB_UTIL_LOGGING_HAS_BEEN_INCLUDED + +#ifndef OPENVDB_USE_LOG4CPLUS + +/// Log an info message of the form 'someVar << "some text" << ...'. +#define OPENVDB_LOG_INFO(message) +/// Log a warning message of the form 'someVar << "some text" << ...'. +#define OPENVDB_LOG_WARN(message) do { std::cerr << message << std::endl; } while (0); +/// Log an error message of the form 'someVar << "some text" << ...'. +#define OPENVDB_LOG_ERROR(message) do { std::cerr << message << std::endl; } while (0); +/// Log a fatal error message of the form 'someVar << "some text" << ...'. +#define OPENVDB_LOG_FATAL(message) do { std::cerr << message << std::endl; } while (0); +/// In debug builds only, log a debugging message of the form 'someVar << "text" << ...'. +#define OPENVDB_LOG_DEBUG(message) +/// @brief Log a debugging message in both debug and optimized builds. +/// @warning Don't use this in performance-critical code. +#define OPENVDB_LOG_DEBUG_RUNTIME(message) + +#else // ifdef OPENVDB_USE_LOG4CPLUS + +#include +#include +#include + +#define OPENVDB_LOG(level, message) \ + do { \ + log4cplus::Logger _log = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("main")); \ + if (_log.isEnabledFor(log4cplus::level##_LOG_LEVEL)) { \ + std::ostringstream _buf; \ + _buf << message; \ + _log.forcedLog(log4cplus::level##_LOG_LEVEL, _buf.str(), __FILE__, __LINE__); \ + } \ + } while (0); + +#define OPENVDB_LOG_INFO(message) OPENVDB_LOG(INFO, message) +#define OPENVDB_LOG_WARN(message) OPENVDB_LOG(WARN, message) +#define OPENVDB_LOG_ERROR(message) OPENVDB_LOG(ERROR, message) +#define OPENVDB_LOG_FATAL(message) OPENVDB_LOG(FATAL, message) +#ifdef DEBUG +#define OPENVDB_LOG_DEBUG(message) OPENVDB_LOG(DEBUG, message) +#else +#define OPENVDB_LOG_DEBUG(message) +#endif +#define OPENVDB_LOG_DEBUG_RUNTIME(message) OPENVDB_LOG(DEBUG, message) + +#endif // OPENVDB_USE_LOG4CPLUS + +#endif // OPENVDB_UTIL_LOGGING_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb/version.h b/nuparu/include/openvdb/include/openvdb/version.h new file mode 100644 index 00000000..adc3d8ee --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb/version.h @@ -0,0 +1,133 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_VERSION_HAS_BEEN_INCLUDED +#define OPENVDB_VERSION_HAS_BEEN_INCLUDED + +#include "Platform.h" + + +/// The version namespace name for this library version +/// +/// Fully-namespace-qualified symbols are named as follows: +/// openvdb::vX_Y_Z::Vec3i, openvdb::vX_Y_Z::io::File, openvdb::vX_Y_Z::tree::Tree, etc., +/// where X, Y and Z are OPENVDB_LIBRARY_MAJOR_VERSION, OPENVDB_LIBRARY_MINOR_VERSION +/// and OPENVDB_LIBRARY_PATCH_VERSION, respectively (defined below). +#define OPENVDB_VERSION_NAME v3_2_0 + +// Library major, minor and patch version numbers +#define OPENVDB_LIBRARY_MAJOR_VERSION_NUMBER 3 +#define OPENVDB_LIBRARY_MINOR_VERSION_NUMBER 2 +#define OPENVDB_LIBRARY_PATCH_VERSION_NUMBER 0 + +/// @brief Library version number string of the form ".." +/// @details This is a macro rather than a static constant because we typically +/// want the compile-time version number, not the runtime version number +/// (although the two are usually the same). +#define OPENVDB_LIBRARY_VERSION_STRING "3.2.0" + +/// Library version number as a packed integer ("%02x%02x%04x", major, minor, patch) +#define OPENVDB_LIBRARY_VERSION_NUMBER \ + ((OPENVDB_LIBRARY_MAJOR_VERSION_NUMBER << 24) | \ + ((OPENVDB_LIBRARY_MINOR_VERSION_NUMBER & 0xFF) << 16) | \ + (OPENVDB_LIBRARY_PATCH_VERSION_NUMBER & 0xFFFF)) + +/// If OPENVDB_REQUIRE_VERSION_NAME is undefined, symbols from the version +/// namespace are promoted to the top-level namespace (e.g., openvdb::v1_0_0::io::File +/// can be referred to simply as openvdb::io::File). Otherwise, symbols must be fully +/// namespace-qualified. +#ifdef OPENVDB_REQUIRE_VERSION_NAME +#define OPENVDB_USE_VERSION_NAMESPACE +#else +/// @note The empty namespace clause below ensures that +/// OPENVDB_VERSION_NAME is recognized as a namespace name. +#define OPENVDB_USE_VERSION_NAMESPACE \ + namespace OPENVDB_VERSION_NAME {} \ + using namespace OPENVDB_VERSION_NAME; +#endif + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { + +/// @brief The magic number is stored in the first four bytes of every VDB file. +/// @details This can be used to quickly test whether we have a valid file or not. +const int32_t OPENVDB_MAGIC = 0x56444220; + +// Library major, minor and patch version numbers +const uint32_t + OPENVDB_LIBRARY_MAJOR_VERSION = OPENVDB_LIBRARY_MAJOR_VERSION_NUMBER, + OPENVDB_LIBRARY_MINOR_VERSION = OPENVDB_LIBRARY_MINOR_VERSION_NUMBER, + OPENVDB_LIBRARY_PATCH_VERSION = OPENVDB_LIBRARY_PATCH_VERSION_NUMBER; +/// Library version number as a packed integer ("%02x%02x%04x", major, minor, patch) +const uint32_t OPENVDB_LIBRARY_VERSION = OPENVDB_LIBRARY_VERSION_NUMBER; + +/// @brief The current version number of the VDB file format +/// @details This can be used to enable various backwards compatability switches +/// or to reject files that cannot be read. +const uint32_t OPENVDB_FILE_VERSION = 223; + +/// Notable file format version numbers +enum { + OPENVDB_FILE_VERSION_ROOTNODE_MAP = 213, + OPENVDB_FILE_VERSION_INTERNALNODE_COMPRESSION = 214, + OPENVDB_FILE_VERSION_SIMPLIFIED_GRID_TYPENAME = 215, + OPENVDB_FILE_VERSION_GRID_INSTANCING = 216, + OPENVDB_FILE_VERSION_BOOL_LEAF_OPTIMIZATION = 217, + OPENVDB_FILE_VERSION_BOOST_UUID = 218, + OPENVDB_FILE_VERSION_NO_GRIDMAP = 219, + OPENVDB_FILE_VERSION_NEW_TRANSFORM = 219, + OPENVDB_FILE_VERSION_SELECTIVE_COMPRESSION = 220, + OPENVDB_FILE_VERSION_FLOAT_FRUSTUM_BBOX = 221, + OPENVDB_FILE_VERSION_NODE_MASK_COMPRESSION = 222, + OPENVDB_FILE_VERSION_BLOSC_COMPRESSION = 223, + OPENVDB_FILE_VERSION_POINT_INDEX_GRID = 223 +}; + + +/// Return a library version number string of the form "..". +inline const char* getLibraryVersionString() { return OPENVDB_LIBRARY_VERSION_STRING; } + + +struct VersionId { + uint32_t first, second; + VersionId(): first(0), second(0) {} + VersionId(uint32_t major, uint32_t minor): first(major), second(minor) {} +}; + +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_VERSION_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb_houdini/AttributeTransferUtil.h b/nuparu/include/openvdb/include/openvdb_houdini/AttributeTransferUtil.h new file mode 100644 index 00000000..eb46c089 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_houdini/AttributeTransferUtil.h @@ -0,0 +1,1495 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file AttributeTransferUtil.h +/// @author FX R&D Simulation team +/// @brief Utility methods used by the From Mesh and From Particle SOPs + +#ifndef OPENVDB_HOUDINI_ATTRIBUTE_TRANSFER_UTIL_HAS_BEEN_INCLUDED +#define OPENVDB_HOUDINI_ATTRIBUTE_TRANSFER_UTIL_HAS_BEEN_INCLUDED + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace openvdb_houdini { + +//////////////////////////////////////// + +/// Get OpenVDB specific value, by calling GA_AIFTuple::get() +/// with appropriate arguments. + +template inline ValueType +evalAttr(const GA_Attribute* atr, const GA_AIFTuple* aif, + GA_Offset off, int idx) +{ + fpreal64 value; + aif->get(atr, off, value, idx); + return ValueType(value); +} + +template <> inline float +evalAttr(const GA_Attribute* atr, const GA_AIFTuple* aif, + GA_Offset off, int idx) +{ + fpreal32 value; + aif->get(atr, off, value, idx); + return float(value); +} + +template <> inline openvdb::Int32 +evalAttr(const GA_Attribute* atr, const GA_AIFTuple* aif, + GA_Offset off, int idx) +{ + int32 value; + aif->get(atr, off, value, idx); + return openvdb::Int32(value); +} + +template <> inline openvdb::Int64 +evalAttr(const GA_Attribute* atr, const GA_AIFTuple* aif, + GA_Offset off, int idx) +{ + int64 value; + aif->get(atr, off, value, idx); + return openvdb::Int64(value); +} + +template <> inline openvdb::Vec3i +evalAttr(const GA_Attribute* atr, const GA_AIFTuple* aif, + GA_Offset off, int) +{ + openvdb::Vec3i vec; + + int32 comp; + aif->get(atr, off, comp, 0); + vec[0] = openvdb::Int32(comp); + + aif->get(atr, off, comp, 1); + vec[1] = openvdb::Int32(comp); + + aif->get(atr, off, comp, 2); + vec[2] = openvdb::Int32(comp); + + return vec; +} + +template <> inline openvdb::Vec3s +evalAttr(const GA_Attribute* atr, const GA_AIFTuple* aif, + GA_Offset off, int) +{ + openvdb::Vec3s vec; + + fpreal32 comp; + aif->get(atr, off, comp, 0); + vec[0] = float(comp); + + aif->get(atr, off, comp, 1); + vec[1] = float(comp); + + aif->get(atr, off, comp, 2); + vec[2] = float(comp); + + return vec; +} + +template <> inline openvdb::Vec3d +evalAttr(const GA_Attribute* atr, const GA_AIFTuple* aif, + GA_Offset off, int) +{ + openvdb::Vec3d vec; + + fpreal64 comp; + aif->get(atr, off, comp, 0); + vec[0] = double(comp); + + aif->get(atr, off, comp, 1); + vec[1] = double(comp); + + aif->get(atr, off, comp, 2); + vec[2] = double(comp); + + return vec; +} + + +//////////////////////////////////////// + +/// Combine differnet value types. + +template inline ValueType +combine(const ValueType& v0, const ValueType& v1, const ValueType& v2, + const openvdb::Vec3d& w) +{ + return ValueType(v0 * w[0] + v1 * w[1] + v2 * w[2]); +} + +template <> inline openvdb::Int32 +combine(const openvdb::Int32& v0, const openvdb::Int32& v1, + const openvdb::Int32& v2, const openvdb::Vec3d& w) +{ + if (w[2] > w[0] && w[2] > w[1]) return v2; + if (w[1] > w[0] && w[1] > w[2]) return v1; + return v0; +} + +template <> inline openvdb::Int64 +combine(const openvdb::Int64& v0, const openvdb::Int64& v1, + const openvdb::Int64& v2, const openvdb::Vec3d& w) +{ + if (w[2] > w[0] && w[2] > w[1]) return v2; + if (w[1] > w[0] && w[1] > w[2]) return v1; + return v0; +} + +template <> inline openvdb::Vec3i +combine(const openvdb::Vec3i& v0, const openvdb::Vec3i& v1, + const openvdb::Vec3i& v2, const openvdb::Vec3d& w) +{ + if (w[2] > w[0] && w[2] > w[1]) return v2; + if (w[1] > w[0] && w[1] > w[2]) return v1; + return v0; +} + +template <> inline openvdb::Vec3s +combine(const openvdb::Vec3s& v0, const openvdb::Vec3s& v1, + const openvdb::Vec3s& v2, const openvdb::Vec3d& w) +{ + openvdb::Vec3s vec; + + vec[0] = float(v0[0] * w[0] + v1[0] * w[1] + v2[0] * w[2]); + vec[1] = float(v0[1] * w[0] + v1[1] * w[1] + v2[1] * w[2]); + vec[2] = float(v0[2] * w[0] + v1[2] * w[1] + v2[2] * w[2]); + + return vec; +} + +template <> inline openvdb::Vec3d +combine(const openvdb::Vec3d& v0, const openvdb::Vec3d& v1, + const openvdb::Vec3d& v2, const openvdb::Vec3d& w) +{ + openvdb::Vec3d vec; + + vec[0] = v0[0] * w[0] + v1[0] * w[1] + v2[0] * w[2]; + vec[1] = v0[1] * w[0] + v1[1] * w[1] + v2[1] * w[2]; + vec[2] = v0[2] * w[0] + v1[2] * w[1] + v2[2] * w[2]; + + return vec; +} + + +//////////////////////////////////////// + +/// Gets OpenVDB specific value by evaluating GA_Default::get() +/// with appropriate arguments. + +template inline ValueType +evalAttrDefault(const GA_Defaults& defaults, int idx) +{ + fpreal64 value; + defaults.get(idx, value); + return ValueType(value); +} + +template <> inline float +evalAttrDefault(const GA_Defaults& defaults, int /*idx*/) +{ + fpreal32 value; + defaults.get(0, value); + return float(value); +} + +template <> inline openvdb::Int32 +evalAttrDefault(const GA_Defaults& defaults, int idx) +{ + int32 value; + defaults.get(idx, value); + return openvdb::Int32(value); +} + +template <> inline openvdb::Int64 +evalAttrDefault(const GA_Defaults& defaults, int idx) +{ + int64 value; + defaults.get(idx, value); + return openvdb::Int64(value); +} + +template <> inline openvdb::Vec3i +evalAttrDefault(const GA_Defaults& defaults, int) +{ + openvdb::Vec3i vec; + int32 value; + + defaults.get(0, value); + vec[0] = openvdb::Int32(value); + + defaults.get(1, value); + vec[1] = openvdb::Int32(value); + + defaults.get(2, value); + vec[2] = openvdb::Int32(value); + + return vec; +} + +template <> inline openvdb::Vec3s +evalAttrDefault(const GA_Defaults& defaults, int) +{ + openvdb::Vec3s vec; + fpreal32 value; + + defaults.get(0, value); + vec[0] = float(value); + + defaults.get(1, value); + vec[1] = float(value); + + defaults.get(2, value); + vec[2] = float(value); + + return vec; +} + +template <> inline openvdb::Vec3d +evalAttrDefault(const GA_Defaults& defaults, int) +{ + openvdb::Vec3d vec; + fpreal64 value; + + defaults.get(0, value); + vec[0] = double(value); + + defaults.get(1, value); + vec[1] = double(value); + + defaults.get(2, value); + vec[2] = double(value); + + return vec; +} + + +//////////////////////////////////////// + + +class AttributeDetailBase +{ +public: + typedef boost::shared_ptr Ptr; + + virtual ~AttributeDetailBase() {} + + virtual void set(const openvdb::Coord& ijk, const GA_Offset (&offsets)[3], + const openvdb::Vec3d& weights) = 0; + + virtual void set(const openvdb::Coord& ijk, GA_Offset offset) = 0; + + virtual openvdb::GridBase::Ptr& grid() = 0; + virtual std::string& name() = 0; + + virtual AttributeDetailBase::Ptr copy() = 0; + +protected: + AttributeDetailBase() {} +}; + + +typedef std::vector AttributeDetailList; + + +//////////////////////////////////////// + + +template +class AttributeDetail: public AttributeDetailBase +{ +public: + typedef typename VDBGridType::ValueType ValueType; + + AttributeDetail( + openvdb::GridBase::Ptr grid, + const GA_Attribute* attribute, + const GA_AIFTuple* tupleAIF, + const int tupleIndex, + const bool isVector = false); + + void set(const openvdb::Coord& ijk, const GA_Offset (&offsets)[3], + const openvdb::Vec3d& weights); + + void set(const openvdb::Coord& ijk, GA_Offset offset); + + openvdb::GridBase::Ptr& grid() { return mGrid; } + std::string& name() { return mName; } + + AttributeDetailBase::Ptr copy(); + +protected: + AttributeDetail(); + +private: + openvdb::GridBase::Ptr mGrid; + typename VDBGridType::Accessor mAccessor; + + const GA_Attribute* mAttribute; + const GA_AIFTuple* mTupleAIF; + const int mTupleIndex; + std::string mName; +}; + + +template +AttributeDetail::AttributeDetail(): + mAttribute(NULL), + mTupleAIF(NULL), + mTupleIndex(0) +{ +} + + +template +AttributeDetail::AttributeDetail( + openvdb::GridBase::Ptr grid, + const GA_Attribute* attribute, + const GA_AIFTuple* tupleAIF, + const int tupleIndex, + const bool isVector): + mGrid(grid), + mAccessor(openvdb::GridBase::grid(mGrid)->getAccessor()), + mAttribute(attribute), + mTupleAIF(tupleAIF), + mTupleIndex(tupleIndex) +{ + std::ostringstream name; + name << mAttribute->getName(); + + const int tupleSize = mTupleAIF->getTupleSize(mAttribute); + + if(!isVector && tupleSize != 1) { + name << "_" << mTupleIndex; + } + + mName = name.str(); +} + + +template +void +AttributeDetail::set(const openvdb::Coord& ijk, + const GA_Offset (&offsets)[3], const openvdb::Vec3d& weights) +{ + ValueType v0 = evalAttr( + mAttribute, mTupleAIF, offsets[0], mTupleIndex); + + ValueType v1 = evalAttr( + mAttribute, mTupleAIF, offsets[1], mTupleIndex); + + ValueType v2 = evalAttr( + mAttribute, mTupleAIF, offsets[2], mTupleIndex); + + mAccessor.setValue(ijk, combine(v0, v1, v2, weights)); +} + +template +void +AttributeDetail::set(const openvdb::Coord& ijk, GA_Offset offset) +{ + mAccessor.setValue(ijk, + evalAttr(mAttribute, mTupleAIF, offset, mTupleIndex)); +} + +template +AttributeDetailBase::Ptr +AttributeDetail::copy() +{ + return AttributeDetailBase::Ptr(new AttributeDetail(*this)); +} + + +//////////////////////////////////////// + + +// TBB object to transfer mesh attributes. +// Only quads and/or triangles are supported +// NOTE: This class has all code in the header and so it cannot have +// OPENVDB_HOUDINI_API. +class MeshAttrTransfer +{ +public: + typedef openvdb::tree::IteratorRange IterRange; + + inline + MeshAttrTransfer( + AttributeDetailList &pointAttributes, + AttributeDetailList &vertexAttributes, + AttributeDetailList &primitiveAttributes, + const openvdb::Int32Grid& closestPrimGrid, + const openvdb::math::Transform& transform, + const GU_Detail& meshGdp); + + inline + MeshAttrTransfer(const MeshAttrTransfer &other); + + inline + ~MeshAttrTransfer() {} + + /// Main calls + inline void runParallel(); + inline void runSerial(); + + inline void operator()(IterRange &range) const; + +private: + AttributeDetailList mPointAttributes, mVertexAttributes, mPrimitiveAttributes; + const openvdb::Int32Grid& mClosestPrimGrid; + + const openvdb::math::Transform& mTransform; + + const GA_Detail &mMeshGdp; +}; + + +MeshAttrTransfer::MeshAttrTransfer( + AttributeDetailList& pointAttributes, + AttributeDetailList& vertexAttributes, + AttributeDetailList& primitiveAttributes, + const openvdb::Int32Grid& closestPrimGrid, + const openvdb::math::Transform& transform, + const GU_Detail& meshGdp): + mPointAttributes(pointAttributes), + mVertexAttributes(vertexAttributes), + mPrimitiveAttributes(primitiveAttributes), + mClosestPrimGrid(closestPrimGrid), + mTransform(transform), + mMeshGdp(meshGdp) +{ +} + + +MeshAttrTransfer::MeshAttrTransfer(const MeshAttrTransfer &other): + mPointAttributes(other.mPointAttributes.size()), + mVertexAttributes(other.mVertexAttributes.size()), + mPrimitiveAttributes(other.mPrimitiveAttributes.size()), + mClosestPrimGrid(other.mClosestPrimGrid), + mTransform(other.mTransform), + mMeshGdp(other.mMeshGdp) +{ + // Deep-copy the AttributeDetail arrays, to construct unique tree + // accessors per thread. + + for (size_t i = 0, N = other.mPointAttributes.size(); i < N; ++i) { + mPointAttributes[i] = other.mPointAttributes[i]->copy(); + } + + for (size_t i = 0, N = other.mVertexAttributes.size(); i < N; ++i) { + mVertexAttributes[i] = other.mVertexAttributes[i]->copy(); + } + + for (size_t i = 0, N = other.mPrimitiveAttributes.size(); i < N; ++i) { + mPrimitiveAttributes[i] = other.mPrimitiveAttributes[i]->copy(); + } +} + + +void +MeshAttrTransfer::runParallel() +{ + IterRange range(mClosestPrimGrid.tree().beginLeaf()); + tbb::parallel_for(range, *this); +} + +void +MeshAttrTransfer::runSerial() +{ + IterRange range(mClosestPrimGrid.tree().beginLeaf()); + (*this)(range); +} + + +void +MeshAttrTransfer::operator()(IterRange &range) const +{ + openvdb::Int32Tree::LeafNodeType::ValueOnCIter iter; + + openvdb::Coord ijk; + unsigned int vtx; + GA_Size vtxn; + + const bool ptnAttrTransfer = mPointAttributes.size() > 0; + const bool vtxAttrTransfer = mVertexAttributes.size() > 0; + + GA_Primitive::const_iterator it; + GA_Offset vtxOffsetList[4], ptnOffsetList[4], vtxOffsets[3], ptnOffsets[3], prmOffset; + openvdb::Vec3d ptnList[4], xyz, cpt, cpt2, uvw, uvw2; + + for ( ; range; ++range) { + iter = range.iterator()->beginValueOn(); + for ( ; iter; ++iter) { + + ijk = iter.getCoord(); + + const GA_Index prmIndex = iter.getValue(); + prmOffset = mMeshGdp.primitiveOffset(prmIndex); + + // Transfer primitive attributes + for (size_t i = 0, N = mPrimitiveAttributes.size(); i < N; ++i) { + mPrimitiveAttributes[i]->set(ijk, prmOffset); + } + + if (!ptnAttrTransfer && !vtxAttrTransfer) continue; + + // Transfer vertex and point attributes + const GA_Primitive * primRef = mMeshGdp.getPrimitiveList().get(prmOffset); + + vtxn = primRef->getVertexCount(); + + // Get vertex and point offests + primRef->beginVertex(it); + + for (vtx = 0; !it.atEnd(); ++it, ++vtx) { + + ptnOffsetList[vtx] = it.getPointOffset(); + vtxOffsetList[vtx] = it.getVertexOffset(); + + UT_Vector3 p = mMeshGdp.getPos3(ptnOffsetList[vtx]); + ptnList[vtx][0] = double(p[0]); + ptnList[vtx][1] = double(p[1]); + ptnList[vtx][2] = double(p[2]); + } + + xyz = mTransform.indexToWorld(ijk); + + // Compute barycentric coordinates + + cpt = closestPointOnTriangleToPoint( + ptnList[0], ptnList[2], ptnList[1], xyz, uvw); + + vtxOffsets[0] = vtxOffsetList[0]; // cpt offsets + ptnOffsets[0] = ptnOffsetList[0]; + vtxOffsets[1] = vtxOffsetList[2]; + ptnOffsets[1] = ptnOffsetList[2]; + vtxOffsets[2] = vtxOffsetList[1]; + ptnOffsets[2] = ptnOffsetList[1]; + + if (4 == vtxn) { + cpt2 = closestPointOnTriangleToPoint( + ptnList[0], ptnList[3], ptnList[2], xyz, uvw2); + + if ((cpt2 - xyz).lengthSqr() < (cpt - xyz).lengthSqr()) { + uvw = uvw2; + vtxOffsets[1] = vtxOffsetList[3]; + ptnOffsets[1] = ptnOffsetList[3]; + vtxOffsets[2] = vtxOffsetList[2]; + ptnOffsets[2] = ptnOffsetList[2]; + } + } + + // Transfer vertex attributes + for (size_t i = 0, N = mVertexAttributes.size(); i < N; ++i) { + mVertexAttributes[i]->set(ijk, vtxOffsets, uvw); + } + + // Transfer point attributes + for (size_t i = 0, N = mPointAttributes.size(); i < N; ++i) { + mPointAttributes[i]->set(ijk, ptnOffsets, uvw); + } + + } // end sparse voxel iteration. + } // end leaf-node iteration +} + + +//////////////////////////////////////// + + +// TBB object to transfer mesh attributes. +// Only quads and/or triangles are supported +// NOTE: This class has all code in the header and so it cannot have +// OPENVDB_HOUDINI_API. +class PointAttrTransfer +{ +public: + typedef openvdb::tree::IteratorRange IterRange; + + inline + PointAttrTransfer( + AttributeDetailList &pointAttributes, + const openvdb::Int32Grid& closestPtnIdxGrid, + const GU_Detail& ptGeop); + + inline + PointAttrTransfer(const PointAttrTransfer &other); + + inline + ~PointAttrTransfer() {} + + /// Main calls + inline void runParallel(); + inline void runSerial(); + + inline void operator()(IterRange &range) const; + +private: + AttributeDetailList mPointAttributes; + const openvdb::Int32Grid& mClosestPtnIdxGrid; + const GA_Detail &mPtGeo; +}; + + +PointAttrTransfer::PointAttrTransfer( + AttributeDetailList& pointAttributes, + const openvdb::Int32Grid& closestPtnIdxGrid, + const GU_Detail& ptGeop): + mPointAttributes(pointAttributes), + mClosestPtnIdxGrid(closestPtnIdxGrid), + mPtGeo(ptGeop) +{ +} + + +PointAttrTransfer::PointAttrTransfer(const PointAttrTransfer &other): + mPointAttributes(other.mPointAttributes.size()), + mClosestPtnIdxGrid(other.mClosestPtnIdxGrid), + mPtGeo(other.mPtGeo) +{ + // Deep-copy the AttributeDetail arrays, to construct unique tree + // accessors per thread. + + for (size_t i = 0, N = other.mPointAttributes.size(); i < N; ++i) { + mPointAttributes[i] = other.mPointAttributes[i]->copy(); + } +} + + +void +PointAttrTransfer::runParallel() +{ + IterRange range(mClosestPtnIdxGrid.tree().beginLeaf()); + tbb::parallel_for(range, *this); +} + +void +PointAttrTransfer::runSerial() +{ + IterRange range(mClosestPtnIdxGrid.tree().beginLeaf()); + (*this)(range); +} + + +void +PointAttrTransfer::operator()(IterRange &range) const +{ + openvdb::Int32Tree::LeafNodeType::ValueOnCIter iter; + openvdb::Coord ijk; + + for ( ; range; ++range) { + iter = range.iterator()->beginValueOn(); + for ( ; iter; ++iter) { + + ijk = iter.getCoord(); + + const GA_Index pointIndex = iter.getValue(); + const GA_Offset pointOffset = mPtGeo.pointOffset(pointIndex); + + // Transfer point attributes + for (size_t i = 0, N = mPointAttributes.size(); i < N; ++i) { + mPointAttributes[i]->set(ijk, pointOffset); + } + } // end sparse voxel iteration. + } // end leaf-node iteration +} + + +//////////////////////////////////////// + +// Mesh to Mesh Attribute Transfer Utils + + +struct AttributeCopyBase +{ + typedef boost::shared_ptr Ptr; + + virtual ~AttributeCopyBase() {} + virtual void copy(GA_Offset /*source*/, GA_Offset /*target*/) = 0; + virtual void copy(GA_Offset&, GA_Offset&, GA_Offset&, GA_Offset /*target*/, + const openvdb::Vec3d& /*uvw*/) = 0; +protected: + AttributeCopyBase() {} +}; + + +template +struct AttributeCopy: public AttributeCopyBase +{ +public: + AttributeCopy(const GA_Attribute& sourceAttr, GA_Attribute& targetAttr) + : mSourceAttr(sourceAttr) + , mTargetAttr(targetAttr) + , mAIFTuple(*mSourceAttr.getAIFTuple()) + , mTupleSize(mAIFTuple.getTupleSize(&mSourceAttr)) + { + } + + void copy(GA_Offset source, GA_Offset target) + { + ValueType data; + for (int i = 0; i < mTupleSize; ++i) { + mAIFTuple.get(&mSourceAttr, source, data, i); + mAIFTuple.set(&mTargetAttr, target, data, i); + } + } + + void copy(GA_Offset& v0, GA_Offset& v1, GA_Offset& v2, GA_Offset target, + const openvdb::Vec3d& uvw) + { + doCopy(v0, v1, v2, target, uvw); + } + +private: + + template + typename boost::enable_if, void>::type + doCopy(GA_Offset& v0, GA_Offset& v1, GA_Offset& v2, GA_Offset target, const openvdb::Vec3d& uvw) + { + GA_Offset source = v0; + double min = uvw[0]; + + if (uvw[1] < min) { + min = uvw[1]; + source = v1; + } + if (uvw[2] < min) source = v2; + + + ValueType data; + for (int i = 0; i < mTupleSize; ++i) { + mAIFTuple.get(&mSourceAttr, source, data, i); + mAIFTuple.set(&mTargetAttr, target, data, i); + } + } + + template + typename boost::enable_if, void>::type + doCopy(GA_Offset& v0, GA_Offset& v1, GA_Offset& v2, GA_Offset target, const openvdb::Vec3d& uvw) + { + ValueType a, b, c; + for (int i = 0; i < mTupleSize; ++i) { + mAIFTuple.get(&mSourceAttr, v0, a, i); + mAIFTuple.get(&mSourceAttr, v1, b, i); + mAIFTuple.get(&mSourceAttr, v2, c, i); + mAIFTuple.set(&mTargetAttr, target, a*uvw[0] + b*uvw[1] + c*uvw[2], i); + } + } + + + const GA_Attribute& mSourceAttr; + GA_Attribute& mTargetAttr; + const GA_AIFTuple& mAIFTuple; + int mTupleSize; +}; + + +struct StrAttributeCopy: public AttributeCopyBase +{ +public: + StrAttributeCopy(const GA_Attribute& sourceAttr, GA_Attribute& targetAttr) + : mSourceAttr(sourceAttr) + , mTargetAttr(targetAttr) + , mAIF(*mSourceAttr.getAIFSharedStringTuple()) + , mTupleSize(mAIF.getTupleSize(&mSourceAttr)) + { + } + + void copy(GA_Offset source, GA_Offset target) + { + for (int i = 0; i < mTupleSize; ++i) { + mAIF.setString(&mTargetAttr, target, mAIF.getString(&mSourceAttr, source, i), i); + } + } + + void copy(GA_Offset& v0, GA_Offset& v1, GA_Offset& v2, GA_Offset target, + const openvdb::Vec3d& uvw) + { + GA_Offset source = v0; + double min = uvw[0]; + + if (uvw[1] < min) { + min = uvw[1]; + source = v1; + } + if (uvw[2] < min) source = v2; + + for (int i = 0; i < mTupleSize; ++i) { + mAIF.setString(&mTargetAttr, target, mAIF.getString(&mSourceAttr, source, i), i); + } + } + +protected: + const GA_Attribute& mSourceAttr; + GA_Attribute& mTargetAttr; + const GA_AIFSharedStringTuple& mAIF; + int mTupleSize; +}; + + +//////////////////////////////////////// + + +inline AttributeCopyBase::Ptr +createAttributeCopier(const GA_Attribute& sourceAttr, GA_Attribute& targetAttr) +{ + const GA_AIFTuple * aifTuple = sourceAttr.getAIFTuple(); + AttributeCopyBase::Ptr attr; + + if (aifTuple) { + const GA_Storage sourceStorage = aifTuple->getStorage(&sourceAttr); + const GA_Storage targetStorage = aifTuple->getStorage(&targetAttr); + + const int sourceTupleSize = aifTuple->getTupleSize(&sourceAttr); + const int targetTupleSize = aifTuple->getTupleSize(&targetAttr); + + if (sourceStorage == targetStorage && sourceTupleSize == targetTupleSize) { + switch (sourceStorage) + { + case GA_STORE_INT16: + case GA_STORE_INT32: + attr = AttributeCopyBase::Ptr( + new AttributeCopy(sourceAttr, targetAttr)); + break; + case GA_STORE_INT64: + attr = AttributeCopyBase::Ptr( + new AttributeCopy(sourceAttr, targetAttr)); + break; + case GA_STORE_REAL16: + case GA_STORE_REAL32: + attr = AttributeCopyBase::Ptr( + new AttributeCopy(sourceAttr, targetAttr)); + break; + case GA_STORE_REAL64: + attr = AttributeCopyBase::Ptr( + new AttributeCopy(sourceAttr, targetAttr)); + break; + default: + break; + } + } + } else { + const GA_AIFSharedStringTuple * aifString = sourceAttr.getAIFSharedStringTuple(); + if (aifString) { + attr = AttributeCopyBase::Ptr(new StrAttributeCopy(sourceAttr, targetAttr)); + } + } + + return attr; +} + + +//////////////////////////////////////// + + +inline GA_Offset +findClosestPrimitiveToPoint( + const GU_Detail& geo, const std::set& primitives, const openvdb::Vec3d& p, + GA_Offset& vert0, GA_Offset& vert1, GA_Offset& vert2, openvdb::Vec3d& uvw) +{ + std::set::const_iterator it = primitives.begin(); + + GA_Offset primOffset = GA_INVALID_OFFSET; + const GA_Primitive * primRef = NULL; + double minDist = std::numeric_limits::max(); + + openvdb::Vec3d a, b, c, d, tmpUVW; + UT_Vector3 tmpPoint; + + for (; it != primitives.end(); ++it) { + + const GA_Offset offset = geo.primitiveOffset(*it); + primRef = geo.getPrimitiveList().get(offset); + + const GA_Size vertexCount = primRef->getVertexCount(); + + + if (vertexCount == 3 || vertexCount == 4) { + + tmpPoint = geo.getPos3(primRef->getPointOffset(0)); + a[0] = tmpPoint.x(); + a[1] = tmpPoint.y(); + a[2] = tmpPoint.z(); + + tmpPoint = geo.getPos3(primRef->getPointOffset(1)); + b[0] = tmpPoint.x(); + b[1] = tmpPoint.y(); + b[2] = tmpPoint.z(); + + tmpPoint = geo.getPos3(primRef->getPointOffset(2)); + c[0] = tmpPoint.x(); + c[1] = tmpPoint.y(); + c[2] = tmpPoint.z(); + + double tmpDist = + (p - openvdb::math::closestPointOnTriangleToPoint(a, c, b, p, tmpUVW)).lengthSqr(); + + if (tmpDist < minDist) { + minDist = tmpDist; + primOffset = offset; + uvw = tmpUVW; + vert0 = primRef->getVertexOffset(0); + vert1 = primRef->getVertexOffset(2); + vert2 = primRef->getVertexOffset(1); + } + + if (vertexCount == 4) { + tmpPoint = geo.getPos3(primRef->getPointOffset(3)); + d[0] = tmpPoint.x(); + d[1] = tmpPoint.y(); + d[2] = tmpPoint.z(); + + tmpDist = (p - openvdb::math::closestPointOnTriangleToPoint( + a, d, c, p, tmpUVW)).lengthSqr(); + if (tmpDist < minDist) { + minDist = tmpDist; + primOffset = offset; + uvw = tmpUVW; + vert0 = primRef->getVertexOffset(0); + vert1 = primRef->getVertexOffset(3); + vert2 = primRef->getVertexOffset(2); + } + } + + } + } + + return primOffset; +} + + +// Faster for small primitive counts +inline GA_Offset +findClosestPrimitiveToPoint( + const GU_Detail& geo, std::vector& primitives, const openvdb::Vec3d& p, + GA_Offset& vert0, GA_Offset& vert1, GA_Offset& vert2, openvdb::Vec3d& uvw) +{ + GA_Offset primOffset = GA_INVALID_OFFSET; + const GA_Primitive * primRef = NULL; + double minDist = std::numeric_limits::max(); + + openvdb::Vec3d a, b, c, d, tmpUVW; + UT_Vector3 tmpPoint; + + std::sort(primitives.begin(), primitives.end()); + + GA_Index lastPrim = -1; + for (size_t n = 0, N = primitives.size(); n < N; ++n) { + if (primitives[n] == lastPrim) continue; + lastPrim = primitives[n]; + + const GA_Offset offset = geo.primitiveOffset(lastPrim); + primRef = geo.getPrimitiveList().get(offset); + + const GA_Size vertexCount = primRef->getVertexCount(); + + + if (vertexCount == 3 || vertexCount == 4) { + + tmpPoint = geo.getPos3(primRef->getPointOffset(0)); + a[0] = tmpPoint.x(); + a[1] = tmpPoint.y(); + a[2] = tmpPoint.z(); + + tmpPoint = geo.getPos3(primRef->getPointOffset(1)); + b[0] = tmpPoint.x(); + b[1] = tmpPoint.y(); + b[2] = tmpPoint.z(); + + tmpPoint = geo.getPos3(primRef->getPointOffset(2)); + c[0] = tmpPoint.x(); + c[1] = tmpPoint.y(); + c[2] = tmpPoint.z(); + + double tmpDist = + (p - openvdb::math::closestPointOnTriangleToPoint(a, c, b, p, tmpUVW)).lengthSqr(); + + if (tmpDist < minDist) { + minDist = tmpDist; + primOffset = offset; + uvw = tmpUVW; + vert0 = primRef->getVertexOffset(0); + vert1 = primRef->getVertexOffset(2); + vert2 = primRef->getVertexOffset(1); + } + + if (vertexCount == 4) { + tmpPoint = geo.getPos3(primRef->getPointOffset(3)); + d[0] = tmpPoint.x(); + d[1] = tmpPoint.y(); + d[2] = tmpPoint.z(); + + tmpDist = (p - openvdb::math::closestPointOnTriangleToPoint( + a, d, c, p, tmpUVW)).lengthSqr(); + if (tmpDist < minDist) { + minDist = tmpDist; + primOffset = offset; + uvw = tmpUVW; + vert0 = primRef->getVertexOffset(0); + vert1 = primRef->getVertexOffset(3); + vert2 = primRef->getVertexOffset(2); + } + } + + } + } + + return primOffset; +} + +//////////////////////////////////////// + + +template +class TransferPrimitiveAttributesOp +{ +public: + TransferPrimitiveAttributesOp( + const GU_Detail& sourceGeo, GU_Detail& targetGeo, const GridType& indexGrid, + std::vector& primAttributes, + std::vector& vertAttributes); + + void operator()(const GA_SplittableRange&) const; +private: + const GU_Detail& mSourceGeo; + GU_Detail& mTargetGeo; + const GridType& mIndexGrid; + std::vector& mPrimAttributes; + std::vector& mVertAttributes; +}; + +template +TransferPrimitiveAttributesOp::TransferPrimitiveAttributesOp( + const GU_Detail& sourceGeo, GU_Detail& targetGeo, const GridType& indexGrid, + std::vector& primAttributes, + std::vector& vertAttributes) + : mSourceGeo(sourceGeo) + , mTargetGeo(targetGeo) + , mIndexGrid(indexGrid) + , mPrimAttributes(primAttributes) + , mVertAttributes(vertAttributes) +{ + +} + +template +void +TransferPrimitiveAttributesOp::operator()(const GA_SplittableRange& range) const +{ + typedef typename GridType::ValueType IndexT; + + GA_Offset start, end, source, target, v0, v1, v2; + const GA_Primitive * primRef = NULL; + GA_Primitive::const_iterator vtxIt; + + typename GridType::ConstAccessor acc = mIndexGrid.getConstAccessor(); + const openvdb::math::Transform& transform = mIndexGrid.transform(); + openvdb::Vec3d pos, indexPos, uvw; + openvdb::Coord ijk, coord; + std::vector primitives(8), similar_primitives(8); + int count; + + UT_Vector3 targetN, sourceN; + + for (GA_PageIterator pageIt = range.beginPages(); !pageIt.atEnd(); ++pageIt) { + for (GA_Iterator blockIt(pageIt.begin()); blockIt.blockAdvance(start, end); ) { + for (target = start; target < end; ++target) { + + primRef = mTargetGeo.getPrimitiveList().get(target); + targetN = mTargetGeo.getGEOPrimitive(target)->computeNormal(); + + if (mPrimAttributes.size() != 0 ) { + + // Compute avg. vertex position + pos[0] = 0.0; + pos[1] = 0.0; + pos[2] = 0.0; + count = 0; + + for (primRef->beginVertex(vtxIt); !vtxIt.atEnd(); ++vtxIt, ++count) { + const UT_Vector3 p = mTargetGeo.getPos3(vtxIt.getPointOffset()); + pos[0] += p.x(); + pos[1] += p.y(); + pos[2] += p.z(); + } + + if (count > 1) pos *= (1.0 / float(count)); + indexPos = transform.worldToIndex(pos); + + // Find closest source primitive to current avg. vertex position. + coord[0] = int(std::floor(indexPos[0])); + coord[1] = int(std::floor(indexPos[1])); + coord[2] = int(std::floor(indexPos[2])); + + primitives.clear(); + similar_primitives.clear(); + IndexT primIndex; + + for (int d = 0; d < 8; ++d) { + ijk[0] = coord[0] + (((d & 0x02) >> 1) ^ (d & 0x01)); + ijk[1] = coord[1] + ((d & 0x02) >> 1); + ijk[2] = coord[2] + ((d & 0x04) >> 2); + + if (acc.probeValue(ijk, primIndex) && + openvdb::Index32(primIndex) != openvdb::util::INVALID_IDX) { + + GA_Offset tmpOffset = mSourceGeo.primitiveOffset(primIndex); + sourceN = mSourceGeo.getGEOPrimitive(tmpOffset)->computeNormal(); + + if (sourceN.dot(targetN) > 0.5) { + similar_primitives.push_back(primIndex); + } else { + primitives.push_back(primIndex); + } + } + } + + if (!primitives.empty() || !similar_primitives.empty()) { + + if (!similar_primitives.empty()) { + source = findClosestPrimitiveToPoint( + mSourceGeo, similar_primitives, pos, v0, v1, v2, uvw); + } else { + source = findClosestPrimitiveToPoint( + mSourceGeo, primitives, pos, v0, v1, v2, uvw); + } + + // Transfer attributes + for (size_t n = 0, N = mPrimAttributes.size(); n < N; ++n) { + mPrimAttributes[n]->copy(source, target); + } + } + } + + if (mVertAttributes.size() != 0) { + for (primRef->beginVertex(vtxIt); !vtxIt.atEnd(); ++vtxIt) { + + + const UT_Vector3 p = mTargetGeo.getPos3(vtxIt.getPointOffset()); + pos[0] = p.x(); + pos[1] = p.y(); + pos[2] = p.z(); + + indexPos = transform.worldToIndex(pos); + coord[0] = int(std::floor(indexPos[0])); + coord[1] = int(std::floor(indexPos[1])); + coord[2] = int(std::floor(indexPos[2])); + + int primIndex; + primitives.clear(); + similar_primitives.clear(); + + for (int d = 0; d < 8; ++d) { + ijk[0] = coord[0] + (((d & 0x02) >> 1) ^ (d & 0x01)); + ijk[1] = coord[1] + ((d & 0x02) >> 1); + ijk[2] = coord[2] + ((d & 0x04) >> 2); + + if (acc.probeValue(ijk, primIndex) && + openvdb::Index32(primIndex) != openvdb::util::INVALID_IDX) { + + GA_Offset tmpOffset = mSourceGeo.primitiveOffset(primIndex); + sourceN = mSourceGeo.getGEOPrimitive(tmpOffset)->computeNormal(); + + if (sourceN.dot(targetN) > 0.5) { + primitives.push_back(primIndex); + } + } + } + + if (!primitives.empty() || !similar_primitives.empty()) { + + if (!similar_primitives.empty()) { + findClosestPrimitiveToPoint( + mSourceGeo, similar_primitives, pos, v0, v1, v2, uvw); + } else { + findClosestPrimitiveToPoint( + mSourceGeo, primitives, pos, v0, v1, v2, uvw); + } + + for (size_t n = 0, N = mVertAttributes.size(); n < N; ++n) { + mVertAttributes[n]->copy(v0, v1, v2, vtxIt.getVertexOffset(), uvw); + } + } + } + } + } + } + } +} + + +//////////////////////////////////////// + +template +class TransferPointAttributesOp +{ +public: + TransferPointAttributesOp( + const GU_Detail& sourceGeo, GU_Detail& targetGeo, const GridType& indexGrid, + std::vector& pointAttributes, + const GA_PrimitiveGroup* surfacePrims = NULL); + + void operator()(const GA_SplittableRange&) const; +private: + const GU_Detail& mSourceGeo; + GU_Detail& mTargetGeo; + const GridType& mIndexGrid; + std::vector& mPointAttributes; + const GA_PrimitiveGroup* mSurfacePrims; +}; + +template +TransferPointAttributesOp::TransferPointAttributesOp( + const GU_Detail& sourceGeo, GU_Detail& targetGeo, const GridType& indexGrid, + std::vector& pointAttributes, + const GA_PrimitiveGroup* surfacePrims) + : mSourceGeo(sourceGeo) + , mTargetGeo(targetGeo) + , mIndexGrid(indexGrid) + , mPointAttributes(pointAttributes) + , mSurfacePrims(surfacePrims) +{ +} + +template +void +TransferPointAttributesOp::operator()(const GA_SplittableRange& range) const +{ + typedef typename GridType::ValueType IndexT; + + GA_Offset start, end, vtxOffset, primOffset, target, v0, v1, v2; + + typename GridType::ConstAccessor acc = mIndexGrid.getConstAccessor(); + const openvdb::math::Transform& transform = mIndexGrid.transform(); + openvdb::Vec3d pos, indexPos, uvw; + std::vector primitives(8); + openvdb::Coord ijk, coord; + + for (GA_PageIterator pageIt = range.beginPages(); !pageIt.atEnd(); ++pageIt) { + for (GA_Iterator blockIt(pageIt.begin()); blockIt.blockAdvance(start, end); ) { + for (target = start; target < end; ++target) { + + + vtxOffset = mTargetGeo.pointVertex(target); + + // Check if point is referenced by a surface primitive. + if (mSurfacePrims) { + bool surfacePrim = false; + + while (GAisValid(vtxOffset)) { + + primOffset = mTargetGeo.vertexPrimitive(vtxOffset); + + if (mSurfacePrims->containsIndex(mTargetGeo.primitiveIndex(primOffset))) { + surfacePrim = true; + break; + } + + vtxOffset = mTargetGeo.vertexToNextVertex(vtxOffset); + } + + if (!surfacePrim) continue; + } + + const UT_Vector3 p = mTargetGeo.getPos3(target); + pos[0] = p.x(); + pos[1] = p.y(); + pos[2] = p.z(); + + indexPos = transform.worldToIndex(pos); + coord[0] = int(std::floor(indexPos[0])); + coord[1] = int(std::floor(indexPos[1])); + coord[2] = int(std::floor(indexPos[2])); + + primitives.clear(); + IndexT primIndex; + + for (int d = 0; d < 8; ++d) { + ijk[0] = coord[0] + (((d & 0x02) >> 1) ^ (d & 0x01)); + ijk[1] = coord[1] + ((d & 0x02) >> 1); + ijk[2] = coord[2] + ((d & 0x04) >> 2); + + if (acc.probeValue(ijk, primIndex) && + openvdb::Index32(primIndex) != openvdb::util::INVALID_IDX) { + primitives.push_back(primIndex); + } + } + + if (!primitives.empty()) { + findClosestPrimitiveToPoint(mSourceGeo, primitives, pos, v0, v1, v2, uvw); + + v0 = mSourceGeo.vertexPoint(v0); + v1 = mSourceGeo.vertexPoint(v1); + v2 = mSourceGeo.vertexPoint(v2); + + for (size_t n = 0, N = mPointAttributes.size(); n < N; ++n) { + mPointAttributes[n]->copy(v0, v1, v2, target, uvw); + } + } + } + } + } +} + + +//////////////////////////////////////// + + +template +inline void +transferPrimitiveAttributes( + const GU_Detail& sourceGeo, + GU_Detail& targetGeo, + GridType& indexGrid, + Interrupter& boss, + const GA_PrimitiveGroup *primitives = NULL) +{ + // Match public primitive attributes + GA_AttributeDict::iterator it = sourceGeo.primitiveAttribs().begin(GA_SCOPE_PUBLIC); + + if (indexGrid.activeVoxelCount() == 0) return; + + std::vector primAttributeList; + + // Primitive attributes + for (; !it.atEnd(); ++it) { + const GA_Attribute* sourceAttr = it.attrib(); +#if (UT_VERSION_INT >= 0x0e0000b0) // 14.0.176 or later + if (NULL == targetGeo.findPrimitiveAttribute(it.name())) { + targetGeo.addPrimAttrib(sourceAttr); + } + GA_Attribute* targetAttr = targetGeo.findPrimitiveAttribute(it.name()); +#else + if (!targetGeo.findPrimitiveAttribute(it.name()).isValid()) { + targetGeo.addPrimAttrib(sourceAttr); + } + GA_Attribute* targetAttr = targetGeo.findPrimitiveAttribute(it.name()).getAttribute(); +#endif + + if (sourceAttr && targetAttr) { + AttributeCopyBase::Ptr att = createAttributeCopier(*sourceAttr, *targetAttr); + if(att) primAttributeList.push_back(att); + } + } + + if (boss.wasInterrupted()) return; + + std::vector vertAttributeList; + + it = sourceGeo.vertexAttribs().begin(GA_SCOPE_PUBLIC); + + // Vertex attributes + for (; !it.atEnd(); ++it) { + const GA_Attribute* sourceAttr = it.attrib(); +#if (UT_VERSION_INT >= 0x0e0000b0) // 14.0.176 or later + if (NULL == targetGeo.findVertexAttribute(it.name())) { + targetGeo.addVertexAttrib(sourceAttr); + } + GA_Attribute* targetAttr = targetGeo.findVertexAttribute(it.name()); +#else + if (!targetGeo.findVertexAttribute(it.name()).isValid()) { + targetGeo.addVertexAttrib(sourceAttr); + } + GA_Attribute* targetAttr = targetGeo.findVertexAttribute(it.name()).getAttribute(); +#endif + + if (sourceAttr && targetAttr) { +#if (UT_VERSION_INT >= 0x0c01007D) // 12.1.125 or later + targetAttr->hardenAllPages(); +#endif + AttributeCopyBase::Ptr att = createAttributeCopier(*sourceAttr, *targetAttr); + if(att) vertAttributeList.push_back(att); + } + } + + if (!boss.wasInterrupted() && (!primAttributeList.empty() || !vertAttributeList.empty())) { + + UTparallelFor(GA_SplittableRange(targetGeo.getPrimitiveRange(primitives)), + TransferPrimitiveAttributesOp(sourceGeo, targetGeo, indexGrid, + primAttributeList, vertAttributeList)); + } + + if (!boss.wasInterrupted()) { + std::vector pointAttributeList; + it = sourceGeo.pointAttribs().begin(GA_SCOPE_PUBLIC); + + // Point attributes + for (; !it.atEnd(); ++it) { + if (std::string(it.name()) == "P") continue; // Ignore previous point positions. + + const GA_Attribute* sourceAttr = it.attrib(); +#if (UT_VERSION_INT >= 0x0e0000b0) // 14.0.176 or later + if (NULL == targetGeo.findPointAttribute(it.name())) { + targetGeo.addPointAttrib(sourceAttr); + } + GA_Attribute* targetAttr = targetGeo.findPointAttribute(it.name()); +#else + if (!targetGeo.findPointAttribute(it.name()).isValid()) { + targetGeo.addPointAttrib(sourceAttr); + } + GA_Attribute* targetAttr = targetGeo.findPointAttribute(it.name()).getAttribute(); +#endif + + if (sourceAttr && targetAttr) { + AttributeCopyBase::Ptr att = createAttributeCopier(*sourceAttr, *targetAttr); + if(att) pointAttributeList.push_back(att); + } + } + + if (!boss.wasInterrupted() && !pointAttributeList.empty()) { + UTparallelFor(GA_SplittableRange(targetGeo.getPointRange()), + TransferPointAttributesOp(sourceGeo, targetGeo, indexGrid, + pointAttributeList, primitives)); + + } + } +} + +} // namespace openvdb_houdini + +#endif // OPENVDB_HOUDINI_ATTRIBUTE_TRANSFER_UTIL_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb_houdini/GEO_PrimVDB.h b/nuparu/include/openvdb/include/openvdb_houdini/GEO_PrimVDB.h new file mode 100644 index 00000000..bc538239 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_houdini/GEO_PrimVDB.h @@ -0,0 +1,834 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +/* + * PROPRIETARY INFORMATION. This software is proprietary to + * Side Effects Software Inc., and is not to be reproduced, + * transmitted, or disclosed in any way without written permission. + * + * Produced by: + * Jeff Lait + * Side Effects Software Inc + * 477 Richmond Street West + * Toronto, Ontario + * Canada M5V 3E7 + * 416-504-9876 + * + * NAME: GEO_PrimVDB.h ( GEO Library, C++) + * + * COMMENTS: Custom VDB primitive. + */ + +#include +#if !defined(SESI_OPENVDB) && (UT_VERSION_INT >= 0x0c050157) // 12.5.343 or later + +#include + +namespace openvdb_houdini { +using ::GEO_VolumeOptions; +using ::GEO_PrimVDB; +} + +#else // earlier than 12.5.343 + +#ifndef __HDK_GEO_PrimVDB__ +#define __HDK_GEO_PrimVDB__ + +//#include "GEO_API.h" + +#include +#include +#if (UT_VERSION_INT < 0x0c010072) // earlier than 12.1.114 +#include +#else +#include +#endif + +#include + +#include // for SYS_AtomicCounter + +#include +#include "UT_VDBUtils.h" +#include + +#include +#include + + +class GEO_Detail; +class GEO_PrimVolume; +class GEO_PrimVolumeXform; + + +#if (UT_VERSION_INT < 0x0c050000) // earlier than 12.5.0 +struct OPENVDB_HOUDINI_API GEO_VolumeOptions +{ + GEO_VolumeOptions() + { + } + GEO_VolumeOptions(GEO_VolumeVis mode, fpreal iso, fpreal density) + : myMode(mode) + , myIso(iso) + , myDensity(density) + { + } + bool operator==(const GEO_VolumeOptions &v) const + { + OPENVDB_NO_FP_EQUALITY_WARNING_BEGIN + return (myMode == v.myMode + && myIso == v.myIso + && myDensity == v.myDensity); + OPENVDB_NO_FP_EQUALITY_WARNING_END + } + bool operator!=(const GEO_VolumeOptions &v) const + { + return !(*this == v); + } + + GEO_VolumeVis myMode; + fpreal myIso; + fpreal myDensity; +}; +#endif + + +class OPENVDB_HOUDINI_API GEO_PrimVDB : public GEO_Primitive +{ +public: + typedef uint64 UniqueId; + +protected: + /// NOTE: The constructor should only be called from subclass + /// constructors. + GEO_PrimVDB(GEO_Detail *d, GA_Offset offset = GA_INVALID_OFFSET); + + /// NOTE: The constructor should only be called from subclass + /// constructors. + GEO_PrimVDB(const GA_MergeMap &map, GA_Detail &detail, + GA_Offset offset, const GEO_PrimVDB &src_prim); + + /// NOTE: The destructor should only be called from subclass + /// destructors. + virtual ~GEO_PrimVDB(); + +public: + static GA_PrimitiveFamilyMask buildFamilyMask() + { return GA_FAMILY_NONE; } + + /// @{ + /// Required interface methods + virtual bool isDegenerate() const; + virtual int getBBox(UT_BoundingBox *bbox) const; + virtual void reverse(); + virtual UT_Vector3 computeNormal() const; +#if (UT_VERSION_INT >= 0x0d000000) + virtual void copyPrimitive(const GEO_Primitive *src); +#else + virtual void copyPrimitive(const GEO_Primitive *src, + GEO_Point **ptredirect); +#endif + virtual void copyUnwiredForMerge(const GA_Primitive *src, + const GA_MergeMap &map); + + // Query the number of vertices in the array. This number may be smaller + // than the actual size of the array. + virtual GA_Size getVertexCount() const; + virtual GA_Offset getVertexOffset(GA_Size /*index*/) const + { return myVertex; } + + /// Convert an index in the voxel array into the corresponding worldspace + /// location + void indexToPos(int x, int y, int z, UT_Vector3 &pos) const; + void findexToPos(UT_Vector3 index, UT_Vector3 &pos) const; + + /// Convert a 3d position into the closest index value. + void posToIndex(UT_Vector3 pos, int &x, int &y, int &z) const; + void posToIndex(UT_Vector3 pos, UT_Vector3 &index) const; + + /// Evaluate the voxel value at the given world space position. + /// Note that depending on the underlying VDB type, this may not + /// be sensible, in which case a zero will silently be returned + fpreal getValueF(const UT_Vector3 &pos) const; + fpreal getValueAtIndexF(int ix, int iy, int iz) const; + UT_Vector3D getValueV3(const UT_Vector3 &pos) const; + UT_Vector3D getValueAtIndexV3(int ix, int iy, int iz) const; + void getValues(float *f, int stride, const UT_Vector3 *pos, int num) const; + void getValues(int *f, int stride, const UT_Vector3 *pos, int num) const; + void getValuesAtIndices(float *f, int stride, const int *ix, const int *iy, const int *iz, int num) const; + void getValuesAtIndices(int *f, int stride, const int *ix, const int *iy, const int *iz, int num) const; + + /// Vector grid variants. + void getValues(UT_Vector3 *f, int stride, const UT_Vector3 *pos, int num) const; + void getValuesAtIndices(UT_Vector3 *f, int stride, const int *ix, const int *iy, const int *iz, int num) const; + + // Worldspace gradient at the given position + UT_Vector3 getGradient(const UT_Vector3 &pos) const; + + /// Evaluate this grid's gradients at the given world space positions. + /// Does nothing and returns false if grid is non-scalar. + /// If normalize is true, then the gradients will be normalized to be unit + /// length. + bool evalGradients( + UT_Vector3 *gradients, + int gradients_stride, + const UT_Vector3 *positions, + int num_positions, + bool normalize = false) const; + + /// Get the storage type of the grid + UT_VDBType getStorageType() const + { return myGridAccessor.getStorageType(); } + /// Get the tuple size, usually 1 or 3 + int getTupleSize() const + { return UTvdbGetGridTupleSize(getStorageType()); } + + bool isSDF() const; + + /// True if the two volumes map the same indices to the same positions. + bool isAligned(const GEO_PrimVDB *vdb) const; + /// True if the two volumes have the same active regions + bool isActiveRegionMatched(const GEO_PrimVDB *vdb) const; + + // Transform the matrix associated with this primitive. Translate is + // ignored. + virtual void transform(const UT_Matrix4 &mat); + + /// Accessors for the 4x4 matrix representing the affine transform that + /// converts from index space voxel coordinates to world space. For frustum + /// maps, this will be transform as if the taper value is set to 1. + /// @{ + void setTransform4(const UT_DMatrix4 &xform4); + void setTransform4(const UT_Matrix4 &xform4); + UT_Matrix4D getTransform4() const; + /// @} + + // Take the whole set of points into consideration when applying the + // point removal operation to this primitive. The method returns 0 if + // successful, -1 if it failed because it would have become degenerate, + // and -2 if it failed because it would have had to remove the primitive + // altogether. + virtual int detachPoints(GA_PointGroup &grp); + /// Before a point is deleted, all primitives using the point will be + /// notified. The method should return "false" if it's impossible to + /// delete the point. Otherwise, the vertices should be removed. + virtual GA_DereferenceStatus dereferencePoint(GA_Offset point, + bool dry_run=false); + virtual GA_DereferenceStatus dereferencePoints( + const GA_RangeMemberQuery &pt_q, + bool dry_run=false); + virtual const GA_PrimitiveJSON *getJSON() const; + + /// This method assigns a preallocated vertex to the quadric, optionally + /// creating the topological link between the primitive and new vertex. + void assignVertex(GA_Offset new_vtx, bool update_topology); + + /// Defragmentation + virtual void swapVertexOffsets(const GA_Defragment &defrag); + + /// Evalaute a point given a u,v coordinate (with derivatives) + virtual bool evaluatePointRefMap(GA_Offset result_vtx, + GA_AttributeRefMap &hlist, + fpreal u, fpreal v, uint du, uint dv) const; + /// Evalaute position given a u,v coordinate (with derivatives) + virtual int evaluatePointV4(UT_Vector4 &pos, float u, float v = 0, + unsigned du=0, unsigned dv=0) const + { + return GEO_Primitive::evaluatePointV4(pos, u, v, + du, dv); + } + /// @} + + /// Convert transforms between native volumes and VDBs + /// @{ + + /// Get a GEO_PrimVolumeXform which represent's the grid's full transform. + /// The returned space's fromVoxelSpace() method will convert index space + /// voxel coordinates to world space positions (and the vice versa for + /// toVoxelSpace()). + GEO_PrimVolumeXform getIndexSpaceTransform() const; + + /// Equivalent to getSpaceTransform(getGrid().evalActiveVoxelBoundingBox()). + /// The returned space's fromVoxelSpace() method will convert 0-1 + /// coordinates over the active voxel bounding box to world space (and vice + /// versa for toVoxelSpace()). + GEO_PrimVolumeXform getSpaceTransform() const; + + /// Gives the equivalent to GEO_PrimVolume's getSpaceTransform() by using + /// the given bounding box to determine the bounds of the transform. + /// The resulting world space sample points will be offset by half a voxel + /// so that they match GEO_PrimVolume. + /// The returned space's fromVoxelSpace() method will convert 0-1 + /// coordinates over the bbox extents to world space (and vice versa for + /// toVoxelSpace()). + GEO_PrimVolumeXform getSpaceTransform(const UT_BoundingBoxD &bbox) const; + + /// Sets the transform from a GEO_PrimVolume's getSpaceTransform() by using + /// the index space [(0,0,0), resolution] bbox. If force_taper is true, + /// then the resulting transform will always be a NonlinearFrustumMap even + /// if there is no tapering. + void setSpaceTransform(const GEO_PrimVolumeXform &space, + const UT_Vector3R &resolution, + bool force_taper = false); + + /// @} + + fpreal getTaper() const; + + /// Returns the resolution of the active voxel array. + /// Does *not* mean the indices go from 0..rx, however! + void getRes(int &rx, int &ry, int &rz) const; + + /// Computes the voxel diameter by taking a step in x, y, and z + /// converting to world space and taking the length of that vector. + fpreal getVoxelDiameter() const; + + /// Returns the length of the voxel when you take an x, y, and z step + UT_Vector3 getVoxelSize() const; + + /// VDBs may either be unbounded, or created with a specific frustum + /// range. The latter is important for tapered VDBs that otherwise + /// have a singularity at the camera location. Tools can use the + /// presence of an idxbox as a clipping box in index space. + /// This does *NOT* relate to getRes - it may be much larger or + /// even in some cases smaller. + bool getFrustumBounds(UT_BoundingBox &idxbox) const; + + enum ActivateOperation + { + ACTIVATE_UNION, // Activate anything in source + ACTIVATE_INTERSECT, // Deactivate anything not in source + ACTIVATE_SUBTRACT, // Deactivate anything in source + ACTIVATE_COPY // Set our activation to match source + }; + + /// Activates voxels given an *index* space bounding box. This + /// is an inclusive box. + /// If this is Frustum VDB, the activation will be clipped by that. + /// Setting the value only takes effect if the voxels are activated, + /// deactivated voxels are set to the background. + void activateIndexBBox( + const openvdb::CoordBBox& bbox, + ActivateOperation operation, + bool setvalue, fpreal value) + { + activateIndexBBoxAdapter( + &bbox, operation, setvalue, value); + } + + /// Activates all of the voxels in this VDB that are touched + /// by active voxels in the source. + void activateByVDB(const GEO_PrimVDB *vdb, + ActivateOperation operation, + bool setvalue, fpreal value); + + /// @{ + /// Though not strictly required (i.e. not pure virtual), these methods + /// should be implemented for proper behaviour. + virtual GEO_Primitive *copy(int preserve_shared_pts = 0) const; + + // Have we been deactivated and stashed? +#if (UT_VERSION_INT >= 0x0d000000) // 13.0 or later + virtual void stashed(bool beingstashed, GA_Offset offset=GA_INVALID_OFFSET); +#else + virtual void stashed(int onoff, GA_Offset offset=GA_INVALID_OFFSET); +#endif + + // We need to invalidate the vertex offsets + virtual void clearForDeletion(); + +#if (UT_VERSION_INT < 0x0c050132) // Before 12.5.306 + virtual void copyOffsetPrimitive(const GEO_Primitive *src, int base); +#elif (UT_VERSION_INT < 0x0d000000) // Before 13.0, when the function was deleted + virtual void copyOffsetPrimitive(const GEO_Primitive *src, GA_Index base); +#endif + /// @} + + /// @{ + /// Optional interface methods. Though not required, implementing these + /// will give better behaviour for the new primitive. + virtual UT_Vector3 baryCenter() const; + virtual fpreal calcVolume(const UT_Vector3 &refpt) const; + /// Calculate the surface area of the active voxels where + /// a voxel face contributes if it borders an inactive voxel. + virtual fpreal calcArea() const; + /// @} + + /// @{ + /// Enlarge a bounding box by the bounding box of the primitive. A + /// return value of false indicates an error in the operation, most + /// likely an invalid P. For any attribute other than the position + /// these methods simply enlarge the bounding box based on the vertex. + virtual bool enlargeBoundingBox(UT_BoundingRect &b, + const GA_Attribute *P) const; + virtual bool enlargeBoundingBox(UT_BoundingBox &b, + const GA_Attribute *P) const; + virtual void enlargePointBounds(UT_BoundingBox &e) const; + /// @} + /// Enlarge a bounding sphere to encompass the primitive. A return value + /// of false indicates an error in the operation, most likely an invalid + /// P. For any attribute other than the position this method simply + /// enlarges the sphere based on the vertex. + virtual bool enlargeBoundingSphere(UT_BoundingSphere &b, + const GA_Attribute *P) const; + + /// Accessor for the local 3x3 affine transform matrix for the primitive. + /// For frustum maps, this will be transform as if the taper value is set + /// to 1. + /// @{ + virtual void getLocalTransform(UT_Matrix3D &result) const; + virtual void setLocalTransform(const UT_Matrix3D &new_mat3); + /// @} + + /// @internal Hack to condition 4x4 matrices that we avoid creating what + /// OpenVDB erroneously thinks are singular matrices. Returns true if mat4 + /// was modified. + static bool conditionMatrix(UT_Matrix4D &mat4); + + /// Visualization accessors + /// @{ + const GEO_VolumeOptions &getVisOptions() const { return myVis; } + + void setVisualization( + GEO_VolumeVis vismode, + fpreal iso, + fpreal density) + { + myVis.myMode = vismode; + myVis.myIso = iso; + myVis.myDensity = density; + } + GEO_VolumeVis getVisualization() const { return myVis.myMode; } + fpreal getVisIso() const { return myVis.myIso; } + fpreal getVisDensity() const { return myVis.myDensity; } + /// @} + + /// Load the order from a JSON value + bool loadOrder(const UT_JSONValue &p); + + /// @{ + /// Save/Load vdb to a JSON stream + bool saveVDB(UT_JSONWriter &w) const; + bool loadVDB(UT_JSONParser &p); + /// @} + + bool saveVisualization( + UT_JSONWriter &w, + const GA_SaveMap &map) const; + bool loadVisualization( + UT_JSONParser &p, + const GA_LoadMap &map); + + /// Method to perform quick lookup of vertex without the virtual call + GA_Offset fastVertexOffset(GA_Size UT_IF_ASSERT_P(index)) const + { + UT_ASSERT_P(index < 1); + return myVertex; + } + + void setVertexPoint(int i, GA_Offset pt) + { + if (i == 0) + wireVertex(myVertex, pt); + } + + /// @brief Computes the total density of the volume, scaled by + /// the volume's size. Negative values will be ignored. + fpreal calcPositiveDensity() const; + + bool hasGrid() const { return myGridAccessor.hasGrid(); } + + /// @brief If this primitive's grid's voxel data (i.e., its tree) + /// is shared, replace the tree with a deep copy of itself that is + /// not shared with anyone else. + void makeGridUnique() + { myGridAccessor.makeGridUnique(); } + + /// @brief Return a reference to this primitive's grid. + /// @note Calling setGrid() invalidates all references previously returned. + const openvdb::GridBase & getConstGrid() const + { return myGridAccessor.getConstGrid(*this); } + /// @brief Return a reference to this primitive's grid. + /// @note Calling setGrid() invalidates all references previously returned. + const openvdb::GridBase & getGrid() const + { return getConstGrid(); } + /// @brief Return a reference to this primitive's grid. + /// @note Calling setGrid() invalidates all references previously returned. + /// @warning Call makeGridUnique() before modifying the grid's voxel data. + openvdb::GridBase & getGrid() + { + incrGridUniqueIds(); + return myGridAccessor.getGrid(*this); + } + + /// @brief Return a shared pointer to this primitive's grid. + /// @note Calling setGrid() causes the grid to which the shared pointer + /// refers to be disassociated with this primitive. + openvdb::GridBase::ConstPtr getConstGridPtr() const + { return myGridAccessor.getConstGridPtr(*this); } + /// @brief Return a shared pointer to this primitive's grid. + /// @note Calling setGrid() causes the grid to which the shared pointer + /// refers to be disassociated with this primitive. + openvdb::GridBase::ConstPtr getGridPtr() const + { return getConstGridPtr(); } + /// @brief Return a shared pointer to this primitive's grid. + /// @note Calling setGrid() causes the grid to which the shared pointer + /// refers to be disassociated with this primitive. + /// @warning Call makeGridUnique() before modifying the grid's voxel data. + openvdb::GridBase::Ptr getGridPtr() + { + incrGridUniqueIds(); + return myGridAccessor.getGridPtr(*this); + } + + /// @brief Set this primitive's grid to a shallow copy of the given grid. + /// @note Invalidates all previous getGrid() and getConstGrid() references + void setGrid(const openvdb::GridBase &grid) + { + incrGridUniqueIds(); + myGridAccessor.setGrid(grid, *this); + } + + /// @brief Return a reference to this primitive's grid metadata. + /// @note Calling setGrid() invalidates all references previously returned. + const openvdb::MetaMap& getConstMetadata() const + { return getConstGrid(); } + /// @brief Return a reference to this primitive's grid metadata. + /// @note Calling setGrid() invalidates all references previously returned. + const openvdb::MetaMap& getMetadata() const + { return getConstGrid(); } + /// @brief Return a reference to this primitive's grid metadata. + /// @note Calling setGrid() invalidates all references previously returned. + openvdb::MetaMap& getMetadata() + { + incrMetadataUniqueId(); + return myGridAccessor.getGrid(*this); + } + + /// @brief Return the value of this primitive's "name" attribute + /// in the given detail. + const char * getGridName() const; + + /// @brief Return this primitive's serial number. + /// @details A primitive's serial number never changes. + /// @todo Because serial numbers are currently 32-bit, it is possible, + /// though unlikely, for two primitives to have the same serial number. + UniqueId getUniqueId() const + { return static_cast(myUniqueId); } + + /// @brief Return the serial number of this primitive's voxel data. + /// @details The serial number is incremented whenever a non-const + /// reference or pointer to this primitive's grid is requested + /// (whether or not the voxel data is ultimately modified). + UniqueId getTreeUniqueId() const + { return static_cast(myTreeUniqueId); } + /// @brief Return the serial number of this primitive's grid metadata. + /// @details The serial number is incremented whenever a non-const + /// reference to the metadata or non-const access to the grid is requested + /// (whether or not the metadata is ultimately modified). + UniqueId getMetadataUniqueId() const + { return static_cast(myMetadataUniqueId); } + /// @brief Return the serial number of this primitive's transform. + /// @details The serial number is incremented whenever the transform + /// is modified or non-const access to this primitive's grid is requested + /// (whether or not the transform is ultimately modified). + UniqueId getTransformUniqueId() const + { return static_cast(myTransformUniqueId); } + +protected: + typedef SYS_AtomicCounter AtomicUniqueId; // 32-bit on non-AMD systems + + /// Register intrinsic attributes +#if (UT_VERSION_INT >= 0x0c010048) // 12.1.72 or later + GA_DECLARE_INTRINSICS() +#else + static GA_IntrinsicManager::Registrar + registerIntrinsics(GA_PrimitiveDefinition &defn); +#endif + + /// Return true if the given metadata token is an intrinsic + static bool isIntrinsicMetadata(const char *name); + + /// @warning vertexPoint() doesn't check the bounds. Use with caution. + GA_Offset vertexPoint(GA_Size) const + { return getDetail().vertexPoint(myVertex); } + + /// Report approximate memory usage, excluding sizeof(*this), + /// because the subclass doesn't have access to myGridAccessor. + int64 getBaseMemoryUsage() const; + + /// @brief Return an ID number that is guaranteed to be unique across + /// all VDB primitives. + static UniqueId nextUniqueId(); + + void incrTreeUniqueId() + { myTreeUniqueId.maximum(nextUniqueId()); } + void incrMetadataUniqueId() + { myMetadataUniqueId.maximum(nextUniqueId()); } + void incrTransformUniqueId() + { myTransformUniqueId.maximum(nextUniqueId()); } + void incrGridUniqueIds() + { + incrTreeUniqueId(); + incrMetadataUniqueId(); + incrTransformUniqueId(); + } + + /// @brief Replace this primitive's grid with a shallow copy + /// of another primitive's grid. + void copyGridFrom(const GEO_PrimVDB&); + + GA_Offset myVertex; + + /// @brief GridAccessor manages access to a GEO_PrimVDB's grid. + /// @details In keeping with OpenVDB library conventions, the grid + /// is stored internally by shared pointer. However, grid objects + /// are never shared among primitives, though their voxel data + /// (i.e., their trees) may be shared. + ///

Among other things, GridAccessor + /// - ensures that each primitive's transform and metadata are unique + /// (i.e., not shared with anyone else) + /// - allows primitives to share voxel data but, via makeGridUnique(), + /// provides a way to break the connection + /// - ensures that the primitive's transform and the grid's transform + /// are in sync (specifically, the translation component, which is + /// stored independently as a vertex offset). + class GridAccessor + { + public: + GridAccessor() : myStorageType(UT_VDB_INVALID) + { } + + openvdb::GridBase & + getGrid(const GEO_PrimVDB &prim) + { updateGridTranslates(prim); return *myGrid; } + + const openvdb::GridBase & + getConstGrid(const GEO_PrimVDB &prim) const + { updateGridTranslates(prim); return *myGrid; } + + openvdb::GridBase::Ptr + getGridPtr(const GEO_PrimVDB &prim) + { updateGridTranslates(prim); return myGrid; } + + openvdb::GridBase::ConstPtr + getConstGridPtr(const GEO_PrimVDB &prim) const + { updateGridTranslates(prim); return myGrid; } + + // These accessors will ensure the transform's translate is set into + // the vertex position. + void setGrid(const openvdb::GridBase& grid, GEO_PrimVDB& prim) + { setGridAdapter(&grid, prim); } + void setTransform( + const openvdb::math::Transform &xform, + GEO_PrimVDB &prim) + { setTransformAdapter(&xform, prim); } + + void makeGridUnique(); + + UT_VDBType getStorageType() const { return myStorageType; } + bool hasGrid() const { return myGrid != 0; } + + private: + void updateGridTranslates(const GEO_PrimVDB &prim) const; + void setVertexPosition( + const openvdb::math::Transform &xform, + GEO_PrimVDB &prim) + { setVertexPositionAdapter(&xform, prim); } + + void setGridAdapter(const void* grid, GEO_PrimVDB&); + void setTransformAdapter(const void* xform, GEO_PrimVDB&); + void setVertexPositionAdapter(const void* xform, GEO_PrimVDB&); + + private: + openvdb::GridBase::Ptr myGrid; + UT_VDBType myStorageType; + }; + +private: + void activateIndexBBoxAdapter( + const void* bbox, + ActivateOperation, + bool setvalue, fpreal value); + + + GridAccessor myGridAccessor; + + GEO_VolumeOptions myVis; + +#if (UT_VERSION_INT < 0x0c050000) // earlier than 12.5.0 + bool myStashedState; +#endif + + AtomicUniqueId myUniqueId; + AtomicUniqueId myTreeUniqueId; + AtomicUniqueId myMetadataUniqueId; + AtomicUniqueId myTransformUniqueId; + +}; // class GEO_PrimVDB + + +#ifndef SESI_OPENVDB +namespace openvdb_houdini { +using ::GEO_VolumeOptions; +using ::GEO_PrimVDB; +} +#endif + + +//////////////////////////////////////// + + +namespace UT_VDBUtils { + +// This overload of UT_VDBUtils::callTypedGrid(), for GridBaseType = GEO_PrimVDB, +// calls makeGridUnique() on the primitive just before instantiating and +// invoking the functor on the primitive's grid. This delays the call +// to makeGridUnique() until it is known to be necessary and thus avoids +// making deep copies of grids of types that won't be processed. +template +inline void +callTypedGrid(GEO_PrimVDB& prim, OpType& op) +{ + prim.makeGridUnique(); + +#ifdef _MSC_VER + op.operator()(*(UTverify_cast(&prim.getGrid()))); +#else + op.template operator()(*(UTverify_cast(&prim.getGrid()))); +#endif +} + +// Overload of callTypedGrid() for GridBaseType = const GEO_PrimVDB +template +inline void +callTypedGrid(const GEO_PrimVDB& prim, OpType& op) +{ +#ifdef _MSC_VER + op.operator()(*(UTverify_cast(&prim.getConstGrid()))); +#else + op.template operator()(*(UTverify_cast(&prim.getConstGrid()))); +#endif +} + +} // namespace UT_VDBUtils + +// Define UTvdbProcessTypedGrid*() (see UT_VDBUtils.h) for grids +// belonging to primitives, for various subsets of grid types. +UT_VDB_DECL_PROCESS_TYPED_GRID(GEO_PrimVDB&) +UT_VDB_DECL_PROCESS_TYPED_GRID(const GEO_PrimVDB&) + + +//////////////////////////////////////// + + +/// @brief Utility function to process the grid of a const primitive using functor @a op. +/// @details It will invoke @code op.operator()(const GridT &grid) @endcode +/// @{ +template +inline bool GEOvdbProcessTypedGrid(const GEO_PrimVDB &vdb, OpT &op) +{ + return UTvdbProcessTypedGrid(vdb.getStorageType(), vdb.getGrid(), op); +} + +template +inline bool GEOvdbProcessTypedGridReal(const GEO_PrimVDB &vdb, OpT &op) +{ + return UTvdbProcessTypedGridReal(vdb.getStorageType(), vdb.getGrid(), op); +} + +template +inline bool GEOvdbProcessTypedGridScalar(const GEO_PrimVDB &vdb, OpT &op) +{ + return UTvdbProcessTypedGridScalar(vdb.getStorageType(), vdb.getGrid(), op); +} + +template +inline bool GEOvdbProcessTypedGridTopology(const GEO_PrimVDB &vdb, OpT &op) +{ + return UTvdbProcessTypedGridTopology(vdb.getStorageType(), vdb.getGrid(), op); +} + +template +inline bool GEOvdbProcessTypedGridVec3(const GEO_PrimVDB &vdb, OpT &op) +{ + return UTvdbProcessTypedGridVec3(vdb.getStorageType(), vdb.getGrid(), op); +} + +/// @brief Utility function to process the grid of a primitive using functor @a op. +/// @param vdb the primitive whose grid is to be processed +/// @param op a functor with a call operator of the form +/// @code op.operator()(GridT &grid) @endcode +/// @param makeUnique if @c true, call vdb.makeGridUnique() before +/// invoking the functor +/// @{ +template +inline bool GEOvdbProcessTypedGrid(GEO_PrimVDB &vdb, OpT &op, bool makeUnique = true) +{ + if (makeUnique) return UTvdbProcessTypedGrid(vdb.getStorageType(), vdb, op); + return UTvdbProcessTypedGrid(vdb.getStorageType(), vdb.getGrid(), op); +} + +template +inline bool GEOvdbProcessTypedGridReal(GEO_PrimVDB &vdb, OpT &op, bool makeUnique = true) +{ + if (makeUnique) return UTvdbProcessTypedGridReal(vdb.getStorageType(), vdb, op); + return UTvdbProcessTypedGridReal(vdb.getStorageType(), vdb.getGrid(), op); +} + +template +inline bool GEOvdbProcessTypedGridScalar(GEO_PrimVDB &vdb, OpT &op, bool makeUnique = true) +{ + if (makeUnique) return UTvdbProcessTypedGridScalar(vdb.getStorageType(), vdb, op); + return UTvdbProcessTypedGridScalar(vdb.getStorageType(), vdb.getGrid(), op); +} + +template +inline bool GEOvdbProcessTypedGridTopology(GEO_PrimVDB &vdb, OpT &op, bool makeUnique = true) +{ + if (makeUnique) return UTvdbProcessTypedGridTopology(vdb.getStorageType(), vdb, op); + return UTvdbProcessTypedGridTopology(vdb.getStorageType(), vdb.getGrid(), op); +} + +template +inline bool GEOvdbProcessTypedGridVec3(GEO_PrimVDB &vdb, OpT &op, bool makeUnique = true) +{ + if (makeUnique) return UTvdbProcessTypedGridVec3(vdb.getStorageType(), vdb, op); + return UTvdbProcessTypedGridVec3(vdb.getStorageType(), vdb.getGrid(), op); +} +/// @} + +#endif // __HDK_GEO_PrimVDB__ + +#endif // UT_VERSION_INT < 0x0c050157 // earlier than 12.5.343 + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb_houdini/GT_GEOPrimCollectVDB.h b/nuparu/include/openvdb/include/openvdb_houdini/GT_GEOPrimCollectVDB.h new file mode 100644 index 00000000..d8d568e6 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_houdini/GT_GEOPrimCollectVDB.h @@ -0,0 +1,92 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +/* + * PROPRIETARY INFORMATION. This software is proprietary to + * Side Effects Software Inc., and is not to be reproduced, + * transmitted, or disclosed in any way without written permission. + * + * Produced by: + * Side Effects Software Inc + * 123 Front Street West, Suite 1401 + * Toronto, Ontario + * Canada M5J 2M2 + * 416-504-9876 + * + * NAME: GT_GEOPrimCollectVDB.h ( GT Library, C++) + * + * COMMENTS: + */ + +#ifndef __GT_GEOPrimCollectVDB__ +#define __GT_GEOPrimCollectVDB__ + +#include +#include + +namespace openvdb_houdini { + +class OPENVDB_HOUDINI_API GT_GEOPrimCollectVDB : public GT_GEOPrimCollect +{ +public: + GT_GEOPrimCollectVDB(const GA_PrimitiveTypeId &id); + virtual ~GT_GEOPrimCollectVDB(); + + static void registerPrimitive(const GA_PrimitiveTypeId &id); + + virtual GT_GEOPrimCollectData * + beginCollecting( + const GT_GEODetailListHandle &, + const GT_RefineParms *) const; + + virtual GT_PrimitiveHandle + collect( + const GT_GEODetailListHandle &geometry, + const GEO_Primitive *const* prim_list, + int nsegments, + GT_GEOPrimCollectData *data) const; + + virtual GT_PrimitiveHandle + endCollecting( + const GT_GEODetailListHandle &geometry, + GT_GEOPrimCollectData *data) const; +private: + + GA_PrimitiveTypeId myId; + +}; + +} // namespace openvdb_houdini + +#endif // __GT_GEOPrimCollectVDB__ + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb_houdini/GU_PrimVDB.h b/nuparu/include/openvdb/include/openvdb_houdini/GU_PrimVDB.h new file mode 100644 index 00000000..807d77bf --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_houdini/GU_PrimVDB.h @@ -0,0 +1,355 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +/* + * PROPRIETARY INFORMATION. This software is proprietary to + * Side Effects Software Inc., and is not to be reproduced, + * transmitted, or disclosed in any way without written permission. + * + * Produced by: + * Jeff Lait + * Side Effects Software Inc + * 477 Richmond Street West + * Toronto, Ontario + * Canada M5V 3E7 + * 416-504-9876 + * + * NAME: GU_PrimVDB.h ( GU Library, C++) + * + * COMMENTS: Custom VDB primitive. + */ + +#include +#if !defined(SESI_OPENVDB) && (UT_VERSION_INT >= 0x0c050157) // 12.5.343 or later + +#include + +namespace openvdb_houdini { +using ::GU_PrimVDB; +} + +#else // earlier than 12.5.343 + +#ifndef __HDK_GU_PrimVDB__ +#define __HDK_GU_PrimVDB__ + +//#include "GU_API.h" +#include +#include "GEO_PrimVDB.h" +#include +#include +#include +#include +#include +#include + + +class GA_Attribute; +class GEO_PrimVolume; +class UT_MemoryCounter; + + +class OPENVDB_HOUDINI_API GU_PrimVDB : public GEO_PrimVDB, public GU_Primitive +{ +protected: + /// NOTE: Primitives should not be deleted directly. They are managed + /// by the GA_PrimitiveList and the stash. + virtual ~GU_PrimVDB() {} + +public: + /// NOTE: This constructor should only be called via GU_PrimitiveFactory. + GU_PrimVDB(GU_Detail *gdp, GA_Offset offset=GA_INVALID_OFFSET) + : GEO_PrimVDB(gdp, offset) + , GU_Primitive() + {} + + /// NOTE: This constructor should only be called via GU_PrimitiveFactory. + GU_PrimVDB(const GA_MergeMap &map, GA_Detail &detail, + GA_Offset offset, const GU_PrimVDB &src_prim) + : GEO_PrimVDB(map, detail, offset, src_prim) + , GU_Primitive() + {} + + /// Report approximate memory usage. + virtual int64 getMemoryUsage() const; + +#ifndef SESI_OPENVDB + /// Allows you to find out what this primitive type was named. + static GA_PrimitiveTypeId theTypeId() { return theDefinition->getId(); } + + /// Must be invoked during the factory callback to add us to the + /// list of primitives + static void registerMyself(GA_PrimitiveFactory *factory); +#endif + + virtual const GA_PrimitiveDefinition &getTypeDef() const + { + UT_ASSERT(theDefinition); + return *theDefinition; + } + + // Conversion Methods + + virtual GEO_Primitive *convert(GU_ConvertParms &parms, + GA_PointGroup *usedpts = 0); + virtual GEO_Primitive *convertNew(GU_ConvertParms &parms); + + /// Convert all GEO_PrimVolume primitives in geometry to + /// GEO_PrimVDB, preserving prim/vertex/point attributes (and prim/point + /// groups if requested). + static void convertVolumesToVDBs( + GU_Detail &dst_geo, + const GU_Detail &src_geo, + GU_ConvertParms &parms, + bool flood_sdf, + bool prune, + fpreal tolerance, + bool keep_original); + + /// Convert all GEO_PrimVDB primitives in geometry to parms.toType, + /// preserving prim/vertex/point attributes (and prim/point groups if + /// requested). + /// @{ + static void convertVDBs( + GU_Detail &dst_geo, + const GU_Detail &src_geo, + GU_ConvertParms &parms, + fpreal adaptivity, + bool keep_original); + static void convertVDBs( + GU_Detail &dst_geo, + const GU_Detail &src_geo, + GU_ConvertParms &parms, + fpreal adaptivity, + bool keep_original, + bool split_disjoint_volumes); + /// @} + +#if (UT_VERSION_INT < 0x0d050000) // Earlier than 13.5 + virtual void *castTo (void) const; + virtual const GEO_Primitive *castToGeo(void) const; +#endif + + // NOTE: For static member functions please call in the following + // manner. = GU_PrimVDB:: + // i.e. partptr = GU_PrimVDB::build(params...); + + // Optional Build Method + + static GU_PrimVDB * build(GU_Detail *gdp, bool append_points = true); + + /// Store a VDB grid in a new VDB primitive and add the primitive + /// to a geometry detail. + /// @param gdp the detail to which to add the new primitive + /// @param grid a grid to be associated with the new primitive + /// @param src if non-null, copy attributes and groups from this primitive + /// @param name if non-null, set the new primitive's @c name attribute to + /// this string; otherwise, if @a src is non-null, use its name + static GU_PrimVDB* buildFromGrid(GU_Detail& gdp, openvdb::GridBase::Ptr grid, + const GEO_PrimVDB* src = NULL, const char* name = NULL) + { + return GU_PrimVDB::buildFromGridAdapter(gdp, &grid, src, name); + } + + /// Create new VDB primitive from the given native volume primitive + static GU_PrimVDB * buildFromPrimVolume( + GU_Detail &geo, + const GEO_PrimVolume &vol, + const char *name, + const bool flood_sdf = false, + const bool prune = false, + const float tolerance = 0.0); + + /// A fast method for converting a primitive volume to a polysoup via VDB + /// into the given gdp. It will _not_ copy attributes because this is a + /// special case used for display purposes only. + static void convertPrimVolumeToPolySoup( + GU_Detail &dst_geo, + const GEO_PrimVolume &src_vol); + + virtual void normal(NormalComp &output) const; + +#if (UT_VERSION_INT < 0x0d050000) // Earlier than 13.5 + virtual int intersectRay(const UT_Vector3 &o, const UT_Vector3 &d, + float tmax = 1E17F, float tol = 1E-12F, + float *distance = 0, UT_Vector3 *pos = 0, + UT_Vector3 *nml = 0, int accurate = 0, + float *u = 0, float *v = 0, + int ignoretrim = 1) const; +#endif + + // callermustdelete is true if the returned cache is to be deleted by + // the caller. +#if (UT_VERSION_INT < 0x0d050000) // Earlier than 13.5 + +#if (UT_VERSION_INT >= 0x0d000000) // 13.0 or later + SYS_DEPRECATED_HDK(13.0) +#endif + virtual GU_RayIntersect *createRayCache(int &callermustdelete); +#endif + + /// @brief Transfer any metadata associated with this primitive's + /// VDB grid to primitive attributes. + void syncAttrsFromMetadata(); + + /// @brief Transfer any metadata associated with a VDB grid + /// to primitive attributes on a VDB primitive. + /// @param prim the primitive to be populated with attributes + /// @param grid the grid whose metadata should be transferred + /// @param gdp the detail to which to transfer attributes + static void createGridAttrsFromMetadata( + const GEO_PrimVDB& prim, + const openvdb::GridBase& grid, + GEO_Detail& gdp) + { + GU_PrimVDB::createGridAttrsFromMetadataAdapter(prim, &grid, gdp); + } + + /// @brief Transfer any metadata associated with the given MetaMap + /// to attributes on the given element specified by owner. + /// @param owner the type of element + /// @param element the offset of the element + /// @param meta_map the metadata that should be transferred + /// @param gdp the detail to which to transfer attributes + static void createAttrsFromMetadata( + GA_AttributeOwner owner, + GA_Offset element, + const openvdb::MetaMap& meta_map, + GEO_Detail& gdp) + { + GU_PrimVDB::createAttrsFromMetadataAdapter(owner, element, &meta_map, gdp); + } + + /// @brief Transfer a VDB primitive's attributes to a VDB grid as metadata. + /// @param grid the grid to be populated with metadata + /// @param prim the primitive whose attributes should be transferred + /// @param gdp the detail from which to retrieve primitive attributes + static void createMetadataFromGridAttrs( + openvdb::GridBase& grid, + const GEO_PrimVDB& prim, + const GEO_Detail& gdp) + { + GU_PrimVDB::createMetadataFromGridAttrsAdapter(&grid, prim, gdp); + } + + /// @brief Transfer attributes to VDB metadata. + /// @param meta_map the output metadata + /// @param owner the type of element + /// @param element the offset of the element + /// @param geo the detail from which to retrieve primitive attributes + static void createMetadataFromAttrs( + openvdb::MetaMap& meta_map, + GA_AttributeOwner owner, + GA_Offset element, + const GEO_Detail& geo) + { + GU_PrimVDB::createMetadataFromAttrsAdapter(&meta_map, owner, element, geo); + } + +private: // METHODS + + /// Add a border of the given radius by evaluating from the given volume. + /// It assumes that the VDB is a float grid and that the voxel array has + /// the same index space, so this can really only be safely called after + /// buildFromPrimVolume(). This is used to ensure that non-constant borders + /// can be converted at the expense of some extra memory. + void expandBorderFromPrimVolume( + const GEO_PrimVolume &vol, + int border_radius); + + GEO_Primitive * convertToNewPrim( + GEO_Detail &dst_geo, + GU_ConvertParms &parms, + fpreal adaptivity, + bool split_disjoint_volumes, + bool &success) const; + GEO_Primitive * convertToPrimVolume( + GEO_Detail &dst_geo, + GU_ConvertParms &parms, + bool split_disjoint_volumes) const; + GEO_Primitive * convertToPoly( + GEO_Detail &dst_geo, + GU_ConvertParms &parms, + fpreal adaptivity, + bool buildpolysoup, + bool &success) const; + + static GU_PrimVDB* buildFromGridAdapter( + GU_Detail& gdp, + void* grid, + const GEO_PrimVDB*, + const char* name); + static void createGridAttrsFromMetadataAdapter( + const GEO_PrimVDB& prim, + const void* grid, + GEO_Detail& gdp); + static void createMetadataFromGridAttrsAdapter( + void* grid, + const GEO_PrimVDB&, + const GEO_Detail&); + + static void createAttrsFromMetadataAdapter( + GA_AttributeOwner owner, + GA_Offset element, + const void* meta_map_ptr, + GEO_Detail& geo); + + static void createMetadataFromAttrsAdapter( + void* meta_map_ptr, + GA_AttributeOwner owner, + GA_Offset element, + const GEO_Detail& geo); + +private: // DATA + + static GA_PrimitiveDefinition *theDefinition; + friend class GU_PrimitiveFactory; +#if (UT_VERSION_INT >= 0x0d000000) // 13.0 or later + SYS_DEPRECATED_PUSH_DISABLE() +#endif +}; +#if (UT_VERSION_INT >= 0x0d000000) // 13.0 or later + SYS_DEPRECATED_POP_DISABLE() +#endif + + +#ifndef SESI_OPENVDB +namespace openvdb_houdini { +using ::GU_PrimVDB; +} // namespace openvdb_houdini +#endif + +#endif // __HDK_GU_PrimVDB__ + +#endif // UT_VERSION_INT < 0x0c050157 // earlier than 12.5.343 + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb_houdini/GU_VDBPointTools.h b/nuparu/include/openvdb/include/openvdb_houdini/GU_VDBPointTools.h new file mode 100644 index 00000000..8c8c0756 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_houdini/GU_VDBPointTools.h @@ -0,0 +1,434 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file GU_VDBPointTools.h +/// @author FX R&D OpenVDB team +/// +/// @brief Collection of PointIndexGrid helpers for Houdini + +#ifndef __GU_VDBPOINTTOOLS_H_HAS_BEEN_INCLUDED__ +#define __GU_VDBPOINTTOOLS_H_HAS_BEEN_INCLUDED__ + +#if defined(SESI_OPENVDB) + #include "GU_Detail.h" +#else + #include +#endif +#include +#include + +#include + +#if (UT_MAJOR_VERSION_INT >= 15) + #include +#endif + +#if (UT_MAJOR_VERSION_INT >= 14) + #include + #include + #include + #include +#endif + +#include +#include +#include +#include + + +/// @brief Houdini point attribute wrapper +template +struct GU_VDBPointList +{ + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + typedef VectorType PosType; + typedef typename PosType::value_type ScalarType; + + GU_VDBPointList(const GU_Detail& detail, const GA_PointGroup* group = NULL) + : mPositionHandle(detail.getP()) + , mVelocityHandle() + , mRadiusHandle() + , mIndexMap(&detail.getP()->getIndexMap()) + , mOffsets() + , mSize(mIndexMap->indexSize()) + { + if (group) { + mSize = group->entries(); + mOffsets.reserve(mSize); + + GA_Offset start, end; + GA_Range range(*group); + for (GA_Iterator it = range.begin(); it.blockAdvance(start, end); ) { + for (GA_Offset off = start; off < end; ++off) { + mOffsets.push_back(off); + } + } + + getOffset = &GU_VDBPointList::offsetFromGroupMap; + } else if (mIndexMap->isTrivialMap()) { + getOffset = &GU_VDBPointList::offsetFromIndexCast; + } else { + getOffset = &GU_VDBPointList::offsetFromGeoMap; + } + + // Bind optional attributes + + GA_ROAttributeRef velRef = detail.findFloatTuple(GA_ATTRIB_POINT, GEO_STD_ATTRIB_VELOCITY, 3); + if (velRef.isValid()) { + mVelocityHandle.bind(velRef.getAttribute()); + } + + GA_ROAttributeRef radRef = detail.findFloatTuple(GA_ATTRIB_POINT, GEO_STD_ATTRIB_PSCALE); + if (radRef.isValid()) { + mRadiusHandle.bind(radRef.getAttribute()); + } + } + + static Ptr create(const GU_Detail& detail, const GA_PointGroup* group = NULL) + { + return Ptr(new GU_VDBPointList(detail, group)); + } + + size_t size() const { return mSize; } + + bool hasVelocity() const { return mVelocityHandle.isValid(); } + bool hasRadius() const { return mRadiusHandle.isValid(); } + + // Index access methods + + void getPos(size_t n, PosType& xyz) const { + getPosFromOffset((this->*getOffset)(n), xyz); + } + + void getVelocity(size_t n, PosType& v) const { + getVelocityFromOffset((this->*getOffset)(n), v); + } + + void getRadius(size_t n, ScalarType& r) const { + getRadiusFromOffset((this->*getOffset)(n), r); + } + + // Offset access methods + + GA_Offset offsetFromIndex(size_t n) const { + return (this->*getOffset)(n); + } + + void getPosFromOffset(const GA_Offset offset, PosType& xyz) const { + const UT_Vector3 data = mPositionHandle.get(offset); + xyz[0] = ScalarType(data[0]); + xyz[1] = ScalarType(data[1]); + xyz[2] = ScalarType(data[2]); + } + + void getVelocityFromOffset(const GA_Offset offset, PosType& v) const { + const UT_Vector3 data = mVelocityHandle.get(offset); + v[0] = ScalarType(data[0]); + v[1] = ScalarType(data[1]); + v[2] = ScalarType(data[2]); + } + + void getRadiusFromOffset(const GA_Offset offset, ScalarType& r) const { + r = ScalarType(mRadiusHandle.get(offset)); + } + +private: + // Disallow copying + GU_VDBPointList(const GU_VDBPointList&); + GU_VDBPointList& operator=(const GU_VDBPointList&); + + GA_Offset (GU_VDBPointList::* getOffset)(const size_t) const; + + GA_Offset offsetFromGeoMap(const size_t n) const { + return mIndexMap->offsetFromIndex(GA_Index(n)); + } + + GA_Offset offsetFromGroupMap(const size_t n) const { + return mOffsets[n]; + } + + GA_Offset offsetFromIndexCast(const size_t n) const { + return GA_Offset(n); + } + + GA_ROHandleV3 mPositionHandle, mVelocityHandle; + GA_ROHandleF mRadiusHandle; + GA_IndexMap const * const mIndexMap; + std::vector mOffsets; + size_t mSize; +}; // GU_VDBPointList + + +//////////////////////////////////////// + + +// PointIndexGrid utility methods + + +namespace GU_VDBPointToolsInternal { + +template +struct IndexToOffsetOp { + IndexToOffsetOp(const PointArrayType& points): mPointList(&points) {} + + template + void operator()(LeafT &leaf, size_t /*leafIndex*/) const { + typename LeafT::IndexArray& indices = leaf.indices(); + for (size_t n = 0, N = indices.size(); n < N; ++n) { + indices[n] = typename LeafT::ValueType(mPointList->offsetFromIndex(GA_Index(indices[n]))); + } + } + PointArrayType const * const mPointList; +}; + +#if (UT_MAJOR_VERSION_INT >= 14) + +struct PackedMaskConstructor +{ + PackedMaskConstructor(const std::vector& prims, + const openvdb::math::Transform& xform) + : mPrims(prims.empty() ? NULL : &prims.front()) + , mXForm(xform) + , mMaskGrid(new openvdb::MaskGrid(false)) + { + mMaskGrid->setTransform(mXForm.copy()); + } + + PackedMaskConstructor(PackedMaskConstructor& rhs, tbb::split) + : mPrims(rhs.mPrims) + , mXForm(rhs.mXForm) + , mMaskGrid(new openvdb::MaskGrid(false)) + { + mMaskGrid->setTransform(mXForm.copy()); + } + + openvdb::MaskGrid::Ptr getMaskGrid() { return mMaskGrid; } + + void join(PackedMaskConstructor& rhs) { mMaskGrid->tree().topologyUnion(rhs.mMaskGrid->tree()); } + + void operator()(const tbb::blocked_range& range) + { + +#if (UT_MAJOR_VERSION_INT >= 15) + GU_PackedContext packedcontext; +#endif + + for (size_t n = range.begin(), N = range.end(); n < N; ++n) { + const GA_Primitive *prim = mPrims[n]; + if (!prim || !GU_PrimPacked::isPackedPrimitive(*prim)) continue; + + const GU_PrimPacked * pprim = static_cast(prim); + + GU_Detail tmpdetail; + const GU_Detail *detailtouse; + +#if (UT_MAJOR_VERSION_INT >= 15) + + GU_DetailHandleAutoReadLock readlock(pprim->getPackedDetail(packedcontext)); + + UT_Matrix4D mat; + pprim->getFullTransform4(mat); + if (mat.isIdentity() && readlock.isValid() && readlock.getGdp()) { + detailtouse = readlock.getGdp(); + } else { + pprim->unpackWithContext(tmpdetail, packedcontext); + detailtouse = &tmpdetail; + } +#else + pprim->unpack(tmpdetail); + detailtouse = &tmpdetail; +#endif + + GU_VDBPointList points(*detailtouse); + openvdb::MaskGrid::Ptr grid = openvdb::tools::createPointMaskGrid(points, mXForm); + mMaskGrid->tree().topologyUnion(grid->tree()); + } + } + +private: + GA_Primitive const * const * const mPrims; + openvdb::math::Transform mXForm; + openvdb::MaskGrid::Ptr mMaskGrid; +}; // struct PackedMaskConstructor + + +inline void +getPackedPrimitiveOffsets(const GU_Detail& detail, std::vector& primitives) +{ + const GA_Size numPacked = GU_PrimPacked::countPackedPrimitives(detail); + + primitives.clear(); + primitives.reserve(size_t(numPacked)); + + if (numPacked != GA_Size(0)) { + GA_Offset start, end; + GA_Range range = detail.getPrimitiveRange(); + const GA_PrimitiveList& primList = detail.getPrimitiveList(); + + for (GA_Iterator it = range.begin(); it.blockAdvance(start, end); ) { + for (GA_Offset off = start; off < end; ++off) { + + const GA_Primitive *prim = primList.get(off); + + if (prim && GU_PrimPacked::isPackedPrimitive(*prim)) { + primitives.push_back(prim); + } + } + } + } +} + +#endif + + +} // namespace GU_VDBPointToolsInternal + + +//////////////////////////////////////// + + +/// @brief Utility method to construct a GU_VDBPointList. +/// @details The GU_VDBPointList is compatible with the PointIndexGrid and ParticleAtals structures. +inline GU_VDBPointList::Ptr +GUvdbCreatePointList(const GU_Detail& detail, const GA_PointGroup* pointGroup = NULL) +{ + return GU_VDBPointList::create(detail, pointGroup); +} + + +/// @brief Utility method to change point indices into Houdini geometry offsets. +/// @note PointIndexGrid's that store Houdini geometry offsets are not +/// safe to write to disk, offsets are not guaranteed to be immutable +/// under defragmentation operations or I/O. +template +inline void +GUvdbConvertIndexToOffset(PointIndexTreeType& tree, const PointArrayType& points) +{ + openvdb::tree::LeafManager leafnodes(tree); + leafnodes.foreach(GU_VDBPointToolsInternal::IndexToOffsetOp(points)); +} + + +/// @brief Utility method to construct a PointIndexGrid. +/// @details The PointIndexGrid supports fast spatial queries for points. +inline openvdb::tools::PointIndexGrid::Ptr +GUvdbCreatePointIndexGrid( + const openvdb::math::Transform& xform, + const GU_Detail& detail, + const GA_PointGroup* pointGroup = NULL) +{ + GU_VDBPointList points(detail, pointGroup); + return openvdb::tools::createPointIndexGrid(points, xform); +} + + +/// @brief Utility method to construct a PointIndexGrid. +/// @details The PointIndexGrid supports fast spatial queries for points. +template +inline openvdb::tools::PointIndexGrid::Ptr +GUvdbCreatePointIndexGrid(const openvdb::math::Transform& xform, const PointArrayType& points) +{ + return openvdb::tools::createPointIndexGrid(points, xform); +} + + +/// @brief Utility method to construct a ParticleAtals. +/// @details The ParticleAtals supports fast spatial queries for particles. +template +inline openvdb::tools::ParticleIndexAtlas::Ptr +GUvdbCreateParticleAtlas(const double minVoxelSize, const ParticleArrayType& particles) +{ + typedef openvdb::tools::ParticleIndexAtlas ParticleIndexAtlas; + ParticleIndexAtlas::Ptr atlas(new ParticleIndexAtlas()); + + if (particles.hasRadius()) { + atlas->construct(particles, minVoxelSize); + } + + return atlas; +} + + +/// @brief Utility method to construct a boolean PointMaskGrid +/// @details This method supports packed points. +inline openvdb::MaskGrid::Ptr +GUvdbCreatePointMaskGrid( + const openvdb::math::Transform& xform, + const GU_Detail& detail, + const GA_PointGroup* pointGroup = NULL) +{ +#if (UT_MAJOR_VERSION_INT >= 14) + + std::vector packed; + GU_VDBPointToolsInternal::getPackedPrimitiveOffsets(detail, packed); + + if (!packed.empty()) { + GU_VDBPointToolsInternal::PackedMaskConstructor op(packed, xform); + tbb::parallel_reduce(tbb::blocked_range(0, packed.size()), op); + return op.getMaskGrid(); + } + +#endif + + GU_VDBPointList points( detail, pointGroup ); + return openvdb::tools::createPointMaskGrid( points, xform ); +} + + +/// @brief Utility method to construct a PointIndexGrid that stores +/// Houdini geometry offsets. +/// +/// @note PointIndexGrid's that store Houdini geometry offsets are not +/// safe to write to disk, offsets are not guaranteed to be immutable +/// under defragmentation operations or I/O. +inline openvdb::tools::PointIndexGrid::Ptr +GUvdbCreatePointOffsetGrid( + const openvdb::math::Transform& xform, + const GU_Detail& detail, + const GA_PointGroup* pointGroup = NULL) +{ + GU_VDBPointList points(detail, pointGroup); + + openvdb::tools::PointIndexGrid::Ptr grid = + openvdb::tools::createPointIndexGrid(points, xform); + + GUvdbConvertIndexToOffset(grid->tree(), points); + + return grid; +} + + +#endif // __GU_VDBPOINTTOOLS_H_HAS_BEEN_INCLUDED__ + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb_houdini/GeometryUtil.h b/nuparu/include/openvdb/include/openvdb_houdini/GeometryUtil.h new file mode 100644 index 00000000..b4e26b9f --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_houdini/GeometryUtil.h @@ -0,0 +1,360 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file GeometryUtil.h +/// @author FX R&D Simulation team +/// @brief Utility methods and tools for geometry processing + +#ifndef OPENVDB_HOUDINI_GEOMETRY_UTIL_HAS_BEEN_INCLUDED +#define OPENVDB_HOUDINI_GEOMETRY_UTIL_HAS_BEEN_INCLUDED + +#include +#include // for openvdb::tools::MeshToVoxelEdgeData +#include +#include // for openvdb::util::COORD_OFFSETS + +#include +#include +#include + + +class GA_SplittableRange; +class OBJ_Camera; +class OP_Context; +class OP_Node; + + +#ifdef SESI_OPENVDB + #ifdef OPENVDB_HOUDINI_API + #undef OPENVDB_HOUDINI_API + #define OPENVDB_HOUDINI_API + #endif +#endif + + +namespace openvdb_houdini { + +class Interrupter; + + +/// Add geometry to the given detail to indicate the extents of a frustum transform. +OPENVDB_HOUDINI_API +void +drawFrustum(GU_Detail&, const openvdb::math::Transform&, + const UT_Vector3* boxColor, const UT_Vector3* tickColor, + bool shaded, bool drawTicks = true); + + +/// Construct a frustum transform from a Houdini camera. +OPENVDB_HOUDINI_API +openvdb::math::Transform::Ptr +frustumTransformFromCamera( + OP_Node&, OP_Context&, OBJ_Camera&, + float offset, float nearPlaneDist, float farPlaneDist, + float voxelDepthSize = 1.0, int voxelCountX = 100); + + +//////////////////////////////////////// + + +/// @brief Return @c true if the point at the given offset is referenced +/// by primitives from a certain primitive group. +OPENVDB_HOUDINI_API +bool +pointInPrimGroup(GA_Offset ptnOffset, GU_Detail&, const GA_PrimitiveGroup&); + + +//////////////////////////////////////// + + +/// @brief Convert geometry to quads and triangles. +/// +/// @return a pointer to a new GU_Detail object if the geometry was +/// converted or subdivided, otherwise a null pointer +OPENVDB_HOUDINI_API +boost::shared_ptr +validateGeometry(const GU_Detail& geometry, std::string& warning, Interrupter*); + + +//////////////////////////////////////// + + +/// TBB body object for threaded world to voxel space transformation and copy of points +class OPENVDB_HOUDINI_API TransformOp +{ +public: + TransformOp(GU_Detail const * const gdp, + const openvdb::math::Transform& transform, + std::vector& pointList); + + void operator()(const GA_SplittableRange&) const; + +private: + GU_Detail const * const mGdp; + const openvdb::math::Transform& mTransform; + std::vector* const mPointList; +}; + + +//////////////////////////////////////// + + +/// @brief TBB body object for threaded primitive copy +/// @details Produces a primitive-vertex index list. +class OPENVDB_HOUDINI_API PrimCpyOp +{ +public: + PrimCpyOp(GU_Detail const * const gdp, std::vector& primList); + void operator()(const GA_SplittableRange&) const; + +private: + GU_Detail const * const mGdp; + std::vector* const mPrimList; +}; + + +//////////////////////////////////////// + + +/// @brief TBB body object for threaded vertex normal generation +/// @details Averages face normals from all similarly oriented primitives, +/// that share the same vertex-point, to maintain sharp features. +class OPENVDB_HOUDINI_API VertexNormalOp +{ +public: + VertexNormalOp(GU_Detail&, const GA_PrimitiveGroup* interiorPrims = NULL, float angle = 0.7f); + void operator()(const GA_SplittableRange&) const; + +private: + bool isInteriorPrim(GA_Offset primOffset) const + { + return mInteriorPrims && mInteriorPrims->containsIndex( + mDetail.primitiveIndex(primOffset)); + } + + const GU_Detail& mDetail; + const GA_PrimitiveGroup* mInteriorPrims; + GA_RWHandleV3 mNormalHandle; + const float mAngle; +}; + + +//////////////////////////////////////// + + +/// TBB body object for threaded sharp feature construction +class OPENVDB_HOUDINI_API SharpenFeaturesOp +{ +public: + typedef openvdb::tools::MeshToVoxelEdgeData EdgeData; + + SharpenFeaturesOp(GU_Detail& meshGeo, const GU_Detail& refGeo, EdgeData& edgeData, + const openvdb::math::Transform& xform, const GA_PrimitiveGroup* surfacePrims = NULL, + const openvdb::BoolTree* mask = NULL); + + void operator()(const GA_SplittableRange&) const; + +private: + GU_Detail& mMeshGeo; + const GU_Detail& mRefGeo; + EdgeData& mEdgeData; + const openvdb::math::Transform& mXForm; + const GA_PrimitiveGroup* mSurfacePrims; + const openvdb::BoolTree* mMaskTree; +}; + + +//////////////////////////////////////// + + +/// TBB body object for threaded sharp feature construction +template +class GenAdaptivityMaskOp +{ +public: + typedef openvdb::tree::LeafManager BoolLeafManager; + + GenAdaptivityMaskOp(const GU_Detail& refGeo, + const IndexTreeType& indexTree, BoolLeafManager&, float edgetolerance = 0.0); + + void run(bool threaded = true); + + void operator()(const tbb::blocked_range&) const; + +private: + const GU_Detail& mRefGeo; + const IndexTreeType& mIndexTree; + BoolLeafManager& mLeafs; + float mEdgeTolerance; +}; + + +template +GenAdaptivityMaskOp::GenAdaptivityMaskOp(const GU_Detail& refGeo, + const IndexTreeType& indexTree, BoolLeafManager& leafMgr, float edgetolerance) + : mRefGeo(refGeo) + , mIndexTree(indexTree) + , mLeafs(leafMgr) + , mEdgeTolerance(edgetolerance) +{ + mEdgeTolerance = std::max(0.0f, mEdgeTolerance); + mEdgeTolerance = std::min(1.0f, mEdgeTolerance); +} + + +template +void +GenAdaptivityMaskOp::run(bool threaded) +{ + if (threaded) { + tbb::parallel_for(mLeafs.getRange(), *this); + } else { + (*this)(mLeafs.getRange()); + } +} + + +template +void +GenAdaptivityMaskOp::operator()( + const tbb::blocked_range& range) const +{ + typedef typename openvdb::tree::ValueAccessor IndexAccessorType; + IndexAccessorType idxAcc(mIndexTree); + + UT_Vector3 tmpN, normal; + GA_Offset primOffset; + int tmpIdx; + + openvdb::Coord ijk, nijk; + typename BoolTreeType::LeafNodeType::ValueOnIter iter; + + for (size_t n = range.begin(); n < range.end(); ++n) { + iter = mLeafs.leaf(n).beginValueOn(); + for (; iter; ++iter) { + ijk = iter.getCoord(); + + bool edgeVoxel = false; + + int idx = idxAcc.getValue(ijk); + + primOffset = mRefGeo.primitiveOffset(idx); + normal = mRefGeo.getGEOPrimitive(primOffset)->computeNormal(); + + for (size_t i = 0; i < 18; ++i) { + nijk = ijk + openvdb::util::COORD_OFFSETS[i]; + if (idxAcc.probeValue(nijk, tmpIdx) && tmpIdx != idx) { + primOffset = mRefGeo.primitiveOffset(tmpIdx); + tmpN = mRefGeo.getGEOPrimitive(primOffset)->computeNormal(); + + if (normal.dot(tmpN) < mEdgeTolerance) { + edgeVoxel = true; + break; + } + } + } + + if (!edgeVoxel) iter.setValueOff(); + } + } +} + + +} // namespace openvdb_houdini + + +//////////////////////////////////////// + + +#if (UT_VERSION_INT < 0x0c0500F5) // Prior to 12.5.245 + +// Symbols in namespace GU_Convert_H12_5 were added to GU_ConvertParms.h in 12.5.245 + +namespace GU_Convert_H12_5 { + +/// Simple helper class for tracking a range of new primitives and points +class GU_ConvertMarker +{ +public: + GU_ConvertMarker(const GA_Detail &geo) + : myGeo(geo) + , myPrimBegin(primOff()) + , myPtBegin(ptOff()) + { + } + + GA_Range getPrimitives() const + { + return GA_Range(myGeo.getPrimitiveMap(), myPrimBegin, primOff()); + } + GA_Range getPoints() const + { + return GA_Range(myGeo.getPointMap(), myPtBegin, ptOff()); + } + + GA_Offset primitiveBegin() const { return myPrimBegin; } + GA_Offset pointBegin() const { return myPtBegin; } + + GA_Size numPrimitives() const { return primOff() - myPrimBegin; } + GA_Size numPoints() const { return ptOff() - myPtBegin; } + +private: + GA_Offset primOff() const { return myGeo.getPrimitiveMap().lastOffset() + 1; } + GA_Offset ptOff() const { return myGeo.getPointMap().lastOffset() + 1; } + +private: + const GA_Detail& myGeo; + GA_Offset myPrimBegin; + GA_Offset myPtBegin; +}; + + +OPENVDB_HOUDINI_API +void +GUconvertCopySingleVertexPrimAttribsAndGroups( + GU_ConvertParms &parms, + const GA_Detail &src, + GA_Offset src_primoff, + GA_Detail &dst, + const GA_Range &dst_prims, + const GA_Range &dst_points); + +} // namespace GU_Convert_H12_5 + +using GU_Convert_H12_5::GU_ConvertMarker; +using GU_Convert_H12_5::GUconvertCopySingleVertexPrimAttribsAndGroups; + +#endif // Prior to 12.5.245 + +#endif // OPENVDB_HOUDINI_GEOMETRY_UTIL_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb_houdini/SOP_NodeVDB.h b/nuparu/include/openvdb/include/openvdb_houdini/SOP_NodeVDB.h new file mode 100644 index 00000000..4d6015a6 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_houdini/SOP_NodeVDB.h @@ -0,0 +1,230 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file SOP_NodeVDB.h +/// @author FX R&D OpenVDB team +/// @brief Base class for OpenVDB plugins + +#ifndef OPENVDB_HOUDINI_SOP_NODEVDB_HAS_BEEN_INCLUDED +#define OPENVDB_HOUDINI_SOP_NODEVDB_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#ifndef SESI_OPENVDB +#include +#endif +#include + + +class GU_Detail; + +namespace openvdb_houdini { + +/// @brief Use this class to register a new OpenVDB operator (SOP, POP, etc.) +/// @details This class ensures that the operator uses the appropriate OpPolicy. +/// @sa houdini_utils::OpFactory, houdini_utils::OpPolicy +class OPENVDB_HOUDINI_API OpenVDBOpFactory: public houdini_utils::OpFactory +{ +public: + /// Construct an OpFactory that on destruction registers a new OpenVDB operator type. + OpenVDBOpFactory(const std::string& english, OP_Constructor, houdini_utils::ParmList&, + OP_OperatorTable&, houdini_utils::OpFactory::OpFlavor = SOP); +}; + + +class OPENVDB_HOUDINI_API DWAOpenVDBOpFactory: public OpenVDBOpFactory +{ +public: + /// @brief Construct an OpFactory that on destruction registers a new + /// OpenVDB operator type using the DreamWorks naming convention. + /// @deprecated Use OpenVDBOpFactory instead. + OPENVDB_DEPRECATED + DWAOpenVDBOpFactory(const std::string& english, OP_Constructor ctor, + houdini_utils::ParmList& plist, OP_OperatorTable& optable, + houdini_utils::OpFactory::OpFlavor flavor = SOP) + : OpenVDBOpFactory(english, ctor, plist, optable, flavor) + { + } +}; + + +//////////////////////////////////////// + + +/// @brief Base class from which to derive OpenVDB-related Houdini SOPs +class OPENVDB_HOUDINI_API SOP_NodeVDB: public SOP_Node +{ +public: + SOP_NodeVDB(OP_Network*, const char*, OP_Operator*); + virtual ~SOP_NodeVDB() {} + + virtual void fillInfoTreeNodeSpecific(UT_InfoTree&, fpreal time); + virtual void getNodeSpecificInfoText(OP_Context&, OP_NodeInfoParms&); + +protected: + virtual OP_ERROR cookMyGuide1(OP_Context&); + //virtual OP_ERROR cookMyGuide2(OP_Context&); + + /// @brief Retrieve a group from a geometry detail by parsing a pattern + /// (typically, the value of a Group parameter belonging to this node). + /// @throw std::runtime_error if the pattern is nonempty but doesn't match any group. + /// @todo This is a wrapper for SOP_Node::parsePrimitiveGroups(), so it needs access + /// to a SOP_Node instance. But it probably doesn't need to be a SOP_NodeVDB method. + const GA_PrimitiveGroup* matchGroup(GU_Detail&, const std::string& pattern); + + //@{ + /// @brief Evaluate a vector-valued parameter. + openvdb::Vec3f evalVec3f(const char* name, fpreal time) const; + openvdb::Vec3R evalVec3R(const char* name, fpreal time) const; + openvdb::Vec3i evalVec3i(const char* name, fpreal time) const; + openvdb::Vec2R evalVec2R(const char* name, fpreal time) const; + openvdb::Vec2i evalVec2i(const char* name, fpreal time) const; + //@} + + /// @brief Transfer the value of an obsolete parameter that was renamed + /// to the parameter with the new name. + /// @details This convenience method is intended to be called from + /// @c resolveObsoleteParms(), when that function is implemented. + void resolveRenamedParm(PRM_ParmList& obsoleteParms, + const char* oldName, const char* newName); + + + /// @brief Steal the geometry on the specified input if possible, instead of copying the data. + /// + /// @details In certain cases where a node's input geometry isn't being shared with + /// other nodes, it is safe for the node to directly modify the geometry. + /// Normally, input geometry is shared with the upstream node's output cache, + /// so for stealing to be possible, the "unload" flag must be set on the upstream node + /// to inhibit caching. In addition, reference counting of GEO_PrimVDB shared pointers + /// ensures we cannot steal data that is in use elsewhere. When stealing is not possible, + /// this method falls back to copying the shared pointer, effectively performing + /// a duplicateSource(). + /// + /// @param index the index of the input from which to perform this operation + /// @param context the current SOP context is used for cook time for network traversal + /// @param pgdp pointer to the SOP's gdp + /// @param gdh handle to manage input locking + /// @param clean (forwarded to duplicateSource()) + /// + /// @note Prior to Houdini 13.0, this method peforms a duplicateSource() and unlocks the + /// inputs to the SOP. From Houdini 13.0 on, this method will insert the existing data + /// into the detail and update the detail handle in the SOP. + /// + /// @warning No attempt to call duplicateSource() or inputGeo() should be made after + /// calling this method, as there will be no data on the input stream if isSourceStealable() + /// returns @c true. + OP_ERROR duplicateSourceStealable(const unsigned index, + OP_Context& context, GU_Detail **pgdp, GU_DetailHandle& gdh, bool clean = true); + + + /// @brief Steal the geometry on the specified input if possible, instead of copying the data. + /// + /// @details In certain cases where a node's input geometry isn't being shared with + /// other nodes, it is safe for the node to directly modify the geometry. + /// Normally, input geometry is shared with the upstream node's output cache, + /// so for stealing to be possible, the "unload" flag must be set on the upstream node + /// to inhibit caching. In addition, reference counting of GEO_PrimVDB shared pointers + /// ensures we cannot steal data that is in use elsewhere. When stealing is not possible, + /// this method falls back to copying the shared pointer, effectively performing + /// a duplicateSource(). + /// + /// @note Prior to Houdini 13.0, this method peforms a duplicateSource() and unlocks the + /// inputs to the SOP. From Houdini 13.0 on, this method will insert the existing data + /// into the detail and update the detail handle in the SOP. + /// + /// @param index the index of the input from which to perform this operation + /// @param context the current SOP context is used for cook time for network traversal + OP_ERROR duplicateSourceStealable(const unsigned index, OP_Context& context); + +private: + + /// @brief Traverse the upstream network to determine if the source input can be stolen. + /// + /// An upstream SOP cannot be stolen if it is implicitly caching the data (no "unload" flag) + /// or explictly caching the data (using a Cache SOP) + /// + /// The traversal ignores pass through nodes such as null SOPs and bypassing. + /// + /// @param index the index of the input from which to perform this operation + /// @param context the current SOP context is used for cook time for network traversal + bool isSourceStealable(const unsigned index, OP_Context& context) const; +}; + + +//////////////////////////////////////// + + +/// @brief Namespace to hold functionality for registering info text callbacks. Whenever +/// getNodeSpecificInfoText() is called, the default info text is added to MMB output unless +/// a valid callback has been registered for the grid type. +/// +/// @details Use node_info_text::registerGridSpecificInfoText<> to register a grid type to +/// a function pointer which matches the ApplyGridSpecificInfoText signature. +/// +/// void floatGridText(std::ostream&, const openvdb::GridBase&); +/// +/// node_info_text::registerGridSpecificInfoText(&floatGridText); +/// +namespace node_info_text +{ + // The function pointer signature expected when registering an grid type text + // callback. The grid is passed untyped but is guaranteed to match the registered + // type. + typedef void (*ApplyGridSpecificInfoText)(std::ostream&, const openvdb::GridBase&); + + /// @brief Register an info text callback to a specific grid type. + /// @note Does not add the callback if the grid type already has a registered callback. + /// @param gridType the grid type as a unique string (see templated + /// registerGridSpecificInfoText<>) + /// @param callback a pointer to the callback function to execute + void registerGridSpecificInfoText(const std::string& gridType, + ApplyGridSpecificInfoText callback); + + /// @brief Register an info text callback to a templated grid type. + /// @note Does not add the callback if the grid type already has a registered callback. + /// @param callback a pointer to the callback function to execute + template + inline void registerGridSpecificInfoText(ApplyGridSpecificInfoText callback) + { + registerGridSpecificInfoText(GridType::gridType(), callback); + } + +} // namespace node_info_text + + +} // namespace openvdb_houdini + +#endif // OPENVDB_HOUDINI_SOP_NODEVDB_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb_houdini/SOP_NodeVDBPoints.h b/nuparu/include/openvdb/include/openvdb_houdini/SOP_NodeVDBPoints.h new file mode 100644 index 00000000..ebbfc066 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_houdini/SOP_NodeVDBPoints.h @@ -0,0 +1,272 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015-2016 Double Negative Visual Effects +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of Double Negative Visual Effects 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file SOP_NodeVDB.h +/// +/// @author Dan Bailey +/// +/// @brief Base class for OpenVDB Points plugins + + +#ifndef OPENVDB_HOUDINI_SOP_NODEVDB_POINTS_HAS_BEEN_INCLUDED +#define OPENVDB_HOUDINI_SOP_NODEVDB_POINTS_HAS_BEEN_INCLUDED + +#include +#include +#include +#include + +#include +#include + +#include + +#include // for starts_with + +#include +#include +#include // for dynamic cast + +#ifndef SESI_OPENVDB +#include +#endif + + +class GU_Detail; + +namespace { + +template +std::string addDigitSeparators(T value) +{ + std::stringstream ss; + ss.imbue(std::locale("")); + ss << std::fixed << value; + return ss.str(); +} + +} // namespace + +namespace openvdb_houdini { + +/// @brief Base class from which to derive OpenVDB Points-related Houdini SOPs +class OPENVDB_HOUDINI_API SOP_NodeVDBPoints: public SOP_NodeVDB +{ +public: + SOP_NodeVDBPoints(OP_Network* network, const char* name, OP_Operator* op) + : SOP_NodeVDB(network, name, op) { } + virtual ~SOP_NodeVDBPoints() { } + + void + getNodeSpecificInfoText(OP_Context &context, OP_NodeInfoParms &parms) + { + SOP_Node::getNodeSpecificInfoText(context, parms); + + #ifdef SESI_OPENVDB + // Nothing needed since we will report it as part of native prim info + #else + // Get a handle to the geometry. + GU_DetailHandle gd_handle = getCookedGeoHandle(context); + + // Check if we have a valid detail handle. + if (gd_handle.isNull()) return; + + // Lock it for reading. + GU_DetailHandleAutoReadLock gd_lock(gd_handle); + // Finally, get at the actual GU_Detail. + const GU_Detail* tmp_gdp = gd_lock.getGdp(); + + std::ostringstream infoStr; + + unsigned gridn = 0; + for (VdbPrimCIterator it(tmp_gdp); it; ++it) { + + const openvdb::GridBase& grid = it->getGrid(); + + // ignore openvdb point grids + if (dynamic_cast(&grid)) continue; + + openvdb::Coord dim = grid.evalActiveVoxelDim(); + const UT_String gridName = it.getPrimitiveName(); + + infoStr << " "; + infoStr << "(" << it.getIndex() << ")"; + if (gridName.isstring()) infoStr << " name: '" << gridName << "',"; + infoStr << " voxel size: " << grid.transform().voxelSize()[0] << ","; + infoStr << " type: "<< grid.valueType() << ","; + + if (grid.activeVoxelCount() != 0) { + infoStr << " dim: " << dim[0] << "x" << dim[1] << "x" << dim[2]; + } else { + infoStr <<" "; + } + + infoStr<<"\n"; + + ++gridn; + } + + if (gridn > 0) { + std::ostringstream headStr; + headStr << gridn << " VDB grid" << (gridn == 1 ? "" : "s") << "\n"; + + parms.append(headStr.str().c_str()); + parms.append(infoStr.str().c_str()); + } + #endif + + + // VDB points info (to be included in native VDB primitive) + + // Get a handle to the geometry. + GU_DetailHandle gd_handle_pts = getCookedGeoHandle(context); + + // Check if we have a valid detail handle. + if (gd_handle_pts.isNull()) return; + + // Lock it for reading. + GU_DetailHandleAutoReadLock gd_lock_pts(gd_handle_pts); + // Finally, get at the actual GU_Detail. + const GU_Detail* tmp_gdp_pts = gd_lock_pts.getGdp(); + + std::ostringstream infoStr_pts; + + unsigned gridn_pts = 0; + for (VdbPrimCIterator it(tmp_gdp_pts); it; ++it) { + + const openvdb::GridBase& grid = it->getGrid(); + const UT_String gridName = it.getPrimitiveName(); + + infoStr_pts << " "; + infoStr_pts << "(" << it.getIndex() << ")"; + if (gridName.isstring()) infoStr_pts << " name: '" << gridName << "',"; + + typedef openvdb::tools::PointDataGrid PointDataGrid; + typedef openvdb::tools::PointDataTree PointDataTree; + typedef openvdb::tools::AttributeSet AttributeSet; + + const PointDataGrid* pointDataGrid = dynamic_cast(&grid); + + if (!pointDataGrid) continue; + + const PointDataTree& pointDataTree = pointDataGrid->tree(); + + PointDataTree::LeafCIter iter = pointDataTree.cbeginLeaf(); + + const openvdb::Index64 count = pointCount(pointDataTree); + + infoStr_pts << " count: " << addDigitSeparators(count) << ","; + + if (!iter.getLeaf()) { + infoStr_pts << " attributes: "; + infoStr_pts << ""; + } + else { + const AttributeSet::DescriptorPtr& descriptor = iter->attributeSet().descriptorPtr(); + + infoStr_pts << " groups: "; + + const AttributeSet::Descriptor::NameToPosMap& groupMap = descriptor->groupMap(); + + bool first = true; + for (AttributeSet::Descriptor::ConstIterator it = groupMap.begin(), it_end = groupMap.end(); + it != it_end; ++it) { + if (first) { + first = false; + } + else { + infoStr_pts << ", "; + } + + infoStr_pts << it->first << "("; + + infoStr_pts << addDigitSeparators(groupPointCount(pointDataTree, it->first)); + + infoStr_pts << ")"; + } + + if (first) infoStr_pts << ""; + + infoStr_pts << ","; + + infoStr_pts << " attributes: "; + + const AttributeSet::Descriptor::NameToPosMap& nameToPosMap = descriptor->map(); + + first = true; + for (AttributeSet::Descriptor::ConstIterator it = nameToPosMap.begin(), it_end = nameToPosMap.end(); + it != it_end; ++it) { + const openvdb::tools::AttributeArray& array = iter->attributeArray(it->second); + if (openvdb::tools::GroupAttributeArray::isGroup(array)) continue; + + if (first) { + first = false; + } + else { + infoStr_pts << ", "; + } + const openvdb::NamePair& type = descriptor->type(it->second); + + // if no value compression, hide the codec from the middle-click output + + if (boost::starts_with(type.second, "null_") && + boost::ends_with(type.second, type.first)) { + infoStr_pts << it->first << "[" << type.first << "]"; + } + else { + infoStr_pts << it->first << "[" << type.first << "_" << type.second << "]"; + } + } + + if (first) infoStr_pts << ""; + } + + infoStr_pts << "\n"; + + ++gridn_pts; + } + + if (gridn_pts > 0) { + std::ostringstream headStr; + headStr << gridn_pts << " VDB points" << "\n"; + + parms.append(headStr.str().c_str()); + parms.append(infoStr_pts.str().c_str()); + } + } +}; + +} // namespace openvdb_houdini + +#endif // OPENVDB_HOUDINI_SOP_NODEVDB_POINTS_HAS_BEEN_INCLUDED + +// Copyright (c) 2015-2016 Double Negative Visual Effects +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb_houdini/UT_VDBTools.h b/nuparu/include/openvdb/include/openvdb_houdini/UT_VDBTools.h new file mode 100644 index 00000000..a4ffe67d --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_houdini/UT_VDBTools.h @@ -0,0 +1,203 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file UT_VDBTools.h +/// @author FX R&D Simulation team +/// @brief Less commonly-used utility classes and functions for OpenVDB plugins + +#ifndef OPENVDB_HOUDINI_UT_VDBTOOLS_HAS_BEEN_INCLUDED +#define OPENVDB_HOUDINI_UT_VDBTOOLS_HAS_BEEN_INCLUDED + +#include +#include +#include "Utils.h" // for GridPtr + +namespace openvdb_houdini { + +/// @brief GridTransformOp is a functor class for use with UTvdbProcessTypedGrid() +/// that samples an input grid into an output grid of the same type through +/// a given affine transform. +/// @details The output grid's transform is unchanged by this operation. +/// @sa GridResampleOp, GridResampleToMatchOp +/// @par Example: +/// @code +/// const Grid& inGrid = ...; // generic reference to a grid of any type +/// +/// // Create a new, empty output grid of the same (so far, unknown) type +/// // as the input grid and with the same transform and metadata. +/// GridPtr outGrid = inGrid.copyGrid(openvdb::CP_NEW); +/// +/// // Initialize a GridTransformer with the parameters of an affine transform. +/// openvdb::tools::GridTransformer xform(pivot, scale, rotate, ...); +/// +/// // Resolve the input grid's type and resample it into the output grid, +/// // using a second-order sampling kernel. +/// GridTransformOp op(outGrid, xform); +/// UTvdbProcessTypedGrid(UTvdbGetGridType(inGrid), inGrid, op); +/// @endcode +template +class GridTransformOp +{ +public: + /// @param outGrid a generic pointer to an output grid of the same type + /// as the grid to be resampled + /// @param t a @c GridTransformer that defines an affine transform + /// @note GridTransformOp makes an internal copy of the @c GridTransformer + /// and supplies the copy with a default Interrupter that replaces any + /// existing interrupter. + GridTransformOp(GridPtr& outGrid, const openvdb::tools::GridTransformer& t): + mOutGrid(outGrid), mTransformer(t) {} + + template + void operator()(const GridType& inGrid) + { + typename GridType::Ptr outGrid = openvdb::gridPtrCast(mOutGrid); + + Interrupter interrupter; + mTransformer.setInterrupter(interrupter); + + mTransformer.transformGrid(inGrid, *outGrid); + } + +private: + GridPtr mOutGrid; + openvdb::tools::GridTransformer mTransformer; +}; + + +//////////////////////////////////////// + + +/// @brief GridResampleOp is a functor class for use with processTypedGrid() +/// that samples an input grid into an output grid of the same type through +/// a given transform. +/// @details The output grid's transform is unchanged by this operation. +/// @sa GridTransformOp, GridResampleToMatchOp +/// @par Example: +/// @code +/// namespace { +/// // Class that implements GridResampler's Transformer interface +/// struct MyXform +/// { +/// bool isAffine() const { ... } +/// openvdb::Vec3d transform(const openvdb::Vec3d&) const { ... } +/// openvdb::Vec3d invTransform(const openvdb::Vec3d&) const { ... } +/// }; +/// } +/// +/// const Grid& inGrid = ...; // generic reference to a grid of any type +/// +/// // Create a new, empty output grid of the same (so far, unknown) type +/// // as the input grid and with the same transform and metadata. +/// GridPtr outGrid = inGrid.copyGrid(openvdb::CP_NEW); +/// +/// // Resolve the input grid's type and resample it into the output grid, +/// // using a trilinear sampling kernel. +/// GridResampleOp op(outGrid, MyXform()); +/// processTypedGrid(inGrid, op); +/// @endcode +template +class GridResampleOp +{ +public: + /// @param outGrid a generic pointer to an output grid of the same type + /// as the grid to be resampled + /// @param t an object that implements GridResampler's + /// Transformer interface + /// @note GridResampleOp makes an internal copy of @a t. + GridResampleOp(GridPtr& outGrid, const TransformerType& t): + mOutGrid(outGrid), mTransformer(t) {} + + template + void operator()(const GridType& inGrid) + { + typename GridType::Ptr outGrid = openvdb::gridPtrCast(mOutGrid); + + openvdb::tools::GridResampler resampler; + + Interrupter interrupter; + resampler.setInterrupter(interrupter); + + resampler.transformGrid(mTransformer, inGrid, *outGrid); + } + +private: + GridPtr mOutGrid; + const TransformerType mTransformer; +}; + + +//////////////////////////////////////// + + +/// @brief GridResampleToMatchOp is a functor class for use with +/// UTvdbProcessTypedGrid() that samples an input grid into an output grid +/// of the same type such that, after resampling, the input and output grids +/// coincide, but the output grid's transform is unchanged. +/// @sa GridTransformOp, GridResampleOp +/// @par Example: +/// @code +/// const Grid& inGrid = ...; // generic reference to a grid of any type +/// +/// // Create a new, empty output grid of the same (so far, unknown) type as +/// // the input grid and with the same metadata, but with a different transform. +/// GridPtr outGrid = inGrid.copyGrid(openvdb::CP_NEW); +/// outGrid->setTransform(myTransform); +/// +/// // Resolve the input grid's type and resample it into the output grid, +/// // using a second-order sampling kernel. +/// GridResampleToMatchOp op(outGrid); +/// UTvdbProcessTypedGrid(UTvdbGetGridType(inGrid), inGrid, op); +/// @endcode +template +class GridResampleToMatchOp +{ +public: + GridResampleToMatchOp(GridPtr outGrid): mOutGrid(outGrid) {} + + template + void operator()(const GridType& inGrid) + { + typename GridType::Ptr outGrid = openvdb::gridPtrCast(mOutGrid); + Interrupter interrupter; + openvdb::tools::resampleToMatch(inGrid, *outGrid, interrupter); + } + +private: + GridPtr mOutGrid; +}; + +} // namespace openvdb_houdini + +#endif // OPENVDB_HOUDINI_UT_VDBTOOLS_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb_houdini/UT_VDBUtils.h b/nuparu/include/openvdb/include/openvdb_houdini/UT_VDBUtils.h new file mode 100644 index 00000000..0b1f9cc2 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_houdini/UT_VDBUtils.h @@ -0,0 +1,706 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +/* + * PROPRIETARY INFORMATION. This software is proprietary to + * Side Effects Software Inc., and is not to be reproduced, + * transmitted, or disclosed in any way without written permission. + * + * Produced by: + * Adrian Saldanha + * Side Effects Software Inc. + * 123 Front Street West, Suite 1401 + * Toronto, Ontario + * Canada M5J 2M2 + * 416-366-4607 + */ + +#include +#if !defined(SESI_OPENVDB) && (UT_VERSION_INT >= 0x0c050157) // 12.5.343 or later + +#include + +#else // earlier than 12.5.343 + +#ifndef __HDK_UT_VDBUtils__ +#define __HDK_UT_VDBUtils__ + +enum UT_VDBType +{ + UT_VDB_INVALID, + UT_VDB_FLOAT, + UT_VDB_DOUBLE, + UT_VDB_INT32, + UT_VDB_INT64, + UT_VDB_BOOL, + UT_VDB_VEC3F, + UT_VDB_VEC3D, + UT_VDB_VEC3I, +}; + +#include + +#include +#include +#include +#include +#include +#include + +#include + + +#if (UT_VERSION_INT < 0x0c010072) // 12.1.114 or earlier +#define UTverify_cast static_cast +#endif + + +/// Calls openvdb::initialize() +inline void UTvdbInitialize() { openvdb::initialize(); } + +/// Find the UT_VDBType from a grid +inline UT_VDBType +UTvdbGetGridType(const openvdb::GridBase &grid) +{ + if (grid.isType()) + return UT_VDB_FLOAT; + if (grid.isType()) + return UT_VDB_DOUBLE; + if (grid.isType()) + return UT_VDB_INT32; + if (grid.isType()) + return UT_VDB_INT64; + if (grid.isType()) + return UT_VDB_BOOL; + if (grid.isType()) + return UT_VDB_VEC3F; + if (grid.isType()) + return UT_VDB_VEC3D; + if (grid.isType()) + return UT_VDB_VEC3I; + + return UT_VDB_INVALID; +} + +/// Return the string representation of a grid's underlying value type +inline const char * +UTvdbGetGridTypeString(const openvdb::GridBase &grid) +{ + switch(UTvdbGetGridType(grid)) + { + case UT_VDB_FLOAT: + return "float"; + case UT_VDB_DOUBLE: + return "double"; + case UT_VDB_INT32: + return "int32"; + case UT_VDB_INT64: + return "int64"; + case UT_VDB_BOOL: + return "bool"; + case UT_VDB_VEC3F: + return "Vec3f"; + case UT_VDB_VEC3D: + return "Vec3d"; + case UT_VDB_VEC3I: + return "Vec3i"; + default: + return "invalid type"; + } +} + +/// Returns the tuple size of a grid given its value type. +inline int +UTvdbGetGridTupleSize(UT_VDBType type) +{ + switch(type) + { + case UT_VDB_FLOAT: + case UT_VDB_DOUBLE: + case UT_VDB_INT32: + case UT_VDB_INT64: + case UT_VDB_BOOL: + return 1; + + case UT_VDB_VEC3F: + case UT_VDB_VEC3D: + case UT_VDB_VEC3I: + return 3; + + case UT_VDB_INVALID: + default: + break; + } + + return 0; +} + +/// Returns the tuple size of a grid +inline int +UTvdbGetGridTupleSize(const openvdb::GridBase &grid) +{ + return UTvdbGetGridTupleSize(UTvdbGetGridType(grid)); +} + +/// Special plusEqual class to avoid bool warnings +/// @{ +template +struct UT_VDBMath +{ + static void plusEqual(T &lhs, const T &rhs) + { lhs += rhs; } +}; +template <> +struct UT_VDBMath +{ + static void plusEqual(bool &lhs, const bool &rhs) + { lhs = lhs | rhs; } +}; +/// @} + +/// Helpers for downcasting to a specific grid type +/// @{ +template +inline const GridType * +UTvdbGridCast(const openvdb::GridBase *grid) + { return UTverify_cast(grid); } + +template +inline GridType * +UTvdbGridCast(openvdb::GridBase *grid) + { return UTverify_cast(grid); } + +template +inline const GridType & +UTvdbGridCast(const openvdb::GridBase &grid) + { return *UTverify_cast(&grid); } + +template +inline GridType & +UTvdbGridCast(openvdb::GridBase &grid) + { return *UTverify_cast(&grid); } + +template +inline typename GridType::ConstPtr +UTvdbGridCast(openvdb::GridBase::ConstPtr grid) + { return openvdb::gridConstPtrCast(grid); } + +template +inline typename GridType::Ptr +UTvdbGridCast(openvdb::GridBase::Ptr grid) + { return openvdb::gridPtrCast(grid); } +/// @} + +//////////////////////////////////////// + +namespace UT_VDBUtils { + +// Helper function used internally by UTvdbProcessTypedGrid() +// to instantiate a templated functor for a specific grid type +// and then to call the functor with a grid of that type +template +inline void +callTypedGrid(GridBaseType &grid, OpType& op) +{ +#ifdef _MSC_VER + op.operator()(UTvdbGridCast(grid)); +#else + op.template operator()(UTvdbGridCast(grid)); +#endif +} + +} // namespace UT_VDBUtils + +//////////////////////////////////////// + + +/// @brief Utility function that, given a generic grid pointer, +/// calls a functor on the fully-resolved grid +/// +/// @par Example: +/// @code +/// using openvdb::Coord; +/// using openvdb::CoordBBox; +/// +/// struct FillOp { +/// const CoordBBox bbox; +/// +/// FillOp(const CoordBBox& b): bbox(b) {} +/// +/// template +/// void operator()(GridT& grid) const { +/// typedef typename GridT::ValueType ValueT; +/// grid.fill(bbox, ValueT(1)); +/// } +/// }; +/// +/// GU_PrimVDB* vdb = ...; +/// vdb->makeGridUnique(); +/// CoordBBox bbox(Coord(0,0,0), Coord(10,10,10)); +/// UTvdbProcessTypedGrid(vdb->getStorageType(), vdb->getGrid(), FillOp(bbox)); +/// @endcode +/// +/// @return @c false if the grid type is unknown or unhandled. +/// @{ +#define UT_VDB_DECL_PROCESS_TYPED_GRID(GRID_BASE_T) \ +template \ +inline bool \ +UTvdbProcessTypedGrid(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \ +{ \ + using namespace openvdb; \ + using namespace UT_VDBUtils; \ + switch (grid_type) \ + { \ + case UT_VDB_FLOAT: callTypedGrid(grid, op); break; \ + case UT_VDB_DOUBLE: callTypedGrid(grid, op); break; \ + case UT_VDB_INT32: callTypedGrid(grid, op); break; \ + case UT_VDB_INT64: callTypedGrid(grid, op); break; \ + case UT_VDB_VEC3F: callTypedGrid(grid, op); break; \ + case UT_VDB_VEC3D: callTypedGrid(grid, op); break; \ + case UT_VDB_VEC3I: callTypedGrid(grid, op); break; \ + default: UT_ASSERT(!"Unknown grid type"); return false; \ + } \ + return true; \ +} \ +template \ +inline bool \ +UTvdbProcessTypedGridTopology(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \ +{ \ + using namespace openvdb; \ + using namespace UT_VDBUtils; \ + switch (grid_type) \ + { \ + case UT_VDB_FLOAT: callTypedGrid(grid, op); break; \ + case UT_VDB_DOUBLE: callTypedGrid(grid, op); break; \ + case UT_VDB_INT32: callTypedGrid(grid, op); break; \ + case UT_VDB_INT64: callTypedGrid(grid, op); break; \ + case UT_VDB_VEC3F: callTypedGrid(grid, op); break; \ + case UT_VDB_VEC3D: callTypedGrid(grid, op); break; \ + case UT_VDB_VEC3I: callTypedGrid(grid, op); break; \ + case UT_VDB_BOOL: callTypedGrid(grid, op); break; \ + default: UT_ASSERT(!"Unknown grid type"); return false; \ + } \ + return true; \ +} \ +template \ +inline bool \ +UTvdbProcessTypedGridVec3(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \ +{ \ + using namespace openvdb; \ + using namespace UT_VDBUtils; \ + switch (grid_type) \ + { \ + case UT_VDB_VEC3F: callTypedGrid(grid, op); break; \ + case UT_VDB_VEC3D: callTypedGrid(grid, op); break; \ + case UT_VDB_VEC3I: callTypedGrid(grid, op); break; \ + default: return false; \ + } \ + return true; \ +} \ +template \ +inline bool \ +UTvdbProcessTypedGridScalar(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \ +{ \ + using namespace openvdb; \ + using namespace UT_VDBUtils; \ + switch (grid_type) \ + { \ + case UT_VDB_FLOAT: callTypedGrid(grid, op); break; \ + case UT_VDB_DOUBLE: callTypedGrid(grid, op); break; \ + case UT_VDB_INT32: callTypedGrid(grid, op); break; \ + case UT_VDB_INT64: callTypedGrid(grid, op); break; \ + default: return false; \ + } \ + return true; \ +} \ +template \ +inline bool \ +UTvdbProcessTypedGridReal(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \ +{ \ + using namespace openvdb; \ + using namespace UT_VDBUtils; \ + switch (grid_type) \ + { \ + case UT_VDB_FLOAT: callTypedGrid(grid, op); break; \ + case UT_VDB_DOUBLE: callTypedGrid(grid, op); break; \ + default: return false; \ + } \ + return true; \ +} \ +/**/ +UT_VDB_DECL_PROCESS_TYPED_GRID(const openvdb::GridBase &) +UT_VDB_DECL_PROCESS_TYPED_GRID(const openvdb::GridBase *) +UT_VDB_DECL_PROCESS_TYPED_GRID(openvdb::GridBase::ConstPtr) +UT_VDB_DECL_PROCESS_TYPED_GRID(openvdb::GridBase &) +UT_VDB_DECL_PROCESS_TYPED_GRID(openvdb::GridBase *) +UT_VDB_DECL_PROCESS_TYPED_GRID(openvdb::GridBase::Ptr) + +/// @} + + +// Helper macro for UTvdbCall* macros, do not outside of this file! +#define UT_VDB_CALL(GRIDT, RETURN, FNAME, GRIDBASE, ...) \ + { \ + RETURN FNAME (UTvdbGridCast(GRIDBASE), __VA_ARGS__ ); \ + } \ + /**/ + +//@{ +/// Macro to invoke the correct type of grid. +/// Use like: +/// @code +/// UTvdbCallScalarType(grid_type, myfunction, grid, parms) +/// @endcode +/// to invoke +/// @code +/// template +/// static void +/// myfunction(const GridType &grid, parms) +/// { } +/// @endcode + +#define UTvdbCallRealType(TYPE, FNAME, GRIDBASE, ...) \ + if (TYPE == UT_VDB_FLOAT) \ + UT_VDB_CALL(openvdb::FloatGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \ + else if (TYPE == UT_VDB_DOUBLE) \ + UT_VDB_CALL(openvdb::DoubleGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \ + /**/ +#define UTvdbCallScalarType(TYPE, FNAME, GRIDBASE, ...) \ + UTvdbCallRealType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \ + else if (TYPE == UT_VDB_INT32) \ + UT_VDB_CALL(openvdb::Int32Grid,(void),FNAME,GRIDBASE,__VA_ARGS__) \ + else if (TYPE == UT_VDB_INT64) \ + UT_VDB_CALL(openvdb::Int64Grid,(void),FNAME,GRIDBASE,__VA_ARGS__) \ + /**/ +#define UTvdbCallVec3Type(TYPE, FNAME, GRIDBASE, ...) \ + if (TYPE == UT_VDB_VEC3F) \ + UT_VDB_CALL(openvdb::Vec3fGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \ + else if (TYPE == UT_VDB_VEC3D) \ + UT_VDB_CALL(openvdb::Vec3dGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \ + else if (TYPE == UT_VDB_VEC3I) \ + UT_VDB_CALL(openvdb::Vec3IGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \ + /**/ +#define UTvdbCallAllType(TYPE, FNAME, GRIDBASE, ...) \ + UTvdbCallScalarType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \ + else UTvdbCallVec3Type(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \ + else UT_ASSERT(!"Unknown grid type"); \ + /**/ +#define UTvdbCallAllTopology(TYPE, FNAME, GRIDBASE, ...) \ + UTvdbCallScalarType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \ + else UTvdbCallVec3Type(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \ + else if (TYPE == UT_VDB_BOOL) \ + UT_VDB_CALL(openvdb::BoolGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \ + else UT_ASSERT(!"Unknown grid type"); \ + /**/ +//@} + +//@{ +/// Macro to invoke the correct type of grid. +/// Use like: +/// @code +/// UTvdbReturnScalarType(grid_type, myfunction, grid, parms) +/// @endcode +/// to invoke +/// @code +/// return myfunction(grid, parms); +/// @endcode +/// via: +/// @code +/// template +/// static RESULT +/// myfunction(const GridType &grid, parms) +/// { } +/// @endcode + +#define UTvdbReturnRealType(TYPE, FNAME, GRIDBASE, ...) \ + if (TYPE == UT_VDB_FLOAT) \ + UT_VDB_CALL(openvdb::FloatGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \ + else if (TYPE == UT_VDB_DOUBLE) \ + UT_VDB_CALL(openvdb::DoubleGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \ + /**/ +#define UTvdbReturnScalarType(TYPE, FNAME, GRIDBASE, ...) \ + UTvdbReturnRealType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \ + else if (TYPE == UT_VDB_INT32) \ + UT_VDB_CALL(openvdb::Int32Grid,return,FNAME,GRIDBASE,__VA_ARGS__) \ + else if (TYPE == UT_VDB_INT64) \ + UT_VDB_CALL(openvdb::Int64Grid,return,FNAME,GRIDBASE,__VA_ARGS__) \ + /**/ +#define UTvdbReturnVec3Type(TYPE, FNAME, GRIDBASE, ...) \ + if (TYPE == UT_VDB_VEC3F) \ + UT_VDB_CALL(openvdb::Vec3fGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \ + else if (TYPE == UT_VDB_VEC3D) \ + UT_VDB_CALL(openvdb::Vec3dGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \ + else if (TYPE == UT_VDB_VEC3I) \ + UT_VDB_CALL(openvdb::Vec3IGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \ + /**/ +#define UTvdbReturnAllType(TYPE, FNAME, GRIDBASE, ...) \ + UTvdbReturnScalarType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \ + else UTvdbReturnVec3Type(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \ + else UT_ASSERT(!"Unknown grid type"); \ + /**/ +#define UTvdbReturnAllTopology(TYPE, FNAME, GRIDBASE, ...) \ + UTvdbReturnScalarType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \ + else UTvdbReturnVec3Type(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \ + else if (TYPE == UT_VDB_BOOL) \ + UT_VDB_CALL(openvdb::BoolGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \ + else UT_ASSERT(!"Unknown grid type"); \ + /**/ +//@} + + +//////////////////////////////////////// + + +/// Matrix conversion from openvdb to UT +// @{ +template +UT_Matrix4T +UTvdbConvert(const openvdb::math::Mat4 &src) +{ + return UT_Matrix4T(src(0,0), src(0,1), src(0,2), src(0,3), + src(1,0), src(1,1), src(1,2), src(1,3), + src(2,0), src(2,1), src(2,2), src(2,3), + src(3,0), src(3,1), src(3,2), src(3,3)); +} + +template +UT_Matrix3T +UTvdbConvert(const openvdb::math::Mat3 &src) +{ + return UT_Matrix3T(src(0,0), src(0,1), src(0,2), + src(1,0), src(1,1), src(1,2), + src(2,0), src(2,1), src(2,2)); +} + +template +UT_Matrix2T +UTvdbConvert(const openvdb::math::Mat2 &src) +{ + return UT_Matrix2T(src(0,0), src(0,1), + src(1,0), src(1,1)); +} +// @} + +/// Matrix conversion from UT to openvdb +// @{ +template +openvdb::math::Mat4 +UTvdbConvert(const UT_Matrix4T &src) +{ + return openvdb::math::Mat4(src(0,0), src(0,1), src(0,2), src(0,3), + src(1,0), src(1,1), src(1,2), src(1,3), + src(2,0), src(2,1), src(2,2), src(2,3), + src(3,0), src(3,1), src(3,2), src(3,3)); +} +template +openvdb::math::Mat3 +UTvdbConvert(const UT_Matrix3T &src) +{ + return openvdb::math::Mat3(src(0,0), src(0,1), src(0,2), + src(1,0), src(1,1), src(1,2), + src(2,0), src(2,1), src(2,2)); +} +template +openvdb::math::Mat2 +UTvdbConvert(const UT_Matrix2T &src) +{ + return openvdb::math::Mat2(src(0,0), src(0,1), + src(1,0), src(1,1)); +} +// @} + +/// Vector conversion from openvdb to UT +// @{ +template +UT_Vector4T +UTvdbConvert(const openvdb::math::Vec4 &src) +{ + return UT_Vector4T(src.asPointer()); +} +template +UT_Vector3T +UTvdbConvert(const openvdb::math::Vec3 &src) +{ + return UT_Vector3T(src.asPointer()); +} +template +UT_Vector2T +UTvdbConvert(const openvdb::math::Vec2 &src) +{ + return UT_Vector2T(src.asPointer()); +} +// @} + +/// Vector conversion from UT to openvdb +// @{ +template +openvdb::math::Vec4 +UTvdbConvert(const UT_Vector4T &src) +{ + return openvdb::math::Vec4(src.data()); +} +template +openvdb::math::Vec3 +UTvdbConvert(const UT_Vector3T &src) +{ + return openvdb::math::Vec3(src.data()); +} +template +openvdb::math::Vec2 +UTvdbConvert(const UT_Vector2T &src) +{ + return openvdb::math::Vec2(src.data()); +} +// @} + + +/// Bounding box conversion from openvdb to UT +inline UT_BoundingBoxD +UTvdbConvert(const openvdb::CoordBBox &bbox) +{ + return UT_BoundingBoxD(UTvdbConvert(bbox.getStart().asVec3d()), + UTvdbConvert(bbox.getEnd().asVec3d())); +} + + +template +inline openvdb::math::Vec4 SYSabs(const openvdb::math::Vec4 &v1) +{ return openvdb::math::Vec4( SYSabs(v1[0]), + SYSabs(v1[1]), + SYSabs(v1[2]), + SYSabs(v1[3]) + ); +} +template +inline openvdb::math::Vec3 SYSabs(const openvdb::math::Vec3 &v1) +{ return openvdb::math::Vec3( SYSabs(v1[0]), + SYSabs(v1[1]), + SYSabs(v1[2]) + ); +} +template +inline openvdb::math::Vec2 SYSabs(const openvdb::math::Vec2 &v1) +{ return openvdb::math::Vec2( SYSabs(v1[0]), + SYSabs(v1[1]) + ); +} + +template +inline openvdb::math::Vec4 SYSmin(const openvdb::math::Vec4 &v1, const openvdb::math::Vec4 &v2) +{ return openvdb::math::Vec4( SYSmin(v1[0], v2[0]), + SYSmin(v1[1], v2[1]), + SYSmin(v1[2], v2[2]), + SYSmin(v1[3], v2[3]) + ); +} +template +inline openvdb::math::Vec4 SYSmax(const openvdb::math::Vec4 &v1, const openvdb::math::Vec4 &v2) +{ return openvdb::math::Vec4( SYSmax(v1[0], v2[0]), + SYSmax(v1[1], v2[1]), + SYSmax(v1[2], v2[2]), + SYSmax(v1[3], v2[3]) + ); +} +template +inline openvdb::math::Vec4 SYSmin(const openvdb::math::Vec4 &v1, const openvdb::math::Vec4 &v2, const openvdb::math::Vec4 &v3) +{ return openvdb::math::Vec4( SYSmin(v1[0], v2[0], v3[0]), + SYSmin(v1[1], v2[1], v3[1]), + SYSmin(v1[2], v2[2], v3[2]), + SYSmin(v1[3], v2[3], v3[3]) + ); +} +template +inline openvdb::math::Vec4 SYSmax(const openvdb::math::Vec4 &v1, const openvdb::math::Vec4 &v2, const openvdb::math::Vec4 &v3) +{ return openvdb::math::Vec4( SYSmax(v1[0], v2[0], v3[0]), + SYSmax(v1[1], v2[1], v3[1]), + SYSmax(v1[2], v2[2], v3[2]), + SYSmax(v1[3], v2[3], v3[3]) + ); +} +template +inline openvdb::math::Vec3 SYSmin(const openvdb::math::Vec3 &v1, const openvdb::math::Vec3 &v2) +{ return openvdb::math::Vec3( SYSmin(v1[0], v2[0]), + SYSmin(v1[1], v2[1]), + SYSmin(v1[2], v2[2]) + ); +} +template +inline openvdb::math::Vec3 SYSmax(const openvdb::math::Vec3 &v1, const openvdb::math::Vec3 &v2) +{ return openvdb::math::Vec3( SYSmax(v1[0], v2[0]), + SYSmax(v1[1], v2[1]), + SYSmax(v1[2], v2[2]) + ); +} +template +inline openvdb::math::Vec3 SYSmin(const openvdb::math::Vec3 &v1, const openvdb::math::Vec3 &v2, const openvdb::math::Vec3 &v3) +{ return openvdb::math::Vec3( SYSmin(v1[0], v2[0], v3[0]), + SYSmin(v1[1], v2[1], v3[1]), + SYSmin(v1[2], v2[2], v3[2]) + ); +} +template +inline openvdb::math::Vec3 SYSmax(const openvdb::math::Vec3 &v1, const openvdb::math::Vec3 &v2, const openvdb::math::Vec3 &v3) +{ return openvdb::math::Vec3( SYSmax(v1[0], v2[0], v3[0]), + SYSmax(v1[1], v2[1], v3[1]), + SYSmax(v1[2], v2[2], v3[2]) + ); +} +template +inline openvdb::math::Vec2 SYSmin(const openvdb::math::Vec2 &v1, const openvdb::math::Vec2 &v2) +{ return openvdb::math::Vec2( SYSmin(v1[0], v2[0]), + SYSmin(v1[1], v2[1]) + ); +} +template +inline openvdb::math::Vec2 SYSmax(const openvdb::math::Vec2 &v1, const openvdb::math::Vec2 &v2) +{ return openvdb::math::Vec2( SYSmax(v1[0], v2[0]), + SYSmax(v1[1], v2[1]) + ); +} +template +inline openvdb::math::Vec2 SYSmin(const openvdb::math::Vec2 &v1, const openvdb::math::Vec2 &v2, const openvdb::math::Vec2 &v3) +{ return openvdb::math::Vec2( SYSmin(v1[0], v2[0], v3[0]), + SYSmin(v1[1], v2[1], v3[1]) + ); +} +template +inline openvdb::math::Vec2 SYSmax(const openvdb::math::Vec2 &v1, const openvdb::math::Vec2 &v2, const openvdb::math::Vec2 &v3) +{ return openvdb::math::Vec2( SYSmax(v1[0], v2[0], v3[0]), + SYSmax(v1[1], v2[1], v3[1]) + ); +} + +#endif // __HDK_UT_VDBUtils__ + +#endif // UT_VERSION_INT < 0x0c050157 // earlier than 12.5.343 + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb_houdini/Utils.h b/nuparu/include/openvdb/include/openvdb_houdini/Utils.h new file mode 100644 index 00000000..f7056a04 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_houdini/Utils.h @@ -0,0 +1,423 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file Utils.h +/// @author FX R&D Simulation team +/// @brief Utility classes and functions for OpenVDB plugins + +#ifndef OPENVDB_HOUDINI_UTILS_HAS_BEEN_INCLUDED +#define OPENVDB_HOUDINI_UTILS_HAS_BEEN_INCLUDED + +#include "GU_PrimVDB.h" +#include +#include +#include +#include +#include + + +#ifdef SESI_OPENVDB +#ifdef OPENVDB_HOUDINI_API + #undef OPENVDB_HOUDINI_API + #define OPENVDB_HOUDINI_API +#endif +#endif + +class GEO_PrimVDB; +class GU_Detail; +class UT_String; + +namespace openvdb_houdini { + +typedef openvdb::GridBase Grid; +typedef openvdb::GridBase::Ptr GridPtr; +typedef openvdb::GridBase::ConstPtr GridCPtr; +typedef openvdb::GridBase& GridRef; +typedef const openvdb::GridBase& GridCRef; + + +/// @brief Iterator over const VDB primitives on a geometry detail +/// +/// @details At least until @c GEO_PrimVDB becomes a built-in primitive type +/// (that can be used as the mask for a @c GA_GBPrimitiveIterator), use this +/// iterator to iterate over all VDB grids belonging to a gdp and, optionally, +/// belonging to a particular group. +class OPENVDB_HOUDINI_API VdbPrimCIterator +{ +public: + typedef boost::function FilterFunc; + + /// @param gdp + /// the geometry detail over which to iterate + /// @param group + /// a group in the detail over which to iterate (if @c NULL, + /// iterate over all VDB primitives) + /// @param filter + /// an optional function or functor that takes a const reference + /// to a GU_PrimVDB and returns a boolean specifying whether + /// that primitive should be visited (@c true) or not (@c false) + explicit VdbPrimCIterator(const GEO_Detail* gdp, const GA_PrimitiveGroup* group = NULL, + FilterFunc filter = FilterFunc()); + + VdbPrimCIterator(const VdbPrimCIterator&); + VdbPrimCIterator& operator=(const VdbPrimCIterator&); + + //@{ + /// Advance to the next VDB primitive. + void advance(); + VdbPrimCIterator& operator++() { advance(); return *this; } + //@} + + //@{ + /// Return a pointer to the current VDB primitive (@c NULL if at end). + const GU_PrimVDB* getPrimitive() const; + const GU_PrimVDB* operator*() const { return getPrimitive(); } + const GU_PrimVDB* operator->() const { return getPrimitive(); } + //@} + + //@{ + GA_Offset getOffset() const { return getPrimitive()->getMapOffset(); } + GA_Index getIndex() const { return getPrimitive()->getMapIndex(); } + //@} + + /// Return @c false if there are no more VDB primitives. + operator bool() const { return getPrimitive() != NULL; } + + /// @brief Return the value of the current VDB primitive's @c name attribute. + /// @param defaultName + /// if the current primitive has no @c name attribute + /// or its name is empty, return this name instead + UT_String getPrimitiveName(const UT_String& defaultName = "") const; + + /// @brief Return the value of the current VDB primitive's @c name attribute + /// or, if the name is empty, the primitive's index (as a UT_String). + UT_String getPrimitiveNameOrIndex() const; + +protected: + /// Allow primitives to be deleted during iteration. + VdbPrimCIterator(const GEO_Detail*, GA_Range::safedeletions, + const GA_PrimitiveGroup* = NULL, FilterFunc = FilterFunc()); + + boost::shared_ptr mIter; + FilterFunc mFilter; +}; // class VdbPrimCIterator + + +/// @brief Iterator over non-const VDB primitives on a geometry detail +/// +/// @details At least until @c GEO_PrimVDB becomes a built-in primitive type +/// (that can be used as the mask for a @c GA_GBPrimitiveIterator), use this +/// iterator to iterate over all VDB grids belonging to a gdp and, optionally, +/// belonging to a particular group. +class OPENVDB_HOUDINI_API VdbPrimIterator: public VdbPrimCIterator +{ +public: + /// @param gdp + /// the geometry detail over which to iterate + /// @param group + /// a group in the detail over which to iterate (if @c NULL, + /// iterate over all VDB primitives) + /// @param filter + /// an optional function or functor that takes a @c const reference + /// to a GU_PrimVDB and returns a boolean specifying whether + /// that primitive should be visited (@c true) or not (@c false) + explicit VdbPrimIterator(GEO_Detail* gdp, const GA_PrimitiveGroup* group = NULL, + FilterFunc filter = FilterFunc()): + VdbPrimCIterator(gdp, group, filter) {} + /// @brief Allow primitives to be deleted during iteration. + /// @param gdp + /// the geometry detail over which to iterate + /// @param group + /// a group in the detail over which to iterate (if @c NULL, + /// iterate over all VDB primitives) + /// @param filter + /// an optional function or functor that takes a @c const reference + /// to a GU_PrimVDB and returns a boolean specifying whether + /// that primitive should be visited (@c true) or not (@c false) + VdbPrimIterator(GEO_Detail* gdp, GA_Range::safedeletions, + const GA_PrimitiveGroup* group = NULL, FilterFunc filter = FilterFunc()): + VdbPrimCIterator(gdp, GA_Range::safedeletions(), group, filter) {} + + VdbPrimIterator(const VdbPrimIterator&); + VdbPrimIterator& operator=(const VdbPrimIterator&); + + /// Advance to the next VDB primitive. + VdbPrimIterator& operator++() { advance(); return *this; } + + //@{ + /// Return a pointer to the current VDB primitive (@c NULL if at end). + GU_PrimVDB* getPrimitive() const { + return const_cast(VdbPrimCIterator::getPrimitive()); + } + GU_PrimVDB* operator*() const { return getPrimitive(); } + GU_PrimVDB* operator->() const { return getPrimitive(); } + //@} +}; // class VdbPrimIterator + + +//////////////////////////////////////// + + +/// @brief Wrapper class that adapts a Houdini @c UT_Interrupt object +/// for use with OpenVDB library routines +/// @sa openvdb/util/NullInterrupter.h +class Interrupter +{ +public: + Interrupter(const char* title = NULL): + mUTI(UTgetInterrupt()), mRunning(false) + { + if (title) mUTI->setAppTitle(title); + } + ~Interrupter() { if (mRunning) this->end(); } + + /// @brief Signal the start of an interruptible operation. + /// @param name an optional descriptive name for the operation + void start(const char* name = NULL) { if (!mRunning) { mRunning=true; mUTI->opStart(name); } } + /// Signal the end of an interruptible operation. + void end() { if (mRunning) { mUTI->opEnd(); mRunning = false; } } + + /// @brief Check if an interruptible operation should be aborted. + /// @param percent an optional (when >= 0) percentage indicating + /// the fraction of the operation that has been completed + bool wasInterrupted(int percent=-1) { return mUTI->opInterrupt(percent); } + +private: + UT_Interrupt* mUTI; + bool mRunning; +}; + + +//////////////////////////////////////// + + +// Utility methods + +/// @brief Store a VDB grid in a new VDB primitive and add the primitive +/// to a geometry detail. +/// @return the newly-created VDB primitive. +/// @param gdp the detail to which to add the primitive +/// @param grid the VDB grid to be added +/// @param name if non-null, set the new primitive's @c name attribute to this string +/// @note This operation clears the input grid's metadata. +OPENVDB_HOUDINI_API +GU_PrimVDB* createVdbPrimitive(GU_Detail& gdp, GridPtr grid, const char* name = NULL); + + +/// @brief Replace an existing VDB primitive with a new primitive that contains +/// the given grid. +/// @return the newly-created VDB primitive. +/// @param gdp the detail to which to add the primitive +/// @param grid the VDB grid to be added +/// @param src replace this primitive with the newly-created primitive +/// @param copyAttrs if @c true, copy attributes and group membership from the @a src primitive +/// @param name if non-null, set the new primitive's @c name attribute to this string; +/// otherwise, if @a copyAttrs is @c true, copy the name from @a src +/// @note This operation clears the input grid's metadata. +OPENVDB_HOUDINI_API +GU_PrimVDB* replaceVdbPrimitive(GU_Detail& gdp, GridPtr grid, GEO_PrimVDB& src, + const bool copyAttrs = true, const char* name = NULL); + + +/// @brief Return in @a corners the corners of the given grid's active voxel bounding box. +/// @return @c false if the grid has no active voxels. +OPENVDB_HOUDINI_API +bool evalGridBBox(GridCRef grid, UT_Vector3 corners[8], bool expandHalfVoxel = false); + + +/// Construct an index-space CoordBBox from a UT_BoundingBox. +OPENVDB_HOUDINI_API +openvdb::CoordBBox makeCoordBBox(const UT_BoundingBox&, const openvdb::math::Transform&); + + +//////////////////////////////////////// + + +/// Helper class used internally by processTypedGrid() +template +struct GridProcessor { + static inline void call(OpType& op, GridPtr grid) { +#ifdef _MSC_VER + op.operator()(openvdb::gridPtrCast(grid)); +#else + op.template operator()(openvdb::gridPtrCast(grid)); +#endif + } +}; + +/// Helper class used internally by processTypedGrid() +template +struct GridProcessor { + static inline void call(OpType& op, GridCPtr grid) { +#ifdef _MSC_VER + op.operator()(openvdb::gridConstPtrCast(grid)); +#else + op.template operator()(openvdb::gridConstPtrCast(grid)); +#endif + } +}; + + +/// Helper function used internally by processTypedGrid() +template +inline void +doProcessTypedGrid(GridPtrType grid, OpType& op) +{ + GridProcessor::value>::call(op, grid); +} + + +//////////////////////////////////////// + + +/// @brief Utility function that, given a generic grid pointer, +/// calls a functor on the fully-resolved grid +/// +/// @par Example: +/// @code +/// using openvdb::Coord; +/// using openvdb::CoordBBox; +/// +/// struct FillOp { +/// const CoordBBox bbox; +/// +/// FillOp(const CoordBBox& b): bbox(b) {} +/// +/// template +/// void operator()(typename GridT::Ptr grid) const { +/// typedef typename GridT::ValueType ValueT; +/// grid->fill(bbox, ValueT(1)); +/// } +/// }; +/// +/// CoordBBox bbox(Coord(0,0,0), Coord(10,10,10)); +/// processTypedGrid(myGridPtr, FillOp(bbox)); +/// @endcode +/// +/// @return @c false if the grid type is unknown or unhandled. +/// @deprecated Use UTvdbProcessTypedGrid() or GEOvdbProcessTypedGrid() instead. +template +OPENVDB_DEPRECATED +bool +processTypedGrid(GridPtrType grid, OpType& op) +{ + using namespace openvdb; + if (grid->template isType()) doProcessTypedGrid(grid, op); + else if (grid->template isType()) doProcessTypedGrid(grid, op); + else if (grid->template isType()) doProcessTypedGrid(grid, op); + else if (grid->template isType()) doProcessTypedGrid(grid, op); + else if (grid->template isType()) doProcessTypedGrid(grid, op); + else if (grid->template isType()) doProcessTypedGrid(grid, op); + else if (grid->template isType()) doProcessTypedGrid(grid, op); + else if (grid->template isType()) doProcessTypedGrid(grid, op); + else return false; ///< @todo throw exception ("unknown grid type") + return true; +} + + +/// @brief Utility function that, given a generic grid pointer, calls +/// a functor on the fully-resolved grid, provided that the grid's +/// voxel values are 3-vectors (vec3i, vec3s or vec3d) +/// +/// Usage: +/// @code +/// struct NormalizeOp { +/// template +/// void operator()(typename GridT::Ptr grid) const { normalizeVectors(*grid); } +/// }; +/// +/// processTypedVec3Grid(myGridPtr, NormalizeOp()); +/// @endcode +/// +/// @return @c false if the grid type is unknown or non-vector. +/// @sa UTvdbProcessTypedGridVec3 +/// @deprecated Use UTvdbProcessTypedGridVec3() or GEOvdbProcessTypedGridVec3() instead. +template +OPENVDB_DEPRECATED +bool +processTypedVec3Grid(GridPtrType grid, OpType& op) +{ + using namespace openvdb; + if (grid->template isType()) doProcessTypedGrid(grid, op); + else if (grid->template isType()) doProcessTypedGrid(grid, op); + else if (grid->template isType()) doProcessTypedGrid(grid, op); + else return false; ///< @todo throw exception ("grid type is not vec3") + return true; +} + + +/// @brief Utility function that, given a generic grid pointer, +/// calls a functor on the fully-resolved grid +/// +/// @par Example: +/// @code +/// using openvdb::Coord; +/// using openvdb::CoordBBox; +/// +/// struct FillOp { +/// const CoordBBox bbox; +/// +/// FillOp(const CoordBBox& b): bbox(b) {} +/// +/// template +/// void operator()(typename GridT::Ptr grid) const { +/// typedef typename GridT::ValueType ValueT; +/// grid->fill(bbox, ValueT(1)); +/// } +/// }; +/// +/// CoordBBox bbox(Coord(0,0,0), Coord(10,10,10)); +/// processTypedScalarGrid(myGridPtr, FillOp(bbox)); +/// @endcode +/// +/// @return @c false if the grid type is unknown or non-scalar. +/// @deprecated Use UTvdbProcessTypedGridScalar() or GEOvdbProcessTypedGridScalar() instead. +template +OPENVDB_DEPRECATED +bool +processTypedScalarGrid(GridPtrType grid, OpType& op) +{ + using namespace openvdb; + if (grid->template isType()) doProcessTypedGrid(grid, op); + else if (grid->template isType()) doProcessTypedGrid(grid, op); + else if (grid->template isType()) doProcessTypedGrid(grid, op); + else if (grid->template isType()) doProcessTypedGrid(grid, op); + else return false; ///< @todo throw exception ("grid type is not scalar") + return true; +} + +} // namespace openvdb_houdini + +#endif // OPENVDB_HOUDINI_UTILS_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb_points/Types.h b/nuparu/include/openvdb/include/openvdb_points/Types.h new file mode 100644 index 00000000..0231bee1 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_points/Types.h @@ -0,0 +1,65 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015-2016 Double Negative Visual Effects +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of Double Negative Visual Effects 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_POINTS_TYPES_HAS_BEEN_INCLUDED +#define OPENVDB_POINTS_TYPES_HAS_BEEN_INCLUDED + +#include +#include +#include +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { + +// add some extra typeNameAsString specializations + +template<> inline const char* typeNameAsString() { return "half"; } +template<> inline const char* typeNameAsString() { return "uint8"; } +template<> inline const char* typeNameAsString() { return "int16"; } +template<> inline const char* typeNameAsString() { return "uint16"; } +template<> inline const char* typeNameAsString >() { return "vec2h"; } +template<> inline const char* typeNameAsString >() { return "vec3h"; } +template<> inline const char* typeNameAsString >() { return "vec3u8"; } +template<> inline const char* typeNameAsString >() { return "vec3u16"; } + + +//////////////////////////////////////// + + +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_POINTS_TYPES_HAS_BEEN_INCLUDED + +// Copyright (c) 2015-2016 Double Negative Visual Effects +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb_points/openvdb.h b/nuparu/include/openvdb/include/openvdb_points/openvdb.h new file mode 100644 index 00000000..9b95299c --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_points/openvdb.h @@ -0,0 +1,56 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015-2016 Double Negative Visual Effects +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of Double Negative Visual Effects 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_POINTS_INIT_HAS_BEEN_INCLUDED +#define OPENVDB_POINTS_INIT_HAS_BEEN_INCLUDED + +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { + +namespace points { + +/// Global registration of basic types +OPENVDB_API void initialize(); + +/// Global deregistration of basic types +OPENVDB_API void uninitialize(); + +} // namespace points +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_POINTS_INIT_HAS_BEEN_INCLUDED + +// Copyright (c) 2015-2016 Double Negative Visual Effects +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb_points/tools/AttributeArray.h b/nuparu/include/openvdb/include/openvdb_points/tools/AttributeArray.h new file mode 100644 index 00000000..9675e76b --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_points/tools/AttributeArray.h @@ -0,0 +1,1573 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015-2016 Double Negative Visual Effects +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of Double Negative Visual Effects 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file AttributeArray.h +/// +/// @authors Dan Bailey, Mihai Alden, Peter Cucka +/// +/// @brief Attribute Array storage templated on type and compression codec. +/// + + +#ifndef OPENVDB_TOOLS_ATTRIBUTE_ARRAY_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_ATTRIBUTE_ARRAY_HAS_BEEN_INCLUDED + +#include +#include +#include +#include +#include // MappedFile +#include // COMPRESS_BLOSC + +#include + +#include +#include + +#include + +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { + + +// Add new typedef for a Name pair +typedef std::pair NamePair; + +namespace tools { + + +//////////////////////////////////////// + +// Attribute Compression methods + + +namespace attribute_compression { + +/// @brief Returns true if compression is available +bool canCompress(); + +/// @brief Retrieves the uncompressed size of buffer when uncompressed +/// +/// @param buffer the compressed buffer +int uncompressedSize(const char* buffer); + +/// @brief Retrieves the compressed size of buffer when compressed +/// +/// @param buffer the uncompressed buffer +/// @param typeSize the size of the data type +/// @param uncompressedBytes number of uncompressed bytes +int compressedSize(const char* buffer, const size_t typeSize, const int uncompressedBytes); + +/// @brief Compress and return the compressed buffer. +/// +/// @param buffer the buffer to compress +/// @param typeSize the size of the data type +/// @param uncompressedBytes number of uncompressed bytes +/// @param compressedBytes number of compressed bytes (written to this variable) +/// @param cleanup if true, the supplied buffer will be deleted prior to allocating new memory +char* compress( char* buffer, const size_t typeSize, + const int uncompressedBytes, int& compressedBytes, + const bool cleanup = false); + +/// @brief Compress and return the compressed buffer. +/// +/// @param buffer the buffer to compress +/// @param typeSize the size of the data type +/// @param uncompressedBytes number of uncompressed bytes +/// @param compressedBytes number of compressed bytes (written to this variable) +/// +/// @note Unlike the non-const buffer version, the buffer will never be deleted. +char* compress( const char* buffer, const size_t typeSize, + const int uncompressedBytes, int& compressedBytes); + +/// @brief Decompress and return the uncompressed buffer. +/// +/// @param buffer the buffer to decompress +/// @param expectedBytes the number of bytes expected once the buffer is decompressed +/// @param cleanup if true, the supplied buffer will be deleted prior to allocating new memory +char* decompress(char* buffer, const int expectedBytes, const bool cleanup = false); + +/// @brief Decompress and return the uncompressed buffer. +/// +/// @param buffer the buffer to decompress +/// @param expectedBytes the number of bytes expected once the buffer is decompressed +/// +/// @note Unlike the non-const buffer version, the buffer will never be deleted. +char* decompress(const char* buffer, const int expectedBytes); + +} // namespace attribute_compression + + +//////////////////////////////////////// + +// Utility methods + +template +inline IntegerT +floatingPointToFixedPoint(const FloatT s) +{ + BOOST_STATIC_ASSERT(boost::is_unsigned::value); + if (FloatT(0.0) > s) return std::numeric_limits::min(); + else if (FloatT(1.0) <= s) return std::numeric_limits::max(); + return IntegerT(std::floor(s * FloatT(std::numeric_limits::max()))); +} + + +template +inline FloatT +fixedPointToFloatingPoint(const IntegerT s) +{ + BOOST_STATIC_ASSERT(boost::is_unsigned::value); + return FloatT(s) / FloatT((std::numeric_limits::max())); +} + + +template +inline IntegerVectorT +floatingPointToFixedPoint(const math::Vec3& v) +{ + return IntegerVectorT( + floatingPointToFixedPoint(v.x()), + floatingPointToFixedPoint(v.y()), + floatingPointToFixedPoint(v.z())); +} + +template +inline FloatVectorT +fixedPointToFloatingPoint(const math::Vec3& v) +{ + return FloatVectorT( + fixedPointToFloatingPoint(v.x()), + fixedPointToFloatingPoint(v.y()), + fixedPointToFloatingPoint(v.z())); +} + + +//////////////////////////////////////// + +// Attribute codec schemes + +template +struct NullAttributeCodec +{ + typedef StorageType_ StorageType; + template static void decode(const StorageType&, ValueType&); + template static void encode(const StorageType&, ValueType&); + static const char* name() { return "null"; } +}; + + +template +struct FixedPointAttributeCodec +{ + typedef IntType StorageType; + template static void decode(const StorageType&, ValueType&); + template static void encode(const ValueType&, StorageType&); + static const char* name() { return "fxpt"; } +}; + + +struct UnitVecAttributeCodec +{ + typedef uint16_t StorageType; + template static void decode(const StorageType&, math::Vec3&); + template static void encode(const math::Vec3&, StorageType&); + static const char* name() { return "uvec"; } +}; + + +//////////////////////////////////////// + + +/// Base class for storing attribute data +class AttributeArray +{ +protected: + struct AccessorBase; + template struct Accessor; + + typedef boost::shared_ptr AccessorBasePtr; + +public: + enum Flag { TRANSIENT = 0x1, HIDDEN = 0x2, GROUP=0x4, WRITEUNIFORM=0x8, + WRITEMEMCOMPRESS=0x10, WRITEDISKCOMPRESS=0x20, OUTOFCORE=0x40 }; + +#ifndef OPENVDB_2_ABI_COMPATIBLE + struct FileInfo + { + FileInfo(): bufpos(0), bytes(0) {} + std::streamoff bufpos; + Index64 bytes; + io::MappedFile::Ptr mapping; + boost::shared_ptr meta; + }; +#endif + + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + template friend class AttributeHandle; + + typedef Ptr (*FactoryMethod)(size_t); + + AttributeArray() : mCompressedBytes(0), mFlags(0) {} + virtual ~AttributeArray() {} + + /// Return a copy of this attribute. + virtual AttributeArray::Ptr copy() const = 0; + + /// Return an uncompressed copy of this attribute (will return a copy if not compressed). + virtual AttributeArray::Ptr copyUncompressed() const = 0; + + /// Return the length of this array. + virtual size_t size() const = 0; + + /// Return the number of bytes of memory used by this attribute. + virtual size_t memUsage() const = 0; + + /// Create a new attribute array of the given (registered) type and length. + static Ptr create(const NamePair& type, size_t length); + /// Return @c true if the given attribute type name is registered. + static bool isRegistered(const NamePair& type); + /// Clear the attribute type registry. + static void clearRegistry(); + + /// Return the name of this attribute's type. + virtual const NamePair& type() const = 0; + /// Return @c true if this attribute is of the same type as the template parameter. + template + bool isType() const { return this->type() == AttributeArrayType::attributeType(); } + + /// Return @c true if this attribute has a value type the same as the template parameter + template + bool hasValueType() const { return this->type().first == typeNameAsString();} + + /// Set value at given index @a n from @a sourceIndex of another @a sourceArray + virtual void set(const Index n, const AttributeArray& sourceArray, const Index sourceIndex) = 0; + + /// Return @c true if this array is stored as a single uniform value. + virtual bool isUniform() const = 0; + /// @brief If this array is uniform, replace it with an array of length size(). + /// @param fill if true, assign the uniform value to each element of the array. + virtual void expand(bool fill = true) = 0; + /// Replace the existing array with a uniform zero value. + virtual void collapse() = 0; + /// Compact the existing array to become uniform if all values are identical + virtual bool compact() = 0; + + /// Return @c true if this array is compressed. + bool isCompressed() const { return mCompressedBytes != 0; } + /// Compress the attribute array. + virtual bool compress() = 0; + /// Uncompress the attribute array. + virtual bool decompress() = 0; + + /// @brief Specify whether this attribute should be hidden (e.g., from UI or iterators). + /// @details This is useful if the attribute is used for blind data or as scratch space + /// for a calculation. + /// @note Attributes are not hidden by default. + void setHidden(bool state); + /// Return @c true if this attribute is hidden (e.g., from UI or iterators). + bool isHidden() const { return bool(mFlags & HIDDEN); } + + /// @brief Specify whether this attribute should only exist in memory + /// and not be serialized during stream output. + /// @note Attributes are not transient by default. + void setTransient(bool state); + /// Return @c true if this attribute is not serialized during stream output. + bool isTransient() const { return bool(mFlags & TRANSIENT); } + + /// @brief Retrieve the attribute array flags + uint16_t flags() const { return mFlags; } + + IndexIter beginIndex() const; + + /// Read attribute metadata and buffers from a stream. + virtual void read(std::istream&) = 0; + /// Write attribute metadata and buffers to a stream. + virtual void write(std::ostream&) const = 0; + + /// Ensures all data is in-core + virtual void loadData() const = 0; + + /// Check the compressed bytes and flags. If they are equal, perform a deeper + /// comparison check necessary on the inherited types (TypedAttributeArray) + /// Requires non operator implementation due to inheritance + bool operator==(const AttributeArray& other) const; + bool operator!=(const AttributeArray& other) const { return !this->operator==(other); } + +private: + /// Virtual function used by the comparison operator to perform + /// comparisons on inherited types + virtual bool isEqual(const AttributeArray& other) const = 0; + +protected: + /// Obtain an Accessor that stores getter and setter functors. + virtual AccessorBasePtr getAccessor() const = 0; + + /// Register a attribute type along with a factory function. + static void registerType(const NamePair& type, FactoryMethod); + /// Remove a attribute type from the registry. + static void unregisterType(const NamePair& type); + + size_t mCompressedBytes; + uint16_t mFlags; + + /// Out-of-core data +#ifndef OPENVDB_2_ABI_COMPATIBLE + boost::shared_ptr mFileInfo; +#endif +}; // class AttributeArray + + +//////////////////////////////////////// + + +/// Accessor base class for AttributeArray storage where type is not available +struct AttributeArray::AccessorBase { }; + +/// Templated Accessor stores typed function pointers used in binding +/// AttributeHandles +template +struct AttributeArray::Accessor : public AttributeArray::AccessorBase +{ + typedef T (*GetterPtr)(const AttributeArray* array, const Index n); + typedef void (*SetterPtr)(AttributeArray* array, const Index n, const T& value); + typedef void (*ValuePtr)(AttributeArray* array, const T& value); + + Accessor(GetterPtr getter, SetterPtr setter, ValuePtr collapser, ValuePtr filler) : + mGetter(getter), mSetter(setter), mCollapser(collapser), mFiller(filler) { } + + GetterPtr mGetter; + SetterPtr mSetter; + ValuePtr mCollapser; + ValuePtr mFiller; +}; // struct AttributeArray::Accessor + + +//////////////////////////////////////// + + +/// Typed class for storing attribute data +template > +class TypedAttributeArray: public AttributeArray +{ +public: + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + typedef ValueType_ ValueType; + typedef Codec_ Codec; + typedef typename Codec::StorageType StorageType; + + ////////// + + /// Default constructor, always constructs a uniform attribute. + explicit TypedAttributeArray(size_t n = 1, + const ValueType& uniformValue = zeroVal()); + /// Deep copy constructor (optionally decompress during copy). + TypedAttributeArray(const TypedAttributeArray&, bool uncompress = false); + /// Deep copy assignment operator. + TypedAttributeArray& operator=(const TypedAttributeArray&); + + virtual ~TypedAttributeArray() { this->deallocate(); } + + /// Return a copy of this attribute. + virtual AttributeArray::Ptr copy() const; + + /// Return an uncompressed copy of this attribute (will just return a copy if not compressed). + virtual AttributeArray::Ptr copyUncompressed() const; + + /// Return a new attribute array of the given length @a n with uniform value zero. + static Ptr create(size_t n); + + /// Cast an AttributeArray to TypedAttributeArray + static TypedAttributeArray& cast(AttributeArray& attributeArray); + + /// Cast an AttributeArray to TypedAttributeArray + static const TypedAttributeArray& cast(const AttributeArray& attributeArray); + + /// Return the name of this attribute's type (includes codec) + static const NamePair& attributeType(); + /// Return the name of this attribute's type. + virtual const NamePair& type() const { return attributeType(); } + + /// Return @c true if this attribute type is registered. + static bool isRegistered(); + /// Register this attribute type along with a factory function. + static void registerType(); + /// Remove this attribute type from the registry. + static void unregisterType(); + + /// Return the length of this array. + virtual size_t size() const { return mSize; }; + + /// Return the number of bytes of memory used by this attribute. + virtual size_t memUsage() const; + + /// Return the value at index @a n (assumes uncompressed and in-core) + ValueType getUnsafe(Index n) const; + /// Return the value at index @a n + ValueType get(Index n) const; + /// Return the @a value at index @a n (assumes uncompressed and in-core) + template void getUnsafe(Index n, T& value) const; + /// Return the @a value at index @a n + template void get(Index n, T& value) const; + + /// Non-member equivalent to getUnsafe() that static_casts array to this TypedAttributeArray + /// (assumes uncompressed and in-core) + static ValueType getUnsafe(const AttributeArray* array, const Index n); + + /// Set @a value at the given index @a n (assumes uncompressed and in-core) + void setUnsafe(Index n, const ValueType& value); + /// Set @a value at the given index @a n + void set(Index n, const ValueType& value); + /// Set @a value at the given index @a n (assumes uncompressed and in-core) + template void setUnsafe(Index n, const T& value); + /// Set @a value at the given index @a n + template void set(Index n, const T& value); + + /// Non-member equivalent to setUnsafe() that static_casts array to this TypedAttributeArray + /// (assumes uncompressed and in-core) + static void setUnsafe(AttributeArray* array, const Index n, const ValueType& value); + + /// Set value at given index @a n from @a sourceIndex of another @a sourceArray + virtual void set(const Index n, const AttributeArray& sourceArray, const Index sourceIndex); + + /// Return @c true if this array is stored as a single uniform value. + virtual bool isUniform() const { return mIsUniform; } + /// @brief Replace the single value storage with an array of length size(). + /// @note Non-uniform attributes are unchanged. + /// @param fill toggle to initialize the array elements with the pre-expanded value. + virtual void expand(bool fill = true); + /// Replace the existing array with a uniform zero value. + virtual void collapse(); + /// Compact the existing array to become uniform if all values are identical + virtual bool compact(); + + /// Replace the existing array with the given uniform value. + void collapse(const ValueType& uniformValue); + /// @brief Fill the existing array with the given value. + /// @note Identical to collapse() except a non-uniform array will not become uniform. + void fill(const ValueType& value); + + /// Non-member equivalent to collapse() that static_casts array to this TypedAttributeArray + static void collapse(AttributeArray* array, const ValueType& value); + /// Non-member equivalent to fill() that static_casts array to this TypedAttributeArray + static void fill(AttributeArray* array, const ValueType& value); + + /// Compress the attribute array. + virtual bool compress(); + /// Uncompress the attribute array. + virtual bool decompress(); + + /// Read attribute data from a stream. + virtual void read(std::istream& is); + /// Write attribute data to a stream. + virtual void write(std::ostream& os) const; + + /// Return @c true if this buffer's values have not yet been read from disk. + inline bool isOutOfCore() const; + + /// Ensures all data is in-core + virtual void loadData() const; + +protected: + virtual AccessorBasePtr getAccessor() const; + +private: + /// Load data from memory-mapped file. + inline void doLoad() const; + /// Load data from memory-mapped file (unsafe as this function is not protected by a mutex). + inline void doLoadUnsafe() const; + + /// Toggle out-of-core state + inline void setOutOfCore(const bool); + + /// Compare the this data to another attribute array. Used by the base class comparison operator + virtual bool isEqual(const AttributeArray& other) const; + + size_t arrayMemUsage() const; + void allocate(const size_t size); + void deallocate(); + + /// Helper function for use with registerType() + static AttributeArray::Ptr factory(size_t n) { return TypedAttributeArray::create(n); } + + static tbb::atomic sTypeName; + StorageType* mData; + size_t mSize; + bool mIsUniform; + tbb::spin_mutex mMutex; +}; // class TypedAttributeArray + + +//////////////////////////////////////// + + +/// AttributeHandles provide access to specific TypedAttributeArray methods without needing +/// to know the compression codec, however these methods also incur the cost of a function pointer +template +class AttributeHandle +{ +public: + typedef boost::shared_ptr > Ptr; + +protected: + typedef T (*GetterPtr)(const AttributeArray* array, const Index n); + typedef void (*SetterPtr)(AttributeArray* array, const Index n, const T& value); + typedef void (*ValuePtr)(AttributeArray* array, const T& value); + +public: + static Ptr create(const AttributeArray& array, const bool preserveCompression = true); + + AttributeHandle(const AttributeArray& array, const bool preserveCompression = true); + + bool isUniform() const; + + T get(Index n) const; + +protected: + const AttributeArray* mArray; + + GetterPtr mGetter; + SetterPtr mSetter; + ValuePtr mCollapser; + ValuePtr mFiller; + +private: + // local copy of AttributeArray (to preserve compression) + AttributeArray::Ptr mLocalArray; +}; // class AttributeHandle + + +/// Write-able version of AttributeHandle +template +class AttributeWriteHandle : public AttributeHandle +{ +public: + typedef boost::shared_ptr > Ptr; + + static Ptr create(AttributeArray& array); + + AttributeWriteHandle(AttributeArray& array); + + /// @brief If this array is uniform, replace it with an array of length size(). + /// @param fill if true, assign the uniform value to each element of the array. + void expand(bool fill = true); + + /// Replace the existing array with a uniform value (zero if none provided). + void collapse(); + void collapse(const T& uniformValue); + + /// Compact the existing array to become uniform if all values are identical + bool compact(); + + /// @brief Fill the existing array with the given value. + /// @note Identical to collapse() except a non-uniform array will not become uniform. + void fill(const T& value); + + void set(Index n, const T& value); +}; // class AttributeWriteHandle + + +typedef AttributeHandle AttributeHandleROF; +typedef AttributeWriteHandle AttributeHandleRWF; + +typedef AttributeHandle AttributeHandleROVec3f; +typedef AttributeWriteHandle AttributeHandleRWVec3f; + + +//////////////////////////////////////// + + +// Attribute codec implementation + + +template +template +inline void +NullAttributeCodec::decode(const StorageType& data, ValueType& val) +{ + val = static_cast(data); +} + + +template +template +inline void +NullAttributeCodec::encode(const StorageType& val, ValueType& data) +{ + data = static_cast(val); +} + + +template +template +inline void +FixedPointAttributeCodec::decode(const StorageType& data, ValueType& val) +{ + val = fixedPointToFloatingPoint(data); + + // shift value range to be -0.5 => 0.5 (as this is most commonly used for position) + + val -= ValueType(0.5); +} + + +template +template +inline void +FixedPointAttributeCodec::encode(const ValueType& val, StorageType& data) +{ + // shift value range to be -0.5 => 0.5 (as this is most commonly used for position) + + const ValueType newVal = val + ValueType(0.5); + + data = floatingPointToFixedPoint(newVal); +} + + +template +inline void +UnitVecAttributeCodec::decode(const StorageType& data, math::Vec3& val) +{ + val = math::QuantizedUnitVec::unpack(data); +} + + +template +inline void +UnitVecAttributeCodec::encode(const math::Vec3& val, StorageType& data) +{ + data = math::QuantizedUnitVec::pack(val); +} + + +//////////////////////////////////////// + +// TypedAttributeArray implementation + +template +tbb::atomic TypedAttributeArray::sTypeName; + + +template +TypedAttributeArray::TypedAttributeArray( + size_t n, const ValueType& uniformValue) + : AttributeArray() + , mData(new StorageType[1]) + , mSize(n) + , mIsUniform(true) + , mMutex() +{ + mSize = std::max(size_t(1), mSize); + Codec::encode(uniformValue, mData[0]); +} + + +template +TypedAttributeArray::TypedAttributeArray(const TypedAttributeArray& rhs, bool uncompress) + : AttributeArray(rhs) + , mData(NULL) + , mSize(rhs.mSize) + , mIsUniform(rhs.mIsUniform) + , mMutex() +{ + using attribute_compression::decompress; + using attribute_compression::uncompressedSize; + + // disable uncompress if data is not compressed + + if (!this->isCompressed()) uncompress = false; + + if (mIsUniform) { + this->allocate(1); + mData[0] = rhs.mData[0]; + } else if (this->isOutOfCore()) { + // do nothing + } else if (this->isCompressed()) { + char* buffer = 0; + if (uncompress) { + rhs.doLoad(); + const char* charBuffer = reinterpret_cast(rhs.mData); + buffer = decompress(charBuffer, uncompressedSize(charBuffer)); + } + if (buffer) mCompressedBytes = 0; + else { + // decompression wasn't requested or failed so deep copy instead + buffer = new char[mCompressedBytes]; + memcpy(buffer, rhs.mData, mCompressedBytes); + } + assert(buffer); + mData = reinterpret_cast(buffer); + } else { + this->allocate(mSize); + memcpy(mData, rhs.mData, mSize * sizeof(StorageType)); + } +} + + +template +typename TypedAttributeArray::TypedAttributeArray& +TypedAttributeArray::operator=(const TypedAttributeArray& rhs) +{ + if (&rhs != this) { + tbb::spin_mutex::scoped_lock lock(mMutex); + + this->deallocate(); + + mFlags = rhs.mFlags; + mCompressedBytes = rhs.mCompressedBytes; + mSize = rhs.mSize; + mIsUniform = rhs.mIsUniform; + + if (mIsUniform) { + this->allocate(1); + mData[0] = rhs.mData[0]; +#ifndef OPENVDB_2_ABI_COMPATIBLE + } else if (rhs.isOutOfCore()) { + mFileInfo = rhs.mFileInfo; +#endif + } else if (this->isCompressed()) { + char* buffer = new char[mCompressedBytes]; + memcpy(buffer, rhs.mData, mCompressedBytes); + mData = reinterpret_cast(buffer); + } else { + this->allocate(mSize); + memcpy(mData, rhs.mData, mSize * sizeof(StorageType)); + } + } +} + + +template +inline const NamePair& +TypedAttributeArray::attributeType() +{ + if (sTypeName == NULL) { + std::ostringstream ostr1, ostr2; + ostr1 << typeNameAsString(); + ostr2 << Codec::name() << "_" << typeNameAsString(); + NamePair* s = new NamePair(ostr1.str(), ostr2.str()); + if (sTypeName.compare_and_swap(s, NULL) != NULL) delete s; + } + return *sTypeName; +} + + +template +inline bool +TypedAttributeArray::isRegistered() +{ + return AttributeArray::isRegistered(TypedAttributeArray::attributeType()); +} + + +template +inline void +TypedAttributeArray::registerType() +{ + AttributeArray::registerType(TypedAttributeArray::attributeType(), TypedAttributeArray::factory); +} + + +template +inline void +TypedAttributeArray::unregisterType() +{ + AttributeArray::unregisterType(TypedAttributeArray::attributeType()); +} + + +template +inline typename TypedAttributeArray::Ptr +TypedAttributeArray::create(size_t n) +{ + return Ptr(new TypedAttributeArray(n)); +} + +template +inline TypedAttributeArray& +TypedAttributeArray::cast(AttributeArray& attributeArray) +{ + if (!attributeArray.isType()) { + OPENVDB_THROW(TypeError, "Invalid Attribute Type"); + } + return static_cast(attributeArray); +} + +template +inline const TypedAttributeArray& +TypedAttributeArray::cast(const AttributeArray& attributeArray) +{ + if (!attributeArray.isType()) { + OPENVDB_THROW(TypeError, "Invalid Attribute Type"); + } + return static_cast(attributeArray); +} + +template +AttributeArray::Ptr +TypedAttributeArray::copy() const +{ + return AttributeArray::Ptr(new TypedAttributeArray(*this)); +} + + +template +AttributeArray::Ptr +TypedAttributeArray::copyUncompressed() const +{ + return AttributeArray::Ptr(new TypedAttributeArray(*this, /*decompress = */true)); +} + + +template +size_t +TypedAttributeArray::arrayMemUsage() const +{ + if (mIsUniform) return sizeof(StorageType); + if (this->isOutOfCore()) return 0; + if (this->isCompressed()) return mCompressedBytes; + + return mSize * sizeof(StorageType); +} + + +template +void +TypedAttributeArray::allocate(const size_t size) +{ + assert(!mData); + mData = new StorageType[size]; +} + + +template +void +TypedAttributeArray::deallocate() +{ +#ifndef OPENVDB_2_ABI_COMPATIBLE + // detach from file if delay-loaded + if (this->isOutOfCore()) { + this->setOutOfCore(false); + this->mFileInfo.reset(); + } +#endif + if (mData) { + delete[] mData; + mData = NULL; + } +} + + +template +size_t +TypedAttributeArray::memUsage() const +{ + return sizeof(*this) + (mData != NULL ? this->arrayMemUsage() : 0); +} + + +template +typename TypedAttributeArray::ValueType +TypedAttributeArray::getUnsafe(Index n) const +{ + assert(!this->isCompressed()); + assert(!this->isOutOfCore()); + + ValueType val; + Codec::decode(/*in=*/mData[mIsUniform ? 0 : n], /*out=*/val); + return val; +} + + +template +typename TypedAttributeArray::ValueType +TypedAttributeArray::get(Index n) const +{ + if (this->isCompressed()) const_cast(this)->decompress(); + else if (this->isOutOfCore()) this->doLoad(); + + return this->getUnsafe(n); +} + + +template +template +void +TypedAttributeArray::getUnsafe(Index n, T& val) const +{ + assert(!this->isCompressed()); + assert(!this->isOutOfCore()); + + ValueType tmp; + Codec::decode(/*in=*/mData[mIsUniform ? 0 : n], /*out=*/tmp); + val = static_cast(tmp); +} + + +template +template +void +TypedAttributeArray::get(Index n, T& val) const +{ + if (this->isCompressed()) const_cast(this)->decompress(); + else if (this->isOutOfCore()) this->doLoad(); + + this->getUnsafe(n, val); +} + + +template +typename TypedAttributeArray::ValueType +TypedAttributeArray::getUnsafe(const AttributeArray* array, const Index n) +{ + return static_cast*>(array)->getUnsafe(n); +} + + +template +void +TypedAttributeArray::setUnsafe(Index n, const ValueType& val) +{ + assert(!this->isCompressed()); + assert(!this->isOutOfCore()); + + if (mIsUniform) this->expand(); + + Codec::encode(/*in=*/val, /*out=*/mData[n]); +} + + +template +void +TypedAttributeArray::set(Index n, const ValueType& val) +{ + if (this->isCompressed()) this->decompress(); + else if (this->isOutOfCore()) this->doLoad(); + + this->setUnsafe(n, val); +} + + +template +template +void +TypedAttributeArray::setUnsafe(Index n, const T& val) +{ + assert(!this->isCompressed()); + assert(!this->isOutOfCore()); + + if (mIsUniform) this->expand(); + + const ValueType tmp = static_cast(val); + Codec::encode(/*in=*/tmp, /*out=*/mData[n]); +} + + +template +template +void +TypedAttributeArray::set(Index n, const T& val) +{ + if (this->isCompressed()) this->decompress(); + else if (this->isOutOfCore()) this->doLoad(); + + this->setUnsafe(n, val); +} + + +template +void +TypedAttributeArray::setUnsafe(AttributeArray* array, const Index n, const ValueType& value) +{ + static_cast*>(array)->setUnsafe(n, value); +} + + +template +void +TypedAttributeArray::set(Index n, const AttributeArray& sourceArray, const Index sourceIndex) +{ + const TypedAttributeArray& sourceTypedArray = static_cast(sourceArray); + + ValueType sourceValue; + sourceTypedArray.get(sourceIndex, sourceValue); + + this->set(n, sourceValue); +} + + +template +void +TypedAttributeArray::expand(bool fill) +{ + if (!mIsUniform) return; + + const StorageType val = mData[0]; + + { + tbb::spin_mutex::scoped_lock lock(mMutex); + this->deallocate(); + this->allocate(mSize); + } + + mCompressedBytes = 0; + mIsUniform = false; + + if (fill) { + for (size_t i = 0; i < mSize; ++i) mData[i] = val; + } +} + + +template +bool +TypedAttributeArray::compact() +{ + if (mIsUniform) return true; + + // compaction is not possible if any values are different + const ValueType_ val = this->get(0); + for (size_t i = 1; i < size(); i++) { + if (this->get(i) != val) return false; + } + + this->collapse(this->get(0)); + return true; +} + + +template +void +TypedAttributeArray::collapse() +{ + this->collapse(zeroVal()); +} + + +template +void +TypedAttributeArray::collapse(const ValueType& uniformValue) +{ + if (!mIsUniform) { + tbb::spin_mutex::scoped_lock lock(mMutex); + this->deallocate(); + this->allocate(1); + mIsUniform = true; + } + Codec::encode(uniformValue, mData[0]); +} + + +template +void +TypedAttributeArray::collapse(AttributeArray* array, const ValueType& value) +{ + static_cast*>(array)->collapse(value); +} + + +template +void +TypedAttributeArray::fill(const ValueType& value) +{ + if (this->isOutOfCore()) { + tbb::spin_mutex::scoped_lock lock(mMutex); + this->deallocate(); + this->allocate(mSize); + } + + const size_t size = mIsUniform ? 1 : mSize; + for (size_t i = 0; i < size; ++i) { + Codec::encode(value, mData[i]); + } +} + + +template +void +TypedAttributeArray::fill(AttributeArray* array, const ValueType& value) +{ + static_cast*>(array)->fill(value); +} + + +template +inline bool +TypedAttributeArray::compress() +{ + using attribute_compression::canCompress; + using attribute_compression::compress; + + if (!canCompress()) return false; + + if (!mIsUniform && !this->isCompressed()) { + + tbb::spin_mutex::scoped_lock lock(mMutex); + + this->doLoadUnsafe(); + + const size_t typeSize = sizeof(typename Codec_::StorageType); + const int inBytes = int(mSize * sizeof(StorageType)); + int outBytes; + char* charBuffer = reinterpret_cast(mData); + char* buffer = compress(charBuffer, typeSize, inBytes, outBytes, /*cleanup=*/true); + + if (buffer) { + mData = reinterpret_cast(buffer); + mCompressedBytes = size_t(outBytes); + return true; + } + } + + return false; +} + + +template +inline bool +TypedAttributeArray::decompress() +{ + using attribute_compression::decompress; + using attribute_compression::uncompressedSize; + + tbb::spin_mutex::scoped_lock lock(mMutex); + + if (this->isCompressed()) { + this->doLoadUnsafe(); + char* charBuffer = reinterpret_cast(this->mData); + char* buffer = decompress(charBuffer, uncompressedSize(charBuffer)); + if (buffer) { + mData = reinterpret_cast(buffer); + mCompressedBytes = 0; + return true; + } + } + + return false; +} + + +template +bool +TypedAttributeArray::isOutOfCore() const +{ +#ifndef OPENVDB_2_ABI_COMPATIBLE + return (mFlags & OUTOFCORE); +#else + return false; +#endif +} + + +template +void +TypedAttributeArray::setOutOfCore(const bool b) +{ +#ifndef OPENVDB_2_ABI_COMPATIBLE + if (b) mFlags |= OUTOFCORE; + else mFlags &= ~OUTOFCORE; +#else + (void) b; +#endif +} + + +template +void +TypedAttributeArray::doLoad() const +{ +#ifndef OPENVDB_2_ABI_COMPATIBLE + if (!(this->isOutOfCore())) return; + + TypedAttributeArray* self = const_cast*>(this); + + // This lock will be contended at most once, after which this buffer + // will no longer be out-of-core. + tbb::spin_mutex::scoped_lock lock(self->mMutex); + this->doLoadUnsafe(); +#endif +} + + +template +void +TypedAttributeArray::loadData() const +{ + this->doLoad(); +} + + +template +void +TypedAttributeArray::read(std::istream& is) +{ + using attribute_compression::decompress; + + // read data + + Index64 bytes = Index64(0); + is.read(reinterpret_cast(&bytes), sizeof(Index64)); + bytes = bytes - /*flags*/sizeof(Int16) - /*size*/sizeof(Index64); + + Int16 flags = Int16(0); + is.read(reinterpret_cast(&flags), sizeof(Int16)); + mFlags = flags; + + Index64 size = Index64(0); + is.read(reinterpret_cast(&size), sizeof(Index64)); + mSize = size; + + char* buffer = new char[bytes]; + + // read uniform and compressed state + + mIsUniform = mFlags & WRITEUNIFORM; + mCompressedBytes = mFlags & WRITEMEMCOMPRESS ? bytes : Index64(0); + + // clear uniform and compress flags + + mFlags &= Int16(~WRITEUNIFORM & ~WRITEMEMCOMPRESS); + + tbb::spin_mutex::scoped_lock lock(mMutex); + + this->deallocate(); + +#ifndef OPENVDB_2_ABI_COMPATIBLE + // If this array is being read from a memory-mapped file, delay loading of its data + // until the data is actually accessed. + io::MappedFile::Ptr mappedFile = io::getMappedFilePtr(is); + const bool delayLoad = (mappedFile.get() != NULL); + + if (delayLoad) { + this->setOutOfCore(true); + mFileInfo.reset(new FileInfo); + mFileInfo->bufpos = is.tellg(); + mFileInfo->mapping = mappedFile; + mFileInfo->bytes = bytes; + mFileInfo->meta = io::getStreamMetadataPtr(is); + + // read and discard buffer + is.read(buffer, bytes); + delete[] buffer; + return; + } +#endif + + is.read(buffer, bytes); + + // compressed on-disk + + if (mFlags & WRITEDISKCOMPRESS) { + + // decompress buffer + + const int inBytes = int(mSize * sizeof(StorageType)); + char* newBuffer = decompress(buffer, inBytes, /*cleanup=*/true); + if (newBuffer) buffer = newBuffer; + } + + // set data to buffer + + mData = reinterpret_cast(buffer); + + // clear all write flags + + mFlags &= Int16(~WRITEDISKCOMPRESS); +} + + +template +void +TypedAttributeArray::write(std::ostream& os) const +{ + using attribute_compression::compress; + + if (this->isTransient()) return; + + Int16 flags(mFlags); + Index64 size(mSize); + + boost::scoped_array compressedBuffer; + int compressedBytes = 0; + + this->doLoad(); + + if (mIsUniform) + { + flags |= WRITEUNIFORM; + } + else if (this->isCompressed()) + { + flags |= WRITEMEMCOMPRESS; + } + else if (io::getDataCompression(os) & io::COMPRESS_BLOSC) + { + const char* charBuffer = reinterpret_cast(mData); + const size_t typeSize = sizeof(typename Codec_::StorageType); + const int inBytes = int(mSize * sizeof(StorageType)); + compressedBuffer.reset(compress(charBuffer, typeSize, inBytes, compressedBytes)); + if (compressedBuffer) flags |= WRITEDISKCOMPRESS; + } + + Index64 bytes = /*flags*/ sizeof(Int16) + /*size*/ sizeof(Index64); + + bytes += compressedBuffer ? compressedBytes : this->arrayMemUsage(); + + // write data + + os.write(reinterpret_cast(&bytes), sizeof(Index64)); + os.write(reinterpret_cast(&flags), sizeof(Int16)); + os.write(reinterpret_cast(&size), sizeof(Index64)); + + if (compressedBuffer) os.write(reinterpret_cast(compressedBuffer.get()), compressedBytes); + else os.write(reinterpret_cast(mData), this->arrayMemUsage()); +} + + +template +void +TypedAttributeArray::doLoadUnsafe() const +{ + using attribute_compression::decompress; + +#ifndef OPENVDB_2_ABI_COMPATIBLE + if (!(this->isOutOfCore())) return; + + // this function expects the mutex to already be locked + + TypedAttributeArray* self = const_cast*>(this); + + assert(self->mFileInfo); + assert(self->mFileInfo->mapping.get() != NULL); + + FileInfo& info = *(self->mFileInfo); + + boost::shared_ptr buf = info.mapping->createBuffer(); + std::istream is(buf.get()); + + const Index64 bytes = info.bytes; + + is.seekg(info.bufpos); + + char* buffer = new char[bytes]; + is.read(buffer, bytes); + + // compressed on-disk + + if (mFlags & WRITEDISKCOMPRESS) { + + // decompress buffer + + const int inBytes = int(mSize * sizeof(StorageType)); + char* newBuffer = decompress(buffer, inBytes, /*cleanup=*/true); + if (newBuffer) buffer = newBuffer; + } + + // set data to buffer + + self->mData = reinterpret_cast(buffer); + + // clear write and out-of-core flags + + self->mFlags &= Int16(~WRITEDISKCOMPRESS & ~OUTOFCORE); +#endif +} + + +template +AttributeArray::AccessorBasePtr +TypedAttributeArray::getAccessor() const +{ + // use the faster 'unsafe' get and set methods as attribute handles + // ensure data is uncompressed and in-core when constructed + + return AccessorBasePtr(new AttributeArray::Accessor( + &TypedAttributeArray::getUnsafe, + &TypedAttributeArray::setUnsafe, + &TypedAttributeArray::collapse, + &TypedAttributeArray::fill)); +} + + +template +bool +TypedAttributeArray::isEqual(const AttributeArray& other) const +{ + const TypedAttributeArray* const otherT = dynamic_cast* >(&other); + if(!otherT) return false; + if(this->mSize != otherT->mSize || + this->mIsUniform != otherT->mIsUniform || + *this->sTypeName != *otherT->sTypeName) return false; + + this->doLoad(); + + const StorageType *target = this->mData, *source = otherT->mData; + if (!target && !source) return true; + if (!target || !source) return false; + Index n = this->mIsUniform ? 1 : mSize; + while (n && math::isExactlyEqual(*target++, *source++)) --n; + return n == 0; +} + +//////////////////////////////////////// + +// AttributeHandle implementation + +template +typename AttributeHandle::Ptr +AttributeHandle::create(const AttributeArray& array, const bool preserveCompression) +{ + return typename AttributeHandle::Ptr(new AttributeHandle(array, preserveCompression)); +} + +template +AttributeHandle::AttributeHandle(const AttributeArray& array, const bool preserveCompression) + : mArray(&array) +{ + // load data if delay-loaded + + mArray->loadData(); + + // if array is compressed and preserve compression is true, copy and decompress + // into a local copy that is destroyed with handle to maintain thread-safety + + if (array.isCompressed()) + { + if (preserveCompression) { + mLocalArray = array.copyUncompressed(); + mLocalArray->decompress(); + mArray = mLocalArray.get(); + } + else { + const_cast(mArray)->decompress(); + } + } + + // bind getter and setter methods + + AttributeArray::AccessorBasePtr accessor = mArray->getAccessor(); + assert(accessor); + + AttributeArray::Accessor* typedAccessor = static_cast*>(accessor.get()); + + if (!typedAccessor) { + OPENVDB_THROW(RuntimeError, "Cannot bind AttributeHandle due to mis-matching types."); + } + + mGetter = typedAccessor->mGetter; + mSetter = typedAccessor->mSetter; + mCollapser = typedAccessor->mCollapser; + mFiller = typedAccessor->mFiller; +} + + +template +T AttributeHandle::get(Index n) const +{ + return mGetter(mArray, n); +} + +template +bool AttributeHandle::isUniform() const +{ + return mArray->isUniform(); +} + +//////////////////////////////////////// + +// AttributeWriteHandle implementation + +template +typename AttributeWriteHandle::Ptr +AttributeWriteHandle::create(AttributeArray& array) +{ + return typename AttributeWriteHandle::Ptr(new AttributeWriteHandle(array)); +} + +template +AttributeWriteHandle::AttributeWriteHandle(AttributeArray& array) + : AttributeHandle(array, /*preserveCompression = */ false) { } + +template +void AttributeWriteHandle::set(Index n, const T& value) +{ + this->mSetter(const_cast(this->mArray), n, value); +} + +template +void AttributeWriteHandle::expand(const bool fill) +{ + const_cast(this->mArray)->expand(fill); +} + +template +void AttributeWriteHandle::collapse() +{ + const_cast(this->mArray)->collapse(); +} + +template +bool AttributeWriteHandle::compact() +{ + return const_cast(this->mArray)->compact(); +} + +template +void AttributeWriteHandle::collapse(const T& uniformValue) +{ + this->mCollapser(const_cast(this->mArray), uniformValue); +} + +template +void AttributeWriteHandle::fill(const T& value) +{ + this->mFiller(const_cast(this->mArray), value); +} + +} // namespace tools + +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + + +#endif // OPENVDB_TOOLS_ATTRIBUTE_ARRAY_HAS_BEEN_INCLUDED + + +// Copyright (c) 2015-2016 Double Negative Visual Effects +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb_points/tools/AttributeGroup.h b/nuparu/include/openvdb/include/openvdb_points/tools/AttributeGroup.h new file mode 100644 index 00000000..830be73a --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_points/tools/AttributeGroup.h @@ -0,0 +1,209 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015-2016 Double Negative Visual Effects +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of Double Negative Visual Effects 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file AttributeGroup.h +/// +/// @authors Dan Bailey +/// +/// @brief Attribute Group access and filtering for iteration. +/// + + +#ifndef OPENVDB_TOOLS_ATTRIBUTE_GROUP_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_ATTRIBUTE_GROUP_HAS_BEEN_INCLUDED + +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + + +typedef uint8_t GroupType; + + +//////////////////////////////////////// + + +class GroupAttributeArray : public TypedAttributeArray > +{ +public: + /// Default constructor, always constructs a uniform attribute. + explicit GroupAttributeArray( size_t n = 1, + const ValueType& uniformValue = zeroVal()); + /// Deep copy constructor (optionally decompress during copy). + GroupAttributeArray(const GroupAttributeArray& array, + const bool decompress = false); + + /// Cast an AttributeArray to GroupAttributeArray + static GroupAttributeArray& cast(AttributeArray& attributeArray); + + /// Cast an AttributeArray to GroupAttributeArray + static const GroupAttributeArray& cast(const AttributeArray& attributeArray); + + /// Return @c true if the AttributeArray provided is a group + static bool isGroup(const AttributeArray& attributeArray); + + /// @brief Specify whether this attribute is for tracking group membership + /// @note Attributes are not group attributes by default. + void setGroup(bool state); + /// Return @c true if this attribute is for tracking groups + bool isGroup() const { return bool(mFlags & GROUP); } + +}; // class GroupAttributeArray + + +inline GroupAttributeArray& +GroupAttributeArray::cast(AttributeArray& attributeArray) +{ + if (!attributeArray.isType()) { + OPENVDB_THROW(TypeError, "Invalid Attribute Type"); + } + return static_cast(attributeArray); +} + + +inline const GroupAttributeArray& +GroupAttributeArray::cast(const AttributeArray& attributeArray) +{ + if (!attributeArray.isType()) { + OPENVDB_THROW(TypeError, "Invalid Attribute Type"); + } + return static_cast(attributeArray); +} + + +inline bool +GroupAttributeArray::isGroup(const AttributeArray& attributeArray) +{ + if (!attributeArray.isType()) return false; + + return GroupAttributeArray::cast(attributeArray).isGroup(); +} + + +//////////////////////////////////////// + + +class GroupHandle +{ +public: + // Dummy class that distinguishes an offset from a bitmask on construction + struct BitMask { }; + + typedef std::pair GroupIndex; + + GroupHandle(const GroupAttributeArray& array, const GroupType& offset); + GroupHandle(const GroupAttributeArray& array, const GroupType& bitMask, BitMask); + + size_t size() const { return mArray.size(); } + bool isUniform() const { return mArray.isUniform(); } + + bool get(Index n) const; + +protected: + const GroupAttributeArray& mArray; + const GroupType mBitMask; +}; // class GroupHandle + + +//////////////////////////////////////// + + +class GroupWriteHandle : public GroupHandle +{ +public: + + GroupWriteHandle(GroupAttributeArray& array, const GroupType& offset); + + void set(Index n, bool on); + + /// @brief Set membership for the whole array and attempt to collapse + /// + /// @param on True or false for inclusion in group + /// + /// @note This method guarantees that all attributes will have group membership + /// changed according to the input bool, however compaction will not be performed + /// if other groups that share the same underlying array are non-uniform. + /// The return value indicates if the group array ends up being uniform. + bool collapse(bool on); + +}; // class GroupWriteHandle + + +//////////////////////////////////////// + + +/// Index filtering on group membership +class GroupFilter +{ +public: + struct Data + { + Data(const Name& _attribute) + : attribute(_attribute) { } + const Name attribute; + }; + + GroupFilter(const GroupHandle& handle) + : mHandle(handle) { } + + template + static GroupFilter create(const LeafT& leaf, const Data& data) { + return GroupFilter(leaf.groupHandle(data.attribute)); + } + + template + bool valid(const IterT& iter) const { + return mHandle.get(*iter); + } + +private: + const GroupHandle mHandle; +}; // class GroupFilter + + +//////////////////////////////////////// + + +} // namespace tools + +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + + +#endif // OPENVDB_TOOLS_ATTRIBUTE_GROUP_HAS_BEEN_INCLUDED + + +// Copyright (c) 2015-2016 Double Negative Visual Effects +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb_points/tools/AttributeSet.h b/nuparu/include/openvdb/include/openvdb_points/tools/AttributeSet.h new file mode 100644 index 00000000..3bb5aafd --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_points/tools/AttributeSet.h @@ -0,0 +1,405 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015-2016 Double Negative Visual Effects +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of Double Negative Visual Effects 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file AttributeSet.h +/// +/// @authors Dan Bailey, Mihai Alden, Peter Cucka +/// +/// @brief Set of Attribute Arrays which tracks metadata about each array. +/// + + +#ifndef OPENVDB_TOOLS_ATTRIBUTE_SET_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_ATTRIBUTE_SET_HAS_BEEN_INCLUDED + +#include +#include + +#include // integer_traits +#include // shared_ptr + +#include + +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + + +//////////////////////////////////////// + + +/// Ordered collection of uniquely-named attribute arrays +class AttributeSet +{ +public: + enum { INVALID_POS = boost::integer_traits::const_max }; + + typedef boost::shared_ptr Ptr; + typedef boost::shared_ptr ConstPtr; + + class Descriptor; + + typedef boost::shared_ptr DescriptorPtr; + typedef boost::shared_ptr DescriptorConstPtr; + + ////////// + + struct Util + { + /// Attribute and type name pair. + struct NameAndType { + NameAndType(const std::string& n, const NamePair& t) + : name(n), type(t) {} + Name name; + NamePair type; + }; + + typedef std::vector NameAndTypeVec; + typedef std::map NameToPosMap; + typedef std::pair GroupIndex; + }; + + ////////// + + AttributeSet(); + + /// Construct from the given descriptor + explicit AttributeSet(const DescriptorPtr&, size_t arrayLength = 1); + + /// Shallow copy constructor, the descriptor and attribute arrays will be shared. + AttributeSet(const AttributeSet&); + + //@{ + /// @brief Return a reference to this attribute set's descriptor, which might + /// be shared with other sets. + Descriptor& descriptor() { return *mDescr; } + const Descriptor& descriptor() const { return *mDescr; } + //@} + + /// @brief Return a pointer to this attribute set's descriptor, which might be + /// shared with other sets + DescriptorPtr descriptorPtr() const { return mDescr; } + + /// Return the number of attributes in this set. + size_t size() const { return mAttrs.size(); } + + /// Return the number of attributes with this flag set + size_t size(const uint16_t flag) const; + + /// Return the number of bytes of memory used by this attribute set. + size_t memUsage() const; + + /// @brief Return the position of the attribute array whose name is @a name, + /// or @c INVALID_POS if no match is found. + size_t find(const std::string& name) const; + + /// @brief Replace the attribute array whose name is @a name. + /// @return The position of the updated attribute array or @c INVALID_POS + /// if the given name does not exist or if the replacement failed because + /// the new array type does not comply with the descriptor. + size_t replace(const std::string& name, const AttributeArray::Ptr&); + + /// @brief Replace the attribute array stored at position @a pos in this container. + /// @return The position of the updated attribute array or @c INVALID_POS + /// if replacement failed because the new array type does not comply with + /// the descriptor. + size_t replace(size_t pos, const AttributeArray::Ptr&); + + //@{ + /// @brief Return a pointer to the attribute array whose name is @a name or + /// a null pointer if no match is found. + const AttributeArray* getConst(const std::string& name) const; + const AttributeArray* get(const std::string& name) const; + AttributeArray* get(const std::string& name); + //@} + + //@{ + /// @brief Return a pointer to the attribute array stored at position @a pos + /// in this set. + const AttributeArray* getConst(size_t pos) const; + const AttributeArray* get(size_t pos) const; + AttributeArray* get(size_t pos); + //@} + + //@{ + /// @brief Return the group offset from the name or index of the group + /// A group attribute array is a single byte (8-bit), each bit of which + /// can denote a group. The group offset is the position of the bit that + /// denotes the requested group if all group attribute arrays in the set + /// (and only attribute arrays marked as group) were to be laid out linearly + /// according to their order in the set. + size_t groupOffset(const Name& groupName) const; + size_t groupOffset(const Util::GroupIndex& index) const; + //@} + + /// Return the group index from the name of the group + Util::GroupIndex groupIndex(const Name& groupName) const; + /// Return the group index from the offset of the group + /// @note see offset description for groupOffset() + Util::GroupIndex groupIndex(const size_t offset) const; + + /// Create an iterator for iterating through point indices + IndexIter beginIndex() const; + + /// Return true if the attribute array stored at position @a pos is shared. + bool isShared(size_t pos) const; + /// @brief If the attribute array stored at position @a pos is shared, + /// replace the array with a deep copy of itself that is not + /// shared with anyone else. + void makeUnique(size_t pos); + + /// Append attribute @a attribute (simple method) + AttributeArray::Ptr appendAttribute(const Util::NameAndType& attribute, + Metadata::Ptr defaultValue = Metadata::Ptr()); + + /// Append attribute @a attribute (descriptor-sharing) + /// Requires current descriptor to match @a expected + /// On append, current descriptor is replaced with @a replacement + AttributeArray::Ptr appendAttribute(const Util::NameAndType& attribute, + const Descriptor& expected, DescriptorPtr& replacement); + + /// Drop attributes with @a pos indices (simple method) + /// Creates a new descriptor for this attribute set + void dropAttributes(const std::vector& pos); + + /// Drop attributes with @a pos indices (descriptor-sharing method) + /// Requires current descriptor to match @a expected + /// On drop, current descriptor is replaced with @a replacement + void dropAttributes(const std::vector& pos, + const Descriptor& expected, DescriptorPtr& replacement); + + /// Re order attribute set to match a provided descriptor + /// Replaces own descriptor with @a replacement + void reorderAttributes(const DescriptorPtr& replacement); + + /// Re-name attributes in set to match a provided descriptor + /// Replaces own descriptor with @a replacement + void renameAttributes(const Descriptor& expected, DescriptorPtr& replacement); + + /// Read the entire set from a stream. + void read(std::istream&); + /// Write the entire set to a stream. + void write(std::ostream&) const; + + /// This will read the attribute descriptor from a stream, but no attribute data. + void readMetadata(std::istream&); + /// This will write the attribute descriptor to a stream, but no attribute data. + void writeMetadata(std::ostream&) const; + + /// Read attribute data from a stream. + void readAttributes(std::istream&); + /// Write attribute data to a stream. + void writeAttributes(std::ostream&) const; + + /// Compare the descriptors and attribute arrays on the attribute sets + /// Exit early if the descriptors do not match + bool operator==(const AttributeSet& other) const; + bool operator!=(const AttributeSet& other) const { return !this->operator==(other); } + +private: + /// Disallow assignment, since it wouldn't be obvious whether the copy is deep or shallow. + AttributeSet& operator=(const AttributeSet&); + + typedef std::vector AttrArrayVec; + + DescriptorPtr mDescr; + AttrArrayVec mAttrs; +}; // class AttributeSet + +//////////////////////////////////////// + + +/// @brief An immutable object that stores name, type and AttributeSet position +/// for a constant collection of attribute arrays. +/// @note The attribute name is actually mutable, but the attribute type +/// and position can not be changed after creation. +class AttributeSet::Descriptor +{ +public: + typedef boost::shared_ptr Ptr; + + typedef Util::NameAndType NameAndType; + typedef Util::NameAndTypeVec NameAndTypeVec; + typedef Util::GroupIndex GroupIndex; + typedef Util::NameToPosMap NameToPosMap; + typedef NameToPosMap::const_iterator ConstIterator; + + /// Utility method to construct a NameAndType sequence. + struct Inserter { + NameAndTypeVec vec; + Inserter& add(const NameAndType& nameAndType) { + vec.push_back(nameAndType); return *this; + } + Inserter& add(const Name& name, const NamePair& type) { + vec.push_back(NameAndType(name, type)); return *this; + } + Inserter& add(const NameAndTypeVec& other) { + for (NameAndTypeVec::const_iterator it = other.begin(), itEnd = other.end(); it != itEnd; ++it) { + vec.push_back(NameAndType(it->name, it->type)); + } + return *this; + } + }; + + ////////// + + Descriptor(); + + /// Copy constructor + Descriptor(const Descriptor&); + + /// Create a new descriptor from the given attribute and type name pairs. + static Ptr create(const NameAndTypeVec&); + + /// Create a new descriptor from the given attribute and type name pairs + /// and copy the group maps and metamap. + static Ptr create(const NameAndTypeVec&, const NameToPosMap&, const MetaMap&); + + /// Create a new descriptor from a position attribute type and assumes "P" (for convenience). + static Ptr create(const NamePair&); + + Ptr duplicateAppend(const NameAndType& attribute) const; + Ptr duplicateAppend(const NameAndTypeVec& vec) const; + Ptr duplicateDrop(const std::vector& pos) const; + + /// Return the number of attributes in this descriptor. + size_t size() const { return mTypes.size(); } + + /// Return the number of bytes of memory used by this attribute set. + size_t memUsage() const; + + /// @brief Return the position of the attribute array whose name is @a name, + /// or @c INVALID_POS if no match is found. + size_t find(const std::string& name) const; + + /// Rename an attribute array + size_t rename(const std::string& fromName, const std::string& toName); + + /// Return the name of the attribute array's type. + const Name& valueType(size_t pos) const; + /// Return the name of the attribute array's type. + const NamePair& type(size_t pos) const; + + /// Retrieve metadata map + MetaMap& getMetadata(); + const MetaMap& getMetadata() const; + + /// Return true if the attribute has a default value + bool hasDefaultValue(const Name& name) const; + /// Get a default value for an existing attribute + template + ValueType getDefaultValue(const Name& name) const; + /// Set a default value for an existing attribute + void setDefaultValue(const Name& name, const Metadata& defaultValue); + // Remove the default value if it exists + void removeDefaultValue(const Name& name); + // Prune any default values for which the key is no longer present + void pruneUnusedDefaultValues(); + + /// Return true if this descriptor is equal to the given one. + bool operator==(const Descriptor&) const; + /// Return true if this descriptor is not equal to the given one. + bool operator!=(const Descriptor& rhs) const { return !this->operator==(rhs); } + /// Return true if this descriptor contains the same attributes + /// as the given descriptor, ignoring attribute order + bool hasSameAttributes(const Descriptor& rhs) const; + + /// Return a reference to the name-to-position map. + const NameToPosMap& map() const { return mNameMap; } + /// Return a reference to the name-to-position group map. + const NameToPosMap& groupMap() const { return mGroupMap; } + + /// Append to a vector of names and types from this Descriptor in position order + void appendTo(NameAndTypeVec& attrs) const; + + /// Return @c true if group exists + bool hasGroup(const Name& group) const; + /// Define a group name to offset mapping + void setGroup(const Name& group, const size_t offset); + /// Drop any mapping keyed by group name + void dropGroup(const Name& group); + /// Clear all groups + void clearGroups(); + + /// Return a unique name for an attribute array based on given name + const Name uniqueName(const Name& name) const; + + /// Serialize this descriptor to the given stream. + void write(std::ostream&) const; + /// Unserialize this transform from the given stream. + void read(std::istream&); + +private: + size_t insert(const std::string& name, const NamePair& typeName); + NameToPosMap mNameMap; + std::vector mTypes; + NameToPosMap mGroupMap; + MetaMap mMetadata; +}; // class Descriptor + + +template +ValueType +AttributeSet::Descriptor::getDefaultValue(const Name& name) const +{ + typedef typename TypedMetadata::ConstPtr MetadataPtr; + + const size_t pos = find(name); + if (pos == INVALID_POS) { + OPENVDB_THROW(LookupError, "Cannot find attribute name to set default value.") + } + + std::stringstream ss; + ss << "default:" << name; + + MetadataPtr metadata = mMetadata.getMetadata >(ss.str()); + + if (metadata) return metadata->value(); + + return zeroVal(); +} + + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + + +#endif // OPENVDB_TOOLS_ATTRIBUTE_ARRAY_HAS_BEEN_INCLUDED + + +// Copyright (c) 2015-2016 Double Negative Visual Effects +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) + diff --git a/nuparu/include/openvdb/include/openvdb_points/tools/IndexFilter.h b/nuparu/include/openvdb/include/openvdb_points/tools/IndexFilter.h new file mode 100644 index 00000000..4e45a5c6 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_points/tools/IndexFilter.h @@ -0,0 +1,161 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015-2016 Double Negative Visual Effects +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of Double Negative Visual Effects 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file IndexFilter.h +/// +/// @authors Dan Bailey +/// +/// @brief Index filters primarily designed to be used with a FilterIndexIter. +/// + + +#ifndef OPENVDB_TOOLS_INDEX_FILTER_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_INDEX_FILTER_HAS_BEEN_INCLUDED + +#include +#include + +#include + +#include +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + + +//////////////////////////////////////// + + +// Random index filtering per leaf +template +class RandomLeafFilter +{ +public: + typedef std::map LeafSeedMap; + typedef boost::uniform_01 Distribution; + typedef typename Distribution::result_type ResultT; + + struct Data + { + Data(const ResultT _factor, const LeafSeedMap& _leafSeedMap) + : factor(_factor), leafSeedMap(_leafSeedMap) { } + const ResultT factor; + const LeafSeedMap& leafSeedMap; + }; + + RandomLeafFilter(const Data& data, const unsigned int seed) + : mData(data) + , mDistribution(RandGenT(seed)) { } + + inline ResultT next() const { + return const_cast&>(mDistribution)(); + } + + template + static RandomLeafFilter create(const LeafT& leaf, const Data& data) { + const LeafSeedMap::const_iterator it = data.leafSeedMap.find(leaf.origin()); + if (it == data.leafSeedMap.end()) { + OPENVDB_THROW(openvdb::KeyError, "Cannot find leaf origin in offset map for random filter"); + } + return RandomLeafFilter(data, (unsigned int) it->second); + } + + template + bool valid(const IterT&) const { + return next() < mData.factor; + } + +private: + const Data mData; + Distribution mDistribution; +}; // class RandomLeafFilter + + +// BBox index filtering +class BBoxFilter +{ +public: + struct Data + { + Data(const openvdb::math::Transform& _transform, + const openvdb::BBoxd& _bboxWS) + : transform(_transform) + , bbox(transform.worldToIndex(_bboxWS)) { } + const openvdb::math::Transform transform; + const openvdb::BBoxd bbox; + }; + + BBoxFilter( const Data& data, + const AttributeHandle::Ptr& positionHandle) + : mData(data) + , mPositionHandle(positionHandle) { } + + template + static BBoxFilter create(const LeafT& leaf, const Data& data) { + return BBoxFilter(data, AttributeHandle::create(leaf.constAttributeArray("P"))); + } + + template + bool valid(const IterT& iter) const { + const openvdb::Coord ijk = iter.getCoord(); + const openvdb::Vec3f voxelIndexSpace = ijk.asVec3d(); + + // Retrieve point position in voxel space + const openvdb::Vec3f& pointVoxelSpace = mPositionHandle->get(*iter); + + // Compute point position in index space + const openvdb::Vec3f pointIndexSpace = pointVoxelSpace + voxelIndexSpace; + + return mData.bbox.isInside(pointIndexSpace); + } + +private: + const Data mData; + const AttributeHandle::Ptr mPositionHandle; +}; // class BBoxFilter + + +//////////////////////////////////////// + + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + + +#endif // OPENVDB_TOOLS_INDEX_FILTER_HAS_BEEN_INCLUDED + + +// Copyright (c) 2015-2016 Double Negative Visual Effects +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb_points/tools/IndexIterator.h b/nuparu/include/openvdb/include/openvdb_points/tools/IndexIterator.h new file mode 100644 index 00000000..06d70fe5 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_points/tools/IndexIterator.h @@ -0,0 +1,347 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015-2016 Double Negative Visual Effects +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of Double Negative Visual Effects 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file IndexIterator.h +/// +/// @authors Dan Bailey +/// +/// @brief Index Iterators. +/// + + +#ifndef OPENVDB_TOOLS_INDEX_ITERATOR_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_INDEX_ITERATOR_HAS_BEEN_INCLUDED + +#include +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + + +/// @brief Count up the number of times the iterator can iterate +/// +/// @param iter the iterator. +/// +/// @note counting by iteration only performed where a dynamic filter is in use, +template +inline Index64 iterCount(const IterT& iter); + + +//////////////////////////////////////// + + +/// @brief A forward iterator over array indices +class IndexIter +{ +public: + IndexIter() + : mEnd(0), mItem(0) {} + IndexIter(Index32 item, Index32 end) + : mEnd(end), mItem(item) {} + IndexIter(const IndexIter& other) + : mEnd(other.mEnd), mItem(other.mItem) { } + + inline Index32 end() const { return mEnd; } + + /// @brief Reset the begining and end of the iterator. + inline void reset(Index32 item, Index32 end) { + mItem = item; + mEnd = end; + } + + /// @brief Returns the item to which this iterator is currently pointing. + inline Index32 operator*() { return mItem; } + inline Index32 operator*() const { return mItem; } + + /// @brief Return @c true if this iterator is not yet exhausted. + inline operator bool() const { return mItem < mEnd; } + inline bool test() const { return mItem < mEnd; } + + /// @brief Advance to the next (valid) item (prefix). + inline IndexIter& operator++() { + ++mItem; + return *this; + } + + /// @brief Advance to the next (valid) item (postfix). + inline IndexIter operator++(int /*dummy*/) { + IndexIter newIterator(*this); + this->operator++(); + return newIterator; + } + + /// @brief Advance to the next (valid) item. + inline bool next() { this->operator++(); return this->test(); } + inline bool increment() { this->next(); return this->test(); } + + /// Throw an error as Coord methods are not available on this iterator + inline Coord getCoord() const { OPENVDB_THROW(RuntimeError, "IndexIter does not provide a valid Coord, use a ValueIndexIter instead."); } + /// Throw an error as Coord methods are not available on this iterator + inline void getCoord(Coord&) const { OPENVDB_THROW(RuntimeError, "IndexIter does not provide a valid Coord, use a ValueIndexIter instead."); } + + /// @brief Equality operators + inline bool operator==(const IndexIter& other) const { return mItem == other.mItem; } + inline bool operator!=(const IndexIter& other) const { return !this->operator==(other); } + +private: + Index32 mEnd, mItem; +}; // class IndexIter + + +/// @brief A forward iterator over array indices from a value iterator (such as ValueOnCIter) +template +class ValueIndexIter +{ +public: + ValueIndexIter(ValueIterT& iter) + : mIndexIter(), mIter(iter), mParent(mIter.parent()) + { + if (mIter) { + Index32 start = mIter.offset() > 0 ? Index32(mParent.getValue(mIter.offset() - 1)) : Index32(0); + mIndexIter.reset(start, *mIter); + if (!mIndexIter.test()) this->operator++(); + } + } + ValueIndexIter(const ValueIndexIter& other) + : mIndexIter(other.mIndexIter), mIter(other.mIter), mParent(other.mParent) { } + + inline Index32 end() const { return mIndexIter.end(); } + + inline void reset(Index32 item, Index32 end) { + mIndexIter.reset(item, end); + } + + /// @brief Returns the item to which this iterator is currently pointing. + inline Index32 operator*() { return *mIndexIter; } + inline Index32 operator*() const { return *mIndexIter; } + + /// @brief Return @c true if this iterator is not yet exhausted. + inline operator bool() const { return mIter; } + inline bool test() const { return mIter; } + + /// @brief Advance to the next (valid) item (prefix). + inline ValueIndexIter& operator++() { + mIndexIter.next(); + while (!mIndexIter.test() && mIter.next()) { + mIndexIter.reset(mParent.getValue(mIter.offset() - 1), *mIter); + } + return *this; + } + + /// @brief Advance to the next (valid) item (postfix). + inline ValueIndexIter operator++(int /*dummy*/) { + IndexIter newIterator(*this); + this->operator++(); + return newIterator; + } + + /// @brief Advance to the next (valid) item. + inline bool next() { this->operator++(); return this->test(); } + inline bool increment() { this->next(); return this->test(); } + + /// Return the coordinates of the item to which the value iterator is pointing. + inline Coord getCoord() const { return mIter.getCoord(); } + /// Return in @a xyz the coordinates of the item to which the value iterator is pointing. + inline void getCoord(Coord& xyz) const { xyz = mIter.getCoord(); } + + /// Return the const index iterator + inline const IndexIter& indexIter() const { return mIndexIter; } + /// Return the const value iterator + inline const ValueIterT& valueIter() const { return mIter; } + + /// @brief Equality operators + bool operator==(const ValueIndexIter& other) const { return *mIndexIter == *other.mIndexIter; } + bool operator!=(const ValueIndexIter& other) const { return !this->operator==(other); } + +private: + IndexIter mIndexIter; + ValueIterT mIter; + const typename ValueIterT::NodeType& mParent; +}; // ValueIndexIter + + +/// IndexIterTraits provides the following for iterators of the three value +/// types, i.e., for {Value}{On,Off,All}{CIter}: +/// - a begin(leaf) function that returns an index iterator or an index value +/// iterator for the leaf provided, +/// eg IndexIterTraits::begin(leaf) returns +/// leaf.beginIndexOn() +/// - an Iterator typedef that aliases to the index iterator for this value type +template struct IndexIterTraits; + +template +struct IndexIterTraits { + typedef IndexIter Iterator; + static Iterator begin(const typename TreeT::LeafNodeType& leaf) { + return Iterator(leaf.beginIndexAll()); + } +}; + +template +struct IndexIterTraits { + typedef typename TreeT::LeafNodeType::IndexOnIter Iterator; + static Iterator begin(const typename TreeT::LeafNodeType& leaf) { + return Iterator(leaf.beginIndexOn()); + } +}; + +template +struct IndexIterTraits { + typedef typename TreeT::LeafNodeType::IndexOffIter Iterator; + static Iterator begin(const typename TreeT::LeafNodeType& leaf) { + return Iterator(leaf.beginIndexOff()); + } +}; + + +/// @brief A forward iterator over array indices with filtering +/// IteratorT can be either IndexIter or ValueIndexIter (or some custom index iterator) +/// FilterT should be a struct or class with a valid() method than can be evaluated per index +/// Here's a simple filter example that only accepts even indices: +/// +/// struct EvenIndexFilter +/// { +/// bool valid(const Index32 offset) const { +/// return (offset % 2) == 0; +/// } +/// }; +/// +template +class FilterIndexIter +{ +public: + FilterIndexIter(const IteratorT& iterator, const FilterT& filter) + : mIterator(iterator), mFilter(filter) { if (mIterator) { this->reset(*mIterator, mIterator.end()); } } + FilterIndexIter(const FilterIndexIter& other) + : mIterator(other.mIterator), mFilter(other.mFilter) { } + + Index32 end() const { return mIterator.end(); } + + /// @brief Reset the begining and end of the iterator. + void reset(Index32 begin, Index32 end) { + mIterator.reset(begin, end); + while (mIterator.test() && !mFilter.template valid(mIterator)) { + ++mIterator; + } + } + + /// @brief Returns the item to which this iterator is currently pointing. + Index32 operator*() { return *mIterator; } + Index32 operator*() const { return *mIterator; } + + /// @brief Return @c true if this iterator is not yet exhausted. + operator bool() const { return mIterator.test(); } + bool test() const { return mIterator.test(); } + + /// @brief Advance to the next (valid) item (prefix). + FilterIndexIter& operator++() { + while (true) { + ++mIterator; + if (!mIterator.test() || mFilter.template valid(mIterator)) { + break; + } + } + return *this; + } + + /// @brief Advance to the next (valid) item (postfix). + FilterIndexIter operator++(int /*dummy*/) { + FilterIndexIter newIterator(*this); + this->operator++(); + return newIterator; + } + + /// @brief Advance to the next (valid) item. + bool next() { this->operator++(); return this->test(); } + bool increment() { this->next(); return this->test(); } + + /// Return the const index iterator + inline const IteratorT& indexIter() const { return mIterator; } + /// Return the const filter + inline const FilterT& filter() const { return mFilter; } + + /// @brief Equality operators + bool operator==(const FilterIndexIter& other) const { return mIterator == other.mIterator; } + bool operator!=(const FilterIndexIter& other) const { return !this->operator==(other); } + +private: + IteratorT mIterator; + const FilterT mFilter; +}; // class FilterIndexIter + + +//////////////////////////////////////// + + +template +inline Index64 iterCount(const IterT& iter) +{ + Index64 size = 0; + for (IterT newIter(iter); newIter; ++newIter, ++size) { } + return size; +} + + +template <> +inline Index64 iterCount(const IndexIter& iter) +{ + return iter ? iter.end() - *iter : 0; +} + + +template +inline Index64 iterCount(const ValueIndexIter& iter) +{ + T newIter(iter.valueIter()); + Index64 size = 0; + for ( ; newIter; ++newIter) { + size += *newIter - (newIter.offset() == 0 ? Index32(0) : Index32(newIter.parent().getValue(newIter.offset() - 1))); + } + return size; +} + + +//////////////////////////////////////// + + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + + +#endif // OPENVDB_TOOLS_INDEX_ITERATOR_HAS_BEEN_INCLUDED + + +// Copyright (c) 2015-2016 Double Negative Visual Effects +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb_points/tools/PointAttribute.h b/nuparu/include/openvdb/include/openvdb_points/tools/PointAttribute.h new file mode 100644 index 00000000..5506b6d3 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_points/tools/PointAttribute.h @@ -0,0 +1,545 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015-2016 Double Negative Visual Effects +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of Double Negative Visual Effects 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @author Dan Bailey +/// +/// @file PointAttribute.h +/// +/// @brief Point attribute manipulation in a VDB Point Grid. +/// + + +#ifndef OPENVDB_TOOLS_POINT_ATTRIBUTE_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_POINT_ATTRIBUTE_HAS_BEEN_INCLUDED + +#include + +#include +#include +#include + + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief Appends a new attribute to the VDB tree. +/// +/// @param tree the PointDataTree to be appended to. +/// @param newAttribute name and type for the new attribute. +/// @param defaultValue metadata default attribute value +/// @param hidden mark attribute as hidden +/// @param transient mark attribute as transient +/// @param group mark attribute as group +template +inline void appendAttribute(PointDataTree& tree, + const AttributeSet::Util::NameAndType& newAttribute, + Metadata::Ptr defaultValue = Metadata::Ptr(), + const bool hidden = false, + const bool transient = false, + const bool group = false); + +/// @brief Drops attributes from the VDB tree. +/// +/// @param tree the PointDataTree to be dropped from. +/// @param indices indices of the attributes to drop. +template +inline void dropAttributes( PointDataTree& tree, + const std::vector& indices); + +/// @brief Drops attributes from the VDB tree. +/// +/// @param tree the PointDataTree to be dropped from. +/// @param names names of the attributes to drop. +template +inline void dropAttributes( PointDataTree& tree, + const std::vector& names); + +/// @brief Drop one attribute from the VDB tree (convenience method). +/// +/// @param tree the PointDataTree to be dropped from. +/// @param index index of the attribute to drop. +template +inline void dropAttribute( PointDataTree& tree, + const size_t& index); + +/// @brief Drop one attribute from the VDB tree (convenience method). +/// +/// @param tree the PointDataTree to be dropped from. +/// @param name name of the attribute to drop. +template +inline void dropAttribute( PointDataTree& tree, + const Name& name); + +/// @brief Rename attributes in a VDB tree. +/// +/// @param tree the PointDataTree. +/// @param oldNames a list of old attribute names to rename from. +/// @param newNames a list of new attribute names to rename to. +/// +/// @note Number of oldNames must match the number of newNames. +/// +/// @note Duplicate names and renaming group attributes are not allowed. +template +inline void renameAttributes(PointDataTree& tree, + const std::vector& oldNames, + const std::vector& newNames); + +/// @brief Rename an attribute in a VDB tree. +/// +/// @param tree the PointDataTree. +/// @param oldName the old attribute name to rename from. +/// @param newName the new attribute name to rename to. +/// +/// @note newName must not already exist and must not be a group attribute. +template +inline void renameAttribute(PointDataTree& tree, + const Name& oldName, + const Name& newName); + +/// @brief Compact attributes in a VDB tree (if possible). +/// +/// @param tree the PointDataTree. +template +inline void compactAttributes(PointDataTree& tree); + +/// @brief Apply Blosc compression to one attribute in the VDB tree. +/// +/// @param tree the PointDataTree. +/// @param name name of the attribute to compress. +template +inline void bloscCompressAttribute( PointDataTree& tree, + const Name& name); + +//////////////////////////////////////// + + +namespace point_attribute_internal { + +template +struct AppendAttributeOp { + + typedef typename tree::LeafManager LeafManagerT; + typedef typename LeafManagerT::LeafRange LeafRangeT; + typedef AttributeSet::Descriptor::NameAndType NameAndType; + + AppendAttributeOp( PointDataTreeType& tree, + const NameAndType& newAttribute, + AttributeSet::DescriptorPtr& descriptor, + const bool hidden = false, + const bool transient = false, + const bool group = false) + : mTree(tree) + , mNewAttribute(newAttribute) + , mDescriptor(descriptor) + , mHidden(hidden) + , mTransient(transient) + , mGroup(group) { } + + void operator()(const LeafRangeT& range) const { + + for (typename LeafRangeT::Iterator leaf=range.begin(); leaf; ++leaf) { + + const AttributeSet::Descriptor& expected = leaf->attributeSet().descriptor(); + + AttributeArray::Ptr attribute = leaf->appendAttribute(mNewAttribute, expected, mDescriptor); + + if (mHidden) attribute->setHidden(true); + if (mTransient) attribute->setTransient(true); + + if (mGroup) { + GroupAttributeArray::cast(*attribute).setGroup(true); + } + } + } + + ////////// + + PointDataTreeType& mTree; + const NameAndType& mNewAttribute; + AttributeSet::DescriptorPtr& mDescriptor; + const bool mHidden; + const bool mTransient; + const bool mGroup; +}; // class AppendAttributeOp + + +//////////////////////////////////////// + + +template +struct DropAttributesOp { + + typedef typename tree::LeafManager LeafManagerT; + typedef typename LeafManagerT::LeafRange LeafRangeT; + typedef std::vector Indices; + + DropAttributesOp( PointDataTreeType& tree, + const Indices& indices, + AttributeSet::DescriptorPtr& descriptor) + : mTree(tree) + , mIndices(indices) + , mDescriptor(descriptor) { } + + void operator()(const LeafRangeT& range) const { + + for (typename LeafRangeT::Iterator leaf=range.begin(); leaf; ++leaf) { + + const AttributeSet::Descriptor& expected = leaf->attributeSet().descriptor(); + + leaf->dropAttributes(mIndices, expected, mDescriptor); + } + } + + ////////// + + PointDataTreeType& mTree; + const Indices& mIndices; + AttributeSet::DescriptorPtr& mDescriptor; +}; // class DropAttributesOp + + +//////////////////////////////////////// + + +template +struct CompactAttributesOp { + + typedef typename tree::LeafManager LeafManagerT; + typedef typename LeafManagerT::LeafRange LeafRangeT; + + CompactAttributesOp() { } + + void operator()(const LeafRangeT& range) const { + for (typename LeafRangeT::Iterator leaf=range.begin(); leaf; ++leaf) { + leaf->compactAttributes(); + } + } +}; // class CompactAttributesOp + + +//////////////////////////////////////// + + +template +struct BloscCompressAttributesOp { + + typedef typename tree::LeafManager LeafManagerT; + typedef typename LeafManagerT::LeafRange LeafRangeT; + typedef std::vector Indices; + + BloscCompressAttributesOp( PointDataTreeType& tree, + const Indices& indices) + : mTree(tree) + , mIndices(indices) { } + + void operator()(const LeafRangeT& range) const { + + for (typename LeafRangeT::Iterator leaf=range.begin(); leaf; ++leaf) { + + for (Indices::const_iterator it = mIndices.begin(), + itEnd = mIndices.end(); it != itEnd; ++it) { + + AttributeArray& array = leaf->attributeArray(*it); + array.compress(); + } + } + } + + ////////// + + PointDataTreeType& mTree; + const Indices& mIndices; +}; // class BloscCompressAttributesOp + + +} // namespace point_attribute_internal + + +//////////////////////////////////////// + + +template +inline void appendAttribute(PointDataTree& tree, + const AttributeSet::Util::NameAndType& newAttribute, + Metadata::Ptr defaultValue, + const bool hidden, const bool transient, const bool group) +{ + typedef AttributeSet::Util::NameAndTypeVec NameAndTypeVec; + typedef AttributeSet::Descriptor Descriptor; + + using point_attribute_internal::AppendAttributeOp; + + typename PointDataTree::LeafCIter iter = tree.cbeginLeaf(); + + if (!iter) return; + + // do not append a non-unique attribute + + const Descriptor& descriptor = iter->attributeSet().descriptor(); + const size_t index = descriptor.find(newAttribute.name); + + if (index != AttributeSet::INVALID_POS) { + OPENVDB_THROW(KeyError, "Cannot append an attribute with a non-unique name - " << newAttribute.name << "."); + } + + // create a new attribute descriptor + NameAndTypeVec vec; + vec.push_back(newAttribute); + + Descriptor::Ptr newDescriptor = descriptor.duplicateAppend(vec); + + // store the attribute default value in the descriptor metadata + + if (defaultValue) { + newDescriptor->setDefaultValue(newAttribute.name, *defaultValue); + } + + // insert attributes using the new descriptor + + AppendAttributeOp append(tree, newAttribute, newDescriptor, hidden, transient, group); + tbb::parallel_for(typename tree::template LeafManager(tree).leafRange(), append); +} + + +//////////////////////////////////////// + + +template +inline void dropAttributes( PointDataTree& tree, + const std::vector& indices) +{ + typedef typename tree::LeafManager LeafManagerT; + typedef AttributeSet::Descriptor Descriptor; + + using point_attribute_internal::DropAttributesOp; + + typename PointDataTree::LeafCIter iter = tree.cbeginLeaf(); + + if (!iter) return; + + const Descriptor& descriptor = iter->attributeSet().descriptor(); + + // throw if position index present in the indices as this attribute is mandatory + + const size_t positionIndex = descriptor.find("P"); + if (positionIndex!= AttributeSet::INVALID_POS && + std::find(indices.begin(), indices.end(), positionIndex) != indices.end()) { + OPENVDB_THROW(KeyError, "Cannot drop mandatory position attribute."); + } + + // insert attributes using the new descriptor + + Descriptor::Ptr newDescriptor = descriptor.duplicateDrop(indices); + tbb::parallel_for(LeafManagerT(tree).leafRange(), DropAttributesOp(tree, indices, newDescriptor)); +} + + +//////////////////////////////////////// + + +template +inline void dropAttributes( PointDataTree& tree, + const std::vector& names) +{ + typename PointDataTree::LeafCIter iter = tree.cbeginLeaf(); + + if (!iter) return; + + const AttributeSet& attributeSet = iter->attributeSet(); + const AttributeSet::Descriptor& descriptor = attributeSet.descriptor(); + + std::vector indices; + + for (std::vector::const_iterator it = names.begin(), itEnd = names.end(); it != itEnd; ++it) { + const size_t index = descriptor.find(*it); + + // do not attempt to drop an attribute that does not exist + if (index == AttributeSet::INVALID_POS) { + OPENVDB_THROW(KeyError, "Cannot drop an attribute that does not exist - " << *it << "."); + } + + indices.push_back(index); + } + + dropAttributes(tree, indices); +} + + +//////////////////////////////////////// + + +template +inline void dropAttribute( PointDataTree& tree, + const size_t& index) +{ + std::vector indices; + indices.push_back(index); + dropAttributes(tree, indices); +} + + +template +inline void dropAttribute( PointDataTree& tree, + const Name& name) +{ + std::vector names; + names.push_back(name); + dropAttributes(tree, names); +} + + +//////////////////////////////////////// + + +template +inline void renameAttributes( PointDataTree& tree, + const std::vector& oldNames, + const std::vector& newNames) +{ + if (oldNames.size() != newNames.size()) { + OPENVDB_THROW(ValueError, "Mis-matching sizes of name vectors, cannot rename attributes."); + } + + typedef AttributeSet::Descriptor Descriptor; + + typename PointDataTree::LeafIter iter = tree.beginLeaf(); + + if (!iter) return; + + const AttributeSet& attributeSet = iter->attributeSet(); + const Descriptor& descriptor = attributeSet.descriptor(); + AttributeSet::DescriptorPtr newDescriptor(new Descriptor(descriptor)); + + for (size_t i = 0; i < oldNames.size(); i++) { + const Name oldName(oldNames[i]); + if (descriptor.find(oldName) == AttributeSet::INVALID_POS) { + OPENVDB_THROW(KeyError, "Cannot find requested attribute - " << oldName << "."); + } + + const Name newName(newNames[i]); + if (descriptor.find(newName) != AttributeSet::INVALID_POS) { + OPENVDB_THROW(KeyError, "Cannot rename attribute as new name already exists - " << newName << "."); + } + + const AttributeArray* array = attributeSet.getConst(oldName); + assert(array); + + if (GroupAttributeArray::isGroup(*array)) { + OPENVDB_THROW(KeyError, "Cannot rename group attribute - " << oldName << "."); + } + + newDescriptor->rename(oldName, newName); + } + + for (; iter; ++iter) { + iter->renameAttributes(descriptor, newDescriptor); + } +} + + +template +inline void renameAttribute(PointDataTree& tree, + const Name& oldName, + const Name& newName) +{ + std::vector oldNames; + std::vector newNames; + oldNames.push_back(oldName); + newNames.push_back(newName); + renameAttributes(tree, oldNames, newNames); +} + + +//////////////////////////////////////// + + +template +inline void compactAttributes(PointDataTree& tree) +{ + typedef typename tree::LeafManager LeafManagerT; + + using point_attribute_internal::CompactAttributesOp; + + typename PointDataTree::LeafIter iter = tree.beginLeaf(); + if (!iter) return; + + tbb::parallel_for(LeafManagerT(tree).leafRange(), CompactAttributesOp()); +} + + +//////////////////////////////////////// + + +template +inline void bloscCompressAttribute( PointDataTree& tree, + const Name& name) +{ + using point_attribute_internal::BloscCompressAttributesOp; + + typedef typename tree::LeafManager LeafManagerT; + typedef AttributeSet::Descriptor Descriptor; + + typename PointDataTree::LeafCIter iter = tree.cbeginLeaf(); + + if (!iter) return; + + const Descriptor& descriptor = iter->attributeSet().descriptor(); + + // throw if index cannot be found in descriptor + + const size_t index = descriptor.find(name); + if (index == AttributeSet::INVALID_POS) { + OPENVDB_THROW(KeyError, "Cannot find requested attribute - " << name << "."); + } + + // blosc compress attributes + + std::vector indices; + indices.push_back(index); + + tbb::parallel_for(LeafManagerT(tree).leafRange(), BloscCompressAttributesOp(tree, indices)); +} + +//////////////////////////////////////// + + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + + +#endif // OPENVDB_TOOLS_POINT_ATTRIBUTE_HAS_BEEN_INCLUDED + + +// Copyright (c) 2015-2016 Double Negative Visual Effects +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb_points/tools/PointConversion.h b/nuparu/include/openvdb/include/openvdb_points/tools/PointConversion.h new file mode 100644 index 00000000..5593919d --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_points/tools/PointConversion.h @@ -0,0 +1,414 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015-2016 Double Negative Visual Effects +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of Double Negative Visual Effects 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @author Dan Bailey +/// +/// @file PointConversion.h +/// +/// @brief Convert existing points and attributes into VDB Point Data grids and attributes. +/// + + +#ifndef OPENVDB_TOOLS_POINT_CONVERSION_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_POINT_CONVERSION_HAS_BEEN_INCLUDED + +#include + +#include + +#include +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + + +/// @brief Localises points with position into a @c PointDataGrid into two stages: +/// allocation of the leaf attribute data and population of the positions. +/// +/// @param pointIndexGrid a PointIndexGrid into the points. +/// @param positions list of world space point positions. +/// @param positionType the type of the position (includes compression info). +/// @param xform world to index space transform. +/// @param positionDefaultValue metadata default position value +/// +/// @note The position data must be supplied in a Point-Partitioner compatible +/// data structure. A convenience PointAttributeVector class is offered. +/// +/// @note The position data is populated separately to perform world space to +/// voxel space conversion and apply quantisation. +/// +/// @note A @c PointIndexGrid to the points must be supplied to perform this +/// operation. Typically this is built implicitly by the PointDataGrid constructor. + +template +inline typename PointDataGridT::Ptr +createPointDataGrid(const PointIndexGridT& pointIndexGrid, const PositionArrayT& positions, + const openvdb::NamePair& positionType, const math::Transform& xform, + Metadata::Ptr positionDefaultValue = Metadata::Ptr()); + + +/// @brief Convenience method to create a @c PointDataGrid from a std::vector of +/// point positions. +/// +/// @param positions list of world space point positions. +/// @param positionType the type of the position (includes compression info). +/// @param xform world to index space transform. +/// @param positionDefaultValue metadata default position value +/// +/// @note This method implicitly wraps the std::vector for a Point-Partitioner compatible +/// data structure and creates the required @c PointIndexGrid to the points. + +template +inline typename PointDataGridT::Ptr +createPointDataGrid(const std::vector& positions, + const openvdb::NamePair& positionType, const math::Transform& xform, + Metadata::Ptr positionDefaultValue = Metadata::Ptr()); + + +/// @brief Stores point attribute data in an existing @c PointDataGrid attribute. +/// +/// @param tree the PointDataGrid to be populated. +/// @param pointIndexTree a PointIndexTree into the points. +/// @param attributeName the name of the VDB Points attribute to be populated. +/// @param data a wrapper to the attribute data. +/// +/// @note A @c PointIndexGrid to the points must be supplied to perform this +/// operation. This is required to ensure the same point index ordering. + +template +inline void +populateAttribute( PointDataTreeT& tree, const PointIndexTreeT& pointIndexTree, + const openvdb::Name& attributeName, const PointArrayT& data); + + +//////////////////////////////////////// + + +/// @brief Point-partitioner compatible STL vector attribute wrapper for convenience +template +class PointAttributeVector { +public: + typedef ValueType PosType; + typedef ValueType value_type; + + PointAttributeVector(const std::vector& data) + : mData(data) { } + + size_t size() const { return mData.size(); } + void getPos(size_t n, ValueType& xyz) const { xyz = mData[n]; } + + template + void get(size_t n, T& value) const { value = mData[n]; } + +private: + const std::vector& mData; +}; // PointAttributeVector + + +//////////////////////////////////////// + + +namespace point_conversion_internal { + +template +struct InitialiseAttributesOp { + + typedef typename tree::LeafManager LeafManagerT; + typedef typename LeafManagerT::LeafRange LeafRangeT; + + typedef typename PointIndexTreeType::LeafNodeType PointIndexLeafNode; + typedef typename PointIndexLeafNode::IndexArray IndexArray; + + InitialiseAttributesOp( PointDataTreeType& tree, + const PointIndexTreeType& pointIndexTree, + const AttributeSet::Descriptor::Ptr& attributeDescriptor) + : mTree(tree) + , mPointIndexTree(pointIndexTree) + , mAttributeDescriptor(attributeDescriptor) { } + + void operator()(const typename LeafManagerT::LeafRange& range) const { + for (typename LeafManagerT::LeafRange::Iterator leaf=range.begin(); leaf; ++leaf) { + + // obtain the PointIndexLeafNode (using the origin of the current leaf) + + const PointIndexLeafNode* pointIndexLeaf = mPointIndexTree.probeConstLeaf(leaf->origin()); + + if (!pointIndexLeaf) continue; + + // initialise the attribute storage + + pointIndexLeaf->indices(); + + const IndexArray& indices = pointIndexLeaf->indices(); + + Index64 pointCount = indices.size(); + + leaf->initializeAttributes(mAttributeDescriptor, pointCount); + } + } + + ////////// + + const PointDataTreeType& mTree; + const PointIndexTreeType& mPointIndexTree; + const AttributeSet::Descriptor::Ptr& mAttributeDescriptor; +}; + +template< typename PointDataTreeType, + typename PointIndexTreeType, + typename PositionListType> +struct PopulatePositionAttributeOp { + + typedef typename tree::LeafManager LeafManagerT; + typedef typename LeafManagerT::LeafRange LeafRangeT; + + typedef typename PointIndexTreeType::LeafNodeType PointIndexLeafNode; + typedef typename PointIndexLeafNode::IndexArray IndexArray; + + typedef typename PositionListType::value_type ValueType; + + PopulatePositionAttributeOp(const PointIndexTreeType& pointIndexTree, + const math::Transform& transform, + const PositionListType& positions) + : mPointIndexTree(pointIndexTree) + , mTransform(transform) + , mPositions(positions) { } + + void operator()(const typename LeafManagerT::LeafRange& range) const { + + for (typename LeafManagerT::LeafRange::Iterator leaf=range.begin(); leaf; ++leaf) { + + // obtain the PointIndexLeafNode (using the origin of the current leaf) + + const PointIndexLeafNode* pointIndexLeaf = mPointIndexTree.probeConstLeaf(leaf->origin()); + + if (!pointIndexLeaf) continue; + + typename AttributeWriteHandle::Ptr attributeWriteHandle = + AttributeWriteHandle::create(leaf->template attributeArray("P")); + + Index64 index = 0; + + const IndexArray& indices = pointIndexLeaf->indices(); + + for (typename IndexArray::const_iterator it = indices.begin(), it_end = indices.end(); it != it_end; ++it) + { + ValueType positionWorldSpace; + mPositions.getPos(*it, positionWorldSpace); + + const ValueType positionIndexSpace = mTransform.worldToIndex(positionWorldSpace); + + const ValueType positionVoxelSpace = ValueType( + positionIndexSpace.x() - math::Round(positionIndexSpace.x()), + positionIndexSpace.y() - math::Round(positionIndexSpace.y()), + positionIndexSpace.z() - math::Round(positionIndexSpace.z())); + + attributeWriteHandle->set(index, Vec3f(positionVoxelSpace)); + + index++; + } + } + } + + ////////// + + const PointIndexTreeType& mPointIndexTree; + const math::Transform& mTransform; + const PositionListType& mPositions; +}; + +template< typename PointDataTreeType, + typename PointIndexTreeType, + typename AttributeListType> +struct PopulateAttributeOp { + + typedef typename tree::LeafManager LeafManagerT; + typedef typename LeafManagerT::LeafRange LeafRangeT; + + typedef typename PointIndexTreeType::LeafNodeType PointIndexLeafNode; + typedef typename PointIndexLeafNode::IndexArray IndexArray; + + typedef typename AttributeListType::value_type ValueType; + + PopulateAttributeOp(const PointIndexTreeType& pointIndexTree, + const AttributeListType& data, + const openvdb::Name& attributeName) + : mPointIndexTree(pointIndexTree) + , mData(data) + , mAttributeName(attributeName) { } + + void operator()(const typename LeafManagerT::LeafRange& range) const { + + for (typename LeafManagerT::LeafRange::Iterator leaf=range.begin(); leaf; ++leaf) { + + // obtain the PointIndexLeafNode (using the origin of the current leaf) + + const PointIndexLeafNode* pointIndexLeaf = mPointIndexTree.probeConstLeaf(leaf->origin()); + + if (!pointIndexLeaf) continue; + + typename AttributeWriteHandle::Ptr attributeWriteHandle = + AttributeWriteHandle::create(leaf->attributeArray(mAttributeName)); + + Index64 index = 0; + + const IndexArray& indices = pointIndexLeaf->indices(); + + for (typename IndexArray::const_iterator it = indices.begin(), it_end = indices.end(); it != it_end; ++it) + { + ValueType value; + mData.template get(*it, value); + + attributeWriteHandle->set(index, value); + + index++; + } + } + } + + ////////// + + const PointIndexTreeType& mPointIndexTree; + const AttributeListType& mData; + const openvdb::Name& mAttributeName; +}; + +} // namespace point_conversion_internal + + +//////////////////////////////////////// + + +template +inline typename PointDataGridT::Ptr +createPointDataGrid(const PointIndexGridT& pointIndexGrid, const PositionArrayT& positions, + const openvdb::NamePair& positionType, const math::Transform& xform, + Metadata::Ptr positionDefaultValue) +{ + typedef typename PointDataGridT::TreeType PointDataTreeT; + typedef typename PointIndexGridT::TreeType PointIndexTreeT; + typedef typename tree::template LeafManager LeafManagerT; + typedef typename LeafManagerT::LeafRange LeafRangeT; + + using point_conversion_internal::InitialiseAttributesOp; + using point_conversion_internal::PopulatePositionAttributeOp; + + // construct the Tree using a topology copy of the PointIndexGrid + + const PointIndexTreeT& pointIndexTree(pointIndexGrid.tree()); + typename PointDataTreeT::Ptr treePtr(new PointDataTreeT(pointIndexTree)); + + LeafManagerT leafManager = LeafManagerT(*treePtr); + LeafRangeT leafRange = leafManager.leafRange(); + + // create attribute descriptor from position type + + AttributeSet::Descriptor::Ptr descriptor = AttributeSet::Descriptor::create(positionType); + + // add default value for position if provided + + if (positionDefaultValue) descriptor->setDefaultValue("P", *positionDefaultValue); + + // create point attribute storage on each leaf + + InitialiseAttributesOp initialise( + *treePtr, pointIndexGrid.tree(), descriptor); + tbb::parallel_for(leafRange, initialise); + + // populate position attribute + + PopulatePositionAttributeOp populate(pointIndexTree, + xform, + positions); + + tbb::parallel_for(leafRange, populate); + + typename PointDataGridT::Ptr grid = PointDataGridT::create(treePtr); + grid->setTransform(xform.copy()); + return grid; +} + + +//////////////////////////////////////// + + +template +inline typename PointDataGridT::Ptr +createPointDataGrid(const std::vector& positions, + const openvdb::NamePair& positionType, + const math::Transform& xform, + Metadata::Ptr positionDefaultValue) +{ + const PointAttributeVector pointList(positions); + + PointIndexGrid::Ptr pointIndexGrid = createPointIndexGrid(pointList, xform); + return createPointDataGrid(*pointIndexGrid, pointList, positionType, xform, positionDefaultValue); +} + + +//////////////////////////////////////// + + +template +inline void +populateAttribute( PointDataTreeT& tree, const PointIndexTreeT& pointIndexTree, + const openvdb::Name& attributeName, const PointArrayT& data) +{ + using point_conversion_internal::PopulateAttributeOp; + + // populate attribute + + PopulateAttributeOp populate(pointIndexTree, data, attributeName); + + tbb::parallel_for(typename tree::template LeafManager(tree).leafRange(), populate); +} + + +//////////////////////////////////////// + + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + + +#endif // OPENVDB_TOOLS_POINT_CONVERSION_HAS_BEEN_INCLUDED + + +// Copyright (c) 2015-2016 Double Negative Visual Effects +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb_points/tools/PointCount.h b/nuparu/include/openvdb/include/openvdb_points/tools/PointCount.h new file mode 100644 index 00000000..a3ada00e --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_points/tools/PointCount.h @@ -0,0 +1,277 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015-2016 Double Negative Visual Effects +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of Double Negative Visual Effects 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @author Dan Bailey +/// +/// @file PointCount.h +/// +/// @brief Various point counting methods using a VDB Point Grid. +/// + + +#ifndef OPENVDB_TOOLS_POINT_COUNT_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_POINT_COUNT_HAS_BEEN_INCLUDED + +#include + +#include +#include +#include + +#include + +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + + +/// @brief Total points in the PointDataTree +/// @param tree PointDataTree. +/// @param inCoreOnly if true, points in out-of-core leaf nodes are not counted +template +Index64 pointCount(const PointDataTreeT& tree, const bool inCoreOnly = false); + + +/// @brief Total active points in the PointDataTree +/// @param tree PointDataTree. +/// @param inCoreOnly if true, points in out-of-core leaf nodes are not counted +template +Index64 activePointCount(const PointDataTreeT& tree, const bool inCoreOnly = false); + + +/// @brief Total inactive points in the PointDataTree +/// @param tree PointDataTree. +/// @param inCoreOnly if true, points in out-of-core leaf nodes are not counted +template +Index64 inactivePointCount(const PointDataTreeT& tree, const bool inCoreOnly = false); + + +/// @brief Total points in the group in the PointDataTree +/// @param tree PointDataTree. +/// @param name group name. +/// @param inCoreOnly if true, points in out-of-core leaf nodes are not counted +template +Index64 groupPointCount(const PointDataTreeT& tree, const Name& name, const bool inCoreOnly = false); + + +/// @brief Total active points in the group in the PointDataTree +/// @param tree PointDataTree. +/// @param name group name. +/// @param inCoreOnly if true, points in out-of-core leaf nodes are not counted +template +Index64 activeGroupPointCount(const PointDataTreeT& tree, const Name& name, const bool inCoreOnly = false); + + +/// @brief Total inactive points in the group in the PointDataTree +/// @param tree PointDataTree. +/// @param name group name. +/// @param inCoreOnly if true, points in out-of-core leaf nodes are not counted +template +Index64 inactiveGroupPointCount(const PointDataTreeT& tree, const Name& name, const bool inCoreOnly = false); + + +//////////////////////////////////////// + + +namespace point_count_internal { + +template < typename PointDataTreeT, + typename ValueIterT, + typename FilterT> +struct PointCountOp +{ + typedef typename tree::LeafManager LeafManagerT; + typedef IndexIterTraits IndexIteratorFromLeafT; + typedef typename IndexIteratorFromLeafT::Iterator IndexIterator; + typedef typename FilterT::Data FilterDataT; + typedef FilterIndexIter Iterator; + + PointCountOp(const FilterDataT& filterData, + const bool inCoreOnly = false) + : mFilterData(filterData) + , mInCoreOnly(inCoreOnly) { } + + Index64 operator()(const typename LeafManagerT::LeafRange& range, Index64 size) const { + + for (typename LeafManagerT::LeafRange::Iterator leaf = range.begin(); leaf; ++leaf) { +#ifndef OPENVDB_2_ABI_COMPATIBLE + if (mInCoreOnly && leaf->buffer().isOutOfCore()) continue; +#endif + IndexIterator indexIterator(IndexIteratorFromLeafT::begin(*leaf)); + FilterT filter(FilterT::create(*leaf, mFilterData)); + Iterator iter(indexIterator, filter); + size += iterCount(iter); + } + + return size; + } + + static Index64 join(Index64 size1, Index64 size2) { + return size1 + size2; + } + +private: + const FilterDataT& mFilterData; + const bool mInCoreOnly; +}; // struct PointCountOp + + +template +Index64 threadedFilterPointCount( const PointDataTreeT& tree, + const typename FilterT::Data& filter, + const bool inCoreOnly = false) +{ + typedef point_count_internal::PointCountOp< PointDataTreeT, ValueIterT, FilterT> PointCountOp; + + typename tree::LeafManager leafManager(tree); + const PointCountOp pointCountOp(filter, inCoreOnly); + return tbb::parallel_reduce(leafManager.leafRange(), Index64(0), pointCountOp, PointCountOp::join); +} + + +template +Index64 filterPointCount(const PointDataTreeT& tree, + const typename FilterT::Data& filter, + const bool inCoreOnly = false) +{ + typedef typename PointDataTreeT::LeafNodeType::ValueAllCIter ValueIterT; + return threadedFilterPointCount< PointDataTreeT, FilterT, ValueIterT>(tree, filter, inCoreOnly); +} + + +template +Index64 filterActivePointCount( const PointDataTreeT& tree, + const typename FilterT::Data& filter, + const bool inCoreOnly = false) +{ + typedef typename PointDataTreeT::LeafNodeType::ValueOnCIter ValueIterT; + return threadedFilterPointCount< PointDataTreeT, FilterT, ValueIterT>(tree, filter, inCoreOnly); +} + + +template +Index64 filterInactivePointCount( const PointDataTreeT& tree, + const typename FilterT::Data& filter, + const bool inCoreOnly = false) +{ + typedef typename PointDataTreeT::LeafNodeType::ValueOffCIter ValueIterT; + return threadedFilterPointCount< PointDataTreeT, FilterT, ValueIterT>(tree, filter, inCoreOnly); +} + + +} // namespace point_count_internal + + +template +Index64 pointCount(const PointDataTreeT& tree, const bool inCoreOnly) +{ + (void) inCoreOnly; + Index64 size = 0; + for (typename PointDataTreeT::LeafCIter iter = tree.cbeginLeaf(); iter; ++iter) { +#ifndef OPENVDB_2_ABI_COMPATIBLE + if (inCoreOnly && iter->buffer().isOutOfCore()) continue; +#endif + size += iter->pointCount(); + } + return size; +} + + +template +Index64 activePointCount(const PointDataTreeT& tree, const bool inCoreOnly) +{ + (void) inCoreOnly; + Index64 size = 0; + for (typename PointDataTreeT::LeafCIter iter = tree.cbeginLeaf(); iter; ++iter) { +#ifndef OPENVDB_2_ABI_COMPATIBLE + if (inCoreOnly && iter->buffer().isOutOfCore()) continue; +#endif + size += iter->onPointCount(); + } + return size; +} + + +template +Index64 inactivePointCount(const PointDataTreeT& tree, const bool inCoreOnly) +{ + (void) inCoreOnly; + Index64 size = 0; + for (typename PointDataTreeT::LeafCIter iter = tree.cbeginLeaf(); iter; ++iter) { +#ifndef OPENVDB_2_ABI_COMPATIBLE + if (inCoreOnly && iter->buffer().isOutOfCore()) continue; +#endif + size += iter->offPointCount(); + } + return size; +} + + +template +Index64 groupPointCount(const PointDataTreeT& tree, const Name& name, const bool inCoreOnly) +{ + GroupFilter::Data groupFilterData(name); + return point_count_internal::filterPointCount(tree, groupFilterData, inCoreOnly); +} + + +template +Index64 activeGroupPointCount(const PointDataTreeT& tree, const Name& name, const bool inCoreOnly) +{ + GroupFilter::Data groupFilterData(name); + return point_count_internal::filterActivePointCount(tree, groupFilterData, inCoreOnly); +} + + +template +Index64 inactiveGroupPointCount(const PointDataTreeT& tree, const Name& name, const bool inCoreOnly) +{ + GroupFilter::Data groupFilterData(name); + return point_count_internal::filterInactivePointCount(tree, groupFilterData, inCoreOnly); +} + + +//////////////////////////////////////// + + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + + +#endif // OPENVDB_TOOLS_POINT_COUNT_HAS_BEEN_INCLUDED + + +// Copyright (c) 2015-2016 Double Negative Visual Effects +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb_points/tools/PointDataGrid.h b/nuparu/include/openvdb/include/openvdb_points/tools/PointDataGrid.h new file mode 100644 index 00000000..2a691cfd --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_points/tools/PointDataGrid.h @@ -0,0 +1,920 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015-2016 Double Negative Visual Effects +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of Double Negative Visual Effects 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @author Dan Bailey, Nick Avramoussis, Matt Warner +/// +/// @file PointDataGrid.h +/// +/// @brief Attribute-owned data structure for points. Point attributes are +/// stored in leaf nodes and ordered by voxel for fast random and +/// sequential access. +/// + + +#ifndef OPENVDB_TOOLS_POINT_DATA_GRID_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_POINT_DATA_GRID_HAS_BEEN_INCLUDED + +#include +#include +#include + +#include + +#include +#include + +#include // std::pair, std::make_pair + + +class TestPointDataLeaf; + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { + +// forward declaration +namespace tree { + template struct SameLeafConfig; +} + + +//////////////////////////////////////// + + +namespace tools { + + +// forward declaration +template class PointDataLeafNode; + +/// @brief Point index tree configured to match the default VDB configurations. +typedef tree::Tree, 4>, 5> > > PointDataTree; + + +/// @brief Point data grid. +typedef Grid PointDataGrid; + + +//////////////////////////////////////// + +// Internal utility methods +namespace point_data_grid_internal { + +template +struct UniquePtr +{ +#ifdef OPENVDB_HAS_CXX11 + typedef std::unique_ptr type; +#else + typedef std::auto_ptr type; +#endif +}; +} + + +template +class PointDataLeafNode : public tree::LeafNode { + +public: + typedef PointDataLeafNode LeafNodeType; + typedef boost::shared_ptr Ptr; + + typedef T ValueType; + typedef std::pair ValueTypePair; + typedef std::vector IndexArray; + + typedef AttributeSet::Descriptor Descriptor; + + //////////////////////////////////////// + + // The following methods had to be copied from the LeafNode class + // to make the derived PointDataLeafNode class compatible with the tree structure. + + typedef tree::LeafNode BaseLeaf; + typedef util::NodeMask NodeMaskType; + + using BaseLeaf::LOG2DIM; + using BaseLeaf::TOTAL; + using BaseLeaf::DIM; + using BaseLeaf::NUM_VALUES; + using BaseLeaf::NUM_VOXELS; + using BaseLeaf::SIZE; + using BaseLeaf::LEVEL; + + /// Default constructor + PointDataLeafNode() + : BaseLeaf() + , mAttributeSet(new AttributeSet) { } + + ~PointDataLeafNode() { } + + /// Construct using deep copy of other PointDataLeafNode + explicit PointDataLeafNode(const PointDataLeafNode& other) + : BaseLeaf(other) + , mAttributeSet(new AttributeSet(*other.mAttributeSet)) { } + + /// Construct using supplied origin, value and active status + explicit + PointDataLeafNode(const Coord& coords, const T& value = zeroVal(), bool active = false) + : BaseLeaf(coords, value, active) + , mAttributeSet(new AttributeSet) { } + + /// Construct using supplied origin, value and active status + /// use attribute map from another PointDataLeafNode + PointDataLeafNode(const PointDataLeafNode& other, const Coord& coords, const T& value = zeroVal(), bool active = false) + : BaseLeaf(coords, value, active) + , mAttributeSet(new AttributeSet(*other.mAttributeSet)) { } + + // Copy-construct from a PointIndexLeafNode with the same configuration but a different ValueType. + template + PointDataLeafNode(const tools::PointIndexLeafNode& other) + : BaseLeaf(other) + , mAttributeSet(new AttributeSet) { } + + // Copy-construct from a LeafNode with the same configuration but a different ValueType. + // Used for topology copies - explicitly sets the value (background) to zeroVal + template + PointDataLeafNode(const tree::LeafNode& other, const T& /*value*/, TopologyCopy) + : BaseLeaf(other, zeroVal(), TopologyCopy()) + , mAttributeSet(new AttributeSet) { } + + // Copy-construct from a LeafNode with the same configuration but a different ValueType. + // Used for topology copies - explicitly sets the on and off value (background) to zeroVal + template + PointDataLeafNode(const tree::LeafNode& other, const T& /*offValue*/, const T& /*onValue*/, TopologyCopy) + : BaseLeaf(other, zeroVal(), zeroVal(), TopologyCopy()) + , mAttributeSet(new AttributeSet) { } + +#ifndef OPENVDB_2_ABI_COMPATIBLE + PointDataLeafNode(PartialCreate, const Coord& coords, + const T& value = zeroVal(), bool active = false) + : BaseLeaf(PartialCreate(), coords, value, active) + , mAttributeSet(new AttributeSet) { } +#endif + +public: + + /// Retrieve the attribute set. + const AttributeSet& attributeSet() const { return *mAttributeSet; } + + /// @brief Create a new attribute set. Existing attributes will be removed. + void initializeAttributes(const Descriptor::Ptr& descriptor, const size_t arrayLength); + /// @brief Clear the attribute set. + void clearAttributes(const bool updateValueMask = true); + + /// @brief Returns @c true if an attribute with this index exists. + /// @param pos Index of the attribute + bool hasAttribute(const size_t pos) const; + /// @brief Returns @c true if an attribute with this name exists. + /// @param attributeName Name of the attribute + bool hasAttribute(const Name& attributeName) const; + + /// @brief Append an attribute to the leaf. + /// @param attribute Name and type of the attribute to append. + /// @param expected Existing descriptor is expected to match this parameter. + /// @param replacement New descriptor to replace the existing one. + AttributeArray::Ptr appendAttribute(const AttributeSet::Util::NameAndType& attribute, + const Descriptor& expected, Descriptor::Ptr& replacement); + /// @brief Drop list of attributes. + /// @param pos vector of attribute indices to drop + /// @param expected Existing descriptor is expected to match this parameter. + /// @param replacement New descriptor to replace the existing one. + void dropAttributes(const std::vector& pos, + const Descriptor& expected, Descriptor::Ptr& replacement); + /// @brief Reorder attribute set. + /// @param replacement New descriptor to replace the existing one. + void reorderAttributes(const Descriptor::Ptr& replacement); + /// @brief Rename attributes in attribute set (order must remain the same). + /// @param expected Existing descriptor is expected to match this parameter. + /// @param replacement New descriptor to replace the existing one. + void renameAttributes(const Descriptor& expected, Descriptor::Ptr& replacement); + /// @brief Compact all attributes in attribute set. + void compactAttributes(); + + /// @brief Swap the underlying attribute set with the given @a attributeSet. + /// This leaf will assume ownership of the given attribute set. The descriptors must + /// match and the voxel offsets values will need updating if the point order is different. + void swap(AttributeSet* attributeSet); + + /// @brief Sets all of the voxel offset values on this leaf, from the given vector + /// of @a offsets. If @a updateValueMask is true, then the active value mask will + /// be updated so voxels with points are active and empty voxels are inactive. + void setOffsets(const std::vector& offsets, const bool updateValueMask = true); + + /// @brief Throws an error if the voxel values on this leaf are not monotonically + /// increasing or within the bounds of the attribute arrays + void validateOffsets() const; + + /// @brief Read-write attribute array reference from index + /// { + AttributeArray& attributeArray(const size_t pos); + const AttributeArray& attributeArray(const size_t pos) const; + const AttributeArray& constAttributeArray(const size_t pos) const; + /// } + /// @brief Read-write attribute array reference from name + /// { + AttributeArray& attributeArray(const Name& attributeName); + const AttributeArray& attributeArray(const Name& attributeName) const; + const AttributeArray& constAttributeArray(const Name& attributeName) const; + /// } + + /// @brief Read-only group handle from group index + GroupHandle groupHandle(const AttributeSet::Descriptor::GroupIndex& index) const; + /// @brief Read-only group handle from group name + GroupHandle groupHandle(const Name& group) const; + /// @brief Read-write group handle from group index + GroupWriteHandle groupWriteHandle(const AttributeSet::Descriptor::GroupIndex& index); + /// @brief Read-write group handle from group name + GroupWriteHandle groupWriteHandle(const Name& name); + + /// @brief Compute the total point count for the leaf + Index64 pointCount() const; + /// @brief Compute the total active (on) point count for the leaf + Index64 onPointCount() const; + /// @brief Compute the total inactive (off) point count for the leaf + Index64 offPointCount() const; + /// @brief Compute the point count in a specific group for the leaf + Index64 groupPointCount(const Name& groupName) const; + + /// @brief Activate voxels with non-zero points, deactivate voxels with zero points. + void updateValueMask(); + + //////////////////////////////////////// + + void setOffsetOn(Index offset, const ValueType& val); + void setOffsetOnly(Index offset, const ValueType& val); + + /// @brief Return @c true if the given node (which may have a different @c ValueType + /// than this node) has the same active value topology as this node. + template + bool hasSameTopology(const PointDataLeafNode* other) const { + return BaseLeaf::hasSameTopology(other); + } + + /// Check for buffer, state and origin equivalence first. + /// If this returns true, do a deeper comparison on the attribute set to check + bool operator==(const PointDataLeafNode& other) const { + if(BaseLeaf::operator==(other) != true) return false; + return (*this->mAttributeSet == *other.mAttributeSet); + } + + bool operator!=(const PointDataLeafNode& other) const { return !(other == *this); } + + void addLeaf(PointDataLeafNode*) {} + template + void addLeafAndCache(PointDataLeafNode*, AccessorT&) {} + + //@{ + /// @brief Return a pointer to this node. + PointDataLeafNode* touchLeaf(const Coord&) { return this; } + template + PointDataLeafNode* touchLeafAndCache(const Coord&, AccessorT&) { return this; } + + template + NodeT* probeNodeAndCache(const Coord&, AccessorT&) + { + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (!(boost::is_same::value)) return NULL; + return reinterpret_cast(this); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + PointDataLeafNode* probeLeaf(const Coord&) { return this; } + template + PointDataLeafNode* probeLeafAndCache(const Coord&, AccessorT&) { return this; } + //@} + + //@{ + /// @brief Return a @const pointer to this node. + const PointDataLeafNode* probeConstLeaf(const Coord&) const { return this; } + template + const PointDataLeafNode* probeConstLeafAndCache(const Coord&, AccessorT&) const { return this; } + template + const PointDataLeafNode* probeLeafAndCache(const Coord&, AccessorT&) const { return this; } + const PointDataLeafNode* probeLeaf(const Coord&) const { return this; } + template + const NodeT* probeConstNodeAndCache(const Coord&, AccessorT&) const + { + OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN + if (!(boost::is_same::value)) return NULL; + return reinterpret_cast(this); + OPENVDB_NO_UNREACHABLE_CODE_WARNING_END + } + //@} + + // I/O methods + + void readTopology(std::istream& is, bool fromHalf = false); + void writeTopology(std::ostream& os, bool toHalf = false) const; + + void readBuffers(std::istream& is, bool fromHalf = false); + void readBuffers(std::istream& is, const CoordBBox&, bool fromHalf = false); + void writeBuffers(std::ostream& os, bool toHalf = false) const; + + + Index64 memUsage() const; + + //////////////////////////////////////// + + // Disable all write methods to avoid unintentional changes + // to the point-array offsets. + + void assertNonmodifiable() { + assert(false && "Cannot modify voxel values in a PointDataTree."); + } + + void setActiveState(const Coord& xyz, bool on) { BaseLeaf::setActiveState(xyz, on); } + void setActiveState(Index offset, bool on) { BaseLeaf::setActiveState(offset, on); } + + void setValueOnly(const Coord&, const ValueType&) { assertNonmodifiable(); } + void setValueOnly(Index, const ValueType&) { assertNonmodifiable(); } + + void setValueOff(const Coord& xyz) { BaseLeaf::setValueOff(xyz); } + void setValueOff(Index offset) { BaseLeaf::setValueOff(offset); } + + void setValueOff(const Coord&, const ValueType&) { assertNonmodifiable(); } + void setValueOff(Index, const ValueType&) { assertNonmodifiable(); } + + void setValueOn(const Coord& xyz) { BaseLeaf::setValueOn(xyz); } + void setValueOn(Index offset) { BaseLeaf::setValueOn(offset); } + + void setValueOn(const Coord&, const ValueType&) { assertNonmodifiable(); } + void setValueOn(Index, const ValueType&) { assertNonmodifiable(); } + + void setValue(const Coord&, const ValueType&) { assertNonmodifiable(); } + + void setValuesOn() { BaseLeaf::setValuesOn(); } + void setValuesOff() { BaseLeaf::setValuesOff(); } + + template + void modifyValue(Index, const ModifyOp&) { assertNonmodifiable(); } + + template + void modifyValue(const Coord&, const ModifyOp&) { assertNonmodifiable(); } + + template + void modifyValueAndActiveState(const Coord&, const ModifyOp&) { assertNonmodifiable(); } + + void clip(const CoordBBox&, const ValueType&) { assertNonmodifiable(); } + + void fill(const CoordBBox&, const ValueType&, bool) { assertNonmodifiable(); } + void fill(const ValueType&) {} + void fill(const ValueType&, bool) { assertNonmodifiable(); } + + template + void setValueOnlyAndCache(const Coord&, const ValueType&, AccessorT&) {assertNonmodifiable();} + + template + void modifyValueAndActiveStateAndCache(const Coord&, const ModifyOp&, AccessorT&) { + assertNonmodifiable(); + } + + template + void setValueOffAndCache(const Coord&, const ValueType&, AccessorT&) { assertNonmodifiable(); } + + template + void setActiveStateAndCache(const Coord& xyz, bool on, AccessorT& parent) { BaseLeaf::setActiveStateAndCache(xyz, on, parent); } + + void resetBackground(const ValueType&, const ValueType&) { assertNonmodifiable(); } + + void signedFloodFill(const ValueType&) { assertNonmodifiable(); } + void signedFloodFill(const ValueType&, const ValueType&) { assertNonmodifiable(); } + + void negate() { assertNonmodifiable(); } + + friend class ::TestPointDataLeaf; + + typedef typename BaseLeaf::ValueOn ValueOn; + typedef typename BaseLeaf::ValueOff ValueOff; + typedef typename BaseLeaf::ValueAll ValueAll; + +private: + point_data_grid_internal::UniquePtr::type mAttributeSet; + +protected: + typedef typename BaseLeaf::ChildOn ChildOn; + typedef typename BaseLeaf::ChildOff ChildOff; + typedef typename BaseLeaf::ChildAll ChildAll; + + typedef typename NodeMaskType::OnIterator MaskOnIterator; + typedef typename NodeMaskType::OffIterator MaskOffIterator; + typedef typename NodeMaskType::DenseIterator MaskDenseIterator; + + // During topology-only construction, access is needed + // to protected/private members of other template instances. + template friend class PointDataLeafNode; + + friend class tree::IteratorBase; + friend class tree::IteratorBase; + friend class tree::IteratorBase; + +public: + + typedef typename BaseLeaf::template ValueIter< + MaskOnIterator, PointDataLeafNode, const ValueType, ValueOn> ValueOnIter; + typedef typename BaseLeaf::template ValueIter< + MaskOnIterator, const PointDataLeafNode, const ValueType, ValueOn> ValueOnCIter; + typedef typename BaseLeaf::template ValueIter< + MaskOffIterator, PointDataLeafNode, const ValueType, ValueOff> ValueOffIter; + typedef typename BaseLeaf::template ValueIter< + MaskOffIterator,const PointDataLeafNode,const ValueType,ValueOff> ValueOffCIter; + typedef typename BaseLeaf::template ValueIter< + MaskDenseIterator, PointDataLeafNode, const ValueType, ValueAll> ValueAllIter; + typedef typename BaseLeaf::template ValueIter< + MaskDenseIterator,const PointDataLeafNode,const ValueType,ValueAll> ValueAllCIter; + typedef typename BaseLeaf::template ChildIter< + MaskOnIterator, PointDataLeafNode, ChildOn> ChildOnIter; + typedef typename BaseLeaf::template ChildIter< + MaskOnIterator, const PointDataLeafNode, ChildOn> ChildOnCIter; + typedef typename BaseLeaf::template ChildIter< + MaskOffIterator, PointDataLeafNode, ChildOff> ChildOffIter; + typedef typename BaseLeaf::template ChildIter< + MaskOffIterator, const PointDataLeafNode, ChildOff> ChildOffCIter; + typedef typename BaseLeaf::template DenseIter< + PointDataLeafNode, ValueType, ChildAll> ChildAllIter; + typedef typename BaseLeaf::template DenseIter< + const PointDataLeafNode, const ValueType, ChildAll> ChildAllCIter; + + typedef openvdb::tools::IndexIter IndexIter; + typedef ValueIndexIter IndexOnIter; + typedef ValueIndexIter IndexOffIter; + + /// @brief Leaf index iterator + IndexIter beginIndexAll() const; + IndexOnIter beginIndexOn() const; + IndexOffIter beginIndexOff() const; + /// @brief Leaf index iterator from voxel + IndexIter beginIndex(const unsigned index) const; + IndexIter beginIndex(const Coord& ijk) const; + +#define VMASK_ this->getValueMask() + ValueOnCIter cbeginValueOn() const { return ValueOnCIter(VMASK_.beginOn(), this); } + ValueOnCIter beginValueOn() const { return ValueOnCIter(VMASK_.beginOn(), this); } + ValueOnIter beginValueOn() { return ValueOnIter(VMASK_.beginOn(), this); } + ValueOffCIter cbeginValueOff() const { return ValueOffCIter(VMASK_.beginOff(), this); } + ValueOffCIter beginValueOff() const { return ValueOffCIter(VMASK_.beginOff(), this); } + ValueOffIter beginValueOff() { return ValueOffIter(VMASK_.beginOff(), this); } + ValueAllCIter cbeginValueAll() const { return ValueAllCIter(VMASK_.beginDense(), this); } + ValueAllCIter beginValueAll() const { return ValueAllCIter(VMASK_.beginDense(), this); } + ValueAllIter beginValueAll() { return ValueAllIter(VMASK_.beginDense(), this); } + + ValueOnCIter cendValueOn() const { return ValueOnCIter(VMASK_.endOn(), this); } + ValueOnCIter endValueOn() const { return ValueOnCIter(VMASK_.endOn(), this); } + ValueOnIter endValueOn() { return ValueOnIter(VMASK_.endOn(), this); } + ValueOffCIter cendValueOff() const { return ValueOffCIter(VMASK_.endOff(), this); } + ValueOffCIter endValueOff() const { return ValueOffCIter(VMASK_.endOff(), this); } + ValueOffIter endValueOff() { return ValueOffIter(VMASK_.endOff(), this); } + ValueAllCIter cendValueAll() const { return ValueAllCIter(VMASK_.endDense(), this); } + ValueAllCIter endValueAll() const { return ValueAllCIter(VMASK_.endDense(), this); } + ValueAllIter endValueAll() { return ValueAllIter(VMASK_.endDense(), this); } + + ChildOnCIter cbeginChildOn() const { return ChildOnCIter(VMASK_.endOn(), this); } + ChildOnCIter beginChildOn() const { return ChildOnCIter(VMASK_.endOn(), this); } + ChildOnIter beginChildOn() { return ChildOnIter(VMASK_.endOn(), this); } + ChildOffCIter cbeginChildOff() const { return ChildOffCIter(VMASK_.endOff(), this); } + ChildOffCIter beginChildOff() const { return ChildOffCIter(VMASK_.endOff(), this); } + ChildOffIter beginChildOff() { return ChildOffIter(VMASK_.endOff(), this); } + ChildAllCIter cbeginChildAll() const { return ChildAllCIter(VMASK_.beginDense(), this); } + ChildAllCIter beginChildAll() const { return ChildAllCIter(VMASK_.beginDense(), this); } + ChildAllIter beginChildAll() { return ChildAllIter(VMASK_.beginDense(), this); } + + ChildOnCIter cendChildOn() const { return ChildOnCIter(VMASK_.endOn(), this); } + ChildOnCIter endChildOn() const { return ChildOnCIter(VMASK_.endOn(), this); } + ChildOnIter endChildOn() { return ChildOnIter(VMASK_.endOn(), this); } + ChildOffCIter cendChildOff() const { return ChildOffCIter(VMASK_.endOff(), this); } + ChildOffCIter endChildOff() const { return ChildOffCIter(VMASK_.endOff(), this); } + ChildOffIter endChildOff() { return ChildOffIter(VMASK_.endOff(), this); } + ChildAllCIter cendChildAll() const { return ChildAllCIter(VMASK_.endDense(), this); } + ChildAllCIter endChildAll() const { return ChildAllCIter(VMASK_.endDense(), this); } + ChildAllIter endChildAll() { return ChildAllIter(VMASK_.endDense(), this); } +#undef VMASK_ +}; // struct PointDataLeafNode + +//////////////////////////////////////// + +// PointDataLeafNode implementation + +template +inline void +PointDataLeafNode::initializeAttributes(const Descriptor::Ptr& descriptor, const size_t arrayLength) +{ + mAttributeSet.reset(new AttributeSet(descriptor, arrayLength)); +} + +template +inline void +PointDataLeafNode::clearAttributes(const bool updateValueMask) +{ + mAttributeSet.reset(new AttributeSet(mAttributeSet->descriptorPtr(), 0)); + + // zero voxel values + + for (Index n = 0; n < LeafNodeType::NUM_VALUES; n++) { + this->setOffsetOnly(n, 0); + } + + // if updateValueMask, also de-activate all voxels + + if (updateValueMask) this->setValuesOff(); +} + +template +inline bool +PointDataLeafNode::hasAttribute(const size_t pos) const +{ + return pos < mAttributeSet->size(); +} + +template +inline bool +PointDataLeafNode::hasAttribute(const Name& attributeName) const +{ + const size_t pos = mAttributeSet->find(attributeName); + return pos != AttributeSet::INVALID_POS; +} + +template +inline AttributeArray::Ptr +PointDataLeafNode::appendAttribute(const AttributeSet::Util::NameAndType& attribute, + const Descriptor& expected, Descriptor::Ptr& replacement) +{ + return mAttributeSet->appendAttribute(attribute, expected, replacement); +} + +template +inline void +PointDataLeafNode::dropAttributes(const std::vector& pos, + const Descriptor& expected, Descriptor::Ptr& replacement) +{ + mAttributeSet->dropAttributes(pos, expected, replacement); +} + +template +inline void +PointDataLeafNode::reorderAttributes(const Descriptor::Ptr& replacement) +{ + mAttributeSet->reorderAttributes(replacement); +} + +template +inline void +PointDataLeafNode::renameAttributes(const Descriptor& expected, Descriptor::Ptr& replacement) +{ + mAttributeSet->renameAttributes(expected, replacement); +} + +template +inline void +PointDataLeafNode::compactAttributes() +{ + for (size_t i = 0; i < mAttributeSet->size(); i++) { + AttributeArray* array = mAttributeSet->get(i); + array->compact(); + } +} + +template +inline void +PointDataLeafNode::swap(AttributeSet* attributeSet) +{ + if (!attributeSet) { + OPENVDB_THROW(ValueError, "Cannot swap with a null attribute set"); + } + + if (mAttributeSet->descriptor() != attributeSet->descriptor()) { + OPENVDB_THROW(ValueError, "Attribute set descriptors are not equal."); + } + + mAttributeSet.reset(attributeSet); +} + +template +inline void +PointDataLeafNode::setOffsets(const std::vector& offsets, const bool updateValueMask) +{ + if (offsets.size() != LeafNodeType::NUM_VALUES) { + OPENVDB_THROW(ValueError, "Offset vector size doesn't match number of voxels.") + } + + for (size_t index = 0; index < offsets.size(); ++index) { + setOffsetOnly(index, offsets[index]); + } + + if (updateValueMask) this->updateValueMask(); +} + +template +inline void +PointDataLeafNode::validateOffsets() const +{ + // Ensure all of the offset values are monotonically increasing + for (size_t index = 1; index < BaseLeaf::SIZE; ++index) { + if (this->getValue(index-1) > this->getValue(index)) { + OPENVDB_THROW(ValueError, "Voxel offset values are not monotonically increasing"); + } + } + + // Ensure all attribute arrays are of equal length + for (size_t attributeIndex = 1; attributeIndex < mAttributeSet->size(); ++attributeIndex ) { + if (mAttributeSet->getConst(attributeIndex-1)->size() != mAttributeSet->getConst(attributeIndex)->size()) { + OPENVDB_THROW(ValueError, "Attribute arrays have inconsistent length"); + } + } + + // Ensure the last voxel's offset value matches the size of each attribute array + if (mAttributeSet->size() > 0 && this->getValue(BaseLeaf::SIZE-1) != mAttributeSet->getConst(0)->size()) { + OPENVDB_THROW(ValueError, "Last voxel offset value does not match attribute array length"); + } +} + +template +inline AttributeArray& +PointDataLeafNode::attributeArray(const size_t pos) +{ + if (pos >= mAttributeSet->size()) OPENVDB_THROW(LookupError, "Attribute Out Of Range - " << pos); + return *mAttributeSet->get(pos); +} + +template +inline const AttributeArray& +PointDataLeafNode::attributeArray(const size_t pos) const +{ + if (pos >= mAttributeSet->size()) OPENVDB_THROW(LookupError, "Attribute Out Of Range - " << pos); + return *mAttributeSet->getConst(pos); +} + +template +inline const AttributeArray& +PointDataLeafNode::constAttributeArray(const size_t pos) const +{ + return this->attributeArray(pos); +} + +template +inline AttributeArray& +PointDataLeafNode::attributeArray(const Name& attributeName) +{ + const size_t pos = mAttributeSet->find(attributeName); + if (pos == AttributeSet::INVALID_POS) OPENVDB_THROW(LookupError, "Attribute Not Found - " << attributeName); + return *mAttributeSet->get(pos); +} + +template +inline const AttributeArray& +PointDataLeafNode::attributeArray(const Name& attributeName) const +{ + const size_t pos = mAttributeSet->find(attributeName); + if (pos == AttributeSet::INVALID_POS) OPENVDB_THROW(LookupError, "Attribute Not Found - " << attributeName); + return *mAttributeSet->getConst(pos); +} + +template +inline const AttributeArray& +PointDataLeafNode::constAttributeArray(const Name& attributeName) const +{ + return this->attributeArray(attributeName); +} + +template +inline GroupHandle +PointDataLeafNode::groupHandle(const AttributeSet::Descriptor::GroupIndex& index) const +{ + const AttributeArray& array = this->attributeArray(index.first); + assert(GroupAttributeArray::isGroup(array)); + + const GroupAttributeArray& groupArray = GroupAttributeArray::cast(array); + + return GroupHandle(groupArray, index.second); +} + +template +inline GroupHandle +PointDataLeafNode::groupHandle(const Name& name) const +{ + const AttributeSet::Descriptor::GroupIndex index = this->attributeSet().groupIndex(name); + return this->groupHandle(index); +} + +template +inline GroupWriteHandle +PointDataLeafNode::groupWriteHandle(const AttributeSet::Descriptor::GroupIndex& index) +{ + AttributeArray& array = this->attributeArray(index.first); + assert(GroupAttributeArray::isGroup(array)); + + GroupAttributeArray& groupArray = GroupAttributeArray::cast(array); + + return GroupWriteHandle(groupArray, index.second); +} + +template +inline GroupWriteHandle +PointDataLeafNode::groupWriteHandle(const Name& name) +{ + const AttributeSet::Descriptor::GroupIndex index = this->attributeSet().groupIndex(name); + return this->groupWriteHandle(index); +} + +template +inline IndexIter +PointDataLeafNode::beginIndexAll() const +{ + const ValueType start = 0; + const ValueType end = this->getValue(NUM_VOXELS - 1); + return IndexIter(start, end); +} + +template +inline typename PointDataLeafNode::IndexOnIter +PointDataLeafNode::beginIndexOn() const +{ + ValueOnCIter iter = this->cbeginValueOn(); + return IndexOnIter(iter); +} + +template +inline typename PointDataLeafNode::IndexOffIter +PointDataLeafNode::beginIndexOff() const +{ + ValueOffCIter iter = this->cbeginValueOff(); + return IndexOffIter(iter); +} + +template +inline IndexIter +PointDataLeafNode::beginIndex(const unsigned index) const +{ + assert(index < BaseLeaf::SIZE); + const ValueType end = this->getValue(index); + const ValueType start = (index == 0) ? ValueType(0) : this->getValue(index - 1); + return IndexIter(start, end); +} + +template +inline IndexIter +PointDataLeafNode::beginIndex(const Coord& ijk) const +{ + return this->beginIndex(LeafNodeType::coordToOffset(ijk)); +} + +template +inline Index64 +PointDataLeafNode::pointCount() const +{ + return iterCount(this->beginIndexAll()); +} + +template +inline Index64 +PointDataLeafNode::onPointCount() const +{ + if (this->isEmpty()) return 0; + else if (this->isDense()) return this->pointCount(); + return iterCount(this->beginIndexOn()); +} + +template +inline Index64 +PointDataLeafNode::offPointCount() const +{ + if (this->isEmpty()) return this->pointCount(); + else if (this->isDense()) return 0; + return iterCount(this->beginIndexOff()); +} + +template +inline Index64 +PointDataLeafNode::groupPointCount(const Name& groupName) const +{ + IndexIter indexIter = this->beginIndexAll(); + GroupFilter filter(GroupFilter::create(*this, GroupFilter::Data(groupName))); + FilterIndexIter filterIndexIter(indexIter, filter); + return iterCount(filterIndexIter); +} + +template +inline void +PointDataLeafNode::updateValueMask() +{ + ValueType start = 0, end = 0; + for (Index n = 0; n < LeafNodeType::NUM_VALUES; n++) { + end = this->getValue(n); + this->setValueMask(n, (end - start) > 0); + start = end; + } +} + +template +inline void +PointDataLeafNode::setOffsetOn(Index offset, const ValueType& val) +{ + this->buffer().setValue(offset, val); + this->setValueMaskOn(offset); +} + +template +inline void +PointDataLeafNode::setOffsetOnly(Index offset, const ValueType& val) +{ + this->buffer().setValue(offset, val); +} + +template +inline void +PointDataLeafNode::readTopology(std::istream& is, bool fromHalf) +{ + BaseLeaf::readTopology(is, fromHalf); +} + +template +inline void +PointDataLeafNode::writeTopology(std::ostream& os, bool toHalf) const +{ + BaseLeaf::writeTopology(os, toHalf); +} + +template +inline void +PointDataLeafNode::readBuffers(std::istream& is, bool fromHalf) +{ + BaseLeaf::readBuffers(is, fromHalf); + + mAttributeSet->read(is); +} + +template +inline void +PointDataLeafNode::readBuffers(std::istream& is, const CoordBBox& bbox, bool fromHalf) +{ + // Read and clip voxel values (no clipping yet). + BaseLeaf::readBuffers(is, bbox, fromHalf); + + mAttributeSet->read(is); +} + +template +inline void +PointDataLeafNode::writeBuffers(std::ostream& os, bool toHalf) const +{ + BaseLeaf::writeBuffers(os, toHalf); + + mAttributeSet->write(os); +} + +template +inline Index64 +PointDataLeafNode::memUsage() const +{ + return BaseLeaf::memUsage() + mAttributeSet->memUsage(); +} + +} // namespace tools + +//////////////////////////////////////// + +namespace tree +{ + +/// Helper metafunction used to implement LeafNode::SameConfiguration +/// (which, as an inner class, can't be independently specialized) +template +struct SameLeafConfig > { static const bool value = true; }; + +} // namespace tree +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + + +#endif // OPENVDB_TOOLS_POINT_DATA_GRID_HAS_BEEN_INCLUDED + + +// Copyright (c) 2015-2016 Double Negative Visual Effects +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb_points/tools/PointGroup.h b/nuparu/include/openvdb/include/openvdb_points/tools/PointGroup.h new file mode 100644 index 00000000..413fc6a2 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_points/tools/PointGroup.h @@ -0,0 +1,671 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015-2016 Double Negative Visual Effects +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of Double Negative Visual Effects 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @author Dan Bailey +/// +/// @file PointGroup.h +/// +/// @brief Point group manipulation in a VDB Point Grid. +/// + + +#ifndef OPENVDB_TOOLS_POINT_GROUP_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_POINT_GROUP_HAS_BEEN_INCLUDED + +#include + +#include +#include +#include + +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + +/// @brief Appends a new empty group to the VDB tree. +/// +/// @param tree the PointDataTree to be appended to. +/// @param group name of the new group. +template +inline void appendGroup(PointDataTree& tree, + const Name& group); + +/// @brief Appends new empty groups to the VDB tree. +/// +/// @param tree the PointDataTree to be appended to. +/// @param groups names of the new groups. +template +inline void appendGroups(PointDataTree& tree, + const std::vector& groups); + +/// @brief Drops an existing group from the VDB tree. +/// +/// @param tree the PointDataTree to be dropped from. +/// @param group name of the group. +/// @param compact compact attributes if possible to reduce memory - if dropping +/// more than one group, compacting once at the end will be faster +template +inline void dropGroup( PointDataTree& tree, + const Name& group, + const bool compact = true); + +/// @brief Drops existing groups from the VDB tree, the tree is compacted after dropping. +/// +/// @param tree the PointDataTree to be dropped from. +/// @param groups names of the groups. +template +inline void dropGroups( PointDataTree& tree, + const std::vector& groups); + +/// @brief Drops all existing groups from the VDB tree, the tree is compacted after dropping. +/// +/// @param tree the PointDataTree to be dropped from. +template +inline void dropGroups( PointDataTree& tree); + +/// @brief Compacts existing groups of a VDB Tree to use less memory if possible. +/// +/// @param tree the PointDataTree to be compacted. +template +inline void compactGroups(PointDataTree& tree); + +/// @brief Sets group membership from a PointIndexTree-ordered vector. +/// +/// @param tree the PointDataTree. +/// @param indexTree the PointIndexTree. +/// @param membership @c true if the point is in the group. +/// @param group the name of the group. +/// @param remove if @c true also perform removal of points from the group. +template +inline void setGroup( PointDataTree& tree, + const PointIndexTree& indexTree, + const std::vector& membership, + const Name& group, + const bool remove = false); + + +//////////////////////////////////////// + + +namespace point_group_internal { + + +/// Copy a group attribute value from one group offset to another +template +struct CopyGroupOp { + + typedef typename tree::LeafManager LeafManagerT; + typedef typename LeafManagerT::LeafRange LeafRangeT; + typedef AttributeSet::Descriptor::NameAndType NameAndType; + typedef AttributeSet::Descriptor::GroupIndex GroupIndex; + + CopyGroupOp(PointDataTreeType& tree, + const GroupIndex& targetIndex, + const GroupIndex& sourceIndex) + : mTree(tree) + , mTargetIndex(targetIndex) + , mSourceIndex(sourceIndex) { } + + void operator()(const typename LeafManagerT::LeafRange& range) const { + + for (typename LeafManagerT::LeafRange::Iterator leaf=range.begin(); leaf; ++leaf) { + + GroupHandle sourceGroup = leaf->groupHandle(mSourceIndex); + GroupWriteHandle targetGroup = leaf->groupWriteHandle(mTargetIndex); + + for (IndexIter iter = leaf->beginIndexAll(); iter; ++iter) { + const bool groupOn = sourceGroup.get(*iter); + targetGroup.set(*iter, groupOn); + } + } + } + + ////////// + + PointDataTreeType& mTree; + const GroupIndex mTargetIndex; + const GroupIndex mSourceIndex; +}; + + +/// Set membership on or off for the specified group +template +struct SetGroupOp +{ + typedef typename tree::LeafManager LeafManagerT; + typedef AttributeSet::Descriptor::GroupIndex GroupIndex; + + SetGroupOp(const AttributeSet::Descriptor::GroupIndex& index) + : mIndex(index) { } + + void operator()(const typename LeafManagerT::LeafRange& range) const + { + for (typename LeafManagerT::LeafRange::Iterator leaf=range.begin(); leaf; ++leaf) { + + // obtain the group attribute array + + GroupWriteHandle group(leaf->groupWriteHandle(mIndex)); + + // set the group value + + group.collapse(Member); + } + } + + ////////// + + const GroupIndex mIndex; +}; // struct SetGroupOp + + +template +struct SetGroupFromIndexOp +{ + typedef typename tree::LeafManager LeafManagerT; + typedef typename LeafManagerT::LeafRange LeafRangeT; + typedef typename PointIndexTree::LeafNodeType PointIndexLeafNode; + typedef typename PointIndexLeafNode::IndexArray IndexArray; + typedef AttributeSet::Descriptor::GroupIndex GroupIndex; + typedef std::vector BoolArray; + + SetGroupFromIndexOp(const PointIndexTree& indexTree, + const BoolArray& membership, + const GroupIndex& index) + : mIndexTree(indexTree) + , mMembership(membership) + , mIndex(index) { } + + void operator()(const typename LeafManagerT::LeafRange& range) const + { + for (typename LeafManagerT::LeafRange::Iterator leaf=range.begin(); leaf; ++leaf) { + + // obtain the PointIndexLeafNode (using the origin of the current leaf) + + const PointIndexLeafNode* pointIndexLeaf = mIndexTree.probeConstLeaf(leaf->origin()); + + if (!pointIndexLeaf) continue; + + // obtain the group attribute array + + GroupWriteHandle group(leaf->groupWriteHandle(mIndex)); + + // initialise the attribute storage + + Index64 index = 0; + + const IndexArray& indices = pointIndexLeaf->indices(); + + for (typename IndexArray::const_iterator it = indices.begin(), + it_end = indices.end(); it != it_end; ++it) + { + if (Remove) { + group.set(index++, mMembership.at(*it)); + } + else { + if (mMembership.at(*it)) group.set(index, true); + + index++; + } + } + } + } + + ////////// + + const PointIndexTree& mIndexTree; + const BoolArray& mMembership; + const GroupIndex mIndex; +}; // struct SetGroupFromIndexOp + + +//////////////////////////////////////// + + +/// Convenience class with methods for analyzing group data +class GroupInfo +{ +public: + typedef AttributeSet::Descriptor Descriptor; + + GroupInfo(const AttributeSet& attributeSet) + : mAttributeSet(attributeSet) { } + + /// Return the number of bits in a group (typically 8) + static size_t groupBits() { return sizeof(GroupType) * CHAR_BIT; } + + /// Return the number of empty group slots which correlates to the number of groups + /// that can be stored without increasing the number of group attribute arrays + size_t unusedGroups() const + { + // compute total slots (one slot per bit of the group attributes) + + const size_t groupAttributes = mAttributeSet.size(AttributeArray::GROUP); + + if (groupAttributes == 0) return 0; + + const size_t totalSlots = groupAttributes * this->groupBits(); + + // compute slots in use + + const AttributeSet::Descriptor::NameToPosMap& groupMap = mAttributeSet.descriptor().groupMap(); + const size_t usedSlots = groupMap.size(); + + return totalSlots - usedSlots; + } + + /// Return @c true if there are sufficient empty slots to allow compacting + bool canCompactGroups() const + { + // can compact if more unused groups than in one group attribute array + + return this->unusedGroups() >= this->groupBits(); + } + + /// Return the next empty group slot + size_t nextUnusedOffset() const + { + const Descriptor::NameToPosMap& groupMap = mAttributeSet.descriptor().groupMap(); + + // build a list of group indices + + std::vector indices; + for (Descriptor::ConstIterator it = groupMap.begin(), + endIt = groupMap.end(); it != endIt; ++it) { + indices.push_back(it->second); + } + + std::sort(indices.begin(), indices.end()); + + // return first index not present + + size_t offset = 0; + for (std::vector::const_iterator it = indices.begin(), + endIt = indices.end(); it != endIt; ++it) { + if (*it != offset) break; + offset++; + } + + return offset; + } + + /// Fill the @p indices vector with the indices correlating to the group attribute arrays + void populateGroupIndices(std::vector& indices) const + { + const Descriptor::NameToPosMap& map = mAttributeSet.descriptor().map(); + + for (Descriptor::ConstIterator it = map.begin(), + itEnd = map.end(); it != itEnd; ++it) { + + const AttributeArray* array = mAttributeSet.getConst(it->first); + if (GroupAttributeArray::isGroup(*array)) { + indices.push_back(it->second); + } + } + } + + /// Determine if a move is required to efficiently compact the data and store the + /// source name, offset and the target offset in the input parameters + bool requiresMove(Name& sourceName, size_t& sourceOffset, size_t& targetOffset) const { + + targetOffset = this->nextUnusedOffset(); + + const Descriptor::NameToPosMap& groupMap = mAttributeSet.descriptor().groupMap(); + + typedef Descriptor::NameToPosMap::const_reverse_iterator ReverseMapIterator; + + for (ReverseMapIterator it = groupMap.rbegin(), + itEnd = groupMap.rend(); it != itEnd; ++it) { + + // move only required if source comes after the target + + if (it->second >= targetOffset) { + sourceName = it->first; + sourceOffset = it->second; + return true; + } + } + + return false; + } + +private: + const AttributeSet& mAttributeSet; +}; // class GroupInfo + + +} // namespace point_group_internal + + +//////////////////////////////////////// + + +template +inline void appendGroup(PointDataTree& tree, const Name& group) +{ + typedef AttributeSet::Descriptor Descriptor; + typedef AttributeSet::Util::NameAndType NameAndType; + + using point_attribute_internal::AppendAttributeOp; + using point_group_internal::GroupInfo; + + if (group.empty()) { + OPENVDB_THROW(KeyError, "Cannot use an empty group name as a key."); + } + + typename PointDataTree::LeafCIter iter = tree.cbeginLeaf(); + + if (!iter) return; + + const AttributeSet& attributeSet = iter->attributeSet(); + Descriptor::Ptr descriptor = attributeSet.descriptorPtr(); + GroupInfo groupInfo(attributeSet); + + // don't add if group already exists + + if (descriptor->hasGroup(group)) return; + + // add a new group attribute if there are no unused groups + + if (groupInfo.unusedGroups() == 0) { + + // find a new internal group name + + const NameAndType groupAttribute(descriptor->uniqueName("__group"), GroupAttributeArray::attributeType()); + + descriptor = descriptor->duplicateAppend(groupAttribute); + + // insert new group attribute + + AppendAttributeOp append(tree, groupAttribute, descriptor, + /*hidden=*/false, /*transient=*/false, /*group=*/true); + tbb::parallel_for(typename tree::template LeafManager(tree).leafRange(), append); + } + + // ensure that there are now available groups + + assert(groupInfo.unusedGroups() > 0); + + // find next unused offset + + const size_t offset = groupInfo.nextUnusedOffset(); + + // add the group mapping to the descriptor + + descriptor->setGroup(group, offset); +} + + +//////////////////////////////////////// + + +template +inline void appendGroups(PointDataTree& tree, + const std::vector& groups) +{ + // TODO: could be more efficient by appending multiple groups at once + // instead of one-by-one, however this is likely not that common a use case + + for (std::vector::const_iterator it = groups.begin(), + itEnd = groups.end(); it != itEnd; ++it) { + appendGroup(tree, *it); + } +} + + +//////////////////////////////////////// + + +template +inline void dropGroup(PointDataTree& tree, const Name& group, const bool compact) +{ + typedef AttributeSet::Descriptor Descriptor; + + if (group.empty()) { + OPENVDB_THROW(KeyError, "Cannot use an empty group name as a key."); + } + + typename PointDataTree::LeafCIter iter = tree.cbeginLeaf(); + + if (!iter) return; + + const AttributeSet& attributeSet = iter->attributeSet(); + Descriptor::Ptr descriptor = attributeSet.descriptorPtr(); + + descriptor->dropGroup(group); + + if (compact) { + compactGroups(tree); + } +} + + +//////////////////////////////////////// + + +template +inline void dropGroups( PointDataTree& tree, + const std::vector& groups) +{ + for (std::vector::const_iterator it = groups.begin(), + itEnd = groups.end(); it != itEnd; ++it) { + dropGroup(tree, *it, /*compact=*/false); + } + + // compaction done once for efficiency + + compactGroups(tree); +} + + +//////////////////////////////////////// + + +template +inline void dropGroups( PointDataTree& tree) +{ + typedef AttributeSet::Descriptor Descriptor; + + using point_group_internal::GroupInfo; + + typename PointDataTree::LeafCIter iter = tree.cbeginLeaf(); + + if (!iter) return; + + const AttributeSet& attributeSet = iter->attributeSet(); + Descriptor::Ptr descriptor = attributeSet.descriptorPtr(); + GroupInfo groupInfo(attributeSet); + + descriptor->clearGroups(); + + // find all indices for group attribute arrays + + std::vector indices; + groupInfo.populateGroupIndices(indices); + + // drop these attributes arrays + + dropAttributes(tree, indices); +} + + +//////////////////////////////////////// + + +template +inline void compactGroups(PointDataTree& tree) +{ + typedef AttributeSet::Descriptor Descriptor; + typedef Descriptor::GroupIndex GroupIndex; + + using point_group_internal::CopyGroupOp; + using point_group_internal::GroupInfo; + + typename PointDataTree::LeafCIter iter = tree.cbeginLeaf(); + + if (!iter) return; + + const AttributeSet& attributeSet = iter->attributeSet(); + Descriptor::Ptr descriptor = attributeSet.descriptorPtr(); + GroupInfo groupInfo(attributeSet); + + // early exit if not possible to compact + + if (!groupInfo.canCompactGroups()) return; + + // generate a list of group offsets and move them (one-by-one) + // TODO: improve this algorithm to move multiple groups per array at once + // though this is likely not that common a use case + + Name sourceName; + size_t sourceOffset, targetOffset; + + while (groupInfo.requiresMove(sourceName, sourceOffset, targetOffset)) { + + const GroupIndex sourceIndex = attributeSet.groupIndex(sourceOffset); + const GroupIndex targetIndex = attributeSet.groupIndex(targetOffset); + + CopyGroupOp copy(tree, targetIndex, sourceIndex); + tbb::parallel_for(typename tree::template LeafManager(tree).leafRange(), copy); + + descriptor->setGroup(sourceName, targetOffset); + } + + // drop unused attribute arrays + + std::vector indices; + groupInfo.populateGroupIndices(indices); + + const size_t totalAttributesToDrop = groupInfo.unusedGroups() / groupInfo.groupBits(); + + assert(totalAttributesToDrop <= indices.size()); + + std::vector indicesToDrop(indices.end() - totalAttributesToDrop, indices.end()); + + dropAttributes(tree, indicesToDrop); +} + + +//////////////////////////////////////// + + +template +inline void setGroup( PointDataTree& tree, + const PointIndexTree& indexTree, + const std::vector& membership, + const Name& group, + const bool remove) +{ + typedef AttributeSet::Descriptor Descriptor; + typedef typename tree::template LeafManager LeafManagerT; + + if (membership.size() != pointCount(tree)) { + OPENVDB_THROW(LookupError, "Membership vector size must match number of points."); + } + + using point_group_internal::SetGroupFromIndexOp; + + typename PointDataTree::LeafCIter iter = tree.cbeginLeaf(); + + if (!iter) return; + + const AttributeSet& attributeSet = iter->attributeSet(); + const Descriptor& descriptor = attributeSet.descriptor(); + + if (!descriptor.hasGroup(group)) { + OPENVDB_THROW(LookupError, "Group must exist on Tree before defining membership."); + } + + const Descriptor::GroupIndex index = attributeSet.groupIndex(group); + + // set membership + + if (remove) { + SetGroupFromIndexOp set(indexTree, membership, index); + tbb::parallel_for(LeafManagerT(tree).leafRange(), set); + } + else { + SetGroupFromIndexOp set(indexTree, membership, index); + tbb::parallel_for(LeafManagerT(tree).leafRange(), set); + } +} + + +//////////////////////////////////////// + + +template +inline void setGroup( PointDataTree& tree, + const Name& group, + const bool member = true) +{ + typedef AttributeSet::Descriptor Descriptor; + typedef typename tree::template LeafManager LeafManagerT; + + using point_group_internal::SetGroupOp; + + typename PointDataTree::LeafCIter iter = tree.cbeginLeaf(); + + if (!iter) return; + + const AttributeSet& attributeSet = iter->attributeSet(); + const Descriptor& descriptor = attributeSet.descriptor(); + + if (!descriptor.hasGroup(group)) { + OPENVDB_THROW(LookupError, "Group must exist on Tree before defining membership."); + } + + const Descriptor::GroupIndex index = attributeSet.groupIndex(group); + + // set membership based on member variable + + if (member) tbb::parallel_for(LeafManagerT(tree).leafRange(), SetGroupOp(index)); + else tbb::parallel_for(LeafManagerT(tree).leafRange(), SetGroupOp(index)); +} + + +//////////////////////////////////////// + + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + + +#endif // OPENVDB_TOOLS_POINT_GROUP_HAS_BEEN_INCLUDED + + +// Copyright (c) 2015-2016 Double Negative Visual Effects +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb_points/tools/PointLoad.h b/nuparu/include/openvdb/include/openvdb_points/tools/PointLoad.h new file mode 100644 index 00000000..65ebaaca --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_points/tools/PointLoad.h @@ -0,0 +1,161 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015-2016 Double Negative Visual Effects +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of Double Negative Visual Effects 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @author Dan Bailey +/// +/// @file PointLoad.h +/// +/// @brief Various point loading methods using a VDB Point Grid. +/// + + +#ifndef OPENVDB_TOOLS_POINT_LOAD_HAS_BEEN_INCLUDED +#define OPENVDB_TOOLS_POINT_LOAD_HAS_BEEN_INCLUDED + +#include + +#include +#include + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { +namespace tools { + + +/// @brief Loads all leaf node voxel data in the given grid. +/// +/// @param grid the Grid to be loaded. +/// @note This method wraps readNonresidentBuffers(). +template +void loadPoints(PointDataGridT& grid); + + +/// @brief Loads all leaf node voxel data in the given grid that +/// overlap with mask grid leaf nodes. +/// +/// @param grid the Grid to be loaded. +/// @param mask the mask to denote region of points to load +template +void loadPoints(PointDataGridT& grid, const MaskGridT& mask); + + +/// @brief Load the leaf node voxel data in the given grid that +/// overlap with a world-space bounding box. +/// +/// @param grid the Grid to be loaded. +/// @param bbox the bbox to denote region of points to load +/// +/// @note Does not clip to the bounding box, leaf nodes with any +/// overlap will be loaded. +template +void loadPoints(PointDataGridT& grid, const BBoxd& bbox); + + +//////////////////////////////////////// + + +#ifndef OPENVDB_2_ABI_COMPATIBLE +template +void loadPoints(PointDataGridT& grid) +{ + grid.constTree().readNonresidentBuffers(); +} +#else +template +void loadPoints(PointDataGridT&) +{ + // out-of-core not supported with ABI 2 +} +#endif + + +template +void loadPoints(PointDataGridT& grid, const MaskGridT& mask) +{ + typedef typename PointDataGridT::TreeType PointDataTreeT; + + tree::ValueAccessor pointsAcc(grid.constTree()); + + typename MaskGridT::TreeType::LeafCIter leafIter = mask.constTree().cbeginLeaf(); + + for (; leafIter; ++leafIter) { + const Coord& ijk = leafIter->origin(); + const typename PointDataTreeT::LeafNodeType* leaf = pointsAcc.probeConstLeaf(ijk); + + if (!leaf) continue; + + // load out of core leaf nodes + if (leaf->buffer().isOutOfCore()) leaf->buffer().data(); + } +} + + +template +void loadPoints(PointDataGridT& grid, const BBoxd& bbox) +{ + typedef typename PointDataGridT::template ValueConverter::Type BoolGridT; + + // Transform the world-space bounding box into the source grid's index space. + Vec3d idxMin, idxMax; + math::calculateBounds(grid.constTransform(), bbox.min(), bbox.max(), idxMin, idxMax); + CoordBBox region(Coord::floor(idxMin), Coord::floor(idxMax)); + + // Construct a boolean mask grid that is true inside the index-space bounding box + // and false everywhere else. + BoolGridT clipMask(/*background=*/false); + clipMask.fill(region, /*value=*/true, /*active=*/true); + + // MaskGrid introduced in OpenVDB 3.2 + typedef BoolGrid MaskType; + + // Convert the input grid to a mask grid (with the same tree configuration). + MaskType::Ptr pointsMask = MaskType::create(/*background=*/false); + pointsMask->topologyUnion(grid); + pointsMask->topologyIntersection(clipMask); + + loadPoints(grid, *pointsMask); +} + + +//////////////////////////////////////// + + +} // namespace tools +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + + +#endif // OPENVDB_TOOLS_POINT_LOAD_HAS_BEEN_INCLUDED + + +// Copyright (c) 2015-2016 Double Negative Visual Effects +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/include/openvdb_points/version.h b/nuparu/include/openvdb/include/openvdb_points/version.h new file mode 100644 index 00000000..5ee0be85 --- /dev/null +++ b/nuparu/include/openvdb/include/openvdb_points/version.h @@ -0,0 +1,85 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2015-2016 Double Negative Visual Effects +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of Double Negative Visual Effects 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// + +#ifndef OPENVDB_POINTS_VERSION_HAS_BEEN_INCLUDED +#define OPENVDB_POINTS_VERSION_HAS_BEEN_INCLUDED + +#include + +/// Always disable Houdini warnings +#ifndef IGNORE_HDK_DEPRECATIONS +#define IGNORE_HDK_DEPRECATIONS +#endif + +// Library major, minor and patch version numbers +#define OPENVDB_POINTS_LIBRARY_MAJOR_VERSION_NUMBER 0 +#define OPENVDB_POINTS_LIBRARY_MINOR_VERSION_NUMBER 2 +#define OPENVDB_POINTS_LIBRARY_PATCH_VERSION_NUMBER 0 + +/// @brief Library version number string of the form ".." +/// @details This is a macro rather than a static constant because we typically +/// want the compile-time version number, not the runtime version number +/// (although the two are usually the same). +#define OPENVDB_POINTS_LIBRARY_VERSION_STRING "0.2.0" + +/// Library version number as a packed integer ("%02x%02x%04x", major, minor, patch) +#define OPENVDB_POINTS_LIBRARY_VERSION_NUMBER \ + ((OPENVDB_POINTS_LIBRARY_MAJOR_VERSION_NUMBER << 24) | \ + ((OPENVDB_POINTS_LIBRARY_MINOR_VERSION_NUMBER & 0xFF) << 16) | \ + (OPENVDB_POINTS_LIBRARY_PATCH_VERSION_NUMBER & 0xFFFF)) + +namespace openvdb { +OPENVDB_USE_VERSION_NAMESPACE +namespace OPENVDB_VERSION_NAME { + +namespace points { + +// Library major, minor and patch version numbers +const uint32_t + OPENVDB_POINTS_LIBRARY_MAJOR_VERSION = OPENVDB_POINTS_LIBRARY_MAJOR_VERSION_NUMBER, + OPENVDB_POINTS_LIBRARY_MINOR_VERSION = OPENVDB_POINTS_LIBRARY_MINOR_VERSION_NUMBER, + OPENVDB_POINTS_LIBRARY_PATCH_VERSION = OPENVDB_POINTS_LIBRARY_PATCH_VERSION_NUMBER; +/// Library version number as a packed integer ("%02x%02x%04x", major, minor, patch) +const uint32_t OPENVDB_POINTS_LIBRARY_VERSION = OPENVDB_POINTS_LIBRARY_VERSION_NUMBER; + + +/// Return a library version number string of the form "..". +inline const char* getLibraryVersionString() { return OPENVDB_POINTS_LIBRARY_VERSION_STRING; } + +} // namespace points + +} // namespace OPENVDB_VERSION_NAME +} // namespace openvdb + +#endif // OPENVDB_POINTS_VERSION_HAS_BEEN_INCLUDED + +// Copyright (c) 2015-2016 Double Negative Visual Effects +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/lib/libHalf.12.0.0.dylib b/nuparu/include/openvdb/lib/libHalf.12.0.0.dylib new file mode 100755 index 00000000..289bc242 Binary files /dev/null and b/nuparu/include/openvdb/lib/libHalf.12.0.0.dylib differ diff --git a/nuparu/include/openvdb/lib/libboost_iostreams-clang-darwin61-mt-1_55.dylib b/nuparu/include/openvdb/lib/libboost_iostreams-clang-darwin61-mt-1_55.dylib new file mode 100755 index 00000000..e8a0d0da Binary files /dev/null and b/nuparu/include/openvdb/lib/libboost_iostreams-clang-darwin61-mt-1_55.dylib differ diff --git a/nuparu/include/openvdb/lib/libopenvdb.3.0.0.dylib b/nuparu/include/openvdb/lib/libopenvdb.3.0.0.dylib new file mode 100755 index 00000000..377e1e60 Binary files /dev/null and b/nuparu/include/openvdb/lib/libopenvdb.3.0.0.dylib differ diff --git a/nuparu/include/openvdb/lib/libopenvdb.3.0.dylib b/nuparu/include/openvdb/lib/libopenvdb.3.0.dylib new file mode 100755 index 00000000..377e1e60 Binary files /dev/null and b/nuparu/include/openvdb/lib/libopenvdb.3.0.dylib differ diff --git a/nuparu/include/openvdb/lib/libopenvdb.3.2.0.dylib b/nuparu/include/openvdb/lib/libopenvdb.3.2.0.dylib new file mode 100755 index 00000000..d8fa5f82 Binary files /dev/null and b/nuparu/include/openvdb/lib/libopenvdb.3.2.0.dylib differ diff --git a/nuparu/include/openvdb/lib/libopenvdb.3.2.dylib b/nuparu/include/openvdb/lib/libopenvdb.3.2.dylib new file mode 100755 index 00000000..d8fa5f82 Binary files /dev/null and b/nuparu/include/openvdb/lib/libopenvdb.3.2.dylib differ diff --git a/nuparu/include/openvdb/lib/libopenvdb.a b/nuparu/include/openvdb/lib/libopenvdb.a new file mode 100644 index 00000000..f17476c6 Binary files /dev/null and b/nuparu/include/openvdb/lib/libopenvdb.a differ diff --git a/nuparu/include/openvdb/lib/libopenvdb.dylib b/nuparu/include/openvdb/lib/libopenvdb.dylib new file mode 100755 index 00000000..d8fa5f82 Binary files /dev/null and b/nuparu/include/openvdb/lib/libopenvdb.dylib differ diff --git a/nuparu/include/openvdb/lib/libopenvdb_houdini.so b/nuparu/include/openvdb/lib/libopenvdb_houdini.so new file mode 100755 index 00000000..60d86a2e Binary files /dev/null and b/nuparu/include/openvdb/lib/libopenvdb_houdini.so differ diff --git a/nuparu/include/openvdb/lib/libopenvdb_houdini.so.3.2.0 b/nuparu/include/openvdb/lib/libopenvdb_houdini.so.3.2.0 new file mode 100755 index 00000000..60d86a2e Binary files /dev/null and b/nuparu/include/openvdb/lib/libopenvdb_houdini.so.3.2.0 differ diff --git a/nuparu/include/openvdb/lib/libopenvdb_points.0.2.0.dylib b/nuparu/include/openvdb/lib/libopenvdb_points.0.2.0.dylib new file mode 100755 index 00000000..3585888e Binary files /dev/null and b/nuparu/include/openvdb/lib/libopenvdb_points.0.2.0.dylib differ diff --git a/nuparu/include/openvdb/lib/libopenvdb_points.0.2.dylib b/nuparu/include/openvdb/lib/libopenvdb_points.0.2.dylib new file mode 100755 index 00000000..3585888e Binary files /dev/null and b/nuparu/include/openvdb/lib/libopenvdb_points.0.2.dylib differ diff --git a/nuparu/include/openvdb/lib/libopenvdb_points.a b/nuparu/include/openvdb/lib/libopenvdb_points.a new file mode 100644 index 00000000..539c5e35 Binary files /dev/null and b/nuparu/include/openvdb/lib/libopenvdb_points.a differ diff --git a/nuparu/include/openvdb/lib/libopenvdb_points.dylib b/nuparu/include/openvdb/lib/libopenvdb_points.dylib new file mode 100755 index 00000000..3585888e Binary files /dev/null and b/nuparu/include/openvdb/lib/libopenvdb_points.dylib differ diff --git a/nuparu/include/openvdb/lib/libz.1.2.7.dylib b/nuparu/include/openvdb/lib/libz.1.2.7.dylib new file mode 100755 index 00000000..7767cc8c Binary files /dev/null and b/nuparu/include/openvdb/lib/libz.1.2.7.dylib differ diff --git a/nuparu/include/openvdb/python/include/python2.7/pyopenvdb.h b/nuparu/include/openvdb/python/include/python2.7/pyopenvdb.h new file mode 100644 index 00000000..bf6f3c8d --- /dev/null +++ b/nuparu/include/openvdb/python/include/python2.7/pyopenvdb.h @@ -0,0 +1,113 @@ +/////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +// +// Redistributions of source code must retain the above copyright +// and license notice and the following restrictions and disclaimer. +// +// * Neither the name of DreamWorks Animation 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 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. +// IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE +// LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. +// +/////////////////////////////////////////////////////////////////////////// +// +/// @file pyopenvdb.h +/// +/// @brief Glue functions for access to pyOpenVDB objects from C++ code +/// @details Use these functions in your own Python function implementations +/// to extract an OpenVDB grid from or wrap a grid in a @c PyObject. +/// For example (using Boost.Python), +/// @code +/// #include +/// #include +/// #include +/// +/// // Implementation of a Python function that processes pyOpenVDB grids +/// boost::python::object +/// processGrid(boost::python::object inObj) +/// { +/// boost::python::object outObj; +/// try { +/// // Extract an OpenVDB grid from the input argument. +/// if (openvdb::GridBase::Ptr grid = +/// pyopenvdb::getGridFromPyObject(inObj)) +/// { +/// grid = grid->deepCopyGrid(); +/// +/// // Process the grid... +/// +/// // Wrap the processed grid in a PyObject. +/// outObj = pyopenvdb::getPyObjectFromGrid(grid); +/// } +/// } catch (openvdb::TypeError& e) { +/// PyErr_Format(PyExc_TypeError, e.what()); +/// boost::python::throw_error_already_set(); +/// } +/// return outObj; +/// } +/// +/// BOOST_PYTHON_MODULE(mymodule) +/// { +/// openvdb::initialize(); +/// +/// // Definition of a Python function that processes pyOpenVDB grids +/// boost::python::def(/*name=*/"processGrid", &processGrid, /*argname=*/"grid"); +/// } +/// @endcode +/// Then, from Python, +/// @code +/// import openvdb +/// import mymodule +/// +/// grid = openvdb.read('myGrid.vdb', 'MyGrid') +/// grid = mymodule.processGrid(grid) +/// openvdb.write('myProcessedGrid.vdb', [grid]) +/// @endcode + +#ifndef PYOPENVDB_HAS_BEEN_INCLUDED +#define PYOPENVDB_HAS_BEEN_INCLUDED + +#include +#include "openvdb/Grid.h" + + +namespace pyopenvdb { + +//@{ +/// @brief Return a pointer to the OpenVDB grid held by the given Python object. +/// @throw openvdb::TypeError if the Python object is not one of the pyOpenVDB grid types. +/// (See the Python module's GridTypes global variable for the list of supported grid types.) +openvdb::GridBase::Ptr getGridFromPyObject(PyObject*); +openvdb::GridBase::Ptr getGridFromPyObject(const boost::python::object&); +//@} + +/// @brief Return a new Python object that holds the given OpenVDB grid. +/// @return @c None if the given grid pointer is null. +/// @throw openvdb::TypeError if the grid is not of a supported type. +/// (See the Python module's GridTypes global variable for the list of supported grid types.) +boost::python::object getPyObjectFromGrid(const openvdb::GridBase::Ptr&); + +} // namespace pyopenvdb + +#endif // PYOPENVDB_HAS_BEEN_INCLUDED + +// Copyright (c) 2012-2016 DreamWorks Animation LLC +// All rights reserved. This software is distributed under the +// Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) diff --git a/nuparu/include/openvdb/python/lib/python2.7/pyopenvdb.so b/nuparu/include/openvdb/python/lib/python2.7/pyopenvdb.so new file mode 100755 index 00000000..2587c354 Binary files /dev/null and b/nuparu/include/openvdb/python/lib/python2.7/pyopenvdb.so differ diff --git a/nuparu/include/openvdb/python/lib/python2.7/pyopenvdb.so.3.0 b/nuparu/include/openvdb/python/lib/python2.7/pyopenvdb.so.3.0 new file mode 100755 index 00000000..2587c354 Binary files /dev/null and b/nuparu/include/openvdb/python/lib/python2.7/pyopenvdb.so.3.0 differ diff --git a/nuparu/include/openvdb/python/lib/python2.7/pyopenvdb.so.3.2 b/nuparu/include/openvdb/python/lib/python2.7/pyopenvdb.so.3.2 new file mode 100755 index 00000000..2587c354 Binary files /dev/null and b/nuparu/include/openvdb/python/lib/python2.7/pyopenvdb.so.3.2 differ diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/Archive_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/Archive_8h_source.html new file mode 100644 index 00000000..2d464691 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/Archive_8h_source.html @@ -0,0 +1,284 @@ + + + + + + +OpenVDB: Archive.h Source File + + + + + + + + + + +

+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Archive.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 
+
31 #ifndef OPENVDB_IO_ARCHIVE_HAS_BEEN_INCLUDED
+
32 #define OPENVDB_IO_ARCHIVE_HAS_BEEN_INCLUDED
+
33 
+
34 #include <openvdb/Platform.h>
+
35 #include <iosfwd>
+
36 #include <map>
+
37 #include <string>
+
38 #include <boost/uuid/uuid.hpp>
+
39 #include <boost/cstdint.hpp>
+
40 #include <boost/scoped_ptr.hpp>
+
41 #include <boost/shared_ptr.hpp>
+
42 #include <openvdb/Grid.h>
+ +
44 #include <openvdb/version.h> // for VersionId
+
45 #include "Compression.h" // for COMPRESS_ZIP, etc.
+
46 
+
47 
+
48 class TestFile;
+
49 
+
50 namespace openvdb {
+ +
52 namespace OPENVDB_VERSION_NAME {
+
53 namespace io {
+
54 
+
55 class GridDescriptor;
+
56 
+
57 
+ +
60 {
+
61 public:
+
62  typedef boost::shared_ptr<Archive> Ptr;
+
63  typedef boost::shared_ptr<const Archive> ConstPtr;
+
64 
+
65  static const uint32_t DEFAULT_COMPRESSION_FLAGS;
+
66 
+
67  Archive();
+
68  virtual ~Archive();
+
69 
+
71  virtual Ptr copy() const;
+
72 
+
75  std::string getUniqueTag() const;
+
77  bool isIdentical(const std::string& uuidStr) const;
+
78 
+
80  uint32_t fileVersion() const { return mFileVersion; }
+
83  VersionId libraryVersion() const { return mLibraryVersion; }
+
86  std::string version() const;
+
87 
+
90  bool isInstancingEnabled() const { return mEnableInstancing; }
+
94  void setInstancingEnabled(bool b) { mEnableInstancing = b; }
+
95 
+
97  static bool hasBloscCompression();
+
98 
+
100  uint32_t compression() const { return mCompression; }
+
105  void setCompression(uint32_t c) { mCompression = c; }
+
106 
+
109  bool isGridStatsMetadataEnabled() const { return mEnableGridStats; }
+
112  void setGridStatsMetadataEnabled(bool b) { mEnableGridStats = b; }
+
113 
+
115  virtual void write(const GridCPtrVec&, const MetaMap& = MetaMap()) const {}
+
116 
+
122  static bool isDelayedLoadingEnabled();
+
123 
+
124 protected:
+
127  bool inputHasGridOffsets() const { return mInputHasGridOffsets; }
+
128  void setInputHasGridOffsets(bool b) { mInputHasGridOffsets = b; }
+
129 
+
134  void setFormatVersion(std::istream&);
+
135 
+
141  void setLibraryVersion(std::istream&);
+
142 
+
145  void setDataCompression(std::istream&);
+
146 
+
149  void setGridCompression(std::ostream&, const GridBase&) const;
+
152  static void readGridCompression(std::istream&);
+
153 
+
155  static int32_t readGridCount(std::istream&);
+
156 
+
158  static void readGrid(GridBase::Ptr, const GridDescriptor&, std::istream&);
+
159 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
160  static void readGrid(GridBase::Ptr, const GridDescriptor&, std::istream&, const BBoxd&);
+
165  static void readGrid(GridBase::Ptr, const GridDescriptor&, std::istream&, const CoordBBox&);
+
166 #endif
+
167 
+
168  typedef std::map<Name /*uniqueName*/, GridBase::Ptr> NamedGridMap;
+
169 
+
172  void connectInstance(const GridDescriptor&, const NamedGridMap&) const;
+
173 
+
177  void writeGrid(GridDescriptor&, GridBase::ConstPtr, std::ostream&, bool seekable) const;
+
182  void writeGridInstance(GridDescriptor&, GridBase::ConstPtr,
+
183  std::ostream&, bool seekable) const;
+
184 
+
187  bool readHeader(std::istream&);
+
191  void writeHeader(std::ostream&, bool seekable) const;
+
192 
+
194  void write(std::ostream&, const GridPtrVec&, bool seekable, const MetaMap& = MetaMap()) const;
+
196  void write(std::ostream&, const GridCPtrVec&, bool seekable, const MetaMap& = MetaMap()) const;
+
198 
+
199 private:
+
200  friend class ::TestFile;
+
201 
+
203  uint32_t mFileVersion;
+
205  VersionId mLibraryVersion;
+
207  mutable boost::uuids::uuid mUuid;// needs to be mutable since writeHeader is const!
+
210  bool mInputHasGridOffsets;
+
213  bool mEnableInstancing;
+
215  uint32_t mCompression;
+
217  bool mEnableGridStats;
+
218 }; // class Archive
+
219 
+
220 } // namespace io
+
221 } // namespace OPENVDB_VERSION_NAME
+
222 } // namespace openvdb
+
223 
+
224 #endif // OPENVDB_IO_ARCHIVE_HAS_BEEN_INCLUDED
+
225 
+
226 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
227 // All rights reserved. This software is distributed under the
+
228 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
#define OPENVDB_API
Helper macros for defining library symbol visibility.
Definition: Platform.h:195
+
boost::shared_ptr< const GridBase > ConstPtr
Definition: Grid.h:107
+ +
Abstract base class for typed grids.
Definition: Grid.h:103
+
std::vector< GridBase::Ptr > GridPtrVec
Definition: Grid.h:420
+
OPENVDB_API void setDataCompression(std::ios_base &, uint32_t compressionFlags)
Associate with the given stream a bitwise OR of compression option flags (COMPRESS_ZIP, COMPRESS_ACTIVE_MASK, etc.) specifying whether and how input data is compressed or output data should be compressed.
+ +
std::vector< GridBase::ConstPtr > GridCPtrVec
Definition: Grid.h:425
+
std::string Name
Definition: Name.h:44
+
Container that maps names (strings) to values of arbitrary types.
Definition: MetaMap.h:46
+
boost::shared_ptr< Archive > Ptr
Definition: Archive.h:62
+
boost::shared_ptr< const Archive > ConstPtr
Definition: Archive.h:63
+
void setInstancingEnabled(bool b)
Specify whether trees shared by multiple grids should be written out only once (true) or once per gri...
Definition: Archive.h:94
+
static const uint32_t DEFAULT_COMPRESSION_FLAGS
Definition: Archive.h:65
+
void setInputHasGridOffsets(bool b)
Definition: Archive.h:128
+ +
void setCompression(uint32_t c)
Specify whether and how the data stream should be compressed.
Definition: Archive.h:105
+
bool isInstancingEnabled() const
Return true if trees shared by multiple grids are written out only once, false if they are written ou...
Definition: Archive.h:90
+
Definition: GridDescriptor.h:46
+
VersionId libraryVersion() const
Return the (major, minor) version number of the library that was used to write the input stream...
Definition: Archive.h:83
+
void setGridStatsMetadataEnabled(bool b)
Specify whether grid statistics (active voxel count and bounding box, etc.) should be computed and wr...
Definition: Archive.h:112
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
virtual void write(const GridCPtrVec &, const MetaMap &=MetaMap()) const
Write the grids in the given container to this archive's output stream.
Definition: Archive.h:115
+
uint32_t fileVersion() const
Return the file format version number of the input stream.
Definition: Archive.h:80
+
Definition: version.h:120
+
uint32_t compression() const
Return a bit mask specifying compression options for the data stream.
Definition: Archive.h:100
+
Definition: Exceptions.h:39
+ +
bool inputHasGridOffsets() const
Return true if the input stream contains grid offsets that allow for random access or partial reading...
Definition: Archive.h:127
+ +
boost::shared_ptr< GridBase > Ptr
Definition: Grid.h:106
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
std::map< Name, GridBase::Ptr > NamedGridMap
Definition: Archive.h:168
+
bool isGridStatsMetadataEnabled() const
Return true if grid statistics (active voxel count and bounding box, etc.) are computed and written a...
Definition: Archive.h:109
+
Grid serializer/unserializer.
Definition: Archive.h:59
+ +
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/BBox_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/BBox_8h_source.html new file mode 100644 index 00000000..7f41f652 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/BBox_8h_source.html @@ -0,0 +1,563 @@ + + + + + + +OpenVDB: BBox.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
BBox.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 
+
31 #ifndef OPENVDB_MATH_BBOX_HAS_BEEN_INCLUDED
+
32 #define OPENVDB_MATH_BBOX_HAS_BEEN_INCLUDED
+
33 
+
34 #include "Math.h" // for math::isApproxEqual() and math::Tolerance()
+
35 #include "Vec3.h"
+
36 #include <ostream>
+
37 #include <algorithm> // for min/max
+
38 #include <boost/type_traits/is_integral.hpp>
+
39 
+
40 namespace openvdb {
+ +
42 namespace OPENVDB_VERSION_NAME {
+
43 namespace math {
+
44 
+
46 template<typename Vec3T>
+
47 class BBox
+
48 {
+
49 public:
+
50  typedef Vec3T Vec3Type;
+
51  typedef Vec3T ValueType;
+
52  typedef Vec3T VectorType;
+
53  typedef typename Vec3Type::ValueType ElementType;
+
54 
+
56  BBox();
+
57 
+
59  BBox(const Vec3T& xyzMin, const Vec3T& xyzMax);
+
60 
+
63  BBox(const Vec3T& xyzMin, const Vec3T& xyzMax, bool sorted);
+
64 
+
68  BBox(const Vec3T& xyzMin, const ElementType& length);
+
69 
+
72  explicit BBox(const ElementType* xyz, bool sorted = true);
+
73 
+
75  BBox(const BBox& other);
+
76 
+
78  void sort();
+
79 
+
81  const Vec3T& min() const { return mMin; }
+
82 
+
84  const Vec3T& max() const { return mMax; }
+
85 
+
87  Vec3T& min() { return mMin; }
+
88 
+
90  Vec3T& max() { return mMax; }
+
91 
+
93  bool operator==(const BBox& rhs) const;
+
94 
+
96  bool operator!=(const BBox& rhs) const { return !(*this == rhs); }
+
97 
+
100  bool empty() const;
+
101 
+
103  bool hasVolume() const { return !this->empty(); }
+
104 
+
106  operator bool() const { return !this->empty(); }
+
107 
+
111  bool isSorted() const;
+
112 
+
114  Vec3d getCenter() const;
+
115 
+
120  Vec3T extents() const;
+
121 
+
123  ElementType volume() const { Vec3T e = this->extents(); return e[0] * e[1] * e[2]; }
+
124 
+
126  size_t maxExtent() const { return MaxIndex(mMax - mMin); }
+
127 
+
129  size_t minExtent() const { return MinIndex(mMax - mMin); }
+
130 
+
132  bool isInside(const Vec3T& xyz) const;
+
133 
+
135  bool isInside(const BBox&) const;
+
136 
+
138  bool hasOverlap(const BBox&) const;
+
139 
+
141  void expand(ElementType padding);
+
142 
+
144  void expand(const Vec3T& xyz);
+
145 
+
147  void expand(const BBox&);
+
148  // @brief Union this bbox with the cubical bbox defined from xyzMin and
+
149  // length
+
151  void expand(const Vec3T& xyzMin, const ElementType& length);
+
152 
+
154  void translate(const Vec3T& t);
+
155 
+
157  template<typename MapType>
+
158  BBox applyMap(const MapType& map) const;
+
159 
+
161  template<typename MapType>
+
162  BBox applyInverseMap(const MapType& map) const;
+
163 
+
165  void read(std::istream& is) { mMin.read(is); mMax.read(is); }
+
166 
+
168  void write(std::ostream& os) const { mMin.write(os); mMax.write(os); }
+
169 
+
170 private:
+
171  Vec3T mMin, mMax;
+
172 }; // class BBox
+
173 
+
174 
+
176 
+
177 
+
178 template<typename Vec3T>
+
179 inline
+ +
181  mMin( std::numeric_limits<ElementType>::max()),
+
182  mMax(-std::numeric_limits<ElementType>::max())
+
183 {
+
184 }
+
185 
+
186 template<typename Vec3T>
+
187 inline
+
188 BBox<Vec3T>::BBox(const Vec3T& xyzMin, const Vec3T& xyzMax):
+
189  mMin(xyzMin), mMax(xyzMax)
+
190 {
+
191 }
+
192 
+
193 template<typename Vec3T>
+
194 inline
+
195 BBox<Vec3T>::BBox(const Vec3T& xyzMin, const Vec3T& xyzMax, bool sorted):
+
196  mMin(xyzMin), mMax(xyzMax)
+
197 {
+
198  if (!sorted) this->sort();
+
199 }
+
200 
+
201 template<typename Vec3T>
+
202 inline
+
203 BBox<Vec3T>::BBox(const Vec3T& xyzMin, const ElementType& length):
+
204  mMin(xyzMin), mMax(xyzMin)
+
205 {
+
206  // min and max are inclusive for integral ElementType
+
207  const ElementType size = boost::is_integral<ElementType>::value ? length-1 : length;
+
208  mMax[0] += size;
+
209  mMax[1] += size;
+
210  mMax[2] += size;
+
211 }
+
212 
+
213 template<typename Vec3T>
+
214 inline
+
215 BBox<Vec3T>::BBox(const ElementType* xyz, bool sorted):
+
216  mMin(xyz[0], xyz[1], xyz[2]),
+
217  mMax(xyz[3], xyz[4], xyz[5])
+
218 {
+
219  if (!sorted) this->sort();
+
220 }
+
221 
+
222 
+
223 template<typename Vec3T>
+
224 inline
+
225 BBox<Vec3T>::BBox(const BBox& other):
+
226  mMin(other.mMin), mMax(other.mMax)
+
227 {
+
228 }
+
229 
+
230 
+
232 
+
233 
+
234 template<typename Vec3T>
+
235 inline bool
+ +
237 {
+
238  if (boost::is_integral<ElementType>::value) {
+
239  // min and max are inclusive for integral ElementType
+
240  return (mMin[0] > mMax[0] || mMin[1] > mMax[1] || mMin[2] > mMax[2]);
+
241  }
+
242  return mMin[0] >= mMax[0] || mMin[1] >= mMax[1] || mMin[2] >= mMax[2];
+
243 }
+
244 
+
245 
+
246 template<typename Vec3T>
+
247 inline bool
+
248 BBox<Vec3T>::operator==(const BBox& rhs) const
+
249 {
+
250  if (boost::is_integral<ElementType>::value) {
+
251  return mMin == rhs.min() && mMax == rhs.max();
+
252  } else {
+
253  return math::isApproxEqual(mMin, rhs.min()) && math::isApproxEqual(mMax, rhs.max());
+
254  }
+
255 }
+
256 
+
257 
+
258 template<typename Vec3T>
+
259 inline void
+ +
261 {
+
262  Vec3T tMin(mMin), tMax(mMax);
+
263  for (int i = 0; i < 3; ++i) {
+
264  mMin[i] = std::min(tMin[i], tMax[i]);
+
265  mMax[i] = std::max(tMin[i], tMax[i]);
+
266  }
+
267 }
+
268 
+
269 
+
270 template<typename Vec3T>
+
271 inline bool
+ +
273 {
+
274  if (boost::is_integral<ElementType>::value) {
+
275  return (mMin[0] <= mMax[0] && mMin[1] <= mMax[1] && mMin[2] <= mMax[2]);
+
276  } else {
+ +
278  return (mMin[0] < (mMax[0] + t) && mMin[1] < (mMax[1] + t) && mMin[2] < (mMax[2] + t));
+
279  }
+
280 }
+
281 
+
282 
+
283 template<typename Vec3T>
+
284 inline Vec3d
+ +
286 {
+
287  return (Vec3d(mMin.asPointer()) + Vec3d(mMax.asPointer())) * 0.5;
+
288 }
+
289 
+
290 
+
291 template<typename Vec3T>
+
292 inline Vec3T
+ +
294 {
+
295  if (boost::is_integral<ElementType>::value) {
+
296  return (mMax - mMin) + Vec3T(1, 1, 1);
+
297  } else {
+
298  return (mMax - mMin);
+
299  }
+
300 }
+
301 
+
303 
+
304 
+
305 template<typename Vec3T>
+
306 inline bool
+
307 BBox<Vec3T>::isInside(const Vec3T& xyz) const
+
308 {
+
309  if (boost::is_integral<ElementType>::value) {
+
310  return xyz[0] >= mMin[0] && xyz[0] <= mMax[0] &&
+
311  xyz[1] >= mMin[1] && xyz[1] <= mMax[1] &&
+
312  xyz[2] >= mMin[2] && xyz[2] <= mMax[2];
+
313  } else {
+ +
315  return xyz[0] > (mMin[0]-t) && xyz[0] < (mMax[0]+t) &&
+
316  xyz[1] > (mMin[1]-t) && xyz[1] < (mMax[1]+t) &&
+
317  xyz[2] > (mMin[2]-t) && xyz[2] < (mMax[2]+t);
+
318  }
+
319 }
+
320 
+
321 
+
322 template<typename Vec3T>
+
323 inline bool
+ +
325 {
+
326  if (boost::is_integral<ElementType>::value) {
+
327  return b.min()[0] >= mMin[0] && b.max()[0] <= mMax[0] &&
+
328  b.min()[1] >= mMin[1] && b.max()[1] <= mMax[1] &&
+
329  b.min()[2] >= mMin[2] && b.max()[2] <= mMax[2];
+
330  } else {
+ +
332  return (b.min()[0]-t) > mMin[0] && (b.max()[0]+t) < mMax[0] &&
+
333  (b.min()[1]-t) > mMin[1] && (b.max()[1]+t) < mMax[1] &&
+
334  (b.min()[2]-t) > mMin[2] && (b.max()[2]+t) < mMax[2];
+
335  }
+
336 }
+
337 
+
338 
+
339 template<typename Vec3T>
+
340 inline bool
+ +
342 {
+
343  if (boost::is_integral<ElementType>::value) {
+
344  return mMax[0] >= b.min()[0] && mMin[0] <= b.max()[0] &&
+
345  mMax[1] >= b.min()[1] && mMin[1] <= b.max()[1] &&
+
346  mMax[2] >= b.min()[2] && mMin[2] <= b.max()[2];
+
347  } else {
+ +
349  return mMax[0] > (b.min()[0]-t) && mMin[0] < (b.max()[0]+t) &&
+
350  mMax[1] > (b.min()[1]-t) && mMin[1] < (b.max()[1]+t) &&
+
351  mMax[2] > (b.min()[2]-t) && mMin[2] < (b.max()[2]+t);
+
352  }
+
353 }
+
354 
+
355 
+
357 
+
358 
+
359 template<typename Vec3T>
+
360 inline void
+ +
362 {
+
363  dx = std::abs(dx);
+
364  for (int i = 0; i < 3; ++i) {
+
365  mMin[i] -= dx;
+
366  mMax[i] += dx;
+
367  }
+
368 }
+
369 
+
370 
+
371 template<typename Vec3T>
+
372 inline void
+
373 BBox<Vec3T>::expand(const Vec3T& xyz)
+
374 {
+
375  for (int i = 0; i < 3; ++i) {
+
376  mMin[i] = std::min(mMin[i], xyz[i]);
+
377  mMax[i] = std::max(mMax[i], xyz[i]);
+
378  }
+
379 }
+
380 
+
381 
+
382 template<typename Vec3T>
+
383 inline void
+ +
385 {
+
386  for (int i = 0; i < 3; ++i) {
+
387  mMin[i] = std::min(mMin[i], b.min()[i]);
+
388  mMax[i] = std::max(mMax[i], b.max()[i]);
+
389  }
+
390 }
+
391 
+
392 template<typename Vec3T>
+
393 inline void
+
394 BBox<Vec3T>::expand(const Vec3T& xyzMin, const ElementType& length)
+
395 {
+
396  const ElementType size = boost::is_integral<ElementType>::value ? length-1 : length;
+
397  for (int i = 0; i < 3; ++i) {
+
398  mMin[i] = std::min(mMin[i], xyzMin[i]);
+
399  mMax[i] = std::max(mMax[i], xyzMin[i] + size);
+
400  }
+
401 }
+
402 
+
403 
+
404 template<typename Vec3T>
+
405 inline void
+
406 BBox<Vec3T>::translate(const Vec3T& dx)
+
407 {
+
408  mMin += dx;
+
409  mMax += dx;
+
410 }
+
411 
+
412 template<typename Vec3T>
+
413 template<typename MapType>
+
414 inline BBox<Vec3T>
+
415 BBox<Vec3T>::applyMap(const MapType& map) const
+
416 {
+
417  typedef Vec3<double> Vec3R;
+
418  BBox<Vec3T> bbox;
+
419  bbox.expand(map.applyMap(Vec3R(mMin[0], mMin[1], mMin[2])));
+
420  bbox.expand(map.applyMap(Vec3R(mMin[0], mMin[1], mMax[2])));
+
421  bbox.expand(map.applyMap(Vec3R(mMin[0], mMax[1], mMin[2])));
+
422  bbox.expand(map.applyMap(Vec3R(mMax[0], mMin[1], mMin[2])));
+
423  bbox.expand(map.applyMap(Vec3R(mMax[0], mMax[1], mMin[2])));
+
424  bbox.expand(map.applyMap(Vec3R(mMax[0], mMin[1], mMax[2])));
+
425  bbox.expand(map.applyMap(Vec3R(mMin[0], mMax[1], mMax[2])));
+
426  bbox.expand(map.applyMap(Vec3R(mMax[0], mMax[1], mMax[2])));
+
427  return bbox;
+
428 }
+
429 
+
430 template<typename Vec3T>
+
431 template<typename MapType>
+
432 inline BBox<Vec3T>
+
433 BBox<Vec3T>::applyInverseMap(const MapType& map) const
+
434 {
+
435  typedef Vec3<double> Vec3R;
+
436  BBox<Vec3T> bbox;
+
437  bbox.expand(map.applyInverseMap(Vec3R(mMin[0], mMin[1], mMin[2])));
+
438  bbox.expand(map.applyInverseMap(Vec3R(mMin[0], mMin[1], mMax[2])));
+
439  bbox.expand(map.applyInverseMap(Vec3R(mMin[0], mMax[1], mMin[2])));
+
440  bbox.expand(map.applyInverseMap(Vec3R(mMax[0], mMin[1], mMin[2])));
+
441  bbox.expand(map.applyInverseMap(Vec3R(mMax[0], mMax[1], mMin[2])));
+
442  bbox.expand(map.applyInverseMap(Vec3R(mMax[0], mMin[1], mMax[2])));
+
443  bbox.expand(map.applyInverseMap(Vec3R(mMin[0], mMax[1], mMax[2])));
+
444  bbox.expand(map.applyInverseMap(Vec3R(mMax[0], mMax[1], mMax[2])));
+
445  return bbox;
+
446 }
+
447 
+
449 
+
450 
+
451 template<typename Vec3T>
+
452 inline std::ostream&
+
453 operator<<(std::ostream& os, const BBox<Vec3T>& b)
+
454 {
+
455  os << b.min() << " -> " << b.max();
+
456  return os;
+
457 }
+
458 
+
459 } // namespace math
+
460 } // namespace OPENVDB_VERSION_NAME
+
461 } // namespace openvdb
+
462 
+
463 #endif // OPENVDB_MATH_BBOX_HAS_BEEN_INCLUDED
+
464 
+
465 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
466 // All rights reserved. This software is distributed under the
+
467 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
Vec3T & max()
Return a non-const reference to the maximum point of the BBox.
Definition: BBox.h:90
+ +
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
bool operator==(const BBox &rhs) const
Return true if the two BBox'es are identical.
Definition: BBox.h:248
+
ElementType volume() const
Return the volume spanned by this BBox.
Definition: BBox.h:123
+
bool isSorted() const
Return true if the all components of mMin <= mMax, i.e. the volume is not negative.
Definition: BBox.h:272
+
BBox()
Default constructor creates an invalid BBox.
Definition: BBox.h:180
+ +
BBox applyInverseMap(const MapType &map) const
Apply the inverse of a map to this bounding box.
+
Vec3T extents() const
Returns the extents of the BBox, i.e. the length per axis for floating points values or number of gri...
Definition: BBox.h:293
+
bool isInside(const Vec3T &xyz) const
Return true if point (x, y, z) is inside this bounding box.
Definition: BBox.h:307
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & max(const T &a, const T &b)
Definition: Composite.h:132
+
Axis-aligned bounding box.
Definition: BBox.h:47
+
const int size
Definition: MaskToLevelSet.h:119
+
void translate(const Vec3T &t)
Translate this bounding box by .
Definition: BBox.h:406
+
bool isApproxEqual(const Type &a, const Type &b)
Return true if a is equal to b to within the default floating-point comparison tolerance.
Definition: Math.h:370
+
void write(std::ostream &os) const
Serialize this bounding box to the given stream.
Definition: BBox.h:168
+
Vec3T ValueType
Definition: BBox.h:51
+
static T value()
Definition: Math.h:125
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
Vec3< double > Vec3d
Definition: Vec3.h:651
+
Vec3Type::ValueType ElementType
Definition: BBox.h:53
+
double ValueType
Definition: Vec3.h:51
+
bool hasOverlap(const BBox &) const
Return true if the given bounding box overlaps with this bounding box.
Definition: BBox.h:341
+
Vec3d getCenter() const
Return the center point of the BBox.
Definition: BBox.h:285
+
size_t minExtent() const
Return the index (0, 1 or 2) of the shortest axis.
Definition: BBox.h:129
+
void sort()
Sort the min/max by x,y,z component.
Definition: BBox.h:260
+
void expand(ElementType padding)
Pad this bounding box.
Definition: BBox.h:361
+
size_t maxExtent() const
Return the index (0, 1 or 2) of the longest axis.
Definition: BBox.h:126
+
bool hasVolume() const
Return true if the BBox has a (positive) volume.
Definition: BBox.h:103
+
Definition: Exceptions.h:39
+
BBox applyMap(const MapType &map) const
Apply a map to this bounding box.
+
bool operator!=(const BBox &rhs) const
Return true if the two BBox'es are not identical.
Definition: BBox.h:96
+
bool operator==(const Vec3< T0 > &v0, const Vec3< T1 > &v1)
Equality operator, does exact floating point comparisons.
Definition: Vec3.h:450
+
size_t MaxIndex(const Vec3T &v)
Return the index [0,1,2] of the largest value in a 3D vector.
Definition: Math.h:893
+
void read(std::istream &is)
Unserialize this bounding box from the given stream.
Definition: BBox.h:165
+
math::Vec3< Real > Vec3R
Definition: Types.h:76
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
Vec3T & min()
Return a non-const reference to the minimum point of the BBox.
Definition: BBox.h:87
+
Vec3T Vec3Type
Definition: BBox.h:50
+
Vec3T VectorType
Definition: BBox.h:52
+
bool empty() const
Return true if the BBox is empty, i.e. has no (positive) volume.
Definition: BBox.h:236
+
const Vec3T & min() const
Return a const reference to the minimum point of the BBox.
Definition: BBox.h:81
+
size_t MinIndex(const Vec3T &v)
Return the index [0,1,2] of the smallest value in a 3D vector.
Definition: Math.h:872
+
const Vec3T & max() const
Return a const reference to the maximum point of the BBox.
Definition: BBox.h:84
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & min(const T &a, const T &b)
Definition: Composite.h:128
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/ChangeBackground_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/ChangeBackground_8h_source.html new file mode 100644 index 00000000..9a2a2731 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/ChangeBackground_8h_source.html @@ -0,0 +1,356 @@ + + + + + + +OpenVDB: ChangeBackground.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ChangeBackground.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
37 
+
38 #ifndef OPENVDB_TOOLS_ChangeBACKGROUND_HAS_BEEN_INCLUDED
+
39 #define OPENVDB_TOOLS_ChangeBACKGROUND_HAS_BEEN_INCLUDED
+
40 
+
41 #include <openvdb/math/Math.h> // for isNegative and negative
+
42 #include <openvdb/Types.h> // for Index typedef
+ +
44 
+
45 
+
46 namespace openvdb {
+ +
48 namespace OPENVDB_VERSION_NAME {
+
49 namespace tools {
+
50 
+
62 template<typename TreeOrLeafManagerT>
+
63 inline void
+ +
65  TreeOrLeafManagerT& tree,
+
66  const typename TreeOrLeafManagerT::ValueType& background,
+
67  bool threaded = true,
+
68  size_t grainSize = 32);
+
69 
+
70 
+
88 template<typename TreeOrLeafManagerT>
+
89 inline void
+ +
91  TreeOrLeafManagerT& tree,
+
92  const typename TreeOrLeafManagerT::ValueType& halfWidth,
+
93  bool threaded = true,
+
94  size_t grainSize = 32);
+
95 
+
96 
+
116 template<typename TreeOrLeafManagerT>
+
117 inline void
+ +
119  TreeOrLeafManagerT& tree,
+
120  const typename TreeOrLeafManagerT::ValueType& outsideWidth,
+
121  const typename TreeOrLeafManagerT::ValueType& insideWidth,
+
122  bool threaded = true,
+
123  size_t grainSize = 32);
+
124 
+
125 
+
127 
+
128 
+
129 // Replaces the background value in a Tree of any type.
+
130 template<typename TreeOrLeafManagerT>
+ +
132 {
+
133 public:
+
134  typedef typename TreeOrLeafManagerT::ValueType ValueT;
+
135  typedef typename TreeOrLeafManagerT::RootNodeType RootT;
+
136  typedef typename TreeOrLeafManagerT::LeafNodeType LeafT;
+
137 
+
138 
+
139  ChangeBackgroundOp(const TreeOrLeafManagerT& tree, const ValueT& newValue)
+
140  : mOldValue(tree.root().background())
+
141  , mNewValue(newValue)
+
142  {
+
143  }
+
144  void operator()(RootT& root) const
+
145  {
+
146  for (typename RootT::ValueOffIter it = root.beginValueOff(); it; ++it) this->set(it);
+
147  root.setBackground(mNewValue, false);
+
148  }
+
149  void operator()(LeafT& node) const
+
150  {
+
151  for (typename LeafT::ValueOffIter it = node.beginValueOff(); it; ++it) this->set(it);
+
152  }
+
153  template<typename NodeT>
+
154  void operator()(NodeT& node) const
+
155  {
+
156  typename NodeT::NodeMaskType mask = node.getValueOffMask();
+
157  for (typename NodeT::ValueOnIter it(mask.beginOn(), &node); it; ++it) this->set(it);
+
158  }
+
159 private:
+
160 
+
161  template<typename IterT>
+
162  inline void set(IterT& iter) const
+
163  {
+
164  if (math::isApproxEqual(*iter, mOldValue)) {
+
165  iter.setValue(mNewValue);
+
166  } else if (math::isApproxEqual(*iter, math::negative(mOldValue))) {
+
167  iter.setValue(math::negative(mNewValue));
+
168  }
+
169  }
+
170  const ValueT mOldValue, mNewValue;
+
171 };// ChangeBackgroundOp
+
172 
+
173 
+
174 // Replaces the background value in a Tree assumed to represent a
+
175 // level set. It is generally faster than ChangeBackgroundOp.
+
176 // Note that is follows the sign-convention that outside is positive
+
177 // and inside is negative!
+
178 template<typename TreeOrLeafManagerT>
+ +
180 {
+
181 public:
+
182  typedef typename TreeOrLeafManagerT::ValueType ValueT;
+
183  typedef typename TreeOrLeafManagerT::RootNodeType RootT;
+
184  typedef typename TreeOrLeafManagerT::LeafNodeType LeafT;
+
185 
+
187  ChangeLevelSetBackgroundOp(const ValueT& outside, const ValueT& inside)
+
188  : mOutside(outside)
+
189  , mInside(inside)
+
190  {
+
191  if (math::isNegative(mOutside)) {
+ +
193  "ChangeLevelSetBackgroundOp: the outside value cannot be negative!");
+
194  }
+
195  if (!math::isNegative(mInside)) {
+ +
197  "ChangeLevelSetBackgroundOp: the inside value must be negative!");
+
198  }
+
199  }
+
200  void operator()(RootT& root) const
+
201  {
+
202  for (typename RootT::ValueOffIter it = root.beginValueOff(); it; ++it) this->set(it);
+
203  root.setBackground(mOutside, false);
+
204  }
+
205  void operator()(LeafT& node) const
+
206  {
+
207  for(typename LeafT::ValueOffIter it = node.beginValueOff(); it; ++it) this->set(it);
+
208  }
+
209  template<typename NodeT>
+
210  void operator()(NodeT& node) const
+
211  {
+
212  typedef typename NodeT::ValueOffIter IterT;
+
213  for (IterT it(node.getChildMask().beginOff(), &node); it; ++it) this->set(it);
+
214  }
+
215 private:
+
216 
+
217  template<typename IterT>
+
218  inline void set(IterT& iter) const
+
219  {
+
220  //this is safe since we know ValueType is_floating_point
+
221  ValueT& v = const_cast<ValueT&>(*iter);
+
222  v = v < 0 ? mInside : mOutside;
+
223  }
+
224  const ValueT mOutside, mInside;
+
225 };// ChangeLevelSetBackgroundOp
+
226 
+
227 
+
228 template<typename TreeOrLeafManagerT>
+
229 inline void
+ +
231  TreeOrLeafManagerT& tree,
+
232  const typename TreeOrLeafManagerT::ValueType& background,
+
233  bool threaded,
+
234  size_t grainSize)
+
235 {
+
236  tree::NodeManager<TreeOrLeafManagerT> linearTree(tree);
+
237  ChangeBackgroundOp<TreeOrLeafManagerT> op(tree, background);
+
238  linearTree.foreachTopDown(op, threaded, grainSize);
+
239 }
+
240 
+
241 
+
242 template<typename TreeOrLeafManagerT>
+
243 inline void
+ +
245  TreeOrLeafManagerT& tree,
+
246  const typename TreeOrLeafManagerT::ValueType& outsideValue,
+
247  const typename TreeOrLeafManagerT::ValueType& insideValue,
+
248  bool threaded,
+
249  size_t grainSize)
+
250 {
+
251  tree::NodeManager<TreeOrLeafManagerT> linearTree(tree);
+
252  ChangeLevelSetBackgroundOp<TreeOrLeafManagerT> op(outsideValue, insideValue);
+
253  linearTree.foreachTopDown(op, threaded, grainSize);
+
254 }
+
255 
+
256 
+
257 // If the narrow-band is symmetric only one background value is required
+
258 template<typename TreeOrLeafManagerT>
+
259 inline void
+ +
261  TreeOrLeafManagerT& tree,
+
262  const typename TreeOrLeafManagerT::ValueType& background,
+
263  bool threaded,
+
264  size_t grainSize)
+
265 {
+ +
267  tree, background, math::negative(background), threaded, grainSize);
+
268 }
+
269 
+
270 } // namespace tools
+
271 } // namespace OPENVDB_VERSION_NAME
+
272 } // namespace openvdb
+
273 
+
274 #endif // OPENVDB_TOOLS_CHANGEBACKGROUND_HAS_BEEN_INCLUDED
+
275 
+
276 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
277 // All rights reserved. This software is distributed under the
+
278 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
void changeAsymmetricLevelSetBackground(TreeOrLeafManagerT &tree, const typename TreeOrLeafManagerT::ValueType &outsideWidth, const typename TreeOrLeafManagerT::ValueType &insideWidth, bool threaded=true, size_t grainSize=32)
Replace the background values in all the nodes of a floating-point tree containing a possibly asymmet...
Definition: ChangeBackground.h:244
+ +
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
void operator()(LeafT &node) const
Definition: ChangeBackground.h:205
+
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
+
NodeManager produces linear arrays of all tree nodes allowing for efficient threading and bottom-up p...
+
void operator()(NodeT &node) const
Definition: ChangeBackground.h:154
+
Definition: ChangeBackground.h:131
+
void changeLevelSetBackground(TreeOrLeafManagerT &tree, const typename TreeOrLeafManagerT::ValueType &halfWidth, bool threaded=true, size_t grainSize=32)
Replace the background value in all the nodes of a floating-point tree containing a symmetric narrow-...
Definition: ChangeBackground.h:260
+
TreeOrLeafManagerT::RootNodeType RootT
Definition: ChangeBackground.h:135
+
void foreachTopDown(const NodeOp &op, bool threaded=true, size_t grainSize=1)
Threaded method that applies a user-supplied functor to all the nodes in the tree.
Definition: NodeManager.h:500
+
void changeBackground(TreeOrLeafManagerT &tree, const typename TreeOrLeafManagerT::ValueType &background, bool threaded=true, size_t grainSize=32)
Replace the background value in all the nodes of a tree.
Definition: ChangeBackground.h:230
+
ChangeBackgroundOp(const TreeOrLeafManagerT &tree, const ValueT &newValue)
Definition: ChangeBackground.h:139
+
bool isApproxEqual(const Type &a, const Type &b)
Return true if a is equal to b to within the default floating-point comparison tolerance.
Definition: Math.h:370
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
TreeOrLeafManagerT::ValueType ValueT
Definition: ChangeBackground.h:134
+
void operator()(LeafT &node) const
Definition: ChangeBackground.h:149
+
TreeOrLeafManagerT::RootNodeType RootT
Definition: ChangeBackground.h:183
+
Definition: Exceptions.h:39
+
TreeOrLeafManagerT::ValueType ValueT
Definition: ChangeBackground.h:182
+
void operator()(RootT &root) const
Definition: ChangeBackground.h:200
+
TreeOrLeafManagerT::LeafNodeType LeafT
Definition: ChangeBackground.h:136
+
TreeOrLeafManagerT::LeafNodeType LeafT
Definition: ChangeBackground.h:184
+
void operator()(NodeT &node) const
Definition: ChangeBackground.h:210
+
To facilitate threading over the nodes of a tree, cache node pointers in linear arrays, one for each level of the tree.
Definition: NodeManager.h:57
+
Definition: ChangeBackground.h:179
+
Definition: Exceptions.h:88
+
bool isNegative(const Type &x)
Return true if x is less than zero.
Definition: Math.h:354
+
ChangeLevelSetBackgroundOp(const ValueT &outside, const ValueT &inside)
Constructor for asymmetric narrow-bands.
Definition: ChangeBackground.h:187
+
T negative(const T &val)
Return the unary negation of the given value.
Definition: Math.h:116
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
TreeT * tree
Definition: MaskToLevelSet.h:118
+
void operator()(RootT &root) const
Definition: ChangeBackground.h:144
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/Clip_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/Clip_8h_source.html new file mode 100644 index 00000000..2e96762b --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/Clip_8h_source.html @@ -0,0 +1,549 @@ + + + + + + +OpenVDB: Clip.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Clip.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
35 
+
36 #ifndef OPENVDB_TOOLS_CLIP_HAS_BEEN_INCLUDED
+
37 #define OPENVDB_TOOLS_CLIP_HAS_BEEN_INCLUDED
+
38 
+
39 #include <openvdb/Types.h>// for ValueMask
+
40 #include <openvdb/Grid.h>
+
41 #include <openvdb/math/Math.h>// for isNegative
+ +
43 #include "GridTransformer.h" // for resampleToMatch()
+
44 #include <boost/type_traits/is_same.hpp>
+
45 #include <boost/type_traits/is_signed.hpp>
+
46 #include <boost/utility/enable_if.hpp>
+
47 #include <tbb/blocked_range.h>
+
48 #include <tbb/parallel_reduce.h>
+
49 #include "Prune.h"
+
50 
+
51 
+
52 namespace openvdb {
+ +
54 namespace OPENVDB_VERSION_NAME {
+
55 namespace tools {
+
56 
+
61 template<typename GridType> OPENVDB_STATIC_SPECIALIZATION
+
62 inline typename GridType::Ptr clip(const GridType& grid, const BBoxd&);
+
63 
+
74 template<typename GridType, typename MaskTreeType> OPENVDB_STATIC_SPECIALIZATION
+
75 inline typename GridType::Ptr clip(const GridType& grid, const Grid<MaskTreeType>& mask);
+
76 
+
77 
+
79 
+
80 
+
81 namespace clip_internal {
+
82 
+
83 
+
85 
+
86 
+
87 template<typename TreeT>
+ +
89 {
+
90 public:
+
91  typedef typename TreeT::ValueType ValueT;
+
92  typedef typename TreeT::LeafNodeType LeafNodeT;
+
93 
+
94  MaskInteriorVoxels(const TreeT& tree): mAcc(tree) {}
+
95 
+
96  template <typename LeafNodeType>
+
97  void operator()(LeafNodeType &leaf, size_t /*leafIndex*/) const
+
98  {
+
99  const LeafNodeT *refLeaf = mAcc.probeConstLeaf(leaf.origin());
+
100  if (refLeaf) {
+
101  typename LeafNodeType::ValueOffIter iter = leaf.beginValueOff();
+
102  for ( ; iter; ++iter) {
+
103  const Index pos = iter.pos();
+
104  leaf.setActiveState(pos, math::isNegative(refLeaf->getValue(pos)));
+
105  }
+
106  }
+
107  }
+
108 
+
109 private:
+ +
111 };
+
112 
+
113 
+
115 
+
116 
+
117 template<typename TreeT>
+ +
119 {
+
120 public:
+
121  typedef typename TreeT::template ValueConverter<ValueMask>::Type MaskTreeT;
+ +
123 
+
124  CopyLeafNodes(const TreeT& tree, const MaskLeafManagerT& leafNodes);
+
125 
+
126  void run(bool threaded = true);
+
127 
+
128  typename TreeT::Ptr tree() const { return mNewTree; }
+
129 
+
130  CopyLeafNodes(CopyLeafNodes&, tbb::split);
+
131  void operator()(const tbb::blocked_range<size_t>&);
+
132  void join(const CopyLeafNodes& rhs) { mNewTree->merge(*rhs.mNewTree); }
+
133 
+
134 private:
+
135  const MaskTreeT* mClipMask;
+
136  const TreeT* mTree;
+
137  const MaskLeafManagerT* mLeafNodes;
+
138  typename TreeT::Ptr mNewTree;
+
139 };
+
140 
+
141 
+
142 template<typename TreeT>
+ +
144  : mTree(&tree)
+
145  , mLeafNodes(&leafNodes)
+
146  , mNewTree(new TreeT(mTree->background()))
+
147 {
+
148 }
+
149 
+
150 
+
151 template<typename TreeT>
+ +
153  : mTree(rhs.mTree)
+
154  , mLeafNodes(rhs.mLeafNodes)
+
155  , mNewTree(new TreeT(mTree->background()))
+
156 {
+
157 }
+
158 
+
159 
+
160 template<typename TreeT>
+
161 void
+ +
163 {
+
164  if (threaded) tbb::parallel_reduce(mLeafNodes->getRange(), *this);
+
165  else (*this)(mLeafNodes->getRange());
+
166 }
+
167 
+
168 
+
169 template<typename TreeT>
+
170 void
+
171 CopyLeafNodes<TreeT>::operator()(const tbb::blocked_range<size_t>& range)
+
172 {
+
173  typedef typename TreeT::LeafNodeType LeafT;
+
174  typedef typename MaskTree::LeafNodeType MaskLeafT;
+
175  typename MaskLeafT::ValueOnCIter it;
+
176 
+
177  tree::ValueAccessor<TreeT> acc(*mNewTree);
+
178  tree::ValueAccessor<const TreeT> refAcc(*mTree);
+
179 
+
180  for (size_t n = range.begin(); n != range.end(); ++n) {
+
181  const MaskLeafT& maskLeaf = mLeafNodes->leaf(n);
+
182  const Coord& ijk = maskLeaf.origin();
+
183  const LeafT* refLeaf = refAcc.probeConstLeaf(ijk);
+
184 
+
185  LeafT* newLeaf = acc.touchLeaf(ijk);
+
186 
+
187  if (refLeaf) {
+
188  for (it = maskLeaf.cbeginValueOn(); it; ++it) {
+
189  const Index pos = it.pos();
+
190  newLeaf->setValueOnly(pos, refLeaf->getValue(pos));
+
191  newLeaf->setActiveState(pos, refLeaf->isValueOn(pos));
+
192  }
+
193  } else {
+
194  typename TreeT::ValueType value;
+
195  bool isActive = refAcc.probeValue(ijk, value);
+
196 
+
197  for (it = maskLeaf.cbeginValueOn(); it; ++it) {
+
198  const Index pos = it.pos();
+
199  newLeaf->setValueOnly(pos, value);
+
200  newLeaf->setActiveState(pos, isActive);
+
201  }
+
202  }
+
203  }
+
204 }
+
205 
+
206 
+
208 
+
209 
+ +
211 {
+
212  static const char* name() { return "bin"; }
+
213  static int radius() { return 2; }
+
214  static bool mipmap() { return false; }
+
215  static bool consistent() { return true; }
+
216 
+
217  template<class TreeT>
+
218  static bool sample(const TreeT& inTree,
+
219  const Vec3R& inCoord, typename TreeT::ValueType& result)
+
220  {
+
221  Coord ijk;
+
222  ijk[0] = int(std::floor(inCoord[0]));
+
223  ijk[1] = int(std::floor(inCoord[1]));
+
224  ijk[2] = int(std::floor(inCoord[2]));
+
225  return inTree.probeValue(ijk, result);
+
226  }
+
227 };
+
228 
+
229 
+
231 
+
232 
+
233 // Convert a grid of one type to a grid of another type
+
234 template<typename FromGridT, typename ToGridT>
+ +
236 {
+
237  typedef typename FromGridT::Ptr FromGridPtrT;
+
238  typedef typename ToGridT::Ptr ToGridPtrT;
+
239  ToGridPtrT operator()(const FromGridPtrT& grid) { return ToGridPtrT(new ToGridT(*grid)); }
+
240 };
+
241 
+
242 // Partial specialization that avoids copying when
+
243 // the input and output grid types are the same
+
244 template<typename GridT>
+
245 struct ConvertGrid<GridT, GridT>
+
246 {
+
247  typedef typename GridT::Ptr GridPtrT;
+
248  GridPtrT operator()(const GridPtrT& grid) { return grid; }
+
249 };
+
250 
+
251 
+
253 
+
254 
+
255 // Convert a grid of arbitrary type to a mask grid and return a pointer to the new grid.
+
256 template<typename GridT>
+
257 inline typename boost::disable_if<boost::is_same<ValueMask, typename GridT::BuildType>,
+
258  typename GridT::template ValueConverter<ValueMask>::Type::Ptr>::type
+
259 convertToMaskGrid(const GridT& grid)
+
260 {
+
261  typedef typename GridT::template ValueConverter<ValueMask>::Type MaskGridT;
+
262  typedef typename MaskGridT::Ptr MaskGridPtrT;
+
263 
+
264  // Convert the input grid to a boolean mask grid (with the same tree configuration).
+
265  MaskGridPtrT mask = MaskGridT::create(/*background=*/false);
+
266  mask->topologyUnion(grid);
+
267  mask->setTransform(grid.constTransform().copy());
+
268  return mask;
+
269 }
+
270 
+
271 // Overload that avoids any processing if the input grid is already a mask grid
+
272 template<typename GridT>
+
273 inline typename boost::enable_if<boost::is_same<ValueMask, typename GridT::BuildType>,
+
274  typename GridT::Ptr>::type
+
275 convertToMaskGrid(const GridT& grid)
+
276 {
+
277  return grid.copy(); // shallow copy
+
278 }
+
279 
+
280 
+
282 
+
283 
+
284 template<typename GridType>
+
285 inline typename GridType::Ptr
+
286 doClip(const GridType& grid, const typename GridType::template ValueConverter<ValueMask>::Type& aMask)
+
287 {
+
288  typedef typename GridType::TreeType TreeT;
+
289  typedef typename GridType::TreeType::template ValueConverter<ValueMask>::Type MaskTreeT;
+
290 
+
291  const GridClass gridClass = grid.getGridClass();
+
292  const TreeT& tree = grid.tree();
+
293 
+
294  MaskTreeT mask(false);
+
295  mask.topologyUnion(tree);
+
296 
+
297  if (gridClass == GRID_LEVEL_SET) {
+
298  tree::LeafManager<MaskTreeT> leafNodes(mask);
+
299  leafNodes.foreach(MaskInteriorVoxels<TreeT>(tree));
+
300 
+ +
302 
+
303  typename MaskTreeT::ValueAllIter iter(mask);
+
304  iter.setMaxDepth(MaskTreeT::ValueAllIter::LEAF_DEPTH - 1);
+
305 
+
306  for ( ; iter; ++iter) {
+
307  iter.setActiveState(math::isNegative(acc.getValue(iter.getCoord())));
+
308  }
+
309  }
+
310 
+
311  mask.topologyIntersection(aMask.constTree());
+
312 
+
313  typename GridType::Ptr outGrid;
+
314  {
+
315  // Copy voxel values and states.
+
316  tree::LeafManager<const MaskTreeT> leafNodes(mask);
+
317  CopyLeafNodes<TreeT> maskOp(tree, leafNodes);
+
318  maskOp.run();
+
319  outGrid = GridType::create(maskOp.tree());
+
320  }
+
321  {
+
322  // Copy tile values and states.
+ + +
325 
+
326  typename TreeT::ValueAllIter it(outGrid->tree());
+
327  it.setMaxDepth(TreeT::ValueAllIter::LEAF_DEPTH - 1);
+
328  for ( ; it; ++it) {
+
329  Coord ijk = it.getCoord();
+
330 
+
331  if (maskAcc.isValueOn(ijk)) {
+
332  typename TreeT::ValueType value;
+
333  bool isActive = refAcc.probeValue(ijk, value);
+
334 
+
335  it.setValue(value);
+
336  if (!isActive) it.setValueOff();
+
337  }
+
338  }
+
339  }
+
340 
+
341  outGrid->setTransform(grid.transform().copy());
+
342  if (gridClass != GRID_LEVEL_SET) outGrid->setGridClass(gridClass);
+
343 
+
344  return outGrid;
+
345 }
+
346 
+
347 } // namespace clip_internal
+
348 
+
349 
+
351 
+
352 
+
353 template<typename GridType>
+ +
355 inline typename GridType::Ptr
+
356 clip(const GridType& grid, const BBoxd& bbox)
+
357 {
+
358  typedef typename GridType::template ValueConverter<ValueMask>::Type MaskGridT;
+
359 
+
360  // Transform the world-space bounding box into the source grid's index space.
+
361  Vec3d idxMin, idxMax;
+
362  math::calculateBounds(grid.constTransform(), bbox.min(), bbox.max(), idxMin, idxMax);
+
363  CoordBBox region(Coord::floor(idxMin), Coord::floor(idxMax));
+
364  // Construct a boolean mask grid that is true inside the index-space bounding box
+
365  // and false everywhere else.
+
366  MaskGridT clipMask(/*background=*/false);
+
367  clipMask.fill(region, /*value=*/true, /*active=*/true);
+
368 
+
369  return clip_internal::doClip(grid, clipMask);
+
370 }
+
371 
+
372 
+
373 template<typename GridType1, typename TreeType2>
+ +
375 inline typename GridType1::Ptr
+
376 clip(const GridType1& grid1, const Grid<TreeType2>& grid2)
+
377 {
+
378  typedef typename GridType1::template ValueConverter<ValueMask>::Type MaskGridT1;
+
379  typedef typename MaskGridT1::Ptr MaskGridPtrT1;
+
380 
+
381  typedef Grid<TreeType2> GridType2;
+
382  typedef typename GridType2::template ValueConverter<ValueMask>::Type MaskGridT2;
+
383  typedef typename MaskGridT2::Ptr MaskGridPtrT2;
+
384 
+
385  // Convert the mask grid to a boolean grid with the same tree configuration.
+
386  MaskGridPtrT2 maskGrid = clip_internal::convertToMaskGrid( grid2 );
+
387 
+
388  // Resample the boolean mask grid into the source grid's index space.
+
389  if (grid1.constTransform() != maskGrid->constTransform()) {
+
390  MaskGridPtrT2 resampledMask = MaskGridT2::create(/*background=*/false);
+
391  resampledMask->setTransform(grid1.constTransform().copy());
+
392  tools::resampleToMatch<clip_internal::BoolSampler>(*maskGrid, *resampledMask);
+
393  tools::prune(resampledMask->tree());
+
394  maskGrid = resampledMask;
+
395  }
+
396 
+
397  // Convert the bool mask grid to a bool grid of the same configuration as the source grid.
+
398  MaskGridPtrT1 clipMask =
+
399  clip_internal::ConvertGrid</*from=*/MaskGridT2, /*to=*/MaskGridT1>()( maskGrid );
+
400 
+
401  // Clip the source grid against the boolean mask grid.
+
402  return clip_internal::doClip(grid1, *clipMask);
+
403 }
+
404 
+
405 } // namespace tools
+
406 } // namespace OPENVDB_VERSION_NAME
+
407 } // namespace openvdb
+
408 
+
409 #endif // OPENVDB_TOOLS_CLIP_HAS_BEEN_INCLUDED
+
410 
+
411 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
412 // All rights reserved. This software is distributed under the
+
413 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
static const char * name()
Definition: Clip.h:212
+
GridClass
Definition: Types.h:211
+ +
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
CopyLeafNodes(const TreeT &tree, const MaskLeafManagerT &leafNodes)
Definition: Clip.h:143
+
OPENVDB_API void calculateBounds(const Transform &t, const Vec3d &minWS, const Vec3d &maxWS, Vec3d &minIS, Vec3d &maxIS)
Calculate an axis-aligned bounding box in index space from an axis-aligned bounding box in world spac...
+
OPENVDB_STATIC_SPECIALIZATION GridType1::Ptr clip(const GridType1 &grid1, const Grid< TreeType2 > &grid2)
Definition: Clip.h:376
+
ToGridT::Ptr ToGridPtrT
Definition: Clip.h:238
+ +
math::BBox< Vec3d > BBoxd
Definition: Types.h:86
+
This class manages a linear array of pointers to a given tree's leaf nodes, as well as optional auxil...
Definition: LeafManager.h:115
+
TreeT::LeafNodeType LeafNodeT
Definition: Clip.h:92
+ + + + +
Defined various multi-threaded utility functions for trees.
+
const ValueType & getValue(const Coord &xyz) const
Return the value of the voxel at the given coordinates.
Definition: ValueAccessor.h:256
+
Index32 Index
Definition: Types.h:58
+
static bool sample(const TreeT &inTree, const Vec3R &inCoord, typename TreeT::ValueType &result)
Definition: Clip.h:218
+ +
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
void operator()(const tbb::blocked_range< size_t > &)
Definition: Clip.h:171
+
void operator()(LeafNodeType &leaf, size_t) const
Definition: Clip.h:97
+
Vec3< double > Vec3d
Definition: Vec3.h:651
+
OPENVDB_STATIC_SPECIALIZATION GridType::Ptr clip(const GridType &grid, const BBoxd &)
Clip the given grid against a world-space bounding box and return a new grid containing the result...
Definition: Clip.h:356
+
bool isValueOn(const Coord &xyz) const
Return the active state of the voxel at the given coordinates.
Definition: ValueAccessor.h:263
+
boost::disable_if< boost::is_same< ValueMask, typename GridT::BuildType >, typename GridT::template ValueConverter< ValueMask >::Type::Ptr >::type convertToMaskGrid(const GridT &grid)
Definition: Clip.h:259
+
ToGridPtrT operator()(const FromGridPtrT &grid)
Definition: Clip.h:239
+
static bool mipmap()
Definition: Clip.h:214
+ +
const LeafNodeT * probeConstLeaf(const Coord &xyz) const
Return a pointer to the leaf node that contains voxel (x, y, z), or NULL if no such node exists...
Definition: ValueAccessor.h:429
+ +
Definition: Exceptions.h:39
+
FromGridT::Ptr FromGridPtrT
Definition: Clip.h:237
+
TreeT::template ValueConverter< ValueMask >::Type MaskTreeT
Definition: Clip.h:121
+
void join(const CopyLeafNodes &rhs)
Definition: Clip.h:132
+
TreeT::Ptr tree() const
Definition: Clip.h:128
+
MaskInteriorVoxels(const TreeT &tree)
Definition: Clip.h:94
+
static bool consistent()
Definition: Clip.h:215
+
static int radius()
Definition: Clip.h:213
+
LeafNodeT * touchLeaf(const Coord &xyz)
Return a pointer to the leaf node that contains voxel (x, y, z). If no such node exists, create one, but preserve the values and active states of all voxels.
Definition: ValueAccessor.h:393
+
tree::LeafManager< const MaskTreeT > MaskLeafManagerT
Definition: Clip.h:122
+ +
#define OPENVDB_STATIC_SPECIALIZATION
Macro for determining if there are sufficient C++0x/C++11 features.
Definition: Platform.h:91
+
GridPtrT operator()(const GridPtrT &grid)
Definition: Clip.h:248
+ +
void prune(TreeT &tree, typename TreeT::ValueType tolerance=zeroVal< typename TreeT::ValueType >(), bool threaded=true, size_t grainSize=1)
Reduce the memory footprint of a tree by replacing with tiles any nodes whose values are all the same...
Definition: Prune.h:347
+
void run(bool threaded=true)
Definition: Clip.h:162
+
bool isNegative(const Type &x)
Return true if x is less than zero.
Definition: Math.h:354
+
Definition: Types.h:213
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
A LeafManager manages a linear array of pointers to a given tree's leaf nodes, as well as optional au...
+
RootNodeType::LeafNodeType LeafNodeType
Definition: Tree.h:212
+
bool probeValue(const Coord &xyz, ValueType &value) const
Return the active state of the voxel as well as its value.
Definition: ValueAccessor.h:266
+
TreeT::ValueType ValueT
Definition: Clip.h:91
+
TreeT * tree
Definition: MaskToLevelSet.h:118
+
const Vec3T & min() const
Return a const reference to the minimum point of the BBox.
Definition: BBox.h:81
+
void foreach(const LeafOp &op, bool threaded=true, size_t grainSize=1)
Threaded method that applies a user-supplied functor to each leaf node in the LeafManager.
Definition: LeafManager.h:515
+
GridType::Ptr doClip(const GridType &grid, const typename GridType::template ValueConverter< ValueMask >::Type &aMask)
Definition: Clip.h:286
+
Container class that associates a tree with a transform and metadata.
Definition: Grid.h:54
+
const Vec3T & max() const
Return a const reference to the maximum point of the BBox.
Definition: BBox.h:84
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/Composite_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/Composite_8h_source.html new file mode 100644 index 00000000..9a4b6e2f --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/Composite_8h_source.html @@ -0,0 +1,1267 @@ + + + + + + +OpenVDB: Composite.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Composite.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
36 
+
37 #ifndef OPENVDB_TOOLS_COMPOSITE_HAS_BEEN_INCLUDED
+
38 #define OPENVDB_TOOLS_COMPOSITE_HAS_BEEN_INCLUDED
+
39 
+
40 #include <openvdb/Platform.h>
+
41 #include <openvdb/Exceptions.h>
+
42 #include <openvdb/Types.h>
+
43 #include <openvdb/Grid.h>
+
44 #include <openvdb/math/Math.h> // for isExactlyEqual()
+
45 #include "ValueTransformer.h" // for transformValues()
+
46 #include "Prune.h"// for prune
+
47 #include "SignedFloodFill.h" // for signedFloodFill()
+
48 #include <boost/utility/enable_if.hpp>
+
49 
+
50 #include <tbb/blocked_range.h>
+
51 #include <tbb/parallel_for.h>
+
52 #include <tbb/parallel_reduce.h>
+
53 #include <tbb/task_group.h>
+
54 #include <tbb/task_scheduler_init.h>
+
55 
+
56 
+
57 namespace openvdb {
+ +
59 namespace OPENVDB_VERSION_NAME {
+
60 namespace tools {
+
61 
+
65 template<typename GridOrTreeT> OPENVDB_STATIC_SPECIALIZATION
+
66 inline void csgUnion(GridOrTreeT& a, GridOrTreeT& b, bool prune = true);
+
70 template<typename GridOrTreeT> OPENVDB_STATIC_SPECIALIZATION
+
71 inline void csgIntersection(GridOrTreeT& a, GridOrTreeT& b, bool prune = true);
+
75 template<typename GridOrTreeT> OPENVDB_STATIC_SPECIALIZATION
+
76 inline void csgDifference(GridOrTreeT& a, GridOrTreeT& b, bool prune = true);
+
77 
+
81 template<typename GridOrTreeT> OPENVDB_STATIC_SPECIALIZATION
+
82 inline typename GridOrTreeT::Ptr csgUnionCopy(const GridOrTreeT& a, const GridOrTreeT& b);
+
86 template<typename GridOrTreeT> OPENVDB_STATIC_SPECIALIZATION
+
87 inline typename GridOrTreeT::Ptr csgIntersectionCopy(const GridOrTreeT& a, const GridOrTreeT& b);
+
91 template<typename GridOrTreeT> OPENVDB_STATIC_SPECIALIZATION
+
92 inline typename GridOrTreeT::Ptr csgDifferenceCopy(const GridOrTreeT& a, const GridOrTreeT& b);
+
93 
+
96 template<typename GridOrTreeT> OPENVDB_STATIC_SPECIALIZATION
+
97 inline void compMax(GridOrTreeT& a, GridOrTreeT& b);
+
100 template<typename GridOrTreeT> OPENVDB_STATIC_SPECIALIZATION
+
101 inline void compMin(GridOrTreeT& a, GridOrTreeT& b);
+
104 template<typename GridOrTreeT> OPENVDB_STATIC_SPECIALIZATION
+
105 inline void compSum(GridOrTreeT& a, GridOrTreeT& b);
+
108 template<typename GridOrTreeT> OPENVDB_STATIC_SPECIALIZATION
+
109 inline void compMul(GridOrTreeT& a, GridOrTreeT& b);
+
112 template<typename GridOrTreeT> OPENVDB_STATIC_SPECIALIZATION
+
113 inline void compDiv(GridOrTreeT& a, GridOrTreeT& b);
+
114 
+
116 template<typename GridOrTreeT> OPENVDB_STATIC_SPECIALIZATION
+
117 inline void compReplace(GridOrTreeT& a, const GridOrTreeT& b);
+
118 
+
119 
+
121 
+
122 
+
123 namespace composite {
+
124 
+
125 // composite::min() and composite::max() for non-vector types compare with operator<().
+
126 template<typename T> inline
+
127 const typename boost::disable_if_c<VecTraits<T>::IsVec, T>::type& // = T if T is not a vector type
+
128 min(const T& a, const T& b) { return std::min(a, b); }
+
129 
+
130 template<typename T> inline
+
131 const typename boost::disable_if_c<VecTraits<T>::IsVec, T>::type&
+
132 max(const T& a, const T& b) { return std::max(a, b); }
+
133 
+
134 
+
135 // composite::min() and composite::max() for OpenVDB vector types compare by magnitude.
+
136 template<typename T> inline
+
137 const typename boost::enable_if_c<VecTraits<T>::IsVec, T>::type& // = T if T is a vector type
+
138 min(const T& a, const T& b)
+
139 {
+
140  const typename T::ValueType aMag = a.lengthSqr(), bMag = b.lengthSqr();
+
141  return (aMag < bMag ? a : (bMag < aMag ? b : std::min(a, b)));
+
142 }
+
143 
+
144 template<typename T> inline
+
145 const typename boost::enable_if_c<VecTraits<T>::IsVec, T>::type&
+
146 max(const T& a, const T& b)
+
147 {
+
148  const typename T::ValueType aMag = a.lengthSqr(), bMag = b.lengthSqr();
+
149  return (aMag < bMag ? b : (bMag < aMag ? a : std::max(a, b)));
+
150 }
+
151 
+
152 
+
153 template<typename T> inline
+
154 typename boost::disable_if<boost::is_integral<T>, T>::type // = T if T is not an integer type
+
155 divide(const T& a, const T& b) { return a / b; }
+
156 
+
157 template<typename T> inline
+
158 typename boost::enable_if<boost::is_integral<T>, T>::type // = T if T is an integer type
+
159 divide(const T& a, const T& b)
+
160 {
+
161  const T zero(0);
+
162  if (b != zero) return a / b;
+
163  if (a == zero) return 0;
+ +
165 }
+
166 
+
167 // If b is true, return a / 1 = a.
+
168 // If b is false and a is true, return 1 / 0 = inf = MAX_BOOL = 1 = a.
+
169 // If b is false and a is false, return 0 / 0 = NaN = 0 = a.
+
170 inline bool divide(bool a, bool /*b*/) { return a; }
+
171 
+
172 
+ +
174 
+
175 template<typename TreeType, CSGOperation Operation>
+ +
177 {
+
178  typedef typename TreeType::ValueType ValueType;
+
179  typedef typename TreeType::Ptr TreePtrType;
+
180  typedef typename TreeType::LeafNodeType LeafNodeType;
+
181  typedef typename LeafNodeType::NodeMaskType NodeMaskType;
+
182  typedef typename TreeType::RootNodeType RootNodeType;
+
183  typedef typename RootNodeType::NodeChainType NodeChainType;
+
184  typedef typename boost::mpl::at<NodeChainType, boost::mpl::int_<1> >::type InternalNodeType;
+
185 
+
186  BuildPrimarySegment(const TreeType& lhs, const TreeType& rhs)
+
187  : mSegment(new TreeType(lhs.background()))
+
188  , mLhsTree(&lhs)
+
189  , mRhsTree(&rhs)
+
190  {
+
191  }
+
192 
+
193  void operator()() const
+
194  {
+
195  std::vector<const LeafNodeType*> leafNodes;
+
196 
+
197  {
+
198  std::vector<const InternalNodeType*> internalNodes;
+
199  mLhsTree->getNodes(internalNodes);
+
200 
+
201  ProcessInternalNodes op(internalNodes, *mRhsTree, *mSegment, leafNodes);
+
202  tbb::parallel_reduce(tbb::blocked_range<size_t>(0, internalNodes.size()), op);
+
203  }
+
204 
+
205  ProcessLeafNodes op(leafNodes, *mRhsTree, *mSegment);
+
206  tbb::parallel_reduce(tbb::blocked_range<size_t>(0, leafNodes.size()), op);
+
207  }
+
208 
+
209  TreePtrType& segment() { return mSegment; }
+
210 
+
211 private:
+
212 
+
213  struct ProcessInternalNodes {
+
214 
+
215  ProcessInternalNodes(std::vector<const InternalNodeType*>& lhsNodes, const TreeType& rhsTree,
+
216  TreeType& outputTree, std::vector<const LeafNodeType*>& outputLeafNodes)
+
217  : mLhsNodes(lhsNodes.empty() ? NULL : &lhsNodes.front())
+
218  , mRhsTree(&rhsTree)
+
219  , mLocalTree(mRhsTree->background())
+
220  , mOutputTree(&outputTree)
+
221  , mLocalLeafNodes()
+
222  , mOutputLeafNodes(&outputLeafNodes)
+
223  {
+
224  }
+
225 
+
226  ProcessInternalNodes(ProcessInternalNodes& other, tbb::split)
+
227  : mLhsNodes(other.mLhsNodes)
+
228  , mRhsTree(other.mRhsTree)
+
229  , mLocalTree(mRhsTree->background())
+
230  , mOutputTree(&mLocalTree)
+
231  , mLocalLeafNodes()
+
232  , mOutputLeafNodes(&mLocalLeafNodes)
+
233  {
+
234  }
+
235 
+
236  void join(ProcessInternalNodes& other)
+
237  {
+
238  mOutputTree->merge(*other.mOutputTree);
+
239  mOutputLeafNodes->insert(mOutputLeafNodes->end(),
+
240  other.mOutputLeafNodes->begin(), other.mOutputLeafNodes->end());
+
241  }
+
242 
+
243  void operator()(const tbb::blocked_range<size_t>& range)
+
244  {
+
245  tree::ValueAccessor<const TreeType> rhsAcc(*mRhsTree);
+
246  tree::ValueAccessor<TreeType> outputAcc(*mOutputTree);
+
247 
+
248  std::vector<const LeafNodeType*> tmpLeafNodes;
+
249 
+
250  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
251 
+
252  const InternalNodeType& lhsNode = *mLhsNodes[n];
+
253  const Coord& ijk = lhsNode.origin();
+
254  const InternalNodeType * rhsNode = rhsAcc.template probeConstNode<InternalNodeType>(ijk);
+
255 
+
256  if (rhsNode) {
+
257  lhsNode.getNodes(*mOutputLeafNodes);
+
258  } else {
+
259  if (Operation == CSG_INTERSECTION) {
+
260  if (rhsAcc.getValue(ijk) < ValueType(0.0)) {
+
261  tmpLeafNodes.clear();
+
262  lhsNode.getNodes(tmpLeafNodes);
+
263  for (size_t i = 0, I = tmpLeafNodes.size(); i < I; ++i) {
+
264  outputAcc.addLeaf(new LeafNodeType(*tmpLeafNodes[i]));
+
265  }
+
266  }
+
267  } else { // Union & Difference
+
268  if (!(rhsAcc.getValue(ijk) < ValueType(0.0))) {
+
269  tmpLeafNodes.clear();
+
270  lhsNode.getNodes(tmpLeafNodes);
+
271  for (size_t i = 0, I = tmpLeafNodes.size(); i < I; ++i) {
+
272  outputAcc.addLeaf(new LeafNodeType(*tmpLeafNodes[i]));
+
273  }
+
274  }
+
275  }
+
276  }
+
277  } // end range loop
+
278  }
+
279 
+
280  InternalNodeType const * const * const mLhsNodes;
+
281  TreeType const * const mRhsTree;
+
282  TreeType mLocalTree;
+
283  TreeType * const mOutputTree;
+
284 
+
285  std::vector<const LeafNodeType*> mLocalLeafNodes;
+
286  std::vector<const LeafNodeType*> * const mOutputLeafNodes;
+
287  }; // struct ProcessInternalNodes
+
288 
+
289  struct ProcessLeafNodes {
+
290 
+
291  ProcessLeafNodes(std::vector<const LeafNodeType*>& lhsNodes, const TreeType& rhsTree, TreeType& output)
+
292  : mLhsNodes(lhsNodes.empty() ? NULL : &lhsNodes.front())
+
293  , mRhsTree(&rhsTree)
+
294  , mLocalTree(mRhsTree->background())
+
295  , mOutputTree(&output)
+
296  {
+
297  }
+
298 
+
299  ProcessLeafNodes(ProcessLeafNodes& other, tbb::split)
+
300  : mLhsNodes(other.mLhsNodes)
+
301  , mRhsTree(other.mRhsTree)
+
302  , mLocalTree(mRhsTree->background())
+
303  , mOutputTree(&mLocalTree)
+
304  {
+
305  }
+
306 
+
307  void join(ProcessLeafNodes& rhs) { mOutputTree->merge(*rhs.mOutputTree); }
+
308 
+
309  void operator()(const tbb::blocked_range<size_t>& range)
+
310  {
+
311  tree::ValueAccessor<const TreeType> rhsAcc(*mRhsTree);
+
312  tree::ValueAccessor<TreeType> outputAcc(*mOutputTree);
+
313 
+
314  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
315 
+
316  const LeafNodeType& lhsNode = *mLhsNodes[n];
+
317  const Coord& ijk = lhsNode.origin();
+
318 
+
319  const LeafNodeType* rhsNodePt = rhsAcc.probeConstLeaf(ijk);
+
320 
+
321  if (rhsNodePt) { // combine overlapping nodes
+
322 
+
323  LeafNodeType* outputNode = outputAcc.touchLeaf(ijk);
+
324  ValueType * outputData = outputNode->buffer().data();
+
325  NodeMaskType& outputMask = outputNode->getValueMask();
+
326 
+
327  const ValueType * lhsData = lhsNode.buffer().data();
+
328  const NodeMaskType& lhsMask = lhsNode.getValueMask();
+
329 
+
330  const ValueType * rhsData = rhsNodePt->buffer().data();
+
331  const NodeMaskType& rhsMask = rhsNodePt->getValueMask();
+
332 
+
333  if (Operation == CSG_INTERSECTION) {
+
334  for (Index pos = 0; pos < LeafNodeType::SIZE; ++pos) {
+
335  const bool fromRhs = lhsData[pos] < rhsData[pos];
+
336  outputData[pos] = fromRhs ? rhsData[pos] : lhsData[pos];
+
337  outputMask.set(pos, fromRhs ? rhsMask.isOn(pos) : lhsMask.isOn(pos));
+
338  }
+
339  } else if (Operation == CSG_DIFFERENCE){
+
340  for (Index pos = 0; pos < LeafNodeType::SIZE; ++pos) {
+
341  const ValueType rhsVal = math::negative(rhsData[pos]);
+
342  const bool fromRhs = lhsData[pos] < rhsVal;
+
343  outputData[pos] = fromRhs ? rhsVal : lhsData[pos];
+
344  outputMask.set(pos, fromRhs ? rhsMask.isOn(pos) : lhsMask.isOn(pos));
+
345  }
+
346  } else { // Union
+
347  for (Index pos = 0; pos < LeafNodeType::SIZE; ++pos) {
+
348  const bool fromRhs = lhsData[pos] > rhsData[pos];
+
349  outputData[pos] = fromRhs ? rhsData[pos] : lhsData[pos];
+
350  outputMask.set(pos, fromRhs ? rhsMask.isOn(pos) : lhsMask.isOn(pos));
+
351  }
+
352  }
+
353 
+
354  } else {
+
355  if (Operation == CSG_INTERSECTION) {
+
356  if (rhsAcc.getValue(ijk) < ValueType(0.0)) {
+
357  outputAcc.addLeaf(new LeafNodeType(lhsNode));
+
358  }
+
359  } else { // Union & Difference
+
360  if (!(rhsAcc.getValue(ijk) < ValueType(0.0))) {
+
361  outputAcc.addLeaf(new LeafNodeType(lhsNode));
+
362  }
+
363  }
+
364  }
+
365  } // end range loop
+
366  }
+
367 
+
368  LeafNodeType const * const * const mLhsNodes;
+
369  TreeType const * const mRhsTree;
+
370  TreeType mLocalTree;
+
371  TreeType * const mOutputTree;
+
372  }; // struct ProcessLeafNodes
+
373 
+
374  TreePtrType mSegment;
+
375  TreeType const * const mLhsTree;
+
376  TreeType const * const mRhsTree;
+
377 }; // struct BuildPrimarySegment
+
378 
+
379 
+
380 template<typename TreeType, CSGOperation Operation>
+ +
382 {
+
383  typedef typename TreeType::ValueType ValueType;
+
384  typedef typename TreeType::Ptr TreePtrType;
+
385  typedef typename TreeType::LeafNodeType LeafNodeType;
+
386  typedef typename LeafNodeType::NodeMaskType NodeMaskType;
+
387  typedef typename TreeType::RootNodeType RootNodeType;
+
388  typedef typename RootNodeType::NodeChainType NodeChainType;
+
389  typedef typename boost::mpl::at<NodeChainType, boost::mpl::int_<1> >::type InternalNodeType;
+
390 
+
391  BuildSecondarySegment(const TreeType& lhs, const TreeType& rhs)
+
392  : mSegment(new TreeType(lhs.background()))
+
393  , mLhsTree(&lhs)
+
394  , mRhsTree(&rhs)
+
395  {
+
396  }
+
397 
+
398  void operator()() const
+
399  {
+
400  std::vector<const LeafNodeType*> leafNodes;
+
401 
+
402  {
+
403  std::vector<const InternalNodeType*> internalNodes;
+
404  mRhsTree->getNodes(internalNodes);
+
405 
+
406  ProcessInternalNodes op(internalNodes, *mLhsTree, *mSegment, leafNodes);
+
407  tbb::parallel_reduce(tbb::blocked_range<size_t>(0, internalNodes.size()), op);
+
408  }
+
409 
+
410  ProcessLeafNodes op(leafNodes, *mLhsTree, *mSegment);
+
411  tbb::parallel_reduce(tbb::blocked_range<size_t>(0, leafNodes.size()), op);
+
412  }
+
413 
+
414  TreePtrType& segment() { return mSegment; }
+
415 
+
416 private:
+
417 
+
418  struct ProcessInternalNodes {
+
419 
+
420  ProcessInternalNodes(std::vector<const InternalNodeType*>& rhsNodes, const TreeType& lhsTree,
+
421  TreeType& outputTree, std::vector<const LeafNodeType*>& outputLeafNodes)
+
422  : mRhsNodes(rhsNodes.empty() ? NULL : &rhsNodes.front())
+
423  , mLhsTree(&lhsTree)
+
424  , mLocalTree(mLhsTree->background())
+
425  , mOutputTree(&outputTree)
+
426  , mLocalLeafNodes()
+
427  , mOutputLeafNodes(&outputLeafNodes)
+
428  {
+
429  }
+
430 
+
431  ProcessInternalNodes(ProcessInternalNodes& other, tbb::split)
+
432  : mRhsNodes(other.mRhsNodes)
+
433  , mLhsTree(other.mLhsTree)
+
434  , mLocalTree(mLhsTree->background())
+
435  , mOutputTree(&mLocalTree)
+
436  , mLocalLeafNodes()
+
437  , mOutputLeafNodes(&mLocalLeafNodes)
+
438  {
+
439  }
+
440 
+
441  void join(ProcessInternalNodes& other)
+
442  {
+
443  mOutputTree->merge(*other.mOutputTree);
+
444  mOutputLeafNodes->insert(mOutputLeafNodes->end(),
+
445  other.mOutputLeafNodes->begin(), other.mOutputLeafNodes->end());
+
446  }
+
447 
+
448  void operator()(const tbb::blocked_range<size_t>& range)
+
449  {
+
450  tree::ValueAccessor<const TreeType> lhsAcc(*mLhsTree);
+
451  tree::ValueAccessor<TreeType> outputAcc(*mOutputTree);
+
452 
+
453  std::vector<const LeafNodeType*> tmpLeafNodes;
+
454 
+
455  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
456 
+
457  const InternalNodeType& rhsNode = *mRhsNodes[n];
+
458  const Coord& ijk = rhsNode.origin();
+
459  const InternalNodeType * lhsNode = lhsAcc.template probeConstNode<InternalNodeType>(ijk);
+
460 
+
461  if (lhsNode) {
+
462  rhsNode.getNodes(*mOutputLeafNodes);
+
463  } else {
+
464  if (Operation == CSG_INTERSECTION) {
+
465  if (lhsAcc.getValue(ijk) < ValueType(0.0)) {
+
466  tmpLeafNodes.clear();
+
467  rhsNode.getNodes(tmpLeafNodes);
+
468  for (size_t i = 0, I = tmpLeafNodes.size(); i < I; ++i) {
+
469  outputAcc.addLeaf(new LeafNodeType(*tmpLeafNodes[i]));
+
470  }
+
471  }
+
472  } else if (Operation == CSG_DIFFERENCE) {
+
473  if (lhsAcc.getValue(ijk) < ValueType(0.0)) {
+
474  tmpLeafNodes.clear();
+
475  rhsNode.getNodes(tmpLeafNodes);
+
476  for (size_t i = 0, I = tmpLeafNodes.size(); i < I; ++i) {
+
477  LeafNodeType* outputNode = new LeafNodeType(*tmpLeafNodes[i]);
+
478  outputNode->negate();
+
479  outputAcc.addLeaf(outputNode);
+
480  }
+
481  }
+
482  } else { // Union
+
483  if (!(lhsAcc.getValue(ijk) < ValueType(0.0))) {
+
484  tmpLeafNodes.clear();
+
485  rhsNode.getNodes(tmpLeafNodes);
+
486  for (size_t i = 0, I = tmpLeafNodes.size(); i < I; ++i) {
+
487  outputAcc.addLeaf(new LeafNodeType(*tmpLeafNodes[i]));
+
488  }
+
489  }
+
490  }
+
491  }
+
492  } // end range loop
+
493  }
+
494 
+
495  InternalNodeType const * const * const mRhsNodes;
+
496  TreeType const * const mLhsTree;
+
497  TreeType mLocalTree;
+
498  TreeType * const mOutputTree;
+
499 
+
500  std::vector<const LeafNodeType*> mLocalLeafNodes;
+
501  std::vector<const LeafNodeType*> * const mOutputLeafNodes;
+
502  }; // struct ProcessInternalNodes
+
503 
+
504  struct ProcessLeafNodes {
+
505 
+
506  ProcessLeafNodes(std::vector<const LeafNodeType*>& rhsNodes, const TreeType& lhsTree, TreeType& output)
+
507  : mRhsNodes(rhsNodes.empty() ? NULL : &rhsNodes.front())
+
508  , mLhsTree(&lhsTree)
+
509  , mLocalTree(mLhsTree->background())
+
510  , mOutputTree(&output)
+
511  {
+
512  }
+
513 
+
514  ProcessLeafNodes(ProcessLeafNodes& rhs, tbb::split)
+
515  : mRhsNodes(rhs.mRhsNodes)
+
516  , mLhsTree(rhs.mLhsTree)
+
517  , mLocalTree(mLhsTree->background())
+
518  , mOutputTree(&mLocalTree)
+
519  {
+
520  }
+
521 
+
522  void join(ProcessLeafNodes& rhs) { mOutputTree->merge(*rhs.mOutputTree); }
+
523 
+
524  void operator()(const tbb::blocked_range<size_t>& range)
+
525  {
+
526  tree::ValueAccessor<const TreeType> lhsAcc(*mLhsTree);
+
527  tree::ValueAccessor<TreeType> outputAcc(*mOutputTree);
+
528 
+
529  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
530 
+
531  const LeafNodeType& rhsNode = *mRhsNodes[n];
+
532  const Coord& ijk = rhsNode.origin();
+
533 
+
534  const LeafNodeType* lhsNode = lhsAcc.probeConstLeaf(ijk);
+
535 
+
536  if (!lhsNode) {
+
537  if (Operation == CSG_INTERSECTION) {
+
538  if (lhsAcc.getValue(ijk) < ValueType(0.0)) {
+
539  outputAcc.addLeaf(new LeafNodeType(rhsNode));
+
540  }
+
541  } else if (Operation == CSG_DIFFERENCE) {
+
542  if (lhsAcc.getValue(ijk) < ValueType(0.0)) {
+
543  LeafNodeType* outputNode = new LeafNodeType(rhsNode);
+
544  outputNode->negate();
+
545  outputAcc.addLeaf(outputNode);
+
546  }
+
547  } else { // Union
+
548  if (!(lhsAcc.getValue(ijk) < ValueType(0.0))) {
+
549  outputAcc.addLeaf(new LeafNodeType(rhsNode));
+
550  }
+
551  }
+
552  }
+
553  } // end range loop
+
554  }
+
555 
+
556  LeafNodeType const * const * const mRhsNodes;
+
557  TreeType const * const mLhsTree;
+
558  TreeType mLocalTree;
+
559  TreeType * const mOutputTree;
+
560  }; // struct ProcessLeafNodes
+
561 
+
562  TreePtrType mSegment;
+
563  TreeType const * const mLhsTree;
+
564  TreeType const * const mRhsTree;
+
565 }; // struct BuildSecondarySegment
+
566 
+
567 
+
568 template<CSGOperation Operation, typename TreeType>
+
569 inline typename TreeType::Ptr
+
570 doCSGCopy(const TreeType& lhs, const TreeType& rhs)
+
571 {
+ +
573  BuildSecondarySegment<TreeType, Operation> secondary(lhs, rhs);
+
574 
+
575  // Exploiting nested parallelism
+
576  tbb::task_group tasks;
+
577  tasks.run(primary);
+
578  tasks.run(secondary);
+
579  tasks.wait();
+
580 
+
581  primary.segment()->merge(*secondary.segment());
+
582 
+
583  // The leafnode (level = 0) sign is set in the segment construction.
+
584  tools::signedFloodFill(*primary.segment(), /*threaded=*/true, /*grainSize=*/1, /*minLevel=*/1);
+
585 
+
586  return primary.segment();
+
587 }
+
588 
+
589 
+
591 
+
592 
+
593 template<typename TreeType>
+ +
595 {
+
596  typedef typename TreeType::Ptr TreeTypePtr;
+
597  static TreeTypePtr construct(const TreeType&, TreeTypePtr& tree) { return tree; }
+
598 };
+
599 
+
600 
+
601 template<typename TreeType>
+
602 struct GridOrTreeConstructor<Grid<TreeType> >
+
603 {
+ + +
606  typedef typename TreeType::Ptr TreeTypePtr;
+
607 
+
608  static GridTypePtr construct(const GridType& grid, TreeTypePtr& tree) {
+
609  GridTypePtr maskGrid(GridType::create(tree));
+
610  maskGrid->setTransform(grid.transform().copy());
+
611  maskGrid->insertMeta(grid);
+
612  return maskGrid;
+
613  }
+
614 };
+
615 
+
616 
+
618 
+
619 
+
620 } // namespace composite
+
621 
+
622 
+
623 template<typename GridOrTreeT>
+ +
625 compMax(GridOrTreeT& aTree, GridOrTreeT& bTree)
+
626 {
+
627  typedef TreeAdapter<GridOrTreeT> Adapter;
+
628  typedef typename Adapter::TreeType TreeT;
+
629  typedef typename TreeT::ValueType ValueT;
+
630  struct Local {
+
631  static inline void op(CombineArgs<ValueT>& args) {
+
632  args.setResult(composite::max(args.a(), args.b()));
+
633  }
+
634  };
+
635  Adapter::tree(aTree).combineExtended(Adapter::tree(bTree), Local::op, /*prune=*/false);
+
636 }
+
637 
+
638 
+
639 template<typename GridOrTreeT>
+ +
641 compMin(GridOrTreeT& aTree, GridOrTreeT& bTree)
+
642 {
+
643  typedef TreeAdapter<GridOrTreeT> Adapter;
+
644  typedef typename Adapter::TreeType TreeT;
+
645  typedef typename TreeT::ValueType ValueT;
+
646  struct Local {
+
647  static inline void op(CombineArgs<ValueT>& args) {
+
648  args.setResult(composite::min(args.a(), args.b()));
+
649  }
+
650  };
+
651  Adapter::tree(aTree).combineExtended(Adapter::tree(bTree), Local::op, /*prune=*/false);
+
652 }
+
653 
+
654 
+
655 template<typename GridOrTreeT>
+ +
657 compSum(GridOrTreeT& aTree, GridOrTreeT& bTree)
+
658 {
+
659  typedef TreeAdapter<GridOrTreeT> Adapter;
+
660  typedef typename Adapter::TreeType TreeT;
+
661  struct Local {
+
662  static inline void op(CombineArgs<typename TreeT::ValueType>& args) {
+
663  args.setResult(args.a() + args.b());
+
664  }
+
665  };
+
666  Adapter::tree(aTree).combineExtended(Adapter::tree(bTree), Local::op, /*prune=*/false);
+
667 }
+
668 
+
669 
+
670 template<typename GridOrTreeT>
+ +
672 compMul(GridOrTreeT& aTree, GridOrTreeT& bTree)
+
673 {
+
674  typedef TreeAdapter<GridOrTreeT> Adapter;
+
675  typedef typename Adapter::TreeType TreeT;
+
676  struct Local {
+
677  static inline void op(CombineArgs<typename TreeT::ValueType>& args) {
+
678  args.setResult(args.a() * args.b());
+
679  }
+
680  };
+
681  Adapter::tree(aTree).combineExtended(Adapter::tree(bTree), Local::op, /*prune=*/false);
+
682 }
+
683 
+
684 
+
685 template<typename GridOrTreeT>
+ +
687 compDiv(GridOrTreeT& aTree, GridOrTreeT& bTree)
+
688 {
+
689  typedef TreeAdapter<GridOrTreeT> Adapter;
+
690  typedef typename Adapter::TreeType TreeT;
+
691  struct Local {
+
692  static inline void op(CombineArgs<typename TreeT::ValueType>& args) {
+
693  args.setResult(composite::divide(args.a(), args.b()));
+
694  }
+
695  };
+
696  Adapter::tree(aTree).combineExtended(Adapter::tree(bTree), Local::op, /*prune=*/false);
+
697 }
+
698 
+
699 
+
701 
+
702 
+
703 template<typename TreeT>
+ +
705 {
+
706  TreeT* const aTree;
+
707 
+
708  CompReplaceOp(TreeT& _aTree): aTree(&_aTree) {}
+
709 
+
711  void operator()(const typename TreeT::ValueOnCIter& iter) const
+
712  {
+
713  CoordBBox bbox;
+
714  iter.getBoundingBox(bbox);
+
715  aTree->fill(bbox, *iter);
+
716  }
+
717 
+
718  void operator()(const typename TreeT::LeafCIter& leafIter) const
+
719  {
+
720  tree::ValueAccessor<TreeT> acc(*aTree);
+
721  for (typename TreeT::LeafCIter::LeafNodeT::ValueOnCIter iter =
+
722  leafIter->cbeginValueOn(); iter; ++iter)
+
723  {
+
724  acc.setValue(iter.getCoord(), *iter);
+
725  }
+
726  }
+
727 };
+
728 
+
729 
+
730 template<typename GridOrTreeT>
+ +
732 compReplace(GridOrTreeT& aTree, const GridOrTreeT& bTree)
+
733 {
+
734  typedef TreeAdapter<GridOrTreeT> Adapter;
+
735  typedef typename Adapter::TreeType TreeT;
+
736  typedef typename TreeT::ValueOnCIter ValueOnCIterT;
+
737 
+
738  // Copy active states (but not values) from B to A.
+
739  Adapter::tree(aTree).topologyUnion(Adapter::tree(bTree));
+
740 
+ +
742 
+
743  // Copy all active tile values from B to A.
+
744  ValueOnCIterT iter = bTree.cbeginValueOn();
+
745  iter.setMaxDepth(iter.getLeafDepth() - 1); // don't descend into leaf nodes
+
746  foreach(iter, op, /*threaded=*/false);
+
747 
+
748  // Copy all active voxel values from B to A.
+
749  foreach(Adapter::tree(bTree).cbeginLeaf(), op);
+
750 }
+
751 
+
752 
+
754 
+
755 
+
758 template<typename TreeType>
+ +
760 {
+
761 public:
+
762  typedef TreeType TreeT;
+
763  typedef typename TreeT::ValueType ValueT;
+
764  typedef typename TreeT::LeafNodeType::ChildAllIter ChildIterT;
+
765 
+
766  enum { STOP = 3 };
+
767 
+
768  CsgVisitorBase(const TreeT& aTree, const TreeT& bTree):
+
769  mAOutside(aTree.background()),
+
770  mAInside(math::negative(mAOutside)),
+
771  mBOutside(bTree.background()),
+
772  mBInside(math::negative(mBOutside))
+
773  {
+
774  const ValueT zero = zeroVal<ValueT>();
+
775  if (!(mAOutside > zero)) {
+ +
777  "expected grid A outside value > 0, got " << mAOutside);
+
778  }
+
779  if (!(mAInside < zero)) {
+ +
781  "expected grid A inside value < 0, got " << mAInside);
+
782  }
+
783  if (!(mBOutside > zero)) {
+ +
785  "expected grid B outside value > 0, got " << mBOutside);
+
786  }
+
787  if (!(mBInside < zero)) {
+ +
789  "expected grid B outside value < 0, got " << mBOutside);
+
790  }
+
791  }
+
792 
+
793 protected:
+
794  ValueT mAOutside, mAInside, mBOutside, mBInside;
+
795 };
+
796 
+
797 
+
799 
+
800 
+
801 template<typename TreeType>
+
802 struct CsgUnionVisitor: public CsgVisitorBase<TreeType>
+
803 {
+
804  typedef TreeType TreeT;
+
805  typedef typename TreeT::ValueType ValueT;
+
806  typedef typename TreeT::LeafNodeType::ChildAllIter ChildIterT;
+
807 
+ +
809 
+
810  CsgUnionVisitor(const TreeT& a, const TreeT& b): CsgVisitorBase<TreeT>(a, b) {}
+
811 
+
813  template<typename AIterT, typename BIterT>
+
814  inline int operator()(AIterT&, BIterT&) { return 0; }
+
815 
+
817  template<typename IterT>
+
818  inline int operator()(IterT& aIter, IterT& bIter)
+
819  {
+
820  ValueT aValue = zeroVal<ValueT>();
+
821  typename IterT::ChildNodeType* aChild = aIter.probeChild(aValue);
+
822  if (!aChild && aValue < zeroVal<ValueT>()) {
+
823  // A is an inside tile. Leave it alone and stop traversing this branch.
+
824  return STOP;
+
825  }
+
826 
+
827  ValueT bValue = zeroVal<ValueT>();
+
828  typename IterT::ChildNodeType* bChild = bIter.probeChild(bValue);
+
829  if (!bChild && bValue < zeroVal<ValueT>()) {
+
830  // B is an inside tile. Make A an inside tile and stop traversing this branch.
+
831  aIter.setValue(this->mAInside);
+
832  aIter.setValueOn(bIter.isValueOn());
+
833  delete aChild;
+
834  return STOP;
+
835  }
+
836 
+
837  if (!aChild && aValue > zeroVal<ValueT>()) {
+
838  // A is an outside tile. If B has a child, transfer it to A,
+
839  // otherwise leave A alone.
+
840  if (bChild) {
+
841  bIter.setValue(this->mBOutside);
+
842  bIter.setValueOff();
+
843  bChild->resetBackground(this->mBOutside, this->mAOutside);
+
844  aIter.setChild(bChild); // transfer child
+
845  delete aChild;
+
846  }
+
847  return STOP;
+
848  }
+
849 
+
850  // If A has a child and B is an outside tile, stop traversing this branch.
+
851  // Continue traversal only if A and B both have children.
+
852  return (aChild && bChild) ? 0 : STOP;
+
853  }
+
854 
+
856  inline int operator()(ChildIterT& aIter, ChildIterT& bIter)
+
857  {
+
858  ValueT aValue, bValue;
+
859  aIter.probeValue(aValue);
+
860  bIter.probeValue(bValue);
+
861  if (aValue > bValue) { // a = min(a, b)
+
862  aIter.setValue(bValue);
+
863  aIter.setValueOn(bIter.isValueOn());
+
864  }
+
865  return 0;
+
866  }
+
867 };
+
868 
+
869 
+
870 
+
872 
+
873 
+
874 template<typename TreeType>
+
875 struct CsgIntersectVisitor: public CsgVisitorBase<TreeType>
+
876 {
+
877  typedef TreeType TreeT;
+
878  typedef typename TreeT::ValueType ValueT;
+
879  typedef typename TreeT::LeafNodeType::ChildAllIter ChildIterT;
+
880 
+ +
882 
+
883  CsgIntersectVisitor(const TreeT& a, const TreeT& b): CsgVisitorBase<TreeT>(a, b) {}
+
884 
+
886  template<typename AIterT, typename BIterT>
+
887  inline int operator()(AIterT&, BIterT&) { return 0; }
+
888 
+
890  template<typename IterT>
+
891  inline int operator()(IterT& aIter, IterT& bIter)
+
892  {
+
893  ValueT aValue = zeroVal<ValueT>();
+
894  typename IterT::ChildNodeType* aChild = aIter.probeChild(aValue);
+
895  if (!aChild && !(aValue < zeroVal<ValueT>())) {
+
896  // A is an outside tile. Leave it alone and stop traversing this branch.
+
897  return STOP;
+
898  }
+
899 
+
900  ValueT bValue = zeroVal<ValueT>();
+
901  typename IterT::ChildNodeType* bChild = bIter.probeChild(bValue);
+
902  if (!bChild && !(bValue < zeroVal<ValueT>())) {
+
903  // B is an outside tile. Make A an outside tile and stop traversing this branch.
+
904  aIter.setValue(this->mAOutside);
+
905  aIter.setValueOn(bIter.isValueOn());
+
906  delete aChild;
+
907  return STOP;
+
908  }
+
909 
+
910  if (!aChild && aValue < zeroVal<ValueT>()) {
+
911  // A is an inside tile. If B has a child, transfer it to A,
+
912  // otherwise leave A alone.
+
913  if (bChild) {
+
914  bIter.setValue(this->mBOutside);
+
915  bIter.setValueOff();
+
916  bChild->resetBackground(this->mBOutside, this->mAOutside);
+
917  aIter.setChild(bChild); // transfer child
+
918  delete aChild;
+
919  }
+
920  return STOP;
+
921  }
+
922 
+
923  // If A has a child and B is an outside tile, stop traversing this branch.
+
924  // Continue traversal only if A and B both have children.
+
925  return (aChild && bChild) ? 0 : STOP;
+
926  }
+
927 
+
929  inline int operator()(ChildIterT& aIter, ChildIterT& bIter)
+
930  {
+
931  ValueT aValue, bValue;
+
932  aIter.probeValue(aValue);
+
933  bIter.probeValue(bValue);
+
934  if (aValue < bValue) { // a = max(a, b)
+
935  aIter.setValue(bValue);
+
936  aIter.setValueOn(bIter.isValueOn());
+
937  }
+
938  return 0;
+
939  }
+
940 };
+
941 
+
942 
+
944 
+
945 
+
946 template<typename TreeType>
+
947 struct CsgDiffVisitor: public CsgVisitorBase<TreeType>
+
948 {
+
949  typedef TreeType TreeT;
+
950  typedef typename TreeT::ValueType ValueT;
+
951  typedef typename TreeT::LeafNodeType::ChildAllIter ChildIterT;
+
952 
+ +
954 
+
955  CsgDiffVisitor(const TreeT& a, const TreeT& b): CsgVisitorBase<TreeT>(a, b) {}
+
956 
+
958  template<typename AIterT, typename BIterT>
+
959  inline int operator()(AIterT&, BIterT&) { return 0; }
+
960 
+
962  template<typename IterT>
+
963  inline int operator()(IterT& aIter, IterT& bIter)
+
964  {
+
965  ValueT aValue = zeroVal<ValueT>();
+
966  typename IterT::ChildNodeType* aChild = aIter.probeChild(aValue);
+
967  if (!aChild && !(aValue < zeroVal<ValueT>())) {
+
968  // A is an outside tile. Leave it alone and stop traversing this branch.
+
969  return STOP;
+
970  }
+
971 
+
972  ValueT bValue = zeroVal<ValueT>();
+
973  typename IterT::ChildNodeType* bChild = bIter.probeChild(bValue);
+
974  if (!bChild && bValue < zeroVal<ValueT>()) {
+
975  // B is an inside tile. Make A an inside tile and stop traversing this branch.
+
976  aIter.setValue(this->mAOutside);
+
977  aIter.setValueOn(bIter.isValueOn());
+
978  delete aChild;
+
979  return STOP;
+
980  }
+
981 
+
982  if (!aChild && aValue < zeroVal<ValueT>()) {
+
983  // A is an inside tile. If B has a child, transfer it to A,
+
984  // otherwise leave A alone.
+
985  if (bChild) {
+
986  bIter.setValue(this->mBOutside);
+
987  bIter.setValueOff();
+
988  bChild->resetBackground(this->mBOutside, this->mAOutside);
+
989  aIter.setChild(bChild); // transfer child
+
990  bChild->negate();
+
991  delete aChild;
+
992  }
+
993  return STOP;
+
994  }
+
995 
+
996  // If A has a child and B is an outside tile, stop traversing this branch.
+
997  // Continue traversal only if A and B both have children.
+
998  return (aChild && bChild) ? 0 : STOP;
+
999  }
+
1000 
+
1002  inline int operator()(ChildIterT& aIter, ChildIterT& bIter)
+
1003  {
+
1004  ValueT aValue, bValue;
+
1005  aIter.probeValue(aValue);
+
1006  bIter.probeValue(bValue);
+
1007  bValue = math::negative(bValue);
+
1008  if (aValue < bValue) { // a = max(a, -b)
+
1009  aIter.setValue(bValue);
+
1010  aIter.setValueOn(bIter.isValueOn());
+
1011  }
+
1012  return 0;
+
1013  }
+
1014 };
+
1015 
+
1016 
+
1018 
+
1019 
+
1020 template<typename GridOrTreeT>
+ +
1022 csgUnion(GridOrTreeT& a, GridOrTreeT& b, bool prune)
+
1023 {
+
1024  typedef TreeAdapter<GridOrTreeT> Adapter;
+
1025  typedef typename Adapter::TreeType TreeT;
+
1026  TreeT &aTree = Adapter::tree(a), &bTree = Adapter::tree(b);
+
1027  CsgUnionVisitor<TreeT> visitor(aTree, bTree);
+
1028  aTree.visit2(bTree, visitor);
+
1029  if (prune) tools::pruneLevelSet(aTree);
+
1030 }
+
1031 
+
1032 template<typename GridOrTreeT>
+ +
1034 csgIntersection(GridOrTreeT& a, GridOrTreeT& b, bool prune)
+
1035 {
+
1036  typedef TreeAdapter<GridOrTreeT> Adapter;
+
1037  typedef typename Adapter::TreeType TreeT;
+
1038  TreeT &aTree = Adapter::tree(a), &bTree = Adapter::tree(b);
+
1039  CsgIntersectVisitor<TreeT> visitor(aTree, bTree);
+
1040  aTree.visit2(bTree, visitor);
+
1041  if (prune) tools::pruneLevelSet(aTree);
+
1042 }
+
1043 
+
1044 template<typename GridOrTreeT>
+ +
1046 csgDifference(GridOrTreeT& a, GridOrTreeT& b, bool prune)
+
1047 {
+
1048  typedef TreeAdapter<GridOrTreeT> Adapter;
+
1049  typedef typename Adapter::TreeType TreeT;
+
1050  TreeT &aTree = Adapter::tree(a), &bTree = Adapter::tree(b);
+
1051  CsgDiffVisitor<TreeT> visitor(aTree, bTree);
+
1052  aTree.visit2(bTree, visitor);
+
1053  if (prune) tools::pruneLevelSet(aTree);
+
1054 }
+
1055 
+
1056 
+
1057 template<typename GridOrTreeT>
+
1058 OPENVDB_STATIC_SPECIALIZATION inline typename GridOrTreeT::Ptr
+
1059 csgUnionCopy(const GridOrTreeT& a, const GridOrTreeT& b)
+
1060 {
+
1061  typedef TreeAdapter<GridOrTreeT> Adapter;
+
1062  typedef typename Adapter::TreeType::Ptr TreePtrT;
+
1063 
+
1064  TreePtrT output = composite::doCSGCopy<composite::CSG_UNION>(
+
1065  Adapter::tree(a), Adapter::tree(b));
+
1066 
+ +
1068 }
+
1069 
+
1070 
+
1071 template<typename GridOrTreeT>
+
1072 OPENVDB_STATIC_SPECIALIZATION inline typename GridOrTreeT::Ptr
+
1073 csgIntersectionCopy(const GridOrTreeT& a, const GridOrTreeT& b)
+
1074 {
+
1075  typedef TreeAdapter<GridOrTreeT> Adapter;
+
1076  typedef typename Adapter::TreeType::Ptr TreePtrT;
+
1077 
+
1078  TreePtrT output = composite::doCSGCopy<composite::CSG_INTERSECTION>(
+
1079  Adapter::tree(a), Adapter::tree(b));
+
1080 
+ +
1082 }
+
1083 
+
1084 
+
1085 template<typename GridOrTreeT>
+
1086 OPENVDB_STATIC_SPECIALIZATION inline typename GridOrTreeT::Ptr
+
1087 csgDifferenceCopy(const GridOrTreeT& a, const GridOrTreeT& b)
+
1088 {
+
1089  typedef TreeAdapter<GridOrTreeT> Adapter;
+
1090  typedef typename Adapter::TreeType::Ptr TreePtrT;
+
1091 
+
1092  TreePtrT output = composite::doCSGCopy<composite::CSG_DIFFERENCE>(
+
1093  Adapter::tree(a), Adapter::tree(b));
+
1094 
+ +
1096 }
+
1097 
+
1098 
+
1099 } // namespace tools
+
1100 } // namespace OPENVDB_VERSION_NAME
+
1101 } // namespace openvdb
+
1102 
+
1103 #endif // OPENVDB_TOOLS_COMPOSITE_HAS_BEEN_INCLUDED
+
1104 
+
1105 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
1106 // All rights reserved. This software is distributed under the
+
1107 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
Definition: Composite.h:947
+ +
void signedFloodFill(TreeOrLeafManagerT &tree, bool threaded=true, size_t grainSize=1, Index minLevel=0)
Set the values of all inactive voxels and tiles of a narrow-band level set from the signs of the acti...
Definition: SignedFloodFill.h:294
+
int operator()(ChildIterT &aIter, ChildIterT &bIter)
Process leaf node values.
Definition: Composite.h:1002
+
OPENVDB_STATIC_SPECIALIZATION void csgDifference(GridOrTreeT &a, GridOrTreeT &b, bool prune=true)
Given two level set grids, replace the A grid with the difference A / B.
Definition: Composite.h:1046
+ +
OPENVDB_STATIC_SPECIALIZATION void csgIntersection(GridOrTreeT &a, GridOrTreeT &b, bool prune=true)
Given two level set grids, replace the A grid with the intersection of A and B.
Definition: Composite.h:1034
+
TreePtrType & segment()
Definition: Composite.h:209
+
TreeType TreeT
Definition: Composite.h:877
+
CombineArgs & setResult(const AValueType &val)
Set the output value.
Definition: Types.h:362
+
LeafNodeType::NodeMaskType NodeMaskType
Definition: Composite.h:386
+
CsgIntersectVisitor(const TreeT &a, const TreeT &b)
Definition: Composite.h:883
+
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+ +
TreeType::Ptr TreePtrType
Definition: Composite.h:179
+
int operator()(IterT &aIter, IterT &bIter)
Process root and internal nodes.
Definition: Composite.h:963
+
OPENVDB_STATIC_SPECIALIZATION void csgUnion(GridOrTreeT &a, GridOrTreeT &b, bool prune=true)
Given two level set grids, replace the A grid with the union of A and B.
Definition: Composite.h:1022
+ +
TreeT::ValueType ValueT
Definition: Composite.h:805
+
Definition: Composite.h:802
+
TreeT *const aTree
Definition: Composite.h:706
+
CompReplaceOp(TreeT &_aTree)
Definition: Composite.h:708
+
void operator()(const typename TreeT::ValueOnCIter &iter) const
Definition: Composite.h:711
+
OPENVDB_STATIC_SPECIALIZATION void compMax(GridOrTreeT &a, GridOrTreeT &b)
Given grids A and B, compute max(a, b) per voxel (using sparse traversal). Store the result in the A ...
Definition: Composite.h:625
+
TreeType::Ptr TreePtrType
Definition: Composite.h:384
+
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
+
int operator()(AIterT &, BIterT &)
Don't process nodes that are at different tree levels.
Definition: Composite.h:959
+
bool divide(bool a, bool)
Definition: Composite.h:170
+
int operator()(AIterT &, BIterT &)
Don't process nodes that are at different tree levels.
Definition: Composite.h:814
+
CsgVisitorBase(const TreeT &aTree, const TreeT &bTree)
Definition: Composite.h:768
+
void operator()(const typename TreeT::LeafCIter &leafIter) const
Definition: Composite.h:718
+
RootNodeType::NodeChainType NodeChainType
Definition: Composite.h:388
+
int operator()(IterT &aIter, IterT &bIter)
Process root and internal nodes.
Definition: Composite.h:891
+
int operator()(ChildIterT &aIter, ChildIterT &bIter)
Process leaf node values.
Definition: Composite.h:856
+
TreeType::LeafNodeType LeafNodeType
Definition: Composite.h:180
+
OPENVDB_STATIC_SPECIALIZATION void compSum(GridOrTreeT &a, GridOrTreeT &b)
Given grids A and B, compute a + b per voxel (using sparse traversal). Store the result in the A grid...
Definition: Composite.h:657
+
OPENVDB_STATIC_SPECIALIZATION void compMul(GridOrTreeT &a, GridOrTreeT &b)
Given grids A and B, compute a * b per voxel (using sparse traversal). Store the result in the A grid...
Definition: Composite.h:672
+
TreeT::LeafNodeType::ChildAllIter ChildIterT
Definition: Composite.h:806
+
void pruneLevelSet(TreeT &tree, bool threaded=true, size_t grainSize=1)
Reduce the memory footprint of a tree by replacing nodes whose values are all inactive with inactive ...
Definition: Prune.h:402
+
RootNodeType::NodeChainType NodeChainType
Definition: Composite.h:183
+ +
TreeType TreeT
Definition: Composite.h:762
+
boost::mpl::at< NodeChainType, boost::mpl::int_< 1 > >::type InternalNodeType
Definition: Composite.h:389
+
static TreeTypePtr construct(const TreeType &, TreeTypePtr &tree)
Definition: Composite.h:597
+
OPENVDB_STATIC_SPECIALIZATION GridOrTreeT::Ptr csgDifferenceCopy(const GridOrTreeT &a, const GridOrTreeT &b)
Threaded CSG difference operation that produces a new grid or tree from immutable inputs...
Definition: Composite.h:1087
+
boost::shared_ptr< Grid > Ptr
Definition: Grid.h:485
+
Ptr copy() const
Definition: Transform.h:77
+ +
TreeT::LeafNodeType::ChildAllIter ChildIterT
Definition: Composite.h:951
+
math::Transform & transform()
Return a reference to this grid's transform, which might be shared with other grids.
Definition: Grid.h:335
+
Defined various multi-threaded utility functions for trees.
+
OPENVDB_STATIC_SPECIALIZATION GridOrTreeT::Ptr csgUnionCopy(const GridOrTreeT &a, const GridOrTreeT &b)
Threaded CSG union operation that produces a new grid or tree from immutable inputs.
Definition: Composite.h:1059
+
OPENVDB_STATIC_SPECIALIZATION void compReplace(GridOrTreeT &a, const GridOrTreeT &b)
Copy the active voxels of B into A.
Definition: Composite.h:732
+
OPENVDB_STATIC_SPECIALIZATION void compMin(GridOrTreeT &a, GridOrTreeT &b)
Given grids A and B, compute min(a, b) per voxel (using sparse traversal). Store the result in the A ...
Definition: Composite.h:641
+
Index32 Index
Definition: Types.h:58
+
TreeType::Ptr TreeTypePtr
Definition: Composite.h:596
+
int operator()(ChildIterT &aIter, ChildIterT &bIter)
Process leaf node values.
Definition: Composite.h:929
+
Definition: Composite.h:704
+ +
TreeType TreeT
Definition: Composite.h:949
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
int operator()(IterT &aIter, IterT &bIter)
Process root and internal nodes.
Definition: Composite.h:818
+
Grid< TreeType >::Ptr GridTypePtr
Definition: Composite.h:605
+
Propagates the sign of distance values from the active voxels in the narrow band to the inactive valu...
+
This adapter allows code that is templated on a Tree type to accept either a Tree type or a Grid type...
Definition: Grid.h:883
+ +
ValueT mBOutside
Definition: Composite.h:794
+
Definition: Exceptions.h:39
+
const boost::enable_if_c< VecTraits< T >::IsVec, T >::type & min(const T &a, const T &b)
Definition: Composite.h:138
+ +
TreeT::ValueType ValueT
Definition: Composite.h:950
+
TreeType TreeT
Definition: Composite.h:804
+
OPENVDB_STATIC_SPECIALIZATION void compDiv(GridOrTreeT &a, GridOrTreeT &b)
Given grids A and B, compute a / b per voxel (using sparse traversal). Store the result in the A grid...
Definition: Composite.h:687
+
CsgDiffVisitor(const TreeT &a, const TreeT &b)
Definition: Composite.h:955
+
TreeT::LeafNodeType::ChildAllIter ChildIterT
Definition: Composite.h:764
+
TreeT::ValueType ValueT
Definition: Composite.h:763
+
const boost::enable_if_c< VecTraits< T >::IsVec, T >::type & max(const T &a, const T &b)
Definition: Composite.h:146
+
BuildSecondarySegment(const TreeType &lhs, const TreeType &rhs)
Definition: Composite.h:391
+
void operator()() const
Definition: Composite.h:193
+
CsgUnionVisitor(const TreeT &a, const TreeT &b)
Definition: Composite.h:810
+
TreeType::RootNodeType RootNodeType
Definition: Composite.h:182
+
const AValueType & a() const
Get the A input value.
Definition: Types.h:352
+
int operator()(AIterT &, BIterT &)
Don't process nodes that are at different tree levels.
Definition: Composite.h:887
+
const BValueType & b() const
Get the B input value.
Definition: Types.h:354
+
TreeT::LeafNodeType::ChildAllIter ChildIterT
Definition: Composite.h:879
+
#define OPENVDB_STATIC_SPECIALIZATION
Macro for determining if there are sufficient C++0x/C++11 features.
Definition: Platform.h:91
+
TreeType::ValueType ValueType
Definition: Composite.h:383
+ +
Definition: Exceptions.h:88
+
void prune(TreeT &tree, typename TreeT::ValueType tolerance=zeroVal< typename TreeT::ValueType >(), bool threaded=true, size_t grainSize=1)
Reduce the memory footprint of a tree by replacing with tiles any nodes whose values are all the same...
Definition: Prune.h:347
+
TreeType::Ptr doCSGCopy(const TreeType &lhs, const TreeType &rhs)
Definition: Composite.h:570
+
Definition: Composite.h:759
+
OPENVDB_STATIC_SPECIALIZATION GridOrTreeT::Ptr csgIntersectionCopy(const GridOrTreeT &a, const GridOrTreeT &b)
Threaded CSG intersection operation that produces a new grid or tree from immutable inputs...
Definition: Composite.h:1073
+
LeafNodeType::NodeMaskType NodeMaskType
Definition: Composite.h:181
+
TreeType::ValueType ValueType
Definition: Composite.h:178
+
T negative(const T &val)
Return the unary negation of the given value.
Definition: Math.h:116
+
CSGOperation
Definition: Composite.h:173
+
TreeT::ValueType ValueT
Definition: Composite.h:878
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+ +
void operator()() const
Definition: Composite.h:398
+
boost::mpl::at< NodeChainType, boost::mpl::int_< 1 > >::type InternalNodeType
Definition: Composite.h:184
+ +
TreeType::RootNodeType RootNodeType
Definition: Composite.h:387
+
BuildPrimarySegment(const TreeType &lhs, const TreeType &rhs)
Definition: Composite.h:186
+
TreeT * tree
Definition: MaskToLevelSet.h:118
+
TreePtrType & segment()
Definition: Composite.h:414
+ +
This struct collects both input and output arguments to "grid combiner" functors used with the tree::...
Definition: Types.h:312
+
Container class that associates a tree with a transform and metadata.
Definition: Grid.h:54
+
static GridTypePtr construct(const GridType &grid, TreeTypePtr &tree)
Definition: Composite.h:608
+ +
void setValue(const Coord &xyz, const ValueType &value)
Set the value of the voxel at the given coordinates and mark the voxel as active. ...
Definition: ValueAccessor.h:287
+
TreeType::LeafNodeType LeafNodeType
Definition: Composite.h:385
+ +
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/Compression_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/Compression_8h_source.html new file mode 100644 index 00000000..8fb96860 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/Compression_8h_source.html @@ -0,0 +1,684 @@ + + + + + + +OpenVDB: Compression.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Compression.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 
+
31 #ifndef OPENVDB_IO_COMPRESSION_HAS_BEEN_INCLUDED
+
32 #define OPENVDB_IO_COMPRESSION_HAS_BEEN_INCLUDED
+
33 
+
34 #include <openvdb/Types.h>
+
35 #include <openvdb/math/Math.h> // for negative()
+
36 #include "io.h" // for getDataCompression(), etc.
+
37 #include <boost/scoped_array.hpp>
+
38 #include <algorithm>
+
39 #include <iostream>
+
40 #include <string>
+
41 #include <vector>
+
42 
+
43 
+
44 namespace openvdb {
+ +
46 namespace OPENVDB_VERSION_NAME {
+
47 namespace io {
+
48 
+
77 enum {
+ +
79  COMPRESS_ZIP = 0x1,
+ + +
82 };
+
83 
+
85 OPENVDB_API std::string compressionToString(uint32_t flags);
+
86 
+
87 
+
89 
+
90 
+
93 enum {
+
94  /*0*/ NO_MASK_OR_INACTIVE_VALS, // no inactive vals, or all inactive vals are +background
+
95  /*1*/ NO_MASK_AND_MINUS_BG, // all inactive vals are -background
+
96  /*2*/ NO_MASK_AND_ONE_INACTIVE_VAL, // all inactive vals have the same non-background val
+
97  /*3*/ MASK_AND_NO_INACTIVE_VALS, // mask selects between -background and +background
+
98  /*4*/ MASK_AND_ONE_INACTIVE_VAL, // mask selects between backgd and one other inactive val
+
99  /*5*/ MASK_AND_TWO_INACTIVE_VALS, // mask selects between two non-background inactive vals
+
100  /*6*/ NO_MASK_AND_ALL_VALS // > 2 inactive vals, so no mask compression at all
+
101 };
+
102 
+
103 
+
105 
+
106 
+
109 template<typename T>
+
110 struct RealToHalf {
+
111  enum { isReal = false }; // unless otherwise specified, type T is not a floating-point type
+
112  typedef T HalfT; // type T's half float analogue is T itself
+
113  static HalfT convert(const T& val) { return val; }
+
114 };
+
115 template<> struct RealToHalf<float> {
+
116  enum { isReal = true };
+
117  typedef half HalfT;
+
118  static HalfT convert(float val) { return HalfT(val); }
+
119 };
+
120 template<> struct RealToHalf<double> {
+
121  enum { isReal = true };
+
122  typedef half HalfT;
+
123  // A half can only be constructed from a float, so cast the value to a float first.
+
124  static HalfT convert(double val) { return HalfT(float(val)); }
+
125 };
+
126 template<> struct RealToHalf<Vec2s> {
+
127  enum { isReal = true };
+
128  typedef Vec2H HalfT;
+
129  static HalfT convert(const Vec2s& val) { return HalfT(val); }
+
130 };
+
131 template<> struct RealToHalf<Vec2d> {
+
132  enum { isReal = true };
+
133  typedef Vec2H HalfT;
+
134  // A half can only be constructed from a float, so cast the vector's elements to floats first.
+
135  static HalfT convert(const Vec2d& val) { return HalfT(Vec2s(val)); }
+
136 };
+
137 template<> struct RealToHalf<Vec3s> {
+
138  enum { isReal = true };
+
139  typedef Vec3H HalfT;
+
140  static HalfT convert(const Vec3s& val) { return HalfT(val); }
+
141 };
+
142 template<> struct RealToHalf<Vec3d> {
+
143  enum { isReal = true };
+
144  typedef Vec3H HalfT;
+
145  // A half can only be constructed from a float, so cast the vector's elements to floats first.
+
146  static HalfT convert(const Vec3d& val) { return HalfT(Vec3s(val)); }
+
147 };
+
148 
+
149 
+
151 template<typename T>
+
152 inline T
+
153 truncateRealToHalf(const T& val)
+
154 {
+
155  return T(RealToHalf<T>::convert(val));
+
156 }
+
157 
+
158 
+
160 
+
161 
+
162 OPENVDB_API void zipToStream(std::ostream&, const char* data, size_t numBytes);
+
163 OPENVDB_API void unzipFromStream(std::istream&, char* data, size_t numBytes);
+
164 OPENVDB_API void bloscToStream(std::ostream&, const char* data, size_t valSize, size_t numVals);
+
165 OPENVDB_API void bloscFromStream(std::istream&, char* data, size_t numBytes);
+
166 
+
177 template<typename T>
+
178 inline void
+
179 readData(std::istream& is, T* data, Index count, uint32_t compression)
+
180 {
+
181  if (compression & COMPRESS_BLOSC) {
+
182  bloscFromStream(is, reinterpret_cast<char*>(data), sizeof(T) * count);
+
183  } else if (compression & COMPRESS_ZIP) {
+
184  unzipFromStream(is, reinterpret_cast<char*>(data), sizeof(T) * count);
+
185  } else {
+
186  is.read(reinterpret_cast<char*>(data), sizeof(T) * count);
+
187  }
+
188 }
+
189 
+
191 template<>
+
192 inline void
+
193 readData<std::string>(std::istream& is, std::string* data, Index count, uint32_t /*compression*/)
+
194 {
+
195  for (Index i = 0; i < count; ++i) {
+
196  size_t len = 0;
+
197  is >> len;
+
198  //data[i].resize(len);
+
199  //is.read(&(data[i][0]), len);
+
200 
+
201  std::string buffer(len+1, ' ');
+
202  is.read(&buffer[0], len+1 );
+
203  data[i].assign(buffer, 0, len);
+
204  }
+
205 }
+
206 
+
211 template<bool IsReal, typename T> struct HalfReader;
+
213 template<typename T>
+
214 struct HalfReader</*IsReal=*/false, T> {
+
215  static inline void read(std::istream& is, T* data, Index count, uint32_t compression) {
+
216  readData(is, data, count, compression);
+
217  }
+
218 };
+
220 template<typename T>
+
221 struct HalfReader</*IsReal=*/true, T> {
+
222  typedef typename RealToHalf<T>::HalfT HalfT;
+
223  static inline void read(std::istream& is, T* data, Index count, uint32_t compression) {
+
224  if (count < 1) return;
+
225  std::vector<HalfT> halfData(count); // temp buffer into which to read half float values
+
226  readData<HalfT>(is, reinterpret_cast<HalfT*>(&halfData[0]), count, compression);
+
227  // Copy half float values from the temporary buffer to the full float output array.
+
228  std::copy(halfData.begin(), halfData.end(), data);
+
229  }
+
230 };
+
231 
+
232 
+
243 template<typename T>
+
244 inline void
+
245 writeData(std::ostream &os, const T *data, Index count, uint32_t compression)
+
246 {
+
247  if (compression & COMPRESS_BLOSC) {
+
248  bloscToStream(os, reinterpret_cast<const char*>(data), sizeof(T), count);
+
249  } else if (compression & COMPRESS_ZIP) {
+
250  zipToStream(os, reinterpret_cast<const char*>(data), sizeof(T) * count);
+
251  } else {
+
252  os.write(reinterpret_cast<const char*>(data), sizeof(T) * count);
+
253  }
+
254 }
+
255 
+
257 template<>
+
258 inline void
+
259 writeData<std::string>(std::ostream& os, const std::string* data, Index count,
+
260  uint32_t /*compression*/)
+
261 {
+
262  for (Index i = 0; i < count; ++i) {
+
263  const size_t len = data[i].size();
+
264  os << len;
+
265  os.write(data[i].c_str(), len+1);
+
266  //os.write(&(data[i][0]), len );
+
267  }
+
268 }
+
269 
+
274 template<bool IsReal, typename T> struct HalfWriter;
+
276 template<typename T>
+
277 struct HalfWriter</*IsReal=*/false, T> {
+
278  static inline void write(std::ostream& os, const T* data, Index count, uint32_t compression) {
+
279  writeData(os, data, count, compression);
+
280  }
+
281 };
+
283 template<typename T>
+
284 struct HalfWriter</*IsReal=*/true, T> {
+
285  typedef typename RealToHalf<T>::HalfT HalfT;
+
286  static inline void write(std::ostream& os, const T* data, Index count, uint32_t compression) {
+
287  if (count < 1) return;
+
288  // Convert full float values to half float, then output the half float array.
+
289  std::vector<HalfT> halfData(count);
+
290  for (Index i = 0; i < count; ++i) halfData[i] = RealToHalf<T>::convert(data[i]);
+
291  writeData<HalfT>(os, reinterpret_cast<const HalfT*>(&halfData[0]), count, compression);
+
292  }
+
293 };
+
294 #ifdef _MSC_VER
+
295 template<>
+
297 struct HalfWriter</*IsReal=*/true, double> {
+
298  typedef RealToHalf<double>::HalfT HalfT;
+
299  static inline void write(std::ostream& os, const double* data, Index count,
+
300  uint32_t compression)
+
301  {
+
302  if (count < 1) return;
+
303  // Convert full float values to half float, then output the half float array.
+
304  std::vector<HalfT> halfData(count);
+
305  for (Index i = 0; i < count; ++i) halfData[i] = RealToHalf<double>::convert(data[i]);
+
306  writeData<HalfT>(os, reinterpret_cast<const HalfT*>(&halfData[0]), count, compression);
+
307  }
+
308 };
+
309 #endif // _MSC_VER
+
310 
+
311 
+
313 
+
314 
+
327 template<typename ValueT, typename MaskT>
+
328 inline void
+
329 readCompressedValues(std::istream& is, ValueT* destBuf, Index destCount,
+
330  const MaskT& valueMask, bool fromHalf)
+
331 {
+
332  // Get the stream's compression settings.
+
333  const uint32_t compression = getDataCompression(is);
+
334  const bool maskCompressed = compression & COMPRESS_ACTIVE_MASK;
+
335 
+
336  int8_t metadata = NO_MASK_AND_ALL_VALS;
+ +
338  // Read the flag that specifies what, if any, additional metadata
+
339  // (selection mask and/or inactive value(s)) is saved.
+
340  is.read(reinterpret_cast<char*>(&metadata), /*bytes=*/1);
+
341  }
+
342 
+
343  ValueT background = zeroVal<ValueT>();
+
344  if (const void* bgPtr = getGridBackgroundValuePtr(is)) {
+
345  background = *static_cast<const ValueT*>(bgPtr);
+
346  }
+
347  ValueT inactiveVal1 = background;
+
348  ValueT inactiveVal0 =
+
349  ((metadata == NO_MASK_OR_INACTIVE_VALS) ? background : math::negative(background));
+
350 
+
351  if (metadata == NO_MASK_AND_ONE_INACTIVE_VAL ||
+
352  metadata == MASK_AND_ONE_INACTIVE_VAL ||
+
353  metadata == MASK_AND_TWO_INACTIVE_VALS)
+
354  {
+
355  // Read one of at most two distinct inactive values.
+
356  is.read(reinterpret_cast<char*>(&inactiveVal0), sizeof(ValueT));
+
357  if (metadata == MASK_AND_TWO_INACTIVE_VALS) {
+
358  // Read the second of two distinct inactive values.
+
359  is.read(reinterpret_cast<char*>(&inactiveVal1), sizeof(ValueT));
+
360  }
+
361  }
+
362 
+
363  MaskT selectionMask;
+
364  if (metadata == MASK_AND_NO_INACTIVE_VALS ||
+
365  metadata == MASK_AND_ONE_INACTIVE_VAL ||
+
366  metadata == MASK_AND_TWO_INACTIVE_VALS)
+
367  {
+
368  // For use in mask compression (only), read the bitmask that selects
+
369  // between two distinct inactive values.
+
370  selectionMask.load(is);
+
371  }
+
372 
+
373  ValueT* tempBuf = destBuf;
+
374  boost::scoped_array<ValueT> scopedTempBuf;
+
375 
+
376  Index tempCount = destCount;
+
377  if (maskCompressed && metadata != NO_MASK_AND_ALL_VALS
+ +
379  {
+
380  tempCount = valueMask.countOn();
+
381  if (tempCount != destCount) {
+
382  // If this node has inactive voxels, allocate a temporary buffer
+
383  // into which to read just the active values.
+
384  scopedTempBuf.reset(new ValueT[tempCount]);
+
385  tempBuf = scopedTempBuf.get();
+
386  }
+
387  }
+
388 
+
389  // Read in the buffer.
+
390  if (fromHalf) {
+
391  HalfReader<RealToHalf<ValueT>::isReal, ValueT>::read(is, tempBuf, tempCount, compression);
+
392  } else {
+
393  readData<ValueT>(is, tempBuf, tempCount, compression);
+
394  }
+
395 
+
396  // If mask compression is enabled and the number of active values read into
+
397  // the temp buffer is smaller than the size of the destination buffer,
+
398  // then there are missing (inactive) values.
+
399  if (maskCompressed && tempCount != destCount) {
+
400  // Restore inactive values, using the background value and, if available,
+
401  // the inside/outside mask. (For fog volumes, the destination buffer is assumed
+
402  // to be initialized to background value zero, so inactive values can be ignored.)
+
403  for (Index destIdx = 0, tempIdx = 0; destIdx < MaskT::SIZE; ++destIdx) {
+
404  if (valueMask.isOn(destIdx)) {
+
405  // Copy a saved active value into this node's buffer.
+
406  destBuf[destIdx] = tempBuf[tempIdx];
+
407  ++tempIdx;
+
408  } else {
+
409  // Reconstruct an unsaved inactive value and copy it into this node's buffer.
+
410  destBuf[destIdx] = (selectionMask.isOn(destIdx) ? inactiveVal1 : inactiveVal0);
+
411  }
+
412  }
+
413  }
+
414 }
+
415 
+
416 
+
429 template<typename ValueT, typename MaskT>
+
430 inline void
+
431 writeCompressedValues(std::ostream& os, ValueT* srcBuf, Index srcCount,
+
432  const MaskT& valueMask, const MaskT& childMask, bool toHalf)
+
433 {
+
434  struct Local {
+
435  // Comparison function for values
+
436  static inline bool eq(const ValueT& a, const ValueT& b) {
+
437  return math::isExactlyEqual(a, b);
+
438  }
+
439  };
+
440 
+
441  // Get the stream's compression settings.
+
442  const uint32_t compress = getDataCompression(os);
+
443  const bool maskCompress = compress & COMPRESS_ACTIVE_MASK;
+
444 
+
445  Index tempCount = srcCount;
+
446  ValueT* tempBuf = srcBuf;
+
447  boost::scoped_array<ValueT> scopedTempBuf;
+
448 
+
449  int8_t metadata = NO_MASK_AND_ALL_VALS;
+
450 
+
451  if (!maskCompress) {
+
452  os.write(reinterpret_cast<const char*>(&metadata), /*bytes=*/1);
+
453  } else {
+
454  // A valid level set's inactive values are either +background (outside)
+
455  // or -background (inside), and a fog volume's inactive values are all zero.
+
456  // Rather than write out all of these values, we can store just the active values
+
457  // (given that the value mask specifies their positions) and, if necessary,
+
458  // an inside/outside bitmask.
+
459 
+
460  const ValueT zero = zeroVal<ValueT>();
+
461  ValueT background = zero;
+
462  if (const void* bgPtr = getGridBackgroundValuePtr(os)) {
+
463  background = *static_cast<const ValueT*>(bgPtr);
+
464  }
+
465 
+
467  ValueT inactiveVal[2] = { background, background };
+
468  int numUniqueInactiveVals = 0;
+
469  for (typename MaskT::OffIterator it = valueMask.beginOff();
+
470  numUniqueInactiveVals < 3 && it; ++it)
+
471  {
+
472  const Index32 idx = it.pos();
+
473 
+
474  // Skip inactive values that are actually child node pointers.
+
475  if (childMask.isOn(idx)) continue;
+
476 
+
477  const ValueT& val = srcBuf[idx];
+
478  const bool unique = !(
+
479  (numUniqueInactiveVals > 0 && Local::eq(val, inactiveVal[0])) ||
+
480  (numUniqueInactiveVals > 1 && Local::eq(val, inactiveVal[1]))
+
481  );
+
482  if (unique) {
+
483  if (numUniqueInactiveVals < 2) inactiveVal[numUniqueInactiveVals] = val;
+
484  ++numUniqueInactiveVals;
+
485  }
+
486  }
+
487 
+
488  metadata = NO_MASK_OR_INACTIVE_VALS;
+
489 
+
490  if (numUniqueInactiveVals == 1) {
+
491  if (!Local::eq(inactiveVal[0], background)) {
+
492  if (Local::eq(inactiveVal[0], math::negative(background))) {
+
493  metadata = NO_MASK_AND_MINUS_BG;
+
494  } else {
+
495  metadata = NO_MASK_AND_ONE_INACTIVE_VAL;
+
496  }
+
497  }
+
498  } else if (numUniqueInactiveVals == 2) {
+
499  metadata = NO_MASK_OR_INACTIVE_VALS;
+
500  if (!Local::eq(inactiveVal[0], background) && !Local::eq(inactiveVal[1], background)) {
+
501  // If neither inactive value is equal to the background, both values
+
502  // need to be saved, along with a mask that selects between them.
+
503  metadata = MASK_AND_TWO_INACTIVE_VALS;
+
504 
+
505  } else if (Local::eq(inactiveVal[1], background)) {
+
506  if (Local::eq(inactiveVal[0], math::negative(background))) {
+
507  // If the second inactive value is equal to the background and
+
508  // the first is equal to -background, neither value needs to be saved,
+
509  // but save a mask that selects between -background and +background.
+
510  metadata = MASK_AND_NO_INACTIVE_VALS;
+
511  } else {
+
512  // If the second inactive value is equal to the background, only
+
513  // the first value needs to be saved, along with a mask that selects
+
514  // between it and the background.
+
515  metadata = MASK_AND_ONE_INACTIVE_VAL;
+
516  }
+
517  } else if (Local::eq(inactiveVal[0], background)) {
+
518  if (Local::eq(inactiveVal[1], math::negative(background))) {
+
519  // If the first inactive value is equal to the background and
+
520  // the second is equal to -background, neither value needs to be saved,
+
521  // but save a mask that selects between -background and +background.
+
522  metadata = MASK_AND_NO_INACTIVE_VALS;
+
523  std::swap(inactiveVal[0], inactiveVal[1]);
+
524  } else {
+
525  // If the first inactive value is equal to the background, swap it
+
526  // with the second value and save only that value, along with a mask
+
527  // that selects between it and the background.
+
528  std::swap(inactiveVal[0], inactiveVal[1]);
+
529  metadata = MASK_AND_ONE_INACTIVE_VAL;
+
530  }
+
531  }
+
532  } else if (numUniqueInactiveVals > 2) {
+
533  metadata = NO_MASK_AND_ALL_VALS;
+
534  }
+
535 
+
536  os.write(reinterpret_cast<const char*>(&metadata), /*bytes=*/1);
+
537 
+
538  if (metadata == NO_MASK_AND_ONE_INACTIVE_VAL ||
+
539  metadata == MASK_AND_ONE_INACTIVE_VAL ||
+
540  metadata == MASK_AND_TWO_INACTIVE_VALS)
+
541  {
+
542  if (!toHalf) {
+
543  // Write one of at most two distinct inactive values.
+
544  os.write(reinterpret_cast<const char*>(&inactiveVal[0]), sizeof(ValueT));
+
545  if (metadata == MASK_AND_TWO_INACTIVE_VALS) {
+
546  // Write the second of two distinct inactive values.
+
547  os.write(reinterpret_cast<const char*>(&inactiveVal[1]), sizeof(ValueT));
+
548  }
+
549  } else {
+
550  // Write one of at most two distinct inactive values.
+
551  ValueT truncatedVal = static_cast<ValueT>(truncateRealToHalf(inactiveVal[0]));
+
552  os.write(reinterpret_cast<const char*>(&truncatedVal), sizeof(ValueT));
+
553  if (metadata == MASK_AND_TWO_INACTIVE_VALS) {
+
554  // Write the second of two distinct inactive values.
+
555  truncatedVal = truncateRealToHalf(inactiveVal[1]);
+
556  os.write(reinterpret_cast<const char*>(&truncatedVal), sizeof(ValueT));
+
557  }
+
558  }
+
559  }
+
560 
+
561  if (metadata == NO_MASK_AND_ALL_VALS) {
+
562  // If there are more than two unique inactive values, the entire input buffer
+
563  // needs to be saved (both active and inactive values).
+
566  } else {
+
567  // Create a new array to hold just the active values.
+
568  scopedTempBuf.reset(new ValueT[srcCount]);
+
569  tempBuf = scopedTempBuf.get();
+
570 
+
571  if (metadata == NO_MASK_OR_INACTIVE_VALS ||
+
572  metadata == NO_MASK_AND_MINUS_BG ||
+
573  metadata == NO_MASK_AND_ONE_INACTIVE_VAL)
+
574  {
+
575  // Copy active values to the contiguous array.
+
576  tempCount = 0;
+
577  for (typename MaskT::OnIterator it = valueMask.beginOn(); it; ++it, ++tempCount) {
+
578  tempBuf[tempCount] = srcBuf[it.pos()];
+
579  }
+
580  } else {
+
581  // Copy active values to a new, contiguous array and populate a bitmask
+
582  // that selects between two distinct inactive values.
+
583  MaskT selectionMask;
+
584  tempCount = 0;
+
585  for (Index srcIdx = 0; srcIdx < srcCount; ++srcIdx) {
+
586  if (valueMask.isOn(srcIdx)) { // active value
+
587  tempBuf[tempCount] = srcBuf[srcIdx];
+
588  ++tempCount;
+
589  } else { // inactive value
+
590  if (Local::eq(srcBuf[srcIdx], inactiveVal[1])) {
+
591  selectionMask.setOn(srcIdx); // inactive value 1
+
592  } // else inactive value 0
+
593  }
+
594  }
+
595  assert(tempCount == valueMask.countOn());
+
596 
+
597  // Write out the mask that selects between two inactive values.
+
598  selectionMask.save(os);
+
599  }
+
600  }
+
601  }
+
602 
+
603  // Write out the buffer.
+
604  if (toHalf) {
+
605  HalfWriter<RealToHalf<ValueT>::isReal, ValueT>::write(os, tempBuf, tempCount, compress);
+
606  } else {
+
607  writeData(os, tempBuf, tempCount, compress);
+
608  }
+
609 }
+
610 
+
611 } // namespace io
+
612 } // namespace OPENVDB_VERSION_NAME
+
613 } // namespace openvdb
+
614 
+
615 #endif // OPENVDB_IO_COMPRESSION_HAS_BEEN_INCLUDED
+
616 
+
617 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
618 // All rights reserved. This software is distributed under the
+
619 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
Vec3< float > Vec3s
Definition: Vec3.h:650
+
Definition: Compression.h:81
+
#define OPENVDB_API
Helper macros for defining library symbol visibility.
Definition: Platform.h:195
+
static void read(std::istream &is, T *data, Index count, uint32_t compression)
Definition: Compression.h:223
+
OPENVDB_API std::string compressionToString(uint32_t flags)
Return a string describing the given compression flags.
+
Definition: Compression.h:274
+ +
half HalfT
Definition: Compression.h:122
+
Vec2< double > Vec2d
Definition: Vec2.h:543
+
bool isExactlyEqual(const T0 &a, const T1 &b)
Return true if a is exactly equal to b.
Definition: Math.h:407
+
static void write(std::ostream &os, const T *data, Index count, uint32_t compression)
Definition: Compression.h:286
+
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+ +
OPENVDB_API void bloscFromStream(std::istream &, char *data, size_t numBytes)
+
Definition: Mat.h:146
+
static HalfT convert(const Vec2d &val)
Definition: Compression.h:135
+
T truncateRealToHalf(const T &val)
Return the given value truncated to 16-bit float precision.
Definition: Compression.h:153
+
Vec3H HalfT
Definition: Compression.h:139
+
OPENVDB_API void unzipFromStream(std::istream &, char *data, size_t numBytes)
+ +
OPENVDB_API void bloscToStream(std::ostream &, const char *data, size_t valSize, size_t numVals)
+
Vec2H HalfT
Definition: Compression.h:133
+ +
OPENVDB_API const void * getGridBackgroundValuePtr(std::ios_base &)
Return a pointer to the background value of the grid currently being read from or written to the give...
+
static HalfT convert(float val)
Definition: Compression.h:118
+
Definition: Compression.h:80
+
Index32 Index
Definition: Types.h:58
+
static HalfT convert(const Vec3s &val)
Definition: Compression.h:140
+ +
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
Vec3< double > Vec3d
Definition: Vec3.h:651
+
void readCompressedValues(std::istream &is, ValueT *destBuf, Index destCount, const MaskT &valueMask, bool fromHalf)
Definition: Compression.h:329
+
OPENVDB_API void zipToStream(std::ostream &, const char *data, size_t numBytes)
+ +
OPENVDB_API uint32_t getFormatVersion(std::ios_base &)
Return the file format version number associated with the given input stream.
+
void writeCompressedValues(std::ostream &os, ValueT *srcBuf, Index srcCount, const MaskT &valueMask, const MaskT &childMask, bool toHalf)
Definition: Compression.h:431
+
Definition: Exceptions.h:39
+
uint32_t Index32
Definition: Types.h:56
+
T HalfT
Definition: Compression.h:112
+
static HalfT convert(double val)
Definition: Compression.h:124
+
void writeData(std::ostream &os, const T *data, Index count, uint32_t compression)
Definition: Compression.h:245
+
static void write(std::ostream &os, const T *data, Index count, uint32_t compression)
Definition: Compression.h:278
+ +
static HalfT convert(const T &val)
Definition: Compression.h:113
+
Definition: Vec2.h:48
+
void readData(std::istream &is, T *data, Index count, uint32_t compression)
Read data from a stream.
Definition: Compression.h:179
+
Definition: Compression.h:211
+
static HalfT convert(const Vec3d &val)
Definition: Compression.h:146
+
Definition: Compression.h:78
+
static HalfT convert(const Vec2s &val)
Definition: Compression.h:129
+
RealToHalf< T >::HalfT HalfT
Definition: Compression.h:222
+
Vec3H HalfT
Definition: Compression.h:144
+
RealToHalf and its specializations define a mapping from floating-point data types to analogous half ...
Definition: Compression.h:110
+
T negative(const T &val)
Return the unary negation of the given value.
Definition: Math.h:116
+
static void read(std::istream &is, T *data, Index count, uint32_t compression)
Definition: Compression.h:215
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
Definition: Compression.h:79
+
Vec2< float > Vec2s
Definition: Vec2.h:542
+ +
OPENVDB_API uint32_t getDataCompression(std::ios_base &)
Return a bitwise OR of compression option flags (COMPRESS_ZIP, COMPRESS_ACTIVE_MASK, etc.) specifying whether and how input data is compressed or output data should be compressed.
+
Definition: Compression.h:100
+
Vec2H HalfT
Definition: Compression.h:128
+
half HalfT
Definition: Compression.h:117
+
Definition: Compression.h:95
+
RealToHalf< T >::HalfT HalfT
Definition: Compression.h:285
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/ConjGradient_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/ConjGradient_8h_source.html new file mode 100644 index 00000000..9959d90c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/ConjGradient_8h_source.html @@ -0,0 +1,1965 @@ + + + + + + +OpenVDB: ConjGradient.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
ConjGradient.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 
+
35 
+
36 #ifndef OPENVDB_MATH_CONJGRADIENT_HAS_BEEN_INCLUDED
+
37 #define OPENVDB_MATH_CONJGRADIENT_HAS_BEEN_INCLUDED
+
38 
+
39 #include <openvdb/Exceptions.h>
+
40 #include <openvdb/Types.h>
+
41 #include <openvdb/util/logging.h>
+ +
43 #include "Math.h" // for Abs(), isZero(), Max(), Sqrt()
+
44 #include <boost/shared_ptr.hpp>
+
45 #include <boost/scoped_array.hpp>
+
46 #include <tbb/parallel_for.h>
+
47 #include <tbb/parallel_reduce.h>
+
48 #include <algorithm> // for std::lower_bound()
+
49 #include <cassert>
+
50 #include <cmath> // for std::isfinite()
+
51 #include <limits>
+
52 #include <sstream>
+
53 
+
54 
+
55 namespace openvdb {
+ +
57 namespace OPENVDB_VERSION_NAME {
+
58 namespace math {
+
59 namespace pcg {
+
60 
+
61 typedef Index32 SizeType;
+
62 
+
63 typedef tbb::blocked_range<SizeType> SizeRange;
+
64 
+
65 template<typename ValueType> class Vector;
+
66 
+
67 template<typename ValueType, SizeType STENCIL_SIZE> class SparseStencilMatrix;
+
68 
+
69 template<typename ValueType> class Preconditioner;
+
70 template<typename MatrixType> class JacobiPreconditioner;
+
71 template<typename MatrixType> class IncompleteCholeskyPreconditioner;
+
72 
+
74 struct State {
+
75  bool success;
+ +
77  double relativeError;
+
78  double absoluteError;
+
79 };
+
80 
+
81 
+
83 template<typename ValueType>
+
84 inline State
+ +
86 {
+
87  State s;
+
88  s.success = false;
+
89  s.iterations = 50;
+
90  s.relativeError = 1.0e-6;
+
91  s.absoluteError = std::numeric_limits<ValueType>::epsilon() * 100.0;
+
92  return s;
+
93 }
+
94 
+
95 
+
97 
+
98 
+
118 template<typename PositiveDefMatrix>
+
119 inline State
+
120 solve(
+
121  const PositiveDefMatrix& A,
+
122  const Vector<typename PositiveDefMatrix::ValueType>& b,
+
123  Vector<typename PositiveDefMatrix::ValueType>& x,
+
124  Preconditioner<typename PositiveDefMatrix::ValueType>& preconditioner,
+
125  const State& termination = terminationDefaults<typename PositiveDefMatrix::ValueType>());
+
126 
+
127 
+
150 template<typename PositiveDefMatrix, typename Interrupter>
+
151 inline State
+
152 solve(
+
153  const PositiveDefMatrix& A,
+
154  const Vector<typename PositiveDefMatrix::ValueType>& b,
+
155  Vector<typename PositiveDefMatrix::ValueType>& x,
+
156  Preconditioner<typename PositiveDefMatrix::ValueType>& preconditioner,
+
157  Interrupter& interrupter,
+
158  const State& termination = terminationDefaults<typename PositiveDefMatrix::ValueType>());
+
159 
+
160 
+
162 
+
163 
+
165 template<typename T>
+
166 class Vector
+
167 {
+
168 public:
+
169  typedef T ValueType;
+
170  typedef boost::shared_ptr<Vector> Ptr;
+
171 
+
173  Vector(): mData(NULL), mSize(0) {}
+
175  Vector(SizeType n): mData(new T[n]), mSize(n) {}
+
177  Vector(SizeType n, const ValueType& val): mData(new T[n]), mSize(n) { this->fill(val); }
+
178 
+
179  ~Vector() { mSize = 0; delete[] mData; mData = NULL; }
+
180 
+
182  Vector(const Vector&);
+
184  Vector& operator=(const Vector&);
+
185 
+
187  SizeType size() const { return mSize; }
+
189  bool empty() const { return (mSize == 0); }
+
190 
+
193  void resize(SizeType n);
+
194 
+
196  void swap(Vector& other) { std::swap(mData, other.mData); std::swap(mSize, other.mSize); }
+
197 
+
199  void fill(const ValueType& value);
+
200 
+
202  template<typename Scalar> void scale(const Scalar& s);
+
204  template<typename Scalar> Vector& operator*=(const Scalar& s) { this->scale(s); return *this; }
+
206 
+
208  ValueType dot(const Vector&) const;
+
209 
+
211  ValueType infNorm() const;
+
213  ValueType l2Norm() const { return Sqrt(this->dot(*this)); }
+
214 
+
216  bool isFinite() const;
+
217 
+
220  template<typename OtherValueType>
+
221  bool eq(const Vector<OtherValueType>& other,
+
222  ValueType eps = Tolerance<ValueType>::value()) const;
+
223 
+
225  std::string str() const;
+
226 
+
228  inline T& at(SizeType i) { return mData[i]; }
+
230  inline const T& at(SizeType i) const { return mData[i]; }
+
231  inline T& operator[](SizeType i) { return this->at(i); }
+
232  inline const T& operator[](SizeType i) const { return this->at(i); }
+
234 
+
236  inline T* data() { return mData; }
+
238  inline const T* data() const { return mData; }
+
239  inline const T* constData() const { return mData; }
+
241 
+
242 private:
+
243  // Functor for use with tbb::parallel_for()
+
244  template<typename Scalar> struct ScaleOp;
+
245  struct DeterministicDotProductOp;
+
246  // Functors for use with tbb::parallel_reduce()
+
247  template<typename OtherValueType> struct EqOp;
+
248  struct InfNormOp;
+
249  struct IsFiniteOp;
+
250 
+
251  T* mData;
+
252  SizeType mSize;
+
253 };
+
254 
+ + +
257 //typedef Vector<double> LinearVector;
+
258 
+
259 
+
261 
+
262 
+
265 template<typename ValueType_, SizeType STENCIL_SIZE>
+ +
267 {
+
268 public:
+
269  typedef ValueType_ ValueType;
+ +
271  typedef boost::shared_ptr<SparseStencilMatrix> Ptr;
+
272 
+
273  class ConstValueIter;
+
274  class ConstRow;
+
275  class RowEditor;
+
276 
+
277  static const ValueType sZeroValue;
+
278 
+
280  SparseStencilMatrix(SizeType n);
+
281 
+ +
284 
+
286  SizeType numRows() const { return mNumRows; }
+
288  SizeType size() const { return mNumRows; }
+
290 
+
294  void setValue(SizeType row, SizeType col, const ValueType&);
+
295 
+
297  const ValueType& getValue(SizeType row, SizeType col) const;
+
301  const ValueType& operator()(SizeType row, SizeType col) const;
+
303 
+
305  ConstRow getConstRow(SizeType row) const;
+
306 
+
308  RowEditor getRowEditor(SizeType row);
+
309 
+
311  template<typename Scalar> void scale(const Scalar& s);
+
313  template<typename Scalar>
+
314  SparseStencilMatrix& operator*=(const Scalar& s) { this->scale(s); return *this; }
+
316 
+
320  template<typename VecValueType>
+
321  void vectorMultiply(const Vector<VecValueType>& inVec, Vector<VecValueType>& resultVec) const;
+
322 
+
327  template<typename VecValueType>
+
328  void vectorMultiply(const VecValueType* inVec, VecValueType* resultVec) const;
+
329 
+
332  template<typename OtherValueType>
+ +
334  ValueType eps = Tolerance<ValueType>::value()) const;
+
335 
+
337  bool isFinite() const;
+
338 
+
340  std::string str() const;
+
341 
+
342 private:
+
343  struct RowData {
+
344  RowData(ValueType* v, SizeType* c, SizeType& s): mVals(v), mCols(c), mSize(s) {}
+
345  ValueType* mVals; SizeType* mCols; SizeType& mSize;
+
346  };
+
347 
+
348  struct ConstRowData {
+
349  ConstRowData(const ValueType* v, const SizeType* c, const SizeType& s):
+
350  mVals(v), mCols(c), mSize(s) {}
+
351  const ValueType* mVals; const SizeType* mCols; const SizeType& mSize;
+
352  };
+
353 
+
355  template<typename DataType_ = RowData>
+
356  class RowBase
+
357  {
+
358  public:
+
359  typedef DataType_ DataType;
+
360 
+
361  static SizeType capacity() { return STENCIL_SIZE; }
+
362 
+
363  RowBase(const DataType& data): mData(data) {}
+
364 
+
365  bool empty() const { return (mData.mSize == 0); }
+
366  const SizeType& size() const { return mData.mSize; }
+
367 
+
368  const ValueType& getValue(SizeType columnIdx, bool& active) const;
+
369  const ValueType& getValue(SizeType columnIdx) const;
+
370 
+
372  ConstValueIter cbegin() const;
+
373 
+
376  template<typename OtherDataType>
+
377  bool eq(const RowBase<OtherDataType>& other,
+
378  ValueType eps = Tolerance<ValueType>::value()) const;
+
379 
+
383  template<typename VecValueType>
+
384  VecValueType dot(const VecValueType* inVec, SizeType vecSize) const;
+
385 
+
387  template<typename VecValueType>
+
388  VecValueType dot(const Vector<VecValueType>& inVec) const;
+
389 
+
391  std::string str() const;
+
392 
+
393  protected:
+
394  friend class ConstValueIter;
+
395 
+
396  const ValueType& value(SizeType i) const { return mData.mVals[i]; }
+
397  SizeType column(SizeType i) const { return mData.mCols[i]; }
+
398 
+
403  SizeType find(SizeType columnIdx) const;
+
404 
+
405  DataType mData;
+
406  };
+
407 
+
408  typedef RowBase<ConstRowData> ConstRowBase;
+
409 
+
410 public:
+ +
413  {
+
414  public:
+
415  const ValueType& operator*() const
+
416  {
+
417  if (mData.mSize == 0) return SparseStencilMatrix::sZeroValue;
+
418  return mData.mVals[mCursor];
+
419  }
+
420 
+
421  SizeType column() const { return mData.mCols[mCursor]; }
+
422 
+
423  void increment() { mCursor++; }
+
424  ConstValueIter& operator++() { increment(); return *this; }
+
425  operator bool() const { return (mCursor < mData.mSize); }
+
426 
+
427  void reset() { mCursor = 0; }
+
428 
+
429  private:
+
430  friend class SparseStencilMatrix;
+
431  ConstValueIter(const RowData& d): mData(d.mVals, d.mCols, d.mSize), mCursor(0) {}
+
432  ConstValueIter(const ConstRowData& d): mData(d), mCursor(0) {}
+
433 
+
434  const ConstRowData mData;
+
435  SizeType mCursor;
+
436  };
+
437 
+
438 
+
440  class ConstRow: public ConstRowBase
+
441  {
+
442  public:
+
443  ConstRow(const ValueType* valueHead, const SizeType* columnHead, const SizeType& rowSize);
+
444  }; // class ConstRow
+
445 
+
446 
+
448  class RowEditor: public RowBase<>
+
449  {
+
450  public:
+
451  RowEditor(ValueType* valueHead, SizeType* columnHead, SizeType& rowSize, SizeType colSize);
+
452 
+
454  void clear();
+
455 
+
458  SizeType setValue(SizeType column, const ValueType& value);
+
459 
+
461  template<typename Scalar> void scale(const Scalar&);
+
463  template<typename Scalar>
+
464  RowEditor& operator*=(const Scalar& s) { this->scale(s); return *this; }
+
466 
+
467  private:
+
468  const SizeType mNumColumns; // used only for bounds checking
+
469  }; // class RowEditor
+
470 
+
471 private:
+
472  // Functors for use with tbb::parallel_for()
+
473  struct MatrixCopyOp;
+
474  template<typename VecValueType> struct VecMultOp;
+
475  template<typename Scalar> struct RowScaleOp;
+
476 
+
477  // Functors for use with tbb::parallel_reduce()
+
478  struct IsFiniteOp;
+
479  template<typename OtherValueType> struct EqOp;
+
480 
+
481  const SizeType mNumRows;
+
482  boost::scoped_array<ValueType> mValueArray;
+
483  boost::scoped_array<SizeType> mColumnIdxArray;
+
484  boost::scoped_array<SizeType> mRowSizeArray;
+
485 }; // class SparseStencilMatrix
+
486 
+
487 
+
489 
+
490 
+
492 template<typename T>
+
493 class Preconditioner
+
494 {
+
495 public:
+
496  typedef T ValueType;
+
497  typedef boost::shared_ptr<Preconditioner> Ptr;
+
498 
+
499  template<SizeType STENCIL_SIZE> Preconditioner(const SparseStencilMatrix<T, STENCIL_SIZE>&) {}
+
500  virtual ~Preconditioner() {}
+
501 
+
502  virtual bool isValid() const { return true; }
+
503 
+
508  virtual void apply(const Vector<T>& r, Vector<T>& z) = 0;
+
509 };
+
510 
+
511 
+
513 
+
514 
+
515 namespace internal {
+
516 
+
517 // Functor for use with tbb::parallel_for() to copy data from one array to another
+
518 template<typename T>
+
519 struct CopyOp
+
520 {
+
521  CopyOp(const T* from_, T* to_): from(from_), to(to_) {}
+
522 
+
523  void operator()(const SizeRange& range) const {
+
524  for (SizeType n = range.begin(), N = range.end(); n < N; ++n) to[n] = from[n];
+
525  }
+
526 
+
527  const T* from;
+
528  T* to;
+
529 };
+
530 
+
531 
+
532 // Functor for use with tbb::parallel_for() to fill an array with a constant value
+
533 template<typename T>
+
534 struct FillOp
+
535 {
+
536  FillOp(T* data_, const T& val_): data(data_), val(val_) {}
+
537 
+
538  void operator()(const SizeRange& range) const {
+
539  for (SizeType n = range.begin(), N = range.end(); n < N; ++n) data[n] = val;
+
540  }
+
541 
+
542  T* data;
+
543  const T val;
+
544 };
+
545 
+
546 
+
547 // Functor for use with tbb::parallel_for() that computes a * x + y
+
548 template<typename T>
+
549 struct LinearOp
+
550 {
+
551  LinearOp(const T& a_, const T* x_, const T* y_, T* out_): a(a_), x(x_), y(y_), out(out_) {}
+
552 
+
553  void operator()(const SizeRange& range) const {
+
554  if (isExactlyEqual(a, T(1))) {
+
555  for (SizeType n = range.begin(), N = range.end(); n < N; ++n) out[n] = x[n] + y[n];
+
556  } else if (isExactlyEqual(a, T(-1))) {
+
557  for (SizeType n = range.begin(), N = range.end(); n < N; ++n) out[n] = -x[n] + y[n];
+
558  } else {
+
559  for (SizeType n = range.begin(), N = range.end(); n < N; ++n) out[n] = a * x[n] + y[n];
+
560  }
+
561  }
+
562 
+
563  const T a, *x, *y;
+
564  T* out;
+
565 };
+
566 
+
567 } // namespace internal
+
568 
+
569 
+
571 
+
572 
+
573 inline std::ostream&
+
574 operator<<(std::ostream& os, const State& state)
+
575 {
+
576  os << (state.success ? "succeeded with " : "")
+
577  << "rel. err. " << state.relativeError << ", abs. err. " << state.absoluteError
+
578  << " after " << state.iterations << " iteration" << (state.iterations == 1 ? "" : "s");
+
579  return os;
+
580 }
+
581 
+
582 
+
584 
+
585 
+
586 template<typename T>
+
587 inline
+
588 Vector<T>::Vector(const Vector& other): mData(new T[other.mSize]), mSize(other.mSize)
+
589 {
+
590  tbb::parallel_for(SizeRange(0, mSize),
+
591  internal::CopyOp<T>(/*from=*/other.mData, /*to=*/mData));
+
592 }
+
593 
+
594 
+
595 template<typename T>
+
596 inline
+ +
598 {
+
599  // Update the internal storage to the correct size
+
600 
+
601  if (mSize != other.mSize) {
+
602  mSize = other.mSize;
+
603  delete[] mData;
+
604  mData = new T[mSize];
+
605  }
+
606 
+
607  // Deep copy the data
+
608  tbb::parallel_for(SizeRange(0, mSize),
+
609  internal::CopyOp<T>(/*from=*/other.mData, /*to=*/mData));
+
610 
+
611  return *this;
+
612 }
+
613 
+
614 
+
615 template<typename T>
+
616 inline void
+
617 Vector<T>::resize(SizeType n)
+
618 {
+
619  if (n != mSize) {
+
620  if (mData) delete[] mData;
+
621  mData = new T[n];
+
622  mSize = n;
+
623  }
+
624 }
+
625 
+
626 
+
627 template<typename T>
+
628 inline void
+
629 Vector<T>::fill(const ValueType& value)
+
630 {
+
631  tbb::parallel_for(SizeRange(0, mSize), internal::FillOp<T>(mData, value));
+
632 }
+
633 
+
634 
+
635 template<typename T>
+
636 template<typename Scalar>
+
637 struct Vector<T>::ScaleOp
+
638 {
+
639  ScaleOp(T* data_, const Scalar& s_): data(data_), s(s_) {}
+
640 
+
641  void operator()(const SizeRange& range) const {
+
642  for (SizeType n = range.begin(), N = range.end(); n < N; ++n) data[n] *= s;
+
643  }
+
644 
+
645  T* data;
+
646  const Scalar s;
+
647 };
+
648 
+
649 
+
650 template<typename T>
+
651 template<typename Scalar>
+
652 inline void
+
653 Vector<T>::scale(const Scalar& s)
+
654 {
+
655  tbb::parallel_for(SizeRange(0, mSize), ScaleOp<Scalar>(mData, s));
+
656 }
+
657 
+
658 
+
659 template<typename T>
+ +
661 {
+
662  DeterministicDotProductOp(const T* a_, const T* b_,
+
663  const SizeType binCount_, const SizeType arraySize_, T* reducetmp_):
+
664  a(a_), b(b_), binCount(binCount_), arraySize(arraySize_), reducetmp(reducetmp_) {}
+
665 
+
666  void operator()(const SizeRange& range) const
+
667  {
+
668 
+
669  const SizeType binSize = arraySize / binCount;
+
670 
+
671  // Iterate over bins (array segments)
+
672  for (SizeType n = range.begin(), N = range.end(); n < N; ++n) {
+
673  const SizeType begin = n * binSize;
+
674  const SizeType end = (n == binCount-1) ? arraySize : begin + binSize;
+
675 
+
676  // Compute the partial sum for this array segment
+
677  T sum = zeroVal<T>();
+
678  for (SizeType i = begin; i < end; ++i) {
+
679 
+
680  sum += a[i] * b[i];
+
681  }
+
682  // Store the partial sum
+
683  reducetmp[n] = sum;
+
684  }
+
685  }
+
686 
+
687 
+
688  const T* a;
+
689  const T* b;
+
690  const SizeType binCount;
+
691  const SizeType arraySize;
+ +
693 };
+
694 
+
695 template<typename T>
+
696 inline T
+
697 Vector<T>::dot(const Vector<T>& other) const
+
698 {
+
699  assert(this->size() == other.size());
+
700 
+
701  const T* aData = this->data();
+
702  const T* bData = other.data();
+
703 
+
704  SizeType arraySize = this->size();
+
705 
+
706  T result = zeroVal<T>();
+
707 
+
708  if (arraySize < 1024) {
+
709 
+
710  // Compute the dot product in serial for small arrays
+
711 
+
712  for (SizeType n = 0; n < arraySize; ++n) {
+
713  result += aData[n] * bData[n];
+
714  }
+
715 
+
716  } else {
+
717 
+
718  // Compute the dot product by segmenting the arrays into
+
719  // a predetermined number of sub arrays in parallel and
+
720  // accumulate the finial result in series.
+
721 
+
722  const SizeType binCount = 100;
+
723  T partialSums[100];
+
724 
+
725  tbb::parallel_for(SizeRange(0, binCount),
+
726  DeterministicDotProductOp(aData, bData, binCount, arraySize, partialSums));
+
727 
+
728  for (SizeType n = 0; n < binCount; ++n) {
+
729  result += partialSums[n];
+
730  }
+
731  }
+
732 
+
733  return result;
+
734 }
+
735 
+
736 
+
737 template<typename T>
+
738 struct Vector<T>::InfNormOp
+
739 {
+
740  InfNormOp(const T* data_): data(data_) {}
+
741 
+
742  T operator()(const SizeRange& range, T maxValue) const
+
743  {
+
744  for (SizeType n = range.begin(), N = range.end(); n < N; ++n) {
+
745  maxValue = Max(maxValue, Abs(data[n]));
+
746  }
+
747  return maxValue;
+
748  }
+
749 
+
750  static T join(T max1, T max2) { return Max(max1, max2); }
+
751 
+
752  const T* data;
+
753 };
+
754 
+
755 
+
756 template<typename T>
+
757 inline T
+ +
759 {
+
760  // Parallelize over the elements of this vector.
+
761  T result = tbb::parallel_reduce(SizeRange(0, this->size()), /*seed=*/zeroVal<T>(),
+
762  InfNormOp(this->data()), InfNormOp::join);
+
763  return result;
+
764 }
+
765 
+
766 
+
767 template<typename T>
+
768 struct Vector<T>::IsFiniteOp
+
769 {
+
770  IsFiniteOp(const T* data_): data(data_) {}
+
771 
+
772  bool operator()(const SizeRange& range, bool finite) const
+
773  {
+
774  if (finite) {
+
775  for (SizeType n = range.begin(), N = range.end(); n < N; ++n) {
+
776  if (!std::isfinite(data[n])) return false;
+
777  }
+
778  }
+
779  return finite;
+
780  }
+
781 
+
782  static bool join(bool finite1, bool finite2) { return (finite1 && finite2); }
+
783 
+
784  const T* data;
+
785 };
+
786 
+
787 
+
788 template<typename T>
+
789 inline bool
+ +
791 {
+
792  // Parallelize over the elements of this vector.
+
793  bool finite = tbb::parallel_reduce(SizeRange(0, this->size()), /*seed=*/true,
+
794  IsFiniteOp(this->data()), IsFiniteOp::join);
+
795  return finite;
+
796 }
+
797 
+
798 
+
799 template<typename T>
+
800 template<typename OtherValueType>
+
801 struct Vector<T>::EqOp
+
802 {
+
803  EqOp(const T* a_, const OtherValueType* b_, T e): a(a_), b(b_), eps(e) {}
+
804 
+
805  bool operator()(const SizeRange& range, bool equal) const
+
806  {
+
807  if (equal) {
+
808  for (SizeType n = range.begin(), N = range.end(); n < N; ++n) {
+
809  if (!isApproxEqual(a[n], b[n], eps)) return false;
+
810  }
+
811  }
+
812  return equal;
+
813  }
+
814 
+
815  static bool join(bool eq1, bool eq2) { return (eq1 && eq2); }
+
816 
+
817  const T* a;
+
818  const OtherValueType* b;
+
819  const T eps;
+
820 };
+
821 
+
822 
+
823 template<typename T>
+
824 template<typename OtherValueType>
+
825 inline bool
+
826 Vector<T>::eq(const Vector<OtherValueType>& other, ValueType eps) const
+
827 {
+
828  if (this->size() != other.size()) return false;
+
829  bool equal = tbb::parallel_reduce(SizeRange(0, this->size()), /*seed=*/true,
+
830  EqOp<OtherValueType>(this->data(), other.data(), eps), EqOp<OtherValueType>::join);
+
831  return equal;
+
832 }
+
833 
+
834 
+
835 template<typename T>
+
836 inline std::string
+ +
838 {
+
839  std::ostringstream ostr;
+
840  ostr << "[";
+
841  std::string sep;
+
842  for (SizeType n = 0, N = this->size(); n < N; ++n) {
+
843  ostr << sep << (*this)[n];
+
844  sep = ", ";
+
845  }
+
846  ostr << "]";
+
847  return ostr.str();
+
848 }
+
849 
+
850 
+
852 
+
853 
+
854 template<typename ValueType, SizeType STENCIL_SIZE>
+
855 const ValueType SparseStencilMatrix<ValueType, STENCIL_SIZE>::sZeroValue = zeroVal<ValueType>();
+
856 
+
857 
+
858 template<typename ValueType, SizeType STENCIL_SIZE>
+
859 inline
+ +
861  : mNumRows(numRows)
+
862  , mValueArray(new ValueType[mNumRows * STENCIL_SIZE])
+
863  , mColumnIdxArray(new SizeType[mNumRows * STENCIL_SIZE])
+
864  , mRowSizeArray(new SizeType[mNumRows])
+
865 {
+
866  // Initialize the matrix to a null state by setting the size of each row to zero.
+
867  tbb::parallel_for(SizeRange(0, mNumRows),
+
868  internal::FillOp<SizeType>(mRowSizeArray.get(), /*value=*/0));
+
869 }
+
870 
+
871 
+
872 template<typename ValueType, SizeType STENCIL_SIZE>
+
873 struct SparseStencilMatrix<ValueType, STENCIL_SIZE>::MatrixCopyOp
+
874 {
+ +
876  from(&from_), to(&to_) {}
+
877 
+
878  void operator()(const SizeRange& range) const
+
879  {
+
880  const ValueType* fromVal = from->mValueArray.get();
+
881  const SizeType* fromCol = from->mColumnIdxArray.get();
+
882  ValueType* toVal = to->mValueArray.get();
+
883  SizeType* toCol = to->mColumnIdxArray.get();
+
884  for (SizeType n = range.begin(), N = range.end(); n < N; ++n) {
+
885  toVal[n] = fromVal[n];
+
886  toCol[n] = fromCol[n];
+
887  }
+
888  }
+
889 
+ +
891 };
+
892 
+
893 
+
894 template<typename ValueType, SizeType STENCIL_SIZE>
+
895 inline
+ +
897  : mNumRows(other.mNumRows)
+
898  , mValueArray(new ValueType[mNumRows * STENCIL_SIZE])
+
899  , mColumnIdxArray(new SizeType[mNumRows * STENCIL_SIZE])
+
900  , mRowSizeArray(new SizeType[mNumRows])
+
901 {
+
902  SizeType size = mNumRows * STENCIL_SIZE;
+
903 
+
904  // Copy the value and column index arrays from the other matrix to this matrix.
+
905  tbb::parallel_for(SizeRange(0, size), MatrixCopyOp(/*from=*/other, /*to=*/*this));
+
906 
+
907  // Copy the row size array from the other matrix to this matrix.
+
908  tbb::parallel_for(SizeRange(0, mNumRows),
+
909  internal::CopyOp<SizeType>(/*from=*/other.mRowSizeArray.get(), /*to=*/mRowSizeArray.get()));
+
910 }
+
911 
+
912 
+
913 template<typename ValueType, SizeType STENCIL_SIZE>
+
914 inline void
+ +
916  const ValueType& val)
+
917 {
+
918  assert(row < mNumRows);
+
919  this->getRowEditor(row).setValue(col, val);
+
920 }
+
921 
+
922 
+
923 template<typename ValueType, SizeType STENCIL_SIZE>
+
924 inline const ValueType&
+ +
926 {
+
927  assert(row < mNumRows);
+
928  return this->getConstRow(row).getValue(col);
+
929 }
+
930 
+
931 
+
932 template<typename ValueType, SizeType STENCIL_SIZE>
+
933 inline const ValueType&
+ +
935 {
+
936  return this->getValue(row,col);
+
937 }
+
938 
+
939 
+
940 template<typename ValueType, SizeType STENCIL_SIZE>
+
941 template<typename Scalar>
+
942 struct SparseStencilMatrix<ValueType, STENCIL_SIZE>::RowScaleOp
+
943 {
+
944  RowScaleOp(SparseStencilMatrix& m, const Scalar& s_): mat(&m), s(s_) {}
+
945 
+
946  void operator()(const SizeRange& range) const
+
947  {
+
948  for (SizeType n = range.begin(), N = range.end(); n < N; ++n) {
+
949  RowEditor row = mat->getRowEditor(n);
+
950  row.scale(s);
+
951  }
+
952  }
+
953 
+
954  SparseStencilMatrix* mat;
+
955  const Scalar s;
+
956 };
+
957 
+
958 
+
959 template<typename ValueType, SizeType STENCIL_SIZE>
+
960 template<typename Scalar>
+
961 inline void
+ +
963 {
+
964  // Parallelize over the rows in the matrix.
+
965  tbb::parallel_for(SizeRange(0, mNumRows), RowScaleOp<Scalar>(*this, s));
+
966 }
+
967 
+
968 
+
969 template<typename ValueType, SizeType STENCIL_SIZE>
+
970 template<typename VecValueType>
+
971 struct SparseStencilMatrix<ValueType, STENCIL_SIZE>::VecMultOp
+
972 {
+
973  VecMultOp(const SparseStencilMatrix& m, const VecValueType* i, VecValueType* o):
+
974  mat(&m), in(i), out(o) {}
+
975 
+
976  void operator()(const SizeRange& range) const
+
977  {
+
978  for (SizeType n = range.begin(), N = range.end(); n < N; ++n) {
+
979  ConstRow row = mat->getConstRow(n);
+
980  out[n] = row.dot(in, mat->numRows());
+
981  }
+
982  }
+
983 
+
984  const SparseStencilMatrix* mat;
+
985  const VecValueType* in;
+
986  VecValueType* out;
+
987 };
+
988 
+
989 
+
990 template<typename ValueType, SizeType STENCIL_SIZE>
+
991 template<typename VecValueType>
+
992 inline void
+ +
994  const Vector<VecValueType>& inVec, Vector<VecValueType>& resultVec) const
+
995 {
+
996  if (inVec.size() != mNumRows) {
+
997  OPENVDB_THROW(ArithmeticError, "matrix and input vector have incompatible sizes ("
+
998  << mNumRows << "x" << mNumRows << " vs. " << inVec.size() << ")");
+
999  }
+
1000  if (resultVec.size() != mNumRows) {
+
1001  OPENVDB_THROW(ArithmeticError, "matrix and result vector have incompatible sizes ("
+
1002  << mNumRows << "x" << mNumRows << " vs. " << resultVec.size() << ")");
+
1003  }
+
1004 
+
1005  vectorMultiply(inVec.data(), resultVec.data());
+
1006 }
+
1007 
+
1008 
+
1009 template<typename ValueType, SizeType STENCIL_SIZE>
+
1010 template<typename VecValueType>
+
1011 inline void
+ +
1013  const VecValueType* inVec, VecValueType* resultVec) const
+
1014 {
+
1015  // Parallelize over the rows in the matrix.
+
1016  tbb::parallel_for(SizeRange(0, mNumRows),
+
1017  VecMultOp<VecValueType>(*this, inVec, resultVec));
+
1018 }
+
1019 
+
1020 
+
1021 template<typename ValueType, SizeType STENCIL_SIZE>
+
1022 template<typename OtherValueType>
+
1023 struct SparseStencilMatrix<ValueType, STENCIL_SIZE>::EqOp
+
1024 {
+
1025  EqOp(const SparseStencilMatrix& a_,
+
1026  const SparseStencilMatrix<OtherValueType, STENCIL_SIZE>& b_, ValueType e):
+
1027  a(&a_), b(&b_), eps(e) {}
+
1028 
+
1029  bool operator()(const SizeRange& range, bool equal) const
+
1030  {
+
1031  if (equal) {
+
1032  for (SizeType n = range.begin(), N = range.end(); n < N; ++n) {
+
1033  if (!a->getConstRow(n).eq(b->getConstRow(n), eps)) return false;
+
1034  }
+
1035  }
+
1036  return equal;
+
1037  }
+
1038 
+
1039  static bool join(bool eq1, bool eq2) { return (eq1 && eq2); }
+
1040 
+
1041  const SparseStencilMatrix* a;
+
1042  const SparseStencilMatrix<OtherValueType, STENCIL_SIZE>* b;
+
1043  const ValueType eps;
+
1044 };
+
1045 
+
1046 
+
1047 template<typename ValueType, SizeType STENCIL_SIZE>
+
1048 template<typename OtherValueType>
+
1049 inline bool
+ +
1051  const SparseStencilMatrix<OtherValueType, STENCIL_SIZE>& other, ValueType eps) const
+
1052 {
+
1053  if (this->numRows() != other.numRows()) return false;
+
1054  bool equal = tbb::parallel_reduce(SizeRange(0, this->numRows()), /*seed=*/true,
+
1055  EqOp<OtherValueType>(*this, other, eps), EqOp<OtherValueType>::join);
+
1056  return equal;
+
1057 }
+
1058 
+
1059 
+
1060 template<typename ValueType, SizeType STENCIL_SIZE>
+
1061 struct SparseStencilMatrix<ValueType, STENCIL_SIZE>::IsFiniteOp
+
1062 {
+
1063  IsFiniteOp(const SparseStencilMatrix& m): mat(&m) {}
+
1064 
+
1065  bool operator()(const SizeRange& range, bool finite) const
+
1066  {
+
1067  if (finite) {
+
1068  for (SizeType n = range.begin(), N = range.end(); n < N; ++n) {
+
1069  const ConstRow row = mat->getConstRow(n);
+
1070  for (ConstValueIter it = row.cbegin(); it; ++it) {
+
1071  if (!std::isfinite(*it)) return false;
+
1072  }
+
1073  }
+
1074  }
+
1075  return finite;
+
1076  }
+
1077 
+
1078  static bool join(bool finite1, bool finite2) { return (finite1 && finite2); }
+
1079 
+ +
1081 };
+
1082 
+
1083 
+
1084 template<typename ValueType, SizeType STENCIL_SIZE>
+
1085 inline bool
+ +
1087 {
+
1088  // Parallelize over the rows of this matrix.
+
1089  bool finite = tbb::parallel_reduce(SizeRange(0, this->numRows()), /*seed=*/true,
+
1090  IsFiniteOp(*this), IsFiniteOp::join);
+
1091  return finite;
+
1092 }
+
1093 
+
1094 
+
1095 template<typename ValueType, SizeType STENCIL_SIZE>
+
1096 inline std::string
+ +
1098 {
+
1099  std::ostringstream ostr;
+
1100  for (SizeType n = 0, N = this->size(); n < N; ++n) {
+
1101  ostr << n << ": " << this->getConstRow(n).str() << "\n";
+
1102  }
+
1103  return ostr.str();
+
1104 }
+
1105 
+
1106 
+
1107 template<typename ValueType, SizeType STENCIL_SIZE>
+ + +
1110 {
+
1111  assert(i < mNumRows);
+
1112  const SizeType head = i * STENCIL_SIZE;
+
1113  return RowEditor(&mValueArray[head], &mColumnIdxArray[head], mRowSizeArray[i], mNumRows);
+
1114 }
+
1115 
+
1116 
+
1117 template<typename ValueType, SizeType STENCIL_SIZE>
+ + +
1120 {
+
1121  assert(i < mNumRows);
+
1122  const SizeType head = i * STENCIL_SIZE; // index for this row into main storage
+
1123  return ConstRow(&mValueArray[head], &mColumnIdxArray[head], mRowSizeArray[i]);
+
1124 }
+
1125 
+
1126 
+
1127 template<typename ValueType, SizeType STENCIL_SIZE>
+
1128 template<typename DataType>
+
1129 inline SizeType
+ +
1131 {
+
1132  if (this->empty()) return mData.mSize;
+
1133 
+
1134  // Get a pointer to the first column index that is equal to or greater than the given index.
+
1135  // (This assumes that the data is sorted by column.)
+
1136  const SizeType* colPtr = std::lower_bound(mData.mCols, mData.mCols + mData.mSize, columnIdx);
+
1137  // Return the offset of the pointer from the beginning of the array.
+
1138  return static_cast<SizeType>(colPtr - mData.mCols);
+
1139 }
+
1140 
+
1141 
+
1142 template<typename ValueType, SizeType STENCIL_SIZE>
+
1143 template<typename DataType>
+
1144 inline const ValueType&
+ +
1146  SizeType columnIdx, bool& active) const
+
1147 {
+
1148  active = false;
+
1149  SizeType idx = this->find(columnIdx);
+
1150  if (idx < this->size() && this->column(idx) == columnIdx) {
+
1151  active = true;
+
1152  return this->value(idx);
+
1153  }
+ +
1155 }
+
1156 
+
1157 template<typename ValueType, SizeType STENCIL_SIZE>
+
1158 template<typename DataType>
+
1159 inline const ValueType&
+ +
1161 {
+
1162  SizeType idx = this->find(columnIdx);
+
1163  if (idx < this->size() && this->column(idx) == columnIdx) {
+
1164  return this->value(idx);
+
1165  }
+ +
1167 }
+
1168 
+
1169 
+
1170 template<typename ValueType, SizeType STENCIL_SIZE>
+
1171 template<typename DataType>
+
1172 inline typename SparseStencilMatrix<ValueType, STENCIL_SIZE>::ConstValueIter
+
1173 SparseStencilMatrix<ValueType, STENCIL_SIZE>::RowBase<DataType>::cbegin() const
+
1174 {
+
1175  return ConstValueIter(mData);
+
1176 }
+
1177 
+
1178 
+
1179 template<typename ValueType, SizeType STENCIL_SIZE>
+
1180 template<typename DataType>
+
1181 template<typename OtherDataType>
+
1182 inline bool
+ +
1184  const RowBase<OtherDataType>& other, ValueType eps) const
+
1185 {
+
1186  if (this->size() != other.size()) return false;
+
1187  for (ConstValueIter it = cbegin(), oit = other.cbegin(); it || oit; ++it, ++oit) {
+
1188  if (it.column() != oit.column()) return false;
+
1189  if (!isApproxEqual(*it, *oit, eps)) return false;
+
1190  }
+
1191  return true;
+
1192 }
+
1193 
+
1194 
+
1195 template<typename ValueType, SizeType STENCIL_SIZE>
+
1196 template<typename DataType>
+
1197 template<typename VecValueType>
+
1198 inline VecValueType
+
1199 SparseStencilMatrix<ValueType, STENCIL_SIZE>::RowBase<DataType>::dot(
+
1200  const VecValueType* inVec, SizeType vecSize) const
+
1201 {
+
1202  VecValueType result = zeroVal<VecValueType>();
+
1203  for (SizeType idx = 0, N = std::min(vecSize, this->size()); idx < N; ++idx) {
+
1204  result += static_cast<VecValueType>(this->value(idx) * inVec[this->column(idx)]);
+
1205  }
+
1206  return result;
+
1207 }
+
1208 
+
1209 template<typename ValueType, SizeType STENCIL_SIZE>
+
1210 template<typename DataType>
+
1211 template<typename VecValueType>
+
1212 inline VecValueType
+
1213 SparseStencilMatrix<ValueType, STENCIL_SIZE>::RowBase<DataType>::dot(
+
1214  const Vector<VecValueType>& inVec) const
+
1215 {
+
1216  return dot(inVec.data(), inVec.size());
+
1217 }
+
1218 
+
1219 
+
1220 template<typename ValueType, SizeType STENCIL_SIZE>
+
1221 template<typename DataType>
+
1222 inline std::string
+ +
1224 {
+
1225  std::ostringstream ostr;
+
1226  std::string sep;
+
1227  for (SizeType n = 0, N = this->size(); n < N; ++n) {
+
1228  ostr << sep << "(" << this->column(n) << ", " << this->value(n) << ")";
+
1229  sep = ", ";
+
1230  }
+
1231  return ostr.str();
+
1232 }
+
1233 
+
1234 
+
1235 template<typename ValueType, SizeType STENCIL_SIZE>
+
1236 inline
+ +
1238  const ValueType* valueHead, const SizeType* columnHead, const SizeType& rowSize):
+
1239  ConstRowBase(ConstRowData(const_cast<ValueType*>(valueHead),
+
1240  const_cast<SizeType*>(columnHead), const_cast<SizeType&>(rowSize)))
+
1241 {
+
1242 }
+
1243 
+
1244 
+
1245 template<typename ValueType, SizeType STENCIL_SIZE>
+
1246 inline
+ +
1248  ValueType* valueHead, SizeType* columnHead, SizeType& rowSize, SizeType colSize):
+
1249  RowBase<>(RowData(valueHead, columnHead, rowSize)), mNumColumns(colSize)
+
1250 {
+
1251 }
+
1252 
+
1253 
+
1254 template<typename ValueType, SizeType STENCIL_SIZE>
+
1255 inline void
+ +
1257 {
+
1258  // Note: since mSize is a reference, this modifies the underlying matrix.
+
1259  RowBase<>::mData.mSize = 0;
+
1260 }
+
1261 
+
1262 
+
1263 template<typename ValueType, SizeType STENCIL_SIZE>
+
1264 inline SizeType
+ +
1266  SizeType column, const ValueType& value)
+
1267 {
+
1268  assert(column < mNumColumns);
+
1269 
+
1270  RowData& data = RowBase<>::mData;
+
1271 
+
1272  // Get the offset of the first column index that is equal to or greater than
+
1273  // the column to be modified.
+
1274  SizeType offset = this->find(column);
+
1275 
+
1276  if (offset < data.mSize && data.mCols[offset] == column) {
+
1277  // If the column already exists, just update its value.
+
1278  data.mVals[offset] = value;
+
1279  return data.mSize;
+
1280  }
+
1281 
+
1282  // Check that it is safe to add a new column.
+
1283  assert(data.mSize < this->capacity());
+
1284 
+
1285  if (offset >= data.mSize) {
+
1286  // The new column's index is larger than any existing index. Append the new column.
+
1287  data.mVals[data.mSize] = value;
+
1288  data.mCols[data.mSize] = column;
+
1289  } else {
+
1290  // Insert the new column at the computed offset after shifting subsequent columns.
+
1291  for (SizeType i = data.mSize; i > offset; --i) {
+
1292  data.mVals[i] = data.mVals[i - 1];
+
1293  data.mCols[i] = data.mCols[i - 1];
+
1294  }
+
1295  data.mVals[offset] = value;
+
1296  data.mCols[offset] = column;
+
1297  }
+
1298  ++data.mSize;
+
1299 
+
1300  return data.mSize;
+
1301 }
+
1302 
+
1303 
+
1304 template<typename ValueType, SizeType STENCIL_SIZE>
+
1305 template<typename Scalar>
+
1306 inline void
+ +
1308 {
+
1309  for (int idx = 0, N = this->size(); idx < N; ++idx) {
+
1310  RowBase<>::mData.mVals[idx] *= s;
+
1311  }
+
1312 }
+
1313 
+
1314 
+
1316 
+
1317 
+
1319 template<typename MatrixType>
+
1320 class JacobiPreconditioner: public Preconditioner<typename MatrixType::ValueType>
+
1321 {
+
1322 private:
+
1323  struct InitOp;
+
1324  struct ApplyOp;
+
1325 
+
1326 public:
+
1327  typedef typename MatrixType::ValueType ValueType;
+ + +
1330  typedef boost::shared_ptr<JacobiPreconditioner> Ptr;
+
1331 
+
1332  JacobiPreconditioner(const MatrixType& A): BaseType(A), mDiag(A.numRows())
+
1333  {
+
1334  // Initialize vector mDiag with the values from the matrix diagonal.
+
1335  tbb::parallel_for(SizeRange(0, A.numRows()), InitOp(A, mDiag.data()));
+
1336  }
+
1337 
+ +
1339 
+
1340  virtual void apply(const Vector<ValueType>& r, Vector<ValueType>& z)
+
1341  {
+
1342  const SizeType size = mDiag.size();
+
1343 
+
1344  assert(r.size() == z.size());
+
1345  assert(r.size() == size);
+
1346 
+
1347  tbb::parallel_for(SizeRange(0, size), ApplyOp(mDiag.data(), r.data(), z.data()));
+
1348  }
+
1349 
+
1351  bool isFinite() const { return mDiag.isFinite(); }
+
1352 
+
1353 private:
+
1354  // Functor for use with tbb::parallel_for()
+
1355  struct InitOp
+
1356  {
+
1357  InitOp(const MatrixType& m, ValueType* v): mat(&m), vec(v) {}
+
1358  void operator()(const SizeRange& range) const {
+
1359  for (SizeType n = range.begin(), N = range.end(); n < N; ++n) {
+
1360  const ValueType val = mat->getValue(n, n);
+
1361  assert(!isApproxZero(val, ValueType(0.0001)));
+
1362  vec[n] = static_cast<ValueType>(1.0 / val);
+
1363  }
+
1364  }
+
1365  const MatrixType* mat; ValueType* vec;
+
1366  };
+
1367 
+
1368  // Functor for use with tbb::parallel_reduce()
+
1369  struct ApplyOp
+
1370  {
+
1371  ApplyOp(const ValueType* x_, const ValueType* y_, ValueType* out_):
+
1372  x(x_), y(y_), out(out_) {}
+
1373  void operator()(const SizeRange& range) const {
+
1374  for (SizeType n = range.begin(), N = range.end(); n < N; ++n) out[n] = x[n] * y[n];
+
1375  }
+
1376  const ValueType *x, *y; ValueType* out;
+
1377  };
+
1378 
+
1379  // The Jacobi preconditioner is a diagonal matrix
+
1380  VectorType mDiag;
+
1381 }; // class JacobiPreconditioner
+
1382 
+
1383 
+
1385 template<typename MatrixType>
+
1386 class IncompleteCholeskyPreconditioner: public Preconditioner<typename MatrixType::ValueType>
+
1387 {
+
1388 private:
+
1389  struct CopyToLowerOp;
+
1390  struct TransposeOp;
+
1391 
+
1392 public:
+
1393  typedef typename MatrixType::ValueType ValueType;
+ + +
1396  typedef boost::shared_ptr<IncompleteCholeskyPreconditioner> Ptr;
+ +
1398  typedef typename TriangularMatrix::ConstRow TriangleConstRow;
+
1399  typedef typename TriangularMatrix::RowEditor TriangleRowEditor;
+
1400 
+
1401  IncompleteCholeskyPreconditioner(const MatrixType& matrix)
+
1402  : BaseType(matrix)
+
1403  , mLowerTriangular(matrix.numRows())
+
1404  , mUpperTriangular(matrix.numRows())
+
1405  , mTempVec(matrix.numRows())
+
1406  {
+
1407  // Size of matrix
+
1408  const SizeType numRows = mLowerTriangular.numRows();
+
1409 
+
1410  // Copy the upper triangular part to the lower triangular part.
+
1411  tbb::parallel_for(SizeRange(0, numRows), CopyToLowerOp(matrix, mLowerTriangular));
+
1412 
+
1413  // Build the Incomplete Cholesky Matrix
+
1414  //
+
1415  // Algorithm:
+
1416  //
+
1417  // for (k = 0; k < size; ++k) {
+
1418  // A(k,k) = sqrt(A(k,k));
+
1419  // for (i = k +1, i < size; ++i) {
+
1420  // if (A(i,k) == 0) continue;
+
1421  // A(i,k) = A(i,k) / A(k,k);
+
1422  // }
+
1423  // for (j = k+1; j < size; ++j) {
+
1424  // for (i = j; i < size; ++i) {
+
1425  // if (A(i,j) == 0) continue;
+
1426  // A(i,j) -= A(i,k)*A(j,k);
+
1427  // }
+
1428  // }
+
1429  // }
+
1430 
+
1431  mPassedCompatibilityCondition = true;
+
1432 
+
1433  for (SizeType k = 0; k < numRows; ++k) {
+
1434 
+
1435  TriangleConstRow crow_k = mLowerTriangular.getConstRow(k);
+
1436  ValueType diagonalValue = crow_k.getValue(k);
+
1437 
+
1438  // Test if the matrix build has failed.
+
1439  if (diagonalValue < 1.e-5) {
+
1440  mPassedCompatibilityCondition = false;
+
1441  break;
+
1442  }
+
1443 
+
1444  diagonalValue = Sqrt(diagonalValue);
+
1445 
+
1446  TriangleRowEditor row_k = mLowerTriangular.getRowEditor(k);
+
1447  row_k.setValue(k, diagonalValue);
+
1448 
+
1449  // Exploit the fact that the matrix is symmetric.
+
1450  typename MatrixType::ConstRow srcRow = matrix.getConstRow(k);
+
1451  typename MatrixType::ConstValueIter citer = srcRow.cbegin();
+
1452  for ( ; citer; ++citer) {
+
1453  SizeType ii = citer.column();
+
1454  if (ii < k+1) continue; // look above diagonal
+
1455 
+
1456  TriangleRowEditor row_ii = mLowerTriangular.getRowEditor(ii);
+
1457 
+
1458  row_ii.setValue(k, *citer / diagonalValue);
+
1459  }
+
1460 
+
1461  // for (j = k+1; j < size; ++j) replaced by row iter below
+
1462  citer.reset(); // k,j entries
+
1463  for ( ; citer; ++citer) {
+
1464  SizeType j = citer.column();
+
1465  if (j < k+1) continue;
+
1466 
+
1467  TriangleConstRow row_j = mLowerTriangular.getConstRow(j);
+
1468  ValueType a_jk = row_j.getValue(k); // a_jk is non zero if a_kj is non zero
+
1469 
+
1470  // Entry (i,j) is non-zero if matrix(j,i) is nonzero
+
1471 
+
1472  typename MatrixType::ConstRow mask = matrix.getConstRow(j);
+
1473  typename MatrixType::ConstValueIter maskIter = mask.cbegin();
+
1474  for ( ; maskIter; ++maskIter) {
+
1475  SizeType i = maskIter.column();
+
1476  if (i < j) continue;
+
1477 
+
1478  TriangleConstRow crow_i = mLowerTriangular.getConstRow(i);
+
1479  ValueType a_ij = crow_i.getValue(j);
+
1480  ValueType a_ik = crow_i.getValue(k);
+
1481  TriangleRowEditor row_i = mLowerTriangular.getRowEditor(i);
+
1482  a_ij -= a_ik * a_jk;
+
1483 
+
1484  row_i.setValue(j, a_ij);
+
1485  }
+
1486  }
+
1487  }
+
1488 
+
1489  // Build the transpose of the IC matrix: mUpperTriangular
+
1490  tbb::parallel_for(SizeRange(0, numRows),
+
1491  TransposeOp(matrix, mLowerTriangular, mUpperTriangular));
+
1492  }
+
1493 
+ +
1495 
+
1496  virtual bool isValid() const { return mPassedCompatibilityCondition; }
+
1497 
+
1498  virtual void apply(const Vector<ValueType>& rVec, Vector<ValueType>& zVec)
+
1499  {
+
1500  if (!mPassedCompatibilityCondition) {
+
1501  OPENVDB_THROW(ArithmeticError, "invalid Cholesky decomposition");
+
1502  }
+
1503 
+
1504  // Solve mUpperTriangular * mLowerTriangular * rVec = zVec;
+
1505 
+
1506  SizeType size = mLowerTriangular.numRows();
+
1507 
+
1508  zVec.fill(zeroVal<ValueType>());
+
1509  ValueType* zData = zVec.data();
+
1510 
+
1511  if (size == 0) return;
+
1512 
+
1513  assert(rVec.size() == size);
+
1514  assert(zVec.size() == size);
+
1515 
+
1516  // Allocate a temp vector
+
1517  mTempVec.fill(zeroVal<ValueType>());
+
1518  ValueType* tmpData = mTempVec.data();
+
1519  const ValueType* rData = rVec.data();
+
1520 
+
1521  // Solve mLowerTriangular * tmp = rVec;
+
1522  for (SizeType i = 0; i < size; ++i) {
+
1523  typename TriangularMatrix::ConstRow row = mLowerTriangular.getConstRow(i);
+
1524  ValueType diagonal = row.getValue(i);
+
1525  ValueType dot = row.dot(mTempVec);
+
1526  tmpData[i] = (rData[i] - dot) / diagonal;
+
1527  if (!std::isfinite(tmpData[i])) {
+
1528  OPENVDB_LOG_DEBUG_RUNTIME("1 diagonal was " << diagonal);
+
1529  OPENVDB_LOG_DEBUG_RUNTIME("1a diagonal " << row.getValue(i));
+
1530  }
+
1531  }
+
1532 
+
1533  // Solve mUpperTriangular * zVec = tmp;
+
1534  for (SizeType ii = 0; ii < size; ++ii) {
+
1535  SizeType i = size - 1 - ii;
+
1536  typename TriangularMatrix::ConstRow row = mUpperTriangular.getConstRow(i);
+
1537  ValueType diagonal = row.getValue(i);
+
1538  ValueType dot = row.dot(zVec);
+
1539  zData[i] = (tmpData[i] - dot) / diagonal;
+
1540  if (!std::isfinite(zData[i])) {
+
1541  OPENVDB_LOG_DEBUG_RUNTIME("2 diagonal was " << diagonal);
+
1542  }
+
1543  }
+
1544  }
+
1545 
+
1546  const TriangularMatrix& lowerMatrix() const { return mLowerTriangular; }
+
1547  const TriangularMatrix& upperMatrix() const { return mUpperTriangular; }
+
1548 
+
1549 private:
+
1550  // Functor for use with tbb::parallel_for()
+
1551  struct CopyToLowerOp
+
1552  {
+
1553  CopyToLowerOp(const MatrixType& m, TriangularMatrix& l): mat(&m), lower(&l) {}
+
1554  void operator()(const SizeRange& range) const {
+
1555  for (SizeType n = range.begin(), N = range.end(); n < N; ++n) {
+
1556  typename TriangularMatrix::RowEditor outRow = lower->getRowEditor(n);
+
1557  outRow.clear();
+
1558  typename MatrixType::ConstRow inRow = mat->getConstRow(n);
+
1559  for (typename MatrixType::ConstValueIter it = inRow.cbegin(); it; ++it) {
+
1560  if (it.column() > n) continue; // skip above diagonal
+
1561  outRow.setValue(it.column(), *it);
+
1562  }
+
1563  }
+
1564  }
+
1565  const MatrixType* mat; TriangularMatrix* lower;
+
1566  };
+
1567 
+
1568  // Functor for use with tbb::parallel_for()
+
1569  struct TransposeOp
+
1570  {
+
1571  TransposeOp(const MatrixType& m, const TriangularMatrix& l, TriangularMatrix& u):
+
1572  mat(&m), lower(&l), upper(&u) {}
+
1573  void operator()(const SizeRange& range) const {
+
1574  for (SizeType n = range.begin(), N = range.end(); n < N; ++n) {
+
1575  typename TriangularMatrix::RowEditor outRow = upper->getRowEditor(n);
+
1576  outRow.clear();
+
1577  // Use the fact that matrix is symmetric.
+
1578  typename MatrixType::ConstRow inRow = mat->getConstRow(n);
+
1579  for (typename MatrixType::ConstValueIter it = inRow.cbegin(); it; ++it) {
+
1580  const SizeType column = it.column();
+
1581  if (column < n) continue; // only set upper triangle
+
1582  outRow.setValue(column, lower->getValue(column, n));
+
1583  }
+
1584  }
+
1585  }
+
1586  const MatrixType* mat; const TriangularMatrix* lower; TriangularMatrix* upper;
+
1587  };
+
1588 
+
1589  TriangularMatrix mLowerTriangular;
+
1590  TriangularMatrix mUpperTriangular;
+
1591  Vector<ValueType> mTempVec;
+
1592  bool mPassedCompatibilityCondition;
+
1593 }; // class IncompleteCholeskyPreconditioner
+
1594 
+
1595 
+
1597 
+
1598 
+
1599 namespace internal {
+
1600 
+
1602 template<typename T>
+
1603 inline void
+
1604 axpy(const T& a, const T* xVec, const T* yVec, T* resultVec, SizeType size)
+
1605 {
+
1606  tbb::parallel_for(SizeRange(0, size), LinearOp<T>(a, xVec, yVec, resultVec));
+
1607 }
+
1608 
+
1610 template<typename T>
+
1611 inline void
+
1612 axpy(const T& a, const Vector<T>& xVec, const Vector<T>& yVec, Vector<T>& result)
+
1613 {
+
1614  assert(xVec.size() == yVec.size());
+
1615  assert(xVec.size() == result.size());
+
1616  axpy(a, xVec.data(), yVec.data(), result.data(), xVec.size());
+
1617 }
+
1618 
+
1619 
+
1621 template<typename MatrixOperator, typename VecValueType>
+
1622 inline void
+
1623 computeResidual(const MatrixOperator& A, const VecValueType* x,
+
1624  const VecValueType* b, VecValueType* r)
+
1625 {
+
1626  // Compute r = A * x.
+
1627  A.vectorMultiply(x, r);
+
1628  // Compute r = b - r.
+
1629  tbb::parallel_for(SizeRange(0, A.numRows()), LinearOp<VecValueType>(-1.0, r, b, r));
+
1630 }
+
1631 
+
1633 template<typename MatrixOperator, typename T>
+
1634 inline void
+
1635 computeResidual(const MatrixOperator& A, const Vector<T>& x, const Vector<T>& b, Vector<T>& r)
+
1636 {
+
1637  assert(x.size() == b.size());
+
1638  assert(x.size() == r.size());
+
1639  assert(x.size() == A.numRows());
+
1640 
+
1641  computeResidual(A, x.data(), b.data(), r.data());
+
1642 }
+
1643 
+
1644 } // namespace internal
+
1645 
+
1646 
+
1648 
+
1649 
+
1650 template<typename PositiveDefMatrix>
+
1651 inline State
+ +
1653  const PositiveDefMatrix& Amat,
+ + + +
1657  const State& termination)
+
1658 {
+
1659  util::NullInterrupter interrupter;
+
1660  return solve(Amat, bVec, xVec, precond, interrupter, termination);
+
1661 }
+
1662 
+
1663 
+
1664 template<typename PositiveDefMatrix, typename Interrupter>
+
1665 inline State
+ +
1667  const PositiveDefMatrix& Amat,
+ + + +
1671  Interrupter& interrupter,
+
1672  const State& termination)
+
1673 {
+
1674  typedef typename PositiveDefMatrix::ValueType ValueType;
+
1675  typedef Vector<ValueType> VectorType;
+
1676 
+
1677  State result;
+
1678  result.success = false;
+
1679  result.iterations = 0;
+
1680  result.relativeError = 0.0;
+
1681  result.absoluteError = 0.0;
+
1682 
+
1683  const SizeType size = Amat.numRows();
+
1684  if (size == 0) {
+
1685  OPENVDB_LOG_WARN("pcg::solve(): matrix has dimension zero");
+
1686  return result;
+
1687  }
+
1688  if (size != bVec.size()) {
+
1689  OPENVDB_THROW(ArithmeticError, "A and b have incompatible sizes"
+
1690  << size << "x" << size << " vs. " << bVec.size() << ")");
+
1691  }
+
1692  if (size != xVec.size()) {
+
1693  OPENVDB_THROW(ArithmeticError, "A and x have incompatible sizes"
+
1694  << size << "x" << size << " vs. " << xVec.size() << ")");
+
1695  }
+
1696 
+
1697  // Temp vectors
+
1698  VectorType zVec(size); // transformed residual (M^-1 r)
+
1699  VectorType pVec(size); // search direction
+
1700  VectorType qVec(size); // A * p
+
1701 
+
1702  // Compute norm of B (the source)
+
1703  const ValueType tmp = bVec.infNorm();
+
1704  const ValueType infNormOfB = isZero(tmp) ? 1.f : tmp;
+
1705 
+
1706  // Compute rVec: residual = b - Ax.
+
1707  VectorType rVec(size); // vector of residuals
+
1708 
+
1709  internal::computeResidual(Amat, xVec, bVec, rVec);
+
1710 
+
1711  assert(rVec.isFinite());
+
1712 
+
1713  // Normalize the residual norm with the source norm and look for early out.
+
1714  result.absoluteError = static_cast<double>(rVec.infNorm());
+
1715  result.relativeError = static_cast<double>(result.absoluteError / infNormOfB);
+
1716  if (result.relativeError <= termination.relativeError) {
+
1717  result.success = true;
+
1718  return result;
+
1719  }
+
1720 
+
1721  // Iterations of the CG solve
+
1722 
+
1723  ValueType rDotZPrev(1); // inner product of <z,r>
+
1724 
+
1725  // Keep track of the minimum error to monitor convergence.
+
1726  ValueType minL2Error = std::numeric_limits<ValueType>::max();
+
1727  ValueType l2Error;
+
1728 
+
1729  int iteration = 0;
+
1730  for ( ; iteration < termination.iterations; ++iteration) {
+
1731 
+
1732  if (interrupter.wasInterrupted()) {
+
1733  OPENVDB_THROW(RuntimeError, "conjugate gradient solver was interrupted");
+
1734  }
+
1735 
+
1736  OPENVDB_LOG_DEBUG_RUNTIME("pcg::solve() " << result);
+
1737 
+
1738  result.iterations = iteration + 1;
+
1739 
+
1740  // Apply preconditioner to residual
+
1741  // z_{k} = M^-1 r_{k}
+
1742  precond.apply(rVec, zVec);
+
1743 
+
1744  // <r,z>
+
1745  const ValueType rDotZ = rVec.dot(zVec);
+
1746  assert(std::isfinite(rDotZ));
+
1747 
+
1748  if (0 == iteration) {
+
1749  // Initialize
+
1750  pVec = zVec;
+
1751  } else {
+
1752  const ValueType beta = rDotZ / rDotZPrev;
+
1753  // p = beta * p + z
+
1754  internal::axpy(beta, pVec, zVec, /*result */pVec);
+
1755  }
+
1756 
+
1757  // q_{k} = A p_{k}
+
1758  Amat.vectorMultiply(pVec, qVec);
+
1759 
+
1760  // alpha = <r_{k-1}, z_{k-1}> / <p_{k},q_{k}>
+
1761  const ValueType pAp = pVec.dot(qVec);
+
1762  assert(std::isfinite(pAp));
+
1763 
+
1764  const ValueType alpha = rDotZ / pAp;
+
1765  rDotZPrev = rDotZ;
+
1766 
+
1767  // x_{k} = x_{k-1} + alpha * p_{k}
+
1768  internal::axpy(alpha, pVec, xVec, /*result=*/xVec);
+
1769 
+
1770  // r_{k} = r_{k-1} - alpha_{k-1} A p_{k}
+
1771  internal::axpy(-alpha, qVec, rVec, /*result=*/rVec);
+
1772 
+
1773  // update tolerances
+
1774  l2Error = rVec.l2Norm();
+
1775  minL2Error = Min(l2Error, minL2Error);
+
1776 
+
1777  result.absoluteError = static_cast<double>(rVec.infNorm());
+
1778  result.relativeError = static_cast<double>(result.absoluteError / infNormOfB);
+
1779 
+
1780  if (l2Error > 2 * minL2Error) {
+
1781  // The solution started to diverge.
+
1782  result.success = false;
+
1783  break;
+
1784  }
+
1785  if (!std::isfinite(result.absoluteError)) {
+
1786  // Total divergence of solution
+
1787  result.success = false;
+
1788  break;
+
1789  }
+
1790  if (result.absoluteError <= termination.absoluteError) {
+
1791  // Convergence
+
1792  result.success = true;
+
1793  break;
+
1794  }
+
1795  if (result.relativeError <= termination.relativeError) {
+
1796  // Convergence
+
1797  result.success = true;
+
1798  break;
+
1799  }
+
1800  }
+
1801  OPENVDB_LOG_DEBUG_RUNTIME("pcg::solve() " << result);
+
1802 
+
1803  return result;
+
1804 }
+
1805 
+
1806 } // namespace pcg
+
1807 } // namespace math
+
1808 } // namespace OPENVDB_VERSION_NAME
+
1809 } // namespace openvdb
+
1810 
+
1811 #endif // OPENVDB_MATH_CONJGRADIENT_HAS_BEEN_INCLUDED
+
1812 
+
1814 //
+
1815 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
1816 //
+
1817 // All rights reserved. This software is distributed under the
+
1818 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
1819 //
+
1820 // Redistributions of source code must retain the above copyright
+
1821 // and license notice and the following restrictions and disclaimer.
+
1822 //
+
1823 // * Neither the name of DreamWorks Animation nor the names of
+
1824 // its contributors may be used to endorse or promote products derived
+
1825 // from this software without specific prior written permission.
+
1826 //
+
1827 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
1828 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
1829 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
1830 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
1831 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
1832 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
1833 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
1834 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
1835 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
1836 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
1837 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
1838 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
1839 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
1840 //
+
virtual void apply(const Vector< ValueType > &r, Vector< ValueType > &z)
Apply this preconditioner to a residue vector: z = M−1r
Definition: ConjGradient.h:1340
+
const T val
Definition: ConjGradient.h:543
+
Vector(SizeType n, const ValueType &val)
Construct a vector of n elements and initialize each element to the given value.
Definition: ConjGradient.h:177
+
boost::shared_ptr< Preconditioner > Ptr
Definition: ConjGradient.h:497
+
const ValueType & operator*() const
Definition: ConjGradient.h:415
+
boost::shared_ptr< SparseStencilMatrix > Ptr
Definition: ConjGradient.h:271
+
virtual void apply(const Vector< ValueType > &rVec, Vector< ValueType > &zVec)
Apply this preconditioner to a residue vector: z = M−1r
Definition: ConjGradient.h:1498
+
MatrixCopyOp(const SparseStencilMatrix &from_, SparseStencilMatrix &to_)
Definition: ConjGradient.h:875
+
RowEditor & operator*=(const Scalar &s)
Scale all of the entries in this row.
Definition: ConjGradient.h:464
+
static T join(T max1, T max2)
Definition: ConjGradient.h:750
+
void computeResidual(const MatrixOperator &A, const VecValueType *x, const VecValueType *b, VecValueType *r)
Compute r = b − Ax.
Definition: ConjGradient.h:1623
+ +
const ValueType & getValue(SizeType row, SizeType col) const
Return the value at the given coordinates.
Definition: ConjGradient.h:925
+
Lightweight, variable-length vector.
Definition: ConjGradient.h:65
+
SparseStencilMatrix & operator*=(const Scalar &s)
Multiply all elements in the matrix by s;.
Definition: ConjGradient.h:314
+ +
void axpy(const T &a, const T *xVec, const T *yVec, T *resultVec, SizeType size)
Compute ax + y.
Definition: ConjGradient.h:1604
+
void scale(const Scalar &s)
Multiply all elements in the matrix by s;.
Definition: ConjGradient.h:962
+
bool isExactlyEqual(const T0 &a, const T1 &b)
Return true if a is exactly equal to b.
Definition: Math.h:407
+
Iterator over the stored values in a row of this matrix.
Definition: ConjGradient.h:412
+
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
Dummy NOOP interrupter class defining interface.
Definition: NullInterrupter.h:52
+
SizeType setValue(SizeType column, const ValueType &value)
Set the value of the entry in the specified column.
Definition: ConjGradient.h:1265
+
#define OPENVDB_LOG_DEBUG_RUNTIME(message)
Log a debugging message in both debug and optimized builds.
Definition: logging.h:48
+
float Sqrt(float x)
Return the square root of a floating-point value.
Definition: Math.h:709
+
const T * y
Definition: ConjGradient.h:563
+ +
bool isFinite(const Type &x)
Return true if x is finite.
Definition: Math.h:363
+
static const ValueType sZeroValue
Definition: ConjGradient.h:275
+
const Type & Min(const Type &a, const Type &b)
Return the minimum of two values.
Definition: Math.h:622
+
LinearOp(const T &a_, const T *x_, const T *y_, T *out_)
Definition: ConjGradient.h:551
+
bool isFinite() const
Return true if every element of this vector has a finite value.
Definition: ConjGradient.h:790
+
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
+
Definition: ConjGradient.h:738
+
const T * constData() const
Return a pointer to this vector's elements.
Definition: ConjGradient.h:239
+
Definition: Exceptions.h:78
+
T operator()(const SizeRange &range, T maxValue) const
Definition: ConjGradient.h:742
+
void scale(const Scalar &)
Scale all of the entries in this row.
Definition: ConjGradient.h:1307
+ +
SizeType column() const
Definition: ConjGradient.h:421
+
const T & operator[](SizeType i) const
Return the value of this vector's ith element.
Definition: ConjGradient.h:232
+
CopyOp(const T *from_, T *to_)
Definition: ConjGradient.h:521
+
Vector()
Construct an empty vector.
Definition: ConjGradient.h:173
+
bool isZero(const Type &x)
Return true if x is exactly equal to zero.
Definition: Math.h:324
+ +
Vector & operator=(const Vector &)
Deep copy the given vector.
Definition: ConjGradient.h:597
+ +
bool isFinite() const
Return true if every element of this matrix has a finite value.
Definition: ConjGradient.h:1086
+
Definition: ConjGradient.h:534
+
const SizeType binCount
Definition: ConjGradient.h:690
+
boost::shared_ptr< JacobiPreconditioner > Ptr
Definition: ConjGradient.h:1330
+
FillOp(T *data_, const T &val_)
Definition: ConjGradient.h:536
+
Vector< ValueType > VectorType
Definition: ConjGradient.h:270
+ +
const TriangularMatrix & lowerMatrix() const
Definition: ConjGradient.h:1546
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & max(const T &a, const T &b)
Definition: Composite.h:132
+
const SizeType arraySize
Definition: ConjGradient.h:691
+
ConstValueIter & operator++()
Definition: ConjGradient.h:424
+
Vector< ValueType > VectorType
Definition: ConjGradient.h:1395
+
ValueType l2Norm() const
Return the L2 norm of this vector.
Definition: ConjGradient.h:213
+
void vectorMultiply(const Vector< VecValueType > &inVec, Vector< VecValueType > &resultVec) const
Multiply this matrix by inVec and return the result in resultVec.
Definition: ConjGradient.h:993
+
bool operator()(const SizeRange &range, bool finite) const
Definition: ConjGradient.h:1065
+ +
ValueType_ ValueType
Definition: ConjGradient.h:269
+
Information about the state of a conjugate gradient solution.
Definition: ConjGradient.h:74
+
TriangularMatrix::RowEditor TriangleRowEditor
Definition: ConjGradient.h:1399
+
SparseStencilMatrix(SizeType n)
Construct an n x n matrix with at most STENCIL_SIZE nonzero elements per row.
Definition: ConjGradient.h:860
+
ConstRow getConstRow(SizeType row) const
Return a read-only view onto the given row of this matrix.
Definition: ConjGradient.h:1119
+ +
const int size
Definition: MaskToLevelSet.h:119
+
Vector & operator*=(const Scalar &s)
Multiply each element of this vector by s.
Definition: ConjGradient.h:204
+
T * data
Definition: ConjGradient.h:542
+ +
TriangularMatrix::ConstRow TriangleConstRow
Definition: ConjGradient.h:1398
+
T & operator[](SizeType i)
Return the value of this vector's ith element.
Definition: ConjGradient.h:231
+
bool isApproxEqual(const Type &a, const Type &b)
Return true if a is equal to b to within the default floating-point comparison tolerance.
Definition: Math.h:370
+
ValueType dot(const Vector &) const
Return the dot product of this vector with the given vector, which must be the same size...
Definition: ConjGradient.h:697
+
void operator()(const SizeRange &range) const
Definition: ConjGradient.h:523
+
const TriangularMatrix & upperMatrix() const
Definition: ConjGradient.h:1547
+
Vector< double > VectorD
Definition: ConjGradient.h:256
+
void operator()(const SizeRange &range) const
Definition: ConjGradient.h:666
+
ConstRow(const ValueType *valueHead, const SizeType *columnHead, const SizeType &rowSize)
Definition: ConjGradient.h:1237
+
void operator()(const SizeRange &range) const
Definition: ConjGradient.h:538
+
const T & at(SizeType i) const
Return the value of this vector's ith element.
Definition: ConjGradient.h:230
+ +
void setValue(SizeType row, SizeType col, const ValueType &)
Set the value at the given coordinates.
Definition: ConjGradient.h:915
+
T ValueType
Definition: ConjGradient.h:496
+
DeterministicDotProductOp(const T *a_, const T *b_, const SizeType binCount_, const SizeType arraySize_, T *reducetmp_)
Definition: ConjGradient.h:662
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
T * out
Definition: ConjGradient.h:564
+
Preconditioner< ValueType > BaseType
Definition: ConjGradient.h:1394
+
Diagonal preconditioner.
Definition: ConjGradient.h:70
+
const T * data
Definition: ConjGradient.h:752
+
const T * from
Definition: ConjGradient.h:527
+
Vector< ValueType > VectorType
Definition: ConjGradient.h:1329
+
State solve(const PositiveDefMatrix &A, const Vector< typename PositiveDefMatrix::ValueType > &b, Vector< typename PositiveDefMatrix::ValueType > &x, Preconditioner< typename PositiveDefMatrix::ValueType > &preconditioner, const State &termination=terminationDefaults< typename PositiveDefMatrix::ValueType >())
Solve Ax = b via the preconditioned conjugate gradient method.
Definition: ConjGradient.h:1652
+
State terminationDefaults()
Return default termination conditions for a conjugate gradient solver.
Definition: ConjGradient.h:85
+
#define OPENVDB_LOG_WARN(message)
Log a warning message of the form 'someVar << "some text" << ...'.
Definition: logging.h:39
+
T * data()
Return a pointer to this vector's elements.
Definition: ConjGradient.h:237
+
RowEditor getRowEditor(SizeType row)
Return a read/write view onto the given row of this matrix.
Definition: ConjGradient.h:1109
+
SparseStencilMatrix< ValueType, 4 > TriangularMatrix
Definition: ConjGradient.h:1397
+
Definition: Exceptions.h:86
+
virtual bool isValid() const
Definition: ConjGradient.h:502
+
Vector(SizeType n)
Construct a vector of n elements, with uninitialized values.
Definition: ConjGradient.h:175
+
bool eq(const SparseStencilMatrix< OtherValueType, STENCIL_SIZE > &other, ValueType eps=Tolerance< ValueType >::value()) const
Return true if this matrix is equivalent to the given matrix to within the specified tolerance...
Definition: ConjGradient.h:1050
+
Preconditioner< ValueType > BaseType
Definition: ConjGradient.h:1328
+
static bool join(bool finite1, bool finite2)
Definition: ConjGradient.h:1078
+
tbb::blocked_range< SizeType > SizeRange
Definition: ConjGradient.h:63
+
virtual ~JacobiPreconditioner()
Definition: ConjGradient.h:1338
+
Definition: ConjGradient.h:519
+
void axpy(const T &a, const Vector< T > &xVec, const Vector< T > &yVec, Vector< T > &result)
Compute ax + y.
Definition: ConjGradient.h:1612
+
std::string str() const
Return a string representation of this vector.
Definition: ConjGradient.h:837
+
Definition: Exceptions.h:39
+
Tolerance for floating-point comparison.
Definition: Math.h:125
+
MatType scale(const Vec3< typename MatType::value_type > &s)
Return a matrix that scales by s.
Definition: Mat.h:594
+
IsFiniteOp(const SparseStencilMatrix &m)
Definition: ConjGradient.h:1063
+
uint32_t Index32
Definition: Types.h:56
+
Vector< float > VectorS
Definition: ConjGradient.h:255
+
bool success
Definition: ConjGradient.h:75
+
RowEditor(ValueType *valueHead, SizeType *columnHead, SizeType &rowSize, SizeType colSize)
Definition: ConjGradient.h:1247
+
SizeType numRows() const
Return the number of rows in this matrix.
Definition: ConjGradient.h:287
+
Index32 SizeType
Definition: ConjGradient.h:61
+
Preconditioner(const SparseStencilMatrix< T, STENCIL_SIZE > &)
Definition: ConjGradient.h:499
+
static bool join(bool finite1, bool finite2)
Definition: ConjGradient.h:782
+
JacobiPreconditioner(const MatrixType &A)
Definition: ConjGradient.h:1332
+
void computeResidual(const MatrixOperator &A, const Vector< T > &x, const Vector< T > &b, Vector< T > &r)
Compute r = b − Ax.
Definition: ConjGradient.h:1635
+
T * to
Definition: ConjGradient.h:528
+
void fill(const ValueType &value)
Set all elements of this vector to value.
Definition: ConjGradient.h:629
+
double relativeError
Definition: ConjGradient.h:77
+
std::string str() const
Return a string representation of this matrix.
Definition: ConjGradient.h:1097
+
const ValueType & operator()(SizeType row, SizeType col) const
Return the value at the given coordinates.
Definition: ConjGradient.h:934
+
void resize(SizeType n)
Reset this vector to have n elements, with uninitialized values.
Definition: ConjGradient.h:617
+
InfNormOp(const T *data_)
Definition: ConjGradient.h:740
+
IsFiniteOp(const T *data_)
Definition: ConjGradient.h:770
+
int iterations
Definition: ConjGradient.h:76
+
virtual ~Preconditioner()
Definition: ConjGradient.h:500
+
std::ostream & operator<<(std::ostream &os, const State &state)
Definition: ConjGradient.h:574
+
bool operator()(const SizeRange &range, bool finite) const
Definition: ConjGradient.h:772
+
MatrixType::ValueType ValueType
Definition: ConjGradient.h:1390
+
ValueType infNorm() const
Return the infinity norm of this vector.
Definition: ConjGradient.h:758
+
State solve(const PositiveDefMatrix &A, const Vector< typename PositiveDefMatrix::ValueType > &b, Vector< typename PositiveDefMatrix::ValueType > &x, Preconditioner< typename PositiveDefMatrix::ValueType > &preconditioner, Interrupter &interrupter, const State &termination=terminationDefaults< typename PositiveDefMatrix::ValueType >())
Solve Ax = b via the preconditioned conjugate gradient method.
Definition: ConjGradient.h:1666
+
MatrixType::ValueType ValueType
Definition: ConjGradient.h:1324
+
boost::shared_ptr< Vector > Ptr
Definition: ConjGradient.h:170
+
virtual ~IncompleteCholeskyPreconditioner()
Definition: ConjGradient.h:1494
+
const Type & Max(const Type &a, const Type &b)
Return the maximum of two values.
Definition: Math.h:561
+
void operator()(const SizeRange &range) const
Definition: ConjGradient.h:878
+
bool empty() const
Return true if this vector has no elements.
Definition: ConjGradient.h:189
+
SizeType size() const
Return the number of rows in this matrix.
Definition: ConjGradient.h:288
+
bool isApproxZero(const Type &x)
Return true if x is equal to zero to within the default floating-point comparison tolerance...
Definition: Math.h:336
+
bool eq(const Vector< OtherValueType > &other, ValueType eps=Tolerance< ValueType >::value()) const
Return true if this vector is equivalent to the given vector to within the specified tolerance...
Definition: ConjGradient.h:826
+
const T * data
Definition: ConjGradient.h:784
+
int32_t Abs(int32_t i)
Return the absolute value of the given quantity.
Definition: Math.h:293
+
boost::shared_ptr< IncompleteCholeskyPreconditioner > Ptr
Definition: ConjGradient.h:1396
+
Sparse, square matrix representing a 3D stencil operator of size STENCIL_SIZE.
Definition: ConjGradient.h:67
+
double absoluteError
Definition: ConjGradient.h:78
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+ + +
Read-only accessor to a row of this matrix.
Definition: ConjGradient.h:440
+
Base class for conjugate gradient preconditioners.
Definition: ConjGradient.h:69
+
void swap(Vector &other)
Swap internal storage with another vector, which need not be the same size.
Definition: ConjGradient.h:196
+
T ValueType
Definition: ConjGradient.h:169
+
bool isFinite() const
Return true if all values along the diagonal are finite.
Definition: ConjGradient.h:1351
+
void scale(const Scalar &s)
Multiply each element of this vector by s.
Definition: ConjGradient.h:653
+
void operator()(const SizeRange &range) const
Definition: ConjGradient.h:553
+
~Vector()
Definition: ConjGradient.h:179
+
SizeType size() const
Return the number of elements in this vector.
Definition: ConjGradient.h:187
+
SparseStencilMatrix * to
Definition: ConjGradient.h:890
+
IncompleteCholeskyPreconditioner(const MatrixType &matrix)
Definition: ConjGradient.h:1401
+
void clear()
Set the number of entries in this row to zero.
Definition: ConjGradient.h:1256
+ +
virtual bool isValid() const
Definition: ConjGradient.h:1496
+
const SparseStencilMatrix * mat
Definition: ConjGradient.h:1080
+
Read/write accessor to a row of this matrix.
Definition: ConjGradient.h:448
+
const T * data() const
Return a pointer to this vector's elements.
Definition: ConjGradient.h:238
+
Preconditioner using incomplete Cholesky factorization.
Definition: ConjGradient.h:71
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & min(const T &a, const T &b)
Definition: Composite.h:128
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/Coord_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/Coord_8h_source.html new file mode 100644 index 00000000..f6c882df --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/Coord_8h_source.html @@ -0,0 +1,686 @@ + + + + + + +OpenVDB: Coord.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Coord.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 
+
31 #ifndef OPENVDB_MATH_COORD_HAS_BEEN_INCLUDED
+
32 #define OPENVDB_MATH_COORD_HAS_BEEN_INCLUDED
+
33 
+
34 #include <openvdb/Platform.h>
+
35 #include "Math.h"
+
36 #include "Vec3.h"
+
37 
+
38 namespace tbb { class split; } // forward declaration
+
39 
+
40 
+
41 namespace openvdb {
+ +
43 namespace OPENVDB_VERSION_NAME {
+
44 namespace math {
+
45 
+
47 class Coord
+
48 {
+
49 public:
+
50  typedef int32_t Int32;
+
51  typedef uint32_t Index32;
+
52  typedef Vec3<Int32> Vec3i;
+ +
54 
+
55  typedef Int32 ValueType;
+
56  typedef std::numeric_limits<ValueType> Limits;
+
57 
+
58  Coord() { mVec[0] = mVec[1] = mVec[2] = 0; }
+
59  explicit Coord(Int32 xyz) { mVec[0] = mVec[1] = mVec[2] = xyz; }
+
60  Coord(Int32 x, Int32 y, Int32 z) { mVec[0] = x; mVec[1] = y; mVec[2] = z; }
+
61  explicit Coord(const Vec3i& v) { mVec[0] = v[0]; mVec[1] = v[1]; mVec[2] = v[2]; }
+
62  explicit Coord(const Vec3I& v)
+
63  {
+
64  mVec[0] = Int32(v[0]); mVec[1] = Int32(v[1]); mVec[2] = Int32(v[2]);
+
65  }
+
66  explicit Coord(const Int32* v) { mVec[0] = v[0]; mVec[1] = v[1]; mVec[2] = v[2]; }
+
67 
+
69  static Coord min() { return Coord(Limits::min()); }
+
70 
+
72  static Coord max() { return Coord(Limits::max()); }
+
73 
+
76  template<typename T> static Coord round(const Vec3<T>& xyz)
+
77  {
+
78  return Coord(Int32(Round(xyz[0])), Int32(Round(xyz[1])), Int32(Round(xyz[2])));
+
79  }
+
82  template<typename T> static Coord floor(const Vec3<T>& xyz)
+
83  {
+
84  return Coord(Int32(Floor(xyz[0])), Int32(Floor(xyz[1])), Int32(Floor(xyz[2])));
+
85  }
+
86 
+
89  template<typename T> static Coord ceil(const Vec3<T>& xyz)
+
90  {
+
91  return Coord(Int32(Ceil(xyz[0])), Int32(Ceil(xyz[1])), Int32(Ceil(xyz[2])));
+
92  }
+
93 
+
94  Coord& reset(Int32 x, Int32 y, Int32 z)
+
95  {
+
96  mVec[0] = x; mVec[1] = y; mVec[2] = z;
+
97  return *this;
+
98  }
+
99  Coord& reset(Int32 xyz) { return this->reset(xyz, xyz, xyz); }
+
100 
+
101  Coord& setX(Int32 x) { mVec[0] = x; return *this; }
+
102  Coord& setY(Int32 y) { mVec[1] = y; return *this; }
+
103  Coord& setZ(Int32 z) { mVec[2] = z; return *this; }
+
104 
+
105  Coord& offset(Int32 dx, Int32 dy, Int32 dz)
+
106  {
+
107  mVec[0]+=dx; mVec[1]+=dy; mVec[2]+=dz;
+
108  return *this;
+
109  }
+
110  Coord& offset(Int32 n) { return this->offset(n, n, n); }
+
111  Coord offsetBy(Int32 dx, Int32 dy, Int32 dz) const
+
112  {
+
113  return Coord(mVec[0] + dx, mVec[1] + dy, mVec[2] + dz);
+
114  }
+
115  Coord offsetBy(Int32 n) const { return offsetBy(n, n, n); }
+
116 
+
117  Coord& operator+=(const Coord& rhs)
+
118  {
+
119  mVec[0] += rhs[0]; mVec[1] += rhs[1]; mVec[2] += rhs[2];
+
120  return *this;
+
121  }
+
122  Coord& operator-=(const Coord& rhs)
+
123  {
+
124  mVec[0] -= rhs[0]; mVec[1] -= rhs[1]; mVec[2] -= rhs[2];
+
125  return *this;
+
126  }
+
127  Coord operator+(const Coord& rhs) const
+
128  {
+
129  return Coord(mVec[0] + rhs[0], mVec[1] + rhs[1], mVec[2] + rhs[2]);
+
130  }
+
131  Coord operator-(const Coord& rhs) const
+
132  {
+
133  return Coord(mVec[0] - rhs[0], mVec[1] - rhs[1], mVec[2] - rhs[2]);
+
134  }
+
135  Coord operator-() const { return Coord(-mVec[0], -mVec[1], -mVec[2]); }
+
136 
+
137  Coord operator>> (size_t n) const { return Coord(mVec[0]>>n, mVec[1]>>n, mVec[2]>>n); }
+
138  Coord operator<< (size_t n) const { return Coord(mVec[0]<<n, mVec[1]<<n, mVec[2]<<n); }
+
139  Coord& operator<<=(size_t n) { mVec[0]<<=n; mVec[1]<<=n; mVec[2]<<=n; return *this; }
+
140  Coord& operator>>=(size_t n) { mVec[0]>>=n; mVec[1]>>=n; mVec[2]>>=n; return *this; }
+
141  Coord operator& (Int32 n) const { return Coord(mVec[0] & n, mVec[1] & n, mVec[2] & n); }
+
142  Coord operator| (Int32 n) const { return Coord(mVec[0] | n, mVec[1] | n, mVec[2] | n); }
+
143  Coord& operator&= (Int32 n) { mVec[0]&=n; mVec[1]&=n; mVec[2]&=n; return *this; }
+
144  Coord& operator|= (Int32 n) { mVec[0]|=n; mVec[1]|=n; mVec[2]|=n; return *this; }
+
145 
+
146  Int32 x() const { return mVec[0]; }
+
147  Int32 y() const { return mVec[1]; }
+
148  Int32 z() const { return mVec[2]; }
+
149  Int32 operator[](size_t i) const { assert(i < 3); return mVec[i]; }
+
150  Int32& x() { return mVec[0]; }
+
151  Int32& y() { return mVec[1]; }
+
152  Int32& z() { return mVec[2]; }
+
153  Int32& operator[](size_t i) { assert(i < 3); return mVec[i]; }
+
154 
+
155  const Int32* data() const { return mVec; }
+
156  Int32* data() { return mVec; }
+
157  const Int32* asPointer() const { return mVec; }
+
158  Int32* asPointer() { return mVec; }
+
159  Vec3d asVec3d() const { return Vec3d(double(mVec[0]), double(mVec[1]), double(mVec[2])); }
+
160  Vec3s asVec3s() const { return Vec3s(float(mVec[0]), float(mVec[1]), float(mVec[2])); }
+
161  Vec3i asVec3i() const { return Vec3i(mVec); }
+
162  Vec3I asVec3I() const { return Vec3I(Index32(mVec[0]), Index32(mVec[1]), Index32(mVec[2])); }
+
163  void asXYZ(Int32& x, Int32& y, Int32& z) const { x = mVec[0]; y = mVec[1]; z = mVec[2]; }
+
164 
+
165  bool operator==(const Coord& rhs) const
+
166  {
+
167  return (mVec[0] == rhs.mVec[0] && mVec[1] == rhs.mVec[1] && mVec[2] == rhs.mVec[2]);
+
168  }
+
169  bool operator!=(const Coord& rhs) const { return !(*this == rhs); }
+
170 
+
172  bool operator<(const Coord& rhs) const
+
173  {
+
174  return this->x() < rhs.x() ? true : this->x() > rhs.x() ? false
+
175  : this->y() < rhs.y() ? true : this->y() > rhs.y() ? false
+
176  : this->z() < rhs.z() ? true : false;
+
177  }
+
179  bool operator<=(const Coord& rhs) const
+
180  {
+
181  return this->x() < rhs.x() ? true : this->x() > rhs.x() ? false
+
182  : this->y() < rhs.y() ? true : this->y() > rhs.y() ? false
+
183  : this->z() <=rhs.z() ? true : false;
+
184  }
+
186  bool operator>(const Coord& rhs) const { return !(*this <= rhs); }
+
188  bool operator>=(const Coord& rhs) const { return !(*this < rhs); }
+
189 
+
191  void minComponent(const Coord& other)
+
192  {
+
193  mVec[0] = std::min(mVec[0], other.mVec[0]);
+
194  mVec[1] = std::min(mVec[1], other.mVec[1]);
+
195  mVec[2] = std::min(mVec[2], other.mVec[2]);
+
196  }
+
197 
+
199  void maxComponent(const Coord& other)
+
200  {
+
201  mVec[0] = std::max(mVec[0], other.mVec[0]);
+
202  mVec[1] = std::max(mVec[1], other.mVec[1]);
+
203  mVec[2] = std::max(mVec[2], other.mVec[2]);
+
204  }
+
205 
+
207  static inline Coord minComponent(const Coord& lhs, const Coord& rhs)
+
208  {
+
209  return Coord(std::min(lhs.x(), rhs.x()),
+
210  std::min(lhs.y(), rhs.y()),
+
211  std::min(lhs.z(), rhs.z()));
+
212  }
+
213 
+
215  static inline Coord maxComponent(const Coord& lhs, const Coord& rhs)
+
216  {
+
217  return Coord(std::max(lhs.x(), rhs.x()),
+
218  std::max(lhs.y(), rhs.y()),
+
219  std::max(lhs.z(), rhs.z()));
+
220  }
+
221 
+
224  static inline bool lessThan(const Coord& a, const Coord& b)
+
225  {
+
226  return (a[0] < b[0] || a[1] < b[1] || a[2] < b[2]);
+
227  }
+
228 
+
230  size_t minIndex() const { return MinIndex(mVec); }
+
231 
+
233  size_t maxIndex() const { return MaxIndex(mVec); }
+
234 
+
235  void read(std::istream& is) { is.read(reinterpret_cast<char*>(mVec), sizeof(mVec)); }
+
236  void write(std::ostream& os) const
+
237  {
+
238  os.write(reinterpret_cast<const char*>(mVec), sizeof(mVec));
+
239  }
+
240 
+
241 private:
+
242 
+
243  Int32 mVec[3];
+
244 }; // class Coord
+
245 
+
246 
+
248 
+
249 
+ +
255 {
+
256 public:
+
257  typedef uint64_t Index64;
+ +
259 
+
264  template<bool ZYX>
+
265  class Iterator {
+
266  public:
+
268  Iterator(const CoordBBox &b) : mPos(b.min()), mMin(b.min()), mMax(b.max()) {}
+ +
273  ZYX ? this->next<2,1,0>() : this->next<0,1,2>();
+
274  return *this;
+
275  }
+
277  operator bool() const {
+
278  return ZYX ? mPos[0] <= mMax[0] : mPos[2] <= mMax[2];
+
279  }
+
281  const Coord& operator*() const { return mPos; }
+
282  private:
+
283  template<size_t a, size_t b, size_t c>
+
284  inline void next() {
+
285  if ( mPos[a] < mMax[a] ) {//by far this is the most common case
+
286  ++mPos[a];
+
287  } else if ( mPos[b] < mMax[b] ) {
+
288  mPos[a] = mMin[a];
+
289  ++mPos[b];
+
290  } else if ( mPos[c] <= mMax[c] ) {
+
291  mPos[a] = mMin[a];
+
292  mPos[b] = mMin[b];
+
293  ++mPos[c];
+
294  }
+
295  }
+
296  Coord mPos, mMin, mMax;
+
297  };// CoordBBox::Iterator
+
298 
+
300  CoordBBox(): mMin(Coord::max()), mMax(Coord::min()) {}
+
302  CoordBBox(const Coord& min, const Coord& max): mMin(min), mMax(max) {}
+
305  CoordBBox(CoordBBox& other, const tbb::split&): mMin(other.mMin), mMax(other.mMax)
+
306  {
+
307  assert(this->is_divisible());
+
308  const size_t n = this->maxExtent();
+
309  mMax[n] = (mMin[n] + mMax[n]) >> 1;
+
310  other.mMin[n] = mMax[n] + 1;
+
311  }
+
312 
+
313  static CoordBBox createCube(const Coord& min, ValueType dim)
+
314  {
+
315  return CoordBBox(min, min.offsetBy(dim - 1));
+
316  }
+
317 
+
319  static CoordBBox inf() { return CoordBBox(Coord::min(), Coord::max()); }
+
320 
+
321  const Coord& min() const { return mMin; }
+
322  const Coord& max() const { return mMax; }
+
323 
+
324  Coord& min() { return mMin; }
+
325  Coord& max() { return mMax; }
+
326 
+
327  void reset() { mMin = Coord::max(); mMax = Coord::min(); }
+
328  void reset(const Coord& min, const Coord& max) { mMin = min; mMax = max; }
+
329  void resetToCube(const Coord& min, ValueType dim) { mMin = min; mMax = min.offsetBy(dim - 1); }
+
330 
+
332  Coord getStart() const { return mMin; }
+
334  Coord getEnd() const { return mMax.offsetBy(1); }
+
335 
+
336  bool operator==(const CoordBBox& rhs) const { return mMin == rhs.mMin && mMax == rhs.mMax; }
+
337  bool operator!=(const CoordBBox& rhs) const { return !(*this == rhs); }
+
338 
+
339  bool empty() const { return (mMin[0] > mMax[0] || mMin[1] > mMax[1] || mMin[2] > mMax[2]); }
+
341  operator bool() const { return !this->empty(); }
+
343  bool hasVolume() const { return !this->empty(); }
+
345 
+
347  Vec3d getCenter() const { return 0.5 * Vec3d((mMin + mMax).asPointer()); }
+
348 
+
352  Coord dim() const { return mMax.offsetBy(1) - mMin; }
+
354  Coord extents() const { return this->dim(); }
+
357  Index64 volume() const
+
358  {
+
359  const Coord d = this->dim();
+
360  return Index64(d[0]) * Index64(d[1]) * Index64(d[2]);
+
361  }
+
363  bool is_divisible() const { return mMin[0]<mMax[0] && mMin[1]<mMax[1] && mMin[2]<mMax[2]; }
+
364 
+
366  size_t minExtent() const { return this->dim().minIndex(); }
+
367 
+
369  size_t maxExtent() const { return this->dim().maxIndex(); }
+
370 
+
372  bool isInside(const Coord& xyz) const
+
373  {
+
374  return !(Coord::lessThan(xyz,mMin) || Coord::lessThan(mMax,xyz));
+
375  }
+
376 
+
378  bool isInside(const CoordBBox& b) const
+
379  {
+
380  return !(Coord::lessThan(b.mMin,mMin) || Coord::lessThan(mMax,b.mMax));
+
381  }
+
382 
+
384  bool hasOverlap(const CoordBBox& b) const
+
385  {
+
386  return !(Coord::lessThan(mMax,b.mMin) || Coord::lessThan(b.mMax,mMin));
+
387  }
+
388 
+
390  void expand(ValueType padding)
+
391  {
+
392  mMin.offset(-padding);
+
393  mMax.offset( padding);
+
394  }
+
395 
+
397  CoordBBox expandBy(ValueType padding) const
+
398  {
+
399  return CoordBBox(mMin.offsetBy(-padding),mMax.offsetBy(padding));
+
400  }
+
401 
+
403  void expand(const Coord& xyz)
+
404  {
+
405  mMin.minComponent(xyz);
+
406  mMax.maxComponent(xyz);
+
407  }
+
408 
+
410  void expand(const CoordBBox& bbox)
+
411  {
+
412  mMin.minComponent(bbox.min());
+
413  mMax.maxComponent(bbox.max());
+
414  }
+
416  void intersect(const CoordBBox& bbox)
+
417  {
+
418  mMin.maxComponent(bbox.min());
+
419  mMax.minComponent(bbox.max());
+
420  }
+
423  void expand(const Coord& min, Coord::ValueType dim)
+
424  {
+
425  mMin.minComponent(min);
+
426  mMax.maxComponent(min.offsetBy(dim-1));
+
427  }
+
429  void translate(const Coord& t) { mMin += t; mMax += t; }
+
430 
+
432  CoordBBox operator>> (size_t n) const { return CoordBBox(mMin>>n, mMax>>n); }
+
434  CoordBBox operator<< (size_t n) const { return CoordBBox(mMin<<n, mMax<<n); }
+
435  CoordBBox& operator<<=(size_t n) { mMin <<= n; mMax <<= n; return *this; }
+
436  CoordBBox& operator>>=(size_t n) { mMin >>= n; mMax >>= n; return *this; }
+
437  CoordBBox operator& (Coord::Int32 n) const { return CoordBBox(mMin & n, mMax & n); }
+
438  CoordBBox operator| (Coord::Int32 n) const { return CoordBBox(mMin | n, mMax | n); }
+
439  CoordBBox& operator&= (Coord::Int32 n) { mMin &= n; mMax &= n; return *this; }
+
440  CoordBBox& operator|= (Coord::Int32 n) { mMin |= n; mMax |= n; return *this; }
+
442 
+
444  void read(std::istream& is) { mMin.read(is); mMax.read(is); }
+
446  void write(std::ostream& os) const { mMin.write(os); mMax.write(os); }
+
447 
+
448 private:
+
449  Coord mMin, mMax;
+
450 }; // class CoordBBox
+
451 
+
452 
+
454 
+
455 
+
456 inline std::ostream& operator<<(std::ostream& os, const Coord& xyz)
+
457 {
+
458  os << xyz.asVec3i(); return os;
+
459 }
+
460 
+
461 
+
463 template<typename T>
+
465 inline Vec3<typename promote<T, typename Coord::ValueType>::type>
+
466 operator+(const Vec3<T>& v0, const Coord& v1)
+
467 {
+ +
469  result[0] += v1[0];
+
470  result[1] += v1[1];
+
471  result[2] += v1[2];
+
472  return result;
+
473 }
+
474 
+
475 template<typename T>
+
476 inline Vec3<typename promote<T, typename Coord::ValueType>::type>
+
477 operator+(const Coord& v1, const Vec3<T>& v0)
+
478 {
+ +
480  result[0] += v1[0];
+
481  result[1] += v1[1];
+
482  result[2] += v1[2];
+
483  return result;
+
484 }
+
486 
+
487 
+
489 template <typename T>
+
491 inline Vec3<typename promote<T, Coord::ValueType>::type>
+
492 operator-(const Vec3<T>& v0, const Coord& v1)
+
493 {
+ +
495  result[0] -= v1[0];
+
496  result[1] -= v1[1];
+
497  result[2] -= v1[2];
+
498  return result;
+
499 }
+
500 
+
501 template <typename T>
+
502 inline Vec3<typename promote<T, Coord::ValueType>::type>
+
503 operator-(const Coord& v1, const Vec3<T>& v0)
+
504 {
+ +
506  result[0] -= v1[0];
+
507  result[1] -= v1[1];
+
508  result[2] -= v1[2];
+
509  return -result;
+
510 }
+
512 
+
513 inline std::ostream&
+
514 operator<<(std::ostream& os, const CoordBBox& b)
+
515 {
+
516  os << b.min() << " -> " << b.max();
+
517  return os;
+
518 }
+
519 
+
520 } // namespace math
+
521 } // namespace OPENVDB_VERSION_NAME
+
522 } // namespace openvdb
+
523 
+
524 #endif // OPENVDB_MATH_COORD_HAS_BEEN_INCLUDED
+
525 
+
526 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
527 // All rights reserved. This software is distributed under the
+
528 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
Coord offsetBy(Int32 n) const
Definition: Coord.h:115
+
int32_t Int32
Definition: Coord.h:50
+
Vec3< float > Vec3s
Definition: Vec3.h:650
+
Coord getStart() const
Definition: Coord.h:332
+
void asXYZ(Int32 &x, Int32 &y, Int32 &z) const
Definition: Coord.h:163
+
static Coord max()
Return the largest possible coordinate.
Definition: Coord.h:72
+
void minComponent(const Coord &other)
Perform a component-wise minimum with the other Coord.
Definition: Coord.h:191
+
Int32 & z()
Definition: Coord.h:152
+ +
void expand(const Coord &min, Coord::ValueType dim)
Union this bounding box with the cubical bounding box of the given size and with the given minimum co...
Definition: Coord.h:423
+
bool operator>=(const Coord &rhs) const
Lexicographic greater than or equal to.
Definition: Coord.h:188
+
Coord & setX(Int32 x)
Definition: Coord.h:101
+
Coord & max()
Definition: Coord.h:325
+
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
Int32 z() const
Definition: Coord.h:148
+
Coord & operator+=(const Coord &rhs)
Definition: Coord.h:117
+
Coord operator-(const Coord &rhs) const
Definition: Coord.h:131
+
Coord & offset(Int32 dx, Int32 dy, Int32 dz)
Definition: Coord.h:105
+
void read(std::istream &is)
Unserialize this bounding box from the given stream.
Definition: Coord.h:444
+
Int32 operator[](size_t i) const
Definition: Coord.h:149
+
void reset()
Definition: Coord.h:327
+
Coord & reset(Int32 x, Int32 y, Int32 z)
Definition: Coord.h:94
+
Int32 & y()
Definition: Coord.h:151
+
bool isInside(const Coord &xyz) const
Return true if point (x, y, z) is inside this bounding box.
Definition: Coord.h:372
+
Definition: Mat.h:146
+
static Coord minComponent(const Coord &lhs, const Coord &rhs)
Return the component-wise minimum of the two Coords.
Definition: Coord.h:207
+
bool operator>(const Coord &rhs) const
Lexicographic greater than.
Definition: Coord.h:186
+
Int32 ValueType
Definition: Coord.h:55
+
const Int32 * data() const
Definition: Coord.h:155
+
void expand(const Coord &xyz)
Expand this bounding box to enclose point (x, y, z).
Definition: Coord.h:403
+
bool isInside(const CoordBBox &b) const
Return true if the given bounding box is inside this bounding box.
Definition: Coord.h:378
+
bool operator<=(const Coord &rhs) const
Lexicographic less than or equal to.
Definition: Coord.h:179
+
Coord::ValueType ValueType
Definition: Coord.h:258
+
Int32 y() const
Definition: Coord.h:147
+
Coord dim() const
Return the dimensions of the coordinates spanned by this bounding box.
Definition: Coord.h:352
+
int Ceil(float x)
Return the ceiling of x.
Definition: Math.h:804
+
Signed (x, y, z) 32-bit integer coordinates.
Definition: Coord.h:47
+
void expand(const CoordBBox &bbox)
Union this bounding box with the given bounding box.
Definition: Coord.h:410
+
CoordBBox(CoordBBox &other, const tbb::split &)
Splitting constructor for use in TBB ranges.
Definition: Coord.h:305
+
bool operator!=(const Coord &rhs) const
Definition: Coord.h:169
+
void maxComponent(const Coord &other)
Perform a component-wise maximum with the other Coord.
Definition: Coord.h:199
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & max(const T &a, const T &b)
Definition: Composite.h:132
+
static Coord ceil(const Vec3< T > &xyz)
Return the largest integer coordinates that are not greater than xyz+1 (node centered conversion)...
Definition: Coord.h:89
+
bool is_divisible() const
Return true if this bounding box can be subdivided [mainly for use by TBB].
Definition: Coord.h:363
+
Coord operator+(const Coord &rhs) const
Definition: Coord.h:127
+
Coord & offset(Int32 n)
Definition: Coord.h:110
+
size_t minExtent() const
Return the index (0, 1 or 2) of the shortest axis.
Definition: Coord.h:366
+
bool empty() const
Definition: Coord.h:339
+
Coord offsetBy(Int32 dx, Int32 dy, Int32 dz) const
Definition: Coord.h:111
+
Vec3< int32_t > Vec3i
Definition: Vec3.h:648
+
static CoordBBox inf()
Return an "infinite" bounding box, as defined by the Coord value range.
Definition: Coord.h:319
+
Coord & setY(Int32 y)
Definition: Coord.h:102
+
Iterator & operator++()
Increments iterator to point to the next coordinate.
Definition: Coord.h:272
+
static bool lessThan(const Coord &a, const Coord &b)
Definition: Coord.h:224
+
Int32 * asPointer()
Definition: Coord.h:158
+
Vec3i asVec3i() const
Definition: Coord.h:161
+
static Coord round(const Vec3< T > &xyz)
Return xyz rounded to the closest integer coordinates (cell centered conversion). ...
Definition: Coord.h:76
+
int32_t Int32
Definition: Types.h:60
+
size_t maxExtent() const
Return the index (0, 1 or 2) of the longest axis.
Definition: Coord.h:369
+
Vec3s asVec3s() const
Definition: Coord.h:160
+
uint64_t Index64
Definition: Types.h:57
+
bool operator!=(const CoordBBox &rhs) const
Definition: Coord.h:337
+
bool operator<(const Coord &rhs) const
Lexicographic less than.
Definition: Coord.h:172
+
uint32_t Index32
Definition: Coord.h:51
+
bool operator==(const Coord &rhs) const
Definition: Coord.h:165
+
std::ostream & operator<<(std::ostream &os, const CoordBBox &b)
Definition: Coord.h:514
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
const Int32 * asPointer() const
Definition: Coord.h:157
+
Vec3< double > Vec3d
Definition: Vec3.h:651
+
void resetToCube(const Coord &min, ValueType dim)
Definition: Coord.h:329
+
Coord & setZ(Int32 z)
Definition: Coord.h:103
+
const Coord & max() const
Definition: Coord.h:322
+
void expand(ValueType padding)
Pad this bounding box with the specified padding.
Definition: Coord.h:390
+
Coord()
Definition: Coord.h:58
+
Coord(const Vec3i &v)
Definition: Coord.h:61
+
CoordBBox & operator>>=(size_t n)
Bit-wise operations performed on both the min and max members.
Definition: Coord.h:436
+
Coord & min()
Definition: Coord.h:324
+
size_t maxIndex() const
Return the index (0, 1 or 2) with the largest value.
Definition: Coord.h:233
+
math::Vec3< Index32 > Vec3I
Definition: Types.h:77
+
Vec3< Int32 > Vec3i
Definition: Coord.h:52
+
void translate(const Coord &t)
Translate this bounding box by .
Definition: Coord.h:429
+
const Coord & min() const
Definition: Coord.h:321
+
void write(std::ostream &os) const
Definition: Coord.h:236
+
static Coord floor(const Vec3< T > &xyz)
Return the largest integer coordinates that are not greater than xyz (node centered conversion)...
Definition: Coord.h:82
+
Definition: Exceptions.h:39
+
Vec3d getCenter() const
Return the floating-point position of the center of this bounding box.
Definition: Coord.h:347
+
void write(std::ostream &os) const
Serialize this bounding box to the given stream.
Definition: Coord.h:446
+
Iterator(const CoordBBox &b)
C-tor from a bounding box.
Definition: Coord.h:268
+
uint32_t Index32
Definition: Types.h:56
+
Coord(Int32 x, Int32 y, Int32 z)
Definition: Coord.h:60
+
Coord & operator>>=(size_t n)
Definition: Coord.h:140
+
Vec3< Index32 > Vec3I
Definition: Coord.h:53
+
Vec3I asVec3I() const
Definition: Coord.h:162
+
CoordBBox()
The default constructor produces an empty bounding box.
Definition: Coord.h:300
+
bool hasVolume() const
Return true if this bounding box is nonempty.
Definition: Coord.h:343
+
CoordBBox expandBy(ValueType padding) const
Return a new instance that is expanded by the specified padding.
Definition: Coord.h:397
+
uint64_t Index64
Definition: Coord.h:257
+
Coord operator-() const
Definition: Coord.h:135
+
const Coord & operator*() const
Return a const reference to the coordinate currently pointed to.
Definition: Coord.h:281
+
Coord(const Vec3I &v)
Definition: Coord.h:62
+
Coord extents() const
Definition: Coord.h:354
+
std::numeric_limits< ValueType > Limits
Definition: Coord.h:56
+
Coord(Int32 xyz)
Definition: Coord.h:59
+
Int32 x() const
Definition: Coord.h:146
+
Vec3< typename promote< T, typename Coord::ValueType >::type > operator+(const Coord &v1, const Vec3< T > &v0)
Allow a Coord to be added to or subtracted from a Vec3.
Definition: Coord.h:477
+
static Coord maxComponent(const Coord &lhs, const Coord &rhs)
Return the component-wise maximum of the two Coords.
Definition: Coord.h:215
+
static Coord min()
Return the smallest possible coordinate.
Definition: Coord.h:69
+
int Floor(float x)
Return the floor of x.
Definition: Math.h:796
+
Vec3d asVec3d() const
Definition: Coord.h:159
+
Axis-aligned bounding box of signed integer coordinates.
Definition: Coord.h:254
+
void read(std::istream &is)
Definition: Coord.h:235
+
Definition: Coord.h:38
+
Coord & operator-=(const Coord &rhs)
Definition: Coord.h:122
+
Coord getEnd() const
Definition: Coord.h:334
+
size_t MaxIndex(const Vec3T &v)
Return the index [0,1,2] of the largest value in a 3D vector.
Definition: Math.h:893
+
CoordBBox(const Coord &min, const Coord &max)
Construct a bounding box with the given min and max bounds.
Definition: Coord.h:302
+
bool hasOverlap(const CoordBBox &b) const
Return true if the given bounding box overlaps with this bounding box.
Definition: Coord.h:384
+
Int32 & x()
Definition: Coord.h:150
+
void intersect(const CoordBBox &bbox)
Intersect this bounding box with the given bounding box.
Definition: Coord.h:416
+
Coord(const Int32 *v)
Definition: Coord.h:66
+
Coord & operator<<=(size_t n)
Definition: Coord.h:139
+
Int32 * data()
Definition: Coord.h:156
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
Index64 volume() const
Return the integer volume of coordinates spanned by this bounding box.
Definition: Coord.h:357
+
Iterator over Coord domain covered by a CoordBBox.
Definition: Coord.h:265
+
Int32 & operator[](size_t i)
Definition: Coord.h:153
+
bool operator==(const CoordBBox &rhs) const
Definition: Coord.h:336
+
size_t minIndex() const
Return the index (0, 1 or 2) with the smallest value.
Definition: Coord.h:230
+
Vec3< typename promote< T, Coord::ValueType >::type > operator-(const Coord &v1, const Vec3< T > &v0)
Allow a Coord to be subtracted from a Vec3.
Definition: Coord.h:503
+
size_t MinIndex(const Vec3T &v)
Return the index [0,1,2] of the smallest value in a 3D vector.
Definition: Math.h:872
+
float Round(float x)
Return x rounded to the nearest integer.
Definition: Math.h:767
+
CoordBBox & operator<<=(size_t n)
Bit-wise operations performed on both the min and max members.
Definition: Coord.h:435
+
static CoordBBox createCube(const Coord &min, ValueType dim)
Definition: Coord.h:313
+ +
Coord & reset(Int32 xyz)
Definition: Coord.h:99
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & min(const T &a, const T &b)
Definition: Composite.h:128
+
void reset(const Coord &min, const Coord &max)
Definition: Coord.h:328
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/CpuTimer_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/CpuTimer_8h_source.html new file mode 100644 index 00000000..1d878655 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/CpuTimer_8h_source.html @@ -0,0 +1,206 @@ + + + + + + +OpenVDB: CpuTimer.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
CpuTimer.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 
+
31 #ifndef OPENVDB_UTIL_CPUTIMER_HAS_BEEN_INCLUDED
+
32 #define OPENVDB_UTIL_CPUTIMER_HAS_BEEN_INCLUDED
+
33 
+
34 #include <string>
+
35 #include <tbb/tick_count.h>
+
36 #include <sstream>// for ostringstream
+
37 #include <iomanip>//for setprecision
+
38 
+
39 namespace openvdb {
+ +
41 namespace OPENVDB_VERSION_NAME {
+
42 namespace util {
+
43 
+
63 class CpuTimer
+
64 {
+
65 public:
+
66 
+
68  CpuTimer() : mT0(tbb::tick_count::now()) {}
+
69 
+
73  CpuTimer(const std::string& msg) { this->start(msg); }
+
74 
+
78  inline void start() { mT0 = tbb::tick_count::now(); }
+
79 
+
83  inline void start(const std::string& msg)
+
84  {
+
85  std::cerr << msg << " ... ";
+
86  this->start();
+
87  }
+
88 
+
92  inline void restart(const std::string& msg)
+
93  {
+
94  this->stop();
+
95  this->start(msg);
+
96  }
+
97 
+
99  inline double delta() const
+
100  {
+
101  tbb::tick_count::interval_t dt = tbb::tick_count::now() - mT0;
+
102  return 1000.0*dt.seconds();
+
103  }
+
104 
+
106  inline void stop() const
+
107  {
+
108  const double t = this->delta();
+
109  std::ostringstream ostr;
+
110  ostr << "completed in " << std::setprecision(3) << t << " ms\n";
+
111  std::cerr << ostr.str();
+
112  }
+
113 
+
114 private:
+
115 
+
116  tbb::tick_count mT0;
+
117 };// CpuTimer
+
118 
+
119 } // namespace util
+
120 } // namespace OPENVDB_VERSION_NAME
+
121 } // namespace openvdb
+
122 
+
123 
+
124 #endif // OPENVDB_UTIL_CPUTIMER_HAS_BEEN_INCLUDED
+
125 
+
126 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
127 // All rights reserved. This software is distributed under the
+
128 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
double delta() const
Return Time diference in milliseconds since construction or start was called.
Definition: CpuTimer.h:99
+
void start(const std::string &msg)
Print message and re-start timer.
Definition: CpuTimer.h:83
+
Simple timer for basic profiling.
Definition: CpuTimer.h:63
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
void stop() const
Print time in milliseconds since construction or start was called.
Definition: CpuTimer.h:106
+
Definition: Exceptions.h:39
+
void start()
Start timer.
Definition: CpuTimer.h:78
+
CpuTimer()
Initiate timer.
Definition: CpuTimer.h:68
+
Definition: Coord.h:38
+
void restart(const std::string &msg)
Stop previous timer, print message and re-start timer.
Definition: CpuTimer.h:92
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
CpuTimer(const std::string &msg)
Prints message and re-start timer.
Definition: CpuTimer.h:73
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/DDA_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/DDA_8h_source.html new file mode 100644 index 00000000..e940e4e9 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/DDA_8h_source.html @@ -0,0 +1,463 @@ + + + + + + +OpenVDB: DDA.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DDA.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
36 
+
37 #ifndef OPENVDB_MATH_DDA_HAS_BEEN_INCLUDED
+
38 #define OPENVDB_MATH_DDA_HAS_BEEN_INCLUDED
+
39 
+
40 #include "Coord.h"
+
41 #include "Math.h"
+
42 #include "Vec3.h"
+
43 #include <iostream>// for std::ostream
+
44 #include <limits>// for std::numeric_limits<Type>::max()
+
45 
+
46 namespace openvdb {
+ +
48 namespace OPENVDB_VERSION_NAME {
+
49 namespace math {
+
50 
+
59 template<typename RayT, Index Log2Dim = 0>
+
60 class DDA
+
61 {
+
62 public:
+
63  typedef typename RayT::RealType RealType;
+
64  typedef RealType RealT;
+
65  typedef typename RayT::Vec3Type Vec3Type;
+
66  typedef Vec3Type Vec3T;
+
67 
+
69  DDA() {}
+
70 
+
71  DDA(const RayT& ray) { this->init(ray); }
+
72 
+
73  DDA(const RayT& ray, RealT startTime) { this->init(ray, startTime); }
+
74 
+
75  DDA(const RayT& ray, RealT startTime, RealT maxTime) { this->init(ray, startTime, maxTime); }
+
76 
+
77  inline void init(const RayT& ray, RealT startTime, RealT maxTime)
+
78  {
+
79  assert(startTime <= maxTime);
+
80  static const int DIM = 1 << Log2Dim;
+
81  mT0 = startTime;
+
82  mT1 = maxTime;
+
83  const Vec3T &pos = ray(mT0), &dir = ray.dir(), &inv = ray.invDir();
+
84  mVoxel = Coord::floor(pos) & (~(DIM-1));
+
85  for (int axis = 0; axis < 3; ++axis) {
+
86  if (math::isZero(dir[axis])) {//handles dir = +/- 0
+
87  mStep[axis] = 0;//dummy value
+
88  mNext[axis] = std::numeric_limits<RealT>::max();//i.e. disabled!
+
89  mDelta[axis] = std::numeric_limits<RealT>::max();//dummy value
+
90  } else if (inv[axis] > 0) {
+
91  mStep[axis] = DIM;
+
92  mNext[axis] = mT0 + (mVoxel[axis] + DIM - pos[axis]) * inv[axis];
+
93  mDelta[axis] = mStep[axis] * inv[axis];
+
94  } else {
+
95  mStep[axis] = -DIM;
+
96  mNext[axis] = mT0 + (mVoxel[axis] - pos[axis]) * inv[axis];
+
97  mDelta[axis] = mStep[axis] * inv[axis];
+
98  }
+
99  }
+
100  }
+
101 
+
102  inline void init(const RayT& ray) { this->init(ray, ray.t0(), ray.t1()); }
+
103 
+
104  inline void init(const RayT& ray, RealT startTime) { this->init(ray, startTime, ray.t1()); }
+
105 
+
108  inline bool step()
+
109  {
+
110  const int stepAxis = static_cast<int>(math::MinIndex(mNext));
+
111  mT0 = mNext[stepAxis];
+
112  mNext[stepAxis] += mDelta[stepAxis];
+
113  mVoxel[stepAxis] += mStep[stepAxis];
+
114  return mT0 <= mT1;
+
115  }
+
116 
+
122  inline const Coord& voxel() const { return mVoxel; }
+
123 
+
129  inline RealType time() const { return mT0; }
+
130 
+
132  inline RealType maxTime() const { return mT1; }
+
133 
+
137  inline RealType next() const { return math::Min(mT1, mNext[0], mNext[1], mNext[2]); }
+
138 
+
141  void print(std::ostream& os = std::cout) const
+
142  {
+
143  os << "Dim=" << (1<<Log2Dim) << " time=" << mT0 << " next()="
+
144  << this->next() << " voxel=" << mVoxel << " next=" << mNext
+
145  << " delta=" << mDelta << " step=" << mStep << std::endl;
+
146  }
+
147 
+
148 private:
+
149  RealT mT0, mT1;
+
150  Coord mVoxel, mStep;
+
151  Vec3T mDelta, mNext;
+
152 }; // class DDA
+
153 
+
156 template<typename RayT, Index Log2Dim>
+
157 inline std::ostream& operator<<(std::ostream& os, const DDA<RayT, Log2Dim>& dda)
+
158 {
+
159  os << "Dim=" << (1<<Log2Dim) << " time=" << dda.time()
+
160  << " next()=" << dda.next() << " voxel=" << dda.voxel();
+
161  return os;
+
162 }
+
163 
+
165 
+
166 
+
169 template<typename TreeT, int NodeLevel>
+ +
171 {
+
172  typedef typename TreeT::RootNodeType::NodeChainType ChainT;
+
173  typedef typename boost::mpl::at<ChainT, boost::mpl::int_<NodeLevel> >::type NodeT;
+
174 
+
175  template <typename TesterT>
+
176  static bool test(TesterT& tester)
+
177  {
+ +
179  do {
+
180  if (tester.template hasNode<NodeT>(dda.voxel())) {
+
181  tester.setRange(dda.time(), dda.next());
+
182  if (LevelSetHDDA<TreeT, NodeLevel-1>::test(tester)) return true;
+
183  }
+
184  } while(dda.step());
+
185  return false;
+
186  }
+
187 };
+
188 
+
191 template<typename TreeT>
+
192 struct LevelSetHDDA<TreeT, -1>
+
193 {
+
194  template <typename TesterT>
+
195  static bool test(TesterT& tester)
+
196  {
+
197  math::DDA<typename TesterT::RayT, 0> dda(tester.ray());
+
198  tester.init(dda.time());
+
199  do { if (tester(dda.voxel(), dda.next())) return true; } while(dda.step());
+
200  return false;
+
201  }
+
202 };
+
203 
+
205 
+
212 template <typename TreeT, typename RayT, int ChildNodeLevel>
+ +
214 {
+
215 public:
+
216 
+
217  typedef typename TreeT::RootNodeType::NodeChainType ChainT;
+
218  typedef typename boost::mpl::at<ChainT, boost::mpl::int_<ChildNodeLevel> >::type NodeT;
+
219  typedef typename RayT::TimeSpan TimeSpanT;
+
220 
+ +
222 
+
223  template <typename AccessorT>
+
224  TimeSpanT march(RayT& ray, AccessorT &acc)
+
225  {
+
226  TimeSpanT t(-1, -1);
+
227  if (ray.valid()) this->march(ray, acc, t);
+
228  return t;
+
229  }
+
230 
+
235  template <typename AccessorT, typename ListT>
+
236  void hits(RayT& ray, AccessorT &acc, ListT& times)
+
237  {
+
238  TimeSpanT t(-1,-1);
+
239  times.clear();
+
240  this->hits(ray, acc, times, t);
+
241  if (t.valid()) times.push_back(t);
+
242  }
+
243 
+
244 private:
+
245 
+
246  friend class VolumeHDDA<TreeT, RayT, ChildNodeLevel+1>;
+
247 
+
248  template <typename AccessorT>
+
249  bool march(RayT& ray, AccessorT &acc, TimeSpanT& t)
+
250  {
+
251  mDDA.init(ray);
+
252  do {
+
253  if (acc.template probeConstNode<NodeT>(mDDA.voxel()) != NULL) {//child node
+
254  ray.setTimes(mDDA.time(), mDDA.next());
+
255  if (mHDDA.march(ray, acc, t)) return true;//terminate
+
256  } else if (acc.isValueOn(mDDA.voxel())) {//hit an active tile
+
257  if (t.t0<0) t.t0 = mDDA.time();//this is the first hit so set t0
+
258  } else if (t.t0>=0) {//hit an inactive tile after hitting active values
+
259  t.t1 = mDDA.time();//set end of active ray segment
+
260  if (t.valid()) return true;//terminate
+
261  t.set(-1, -1);//reset to an empty and invalid time-span
+
262  }
+
263  } while (mDDA.step());
+
264  if (t.t0>=0) t.t1 = mDDA.maxTime();
+
265  return false;
+
266  }
+
267 
+
272  template <typename AccessorT, typename ListT>
+
273  void hits(RayT& ray, AccessorT &acc, ListT& times, TimeSpanT& t)
+
274  {
+
275  mDDA.init(ray);
+
276  do {
+
277  if (acc.template probeConstNode<NodeT>(mDDA.voxel()) != NULL) {//child node
+
278  ray.setTimes(mDDA.time(), mDDA.next());
+
279  mHDDA.hits(ray, acc, times, t);
+
280  } else if (acc.isValueOn(mDDA.voxel())) {//hit an active tile
+
281  if (t.t0<0) t.t0 = mDDA.time();//this is the first hit so set t0
+
282  } else if (t.t0>=0) {//hit an inactive tile after hitting active values
+
283  t.t1 = mDDA.time();//set end of active ray segment
+
284  if (t.valid()) times.push_back(t);
+
285  t.set(-1,-1);//reset to an empty and invalid time-span
+
286  }
+
287  } while (mDDA.step());
+
288  if (t.t0>=0) t.t1 = mDDA.maxTime();
+
289  }
+
290 
+
291  math::DDA<RayT, NodeT::TOTAL> mDDA;
+
292  VolumeHDDA<TreeT, RayT, ChildNodeLevel-1> mHDDA;
+
293 };
+
294 
+
297 template <typename TreeT, typename RayT>
+
298 class VolumeHDDA<TreeT, RayT, 0>
+
299 {
+
300 public:
+
301 
+
302  typedef typename TreeT::LeafNodeType LeafT;
+
303  typedef typename RayT::TimeSpan TimeSpanT;
+
304 
+ +
306 
+
307  template <typename AccessorT>
+
308  TimeSpanT march(RayT& ray, AccessorT &acc)
+
309  {
+
310  TimeSpanT t(-1, -1);
+
311  if (ray.valid()) this->march(ray, acc, t);
+
312  return t;
+
313  }
+
314 
+
315  template <typename AccessorT, typename ListT>
+
316  void hits(RayT& ray, AccessorT &acc, ListT& times)
+
317  {
+
318  TimeSpanT t(-1,-1);
+
319  times.clear();
+
320  this->hits(ray, acc, times, t);
+
321  if (t.valid()) times.push_back(t);
+
322  }
+
323 
+
324 private:
+
325 
+
326  friend class VolumeHDDA<TreeT, RayT, 1>;
+
327 
+
328  template <typename AccessorT>
+
329  bool march(RayT& ray, AccessorT &acc, TimeSpanT& t)
+
330  {
+
331  mDDA.init(ray);
+
332  do {
+
333  if (acc.template probeConstNode<LeafT>(mDDA.voxel()) ||
+
334  acc.isValueOn(mDDA.voxel())) {//hit a leaf or an active tile
+
335  if (t.t0<0) t.t0 = mDDA.time();//this is the first hit
+
336  } else if (t.t0>=0) {//hit an inactive tile after hitting active values
+
337  t.t1 = mDDA.time();//set end of active ray segment
+
338  if (t.valid()) return true;//terminate
+
339  t.set(-1, -1);//reset to an empty and invalid time-span
+
340  }
+
341  } while (mDDA.step());
+
342  if (t.t0>=0) t.t1 = mDDA.maxTime();
+
343  return false;
+
344  }
+
345 
+
346  template <typename AccessorT, typename ListT>
+
347  void hits(RayT& ray, AccessorT &acc, ListT& times, TimeSpanT& t)
+
348  {
+
349  mDDA.init(ray);
+
350  do {
+
351  if (acc.template probeConstNode<LeafT>(mDDA.voxel()) ||
+
352  acc.isValueOn(mDDA.voxel())) {//hit a leaf or an active tile
+
353  if (t.t0<0) t.t0 = mDDA.time();//this is the first hit
+
354  } else if (t.t0>=0) {//hit an inactive tile after hitting active values
+
355  t.t1 = mDDA.time();//set end of active ray segment
+
356  if (t.valid()) times.push_back(t);
+
357  t.set(-1, -1);//reset to an empty and invalid time-span
+
358  }
+
359  } while (mDDA.step());
+
360  if (t.t0>=0) t.t1 = mDDA.maxTime();
+
361  }
+
362  math::DDA<RayT, LeafT::TOTAL> mDDA;
+
363 };
+
364 
+
365 } // namespace math
+
366 } // namespace OPENVDB_VERSION_NAME
+
367 } // namespace openvdb
+
368 
+
369 #endif // OPENVDB_MATH_DDA_HAS_BEEN_INCLUDED
+
370 
+
371 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
372 // All rights reserved. This software is distributed under the
+
373 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
boost::mpl::at< ChainT, boost::mpl::int_< ChildNodeLevel > >::type NodeT
Definition: DDA.h:218
+
VolumeHDDA()
Definition: DDA.h:221
+ +
void hits(RayT &ray, AccessorT &acc, ListT &times)
Definition: DDA.h:236
+
bool step()
Increment the voxel index to next intersected voxel or node and returns true if the step in time does...
Definition: DDA.h:108
+
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
RealType maxTime() const
Return the maximum time (parameterized along the Ray).
Definition: DDA.h:132
+ +
const Type & Min(const Type &a, const Type &b)
Return the minimum of two values.
Definition: Math.h:622
+
static bool test(TesterT &tester)
Definition: DDA.h:195
+ +
void init(const RayT &ray, RealT startTime, RealT maxTime)
Definition: DDA.h:77
+
void init(const RayT &ray, RealT startTime)
Definition: DDA.h:104
+
TreeT::RootNodeType::NodeChainType ChainT
Definition: DDA.h:172
+
DDA(const RayT &ray)
Definition: DDA.h:71
+
void print(std::ostream &os=std::cout) const
Print information about this DDA for debugging.
Definition: DDA.h:141
+
bool isZero(const Type &x)
Return true if x is exactly equal to zero.
Definition: Math.h:324
+
Helper class that implements Hierarchical Digital Differential Analyzers and is specialized for ray i...
Definition: DDA.h:170
+
Signed (x, y, z) 32-bit integer coordinates.
Definition: Coord.h:47
+
TreeT::LeafNodeType LeafT
Definition: DDA.h:302
+
RayT::RealType RealType
Definition: DDA.h:63
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & max(const T &a, const T &b)
Definition: Composite.h:132
+
const Coord & voxel() const
Return the index coordinates of the next node or voxel intersected by the ray. If Log2Dim = 0 the ret...
Definition: DDA.h:122
+
RayT::Vec3Type Vec3Type
Definition: DDA.h:65
+
RayT::TimeSpan TimeSpanT
Definition: DDA.h:303
+
DDA()
uninitialized constructor
Definition: DDA.h:69
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
void hits(RayT &ray, AccessorT &acc, ListT &times)
Definition: DDA.h:316
+
TreeT::RootNodeType::NodeChainType ChainT
Definition: DDA.h:217
+
Definition: Exceptions.h:39
+
DDA(const RayT &ray, RealT startTime, RealT maxTime)
Definition: DDA.h:75
+
static bool test(TesterT &tester)
Definition: DDA.h:176
+
A Digital Differential Analyzer specialized for OpenVDB grids.
Definition: DDA.h:60
+
RealType next() const
Return the time (parameterized along the Ray) of the second (i.e. next) hit of a tree node of size 2^...
Definition: DDA.h:137
+
Vec3Type Vec3T
Definition: DDA.h:66
+
Helper class that implements Hierarchical Digital Differential Analyzers for ray intersections agains...
Definition: DDA.h:213
+
RayT::TimeSpan TimeSpanT
Definition: DDA.h:219
+
TimeSpanT march(RayT &ray, AccessorT &acc)
Definition: DDA.h:308
+
RealType time() const
Return the time (parameterized along the Ray) of the first hit of a tree node of size 2^Log2Dim...
Definition: DDA.h:129
+
RealType RealT
Definition: DDA.h:64
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
void init(const RayT &ray)
Definition: DDA.h:102
+
TimeSpanT march(RayT &ray, AccessorT &acc)
Definition: DDA.h:224
+
size_t MinIndex(const Vec3T &v)
Return the index [0,1,2] of the smallest value in a 3D vector.
Definition: Math.h:872
+
DDA(const RayT &ray, RealT startTime)
Definition: DDA.h:73
+
boost::mpl::at< ChainT, boost::mpl::int_< NodeLevel > >::type NodeT
Definition: DDA.h:173
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/DenseSparseTools_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/DenseSparseTools_8h_source.html new file mode 100644 index 00000000..422904c5 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/DenseSparseTools_8h_source.html @@ -0,0 +1,1353 @@ + + + + + + +OpenVDB: DenseSparseTools.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
DenseSparseTools.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 
+
31 #ifndef OPENVDB_TOOLS_DENSESPARSETOOLS_HAS_BEEN_INCLUDED
+
32 #define OPENVDB_TOOLS_DENSESPARSETOOLS_HAS_BEEN_INCLUDED
+
33 
+
34 #include <tbb/parallel_reduce.h>
+
35 #include <tbb/blocked_range3d.h>
+
36 #include <tbb/blocked_range2d.h>
+
37 #include <tbb/blocked_range.h>
+
38 #include <openvdb/Types.h>
+ +
40 #include "Dense.h"
+
41 
+
42 
+
43 namespace openvdb {
+ +
45 namespace OPENVDB_VERSION_NAME {
+
46 namespace tools {
+
47 
+
114 template<typename OpType, typename DenseType>
+
115 typename OpType::ResultTreeType::Ptr
+
116 extractSparseTree(const DenseType& dense, const OpType& functor,
+
117  const typename OpType::ResultValueType& background,
+
118  bool threaded = true);
+
119 
+
123 template <typename DenseType, typename TreeType> struct DSConverter {
+
124  typedef typename DenseType::ValueType ValueType;
+
125 
+
126  typedef typename TreeType::template ValueConverter<ValueType>::Type Type;
+
127 };
+
128 
+
129 
+
139 template<typename DenseType, typename MaskTreeType>
+ +
141 extractSparseTreeWithMask(const DenseType& dense,
+
142  const MaskTreeType& mask,
+
143  const typename DenseType::ValueType& background,
+
144  bool threaded = true);
+
145 
+
146 
+
167 template<typename ValueT, typename OpType>
+ +
169  const openvdb::CoordBBox& bbox, const OpType& op, bool parallel=true);
+
170 
+ + +
175 };
+
176 
+
184 template<DSCompositeOp, typename TreeT>
+
185 void compositeToDense(Dense<typename TreeT::ValueType, LayoutZYX>& dense,
+
186  const TreeT& source,
+
187  const TreeT& alpha,
+
188  const typename TreeT::ValueType beta,
+
189  const typename TreeT::ValueType strength,
+
190  bool threaded = true);
+
191 
+
192 
+
196 template<typename OpType, typename DenseType>
+ +
198 {
+
199 
+
200 public:
+
201 
+
202  typedef openvdb::math::Coord::ValueType Index;
+
203 
+
204  typedef typename DenseType::ValueType DenseValueType;
+
205  typedef typename OpType::ResultTreeType ResultTreeType;
+
206  typedef typename ResultTreeType::ValueType ResultValueType;
+
207  typedef typename ResultTreeType::LeafNodeType ResultLeafNodeType;
+
208  typedef typename ResultTreeType::template ValueConverter<ValueMask>::Type MaskTree;
+
209 
+
210  typedef tbb::blocked_range3d<Index, Index, Index> Range3d;
+
211 
+
212 
+
213 private:
+
214 
+
215  const DenseType& mDense;
+
216  const OpType& mFunctor;
+
217  const ResultValueType mBackground;
+
218  const openvdb::math::CoordBBox mBBox;
+
219  const Index mWidth;
+
220  typename ResultTreeType::Ptr mMask;
+
221  openvdb::math::Coord mMin;
+
222 
+
223 
+
224 public:
+
225 
+
226  SparseExtractor(const DenseType& dense, const OpType& functor,
+
227  const ResultValueType background) :
+
228  mDense(dense), mFunctor(functor),
+
229  mBackground(background),
+
230  mBBox(dense.bbox()),
+
231  mWidth(ResultLeafNodeType::DIM),
+
232  mMask( new ResultTreeType(mBackground))
+
233  {}
+
234 
+
235 
+
236  SparseExtractor(const DenseType& dense,
+
237  const openvdb::math::CoordBBox& bbox,
+
238  const OpType& functor,
+
239  const ResultValueType background) :
+
240  mDense(dense), mFunctor(functor),
+
241  mBackground(background),
+
242  mBBox(bbox),
+
243  mWidth(ResultLeafNodeType::DIM),
+
244  mMask( new ResultTreeType(mBackground))
+
245  {
+
246  // mBBox must be inside the coordinate rage of the dense grid
+
247  if (!dense.bbox().isInside(mBBox)) {
+
248  OPENVDB_THROW(ValueError, "Data extraction window out of bound");
+
249  }
+
250  }
+
251 
+
252 
+
253  SparseExtractor(SparseExtractor& other, tbb::split):
+
254  mDense(other.mDense), mFunctor(other.mFunctor),
+
255  mBackground(other.mBackground), mBBox(other.mBBox),
+
256  mWidth(other.mWidth),
+
257  mMask(new ResultTreeType(mBackground)),
+
258  mMin(other.mMin)
+
259  {}
+
260 
+
261  typename ResultTreeType::Ptr extract(bool threaded = true) {
+
262 
+
263 
+
264  // Construct 3D range of leaf nodes that
+
265  // intersect mBBox.
+
266 
+
267  // Snap the bbox to nearest leaf nodes min and max
+
268 
+
269  openvdb::math::Coord padded_min = mBBox.min();
+
270  openvdb::math::Coord padded_max = mBBox.max();
+
271 
+
272 
+
273  padded_min &= ~(mWidth - 1);
+
274  padded_max &= ~(mWidth - 1);
+
275 
+
276  padded_max[0] += mWidth - 1;
+
277  padded_max[1] += mWidth - 1;
+
278  padded_max[2] += mWidth - 1;
+
279 
+
280 
+
281  // number of leaf nodes in each direction
+
282  // division by leaf width, e.g. 8 in most cases
+
283 
+
284  const Index xleafCount = ( padded_max.x() - padded_min.x() + 1 ) / mWidth;
+
285  const Index yleafCount = ( padded_max.y() - padded_min.y() + 1 ) / mWidth;
+
286  const Index zleafCount = ( padded_max.z() - padded_min.z() + 1 ) / mWidth;
+
287 
+
288  mMin = padded_min;
+
289 
+
290 
+
291  Range3d leafRange(0, xleafCount, 1,
+
292  0, yleafCount, 1,
+
293  0, zleafCount, 1);
+
294 
+
295 
+
296  // Iterate over the leafnodes applying *this as a functor.
+
297  if (threaded) {
+
298  tbb::parallel_reduce(leafRange, *this);
+
299  } else {
+
300  (*this)(leafRange);
+
301  }
+
302 
+
303  return mMask;
+
304  }
+
305 
+
306 
+
307  void operator()(const Range3d& range) {
+
308 
+
309  ResultLeafNodeType* leaf = NULL;
+
310 
+
311  // Unpack the range3d item.
+
312  const Index imin = range.pages().begin();
+
313  const Index imax = range.pages().end();
+
314 
+
315  const Index jmin = range.rows().begin();
+
316  const Index jmax = range.rows().end();
+
317 
+
318  const Index kmin = range.cols().begin();
+
319  const Index kmax = range.cols().end();
+
320 
+
321 
+
322  // loop over all the candidate leafs. Adding only those with 'true' values
+
323  // to the tree
+
324 
+
325  for (Index i = imin; i < imax; ++i) {
+
326  for (Index j = jmin; j < jmax; ++j) {
+
327  for (Index k = kmin; k < kmax; ++k) {
+
328 
+
329  // Calculate the origin of candidate leaf
+
330  const openvdb::math::Coord origin =
+
331  mMin + openvdb::math::Coord(mWidth * i,
+
332  mWidth * j,
+
333  mWidth * k );
+
334 
+
335  if (leaf == NULL) {
+
336  leaf = new ResultLeafNodeType(origin, mBackground);
+
337  } else {
+
338  leaf->setOrigin(origin);
+
339  leaf->fill(mBackground);
+
340  leaf->setValuesOff();
+
341  }
+
342 
+
343  // The bounding box for this leaf
+
344 
+
345  openvdb::math::CoordBBox localBBox = leaf->getNodeBoundingBox();
+
346 
+
347  // Shrink to the intersection with mBBox (i.e. the dense
+
348  // volume)
+
349 
+
350  localBBox.intersect(mBBox);
+
351 
+
352  // Early out for non-intersecting leafs
+
353 
+
354  if (localBBox.empty()) continue;
+
355 
+
356 
+
357  const openvdb::math::Coord start = localBBox.getStart();
+
358  const openvdb::math::Coord end = localBBox.getEnd();
+
359 
+
360  // Order the looping to respect the memory layout in
+
361  // the Dense source
+
362 
+
363  if (mDense.memoryLayout() == openvdb::tools::LayoutZYX) {
+
364 
+
365  openvdb::math::Coord ijk;
+
366  Index offset;
+
367  const DenseValueType* dp;
+
368  for (ijk[0] = start.x(); ijk[0] < end.x(); ++ijk[0] ) {
+
369  for (ijk[1] = start.y(); ijk[1] < end.y(); ++ijk[1] ) {
+
370  for (ijk[2] = start.z(),
+
371  offset = ResultLeafNodeType::coordToOffset(ijk),
+
372  dp = &mDense.getValue(ijk);
+
373  ijk[2] < end.z(); ++ijk[2], ++offset, ++dp) {
+
374 
+
375  mFunctor(*dp, offset, leaf);
+
376  }
+
377  }
+
378  }
+
379 
+
380  } else {
+
381 
+
382  openvdb::math::Coord ijk;
+
383  const DenseValueType* dp;
+
384  for (ijk[2] = start.z(); ijk[2] < end.z(); ++ijk[2]) {
+
385  for (ijk[1] = start.y(); ijk[1] < end.y(); ++ijk[1]) {
+
386  for (ijk[0] = start.x(),
+
387  dp = &mDense.getValue(ijk);
+
388  ijk[0] < end.x(); ++ijk[0], ++dp) {
+
389 
+
390  mFunctor(*dp, ijk, leaf);
+
391 
+
392  }
+
393  }
+
394  }
+
395  }
+
396 
+
397  // Only add non-empty leafs (empty is defined as all inactive)
+
398 
+
399  if (!leaf->isEmpty()) {
+
400  mMask->addLeaf(*leaf);
+
401  leaf = NULL;
+
402  }
+
403 
+
404  }
+
405  }
+
406  }
+
407 
+
408  // Clean up an unused leaf.
+
409 
+
410  if (leaf != NULL) delete leaf;
+
411  }
+
412 
+
413  void join(SparseExtractor& rhs) {
+
414  mMask->merge(*rhs.mMask);
+
415  }
+
416 }; // class SparseExtractor
+
417 
+
418 
+
419 template<typename OpType, typename DenseType>
+
420 typename OpType::ResultTreeType::Ptr
+
421 extractSparseTree(const DenseType& dense, const OpType& functor,
+
422  const typename OpType::ResultValueType& background,
+
423  bool threaded)
+
424 {
+
425 
+
426  // Construct the mask using a parallel reduce pattern.
+
427  // Each thread computes disjoint mask-trees. The join merges
+
428  // into a single tree.
+
429 
+
430  SparseExtractor<OpType, DenseType> extractor(dense, functor, background);
+
431 
+
432  return extractor.extract(threaded);
+
433 }
+
434 
+
435 
+
439 template <typename DenseType, typename MaskTreeType>
+ +
441 {
+
442 public:
+
443 
+ +
445  typedef _ResultTreeType ResultTreeType;
+
446  typedef typename ResultTreeType::LeafNodeType ResultLeafNodeType;
+
447  typedef typename ResultTreeType::ValueType ResultValueType;
+
448  typedef ResultValueType DenseValueType;
+
449 
+
450  typedef typename ResultTreeType::template ValueConverter<ValueMask>::Type MaskTree;
+ +
452  typedef std::vector<const typename MaskTree::LeafNodeType*> MaskLeafVec;
+
453 
+
454 
+
455  SparseMaskedExtractor(const DenseType& dense,
+
456  const ResultValueType& background,
+
457  const MaskLeafVec& leafVec
+
458  ):
+
459  mDense(dense), mBackground(background), mBBox(dense.bbox()),
+
460  mLeafVec(leafVec),
+
461  mResult(new ResultTreeType(mBackground))
+
462  {}
+
463 
+
464 
+
465 
+
466  SparseMaskedExtractor(const SparseMaskedExtractor& other, tbb::split):
+
467  mDense(other.mDense), mBackground(other.mBackground), mBBox(other.mBBox),
+
468  mLeafVec(other.mLeafVec), mResult( new ResultTreeType(mBackground))
+
469  {}
+
470 
+
471  typename ResultTreeType::Ptr extract(bool threaded = true) {
+
472 
+
473  tbb::blocked_range<size_t> range(0, mLeafVec.size());
+
474 
+
475  if (threaded) {
+
476  tbb::parallel_reduce(range, *this);
+
477  } else {
+
478  (*this)(range);
+
479  }
+
480 
+
481  return mResult;
+
482  }
+
483 
+
484 
+
485  // Used in looping over leaf nodes in the masked grid
+
486  // and using the active mask to select data to
+
487  void operator()(const tbb::blocked_range<size_t>& range) {
+
488 
+
489  ResultLeafNodeType* leaf = NULL;
+
490 
+
491 
+
492  // loop over all the candidate leafs. Adding only those with 'true' values
+
493  // to the tree
+
494 
+
495  for (size_t idx = range.begin(); idx < range.end(); ++ idx) {
+
496 
+
497  const typename MaskTree::LeafNodeType* maskLeaf = mLeafVec[idx];
+
498 
+
499  // The bounding box for this leaf
+
500 
+
501  openvdb::math::CoordBBox localBBox = maskLeaf->getNodeBoundingBox();
+
502 
+
503  // Shrink to the intersection with the dense volume
+
504 
+
505  localBBox.intersect(mBBox);
+
506 
+
507  // Early out if there was no intersection
+
508 
+
509  if (localBBox.empty()) continue;
+
510 
+
511  // Reset or allocate the target leaf
+
512 
+
513  if (leaf == NULL) {
+
514  leaf = new ResultLeafNodeType(maskLeaf->origin(), mBackground);
+
515  } else {
+
516  leaf->setOrigin(maskLeaf->origin());
+
517  leaf->fill(mBackground);
+
518  leaf->setValuesOff();
+
519  }
+
520 
+
521 
+
522  // Iterate over the intersecting bounding box
+
523  // copying active values to the result tree
+
524 
+
525  const openvdb::math::Coord start = localBBox.getStart();
+
526  const openvdb::math::Coord end = localBBox.getEnd();
+
527 
+
528 
+
529  openvdb::math::Coord ijk;
+
530 
+
531  if (mDense.memoryLayout() == openvdb::tools::LayoutZYX
+
532  && maskLeaf->isDense()) {
+
533 
+
534  Index offset;
+
535  const DenseValueType* src;
+
536  for (ijk[0] = start.x(); ijk[0] < end.x(); ++ijk[0] ) {
+
537  for (ijk[1] = start.y(); ijk[1] < end.y(); ++ijk[1] ) {
+
538  for (ijk[2] = start.z(),
+
539  offset = ResultLeafNodeType::coordToOffset(ijk),
+
540  src = &mDense.getValue(ijk);
+
541  ijk[2] < end.z(); ++ijk[2], ++offset, ++src) {
+
542 
+
543  // copy into leaf
+
544  leaf->setValueOn(offset, *src);
+
545  }
+
546 
+
547  }
+
548  }
+
549 
+
550  } else {
+
551 
+
552  Index offset;
+
553  for (ijk[0] = start.x(); ijk[0] < end.x(); ++ijk[0] ) {
+
554  for (ijk[1] = start.y(); ijk[1] < end.y(); ++ijk[1] ) {
+
555  for (ijk[2] = start.z(),
+
556  offset = ResultLeafNodeType::coordToOffset(ijk);
+
557  ijk[2] < end.z(); ++ijk[2], ++offset) {
+
558 
+
559  if (maskLeaf->isValueOn(offset)) {
+
560  const ResultValueType denseValue = mDense.getValue(ijk);
+
561  leaf->setValueOn(offset, denseValue);
+
562  }
+
563  }
+
564  }
+
565  }
+
566  }
+
567  // Only add non-empty leafs (empty is defined as all inactive)
+
568 
+
569  if (!leaf->isEmpty()) {
+
570  mResult->addLeaf(*leaf);
+
571  leaf = NULL;
+
572  }
+
573  }
+
574 
+
575  // Clean up an unused leaf.
+
576 
+
577  if (leaf != NULL) delete leaf;
+
578  }
+
579 
+ +
581  mResult->merge(*rhs.mResult);
+
582  }
+
583 
+
584 
+
585 private:
+
586  const DenseType& mDense;
+
587  const ResultValueType mBackground;
+
588  const openvdb::math::CoordBBox& mBBox;
+
589  const MaskLeafVec& mLeafVec;
+
590 
+
591  typename ResultTreeType::Ptr mResult;
+
592 
+
593 }; // class SparseMaskedExtractor
+
594 
+
595 
+
597 template<typename _ResultTreeType, typename DenseValueType>
+ +
599 {
+
600  typedef _ResultTreeType ResultTreeType;
+
601  typedef typename ResultTreeType::LeafNodeType ResultLeafNodeType;
+
602 
+
603  template<typename CoordOrIndex> inline void
+
604  operator()(const DenseValueType& a, const CoordOrIndex& offset, ResultLeafNodeType* leaf) const
+
605  {
+
606  leaf->setValueOn(offset, a);
+
607  }
+
608 };
+
609 
+
610 
+
611 template <typename DenseType, typename MaskTreeType>
+
612 typename DSConverter<DenseType, MaskTreeType>::Type::Ptr
+
613 extractSparseTreeWithMask(const DenseType& dense,
+
614  const MaskTreeType& maskProxy,
+
615  const typename DenseType::ValueType& background,
+
616  bool threaded)
+
617 {
+ +
619  typedef typename LeafExtractor::DenseValueType DenseValueType;
+
620  typedef typename LeafExtractor::ResultTreeType ResultTreeType;
+
621  typedef typename LeafExtractor::MaskLeafVec MaskLeafVec;
+
622  typedef typename LeafExtractor::MaskTree MaskTree;
+
623  typedef typename LeafExtractor::MaskLeafCIter MaskLeafCIter;
+
624  typedef ExtractAll<ResultTreeType, DenseValueType> ExtractionRule;
+
625 
+
626  // Use Mask tree to hold the topology
+
627 
+
628  MaskTree maskTree(maskProxy, false, TopologyCopy());
+
629 
+
630  // Construct an array of pointers to the mask leafs.
+
631 
+
632  const size_t leafCount = maskTree.leafCount();
+
633  MaskLeafVec leafarray(leafCount);
+
634  MaskLeafCIter leafiter = maskTree.cbeginLeaf();
+
635  for (size_t n = 0; n != leafCount; ++n, ++leafiter) {
+
636  leafarray[n] = leafiter.getLeaf();
+
637  }
+
638 
+
639 
+
640  // Extract the data that is masked leaf nodes in the mask.
+
641 
+
642  LeafExtractor leafextractor(dense, background, leafarray);
+
643  typename ResultTreeType::Ptr resultTree = leafextractor.extract(threaded);
+
644 
+
645 
+
646  // Extract data that is masked by tiles in the mask.
+
647 
+
648 
+
649  // Loop over the mask tiles, extracting the data into new trees.
+
650  // These trees will be leaf-orthogonal to the leafTree (i.e. no leaf
+
651  // nodes will overlap). Merge these trees into the result.
+
652 
+
653  typename MaskTreeType::ValueOnCIter tileIter(maskProxy);
+
654  tileIter.setMaxDepth(MaskTreeType::ValueOnCIter::LEAF_DEPTH - 1);
+
655 
+
656  // Return the leaf tree if the mask had no tiles
+
657 
+
658  if (!tileIter) return resultTree;
+
659 
+
660  ExtractionRule allrule;
+
661 
+
662  // Loop over the tiles in series, but the actual data extraction
+
663  // is in parallel.
+
664 
+
665  CoordBBox bbox;
+
666  for ( ; tileIter; ++tileIter) {
+
667 
+
668  // Find the intersection of the tile with the dense grid.
+
669 
+
670  tileIter.getBoundingBox(bbox);
+
671  bbox.intersect(dense.bbox());
+
672 
+
673  if (bbox.empty()) continue;
+
674 
+
675  SparseExtractor<ExtractionRule, DenseType> copyData(dense, bbox, allrule, background);
+
676  typename ResultTreeType::Ptr fromTileTree = copyData.extract(threaded);
+
677  resultTree->merge(*fromTileTree);
+
678  }
+
679 
+
680  return resultTree;
+
681 }
+
682 
+
683 
+
687 template <typename _ValueT, typename OpType>
+ +
689 {
+
690 public:
+
691 
+
692  typedef _ValueT ValueT;
+ +
694  typedef openvdb::math::Coord::ValueType IntType;
+
695  typedef tbb::blocked_range2d<IntType, IntType> RangeType;
+
696 
+
697 
+
698 private:
+
699 
+
700  DenseT& mDense;
+
701  const OpType& mOp;
+
702  openvdb::math::CoordBBox mBBox;
+
703 
+
704 public:
+
705  DenseTransformer(DenseT& dense,
+
706  const openvdb::math::CoordBBox& bbox,
+
707  const OpType& functor):
+
708  mDense(dense), mOp(functor), mBBox(dense.bbox())
+
709  {
+
710  // The iteration space is the intersection of the
+
711  // input bbox and the index-space covered by the dense grid
+
712  mBBox.intersect(bbox);
+
713  }
+
714 
+ +
716  mDense(other.mDense), mOp(other.mOp), mBBox(other.mBBox) {}
+
717 
+
718  void apply(bool threaded = true) {
+
719 
+
720  // Early out if the iteration space is empty
+
721 
+
722  if (mBBox.empty()) return;
+
723 
+
724 
+
725  const openvdb::math::Coord start = mBBox.getStart();
+
726  const openvdb::math::Coord end = mBBox.getEnd();
+
727 
+
728  // The iteration range only the slower two directions.
+
729  const RangeType range(start.x(), end.x(), 1,
+
730  start.y(), end.y(), 1);
+
731 
+
732  if (threaded) {
+
733  tbb::parallel_for(range, *this);
+
734  } else {
+
735  (*this)(range);
+
736  }
+
737  }
+
738 
+
739  void operator()(const RangeType& range) const {
+
740 
+
741  // The stride in the z-direction.
+
742  // Note: the bbox is [inclusive, inclusive]
+
743 
+
744  const size_t zlength = size_t(mBBox.max().z() - mBBox.min().z() + 1);
+
745 
+
746  const IntType imin = range.rows().begin();
+
747  const IntType imax = range.rows().end();
+
748  const IntType jmin = range.cols().begin();
+
749  const IntType jmax = range.cols().end();
+
750 
+
751 
+
752  openvdb::math::Coord xyz(imin, jmin, mBBox.min().z());
+
753  for (xyz[0] = imin; xyz[0] != imax; ++xyz[0]) {
+
754  for (xyz[1] = jmin; xyz[1] != jmax; ++xyz[1]) {
+
755 
+
756  mOp.transform(mDense, xyz, zlength);
+
757  }
+
758  }
+
759  }
+
760 }; // class DenseTransformer
+
761 
+
762 
+
766 template <typename ValueT, typename PointWiseOp>
+ +
768 {
+
769  ContiguousOp(const PointWiseOp& op) : mOp(op){}
+
770 
+ +
772  inline void transform(DenseT& dense, openvdb::math::Coord& ijk, size_t size) const
+
773  {
+
774  ValueT* dp = const_cast<ValueT*>(&dense.getValue(ijk));
+
775 
+
776  for (size_t offset = 0; offset < size; ++offset) {
+
777  dp[offset] = mOp(dp[offset]);
+
778  }
+
779  }
+
780 
+
781  const PointWiseOp mOp;
+
782 };
+
783 
+
784 
+
786 template <typename ValueT, typename PointwiseOpT>
+
787 void
+ +
789  const openvdb::CoordBBox& bbox,
+
790  const PointwiseOpT& functor, bool parallel)
+
791 {
+ +
793 
+
794  // Convert the Op so it operates on a contiguous line in memory
+
795 
+
796  OpT op(functor);
+
797 
+
798  // Apply to the index space intersection in the dense grid
+
799  DenseTransformer<ValueT, OpT> transformer(dense, bbox, op);
+
800  transformer.apply(parallel);
+
801 }
+
802 
+
803 
+
804 template <typename CompositeMethod, typename _TreeT>
+ +
806 {
+
807 
+
808 public:
+
809  typedef _TreeT TreeT;
+
810  typedef typename TreeT::ValueType ValueT;
+
811  typedef typename TreeT::LeafNodeType LeafT;
+
812  typedef typename TreeT::template ValueConverter<ValueMask>::Type MaskTreeT;
+
813  typedef typename MaskTreeT::LeafNodeType MaskLeafT;
+ +
815  typedef openvdb::math::Coord::ValueType Index;
+
816  typedef tbb::blocked_range3d<Index, Index, Index> Range3d;
+
817 
+
818  SparseToDenseCompositor(DenseT& dense, const TreeT& source, const TreeT& alpha,
+
819  const ValueT beta, const ValueT strength) :
+
820  mDense(dense), mSource(source), mAlpha(alpha), mBeta(beta), mStrength(strength)
+
821  {}
+
822 
+ +
824  mDense(other.mDense), mSource(other.mSource), mAlpha(other.mAlpha),
+
825  mBeta(other.mBeta), mStrength(other.mStrength) {}
+
826 
+
827 
+
828 
+
829  void sparseComposite(bool threaded) {
+
830 
+
831  const ValueT beta = mBeta;
+
832  const ValueT strenght = mStrength;
+
833 
+
834  // construct a tree that defines the iteration space
+
835 
+
836  MaskTreeT maskTree(mSource, false /*background*/, openvdb::TopologyCopy());
+
837  maskTree.topologyUnion(mAlpha);
+
838 
+
839  // Composite regions that are represented by leafnodes in either mAlpha or mSource
+
840  // Parallelize over bool-leafs
+
841 
+
842  openvdb::tree::LeafManager<const MaskTreeT> maskLeafs(maskTree);
+
843  maskLeafs.foreach(*this, threaded);
+
844 
+
845  // Composite regions that are represented by tiles
+
846  // Parallelize within each tile.
+
847 
+
848  typename MaskTreeT::ValueOnCIter citer = maskTree.cbeginValueOn();
+
849  citer.setMaxDepth(MaskTree::ValueOnCIter::LEAF_DEPTH - 1);
+
850 
+
851  if (!citer) return;
+
852 
+
853  typename tree::ValueAccessor<const TreeT> alphaAccessor(mAlpha);
+
854  typename tree::ValueAccessor<const TreeT> sourceAccessor(mSource);
+
855 
+
856  for (; citer; ++citer) {
+
857 
+
858  const openvdb::math::Coord org = citer.getCoord();
+
859 
+
860  // Early out if both alpha and source are zero in this tile.
+
861 
+
862  const ValueT alphaValue = alphaAccessor.getValue(org);
+
863  const ValueT sourceValue = sourceAccessor.getValue(org);
+
864 
+
865  if (openvdb::math::isZero(alphaValue) &&
+
866  openvdb::math::isZero(sourceValue) ) continue;
+
867 
+
868  // Compute overlap of tile with the dense grid
+
869 
+
870  openvdb::math::CoordBBox localBBox = citer.getBoundingBox();
+
871  localBBox.intersect(mDense.bbox());
+
872 
+
873  // Early out if there is no intersection
+
874 
+
875  if (localBBox.empty()) continue;
+
876 
+
877  // Composite the tile-uniform values into the dense grid.
+
878  compositeFromTile(mDense, localBBox, sourceValue,
+
879  alphaValue, beta, strenght, threaded);
+
880  }
+
881  }
+
882 
+
883  // Composites leaf values where the alpha values are active.
+
884  // Used in sparseComposite
+
885  void inline operator()(const MaskLeafT& maskLeaf, size_t /*i*/) const
+
886  {
+
887 
+
888  typedef UniformLeaf ULeaf;
+
889  openvdb::math::CoordBBox localBBox = maskLeaf.getNodeBoundingBox();
+
890  localBBox.intersect(mDense.bbox());
+
891 
+
892  // Early out for non-overlapping leafs
+
893 
+
894  if (localBBox.empty()) return;
+
895 
+
896  const openvdb::math::Coord org = maskLeaf.origin();
+
897  const LeafT* alphaLeaf = mAlpha.probeLeaf(org);
+
898  const LeafT* sourceLeaf = mSource.probeLeaf(org);
+
899 
+
900  if (!sourceLeaf) {
+
901 
+
902  // Create a source leaf proxy with the correct value
+
903  ULeaf uniformSource(mSource.getValue(org));
+
904 
+
905  if (!alphaLeaf) {
+
906 
+
907  // Create an alpha leaf proxy with the correct value
+
908  ULeaf uniformAlpha(mAlpha.getValue(org));
+
909 
+
910  compositeFromLeaf(mDense, localBBox, uniformSource, uniformAlpha,
+
911  mBeta, mStrength);
+
912  } else {
+
913 
+
914  compositeFromLeaf(mDense, localBBox, uniformSource, *alphaLeaf,
+
915  mBeta, mStrength);
+
916  }
+
917  } else {
+
918  if (!alphaLeaf) {
+
919 
+
920  // Create an alpha leaf proxy with the correct value
+
921  ULeaf uniformAlpha(mAlpha.getValue(org));
+
922 
+
923  compositeFromLeaf(mDense, localBBox, *sourceLeaf, uniformAlpha,
+
924  mBeta, mStrength);
+
925  } else {
+
926 
+
927  compositeFromLeaf(mDense, localBBox, *sourceLeaf, *alphaLeaf,
+
928  mBeta, mStrength);
+
929  }
+
930  }
+
931  }
+
932  // i.e. it assumes that all valueOff Alpha voxels have value 0.
+
933 
+
934  template <typename LeafT1, typename LeafT2>
+
935  inline static void compositeFromLeaf(DenseT& dense, const openvdb::math::CoordBBox& bbox,
+
936  const LeafT1& source, const LeafT2& alpha,
+
937  const ValueT beta, const ValueT strength)
+
938  {
+
939  typedef openvdb::math::Coord::ValueType IntType;
+
940 
+
941  const ValueT sbeta = strength * beta;
+
942  openvdb::math::Coord ijk = bbox.min();
+
943 
+
944 
+
945  if (alpha.isDense() /*all active values*/) {
+
946 
+
947  // Optimal path for dense alphaLeaf
+
948  const IntType size = bbox.max().z() + 1 - bbox.min().z();
+
949 
+
950  for (ijk[0] = bbox.min().x(); ijk[0] < bbox.max().x() + 1; ++ijk[0]) {
+
951  for (ijk[1] = bbox.min().y(); ijk[1] < bbox.max().y() + 1; ++ijk[1]) {
+
952 
+
953  ValueT* d = const_cast<ValueT*>(&dense.getValue(ijk));
+
954  const ValueT* a = &alpha.getValue(ijk);
+
955  const ValueT* s = &source.getValue(ijk);
+
956 
+
957  for (IntType idx = 0; idx < size; ++idx) {
+
958  d[idx] = CompositeMethod::apply(d[idx], a[idx], s[idx],
+
959  strength, beta, sbeta);
+
960  }
+
961  }
+
962  }
+
963  } else {
+
964 
+
965  // AlphaLeaf has non-active cells.
+
966 
+
967  for (ijk[0] = bbox.min().x(); ijk[0] < bbox.max().x() + 1; ++ijk[0]) {
+
968  for (ijk[1] = bbox.min().y(); ijk[1] < bbox.max().y() + 1; ++ijk[1]) {
+
969  for (ijk[2] = bbox.min().z(); ijk[2] < bbox.max().z() + 1; ++ijk[2]) {
+
970 
+
971  if (alpha.isValueOn(ijk)) {
+
972 
+
973  dense.setValue(ijk,
+
974  CompositeMethod::apply(dense.getValue(ijk),
+
975  alpha.getValue(ijk), source.getValue(ijk),
+
976  strength, beta, sbeta)
+
977  );
+
978  }
+
979  }
+
980  }
+
981  }
+
982  }
+
983  }
+
984 
+
985  inline static void compositeFromTile(DenseT& dense, openvdb::math::CoordBBox& bbox,
+
986  const ValueT& sourceValue, const ValueT& alphaValue,
+
987  const ValueT& beta, const ValueT& strength,
+
988  bool threaded)
+
989  {
+
990 
+
991  typedef UniformTransformer TileTransformer;
+
992  TileTransformer functor(sourceValue, alphaValue, beta, strength);
+
993 
+
994  // Transform the data inside the bbox according to the TileTranformer.
+
995 
+
996  transformDense(dense, bbox, functor, threaded);
+
997 
+
998  }
+
999 
+
1000 
+
1001  void denseComposite(bool threaded)
+
1002  {
+
1005  const openvdb::math::CoordBBox& bbox = mDense.bbox();
+
1006 
+
1007  Range3d range(bbox.min().x(), bbox.max().x(), LeafT::DIM,
+
1008  bbox.min().y(), bbox.max().y(), LeafT::DIM,
+
1009  bbox.min().z(), bbox.max().z(), LeafT::DIM);
+
1010 
+
1011  // Iterate over the range, compositing into
+
1012  // the dense grid using value accessors for
+
1013  // sparse the grids.
+
1014  if (threaded) {
+
1015  tbb::parallel_for(range, *this);
+
1016  } else {
+
1017  (*this)(range);
+
1018  }
+
1019 
+
1020  }
+
1021 
+
1022  // Composites a dense region using value accessors
+
1023  // into a dense grid
+
1024  void inline operator()(const Range3d& range) const
+
1025  {
+
1026  // Use value accessors to alpha and source
+
1027 
+
1028  typename tree::ValueAccessor<const TreeT> alphaAccessor(mAlpha);
+
1029  typename tree::ValueAccessor<const TreeT> sourceAccessor(mSource);
+
1030 
+
1031  const ValueT strength = mStrength;
+
1032  const ValueT beta = mBeta;
+
1033  const ValueT sbeta = strength * beta;
+
1034 
+
1035  // Unpack the range3d item.
+
1036  const Index imin = range.pages().begin();
+
1037  const Index imax = range.pages().end();
+
1038 
+
1039  const Index jmin = range.rows().begin();
+
1040  const Index jmax = range.rows().end();
+
1041 
+
1042  const Index kmin = range.cols().begin();
+
1043  const Index kmax = range.cols().end();
+
1044 
+
1045  openvdb::Coord ijk;
+
1046  for (ijk[0] = imin; ijk[0] < imax; ++ijk[0]) {
+
1047  for (ijk[1] = jmin; ijk[1] < jmax; ++ijk[1]) {
+
1048  for (ijk[2] = kmin; ijk[2] < kmax; ++ijk[2]) {
+
1049  const ValueT d_old = mDense.getValue(ijk);
+
1050  const ValueT& alpha = alphaAccessor.getValue(ijk);
+
1051  const ValueT& src = sourceAccessor.getValue(ijk);
+
1052 
+
1053  mDense.setValue(ijk, CompositeMethod::apply(d_old, alpha, src,
+
1054  strength, beta, sbeta));
+
1055  }
+
1056  }
+
1057  }
+
1058 
+
1059  }
+
1060 
+
1061 
+
1062 private:
+
1063 
+
1064  // Internal class that wraps the templated composite method
+
1065  // for use when both alpha and source are uniform over
+
1066  // a prescribed bbox (e.g. a tile).
+
1067  class UniformTransformer
+
1068  {
+
1069  public:
+
1070  UniformTransformer(const ValueT& source, const ValueT& alpha, const ValueT& _beta,
+
1071  const ValueT& _strength) :
+
1072  mSource(source), mAlpha(alpha), mBeta(_beta),
+
1073  mStrength(_strength), mSBeta(_strength * _beta)
+
1074  {}
+
1075 
+
1076  ValueT operator()(const ValueT& input) const
+
1077  {
+
1078  return CompositeMethod::apply(input, mAlpha, mSource,
+
1079  mStrength, mBeta, mSBeta);
+
1080  }
+
1081 
+
1082  private:
+
1083  const ValueT mSource; const ValueT mAlpha; const ValueT mBeta;
+
1084  const ValueT mStrength; const ValueT mSBeta;
+
1085  };
+
1086 
+
1087 
+
1088  // Simple Class structure that mimics a leaf
+
1089  // with uniform values. Holds LeafT::DIM copies
+
1090  // of a value in an array.
+
1091  struct Line { ValueT mValues[LeafT::DIM]; };
+
1092  class UniformLeaf : private Line
+
1093  {
+
1094  public:
+
1095  typedef typename LeafT::ValueType ValueT;
+
1096 
+
1097  typedef Line BaseT;
+
1098  UniformLeaf(const ValueT& value) : BaseT(init(value)) {}
+
1099 
+
1100  static const BaseT init(const ValueT& value) {
+
1101  BaseT tmp;
+
1102  for (openvdb::Index i = 0; i < LeafT::DIM; ++i) {
+
1103  tmp.mValues[i] = value;
+
1104  }
+
1105  return tmp;
+
1106  }
+
1107 
+
1108  bool isDense() const { return true; }
+
1109  bool isValueOn(openvdb::math::Coord&) const { return true; }
+
1110 
+
1111  inline const ValueT& getValue(const openvdb::math::Coord& ) const
+
1112  {return BaseT::mValues[0];}
+
1113  };
+
1114 
+
1115 private:
+
1116  DenseT& mDense;
+
1117  const TreeT& mSource;
+
1118  const TreeT& mAlpha;
+
1119  ValueT mBeta;
+
1120  ValueT mStrength;
+
1121 }; // class SparseToDenseCompositor
+
1122 
+
1123 
+
1124 namespace ds
+
1125 {
+
1127  template <typename ValueT>
+
1129  struct OpOver
+
1130  {
+
1131  static inline ValueT apply(const ValueT u, const ValueT alpha,
+
1132  const ValueT v,
+
1133  const ValueT strength,
+
1134  const ValueT beta,
+
1135  const ValueT /*sbeta*/)
+
1136  { return (u + strength * alpha * (beta * v - u)); }
+
1137  };
+
1138 
+
1139 
+
1140  template <typename ValueT>
+
1141  struct OpAdd
+
1142  {
+
1143  static inline ValueT apply(const ValueT u, const ValueT alpha,
+
1144  const ValueT v,
+
1145  const ValueT /*strength*/,
+
1146  const ValueT /*beta*/,
+
1147  const ValueT sbeta)
+
1148  { return (u + sbeta * alpha * v); }
+
1149  };
+
1150 
+
1151  template <typename ValueT>
+
1152  struct OpSub
+
1153  {
+
1154  static inline ValueT apply(const ValueT u, const ValueT alpha,
+
1155  const ValueT v,
+
1156  const ValueT /*strength*/,
+
1157  const ValueT /*beta*/,
+
1158  const ValueT sbeta)
+
1159  { return (u - sbeta * alpha * v); }
+
1160  };
+
1161 
+
1162  template <typename ValueT>
+
1163  struct OpMin
+
1164  {
+
1165  static inline ValueT apply(const ValueT u, const ValueT alpha,
+
1166  const ValueT v,
+
1167  const ValueT s /*trength*/,
+
1168  const ValueT beta,
+
1169  const ValueT /*sbeta*/)
+
1170  { return ( ( 1 - s * alpha) * u + s * alpha * std::min(u, beta * v) ); }
+
1171  };
+
1172 
+
1173 
+
1174  template <typename ValueT>
+
1175  struct OpMax
+
1176  {
+
1177  static inline ValueT apply(const ValueT u, const ValueT alpha,
+
1178  const ValueT v,
+
1179  const ValueT s/*trength*/,
+
1180  const ValueT beta,
+
1181  const ValueT /*sbeta*/)
+
1182  { return ( ( 1 - s * alpha ) * u + s * alpha * std::min(u, beta * v) ); }
+
1183  };
+
1184 
+
1185  template <typename ValueT>
+
1186  struct OpMult
+
1187  {
+
1188  static inline ValueT apply(const ValueT u, const ValueT alpha,
+
1189  const ValueT v,
+
1190  const ValueT s/*trength*/,
+
1191  const ValueT /*beta*/,
+
1192  const ValueT sbeta)
+
1193  { return ( ( 1 + alpha * (sbeta * v - s)) * u ); }
+
1194  };
+
1196 
+
1198  template <DSCompositeOp OP, typename ValueT>
+ +
1201 
+
1202  template <typename ValueT>
+ +
1204 
+
1205  template <typename ValueT>
+ +
1207 
+
1208  template <typename ValueT>
+ +
1210 
+
1211  template <typename ValueT>
+ +
1213 
+
1214  template <typename ValueT>
+ +
1216 
+
1217  template <typename ValueT>
+ +
1220 
+
1221 } // namespace ds
+
1222 
+
1223 
+
1224 template <DSCompositeOp OpT, typename TreeT>
+ + +
1227  const TreeT& source, const TreeT& alpha,
+
1228  const typename TreeT::ValueType beta,
+
1229  const typename TreeT::ValueType strength,
+
1230  bool threaded)
+
1231 {
+
1232  typedef typename TreeT::ValueType ValueT;
+ +
1234  typedef typename Translator::OpT Method;
+
1235 
+
1236  if (openvdb::math::isZero(strength)) return;
+
1237 
+
1238  SparseToDenseCompositor<Method, TreeT> tool(dense, source, alpha, beta, strength);
+
1239 
+
1240  if (openvdb::math::isZero(alpha.background()) &&
+
1241  openvdb::math::isZero(source.background()))
+
1242  {
+
1243  // Use the sparsity of (alpha U source) as the iteration space.
+
1244  tool.sparseComposite(threaded);
+
1245  } else {
+
1246  // Use the bounding box of dense as the iteration space.
+
1247  tool.denseComposite(threaded);
+
1248  }
+
1249 }
+
1250 
+
1251 } // namespace tools
+
1252 } // namespace OPENVDB_VERSION_NAME
+
1253 } // namespace openvdb
+
1254 
+
1255 #endif //OPENVDB_TOOLS_DENSESPARSETOOLS_HAS_BEEN_INCLUDED
+
1256 
+
1257 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
1258 // All rights reserved. This software is distributed under the
+
1259 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
LeafCIter cbeginLeaf() const
Return an iterator over all leaf nodes in this tree.
Definition: Tree.h:1154
+
Definition: DenseSparseTools.h:1175
+
OpOver< ValueT > OpT
Definition: DenseSparseTools.h:1203
+
DenseTransformer(const DenseTransformer &other)
Definition: DenseSparseTools.h:715
+
ResultTreeType::Ptr extract(bool threaded=true)
Definition: DenseSparseTools.h:471
+
tbb::blocked_range3d< Index, Index, Index > Range3d
Definition: DenseSparseTools.h:816
+
TreeT::template ValueConverter< ValueMask >::Type MaskTreeT
Definition: DenseSparseTools.h:812
+
const ValueT & getValue(size_t offset) const
Return a const reference to the value of the voxel at the given array offset.
Definition: Dense.h:287
+
std::vector< const typename MaskTree::LeafNodeType * > MaskLeafVec
Definition: DenseSparseTools.h:452
+
_ValueT ValueT
Definition: DenseSparseTools.h:692
+ +
a wrapper struct used to avoid unnecessary computation of memory access from Coord when all offsets a...
Definition: DenseSparseTools.h:767
+
a simple utility class used by extractSparseTreeWithMask
Definition: DenseSparseTools.h:598
+
Definition: DenseSparseTools.h:174
+
ResultTreeType::template ValueConverter< ValueMask >::Type MaskTree
Definition: DenseSparseTools.h:450
+
SparseExtractor(const DenseType &dense, const openvdb::math::CoordBBox &bbox, const OpType &functor, const ResultValueType background)
Definition: DenseSparseTools.h:236
+
SparseToDenseCompositor(const SparseToDenseCompositor &other)
Definition: DenseSparseTools.h:823
+
Definition: Types.h:442
+
TreeT::ValueType ValueT
Definition: DenseSparseTools.h:810
+
openvdb::math::Coord::ValueType Index
Definition: DenseSparseTools.h:815
+
Definition: Dense.h:92
+
OpType::ResultTreeType ResultTreeType
Definition: DenseSparseTools.h:205
+
TreeT::LeafNodeType LeafT
Definition: DenseSparseTools.h:811
+
static ValueT apply(const ValueT u, const ValueT alpha, const ValueT v, const ValueT s, const ValueT beta, const ValueT)
Definition: DenseSparseTools.h:1177
+
Definition: DenseSparseTools.h:174
+
ContiguousOp(const PointWiseOp &op)
Definition: DenseSparseTools.h:769
+
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
+
void denseComposite(bool threaded)
Definition: DenseSparseTools.h:1001
+
Functor-based class used to extract data that satisfies some criteria defined by the embedded OpType ...
Definition: DenseSparseTools.h:197
+
DenseType::ValueType DenseValueType
Definition: DenseSparseTools.h:204
+
Definition: DenseSparseTools.h:174
+
ResultTreeType::ValueType ResultValueType
Definition: DenseSparseTools.h:206
+
void transformDense(Dense< ValueT, openvdb::tools::LayoutZYX > &dense, const openvdb::CoordBBox &bbox, const PointwiseOpT &functor, bool parallel)
Apply a point-wise functor to the intersection of a dense grid and a given bounding box...
Definition: DenseSparseTools.h:788
+
Dense< ValueT, openvdb::tools::LayoutZYX > DenseT
Definition: DenseSparseTools.h:693
+
Definition: DenseSparseTools.h:1141
+
DenseType::ValueType ValueType
Definition: DenseSparseTools.h:124
+
ResultValueType DenseValueType
Definition: DenseSparseTools.h:448
+
bool isZero(const Type &x)
Return true if x is exactly equal to zero.
Definition: Math.h:324
+
tree::Tree4< ValueMask, 5, 4, 3 >::Type MaskTree
Common tree types.
Definition: openvdb.h:49
+
Definition: DenseSparseTools.h:805
+
DSConverter< DenseType, MaskTreeType >::Type::Ptr extractSparseTreeWithMask(const DenseType &dense, const MaskTreeType &mask, const typename DenseType::ValueType &background, bool threaded=true)
Copy data from the intersection of a sparse tree and a dense input grid. The resulting tree has the s...
Definition: DenseSparseTools.h:613
+
This file defines a simple dense grid and efficient converters to and from VDB grids.
+
_ResultTreeType ResultTreeType
Definition: DenseSparseTools.h:600
+
OpType::ResultTreeType::Ptr extractSparseTree(const DenseType &dense, const OpType &functor, const typename OpType::ResultValueType &background, bool threaded=true)
Selectively extract and transform data from a dense grid, producing a sparse tree with leaf nodes onl...
Definition: DenseSparseTools.h:421
+
ResultTreeType::ValueType ResultValueType
Definition: DenseSparseTools.h:447
+
ResultTreeType::Ptr extract(bool threaded=true)
Definition: DenseSparseTools.h:261
+
void compositeToDense(Dense< typename TreeT::ValueType, LayoutZYX > &dense, const TreeT &source, const TreeT &alpha, const typename TreeT::ValueType beta, const typename TreeT::ValueType strength, bool threaded=true)
Composite data from a sparse tree into a dense array of the same value type.
Definition: DenseSparseTools.h:1225
+ +
ResultTreeType::LeafNodeType ResultLeafNodeType
Definition: DenseSparseTools.h:601
+
Translator that converts an enum to compositing functor types.
Definition: DenseSparseTools.h:1200
+
Dense is a simple dense grid API used by the CopyToDense and CopyFromDense classes defined below...
Definition: Dense.h:206
+
static const Index LEAF_DEPTH
Definition: TreeIterator.h:668
+
DSCompositeOp
Definition: DenseSparseTools.h:173
+
const int size
Definition: MaskToLevelSet.h:119
+
OpMult< ValueT > OpT
Definition: DenseSparseTools.h:1218
+
Dense< ValueT, openvdb::tools::LayoutZYX > DenseT
Definition: DenseSparseTools.h:814
+
const ValueType & getValue(const Coord &xyz) const
Return the value of the voxel at the given coordinates.
Definition: ValueAccessor.h:256
+
Index32 Index
Definition: Types.h:58
+
void join(SparseExtractor &rhs)
Definition: DenseSparseTools.h:413
+
SparseToDenseCompositor(DenseT &dense, const TreeT &source, const TreeT &alpha, const ValueT beta, const ValueT strength)
Definition: DenseSparseTools.h:818
+
static void compositeFromTile(DenseT &dense, openvdb::math::CoordBBox &bbox, const ValueT &sourceValue, const ValueT &alphaValue, const ValueT &beta, const ValueT &strength, bool threaded)
Definition: DenseSparseTools.h:985
+
void sparseComposite(bool threaded)
Definition: DenseSparseTools.h:829
+
Definition: DenseSparseTools.h:174
+
ResultTreeType::LeafNodeType ResultLeafNodeType
Definition: DenseSparseTools.h:207
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
Definition: DenseSparseTools.h:174
+
openvdb::math::Coord::ValueType Index
Definition: DenseSparseTools.h:202
+
void operator()(const Range3d &range) const
Definition: DenseSparseTools.h:1024
+
Definition: DenseSparseTools.h:1186
+
virtual Index32 leafCount() const
Return the number of leaf nodes.
Definition: Tree.h:366
+
DSConverter< DenseType, MaskTreeType >::Type _ResultTreeType
Definition: DenseSparseTools.h:444
+
ResultTreeType::template ValueConverter< ValueMask >::Type MaskTree
Definition: DenseSparseTools.h:208
+
SparseMaskedExtractor(const SparseMaskedExtractor &other, tbb::split)
Definition: DenseSparseTools.h:466
+
SparseMaskedExtractor(const DenseType &dense, const ResultValueType &background, const MaskLeafVec &leafVec)
Definition: DenseSparseTools.h:455
+
_ResultTreeType ResultTreeType
Definition: DenseSparseTools.h:445
+
OpAdd< ValueT > OpT
Definition: DenseSparseTools.h:1206
+
Definition: Exceptions.h:39
+
TreeType::template ValueConverter< ValueType >::Type Type
Definition: DenseSparseTools.h:126
+
Definition: DenseSparseTools.h:174
+
OpMax< ValueT > OpT
Definition: DenseSparseTools.h:1215
+
Base class for tree-traversal iterators over all leaf nodes (but not leaf voxels) ...
Definition: TreeIterator.h:1228
+
Functor-based class used to extract data from a dense grid, at the index-space intersection with a su...
Definition: DenseSparseTools.h:440
+
SparseExtractor(const DenseType &dense, const OpType &functor, const ResultValueType background)
Definition: DenseSparseTools.h:226
+
SparseExtractor(SparseExtractor &other, tbb::split)
Definition: DenseSparseTools.h:253
+
Class that applies a functor to the index space intersection of a prescribed bounding box and the den...
Definition: DenseSparseTools.h:688
+
tbb::blocked_range2d< IntType, IntType > RangeType
Definition: DenseSparseTools.h:695
+
void join(SparseMaskedExtractor &rhs)
Definition: DenseSparseTools.h:580
+
void operator()(const RangeType &range) const
Definition: DenseSparseTools.h:739
+
void operator()(const DenseValueType &a, const CoordOrIndex &offset, ResultLeafNodeType *leaf) const
Definition: DenseSparseTools.h:604
+
const PointWiseOp mOp
Definition: DenseSparseTools.h:781
+
LeafNodeT * getLeaf() const
Return the leaf node to which the iterator is pointing.
Definition: TreeIterator.h:1271
+
static ValueT apply(const ValueT u, const ValueT alpha, const ValueT v, const ValueT s, const ValueT beta, const ValueT)
Definition: DenseSparseTools.h:1165
+
void setValue(size_t offset, const ValueT &value)
Set the value of the voxel at the given array offset.
Definition: Dense.h:284
+
_TreeT TreeT
Definition: DenseSparseTools.h:809
+
Dense< ValueT, openvdb::tools::LayoutZYX > DenseT
Definition: DenseSparseTools.h:771
+
void operator()(const Range3d &range)
Definition: DenseSparseTools.h:307
+
Point wise methods used to apply various compositing operations.
Definition: DenseSparseTools.h:1129
+
tbb::blocked_range3d< Index, Index, Index > Range3d
Definition: DenseSparseTools.h:210
+
OpSub< ValueT > OpT
Definition: DenseSparseTools.h:1209
+
Definition: Exceptions.h:88
+
static ValueT apply(const ValueT u, const ValueT alpha, const ValueT v, const ValueT s, const ValueT, const ValueT sbeta)
Definition: DenseSparseTools.h:1188
+
Definition: DenseSparseTools.h:1163
+
static ValueT apply(const ValueT u, const ValueT alpha, const ValueT v, const ValueT, const ValueT, const ValueT sbeta)
Definition: DenseSparseTools.h:1154
+
Definition: DenseSparseTools.h:123
+
MaskTree::LeafCIter MaskLeafCIter
Definition: DenseSparseTools.h:451
+
openvdb::math::Coord::ValueType IntType
Definition: DenseSparseTools.h:694
+
OpMin< ValueT > OpT
Definition: DenseSparseTools.h:1212
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
void operator()(const MaskLeafT &maskLeaf, size_t) const
Definition: DenseSparseTools.h:885
+
ResultTreeType::LeafNodeType ResultLeafNodeType
Definition: DenseSparseTools.h:446
+
static ValueT apply(const ValueT u, const ValueT alpha, const ValueT v, const ValueT, const ValueT, const ValueT sbeta)
Definition: DenseSparseTools.h:1143
+
A LeafManager manages a linear array of pointers to a given tree's leaf nodes, as well as optional au...
+
RootNodeType::LeafNodeType LeafNodeType
Definition: Tree.h:212
+
void transform(DenseT &dense, openvdb::math::Coord &ijk, size_t size) const
Definition: DenseSparseTools.h:772
+
void apply(bool threaded=true)
Definition: DenseSparseTools.h:718
+
static void compositeFromLeaf(DenseT &dense, const openvdb::math::CoordBBox &bbox, const LeafT1 &source, const LeafT2 &alpha, const ValueT beta, const ValueT strength)
Definition: DenseSparseTools.h:935
+
Definition: DenseSparseTools.h:174
+
MaskTreeT::LeafNodeType MaskLeafT
Definition: DenseSparseTools.h:813
+
static ValueT apply(const ValueT u, const ValueT alpha, const ValueT v, const ValueT strength, const ValueT beta, const ValueT)
Definition: DenseSparseTools.h:1131
+
Definition: DenseSparseTools.h:1152
+
void operator()(const tbb::blocked_range< size_t > &range)
Definition: DenseSparseTools.h:487
+
DenseTransformer(DenseT &dense, const openvdb::math::CoordBBox &bbox, const OpType &functor)
Definition: DenseSparseTools.h:705
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & min(const T &a, const T &b)
Definition: Composite.h:128
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/Dense_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/Dense_8h_source.html new file mode 100644 index 00000000..5c9b38f2 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/Dense_8h_source.html @@ -0,0 +1,636 @@ + + + + + + +OpenVDB: Dense.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Dense.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
35 
+
36 #ifndef OPENVDB_TOOLS_DENSE_HAS_BEEN_INCLUDED
+
37 #define OPENVDB_TOOLS_DENSE_HAS_BEEN_INCLUDED
+
38 
+
39 #include <openvdb/Types.h>
+
40 #include <openvdb/Grid.h>
+ +
42 #include <openvdb/Exceptions.h>
+
43 #include <openvdb/util/Formats.h>
+
44 #include <tbb/parallel_for.h>
+
45 #include <boost/scoped_array.hpp>
+
46 #include <boost/scoped_ptr.hpp>
+
47 #include "Prune.h"
+
48 
+
49 namespace openvdb {
+ +
51 namespace OPENVDB_VERSION_NAME {
+
52 namespace tools {
+
53 
+
59 template<typename DenseT, typename GridOrTreeT>
+
60 void
+ +
62  const GridOrTreeT& sparse,
+
63  DenseT& dense,
+
64  bool serial = false);
+
65 
+
66 
+
73 template<typename DenseT, typename GridOrTreeT>
+
74 void
+ +
76  const DenseT& dense,
+
77  GridOrTreeT& sparse,
+
78  const typename GridOrTreeT::ValueType& tolerance,
+
79  bool serial = false);
+
80 
+
81 
+
83 
+ +
93 
+
97 template<typename ValueT, MemoryLayout Layout> class DenseBase;
+
98 
+
102 template<typename ValueT>
+
103 class DenseBase<ValueT, LayoutZYX>
+
104 {
+
105 public:
+
112  inline size_t coordToOffset(size_t i, size_t j, size_t k) const { return i*mX + j*mY + k; }
+
113 
+
118  inline Coord offsetToLocalCoord(size_t n) const
+
119  {
+
120  const size_t x = n / mX;
+
121  n -= mX*x;
+
122  const size_t y = n / mY;
+
123  return Coord(Coord::ValueType(x), Coord::ValueType(y), Coord::ValueType(n - mY*y));
+
124  }
+
125 
+
128  inline size_t xStride() const { return mX; }
+
129 
+
132  inline size_t yStride() const { return mY; }
+
133 
+
136  static size_t zStride() { return 1; }
+
137 
+
138 protected:
+
140  DenseBase(const CoordBBox& bbox) : mBBox(bbox), mY(bbox.dim()[2]), mX(mY*bbox.dim()[1]) {}
+
141 
+
142  const CoordBBox mBBox;//signed coordinates of the domain represented by the grid
+
143  const size_t mY, mX;//strides in the y and x direction
+
144 };// end of DenseBase<ValueT, LayoutZYX>
+
145 
+
149 template<typename ValueT>
+
150 class DenseBase<ValueT, LayoutXYZ>
+
151 {
+
152 public:
+
159  inline size_t coordToOffset(size_t i, size_t j, size_t k) const { return i + j*mY + k*mZ; }
+
160 
+
165  inline Coord offsetToLocalCoord(size_t n) const
+
166  {
+
167  const size_t z = n / mZ;
+
168  n -= mZ*z;
+
169  const size_t y = n / mY;
+
170  return Coord(Coord::ValueType(n - mY*y), Coord::ValueType(y), Coord::ValueType(z));
+
171  }
+
172 
+
175  static size_t xStride() { return 1; }
+
176 
+
179  inline size_t yStride() const { return mY; }
+
180 
+
183  inline size_t zStride() const { return mZ; }
+
184 
+
185 protected:
+
187  DenseBase(const CoordBBox& bbox) : mBBox(bbox), mY(bbox.dim()[0]), mZ(mY*bbox.dim()[1]) {}
+
188 
+
189  const CoordBBox mBBox;//signed coordinates of the domain represented by the grid
+
190  const size_t mY, mZ;//strides in the y and z direction
+
191 };// end of DenseBase<ValueT, LayoutXYZ>
+
192 
+
205 template<typename ValueT, MemoryLayout Layout = LayoutZYX>
+
206 class Dense : public DenseBase<ValueT, Layout>
+
207 {
+
208 public:
+
209  typedef ValueT ValueType;
+ +
211  typedef boost::shared_ptr<Dense> Ptr;
+
212  typedef boost::shared_ptr<const Dense> ConstPtr;
+
213 
+
219  Dense(const CoordBBox& bbox) : BaseT(bbox) { this->init(); }
+
220 
+
227  Dense(const CoordBBox& bbox, const ValueT& value) : BaseT(bbox)
+
228  {
+
229  this->init();
+
230  this->fill(value);
+
231  }
+
232 
+
242  Dense(const CoordBBox& bbox, ValueT* data) : BaseT(bbox), mData(data)
+
243  {
+
244  if (BaseT::mBBox.empty()) {
+
245  OPENVDB_THROW(ValueError, "can't construct a dense grid with an empty bounding box");
+
246  }
+
247  }
+
248 
+
256  Dense(const Coord& dim, const Coord& min = Coord(0))
+
257  : BaseT(CoordBBox(min, min+dim.offsetBy(-1)))
+
258  {
+
259  this->init();
+
260  }
+
261 
+
263  static MemoryLayout memoryLayout() { return Layout; }
+
264 
+
267  inline ValueT* data() { return mData; }
+
268 
+
271  inline const ValueT* data() const { return mData; }
+
272 
+
275  inline const CoordBBox& bbox() const { return BaseT::mBBox; }
+
276 
+
278  inline const Coord& origin() const { return BaseT::mBBox.min(); }
+
279 
+
281  inline Index64 valueCount() const { return BaseT::mBBox.volume(); }
+
282 
+
284  inline void setValue(size_t offset, const ValueT& value) { mData[offset] = value; }
+
285 
+
287  const ValueT& getValue(size_t offset) const { return mData[offset]; }
+
288 
+
290  ValueT& getValue(size_t offset) { return mData[offset]; }
+
291 
+
294  inline void setValue(size_t i, size_t j, size_t k, const ValueT& value)
+
295  {
+
296  mData[BaseT::coordToOffset(i,j,k)] = value;
+
297  }
+
298 
+
301  inline const ValueT& getValue(size_t i, size_t j, size_t k) const
+
302  {
+
303  return mData[BaseT::coordToOffset(i,j,k)];
+
304  }
+
305 
+
308  inline ValueT& getValue(size_t i, size_t j, size_t k)
+
309  {
+
310  return mData[BaseT::coordToOffset(i,j,k)];
+
311  }
+
312 
+
315  inline void setValue(const Coord& xyz, const ValueT& value)
+
316  {
+
317  mData[this->coordToOffset(xyz)] = value;
+
318  }
+
319 
+
322  inline const ValueT& getValue(const Coord& xyz) const
+
323  {
+
324  return mData[this->coordToOffset(xyz)];
+
325  }
+
326 
+
329  inline ValueT& getValue(const Coord& xyz)
+
330  {
+
331  return mData[this->coordToOffset(xyz)];
+
332  }
+
333 
+
335  inline void fill(const ValueT& value)
+
336  {
+
337  size_t size = this->valueCount();
+
338  ValueT* a = mData;
+
339  while(size--) *a++ = value;
+
340  }
+
341 
+
348  inline size_t coordToOffset(const Coord& xyz) const
+
349  {
+
350  assert(BaseT::mBBox.isInside(xyz));
+
351  return BaseT::coordToOffset(size_t(xyz[0]-BaseT::mBBox.min()[0]),
+
352  size_t(xyz[1]-BaseT::mBBox.min()[1]),
+
353  size_t(xyz[2]-BaseT::mBBox.min()[2]));
+
354  }
+
355 
+
357  inline Coord offsetToCoord(size_t n) const
+
358  {
+
359  return this->offsetToLocalCoord(n) + BaseT::mBBox.min();
+
360  }
+
361 
+
363  inline Index64 memUsage() const
+
364  {
+
365  return sizeof(*this) + BaseT::mBBox.volume() * sizeof(ValueType);
+
366  }
+
367 
+
370  void print(const std::string& name = "", std::ostream& os = std::cout) const
+
371  {
+
372  const Coord dim = BaseT::mBBox.dim();
+
373  os << "Dense Grid";
+
374  if (!name.empty()) os << " \"" << name << "\"";
+
375  util::printBytes(os, this->memUsage(), ":\n Memory footprint: ");
+
376  os << " Dimensions of grid : " << dim[0] << " x " << dim[1] << " x " << dim[2] << "\n";
+
377  os << " Number of voxels: " << util::formattedInt(this->valueCount()) << "\n";
+
378  os << " Bounding box of voxels: " << BaseT::mBBox << "\n";
+
379  os << " Memory layout: " << (Layout == LayoutZYX ? "ZYX (" : "XYZ (dis")
+
380  << "similar to VDB)\n";
+
381  }
+
382 
+
383 private:
+
384 
+
386  void init()
+
387  {
+
388  if (BaseT::mBBox.empty()) {
+
389  OPENVDB_THROW(ValueError, "can't construct a dense grid with an empty bounding box");
+
390  }
+
391  mArray.reset(new ValueT[BaseT::mBBox.volume()]);
+
392  mData = mArray.get();
+
393  }
+
394 
+
395  boost::scoped_array<ValueT> mArray;
+
396  ValueT* mData;//raw c-style pointer to values
+
397 };// end of Dense
+
398 
+
400 
+
401 
+
408 template<typename _TreeT, typename _DenseT = Dense<typename _TreeT::ValueType> >
+ +
410 {
+
411 public:
+
412  typedef _DenseT DenseT;
+
413  typedef _TreeT TreeT;
+
414  typedef typename TreeT::ValueType ValueT;
+
415 
+
416  CopyToDense(const TreeT& tree, DenseT& dense)
+
417  : mRoot(&(tree.root())), mDense(&dense) {}
+
418 
+
419  void copy(bool serial = false) const
+
420  {
+
421  if (serial) {
+
422  mRoot->copyToDense(mDense->bbox(), *mDense);
+
423  } else {
+
424  tbb::parallel_for(mDense->bbox(), *this);
+
425  }
+
426  }
+
427 
+
429  void operator()(const CoordBBox& bbox) const
+
430  {
+
431  mRoot->copyToDense(bbox, *mDense);
+
432  }
+
433 
+
434 private:
+
435  const typename TreeT::RootNodeType* mRoot;
+
436  DenseT* mDense;
+
437 };// CopyToDense
+
438 
+
439 
+
440 // Convenient wrapper function for the CopyToDense class
+
441 template<typename DenseT, typename GridOrTreeT>
+
442 void
+
443 copyToDense(const GridOrTreeT& sparse, DenseT& dense, bool serial)
+
444 {
+
445  typedef TreeAdapter<GridOrTreeT> Adapter;
+
446  typedef typename Adapter::TreeType TreeT;
+
447 
+
448  CopyToDense<TreeT, DenseT> op(Adapter::constTree(sparse), dense);
+
449  op.copy(serial);
+
450 }
+
451 
+
452 
+
454 
+
455 
+
465 template<typename _TreeT, typename _DenseT = Dense<typename _TreeT::ValueType> >
+ +
467 {
+
468 public:
+
469  typedef _DenseT DenseT;
+
470  typedef _TreeT TreeT;
+
471  typedef typename TreeT::ValueType ValueT;
+
472  typedef typename TreeT::LeafNodeType LeafT;
+ +
474 
+
475  CopyFromDense(const DenseT& dense, TreeT& tree, const ValueT& tolerance)
+
476  : mDense(&dense),
+
477  mTree(&tree),
+
478  mBlocks(NULL),
+
479  mTolerance(tolerance),
+
480  mAccessor(tree.empty() ? NULL : new AccessorT(tree))
+
481  {
+
482  }
+ +
484  : mDense(other.mDense),
+
485  mTree(other.mTree),
+
486  mBlocks(other.mBlocks),
+
487  mTolerance(other.mTolerance),
+
488  mAccessor(other.mAccessor.get() == NULL ? NULL : new AccessorT(*mTree))
+
489  {
+
490  }
+
491 
+
493  void copy(bool serial = false)
+
494  {
+
495  mBlocks = new std::vector<Block>();
+
496  const CoordBBox& bbox = mDense->bbox();
+
497  // Pre-process: Construct a list of blocks aligned with (potential) leaf nodes
+
498  for (CoordBBox sub=bbox; sub.min()[0] <= bbox.max()[0]; sub.min()[0] = sub.max()[0] + 1) {
+
499  for (sub.min()[1] = bbox.min()[1]; sub.min()[1] <= bbox.max()[1];
+
500  sub.min()[1] = sub.max()[1] + 1)
+
501  {
+
502  for (sub.min()[2] = bbox.min()[2]; sub.min()[2] <= bbox.max()[2];
+
503  sub.min()[2] = sub.max()[2] + 1)
+
504  {
+
505  sub.max() = Coord::minComponent(bbox.max(),
+
506  (sub.min()&(~(LeafT::DIM-1u))).offsetBy(LeafT::DIM-1u));
+
507  mBlocks->push_back(Block(sub));
+
508  }
+
509  }
+
510  }
+
511 
+
512  // Multi-threaded process: Convert dense grid into leaf nodes and tiles
+
513  if (serial) {
+
514  (*this)(tbb::blocked_range<size_t>(0, mBlocks->size()));
+
515  } else {
+
516  tbb::parallel_for(tbb::blocked_range<size_t>(0, mBlocks->size()), *this);
+
517  }
+
518 
+
519  // Post-process: Insert leaf nodes and tiles into the tree, and prune the tiles only!
+
520  tree::ValueAccessor<TreeT> acc(*mTree);
+
521  for (size_t m=0, size = mBlocks->size(); m<size; ++m) {
+
522  Block& block = (*mBlocks)[m];
+
523  if (block.leaf) {
+
524  acc.addLeaf(block.leaf);
+
525  } else if (block.tile.second) {//only background tiles are inactive
+
526  acc.addTile(1, block.bbox.min(), block.tile.first, true);//leaf tile
+
527  }
+
528  }
+
529  delete mBlocks;
+
530  mBlocks = NULL;
+
531 
+
532  tools::pruneTiles(*mTree, mTolerance);//multi-threaded
+
533  }
+
534 
+
537  void operator()(const tbb::blocked_range<size_t> &r) const
+
538  {
+
539  assert(mBlocks);
+
540  LeafT* leaf = new LeafT();
+
541 
+
542  for (size_t m=r.begin(), n=0, end = r.end(); m != end; ++m, ++n) {
+
543 
+
544  Block& block = (*mBlocks)[m];
+
545  const CoordBBox &bbox = block.bbox;
+
546 
+
547  if (mAccessor.get() == NULL) {//i.e. empty target tree
+
548  leaf->fill(mTree->background(), false);
+
549  } else {//account for existing leaf nodes in the target tree
+
550  if (const LeafT* target = mAccessor->probeConstLeaf(bbox.min())) {
+
551  (*leaf) = (*target);
+
552  } else {
+
553  ValueT value = zeroVal<ValueT>();
+
554  bool state = mAccessor->probeValue(bbox.min(), value);
+
555  leaf->fill(value, state);
+
556  }
+
557  }
+
558 
+
559  leaf->copyFromDense(bbox, *mDense, mTree->background(), mTolerance);
+
560 
+
561  if (!leaf->isConstant(block.tile.first, block.tile.second, mTolerance)) {
+
562  leaf->setOrigin(bbox.min() & (~(LeafT::DIM - 1)));
+
563  block.leaf = leaf;
+
564  leaf = new LeafT();
+
565  }
+
566  }// loop over blocks
+
567 
+
568  delete leaf;
+
569  }
+
570 
+
571 private:
+
572  struct Block {
+
573  CoordBBox bbox;
+
574  LeafT* leaf;
+
575  std::pair<ValueT, bool> tile;
+
576  Block(const CoordBBox& b) : bbox(b), leaf(NULL) {}
+
577  };
+
578 
+
579  const DenseT* mDense;
+
580  TreeT* mTree;
+
581  std::vector<Block>* mBlocks;
+
582  ValueT mTolerance;
+
583  boost::scoped_ptr<AccessorT> mAccessor;
+
584 };// CopyFromDense
+
585 
+
586 
+
587 // Convenient wrapper function for the CopyFromDense class
+
588 template<typename DenseT, typename GridOrTreeT>
+
589 void
+
590 copyFromDense(const DenseT& dense, GridOrTreeT& sparse,
+
591  const typename GridOrTreeT::ValueType& tolerance, bool serial)
+
592 {
+
593  typedef TreeAdapter<GridOrTreeT> Adapter;
+
594  typedef typename Adapter::TreeType TreeT;
+
595 
+
596  CopyFromDense<TreeT, DenseT> op(dense, Adapter::tree(sparse), tolerance);
+
597  op.copy(serial);
+
598 }
+
599 
+
600 } // namespace tools
+
601 } // namespace OPENVDB_VERSION_NAME
+
602 } // namespace openvdb
+
603 
+
604 #endif // OPENVDB_TOOLS_DENSE_HAS_BEEN_INCLUDED
+
605 
+
606 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
607 // All rights reserved. This software is distributed under the
+
608 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
void addLeaf(LeafNodeT *leaf)
Add the specified leaf to this tree, possibly creating a child branch in the process. If the leaf node already exists, replace it.
Definition: ValueAccessor.h:374
+
Coord offsetToCoord(size_t n) const
Return the global coordinate corresponding to the specified linear offset.
Definition: Dense.h:357
+
void operator()(const tbb::blocked_range< size_t > &r) const
Public method called by tbb::parallel_for.
Definition: Dense.h:537
+
const CoordBBox & bbox() const
Return the bounding box of the signed index domain of this grid.
Definition: Dense.h:275
+
const ValueT & getValue(size_t offset) const
Return a const reference to the value of the voxel at the given array offset.
Definition: Dense.h:287
+ +
size_t yStride() const
Return the stride of the array in the y direction ( = dimZ).
Definition: Dense.h:132
+
Utility routines to output nicely-formatted numeric values.
+
const Coord & origin() const
Return the grid's origin in index coordinates.
Definition: Dense.h:278
+
Definition: Dense.h:92
+
size_t zStride() const
Return the stride of the array in the y direction ( = dimX*dimY).
Definition: Dense.h:183
+
Vec2< T > minComponent(const Vec2< T > &v1, const Vec2< T > &v2)
Return component-wise minimum of the two vectors.
Definition: Vec2.h:519
+
void copyToDense(const GridOrTreeT &sparse, DenseT &dense, bool serial=false)
Populate a dense grid with the values of voxels from a sparse grid, where the sparse grid intersects ...
Definition: Dense.h:443
+
TreeT::ValueType ValueT
Definition: Dense.h:414
+
const ValueT & getValue(const Coord &xyz) const
Return a const reference to the value of the voxel at the given signed coordinates.
Definition: Dense.h:322
+
size_t coordToOffset(size_t i, size_t j, size_t k) const
Return the linear offset into this grid's value array given by unsigned coordinates (i...
Definition: Dense.h:159
+
void copy(bool serial=false)
Copy values from the dense grid to the sparse tree.
Definition: Dense.h:493
+
Definition: Dense.h:92
+
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
+
TreeT::ValueType ValueT
Definition: Dense.h:471
+
Copy an OpenVDB tree into an existing dense grid.
Definition: Dense.h:409
+
Coord offsetToLocalCoord(size_t n) const
Return the index coordinate corresponding to the specified linear offset.
Definition: Dense.h:165
+
size_t coordToOffset(size_t i, size_t j, size_t k) const
Return the linear offset into this grid's value array given by unsigned coordinates (i...
Definition: Dense.h:112
+
size_t xStride() const
Return the stride of the array in the x direction ( = dimY*dimZ).
Definition: Dense.h:128
+
FormattedInt< IntT > formattedInt(IntT n)
Definition: Formats.h:130
+
TreeT::LeafNodeType LeafT
Definition: Dense.h:472
+
CopyFromDense(const DenseT &dense, TreeT &tree, const ValueT &tolerance)
Definition: Dense.h:475
+ + +
Dense is a simple dense grid API used by the CopyToDense and CopyFromDense classes defined below...
Definition: Dense.h:206
+
Defined various multi-threaded utility functions for trees.
+
const int size
Definition: MaskToLevelSet.h:119
+
void copyFromDense(const DenseT &dense, GridOrTreeT &sparse, const typename GridOrTreeT::ValueType &tolerance, bool serial=false)
Populate a sparse grid with the values of all of the voxels of a dense grid.
Definition: Dense.h:590
+
Dense(const CoordBBox &bbox, const ValueT &value)
Construct a dense grid with a given range of coordinates and initial value.
Definition: Dense.h:227
+
const CoordBBox mBBox
Definition: Dense.h:189
+
uint64_t Index64
Definition: Types.h:57
+
boost::shared_ptr< const Dense > ConstPtr
Definition: Dense.h:212
+ +
ValueT & getValue(size_t offset)
Return a non-const reference to the value of the voxel at the given array offset. ...
Definition: Dense.h:290
+ +
static size_t xStride()
Return the stride of the array in the x direction ( = 1).
Definition: Dense.h:175
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
const ValueT & getValue(size_t i, size_t j, size_t k) const
Return a const reference to the value of the voxel at unsigned index coordinates (i, j, k).
Definition: Dense.h:301
+
boost::shared_ptr< Dense > Ptr
Definition: Dense.h:211
+
Coord offsetToLocalCoord(size_t n) const
Return the local coordinate corresponding to the specified linear offset.
Definition: Dense.h:118
+
static MemoryLayout memoryLayout()
Return the memory layout for this grid (see above for definitions).
Definition: Dense.h:263
+
void setValue(size_t i, size_t j, size_t k, const ValueT &value)
Set the value of the voxel at unsigned index coordinates (i, j, k).
Definition: Dense.h:294
+
_TreeT TreeT
Definition: Dense.h:413
+
This adapter allows code that is templated on a Tree type to accept either a Tree type or a Grid type...
Definition: Grid.h:883
+
Index64 memUsage() const
Return the memory footprint of this Dense grid in bytes.
Definition: Dense.h:363
+
_TreeT TreeT
Definition: Dense.h:470
+
Definition: Exceptions.h:39
+
void addTile(Index level, const Coord &xyz, const ValueType &value, bool state)
Add a tile at the specified tree level that contains voxel (x, y, z), possibly deleting existing node...
Definition: ValueAccessor.h:382
+
const CoordBBox mBBox
Definition: Dense.h:142
+
CopyToDense(const TreeT &tree, DenseT &dense)
Definition: Dense.h:416
+
ValueT & getValue(size_t i, size_t j, size_t k)
Return a non-const reference to the value of the voxel at unsigned index coordinates (i...
Definition: Dense.h:308
+
static size_t zStride()
Return the stride of the array in the z direction ( = 1).
Definition: Dense.h:136
+
_DenseT DenseT
Definition: Dense.h:469
+
Dense(const CoordBBox &bbox, ValueT *data)
Construct a dense grid that wraps an external array.
Definition: Dense.h:242
+
ValueT ValueType
Definition: Dense.h:209
+
void copy(bool serial=false) const
Definition: Dense.h:419
+ +
void setValue(size_t offset, const ValueT &value)
Set the value of the voxel at the given array offset.
Definition: Dense.h:284
+
MemoryLayout
Definition: Dense.h:92
+
const ValueT * data() const
Return a raw pointer to this grid's value array.
Definition: Dense.h:271
+
void pruneTiles(TreeT &tree, typename TreeT::ValueType tolerance=zeroVal< typename TreeT::ValueType >(), bool threaded=true, size_t grainSize=1)
Reduce the memory footprint of a tree by replacing with tiles any non-leaf nodes whose values are all...
Definition: Prune.h:357
+
Index64 valueCount() const
Return the number of voxels contained in this grid.
Definition: Dense.h:281
+
void print(const std::string &name="", std::ostream &os=std::cout) const
Output a human-readable description of this grid to the specified stream.
Definition: Dense.h:370
+
tree::ValueAccessor< TreeT > AccessorT
Definition: Dense.h:473
+ +
Definition: Exceptions.h:88
+
DenseBase< ValueT, Layout > BaseT
Definition: Dense.h:210
+
Copy the values from a dense grid into an OpenVDB tree.
Definition: Dense.h:466
+
void setValue(const Coord &xyz, const ValueT &value)
Set the value of the voxel at the given signed coordinates.
Definition: Dense.h:315
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
size_t coordToOffset(const Coord &xyz) const
Return the linear offset into this grid's value array given by the specified signed coordinates...
Definition: Dense.h:348
+
Dense(const CoordBBox &bbox)
Construct a dense grid with a given range of coordinates.
Definition: Dense.h:219
+
void fill(const ValueT &value)
Fill this grid with a constant value.
Definition: Dense.h:335
+
CopyFromDense(const CopyFromDense &other)
Definition: Dense.h:483
+
size_t yStride() const
Return the stride of the array in the y direction ( = dimX).
Definition: Dense.h:179
+
TreeT * tree
Definition: MaskToLevelSet.h:118
+
DenseBase(const CoordBBox &bbox)
Protected constructor so as to prevent direct instantiation.
Definition: Dense.h:140
+
DenseBase(const CoordBBox &bbox)
Protected constructor so as to prevent direct instantiation.
Definition: Dense.h:187
+
ValueT & getValue(const Coord &xyz)
Return a non-const reference to the value of the voxel at the given signed coordinates.
Definition: Dense.h:329
+
OPENVDB_API int printBytes(std::ostream &os, uint64_t bytes, const std::string &head="", const std::string &tail="\n", bool exact=false, int width=8, int precision=3)
+
Dense(const Coord &dim, const Coord &min=Coord(0))
Construct a dense grid with a given origin and dimensions.
Definition: Dense.h:256
+
Base class for Dense which is defined below.
Definition: Dense.h:97
+
_DenseT DenseT
Definition: Dense.h:412
+
void operator()(const CoordBBox &bbox) const
Public method called by tbb::parallel_for.
Definition: Dense.h:429
+
ValueT * data()
Return a raw pointer to this grid's value array.
Definition: Dense.h:267
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & min(const T &a, const T &b)
Definition: Composite.h:128
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/Diagnostics_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/Diagnostics_8h_source.html new file mode 100644 index 00000000..9b713c21 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/Diagnostics_8h_source.html @@ -0,0 +1,1380 @@ + + + + + + +OpenVDB: Diagnostics.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Diagnostics.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
38 #ifndef OPENVDB_TOOLS_DIAGNOSTICS_HAS_BEEN_INCLUDED
+
39 #define OPENVDB_TOOLS_DIAGNOSTICS_HAS_BEEN_INCLUDED
+
40 
+
41 #include <openvdb/Grid.h>
+
42 #include <openvdb/math/Math.h>
+
43 #include <openvdb/math/Vec3.h>
+
44 #include <openvdb/math/Stencils.h>
+
45 #include <openvdb/math/Operators.h>
+ +
47 #include <tbb/blocked_range.h>
+
48 #include <tbb/parallel_reduce.h>
+
49 #include <set>
+
50 #include <boost/math/special_functions/fpclassify.hpp>
+
51 #include <boost/utility/enable_if.hpp>
+
52 
+
53 namespace openvdb {
+ +
55 namespace OPENVDB_VERSION_NAME {
+
56 namespace tools {
+
57 
+
59 
+
85 template<class GridType>
+
86 std::string
+
87 checkLevelSet(const GridType& grid, size_t number=9);
+
88 
+
90 
+
109 template<class GridType>
+
110 std::string
+
111 checkFogVolume(const GridType& grid, size_t number=6);
+
112 
+
114 
+
121 template<class GridType>
+
122 bool
+
123 uniqueInactiveValues(const GridType& grid,
+
124  std::vector<typename GridType::ValueType>& values, size_t numValues);
+
125 
+
126 
+
128 
+
130 template <typename GridT,
+
131  typename TreeIterT = typename GridT::ValueOnCIter>
+
132 struct CheckNan
+
133 {
+ +
135  typedef TreeIterT TileIterT;
+ +
137  ::template NodeConverter<typename GridT::TreeType::LeafNodeType>::Type VoxelIterT;
+
138 
+
140  CheckNan() {}
+
141 
+
143  inline bool operator()(const ElementType& v) const { return boost::math::isnan(v); }
+
144 
+
146  template <typename T>
+
147  inline typename boost::enable_if_c<VecTraits<T>::IsVec, bool>::type
+
148  operator()(const T& v) const
+
149  {
+
150  for (int i=0; i<VecTraits<T>::Size; ++i) if ((*this)(v[i])) return true;//should unroll
+
151  return false;
+
152  }
+
153 
+
155  bool operator()(const TreeIterT &iter) const { return (*this)(*iter); }
+
156 
+
158  bool operator()(const VoxelIterT &iter) const { return (*this)(*iter); }
+
159 
+
161  std::string str() const { return "NaN"; }
+
162 
+
163 };// CheckNan
+
164 
+
166 
+
168 template <typename GridT,
+
169  typename TreeIterT = typename GridT::ValueOnCIter>
+
170 struct CheckInf
+
171 {
+ +
173  typedef TreeIterT TileIterT;
+ +
175  ::template NodeConverter<typename GridT::TreeType::LeafNodeType>::Type VoxelIterT;
+
176 
+
178  CheckInf() {}
+
179 
+
181  inline bool operator()(const ElementType& v) const { return boost::math::isinf(v); }
+
182 
+
184  template <typename T> inline typename boost::enable_if_c<VecTraits<T>::IsVec, bool>::type
+
185  operator()(const T& v) const
+
186  {
+
187  for (int i=0; i<VecTraits<T>::Size; ++i) if ((*this)(v[i])) return true;
+
188  return false;
+
189  }
+
190 
+
192  bool operator()(const TreeIterT &iter) const { return (*this)(*iter); }
+
193 
+
195  bool operator()(const VoxelIterT &iter) const { return (*this)(*iter); }
+
196 
+
198  std::string str() const { return "infinite"; }
+
199 };// CheckInf
+
200 
+
202 
+
204 template <typename GridT,
+
205  typename TreeIterT = typename GridT::ValueOnCIter>
+ +
207 {
+ +
209  typedef TreeIterT TileIterT;
+ +
211  ::template NodeConverter<typename GridT::TreeType::LeafNodeType>::Type VoxelIterT;
+
212 
+ +
215 
+
217  inline bool operator()(const ElementType& v) const { return !boost::math::isfinite(v); }
+
218 
+
220  template <typename T>
+
221  inline typename boost::enable_if_c<VecTraits<T>::IsVec, bool>::type
+
222  operator()(const T& v) const {
+
223  for (int i=0; i<VecTraits<T>::Size; ++i) if ((*this)(v[i])) return true;
+
224  return false;
+
225  }
+
226 
+
228  bool operator()(const TreeIterT &iter) const { return (*this)(*iter); }
+
229 
+
231  bool operator()(const VoxelIterT &iter) const { return (*this)(*iter); }
+
232 
+
234  std::string str() const { return "not finite"; }
+
235 };// CheckFinite
+
236 
+
238 
+
241 template <typename GridT,
+
242  typename TreeIterT = typename GridT::ValueOffCIter>
+ +
244 {
+ +
246  typedef TreeIterT TileIterT;
+ +
248  ::template NodeConverter<typename GridT::TreeType::LeafNodeType>::Type VoxelIterT;
+
249 
+
251  CheckMagnitude(const ElementType& a,
+
252  const ElementType& t = math::Tolerance<ElementType>::value())
+
253  : absVal(math::Abs(a)), tolVal(math::Abs(t))
+
254  {
+
255  }
+
256 
+
259  inline bool operator()(const ElementType& v) const
+
260  {
+
261  return math::Abs(math::Abs(v) - absVal) > tolVal;
+
262  }
+
263 
+
265  template <typename T> inline typename boost::enable_if_c<VecTraits<T>::IsVec, bool>::type
+
266  operator()(const T& v) const
+
267  {
+
268  for (int i=0; i<VecTraits<T>::Size; ++i) if ((*this)(v[i])) return true;
+
269  return false;
+
270  }
+
271 
+
273  bool operator()(const TreeIterT &iter) const { return (*this)(*iter); }
+
274 
+
276  bool operator()(const VoxelIterT &iter) const { return (*this)(*iter); }
+
277 
+
279  std::string str() const
+
280  {
+
281  std::ostringstream ss;
+
282  ss << "not equal to +/-"<<absVal<<" with a tolerance of "<<tolVal;
+
283  return ss.str();
+
284  }
+
285 
+
286  const ElementType absVal, tolVal;
+
287 };// CheckMagnitude
+
288 
+
290 
+
292 template <typename GridT,
+
293  bool MinInclusive = true,//is min part of the range?
+
294  bool MaxInclusive = true,//is max part of the range?
+
295  typename TreeIterT = typename GridT::ValueOnCIter>
+ +
297 {
+ +
299  typedef TreeIterT TileIterT;
+ +
301  ::template NodeConverter<typename GridT::TreeType::LeafNodeType>::Type VoxelIterT;
+
302 
+
303  // @brief Constructor taking a range to be tested against.
+
304  CheckRange(const ElementType& _min, const ElementType& _max) : minVal(_min), maxVal(_max)
+
305  {
+
306  if (minVal > maxVal) {
+
307  OPENVDB_THROW(ValueError, "CheckRange: Invalid range (min > max)");
+
308  }
+
309  }
+
310 
+
312  inline bool operator()(const ElementType& v) const
+
313  {
+
314  return (MinInclusive ? v<minVal : v<=minVal) ||
+
315  (MaxInclusive ? v>maxVal : v>=maxVal);
+
316  }
+
317 
+
319  template <typename T>
+
320  inline typename boost::enable_if_c<VecTraits<T>::IsVec, bool>::type
+
321  operator()(const T& v) const {
+
322  for (int i=0; i<VecTraits<T>::Size; ++i) if ((*this)(v[i])) return true;
+
323  return false;
+
324  }
+
325 
+
327  bool operator()(const TreeIterT &iter) const { return (*this)(*iter); }
+
328 
+
330  bool operator()(const VoxelIterT &iter) const { return (*this)(*iter); }
+
331 
+
333  std::string str() const
+
334  {
+
335  std::ostringstream ss;
+
336  ss << "outside the value range " << (MinInclusive ? "[" : "]")
+
337  << minVal << "," << maxVal << (MaxInclusive ? "]" : "[");
+
338  return ss.str();
+
339  }
+
340 
+
341  const ElementType minVal, maxVal;
+
342 };// CheckRange
+
343 
+
345 
+
347 template <typename GridT,
+
348  typename TreeIterT = typename GridT::ValueOnCIter>
+
349 struct CheckMin
+
350 {
+ +
352  typedef TreeIterT TileIterT;
+ +
354  ::template NodeConverter<typename GridT::TreeType::LeafNodeType>::Type VoxelIterT;
+
355 
+
356  // @brief Constructor taking a minimum to be tested against.
+
357  CheckMin(const ElementType& _min) : minVal(_min) {}
+
358 
+
360  inline bool operator()(const ElementType& v) const { return v<minVal; }
+
361 
+
363  template <typename T>
+
364  inline typename boost::enable_if_c<VecTraits<T>::IsVec, bool>::type
+
365  operator()(const T& v) const {
+
366  for (int i=0; i<VecTraits<T>::Size; ++i) if ((*this)(v[i])) return true;
+
367  return false;
+
368  }
+
369 
+
371  bool operator()(const TreeIterT &iter) const { return (*this)(*iter); }
+
372 
+
374  bool operator()(const VoxelIterT &iter) const { return (*this)(*iter); }
+
375 
+
377  std::string str() const
+
378  {
+
379  std::ostringstream ss;
+
380  ss << "smaller than "<<minVal;
+
381  return ss.str();
+
382  }
+
383 
+
384  const ElementType minVal;
+
385 };// CheckMin
+
386 
+
388 
+
390 template <typename GridT,
+
391  typename TreeIterT = typename GridT::ValueOnCIter>
+
392 struct CheckMax
+
393 {
+ +
395  typedef TreeIterT TileIterT;
+ +
397  ::template NodeConverter<typename GridT::TreeType::LeafNodeType>::Type VoxelIterT;
+
398 
+
400  CheckMax(const ElementType& _max) : maxVal(_max) {}
+
401 
+
403  inline bool operator()(const ElementType& v) const { return v>maxVal; }
+
404 
+
406  template <typename T>
+
407  inline typename boost::enable_if_c<VecTraits<T>::IsVec, bool>::type
+
408  operator()(const T& v) const {
+
409  for (int i=0; i<VecTraits<T>::Size; ++i) if ((*this)(v[i])) return true;
+
410  return false;
+
411  }
+
412 
+
414  bool operator()(const TreeIterT &iter) const { return (*this)(*iter); }
+
415 
+
417  bool operator()(const VoxelIterT &iter) const { return (*this)(*iter); }
+
418 
+
420  std::string str() const
+
421  {
+
422  std::ostringstream ss;
+
423  ss << "larger than "<<maxVal;
+
424  return ss.str();
+
425  }
+
426 
+
427  const ElementType maxVal;
+
428 };// CheckMax
+
429 
+
431 
+
436 template<typename GridT,
+
437  typename TreeIterT = typename GridT::ValueOnCIter,
+
438  math::BiasedGradientScheme GradScheme = math::FIRST_BIAS>//math::WENO5_BIAS>
+ +
440 {
+
441  typedef typename GridT::ValueType ValueType;
+
442  BOOST_STATIC_ASSERT(boost::is_floating_point<ValueType>::value);
+
443  typedef TreeIterT TileIterT;
+ +
445  ::template NodeConverter<typename GridT::TreeType::LeafNodeType>::Type VoxelIterT;
+
446  typedef typename GridT::ConstAccessor AccT;
+
447 
+
449  CheckNormGrad(const GridT& grid, const ValueType& _min, const ValueType& _max)
+
450  : acc(grid.getConstAccessor())
+
451  , invdx2(ValueType(1.0/math::Pow2(grid.voxelSize()[0])))
+
452  , minVal2(_min*_min)
+
453  , maxVal2(_max*_max)
+
454  {
+
455  if ( !grid.hasUniformVoxels() ) {
+
456  OPENVDB_THROW(ValueError, "CheckNormGrad: The transform must have uniform scale");
+
457  }
+
458  if (_min > _max) {
+
459  OPENVDB_THROW(ValueError, "CheckNormGrad: Invalid range (min > max)");
+
460  }
+
461  }
+
462 
+ +
464  : acc(other.acc.tree())
+
465  , invdx2(other.invdx2)
+
466  , minVal2(other.minVal2)
+
467  , maxVal2(other.maxVal2)
+
468  {
+
469  }
+
470 
+
472  inline bool operator()(const ValueType& v) const { return v<minVal2 || v>maxVal2; }
+
473 
+
476  inline bool operator()(const TreeIterT&) const { return (*this)(ValueType(0)); }
+
477 
+
480  inline bool operator()(const VoxelIterT &iter) const
+
481  {
+
482  const Coord ijk = iter.getCoord();
+
483  return (*this)(invdx2 * math::ISGradientNormSqrd<GradScheme>::result(acc, ijk));
+
484  }
+
485 
+
487  std::string str() const
+
488  {
+
489  std::ostringstream ss;
+
490  ss << "outside the range of NormGrad ["<<math::Sqrt(minVal2)<<","<<math::Sqrt(maxVal2)<<"]";
+
491  return ss.str();
+
492  }
+
493 
+
494  AccT acc;
+
495  const ValueType invdx2, minVal2, maxVal2;
+
496 };// CheckNormGrad
+
497 
+
499 
+
504 template<typename GridT,
+
505  typename TreeIterT = typename GridT::ValueOnCIter,
+
506  typename StencilT = math::WenoStencil<GridT> >//math::GradStencil<GridT>
+ +
508 {
+
509  typedef typename GridT::ValueType ValueType;
+
510  BOOST_STATIC_ASSERT(boost::is_floating_point<ValueType>::value);
+
511  typedef TreeIterT TileIterT;
+ +
513  ::template NodeConverter<typename GridT::TreeType::LeafNodeType>::Type VoxelIterT;
+
514 
+
516  CheckEikonal(const GridT& grid, const ValueType& _min, const ValueType& _max)
+
517  : stencil(grid), minVal(_min), maxVal(_max)
+
518  {
+
519  if ( !grid.hasUniformVoxels() ) {
+
520  OPENVDB_THROW(ValueError, "CheckEikonal: The transform must have uniform scale");
+
521  }
+
522  if (minVal > maxVal) {
+
523  OPENVDB_THROW(ValueError, "CheckEikonal: Invalid range (min > max)");
+
524  }
+
525  }
+
526 
+ +
528  : stencil(other.stencil.grid()), minVal(other.minVal), maxVal(other.maxVal)
+
529  {
+
530  }
+
531 
+
533  inline bool operator()(const ValueType& v) const { return v<minVal || v>maxVal; }
+
534 
+
537  inline bool operator()(const TreeIterT&) const { return (*this)(ValueType(0)); }
+
538 
+
541  inline bool operator()(const VoxelIterT &iter) const
+
542  {
+
543  stencil.moveTo(iter);
+
544  if (!stencil.zeroCrossing()) return false;
+
545  return (*this)(stencil.normSqGrad());
+
546  }
+
547 
+
549  std::string str() const
+
550  {
+
551  std::ostringstream ss;
+
552  ss << "outside the range of NormGrad ["<<minVal<<","<<maxVal<<"]";
+
553  return ss.str();
+
554  }
+
555 
+
556  mutable StencilT stencil;
+
557  const ValueType minVal, maxVal;
+
558 };// CheckEikonal
+
559 
+
561 
+
563 template<typename GridT,
+
564  typename TreeIterT = typename GridT::ValueOnCIter,
+
565  math::DScheme DiffScheme = math::CD_2ND>
+ +
567 {
+
568  typedef typename GridT::ValueType ValueType;
+ +
570  BOOST_STATIC_ASSERT(boost::is_floating_point<ElementType>::value);
+
571  typedef TreeIterT TileIterT;
+ +
573  ::template NodeConverter<typename GridT::TreeType::LeafNodeType>::Type VoxelIterT;
+
574  typedef typename GridT::ConstAccessor AccT;
+
575 
+
577  CheckDivergence(const GridT& grid,
+
578  const ValueType& _min,
+
579  const ValueType& _max)
+
580  : acc(grid.getConstAccessor())
+
581  , invdx(ValueType(1.0/grid.voxelSize()[0]))
+
582  , minVal(_min)
+
583  , maxVal(_max)
+
584  {
+
585  if ( !grid.hasUniformVoxels() ) {
+
586  OPENVDB_THROW(ValueError, "CheckDivergence: The transform must have uniform scale");
+
587  }
+
588  if (minVal > maxVal) {
+
589  OPENVDB_THROW(ValueError, "CheckDivergence: Invalid range (min > max)");
+
590  }
+
591  }
+
593  inline bool operator()(const ElementType& v) const { return v<minVal || v>maxVal; }
+
594 
+
597  inline bool operator()(const TreeIterT&) const { return (*this)(ElementType(0)); }
+
598 
+
601  inline bool operator()(const VoxelIterT &iter) const
+
602  {
+
603  const Coord ijk = iter.getCoord();
+
604  return (*this)(invdx * math::ISDivergence<DiffScheme>::result(acc, ijk));
+
605  }
+
606 
+
608  std::string str() const
+
609  {
+
610  std::ostringstream ss;
+
611  ss << "outside the range of divergence ["<<minVal<<","<<maxVal<<"]";
+
612  return ss.str();
+
613  }
+
614 
+
615  AccT acc;
+
616  const ValueType invdx, minVal, maxVal;
+
617 };// CheckDivergence
+
618 
+
620 
+
623 template <typename GridT>
+
624 class Diagnose
+
625 {
+
626  public:
+
627  typedef typename GridT::template ValueConverter<bool>::Type MaskType;
+
628 
+
629  Diagnose(const GridT& grid) : mGrid(&grid), mMask(new MaskType()), mCount(0)
+
630  {
+
631  mMask->setTransform(grid.transformPtr()->copy());
+
632  }
+
633 
+
634  template <typename CheckT>
+
635  std::string check(const CheckT& check,
+
636  bool updateMask = false,
+
637  bool checkVoxels = true,
+
638  bool checkTiles = true,
+
639  bool checkBackground = true)
+
640  {
+
641  typename MaskType::TreeType* mask = updateMask ? &(mMask->tree()) : NULL;
+
642  CheckValues<CheckT> cc(mask, mGrid, check);
+
643  std::ostringstream ss;
+
644  if (checkBackground) ss << cc.checkBackground();
+
645  if (checkTiles) ss << cc.checkTiles();
+
646  if (checkVoxels) ss << cc.checkVoxels();
+
647  mCount += cc.mCount;
+
648  return ss.str();
+
649  }
+
650 
+
652  typename MaskType::ConstPtr mask() const { return mMask; }
+
656  typename MaskType::Ptr mask() { return mMask; }
+
658 
+
661  Index64 valueCount() const { return mMask->activeVoxelCount(); }
+
662 
+
666  Index64 failureCount() const { return mCount; }
+
667 
+
669  const GridT& grid() const { return *mGrid; }
+
670 
+
672  void clear() { mMask = new MaskType(); mCount = 0; }
+
673 
+
674 private:
+
675  // disallow copy construction and copy by assignment!
+
676  Diagnose(const Diagnose&);// not implemented
+
677  Diagnose& operator=(const Diagnose&);// not implemented
+
678 
+
679  const GridT* mGrid;
+
680  typename MaskType::Ptr mMask;
+
681  Index64 mCount;
+
682 
+
684  template <typename CheckT>
+
685  struct CheckValues
+
686  {
+
687  typedef typename MaskType::TreeType MaskT;
+
688  typedef typename GridT::TreeType::LeafNodeType LeafT;
+
689  typedef typename tree::LeafManager<const typename GridT::TreeType> LeafManagerT;
+
690  const bool mOwnsMask;
+
691  MaskT* mMask;
+
692  const GridT* mGrid;
+
693  const CheckT mCheck;
+
694  Index64 mCount;
+
695 
+
696  CheckValues(MaskT* mask, const GridT* grid, const CheckT& check)
+
697  : mOwnsMask(false)
+
698  , mMask(mask)
+
699  , mGrid(grid)
+
700  , mCheck(check)
+
701  , mCount(0)
+
702  {
+
703  }
+
704  CheckValues(CheckValues& other, tbb::split)
+
705  : mOwnsMask(true)
+
706  , mMask(other.mMask ? new MaskT() : NULL)
+
707  , mGrid(other.mGrid)
+
708  , mCheck(other.mCheck)
+
709  , mCount(0)
+
710  {
+
711  }
+
712  ~CheckValues() { if (mOwnsMask) delete mMask; }
+
713 
+
714  std::string checkBackground()
+
715  {
+
716  std::ostringstream ss;
+
717  if (mCheck(mGrid->background())) {
+
718  ++mCount;
+
719  ss << "Background is " + mCheck.str() << std::endl;
+
720  }
+
721  return ss.str();
+
722  }
+
723 
+
724  std::string checkTiles()
+
725  {
+
726  std::ostringstream ss;
+
727  const Index64 n = mCount;
+
728  typename CheckT::TileIterT i(mGrid->tree());
+
729  for (i.setMaxDepth(GridT::TreeType::RootNodeType::LEVEL - 1); i; ++i) {
+
730  if (mCheck(i)) {
+
731  ++mCount;
+
732  if (mMask) mMask->fill(i.getBoundingBox(), true, true);
+
733  }
+
734  }
+
735  if (const Index64 m = mCount - n) {
+
736  ss << m << " tile" << (m==1 ? " is " : "s are ") + mCheck.str() << std::endl;
+
737  }
+
738  return ss.str();
+
739  }
+
740 
+
741  std::string checkVoxels()
+
742  {
+
743  std::ostringstream ss;
+
744  LeafManagerT leafs(mGrid->tree());
+
745  const Index64 n = mCount;
+
746  tbb::parallel_reduce(leafs.leafRange(), *this);
+
747  if (const Index64 m = mCount - n) {
+
748  ss << m << " voxel" << (m==1 ? " is " : "s are ") + mCheck.str() << std::endl;
+
749  }
+
750  return ss.str();
+
751  }
+
752 
+
753  void operator()(const typename LeafManagerT::LeafRange& r)
+
754  {
+
755  typedef typename CheckT::VoxelIterT VoxelIterT;
+
756  if (mMask) {
+
757  for (typename LeafManagerT::LeafRange::Iterator i=r.begin(); i; ++i) {
+
758  typename MaskT::LeafNodeType* maskLeaf = NULL;
+
759  for (VoxelIterT j = tree::IterTraits<LeafT, VoxelIterT>::begin(*i); j; ++j) {
+
760  if (mCheck(j)) {
+
761  ++mCount;
+
762  if (maskLeaf == NULL) maskLeaf = mMask->touchLeaf(j.getCoord());
+
763  maskLeaf->setValueOn(j.pos(), true);
+
764  }
+
765  }
+
766  }
+
767  } else {
+
768  for (typename LeafManagerT::LeafRange::Iterator i=r.begin(); i; ++i) {
+
769  for (VoxelIterT j = tree::IterTraits<LeafT, VoxelIterT>::begin(*i); j; ++j) {
+
770  if (mCheck(j)) ++mCount;
+
771  }
+
772  }
+
773  }
+
774  }
+
775  void join(const CheckValues& other)
+
776  {
+
777  if (mMask) mMask->merge(*(other.mMask), openvdb::MERGE_ACTIVE_STATES_AND_NODES);
+
778  mCount += other.mCount;
+
779  }
+
780  };//End of private class CheckValues
+
781 
+
782 };// End of public class Diagnose
+
783 
+
784 
+
786 
+
790 template<class GridType>
+ +
792 {
+
793 public:
+
794  typedef typename GridType::ValueType ValueType;
+
795  typedef typename GridType::template ValueConverter<bool>::Type MaskType;
+
796 
+
797  CheckLevelSet(const GridType& grid) : mDiagnose(grid) {}
+
798 
+
800  typename MaskType::ConstPtr mask() const { return mDiagnose.mask(); }
+
804  typename MaskType::Ptr mask() { return mDiagnose.mask(); }
+
806 
+
809  Index64 valueCount() const { return mDiagnose.valueCount(); }
+
810 
+
814  Index64 failureCount() const { return mDiagnose.failureCount(); }
+
815 
+
817  const GridType& grid() const { return mDiagnose.grid(); }
+
818 
+
820  void clear() { mDiagnose.clear(); }
+
821 
+
825  static std::string checkValueType()
+
826  {
+
827  static const bool test = boost::is_floating_point<ValueType>::value;
+
828  return test ? "" : "Value type is not floating point\n";
+
829  }
+
830 
+
834  std::string checkClassType() const
+
835  {
+
836  const bool test = mDiagnose.grid().getGridClass() == GRID_LEVEL_SET;
+
837  return test ? "" : "Class type is not \"GRID_LEVEL_SET\"\n";
+
838  }
+
839 
+
843  std::string checkTransform() const
+
844  {
+
845  return mDiagnose.grid().hasUniformVoxels() ? "" : "Does not have uniform voxels\n";
+
846  }
+
847 
+
852  std::string checkBackground(Real halfWidth = LEVEL_SET_HALF_WIDTH) const
+
853  {
+
854  const Real w = mDiagnose.grid().background() / mDiagnose.grid().voxelSize()[0];
+
855  if (w < halfWidth) {
+
856  std::ostringstream ss;
+
857  ss << "The background value ("<< mDiagnose.grid().background()<<") is less than "
+
858  << halfWidth << " voxel units\n";
+
859  return ss.str();
+
860  }
+
861  return "";
+
862  }
+
863 
+
867  std::string checkTiles() const
+
868  {
+
869  const bool test = mDiagnose.grid().tree().hasActiveTiles();
+
870  return test ? "Has active tile values\n" : "";
+
871  }
+
872 
+
876  std::string checkFinite(bool updateMask = false)
+
877  {
+ +
879  return mDiagnose.check(c, updateMask, /*voxel*/true, /*tiles*/true, /*background*/true);
+
880  }
+
881 
+
885  std::string checkRange(bool updateMask = false)
+
886  {
+
887  const ValueType& background = mDiagnose.grid().background();
+
888  CheckRange<GridType> c(-background, background);
+
889  return mDiagnose.check(c, updateMask, /*voxel*/true, /*tiles*/false, /*background*/false);
+
890  }
+
891 
+
896  std::string checkInactiveValues(bool updateMask = false)
+
897  {
+
898  const ValueType& background = mDiagnose.grid().background();
+ +
900  return mDiagnose.check(c, updateMask, /*voxel*/true, /*tiles*/true, /*background*/false);
+
901  }
+
902 
+
907  std::string checkEikonal(bool updateMask = false, ValueType minV = 0.5, ValueType maxV = 1.5)
+
908  {
+
909  CheckEikonal<GridType> c(mDiagnose.grid(), minV, maxV);
+
910  return mDiagnose.check(c, updateMask, /*voxel*/true, /*tiles*/false, /*background*/false);
+
911  }
+
912 
+
930  std::string check(size_t n=9, bool updateMask = false)
+
931  {
+
932  std::string str = this->checkValueType();
+
933  if (str.empty() && n>1) str = this->checkClassType();
+
934  if (str.empty() && n>2) str = this->checkTransform();
+
935  if (str.empty() && n>3) str = this->checkBackground();
+
936  if (str.empty() && n>4) str = this->checkTiles();
+
937  if (str.empty() && n>5) str = this->checkFinite(updateMask);
+
938  if (str.empty() && n>6) str = this->checkRange(updateMask);
+
939  if (str.empty() && n>7) str = this->checkInactiveValues(updateMask);
+
940  if (str.empty() && n>8) str = this->checkEikonal(updateMask);
+
941  return str;
+
942  }
+
943 
+
944 private:
+
945  // disallow copy construction and copy by assignment!
+
946  CheckLevelSet(const CheckLevelSet&);// not implemented
+
947  CheckLevelSet& operator=(const CheckLevelSet&);// not implemented
+
948 
+
949  // Member data
+
950  Diagnose<GridType> mDiagnose;
+
951 };// CheckLevelSet
+
952 
+
953 template<class GridType>
+
954 std::string
+
955 checkLevelSet(const GridType& grid, size_t n)
+
956 {
+
957  CheckLevelSet<GridType> c(grid);
+
958  return c.check(n, false);
+
959 }
+
960 
+
962 
+
966 template<class GridType>
+ +
968 {
+
969 public:
+
970  typedef typename GridType::ValueType ValueType;
+
971  typedef typename GridType::template ValueConverter<bool>::Type MaskType;
+
972 
+
973  CheckFogVolume(const GridType& grid) : mDiagnose(grid) {}
+
974 
+
976  typename MaskType::ConstPtr mask() const { return mDiagnose.mask(); }
+
980  typename MaskType::Ptr mask() { return mDiagnose.mask(); }
+
982 
+
985  Index64 valueCount() const { return mDiagnose.valueCount(); }
+
986 
+
990  Index64 failureCount() const { return mDiagnose.failureCount(); }
+
991 
+
993  const GridType& grid() const { return mDiagnose.grid(); }
+
994 
+
996  void clear() { mDiagnose.clear(); }
+
997 
+
1001  static std::string checkValueType()
+
1002  {
+
1003  static const bool test = boost::is_floating_point<ValueType>::value;
+
1004  return test ? "" : "Value type is not floating point";
+
1005  }
+
1006 
+
1010  std::string checkClassType() const
+
1011  {
+
1012  const bool test = mDiagnose.grid().getGridClass() == GRID_FOG_VOLUME;
+
1013  return test ? "" : "Class type is not \"GRID_LEVEL_SET\"";
+
1014  }
+
1015 
+
1019  std::string checkBackground() const
+
1020  {
+
1021  if (!math::isApproxZero(mDiagnose.grid().background())) {
+
1022  std::ostringstream ss;
+
1023  ss << "The background value ("<< mDiagnose.grid().background()<<") is not zero";
+
1024  return ss.str();
+
1025  }
+
1026  return "";
+
1027  }
+
1028 
+
1032  std::string checkFinite(bool updateMask = false)
+
1033  {
+ +
1035  return mDiagnose.check(c, updateMask, /*voxel*/true, /*tiles*/true, /*background*/true);
+
1036  }
+
1037 
+
1041  std::string checkInactiveValues(bool updateMask = false)
+
1042  {
+ +
1044  return mDiagnose.check(c, updateMask, /*voxel*/true, /*tiles*/true, /*background*/true);
+
1045  }
+
1046 
+
1051  std::string checkRange(bool updateMask = false)
+
1052  {
+
1053  CheckRange<GridType> c(0, 1);
+
1054  return mDiagnose.check(c, updateMask, /*voxel*/true, /*tiles*/true, /*background*/false);
+
1055  }
+
1056 
+
1069  std::string check(size_t n=6, bool updateMask = false)
+
1070  {
+
1071  std::string str = this->checkValueType();
+
1072  if (str.empty() && n>1) str = this->checkClassType();
+
1073  if (str.empty() && n>2) str = this->checkBackground();
+
1074  if (str.empty() && n>3) str = this->checkFinite(updateMask);
+
1075  if (str.empty() && n>4) str = this->checkInactiveValues(updateMask);
+
1076  if (str.empty() && n>5) str = this->checkRange(updateMask);
+
1077  return str;
+
1078  }
+
1079 
+
1080 private:
+
1081  // disallow copy construction and copy by assignment!
+
1082  CheckFogVolume(const CheckFogVolume&);// not implemented
+
1083  CheckFogVolume& operator=(const CheckFogVolume&);// not implemented
+
1084 
+
1085  // Member data
+
1086  Diagnose<GridType> mDiagnose;
+
1087 };// CheckFogVolume
+
1088 
+
1089 template<class GridType>
+
1090 std::string
+
1091 checkFogVolume(const GridType& grid, size_t n)
+
1092 {
+
1093  CheckFogVolume<GridType> c(grid);
+
1094  return c.check(n, false);
+
1095 }
+
1096 
+
1097 
+
1099 
+
1100 // Internal utility objects and implementation details
+
1101 
+
1102 
+
1103 namespace diagnostics_internal {
+
1104 
+
1105 
+
1106 template<typename TreeType>
+ +
1108 {
+
1109 public:
+ +
1111  typedef typename TreeType::ValueType ValueType;
+
1112  typedef std::set<ValueType> SetType;
+
1113 
+
1114  InactiveVoxelValues(LeafArray&, size_t numValues);
+
1115 
+
1116  void runParallel();
+
1117  void runSerial();
+
1118 
+
1119  void getInactiveValues(SetType&) const;
+
1120 
+
1121  inline InactiveVoxelValues(const InactiveVoxelValues<TreeType>&, tbb::split);
+
1122  inline void operator()(const tbb::blocked_range<size_t>&);
+
1123  inline void join(const InactiveVoxelValues<TreeType>&);
+
1124 
+
1125 private:
+
1126  LeafArray& mLeafArray;
+
1127  SetType mInactiveValues;
+
1128  size_t mNumValues;
+
1129 };// InactiveVoxelValues
+
1130 
+
1131 template<typename TreeType>
+ +
1133  : mLeafArray(leafs)
+
1134  , mInactiveValues()
+
1135  , mNumValues(numValues)
+
1136 {
+
1137 }
+
1138 
+
1139 template <typename TreeType>
+
1140 inline
+ +
1142  const InactiveVoxelValues<TreeType>& rhs, tbb::split)
+
1143  : mLeafArray(rhs.mLeafArray)
+
1144  , mInactiveValues()
+
1145  , mNumValues(rhs.mNumValues)
+
1146 {
+
1147 }
+
1148 
+
1149 template<typename TreeType>
+
1150 void
+ +
1152 {
+
1153  tbb::parallel_reduce(mLeafArray.getRange(), *this);
+
1154 }
+
1155 
+
1156 
+
1157 template<typename TreeType>
+
1158 void
+ +
1160 {
+
1161  (*this)(mLeafArray.getRange());
+
1162 }
+
1163 
+
1164 
+
1165 template<typename TreeType>
+
1166 inline void
+
1167 InactiveVoxelValues<TreeType>::operator()(const tbb::blocked_range<size_t>& range)
+
1168 {
+
1169  typename TreeType::LeafNodeType::ValueOffCIter iter;
+
1170 
+
1171  for (size_t n = range.begin(); n < range.end() && !tbb::task::self().is_cancelled(); ++n) {
+
1172  for (iter = mLeafArray.leaf(n).cbeginValueOff(); iter; ++iter) {
+
1173  mInactiveValues.insert(iter.getValue());
+
1174  }
+
1175 
+
1176  if (mInactiveValues.size() > mNumValues) {
+
1177  tbb::task::self().cancel_group_execution();
+
1178  }
+
1179  }
+
1180 }
+
1181 
+
1182 template<typename TreeType>
+
1183 inline void
+ +
1185 {
+
1186  mInactiveValues.insert(rhs.mInactiveValues.begin(), rhs.mInactiveValues.end());
+
1187 }
+
1188 
+
1189 template<typename TreeType>
+
1190 inline void
+ +
1192 {
+
1193  values.insert(mInactiveValues.begin(), mInactiveValues.end());
+
1194 }
+
1195 
+
1196 
+
1198 
+
1199 
+
1200 template<typename TreeType>
+ +
1202 {
+
1203 public:
+ +
1205  typedef typename TreeType::ValueType ValueType;
+
1206  typedef std::set<ValueType> SetType;
+
1207 
+
1208  InactiveTileValues(size_t numValues);
+
1209 
+
1210  void runParallel(IterRange&);
+
1211  void runSerial(IterRange&);
+
1212 
+
1213  void getInactiveValues(SetType&) const;
+
1214 
+
1215  inline InactiveTileValues(const InactiveTileValues<TreeType>&, tbb::split);
+
1216  inline void operator()(IterRange&);
+
1217  inline void join(const InactiveTileValues<TreeType>&);
+
1218 
+
1219 private:
+
1220  SetType mInactiveValues;
+
1221  size_t mNumValues;
+
1222 };
+
1223 
+
1224 
+
1225 template<typename TreeType>
+ +
1227  : mInactiveValues()
+
1228  , mNumValues(numValues)
+
1229 {
+
1230 }
+
1231 
+
1232 template <typename TreeType>
+
1233 inline
+ +
1235  const InactiveTileValues<TreeType>& rhs, tbb::split)
+
1236  : mInactiveValues()
+
1237  , mNumValues(rhs.mNumValues)
+
1238 {
+
1239 }
+
1240 
+
1241 template<typename TreeType>
+
1242 void
+ +
1244 {
+
1245  tbb::parallel_reduce(range, *this);
+
1246 }
+
1247 
+
1248 
+
1249 template<typename TreeType>
+
1250 void
+ +
1252 {
+
1253  (*this)(range);
+
1254 }
+
1255 
+
1256 
+
1257 template<typename TreeType>
+
1258 inline void
+ +
1260 {
+
1261  for (; range && !tbb::task::self().is_cancelled(); ++range) {
+
1262  typename TreeType::ValueOffCIter iter = range.iterator();
+
1263  for (; iter; ++iter) {
+
1264  mInactiveValues.insert(iter.getValue());
+
1265  }
+
1266 
+
1267  if (mInactiveValues.size() > mNumValues) {
+
1268  tbb::task::self().cancel_group_execution();
+
1269  }
+
1270  }
+
1271 }
+
1272 
+
1273 template<typename TreeType>
+
1274 inline void
+ +
1276 {
+
1277  mInactiveValues.insert(rhs.mInactiveValues.begin(), rhs.mInactiveValues.end());
+
1278 }
+
1279 
+
1280 template<typename TreeType>
+
1281 inline void
+ +
1283 {
+
1284  values.insert(mInactiveValues.begin(), mInactiveValues.end());
+
1285 }
+
1286 
+
1287 } // namespace diagnostics_internal
+
1288 
+
1289 
+
1291 
+
1292 
+
1293 template<class GridType>
+
1294 bool
+
1295 uniqueInactiveValues(const GridType& grid,
+
1296  std::vector<typename GridType::ValueType>& values, size_t numValues)
+
1297 {
+
1298 
+
1299  typedef typename GridType::TreeType TreeType;
+
1300  typedef typename GridType::ValueType ValueType;
+
1301  typedef std::set<ValueType> SetType;
+
1302 
+
1303  SetType uniqueValues;
+
1304 
+
1305  { // Check inactive voxels
+
1306  TreeType& tree = const_cast<TreeType&>(grid.tree());
+
1307  tree::LeafManager<TreeType> leafs(tree);
+
1308  diagnostics_internal::InactiveVoxelValues<TreeType> voxelOp(leafs, numValues);
+
1309  voxelOp.runParallel();
+
1310  voxelOp.getInactiveValues(uniqueValues);
+
1311  }
+
1312 
+
1313  // Check inactive tiles
+
1314  if (uniqueValues.size() <= numValues) {
+
1315  typename TreeType::ValueOffCIter iter(grid.tree());
+
1316  iter.setMaxDepth(TreeType::ValueAllIter::LEAF_DEPTH - 1);
+ +
1318 
+ +
1320  tileOp.runParallel(range);
+
1321 
+
1322  tileOp.getInactiveValues(uniqueValues);
+
1323  }
+
1324 
+
1325  values.clear();
+
1326  values.reserve(uniqueValues.size());
+
1327 
+
1328  typename SetType::iterator it = uniqueValues.begin();
+
1329  for ( ; it != uniqueValues.end(); ++it) {
+
1330  values.push_back(*it);
+
1331  }
+
1332 
+
1333  return values.size() <= numValues;
+
1334 }
+
1335 
+
1336 } // namespace tools
+
1337 } // namespace OPENVDB_VERSION_NAME
+
1338 } // namespace openvdb
+
1339 
+
1340 #endif // OPENVDB_TOOLS_DIAGNOSTICS_HAS_BEEN_INCLUDED
+
1341 
+
1342 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
1343 // All rights reserved. This software is distributed under the
+
1344 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
bool operator()(const TreeIterT &) const
Return true if zero is outside the range.
Definition: Diagnostics.h:476
+
bool operator()(const ElementType &v) const
Return true if the scalar value is NaN.
Definition: Diagnostics.h:143
+
boost::enable_if_c< VecTraits< T >::IsVec, bool >::type operator()(const T &v) const
Return true if any of the vector components are infinite.
Definition: Diagnostics.h:266
+
bool operator()(const ValueType &v) const
Return true if the value is smaller than min or larger than max.
Definition: Diagnostics.h:533
+
const ElementType minVal
Definition: Diagnostics.h:341
+
std::string checkFinite(bool updateMask=false)
Return a nonempty message if any of the values are not finite. i.e. NaN or inf.
Definition: Diagnostics.h:1032
+
tree::IterTraits< typename TreeIterT::NodeT, typename TreeIterT::ValueIterT >::template NodeConverter< typename GridT::TreeType::LeafNodeType >::Type VoxelIterT
Definition: Diagnostics.h:397
+
std::string str() const
Return a string describing a failed check.
Definition: Diagnostics.h:279
+
Definition: Types.h:214
+
GridT::ValueType ValueType
Definition: Diagnostics.h:509
+
tree::IterTraits< typename TreeIterT::NodeT, typename TreeIterT::ValueIterT >::template NodeConverter< typename GridT::TreeType::LeafNodeType >::Type VoxelIterT
Definition: Diagnostics.h:445
+
std::string str() const
Return a string describing a failed check.
Definition: Diagnostics.h:420
+
bool operator()(const TreeIterT &iter) const
Return true if the tile at the iterator location is infinite.
Definition: Diagnostics.h:192
+
Index64 valueCount() const
Return the number of values (i.e. background, tiles or voxels) that have failed one or more checks...
Definition: Diagnostics.h:809
+
TreeIterT TileIterT
Definition: Diagnostics.h:299
+ + +
Checks NaN values.
Definition: Diagnostics.h:132
+
bool operator()(const ElementType &v) const
Definition: Diagnostics.h:259
+
TreeIterT TileIterT
Definition: Diagnostics.h:173
+
VecTraits< ValueType >::ElementType ElementType
Definition: Diagnostics.h:569
+
bool operator()(const VoxelIterT &iter) const
Return true if the norm of the gradient at a voxel location of the iterator is out of range...
Definition: Diagnostics.h:480
+
void getInactiveValues(SetType &) const
Definition: Diagnostics.h:1282
+
GridType::template ValueConverter< bool >::Type MaskType
Definition: Diagnostics.h:795
+
std::string checkLevelSet(const GridType &grid, size_t number=9)
Perform checks on a grid to see if it is a valid symmetric, narrow-band level set.
Definition: Diagnostics.h:955
+
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
bool operator()(const ValueType &v) const
Return true if the value is smaller than min or larger than max.
Definition: Diagnostics.h:472
+
This is a special 19-point stencil that supports optimal fifth-order WENO upwinding, second-order central differencing, Laplacian, and zero-crossing test.
Definition: Stencils.h:1331
+
GridT::ConstAccessor AccT
Definition: Diagnostics.h:574
+
float Sqrt(float x)
Return the square root of a floating-point value.
Definition: Math.h:709
+
T ElementType
Definition: Types.h:151
+
CheckMagnitude(const ElementType &a, const ElementType &t=math::Tolerance< ElementType >::value())
Default constructor.
Definition: Diagnostics.h:251
+
bool uniqueInactiveValues(const GridType &grid, std::vector< typename GridType::ValueType > &values, size_t numValues)
Threaded method to find unique inactive values.
Definition: Diagnostics.h:1295
+
static std::string checkValueType()
Return a nonempty message if the grid's value type is a floating point.
Definition: Diagnostics.h:825
+
Type Pow2(Type x)
Return .
Definition: Math.h:514
+
CheckEikonal(const CheckEikonal &other)
Definition: Diagnostics.h:527
+
Class that performs various types of checks on narrow-band level sets.
Definition: Diagnostics.h:791
+
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
+
bool operator()(const ElementType &v) const
Return true if the value is infinite.
Definition: Diagnostics.h:181
+
void getInactiveValues(SetType &) const
Definition: Diagnostics.h:1191
+
StencilT stencil
Definition: Diagnostics.h:556
+
Definition: FiniteDifference.h:194
+
static const Real LEVEL_SET_HALF_WIDTH
Definition: Types.h:219
+
MaskType::Ptr mask()
Return a boolean mask of all the values (i.e. tiles and/or voxels) that have failed one or more check...
Definition: Diagnostics.h:804
+
bool operator()(const TreeIterT &iter) const
Return true if the voxel at the iterator location is smaller than min.
Definition: Diagnostics.h:371
+
std::string check(size_t n=9, bool updateMask=false)
Return a nonempty message if an error or issue is detected. Only runs tests with a number lower than ...
Definition: Diagnostics.h:930
+
void operator()(IterRange &)
Definition: Diagnostics.h:1259
+
CheckFinite()
Default constructor.
Definition: Diagnostics.h:214
+
bool operator()(const VoxelIterT &iter) const
Return true if the tile at the iterator location is infinite.
Definition: Diagnostics.h:276
+
This class manages a linear array of pointers to a given tree's leaf nodes, as well as optional auxil...
Definition: LeafManager.h:115
+
Checks the norm of the gradient against a range, i.e. .
Definition: Diagnostics.h:439
+
std::string check(size_t n=6, bool updateMask=false)
Return a nonempty message if an error or issue is detected. Only runs tests with a number lower than ...
Definition: Diagnostics.h:1069
+
Performs multithreaded diagnostics of a grid.
Definition: Diagnostics.h:624
+
bool operator()(const VoxelIterT &iter) const
Return true if the tile at the iterator location is smaller than min.
Definition: Diagnostics.h:374
+
void clear()
Clear the mask and error counter.
Definition: Diagnostics.h:672
+
std::set< ValueType > SetType
Definition: Diagnostics.h:1112
+
void join(const InactiveTileValues< TreeType > &)
Definition: Diagnostics.h:1275
+
boost::enable_if_c< VecTraits< T >::IsVec, bool >::type operator()(const T &v) const
Return true if any of the vector components are smaller than min.
Definition: Diagnostics.h:365
+
bool operator()(const ElementType &v) const
Return true if the value is smaller than min.
Definition: Diagnostics.h:360
+
boost::enable_if_c< VecTraits< T >::IsVec, bool >::type operator()(const T &v) const
Return true if any of the vector components are NaN or infinite.
Definition: Diagnostics.h:222
+
VecTraits< typename GridT::ValueType >::ElementType ElementType
Definition: Diagnostics.h:172
+
GridT::ConstAccessor AccT
Definition: Diagnostics.h:446
+
void clear()
Clear the mask and error counter.
Definition: Diagnostics.h:996
+
std::string checkTiles() const
Return a nonempty message if the grid has no active tile values.
Definition: Diagnostics.h:867
+
DScheme
Different discrete schemes used in the first derivatives.
Definition: FiniteDifference.h:59
+
std::string checkFogVolume(const GridType &grid, size_t number=6)
Perform checks on a grid to see if it is a valid fog volume.
Definition: Diagnostics.h:1091
+
Check that the magnitude of a value, a, is close to a fixed magnitude, b, given a fixed tolerance c...
Definition: Diagnostics.h:243
+
std::string str() const
Return a string describing a failed check.
Definition: Diagnostics.h:333
+
static std::string checkValueType()
Return a nonempty message if the grid's value type is a floating point.
Definition: Diagnostics.h:1001
+
tree::LeafManager< TreeType > LeafArray
Definition: Diagnostics.h:1110
+
bool operator()(const VoxelIterT &iter) const
Return true if the tile at the iterator location is out of range.
Definition: Diagnostics.h:330
+
const GridT & grid() const
Return a const reference to the grid.
Definition: Diagnostics.h:669
+
Diagnose(const GridT &grid)
Definition: Diagnostics.h:629
+
CheckEikonal(const GridT &grid, const ValueType &_min, const ValueType &_max)
Constructor taking a grid and a range to be tested against.
Definition: Diagnostics.h:516
+
std::string checkBackground() const
Return a nonempty message if the background value is not zero.
Definition: Diagnostics.h:1019
+
CheckRange(const ElementType &_min, const ElementType &_max)
Definition: Diagnostics.h:304
+
CheckLevelSet(const GridType &grid)
Definition: Diagnostics.h:797
+
std::string checkTransform() const
Return a nonempty message if the grid's transform does not have uniform scaling.
Definition: Diagnostics.h:843
+
double Real
Definition: Types.h:64
+
TreeType::ValueType ValueType
Definition: Diagnostics.h:1205
+
std::string checkFinite(bool updateMask=false)
Return a nonempty message if any of the values are not finite. i.e. NaN or inf.
Definition: Diagnostics.h:876
+
TreeType::ValueType ValueType
Definition: Diagnostics.h:1111
+
bool operator()(const TreeIterT &iter) const
Return true if the tile at the iterator location is NaN or infinite.
Definition: Diagnostics.h:228
+
std::string checkClassType() const
Return message if the grid's class is a level set.
Definition: Diagnostics.h:834
+
Index64 failureCount() const
Return total number of failed checks.
Definition: Diagnostics.h:666
+
tree::IterTraits< typename TreeIterT::NodeT, typename TreeIterT::ValueIterT >::template NodeConverter< typename GridT::TreeType::LeafNodeType >::Type VoxelIterT
Definition: Diagnostics.h:137
+
uint64_t Index64
Definition: Types.h:57
+
AccT acc
Definition: Diagnostics.h:615
+
std::string checkEikonal(bool updateMask=false, ValueType minV=0.5, ValueType maxV=1.5)
Return a nonempty message if the norm of the gradient of the active voxels is out of the range minV t...
Definition: Diagnostics.h:907
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
GridT::ValueType ValueType
Definition: Diagnostics.h:441
+
MaskType::Ptr mask()
Return a boolean mask of all the values (i.e. tiles and/or voxels) that have failed one or more check...
Definition: Diagnostics.h:980
+
bool operator()(const TreeIterT &iter) const
Return true if the tile at the iterator location is infinite.
Definition: Diagnostics.h:273
+
std::set< ValueType > SetType
Definition: Diagnostics.h:1206
+
tree::IterTraits< typename TreeIterT::NodeT, typename TreeIterT::ValueIterT >::template NodeConverter< typename GridT::TreeType::LeafNodeType >::Type VoxelIterT
Definition: Diagnostics.h:301
+
bool operator()(const VoxelIterT &iter) const
Return true if the tile at the iterator location is NaN or infinite.
Definition: Diagnostics.h:231
+
const IterT & iterator() const
Return a reference to this range's iterator.
Definition: TreeIterator.h:1360
+
CheckFogVolume(const GridType &grid)
Definition: Diagnostics.h:973
+
VecTraits< typename GridT::ValueType >::ElementType ElementType
Definition: Diagnostics.h:208
+
const ElementType maxVal
Definition: Diagnostics.h:427
+
Definition: TreeIterator.h:1339
+
CheckMax(const ElementType &_max)
Constructor taking a maximum to be tested against.
Definition: Diagnostics.h:400
+
Checks the divergence against a range.
Definition: Diagnostics.h:566
+
CheckNormGrad(const CheckNormGrad &other)
Definition: Diagnostics.h:463
+
bool operator()(const TreeIterT &) const
Return true if zero is outside the range.
Definition: Diagnostics.h:597
+
TreeIterT TileIterT
Definition: Diagnostics.h:395
+
VecTraits< typename GridT::ValueType >::ElementType ElementType
Definition: Diagnostics.h:134
+
std::string str() const
Return a string describing a failed check.
Definition: Diagnostics.h:234
+
bool operator()(const VoxelIterT &iter) const
Return true if the divergence at a voxel location of the iterator is out of range.
Definition: Diagnostics.h:601
+
bool operator()(const TreeIterT &iter) const
Return true if the tile at the iterator location is NaN.
Definition: Diagnostics.h:155
+
VecTraits< typename GridT::ValueType >::ElementType ElementType
Definition: Diagnostics.h:245
+
std::string str() const
Return a string describing a failed check.
Definition: Diagnostics.h:161
+
VecTraits< typename GridT::ValueType >::ElementType ElementType
Definition: Diagnostics.h:351
+
std::string str() const
Return a string describing a failed check.
Definition: Diagnostics.h:549
+
VecTraits< typename GridT::ValueType >::ElementType ElementType
Definition: Diagnostics.h:394
+
Definition: Exceptions.h:39
+
BiasedGradientScheme
Biased Gradients are limited to non-centered differences.
Definition: FiniteDifference.h:192
+
void join(const InactiveVoxelValues< TreeType > &)
Definition: Diagnostics.h:1184
+
Tolerance for floating-point comparison.
Definition: Math.h:125
+
bool operator()(const ElementType &v) const
Return true if the value is NOT finite, i.e. it's NaN or infinite.
Definition: Diagnostics.h:217
+
CheckDivergence(const GridT &grid, const ValueType &_min, const ValueType &_max)
Constructor taking a grid and a range to be tested against.
Definition: Diagnostics.h:577
+
CheckInf()
Default constructor.
Definition: Diagnostics.h:178
+
std::string checkBackground(Real halfWidth=LEVEL_SET_HALF_WIDTH) const
Return a nonempty message if the background value is larger than or equal to the halfWidth*voxelSize...
Definition: Diagnostics.h:852
+
AccT acc
Definition: Diagnostics.h:494
+
GridType::ValueType ValueType
Definition: Diagnostics.h:794
+
TreeIterT TileIterT
Definition: Diagnostics.h:246
+
std::string str() const
Return a string describing a failed check.
Definition: Diagnostics.h:487
+
VecTraits< typename GridT::ValueType >::ElementType ElementType
Definition: Diagnostics.h:298
+
Checks the norm of the gradient at zero-crossing voxels against a range.
Definition: Diagnostics.h:507
+
const ValueType minVal
Definition: Diagnostics.h:557
+
std::string str() const
Return a string describing a failed check.
Definition: Diagnostics.h:198
+
bool operator()(const TreeIterT &iter) const
Return true if the tile at the iterator location is larger than max.
Definition: Diagnostics.h:414
+
tree::IterTraits< typename TreeIterT::NodeT, typename TreeIterT::ValueIterT >::template NodeConverter< typename GridT::TreeType::LeafNodeType >::Type VoxelIterT
Definition: Diagnostics.h:248
+
Definition: TreeIterator.h:106
+
bool operator()(const VoxelIterT &iter) const
Return true if the tile at the iterator location is infinite.
Definition: Diagnostics.h:195
+
TreeIterT TileIterT
Definition: Diagnostics.h:571
+
std::string checkInactiveValues(bool updateMask=false)
Return a nonempty message if any of the inactive values are not zero.
Definition: Diagnostics.h:1041
+
Checks for infinite values, e.g. 1/0 or -1/0.
Definition: Diagnostics.h:170
+ +
tree::IteratorRange< typename TreeType::ValueOffCIter > IterRange
Definition: Diagnostics.h:1204
+
tree::IterTraits< typename TreeIterT::NodeT, typename TreeIterT::ValueIterT >::template NodeConverter< typename GridT::TreeType::LeafNodeType >::Type VoxelIterT
Definition: Diagnostics.h:354
+
Checks a value against a minimum.
Definition: Diagnostics.h:349
+
bool operator()(const VoxelIterT &iter) const
Return true if the norm of the gradient at a zero-crossing voxel location of the iterator is out of r...
Definition: Diagnostics.h:541
+
boost::enable_if_c< VecTraits< T >::IsVec, bool >::type operator()(const T &v) const
Return true if any of the vector components are infinite.
Definition: Diagnostics.h:185
+
Checks a value against a maximum.
Definition: Diagnostics.h:392
+
Definition: FiniteDifference.h:62
+
boost::enable_if_c< VecTraits< T >::IsVec, bool >::type operator()(const T &v) const
Return true if any of the vector components are out of range.
Definition: Diagnostics.h:321
+
CheckNan()
Default constructor.
Definition: Diagnostics.h:140
+
bool operator()(const VoxelIterT &iter) const
Return true if the voxel at the iterator location is NaN.
Definition: Diagnostics.h:158
+
const GridType & grid() const
Return a const reference to the grid.
Definition: Diagnostics.h:993
+
std::string checkInactiveValues(bool updateMask=false)
Return a nonempty message if the the inactive values do not have a magnitude equal to the background ...
Definition: Diagnostics.h:896
+
GridType::ValueType ValueType
Definition: Diagnostics.h:970
+ +
GridT::template ValueConverter< bool >::Type MaskType
Definition: Diagnostics.h:627
+
const GridType & grid() const
Return a const reference to the grid.
Definition: Diagnostics.h:817
+
bool operator()(const TreeIterT &iter) const
Return true if the voxel at the iterator location is out of range.
Definition: Diagnostics.h:327
+
tree::IterTraits< typename TreeIterT::NodeT, typename TreeIterT::ValueIterT >::template NodeConverter< typename GridT::TreeType::LeafNodeType >::Type VoxelIterT
Definition: Diagnostics.h:211
+ +
tree::IterTraits< typename TreeIterT::NodeT, typename TreeIterT::ValueIterT >::template NodeConverter< typename GridT::TreeType::LeafNodeType >::Type VoxelIterT
Definition: Diagnostics.h:513
+
tree::IterTraits< typename TreeIterT::NodeT, typename TreeIterT::ValueIterT >::template NodeConverter< typename GridT::TreeType::LeafNodeType >::Type VoxelIterT
Definition: Diagnostics.h:573
+
Definition: Exceptions.h:88
+
Class that performs various types of checks on fog volumes.
Definition: Diagnostics.h:967
+ +
std::string str() const
Return a string describing a failed check.
Definition: Diagnostics.h:377
+
Divergence operator defined in index space using various first derivative schemes.
Definition: Operators.h:495
+
const ElementType minVal
Definition: Diagnostics.h:384
+
void clear()
Clear the mask and error counter.
Definition: Diagnostics.h:820
+
bool isApproxZero(const Type &x)
Return true if x is equal to zero to within the default floating-point comparison tolerance...
Definition: Math.h:336
+
Defines various finite difference stencils by means of the "curiously recurring template pattern" on ...
+
std::string checkClassType() const
Return a nonempty message if the grid's class is a level set.
Definition: Diagnostics.h:1010
+
Index64 valueCount() const
Return the number of values (i.e. background, tiles or voxels) that have failed one or more checks...
Definition: Diagnostics.h:985
+
int32_t Abs(int32_t i)
Return the absolute value of the given quantity.
Definition: Math.h:293
+
CheckMin(const ElementType &_min)
Definition: Diagnostics.h:357
+
Index64 valueCount() const
Return the number of values (i.e. background, tiles or voxels) that have failed one or more checks...
Definition: Diagnostics.h:661
+
bool operator()(const ElementType &v) const
Return true if the value is smaller than min or larger than max.
Definition: Diagnostics.h:593
+
std::string checkRange(bool updateMask=false)
Return a nonempty message if the active voxel values are out-of-range, i.e. not in the range [0...
Definition: Diagnostics.h:1051
+
Index64 failureCount() const
Return total number of failed checks.
Definition: Diagnostics.h:990
+
TreeIterT TileIterT
Definition: Diagnostics.h:511
+
std::string checkRange(bool updateMask=false)
Return a nonempty message if the active voxel values are out-of-range.
Definition: Diagnostics.h:885
+
const ValueType minVal2
Definition: Diagnostics.h:495
+
std::string str() const
Return a string describing a failed check.
Definition: Diagnostics.h:608
+
Definition: Types.h:213
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
Checks for both NaN and inf values, i.e. any value that is not finite.
Definition: Diagnostics.h:206
+
TreeIterT TileIterT
Definition: Diagnostics.h:352
+ +
void runSerial(IterRange &)
Definition: Diagnostics.h:1251
+
A LeafManager manages a linear array of pointers to a given tree's leaf nodes, as well as optional au...
+
TreeIterT TileIterT
Definition: Diagnostics.h:209
+
bool operator()(const ElementType &v) const
Return true if the value is larger than max.
Definition: Diagnostics.h:403
+
tree::IterTraits< typename TreeIterT::NodeT, typename TreeIterT::ValueIterT >::template NodeConverter< typename GridT::TreeType::LeafNodeType >::Type VoxelIterT
Definition: Diagnostics.h:175
+
std::string check(const CheckT &check, bool updateMask=false, bool checkVoxels=true, bool checkTiles=true, bool checkBackground=true)
Definition: Diagnostics.h:635
+
TreeIterT TileIterT
Definition: Diagnostics.h:135
+
boost::enable_if_c< VecTraits< T >::IsVec, bool >::type operator()(const T &v) const
Return true if any of the vector components are larger than max.
Definition: Diagnostics.h:408
+
CheckNormGrad(const GridT &grid, const ValueType &_min, const ValueType &_max)
Constructor taking a grid and a range to be tested against.
Definition: Diagnostics.h:449
+
TreeT * tree
Definition: MaskToLevelSet.h:118
+
TreeIterT TileIterT
Definition: Diagnostics.h:443
+
GridT::ValueType ValueType
Definition: Diagnostics.h:568
+ +
MaskType::Ptr mask()
Return a boolean mask of all the values (i.e. tiles and/or voxels) that have failed one or more check...
Definition: Diagnostics.h:656
+
Index64 failureCount() const
Return total number of failed checks.
Definition: Diagnostics.h:814
+
const ElementType tolVal
Definition: Diagnostics.h:286
+
InactiveTileValues(size_t numValues)
Definition: Diagnostics.h:1226
+
bool operator()(const ElementType &v) const
Return true if the value is smaller than min or larger than max.
Definition: Diagnostics.h:312
+
void operator()(const tbb::blocked_range< size_t > &)
Definition: Diagnostics.h:1167
+
InactiveVoxelValues(LeafArray &, size_t numValues)
Definition: Diagnostics.h:1132
+
boost::enable_if_c< VecTraits< T >::IsVec, bool >::type operator()(const T &v) const
This allows for vector values to be checked component-wise.
Definition: Diagnostics.h:148
+
void runParallel(IterRange &)
Definition: Diagnostics.h:1243
+
bool operator()(const VoxelIterT &iter) const
Return true if the voxel at the iterator location is larger than max.
Definition: Diagnostics.h:417
+
Checks a value against a range.
Definition: Diagnostics.h:296
+
bool operator()(const TreeIterT &) const
Return true if zero is outside the range.
Definition: Diagnostics.h:537
+ +
GridType::template ValueConverter< bool >::Type MaskType
Definition: Diagnostics.h:971
+
const ValueType minVal
Definition: Diagnostics.h:616
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/Exceptions_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/Exceptions_8h_source.html new file mode 100644 index 00000000..51cbb7f5 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/Exceptions_8h_source.html @@ -0,0 +1,230 @@ + + + + + + +OpenVDB: Exceptions.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Exceptions.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 
+
31 #ifndef OPENVDB_EXCEPTIONS_HAS_BEEN_INCLUDED
+
32 #define OPENVDB_EXCEPTIONS_HAS_BEEN_INCLUDED
+
33 
+
34 #include <exception>
+
35 #include <string>
+
36 #include <iostream>
+
37 #include <openvdb/version.h>
+
38 
+
39 namespace openvdb {
+ + +
42 
+
43 class OPENVDB_API Exception: public std::exception
+
44 {
+
45 public:
+
46  virtual const char* what() const throw()
+
47  {
+
48  try { return mMessage.c_str(); } catch (...) {};
+
49  return NULL;
+
50  }
+
51 
+
52  virtual ~Exception() throw() {}
+
53 
+
54 protected:
+
55  Exception() throw() {}
+
56  explicit Exception(const char* eType, const std::string* const msg = NULL) throw()
+
57  {
+
58  try {
+
59  if (eType) mMessage = eType;
+
60  if (msg) mMessage += ": " + (*msg);
+
61  } catch (...) {}
+
62  }
+
63 
+
64 private:
+
65  std::string mMessage;
+
66 };
+
67 
+
68 
+
69 #define OPENVDB_EXCEPTION(_classname) \
+
70 class OPENVDB_API _classname: public Exception \
+
71 { \
+
72 public: \
+
73  _classname() throw() : Exception( #_classname ) {} \
+
74  explicit _classname(const std::string &msg) throw() : Exception( #_classname , &msg) {} \
+
75 }
+
76 
+
77 
+ + + + + + + + + + + +
89 
+
90 
+
91 #undef OPENVDB_EXCEPTION
+
92 
+
93 } // namespace OPENVDB_VERSION_NAME
+
94 } // namespace openvdb
+
95 
+
96 
+
97 #define OPENVDB_THROW(exception, message) \
+
98 { \
+
99  std::string _openvdb_throw_msg; \
+
100  try { \
+
101  std::ostringstream _openvdb_throw_os; \
+
102  _openvdb_throw_os << message; \
+
103  _openvdb_throw_msg = _openvdb_throw_os.str(); \
+
104  } catch (...) {} \
+
105  throw exception(_openvdb_throw_msg); \
+
106 } // OPENVDB_THROW
+
107 
+
108 #endif // OPENVDB_EXCEPTIONS_HAS_BEEN_INCLUDED
+
109 
+
110 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
111 // All rights reserved. This software is distributed under the
+
112 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
#define OPENVDB_API
Helper macros for defining library symbol visibility.
Definition: Platform.h:195
+
virtual const char * what() const
Definition: Exceptions.h:46
+
Exception(const char *eType, const std::string *const msg=NULL)
Definition: Exceptions.h:56
+
Definition: Exceptions.h:78
+
Definition: Exceptions.h:85
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
Definition: Exceptions.h:79
+
virtual ~Exception()
Definition: Exceptions.h:52
+
Definition: Exceptions.h:86
+
Definition: Exceptions.h:39
+
Exception()
Definition: Exceptions.h:55
+
Definition: Exceptions.h:43
+ +
Definition: Exceptions.h:87
+
Definition: Exceptions.h:81
+
Definition: Exceptions.h:84
+
Definition: Exceptions.h:88
+
Definition: Exceptions.h:82
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
#define OPENVDB_EXCEPTION(_classname)
Definition: Exceptions.h:69
+
Definition: Exceptions.h:83
+
Definition: Exceptions.h:80
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/File_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/File_8h_source.html new file mode 100644 index 00000000..c131c126 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/File_8h_source.html @@ -0,0 +1,322 @@ + + + + + + +OpenVDB: File.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
File.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
32 
+
33 #ifndef OPENVDB_IO_FILE_HAS_BEEN_INCLUDED
+
34 #define OPENVDB_IO_FILE_HAS_BEEN_INCLUDED
+
35 
+
36 #include "io.h" // for MappedFile::Notifier
+
37 #include "Archive.h"
+
38 #include "GridDescriptor.h"
+
39 #include <iosfwd>
+
40 #include <map>
+
41 #include <string>
+
42 #include <boost/scoped_ptr.hpp>
+
43 
+
44 
+
45 class TestFile;
+
46 class TestStream;
+
47 
+
48 namespace openvdb {
+ +
50 namespace OPENVDB_VERSION_NAME {
+
51 namespace io {
+
52 
+
54 class OPENVDB_API File: public Archive
+
55 {
+
56 public:
+
57  typedef std::multimap<Name, GridDescriptor> NameMap;
+
58  typedef NameMap::const_iterator NameMapCIter;
+
59 
+
60  explicit File(const std::string& filename);
+
61  virtual ~File();
+
62 
+
66  File(const File& other);
+
70  File& operator=(const File& other);
+
71 
+
75  virtual boost::shared_ptr<Archive> copy() const;
+
76 
+
79  const std::string& filename() const;
+
80 
+
90  bool open(bool delayLoad = true, const MappedFile::Notifier& = MappedFile::Notifier());
+
91 
+
93  bool isOpen() const;
+
94 
+
96  void close();
+
97 
+
100  Index64 getSize() const;
+
101 
+
104  Index64 copyMaxBytes() const;
+
116  void setCopyMaxBytes(Index64 bytes);
+
117 
+
119  bool hasGrid(const Name&) const;
+
120 
+
122  MetaMap::Ptr getMetadata() const;
+
123 
+
125  GridPtrVecPtr getGrids() const;
+
126 
+
130  GridPtrVecPtr readAllGridMetadata();
+
131 
+
136  GridBase::Ptr readGridMetadata(const Name&);
+
137 
+
144  GridBase::ConstPtr readGridPartial(const Name&);
+
145 
+
147  GridBase::Ptr readGrid(const Name&);
+
148 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
149  GridBase::Ptr readGrid(const Name&, const BBoxd&);
+
152 #endif
+
153 
+
156 
+
159  virtual void write(const GridCPtrVec&, const MetaMap& = MetaMap()) const;
+
160 
+
163  template<typename GridPtrContainerT>
+
164  void write(const GridPtrContainerT&, const MetaMap& = MetaMap()) const;
+
165 
+ +
169  {
+
170  public:
+
171  NameIterator(const NameMapCIter& iter): mIter(iter) {}
+ +
173 
+
174  NameIterator& operator++() { mIter++; return *this; }
+
175 
+
176  bool operator==(const NameIterator& iter) const { return mIter == iter.mIter; }
+
177  bool operator!=(const NameIterator& iter) const { return mIter != iter.mIter; }
+
178 
+
179  Name operator*() const { return this->gridName(); }
+
180 
+
181  Name gridName() const { return GridDescriptor::nameAsString(mIter->second.uniqueName()); }
+
182 
+
183  private:
+
184  NameMapCIter mIter;
+
185  };
+
186 
+
188  NameIterator beginName() const;
+
189 
+
191  NameIterator endName() const;
+
192 
+
193 private:
+
195  void readGridDescriptors(std::istream&);
+
196 
+
199  NameMapCIter findDescriptor(const Name&) const;
+
200 
+ +
203 
+
206  GridBase::Ptr readGridByName(const Name&, const BBoxd&);
+
207 
+
209  GridBase::ConstPtr readGridPartial(const GridDescriptor&, bool readTopology) const;
+
210 
+
212  GridBase::Ptr readGrid(const GridDescriptor&) const;
+
213 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
214  GridBase::Ptr readGrid(const GridDescriptor&, const BBoxd&) const;
+
219  GridBase::Ptr readGrid(const GridDescriptor&, const CoordBBox&) const;
+
220 #endif
+
221 
+
224  void readGridPartial(GridBase::Ptr, std::istream&, bool isInstance, bool readTopology) const;
+
225 
+
229  GridBase::Ptr retrieveCachedGrid(const Name&) const;
+
230 
+
231  void writeGrids(const GridCPtrVec&, const MetaMap&) const;
+
232 
+
233  MetaMap::Ptr fileMetadata();
+
234  MetaMap::ConstPtr fileMetadata() const;
+
235 
+
236  const NameMap& gridDescriptors() const;
+
237  NameMap& gridDescriptors();
+
238 
+
239  std::istream& inputStream() const;
+
240 
+
241  friend class ::TestFile;
+
242  friend class ::TestStream;
+
243 
+
244  struct Impl;
+
245  boost::scoped_ptr<Impl> mImpl;
+
246 };
+
247 
+
248 
+
250 
+
251 
+
252 inline void
+
253 File::write(const GridCPtrVec& grids, const MetaMap& meta) const
+
254 {
+
255  this->writeGrids(grids, meta);
+
256 }
+
257 
+
258 
+
259 template<typename GridPtrContainerT>
+
260 inline void
+
261 File::write(const GridPtrContainerT& container, const MetaMap& meta) const
+
262 {
+
263  GridCPtrVec grids;
+
264  std::copy(container.begin(), container.end(), std::back_inserter(grids));
+
265  this->writeGrids(grids, meta);
+
266 }
+
267 
+
268 } // namespace io
+
269 } // namespace OPENVDB_VERSION_NAME
+
270 } // namespace openvdb
+
271 
+
272 #endif // OPENVDB_IO_FILE_HAS_BEEN_INCLUDED
+
273 
+
274 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
275 // All rights reserved. This software is distributed under the
+
276 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
#define OPENVDB_API
Helper macros for defining library symbol visibility.
Definition: Platform.h:195
+
boost::shared_ptr< const GridBase > ConstPtr
Definition: Grid.h:107
+ +
std::vector< GridBase::ConstPtr > GridCPtrVec
Definition: Grid.h:425
+
std::multimap< Name, GridDescriptor > NameMap
Definition: File.h:57
+
std::string Name
Definition: Name.h:44
+
Name gridName() const
Definition: File.h:181
+
Container that maps names (strings) to values of arbitrary types.
Definition: MetaMap.h:46
+
~NameIterator()
Definition: File.h:172
+
bool operator!=(const NameIterator &iter) const
Definition: File.h:177
+
boost::shared_ptr< GridPtrVec > GridPtrVecPtr
Definition: Grid.h:423
+ + +
NameIterator & operator++()
Definition: File.h:174
+
Definition: GridDescriptor.h:46
+
Grid archive associated with a file on disk.
Definition: File.h:54
+
bool operator==(const NameIterator &iter) const
Definition: File.h:176
+
uint64_t Index64
Definition: Types.h:57
+ +
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
Definition: Exceptions.h:39
+ +
NameMap::const_iterator NameMapCIter
Definition: File.h:58
+
boost::shared_ptr< GridBase > Ptr
Definition: Grid.h:106
+
NameIterator(const NameMapCIter &iter)
Definition: File.h:171
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
boost::function< void(std::string)> Notifier
Definition: io.h:153
+
GridType::Ptr createGrid(const typename GridType::ValueType &background)
Create a new grid of type GridType with a given background value.
Definition: Grid.h:1358
+
Name operator*() const
Definition: File.h:179
+
boost::shared_ptr< const MetaMap > ConstPtr
Definition: MetaMap.h:50
+
Grid serializer/unserializer.
Definition: Archive.h:59
+
boost::shared_ptr< MetaMap > Ptr
Definition: MetaMap.h:49
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/Filter_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/Filter_8h_source.html new file mode 100644 index 00000000..5527ac17 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/Filter_8h_source.html @@ -0,0 +1,537 @@ + + + + + + +OpenVDB: Filter.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Filter.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
38 
+
39 #ifndef OPENVDB_TOOLS_FILTER_HAS_BEEN_INCLUDED
+
40 #define OPENVDB_TOOLS_FILTER_HAS_BEEN_INCLUDED
+
41 
+
42 #include <tbb/parallel_for.h>
+
43 #include <boost/bind.hpp>
+
44 #include <boost/function.hpp>
+
45 #include <boost/type_traits/is_floating_point.hpp>
+
46 #include <openvdb/Types.h>
+
47 #include <openvdb/math/Math.h>
+
48 #include <openvdb/math/Stencils.h>
+
49 #include <openvdb/math/Transform.h>
+ + +
52 #include <openvdb/Grid.h>
+
53 #include "Interpolation.h"
+
54 
+
55 namespace openvdb {
+ +
57 namespace OPENVDB_VERSION_NAME {
+
58 namespace tools {
+
59 
+
63 template<typename GridT,
+
64  typename MaskT = typename GridT::template ValueConverter<float>::Type,
+
65  typename InterruptT = util::NullInterrupter>
+
66 class Filter
+
67 {
+
68 public:
+
69  typedef GridT GridType;
+
70  typedef MaskT MaskType;
+
71  typedef typename GridType::TreeType TreeType;
+
72  typedef typename TreeType::LeafNodeType LeafType;
+
73  typedef typename GridType::ValueType ValueType;
+
74  typedef typename MaskType::ValueType AlphaType;
+ + + +
78  BOOST_STATIC_ASSERT(boost::is_floating_point<AlphaType>::value);
+
79 
+
83  Filter(GridT& grid, InterruptT* interrupt = NULL)
+
84  : mGrid(&grid)
+
85  , mTask(0)
+
86  , mInterrupter(interrupt)
+
87  , mMask(NULL)
+
88  , mGrainSize(1)
+
89  , mMinMask(0)
+
90  , mMaxMask(1)
+
91  , mInvertMask(false)
+
92  {
+
93  }
+
94 
+
98  Filter(const Filter& other)
+
99  : mGrid(other.mGrid)
+
100  , mTask(other.mTask)
+
101  , mInterrupter(other.mInterrupter)
+
102  , mMask(other.mMask)
+
103  , mGrainSize(other.mGrainSize)
+
104  , mMinMask(other.mMinMask)
+
105  , mMaxMask(other.mMaxMask)
+
106  , mInvertMask(other.mInvertMask)
+
107  {
+
108  }
+
109 
+
111  int getGrainSize() const { return mGrainSize; }
+
114  void setGrainSize(int grainsize) { mGrainSize = grainsize; }
+
115 
+
118  AlphaType minMask() const { return mMinMask; }
+
121  AlphaType maxMask() const { return mMaxMask; }
+
128  void setMaskRange(AlphaType min, AlphaType max)
+
129  {
+
130  if (!(min < max)) OPENVDB_THROW(ValueError, "Invalid mask range (expects min < max)");
+
131  mMinMask = min;
+
132  mMaxMask = max;
+
133  }
+
134 
+
137  bool isMaskInverted() const { return mInvertMask; }
+
140  void invertMask(bool invert=true) { mInvertMask = invert; }
+
141 
+
146  void mean(int width = 1, int iterations = 1, const MaskType* mask = NULL);
+
147 
+
155  void gaussian(int width = 1, int iterations = 1, const MaskType* mask = NULL);
+
156 
+
163  void median(int width = 1, int iterations = 1, const MaskType* mask = NULL);
+
164 
+
168  void offset(ValueType offset, const MaskType* mask = NULL);
+
169 
+
174  void operator()(const RangeType& range) const
+
175  {
+
176  if (mTask) mTask(const_cast<Filter*>(this), range);
+
177  else OPENVDB_THROW(ValueError, "task is undefined - call median(), mean(), etc.");
+
178  }
+
179 
+
180 private:
+
181  typedef typename TreeType::LeafNodeType LeafT;
+
182  typedef typename LeafT::ValueOnIter VoxelIterT;
+
183  typedef typename LeafT::ValueOnCIter VoxelCIterT;
+
184  typedef typename tree::LeafManager<TreeType>::BufferType BufferT;
+
185  typedef typename RangeType::Iterator LeafIterT;
+
186  typedef tools::AlphaMask<GridT, MaskT> AlphaMaskT;
+
187 
+
188  void cook(LeafManagerType& leafs);
+
189 
+
190  template<size_t Axis>
+
191  struct Avg {
+
192  Avg(const GridT* grid, Int32 w): acc(grid->tree()), width(w), frac(1.f/float(2*w+1)) {}
+
193  inline ValueType operator()(Coord xyz);
+
194  typename GridT::ConstAccessor acc;
+
195  const Int32 width;
+
196  const float frac;
+
197  };
+
198 
+
199  // Private filter methods called by tbb::parallel_for threads
+
200  template <typename AvgT>
+
201  void doBox( const RangeType& r, Int32 w);
+
202  void doBoxX(const RangeType& r, Int32 w) { this->doBox<Avg<0> >(r,w); }
+
203  void doBoxZ(const RangeType& r, Int32 w) { this->doBox<Avg<1> >(r,w); }
+
204  void doBoxY(const RangeType& r, Int32 w) { this->doBox<Avg<2> >(r,w); }
+
205  void doMedian(const RangeType&, int);
+
206  void doOffset(const RangeType&, ValueType);
+
208  bool wasInterrupted();
+
209 
+
210  GridType* mGrid;
+
211  typename boost::function<void (Filter*, const RangeType&)> mTask;
+
212  InterruptT* mInterrupter;
+
213  const MaskType* mMask;
+
214  int mGrainSize;
+
215  AlphaType mMinMask, mMaxMask;
+
216  bool mInvertMask;
+
217 }; // end of Filter class
+
218 
+
219 
+
221 
+
222 
+
223 namespace filter_internal {
+
224 // Helper function for Filter::Avg::operator()
+
225 template<typename T> static inline void accum(T& sum, T addend) { sum += addend; }
+
226 // Overload for bool ValueType
+
227 inline void accum(bool& sum, bool addend) { sum = sum || addend; }
+
228 }
+
229 
+
230 
+
231 template<typename GridT, typename MaskT, typename InterruptT>
+
232 template<size_t Axis>
+
233 inline typename GridT::ValueType
+
234 Filter<GridT, MaskT, InterruptT>::Avg<Axis>::operator()(Coord xyz)
+
235 {
+
236  ValueType sum = zeroVal<ValueType>();
+
237  Int32 &i = xyz[Axis], j = i + width;
+
238  for (i -= width; i <= j; ++i) filter_internal::accum(sum, acc.getValue(xyz));
+
239  return static_cast<ValueType>(sum * frac);
+
240 }
+
241 
+
242 
+
244 
+
245 
+
246 template<typename GridT, typename MaskT, typename InterruptT>
+
247 inline void
+
248 Filter<GridT, MaskT, InterruptT>::mean(int width, int iterations, const MaskType* mask)
+
249 {
+
250  mMask = mask;
+
251 
+
252  if (mInterrupter) mInterrupter->start("Applying mean filter");
+
253 
+
254  const int w = std::max(1, width);
+
255 
+
256  LeafManagerType leafs(mGrid->tree(), 1, mGrainSize==0);
+
257 
+
258  for (int i=0; i<iterations && !this->wasInterrupted(); ++i) {
+
259  mTask = boost::bind(&Filter::doBoxX, _1, _2, w);
+
260  this->cook(leafs);
+
261 
+
262  mTask = boost::bind(&Filter::doBoxY, _1, _2, w);
+
263  this->cook(leafs);
+
264 
+
265  mTask = boost::bind(&Filter::doBoxZ, _1, _2, w);
+
266  this->cook(leafs);
+
267  }
+
268 
+
269  if (mInterrupter) mInterrupter->end();
+
270 }
+
271 
+
272 
+
273 template<typename GridT, typename MaskT, typename InterruptT>
+
274 inline void
+
275 Filter<GridT, MaskT, InterruptT>::gaussian(int width, int iterations, const MaskType* mask)
+
276 {
+
277  mMask = mask;
+
278 
+
279  if (mInterrupter) mInterrupter->start("Applying Gaussian filter");
+
280 
+
281  const int w = std::max(1, width);
+
282 
+
283  LeafManagerType leafs(mGrid->tree(), 1, mGrainSize==0);
+
284 
+
285  for (int i=0; i<iterations; ++i) {
+
286  for (int n=0; n<4 && !this->wasInterrupted(); ++n) {
+
287  mTask = boost::bind(&Filter::doBoxX, _1, _2, w);
+
288  this->cook(leafs);
+
289 
+
290  mTask = boost::bind(&Filter::doBoxY, _1, _2, w);
+
291  this->cook(leafs);
+
292 
+
293  mTask = boost::bind(&Filter::doBoxZ, _1, _2, w);
+
294  this->cook(leafs);
+
295  }
+
296  }
+
297 
+
298  if (mInterrupter) mInterrupter->end();
+
299 }
+
300 
+
301 
+
302 template<typename GridT, typename MaskT, typename InterruptT>
+
303 inline void
+
304 Filter<GridT, MaskT, InterruptT>::median(int width, int iterations, const MaskType* mask)
+
305 {
+
306  mMask = mask;
+
307 
+
308  if (mInterrupter) mInterrupter->start("Applying median filter");
+
309 
+
310  LeafManagerType leafs(mGrid->tree(), 1, mGrainSize==0);
+
311 
+
312  mTask = boost::bind(&Filter::doMedian, _1, _2, std::max(1, width));
+
313  for (int i=0; i<iterations && !this->wasInterrupted(); ++i) this->cook(leafs);
+
314 
+
315  if (mInterrupter) mInterrupter->end();
+
316 }
+
317 
+
318 
+
319 template<typename GridT, typename MaskT, typename InterruptT>
+
320 inline void
+ +
322 {
+
323  mMask = mask;
+
324 
+
325  if (mInterrupter) mInterrupter->start("Applying offset");
+
326 
+
327  LeafManagerType leafs(mGrid->tree(), 0, mGrainSize==0);
+
328 
+
329  mTask = boost::bind(&Filter::doOffset, _1, _2, value);
+
330  this->cook(leafs);
+
331 
+
332  if (mInterrupter) mInterrupter->end();
+
333 }
+
334 
+
335 
+
337 
+
338 
+
341 template<typename GridT, typename MaskT, typename InterruptT>
+
342 inline void
+
343 Filter<GridT, MaskT, InterruptT>::cook(LeafManagerType& leafs)
+
344 {
+
345  if (mGrainSize>0) {
+
346  tbb::parallel_for(leafs.leafRange(mGrainSize), *this);
+
347  } else {
+
348  (*this)(leafs.leafRange());
+
349  }
+
350  leafs.swapLeafBuffer(1, mGrainSize==0);
+
351 }
+
352 
+
353 
+
355 template<typename GridT, typename MaskT, typename InterruptT>
+
356 template <typename AvgT>
+
357 inline void
+
358 Filter<GridT, MaskT, InterruptT>::doBox(const RangeType& range, Int32 w)
+
359 {
+
360  this->wasInterrupted();
+
361  AvgT avg(mGrid, w);
+
362  if (mMask) {
+
363  typename AlphaMaskT::FloatType a, b;
+
364  AlphaMaskT alpha(*mGrid, *mMask, mMinMask, mMaxMask, mInvertMask);
+
365  for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) {
+
366  BufferT& buffer = leafIter.buffer(1);
+
367  for (VoxelCIterT iter = leafIter->cbeginValueOn(); iter; ++iter) {
+
368  const Coord xyz = iter.getCoord();
+
369  if (alpha(xyz, a, b)) {
+
370  buffer.setValue(iter.pos(), ValueType(b*(*iter) + a*avg(xyz)));
+
371  }
+
372  }
+
373  }
+
374  } else {
+
375  for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) {
+
376  BufferT& buffer = leafIter.buffer(1);
+
377  for (VoxelCIterT iter = leafIter->cbeginValueOn(); iter; ++iter) {
+
378  buffer.setValue(iter.pos(), avg(iter.getCoord()));
+
379  }
+
380  }
+
381  }
+
382 }
+
383 
+
384 
+
386 template<typename GridT, typename MaskT, typename InterruptT>
+
387 inline void
+
388 Filter<GridT, MaskT, InterruptT>::doMedian(const RangeType& range, int width)
+
389 {
+
390  this->wasInterrupted();
+
391  typename math::DenseStencil<GridType> stencil(*mGrid, width);//creates local cache!
+
392  if (mMask) {
+
393  typename AlphaMaskT::FloatType a, b;
+
394  AlphaMaskT alpha(*mGrid, *mMask, mMinMask, mMaxMask, mInvertMask);
+
395  for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) {
+
396  BufferT& buffer = leafIter.buffer(1);
+
397  for (VoxelCIterT iter = leafIter->cbeginValueOn(); iter; ++iter) {
+
398  if (alpha(iter.getCoord(), a, b)) {
+
399  stencil.moveTo(iter);
+
400  buffer.setValue(iter.pos(), ValueType(b*(*iter) + a*stencil.median()));
+
401  }
+
402  }
+
403  }
+
404  } else {
+
405  for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) {
+
406  BufferT& buffer = leafIter.buffer(1);
+
407  for (VoxelCIterT iter = leafIter->cbeginValueOn(); iter; ++iter) {
+
408  stencil.moveTo(iter);
+
409  buffer.setValue(iter.pos(), stencil.median());
+
410  }
+
411  }
+
412  }
+
413 }
+
414 
+
415 
+
417 template<typename GridT, typename MaskT, typename InterruptT>
+
418 inline void
+
419 Filter<GridT, MaskT, InterruptT>::doOffset(const RangeType& range, ValueType offset)
+
420 {
+
421  this->wasInterrupted();
+
422  if (mMask) {
+
423  typename AlphaMaskT::FloatType a, b;
+
424  AlphaMaskT alpha(*mGrid, *mMask, mMinMask, mMaxMask, mInvertMask);
+
425  for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) {
+
426  for (VoxelIterT iter = leafIter->beginValueOn(); iter; ++iter) {
+
427  if (alpha(iter.getCoord(), a, b)) iter.setValue(ValueType(*iter + a*offset));
+
428  }
+
429  }
+
430  } else {
+
431  for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) {
+
432  for (VoxelIterT iter = leafIter->beginValueOn(); iter; ++iter) {
+
433  iter.setValue(*iter + offset);
+
434  }
+
435  }
+
436  }
+
437 }
+
438 
+
439 
+
440 template<typename GridT, typename MaskT, typename InterruptT>
+
441 inline bool
+ +
443 {
+
444  if (util::wasInterrupted(mInterrupter)) {
+
445  tbb::task::self().cancel_group_execution();
+
446  return true;
+
447  }
+
448  return false;
+
449 }
+
450 
+
451 } // namespace tools
+
452 } // namespace OPENVDB_VERSION_NAME
+
453 } // namespace openvdb
+
454 
+
455 #endif // OPENVDB_TOOLS_FILTER_HAS_BEEN_INCLUDED
+
456 
+
457 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
458 // All rights reserved. This software is distributed under the
+
459 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
Filter(const Filter &other)
Shallow copy constructor called by tbb::parallel_for() threads during filtering.
Definition: Filter.h:98
+
AlphaType minMask() const
Return the minimum value of the mask to be used for the derivation of a smooth alpha value...
Definition: Filter.h:118
+ + +
bool isMaskInverted() const
Return true if the mask is inverted, i.e. min->max in the original mask maps to 1->0 in the inverted ...
Definition: Filter.h:137
+ +
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
Filter(GridT &grid, InterruptT *interrupt=NULL)
Definition: Filter.h:83
+
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
+
void operator()(const RangeType &range) const
Used internally by tbb::parallel_for()
Definition: Filter.h:174
+
This class manages a linear array of pointers to a given tree's leaf nodes, as well as optional auxil...
Definition: LeafManager.h:115
+
TreeType::LeafNodeType LeafType
Definition: Filter.h:72
+
int getGrainSize() const
Definition: Filter.h:111
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & max(const T &a, const T &b)
Definition: Composite.h:132
+ +
LeafManagerType::LeafRange RangeType
Definition: Filter.h:76
+
void setGrainSize(int grainsize)
Set the grain-size used for multi-threading.
Definition: Filter.h:114
+
int32_t Int32
Definition: Types.h:60
+
tree::LeafManager< TreeType > LeafManagerType
Definition: Filter.h:75
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
Volume filtering (e.g., diffusion) with optional alpha masking.
Definition: Filter.h:66
+
GridT GridType
Definition: Filter.h:69
+
LeafManagerType::BufferType BufferType
Definition: Filter.h:77
+
CopyConstness< TreeType, NonConstBufferType >::Type BufferType
Definition: LeafManager.h:126
+
Definition: Interpolation.h:570
+
GridType::ValueType ValueType
Definition: Filter.h:73
+
Definition: Exceptions.h:39
+
MaskType::ValueType AlphaType
Definition: Filter.h:74
+
void setMaskRange(AlphaType min, AlphaType max)
Define the range for the (optional) scalar mask.
Definition: Filter.h:128
+
GridType::TreeType TreeType
Definition: Filter.h:71
+
void accum(bool &sum, bool addend)
Definition: Filter.h:227
+ +
MaskT MaskType
Definition: Filter.h:70
+
void invertMask(bool invert=true)
Invert the optional mask, i.e. min->max in the original mask maps to 1->0 in the inverted alpha mask...
Definition: Filter.h:140
+ +
Definition: Exceptions.h:88
+
Defines various finite difference stencils by means of the "curiously recurring template pattern" on ...
+
Axis
Definition: Math.h:838
+
AlphaType maxMask() const
Return the maximum value of the mask to be used for the derivation of a smooth alpha value...
Definition: Filter.h:121
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
A LeafManager manages a linear array of pointers to a given tree's leaf nodes, as well as optional au...
+
TreeT * tree
Definition: MaskToLevelSet.h:118
+
bool wasInterrupted(T *i, int percent=-1)
Definition: NullInterrupter.h:76
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & min(const T &a, const T &b)
Definition: Composite.h:128
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/FiniteDifference_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/FiniteDifference_8h_source.html new file mode 100644 index 00000000..8160733e --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/FiniteDifference_8h_source.html @@ -0,0 +1,2694 @@ + + + + + + +OpenVDB: FiniteDifference.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
FiniteDifference.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
32 
+
33 #ifndef OPENVDB_MATH_FINITEDIFFERENCE_HAS_BEEN_INCLUDED
+
34 #define OPENVDB_MATH_FINITEDIFFERENCE_HAS_BEEN_INCLUDED
+
35 
+
36 #include <openvdb/Types.h>
+
37 #include "Math.h"
+
38 #include "Coord.h"
+
39 #include "Vec3.h"
+
40 
+
41 #include <boost/algorithm/string/case_conv.hpp>
+
42 #include <boost/algorithm/string/trim.hpp>
+
43 
+
44 #ifdef DWA_OPENVDB
+
45 #include <simd/Simd.h>
+
46 #endif
+
47 
+
48 namespace openvdb {
+ +
50 namespace OPENVDB_VERSION_NAME {
+
51 namespace math {
+
52 
+
53 
+
55 
+
56 
+
58 // Add new items to the *end* of this list, and update NUM_DS_SCHEMES.
+
59 enum DScheme {
+
60  UNKNOWN_DS = -1,
+
61  CD_2NDT = 0, // center difference, 2nd order, but the result must be divided by 2
+
62  CD_2ND, // center difference, 2nd order
+
63  CD_4TH, // center difference, 4th order
+
64  CD_6TH, // center difference, 6th order
+
65  FD_1ST, // forward difference, 1st order
+
66  FD_2ND, // forward difference, 2nd order
+
67  FD_3RD, // forward difference, 3rd order
+
68  BD_1ST, // backward difference, 1st order
+
69  BD_2ND, // backward difference, 2nd order
+
70  BD_3RD, // backward difference, 3rd order
+
71  FD_WENO5, // forward difference, weno5
+
72  BD_WENO5, // backward difference, weno5
+
73  FD_HJWENO5, // forward differene, HJ-weno5
+
74  BD_HJWENO5 // backward difference, HJ-weno5
+
75 };
+
76 
+
77 enum { NUM_DS_SCHEMES = BD_HJWENO5 + 1 };
+
78 
+
79 
+
80 inline std::string
+ +
82 {
+
83  std::string ret;
+
84  switch (dss) {
+
85  case UNKNOWN_DS: ret = "unknown_ds"; break;
+
86  case CD_2NDT: ret = "cd_2ndt"; break;
+
87  case CD_2ND: ret = "cd_2nd"; break;
+
88  case CD_4TH: ret = "cd_4th"; break;
+
89  case CD_6TH: ret = "cd_6th"; break;
+
90  case FD_1ST: ret = "fd_1st"; break;
+
91  case FD_2ND: ret = "fd_2nd"; break;
+
92  case FD_3RD: ret = "fd_3rd"; break;
+
93  case BD_1ST: ret = "bd_1st"; break;
+
94  case BD_2ND: ret = "bd_2nd"; break;
+
95  case BD_3RD: ret = "bd_3rd"; break;
+
96  case FD_WENO5: ret = "fd_weno5"; break;
+
97  case BD_WENO5: ret = "bd_weno5"; break;
+
98  case FD_HJWENO5: ret = "fd_hjweno5"; break;
+
99  case BD_HJWENO5: ret = "bd_hjweno5"; break;
+
100  }
+
101  return ret;
+
102 }
+
103 
+
104 inline DScheme
+
105 stringToDScheme(const std::string& s)
+
106 {
+
107  DScheme ret = UNKNOWN_DS;
+
108 
+
109  std::string str = s;
+
110  boost::trim(str);
+
111  boost::to_lower(str);
+
112 
+
113  if (str == dsSchemeToString(CD_2NDT)) {
+
114  ret = CD_2NDT;
+
115  } else if (str == dsSchemeToString(CD_2ND)) {
+
116  ret = CD_2ND;
+
117  } else if (str == dsSchemeToString(CD_4TH)) {
+
118  ret = CD_4TH;
+
119  } else if (str == dsSchemeToString(CD_6TH)) {
+
120  ret = CD_6TH;
+
121  } else if (str == dsSchemeToString(FD_1ST)) {
+
122  ret = FD_1ST;
+
123  } else if (str == dsSchemeToString(FD_2ND)) {
+
124  ret = FD_2ND;
+
125  } else if (str == dsSchemeToString(FD_3RD)) {
+
126  ret = FD_3RD;
+
127  } else if (str == dsSchemeToString(BD_1ST)) {
+
128  ret = BD_1ST;
+
129  } else if (str == dsSchemeToString(BD_2ND)) {
+
130  ret = BD_2ND;
+
131  } else if (str == dsSchemeToString(BD_3RD)) {
+
132  ret = BD_3RD;
+
133  } else if (str == dsSchemeToString(FD_WENO5)) {
+
134  ret = FD_WENO5;
+
135  } else if (str == dsSchemeToString(BD_WENO5)) {
+
136  ret = BD_WENO5;
+
137  } else if (str == dsSchemeToString(FD_HJWENO5)) {
+
138  ret = FD_HJWENO5;
+
139  } else if (str == dsSchemeToString(BD_HJWENO5)) {
+
140  ret = BD_HJWENO5;
+
141  }
+
142 
+
143  return ret;
+
144 }
+
145 
+
146 inline std::string
+ +
148 {
+
149  std::string ret;
+
150  switch (dss) {
+
151  case UNKNOWN_DS: ret = "Unknown DS scheme"; break;
+
152  case CD_2NDT: ret = "Twice 2nd-order center difference"; break;
+
153  case CD_2ND: ret = "2nd-order center difference"; break;
+
154  case CD_4TH: ret = "4th-order center difference"; break;
+
155  case CD_6TH: ret = "6th-order center difference"; break;
+
156  case FD_1ST: ret = "1st-order forward difference"; break;
+
157  case FD_2ND: ret = "2nd-order forward difference"; break;
+
158  case FD_3RD: ret = "3rd-order forward difference"; break;
+
159  case BD_1ST: ret = "1st-order backward difference"; break;
+
160  case BD_2ND: ret = "2nd-order backward difference"; break;
+
161  case BD_3RD: ret = "3rd-order backward difference"; break;
+
162  case FD_WENO5: ret = "5th-order WENO forward difference"; break;
+
163  case BD_WENO5: ret = "5th-order WENO backward difference"; break;
+
164  case FD_HJWENO5: ret = "5th-order HJ-WENO forward difference"; break;
+
165  case BD_HJWENO5: ret = "5th-order HJ-WENO backward difference"; break;
+
166  }
+
167  return ret;
+
168 }
+
169 
+
170 
+
171 
+
173 
+
174 
+
176 // Add new items to the *end* of this list, and update NUM_DD_SCHEMES.
+
177 enum DDScheme {
+ +
179  CD_SECOND = 0, // center difference, 2nd order
+
180  CD_FOURTH, // center difference, 4th order
+
181  CD_SIXTH // center difference, 6th order
+
182 };
+
183 
+
184 enum { NUM_DD_SCHEMES = CD_SIXTH + 1 };
+
185 
+
186 
+
188 
+
189 
+
191 // Add new items to the *end* of this list, and update NUM_BIAS_SCHEMES.
+ + +
194  FIRST_BIAS = 0, // uses FD_1ST & BD_1ST
+
195  SECOND_BIAS, // uses FD_2ND & BD_2ND
+
196  THIRD_BIAS, // uses FD_3RD & BD_3RD
+
197  WENO5_BIAS, // uses WENO5
+
198  HJWENO5_BIAS // uses HJWENO5
+
199 };
+
200 
+ +
202 
+
203 inline std::string
+ +
205 {
+
206  std::string ret;
+
207  switch (bgs) {
+
208  case UNKNOWN_BIAS: ret = "unknown_bias"; break;
+
209  case FIRST_BIAS: ret = "first_bias"; break;
+
210  case SECOND_BIAS: ret = "second_bias"; break;
+
211  case THIRD_BIAS: ret = "third_bias"; break;
+
212  case WENO5_BIAS: ret = "weno5_bias"; break;
+
213  case HJWENO5_BIAS: ret = "hjweno5_bias"; break;
+
214  }
+
215  return ret;
+
216 }
+
217 
+ +
219 stringToBiasedGradientScheme(const std::string& s)
+
220 {
+ +
222 
+
223  std::string str = s;
+
224  boost::trim(str);
+
225  boost::to_lower(str);
+
226 
+ +
228  ret = FIRST_BIAS;
+
229  } else if (str == biasedGradientSchemeToString(SECOND_BIAS)) {
+
230  ret = SECOND_BIAS;
+
231  } else if (str == biasedGradientSchemeToString(THIRD_BIAS)) {
+
232  ret = THIRD_BIAS;
+
233  } else if (str == biasedGradientSchemeToString(WENO5_BIAS)) {
+
234  ret = WENO5_BIAS;
+
235  } else if (str == biasedGradientSchemeToString(HJWENO5_BIAS)) {
+
236  ret = HJWENO5_BIAS;
+
237  }
+
238  return ret;
+
239 }
+
240 
+
241 inline std::string
+ +
243 {
+
244  std::string ret;
+
245  switch (bgs) {
+
246  case UNKNOWN_BIAS: ret = "Unknown biased gradient"; break;
+
247  case FIRST_BIAS: ret = "1st-order biased gradient"; break;
+
248  case SECOND_BIAS: ret = "2nd-order biased gradient"; break;
+
249  case THIRD_BIAS: ret = "3rd-order biased gradient"; break;
+
250  case WENO5_BIAS: ret = "5th-order WENO biased gradient"; break;
+
251  case HJWENO5_BIAS: ret = "5th-order HJ-WENO biased gradient"; break;
+
252  }
+
253  return ret;
+
254 }
+
255 
+
257 
+
258 
+
260 // Add new items to the *end* of this list, and update NUM_TEMPORAL_SCHEMES.
+ + +
263  TVD_RK1,//same as explicit Euler integration
+ + +
266 };
+
267 
+ +
269 
+
270 inline std::string
+ +
272 {
+
273  std::string ret;
+
274  switch (tis) {
+
275  case UNKNOWN_TIS: ret = "unknown_tis"; break;
+
276  case TVD_RK1: ret = "tvd_rk1"; break;
+
277  case TVD_RK2: ret = "tvd_rk2"; break;
+
278  case TVD_RK3: ret = "tvd_rk3"; break;
+
279  }
+
280  return ret;
+
281 }
+
282 
+ + +
285 {
+ +
287 
+
288  std::string str = s;
+
289  boost::trim(str);
+
290  boost::to_lower(str);
+
291 
+ +
293  ret = TVD_RK1;
+
294  } else if (str == temporalIntegrationSchemeToString(TVD_RK2)) {
+
295  ret = TVD_RK2;
+
296  } else if (str == temporalIntegrationSchemeToString(TVD_RK3)) {
+
297  ret = TVD_RK3;
+
298  }
+
299 
+
300  return ret;
+
301 }
+
302 
+
303 inline std::string
+ +
305 {
+
306  std::string ret;
+
307  switch (tis) {
+
308  case UNKNOWN_TIS: ret = "Unknown temporal integration"; break;
+
309  case TVD_RK1: ret = "Forward Euler"; break;
+
310  case TVD_RK2: ret = "2nd-order Runge-Kutta"; break;
+
311  case TVD_RK3: ret = "3rd-order Runge-Kutta"; break;
+
312  }
+
313  return ret;
+
314 }
+
315 
+
316 
+
318 
+
319 
+
329 template<typename ValueType>
+
330 inline ValueType
+
331 WENO5(const ValueType& v1, const ValueType& v2, const ValueType& v3,
+
332  const ValueType& v4, const ValueType& v5, float scale2 = 0.01f)
+
333 {
+
334  const double C = 13.0 / 12.0;
+
335  // WENO is formulated for non-dimensional equations, here the optional scale2
+
336  // is a reference value (squared) for the function being interpolated. For
+
337  // example if 'v' is of order 1000, then scale2 = 10^6 is ok. But in practice
+
338  // leave scale2 = 1.
+
339  const double eps = 1e-6 * scale2;
+
340  // {\tilde \omega_k} = \gamma_k / ( \beta_k + \epsilon)^2 in Shu's ICASE report)
+
341  const double A1=0.1/math::Pow2(C*math::Pow2(v1-2*v2+v3)+0.25*math::Pow2(v1-4*v2+3.0*v3)+eps),
+
342  A2=0.6/math::Pow2(C*math::Pow2(v2-2*v3+v4)+0.25*math::Pow2(v2-v4)+eps),
+
343  A3=0.3/math::Pow2(C*math::Pow2(v3-2*v4+v5)+0.25*math::Pow2(3.0*v3-4*v4+v5)+eps);
+
344 
+
345  return static_cast<ValueType>(static_cast<ValueType>(
+
346  A1*(2.0*v1 - 7.0*v2 + 11.0*v3) +
+
347  A2*(5.0*v3 - v2 + 2.0*v4) +
+
348  A3*(2.0*v3 + 5.0*v4 - v5))/(6.0*(A1+A2+A3)));
+
349 }
+
350 
+
351 
+
352 template <typename Real>
+
353 inline Real GodunovsNormSqrd(bool isOutside,
+
354  Real dP_xm, Real dP_xp,
+
355  Real dP_ym, Real dP_yp,
+
356  Real dP_zm, Real dP_zp)
+
357 {
+
358  using math::Max;
+
359  using math::Min;
+
360  using math::Pow2;
+
361 
+
362  const Real zero(0);
+
363  Real dPLen2;
+
364  if (isOutside) { // outside
+
365  dPLen2 = Max(Pow2(Max(dP_xm, zero)), Pow2(Min(dP_xp,zero))); // (dP/dx)2
+
366  dPLen2 += Max(Pow2(Max(dP_ym, zero)), Pow2(Min(dP_yp,zero))); // (dP/dy)2
+
367  dPLen2 += Max(Pow2(Max(dP_zm, zero)), Pow2(Min(dP_zp,zero))); // (dP/dz)2
+
368  } else { // inside
+
369  dPLen2 = Max(Pow2(Min(dP_xm, zero)), Pow2(Max(dP_xp,zero))); // (dP/dx)2
+
370  dPLen2 += Max(Pow2(Min(dP_ym, zero)), Pow2(Max(dP_yp,zero))); // (dP/dy)2
+
371  dPLen2 += Max(Pow2(Min(dP_zm, zero)), Pow2(Max(dP_zp,zero))); // (dP/dz)2
+
372  }
+
373  return dPLen2; // |\nabla\phi|^2
+
374 }
+
375 
+
376 
+
377 template <typename Real>
+ +
379  Real dP_xm, Real dP_xp,
+
380  Real dP_ym, Real dP_yp,
+
381  Real dP_zm, Real dP_zp)
+
382 { return GodunovsNormSqrd(isOutside, dP_xm, dP_xp, dP_ym, dP_yp, dP_zm, dP_zp); }
+
383 
+
384 template<typename Real>
+
385 inline Real
+
386 GodunovsNormSqrd(bool isOutside, const Vec3<Real>& gradient_m, const Vec3<Real>& gradient_p)
+
387 {
+
388  return GodunovsNormSqrd<Real>(isOutside,
+
389  gradient_m[0], gradient_p[0],
+
390  gradient_m[1], gradient_p[1],
+
391  gradient_m[2], gradient_p[2]);
+
392 }
+
393 
+
394 template<typename Real>
+ +
396  const Vec3<Real>& gradient_m,
+
397  const Vec3<Real>& gradient_p)
+
398 {
+
399  return GodunovsNormSqrd<Real>(isOutside, gradient_m, gradient_p);
+
400 }
+
401 
+
402 
+
403 #ifdef DWA_OPENVDB
+
404 inline simd::Float4 simdMin(const simd::Float4& a, const simd::Float4& b) {
+
405  return simd::Float4(_mm_min_ps(a.base(), b.base()));
+
406 }
+
407 inline simd::Float4 simdMax(const simd::Float4& a, const simd::Float4& b) {
+
408  return simd::Float4(_mm_max_ps(a.base(), b.base()));
+
409 }
+
410 
+
411 inline float simdSum(const simd::Float4& v);
+
412 
+
413 inline simd::Float4 Pow2(const simd::Float4& v) { return v * v; }
+
414 
+
415 template<>
+
416 inline simd::Float4
+
417 WENO5<simd::Float4>(const simd::Float4& v1, const simd::Float4& v2, const simd::Float4& v3,
+
418  const simd::Float4& v4, const simd::Float4& v5, float scale2)
+
419 {
+
420  using math::Pow2;
+
421  typedef simd::Float4 F4;
+
422  const F4
+
423  C(13.f / 12.f),
+
424  eps(1.0e-6f * scale2),
+
425  two(2.0), three(3.0), four(4.0), five(5.0), fourth(0.25),
+
426  A1 = F4(0.1f) / Pow2(C*Pow2(v1-two*v2+v3) + fourth*Pow2(v1-four*v2+three*v3) + eps),
+
427  A2 = F4(0.6f) / Pow2(C*Pow2(v2-two*v3+v4) + fourth*Pow2(v2-v4) + eps),
+
428  A3 = F4(0.3f) / Pow2(C*Pow2(v3-two*v4+v5) + fourth*Pow2(three*v3-four*v4+v5) + eps);
+
429  return (A1 * (two * v1 - F4(7.0) * v2 + F4(11.0) * v3) +
+
430  A2 * (five * v3 - v2 + two * v4) +
+
431  A3 * (two * v3 + five * v4 - v5)) / (F4(6.0) * (A1 + A2 + A3));
+
432 }
+
433 
+
434 
+
435 inline float
+
436 simdSum(const simd::Float4& v)
+
437 {
+
438  // temp = { v3+v3, v2+v2, v1+v3, v0+v2 }
+
439  __m128 temp = _mm_add_ps(v.base(), _mm_movehl_ps(v.base(), v.base()));
+
440  // temp = { v3+v3, v2+v2, v1+v3, (v0+v2)+(v1+v3) }
+
441  temp = _mm_add_ss(temp, _mm_shuffle_ps(temp, temp, 1));
+
442  return _mm_cvtss_f32(temp);
+
443 }
+
444 
+
445 inline float
+
446 GodunovsNormSqrd(bool isOutside, const simd::Float4& dP_m, const simd::Float4& dP_p)
+
447 {
+
448  const simd::Float4 zero(0.0);
+
449  simd::Float4 v = isOutside
+
450  ? simdMax(math::Pow2(simdMax(dP_m, zero)), math::Pow2(simdMin(dP_p, zero)))
+
451  : simdMax(math::Pow2(simdMin(dP_m, zero)), math::Pow2(simdMax(dP_p, zero)));
+
452  return simdSum(v);//should be v[0]+v[1]+v[2]
+
453 }
+
454 
+
455 OPENVDB_DEPRECATED inline float GudonovsNormSqrd(bool isOutside,
+
456  const simd::Float4& dP_m,
+
457  const simd::Float4& dP_p)
+
458 {
+
459  return GodunovsNormSqrd(isOutside, dP_m, dP_p);
+
460 }
+
461 #endif
+
462 
+
463 template<DScheme DiffScheme>
+
464 struct D1
+
465 {
+
466  // random access version
+
467  template<typename Accessor>
+
468  static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk);
+
469 
+
470  template<typename Accessor>
+
471  static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk);
+
472 
+
473  template<typename Accessor>
+
474  static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk);
+
475 
+
476  // stencil access version
+
477  template<typename Stencil>
+
478  static typename Stencil::ValueType inX(const Stencil& S);
+
479 
+
480  template<typename Stencil>
+
481  static typename Stencil::ValueType inY(const Stencil& S);
+
482 
+
483  template<typename Stencil>
+
484  static typename Stencil::ValueType inZ(const Stencil& S);
+
485 };
+
486 
+
487 template<>
+
488 struct D1<CD_2NDT>
+
489 {
+
490  // the difference opperator
+
491  template <typename ValueType>
+
492  static ValueType difference(const ValueType& xp1, const ValueType& xm1) {
+
493  return xp1 - xm1;
+
494  }
+
495 
+
496  // random access version
+
497  template<typename Accessor>
+
498  static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk)
+
499  {
+
500  return difference(
+
501  grid.getValue(ijk.offsetBy(1, 0, 0)),
+
502  grid.getValue(ijk.offsetBy(-1, 0, 0)));
+
503  }
+
504 
+
505  template<typename Accessor>
+
506  static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk)
+
507  {
+
508  return difference(
+
509  grid.getValue(ijk.offsetBy(0, 1, 0)),
+
510  grid.getValue(ijk.offsetBy( 0, -1, 0)));
+
511  }
+
512 
+
513  template<typename Accessor>
+
514  static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk)
+
515  {
+
516  return difference(
+
517  grid.getValue(ijk.offsetBy(0, 0, 1)),
+
518  grid.getValue(ijk.offsetBy( 0, 0, -1)));
+
519  }
+
520 
+
521  // stencil access version
+
522  template<typename Stencil>
+
523  static typename Stencil::ValueType inX(const Stencil& S)
+
524  {
+
525  return difference( S.template getValue< 1, 0, 0>(), S.template getValue<-1, 0, 0>());
+
526  }
+
527 
+
528  template<typename Stencil>
+
529  static typename Stencil::ValueType inY(const Stencil& S)
+
530  {
+
531  return difference( S.template getValue< 0, 1, 0>(), S.template getValue< 0,-1, 0>());
+
532  }
+
533 
+
534  template<typename Stencil>
+
535  static typename Stencil::ValueType inZ(const Stencil& S)
+
536  {
+
537  return difference( S.template getValue< 0, 0, 1>(), S.template getValue< 0, 0,-1>());
+
538  }
+
539 };
+
540 
+
541 template<>
+
542 struct D1<CD_2ND>
+
543 {
+
544 
+
545  // the difference opperator
+
546  template <typename ValueType>
+
547  static ValueType difference(const ValueType& xp1, const ValueType& xm1) {
+
548  return (xp1 - xm1)*ValueType(0.5);
+
549  }
+
550 
+
551 
+
552  // random access
+
553  template<typename Accessor>
+
554  static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk)
+
555  {
+
556  return difference(
+
557  grid.getValue(ijk.offsetBy(1, 0, 0)),
+
558  grid.getValue(ijk.offsetBy(-1, 0, 0)));
+
559  }
+
560 
+
561  template<typename Accessor>
+
562  static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk)
+
563  {
+
564  return difference(
+
565  grid.getValue(ijk.offsetBy(0, 1, 0)),
+
566  grid.getValue(ijk.offsetBy( 0, -1, 0)));
+
567  }
+
568 
+
569  template<typename Accessor>
+
570  static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk)
+
571  {
+
572  return difference(
+
573  grid.getValue(ijk.offsetBy(0, 0, 1)),
+
574  grid.getValue(ijk.offsetBy( 0, 0, -1)));
+
575  }
+
576 
+
577 
+
578  // stencil access version
+
579  template<typename Stencil>
+
580  static typename Stencil::ValueType inX(const Stencil& S)
+
581  {
+
582  return difference(S.template getValue< 1, 0, 0>(), S.template getValue<-1, 0, 0>());
+
583  }
+
584  template<typename Stencil>
+
585  static typename Stencil::ValueType inY(const Stencil& S)
+
586  {
+
587  return difference(S.template getValue< 0, 1, 0>(), S.template getValue< 0,-1, 0>());
+
588  }
+
589 
+
590  template<typename Stencil>
+
591  static typename Stencil::ValueType inZ(const Stencil& S)
+
592  {
+
593  return difference(S.template getValue< 0, 0, 1>(), S.template getValue< 0, 0,-1>());
+
594  }
+
595 
+
596 };
+
597 
+
598 template<>
+
599 struct D1<CD_4TH>
+
600 {
+
601 
+
602  // the difference opperator
+
603  template <typename ValueType>
+
604  static ValueType difference( const ValueType& xp2, const ValueType& xp1,
+
605  const ValueType& xm1, const ValueType& xm2 ) {
+
606  return ValueType(2./3.)*(xp1 - xm1) + ValueType(1./12.)*(xm2 - xp2) ;
+
607  }
+
608 
+
609 
+
610  // random access version
+
611  template<typename Accessor>
+
612  static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk)
+
613  {
+
614  return difference(
+
615  grid.getValue(ijk.offsetBy( 2,0,0)), grid.getValue(ijk.offsetBy( 1,0,0)),
+
616  grid.getValue(ijk.offsetBy(-1,0,0)), grid.getValue(ijk.offsetBy(-2,0,0)) );
+
617  }
+
618 
+
619  template<typename Accessor>
+
620  static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk)
+
621  {
+
622 
+
623  return difference(
+
624  grid.getValue(ijk.offsetBy( 0, 2, 0)), grid.getValue(ijk.offsetBy( 0, 1, 0)),
+
625  grid.getValue(ijk.offsetBy( 0,-1, 0)), grid.getValue(ijk.offsetBy( 0,-2, 0)) );
+
626  }
+
627 
+
628  template<typename Accessor>
+
629  static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk)
+
630  {
+
631 
+
632  return difference(
+
633  grid.getValue(ijk.offsetBy( 0, 0, 2)), grid.getValue(ijk.offsetBy( 0, 0, 1)),
+
634  grid.getValue(ijk.offsetBy( 0, 0,-1)), grid.getValue(ijk.offsetBy( 0, 0,-2)) );
+
635  }
+
636 
+
637 
+
638  // stencil access version
+
639  template<typename Stencil>
+
640  static typename Stencil::ValueType inX(const Stencil& S)
+
641  {
+
642  return difference( S.template getValue< 2, 0, 0>(),
+
643  S.template getValue< 1, 0, 0>(),
+
644  S.template getValue<-1, 0, 0>(),
+
645  S.template getValue<-2, 0, 0>() );
+
646  }
+
647 
+
648  template<typename Stencil>
+
649  static typename Stencil::ValueType inY(const Stencil& S)
+
650  {
+
651  return difference( S.template getValue< 0, 2, 0>(),
+
652  S.template getValue< 0, 1, 0>(),
+
653  S.template getValue< 0,-1, 0>(),
+
654  S.template getValue< 0,-2, 0>() );
+
655  }
+
656 
+
657  template<typename Stencil>
+
658  static typename Stencil::ValueType inZ(const Stencil& S)
+
659  {
+
660  return difference( S.template getValue< 0, 0, 2>(),
+
661  S.template getValue< 0, 0, 1>(),
+
662  S.template getValue< 0, 0,-1>(),
+
663  S.template getValue< 0, 0,-2>() );
+
664  }
+
665 };
+
666 
+
667 template<>
+
668 struct D1<CD_6TH>
+
669 {
+
670 
+
671  // the difference opperator
+
672  template <typename ValueType>
+
673  static ValueType difference( const ValueType& xp3, const ValueType& xp2, const ValueType& xp1,
+
674  const ValueType& xm1, const ValueType& xm2, const ValueType& xm3 )
+
675  {
+
676  return ValueType(3./4.)*(xp1 - xm1) - ValueType(0.15)*(xp2 - xm2)
+
677  + ValueType(1./60.)*(xp3-xm3);
+
678  }
+
679 
+
680 
+
681  // random access version
+
682  template<typename Accessor>
+
683  static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk)
+
684  {
+
685  return difference(
+
686  grid.getValue(ijk.offsetBy( 3,0,0)), grid.getValue(ijk.offsetBy( 2,0,0)),
+
687  grid.getValue(ijk.offsetBy( 1,0,0)), grid.getValue(ijk.offsetBy(-1,0,0)),
+
688  grid.getValue(ijk.offsetBy(-2,0,0)), grid.getValue(ijk.offsetBy(-3,0,0)));
+
689  }
+
690 
+
691  template<typename Accessor>
+
692  static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk)
+
693  {
+
694  return difference(
+
695  grid.getValue(ijk.offsetBy( 0, 3, 0)), grid.getValue(ijk.offsetBy( 0, 2, 0)),
+
696  grid.getValue(ijk.offsetBy( 0, 1, 0)), grid.getValue(ijk.offsetBy( 0,-1, 0)),
+
697  grid.getValue(ijk.offsetBy( 0,-2, 0)), grid.getValue(ijk.offsetBy( 0,-3, 0)));
+
698  }
+
699 
+
700  template<typename Accessor>
+
701  static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk)
+
702  {
+
703  return difference(
+
704  grid.getValue(ijk.offsetBy( 0, 0, 3)), grid.getValue(ijk.offsetBy( 0, 0, 2)),
+
705  grid.getValue(ijk.offsetBy( 0, 0, 1)), grid.getValue(ijk.offsetBy( 0, 0,-1)),
+
706  grid.getValue(ijk.offsetBy( 0, 0,-2)), grid.getValue(ijk.offsetBy( 0, 0,-3)));
+
707  }
+
708 
+
709  // stencil access version
+
710  template<typename Stencil>
+
711  static typename Stencil::ValueType inX(const Stencil& S)
+
712  {
+
713  return difference(S.template getValue< 3, 0, 0>(),
+
714  S.template getValue< 2, 0, 0>(),
+
715  S.template getValue< 1, 0, 0>(),
+
716  S.template getValue<-1, 0, 0>(),
+
717  S.template getValue<-2, 0, 0>(),
+
718  S.template getValue<-3, 0, 0>());
+
719  }
+
720 
+
721  template<typename Stencil>
+
722  static typename Stencil::ValueType inY(const Stencil& S)
+
723  {
+
724 
+
725  return difference( S.template getValue< 0, 3, 0>(),
+
726  S.template getValue< 0, 2, 0>(),
+
727  S.template getValue< 0, 1, 0>(),
+
728  S.template getValue< 0,-1, 0>(),
+
729  S.template getValue< 0,-2, 0>(),
+
730  S.template getValue< 0,-3, 0>());
+
731  }
+
732 
+
733  template<typename Stencil>
+
734  static typename Stencil::ValueType inZ(const Stencil& S)
+
735  {
+
736 
+
737  return difference( S.template getValue< 0, 0, 3>(),
+
738  S.template getValue< 0, 0, 2>(),
+
739  S.template getValue< 0, 0, 1>(),
+
740  S.template getValue< 0, 0,-1>(),
+
741  S.template getValue< 0, 0,-2>(),
+
742  S.template getValue< 0, 0,-3>());
+
743  }
+
744 };
+
745 
+
746 
+
747 template<>
+
748 struct D1<FD_1ST>
+
749 {
+
750 
+
751  // the difference opperator
+
752  template <typename ValueType>
+
753  static ValueType difference(const ValueType& xp1, const ValueType& xp0) {
+
754  return xp1 - xp0;
+
755  }
+
756 
+
757 
+
758  // random access version
+
759  template<typename Accessor>
+
760  static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk)
+
761  {
+
762  return difference(grid.getValue(ijk.offsetBy(1, 0, 0)), grid.getValue(ijk));
+
763  }
+
764 
+
765  template<typename Accessor>
+
766  static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk)
+
767  {
+
768  return difference(grid.getValue(ijk.offsetBy(0, 1, 0)), grid.getValue(ijk));
+
769  }
+
770 
+
771  template<typename Accessor>
+
772  static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk)
+
773  {
+
774  return difference(grid.getValue(ijk.offsetBy(0, 0, 1)), grid.getValue(ijk));
+
775  }
+
776 
+
777  // stencil access version
+
778  template<typename Stencil>
+
779  static typename Stencil::ValueType inX(const Stencil& S)
+
780  {
+
781  return difference(S.template getValue< 1, 0, 0>(), S.template getValue< 0, 0, 0>());
+
782  }
+
783 
+
784  template<typename Stencil>
+
785  static typename Stencil::ValueType inY(const Stencil& S)
+
786  {
+
787  return difference(S.template getValue< 0, 1, 0>(), S.template getValue< 0, 0, 0>());
+
788  }
+
789 
+
790  template<typename Stencil>
+
791  static typename Stencil::ValueType inZ(const Stencil& S)
+
792  {
+
793  return difference(S.template getValue< 0, 0, 1>(), S.template getValue< 0, 0, 0>());
+
794  }
+
795 };
+
796 
+
797 
+
798 template<>
+
799 struct D1<FD_2ND>
+
800 {
+
801  // the difference opperator
+
802  template <typename ValueType>
+
803  static ValueType difference(const ValueType& xp2, const ValueType& xp1, const ValueType& xp0)
+
804  {
+
805  return ValueType(2)*xp1 -(ValueType(0.5)*xp2 + ValueType(3./2.)*xp0);
+
806  }
+
807 
+
808 
+
809  // random access version
+
810  template<typename Accessor>
+
811  static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk)
+
812  {
+
813  return difference(
+
814  grid.getValue(ijk.offsetBy(2,0,0)),
+
815  grid.getValue(ijk.offsetBy(1,0,0)),
+
816  grid.getValue(ijk));
+
817  }
+
818 
+
819  template<typename Accessor>
+
820  static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk)
+
821  {
+
822  return difference(
+
823  grid.getValue(ijk.offsetBy(0,2,0)),
+
824  grid.getValue(ijk.offsetBy(0,1,0)),
+
825  grid.getValue(ijk));
+
826  }
+
827 
+
828  template<typename Accessor>
+
829  static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk)
+
830  {
+
831  return difference(
+
832  grid.getValue(ijk.offsetBy(0,0,2)),
+
833  grid.getValue(ijk.offsetBy(0,0,1)),
+
834  grid.getValue(ijk));
+
835  }
+
836 
+
837 
+
838  // stencil access version
+
839  template<typename Stencil>
+
840  static typename Stencil::ValueType inX(const Stencil& S)
+
841  {
+
842  return difference( S.template getValue< 2, 0, 0>(),
+
843  S.template getValue< 1, 0, 0>(),
+
844  S.template getValue< 0, 0, 0>() );
+
845  }
+
846 
+
847  template<typename Stencil>
+
848  static typename Stencil::ValueType inY(const Stencil& S)
+
849  {
+
850  return difference( S.template getValue< 0, 2, 0>(),
+
851  S.template getValue< 0, 1, 0>(),
+
852  S.template getValue< 0, 0, 0>() );
+
853  }
+
854 
+
855  template<typename Stencil>
+
856  static typename Stencil::ValueType inZ(const Stencil& S)
+
857  {
+
858  return difference( S.template getValue< 0, 0, 2>(),
+
859  S.template getValue< 0, 0, 1>(),
+
860  S.template getValue< 0, 0, 0>() );
+
861  }
+
862 
+
863 };
+
864 
+
865 
+
866 template<>
+
867 struct D1<FD_3RD>
+
868 {
+
869 
+
870  // the difference opperator
+
871  template<typename ValueType>
+
872  static ValueType difference(const ValueType& xp3, const ValueType& xp2,
+
873  const ValueType& xp1, const ValueType& xp0)
+
874  {
+
875  return static_cast<ValueType>(xp3/3.0 - 1.5*xp2 + 3.0*xp1 - 11.0*xp0/6.0);
+
876  }
+
877 
+
878 
+
879  // random access version
+
880  template<typename Accessor>
+
881  static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk)
+
882  {
+
883  return difference( grid.getValue(ijk.offsetBy(3,0,0)),
+
884  grid.getValue(ijk.offsetBy(2,0,0)),
+
885  grid.getValue(ijk.offsetBy(1,0,0)),
+
886  grid.getValue(ijk) );
+
887  }
+
888 
+
889  template<typename Accessor>
+
890  static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk)
+
891  {
+
892  return difference( grid.getValue(ijk.offsetBy(0,3,0)),
+
893  grid.getValue(ijk.offsetBy(0,2,0)),
+
894  grid.getValue(ijk.offsetBy(0,1,0)),
+
895  grid.getValue(ijk) );
+
896  }
+
897 
+
898  template<typename Accessor>
+
899  static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk)
+
900  {
+
901  return difference( grid.getValue(ijk.offsetBy(0,0,3)),
+
902  grid.getValue(ijk.offsetBy(0,0,2)),
+
903  grid.getValue(ijk.offsetBy(0,0,1)),
+
904  grid.getValue(ijk) );
+
905  }
+
906 
+
907 
+
908  // stencil access version
+
909  template<typename Stencil>
+
910  static typename Stencil::ValueType inX(const Stencil& S)
+
911  {
+
912  return difference(S.template getValue< 3, 0, 0>(),
+
913  S.template getValue< 2, 0, 0>(),
+
914  S.template getValue< 1, 0, 0>(),
+
915  S.template getValue< 0, 0, 0>() );
+
916  }
+
917 
+
918  template<typename Stencil>
+
919  static typename Stencil::ValueType inY(const Stencil& S)
+
920  {
+
921  return difference(S.template getValue< 0, 3, 0>(),
+
922  S.template getValue< 0, 2, 0>(),
+
923  S.template getValue< 0, 1, 0>(),
+
924  S.template getValue< 0, 0, 0>() );
+
925  }
+
926 
+
927  template<typename Stencil>
+
928  static typename Stencil::ValueType inZ(const Stencil& S)
+
929  {
+
930  return difference( S.template getValue< 0, 0, 3>(),
+
931  S.template getValue< 0, 0, 2>(),
+
932  S.template getValue< 0, 0, 1>(),
+
933  S.template getValue< 0, 0, 0>() );
+
934  }
+
935 };
+
936 
+
937 
+
938 template<>
+
939 struct D1<BD_1ST>
+
940 {
+
941 
+
942  // the difference opperator
+
943  template <typename ValueType>
+
944  static ValueType difference(const ValueType& xm1, const ValueType& xm0) {
+
945  return -D1<FD_1ST>::difference(xm1, xm0);
+
946  }
+
947 
+
948 
+
949  // random access version
+
950  template<typename Accessor>
+
951  static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk)
+
952  {
+
953  return difference(grid.getValue(ijk.offsetBy(-1,0,0)), grid.getValue(ijk));
+
954  }
+
955 
+
956  template<typename Accessor>
+
957  static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk)
+
958  {
+
959  return difference(grid.getValue(ijk.offsetBy(0,-1,0)), grid.getValue(ijk));
+
960  }
+
961 
+
962  template<typename Accessor>
+
963  static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk)
+
964  {
+
965  return difference(grid.getValue(ijk.offsetBy(0, 0,-1)), grid.getValue(ijk));
+
966  }
+
967 
+
968 
+
969  // stencil access version
+
970  template<typename Stencil>
+
971  static typename Stencil::ValueType inX(const Stencil& S)
+
972  {
+
973  return difference(S.template getValue<-1, 0, 0>(), S.template getValue< 0, 0, 0>());
+
974  }
+
975 
+
976  template<typename Stencil>
+
977  static typename Stencil::ValueType inY(const Stencil& S)
+
978  {
+
979  return difference(S.template getValue< 0,-1, 0>(), S.template getValue< 0, 0, 0>());
+
980  }
+
981 
+
982  template<typename Stencil>
+
983  static typename Stencil::ValueType inZ(const Stencil& S)
+
984  {
+
985  return difference(S.template getValue< 0, 0,-1>(), S.template getValue< 0, 0, 0>());
+
986  }
+
987 };
+
988 
+
989 
+
990 template<>
+
991 struct D1<BD_2ND>
+
992 {
+
993 
+
994  // the difference opperator
+
995  template <typename ValueType>
+
996  static ValueType difference(const ValueType& xm2, const ValueType& xm1, const ValueType& xm0)
+
997  {
+
998  return -D1<FD_2ND>::difference(xm2, xm1, xm0);
+
999  }
+
1000 
+
1001 
+
1002  // random access version
+
1003  template<typename Accessor>
+
1004  static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk)
+
1005  {
+
1006  return difference( grid.getValue(ijk.offsetBy(-2,0,0)),
+
1007  grid.getValue(ijk.offsetBy(-1,0,0)),
+
1008  grid.getValue(ijk) );
+
1009  }
+
1010 
+
1011  template<typename Accessor>
+
1012  static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk)
+
1013  {
+
1014  return difference( grid.getValue(ijk.offsetBy(0,-2,0)),
+
1015  grid.getValue(ijk.offsetBy(0,-1,0)),
+
1016  grid.getValue(ijk) );
+
1017  }
+
1018 
+
1019  template<typename Accessor>
+
1020  static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk)
+
1021  {
+
1022  return difference( grid.getValue(ijk.offsetBy(0,0,-2)),
+
1023  grid.getValue(ijk.offsetBy(0,0,-1)),
+
1024  grid.getValue(ijk) );
+
1025  }
+
1026 
+
1027  // stencil access version
+
1028  template<typename Stencil>
+
1029  static typename Stencil::ValueType inX(const Stencil& S)
+
1030  {
+
1031  return difference( S.template getValue<-2, 0, 0>(),
+
1032  S.template getValue<-1, 0, 0>(),
+
1033  S.template getValue< 0, 0, 0>() );
+
1034  }
+
1035 
+
1036  template<typename Stencil>
+
1037  static typename Stencil::ValueType inY(const Stencil& S)
+
1038  {
+
1039  return difference( S.template getValue< 0,-2, 0>(),
+
1040  S.template getValue< 0,-1, 0>(),
+
1041  S.template getValue< 0, 0, 0>() );
+
1042  }
+
1043 
+
1044  template<typename Stencil>
+
1045  static typename Stencil::ValueType inZ(const Stencil& S)
+
1046  {
+
1047  return difference( S.template getValue< 0, 0,-2>(),
+
1048  S.template getValue< 0, 0,-1>(),
+
1049  S.template getValue< 0, 0, 0>() );
+
1050  }
+
1051 };
+
1052 
+
1053 
+
1054 template<>
+
1055 struct D1<BD_3RD>
+
1056 {
+
1057 
+
1058  // the difference opperator
+
1059  template <typename ValueType>
+
1060  static ValueType difference(const ValueType& xm3, const ValueType& xm2,
+
1061  const ValueType& xm1, const ValueType& xm0)
+
1062  {
+
1063  return -D1<FD_3RD>::difference(xm3, xm2, xm1, xm0);
+
1064  }
+
1065 
+
1066  // random access version
+
1067  template<typename Accessor>
+
1068  static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk)
+
1069  {
+
1070  return difference( grid.getValue(ijk.offsetBy(-3,0,0)),
+
1071  grid.getValue(ijk.offsetBy(-2,0,0)),
+
1072  grid.getValue(ijk.offsetBy(-1,0,0)),
+
1073  grid.getValue(ijk) );
+
1074  }
+
1075 
+
1076  template<typename Accessor>
+
1077  static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk)
+
1078  {
+
1079  return difference( grid.getValue(ijk.offsetBy( 0,-3,0)),
+
1080  grid.getValue(ijk.offsetBy( 0,-2,0)),
+
1081  grid.getValue(ijk.offsetBy( 0,-1,0)),
+
1082  grid.getValue(ijk) );
+
1083  }
+
1084 
+
1085  template<typename Accessor>
+
1086  static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk)
+
1087  {
+
1088  return difference( grid.getValue(ijk.offsetBy( 0, 0,-3)),
+
1089  grid.getValue(ijk.offsetBy( 0, 0,-2)),
+
1090  grid.getValue(ijk.offsetBy( 0, 0,-1)),
+
1091  grid.getValue(ijk) );
+
1092  }
+
1093 
+
1094  // stencil access version
+
1095  template<typename Stencil>
+
1096  static typename Stencil::ValueType inX(const Stencil& S)
+
1097  {
+
1098  return difference( S.template getValue<-3, 0, 0>(),
+
1099  S.template getValue<-2, 0, 0>(),
+
1100  S.template getValue<-1, 0, 0>(),
+
1101  S.template getValue< 0, 0, 0>() );
+
1102  }
+
1103 
+
1104  template<typename Stencil>
+
1105  static typename Stencil::ValueType inY(const Stencil& S)
+
1106  {
+
1107  return difference( S.template getValue< 0,-3, 0>(),
+
1108  S.template getValue< 0,-2, 0>(),
+
1109  S.template getValue< 0,-1, 0>(),
+
1110  S.template getValue< 0, 0, 0>() );
+
1111  }
+
1112 
+
1113  template<typename Stencil>
+
1114  static typename Stencil::ValueType inZ(const Stencil& S)
+
1115  {
+
1116  return difference( S.template getValue< 0, 0,-3>(),
+
1117  S.template getValue< 0, 0,-2>(),
+
1118  S.template getValue< 0, 0,-1>(),
+
1119  S.template getValue< 0, 0, 0>() );
+
1120  }
+
1121 
+
1122 };
+
1123 
+
1124 template<>
+
1125 struct D1<FD_WENO5>
+
1126 {
+
1127  // the difference operator
+
1128  template <typename ValueType>
+
1129  static ValueType difference(const ValueType& xp3, const ValueType& xp2,
+
1130  const ValueType& xp1, const ValueType& xp0,
+
1131  const ValueType& xm1, const ValueType& xm2) {
+
1132  return WENO5<ValueType>(xp3, xp2, xp1, xp0, xm1)
+
1133  - WENO5<ValueType>(xp2, xp1, xp0, xm1, xm2);
+
1134  }
+
1135 
+
1136 
+
1137  // random access version
+
1138  template<typename Accessor>
+
1139  static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk)
+
1140  {
+
1141  typedef typename Accessor::ValueType ValueType;
+
1142  ValueType V[6];
+
1143  V[0] = grid.getValue(ijk.offsetBy(3,0,0));
+
1144  V[1] = grid.getValue(ijk.offsetBy(2,0,0));
+
1145  V[2] = grid.getValue(ijk.offsetBy(1,0,0));
+
1146  V[3] = grid.getValue(ijk);
+
1147  V[4] = grid.getValue(ijk.offsetBy(-1,0,0));
+
1148  V[5] = grid.getValue(ijk.offsetBy(-2,0,0));
+
1149 
+
1150  return difference(V[0], V[1], V[2], V[3], V[4], V[5]);
+
1151  }
+
1152 
+
1153  template<typename Accessor>
+
1154  static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk)
+
1155  {
+
1156  typedef typename Accessor::ValueType ValueType;
+
1157  ValueType V[6];
+
1158  V[0] = grid.getValue(ijk.offsetBy(0,3,0));
+
1159  V[1] = grid.getValue(ijk.offsetBy(0,2,0));
+
1160  V[2] = grid.getValue(ijk.offsetBy(0,1,0));
+
1161  V[3] = grid.getValue(ijk);
+
1162  V[4] = grid.getValue(ijk.offsetBy(0,-1,0));
+
1163  V[5] = grid.getValue(ijk.offsetBy(0,-2,0));
+
1164 
+
1165  return difference(V[0], V[1], V[2], V[3], V[4], V[5]);
+
1166  }
+
1167 
+
1168  template<typename Accessor>
+
1169  static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk)
+
1170  {
+
1171  typedef typename Accessor::ValueType ValueType;
+
1172  ValueType V[6];
+
1173  V[0] = grid.getValue(ijk.offsetBy(0,0,3));
+
1174  V[1] = grid.getValue(ijk.offsetBy(0,0,2));
+
1175  V[2] = grid.getValue(ijk.offsetBy(0,0,1));
+
1176  V[3] = grid.getValue(ijk);
+
1177  V[4] = grid.getValue(ijk.offsetBy(0,0,-1));
+
1178  V[5] = grid.getValue(ijk.offsetBy(0,0,-2));
+
1179 
+
1180  return difference(V[0], V[1], V[2], V[3], V[4], V[5]);
+
1181  }
+
1182 
+
1183  // stencil access version
+
1184  template<typename Stencil>
+
1185  static typename Stencil::ValueType inX(const Stencil& S)
+
1186  {
+
1187 
+
1188  return static_cast<typename Stencil::ValueType>(difference(
+
1189  S.template getValue< 3, 0, 0>(),
+
1190  S.template getValue< 2, 0, 0>(),
+
1191  S.template getValue< 1, 0, 0>(),
+
1192  S.template getValue< 0, 0, 0>(),
+
1193  S.template getValue<-1, 0, 0>(),
+
1194  S.template getValue<-2, 0, 0>() ));
+
1195 
+
1196  }
+
1197 
+
1198  template<typename Stencil>
+
1199  static typename Stencil::ValueType inY(const Stencil& S)
+
1200  {
+
1201  return static_cast<typename Stencil::ValueType>(difference(
+
1202  S.template getValue< 0, 3, 0>(),
+
1203  S.template getValue< 0, 2, 0>(),
+
1204  S.template getValue< 0, 1, 0>(),
+
1205  S.template getValue< 0, 0, 0>(),
+
1206  S.template getValue< 0,-1, 0>(),
+
1207  S.template getValue< 0,-2, 0>() ));
+
1208  }
+
1209 
+
1210  template<typename Stencil>
+
1211  static typename Stencil::ValueType inZ(const Stencil& S)
+
1212  {
+
1213  return static_cast<typename Stencil::ValueType>(difference(
+
1214  S.template getValue< 0, 0, 3>(),
+
1215  S.template getValue< 0, 0, 2>(),
+
1216  S.template getValue< 0, 0, 1>(),
+
1217  S.template getValue< 0, 0, 0>(),
+
1218  S.template getValue< 0, 0,-1>(),
+
1219  S.template getValue< 0, 0,-2>() ));
+
1220  }
+
1221 };
+
1222 
+
1223 template<>
+ +
1225 {
+
1226 
+
1227  // the difference opperator
+
1228  template <typename ValueType>
+
1229  static ValueType difference(const ValueType& xp3, const ValueType& xp2,
+
1230  const ValueType& xp1, const ValueType& xp0,
+
1231  const ValueType& xm1, const ValueType& xm2) {
+
1232  return WENO5<ValueType>(xp3 - xp2, xp2 - xp1, xp1 - xp0, xp0-xm1, xm1-xm2);
+
1233  }
+
1234 
+
1235  // random access version
+
1236  template<typename Accessor>
+
1237  static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk)
+
1238  {
+
1239  typedef typename Accessor::ValueType ValueType;
+
1240  ValueType V[6];
+
1241  V[0] = grid.getValue(ijk.offsetBy(3,0,0));
+
1242  V[1] = grid.getValue(ijk.offsetBy(2,0,0));
+
1243  V[2] = grid.getValue(ijk.offsetBy(1,0,0));
+
1244  V[3] = grid.getValue(ijk);
+
1245  V[4] = grid.getValue(ijk.offsetBy(-1,0,0));
+
1246  V[5] = grid.getValue(ijk.offsetBy(-2,0,0));
+
1247 
+
1248  return difference(V[0], V[1], V[2], V[3], V[4], V[5]);
+
1249 
+
1250  }
+
1251 
+
1252  template<typename Accessor>
+
1253  static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk)
+
1254  {
+
1255  typedef typename Accessor::ValueType ValueType;
+
1256  ValueType V[6];
+
1257  V[0] = grid.getValue(ijk.offsetBy(0,3,0));
+
1258  V[1] = grid.getValue(ijk.offsetBy(0,2,0));
+
1259  V[2] = grid.getValue(ijk.offsetBy(0,1,0));
+
1260  V[3] = grid.getValue(ijk);
+
1261  V[4] = grid.getValue(ijk.offsetBy(0,-1,0));
+
1262  V[5] = grid.getValue(ijk.offsetBy(0,-2,0));
+
1263 
+
1264  return difference(V[0], V[1], V[2], V[3], V[4], V[5]);
+
1265  }
+
1266 
+
1267  template<typename Accessor>
+
1268  static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk)
+
1269  {
+
1270  typedef typename Accessor::ValueType ValueType;
+
1271  ValueType V[6];
+
1272  V[0] = grid.getValue(ijk.offsetBy(0,0,3));
+
1273  V[1] = grid.getValue(ijk.offsetBy(0,0,2));
+
1274  V[2] = grid.getValue(ijk.offsetBy(0,0,1));
+
1275  V[3] = grid.getValue(ijk);
+
1276  V[4] = grid.getValue(ijk.offsetBy(0,0,-1));
+
1277  V[5] = grid.getValue(ijk.offsetBy(0,0,-2));
+
1278 
+
1279  return difference(V[0], V[1], V[2], V[3], V[4], V[5]);
+
1280  }
+
1281 
+
1282  // stencil access version
+
1283  template<typename Stencil>
+
1284  static typename Stencil::ValueType inX(const Stencil& S)
+
1285  {
+
1286 
+
1287  return difference( S.template getValue< 3, 0, 0>(),
+
1288  S.template getValue< 2, 0, 0>(),
+
1289  S.template getValue< 1, 0, 0>(),
+
1290  S.template getValue< 0, 0, 0>(),
+
1291  S.template getValue<-1, 0, 0>(),
+
1292  S.template getValue<-2, 0, 0>() );
+
1293 
+
1294  }
+
1295 
+
1296  template<typename Stencil>
+
1297  static typename Stencil::ValueType inY(const Stencil& S)
+
1298  {
+
1299  return difference( S.template getValue< 0, 3, 0>(),
+
1300  S.template getValue< 0, 2, 0>(),
+
1301  S.template getValue< 0, 1, 0>(),
+
1302  S.template getValue< 0, 0, 0>(),
+
1303  S.template getValue< 0,-1, 0>(),
+
1304  S.template getValue< 0,-2, 0>() );
+
1305  }
+
1306 
+
1307  template<typename Stencil>
+
1308  static typename Stencil::ValueType inZ(const Stencil& S)
+
1309  {
+
1310 
+
1311  return difference( S.template getValue< 0, 0, 3>(),
+
1312  S.template getValue< 0, 0, 2>(),
+
1313  S.template getValue< 0, 0, 1>(),
+
1314  S.template getValue< 0, 0, 0>(),
+
1315  S.template getValue< 0, 0,-1>(),
+
1316  S.template getValue< 0, 0,-2>() );
+
1317  }
+
1318 
+
1319 };
+
1320 
+
1321 template<>
+
1322 struct D1<BD_WENO5>
+
1323 {
+
1324 
+
1325  template<typename ValueType>
+
1326  static ValueType difference(const ValueType& xm3, const ValueType& xm2, const ValueType& xm1,
+
1327  const ValueType& xm0, const ValueType& xp1, const ValueType& xp2)
+
1328  {
+
1329  return -D1<FD_WENO5>::difference(xm3, xm2, xm1, xm0, xp1, xp2);
+
1330  }
+
1331 
+
1332 
+
1333  // random access version
+
1334  template<typename Accessor>
+
1335  static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk)
+
1336  {
+
1337  typedef typename Accessor::ValueType ValueType;
+
1338  ValueType V[6];
+
1339  V[0] = grid.getValue(ijk.offsetBy(-3,0,0));
+
1340  V[1] = grid.getValue(ijk.offsetBy(-2,0,0));
+
1341  V[2] = grid.getValue(ijk.offsetBy(-1,0,0));
+
1342  V[3] = grid.getValue(ijk);
+
1343  V[4] = grid.getValue(ijk.offsetBy(1,0,0));
+
1344  V[5] = grid.getValue(ijk.offsetBy(2,0,0));
+
1345 
+
1346  return difference(V[0], V[1], V[2], V[3], V[4], V[5]);
+
1347  }
+
1348 
+
1349  template<typename Accessor>
+
1350  static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk)
+
1351  {
+
1352  typedef typename Accessor::ValueType ValueType;
+
1353  ValueType V[6];
+
1354  V[0] = grid.getValue(ijk.offsetBy(0,-3,0));
+
1355  V[1] = grid.getValue(ijk.offsetBy(0,-2,0));
+
1356  V[2] = grid.getValue(ijk.offsetBy(0,-1,0));
+
1357  V[3] = grid.getValue(ijk);
+
1358  V[4] = grid.getValue(ijk.offsetBy(0,1,0));
+
1359  V[5] = grid.getValue(ijk.offsetBy(0,2,0));
+
1360 
+
1361  return difference(V[0], V[1], V[2], V[3], V[4], V[5]);
+
1362  }
+
1363 
+
1364  template<typename Accessor>
+
1365  static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk)
+
1366  {
+
1367  typedef typename Accessor::ValueType ValueType;
+
1368  ValueType V[6];
+
1369  V[0] = grid.getValue(ijk.offsetBy(0,0,-3));
+
1370  V[1] = grid.getValue(ijk.offsetBy(0,0,-2));
+
1371  V[2] = grid.getValue(ijk.offsetBy(0,0,-1));
+
1372  V[3] = grid.getValue(ijk);
+
1373  V[4] = grid.getValue(ijk.offsetBy(0,0,1));
+
1374  V[5] = grid.getValue(ijk.offsetBy(0,0,2));
+
1375 
+
1376  return difference(V[0], V[1], V[2], V[3], V[4], V[5]);
+
1377  }
+
1378 
+
1379  // stencil access version
+
1380  template<typename Stencil>
+
1381  static typename Stencil::ValueType inX(const Stencil& S)
+
1382  {
+
1383  typedef typename Stencil::ValueType ValueType;
+
1384  ValueType V[6];
+
1385  V[0] = S.template getValue<-3, 0, 0>();
+
1386  V[1] = S.template getValue<-2, 0, 0>();
+
1387  V[2] = S.template getValue<-1, 0, 0>();
+
1388  V[3] = S.template getValue< 0, 0, 0>();
+
1389  V[4] = S.template getValue< 1, 0, 0>();
+
1390  V[5] = S.template getValue< 2, 0, 0>();
+
1391 
+
1392  return difference(V[0], V[1], V[2], V[3], V[4], V[5]);
+
1393  }
+
1394 
+
1395  template<typename Stencil>
+
1396  static typename Stencil::ValueType inY(const Stencil& S)
+
1397  {
+
1398  typedef typename Stencil::ValueType ValueType;
+
1399  ValueType V[6];
+
1400  V[0] = S.template getValue< 0,-3, 0>();
+
1401  V[1] = S.template getValue< 0,-2, 0>();
+
1402  V[2] = S.template getValue< 0,-1, 0>();
+
1403  V[3] = S.template getValue< 0, 0, 0>();
+
1404  V[4] = S.template getValue< 0, 1, 0>();
+
1405  V[5] = S.template getValue< 0, 2, 0>();
+
1406 
+
1407  return difference(V[0], V[1], V[2], V[3], V[4], V[5]);
+
1408  }
+
1409 
+
1410  template<typename Stencil>
+
1411  static typename Stencil::ValueType inZ(const Stencil& S)
+
1412  {
+
1413  typedef typename Stencil::ValueType ValueType;
+
1414  ValueType V[6];
+
1415  V[0] = S.template getValue< 0, 0,-3>();
+
1416  V[1] = S.template getValue< 0, 0,-2>();
+
1417  V[2] = S.template getValue< 0, 0,-1>();
+
1418  V[3] = S.template getValue< 0, 0, 0>();
+
1419  V[4] = S.template getValue< 0, 0, 1>();
+
1420  V[5] = S.template getValue< 0, 0, 2>();
+
1421 
+
1422  return difference(V[0], V[1], V[2], V[3], V[4], V[5]);
+
1423  }
+
1424 };
+
1425 
+
1426 
+
1427 template<>
+ +
1429 {
+
1430  template<typename ValueType>
+
1431  static ValueType difference(const ValueType& xm3, const ValueType& xm2, const ValueType& xm1,
+
1432  const ValueType& xm0, const ValueType& xp1, const ValueType& xp2)
+
1433  {
+
1434  return -D1<FD_HJWENO5>::difference(xm3, xm2, xm1, xm0, xp1, xp2);
+
1435  }
+
1436 
+
1437  // random access version
+
1438  template<typename Accessor>
+
1439  static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk)
+
1440  {
+
1441  typedef typename Accessor::ValueType ValueType;
+
1442  ValueType V[6];
+
1443  V[0] = grid.getValue(ijk.offsetBy(-3,0,0));
+
1444  V[1] = grid.getValue(ijk.offsetBy(-2,0,0));
+
1445  V[2] = grid.getValue(ijk.offsetBy(-1,0,0));
+
1446  V[3] = grid.getValue(ijk);
+
1447  V[4] = grid.getValue(ijk.offsetBy(1,0,0));
+
1448  V[5] = grid.getValue(ijk.offsetBy(2,0,0));
+
1449 
+
1450  return difference(V[0], V[1], V[2], V[3], V[4], V[5]);
+
1451  }
+
1452 
+
1453  template<typename Accessor>
+
1454  static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk)
+
1455  {
+
1456  typedef typename Accessor::ValueType ValueType;
+
1457  ValueType V[6];
+
1458  V[0] = grid.getValue(ijk.offsetBy(0,-3,0));
+
1459  V[1] = grid.getValue(ijk.offsetBy(0,-2,0));
+
1460  V[2] = grid.getValue(ijk.offsetBy(0,-1,0));
+
1461  V[3] = grid.getValue(ijk);
+
1462  V[4] = grid.getValue(ijk.offsetBy(0,1,0));
+
1463  V[5] = grid.getValue(ijk.offsetBy(0,2,0));
+
1464 
+
1465  return difference(V[0], V[1], V[2], V[3], V[4], V[5]);
+
1466  }
+
1467 
+
1468  template<typename Accessor>
+
1469  static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk)
+
1470  {
+
1471  typedef typename Accessor::ValueType ValueType;
+
1472  ValueType V[6];
+
1473  V[0] = grid.getValue(ijk.offsetBy(0,0,-3));
+
1474  V[1] = grid.getValue(ijk.offsetBy(0,0,-2));
+
1475  V[2] = grid.getValue(ijk.offsetBy(0,0,-1));
+
1476  V[3] = grid.getValue(ijk);
+
1477  V[4] = grid.getValue(ijk.offsetBy(0,0,1));
+
1478  V[5] = grid.getValue(ijk.offsetBy(0,0,2));
+
1479 
+
1480  return difference(V[0], V[1], V[2], V[3], V[4], V[5]);
+
1481  }
+
1482 
+
1483  // stencil access version
+
1484  template<typename Stencil>
+
1485  static typename Stencil::ValueType inX(const Stencil& S)
+
1486  {
+
1487  typedef typename Stencil::ValueType ValueType;
+
1488  ValueType V[6];
+
1489  V[0] = S.template getValue<-3, 0, 0>();
+
1490  V[1] = S.template getValue<-2, 0, 0>();
+
1491  V[2] = S.template getValue<-1, 0, 0>();
+
1492  V[3] = S.template getValue< 0, 0, 0>();
+
1493  V[4] = S.template getValue< 1, 0, 0>();
+
1494  V[5] = S.template getValue< 2, 0, 0>();
+
1495 
+
1496  return difference(V[0], V[1], V[2], V[3], V[4], V[5]);
+
1497  }
+
1498 
+
1499  template<typename Stencil>
+
1500  static typename Stencil::ValueType inY(const Stencil& S)
+
1501  {
+
1502  typedef typename Stencil::ValueType ValueType;
+
1503  ValueType V[6];
+
1504  V[0] = S.template getValue< 0,-3, 0>();
+
1505  V[1] = S.template getValue< 0,-2, 0>();
+
1506  V[2] = S.template getValue< 0,-1, 0>();
+
1507  V[3] = S.template getValue< 0, 0, 0>();
+
1508  V[4] = S.template getValue< 0, 1, 0>();
+
1509  V[5] = S.template getValue< 0, 2, 0>();
+
1510 
+
1511  return difference(V[0], V[1], V[2], V[3], V[4], V[5]);
+
1512  }
+
1513 
+
1514  template<typename Stencil>
+
1515  static typename Stencil::ValueType inZ(const Stencil& S)
+
1516  {
+
1517  typedef typename Stencil::ValueType ValueType;
+
1518  ValueType V[6];
+
1519  V[0] = S.template getValue< 0, 0,-3>();
+
1520  V[1] = S.template getValue< 0, 0,-2>();
+
1521  V[2] = S.template getValue< 0, 0,-1>();
+
1522  V[3] = S.template getValue< 0, 0, 0>();
+
1523  V[4] = S.template getValue< 0, 0, 1>();
+
1524  V[5] = S.template getValue< 0, 0, 2>();
+
1525 
+
1526  return difference(V[0], V[1], V[2], V[3], V[4], V[5]);
+
1527  }
+
1528 };
+
1529 
+
1530 
+
1531 template<DScheme DiffScheme>
+
1532 struct D1Vec
+
1533 {
+
1534  // random access version
+
1535  template<typename Accessor>
+
1536  static typename Accessor::ValueType::value_type
+
1537  inX(const Accessor& grid, const Coord& ijk, int n)
+
1538  {
+
1539  return D1<DiffScheme>::inX(grid, ijk)[n];
+
1540  }
+
1541 
+
1542  template<typename Accessor>
+
1543  static typename Accessor::ValueType::value_type
+
1544  inY(const Accessor& grid, const Coord& ijk, int n)
+
1545  {
+
1546  return D1<DiffScheme>::inY(grid, ijk)[n];
+
1547  }
+
1548  template<typename Accessor>
+
1549  static typename Accessor::ValueType::value_type
+
1550  inZ(const Accessor& grid, const Coord& ijk, int n)
+
1551  {
+
1552  return D1<DiffScheme>::inZ(grid, ijk)[n];
+
1553  }
+
1554 
+
1555 
+
1556  // stencil access version
+
1557  template<typename Stencil>
+
1558  static typename Stencil::ValueType::value_type inX(const Stencil& S, int n)
+
1559  {
+
1560  return D1<DiffScheme>::inX(S)[n];
+
1561  }
+
1562 
+
1563  template<typename Stencil>
+
1564  static typename Stencil::ValueType::value_type inY(const Stencil& S, int n)
+
1565  {
+
1566  return D1<DiffScheme>::inY(S)[n];
+
1567  }
+
1568 
+
1569  template<typename Stencil>
+
1570  static typename Stencil::ValueType::value_type inZ(const Stencil& S, int n)
+
1571  {
+
1572  return D1<DiffScheme>::inZ(S)[n];
+
1573  }
+
1574 };
+
1575 
+
1576 
+
1577 template<>
+ +
1579 {
+
1580 
+
1581  // random access version
+
1582  template<typename Accessor>
+
1583  static typename Accessor::ValueType::value_type
+
1584  inX(const Accessor& grid, const Coord& ijk, int n)
+
1585  {
+
1586  return D1<CD_2NDT>::difference( grid.getValue(ijk.offsetBy( 1, 0, 0))[n],
+
1587  grid.getValue(ijk.offsetBy(-1, 0, 0))[n] );
+
1588  }
+
1589 
+
1590  template<typename Accessor>
+
1591  static typename Accessor::ValueType::value_type
+
1592  inY(const Accessor& grid, const Coord& ijk, int n)
+
1593  {
+
1594  return D1<CD_2NDT>::difference( grid.getValue(ijk.offsetBy(0, 1, 0))[n],
+
1595  grid.getValue(ijk.offsetBy(0,-1, 0))[n] );
+
1596  }
+
1597 
+
1598  template<typename Accessor>
+
1599  static typename Accessor::ValueType::value_type
+
1600  inZ(const Accessor& grid, const Coord& ijk, int n)
+
1601  {
+
1602  return D1<CD_2NDT>::difference( grid.getValue(ijk.offsetBy(0, 0, 1))[n],
+
1603  grid.getValue(ijk.offsetBy(0, 0,-1))[n] );
+
1604  }
+
1605 
+
1606  // stencil access version
+
1607  template<typename Stencil>
+
1608  static typename Stencil::ValueType::value_type inX(const Stencil& S, int n)
+
1609  {
+
1610  return D1<CD_2NDT>::difference( S.template getValue< 1, 0, 0>()[n],
+
1611  S.template getValue<-1, 0, 0>()[n] );
+
1612  }
+
1613 
+
1614  template<typename Stencil>
+
1615  static typename Stencil::ValueType::value_type inY(const Stencil& S, int n)
+
1616  {
+
1617  return D1<CD_2NDT>::difference( S.template getValue< 0, 1, 0>()[n],
+
1618  S.template getValue< 0,-1, 0>()[n] );
+
1619  }
+
1620 
+
1621  template<typename Stencil>
+
1622  static typename Stencil::ValueType::value_type inZ(const Stencil& S, int n)
+
1623  {
+
1624  return D1<CD_2NDT>::difference( S.template getValue< 0, 0, 1>()[n],
+
1625  S.template getValue< 0, 0,-1>()[n] );
+
1626  }
+
1627 };
+
1628 
+
1629 template<>
+
1630 struct D1Vec<CD_2ND>
+
1631 {
+
1632 
+
1633  // random access version
+
1634  template<typename Accessor>
+
1635  static typename Accessor::ValueType::value_type
+
1636  inX(const Accessor& grid, const Coord& ijk, int n)
+
1637  {
+
1638  return D1<CD_2ND>::difference( grid.getValue(ijk.offsetBy( 1, 0, 0))[n] ,
+
1639  grid.getValue(ijk.offsetBy(-1, 0, 0))[n] );
+
1640  }
+
1641 
+
1642  template<typename Accessor>
+
1643  static typename Accessor::ValueType::value_type
+
1644  inY(const Accessor& grid, const Coord& ijk, int n)
+
1645  {
+
1646  return D1<CD_2ND>::difference( grid.getValue(ijk.offsetBy(0, 1, 0))[n] ,
+
1647  grid.getValue(ijk.offsetBy(0,-1, 0))[n] );
+
1648  }
+
1649 
+
1650  template<typename Accessor>
+
1651  static typename Accessor::ValueType::value_type
+
1652  inZ(const Accessor& grid, const Coord& ijk, int n)
+
1653  {
+
1654  return D1<CD_2ND>::difference( grid.getValue(ijk.offsetBy(0, 0, 1))[n] ,
+
1655  grid.getValue(ijk.offsetBy(0, 0,-1))[n] );
+
1656  }
+
1657 
+
1658 
+
1659  // stencil access version
+
1660  template<typename Stencil>
+
1661  static typename Stencil::ValueType::value_type inX(const Stencil& S, int n)
+
1662  {
+
1663  return D1<CD_2ND>::difference( S.template getValue< 1, 0, 0>()[n],
+
1664  S.template getValue<-1, 0, 0>()[n] );
+
1665  }
+
1666 
+
1667  template<typename Stencil>
+
1668  static typename Stencil::ValueType::value_type inY(const Stencil& S, int n)
+
1669  {
+
1670  return D1<CD_2ND>::difference( S.template getValue< 0, 1, 0>()[n],
+
1671  S.template getValue< 0,-1, 0>()[n] );
+
1672  }
+
1673 
+
1674  template<typename Stencil>
+
1675  static typename Stencil::ValueType::value_type inZ(const Stencil& S, int n)
+
1676  {
+
1677  return D1<CD_2ND>::difference( S.template getValue< 0, 0, 1>()[n],
+
1678  S.template getValue< 0, 0,-1>()[n] );
+
1679  }
+
1680 };
+
1681 
+
1682 
+
1683 template<>
+
1684 struct D1Vec<CD_4TH> {
+
1685  // typedef typename Accessor::ValueType::value_type value_type;
+
1686 
+
1687 
+
1688  // random access version
+
1689  template<typename Accessor>
+
1690  static typename Accessor::ValueType::value_type
+
1691  inX(const Accessor& grid, const Coord& ijk, int n)
+
1692  {
+
1693  return D1<CD_4TH>::difference(
+
1694  grid.getValue(ijk.offsetBy(2, 0, 0))[n], grid.getValue(ijk.offsetBy( 1, 0, 0))[n],
+
1695  grid.getValue(ijk.offsetBy(-1,0, 0))[n], grid.getValue(ijk.offsetBy(-2, 0, 0))[n]);
+
1696  }
+
1697 
+
1698  template<typename Accessor>
+
1699  static typename Accessor::ValueType::value_type
+
1700  inY(const Accessor& grid, const Coord& ijk, int n)
+
1701  {
+
1702  return D1<CD_4TH>::difference(
+
1703  grid.getValue(ijk.offsetBy( 0, 2, 0))[n], grid.getValue(ijk.offsetBy( 0, 1, 0))[n],
+
1704  grid.getValue(ijk.offsetBy( 0,-1, 0))[n], grid.getValue(ijk.offsetBy( 0,-2, 0))[n]);
+
1705  }
+
1706 
+
1707  template<typename Accessor>
+
1708  static typename Accessor::ValueType::value_type
+
1709  inZ(const Accessor& grid, const Coord& ijk, int n)
+
1710  {
+
1711  return D1<CD_4TH>::difference(
+
1712  grid.getValue(ijk.offsetBy(0,0, 2))[n], grid.getValue(ijk.offsetBy( 0, 0, 1))[n],
+
1713  grid.getValue(ijk.offsetBy(0,0,-1))[n], grid.getValue(ijk.offsetBy( 0, 0,-2))[n]);
+
1714  }
+
1715 
+
1716  // stencil access version
+
1717  template<typename Stencil>
+
1718  static typename Stencil::ValueType::value_type inX(const Stencil& S, int n)
+
1719  {
+
1720  return D1<CD_4TH>::difference(
+
1721  S.template getValue< 2, 0, 0>()[n], S.template getValue< 1, 0, 0>()[n],
+
1722  S.template getValue<-1, 0, 0>()[n], S.template getValue<-2, 0, 0>()[n] );
+
1723  }
+
1724 
+
1725  template<typename Stencil>
+
1726  static typename Stencil::ValueType::value_type inY(const Stencil& S, int n)
+
1727  {
+
1728  return D1<CD_4TH>::difference(
+
1729  S.template getValue< 0, 2, 0>()[n], S.template getValue< 0, 1, 0>()[n],
+
1730  S.template getValue< 0,-1, 0>()[n], S.template getValue< 0,-2, 0>()[n]);
+
1731  }
+
1732 
+
1733  template<typename Stencil>
+
1734  static typename Stencil::ValueType::value_type inZ(const Stencil& S, int n)
+
1735  {
+
1736  return D1<CD_4TH>::difference(
+
1737  S.template getValue< 0, 0, 2>()[n], S.template getValue< 0, 0, 1>()[n],
+
1738  S.template getValue< 0, 0,-1>()[n], S.template getValue< 0, 0,-2>()[n]);
+
1739  }
+
1740 };
+
1741 
+
1742 
+
1743 template<>
+
1744 struct D1Vec<CD_6TH>
+
1745 {
+
1746  //typedef typename Accessor::ValueType::value_type::value_type ValueType;
+
1747 
+
1748  // random access version
+
1749  template<typename Accessor>
+
1750  static typename Accessor::ValueType::value_type
+
1751  inX(const Accessor& grid, const Coord& ijk, int n)
+
1752  {
+
1753  return D1<CD_6TH>::difference(
+
1754  grid.getValue(ijk.offsetBy( 3, 0, 0))[n], grid.getValue(ijk.offsetBy( 2, 0, 0))[n],
+
1755  grid.getValue(ijk.offsetBy( 1, 0, 0))[n], grid.getValue(ijk.offsetBy(-1, 0, 0))[n],
+
1756  grid.getValue(ijk.offsetBy(-2, 0, 0))[n], grid.getValue(ijk.offsetBy(-3, 0, 0))[n] );
+
1757  }
+
1758 
+
1759  template<typename Accessor>
+
1760  static typename Accessor::ValueType::value_type
+
1761  inY(const Accessor& grid, const Coord& ijk, int n)
+
1762  {
+
1763  return D1<CD_6TH>::difference(
+
1764  grid.getValue(ijk.offsetBy( 0, 3, 0))[n], grid.getValue(ijk.offsetBy( 0, 2, 0))[n],
+
1765  grid.getValue(ijk.offsetBy( 0, 1, 0))[n], grid.getValue(ijk.offsetBy( 0,-1, 0))[n],
+
1766  grid.getValue(ijk.offsetBy( 0,-2, 0))[n], grid.getValue(ijk.offsetBy( 0,-3, 0))[n] );
+
1767  }
+
1768 
+
1769  template<typename Accessor>
+
1770  static typename Accessor::ValueType::value_type
+
1771  inZ(const Accessor& grid, const Coord& ijk, int n)
+
1772  {
+
1773  return D1<CD_6TH>::difference(
+
1774  grid.getValue(ijk.offsetBy( 0, 0, 3))[n], grid.getValue(ijk.offsetBy( 0, 0, 2))[n],
+
1775  grid.getValue(ijk.offsetBy( 0, 0, 1))[n], grid.getValue(ijk.offsetBy( 0, 0,-1))[n],
+
1776  grid.getValue(ijk.offsetBy( 0, 0,-2))[n], grid.getValue(ijk.offsetBy( 0, 0,-3))[n] );
+
1777  }
+
1778 
+
1779 
+
1780  // stencil access version
+
1781  template<typename Stencil>
+
1782  static typename Stencil::ValueType::value_type inX(const Stencil& S, int n)
+
1783  {
+
1784  return D1<CD_6TH>::difference(
+
1785  S.template getValue< 3, 0, 0>()[n], S.template getValue< 2, 0, 0>()[n],
+
1786  S.template getValue< 1, 0, 0>()[n], S.template getValue<-1, 0, 0>()[n],
+
1787  S.template getValue<-2, 0, 0>()[n], S.template getValue<-3, 0, 0>()[n] );
+
1788  }
+
1789 
+
1790  template<typename Stencil>
+
1791  static typename Stencil::ValueType::value_type inY(const Stencil& S, int n)
+
1792  {
+
1793  return D1<CD_6TH>::difference(
+
1794  S.template getValue< 0, 3, 0>()[n], S.template getValue< 0, 2, 0>()[n],
+
1795  S.template getValue< 0, 1, 0>()[n], S.template getValue< 0,-1, 0>()[n],
+
1796  S.template getValue< 0,-2, 0>()[n], S.template getValue< 0,-3, 0>()[n] );
+
1797  }
+
1798 
+
1799  template<typename Stencil>
+
1800  static typename Stencil::ValueType::value_type inZ(const Stencil& S, int n)
+
1801  {
+
1802  return D1<CD_6TH>::difference(
+
1803  S.template getValue< 0, 0, 3>()[n], S.template getValue< 0, 0, 2>()[n],
+
1804  S.template getValue< 0, 0, 1>()[n], S.template getValue< 0, 0,-1>()[n],
+
1805  S.template getValue< 0, 0,-2>()[n], S.template getValue< 0, 0,-3>()[n] );
+
1806  }
+
1807 };
+
1808 
+
1809 template<DDScheme DiffScheme>
+
1810 struct D2
+
1811 {
+
1812 
+
1813  template<typename Accessor>
+
1814  static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk);
+
1815  template<typename Accessor>
+
1816  static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk);
+
1817  template<typename Accessor>
+
1818  static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk);
+
1819 
+
1820  // cross derivatives
+
1821  template<typename Accessor>
+
1822  static typename Accessor::ValueType inXandY(const Accessor& grid, const Coord& ijk);
+
1823 
+
1824  template<typename Accessor>
+
1825  static typename Accessor::ValueType inXandZ(const Accessor& grid, const Coord& ijk);
+
1826 
+
1827  template<typename Accessor>
+
1828  static typename Accessor::ValueType inYandZ(const Accessor& grid, const Coord& ijk);
+
1829 
+
1830 
+
1831  // stencil access version
+
1832  template<typename Stencil>
+
1833  static typename Stencil::ValueType inX(const Stencil& S);
+
1834  template<typename Stencil>
+
1835  static typename Stencil::ValueType inY(const Stencil& S);
+
1836  template<typename Stencil>
+
1837  static typename Stencil::ValueType inZ(const Stencil& S);
+
1838 
+
1839  // cross derivatives
+
1840  template<typename Stencil>
+
1841  static typename Stencil::ValueType inXandY(const Stencil& S);
+
1842 
+
1843  template<typename Stencil>
+
1844  static typename Stencil::ValueType inXandZ(const Stencil& S);
+
1845 
+
1846  template<typename Stencil>
+
1847  static typename Stencil::ValueType inYandZ(const Stencil& S);
+
1848 };
+
1849 
+
1850 template<>
+
1851 struct D2<CD_SECOND>
+
1852 {
+
1853 
+
1854  // the difference opperator
+
1855  template <typename ValueType>
+
1856  static ValueType difference(const ValueType& xp1, const ValueType& xp0, const ValueType& xm1)
+
1857  {
+
1858  return xp1 + xm1 - ValueType(2)*xp0;
+
1859  }
+
1860 
+
1861  template <typename ValueType>
+
1862  static ValueType crossdifference(const ValueType& xpyp, const ValueType& xpym,
+
1863  const ValueType& xmyp, const ValueType& xmym)
+
1864  {
+
1865  return ValueType(0.25)*(xpyp + xmym - xpym - xmyp);
+
1866  }
+
1867 
+
1868  // random access version
+
1869  template<typename Accessor>
+
1870  static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk)
+
1871  {
+
1872  return difference( grid.getValue(ijk.offsetBy( 1,0,0)), grid.getValue(ijk),
+
1873  grid.getValue(ijk.offsetBy(-1,0,0)) );
+
1874  }
+
1875 
+
1876  template<typename Accessor>
+
1877  static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk)
+
1878  {
+
1879 
+
1880  return difference( grid.getValue(ijk.offsetBy(0, 1,0)), grid.getValue(ijk),
+
1881  grid.getValue(ijk.offsetBy(0,-1,0)) );
+
1882  }
+
1883 
+
1884  template<typename Accessor>
+
1885  static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk)
+
1886  {
+
1887  return difference( grid.getValue(ijk.offsetBy( 0,0, 1)), grid.getValue(ijk),
+
1888  grid.getValue(ijk.offsetBy( 0,0,-1)) );
+
1889  }
+
1890 
+
1891  // cross derivatives
+
1892  template<typename Accessor>
+
1893  static typename Accessor::ValueType inXandY(const Accessor& grid, const Coord& ijk)
+
1894  {
+
1895  return crossdifference(
+
1896  grid.getValue(ijk.offsetBy(1, 1,0)), grid.getValue(ijk.offsetBy( 1,-1,0)),
+
1897  grid.getValue(ijk.offsetBy(-1,1,0)), grid.getValue(ijk.offsetBy(-1,-1,0)));
+
1898 
+
1899  }
+
1900 
+
1901  template<typename Accessor>
+
1902  static typename Accessor::ValueType inXandZ(const Accessor& grid, const Coord& ijk)
+
1903  {
+
1904  return crossdifference(
+
1905  grid.getValue(ijk.offsetBy(1,0, 1)), grid.getValue(ijk.offsetBy(1, 0,-1)),
+
1906  grid.getValue(ijk.offsetBy(-1,0,1)), grid.getValue(ijk.offsetBy(-1,0,-1)) );
+
1907  }
+
1908 
+
1909  template<typename Accessor>
+
1910  static typename Accessor::ValueType inYandZ(const Accessor& grid, const Coord& ijk)
+
1911  {
+
1912  return crossdifference(
+
1913  grid.getValue(ijk.offsetBy(0, 1,1)), grid.getValue(ijk.offsetBy(0, 1,-1)),
+
1914  grid.getValue(ijk.offsetBy(0,-1,1)), grid.getValue(ijk.offsetBy(0,-1,-1)) );
+
1915  }
+
1916 
+
1917 
+
1918  // stencil access version
+
1919  template<typename Stencil>
+
1920  static typename Stencil::ValueType inX(const Stencil& S)
+
1921  {
+
1922  return difference( S.template getValue< 1, 0, 0>(), S.template getValue< 0, 0, 0>(),
+
1923  S.template getValue<-1, 0, 0>() );
+
1924  }
+
1925 
+
1926  template<typename Stencil>
+
1927  static typename Stencil::ValueType inY(const Stencil& S)
+
1928  {
+
1929  return difference( S.template getValue< 0, 1, 0>(), S.template getValue< 0, 0, 0>(),
+
1930  S.template getValue< 0,-1, 0>() );
+
1931  }
+
1932 
+
1933  template<typename Stencil>
+
1934  static typename Stencil::ValueType inZ(const Stencil& S)
+
1935  {
+
1936  return difference( S.template getValue< 0, 0, 1>(), S.template getValue< 0, 0, 0>(),
+
1937  S.template getValue< 0, 0,-1>() );
+
1938  }
+
1939 
+
1940  // cross derivatives
+
1941  template<typename Stencil>
+
1942  static typename Stencil::ValueType inXandY(const Stencil& S)
+
1943  {
+
1944  return crossdifference(S.template getValue< 1, 1, 0>(), S.template getValue< 1,-1, 0>(),
+
1945  S.template getValue<-1, 1, 0>(), S.template getValue<-1,-1, 0>() );
+
1946  }
+
1947 
+
1948  template<typename Stencil>
+
1949  static typename Stencil::ValueType inXandZ(const Stencil& S)
+
1950  {
+
1951  return crossdifference(S.template getValue< 1, 0, 1>(), S.template getValue< 1, 0,-1>(),
+
1952  S.template getValue<-1, 0, 1>(), S.template getValue<-1, 0,-1>() );
+
1953  }
+
1954 
+
1955  template<typename Stencil>
+
1956  static typename Stencil::ValueType inYandZ(const Stencil& S)
+
1957  {
+
1958  return crossdifference(S.template getValue< 0, 1, 1>(), S.template getValue< 0, 1,-1>(),
+
1959  S.template getValue< 0,-1, 1>(), S.template getValue< 0,-1,-1>() );
+
1960  }
+
1961 };
+
1962 
+
1963 
+
1964 template<>
+
1965 struct D2<CD_FOURTH>
+
1966 {
+
1967 
+
1968  // the difference opperator
+
1969  template <typename ValueType>
+
1970  static ValueType difference(const ValueType& xp2, const ValueType& xp1, const ValueType& xp0,
+
1971  const ValueType& xm1, const ValueType& xm2) {
+
1972  return ValueType(-1./12.)*(xp2 + xm2) + ValueType(4./3.)*(xp1 + xm1) -ValueType(2.5)*xp0;
+
1973  }
+
1974 
+
1975  template <typename ValueType>
+
1976  static ValueType crossdifference(const ValueType& xp2yp2, const ValueType& xp2yp1,
+
1977  const ValueType& xp2ym1, const ValueType& xp2ym2,
+
1978  const ValueType& xp1yp2, const ValueType& xp1yp1,
+
1979  const ValueType& xp1ym1, const ValueType& xp1ym2,
+
1980  const ValueType& xm2yp2, const ValueType& xm2yp1,
+
1981  const ValueType& xm2ym1, const ValueType& xm2ym2,
+
1982  const ValueType& xm1yp2, const ValueType& xm1yp1,
+
1983  const ValueType& xm1ym1, const ValueType& xm1ym2 ) {
+
1984  ValueType tmp1 =
+
1985  ValueType(2./3.0)*(xp1yp1 - xm1yp1 - xp1ym1 + xm1ym1)-
+
1986  ValueType(1./12.)*(xp2yp1 - xm2yp1 - xp2ym1 + xm2ym1);
+
1987  ValueType tmp2 =
+
1988  ValueType(2./3.0)*(xp1yp2 - xm1yp2 - xp1ym2 + xm1ym2)-
+
1989  ValueType(1./12.)*(xp2yp2 - xm2yp2 - xp2ym2 + xm2ym2);
+
1990 
+
1991  return ValueType(2./3.)*tmp1 - ValueType(1./12.)*tmp2;
+
1992  }
+
1993 
+
1994 
+
1995 
+
1996  // random access version
+
1997  template<typename Accessor>
+
1998  static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk)
+
1999  {
+
2000  return difference(
+
2001  grid.getValue(ijk.offsetBy(2,0,0)), grid.getValue(ijk.offsetBy( 1,0,0)),
+
2002  grid.getValue(ijk),
+
2003  grid.getValue(ijk.offsetBy(-1,0,0)), grid.getValue(ijk.offsetBy(-2, 0, 0)));
+
2004  }
+
2005 
+
2006  template<typename Accessor>
+
2007  static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk)
+
2008  {
+
2009  return difference(
+
2010  grid.getValue(ijk.offsetBy(0, 2,0)), grid.getValue(ijk.offsetBy(0, 1,0)),
+
2011  grid.getValue(ijk),
+
2012  grid.getValue(ijk.offsetBy(0,-1,0)), grid.getValue(ijk.offsetBy(0,-2, 0)));
+
2013  }
+
2014 
+
2015  template<typename Accessor>
+
2016  static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk)
+
2017  {
+
2018  return difference(
+
2019  grid.getValue(ijk.offsetBy(0,0, 2)), grid.getValue(ijk.offsetBy(0, 0,1)),
+
2020  grid.getValue(ijk),
+
2021  grid.getValue(ijk.offsetBy(0,0,-1)), grid.getValue(ijk.offsetBy(0,0,-2)));
+
2022  }
+
2023 
+
2024  // cross derivatives
+
2025  template<typename Accessor>
+
2026  static typename Accessor::ValueType inXandY(const Accessor& grid, const Coord& ijk)
+
2027  {
+
2028  typedef typename Accessor::ValueType ValueType;
+
2029  typename Accessor::ValueType tmp1 =
+
2030  D1<CD_4TH>::inX(grid, ijk.offsetBy(0, 1, 0)) -
+
2031  D1<CD_4TH>::inX(grid, ijk.offsetBy(0,-1, 0));
+
2032  typename Accessor::ValueType tmp2 =
+
2033  D1<CD_4TH>::inX(grid, ijk.offsetBy(0, 2, 0)) -
+
2034  D1<CD_4TH>::inX(grid, ijk.offsetBy(0,-2, 0));
+
2035  return ValueType(2./3.)*tmp1 - ValueType(1./12.)*tmp2;
+
2036  }
+
2037 
+
2038  template<typename Accessor>
+
2039  static typename Accessor::ValueType inXandZ(const Accessor& grid, const Coord& ijk)
+
2040  {
+
2041  typedef typename Accessor::ValueType ValueType;
+
2042  typename Accessor::ValueType tmp1 =
+
2043  D1<CD_4TH>::inX(grid, ijk.offsetBy(0, 0, 1)) -
+
2044  D1<CD_4TH>::inX(grid, ijk.offsetBy(0, 0,-1));
+
2045  typename Accessor::ValueType tmp2 =
+
2046  D1<CD_4TH>::inX(grid, ijk.offsetBy(0, 0, 2)) -
+
2047  D1<CD_4TH>::inX(grid, ijk.offsetBy(0, 0,-2));
+
2048  return ValueType(2./3.)*tmp1 - ValueType(1./12.)*tmp2;
+
2049  }
+
2050 
+
2051  template<typename Accessor>
+
2052  static typename Accessor::ValueType inYandZ(const Accessor& grid, const Coord& ijk)
+
2053  {
+
2054  typedef typename Accessor::ValueType ValueType;
+
2055  typename Accessor::ValueType tmp1 =
+
2056  D1<CD_4TH>::inY(grid, ijk.offsetBy(0, 0, 1)) -
+
2057  D1<CD_4TH>::inY(grid, ijk.offsetBy(0, 0,-1));
+
2058  typename Accessor::ValueType tmp2 =
+
2059  D1<CD_4TH>::inY(grid, ijk.offsetBy(0, 0, 2)) -
+
2060  D1<CD_4TH>::inY(grid, ijk.offsetBy(0, 0,-2));
+
2061  return ValueType(2./3.)*tmp1 - ValueType(1./12.)*tmp2;
+
2062  }
+
2063 
+
2064 
+
2065  // stencil access version
+
2066  template<typename Stencil>
+
2067  static typename Stencil::ValueType inX(const Stencil& S)
+
2068  {
+
2069  return difference(S.template getValue< 2, 0, 0>(), S.template getValue< 1, 0, 0>(),
+
2070  S.template getValue< 0, 0, 0>(),
+
2071  S.template getValue<-1, 0, 0>(), S.template getValue<-2, 0, 0>() );
+
2072  }
+
2073 
+
2074  template<typename Stencil>
+
2075  static typename Stencil::ValueType inY(const Stencil& S)
+
2076  {
+
2077  return difference(S.template getValue< 0, 2, 0>(), S.template getValue< 0, 1, 0>(),
+
2078  S.template getValue< 0, 0, 0>(),
+
2079  S.template getValue< 0,-1, 0>(), S.template getValue< 0,-2, 0>() );
+
2080  }
+
2081 
+
2082  template<typename Stencil>
+
2083  static typename Stencil::ValueType inZ(const Stencil& S)
+
2084  {
+
2085  return difference(S.template getValue< 0, 0, 2>(), S.template getValue< 0, 0, 1>(),
+
2086  S.template getValue< 0, 0, 0>(),
+
2087  S.template getValue< 0, 0,-1>(), S.template getValue< 0, 0,-2>() );
+
2088  }
+
2089 
+
2090  // cross derivatives
+
2091  template<typename Stencil>
+
2092  static typename Stencil::ValueType inXandY(const Stencil& S)
+
2093  {
+
2094  return crossdifference(
+
2095  S.template getValue< 2, 2, 0>(), S.template getValue< 2, 1, 0>(),
+
2096  S.template getValue< 2,-1, 0>(), S.template getValue< 2,-2, 0>(),
+
2097  S.template getValue< 1, 2, 0>(), S.template getValue< 1, 1, 0>(),
+
2098  S.template getValue< 1,-1, 0>(), S.template getValue< 1,-2, 0>(),
+
2099  S.template getValue<-2, 2, 0>(), S.template getValue<-2, 1, 0>(),
+
2100  S.template getValue<-2,-1, 0>(), S.template getValue<-2,-2, 0>(),
+
2101  S.template getValue<-1, 2, 0>(), S.template getValue<-1, 1, 0>(),
+
2102  S.template getValue<-1,-1, 0>(), S.template getValue<-1,-2, 0>() );
+
2103  }
+
2104 
+
2105  template<typename Stencil>
+
2106  static typename Stencil::ValueType inXandZ(const Stencil& S)
+
2107  {
+
2108  return crossdifference(
+
2109  S.template getValue< 2, 0, 2>(), S.template getValue< 2, 0, 1>(),
+
2110  S.template getValue< 2, 0,-1>(), S.template getValue< 2, 0,-2>(),
+
2111  S.template getValue< 1, 0, 2>(), S.template getValue< 1, 0, 1>(),
+
2112  S.template getValue< 1, 0,-1>(), S.template getValue< 1, 0,-2>(),
+
2113  S.template getValue<-2, 0, 2>(), S.template getValue<-2, 0, 1>(),
+
2114  S.template getValue<-2, 0,-1>(), S.template getValue<-2, 0,-2>(),
+
2115  S.template getValue<-1, 0, 2>(), S.template getValue<-1, 0, 1>(),
+
2116  S.template getValue<-1, 0,-1>(), S.template getValue<-1, 0,-2>() );
+
2117  }
+
2118 
+
2119  template<typename Stencil>
+
2120  static typename Stencil::ValueType inYandZ(const Stencil& S)
+
2121  {
+
2122  return crossdifference(
+
2123  S.template getValue< 0, 2, 2>(), S.template getValue< 0, 2, 1>(),
+
2124  S.template getValue< 0, 2,-1>(), S.template getValue< 0, 2,-2>(),
+
2125  S.template getValue< 0, 1, 2>(), S.template getValue< 0, 1, 1>(),
+
2126  S.template getValue< 0, 1,-1>(), S.template getValue< 0, 1,-2>(),
+
2127  S.template getValue< 0,-2, 2>(), S.template getValue< 0,-2, 1>(),
+
2128  S.template getValue< 0,-2,-1>(), S.template getValue< 0,-2,-2>(),
+
2129  S.template getValue< 0,-1, 2>(), S.template getValue< 0,-1, 1>(),
+
2130  S.template getValue< 0,-1,-1>(), S.template getValue< 0,-1,-2>() );
+
2131  }
+
2132 };
+
2133 
+
2134 
+
2135 template<>
+
2136 struct D2<CD_SIXTH>
+
2137 {
+
2138  // the difference opperator
+
2139  template <typename ValueType>
+
2140  static ValueType difference(const ValueType& xp3, const ValueType& xp2, const ValueType& xp1,
+
2141  const ValueType& xp0,
+
2142  const ValueType& xm1, const ValueType& xm2, const ValueType& xm3)
+
2143  {
+
2144  return ValueType(1./90.)*(xp3 + xm3) - ValueType(3./20.)*(xp2 + xm2)
+
2145  + ValueType(1.5)*(xp1 + xm1) - ValueType(49./18.)*xp0;
+
2146  }
+
2147 
+
2148  template <typename ValueType>
+
2149  static ValueType crossdifference( const ValueType& xp1yp1,const ValueType& xm1yp1,
+
2150  const ValueType& xp1ym1,const ValueType& xm1ym1,
+
2151  const ValueType& xp2yp1,const ValueType& xm2yp1,
+
2152  const ValueType& xp2ym1,const ValueType& xm2ym1,
+
2153  const ValueType& xp3yp1,const ValueType& xm3yp1,
+
2154  const ValueType& xp3ym1,const ValueType& xm3ym1,
+
2155  const ValueType& xp1yp2,const ValueType& xm1yp2,
+
2156  const ValueType& xp1ym2,const ValueType& xm1ym2,
+
2157  const ValueType& xp2yp2,const ValueType& xm2yp2,
+
2158  const ValueType& xp2ym2,const ValueType& xm2ym2,
+
2159  const ValueType& xp3yp2,const ValueType& xm3yp2,
+
2160  const ValueType& xp3ym2,const ValueType& xm3ym2,
+
2161  const ValueType& xp1yp3,const ValueType& xm1yp3,
+
2162  const ValueType& xp1ym3,const ValueType& xm1ym3,
+
2163  const ValueType& xp2yp3,const ValueType& xm2yp3,
+
2164  const ValueType& xp2ym3,const ValueType& xm2ym3,
+
2165  const ValueType& xp3yp3,const ValueType& xm3yp3,
+
2166  const ValueType& xp3ym3,const ValueType& xm3ym3 )
+
2167  {
+
2168  ValueType tmp1 =
+
2169  ValueType(0.7500)*(xp1yp1 - xm1yp1 - xp1ym1 + xm1ym1) -
+
2170  ValueType(0.1500)*(xp2yp1 - xm2yp1 - xp2ym1 + xm2ym1) +
+
2171  ValueType(1./60.)*(xp3yp1 - xm3yp1 - xp3ym1 + xm3ym1);
+
2172 
+
2173  ValueType tmp2 =
+
2174  ValueType(0.7500)*(xp1yp2 - xm1yp2 - xp1ym2 + xm1ym2) -
+
2175  ValueType(0.1500)*(xp2yp2 - xm2yp2 - xp2ym2 + xm2ym2) +
+
2176  ValueType(1./60.)*(xp3yp2 - xm3yp2 - xp3ym2 + xm3ym2);
+
2177 
+
2178  ValueType tmp3 =
+
2179  ValueType(0.7500)*(xp1yp3 - xm1yp3 - xp1ym3 + xm1ym3) -
+
2180  ValueType(0.1500)*(xp2yp3 - xm2yp3 - xp2ym3 + xm2ym3) +
+
2181  ValueType(1./60.)*(xp3yp3 - xm3yp3 - xp3ym3 + xm3ym3);
+
2182 
+
2183  return ValueType(0.75)*tmp1 - ValueType(0.15)*tmp2 + ValueType(1./60)*tmp3;
+
2184  }
+
2185 
+
2186  // random access version
+
2187 
+
2188  template<typename Accessor>
+
2189  static typename Accessor::ValueType inX(const Accessor& grid, const Coord& ijk)
+
2190  {
+
2191  return difference(
+
2192  grid.getValue(ijk.offsetBy( 3, 0, 0)), grid.getValue(ijk.offsetBy( 2, 0, 0)),
+
2193  grid.getValue(ijk.offsetBy( 1, 0, 0)), grid.getValue(ijk),
+
2194  grid.getValue(ijk.offsetBy(-1, 0, 0)), grid.getValue(ijk.offsetBy(-2, 0, 0)),
+
2195  grid.getValue(ijk.offsetBy(-3, 0, 0)) );
+
2196  }
+
2197 
+
2198  template<typename Accessor>
+
2199  static typename Accessor::ValueType inY(const Accessor& grid, const Coord& ijk)
+
2200  {
+
2201  return difference(
+
2202  grid.getValue(ijk.offsetBy( 0, 3, 0)), grid.getValue(ijk.offsetBy( 0, 2, 0)),
+
2203  grid.getValue(ijk.offsetBy( 0, 1, 0)), grid.getValue(ijk),
+
2204  grid.getValue(ijk.offsetBy( 0,-1, 0)), grid.getValue(ijk.offsetBy( 0,-2, 0)),
+
2205  grid.getValue(ijk.offsetBy( 0,-3, 0)) );
+
2206  }
+
2207 
+
2208  template<typename Accessor>
+
2209  static typename Accessor::ValueType inZ(const Accessor& grid, const Coord& ijk)
+
2210  {
+
2211 
+
2212  return difference(
+
2213  grid.getValue(ijk.offsetBy( 0, 0, 3)), grid.getValue(ijk.offsetBy( 0, 0, 2)),
+
2214  grid.getValue(ijk.offsetBy( 0, 0, 1)), grid.getValue(ijk),
+
2215  grid.getValue(ijk.offsetBy( 0, 0,-1)), grid.getValue(ijk.offsetBy( 0, 0,-2)),
+
2216  grid.getValue(ijk.offsetBy( 0, 0,-3)) );
+
2217  }
+
2218 
+
2219  template<typename Accessor>
+
2220  static typename Accessor::ValueType inXandY(const Accessor& grid, const Coord& ijk)
+
2221  {
+
2222  typedef typename Accessor::ValueType ValueT;
+
2223  ValueT tmp1 =
+
2224  D1<CD_6TH>::inX(grid, ijk.offsetBy(0, 1, 0)) -
+
2225  D1<CD_6TH>::inX(grid, ijk.offsetBy(0,-1, 0));
+
2226  ValueT tmp2 =
+
2227  D1<CD_6TH>::inX(grid, ijk.offsetBy(0, 2, 0)) -
+
2228  D1<CD_6TH>::inX(grid, ijk.offsetBy(0,-2, 0));
+
2229  ValueT tmp3 =
+
2230  D1<CD_6TH>::inX(grid, ijk.offsetBy(0, 3, 0)) -
+
2231  D1<CD_6TH>::inX(grid, ijk.offsetBy(0,-3, 0));
+
2232  return ValueT(0.75*tmp1 - 0.15*tmp2 + 1./60*tmp3);
+
2233  }
+
2234 
+
2235  template<typename Accessor>
+
2236  static typename Accessor::ValueType inXandZ(const Accessor& grid, const Coord& ijk)
+
2237  {
+
2238  typedef typename Accessor::ValueType ValueT;
+
2239  ValueT tmp1 =
+
2240  D1<CD_6TH>::inX(grid, ijk.offsetBy(0, 0, 1)) -
+
2241  D1<CD_6TH>::inX(grid, ijk.offsetBy(0, 0,-1));
+
2242  ValueT tmp2 =
+
2243  D1<CD_6TH>::inX(grid, ijk.offsetBy(0, 0, 2)) -
+
2244  D1<CD_6TH>::inX(grid, ijk.offsetBy(0, 0,-2));
+
2245  ValueT tmp3 =
+
2246  D1<CD_6TH>::inX(grid, ijk.offsetBy(0, 0, 3)) -
+
2247  D1<CD_6TH>::inX(grid, ijk.offsetBy(0, 0,-3));
+
2248  return ValueT(0.75*tmp1 - 0.15*tmp2 + 1./60*tmp3);
+
2249  }
+
2250 
+
2251  template<typename Accessor>
+
2252  static typename Accessor::ValueType inYandZ(const Accessor& grid, const Coord& ijk)
+
2253  {
+
2254  typedef typename Accessor::ValueType ValueT;
+
2255  ValueT tmp1 =
+
2256  D1<CD_6TH>::inY(grid, ijk.offsetBy(0, 0, 1)) -
+
2257  D1<CD_6TH>::inY(grid, ijk.offsetBy(0, 0,-1));
+
2258  ValueT tmp2 =
+
2259  D1<CD_6TH>::inY(grid, ijk.offsetBy(0, 0, 2)) -
+
2260  D1<CD_6TH>::inY(grid, ijk.offsetBy(0, 0,-2));
+
2261  ValueT tmp3 =
+
2262  D1<CD_6TH>::inY(grid, ijk.offsetBy(0, 0, 3)) -
+
2263  D1<CD_6TH>::inY(grid, ijk.offsetBy(0, 0,-3));
+
2264  return ValueT(0.75*tmp1 - 0.15*tmp2 + 1./60*tmp3);
+
2265  }
+
2266 
+
2267 
+
2268  // stencil access version
+
2269  template<typename Stencil>
+
2270  static typename Stencil::ValueType inX(const Stencil& S)
+
2271  {
+
2272  return difference( S.template getValue< 3, 0, 0>(), S.template getValue< 2, 0, 0>(),
+
2273  S.template getValue< 1, 0, 0>(), S.template getValue< 0, 0, 0>(),
+
2274  S.template getValue<-1, 0, 0>(), S.template getValue<-2, 0, 0>(),
+
2275  S.template getValue<-3, 0, 0>() );
+
2276  }
+
2277 
+
2278  template<typename Stencil>
+
2279  static typename Stencil::ValueType inY(const Stencil& S)
+
2280  {
+
2281  return difference( S.template getValue< 0, 3, 0>(), S.template getValue< 0, 2, 0>(),
+
2282  S.template getValue< 0, 1, 0>(), S.template getValue< 0, 0, 0>(),
+
2283  S.template getValue< 0,-1, 0>(), S.template getValue< 0,-2, 0>(),
+
2284  S.template getValue< 0,-3, 0>() );
+
2285 
+
2286  }
+
2287 
+
2288  template<typename Stencil>
+
2289  static typename Stencil::ValueType inZ(const Stencil& S)
+
2290  {
+
2291  return difference( S.template getValue< 0, 0, 3>(), S.template getValue< 0, 0, 2>(),
+
2292  S.template getValue< 0, 0, 1>(), S.template getValue< 0, 0, 0>(),
+
2293  S.template getValue< 0, 0,-1>(), S.template getValue< 0, 0,-2>(),
+
2294  S.template getValue< 0, 0,-3>() );
+
2295  }
+
2296 
+
2297  template<typename Stencil>
+
2298  static typename Stencil::ValueType inXandY(const Stencil& S)
+
2299  {
+
2300  return crossdifference( S.template getValue< 1, 1, 0>(), S.template getValue<-1, 1, 0>(),
+
2301  S.template getValue< 1,-1, 0>(), S.template getValue<-1,-1, 0>(),
+
2302  S.template getValue< 2, 1, 0>(), S.template getValue<-2, 1, 0>(),
+
2303  S.template getValue< 2,-1, 0>(), S.template getValue<-2,-1, 0>(),
+
2304  S.template getValue< 3, 1, 0>(), S.template getValue<-3, 1, 0>(),
+
2305  S.template getValue< 3,-1, 0>(), S.template getValue<-3,-1, 0>(),
+
2306  S.template getValue< 1, 2, 0>(), S.template getValue<-1, 2, 0>(),
+
2307  S.template getValue< 1,-2, 0>(), S.template getValue<-1,-2, 0>(),
+
2308  S.template getValue< 2, 2, 0>(), S.template getValue<-2, 2, 0>(),
+
2309  S.template getValue< 2,-2, 0>(), S.template getValue<-2,-2, 0>(),
+
2310  S.template getValue< 3, 2, 0>(), S.template getValue<-3, 2, 0>(),
+
2311  S.template getValue< 3,-2, 0>(), S.template getValue<-3,-2, 0>(),
+
2312  S.template getValue< 1, 3, 0>(), S.template getValue<-1, 3, 0>(),
+
2313  S.template getValue< 1,-3, 0>(), S.template getValue<-1,-3, 0>(),
+
2314  S.template getValue< 2, 3, 0>(), S.template getValue<-2, 3, 0>(),
+
2315  S.template getValue< 2,-3, 0>(), S.template getValue<-2,-3, 0>(),
+
2316  S.template getValue< 3, 3, 0>(), S.template getValue<-3, 3, 0>(),
+
2317  S.template getValue< 3,-3, 0>(), S.template getValue<-3,-3, 0>() );
+
2318  }
+
2319 
+
2320  template<typename Stencil>
+
2321  static typename Stencil::ValueType inXandZ(const Stencil& S)
+
2322  {
+
2323  return crossdifference( S.template getValue< 1, 0, 1>(), S.template getValue<-1, 0, 1>(),
+
2324  S.template getValue< 1, 0,-1>(), S.template getValue<-1, 0,-1>(),
+
2325  S.template getValue< 2, 0, 1>(), S.template getValue<-2, 0, 1>(),
+
2326  S.template getValue< 2, 0,-1>(), S.template getValue<-2, 0,-1>(),
+
2327  S.template getValue< 3, 0, 1>(), S.template getValue<-3, 0, 1>(),
+
2328  S.template getValue< 3, 0,-1>(), S.template getValue<-3, 0,-1>(),
+
2329  S.template getValue< 1, 0, 2>(), S.template getValue<-1, 0, 2>(),
+
2330  S.template getValue< 1, 0,-2>(), S.template getValue<-1, 0,-2>(),
+
2331  S.template getValue< 2, 0, 2>(), S.template getValue<-2, 0, 2>(),
+
2332  S.template getValue< 2, 0,-2>(), S.template getValue<-2, 0,-2>(),
+
2333  S.template getValue< 3, 0, 2>(), S.template getValue<-3, 0, 2>(),
+
2334  S.template getValue< 3, 0,-2>(), S.template getValue<-3, 0,-2>(),
+
2335  S.template getValue< 1, 0, 3>(), S.template getValue<-1, 0, 3>(),
+
2336  S.template getValue< 1, 0,-3>(), S.template getValue<-1, 0,-3>(),
+
2337  S.template getValue< 2, 0, 3>(), S.template getValue<-2, 0, 3>(),
+
2338  S.template getValue< 2, 0,-3>(), S.template getValue<-2, 0,-3>(),
+
2339  S.template getValue< 3, 0, 3>(), S.template getValue<-3, 0, 3>(),
+
2340  S.template getValue< 3, 0,-3>(), S.template getValue<-3, 0,-3>() );
+
2341  }
+
2342 
+
2343  template<typename Stencil>
+
2344  static typename Stencil::ValueType inYandZ(const Stencil& S)
+
2345  {
+
2346  return crossdifference( S.template getValue< 0, 1, 1>(), S.template getValue< 0,-1, 1>(),
+
2347  S.template getValue< 0, 1,-1>(), S.template getValue< 0,-1,-1>(),
+
2348  S.template getValue< 0, 2, 1>(), S.template getValue< 0,-2, 1>(),
+
2349  S.template getValue< 0, 2,-1>(), S.template getValue< 0,-2,-1>(),
+
2350  S.template getValue< 0, 3, 1>(), S.template getValue< 0,-3, 1>(),
+
2351  S.template getValue< 0, 3,-1>(), S.template getValue< 0,-3,-1>(),
+
2352  S.template getValue< 0, 1, 2>(), S.template getValue< 0,-1, 2>(),
+
2353  S.template getValue< 0, 1,-2>(), S.template getValue< 0,-1,-2>(),
+
2354  S.template getValue< 0, 2, 2>(), S.template getValue< 0,-2, 2>(),
+
2355  S.template getValue< 0, 2,-2>(), S.template getValue< 0,-2,-2>(),
+
2356  S.template getValue< 0, 3, 2>(), S.template getValue< 0,-3, 2>(),
+
2357  S.template getValue< 0, 3,-2>(), S.template getValue< 0,-3,-2>(),
+
2358  S.template getValue< 0, 1, 3>(), S.template getValue< 0,-1, 3>(),
+
2359  S.template getValue< 0, 1,-3>(), S.template getValue< 0,-1,-3>(),
+
2360  S.template getValue< 0, 2, 3>(), S.template getValue< 0,-2, 3>(),
+
2361  S.template getValue< 0, 2,-3>(), S.template getValue< 0,-2,-3>(),
+
2362  S.template getValue< 0, 3, 3>(), S.template getValue< 0,-3, 3>(),
+
2363  S.template getValue< 0, 3,-3>(), S.template getValue< 0,-3,-3>() );
+
2364  }
+
2365 
+
2366 };
+
2367 
+
2368 } // end math namespace
+
2369 } // namespace OPENVDB_VERSION_NAME
+
2370 } // end openvdb namespace
+
2371 
+
2372 #endif // OPENVDB_MATH_FINITEDIFFERENCE_HAS_BEEN_INCLUDED
+
2373 
+
2374 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
2375 // All rights reserved. This software is distributed under the
+
2376 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
static Stencil::ValueType inY(const Stencil &S)
Definition: FiniteDifference.h:1199
+
Definition: FiniteDifference.h:63
+
static Accessor::ValueType::value_type inX(const Accessor &grid, const Coord &ijk, int n)
Definition: FiniteDifference.h:1751
+
static Accessor::ValueType inZ(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:772
+
static Stencil::ValueType inZ(const Stencil &S)
Definition: FiniteDifference.h:591
+
static Stencil::ValueType::value_type inZ(const Stencil &S, int n)
Definition: FiniteDifference.h:1734
+
Definition: FiniteDifference.h:1810
+
TemporalIntegrationScheme stringToTemporalIntegrationScheme(const std::string &s)
Definition: FiniteDifference.h:284
+
static ValueType crossdifference(const ValueType &xp2yp2, const ValueType &xp2yp1, const ValueType &xp2ym1, const ValueType &xp2ym2, const ValueType &xp1yp2, const ValueType &xp1yp1, const ValueType &xp1ym1, const ValueType &xp1ym2, const ValueType &xm2yp2, const ValueType &xm2yp1, const ValueType &xm2ym1, const ValueType &xm2ym2, const ValueType &xm1yp2, const ValueType &xm1yp1, const ValueType &xm1ym1, const ValueType &xm1ym2)
Definition: FiniteDifference.h:1976
+
static Accessor::ValueType inY(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:890
+
static Stencil::ValueType inX(const Stencil &S)
Definition: FiniteDifference.h:1096
+
static Accessor::ValueType inY(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:692
+
static Stencil::ValueType::value_type inX(const Stencil &S, int n)
Definition: FiniteDifference.h:1782
+ +
static Stencil::ValueType inXandY(const Stencil &S)
Definition: FiniteDifference.h:2092
+
static ValueType crossdifference(const ValueType &xp1yp1, const ValueType &xm1yp1, const ValueType &xp1ym1, const ValueType &xm1ym1, const ValueType &xp2yp1, const ValueType &xm2yp1, const ValueType &xp2ym1, const ValueType &xm2ym1, const ValueType &xp3yp1, const ValueType &xm3yp1, const ValueType &xp3ym1, const ValueType &xm3ym1, const ValueType &xp1yp2, const ValueType &xm1yp2, const ValueType &xp1ym2, const ValueType &xm1ym2, const ValueType &xp2yp2, const ValueType &xm2yp2, const ValueType &xp2ym2, const ValueType &xm2ym2, const ValueType &xp3yp2, const ValueType &xm3yp2, const ValueType &xp3ym2, const ValueType &xm3ym2, const ValueType &xp1yp3, const ValueType &xm1yp3, const ValueType &xp1ym3, const ValueType &xm1ym3, const ValueType &xp2yp3, const ValueType &xm2yp3, const ValueType &xp2ym3, const ValueType &xm2ym3, const ValueType &xp3yp3, const ValueType &xm3yp3, const ValueType &xp3ym3, const ValueType &xm3ym3)
Definition: FiniteDifference.h:2149
+
Definition: FiniteDifference.h:71
+
#define OPENVDB_DEPRECATED
Definition: Platform.h:49
+ +
static Accessor::ValueType inX(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:811
+
static Stencil::ValueType inZ(const Stencil &S)
Definition: FiniteDifference.h:658
+
static Stencil::ValueType inY(const Stencil &S)
Definition: FiniteDifference.h:1927
+
static Stencil::ValueType inZ(const Stencil &S)
Definition: FiniteDifference.h:1934
+
static Stencil::ValueType inZ(const Stencil &S)
Definition: FiniteDifference.h:1045
+
Definition: FiniteDifference.h:181
+
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
static Accessor::ValueType inZ(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:829
+
static Accessor::ValueType::value_type inZ(const Accessor &grid, const Coord &ijk, int n)
Definition: FiniteDifference.h:1709
+
static Accessor::ValueType inZ(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:963
+
static Accessor::ValueType inYandZ(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1910
+
static Stencil::ValueType::value_type inY(const Stencil &S, int n)
Definition: FiniteDifference.h:1615
+
Definition: FiniteDifference.h:262
+
Definition: FiniteDifference.h:195
+
static Stencil::ValueType::value_type inY(const Stencil &S, int n)
Definition: FiniteDifference.h:1726
+
static Accessor::ValueType inZ(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:570
+
static Stencil::ValueType inZ(const Stencil &S)
Definition: FiniteDifference.h:1308
+
static ValueType difference(const ValueType &xp2, const ValueType &xp1, const ValueType &xm1, const ValueType &xm2)
Definition: FiniteDifference.h:604
+
static ValueType difference(const ValueType &xm1, const ValueType &xm0)
Definition: FiniteDifference.h:944
+
Definition: FiniteDifference.h:178
+
static Accessor::ValueType inY(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1077
+
TemporalIntegrationScheme
Temporal integration schemes.
Definition: FiniteDifference.h:261
+
BiasedGradientScheme stringToBiasedGradientScheme(const std::string &s)
Definition: FiniteDifference.h:219
+ +
Definition: FiniteDifference.h:69
+
static ValueType difference(const ValueType &xp1, const ValueType &xm1)
Definition: FiniteDifference.h:547
+
static Stencil::ValueType inYandZ(const Stencil &S)
Definition: FiniteDifference.h:1956
+
static Stencil::ValueType inY(const Stencil &S)
Definition: FiniteDifference.h:1297
+
static Stencil::ValueType inX(const Stencil &S)
Definition: FiniteDifference.h:910
+
const Type & Min(const Type &a, const Type &b)
Return the minimum of two values.
Definition: Math.h:622
+
static Stencil::ValueType inY(const Stencil &S)
Definition: FiniteDifference.h:2075
+
static ValueType difference(const ValueType &xm2, const ValueType &xm1, const ValueType &xm0)
Definition: FiniteDifference.h:996
+
static Stencil::ValueType inX(const Stencil &S)
Definition: FiniteDifference.h:971
+ +
Definition: FiniteDifference.h:268
+
Type Pow2(Type x)
Return .
Definition: Math.h:514
+
static Stencil::ValueType inY(const Stencil &S)
Definition: FiniteDifference.h:585
+
static Accessor::ValueType inYandZ(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:2252
+
static Accessor::ValueType inY(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:766
+
static Stencil::ValueType inY(const Stencil &S)
Definition: FiniteDifference.h:529
+
Definition: FiniteDifference.h:73
+
static Stencil::ValueType inZ(const Stencil &S)
Definition: FiniteDifference.h:983
+
Definition: FiniteDifference.h:194
+
std::string temporalIntegrationSchemeToString(TemporalIntegrationScheme tis)
Definition: FiniteDifference.h:271
+
Definition: FiniteDifference.h:263
+
static Accessor::ValueType inZ(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1020
+
static ValueType difference(const ValueType &xp2, const ValueType &xp1, const ValueType &xp0)
Definition: FiniteDifference.h:803
+
static Stencil::ValueType inXandZ(const Stencil &S)
Definition: FiniteDifference.h:2106
+
static Accessor::ValueType inZ(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1365
+
static Stencil::ValueType inX(const Stencil &S)
Definition: FiniteDifference.h:580
+
static Stencil::ValueType inY(const Stencil &S)
Definition: FiniteDifference.h:2279
+
static Stencil::ValueType inY(const Stencil &S)
Definition: FiniteDifference.h:977
+
static Stencil::ValueType inY(const Stencil &S)
Definition: FiniteDifference.h:1037
+
static Accessor::ValueType inY(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1350
+
Signed (x, y, z) 32-bit integer coordinates.
Definition: Coord.h:47
+
static Stencil::ValueType inXandY(const Stencil &S)
Definition: FiniteDifference.h:1942
+
static Stencil::ValueType inX(const Stencil &S)
Definition: FiniteDifference.h:1029
+
static ValueType difference(const ValueType &xp1, const ValueType &xp0, const ValueType &xm1)
Definition: FiniteDifference.h:1856
+
static Stencil::ValueType inX(const Stencil &S)
Definition: FiniteDifference.h:779
+
Definition: FiniteDifference.h:198
+
DScheme
Different discrete schemes used in the first derivatives.
Definition: FiniteDifference.h:59
+
DDScheme
Different discrete schemes used in the second derivatives.
Definition: FiniteDifference.h:177
+
static Accessor::ValueType inY(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:957
+
static ValueType difference(const ValueType &xp3, const ValueType &xp2, const ValueType &xp1, const ValueType &xp0, const ValueType &xm1, const ValueType &xm2)
Definition: FiniteDifference.h:1129
+
Definition: FiniteDifference.h:67
+
Definition: FiniteDifference.h:1532
+
static Stencil::ValueType inX(const Stencil &S)
Definition: FiniteDifference.h:2270
+
Definition: FiniteDifference.h:197
+
static Accessor::ValueType inZ(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:2209
+
static Stencil::ValueType::value_type inZ(const Stencil &S, int n)
Definition: FiniteDifference.h:1800
+
static Accessor::ValueType inY(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1877
+
static Stencil::ValueType inZ(const Stencil &S)
Definition: FiniteDifference.h:535
+
Coord offsetBy(Int32 dx, Int32 dy, Int32 dz) const
Definition: Coord.h:111
+
static Accessor::ValueType inX(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:760
+
static Accessor::ValueType inXandY(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:2220
+
static Accessor::ValueType inX(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:554
+
OPENVDB_DEPRECATED Real GudonovsNormSqrd(bool isOutside, const Vec3< Real > &gradient_m, const Vec3< Real > &gradient_p)
Definition: FiniteDifference.h:395
+
static Stencil::ValueType inX(const Stencil &S)
Definition: FiniteDifference.h:840
+
static Stencil::ValueType inZ(const Stencil &S)
Definition: FiniteDifference.h:2083
+
static Accessor::ValueType inY(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:2199
+
static Stencil::ValueType inXandZ(const Stencil &S)
Definition: FiniteDifference.h:2321
+
double Real
Definition: Types.h:64
+
static Accessor::ValueType inX(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1004
+
static Stencil::ValueType inX(const Stencil &S)
Definition: FiniteDifference.h:523
+
Definition: FiniteDifference.h:72
+
static Stencil::ValueType inX(const Stencil &S)
Definition: FiniteDifference.h:640
+
static Stencil::ValueType inZ(const Stencil &S)
Definition: FiniteDifference.h:856
+
static Accessor::ValueType::value_type inZ(const Accessor &grid, const Coord &ijk, int n)
Definition: FiniteDifference.h:1771
+
static Stencil::ValueType inX(const Stencil &S)
Definition: FiniteDifference.h:1381
+
static ValueType difference(const ValueType &xm3, const ValueType &xm2, const ValueType &xm1, const ValueType &xm0, const ValueType &xp1, const ValueType &xp2)
Definition: FiniteDifference.h:1326
+
static Stencil::ValueType::value_type inZ(const Stencil &S, int n)
Definition: FiniteDifference.h:1675
+
static Stencil::ValueType inY(const Stencil &S)
Definition: FiniteDifference.h:649
+
static Accessor::ValueType inX(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1237
+
std::string biasedGradientSchemeToString(BiasedGradientScheme bgs)
Definition: FiniteDifference.h:204
+
static Accessor::ValueType inZ(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1268
+
static Stencil::ValueType inX(const Stencil &S)
Definition: FiniteDifference.h:1284
+
static Accessor::ValueType inY(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1154
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
static Accessor::ValueType::value_type inX(const Accessor &grid, const Coord &ijk, int n)
Definition: FiniteDifference.h:1537
+
static Stencil::ValueType inZ(const Stencil &S)
Definition: FiniteDifference.h:2289
+
static ValueType difference(const ValueType &xp3, const ValueType &xp2, const ValueType &xp1, const ValueType &xp0, const ValueType &xm1, const ValueType &xm2, const ValueType &xm3)
Definition: FiniteDifference.h:2140
+
static Stencil::ValueType inYandZ(const Stencil &S)
Definition: FiniteDifference.h:2120
+
Definition: FiniteDifference.h:201
+
static Stencil::ValueType::value_type inZ(const Stencil &S, int n)
Definition: FiniteDifference.h:1622
+
static Accessor::ValueType inX(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:881
+
static Accessor::ValueType inX(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:612
+
static Stencil::ValueType inX(const Stencil &S)
Definition: FiniteDifference.h:711
+
static Accessor::ValueType inZ(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:899
+
static Stencil::ValueType inZ(const Stencil &S)
Definition: FiniteDifference.h:791
+
static Accessor::ValueType inX(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:498
+
static Accessor::ValueType::value_type inZ(const Accessor &grid, const Coord &ijk, int n)
Definition: FiniteDifference.h:1652
+
static Stencil::ValueType inZ(const Stencil &S)
Definition: FiniteDifference.h:1114
+
static Accessor::ValueType inX(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1998
+
static ValueType difference(const ValueType &xm3, const ValueType &xm2, const ValueType &xm1, const ValueType &xm0, const ValueType &xp1, const ValueType &xp2)
Definition: FiniteDifference.h:1431
+
static Accessor::ValueType::value_type inZ(const Accessor &grid, const Coord &ijk, int n)
Definition: FiniteDifference.h:1550
+
static Stencil::ValueType::value_type inZ(const Stencil &S, int n)
Definition: FiniteDifference.h:1570
+
static Accessor::ValueType inY(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:620
+
static Accessor::ValueType inY(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:820
+
static Accessor::ValueType inZ(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1885
+
Definition: Exceptions.h:39
+
BiasedGradientScheme
Biased Gradients are limited to non-centered differences.
Definition: FiniteDifference.h:192
+
static Stencil::ValueType inZ(const Stencil &S)
Definition: FiniteDifference.h:1515
+
static ValueType difference(const ValueType &xm3, const ValueType &xm2, const ValueType &xm1, const ValueType &xm0)
Definition: FiniteDifference.h:1060
+
static Stencil::ValueType inX(const Stencil &S)
Definition: FiniteDifference.h:2067
+
static Stencil::ValueType inX(const Stencil &S)
Definition: FiniteDifference.h:1920
+
static Accessor::ValueType inY(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1454
+
static Accessor::ValueType inZ(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1086
+
static Stencil::ValueType inY(const Stencil &S)
Definition: FiniteDifference.h:1396
+
Definition: FiniteDifference.h:265
+
static Accessor::ValueType inXandZ(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1902
+
std::string biasedGradientSchemeToMenuName(BiasedGradientScheme bgs)
Definition: FiniteDifference.h:242
+
static ValueType difference(const ValueType &xp1, const ValueType &xm1)
Definition: FiniteDifference.h:492
+
static ValueType difference(const ValueType &xp3, const ValueType &xp2, const ValueType &xp1, const ValueType &xp0, const ValueType &xm1, const ValueType &xm2)
Definition: FiniteDifference.h:1229
+
static ValueType difference(const ValueType &xp1, const ValueType &xp0)
Definition: FiniteDifference.h:753
+
static Accessor::ValueType::value_type inY(const Accessor &grid, const Coord &ijk, int n)
Definition: FiniteDifference.h:1592
+
Definition: FiniteDifference.h:193
+
static Accessor::ValueType inX(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:2189
+
static Stencil::ValueType inZ(const Stencil &S)
Definition: FiniteDifference.h:1211
+
static Accessor::ValueType inY(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1012
+
static Accessor::ValueType inX(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:951
+
static Stencil::ValueType inY(const Stencil &S)
Definition: FiniteDifference.h:919
+
static Accessor::ValueType inX(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1139
+
static Accessor::ValueType inY(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:562
+
static ValueType difference(const ValueType &xp3, const ValueType &xp2, const ValueType &xp1, const ValueType &xp0)
Definition: FiniteDifference.h:872
+
static ValueType difference(const ValueType &xp3, const ValueType &xp2, const ValueType &xp1, const ValueType &xm1, const ValueType &xm2, const ValueType &xm3)
Definition: FiniteDifference.h:673
+
static Stencil::ValueType::value_type inY(const Stencil &S, int n)
Definition: FiniteDifference.h:1668
+
static Accessor::ValueType::value_type inY(const Accessor &grid, const Coord &ijk, int n)
Definition: FiniteDifference.h:1761
+
Definition: FiniteDifference.h:70
+
Definition: FiniteDifference.h:179
+
Definition: FiniteDifference.h:62
+
static Stencil::ValueType::value_type inX(const Stencil &S, int n)
Definition: FiniteDifference.h:1558
+
static Stencil::ValueType inY(const Stencil &S)
Definition: FiniteDifference.h:722
+
static Accessor::ValueType::value_type inZ(const Accessor &grid, const Coord &ijk, int n)
Definition: FiniteDifference.h:1600
+
static Accessor::ValueType::value_type inX(const Accessor &grid, const Coord &ijk, int n)
Definition: FiniteDifference.h:1636
+
static ValueType crossdifference(const ValueType &xpyp, const ValueType &xpym, const ValueType &xmyp, const ValueType &xmym)
Definition: FiniteDifference.h:1862
+
static Stencil::ValueType inY(const Stencil &S)
Definition: FiniteDifference.h:1500
+
static Accessor::ValueType inY(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:2007
+
Definition: FiniteDifference.h:68
+
ValueType WENO5(const ValueType &v1, const ValueType &v2, const ValueType &v3, const ValueType &v4, const ValueType &v5, float scale2=0.01f)
Implementation of nominally fifth-order finite-difference WENO.
Definition: FiniteDifference.h:331
+
static Accessor::ValueType::value_type inX(const Accessor &grid, const Coord &ijk, int n)
Definition: FiniteDifference.h:1584
+
static Accessor::ValueType inZ(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:514
+
Definition: FiniteDifference.h:60
+
Definition: FiniteDifference.h:184
+
static Stencil::ValueType inZ(const Stencil &S)
Definition: FiniteDifference.h:734
+
static Stencil::ValueType::value_type inX(const Stencil &S, int n)
Definition: FiniteDifference.h:1718
+
static Stencil::ValueType inXandZ(const Stencil &S)
Definition: FiniteDifference.h:1949
+
static Accessor::ValueType inY(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1253
+
std::string temporalIntegrationSchemeToMenuName(TemporalIntegrationScheme tis)
Definition: FiniteDifference.h:304
+
Definition: FiniteDifference.h:74
+
static Accessor::ValueType inX(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1068
+
static Accessor::ValueType::value_type inY(const Accessor &grid, const Coord &ijk, int n)
Definition: FiniteDifference.h:1700
+
static Stencil::ValueType::value_type inX(const Stencil &S, int n)
Definition: FiniteDifference.h:1608
+
Real GodunovsNormSqrd(bool isOutside, const Vec3< Real > &gradient_m, const Vec3< Real > &gradient_p)
Definition: FiniteDifference.h:386
+
static Accessor::ValueType inZ(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:701
+
const Type & Max(const Type &a, const Type &b)
Return the maximum of two values.
Definition: Math.h:561
+
static Stencil::ValueType::value_type inX(const Stencil &S, int n)
Definition: FiniteDifference.h:1661
+
static Accessor::ValueType inY(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:506
+
Definition: FiniteDifference.h:464
+
static Accessor::ValueType inXandY(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1893
+
static Accessor::ValueType inZ(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1169
+
static Accessor::ValueType::value_type inY(const Accessor &grid, const Coord &ijk, int n)
Definition: FiniteDifference.h:1644
+
std::string dsSchemeToMenuName(DScheme dss)
Definition: FiniteDifference.h:147
+
static Stencil::ValueType inX(const Stencil &S)
Definition: FiniteDifference.h:1185
+
static Accessor::ValueType inXandY(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:2026
+
static Stencil::ValueType inZ(const Stencil &S)
Definition: FiniteDifference.h:928
+
DScheme stringToDScheme(const std::string &s)
Definition: FiniteDifference.h:105
+
static Accessor::ValueType inXandZ(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:2039
+
static Stencil::ValueType inXandY(const Stencil &S)
Definition: FiniteDifference.h:2298
+
static Stencil::ValueType::value_type inY(const Stencil &S, int n)
Definition: FiniteDifference.h:1791
+
static Stencil::ValueType inZ(const Stencil &S)
Definition: FiniteDifference.h:1411
+
static Accessor::ValueType inXandZ(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:2236
+
static Accessor::ValueType inX(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1439
+
Definition: FiniteDifference.h:61
+
static Accessor::ValueType inX(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1335
+
static ValueType difference(const ValueType &xp2, const ValueType &xp1, const ValueType &xp0, const ValueType &xm1, const ValueType &xm2)
Definition: FiniteDifference.h:1970
+
static Accessor::ValueType inZ(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1469
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
static Stencil::ValueType inX(const Stencil &S)
Definition: FiniteDifference.h:1485
+
std::string dsSchemeToString(DScheme dss)
Definition: FiniteDifference.h:81
+
static Accessor::ValueType inZ(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:629
+
static Accessor::ValueType inZ(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:2016
+
Definition: FiniteDifference.h:196
+
static Accessor::ValueType::value_type inY(const Accessor &grid, const Coord &ijk, int n)
Definition: FiniteDifference.h:1544
+
Definition: FiniteDifference.h:180
+
static Accessor::ValueType::value_type inX(const Accessor &grid, const Coord &ijk, int n)
Definition: FiniteDifference.h:1691
+
Definition: FiniteDifference.h:66
+
Definition: FiniteDifference.h:64
+
static Stencil::ValueType inY(const Stencil &S)
Definition: FiniteDifference.h:785
+
Definition: FiniteDifference.h:264
+
Definition: FiniteDifference.h:77
+
static Stencil::ValueType inY(const Stencil &S)
Definition: FiniteDifference.h:848
+
static Stencil::ValueType inY(const Stencil &S)
Definition: FiniteDifference.h:1105
+
static Stencil::ValueType inYandZ(const Stencil &S)
Definition: FiniteDifference.h:2344
+
Definition: FiniteDifference.h:65
+
static Accessor::ValueType inX(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:683
+
static Stencil::ValueType::value_type inY(const Stencil &S, int n)
Definition: FiniteDifference.h:1564
+
static Accessor::ValueType inX(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:1870
+
static Accessor::ValueType inYandZ(const Accessor &grid, const Coord &ijk)
Definition: FiniteDifference.h:2052
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/Formats_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/Formats_8h_source.html new file mode 100644 index 00000000..49a37ed3 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/Formats_8h_source.html @@ -0,0 +1,227 @@ + + + + + + +OpenVDB: Formats.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Formats.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
36 
+
37 
+
38 #ifndef OPENVDB_UTIL_FORMATS_HAS_BEEN_INCLUDED
+
39 #define OPENVDB_UTIL_FORMATS_HAS_BEEN_INCLUDED
+
40 
+
41 #include <iosfwd>
+
42 #include <sstream>
+
43 #include <string>
+
44 #include <openvdb/version.h>
+
45 #include <openvdb/Platform.h>
+
46 
+
47 
+
48 namespace openvdb {
+ +
50 namespace OPENVDB_VERSION_NAME {
+
51 namespace util {
+
52 
+
62 OPENVDB_API int
+
63 printBytes(std::ostream& os, uint64_t bytes,
+
64  const std::string& head = "",
+
65  const std::string& tail = "\n",
+
66  bool exact = false, int width = 8, int precision = 3);
+
67 
+
77 OPENVDB_API int
+
78 printNumber(std::ostream& os, uint64_t number,
+
79  const std::string& head = "",
+
80  const std::string& tail = "\n",
+
81  bool exact = true, int width = 8, int precision = 3);
+
82 
+
83 
+
85 
+
86 
+
88 template<typename IntT>
+ +
90 {
+
91 public:
+
92  static char sep() { return ','; }
+
93 
+
94  FormattedInt(IntT n): mInt(n) {}
+
95 
+
96  std::ostream& put(std::ostream& os) const
+
97  {
+
98  // Convert the integer to a string.
+
99  std::ostringstream ostr;
+
100  ostr << mInt;
+
101  std::string s = ostr.str();
+
102  // Prefix the string with spaces if its length is not a multiple of three.
+
103  size_t padding = (s.size() % 3) ? 3 - (s.size() % 3) : 0;
+
104  s = std::string(padding, ' ') + s;
+
105  // Construct a new string in which groups of three digits are followed
+
106  // by a separator character.
+
107  ostr.str("");
+
108  for (size_t i = 0, N = s.size(); i < N; ) {
+
109  ostr << s[i];
+
110  ++i;
+
111  if (i >= padding && i % 3 == 0 && i < s.size()) {
+
112  ostr << sep();
+
113  }
+
114  }
+
115  // Remove any padding that was added and output the string.
+
116  s = ostr.str();
+
117  os << s.substr(padding, s.size());
+
118  return os;
+
119  }
+
120 
+
121 private:
+
122  IntT mInt;
+
123 };
+
124 
+
125 template<typename IntT>
+
126 std::ostream& operator<<(std::ostream& os, const FormattedInt<IntT>& n) { return n.put(os); }
+
127 
+
129 template<typename IntT>
+ +
131 
+
132 } // namespace util
+
133 } // namespace OPENVDB_VERSION_NAME
+
134 } // namespace openvdb
+
135 
+
136 #endif // OPENVDB_UTIL_FORMATS_HAS_BEEN_INCLUDED
+
137 
+
138 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
139 // All rights reserved. This software is distributed under the
+
140 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
#define OPENVDB_API
Helper macros for defining library symbol visibility.
Definition: Platform.h:195
+
OPENVDB_API int printNumber(std::ostream &os, uint64_t number, const std::string &head="", const std::string &tail="\n", bool exact=true, int width=8, int precision=3)
+
std::ostream & put(std::ostream &os) const
Definition: Formats.h:96
+
static char sep()
Definition: Formats.h:92
+
FormattedInt< IntT > formattedInt(IntT n)
Definition: Formats.h:130
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
FormattedInt(IntT n)
Definition: Formats.h:94
+
Definition: Exceptions.h:39
+ +
I/O manipulator that formats integer values with thousands separators.
Definition: Formats.h:89
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
OPENVDB_API int printBytes(std::ostream &os, uint64_t bytes, const std::string &head="", const std::string &tail="\n", bool exact=false, int width=8, int precision=3)
+ +
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/FreeSans.ttf b/nuparu/include/openvdb/share/doc/openvdb/html/FreeSans.ttf new file mode 100644 index 00000000..b550b90b Binary files /dev/null and b/nuparu/include/openvdb/share/doc/openvdb/html/FreeSans.ttf differ diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/GridDescriptor_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/GridDescriptor_8h_source.html new file mode 100644 index 00000000..cac2c9aa --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/GridDescriptor_8h_source.html @@ -0,0 +1,230 @@ + + + + + + +OpenVDB: GridDescriptor.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
GridDescriptor.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 
+
31 #ifndef OPENVDB_IO_GRIDDESCRIPTOR_HAS_BEEN_INCLUDED
+
32 #define OPENVDB_IO_GRIDDESCRIPTOR_HAS_BEEN_INCLUDED
+
33 
+
34 #include <openvdb/Grid.h>
+
35 #include <iostream>
+
36 #include <boost/cstdint.hpp>
+
37 
+
38 namespace openvdb {
+ +
40 namespace OPENVDB_VERSION_NAME {
+
41 namespace io {
+
42 
+ +
47 {
+
48 public:
+ +
50  GridDescriptor(const Name& name, const Name& gridType, bool saveFloatAsHalf = false);
+
51 
+
52  ~GridDescriptor();
+
53 
+
54  const Name& gridType() const { return mGridType; }
+
55  const Name& gridName() const { return mGridName; }
+
56  const Name& uniqueName() const { return mUniqueName; }
+
57 
+
58  const Name& instanceParentName() const { return mInstanceParentName; }
+
59  void setInstanceParentName(const Name& name) { mInstanceParentName = name; }
+
60  bool isInstance() const { return !mInstanceParentName.empty(); }
+
61 
+
62  bool saveFloatAsHalf() const { return mSaveFloatAsHalf; }
+
63 
+
64  void setGridPos(boost::int64_t pos) { mGridPos = pos; }
+
65  boost::int64_t getGridPos() const { return mGridPos; }
+
66 
+
67  void setBlockPos(boost::int64_t pos) { mBlockPos = pos; }
+
68  boost::int64_t getBlockPos() const { return mBlockPos; }
+
69 
+
70  void setEndPos(boost::int64_t pos) { mEndPos = pos; }
+
71  boost::int64_t getEndPos() const { return mEndPos; }
+
72 
+
73  // These methods seek to the right position in the given stream.
+
74  void seekToGrid(std::istream&) const;
+
75  void seekToBlocks(std::istream&) const;
+
76  void seekToEnd(std::istream&) const;
+
77 
+
78  void seekToGrid(std::ostream&) const;
+
79  void seekToBlocks(std::ostream&) const;
+
80  void seekToEnd(std::ostream&) const;
+
81 
+
84  void writeHeader(std::ostream&) const;
+
85 
+
88  void writeStreamPos(std::ostream&) const;
+
89 
+
92  GridBase::Ptr read(std::istream&);
+
93 
+
96  static Name addSuffix(const Name&, int n);
+
99  static Name stripSuffix(const Name&);
+
102  static std::string nameAsString(const Name&);
+
106  static Name stringAsUniqueName(const std::string&);
+
107 
+
108 private:
+
110  Name mGridName;
+
112  Name mUniqueName;
+
114  Name mInstanceParentName;
+
116  Name mGridType;
+
118  bool mSaveFloatAsHalf;
+
120  boost::int64_t mGridPos;
+
122  boost::int64_t mBlockPos;
+
124  boost::int64_t mEndPos;
+
125 };
+
126 
+
127 } // namespace io
+
128 } // namespace OPENVDB_VERSION_NAME
+
129 } // namespace openvdb
+
130 
+
131 #endif // OPENVDB_IO_GRIDDESCRIPTOR_HAS_BEEN_INCLUDED
+
132 
+
133 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
134 // All rights reserved. This software is distributed under the
+
135 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
void setBlockPos(boost::int64_t pos)
Definition: GridDescriptor.h:67
+
#define OPENVDB_API
Helper macros for defining library symbol visibility.
Definition: Platform.h:195
+
void setInstanceParentName(const Name &name)
Definition: GridDescriptor.h:59
+
const Name & instanceParentName() const
Definition: GridDescriptor.h:58
+
const Name & gridName() const
Definition: GridDescriptor.h:55
+
boost::int64_t getEndPos() const
Definition: GridDescriptor.h:71
+
std::string Name
Definition: Name.h:44
+
const Name & gridType() const
Definition: GridDescriptor.h:54
+
boost::int64_t getBlockPos() const
Definition: GridDescriptor.h:68
+
Definition: GridDescriptor.h:46
+
void setGridPos(boost::int64_t pos)
Definition: GridDescriptor.h:64
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
const Name & uniqueName() const
Definition: GridDescriptor.h:56
+
Definition: Exceptions.h:39
+
bool saveFloatAsHalf() const
Definition: GridDescriptor.h:62
+
boost::int64_t getGridPos() const
Definition: GridDescriptor.h:65
+ +
boost::shared_ptr< GridBase > Ptr
Definition: Grid.h:106
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
void setEndPos(boost::int64_t pos)
Definition: GridDescriptor.h:70
+
bool isInstance() const
Definition: GridDescriptor.h:60
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/GridOperators_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/GridOperators_8h_source.html new file mode 100644 index 00000000..57e29a80 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/GridOperators_8h_source.html @@ -0,0 +1,1279 @@ + + + + + + +OpenVDB: GridOperators.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
GridOperators.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
35 
+
36 #ifndef OPENVDB_TOOLS_GRID_OPERATORS_HAS_BEEN_INCLUDED
+
37 #define OPENVDB_TOOLS_GRID_OPERATORS_HAS_BEEN_INCLUDED
+
38 
+
39 #include <openvdb/Grid.h>
+
40 #include <openvdb/math/Operators.h>
+ + + +
44 #include <tbb/parallel_for.h>
+
45 
+
46 
+
47 namespace openvdb {
+ +
49 namespace OPENVDB_VERSION_NAME {
+
50 namespace tools {
+
51 
+
56 template<typename VectorGridType> struct VectorToScalarConverter {
+
57  typedef typename VectorGridType::ValueType::value_type VecComponentValueT;
+
58  typedef typename VectorGridType::template ValueConverter<VecComponentValueT>::Type Type;
+
59 };
+
60 
+
65 template<typename ScalarGridType> struct ScalarToVectorConverter {
+ +
67  typedef typename ScalarGridType::template ValueConverter<VectorValueT>::Type Type;
+
68 };
+
69 
+
70 
+
81 template<typename GridType, typename InterruptT> inline
+ +
83 cpt(const GridType& grid, bool threaded, InterruptT* interrupt);
+
84 
+
85 template<typename GridType, typename MaskT, typename InterruptT> inline
+ +
87 cpt(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt);
+
88 
+
89 template<typename GridType> inline
+ +
91 cpt(const GridType& grid, bool threaded = true)
+
92 {
+
93  return cpt<GridType, util::NullInterrupter>(grid, threaded, NULL);
+
94 }
+
95 
+
96 template<typename GridType, typename MaskT> inline
+
97 typename ScalarToVectorConverter<GridType>::Type::Ptr
+
98 cpt(const GridType& grid, const MaskT& mask, bool threaded = true)
+
99 {
+
100  return cpt<GridType, MaskT, util::NullInterrupter>(grid, mask, threaded, NULL);
+
101 }
+
102 
+
103 
+
109 template<typename GridType, typename InterruptT> inline
+
110 typename GridType::Ptr
+
111 curl(const GridType& grid, bool threaded, InterruptT* interrupt);
+
112 
+
113 template<typename GridType, typename MaskT, typename InterruptT> inline
+
114 typename GridType::Ptr
+
115 curl(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt);
+
116 
+
117 template<typename GridType> inline
+
118 typename GridType::Ptr
+
119 curl(const GridType& grid, bool threaded = true)
+
120 {
+
121  return curl<GridType, util::NullInterrupter>(grid, threaded, NULL);
+
122 }
+
123 
+
124 template<typename GridType, typename MaskT> inline
+
125 typename GridType::Ptr
+
126 curl(const GridType& grid, const MaskT& mask, bool threaded = true)
+
127 {
+
128  return curl<GridType, MaskT, util::NullInterrupter>(grid, mask, threaded, NULL);
+
129 }
+
130 
+
131 
+
138 template<typename GridType, typename InterruptT> inline
+
139 typename VectorToScalarConverter<GridType>::Type::Ptr
+
140 divergence(const GridType& grid, bool threaded, InterruptT* interrupt);
+
141 
+
142 template<typename GridType, typename MaskT, typename InterruptT> inline
+
143 typename VectorToScalarConverter<GridType>::Type::Ptr
+
144 divergence(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt);
+
145 
+
146 template<typename GridType> inline
+
147 typename VectorToScalarConverter<GridType>::Type::Ptr
+
148 divergence(const GridType& grid, bool threaded = true)
+
149 {
+
150  return divergence<GridType, util::NullInterrupter>(grid, threaded, NULL);
+
151 }
+
152 
+
153 template<typename GridType, typename MaskT> inline
+
154 typename VectorToScalarConverter<GridType>::Type::Ptr
+
155 divergence(const GridType& grid, const MaskT& mask, bool threaded = true)
+
156 {
+
157  return divergence<GridType, MaskT, util::NullInterrupter>(grid, mask, threaded, NULL);
+
158 }
+
159 
+
160 
+
167 template<typename GridType, typename InterruptT> inline
+
168 typename ScalarToVectorConverter<GridType>::Type::Ptr
+
169 gradient(const GridType& grid, bool threaded, InterruptT* interrupt);
+
170 
+
171 template<typename GridType, typename MaskT, typename InterruptT> inline
+
172 typename ScalarToVectorConverter<GridType>::Type::Ptr
+
173 gradient(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt);
+
174 
+
175 template<typename GridType> inline
+
176 typename ScalarToVectorConverter<GridType>::Type::Ptr
+
177 gradient(const GridType& grid, bool threaded = true)
+
178 {
+
179  return gradient<GridType, util::NullInterrupter>(grid, threaded, NULL);
+
180 }
+
181 
+
182 template<typename GridType, typename MaskT> inline
+
183 typename ScalarToVectorConverter<GridType>::Type::Ptr
+
184 gradient(const GridType& grid, const MaskT& mask, bool threaded = true)
+
185 {
+
186  return gradient<GridType, MaskT, util::NullInterrupter>(grid, mask, threaded, NULL);
+
187 }
+
188 
+
189 
+
195 template<typename GridType, typename InterruptT> inline
+
196 typename GridType::Ptr
+
197 laplacian(const GridType& grid, bool threaded, InterruptT* interrupt);
+
198 
+
199 template<typename GridType, typename MaskT, typename InterruptT> inline
+
200 typename GridType::Ptr
+
201 laplacian(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt);
+
202 
+
203 template<typename GridType> inline
+
204 typename GridType::Ptr
+
205 laplacian(const GridType& grid, bool threaded = true)
+
206 {
+
207  return laplacian<GridType, util::NullInterrupter>(grid, threaded, NULL);
+
208 }
+
209 
+
210 template<typename GridType, typename MaskT> inline
+
211 typename GridType::Ptr
+
212 laplacian(const GridType& grid, const MaskT mask, bool threaded = true)
+
213 {
+
214  return laplacian<GridType, MaskT, util::NullInterrupter>(grid, mask, threaded, NULL);
+
215 }
+
216 
+
217 
+
223 template<typename GridType, typename InterruptT> inline
+
224 typename GridType::Ptr
+
225 meanCurvature(const GridType& grid, bool threaded, InterruptT* interrupt);
+
226 
+
227 template<typename GridType, typename MaskT, typename InterruptT> inline
+
228 typename GridType::Ptr
+
229 meanCurvature(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt);
+
230 
+
231 template<typename GridType> inline
+
232 typename GridType::Ptr
+
233 meanCurvature(const GridType& grid, bool threaded = true)
+
234 {
+
235  return meanCurvature<GridType, util::NullInterrupter>(grid, threaded, NULL);
+
236 }
+
237 
+
238 template<typename GridType, typename MaskT> inline
+
239 typename GridType::Ptr
+
240 meanCurvature(const GridType& grid, const MaskT& mask, bool threaded = true)
+
241 {
+
242  return meanCurvature<GridType, MaskT, util::NullInterrupter>(grid, mask, threaded, NULL);
+
243 }
+
244 
+
245 
+
252 template<typename GridType, typename InterruptT> inline
+
253 typename VectorToScalarConverter<GridType>::Type::Ptr
+
254 magnitude(const GridType& grid, bool threaded, InterruptT* interrupt);
+
255 
+
256 template<typename GridType, typename MaskT, typename InterruptT> inline
+
257 typename VectorToScalarConverter<GridType>::Type::Ptr
+
258 magnitude(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt);
+
259 
+
260 template<typename GridType> inline
+
261 typename VectorToScalarConverter<GridType>::Type::Ptr
+
262 magnitude(const GridType& grid, bool threaded = true)
+
263 {
+
264  return magnitude<GridType, util::NullInterrupter>(grid, threaded, NULL);
+
265 }
+
266 
+
267 template<typename GridType, typename MaskT> inline
+
268 typename VectorToScalarConverter<GridType>::Type::Ptr
+
269 magnitude(const GridType& grid, const MaskT& mask, bool threaded = true)
+
270 {
+
271  return magnitude<GridType, MaskT, util::NullInterrupter>(grid, mask, threaded, NULL);
+
272 }
+
273 
+
274 
+
280 template<typename GridType, typename InterruptT> inline
+
281 typename GridType::Ptr
+
282 normalize(const GridType& grid, bool threaded, InterruptT* interrupt);
+
283 
+
284 template<typename GridType, typename MaskT, typename InterruptT> inline
+
285 typename GridType::Ptr
+
286 normalize(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt);
+
287 
+
288 template<typename GridType> inline
+
289 typename GridType::Ptr
+
290 normalize(const GridType& grid, bool threaded = true)
+
291 {
+
292  return normalize<GridType, util::NullInterrupter>(grid, threaded, NULL);
+
293 }
+
294 
+
295 template<typename GridType, typename MaskT> inline
+
296 typename GridType::Ptr
+
297 normalize(const GridType& grid, const MaskT& mask, bool threaded = true)
+
298 {
+
299  return normalize<GridType, MaskT, util::NullInterrupter>(grid, mask, threaded, NULL);
+
300 }
+
301 
+
302 
+
304 
+
305 
+
306 namespace gridop {
+
307 
+
311 template<typename GridType>
+
312 struct ToMaskGrid {
+ +
314 };
+
315 
+
316 
+
326 template<
+
327  typename InGridT,
+
328  typename MaskGridType,
+
329  typename OutGridT,
+
330  typename MapT,
+
331  typename OperatorT,
+
332  typename InterruptT = util::NullInterrupter>
+ +
334 {
+
335 public:
+
336  typedef typename OutGridT::TreeType OutTreeT;
+
337  typedef typename OutTreeT::LeafNodeType OutLeafT;
+ +
339 
+
340  GridOperator(const InGridT& grid, const MaskGridType* mask, const MapT& map,
+
341  InterruptT* interrupt = NULL):
+
342  mAcc(grid.getConstAccessor()), mMap(map), mInterrupt(interrupt), mMask(mask)
+
343  {
+
344  }
+
345 
+
346  virtual ~GridOperator() {}
+
347  typename OutGridT::Ptr process(bool threaded = true)
+
348  {
+
349  if (mInterrupt) mInterrupt->start("Processing grid");
+
350 
+
351  // Derive background value of the output grid
+
352  typename InGridT::TreeType tmp(mAcc.tree().background());
+
353  typename OutGridT::ValueType backg = OperatorT::result(mMap, tmp, math::Coord(0));
+
354 
+
355  // output tree = topology copy of input tree!
+
356  typename OutTreeT::Ptr tree(new OutTreeT(mAcc.tree(), backg, TopologyCopy()));
+
357 
+
358 
+
359  // create grid with output tree and unit transform
+
360  typename OutGridT::Ptr result(new OutGridT(tree));
+
361 
+
362  // Modify the solution area if a mask was supplied.
+
363  if (mMask) {
+
364  result->topologyIntersection(*mMask);
+
365  }
+
366 
+
367  // transform of output grid = transform of input grid
+
368  result->setTransform(math::Transform::Ptr(new math::Transform( mMap.copy() )));
+
369 
+
370  LeafManagerT leafManager(*tree);
+
371 
+
372  if (threaded) {
+
373  tbb::parallel_for(leafManager.leafRange(), *this);
+
374  } else {
+
375  (*this)(leafManager.leafRange());
+
376  }
+
377 
+
378  if (mInterrupt) mInterrupt->end();
+
379  return result;
+
380  }
+
381 
+
388  void operator()(const typename LeafManagerT::LeafRange& range) const
+
389  {
+
390  if (util::wasInterrupted(mInterrupt)) tbb::task::self().cancel_group_execution();
+
391 
+
392  for (typename LeafManagerT::LeafRange::Iterator leaf=range.begin(); leaf; ++leaf) {
+
393  for (typename OutLeafT::ValueOnIter value=leaf->beginValueOn(); value; ++value) {
+
394  value.setValue(OperatorT::result(mMap, mAcc, value.getCoord()));
+
395  }
+
396  }
+
397  }
+
398 
+
399 protected:
+
400  typedef typename InGridT::ConstAccessor AccessorT;
+
401  mutable AccessorT mAcc;
+
402  const MapT& mMap;
+
403  InterruptT* mInterrupt;
+
404  const MaskGridType* mMask;
+
405 }; // end of GridOperator class
+
406 
+
407 } // namespace gridop
+
408 
+
409 
+
411 
+
412 
+
414 template<
+
415  typename InGridT,
+
416  typename MaskGridType = typename gridop::ToMaskGrid<InGridT>::Type,
+
417  typename InterruptT = util::NullInterrupter>
+
418 class Cpt
+
419 {
+
420 public:
+
421  typedef InGridT InGridType;
+ +
423 
+
424  Cpt(const InGridType& grid, InterruptT* interrupt = NULL):
+
425  mInputGrid(grid), mInterrupt(interrupt), mMask(NULL)
+
426  {
+
427  }
+
428 
+
429  Cpt(const InGridType& grid, const MaskGridType& mask, InterruptT* interrupt = NULL):
+
430  mInputGrid(grid), mInterrupt(interrupt), mMask(&mask)
+
431  {
+
432  }
+
433 
+
434  typename OutGridType::Ptr process(bool threaded = true, bool useWorldTransform = true)
+
435  {
+
436  Functor functor(mInputGrid, mMask, threaded, useWorldTransform, mInterrupt);
+
437  processTypedMap(mInputGrid.transform(), functor);
+
438  if (functor.mOutputGrid) functor.mOutputGrid->setVectorType(VEC_CONTRAVARIANT_ABSOLUTE);
+
439  return functor.mOutputGrid;
+
440  }
+
441 
+
442 private:
+
443  struct IsOpT
+
444  {
+
445  template<typename MapT, typename AccT>
+
446  static typename OutGridType::ValueType
+
447  result(const MapT& map, const AccT& acc, const Coord& xyz)
+
448  {
+
449  return math::CPT<MapT, math::CD_2ND>::result(map, acc, xyz);
+
450  }
+
451  };
+
452  struct WsOpT
+
453  {
+
454  template<typename MapT, typename AccT>
+
455  static typename OutGridType::ValueType
+
456  result(const MapT& map, const AccT& acc, const Coord& xyz)
+
457  {
+
458  return math::CPT_RANGE<MapT, math::CD_2ND>::result(map, acc, xyz);
+
459  }
+
460  };
+
461  struct Functor
+
462  {
+
463  Functor(const InGridType& grid, const MaskGridType* mask,
+
464  bool threaded, bool worldspace, InterruptT* interrupt)
+
465  : mThreaded(threaded)
+
466  , mWorldSpace(worldspace)
+
467  , mInputGrid(grid)
+
468  , mInterrupt(interrupt)
+
469  , mMask(mask)
+
470  {}
+
471 
+
472  template<typename MapT>
+
473  void operator()(const MapT& map)
+
474  {
+
475  if (mWorldSpace) {
+
476  gridop::GridOperator<InGridType, MaskGridType, OutGridType, MapT, WsOpT, InterruptT>
+
477  op(mInputGrid, mMask, map, mInterrupt);
+
478  mOutputGrid = op.process(mThreaded); // cache the result
+
479  } else {
+
480  gridop::GridOperator<InGridType, MaskGridType, OutGridType, MapT, IsOpT, InterruptT>
+
481  op(mInputGrid, mMask, map, mInterrupt);
+
482  mOutputGrid = op.process(mThreaded); // cache the result
+
483  }
+
484  }
+
485  const bool mThreaded;
+
486  const bool mWorldSpace;
+
487  const InGridType& mInputGrid;
+
488  typename OutGridType::Ptr mOutputGrid;
+
489  InterruptT* mInterrupt;
+
490  const MaskGridType* mMask;
+
491  };
+
492  const InGridType& mInputGrid;
+
493  InterruptT* mInterrupt;
+
494  const MaskGridType* mMask;
+
495 }; // end of Cpt class
+
496 
+
497 
+
499 
+
500 
+
502 template<
+
503  typename GridT,
+
504  typename MaskGridType = typename gridop::ToMaskGrid<GridT>::Type,
+
505  typename InterruptT = util::NullInterrupter>
+
506 class Curl
+
507 {
+
508 public:
+
509  typedef GridT InGridType;
+
510  typedef GridT OutGridType;
+
511 
+
512  Curl(const GridT& grid, InterruptT* interrupt = NULL):
+
513  mInputGrid(grid), mInterrupt(interrupt), mMask(NULL)
+
514  {
+
515  }
+
516 
+
517  Curl(const GridT& grid, const MaskGridType& mask, InterruptT* interrupt = NULL):
+
518  mInputGrid(grid), mInterrupt(interrupt), mMask(&mask)
+
519  {
+
520  }
+
521 
+
522  typename GridT::Ptr process(bool threaded = true)
+
523  {
+
524  Functor functor(mInputGrid, mMask, threaded, mInterrupt);
+
525  processTypedMap(mInputGrid.transform(), functor);
+
526  if (functor.mOutputGrid) functor.mOutputGrid->setVectorType(VEC_COVARIANT);
+
527  return functor.mOutputGrid;
+
528  }
+
529 
+
530 private:
+
531  struct Functor
+
532  {
+
533  Functor(const GridT& grid, const MaskGridType* mask,
+
534  bool threaded, InterruptT* interrupt):
+
535  mThreaded(threaded), mInputGrid(grid), mInterrupt(interrupt), mMask(mask) {}
+
536 
+
537  template<typename MapT>
+
538  void operator()(const MapT& map)
+
539  {
+
540  typedef math::Curl<MapT, math::CD_2ND> OpT;
+
541  gridop::GridOperator<GridT, MaskGridType, GridT, MapT, OpT, InterruptT>
+
542  op(mInputGrid, mMask, map, mInterrupt);
+
543  mOutputGrid = op.process(mThreaded); // cache the result
+
544  }
+
545 
+
546  const bool mThreaded;
+
547  const GridT& mInputGrid;
+
548  typename GridT::Ptr mOutputGrid;
+
549  InterruptT* mInterrupt;
+
550  const MaskGridType* mMask;
+
551  }; // Private Functor
+
552 
+
553  const GridT& mInputGrid;
+
554  InterruptT* mInterrupt;
+
555  const MaskGridType* mMask;
+
556 }; // end of Curl class
+
557 
+
558 
+
560 
+
561 
+
563 template<
+
564  typename InGridT,
+
565  typename MaskGridType = typename gridop::ToMaskGrid<InGridT>::Type,
+
566  typename InterruptT = util::NullInterrupter>
+ +
568 {
+
569 public:
+
570  typedef InGridT InGridType;
+ +
572 
+
573  Divergence(const InGridT& grid, InterruptT* interrupt = NULL):
+
574  mInputGrid(grid), mInterrupt(interrupt), mMask(NULL)
+
575  {
+
576  }
+
577 
+
578  Divergence(const InGridT& grid, const MaskGridType& mask, InterruptT* interrupt = NULL):
+
579  mInputGrid(grid), mInterrupt(interrupt), mMask(&mask)
+
580  {
+
581  }
+
582 
+
583  typename OutGridType::Ptr process(bool threaded = true)
+
584  {
+
585  if (mInputGrid.getGridClass() == GRID_STAGGERED) {
+
586  Functor<math::FD_1ST> functor(mInputGrid, mMask, threaded, mInterrupt);
+
587  processTypedMap(mInputGrid.transform(), functor);
+
588  return functor.mOutputGrid;
+
589  } else {
+
590  Functor<math::CD_2ND> functor(mInputGrid, mMask, threaded, mInterrupt);
+
591  processTypedMap(mInputGrid.transform(), functor);
+
592  return functor.mOutputGrid;
+
593  }
+
594  }
+
595 
+
596 protected:
+
597  template<math::DScheme DiffScheme>
+
598  struct Functor
+
599  {
+
600  Functor(const InGridT& grid, const MaskGridType* mask,
+
601  bool threaded, InterruptT* interrupt):
+
602  mThreaded(threaded), mInputGrid(grid), mInterrupt(interrupt), mMask(mask) {}
+
603 
+
604  template<typename MapT>
+
605  void operator()(const MapT& map)
+
606  {
+ + +
609  op(mInputGrid, mMask, map, mInterrupt);
+
610  mOutputGrid = op.process(mThreaded); // cache the result
+
611  }
+
612 
+
613  const bool mThreaded;
+
614  const InGridType& mInputGrid;
+
615  typename OutGridType::Ptr mOutputGrid;
+
616  InterruptT* mInterrupt;
+
617  const MaskGridType* mMask;
+
618  }; // Private Functor
+
619 
+
620  const InGridType& mInputGrid;
+
621  InterruptT* mInterrupt;
+
622  const MaskGridType* mMask;
+
623 }; // end of Divergence class
+
624 
+
625 
+
627 
+
628 
+
630 template<
+
631  typename InGridT,
+
632  typename MaskGridType = typename gridop::ToMaskGrid<InGridT>::Type,
+
633  typename InterruptT = util::NullInterrupter>
+
634 class Gradient
+
635 {
+
636 public:
+
637  typedef InGridT InGridType;
+ +
639 
+
640  Gradient(const InGridT& grid, InterruptT* interrupt = NULL):
+
641  mInputGrid(grid), mInterrupt(interrupt), mMask(NULL)
+
642  {
+
643  }
+
644 
+
645  Gradient(const InGridT& grid, const MaskGridType& mask, InterruptT* interrupt = NULL):
+
646  mInputGrid(grid), mInterrupt(interrupt), mMask(&mask)
+
647  {
+
648  }
+
649 
+
650  typename OutGridType::Ptr process(bool threaded = true)
+
651  {
+
652  Functor functor(mInputGrid, mMask, threaded, mInterrupt);
+
653  processTypedMap(mInputGrid.transform(), functor);
+
654  if (functor.mOutputGrid) functor.mOutputGrid->setVectorType(VEC_COVARIANT);
+
655  return functor.mOutputGrid;
+
656  }
+
657 
+
658 protected:
+
659  struct Functor
+
660  {
+
661  Functor(const InGridT& grid, const MaskGridType* mask,
+
662  bool threaded, InterruptT* interrupt):
+
663  mThreaded(threaded), mInputGrid(grid), mInterrupt(interrupt), mMask(mask) {}
+
664 
+
665  template<typename MapT>
+
666  void operator()(const MapT& map)
+
667  {
+ + +
670  op(mInputGrid, mMask, map, mInterrupt);
+
671  mOutputGrid = op.process(mThreaded); // cache the result
+
672  }
+
673 
+
674  const bool mThreaded;
+
675  const InGridT& mInputGrid;
+
676  typename OutGridType::Ptr mOutputGrid;
+
677  InterruptT* mInterrupt;
+
678  const MaskGridType* mMask;
+
679  }; // Private Functor
+
680 
+
681  const InGridT& mInputGrid;
+
682  InterruptT* mInterrupt;
+
683  const MaskGridType* mMask;
+
684 }; // end of Gradient class
+
685 
+
686 
+
688 
+
689 
+
690 template<
+
691  typename GridT,
+
692  typename MaskGridType = typename gridop::ToMaskGrid<GridT>::Type,
+
693  typename InterruptT = util::NullInterrupter>
+ +
695 {
+
696 public:
+
697  typedef GridT InGridType;
+
698  typedef GridT OutGridType;
+
699 
+
700  Laplacian(const GridT& grid, InterruptT* interrupt = NULL):
+
701  mInputGrid(grid), mInterrupt(interrupt), mMask(NULL)
+
702  {
+
703  }
+
704 
+
705  Laplacian(const GridT& grid, const MaskGridType& mask, InterruptT* interrupt = NULL):
+
706  mInputGrid(grid), mInterrupt(interrupt), mMask(&mask)
+
707  {
+
708  }
+
709 
+
710  typename GridT::Ptr process(bool threaded = true)
+
711  {
+
712  Functor functor(mInputGrid, mMask, threaded, mInterrupt);
+
713  processTypedMap(mInputGrid.transform(), functor);
+
714  if (functor.mOutputGrid) functor.mOutputGrid->setVectorType(VEC_COVARIANT);
+
715  return functor.mOutputGrid;
+
716  }
+
717 
+
718 protected:
+
719  struct Functor
+
720  {
+
721  Functor(const GridT& grid, const MaskGridType* mask, bool threaded, InterruptT* interrupt):
+
722  mThreaded(threaded), mInputGrid(grid), mInterrupt(interrupt), mMask(mask) {}
+
723 
+
724  template<typename MapT>
+
725  void operator()(const MapT& map)
+
726  {
+ + +
729  op(mInputGrid, mMask, map);
+
730  mOutputGrid = op.process(mThreaded); // cache the result
+
731  }
+
732 
+
733  const bool mThreaded;
+
734  const GridT& mInputGrid;
+
735  typename GridT::Ptr mOutputGrid;
+
736  InterruptT* mInterrupt;
+
737  const MaskGridType* mMask;
+
738  }; // Private Functor
+
739 
+
740  const GridT& mInputGrid;
+
741  InterruptT* mInterrupt;
+
742  const MaskGridType* mMask;
+
743 }; // end of Laplacian class
+
744 
+
745 
+
747 
+
748 
+
749 template<
+
750  typename GridT,
+
751  typename MaskGridType = typename gridop::ToMaskGrid<GridT>::Type,
+
752  typename InterruptT = util::NullInterrupter>
+ +
754 {
+
755 public:
+
756  typedef GridT InGridType;
+
757  typedef GridT OutGridType;
+
758 
+
759  MeanCurvature(const GridT& grid, InterruptT* interrupt = NULL):
+
760  mInputGrid(grid), mInterrupt(interrupt), mMask(NULL)
+
761  {
+
762  }
+
763 
+
764  MeanCurvature(const GridT& grid, const MaskGridType& mask, InterruptT* interrupt = NULL):
+
765  mInputGrid(grid), mInterrupt(interrupt), mMask(&mask)
+
766  {
+
767  }
+
768 
+
769  typename GridT::Ptr process(bool threaded = true)
+
770  {
+
771  Functor functor(mInputGrid, mMask, threaded, mInterrupt);
+
772  processTypedMap(mInputGrid.transform(), functor);
+
773  if (functor.mOutputGrid) functor.mOutputGrid->setVectorType(VEC_COVARIANT);
+
774  return functor.mOutputGrid;
+
775  }
+
776 
+
777 protected:
+
778  struct Functor
+
779  {
+
780  Functor(const GridT& grid, const MaskGridType* mask, bool threaded, InterruptT* interrupt):
+
781  mThreaded(threaded), mInputGrid(grid), mInterrupt(interrupt), mMask(mask) {}
+
782 
+
783  template<typename MapT>
+
784  void operator()(const MapT& map)
+
785  {
+ + +
788  op(mInputGrid, mMask, map);
+
789  mOutputGrid = op.process(mThreaded); // cache the result
+
790  }
+
791 
+
792  const bool mThreaded;
+
793  const GridT& mInputGrid;
+
794  typename GridT::Ptr mOutputGrid;
+
795  InterruptT* mInterrupt;
+
796  const MaskGridType* mMask;
+
797  }; // Private Functor
+
798 
+
799  const GridT& mInputGrid;
+
800  InterruptT* mInterrupt;
+
801  const MaskGridType* mMask;
+
802 }; // end of MeanCurvature class
+
803 
+
804 
+
806 
+
807 
+
808 template<
+
809  typename InGridT,
+
810  typename MaskGridType = typename gridop::ToMaskGrid<InGridT>::Type,
+
811  typename InterruptT = util::NullInterrupter>
+ +
813 {
+
814 public:
+
815  typedef InGridT InGridType;
+ +
817 
+
818  Magnitude(const InGridType& grid, InterruptT* interrupt = NULL):
+
819  mInputGrid(grid), mInterrupt(interrupt), mMask(NULL)
+
820  {
+
821  }
+
822 
+
823  Magnitude(const InGridType& grid, const MaskGridType& mask, InterruptT* interrupt = NULL):
+
824  mInputGrid(grid), mInterrupt(interrupt), mMask(&mask)
+
825  {
+
826  }
+
827 
+
828  typename OutGridType::Ptr process(bool threaded = true)
+
829  {
+
830  Functor functor(mInputGrid, mMask, threaded, mInterrupt);
+
831  processTypedMap(mInputGrid.transform(), functor);
+
832  return functor.mOutputGrid;
+
833  }
+
834 
+
835 protected:
+
836  struct OpT
+
837  {
+
838  template<typename MapT, typename AccT>
+
839  static typename OutGridType::ValueType
+
840  result(const MapT&, const AccT& acc, const Coord& xyz) { return acc.getValue(xyz).length();}
+
841  };
+
842  struct Functor
+
843  {
+
844  Functor(const InGridT& grid, const MaskGridType* mask,
+
845  bool threaded, InterruptT* interrupt):
+
846  mThreaded(threaded), mInputGrid(grid), mInterrupt(interrupt), mMask(mask) {}
+
847 
+
848  template<typename MapT>
+
849  void operator()(const MapT& map)
+
850  {
+ +
852  op(mInputGrid, mMask, map);
+
853  mOutputGrid = op.process(mThreaded); // cache the result
+
854  }
+
855 
+
856  const bool mThreaded;
+
857  const InGridType& mInputGrid;
+
858  typename OutGridType::Ptr mOutputGrid;
+
859  InterruptT* mInterrupt;
+
860  const MaskGridType* mMask;
+
861  }; // Private Functor
+
862 
+
863  const InGridType& mInputGrid;
+
864  InterruptT* mInterrupt;
+
865  const MaskGridType* mMask;
+
866 }; // end of Magnitude class
+
867 
+
868 
+
870 
+
871 
+
872 template<
+
873  typename GridT,
+
874  typename MaskGridType = typename gridop::ToMaskGrid<GridT>::Type,
+
875  typename InterruptT = util::NullInterrupter>
+ +
877 {
+
878 public:
+
879  typedef GridT InGridType;
+
880  typedef GridT OutGridType;
+
881 
+
882  Normalize(const GridT& grid, InterruptT* interrupt = NULL):
+
883  mInputGrid(grid), mInterrupt(interrupt), mMask(NULL)
+
884  {
+
885  }
+
886 
+
887  Normalize(const GridT& grid, const MaskGridType& mask, InterruptT* interrupt = NULL):
+
888  mInputGrid(grid), mInterrupt(interrupt), mMask(&mask)
+
889  {
+
890  }
+
891 
+
892  typename GridT::Ptr process(bool threaded = true)
+
893  {
+
894  Functor functor(mInputGrid, mMask, threaded, mInterrupt);
+
895  processTypedMap(mInputGrid.transform(), functor);
+
896  if (typename GridT::Ptr outGrid = functor.mOutputGrid) {
+
897  const VecType vecType = mInputGrid.getVectorType();
+
898  if (vecType == VEC_COVARIANT) {
+
899  outGrid->setVectorType(VEC_COVARIANT_NORMALIZE);
+
900  } else {
+
901  outGrid->setVectorType(vecType);
+
902  }
+
903  }
+
904  return functor.mOutputGrid;
+
905  }
+
906 
+
907 protected:
+
908  struct OpT
+
909  {
+
910  template<typename MapT, typename AccT>
+
911  static typename OutGridType::ValueType
+
912  result(const MapT&, const AccT& acc, const Coord& xyz)
+
913  {
+
914  typename OutGridType::ValueType vec = acc.getValue(xyz);
+
915  if ( !vec.normalize() ) vec.setZero();
+
916  return vec;
+
917  }
+
918  };
+
919  struct Functor
+
920  {
+
921  Functor(const GridT& grid, const MaskGridType* mask, bool threaded, InterruptT* interrupt):
+
922  mThreaded(threaded), mInputGrid(grid), mInterrupt(interrupt), mMask(mask) {}
+
923 
+
924  template<typename MapT>
+
925  void operator()(const MapT& map)
+
926  {
+ +
928  op(mInputGrid, mMask,map);
+
929  mOutputGrid = op.process(mThreaded); // cache the result
+
930  }
+
931 
+
932  const bool mThreaded;
+
933  const GridT& mInputGrid;
+
934  typename GridT::Ptr mOutputGrid;
+
935  InterruptT* mInterrupt;
+
936  const MaskGridType* mMask;
+
937  }; // Private Functor
+
938 
+
939  const GridT& mInputGrid;
+
940  InterruptT* mInterrupt;
+
941  const MaskGridType* mMask;
+
942 }; // end of Normalize class
+
943 
+
944 
+
946 
+
947 
+
948 template<typename GridType, typename InterruptT> inline
+ +
950 cpt(const GridType& grid, bool threaded, InterruptT* interrupt)
+
951 {
+
952  Cpt<GridType, typename gridop::ToMaskGrid<GridType>::Type, InterruptT> op(grid, interrupt);
+
953  return op.process(threaded);
+
954 }
+
955 
+
956 template<typename GridType, typename MaskT, typename InterruptT> inline
+
957 typename ScalarToVectorConverter<GridType>::Type::Ptr
+
958 cpt(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt)
+
959 {
+
960  Cpt<GridType, MaskT, InterruptT> op(grid, mask, interrupt);
+
961  return op.process(threaded);
+
962 }
+
963 
+
964 template<typename GridType, typename InterruptT> inline
+
965 typename GridType::Ptr
+
966 curl(const GridType& grid, bool threaded, InterruptT* interrupt)
+
967 {
+
968  Curl<GridType, typename gridop::ToMaskGrid<GridType>::Type, InterruptT> op(grid, interrupt);
+
969  return op.process(threaded);
+
970 }
+
971 
+
972 template<typename GridType, typename MaskT, typename InterruptT> inline
+
973 typename GridType::Ptr
+
974 curl(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt)
+
975 {
+
976  Curl<GridType, MaskT, InterruptT> op(grid, mask, interrupt);
+
977  return op.process(threaded);
+
978 }
+
979 
+
980 template<typename GridType, typename InterruptT> inline
+
981 typename VectorToScalarConverter<GridType>::Type::Ptr
+
982 divergence(const GridType& grid, bool threaded, InterruptT* interrupt)
+
983 {
+ +
985  op(grid, interrupt);
+
986  return op.process(threaded);
+
987 }
+
988 
+
989 template<typename GridType, typename MaskT, typename InterruptT> inline
+
990 typename VectorToScalarConverter<GridType>::Type::Ptr
+
991 divergence(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt)
+
992 {
+
993  Divergence<GridType, MaskT, InterruptT> op(grid, mask, interrupt);
+
994  return op.process(threaded);
+
995 }
+
996 
+
997 template<typename GridType, typename InterruptT> inline
+
998 typename ScalarToVectorConverter<GridType>::Type::Ptr
+
999 gradient(const GridType& grid, bool threaded, InterruptT* interrupt)
+
1000 {
+ +
1002  op(grid, interrupt);
+
1003  return op.process(threaded);
+
1004 }
+
1005 
+
1006 template<typename GridType, typename MaskT, typename InterruptT> inline
+
1007 typename ScalarToVectorConverter<GridType>::Type::Ptr
+
1008 gradient(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt)
+
1009 {
+
1010  Gradient<GridType, MaskT, InterruptT> op(grid, mask, interrupt);
+
1011  return op.process(threaded);
+
1012 }
+
1013 
+
1014 template<typename GridType, typename InterruptT> inline
+
1015 typename GridType::Ptr
+
1016 laplacian(const GridType& grid, bool threaded, InterruptT* interrupt)
+
1017 {
+ +
1019  op(grid, interrupt);
+
1020  return op.process(threaded);
+
1021 }
+
1022 
+
1023 template<typename GridType, typename MaskT, typename InterruptT> inline
+
1024 typename GridType::Ptr
+
1025 laplacian(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt)
+
1026 {
+
1027  Laplacian<GridType, MaskT, InterruptT> op(grid, mask, interrupt);
+
1028  return op.process(threaded);
+
1029 }
+
1030 
+
1031 template<typename GridType, typename InterruptT> inline
+
1032 typename GridType::Ptr
+
1033 meanCurvature(const GridType& grid, bool threaded, InterruptT* interrupt)
+
1034 {
+ +
1036  op(grid, interrupt);
+
1037  return op.process(threaded);
+
1038 }
+
1039 
+
1040 template<typename GridType, typename MaskT, typename InterruptT> inline
+
1041 typename GridType::Ptr
+
1042 meanCurvature(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt)
+
1043 {
+
1044  MeanCurvature<GridType, MaskT, InterruptT> op(grid, mask, interrupt);
+
1045  return op.process(threaded);
+
1046 }
+
1047 
+
1048 template<typename GridType, typename InterruptT> inline
+
1049 typename VectorToScalarConverter<GridType>::Type::Ptr
+
1050 magnitude(const GridType& grid, bool threaded, InterruptT* interrupt)
+
1051 {
+ +
1053  op(grid, interrupt);
+
1054  return op.process(threaded);
+
1055 }
+
1056 
+
1057 template<typename GridType, typename MaskT, typename InterruptT> inline
+
1058 typename VectorToScalarConverter<GridType>::Type::Ptr
+
1059 magnitude(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt)
+
1060 {
+
1061  Magnitude<GridType, MaskT, InterruptT> op(grid, mask, interrupt);
+
1062  return op.process(threaded);
+
1063 }
+
1064 
+
1065 template<typename GridType, typename InterruptT> inline
+
1066 typename GridType::Ptr
+
1067 normalize(const GridType& grid, bool threaded, InterruptT* interrupt)
+
1068 {
+ +
1070  op(grid, interrupt);
+
1071  return op.process(threaded);
+
1072 }
+
1073 
+
1074 template<typename GridType, typename MaskT, typename InterruptT> inline
+
1075 typename GridType::Ptr
+
1076 normalize(const GridType& grid, const MaskT& mask, bool threaded, InterruptT* interrupt)
+
1077 {
+
1078  Normalize<GridType, MaskT, InterruptT> op(grid, mask, interrupt);
+
1079  return op.process(threaded);
+
1080 }
+
1081 
+
1082 } // namespace tools
+
1083 } // namespace OPENVDB_VERSION_NAME
+
1084 } // namespace openvdb
+
1085 
+
1086 #endif // OPENVDB_TOOLS_GRID_OPERATORS_HAS_BEEN_INCLUDED
+
1087 
+
1088 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
1089 // All rights reserved. This software is distributed under the
+
1090 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
GridT::Ptr process(bool threaded=true)
Definition: GridOperators.h:710
+
Definition: GridOperators.h:836
+
const MaskGridType * mMask
Definition: GridOperators.h:860
+
Magnitude(const InGridType &grid, InterruptT *interrupt=NULL)
Definition: GridOperators.h:818
+
Functor(const GridT &grid, const MaskGridType *mask, bool threaded, InterruptT *interrupt)
Definition: GridOperators.h:780
+
ScalarToVectorConverter< InGridT >::Type OutGridType
Definition: GridOperators.h:422
+
VectorGridType::template ValueConverter< VecComponentValueT >::Type Type
Definition: GridOperators.h:58
+
const InGridType & mInputGrid
Definition: GridOperators.h:614
+
Normalize(const GridT &grid, InterruptT *interrupt=NULL)
Definition: GridOperators.h:882
+ +
InterruptT * mInterrupt
Definition: GridOperators.h:741
+
Grid< typename GridType::TreeType::template ValueConverter< ValueMask >::Type > Type
Definition: GridOperators.h:313
+
VectorToScalarConverter< GridType >::Type::Ptr divergence(const GridType &grid, const MaskT &mask, bool threaded=true)
Definition: GridOperators.h:155
+
Functor(const GridT &grid, const MaskGridType *mask, bool threaded, InterruptT *interrupt)
Definition: GridOperators.h:721
+
math::Vec3< typename ScalarGridType::ValueType > VectorValueT
Definition: GridOperators.h:66
+
MeanCurvature(const GridT &grid, InterruptT *interrupt=NULL)
Definition: GridOperators.h:759
+ +
OutTreeT::LeafNodeType OutLeafT
Definition: GridOperators.h:337
+
OutGridT::TreeType OutTreeT
Definition: GridOperators.h:336
+
LeafRange leafRange(size_t grainsize=1) const
Return a TBB-compatible LeafRange.
Definition: LeafManager.h:381
+
Dummy NOOP interrupter class defining interface.
Definition: NullInterrupter.h:52
+
Compute the curl of a vector-valued grid using differencing of various orders in the space defined by...
Definition: Operators.h:1277
+
GridType::Ptr laplacian(const GridType &grid, const MaskT mask, bool threaded=true)
Definition: GridOperators.h:212
+
Definition: Types.h:442
+
const InGridType & mInputGrid
Definition: GridOperators.h:620
+
InterruptT * mInterrupt
Definition: GridOperators.h:677
+
VectorToScalarConverter< InGridT >::Type OutGridType
Definition: GridOperators.h:571
+
Divergence(const InGridT &grid, const MaskGridType &mask, InterruptT *interrupt=NULL)
Definition: GridOperators.h:578
+
const InGridType & mInputGrid
Definition: GridOperators.h:863
+
GridT::Ptr process(bool threaded=true)
Definition: GridOperators.h:522
+
Definition: Mat.h:146
+
VecType
Definition: Types.h:241
+
bool processTypedMap(TransformType &transform, OpType &op)
Utility function that, given a generic map pointer, calls a functor on the fully-resoved map...
Definition: Transform.h:268
+
ScalarToVectorConverter< InGridT >::Type OutGridType
Definition: GridOperators.h:638
+
Magnitude(const InGridType &grid, const MaskGridType &mask, InterruptT *interrupt=NULL)
Definition: GridOperators.h:823
+
Definition: GridOperators.h:812
+
Definition: GridOperators.h:908
+
const GridT & mInputGrid
Definition: GridOperators.h:799
+
OutGridType::Ptr mOutputGrid
Definition: GridOperators.h:858
+
OutGridType::Ptr process(bool threaded=true, bool useWorldTransform=true)
Definition: GridOperators.h:434
+
This class manages a linear array of pointers to a given tree's leaf nodes, as well as optional auxil...
Definition: LeafManager.h:115
+
tree::LeafManager< OutTreeT > LeafManagerT
Definition: GridOperators.h:338
+
Signed (x, y, z) 32-bit integer coordinates.
Definition: Coord.h:47
+
static OutGridType::ValueType result(const MapT &, const AccT &acc, const Coord &xyz)
Definition: GridOperators.h:912
+
const GridT & mInputGrid
Definition: GridOperators.h:933
+
Curl(const GridT &grid, const MaskGridType &mask, InterruptT *interrupt=NULL)
Definition: GridOperators.h:517
+
Definition: GridOperators.h:719
+
Functor(const GridT &grid, const MaskGridType *mask, bool threaded, InterruptT *interrupt)
Definition: GridOperators.h:921
+
MeanCurvature(const GridT &grid, const MaskGridType &mask, InterruptT *interrupt=NULL)
Definition: GridOperators.h:764
+
const bool mThreaded
Definition: GridOperators.h:733
+
InterruptT * mInterrupt
Definition: GridOperators.h:859
+
void operator()(const MapT &map)
Definition: GridOperators.h:925
+
GridT::Ptr process(bool threaded=true)
Definition: GridOperators.h:892
+
const MaskGridType * mMask
Definition: GridOperators.h:683
+
InterruptT * mInterrupt
Definition: GridOperators.h:940
+
const bool mThreaded
Definition: GridOperators.h:792
+
const GridT & mInputGrid
Definition: GridOperators.h:939
+
ScalarGridType::template ValueConverter< VectorValueT >::Type Type
Definition: GridOperators.h:67
+
OutGridType::Ptr mOutputGrid
Definition: GridOperators.h:615
+
InterruptT * mInterrupt
Definition: GridOperators.h:621
+
GridType::Ptr normalize(const GridType &grid, const MaskT &mask, bool threaded=true)
Definition: GridOperators.h:297
+
InterruptT * mInterrupt
Definition: GridOperators.h:403
+
Compute the divergence of a vector-valued grid using differencing of various orders, the result defined with respect to the range-space of the map.
Definition: Operators.h:952
+
GridT::Ptr process(bool threaded=true)
Definition: GridOperators.h:769
+
static OutGridType::ValueType result(const MapT &, const AccT &acc, const Coord &xyz)
Definition: GridOperators.h:840
+
ScalarToVectorConverter< GridType >::Type::Ptr gradient(const GridType &grid, const MaskT &mask, bool threaded=true)
Definition: GridOperators.h:184
+
GridT OutGridType
Definition: GridOperators.h:757
+
InGridT InGridType
Definition: GridOperators.h:815
+
VectorToScalarConverter::Type is the type of a grid having the same tree configuratio...
Definition: GridOperators.h:56
+
InterruptT * mInterrupt
Definition: GridOperators.h:736
+
InterruptT * mInterrupt
Definition: GridOperators.h:616
+
virtual ~GridOperator()
Definition: GridOperators.h:346
+
InGridT InGridType
Definition: GridOperators.h:570
+
void operator()(const MapT &map)
Definition: GridOperators.h:725
+
OutGridType::Ptr mOutputGrid
Definition: GridOperators.h:676
+
ScalarToVectorConverter< GridType >::Type::Ptr cpt(const GridType &grid, const MaskT &mask, bool threaded=true)
Definition: GridOperators.h:98
+
void operator()(const MapT &map)
Definition: GridOperators.h:605
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
Definition: GridOperators.h:753
+
const GridT & mInputGrid
Definition: GridOperators.h:740
+
Cpt(const InGridType &grid, InterruptT *interrupt=NULL)
Definition: GridOperators.h:424
+
InterruptT * mInterrupt
Definition: GridOperators.h:800
+
GridT InGridType
Definition: GridOperators.h:509
+
AccessorT mAcc
Definition: GridOperators.h:401
+
Definition: GridOperators.h:659
+
GridT InGridType
Definition: GridOperators.h:879
+
GridT OutGridType
Definition: GridOperators.h:698
+
const MaskGridType * mMask
Definition: GridOperators.h:936
+
Compute the Laplacian at a given location in a grid using finite differencing of various orders...
Definition: Operators.h:1422
+
VectorToScalarConverter< GridType >::Type::Ptr magnitude(const GridType &grid, const MaskT &mask, bool threaded=true)
Definition: GridOperators.h:269
+
InGridT InGridType
Definition: GridOperators.h:637
+
Calculate an axis-aligned bounding box in index space from a bounding sphere in world space...
Definition: Transform.h:66
+
const GridT & mInputGrid
Definition: GridOperators.h:734
+
InterruptT * mInterrupt
Definition: GridOperators.h:795
+
Definition: Exceptions.h:39
+
const MaskGridType * mMask
Definition: GridOperators.h:737
+
InterruptT * mInterrupt
Definition: GridOperators.h:935
+
Normalize(const GridT &grid, const MaskGridType &mask, InterruptT *interrupt=NULL)
Definition: GridOperators.h:887
+
Definition: GridOperators.h:919
+
Laplacian(const GridT &grid, const MaskGridType &mask, InterruptT *interrupt=NULL)
Definition: GridOperators.h:705
+
Compute the closest-point transform to a level set.
Definition: Operators.h:1709
+
Definition: Types.h:243
+
GridT InGridType
Definition: GridOperators.h:756
+
OutGridT::Ptr process(bool threaded=true)
Definition: GridOperators.h:347
+
Definition: GridOperators.h:842
+
const MaskGridType * mMask
Definition: GridOperators.h:678
+
VectorToScalarConverter< InGridT >::Type OutGridType
Definition: GridOperators.h:816
+
Functor(const InGridT &grid, const MaskGridType *mask, bool threaded, InterruptT *interrupt)
Definition: GridOperators.h:661
+ +
void operator()(const typename LeafManagerT::LeafRange &range) const
Iterate sequentially over LeafNodes and voxels in the output grid and compute the Laplacian using a v...
Definition: GridOperators.h:388
+
Iterator begin() const
Definition: LeafManager.h:188
+
GridT InGridType
Definition: GridOperators.h:697
+
Compute the gradient of a scalar grid.
Definition: GridOperators.h:634
+
InterruptT * mInterrupt
Definition: GridOperators.h:864
+
GridT::Ptr mOutputGrid
Definition: GridOperators.h:735
+
Definition: GridOperators.h:778
+
Center difference gradient operators, defined with respect to the range-space of the map...
Definition: Operators.h:642
+
const MaskGridType * mMask
Definition: GridOperators.h:801
+
const bool mThreaded
Definition: GridOperators.h:932
+
Compute the closest-point transform of a scalar grid.
Definition: GridOperators.h:418
+
const MaskGridType * mMask
Definition: GridOperators.h:796
+
Definition: Types.h:215
+ +
Curl(const GridT &grid, InterruptT *interrupt=NULL)
Definition: GridOperators.h:512
+
const bool mThreaded
Definition: GridOperators.h:674
+
const GridT & mInputGrid
Definition: GridOperators.h:793
+
const InGridT & mInputGrid
Definition: GridOperators.h:675
+
Laplacian(const GridT &grid, InterruptT *interrupt=NULL)
Definition: GridOperators.h:700
+
Compute the closest-point transform to a level set.
Definition: Operators.h:1656
+
void operator()(const MapT &map)
Definition: GridOperators.h:849
+
ToMaskGrid::Type is the type of a grid having the same tree hierarchy as grid type T but a value e...
Definition: GridOperators.h:312
+
Cpt(const InGridType &grid, const MaskGridType &mask, InterruptT *interrupt=NULL)
Definition: GridOperators.h:429
+
const InGridType & mInputGrid
Definition: GridOperators.h:857
+
ScalarToVectorConverter::Type is the type of a grid having the same tree configuratio...
Definition: GridOperators.h:65
+
GridT OutGridType
Definition: GridOperators.h:880
+
Functor(const InGridT &grid, const MaskGridType *mask, bool threaded, InterruptT *interrupt)
Definition: GridOperators.h:600
+
GridType::Ptr meanCurvature(const GridType &grid, const MaskT &mask, bool threaded=true)
Definition: GridOperators.h:240
+
Functor(const InGridT &grid, const MaskGridType *mask, bool threaded, InterruptT *interrupt)
Definition: GridOperators.h:844
+
void operator()(const MapT &map)
Definition: GridOperators.h:784
+ +
const MapT & mMap
Definition: GridOperators.h:402
+
InGridT InGridType
Definition: GridOperators.h:421
+ +
const MaskGridType * mMask
Definition: GridOperators.h:617
+
Gradient(const InGridT &grid, InterruptT *interrupt=NULL)
Definition: GridOperators.h:640
+
Definition: GridOperators.h:876
+
OutGridType::Ptr process(bool threaded=true)
Definition: GridOperators.h:828
+
Compute the curl of a vector grid.
Definition: GridOperators.h:506
+
OutGridType::Ptr process(bool threaded=true)
Definition: GridOperators.h:583
+
GridType::Ptr curl(const GridType &grid, const MaskT &mask, bool threaded=true)
Definition: GridOperators.h:126
+
OutGridType::Ptr process(bool threaded=true)
Definition: GridOperators.h:650
+
GridT::Ptr mOutputGrid
Definition: GridOperators.h:794
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
GridT::Ptr mOutputGrid
Definition: GridOperators.h:934
+
A LeafManager manages a linear array of pointers to a given tree's leaf nodes, as well as optional au...
+
Definition: GridOperators.h:694
+
Definition: GridOperators.h:598
+
InterruptT * mInterrupt
Definition: GridOperators.h:682
+
Gradient(const InGridT &grid, const MaskGridType &mask, InterruptT *interrupt=NULL)
Definition: GridOperators.h:645
+
TreeT * tree
Definition: MaskToLevelSet.h:118
+
Compute the mean curvature.
Definition: Operators.h:1751
+
GridOperator(const InGridT &grid, const MaskGridType *mask, const MapT &map, InterruptT *interrupt=NULL)
Definition: GridOperators.h:340
+
const InGridT & mInputGrid
Definition: GridOperators.h:681
+
boost::shared_ptr< Transform > Ptr
Definition: Transform.h:69
+
const bool mThreaded
Definition: GridOperators.h:856
+
const MaskGridType * mMask
Definition: GridOperators.h:742
+
void operator()(const MapT &map)
Definition: GridOperators.h:666
+
Divergence(const InGridT &grid, InterruptT *interrupt=NULL)
Definition: GridOperators.h:573
+
Container class that associates a tree with a transform and metadata.
Definition: Grid.h:54
+
const bool mThreaded
Definition: GridOperators.h:613
+
GridT OutGridType
Definition: GridOperators.h:510
+
Apply an operator on an input grid to produce an output grid with the same topology but a possibly di...
Definition: GridOperators.h:333
+ +
Compute the divergence of a vector grid.
Definition: GridOperators.h:567
+
const MaskGridType * mMask
Definition: GridOperators.h:622
+
VectorGridType::ValueType::value_type VecComponentValueT
Definition: GridOperators.h:57
+
bool wasInterrupted(T *i, int percent=-1)
Definition: NullInterrupter.h:76
+
const MaskGridType * mMask
Definition: GridOperators.h:941
+
const MaskGridType * mMask
Definition: GridOperators.h:865
+
const MaskGridType * mMask
Definition: GridOperators.h:404
+
InGridT::ConstAccessor AccessorT
Definition: GridOperators.h:400
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/GridTransformer_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/GridTransformer_8h_source.html new file mode 100644 index 00000000..4fac5f70 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/GridTransformer_8h_source.html @@ -0,0 +1,1116 @@ + + + + + + +OpenVDB: GridTransformer.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
GridTransformer.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
33 
+
34 #ifndef OPENVDB_TOOLS_GRIDTRANSFORMER_HAS_BEEN_INCLUDED
+
35 #define OPENVDB_TOOLS_GRIDTRANSFORMER_HAS_BEEN_INCLUDED
+
36 
+
37 #include <cmath>
+
38 #include <boost/bind.hpp>
+
39 #include <boost/function.hpp>
+
40 #include <boost/shared_ptr.hpp>
+
41 #include <tbb/blocked_range.h>
+
42 #include <tbb/parallel_reduce.h>
+
43 #include <openvdb/Grid.h>
+
44 #include <openvdb/Types.h>
+
45 #include <openvdb/math/Math.h> // for isApproxEqual()
+ +
47 #include "ChangeBackground.h"
+
48 #include "Interpolation.h"
+
49 #include "LevelSetRebuild.h" // for doLevelSetRebuild()
+
50 #include "SignedFloodFill.h" // for signedFloodFill
+
51 #include "Prune.h" // for pruneLevelSet
+
52 
+
53 namespace openvdb {
+ +
55 namespace OPENVDB_VERSION_NAME {
+
56 namespace tools {
+
57 
+
81 template<typename Sampler, typename Interrupter, typename GridType>
+
82 inline void
+
83 resampleToMatch(const GridType& inGrid, GridType& outGrid, Interrupter& interrupter);
+
84 
+
106 template<typename Sampler, typename GridType>
+
107 inline void
+
108 resampleToMatch(const GridType& inGrid, GridType& outGrid);
+
109 
+
110 
+
112 
+
113 
+
114 namespace internal {
+
115 
+
119 template<typename Sampler, typename TreeT>
+
120 class TileSampler: public Sampler
+
121 {
+
122 public:
+
123  typedef typename TreeT::ValueType ValueT;
+
124 
+
128  TileSampler(const CoordBBox& b, const ValueT& tileVal, bool on):
+
129  mBBox(b.min().asVec3d(), b.max().asVec3d()), mVal(tileVal), mActive(on), mEmpty(false)
+
130  {
+
131  mBBox.expand(-this->radius()); // shrink the bounding box by the sample radius
+
132  mEmpty = mBBox.empty();
+
133  }
+
134 
+
135  bool sample(const TreeT& inTree, const Vec3R& inCoord, ValueT& result) const
+
136  {
+
137  if (!mEmpty && mBBox.isInside(inCoord)) { result = mVal; return mActive; }
+
138  return Sampler::sample(inTree, inCoord, result);
+
139  }
+
140 
+
141 protected:
+ +
143  ValueT mVal;
+
144  bool mActive, mEmpty;
+
145 };
+
146 
+
147 
+
150 template<typename TreeT>
+
151 class TileSampler<PointSampler, TreeT>: public PointSampler {
+
152 public:
+
153  TileSampler(const CoordBBox&, const typename TreeT::ValueType&, bool) {}
+
154 };
+
155 
+
158 template<typename TreeT>
+ +
160 public:
+
161  TileSampler(const CoordBBox&, const typename TreeT::ValueType&, bool) {}
+
162 };
+
163 
+
164 } // namespace internal
+
165 
+
166 
+
168 
+
169 
+ +
188 {
+
189 public:
+
190  typedef boost::shared_ptr<GridResampler> Ptr;
+
191  typedef boost::function<bool (void)> InterruptFunc;
+
192 
+
193  GridResampler(): mThreaded(true), mTransformTiles(true) {}
+
194  virtual ~GridResampler() {}
+
195 
+
197  void setThreaded(bool b) { mThreaded = b; }
+
199  bool threaded() const { return mThreaded; }
+
201  void setTransformTiles(bool b) { mTransformTiles = b; }
+
203  bool transformTiles() const { return mTransformTiles; }
+
204 
+
208  template<typename InterrupterType> void setInterrupter(InterrupterType&);
+
209 
+
210  template<typename Sampler, typename GridT, typename Transformer>
+
211  void transformGrid(const Transformer&,
+
212  const GridT& inGrid, GridT& outGrid) const;
+
213 
+
214 protected:
+
215  template<typename Sampler, typename GridT, typename Transformer>
+
216  void applyTransform(const Transformer&, const GridT& inGrid, GridT& outGrid) const;
+
217 
+
218  bool interrupt() const { return mInterrupt && mInterrupt(); }
+
219 
+
220 private:
+
221  template<typename Sampler, typename InTreeT, typename OutTreeT, typename Transformer>
+
222  static void transformBBox(const Transformer&, const CoordBBox& inBBox,
+
223  const InTreeT& inTree, OutTreeT& outTree, const InterruptFunc&,
+
224  const Sampler& = Sampler());
+
225 
+
226  template<typename Sampler, typename TreeT, typename Transformer>
+
227  class RangeProcessor;
+
228 
+
229  bool mThreaded, mTransformTiles;
+
230  InterruptFunc mInterrupt;
+
231 };
+
232 
+
233 
+
235 
+
236 
+ +
256 {
+
257 public:
+
258  typedef boost::shared_ptr<GridTransformer> Ptr;
+
259 
+
260  GridTransformer(const Mat4R& xform);
+ +
262  const Vec3R& pivot,
+
263  const Vec3R& scale,
+
264  const Vec3R& rotate,
+
265  const Vec3R& translate,
+
266  const std::string& xformOrder = "tsr",
+
267  const std::string& rotationOrder = "zyx");
+
268  virtual ~GridTransformer() {}
+
269 
+
270  const Mat4R& getTransform() const { return mTransform; }
+
271 
+
272  template<class Sampler, class GridT>
+
273  void transformGrid(const GridT& inGrid, GridT& outGrid) const;
+
274 
+
275 private:
+
276  struct MatrixTransform;
+
277 
+
278  inline void init(const Vec3R& pivot, const Vec3R& scale,
+
279  const Vec3R& rotate, const Vec3R& translate,
+
280  const std::string& xformOrder, const std::string& rotOrder);
+
281 
+
282  Vec3R mPivot;
+
283  Vec3i mMipLevels;
+
284  Mat4R mTransform, mPreScaleTransform, mPostScaleTransform;
+
285 };
+
286 
+
287 
+
289 
+
290 
+
291 namespace local_util {
+
292 
+
295 template<typename T>
+
296 inline bool
+ +
298  math::Vec3<T>& rotate, math::Vec3<T>& translate)
+
299 {
+
300  if (!math::isAffine(m)) return false;
+
301 
+
302  // This is the translation in world space
+
303  translate = m.getTranslation();
+
304  // Extract translation.
+
305  const math::Mat3<T> xform = m.getMat3();
+
306 
+
307  const math::Vec3<T> unsignedScale(
+
308  (math::Vec3<T>(1, 0, 0) * xform).length(),
+
309  (math::Vec3<T>(0, 1, 0) * xform).length(),
+
310  (math::Vec3<T>(0, 0, 1) * xform).length());
+
311 
+
312  const bool hasUniformScale = unsignedScale.eq(math::Vec3<T>(unsignedScale[0]));
+
313 
+
314  bool hasRotation = false;
+
315  bool validDecomposition = false;
+
316 
+
317  T minAngle = std::numeric_limits<T>::max();
+
318 
+
319  // If the transformation matrix contains a reflection,
+
320  // test different negative scales to find a decomposition
+
321  // that favors the optimal resampling algorithm.
+
322  for (size_t n = 0; n < 8; ++n) {
+
323 
+
324  const math::Vec3<T> signedScale(
+
325  n & 0x1 ? -unsignedScale.x() : unsignedScale.x(),
+
326  n & 0x2 ? -unsignedScale.y() : unsignedScale.y(),
+
327  n & 0x4 ? -unsignedScale.z() : unsignedScale.z());
+
328 
+
329  // Extract scale and potentially reflection.
+
330  const math::Mat3<T> mat = xform * math::scale<math::Mat3<T> >(signedScale).inverse();
+
331  if (mat.det() < T(0.0)) continue; // Skip if mat contains a reflection.
+
332 
+
333  const math::Vec3<T> tmpAngle = math::eulerAngles(mat, math::XYZ_ROTATION);
+
334 
+
335  const math::Mat3<T> rebuild =
+
336  math::rotation<math::Mat3<T> >(math::Vec3<T>(1, 0, 0), tmpAngle.x()) *
+
337  math::rotation<math::Mat3<T> >(math::Vec3<T>(0, 1, 0), tmpAngle.y()) *
+
338  math::rotation<math::Mat3<T> >(math::Vec3<T>(0, 0, 1), tmpAngle.z()) *
+
339  math::scale<math::Mat3<T> >(signedScale);
+
340 
+
341  if (xform.eq(rebuild)) {
+
342 
+
343  const T maxAngle = std::max(std::abs(tmpAngle[0]),
+
344  std::max(std::abs(tmpAngle[1]), std::abs(tmpAngle[2])));
+
345 
+
346  if (!(minAngle < maxAngle)) { // Update if less or equal.
+
347 
+
348  minAngle = maxAngle;
+
349  rotate = tmpAngle;
+
350  scale = signedScale;
+
351 
+
352  hasRotation = !rotate.eq(math::Vec3<T>::zero());
+
353  validDecomposition = true;
+
354 
+
355  if (hasUniformScale || !hasRotation) {
+
356  // Current decomposition is optimal.
+
357  break;
+
358  }
+
359  }
+
360  }
+
361  }
+
362 
+
363  if (!validDecomposition || (hasRotation && !hasUniformScale)) {
+
364  // The decomposition is invalid if the transformation matrix contains shear.
+
365  // No unique decomposition if scale is nonuniform and rotation is nonzero.
+
366  return false;
+
367  }
+
368 
+
369  return true;
+
370 }
+
371 
+
372 } // namespace local_util
+
373 
+
374 
+
376 
+
377 
+ +
382 {
+
383  MatrixTransform(): mat(Mat4R::identity()), invMat(Mat4R::identity()) {}
+
384  MatrixTransform(const Mat4R& xform): mat(xform), invMat(xform.inverse()) {}
+
385 
+
386  bool isAffine() const { return math::isAffine(mat); }
+
387 
+
388  Vec3R transform(const Vec3R& pos) const { return mat.transformH(pos); }
+
389 
+
390  Vec3R invTransform(const Vec3R& pos) const { return invMat.transformH(pos); }
+
391 
+
392  Mat4R mat, invMat;
+
393 };
+
394 
+
395 
+
397 
+
398 
+ +
404 {
+
405 public:
+
408  ABTransform(const math::Transform& aXform, const math::Transform& bXform):
+
409  mAXform(aXform),
+
410  mBXform(bXform),
+
411  mIsAffine(mAXform.isLinear() && mBXform.isLinear()),
+
412  mIsIdentity(mIsAffine && mAXform == mBXform)
+
413  {}
+
414 
+
415  bool isAffine() const { return mIsAffine; }
+
416 
+
417  bool isIdentity() const { return mIsIdentity; }
+
418 
+ +
420  {
+
421  return mBXform.worldToIndex(mAXform.indexToWorld(pos));
+
422  }
+
423 
+ +
425  {
+
426  return mAXform.worldToIndex(mBXform.indexToWorld(pos));
+
427  }
+
428 
+
429  const math::Transform& getA() const { return mAXform; }
+
430  const math::Transform& getB() const { return mBXform; }
+
431 
+
432 private:
+
433  const math::Transform &mAXform, &mBXform;
+
434  const bool mIsAffine;
+
435  const bool mIsIdentity;
+
436 };
+
437 
+
438 
+
445 template<typename Sampler, typename Interrupter, typename GridType>
+
446 inline void
+
447 doResampleToMatch(const GridType& inGrid, GridType& outGrid, Interrupter& interrupter)
+
448 {
+
449  ABTransform xform(inGrid.transform(), outGrid.transform());
+
450 
+
451  if (Sampler::consistent() && xform.isIdentity()) {
+
452  // If the transforms of the input and output are identical, the
+
453  // output tree is simply a deep copy of the input tree.
+
454  outGrid.setTree(inGrid.tree().copy());
+
455  } else if (xform.isAffine()) {
+
456  // If the input and output transforms are both affine, create an
+
457  // input to output transform (in:index-to-world * out:world-to-index)
+
458  // and use the fast GridTransformer API.
+
459  Mat4R mat = xform.getA().baseMap()->getAffineMap()->getMat4() *
+
460  ( xform.getB().baseMap()->getAffineMap()->getMat4().inverse() );
+
461 
+
462  GridTransformer transformer(mat);
+
463  transformer.setInterrupter(interrupter);
+
464 
+
465  // Transform the input grid and store the result in the output grid.
+
466  transformer.transformGrid<Sampler>(inGrid, outGrid);
+
467  } else {
+
468  // If either the input or the output transform is non-affine,
+
469  // use the slower GridResampler API.
+
470  GridResampler resampler;
+
471  resampler.setInterrupter(interrupter);
+
472 
+
473  resampler.transformGrid<Sampler>(xform, inGrid, outGrid);
+
474  }
+
475 }
+
476 
+
477 
+
478 template<typename Sampler, typename Interrupter, typename GridType>
+
479 inline void
+
480 resampleToMatch(const GridType& inGrid, GridType& outGrid, Interrupter& interrupter)
+
481 {
+
482  if (inGrid.getGridClass() == GRID_LEVEL_SET) {
+
483  // If the input grid is a level set, resample it using the level set rebuild tool.
+
484 
+
485  if (inGrid.constTransform() == outGrid.constTransform()) {
+
486  // If the transforms of the input and output grids are identical,
+
487  // the output tree is simply a deep copy of the input tree.
+
488  outGrid.setTree(inGrid.tree().copy());
+
489  return;
+
490  }
+
491 
+
492  // If the output grid is a level set, resample the input grid to have the output grid's
+
493  // background value. Otherwise, preserve the input grid's background value.
+
494  typedef typename GridType::ValueType ValueT;
+
495  const ValueT halfWidth = ((outGrid.getGridClass() == openvdb::GRID_LEVEL_SET)
+
496  ? ValueT(outGrid.background() * (1.0 / outGrid.voxelSize()[0]))
+
497  : ValueT(inGrid.background() * (1.0 / inGrid.voxelSize()[0])));
+
498 
+
499  typename GridType::Ptr tempGrid;
+
500  try {
+
501  tempGrid = doLevelSetRebuild(inGrid, /*iso=*/zeroVal<ValueT>(),
+
502  /*exWidth=*/halfWidth, /*inWidth=*/halfWidth,
+
503  &outGrid.constTransform(), &interrupter);
+
504  } catch (TypeError&) {
+
505  // The input grid is classified as a level set, but it has a value type
+
506  // that is not supported by the level set rebuild tool. Fall back to
+
507  // using the generic resampler.
+
508  tempGrid.reset();
+
509  }
+
510  if (tempGrid) {
+
511  outGrid.setTree(tempGrid->treePtr());
+
512  return;
+
513  }
+
514  }
+
515 
+
516  // If the input grid is not a level set, use the generic resampler.
+
517  doResampleToMatch<Sampler>(inGrid, outGrid, interrupter);
+
518 }
+
519 
+
520 
+
521 template<typename Sampler, typename GridType>
+
522 inline void
+
523 resampleToMatch(const GridType& inGrid, GridType& outGrid)
+
524 {
+
525  util::NullInterrupter interrupter;
+
526  resampleToMatch<Sampler>(inGrid, outGrid, interrupter);
+
527 }
+
528 
+
529 
+
531 
+
532 
+
533 inline
+
534 GridTransformer::GridTransformer(const Mat4R& xform):
+
535  mPivot(0, 0, 0),
+
536  mMipLevels(0, 0, 0),
+
537  mTransform(xform),
+
538  mPreScaleTransform(Mat4R::identity()),
+
539  mPostScaleTransform(Mat4R::identity())
+
540 {
+
541  Vec3R scale, rotate, translate;
+
542  if (local_util::decompose(mTransform, scale, rotate, translate)) {
+
543  // If the transform can be decomposed into affine components,
+
544  // use them to set up a mipmapping-like scheme for downsampling.
+
545  init(mPivot, scale, rotate, translate, "srt", "zyx");
+
546  }
+
547 }
+
548 
+
549 
+
550 inline
+ +
552  const Vec3R& pivot, const Vec3R& scale,
+
553  const Vec3R& rotate, const Vec3R& translate,
+
554  const std::string& xformOrder, const std::string& rotOrder):
+
555  mPivot(0, 0, 0),
+
556  mMipLevels(0, 0, 0),
+
557  mPreScaleTransform(Mat4R::identity()),
+
558  mPostScaleTransform(Mat4R::identity())
+
559 {
+
560  init(pivot, scale, rotate, translate, xformOrder, rotOrder);
+
561 }
+
562 
+
563 
+
565 
+
566 
+
567 inline void
+
568 GridTransformer::init(
+
569  const Vec3R& pivot, const Vec3R& scale,
+
570  const Vec3R& rotate, const Vec3R& translate,
+
571  const std::string& xformOrder, const std::string& rotOrder)
+
572 {
+
573  if (xformOrder.size() != 3) {
+
574  OPENVDB_THROW(ValueError, "invalid transform order (" + xformOrder + ")");
+
575  }
+
576  if (rotOrder.size() != 3) {
+
577  OPENVDB_THROW(ValueError, "invalid rotation order (" + rotOrder + ")");
+
578  }
+
579 
+
580  mPivot = pivot;
+
581 
+
582  // Scaling is handled via a mipmapping-like scheme of successive
+
583  // halvings of the tree resolution, until the remaining scale
+
584  // factor is greater than or equal to 1/2.
+
585  Vec3R scaleRemainder = scale;
+
586  for (int i = 0; i < 3; ++i) {
+
587  double s = std::fabs(scale(i));
+
588  if (s < 0.5) {
+
589  mMipLevels(i) = int(std::floor(-std::log(s)/std::log(2.0)));
+
590  scaleRemainder(i) = scale(i) * (1 << mMipLevels(i));
+
591  }
+
592  }
+
593 
+
594  // Build pre-scale and post-scale transform matrices based on
+
595  // the user-specified order of operations.
+
596  // Note that we iterate over the transform order string in reverse order
+
597  // (e.g., "t", "r", "s", given "srt"). This is because math::Mat matrices
+
598  // postmultiply row vectors rather than premultiplying column vectors.
+
599  mTransform = mPreScaleTransform = mPostScaleTransform = Mat4R::identity();
+
600  Mat4R* remainder = &mPostScaleTransform;
+
601  int rpos, spos, tpos;
+
602  rpos = spos = tpos = 3;
+
603  for (int ix = 2; ix >= 0; --ix) { // reverse iteration
+
604  switch (xformOrder[ix]) {
+
605 
+
606  case 'r':
+
607  rpos = ix;
+
608  mTransform.preTranslate(pivot);
+
609  remainder->preTranslate(pivot);
+
610 
+
611  int xpos, ypos, zpos;
+
612  xpos = ypos = zpos = 3;
+
613  for (int ir = 2; ir >= 0; --ir) {
+
614  switch (rotOrder[ir]) {
+
615  case 'x':
+
616  xpos = ir;
+
617  mTransform.preRotate(math::X_AXIS, rotate.x());
+
618  remainder->preRotate(math::X_AXIS, rotate.x());
+
619  break;
+
620  case 'y':
+
621  ypos = ir;
+
622  mTransform.preRotate(math::Y_AXIS, rotate.y());
+
623  remainder->preRotate(math::Y_AXIS, rotate.y());
+
624  break;
+
625  case 'z':
+
626  zpos = ir;
+
627  mTransform.preRotate(math::Z_AXIS, rotate.z());
+
628  remainder->preRotate(math::Z_AXIS, rotate.z());
+
629  break;
+
630  }
+
631  }
+
632  // Reject rotation order strings that don't contain exactly one
+
633  // instance of "x", "y" and "z".
+
634  if (xpos > 2 || ypos > 2 || zpos > 2) {
+
635  OPENVDB_THROW(ValueError, "invalid rotation order (" + rotOrder + ")");
+
636  }
+
637 
+
638  mTransform.preTranslate(-pivot);
+
639  remainder->preTranslate(-pivot);
+
640  break;
+
641 
+
642  case 's':
+
643  spos = ix;
+
644  mTransform.preTranslate(pivot);
+
645  mTransform.preScale(scale);
+
646  mTransform.preTranslate(-pivot);
+
647 
+
648  remainder->preTranslate(pivot);
+
649  remainder->preScale(scaleRemainder);
+
650  remainder->preTranslate(-pivot);
+
651  remainder = &mPreScaleTransform;
+
652  break;
+
653 
+
654  case 't':
+
655  tpos = ix;
+
656  mTransform.preTranslate(translate);
+
657  remainder->preTranslate(translate);
+
658  break;
+
659  }
+
660  }
+
661  // Reject transform order strings that don't contain exactly one
+
662  // instance of "t", "r" and "s".
+
663  if (tpos > 2 || rpos > 2 || spos > 2) {
+
664  OPENVDB_THROW(ValueError, "invalid transform order (" + xformOrder + ")");
+
665  }
+
666 }
+
667 
+
668 
+
670 
+
671 
+
672 template<typename InterrupterType>
+
673 void
+
674 GridResampler::setInterrupter(InterrupterType& interrupter)
+
675 {
+
676  mInterrupt = boost::bind(&InterrupterType::wasInterrupted,
+
677  /*this=*/&interrupter, /*percent=*/-1);
+
678 }
+
679 
+
680 
+
681 template<typename Sampler, typename GridT, typename Transformer>
+
682 void
+
683 GridResampler::transformGrid(const Transformer& xform,
+
684  const GridT& inGrid, GridT& outGrid) const
+
685 {
+
686  tools::changeBackground(outGrid.tree(), inGrid.background());
+
687  applyTransform<Sampler>(xform, inGrid, outGrid);
+
688 }
+
689 
+
690 
+
691 template<class Sampler, class GridT>
+
692 void
+
693 GridTransformer::transformGrid(const GridT& inGrid, GridT& outGrid) const
+
694 {
+
695  tools::changeBackground(outGrid.tree(), inGrid.background());
+
696 
+
697  if (!Sampler::mipmap() || mMipLevels == Vec3i::zero()) {
+
698  // Skip the mipmapping step.
+
699  const MatrixTransform xform(mTransform);
+
700  applyTransform<Sampler>(xform, inGrid, outGrid);
+
701 
+
702  } else {
+
703  bool firstPass = true;
+
704  const typename GridT::ValueType background = inGrid.background();
+
705  typename GridT::Ptr tempGrid = GridT::create(background);
+
706 
+
707  if (!mPreScaleTransform.eq(Mat4R::identity())) {
+
708  firstPass = false;
+
709  // Apply the pre-scale transform to the input grid
+
710  // and store the result in a temporary grid.
+
711  const MatrixTransform xform(mPreScaleTransform);
+
712  applyTransform<Sampler>(xform, inGrid, *tempGrid);
+
713  }
+
714 
+
715  // While the scale factor along one or more axes is less than 1/2,
+
716  // scale the grid by half along those axes.
+
717  Vec3i count = mMipLevels; // # of halvings remaining per axis
+
718  while (count != Vec3i::zero()) {
+
719  MatrixTransform xform;
+
720  xform.mat.setTranslation(mPivot);
+
721  xform.mat.preScale(Vec3R(
+
722  count.x() ? .5 : 1, count.y() ? .5 : 1, count.z() ? .5 : 1));
+
723  xform.mat.preTranslate(-mPivot);
+
724  xform.invMat = xform.mat.inverse();
+
725 
+
726  if (firstPass) {
+
727  firstPass = false;
+
728  // Scale the input grid and store the result in a temporary grid.
+
729  applyTransform<Sampler>(xform, inGrid, *tempGrid);
+
730  } else {
+
731  // Scale the temporary grid and store the result in a transient grid,
+
732  // then swap the two and discard the transient grid.
+
733  typename GridT::Ptr destGrid = GridT::create(background);
+
734  applyTransform<Sampler>(xform, *tempGrid, *destGrid);
+
735  tempGrid.swap(destGrid);
+
736  }
+
737  // (3, 2, 1) -> (2, 1, 0) -> (1, 0, 0) -> (0, 0, 0), etc.
+
738  count = math::maxComponent(count - 1, Vec3i::zero());
+
739  }
+
740 
+
741  // Apply the post-scale transform and store the result in the output grid.
+
742  if (!mPostScaleTransform.eq(Mat4R::identity())) {
+
743  const MatrixTransform xform(mPostScaleTransform);
+
744  applyTransform<Sampler>(xform, *tempGrid, outGrid);
+
745  } else {
+
746  outGrid.setTree(tempGrid->treePtr());
+
747  }
+
748  }
+
749 }
+
750 
+
751 
+
753 
+
754 
+
755 template<class Sampler, class TreeT, typename Transformer>
+
756 class GridResampler::RangeProcessor
+
757 {
+
758 public:
+
759  typedef typename TreeT::LeafCIter LeafIterT;
+
760  typedef typename TreeT::ValueAllCIter TileIterT;
+
761  typedef typename tree::IteratorRange<LeafIterT> LeafRange;
+
762  typedef typename tree::IteratorRange<TileIterT> TileRange;
+
763  typedef typename tree::ValueAccessor<const TreeT> InTreeAccessor;
+
764  typedef typename tree::ValueAccessor<TreeT> OutTreeAccessor;
+
765 
+
766  RangeProcessor(const Transformer& xform, const CoordBBox& b, const TreeT& inT, TreeT& outT):
+
767  mIsRoot(true), mXform(xform), mBBox(b),
+
768  mInTree(inT), mOutTree(&outT), mInAcc(mInTree), mOutAcc(*mOutTree)
+
769  {}
+
770 
+
771  RangeProcessor(const Transformer& xform, const CoordBBox& b, const TreeT& inTree):
+
772  mIsRoot(false), mXform(xform), mBBox(b),
+
773  mInTree(inTree), mOutTree(new TreeT(inTree.background())),
+
774  mInAcc(mInTree), mOutAcc(*mOutTree)
+
775  {}
+
776 
+
777  ~RangeProcessor() { if (!mIsRoot) delete mOutTree; }
+
778 
+
780  RangeProcessor(RangeProcessor& other, tbb::split):
+
781  mIsRoot(false),
+
782  mXform(other.mXform),
+
783  mBBox(other.mBBox),
+
784  mInTree(other.mInTree),
+
785  mOutTree(new TreeT(mInTree.background())),
+
786  mInAcc(mInTree),
+
787  mOutAcc(*mOutTree),
+
788  mInterrupt(other.mInterrupt)
+
789  {}
+
790 
+
791  void setInterrupt(const InterruptFunc& f) { mInterrupt = f; }
+
792 
+
794  void operator()(LeafRange& r)
+
795  {
+
796  for ( ; r; ++r) {
+
797  if (interrupt()) break;
+
798  LeafIterT i = r.iterator();
+
799  CoordBBox bbox(i->origin(), i->origin() + Coord(i->dim()));
+
800  if (!mBBox.empty()) {
+
801  // Intersect the leaf node's bounding box with mBBox.
+
802  bbox = CoordBBox(
+
803  Coord::maxComponent(bbox.min(), mBBox.min()),
+
804  Coord::minComponent(bbox.max(), mBBox.max()));
+
805  }
+
806  if (!bbox.empty()) {
+
807  transformBBox<Sampler>(mXform, bbox, mInAcc, mOutAcc, mInterrupt);
+
808  }
+
809  }
+
810  }
+
811 
+
813  void operator()(TileRange& r)
+
814  {
+
815  for ( ; r; ++r) {
+
816  if (interrupt()) break;
+
817 
+
818  TileIterT i = r.iterator();
+
819  // Skip voxels and background tiles.
+
820  if (!i.isTileValue()) continue;
+
821  if (!i.isValueOn() && math::isApproxEqual(*i, mOutTree->background())) continue;
+
822 
+
823  CoordBBox bbox;
+
824  i.getBoundingBox(bbox);
+
825  if (!mBBox.empty()) {
+
826  // Intersect the tile's bounding box with mBBox.
+
827  bbox = CoordBBox(
+
828  Coord::maxComponent(bbox.min(), mBBox.min()),
+
829  Coord::minComponent(bbox.max(), mBBox.max()));
+
830  }
+
831  if (!bbox.empty()) {
+
836  internal::TileSampler<Sampler, InTreeAccessor>
+
837  sampler(bbox, i.getValue(), i.isValueOn());
+
838  transformBBox(mXform, bbox, mInAcc, mOutAcc, mInterrupt, sampler);
+
839  }
+
840  }
+
841  }
+
842 
+
844  void join(RangeProcessor& other)
+
845  {
+
846  if (!interrupt()) mOutTree->merge(*other.mOutTree);
+
847  }
+
848 
+
849 private:
+
850  bool interrupt() const { return mInterrupt && mInterrupt(); }
+
851 
+
852  const bool mIsRoot; // true if mOutTree is the top-level tree
+
853  Transformer mXform;
+
854  CoordBBox mBBox;
+
855  const TreeT& mInTree;
+
856  TreeT* mOutTree;
+
857  InTreeAccessor mInAcc;
+
858  OutTreeAccessor mOutAcc;
+
859  InterruptFunc mInterrupt;
+
860 };
+
861 
+
862 
+
864 
+
865 
+
866 template<class Sampler, class GridT, typename Transformer>
+
867 void
+
868 GridResampler::applyTransform(const Transformer& xform,
+
869  const GridT& inGrid, GridT& outGrid) const
+
870 {
+
871  typedef typename GridT::TreeType TreeT;
+
872  const TreeT& inTree = inGrid.tree();
+
873  TreeT& outTree = outGrid.tree();
+
874 
+
875  typedef RangeProcessor<Sampler, TreeT, Transformer> RangeProc;
+
876 
+
877  const GridClass gridClass = inGrid.getGridClass();
+
878 
+
879  if (gridClass != GRID_LEVEL_SET && mTransformTiles) {
+
880  // Independently transform the tiles of the input grid.
+
881  // Note: Tiles in level sets can only be background tiles, and they
+
882  // are handled more efficiently with a signed flood fill (see below).
+
883 
+
884  RangeProc proc(xform, CoordBBox(), inTree, outTree);
+
885  proc.setInterrupt(mInterrupt);
+
886 
+
887  typename RangeProc::TileIterT tileIter = inTree.cbeginValueAll();
+
888  tileIter.setMaxDepth(tileIter.getLeafDepth() - 1); // skip leaf nodes
+
889  typename RangeProc::TileRange tileRange(tileIter);
+
890 
+
891  if (mThreaded) {
+
892  tbb::parallel_reduce(tileRange, proc);
+
893  } else {
+
894  proc(tileRange);
+
895  }
+
896  }
+
897 
+
898  CoordBBox clipBBox;
+
899  if (gridClass == GRID_LEVEL_SET) {
+
900  // Inactive voxels in level sets can only be background voxels, and they
+
901  // are handled more efficiently with a signed flood fill (see below).
+
902  clipBBox = inGrid.evalActiveVoxelBoundingBox();
+
903  }
+
904 
+
905  // Independently transform the leaf nodes of the input grid.
+
906 
+
907  RangeProc proc(xform, clipBBox, inTree, outTree);
+
908  proc.setInterrupt(mInterrupt);
+
909 
+
910  typename RangeProc::LeafRange leafRange(inTree.cbeginLeaf());
+
911 
+
912  if (mThreaded) {
+
913  tbb::parallel_reduce(leafRange, proc);
+
914  } else {
+
915  proc(leafRange);
+
916  }
+
917 
+
918  // If the grid is a level set, mark inactive voxels as inside or outside.
+
919  if (gridClass == GRID_LEVEL_SET) {
+
920  tools::pruneLevelSet(outTree);
+
921  tools::signedFloodFill(outTree);
+
922  }
+
923 }
+
924 
+
925 
+
927 
+
928 
+
929 //static
+
930 template<class Sampler, class InTreeT, class OutTreeT, class Transformer>
+
931 void
+
932 GridResampler::transformBBox(
+
933  const Transformer& xform,
+
934  const CoordBBox& bbox,
+
935  const InTreeT& inTree,
+
936  OutTreeT& outTree,
+
937  const InterruptFunc& interrupt,
+
938  const Sampler& sampler)
+
939 {
+
940  typedef typename OutTreeT::ValueType ValueT;
+
941 
+
942  // Transform the corners of the input tree's bounding box
+
943  // and compute the enclosing bounding box in the output tree.
+
944  Vec3R
+
945  inRMin(bbox.min().x(), bbox.min().y(), bbox.min().z()),
+
946  inRMax(bbox.max().x(), bbox.max().y(), bbox.max().z()),
+
947  outRMin = math::minComponent(xform.transform(inRMin), xform.transform(inRMax)),
+
948  outRMax = math::maxComponent(xform.transform(inRMin), xform.transform(inRMax));
+
949  for (int i = 0; i < 8; ++i) {
+
950  Vec3R corner(
+
951  i & 1 ? inRMax.x() : inRMin.x(),
+
952  i & 2 ? inRMax.y() : inRMin.y(),
+
953  i & 4 ? inRMax.z() : inRMin.z());
+
954  outRMin = math::minComponent(outRMin, xform.transform(corner));
+
955  outRMax = math::maxComponent(outRMax, xform.transform(corner));
+
956  }
+
957  Vec3i
+
958  outMin = local_util::floorVec3(outRMin) - Sampler::radius(),
+
959  outMax = local_util::ceilVec3(outRMax) + Sampler::radius();
+
960 
+
961  if (!xform.isAffine()) {
+
962  // If the transform is not affine, back-project each output voxel
+
963  // into the input tree.
+
964  Vec3R xyz, inXYZ;
+
965  Coord outXYZ;
+
966  int &x = outXYZ.x(), &y = outXYZ.y(), &z = outXYZ.z();
+
967  for (x = outMin.x(); x <= outMax.x(); ++x) {
+
968  if (interrupt && interrupt()) break;
+
969  xyz.x() = x;
+
970  for (y = outMin.y(); y <= outMax.y(); ++y) {
+
971  if (interrupt && interrupt()) break;
+
972  xyz.y() = y;
+
973  for (z = outMin.z(); z <= outMax.z(); ++z) {
+
974  xyz.z() = z;
+
975  inXYZ = xform.invTransform(xyz);
+
976  ValueT result;
+
977  if (sampler.sample(inTree, inXYZ, result)) {
+
978  outTree.setValueOn(outXYZ, result);
+
979  } else {
+
980  // Note: Don't overwrite existing active values with inactive values.
+
981  if (!outTree.isValueOn(outXYZ)) {
+
982  outTree.setValueOff(outXYZ, result);
+
983  }
+
984  }
+
985  }
+
986  }
+
987  }
+
988  } else { // affine
+
989  // Compute step sizes in the input tree that correspond to
+
990  // unit steps in x, y and z in the output tree.
+
991  const Vec3R
+
992  translation = xform.invTransform(Vec3R(0, 0, 0)),
+
993  deltaX = xform.invTransform(Vec3R(1, 0, 0)) - translation,
+
994  deltaY = xform.invTransform(Vec3R(0, 1, 0)) - translation,
+
995  deltaZ = xform.invTransform(Vec3R(0, 0, 1)) - translation;
+
996 
+
997 #if defined(__ICC)
+
998  const Vec3R dummy = deltaX;
+
1002 #endif
+
1003 
+
1004  // Step by whole voxels through the output tree, sampling the
+
1005  // corresponding fractional voxels of the input tree.
+
1006  Vec3R inStartX = xform.invTransform(Vec3R(outMin));
+
1007  Coord outXYZ;
+
1008  int &x = outXYZ.x(), &y = outXYZ.y(), &z = outXYZ.z();
+
1009  for (x = outMin.x(); x <= outMax.x(); ++x, inStartX += deltaX) {
+
1010  if (interrupt && interrupt()) break;
+
1011  Vec3R inStartY = inStartX;
+
1012  for (y = outMin.y(); y <= outMax.y(); ++y, inStartY += deltaY) {
+
1013  if (interrupt && interrupt()) break;
+
1014  Vec3R inXYZ = inStartY;
+
1015  for (z = outMin.z(); z <= outMax.z(); ++z, inXYZ += deltaZ) {
+
1016  ValueT result;
+
1017  if (sampler.sample(inTree, inXYZ, result)) {
+
1018  outTree.setValueOn(outXYZ, result);
+
1019  } else {
+
1020  // Note: Don't overwrite existing active values with inactive values.
+
1021  if (!outTree.isValueOn(outXYZ)) {
+
1022  outTree.setValueOff(outXYZ, result);
+
1023  }
+
1024  }
+
1025  }
+
1026  }
+
1027  }
+
1028  }
+
1029 } // GridResampler::transformBBox()
+
1030 
+
1031 } // namespace tools
+
1032 } // namespace OPENVDB_VERSION_NAME
+
1033 } // namespace openvdb
+
1034 
+
1035 #endif // OPENVDB_TOOLS_GRIDTRANSFORMER_HAS_BEEN_INCLUDED
+
1036 
+
1037 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
1038 // All rights reserved. This software is distributed under the
+
1039 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
Vec3R invTransform(const Vec3R &pos) const
Definition: GridTransformer.h:390
+
GridTransformer(const Mat4R &xform)
Definition: GridTransformer.h:534
+
math::Mat4< Real > Mat4R
Definition: Types.h:101
+
boost::shared_ptr< GridResampler > Ptr
Definition: GridTransformer.h:190
+
void signedFloodFill(TreeOrLeafManagerT &tree, bool threaded=true, size_t grainSize=1, Index minLevel=0)
Set the values of all inactive voxels and tiles of a narrow-band level set from the signs of the acti...
Definition: SignedFloodFill.h:294
+
Mat3< T > getMat3() const
Definition: Mat4.h:339
+
bool transformTiles() const
Return true if tile processing is enabled.
Definition: GridTransformer.h:203
+
GridClass
Definition: Types.h:211
+
Vec3i ceilVec3(const Vec3R &v)
Definition: Interpolation.h:617
+ +
T & z()
Definition: Vec3.h:99
+ +
Vec3R transform(const Vec3R &pos) const
Definition: GridTransformer.h:388
+
virtual ~GridResampler()
Definition: GridTransformer.h:194
+
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
ValueT mVal
Definition: GridTransformer.h:143
+
Vec2< T > minComponent(const Vec2< T > &v1, const Vec2< T > &v2)
Return component-wise minimum of the two vectors.
Definition: Vec2.h:519
+
BBoxd mBBox
Definition: GridTransformer.h:142
+
Dummy NOOP interrupter class defining interface.
Definition: NullInterrupter.h:52
+
Definition: Math.h:839
+ +
MatrixTransform()
Definition: GridTransformer.h:383
+
static const Mat4< Real > & identity()
Predefined constant for identity matrix.
Definition: Mat4.h:152
+
void setThreaded(bool b)
Enable or disable threading. (Threading is enabled by default.)
Definition: GridTransformer.h:197
+
boost::function< bool(void)> InterruptFunc
Definition: GridTransformer.h:191
+ + +
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
+
bool threaded() const
Return true if threading is enabled.
Definition: GridTransformer.h:199
+
MatType rotation(const Quat< typename MatType::value_type > &q, typename MatType::value_type eps=static_cast< typename MatType::value_type >(1.0e-8))
Return the rotation matrix specified by the given quaternion.
Definition: Mat.h:153
+
Efficient multi-threaded replacement of the background values in tree.
+
Mat4 inverse(T tolerance=0) const
Definition: Mat4.h:527
+
A GridTransformer applies a geometric transformation to an input grid using one of several sampling s...
Definition: GridTransformer.h:255
+
openvdb::Vec3R transform(const openvdb::Vec3R &pos) const
Definition: GridTransformer.h:419
+
void setTransformTiles(bool b)
Enable or disable processing of tiles. (Enabled by default, except for level set grids.)
Definition: GridTransformer.h:201
+
boost::enable_if< boost::is_floating_point< typename GridType::ValueType >, typename GridType::Ptr >::type doLevelSetRebuild(const GridType &grid, typename GridType::ValueType iso, typename GridType::ValueType exWidth, typename GridType::ValueType inWidth, const math::Transform *xform, InterruptT *interrupter)
Definition: LevelSetRebuild.h:229
+
Definition: Math.h:840
+
void setInterrupter(InterrupterType &)
Allow processing to be aborted by providing an interrupter object. The interrupter will be queried pe...
Definition: GridTransformer.h:674
+
Definition: GridTransformer.h:187
+
bool eq(const Vec3< T > &v, T eps=static_cast< T >(1.0e-7)) const
Test if "this" vector is equivalent to vector v with tolerance of eps.
Definition: Vec3.h:145
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & max(const T &a, const T &b)
Definition: Composite.h:132
+
virtual ~GridTransformer()
Definition: GridTransformer.h:268
+ +
void pruneLevelSet(TreeT &tree, bool threaded=true, size_t grainSize=1)
Reduce the memory footprint of a tree by replacing nodes whose values are all inactive with inactive ...
Definition: Prune.h:402
+
const math::Transform & getA() const
Definition: GridTransformer.h:429
+
Vec3< T > getTranslation() const
Return the translation component.
Definition: Mat4.h:351
+
void resampleToMatch(const GridType &inGrid, GridType &outGrid)
Resample an input grid into an output grid of the same type such that, after resampling, the input and output grids coincide (apart from sampling artifacts), but the output grid's transform is unchanged.
Definition: GridTransformer.h:523
+
bool eq(const Mat4 &m, T eps=1.0e-8) const
Test if "this" is equivalent to m with tolerance of eps value.
Definition: Mat4.h:375
+
void changeBackground(TreeOrLeafManagerT &tree, const typename TreeOrLeafManagerT::ValueType &background, bool threaded=true, size_t grainSize=32)
Replace the background value in all the nodes of a tree.
Definition: ChangeBackground.h:230
+ +
void preRotate(Axis axis, T angle)
Left multiplies by a rotation clock-wiseabout the given axis into this matrix.
Definition: Mat4.h:840
+
Vec3< int32_t > Vec3i
Definition: Vec3.h:648
+
Defined various multi-threaded utility functions for trees.
+ +
TileSampler(const CoordBBox &, const typename TreeT::ValueType &, bool)
Definition: GridTransformer.h:161
+
GridResampler()
Definition: GridTransformer.h:193
+
TileSampler(const CoordBBox &b, const ValueT &tileVal, bool on)
Definition: GridTransformer.h:128
+
Mat4R invMat
Definition: GridTransformer.h:392
+
void preTranslate(const Vec3< T0 > &tr)
Left multiples by the specified translation, i.e. Trans * (*this)
Definition: Mat4.h:745
+
bool isAffine() const
Definition: GridTransformer.h:415
+
bool isApproxEqual(const Type &a, const Type &b)
Return true if a is equal to b to within the default floating-point comparison tolerance.
Definition: Math.h:370
+ + +
Provises a unified interface for sampling, i.e. interpolation.
Definition: Interpolation.h:90
+
void applyTransform(const Transformer &, const GridT &inGrid, GridT &outGrid) const
Definition: GridTransformer.h:868
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
openvdb::Vec3R invTransform(const openvdb::Vec3R &pos) const
Definition: GridTransformer.h:424
+
Definition: Interpolation.h:223
+
void transformGrid(const Transformer &, const GridT &inGrid, GridT &outGrid) const
Definition: GridTransformer.h:683
+
bool sample(const TreeT &inTree, const Vec3R &inCoord, ValueT &result) const
Definition: GridTransformer.h:135
+ +
Propagates the sign of distance values from the active voxels in the narrow band to the inactive valu...
+
Definition: TreeIterator.h:1339
+
T & x()
Reference to the component, e.g. v.x() = 4.5f;.
Definition: Vec3.h:97
+
Calculate an axis-aligned bounding box in index space from a bounding sphere in world space...
Definition: Transform.h:66
+
ABTransform(const math::Transform &aXform, const math::Transform &bXform)
Definition: GridTransformer.h:408
+
bool isAffine() const
Definition: GridTransformer.h:386
+
bool isAffine(const Mat4< T > &m)
Definition: Mat4.h:1366
+
bool interrupt() const
Definition: GridTransformer.h:218
+
Definition: Exceptions.h:39
+
MatType scale(const Vec3< typename MatType::value_type > &s)
Return a matrix that scales by s.
Definition: Mat.h:594
+
3x3 matrix class.
Definition: Mat3.h:54
+
bool mEmpty
Definition: GridTransformer.h:144
+
A TileSampler wraps a grid sampler of another type (BoxSampler, QuadraticSampler, etc...
Definition: GridTransformer.h:120
+
Definition: Math.h:841
+
void setTranslation(const Vec3< T > &t)
Definition: Mat4.h:356
+
Definition: Exceptions.h:87
+
Vec3i floorVec3(const Vec3R &v)
Definition: Interpolation.h:610
+
void transformGrid(const GridT &inGrid, GridT &outGrid) const
Definition: GridTransformer.h:693
+
void doResampleToMatch(const GridType &inGrid, GridType &outGrid, Interrupter &interrupter)
Definition: GridTransformer.h:447
+
T & y()
Definition: Vec3.h:98
+
bool decompose(const math::Mat4< T > &m, math::Vec3< T > &scale, math::Vec3< T > &rotate, math::Vec3< T > &translate)
Decompose an affine transform into scale, rotation and translation components.
Definition: GridTransformer.h:297
+
bool isIdentity() const
Definition: GridTransformer.h:417
+
boost::shared_ptr< GridTransformer > Ptr
Definition: GridTransformer.h:258
+ +
const Mat4R & getTransform() const
Definition: GridTransformer.h:270
+
TreeT::ValueType ValueT
Definition: GridTransformer.h:123
+
Vec3< typename MatType::value_type > eulerAngles(const MatType &mat, RotationOrder rotationOrder, typename MatType::value_type eps=static_cast< typename MatType::value_type >(1.0e-8))
Return the Euler angles composing the given rotation matrix.
Definition: Mat.h:314
+ +
Definition: Exceptions.h:88
+
math::Vec3< Real > Vec3R
Definition: Types.h:76
+
static bool sample(const TreeT &inTree, const Vec3R &inCoord, typename TreeT::ValueType &result)
Sample inTree at the floating-point index coordinate inCoord and store the result in result...
+
MatrixTransform(const Mat4R &xform)
Definition: GridTransformer.h:384
+
Definition: Types.h:213
+
bool eq(const Mat3 &m, T eps=1.0e-8) const
Test if "this" is equivalent to m with tolerance of eps value.
Definition: Mat3.h:345
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
TileSampler(const CoordBBox &, const typename TreeT::ValueType &, bool)
Definition: GridTransformer.h:153
+
Vec2< T > maxComponent(const Vec2< T > &v1, const Vec2< T > &v2)
Return component-wise maximum of the two vectors.
Definition: Vec2.h:528
+
Definition: Interpolation.h:123
+
Mat4R mat
Definition: GridTransformer.h:392
+
This class implements the Transformer functor interface (specifically, the isAffine(), transform() and invTransform() methods) for a transform that maps an A grid into a B grid's index space such that, after resampling, A's index space and transform match B's index space and transform.
Definition: GridTransformer.h:403
+
void preScale(const Vec3< T0 > &v)
Definition: Mat4.h:778
+
const math::Transform & getB() const
Definition: GridTransformer.h:430
+
bool wasInterrupted(T *i, int percent=-1)
Definition: NullInterrupter.h:76
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & min(const T &a, const T &b)
Definition: Composite.h:128
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/Grid_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/Grid_8h_source.html new file mode 100644 index 00000000..d88fe65f --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/Grid_8h_source.html @@ -0,0 +1,1383 @@ + + + + + + +OpenVDB: Grid.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Grid.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 
+
31 #ifndef OPENVDB_GRID_HAS_BEEN_INCLUDED
+
32 #define OPENVDB_GRID_HAS_BEEN_INCLUDED
+
33 
+
34 #include <iostream>
+
35 #include <set>
+
36 #include <vector>
+
37 #include <boost/static_assert.hpp>
+
38 #include <boost/type_traits/remove_const.hpp>
+
39 #include <boost/type_traits/is_floating_point.hpp>
+
40 #include <openvdb/Types.h>
+
41 #include <openvdb/util/Name.h>
+
42 #include <openvdb/math/Transform.h>
+
43 #include <openvdb/tree/Tree.h>
+ +
45 #include <openvdb/Exceptions.h>
+
46 
+
47 
+
48 namespace openvdb {
+ +
50 namespace OPENVDB_VERSION_NAME {
+
51 
+ +
53 
+
54 template<typename> class Grid; // forward declaration
+
55 
+
56 
+
61 template<typename GridType>
+
62 inline typename GridType::Ptr createGrid(const typename GridType::ValueType& background);
+
63 
+
64 
+
68 template<typename GridType>
+
69 inline typename GridType::Ptr createGrid();
+
70 
+
71 
+
76 template<typename TreePtrType>
+ +
78 
+
79 
+
94 template<typename GridType>
+
95 typename GridType::Ptr createLevelSet(
+
96  Real voxelSize = 1.0, Real halfWidth = LEVEL_SET_HALF_WIDTH);
+
97 
+
98 
+
100 
+
101 
+ +
104 {
+
105 public:
+
106  typedef boost::shared_ptr<GridBase> Ptr;
+
107  typedef boost::shared_ptr<const GridBase> ConstPtr;
+
108 
+
109  typedef Ptr (*GridFactory)();
+
110 
+
111 
+
112  virtual ~GridBase() {}
+
113 
+
116  virtual GridBase::Ptr copyGrid(CopyPolicy treePolicy = CP_SHARE) const = 0;
+
117 
+
119  virtual GridBase::Ptr deepCopyGrid() const = 0;
+
120 
+
121 
+
122  //
+
123  // Registry methods
+
124  //
+
126  static Ptr createGrid(const Name& type);
+
127 
+
129  static bool isRegistered(const Name &type);
+
130 
+
132  static void clearRegistry();
+
133 
+
134 
+
135  //
+
136  // Grid type methods
+
137  //
+
139  virtual Name type() const = 0;
+
141  virtual Name valueType() const = 0;
+
142 
+
144  template<typename GridType>
+
145  bool isType() const { return (this->type() == GridType::gridType()); }
+
146 
+
148  template<typename GridType>
+
151  static typename GridType::Ptr grid(const GridBase::Ptr&);
+
152  template<typename GridType>
+
153  static typename GridType::ConstPtr grid(const GridBase::ConstPtr&);
+
154  template<typename GridType>
+
155  static typename GridType::ConstPtr constGrid(const GridBase::Ptr&);
+
156  template<typename GridType>
+
157  static typename GridType::ConstPtr constGrid(const GridBase::ConstPtr&);
+
159 
+
161  TreeBase::Ptr baseTreePtr();
+
164  TreeBase::ConstPtr baseTreePtr() const { return this->constBaseTreePtr(); }
+
165  virtual TreeBase::ConstPtr constBaseTreePtr() const = 0;
+
167 
+
169  TreeBase& baseTree() { return const_cast<TreeBase&>(this->constBaseTree()); }
+
174  const TreeBase& baseTree() const { return this->constBaseTree(); }
+
175  const TreeBase& constBaseTree() const { return *(this->constBaseTreePtr()); }
+
177 
+
183  virtual void setTree(TreeBase::Ptr) = 0;
+
184 
+
186  virtual void newTree() = 0;
+
187 
+
189  virtual bool empty() const = 0;
+
191  virtual void clear() = 0;
+
192 
+
198  virtual void pruneGrid(float tolerance = 0.0) = 0;
+
199 
+
200 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
201  void clipGrid(const BBoxd&);
+
206 
+
211  virtual void clip(const CoordBBox&) = 0;
+
212 #endif
+
213 
+
214 
+
215  //
+
216  // Metadata
+
217  //
+
219  std::string getName() const;
+
221  void setName(const std::string&);
+
222 
+
224  std::string getCreator() const;
+
226  void setCreator(const std::string&);
+
227 
+
230  bool saveFloatAsHalf() const;
+
231  void setSaveFloatAsHalf(bool);
+
232 
+
234  GridClass getGridClass() const;
+
236  void setGridClass(GridClass);
+
238  void clearGridClass();
+
239 
+
241  static std::string gridClassToString(GridClass);
+
243  static std::string gridClassToMenuName(GridClass);
+
247  static GridClass stringToGridClass(const std::string&);
+
248 
+
251  VecType getVectorType() const;
+
254  void setVectorType(VecType);
+
256  void clearVectorType();
+
257 
+
259  static std::string vecTypeToString(VecType);
+
262  static std::string vecTypeExamples(VecType);
+
265  static std::string vecTypeDescription(VecType);
+
266  static VecType stringToVecType(const std::string&);
+
267 
+
271  bool isInWorldSpace() const;
+
273  void setIsInWorldSpace(bool);
+
274 
+
275  // Standard metadata field names
+
276  // (These fields should normally not be accessed directly, but rather
+
277  // via the accessor methods above, when available.)
+
278  // Note: Visual C++ requires these declarations to be separate statements.
+
279  static const char* const META_GRID_CLASS;
+
280  static const char* const META_GRID_CREATOR;
+
281  static const char* const META_GRID_NAME;
+
282  static const char* const META_SAVE_HALF_FLOAT;
+
283  static const char* const META_IS_LOCAL_SPACE;
+
284  static const char* const META_VECTOR_TYPE;
+
285  static const char* const META_FILE_BBOX_MIN;
+
286  static const char* const META_FILE_BBOX_MAX;
+
287  static const char* const META_FILE_COMPRESSION;
+
288  static const char* const META_FILE_MEM_BYTES;
+
289  static const char* const META_FILE_VOXEL_COUNT;
+
290 
+
291 
+
292  //
+
293  // Statistics
+
294  //
+
296  virtual Index64 activeVoxelCount() const = 0;
+
297 
+
300  virtual CoordBBox evalActiveVoxelBoundingBox() const = 0;
+
301 
+
303  virtual Coord evalActiveVoxelDim() const = 0;
+
304 
+
306  virtual Index64 memUsage() const = 0;
+
307 
+
312  void addStatsMetadata();
+
317  MetaMap::Ptr getStatsMetadata() const;
+
318 
+
319 
+
320  //
+
321  // Transform methods
+
322  //
+
324  math::Transform::Ptr transformPtr() { return mTransform; }
+
327  math::Transform::ConstPtr transformPtr() const { return mTransform; }
+
328  math::Transform::ConstPtr constTransformPtr() const { return mTransform; }
+
330 
+
331  math::Transform& transform() { return *mTransform; }
+
336  const math::Transform& transform() const { return *mTransform; }
+
337  const math::Transform& constTransform() const { return *mTransform; }
+
339  void setTransform(math::Transform::Ptr);
+
345 
+
347  Vec3d voxelSize() const { return transform().voxelSize(); }
+
350  Vec3d voxelSize(const Vec3d& xyz) const { return transform().voxelSize(xyz); }
+
352  bool hasUniformVoxels() const { return mTransform->hasUniformScale(); }
+
354  Vec3d indexToWorld(const Vec3d& xyz) const { return transform().indexToWorld(xyz); }
+
356  Vec3d indexToWorld(const Coord& ijk) const { return transform().indexToWorld(ijk); }
+
358  Vec3d worldToIndex(const Vec3d& xyz) const { return transform().worldToIndex(xyz); }
+
360 
+
361 
+
362  //
+
363  // I/O methods
+
364  //
+
367  virtual void readTopology(std::istream&) = 0;
+
370  virtual void writeTopology(std::ostream&) const = 0;
+
371 
+
373  virtual void readBuffers(std::istream&) = 0;
+
374 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
375  virtual void readBuffers(std::istream&, const CoordBBox&) = 0;
+
382  virtual void readNonresidentBuffers() const = 0;
+
383 #endif
+
384  virtual void writeBuffers(std::ostream&) const = 0;
+
386 
+
388  void readTransform(std::istream& is) { transform().read(is); }
+
390  void writeTransform(std::ostream& os) const { transform().write(os); }
+
391 
+
393  virtual void print(std::ostream& = std::cout, int verboseLevel = 1) const = 0;
+
394 
+
395 
+
396 protected:
+
398  GridBase(): mTransform(math::Transform::createLinearTransform()) {}
+
399 
+
401  GridBase(const GridBase& other): MetaMap(other), mTransform(other.mTransform->copy()) {}
+
402 
+
404  GridBase(const GridBase& other, ShallowCopy): MetaMap(other), mTransform(other.mTransform) {}
+
405 
+
407  static void registerGrid(const Name& type, GridFactory);
+
409  static void unregisterGrid(const Name& type);
+
410 
+
411 
+
412 private:
+
413  math::Transform::Ptr mTransform;
+
414 }; // class GridBase
+
415 
+
416 
+
418 
+
419 
+
420 typedef std::vector<GridBase::Ptr> GridPtrVec;
+
421 typedef GridPtrVec::iterator GridPtrVecIter;
+
422 typedef GridPtrVec::const_iterator GridPtrVecCIter;
+
423 typedef boost::shared_ptr<GridPtrVec> GridPtrVecPtr;
+
424 
+
425 typedef std::vector<GridBase::ConstPtr> GridCPtrVec;
+
426 typedef GridCPtrVec::iterator GridCPtrVecIter;
+
427 typedef GridCPtrVec::const_iterator GridCPtrVecCIter;
+
428 typedef boost::shared_ptr<GridCPtrVec> GridCPtrVecPtr;
+
429 
+
430 typedef std::set<GridBase::Ptr> GridPtrSet;
+
431 typedef GridPtrSet::iterator GridPtrSetIter;
+
432 typedef GridPtrSet::const_iterator GridPtrSetCIter;
+
433 typedef boost::shared_ptr<GridPtrSet> GridPtrSetPtr;
+
434 
+
435 typedef std::set<GridBase::ConstPtr> GridCPtrSet;
+
436 typedef GridCPtrSet::iterator GridCPtrSetIter;
+
437 typedef GridCPtrSet::const_iterator GridCPtrSetCIter;
+
438 typedef boost::shared_ptr<GridCPtrSet> GridCPtrSetPtr;
+
439 
+
440 
+ +
443 {
+
444  GridNamePred(const Name& _name): name(_name) {}
+
445  bool operator()(const GridBase::ConstPtr& g) const { return g && g->getName() == name; }
+ +
447 };
+
448 
+
450 template<typename GridPtrContainerT>
+
451 inline typename GridPtrContainerT::value_type
+
452 findGridByName(const GridPtrContainerT& container, const Name& name)
+
453 {
+
454  typedef typename GridPtrContainerT::value_type GridPtrT;
+
455  typename GridPtrContainerT::const_iterator it =
+
456  std::find_if(container.begin(), container.end(), GridNamePred(name));
+
457  return (it == container.end() ? GridPtrT() : *it);
+
458 }
+
459 
+
461 template<typename KeyT, typename GridPtrT>
+
462 inline GridPtrT
+
463 findGridByName(const std::map<KeyT, GridPtrT>& container, const Name& name)
+
464 {
+
465  typedef std::map<KeyT, GridPtrT> GridPtrMapT;
+
466  for (typename GridPtrMapT::const_iterator it = container.begin(), end = container.end();
+
467  it != end; ++it)
+
468  {
+
469  const GridPtrT& grid = it->second;
+
470  if (grid && grid->getName() == name) return grid;
+
471  }
+
472  return GridPtrT();
+
473 }
+
475 
+
476 
+
478 
+
479 
+
481 template<typename _TreeType>
+
482 class Grid: public GridBase
+
483 {
+
484 public:
+
485  typedef boost::shared_ptr<Grid> Ptr;
+
486  typedef boost::shared_ptr<const Grid> ConstPtr;
+
487 
+
488  typedef _TreeType TreeType;
+
489  typedef typename _TreeType::Ptr TreePtrType;
+
490  typedef typename _TreeType::ConstPtr ConstTreePtrType;
+
491  typedef typename _TreeType::ValueType ValueType;
+
492  typedef typename _TreeType::BuildType BuildType;
+
493 
+
494  typedef typename _TreeType::ValueOnIter ValueOnIter;
+
495  typedef typename _TreeType::ValueOnCIter ValueOnCIter;
+
496  typedef typename _TreeType::ValueOffIter ValueOffIter;
+
497  typedef typename _TreeType::ValueOffCIter ValueOffCIter;
+
498  typedef typename _TreeType::ValueAllIter ValueAllIter;
+
499  typedef typename _TreeType::ValueAllCIter ValueAllCIter;
+
500 
+ + + + +
505 
+
512  template<typename OtherValueType>
+
513  struct ValueConverter {
+ +
515  };
+
516 
+
518  static Ptr create(const ValueType& background);
+
520  static Ptr create();
+
523  static Ptr create(TreePtrType);
+
526  static Ptr create(const GridBase& other);
+
527 
+
528 
+
530  Grid();
+
532  explicit Grid(const ValueType& background);
+
536  explicit Grid(TreePtrType);
+
538  Grid(const Grid&);
+
544  template<typename OtherTreeType>
+
545  explicit Grid(const Grid<OtherTreeType>&);
+
547  Grid(const Grid&, ShallowCopy);
+
550  explicit Grid(const GridBase&);
+
551 
+
552  virtual ~Grid() {}
+
553 
+
555  Ptr copy(CopyPolicy treePolicy = CP_SHARE) const;
+
561  virtual GridBase::Ptr copyGrid(CopyPolicy treePolicy = CP_SHARE) const;
+
563 
+
564  Ptr deepCopy() const { return Ptr(new Grid(*this)); }
+
566  virtual GridBase::Ptr deepCopyGrid() const { return this->deepCopy(); }
+
568 
+
570  virtual Name type() const { return this->gridType(); }
+
572  static Name gridType() { return TreeType::treeType(); }
+
573 
+
574 
+
575  //
+
576  // Voxel access methods
+
577  //
+
579  virtual Name valueType() const { return tree().valueType(); }
+
580 
+
584  const ValueType& background() const { return mTree->background(); }
+
585 
+
587  virtual bool empty() const { return tree().empty(); }
+
589  virtual void clear() { tree().clear(); }
+
590 
+
594  Accessor getAccessor() { return Accessor(tree()); }
+
603  Accessor getUnsafeAccessor() { return UnsafeAccessor(tree()); }
+
605  ConstAccessor getAccessor() const { return ConstAccessor(tree()); }
+
607  ConstAccessor getConstAccessor() const { return ConstAccessor(tree()); }
+
609  ConstAccessor getConstUnsafeAccessor() const { return ConstUnsafeAccessor(tree()); }
+
618 
+
620  ValueOnIter beginValueOn() { return tree().beginValueOn(); }
+
622  ValueOnCIter beginValueOn() const { return tree().cbeginValueOn(); }
+
623  ValueOnCIter cbeginValueOn() const { return tree().cbeginValueOn(); }
+
625 
+
626  ValueOffIter beginValueOff() { return tree().beginValueOff(); }
+
628  ValueOffCIter beginValueOff() const { return tree().cbeginValueOff(); }
+
629  ValueOffCIter cbeginValueOff() const { return tree().cbeginValueOff(); }
+
631 
+
632  ValueAllIter beginValueAll() { return tree().beginValueAll(); }
+
634  ValueAllCIter beginValueAll() const { return tree().cbeginValueAll(); }
+
635  ValueAllCIter cbeginValueAll() const { return tree().cbeginValueAll(); }
+
637 
+
639  void evalMinMax(ValueType& minVal, ValueType& maxVal) const;
+
640 
+
651  void fill(const CoordBBox& bbox, const ValueType& value, bool active = true, bool sparse = true);
+
652 
+
654  virtual void pruneGrid(float tolerance = 0.0);
+
655 
+
656 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
657  virtual void clip(const CoordBBox&);
+
662 #endif
+
663 
+
669  void merge(Grid& other, MergePolicy policy = MERGE_ACTIVE_STATES);
+
670 
+
684  template<typename OtherTreeType>
+
685  void topologyUnion(const Grid<OtherTreeType>& other);
+
686 
+
699  template<typename OtherTreeType>
+
700  void topologyIntersection(const Grid<OtherTreeType>& other);
+
701 
+
712  template<typename OtherTreeType>
+
713  void topologyDifference(const Grid<OtherTreeType>& other);
+
714 
+
715  //
+
716  // Statistics
+
717  //
+
719  virtual Index64 activeVoxelCount() const { return tree().activeVoxelCount(); }
+
721  virtual CoordBBox evalActiveVoxelBoundingBox() const;
+
723  virtual Coord evalActiveVoxelDim() const;
+
724 
+
727  virtual Index64 memUsage() const { return tree().memUsage(); }
+
728 
+
729 
+
730  //
+
731  // Tree methods
+
732  //
+
734  TreePtrType treePtr() { return mTree; }
+
737  ConstTreePtrType treePtr() const { return mTree; }
+
738  ConstTreePtrType constTreePtr() const { return mTree; }
+
739  virtual TreeBase::ConstPtr constBaseTreePtr() const { return mTree; }
+
741 
+
742  TreeType& tree() { return *mTree; }
+
747  const TreeType& tree() const { return *mTree; }
+
748  const TreeType& constTree() const { return *mTree; }
+
750 
+
756  virtual void setTree(TreeBase::Ptr);
+
757 
+
760  virtual void newTree();
+
761 
+
762 
+
763  //
+
764  // I/O methods
+
765  //
+
768  virtual void readTopology(std::istream&);
+
771  virtual void writeTopology(std::ostream&) const;
+
772 
+
774  virtual void readBuffers(std::istream&);
+
775 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
776  virtual void readBuffers(std::istream&, const CoordBBox&);
+
783  virtual void readNonresidentBuffers() const;
+
784 #endif
+
785  virtual void writeBuffers(std::ostream&) const;
+
787 
+
789  virtual void print(std::ostream& = std::cout, int verboseLevel = 1) const;
+
790 
+
791 
+
792  //
+
793  // Registry methods
+
794  //
+ +
798  static void registerGrid() { GridBase::registerGrid(Grid::gridType(), Grid::factory); }
+ +
801 
+
802 
+
803 private:
+
805  Grid& operator=(const Grid& other);
+
806 
+
808  static GridBase::Ptr factory() { return Grid::create(); }
+
809 
+
810  TreePtrType mTree;
+
811 }; // class Grid
+
812 
+
813 
+
815 
+
816 
+
824 template<typename GridType>
+
825 inline typename GridType::Ptr
+ +
827 {
+
828  return GridBase::grid<GridType>(grid);
+
829 }
+
830 
+
831 
+
840 template<typename GridType>
+
841 inline typename GridType::ConstPtr
+ +
843 {
+
844  return GridBase::constGrid<GridType>(grid);
+
845 }
+
846 
+
847 
+
849 
+
850 
+
857 template<typename GridType>
+
858 inline typename GridType::Ptr
+ +
860 {
+
861  if (!grid || !grid->isType<GridType>()) return typename GridType::Ptr();
+
862  return gridPtrCast<GridType>(grid->deepCopyGrid());
+
863 }
+
864 
+
865 
+
866 template<typename GridType>
+
867 inline typename GridType::Ptr
+ +
869 {
+
870  if (!grid.isType<GridType>()) return typename GridType::Ptr();
+
871  return gridPtrCast<GridType>(grid.deepCopyGrid());
+
872 }
+
874 
+
875 
+
877 
+
878 
+
880 template<typename _TreeType>
+ +
884 {
+
885  typedef _TreeType TreeType;
+
886  typedef typename boost::remove_const<TreeType>::type NonConstTreeType;
+
887  typedef typename TreeType::Ptr TreePtrType;
+
888  typedef typename TreeType::ConstPtr ConstTreePtrType;
+
889  typedef typename NonConstTreeType::Ptr NonConstTreePtrType;
+ + +
892  typedef typename GridType::Ptr GridPtrType;
+ + +
895  typedef typename TreeType::ValueType ValueType;
+ + + +
899 
+
900  static TreeType& tree(TreeType& t) { return t; }
+
901  static TreeType& tree(GridType& g) { return g.tree(); }
+
902  static const TreeType& tree(const TreeType& t) { return t; }
+
903  static const TreeType& tree(const GridType& g) { return g.tree(); }
+
904  static const TreeType& constTree(TreeType& t) { return t; }
+
905  static const TreeType& constTree(GridType& g) { return g.constTree(); }
+
906  static const TreeType& constTree(const TreeType& t) { return t; }
+
907  static const TreeType& constTree(const GridType& g) { return g.constTree(); }
+
908 };
+
909 
+
910 
+
912 template<typename _TreeType>
+
913 struct TreeAdapter<Grid<_TreeType> >
+
914 {
+
915  typedef _TreeType TreeType;
+
916  typedef typename boost::remove_const<TreeType>::type NonConstTreeType;
+
917  typedef typename TreeType::Ptr TreePtrType;
+
918  typedef typename TreeType::ConstPtr ConstTreePtrType;
+
919  typedef typename NonConstTreeType::Ptr NonConstTreePtrType;
+ + +
922  typedef typename GridType::Ptr GridPtrType;
+ + +
925  typedef typename TreeType::ValueType ValueType;
+ + + +
929 
+
930  static TreeType& tree(TreeType& t) { return t; }
+
931  static TreeType& tree(GridType& g) { return g.tree(); }
+
932  static const TreeType& tree(const TreeType& t) { return t; }
+
933  static const TreeType& tree(const GridType& g) { return g.tree(); }
+
934  static const TreeType& constTree(TreeType& t) { return t; }
+
935  static const TreeType& constTree(GridType& g) { return g.constTree(); }
+
936  static const TreeType& constTree(const TreeType& t) { return t; }
+
937  static const TreeType& constTree(const GridType& g) { return g.constTree(); }
+
938 };
+
939 
+
941 template<typename _TreeType>
+
942 struct TreeAdapter<tree::ValueAccessor<_TreeType> >
+
943 {
+
944  typedef _TreeType TreeType;
+
945  typedef typename boost::remove_const<TreeType>::type NonConstTreeType;
+
946  typedef typename TreeType::Ptr TreePtrType;
+
947  typedef typename TreeType::ConstPtr ConstTreePtrType;
+
948  typedef typename NonConstTreeType::Ptr NonConstTreePtrType;
+ + +
951  typedef typename GridType::Ptr GridPtrType;
+ + +
954  typedef typename TreeType::ValueType ValueType;
+ + + +
958 
+
959  static TreeType& tree(TreeType& t) { return t; }
+
960  static TreeType& tree(GridType& g) { return g.tree(); }
+
961  static TreeType& tree(AccessorType& a) { return a.tree(); }
+
962  static const TreeType& tree(const TreeType& t) { return t; }
+
963  static const TreeType& tree(const GridType& g) { return g.tree(); }
+
964  static const TreeType& tree(const AccessorType& a) { return a.tree(); }
+
965  static const TreeType& constTree(TreeType& t) { return t; }
+
966  static const TreeType& constTree(GridType& g) { return g.constTree(); }
+
967  static const TreeType& constTree(const TreeType& t) { return t; }
+
968  static const TreeType& constTree(const GridType& g) { return g.constTree(); }
+
969 };
+
970 
+
972 
+
973 
+
975 
+
976 
+
977 template<typename GridType>
+
978 inline typename GridType::Ptr
+ +
980 {
+
981  // The string comparison on type names is slower than a dynamic_pointer_cast, but
+
982  // it is safer when pointers cross dso boundaries, as they do in many Houdini nodes.
+
983  if (grid && grid->type() == GridType::gridType()) {
+
984  return boost::static_pointer_cast<GridType>(grid);
+
985  }
+
986  return typename GridType::Ptr();
+
987 }
+
988 
+
989 
+
990 template<typename GridType>
+
991 inline typename GridType::ConstPtr
+ +
993 {
+
994  return boost::const_pointer_cast<const GridType>(
+
995  GridBase::grid<GridType>(boost::const_pointer_cast<GridBase>(grid)));
+
996 }
+
997 
+
998 
+
999 template<typename GridType>
+
1000 inline typename GridType::ConstPtr
+ +
1002 {
+
1003  return boost::const_pointer_cast<const GridType>(GridBase::grid<GridType>(grid));
+
1004 }
+
1005 
+
1006 
+
1007 template<typename GridType>
+
1008 inline typename GridType::ConstPtr
+ +
1010 {
+
1011  return boost::const_pointer_cast<const GridType>(
+
1012  GridBase::grid<GridType>(boost::const_pointer_cast<GridBase>(grid)));
+
1013 }
+
1014 
+
1015 
+
1016 inline TreeBase::Ptr
+ +
1018 {
+
1019  return boost::const_pointer_cast<TreeBase>(this->constBaseTreePtr());
+
1020 }
+
1021 
+
1022 
+
1023 inline void
+ +
1025 {
+
1026  if (!xform) OPENVDB_THROW(ValueError, "Transform pointer is null");
+
1027  mTransform = xform;
+
1028 }
+
1029 
+
1030 
+
1032 
+
1033 
+
1034 template<typename TreeT>
+
1035 inline Grid<TreeT>::Grid(): mTree(new TreeType)
+
1036 {
+
1037 }
+
1038 
+
1039 
+
1040 template<typename TreeT>
+
1041 inline Grid<TreeT>::Grid(const ValueType &background): mTree(new TreeType(background))
+
1042 {
+
1043 }
+
1044 
+
1045 
+
1046 template<typename TreeT>
+
1047 inline Grid<TreeT>::Grid(TreePtrType tree): mTree(tree)
+
1048 {
+
1049  if (!tree) OPENVDB_THROW(ValueError, "Tree pointer is null");
+
1050 }
+
1051 
+
1052 
+
1053 template<typename TreeT>
+
1054 inline Grid<TreeT>::Grid(const Grid& other):
+
1055  GridBase(other),
+
1056  mTree(boost::static_pointer_cast<TreeType>(other.mTree->copy()))
+
1057 {
+
1058 }
+
1059 
+
1060 
+
1061 template<typename TreeT>
+
1062 template<typename OtherTreeType>
+ +
1064  GridBase(other),
+
1065  mTree(new TreeType(other.constTree()))
+
1066 {
+
1067 }
+
1068 
+
1069 
+
1070 template<typename TreeT>
+
1071 inline Grid<TreeT>::Grid(const Grid& other, ShallowCopy):
+
1072  GridBase(other, ShallowCopy()),
+
1073  mTree(other.mTree)
+
1074 {
+
1075 }
+
1076 
+
1077 
+
1078 template<typename TreeT>
+
1079 inline Grid<TreeT>::Grid(const GridBase& other):
+
1080  GridBase(other),
+
1081  mTree(new TreeType)
+
1082 {
+
1083 }
+
1084 
+
1085 
+
1086 //static
+
1087 template<typename TreeT>
+
1088 inline typename Grid<TreeT>::Ptr
+ +
1090 {
+
1091  return Grid::create(zeroVal<ValueType>());
+
1092 }
+
1093 
+
1094 
+
1095 //static
+
1096 template<typename TreeT>
+
1097 inline typename Grid<TreeT>::Ptr
+
1098 Grid<TreeT>::create(const ValueType& background)
+
1099 {
+
1100  return Ptr(new Grid(background));
+
1101 }
+
1102 
+
1103 
+
1104 //static
+
1105 template<typename TreeT>
+
1106 inline typename Grid<TreeT>::Ptr
+ +
1108 {
+
1109  return Ptr(new Grid(tree));
+
1110 }
+
1111 
+
1112 
+
1113 //static
+
1114 template<typename TreeT>
+
1115 inline typename Grid<TreeT>::Ptr
+ +
1117 {
+
1118  return Ptr(new Grid(other));
+
1119 }
+
1120 
+
1121 
+
1123 
+
1124 
+
1125 template<typename TreeT>
+
1126 inline typename Grid<TreeT>::Ptr
+ +
1128 {
+
1129  Ptr ret;
+
1130  switch (treePolicy) {
+
1131  case CP_NEW:
+
1132  ret.reset(new Grid(*this, ShallowCopy()));
+
1133  ret->newTree();
+
1134  break;
+
1135  case CP_COPY:
+
1136  ret.reset(new Grid(*this));
+
1137  break;
+
1138  case CP_SHARE:
+
1139  ret.reset(new Grid(*this, ShallowCopy()));
+
1140  break;
+
1141  }
+
1142  return ret;
+
1143 }
+
1144 
+
1145 
+
1146 template<typename TreeT>
+
1147 inline GridBase::Ptr
+ +
1149 {
+
1150  return this->copy(treePolicy);
+
1151 }
+
1152 
+
1153 
+
1155 
+
1156 
+
1157 template<typename TreeT>
+
1158 inline void
+ +
1160 {
+
1161  if (!tree) OPENVDB_THROW(ValueError, "Tree pointer is null");
+
1162  if (tree->type() != TreeType::treeType()) {
+
1163  OPENVDB_THROW(TypeError, "Cannot assign a tree of type "
+
1164  + tree->type() + " to a grid of type " + this->type());
+
1165  }
+
1166  mTree = boost::static_pointer_cast<TreeType>(tree);
+
1167 }
+
1168 
+
1169 
+
1170 template<typename TreeT>
+
1171 inline void
+ +
1173 {
+
1174  mTree.reset(new TreeType(this->background()));
+
1175 }
+
1176 
+
1177 
+
1179 
+
1180 
+
1181 template<typename TreeT>
+
1182 inline void
+
1183 Grid<TreeT>::fill(const CoordBBox& bbox, const ValueType& value, bool active, bool sparse)
+
1184 {
+
1185  tree().fill(bbox, value, active, sparse);
+
1186 }
+
1187 
+
1188 template<typename TreeT>
+
1189 inline void
+
1190 Grid<TreeT>::pruneGrid(float tolerance)
+
1191 {
+
1192  this->tree().prune(ValueType(zeroVal<ValueType>() + tolerance));
+
1193 }
+
1194 
+
1195 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
1196 template<typename TreeT>
+
1197 inline void
+
1198 Grid<TreeT>::clip(const CoordBBox& bbox)
+
1199 {
+
1200  tree().clip(bbox);
+
1201 }
+
1202 #endif
+
1203 
+
1204 
+
1205 template<typename TreeT>
+
1206 inline void
+ +
1208 {
+
1209  tree().merge(other.tree(), policy);
+
1210 }
+
1211 
+
1212 
+
1213 template<typename TreeT>
+
1214 template<typename OtherTreeType>
+
1215 inline void
+ +
1217 {
+
1218  tree().topologyUnion(other.tree());
+
1219 }
+
1220 
+
1221 
+
1222 template<typename TreeT>
+
1223 template<typename OtherTreeType>
+
1224 inline void
+ +
1226 {
+
1227  tree().topologyIntersection(other.tree());
+
1228 }
+
1229 
+
1230 
+
1231 template<typename TreeT>
+
1232 template<typename OtherTreeType>
+
1233 inline void
+ +
1235 {
+
1236  tree().topologyDifference(other.tree());
+
1237 }
+
1238 
+
1239 
+
1241 
+
1242 
+
1243 template<typename TreeT>
+
1244 inline void
+
1245 Grid<TreeT>::evalMinMax(ValueType& minVal, ValueType& maxVal) const
+
1246 {
+
1247  tree().evalMinMax(minVal, maxVal);
+
1248 }
+
1249 
+
1250 
+
1251 template<typename TreeT>
+
1252 inline CoordBBox
+ +
1254 {
+
1255  CoordBBox bbox;
+
1256  tree().evalActiveVoxelBoundingBox(bbox);
+
1257  return bbox;
+
1258 }
+
1259 
+
1260 
+
1261 template<typename TreeT>
+
1262 inline Coord
+ +
1264 {
+
1265  Coord dim;
+
1266  const bool nonempty = tree().evalActiveVoxelDim(dim);
+
1267  return (nonempty ? dim : Coord());
+
1268 }
+
1269 
+
1270 
+
1272 
+
1273 
+
1276 
+
1277 template<typename TreeT>
+
1278 inline void
+
1279 Grid<TreeT>::readTopology(std::istream& is)
+
1280 {
+
1281  tree().readTopology(is, saveFloatAsHalf());
+
1282 }
+
1283 
+
1284 
+
1285 template<typename TreeT>
+
1286 inline void
+
1287 Grid<TreeT>::writeTopology(std::ostream& os) const
+
1288 {
+
1289  tree().writeTopology(os, saveFloatAsHalf());
+
1290 }
+
1291 
+
1292 
+
1293 template<typename TreeT>
+
1294 inline void
+
1295 Grid<TreeT>::readBuffers(std::istream& is)
+
1296 {
+
1297  tree().readBuffers(is, saveFloatAsHalf());
+
1298 }
+
1299 
+
1300 
+
1301 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
1302 
+
1303 template<typename TreeT>
+
1304 inline void
+
1305 Grid<TreeT>::readBuffers(std::istream& is, const CoordBBox& bbox)
+
1306 {
+
1307  tree().readBuffers(is, bbox, saveFloatAsHalf());
+
1308 }
+
1309 
+
1310 
+
1311 template<typename TreeT>
+
1312 inline void
+ +
1314 {
+
1315  tree().readNonresidentBuffers();
+
1316 }
+
1317 
+
1318 #endif // !OPENVDB_2_ABI_COMPATIBLE
+
1319 
+
1320 
+
1321 template<typename TreeT>
+
1322 inline void
+
1323 Grid<TreeT>::writeBuffers(std::ostream& os) const
+
1324 {
+
1325  tree().writeBuffers(os, saveFloatAsHalf());
+
1326 }
+
1327 
+
1328 
+
1329 template<typename TreeT>
+
1330 inline void
+
1331 Grid<TreeT>::print(std::ostream& os, int verboseLevel) const
+
1332 {
+
1333  tree().print(os, verboseLevel);
+
1334 
+
1335  if (metaCount() > 0) {
+
1336  os << "Additional metadata:" << std::endl;
+
1337  for (ConstMetaIterator it = beginMeta(), end = endMeta(); it != end; ++it) {
+
1338  os << " " << it->first;
+
1339  if (it->second) {
+
1340  const std::string value = it->second->str();
+
1341  if (!value.empty()) os << ": " << value;
+
1342  }
+
1343  os << "\n";
+
1344  }
+
1345  }
+
1346 
+
1347  os << "Transform:" << std::endl;
+
1348  transform().print(os, /*indent=*/" ");
+
1349  os << std::endl;
+
1350 }
+
1351 
+
1352 
+
1354 
+
1355 
+
1356 template<typename GridType>
+
1357 inline typename GridType::Ptr
+
1358 createGrid(const typename GridType::ValueType& background)
+
1359 {
+
1360  return GridType::create(background);
+
1361 }
+
1362 
+
1363 
+
1364 template<typename GridType>
+
1365 inline typename GridType::Ptr
+ +
1367 {
+
1368  return GridType::create();
+
1369 }
+
1370 
+
1371 
+
1372 template<typename TreePtrType>
+ +
1374 createGrid(TreePtrType tree)
+
1375 {
+
1376  typedef typename TreePtrType::element_type TreeType;
+
1377  return Grid<TreeType>::create(tree);
+
1378 }
+
1379 
+
1380 
+
1381 template<typename GridType>
+
1382 typename GridType::Ptr
+
1383 createLevelSet(Real voxelSize, Real halfWidth)
+
1384 {
+
1385  typedef typename GridType::ValueType ValueType;
+
1386 
+
1387  // GridType::ValueType is required to be a floating-point scalar.
+
1388  BOOST_STATIC_ASSERT(boost::is_floating_point<ValueType>::value);
+
1389 
+
1390  typename GridType::Ptr grid = GridType::create(
+
1391  /*background=*/static_cast<ValueType>(voxelSize * halfWidth));
+
1392  grid->setTransform(math::Transform::createLinearTransform(voxelSize));
+
1393  grid->setGridClass(GRID_LEVEL_SET);
+
1394  return grid;
+
1395 }
+
1396 
+
1397 } // namespace OPENVDB_VERSION_NAME
+
1398 } // namespace openvdb
+
1399 
+
1400 #endif // OPENVDB_GRID_HAS_BEEN_INCLUDED
+
1401 
+
1402 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
1403 // All rights reserved. This software is distributed under the
+
1404 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
static void registerGrid()
Register this grid type along with a factory function.
Definition: Grid.h:798
+
virtual GridBase::Ptr deepCopyGrid() const =0
Return a new grid whose metadata, transform and tree are deep copies of this grid's.
+
boost::shared_ptr< GridCPtrSet > GridCPtrSetPtr
Definition: Grid.h:438
+
Definition: Types.h:434
+
GridType::ConstPtr ConstGridPtrType
Definition: Grid.h:924
+
GridCPtrVec::iterator GridCPtrVecIter
Definition: Grid.h:426
+
Base class for typed trees.
Definition: Tree.h:63
+
tree::ValueAccessor< TreeType > AccessorType
Definition: Grid.h:955
+
Definition: Types.h:439
+
static const TreeType & tree(const GridType &g)
Definition: Grid.h:933
+
ValueAllCIter beginValueAll() const
Return an iterator over all of this grid's values (tile and voxel).
Definition: Grid.h:634
+
Accessor getAccessor()
Return an accessor that provides random read and write access to this grid's voxels. The accessor is safe in the sense that it is registered by the tree of this grid.
Definition: Grid.h:594
+
virtual void clear()
Empty this grid, so that all voxels become inactive background voxels.
Definition: Grid.h:589
+
Grid< typename TreeType::template ValueConverter< OtherValueType >::Type > Type
Definition: Grid.h:514
+
static const char *const META_GRID_NAME
Definition: Grid.h:281
+
TreeType::Ptr TreePtrType
Definition: Grid.h:887
+
#define OPENVDB_API
Helper macros for defining library symbol visibility.
Definition: Platform.h:195
+
virtual bool empty() const
Return true if this grid contains only inactive background voxels.
Definition: Grid.h:587
+
bool operator()(const GridBase::ConstPtr &g) const
Definition: Grid.h:445
+
GridClass
Definition: Types.h:211
+
virtual void readTopology(std::istream &)
Read the grid topology from a stream. This will read only the grid structure, not the actual data buf...
Definition: Grid.h:1279
+
static TreeType & tree(GridType &g)
Definition: Grid.h:960
+
TreeType::ValueType ValueType
Definition: Grid.h:925
+
tree::ValueAccessor< TreeType > AccessorType
Definition: Grid.h:896
+
ValueOffCIter cbeginValueOff() const
Return an iterator over all of this grid's inactive values (tile and voxel).
Definition: Grid.h:629
+
boost::shared_ptr< const GridBase > ConstPtr
Definition: Grid.h:107
+ +
virtual GridBase::Ptr copyGrid(CopyPolicy treePolicy=CP_SHARE) const
Return a new grid of the same type as this grid and whose metadata and transform are deep copies of t...
Definition: Grid.h:1148
+
tree::ValueAccessor< TreeType > AccessorType
Definition: Grid.h:926
+
static Transform::Ptr createLinearTransform(double voxelSize=1.0)
Create and return a shared pointer to a new transform.
+
bool hasUniformVoxels() const
Return true if the voxels in world space are uniformly sized cubes.
Definition: Grid.h:352
+
static const TreeType & constTree(GridType &g)
Definition: Grid.h:966
+
virtual Index64 memUsage() const
Definition: Grid.h:727
+
Abstract base class for typed grids.
Definition: Grid.h:103
+
static const TreeType & constTree(TreeType &t)
Definition: Grid.h:934
+
std::vector< GridBase::Ptr > GridPtrVec
Definition: Grid.h:420
+
_TreeType TreeType
Definition: Grid.h:488
+
_TreeType::BuildType BuildType
Definition: Grid.h:492
+
static void unregisterGrid(const Name &type)
Remove a grid type from the registry.
+ +
boost::remove_const< TreeType >::type NonConstTreeType
Definition: Grid.h:886
+
virtual Name type() const
Return the name of this grid's type.
Definition: Grid.h:570
+
TreeType::ConstPtr ConstTreePtrType
Definition: Grid.h:918
+
void topologyIntersection(const Grid< OtherTreeType > &other)
Intersect this grid's set of active values with the active values of the other grid, whose value type may be different.
Definition: Grid.h:1225
+
virtual void writeTopology(std::ostream &) const
Write the grid topology to a stream. This will write only the grid structure, not the actual data buf...
Definition: Grid.h:1287
+
std::vector< GridBase::ConstPtr > GridCPtrVec
Definition: Grid.h:425
+
boost::shared_ptr< const TreeBase > ConstPtr
Definition: Tree.h:67
+
GridType::Ptr gridPtrCast(const GridBase::Ptr &grid)
Cast a generic grid pointer to a pointer to a grid of a concrete class.
Definition: Grid.h:826
+
GridType::Ptr GridPtrType
Definition: Grid.h:892
+
MetadataMap::const_iterator ConstMetaIterator
Definition: MetaMap.h:54
+
virtual void print(std::ostream &=std::cout, int verboseLevel=1) const
Output a human-readable description of this grid.
Definition: Grid.h:1331
+
static bool isRegistered(const Name &type)
Return true if the given grid type name is registered.
+
OPENVDB_API uint32_t getGridClass(std::ios_base &)
Return the class (GRID_LEVEL_SET, GRID_UNKNOWN, etc.) of the grid currently being read from or writte...
+
GridPtrSet::const_iterator GridPtrSetCIter
Definition: Grid.h:432
+
VecType
Definition: Types.h:241
+
NonConstTreeType::Ptr NonConstTreePtrType
Definition: Grid.h:948
+
TreeType::ValueType ValueType
Definition: Grid.h:954
+
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
+
tree::ValueAccessor< const TreeType > ConstAccessorType
Definition: Grid.h:897
+ + +
std::string Name
Definition: Name.h:44
+
const ValueType & background() const
Return this grid's background value.
Definition: Grid.h:584
+
static const Real LEVEL_SET_HALF_WIDTH
Definition: Types.h:219
+
Container that maps names (strings) to values of arbitrary types.
Definition: MetaMap.h:46
+
const TreeType & tree() const
Return a reference to this grid's tree, which might be shared with other grids.
Definition: Grid.h:747
+
tree::ValueAccessor< _TreeType, true > Accessor
Definition: Grid.h:501
+
static TreeType & tree(GridType &g)
Definition: Grid.h:931
+
NonConstTreeType::Ptr NonConstTreePtrType
Definition: Grid.h:919
+ +
math::Transform::ConstPtr constTransformPtr() const
Return a pointer to this grid's transform, which might be shared with other grids.
Definition: Grid.h:328
+
Vec3d voxelSize(const Vec3d &xyz) const
Return the size of this grid's voxel at position (x, y, z).
Definition: Grid.h:350
+
GridType::Ptr GridPtrType
Definition: Grid.h:922
+
GridType::ConstPtr ConstGridPtrType
Definition: Grid.h:953
+
void topologyDifference(const Grid< OtherTreeType > &other)
Difference this grid's set of active values with the active values of the other grid, whose value type may be different.
Definition: Grid.h:1234
+
_TreeType::ValueOffIter ValueOffIter
Definition: Grid.h:496
+
Grid< NonConstTreeType > NonConstGridType
Definition: Grid.h:950
+
tree::ValueAccessor< const TreeType > ConstAccessorType
Definition: Grid.h:927
+
GridPtrSet::iterator GridPtrSetIter
Definition: Grid.h:431
+
_TreeType::Ptr TreePtrType
Definition: Grid.h:489
+
boost::remove_const< TreeType >::type NonConstTreeType
Definition: Grid.h:916
+
boost::shared_ptr< TreeBase > Ptr
Definition: Tree.h:66
+
void evalMinMax(ValueType &minVal, ValueType &maxVal) const
Return the minimum and maximum active values in this grid.
Definition: Grid.h:1245
+
ConstTreePtrType constTreePtr() const
Return a pointer to this grid's tree, which might be shared with other grids. The pointer is guarante...
Definition: Grid.h:738
+
_TreeType::ValueOffCIter ValueOffCIter
Definition: Grid.h:497
+
ValueConverter::Type is the type of a grid having the same hierarchy as this grid but a different ...
Definition: Grid.h:513
+
virtual TreeBase::ConstPtr constBaseTreePtr() const
Return a pointer to this grid's tree, which might be shared with other grids. The pointer is guarante...
Definition: Grid.h:739
+
GridType::ConstPtr ConstGridPtrType
Definition: Grid.h:894
+
Name name
Definition: Grid.h:446
+ +
void fill(const CoordBBox &bbox, const ValueType &value, bool active=true, bool sparse=true)
Set all voxels within a given axis-aligned box to a constant value.
Definition: Grid.h:1183
+
boost::shared_ptr< GridPtrVec > GridPtrVecPtr
Definition: Grid.h:423
+
void merge(Grid &other, MergePolicy policy=MERGE_ACTIVE_STATES)
Efficiently merge another grid into this grid using one of several schemes.
Definition: Grid.h:1207
+ +
static TreeType & tree(TreeType &t)
Definition: Grid.h:930
+
Grid< TreeType > GridType
Definition: Grid.h:890
+
void readTransform(std::istream &is)
Read in the transform for this grid.
Definition: Grid.h:388
+
static const TreeType & tree(const TreeType &t)
Definition: Grid.h:902
+
boost::shared_ptr< Grid > Ptr
Definition: Grid.h:485
+
static void registerGrid(const Name &type, GridFactory)
Register a grid type along with a factory function.
+
static const TreeType & constTree(const GridType &g)
Definition: Grid.h:968
+
virtual void readNonresidentBuffers() const
Read all of this grid's data buffers that are not yet resident in memory (because delayed loading is ...
Definition: Grid.h:1313
+
boost::shared_ptr< GridPtrSet > GridPtrSetPtr
Definition: Grid.h:433
+ +
Definition: ValueAccessor.h:219
+
boost::shared_ptr< const Transform > ConstPtr
Definition: Transform.h:70
+
static const TreeType & constTree(const GridType &g)
Definition: Grid.h:937
+
tree::ValueAccessor< const _TreeType, false > ConstUnsafeAccessor
Definition: Grid.h:504
+
static const char *const META_FILE_MEM_BYTES
Definition: Grid.h:288
+
TreeType & tree()
Return a reference to this grid's tree, which might be shared with other grids.
Definition: Grid.h:746
+
double Real
Definition: Types.h:64
+
GridBase()
Initialize with an identity linear transform.
Definition: Grid.h:398
+
virtual void setTree(TreeBase::Ptr)
Associate the given tree with this grid, in place of its existing tree.
Definition: Grid.h:1159
+
static const TreeType & constTree(const TreeType &t)
Definition: Grid.h:906
+
static const char *const META_FILE_BBOX_MAX
Definition: Grid.h:286
+
ConstTreePtrType treePtr() const
Return a pointer to this grid's tree, which might be shared with other grids. The pointer is guarante...
Definition: Grid.h:737
+ +
Grid()
Construct a new grid with background value zero.
Definition: Grid.h:1035
+
_TreeType TreeType
Definition: Grid.h:915
+
Grid< NonConstTreeType > NonConstGridType
Definition: Grid.h:921
+
_TreeType::ValueOnIter ValueOnIter
Definition: Grid.h:494
+
uint64_t Index64
Definition: Types.h:57
+ +
TreeBase::Ptr baseTreePtr()
Return a pointer to this grid's tree, which might be shared with other grids. The pointer is guarante...
Definition: Grid.h:1017
+
Vec3d indexToWorld(const Coord &ijk) const
Apply this grid's transform to the given coordinates.
Definition: Grid.h:356
+
ConstAccessor getConstAccessor() const
Return an accessor that provides random read-only access to this grid's voxels.
Definition: Grid.h:607
+
static Ptr create()
Return a new grid with background value zero.
Definition: Grid.h:1089
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
tree::ValueAccessor< NonConstTreeType > NonConstAccessorType
Definition: Grid.h:928
+
virtual Index64 activeVoxelCount() const
Return the number of active voxels.
Definition: Grid.h:719
+
Vec3< double > Vec3d
Definition: Vec3.h:651
+
OPENVDB_STATIC_SPECIALIZATION GridType::Ptr clip(const GridType &grid, const BBoxd &)
Clip the given grid against a world-space bounding box and return a new grid containing the result...
Definition: Clip.h:356
+
GridCPtrSet::const_iterator GridCPtrSetCIter
Definition: Grid.h:437
+
ValueAllCIter cbeginValueAll() const
Return an iterator over all of this grid's values (tile and voxel).
Definition: Grid.h:635
+
static TreeType & tree(GridType &g)
Definition: Grid.h:901
+
_TreeType::ValueOnCIter ValueOnCIter
Definition: Grid.h:495
+
const math::Transform & constTransform() const
Return a reference to this grid's transform, which might be shared with other grids.
Definition: Grid.h:337
+
Calculate an axis-aligned bounding box in index space from a bounding sphere in world space...
Definition: Transform.h:66
+
virtual Coord evalActiveVoxelDim() const
Return the dimensions of the axis-aligned bounding box of all active voxels.
Definition: Grid.h:1263
+
tree::ValueAccessor< _TreeType, false > UnsafeAccessor
Definition: Grid.h:503
+
This adapter allows code that is templated on a Tree type to accept either a Tree type or a Grid type...
Definition: Grid.h:883
+
TreeType::Ptr TreePtrType
Definition: Grid.h:917
+
static const TreeType & constTree(const TreeType &t)
Definition: Grid.h:967
+
CopyPolicy
Definition: Types.h:434
+
MergePolicy
Definition: Types.h:264
+
Definition: Types.h:434
+
static const TreeType & constTree(GridType &g)
Definition: Grid.h:935
+
Definition: Exceptions.h:39
+
virtual void writeBuffers(std::ostream &) const
Write out all data buffers for this grid.
Definition: Grid.h:1323
+
NonConstGridType::Ptr NonConstGridPtrType
Definition: Grid.h:923
+
static const TreeType & constTree(const GridType &g)
Definition: Grid.h:907
+
static const TreeType & tree(const TreeType &t)
Definition: Grid.h:932
+
static const char *const META_GRID_CREATOR
Definition: Grid.h:280
+
GridType::ConstPtr gridConstPtrCast(const GridBase::ConstPtr &grid)
Cast a generic const grid pointer to a const pointer to a grid of a concrete class.
Definition: Grid.h:842
+
_TreeType::ValueAllIter ValueAllIter
Definition: Grid.h:498
+
Grid< typename TreePtrType::element_type >::Ptr createGrid(TreePtrType)
Create a new grid of the appropriate type that wraps the given tree.
Definition: Grid.h:1374
+
std::set< GridBase::Ptr > GridPtrSet
Definition: Grid.h:430
+
static void unregisterGrid()
Remove this grid type from the registry.
Definition: Grid.h:800
+
const TreeBase & constBaseTree() const
Return a reference to this grid's tree, which might be shared with other grids.
Definition: Grid.h:175
+
Accessor getUnsafeAccessor()
Return an accessor that provides random read and write access to this grid's voxels. The accessor is unsafe in the sense that it is not registered by the tree of this grid. In some rare cases this can give a performance advantage over a registered accessor but it is unsafe if the tree topology is modified.
Definition: Grid.h:603
+
virtual Name valueType() const
Return the name of the type of a voxel's value (e.g., "float" or "vec3d").
Definition: Grid.h:579
+
bool isType() const
Return true if this grid is of the same type as the template parameter.
Definition: Grid.h:145
+
virtual GridBase::Ptr deepCopyGrid() const
Return a new grid whose metadata, transform and tree are deep copies of this grid's.
Definition: Grid.h:566
+
GridPtrT findGridByName(const std::map< KeyT, GridPtrT > &container, const Name &name)
Return the first grid in the given map whose name is name.
Definition: Grid.h:463
+
tree::ValueAccessor< NonConstTreeType > NonConstAccessorType
Definition: Grid.h:957
+
boost::shared_ptr< GridCPtrVec > GridCPtrVecPtr
Definition: Grid.h:428
+
TreeType::ConstPtr ConstTreePtrType
Definition: Grid.h:888
+
_TreeType::ValueType ValueType
Definition: Grid.h:491
+
TreeBase::ConstPtr baseTreePtr() const
Return a pointer to this grid's tree, which might be shared with other grids. The pointer is guarante...
Definition: Grid.h:164
+
GridPtrVec::const_iterator GridPtrVecCIter
Definition: Grid.h:422
+
std::set< GridBase::ConstPtr > GridCPtrSet
Definition: Grid.h:435
+
NonConstTreeType::Ptr NonConstTreePtrType
Definition: Grid.h:889
+
static const TreeType & tree(const AccessorType &a)
Definition: Grid.h:964
+
OPENVDB_API void setGridClass(std::ios_base &, uint32_t)
Associate with the given stream the class (GRID_LEVEL_SET, GRID_UNKNOWN, etc.) of the grid currently ...
+
static const TreeType & tree(const TreeType &t)
Definition: Grid.h:962
+
Definition: Exceptions.h:87
+
GridPtrVec::iterator GridPtrVecIter
Definition: Grid.h:421
+
_TreeType TreeType
Definition: Grid.h:885
+
static TreeType & tree(TreeType &t)
Definition: Grid.h:959
+
_TreeType::ValueAllCIter ValueAllCIter
Definition: Grid.h:499
+
TreeType::ValueType ValueType
Definition: Grid.h:895
+
static const TreeType & tree(const GridType &g)
Definition: Grid.h:903
+
Grid< NonConstTreeType > NonConstGridType
Definition: Grid.h:891
+
tree::TreeBase TreeBase
Definition: Grid.h:52
+
tree::ValueAccessor< const TreeType > ConstAccessorType
Definition: Grid.h:956
+
void writeTransform(std::ostream &os) const
Write out the transform for this grid.
Definition: Grid.h:390
+
math::Transform::ConstPtr transformPtr() const
Return a pointer to this grid's transform, which might be shared with other grids.
Definition: Grid.h:327
+
boost::shared_ptr< const Grid > ConstPtr
Definition: Grid.h:486
+
virtual void pruneGrid(float tolerance=0.0)
Reduce the memory footprint of this grid by increasing its sparseness.
Definition: Grid.h:1190
+
static TreeType & tree(TreeType &t)
Definition: Grid.h:900
+
void topologyUnion(const Grid< OtherTreeType > &other)
Union this grid's set of active values with the active values of the other grid, whose value type may...
Definition: Grid.h:1216
+
static const char *const META_FILE_BBOX_MIN
Definition: Grid.h:285
+
Ptr copy(CopyPolicy treePolicy=CP_SHARE) const
Return a new grid of the same type as this grid and whose metadata and transform are deep copies of t...
Definition: Grid.h:1127
+
ValueOnCIter cbeginValueOn() const
Return an iterator over all of this grid's active values (tile and voxel).
Definition: Grid.h:623
+
const TreeType & constTree() const
Return a reference to this grid's tree, which might be shared with other grids.
Definition: Grid.h:748
+
GridBase(const GridBase &other, ShallowCopy)
Copy another grid's metadata but share its transform.
Definition: Grid.h:404
+
static const char *const META_FILE_VOXEL_COUNT
Definition: Grid.h:289
+
Vec3d voxelSize() const
Return the size of this grid's voxels.
Definition: Grid.h:347
+
static const TreeType & constTree(GridType &g)
Definition: Grid.h:905
+
static const char *const META_FILE_COMPRESSION
Definition: Grid.h:287
+
_TreeType::ConstPtr ConstTreePtrType
Definition: Grid.h:490
+
static const char *const META_GRID_CLASS
Definition: Grid.h:279
+
static const TreeType & constTree(TreeType &t)
Definition: Grid.h:965
+
Predicate functor that returns true for grids that have a specified name.
Definition: Grid.h:442
+
static Name gridType()
Return the name of this type of grid.
Definition: Grid.h:572
+
ValueOnCIter beginValueOn() const
Return an iterator over all of this grid's active values (tile and voxel).
Definition: Grid.h:622
+
Definition: Exceptions.h:88
+
virtual void clip(const CoordBBox &)
Clip this grid to the given index-space bounding box.
Definition: Grid.h:1198
+
virtual void newTree()
Associate a new, empty tree with this grid, in place of its existing tree.
Definition: Grid.h:1172
+
boost::shared_ptr< GridBase > Ptr
Definition: Grid.h:106
+
tree::ValueAccessor< const _TreeType, true > ConstAccessor
Definition: Grid.h:502
+
GridType::Ptr createLevelSet(Real voxelSize=1.0, Real halfWidth=LEVEL_SET_HALF_WIDTH)
Create a new grid of type GridType classified as a "Level Set", i.e., a narrow-band level set...
Definition: Grid.h:1383
+
virtual void readBuffers(std::istream &)
Read all data buffers for this grid.
Definition: Grid.h:1295
+
GridCPtrVec::const_iterator GridCPtrVecCIter
Definition: Grid.h:427
+
GridBase(const GridBase &other)
Deep copy another grid's metadata and transform.
Definition: Grid.h:401
+
const TreeBase & baseTree() const
Return a reference to this grid's tree, which might be shared with other grids.
Definition: Grid.h:174
+
GridType::Ptr deepCopyTypedGrid(const GridBase &grid)
Return a pointer to a deep copy of the given grid, provided that the grid's concrete type is GridType...
Definition: Grid.h:868
+
Grid< TreeType > GridType
Definition: Grid.h:920
+
TreeType & tree() const
Return a reference to the tree associated with this accessor.
Definition: ValueAccessor.h:147
+
static const char *const META_VECTOR_TYPE
Definition: Grid.h:284
+
Definition: Types.h:213
+
GridCPtrSet::iterator GridCPtrSetIter
Definition: Grid.h:436
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
boost::remove_const< TreeType >::type NonConstTreeType
Definition: Grid.h:945
+
virtual ~Grid()
Definition: Grid.h:552
+
static const TreeType & tree(const GridType &g)
Definition: Grid.h:963
+
static GridType::ConstPtr constGrid(const GridBase::Ptr &)
Return the result of downcasting a GridBase pointer to a Grid pointer of the specified type...
Definition: Grid.h:1001
+
static const TreeType & constTree(TreeType &t)
Definition: Grid.h:904
+
const math::Transform & transform() const
Return a reference to this grid's transform, which might be shared with other grids.
Definition: Grid.h:336
+
static const char *const META_IS_LOCAL_SPACE
Definition: Grid.h:283
+
GridType::Ptr createGrid(const typename GridType::ValueType &background)
Create a new grid of type GridType with a given background value.
Definition: Grid.h:1358
+
void setTransform(math::Transform::Ptr)
Associate the given transform with this grid, in place of its existing transform. ...
Definition: Grid.h:1024
+
NonConstGridType::Ptr NonConstGridPtrType
Definition: Grid.h:893
+
ValueOffCIter beginValueOff() const
Return an iterator over all of this grid's inactive values (tile and voxel).
Definition: Grid.h:628
+
virtual ~GridBase()
Definition: Grid.h:112
+
TreeT * tree
Definition: MaskToLevelSet.h:118
+
GridNamePred(const Name &_name)
Definition: Grid.h:444
+
Definition: Types.h:434
+
virtual CoordBBox evalActiveVoxelBoundingBox() const
Return the axis-aligned bounding box of all active voxels.
Definition: Grid.h:1253
+ +
boost::shared_ptr< Transform > Ptr
Definition: Transform.h:69
+
NonConstGridType::Ptr NonConstGridPtrType
Definition: Grid.h:952
+
TreeType::ConstPtr ConstTreePtrType
Definition: Grid.h:947
+
Container class that associates a tree with a transform and metadata.
Definition: Grid.h:54
+
static bool isRegistered()
Return true if this grid type is registered.
Definition: Grid.h:796
+
tree::ValueAccessor< NonConstTreeType > NonConstAccessorType
Definition: Grid.h:898
+ +
static GridType::Ptr grid(const GridBase::Ptr &)
Return the result of downcasting a GridBase pointer to a Grid pointer of the specified type...
Definition: Grid.h:979
+
static const TreeType & constTree(const TreeType &t)
Definition: Grid.h:936
+
static const char *const META_SAVE_HALF_FLOAT
Definition: Grid.h:282
+
boost::shared_ptr< MetaMap > Ptr
Definition: MetaMap.h:49
+
static TreeType & tree(AccessorType &a)
Definition: Grid.h:961
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/InternalNode_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/InternalNode_8h_source.html new file mode 100644 index 00000000..7b5bf0ac --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/InternalNode_8h_source.html @@ -0,0 +1,3255 @@ + + + + + + +OpenVDB: InternalNode.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
InternalNode.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
36 
+
37 #ifndef OPENVDB_TREE_INTERNALNODE_HAS_BEEN_INCLUDED
+
38 #define OPENVDB_TREE_INTERNALNODE_HAS_BEEN_INCLUDED
+
39 
+
40 #include <boost/shared_array.hpp>
+
41 #include <boost/static_assert.hpp>
+
42 #include <boost/mpl/if.hpp>
+
43 #include <boost/type_traits/is_const.hpp>
+
44 #include <boost/type_traits/is_pointer.hpp>
+
45 #include <boost/type_traits/remove_pointer.hpp>
+
46 #include <tbb/parallel_for.h>
+
47 #include <openvdb/Platform.h>
+
48 #include <openvdb/util/NodeMasks.h>
+
49 #include <openvdb/io/Compression.h> // for io::readData(), etc.
+
50 #include <openvdb/math/Math.h> // for Abs(), isExactlyEqual()
+
51 #include <openvdb/version.h>
+
52 #include <openvdb/Types.h>
+
53 #include "Iterator.h"
+
54 #include "NodeUnion.h"
+
55 
+
56 
+
57 namespace openvdb {
+ +
59 namespace OPENVDB_VERSION_NAME {
+
60 namespace tree {
+
61 
+
62 template<typename, Index, typename> struct SameInternalConfig; // forward declaration
+
63 
+
64 
+
65 template<typename _ChildNodeType, Index Log2Dim>
+ +
67 {
+
68 public:
+
69  typedef _ChildNodeType ChildNodeType;
+
70  typedef typename ChildNodeType::LeafNodeType LeafNodeType;
+
71  typedef typename ChildNodeType::ValueType ValueType;
+
72  typedef typename ChildNodeType::BuildType BuildType;
+ + +
75 
+
76  static const Index
+
77  LOG2DIM = Log2Dim,
+
78  TOTAL = Log2Dim + ChildNodeType::TOTAL,
+
79  DIM = 1 << TOTAL,
+
80  NUM_VALUES = 1 << (3 * Log2Dim),
+
81  LEVEL = 1 + ChildNodeType::LEVEL; // level 0 = leaf
+
82  static const Index64
+
83  NUM_VOXELS = uint64_t(1) << (3 * TOTAL); // total # of voxels represented by this node
+
84 
+
87  template<typename OtherValueType>
+
88  struct ValueConverter {
+
89  typedef InternalNode<typename ChildNodeType::template ValueConverter<
+
90  OtherValueType>::Type, Log2Dim> Type;
+
91  };
+
92 
+
96  template<typename OtherNodeType>
+ +
98  static const bool value =
+ +
100  };
+
101 
+
102 
+ +
104 
+
105  explicit InternalNode(const ValueType& offValue);
+
106 
+
107  InternalNode(const Coord&, const ValueType& fillValue, bool active = false);
+
108 
+
109 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
110  InternalNode(PartialCreate, const Coord&, const ValueType& fillValue, bool active = false);
+
111 #endif
+
112 
+
116  InternalNode(const InternalNode&);
+
117 
+
121  template<typename OtherChildNodeType>
+ +
123 
+
127  template<typename OtherChildNodeType>
+ +
129  const ValueType& background, TopologyCopy);
+
130 
+
134  template<typename OtherChildNodeType>
+ +
136  const ValueType& offValue, const ValueType& onValue, TopologyCopy);
+
137 
+
138  virtual ~InternalNode();
+
139 
+
140 protected:
+ + + +
144 
+
145  // Type tags to disambiguate template instantiations
+
146  struct ValueOn {}; struct ValueOff {}; struct ValueAll {};
+
147  struct ChildOn {}; struct ChildOff {}; struct ChildAll {};
+
148 
+
149  // The following class templates implement the iterator interfaces specified in Iterator.h
+
150  // by providing getItem(), setItem() and/or modifyItem() methods.
+
151 
+
152  template<typename NodeT, typename ChildT, typename MaskIterT, typename TagT>
+ +
154  MaskIterT, ChildIter<NodeT, ChildT, MaskIterT, TagT>, NodeT, ChildT>
+
155  {
+ +
157  ChildIter(const MaskIterT& iter, NodeT* parent): SparseIteratorBase<
+
158  MaskIterT, ChildIter<NodeT, ChildT, MaskIterT, TagT>, NodeT, ChildT>(iter, parent) {}
+
159 
+
160  ChildT& getItem(Index pos) const
+
161  {
+
162  assert(this->parent().isChildMaskOn(pos));
+
163  return *(this->parent().getChildNode(pos));
+
164  }
+
165 
+
166  // Note: setItem() can't be called on const iterators.
+
167  void setItem(Index pos, const ChildT& c) const { this->parent().resetChildNode(pos, &c); }
+
168 
+
169  // Note: modifyItem() isn't implemented, since it's not useful for child node pointers.
+
170  };// ChildIter
+
171 
+
172  template<typename NodeT, typename ValueT, typename MaskIterT, typename TagT>
+ +
174  MaskIterT, ValueIter<NodeT, ValueT, MaskIterT, TagT>, NodeT, ValueT>
+
175  {
+ +
177  ValueIter(const MaskIterT& iter, NodeT* parent): SparseIteratorBase<
+
178  MaskIterT, ValueIter<NodeT, ValueT, MaskIterT, TagT>, NodeT, ValueT>(iter, parent) {}
+
179 
+
180  const ValueT& getItem(Index pos) const { return this->parent().mNodes[pos].getValue(); }
+
181 
+
182  // Note: setItem() can't be called on const iterators.
+
183  void setItem(Index pos, const ValueT& v) const { this->parent().mNodes[pos].setValue(v); }
+
184 
+
185  // Note: modifyItem() can't be called on const iterators.
+
186  template<typename ModifyOp>
+
187  void modifyItem(Index pos, const ModifyOp& op) const
+
188  {
+
189  op(this->parent().mNodes[pos].getValue());
+
190  }
+
191  };// ValueIter
+
192 
+
193  template<typename NodeT, typename ChildT, typename ValueT, typename TagT>
+
194  struct DenseIter: public DenseIteratorBase<
+
195  MaskDenseIterator, DenseIter<NodeT, ChildT, ValueT, TagT>, NodeT, ChildT, ValueT>
+
196  {
+ + +
199 
+ +
201  DenseIter(const MaskDenseIterator& iter, NodeT* parent):
+
202  DenseIteratorBase<MaskDenseIterator, DenseIter, NodeT, ChildT, ValueT>(iter, parent) {}
+
203 
+
204  bool getItem(Index pos, ChildT*& child, NonConstValueT& value) const
+
205  {
+
206  if (this->parent().isChildMaskOn(pos)) {
+
207  child = this->parent().getChildNode(pos);
+
208  return true;
+
209  }
+
210  child = NULL;
+
211  value = this->parent().mNodes[pos].getValue();
+
212  return false;
+
213  }
+
214 
+
215  // Note: setItem() can't be called on const iterators.
+
216  void setItem(Index pos, ChildT* child) const
+
217  {
+
218  this->parent().resetChildNode(pos, child);
+
219  }
+
220 
+
221  // Note: unsetItem() can't be called on const iterators.
+
222  void unsetItem(Index pos, const ValueT& value) const
+
223  {
+
224  this->parent().unsetChildNode(pos, value);
+
225  }
+
226  };// DenseIter
+
227 
+
228 public:
+
229  // Iterators (see Iterator.h for usage)
+ + + + + + +
236 
+ + + + + + +
243 
+
244  ChildOnCIter cbeginChildOn() const { return ChildOnCIter(mChildMask.beginOn(), this); }
+
245  ChildOffCIter cbeginChildOff() const { return ChildOffCIter(mChildMask.beginOff(), this); }
+
246  ChildAllCIter cbeginChildAll() const { return ChildAllCIter(mChildMask.beginDense(), this); }
+
247  ChildOnCIter beginChildOn() const { return cbeginChildOn(); }
+
248  ChildOffCIter beginChildOff() const { return cbeginChildOff(); }
+
249  ChildAllCIter beginChildAll() const { return cbeginChildAll(); }
+
250  ChildOnIter beginChildOn() { return ChildOnIter(mChildMask.beginOn(), this); }
+
251  ChildOffIter beginChildOff() { return ChildOffIter(mChildMask.beginOff(), this); }
+
252  ChildAllIter beginChildAll() { return ChildAllIter(mChildMask.beginDense(), this); }
+
253 
+
254  ValueOnCIter cbeginValueOn() const { return ValueOnCIter(mValueMask.beginOn(), this); }
+
256  ValueOffCIter cbeginValueOff() const { return ValueOffCIter(mValueMask.beginOff(), this); }
+
257  ValueAllCIter cbeginValueAll() const { return ValueAllCIter(mChildMask.beginOff(), this); }
+
258  ValueOnCIter beginValueOn() const { return cbeginValueOn(); }
+
260  ValueOffCIter beginValueOff() const { return cbeginValueOff(); }
+
261  ValueAllCIter beginValueAll() const { return cbeginValueAll(); }
+
262  ValueOnIter beginValueOn() { return ValueOnIter(mValueMask.beginOn(), this); }
+
264  ValueOffIter beginValueOff() { return ValueOffIter(mValueMask.beginOff(), this); }
+
265  ValueAllIter beginValueAll() { return ValueAllIter(mChildMask.beginOff(), this); }
+
266 
+
267 
+
268  static Index dim() { return DIM; }
+
269  static Index getLevel() { return LEVEL; }
+
270  static void getNodeLog2Dims(std::vector<Index>& dims);
+
271  static Index getChildDim() { return ChildNodeType::DIM; }
+
272 
+
274  static Index coordToOffset(const Coord& xyz);
+
277  static void offsetToLocalCoord(Index n, Coord& xyz);
+
279  Coord offsetToGlobalCoord(Index n) const;
+
280 
+
282  const Coord& origin() const { return mOrigin; }
+
284  void setOrigin(const Coord& origin) { mOrigin = origin; }
+
285 
+
286  Index32 leafCount() const;
+
287  Index32 nonLeafCount() const;
+
288  Index64 onVoxelCount() const;
+
289  Index64 offVoxelCount() const;
+
290  Index64 onLeafVoxelCount() const;
+
291  Index64 offLeafVoxelCount() const;
+
292  Index64 onTileCount() const;
+
293 
+
295  Index64 memUsage() const;
+
296 
+
301  void evalActiveBoundingBox(CoordBBox& bbox, bool visitVoxels = true) const;
+
302 
+
305  CoordBBox getNodeBoundingBox() const { return CoordBBox::createCube(mOrigin, DIM); }
+
306 
+
307  bool isEmpty() const { return mChildMask.isOff(); }
+
308 
+
314  bool isConstant(ValueType& constValue, bool& state,
+
315  const ValueType& tolerance = zeroVal<ValueType>()) const;
+
316 
+
331  bool isConstant(ValueType& minValue, ValueType& maxValue,
+
332  bool& state, const ValueType& tolerance = zeroVal<ValueType>()) const;
+
333 
+
335  bool isInactive() const { return this->isChildMaskOff() && this->isValueMaskOff(); }
+
336 
+
338  bool isValueOn(const Coord& xyz) const;
+
340  bool isValueOn(Index offset) const { return mValueMask.isOn(offset); }
+
341 
+
343  bool hasActiveTiles() const;
+
344 
+
345  const ValueType& getValue(const Coord& xyz) const;
+
346  bool probeValue(const Coord& xyz, ValueType& value) const;
+
347 
+
350  Index getValueLevel(const Coord& xyz) const;
+
351 
+
354  const ValueType& getFirstValue() const;
+
357  const ValueType& getLastValue() const;
+
358 
+
360  void setActiveState(const Coord& xyz, bool on);
+
362  void setValueOnly(const Coord& xyz, const ValueType& value);
+
364  void setValueOn(const Coord& xyz);
+
366  void setValueOn(const Coord& xyz, const ValueType& value);
+
368  void setValueOff(const Coord& xyz);
+
370  void setValueOff(const Coord& xyz, const ValueType& value);
+
371 
+
374  template<typename ModifyOp>
+
375  void modifyValue(const Coord& xyz, const ModifyOp& op);
+
377  template<typename ModifyOp>
+
378  void modifyValueAndActiveState(const Coord& xyz, const ModifyOp& op);
+
379 
+
384  template<typename AccessorT>
+
385  const ValueType& getValueAndCache(const Coord& xyz, AccessorT&) const;
+
386 
+
391  template<typename AccessorT>
+
392  bool isValueOnAndCache(const Coord& xyz, AccessorT&) const;
+
393 
+
398  template<typename AccessorT>
+
399  void setValueAndCache(const Coord& xyz, const ValueType& value, AccessorT&);
+
400 
+
405  template<typename AccessorT>
+
406  void setValueOnlyAndCache(const Coord& xyz, const ValueType& value, AccessorT&);
+
407 
+
413  template<typename ModifyOp, typename AccessorT>
+
414  void modifyValueAndCache(const Coord& xyz, const ModifyOp& op, AccessorT&);
+
415 
+
420  template<typename ModifyOp, typename AccessorT>
+
421  void modifyValueAndActiveStateAndCache(const Coord& xyz, const ModifyOp& op, AccessorT&);
+
422 
+
427  template<typename AccessorT>
+
428  void setValueOffAndCache(const Coord& xyz, const ValueType& value, AccessorT&);
+
429 
+
434  template<typename AccessorT>
+
435  void setActiveStateAndCache(const Coord& xyz, bool on, AccessorT&);
+
436 
+
442  template<typename AccessorT>
+
443  bool probeValueAndCache(const Coord& xyz, ValueType& value, AccessorT&) const;
+
444 
+
451  template<typename AccessorT>
+
452  Index getValueLevelAndCache(const Coord& xyz, AccessorT&) const;
+
453 
+
455  void setValuesOn();
+
456 
+
457  //
+
458  // I/O
+
459  //
+
460  void writeTopology(std::ostream&, bool toHalf = false) const;
+
461  void readTopology(std::istream&, bool fromHalf = false);
+
462  void writeBuffers(std::ostream&, bool toHalf = false) const;
+
463  void readBuffers(std::istream&, bool fromHalf = false);
+
464  void readBuffers(std::istream&, const CoordBBox&, bool fromHalf = false);
+
465 
+
466 
+
467  //
+
468  // Aux methods
+
469  //
+
472  void fill(const CoordBBox& bbox, const ValueType&, bool active = true);
+
473 
+
476  void negate();
+
477 
+
480  void voxelizeActiveTiles(bool threaded = true);
+
481 
+
489  template<typename DenseT>
+
490  void copyToDense(const CoordBBox& bbox, DenseT& dense) const;
+
491 
+
494  template<MergePolicy Policy>
+
495  void merge(InternalNode& other, const ValueType& background, const ValueType& otherBackground);
+
496 
+
499  template<MergePolicy Policy> void merge(const ValueType& tileValue, bool tileActive);
+
500 
+
513  template<typename OtherChildNodeType>
+
514  void topologyUnion(const InternalNode<OtherChildNodeType, Log2Dim>& other);
+
515 
+
529  template<typename OtherChildNodeType>
+
530  void topologyIntersection(const InternalNode<OtherChildNodeType, Log2Dim>& other,
+
531  const ValueType& background);
+
532 
+
544  template<typename OtherChildNodeType>
+
545  void topologyDifference(const InternalNode<OtherChildNodeType, Log2Dim>& other,
+
546  const ValueType& background);
+
547 
+
548  template<typename CombineOp>
+
549  void combine(InternalNode& other, CombineOp&);
+
550  template<typename CombineOp>
+
551  void combine(const ValueType& value, bool valueIsActive, CombineOp&);
+
552 
+
553  template<typename CombineOp, typename OtherNodeType /*= InternalNode*/>
+
554  void combine2(const InternalNode& other0, const OtherNodeType& other1, CombineOp&);
+
555  template<typename CombineOp, typename OtherNodeType /*= InternalNode*/>
+
556  void combine2(const ValueType& value, const OtherNodeType& other, bool valIsActive, CombineOp&);
+
557  template<typename CombineOp, typename OtherValueType>
+
558  void combine2(const InternalNode& other, const OtherValueType&, bool valIsActive, CombineOp&);
+
559 
+
565  template<typename BBoxOp> void visitActiveBBox(BBoxOp&) const;
+
566 
+
567  template<typename VisitorOp> void visit(VisitorOp&);
+
568  template<typename VisitorOp> void visit(VisitorOp&) const;
+
569 
+
570  template<typename OtherNodeType, typename VisitorOp>
+
571  void visit2Node(OtherNodeType& other, VisitorOp&);
+
572  template<typename OtherNodeType, typename VisitorOp>
+
573  void visit2Node(OtherNodeType& other, VisitorOp&) const;
+
574  template<typename IterT, typename VisitorOp>
+
575  void visit2(IterT& otherIter, VisitorOp&, bool otherIsLHS = false);
+
576  template<typename IterT, typename VisitorOp>
+
577  void visit2(IterT& otherIter, VisitorOp&, bool otherIsLHS = false) const;
+
578 
+
580  void clip(const CoordBBox&, const ValueType& background);
+
581 
+
585  void prune(const ValueType& tolerance = zeroVal<ValueType>());
+
586 
+
589  void addLeaf(LeafNodeType* leaf);
+
590 
+
593  template<typename AccessorT>
+
594  void addLeafAndCache(LeafNodeType* leaf, AccessorT&);
+
595 
+
604  template<typename NodeT>
+
605  NodeT* stealNode(const Coord& xyz, const ValueType& value, bool state);
+
606 
+
609  void addTile(Index level, const Coord& xyz, const ValueType& value, bool state);
+
610 
+
612  void addTile(Index offset, const ValueType& value, bool state);
+
613 
+
616  template<typename AccessorT>
+
617  void addTileAndCache(Index level, const Coord& xyz, const ValueType&, bool state, AccessorT&);
+
618 
+
620  template<typename NodeType> NodeType* probeNode(const Coord& xyz);
+
623  template<typename NodeType> const NodeType* probeConstNode(const Coord& xyz) const;
+
625 
+
627  template<typename NodeType, typename AccessorT>
+
630  NodeType* probeNodeAndCache(const Coord& xyz, AccessorT&);
+
631  template<typename NodeType, typename AccessorT>
+
632  const NodeType* probeConstNodeAndCache(const Coord& xyz, AccessorT&) const;
+
634 
+
636  LeafNodeType* probeLeaf(const Coord& xyz);
+
639  const LeafNodeType* probeConstLeaf(const Coord& xyz) const;
+
640  const LeafNodeType* probeLeaf(const Coord& xyz) const;
+
642 
+
644  template<typename AccessorT>
+
647  LeafNodeType* probeLeafAndCache(const Coord& xyz, AccessorT& acc);
+
648  template<typename AccessorT>
+
649  const LeafNodeType* probeConstLeafAndCache(const Coord& xyz, AccessorT& acc) const;
+
650  template<typename AccessorT>
+
651  const LeafNodeType* probeLeafAndCache(const Coord& xyz, AccessorT& acc) const;
+
653 
+
660  LeafNodeType* touchLeaf(const Coord& xyz);
+
661 
+
664  template<typename AccessorT>
+
665  LeafNodeType* touchLeafAndCache(const Coord& xyz, AccessorT&);
+
666 
+
668  template<typename ArrayT>
+
691  void getNodes(ArrayT& array);
+
692  template<typename ArrayT>
+
693  void getNodes(ArrayT& array) const;
+
695 
+
719  template<typename ArrayT>
+
720  void stealNodes(ArrayT& array, const ValueType& value, bool state);
+
721 
+
724  void resetBackground(const ValueType& oldBackground, const ValueType& newBackground);
+
725 
+
728  template<typename OtherChildNodeType, Index OtherLog2Dim>
+
729  bool hasSameTopology(const InternalNode<OtherChildNodeType, OtherLog2Dim>* other) const;
+
730 
+
731 protected:
+
733  friend class IteratorBase<MaskOnIterator, InternalNode>;
+
736  friend class IteratorBase<MaskOffIterator, InternalNode>;
+
737  friend class IteratorBase<MaskDenseIterator, InternalNode>;
+
739 
+
742  template<typename, Index> friend class InternalNode;
+
743 
+
744  // Mask accessors
+
745 public:
+
746  bool isValueMaskOn(Index n) const { return mValueMask.isOn(n); }
+
747  bool isValueMaskOn() const { return mValueMask.isOn(); }
+
748  bool isValueMaskOff(Index n) const { return mValueMask.isOff(n); }
+
749  bool isValueMaskOff() const { return mValueMask.isOff(); }
+
750  bool isChildMaskOn(Index n) const { return mChildMask.isOn(n); }
+
751  bool isChildMaskOff(Index n) const { return mChildMask.isOff(n); }
+
752  bool isChildMaskOff() const { return mChildMask.isOff(); }
+
753  const NodeMaskType& getValueMask() const { return mValueMask; }
+
754  const NodeMaskType& getChildMask() const { return mChildMask; }
+
755  NodeMaskType getValueOffMask() const
+
756  {
+
757  NodeMaskType mask = mValueMask;
+
758  mask |= mChildMask;
+
759  mask.toggle();
+
760  return mask;
+
761  }
+
762  const UnionType* getTable() const { return mNodes; }
+
763 protected:
+
765  void setValueMask(Index n, bool on) { mValueMask.set(n, mChildMask.isOn(n) ? false : on); }
+
769 
+
770  void makeChildNodeEmpty(Index n, const ValueType& value);
+
771  void setChildNode( Index i, ChildNodeType* child);//assumes a tile
+
772  void resetChildNode(Index i, ChildNodeType* child);//checks for an existing child
+
773  ChildNodeType* unsetChildNode(Index i, const ValueType& value);
+
774 
+
775  template<typename NodeT, typename VisitorOp, typename ChildAllIterT>
+
776  static inline void doVisit(NodeT&, VisitorOp&);
+
777 
+
778  template<typename NodeT, typename OtherNodeT, typename VisitorOp,
+
779  typename ChildAllIterT, typename OtherChildAllIterT>
+
780  static inline void doVisit2Node(NodeT&, OtherNodeT&, VisitorOp&);
+
781 
+
782  template<typename NodeT, typename VisitorOp,
+
783  typename ChildAllIterT, typename OtherChildAllIterT>
+
784  static inline void doVisit2(NodeT&, OtherChildAllIterT&, VisitorOp&, bool otherIsLHS);
+
785 
+
790  ChildNodeType* getChildNode(Index n);
+
791  const ChildNodeType* getChildNode(Index n) const;
+
793 
+
796  struct VoxelizeActiveTiles;
+
797  template<typename OtherInternalNode> struct DeepCopy;
+
798  template<typename OtherInternalNode> struct TopologyCopy1;
+
799  template<typename OtherInternalNode> struct TopologyCopy2;
+
800  template<typename OtherInternalNode> struct TopologyUnion;
+
801  template<typename OtherInternalNode> struct TopologyDifference;
+
802  template<typename OtherInternalNode> struct TopologyIntersection;
+
804 
+
805  UnionType mNodes[NUM_VALUES];
+
806  NodeMaskType mChildMask, mValueMask;
+
808  Coord mOrigin;
+
809 }; // class InternalNode
+
810 
+
811 
+
813 
+
814 
+
816 template<typename ChildT1, Index Dim1, typename NodeT2>
+
819 struct SameInternalConfig {
+
820  static const bool value = false;
+
821 };
+
822 
+
823 template<typename ChildT1, Index Dim1, typename ChildT2>
+
824 struct SameInternalConfig<ChildT1, Dim1, InternalNode<ChildT2, Dim1> > {
+
825  static const bool value = ChildT1::template SameConfiguration<ChildT2>::value;
+
826 };
+
828 
+
829 
+
831 
+
832 
+
833 template<typename ChildT, Index Log2Dim>
+
834 inline
+ +
836 {
+
837  for (Index i = 0; i < NUM_VALUES; ++i) mNodes[i].setValue(background);
+
838 }
+
839 
+
840 
+
841 template<typename ChildT, Index Log2Dim>
+
842 inline
+
843 InternalNode<ChildT, Log2Dim>::InternalNode(const Coord& origin, const ValueType& val, bool active):
+
844  mOrigin(origin[0] & ~(DIM - 1), // zero out the low-order bits
+
845  origin[1] & ~(DIM - 1),
+
846  origin[2] & ~(DIM - 1))
+
847 {
+
848  if (active) mValueMask.setOn();
+
849  for (Index i = 0; i < NUM_VALUES; ++i) mNodes[i].setValue(val);
+
850 }
+
851 
+
852 
+
853 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
854 // For InternalNodes, the PartialCreate constructor is identical to its
+
855 // non-PartialCreate counterpart.
+
856 template<typename ChildT, Index Log2Dim>
+
857 inline
+ +
859  const Coord& origin, const ValueType& val, bool active)
+
860  : mOrigin(origin[0] & ~(DIM-1), origin[1] & ~(DIM-1), origin[2] & ~(DIM-1))
+
861 {
+
862  if (active) mValueMask.setOn();
+
863  for (Index i = 0; i < NUM_VALUES; ++i) mNodes[i].setValue(val);
+
864 }
+
865 #endif
+
866 
+
867 template<typename ChildT, Index Log2Dim>
+
868 template<typename OtherInternalNode>
+
869 struct InternalNode<ChildT, Log2Dim>::DeepCopy
+
870 {
+
871  DeepCopy(const OtherInternalNode* source, InternalNode* target) : s(source), t(target) {
+
872  tbb::parallel_for(tbb::blocked_range<Index>(0, NUM_VALUES), *this);
+
873  //(*this)(tbb::blocked_range<Index>(0, NUM_VALUES));//serial
+
874  }
+
875  void operator()(const tbb::blocked_range<Index> &r) const {
+
876  for (Index i = r.begin(), end=r.end(); i!=end; ++i) {
+
877  if (s->mChildMask.isOff(i)) {
+
878  t->mNodes[i].setValue(ValueType(s->mNodes[i].getValue()));
+
879  } else {
+
880  t->mNodes[i].setChild(new ChildNodeType(*(s->mNodes[i].getChild())));
+
881  }
+
882  }
+
883  }
+
884  const OtherInternalNode* s;
+ +
886 };// DeepCopy
+
887 
+
888 template<typename ChildT, Index Log2Dim>
+
889 inline
+ +
891  mChildMask(other.mChildMask),
+
892  mValueMask(other.mValueMask),
+
893  mOrigin(other.mOrigin)
+
894 {
+
895  DeepCopy<InternalNode<ChildT, Log2Dim> > tmp(&other, this);
+
896 }
+
897 
+
898 
+
899 // Copy-construct from a node with the same configuration but a different ValueType.
+
900 template<typename ChildT, Index Log2Dim>
+
901 template<typename OtherChildNodeType>
+
902 inline
+ +
904  : mChildMask(other.mChildMask)
+
905  , mValueMask(other.mValueMask)
+
906  , mOrigin(other.mOrigin)
+
907 {
+ +
909 }
+
910 
+
911 template<typename ChildT, Index Log2Dim>
+
912 template<typename OtherInternalNode>
+
913 struct InternalNode<ChildT, Log2Dim>::TopologyCopy1
+
914 {
+
915  TopologyCopy1(const OtherInternalNode* source, InternalNode* target,
+
916  const ValueType& background) : s(source), t(target), b(background) {
+
917  tbb::parallel_for(tbb::blocked_range<Index>(0, NUM_VALUES), *this);
+
918  //(*this)(tbb::blocked_range<Index>(0, NUM_VALUES));//serial
+
919  }
+
920  void operator()(const tbb::blocked_range<Index> &r) const {
+
921  for (Index i = r.begin(), end=r.end(); i!=end; ++i) {
+
922  if (s->isChildMaskOn(i)) {
+
923  t->mNodes[i].setChild(new ChildNodeType(*(s->mNodes[i].getChild()),
+
924  b, TopologyCopy()));
+
925  } else {
+
926  t->mNodes[i].setValue(b);
+
927  }
+
928  }
+
929  }
+
930  const OtherInternalNode* s;
+ +
932  const ValueType &b;
+
933 };// TopologyCopy1
+
934 
+
935 template<typename ChildT, Index Log2Dim>
+
936 template<typename OtherChildNodeType>
+
937 inline
+ +
939  const ValueType& background, TopologyCopy):
+
940  mChildMask(other.mChildMask),
+
941  mValueMask(other.mValueMask),
+
942  mOrigin(other.mOrigin)
+
943 {
+
944  TopologyCopy1<InternalNode<OtherChildNodeType, Log2Dim> > tmp(&other, this, background);
+
945 }
+
946 
+
947 template<typename ChildT, Index Log2Dim>
+
948 template<typename OtherInternalNode>
+
949 struct InternalNode<ChildT, Log2Dim>::TopologyCopy2
+
950 {
+
951  TopologyCopy2(const OtherInternalNode* source, InternalNode* target,
+
952  const ValueType& offValue, const ValueType& onValue)
+
953  : s(source), t(target), offV(offValue), onV(onValue) {
+
954  tbb::parallel_for(tbb::blocked_range<Index>(0, NUM_VALUES), *this);
+
955  }
+
956  void operator()(const tbb::blocked_range<Index> &r) const {
+
957  for (Index i = r.begin(), end=r.end(); i!=end; ++i) {
+
958  if (s->isChildMaskOn(i)) {
+
959  t->mNodes[i].setChild(new ChildNodeType(*(s->mNodes[i].getChild()),
+
960  offV, onV, TopologyCopy()));
+
961  } else {
+
962  t->mNodes[i].setValue(s->isValueMaskOn(i) ? onV : offV);
+
963  }
+
964  }
+
965  }
+
966  const OtherInternalNode* s;
+ +
968  const ValueType &offV, &onV;
+
969  };// TopologyCopy2
+
970 
+
971 template<typename ChildT, Index Log2Dim>
+
972 template<typename OtherChildNodeType>
+
973 inline
+ +
975  const ValueType& offValue,
+
976  const ValueType& onValue, TopologyCopy):
+
977  mChildMask(other.mChildMask),
+
978  mValueMask(other.mValueMask),
+
979  mOrigin(other.mOrigin)
+
980 {
+
981  TopologyCopy2<InternalNode<OtherChildNodeType, Log2Dim> > tmp(&other, this, offValue, onValue);
+
982 }
+
983 
+
984 
+
985 template<typename ChildT, Index Log2Dim>
+
986 inline
+ +
988 {
+
989  for (ChildOnIter iter = this->beginChildOn(); iter; ++iter) {
+
990  delete mNodes[iter.pos()].getChild();
+
991  }
+
992 }
+
993 
+
994 
+
996 
+
997 
+
998 template<typename ChildT, Index Log2Dim>
+
999 inline Index32
+ +
1001 {
+
1002  if (ChildNodeType::getLevel() == 0) return mChildMask.countOn();
+
1003  Index32 sum = 0;
+
1004  for (ChildOnCIter iter = this->cbeginChildOn(); iter; ++iter) {
+
1005  sum += iter->leafCount();
+
1006  }
+
1007  return sum;
+
1008 }
+
1009 
+
1010 
+
1011 template<typename ChildT, Index Log2Dim>
+
1012 inline Index32
+ +
1014 {
+
1015  Index32 sum = 1;
+
1016  if (ChildNodeType::getLevel() == 0) return sum;
+
1017  for (ChildOnCIter iter = this->cbeginChildOn(); iter; ++iter) {
+
1018  sum += iter->nonLeafCount();
+
1019  }
+
1020  return sum;
+
1021 }
+
1022 
+
1023 
+
1024 template<typename ChildT, Index Log2Dim>
+
1025 inline Index64
+ +
1027 {
+
1028  Index64 sum = ChildT::NUM_VOXELS * mValueMask.countOn();
+
1029  for (ChildOnCIter iter = this->cbeginChildOn(); iter; ++iter) {
+
1030  sum += iter->onVoxelCount();
+
1031  }
+
1032  return sum;
+
1033 }
+
1034 
+
1035 
+
1036 template<typename ChildT, Index Log2Dim>
+
1037 inline Index64
+ +
1039 {
+
1040  Index64 sum = ChildT::NUM_VOXELS * (NUM_VALUES-mValueMask.countOn()-mChildMask.countOn());
+
1041  for (ChildOnCIter iter = this->cbeginChildOn(); iter; ++iter) {
+
1042  sum += iter->offVoxelCount();
+
1043  }
+
1044  return sum;
+
1045 }
+
1046 
+
1047 
+
1048 template<typename ChildT, Index Log2Dim>
+
1049 inline Index64
+ +
1051 {
+
1052  Index64 sum = 0;
+
1053  for (ChildOnCIter iter = this->beginChildOn(); iter; ++iter) {
+
1054  sum += mNodes[iter.pos()].getChild()->onLeafVoxelCount();
+
1055  }
+
1056  return sum;
+
1057 }
+
1058 
+
1059 
+
1060 template<typename ChildT, Index Log2Dim>
+
1061 inline Index64
+ +
1063 {
+
1064  Index64 sum = 0;
+
1065  for (ChildOnCIter iter = this->beginChildOn(); iter; ++iter) {
+
1066  sum += mNodes[iter.pos()].getChild()->offLeafVoxelCount();
+
1067  }
+
1068  return sum;
+
1069 }
+
1070 
+
1071 template<typename ChildT, Index Log2Dim>
+
1072 inline Index64
+ +
1074 {
+
1075  Index64 sum = mValueMask.countOn();
+
1076  for (ChildOnCIter iter = this->cbeginChildOn(); LEVEL>1 && iter; ++iter) {
+
1077  sum += iter->onTileCount();
+
1078  }
+
1079  return sum;
+
1080 }
+
1081 
+
1082 template<typename ChildT, Index Log2Dim>
+
1083 inline Index64
+ +
1085 {
+
1086  Index64 sum = NUM_VALUES * sizeof(UnionType) + mChildMask.memUsage()
+
1087  + mValueMask.memUsage() + sizeof(mOrigin);
+
1088  for (ChildOnCIter iter = this->cbeginChildOn(); iter; ++iter) {
+
1089  sum += iter->memUsage();
+
1090  }
+
1091  return sum;
+
1092 }
+
1093 
+
1094 
+
1095 template<typename ChildT, Index Log2Dim>
+
1096 inline void
+
1097 InternalNode<ChildT, Log2Dim>::evalActiveBoundingBox(CoordBBox& bbox, bool visitVoxels) const
+
1098 {
+
1099  if (bbox.isInside(this->getNodeBoundingBox())) return;
+
1100 
+
1101  for (ValueOnCIter i = this->cbeginValueOn(); i; ++i) {
+
1102  bbox.expand(i.getCoord(), ChildT::DIM);
+
1103  }
+
1104  for (ChildOnCIter i = this->cbeginChildOn(); i; ++i) {
+
1105  i->evalActiveBoundingBox(bbox, visitVoxels);
+
1106  }
+
1107 }
+
1108 
+
1109 
+
1111 
+
1112 
+
1113 template<typename ChildT, Index Log2Dim>
+
1114 inline void
+
1115 InternalNode<ChildT, Log2Dim>::prune(const ValueType& tolerance)
+
1116 {
+
1117  bool state = false;
+
1118  ValueType value = zeroVal<ValueType>();
+
1119  for (ChildOnIter iter = this->beginChildOn(); iter; ++iter) {
+
1120  const Index i = iter.pos();
+
1121  ChildT* child = mNodes[i].getChild();
+
1122  child->prune(tolerance);
+
1123  if (child->isConstant(value, state, tolerance)) {
+
1124  delete child;
+
1125  mChildMask.setOff(i);
+
1126  mValueMask.set(i, state);
+
1127  mNodes[i].setValue(value);
+
1128  }
+
1129  }
+
1130 }
+
1131 
+
1132 
+
1134 
+
1135 
+
1136 template<typename ChildT, Index Log2Dim>
+
1137 template<typename NodeT>
+
1138 inline NodeT*
+
1139 InternalNode<ChildT, Log2Dim>::stealNode(const Coord& xyz, const ValueType& value, bool state)
+
1140 {
+
1141  if ((NodeT::LEVEL == ChildT::LEVEL && !(boost::is_same<NodeT, ChildT>::value)) ||
+
1142  NodeT::LEVEL > ChildT::LEVEL) return NULL;
+ +
1144  const Index n = this->coordToOffset(xyz);
+
1145  if (mChildMask.isOff(n)) return NULL;
+
1146  ChildT* child = mNodes[n].getChild();
+
1147  if (boost::is_same<NodeT, ChildT>::value) {
+
1148  mChildMask.setOff(n);
+
1149  mValueMask.set(n, state);
+
1150  mNodes[n].setValue(value);
+
1151  }
+
1152  return (boost::is_same<NodeT, ChildT>::value)
+
1153  ? reinterpret_cast<NodeT*>(child)
+
1154  : child->template stealNode<NodeT>(xyz, value, state);
+ +
1156 }
+
1157 
+
1158 
+
1160 
+
1161 
+
1162 template<typename ChildT, Index Log2Dim>
+
1163 template<typename NodeT>
+
1164 inline NodeT*
+ +
1166 {
+
1167  if ((NodeT::LEVEL == ChildT::LEVEL && !(boost::is_same<NodeT, ChildT>::value)) ||
+
1168  NodeT::LEVEL > ChildT::LEVEL) return NULL;
+ +
1170  const Index n = this->coordToOffset(xyz);
+
1171  if (mChildMask.isOff(n)) return NULL;
+
1172  ChildT* child = mNodes[n].getChild();
+
1173  return (boost::is_same<NodeT, ChildT>::value)
+
1174  ? reinterpret_cast<NodeT*>(child)
+
1175  : child->template probeNode<NodeT>(xyz);
+ +
1177 }
+
1178 
+
1179 
+
1180 template<typename ChildT, Index Log2Dim>
+
1181 template<typename NodeT, typename AccessorT>
+
1182 inline NodeT*
+
1183 InternalNode<ChildT, Log2Dim>::probeNodeAndCache(const Coord& xyz, AccessorT& acc)
+
1184 {
+
1185  if ((NodeT::LEVEL == ChildT::LEVEL && !(boost::is_same<NodeT, ChildT>::value)) ||
+
1186  NodeT::LEVEL > ChildT::LEVEL) return NULL;
+ +
1188  const Index n = this->coordToOffset(xyz);
+
1189  if (mChildMask.isOff(n)) return NULL;
+
1190  ChildT* child = mNodes[n].getChild();
+
1191  acc.insert(xyz, child);
+
1192  return (boost::is_same<NodeT, ChildT>::value)
+
1193  ? reinterpret_cast<NodeT*>(child)
+
1194  : child->template probeNodeAndCache<NodeT>(xyz, acc);
+ +
1196 }
+
1197 
+
1198 
+
1199 template<typename ChildT, Index Log2Dim>
+
1200 template<typename NodeT>
+
1201 inline const NodeT*
+ +
1203 {
+
1204  if ((NodeT::LEVEL == ChildT::LEVEL && !(boost::is_same<NodeT, ChildT>::value)) ||
+
1205  NodeT::LEVEL > ChildT::LEVEL) return NULL;
+ +
1207  const Index n = this->coordToOffset(xyz);
+
1208  if (mChildMask.isOff(n)) return NULL;
+
1209  const ChildT* child = mNodes[n].getChild();
+
1210  return (boost::is_same<NodeT, ChildT>::value)
+
1211  ? reinterpret_cast<const NodeT*>(child)
+
1212  : child->template probeConstNode<NodeT>(xyz);
+ +
1214 }
+
1215 
+
1216 
+
1217 template<typename ChildT, Index Log2Dim>
+
1218 template<typename NodeT, typename AccessorT>
+
1219 inline const NodeT*
+
1220 InternalNode<ChildT, Log2Dim>::probeConstNodeAndCache(const Coord& xyz, AccessorT& acc) const
+
1221 {
+
1222  if ((NodeT::LEVEL == ChildT::LEVEL && !(boost::is_same<NodeT, ChildT>::value)) ||
+
1223  NodeT::LEVEL > ChildT::LEVEL) return NULL;
+ +
1225  const Index n = this->coordToOffset(xyz);
+
1226  if (mChildMask.isOff(n)) return NULL;
+
1227  const ChildT* child = mNodes[n].getChild();
+
1228  acc.insert(xyz, child);
+
1229  return (boost::is_same<NodeT, ChildT>::value)
+
1230  ? reinterpret_cast<const NodeT*>(child)
+
1231  : child->template probeConstNodeAndCache<NodeT>(xyz, acc);
+ +
1233 }
+
1234 
+
1235 
+
1237 
+
1238 
+
1239 template<typename ChildT, Index Log2Dim>
+
1240 inline typename ChildT::LeafNodeType*
+ +
1242 {
+
1243  return this->template probeNode<LeafNodeType>(xyz);
+
1244 }
+
1245 
+
1246 
+
1247 template<typename ChildT, Index Log2Dim>
+
1248 template<typename AccessorT>
+
1249 inline typename ChildT::LeafNodeType*
+
1250 InternalNode<ChildT, Log2Dim>::probeLeafAndCache(const Coord& xyz, AccessorT& acc)
+
1251 {
+
1252  return this->template probeNodeAndCache<LeafNodeType>(xyz, acc);
+
1253 }
+
1254 
+
1255 
+
1256 template<typename ChildT, Index Log2Dim>
+
1257 template<typename AccessorT>
+
1258 inline const typename ChildT::LeafNodeType*
+
1259 InternalNode<ChildT, Log2Dim>::probeLeafAndCache(const Coord& xyz, AccessorT& acc) const
+
1260 {
+
1261  return this->probeConstLeafAndCache(xyz, acc);
+
1262 }
+
1263 
+
1264 
+
1265 template<typename ChildT, Index Log2Dim>
+
1266 inline const typename ChildT::LeafNodeType*
+ +
1268 {
+
1269  return this->template probeConstNode<LeafNodeType>(xyz);
+
1270 }
+
1271 
+
1272 
+
1273 template<typename ChildT, Index Log2Dim>
+
1274 template<typename AccessorT>
+
1275 inline const typename ChildT::LeafNodeType*
+
1276 InternalNode<ChildT, Log2Dim>::probeConstLeafAndCache(const Coord& xyz, AccessorT& acc) const
+
1277 {
+
1278  return this->template probeConstNodeAndCache<LeafNodeType>(xyz, acc);
+
1279 }
+
1280 
+
1281 
+
1283 
+
1284 
+
1285 template<typename ChildT, Index Log2Dim>
+
1286 inline void
+ +
1288 {
+
1289  assert(leaf != NULL);
+
1290  const Coord& xyz = leaf->origin();
+
1291  const Index n = this->coordToOffset(xyz);
+
1292  ChildT* child = NULL;
+
1293  if (mChildMask.isOff(n)) {
+
1294  if (ChildT::LEVEL>0) {
+
1295  child = new ChildT(xyz, mNodes[n].getValue(), mValueMask.isOn(n));
+
1296  } else {
+
1297  child = reinterpret_cast<ChildT*>(leaf);
+
1298  }
+
1299  this->setChildNode(n, child);
+
1300  } else {
+
1301  if (ChildT::LEVEL>0) {
+
1302  child = mNodes[n].getChild();
+
1303  } else {
+
1304  delete mNodes[n].getChild();
+
1305  child = reinterpret_cast<ChildT*>(leaf);
+
1306  mNodes[n].setChild(child);
+
1307  }
+
1308  }
+
1309  child->addLeaf(leaf);
+
1310 }
+
1311 
+
1312 
+
1313 template<typename ChildT, Index Log2Dim>
+
1314 template<typename AccessorT>
+
1315 inline void
+
1316 InternalNode<ChildT, Log2Dim>::addLeafAndCache(LeafNodeType* leaf, AccessorT& acc)
+
1317 {
+
1318  assert(leaf != NULL);
+
1319  const Coord& xyz = leaf->origin();
+
1320  const Index n = this->coordToOffset(xyz);
+
1321  ChildT* child = NULL;
+
1322  if (mChildMask.isOff(n)) {
+
1323  if (ChildT::LEVEL>0) {
+
1324  child = new ChildT(xyz, mNodes[n].getValue(), mValueMask.isOn(n));
+
1325  acc.insert(xyz, child);//we only cache internal nodes
+
1326  } else {
+
1327  child = reinterpret_cast<ChildT*>(leaf);
+
1328  }
+
1329  this->setChildNode(n, child);
+
1330  } else {
+
1331  if (ChildT::LEVEL>0) {
+
1332  child = mNodes[n].getChild();
+
1333  acc.insert(xyz, child);//we only cache internal nodes
+
1334  } else {
+
1335  delete mNodes[n].getChild();
+
1336  child = reinterpret_cast<ChildT*>(leaf);
+
1337  mNodes[n].setChild(child);
+
1338  }
+
1339  }
+
1340  child->addLeafAndCache(leaf, acc);
+
1341 }
+
1342 
+
1343 
+
1345 
+
1346 
+
1347 template<typename ChildT, Index Log2Dim>
+
1348 inline void
+
1349 InternalNode<ChildT, Log2Dim>::addTile(Index n, const ValueType& value, bool state)
+
1350 {
+
1351  assert(n < NUM_VALUES);
+
1352  this->makeChildNodeEmpty(n, value);
+
1353  mValueMask.set(n, state);
+
1354 }
+
1355 
+
1356 
+
1357 template<typename ChildT, Index Log2Dim>
+
1358 inline void
+ +
1360  const ValueType& value, bool state)
+
1361 {
+
1362  if (LEVEL >= level) {
+
1363  const Index n = this->coordToOffset(xyz);
+
1364  if (mChildMask.isOff(n)) {// tile case
+
1365  if (LEVEL > level) {
+
1366  ChildT* child = new ChildT(xyz, mNodes[n].getValue(), mValueMask.isOn(n));
+
1367  this->setChildNode(n, child);
+
1368  child->addTile(level, xyz, value, state);
+
1369  } else {
+
1370  mValueMask.set(n, state);
+
1371  mNodes[n].setValue(value);
+
1372  }
+
1373  } else {// child branch case
+
1374  ChildT* child = mNodes[n].getChild();
+
1375  if (LEVEL > level) {
+
1376  child->addTile(level, xyz, value, state);
+
1377  } else {
+
1378  delete child;
+
1379  mChildMask.setOff(n);
+
1380  mValueMask.set(n, state);
+
1381  mNodes[n].setValue(value);
+
1382  }
+
1383  }
+
1384  }
+
1385 }
+
1386 
+
1387 
+
1388 template<typename ChildT, Index Log2Dim>
+
1389 template<typename AccessorT>
+
1390 inline void
+ +
1392  const ValueType& value, bool state, AccessorT& acc)
+
1393 {
+
1394  if (LEVEL >= level) {
+
1395  const Index n = this->coordToOffset(xyz);
+
1396  if (mChildMask.isOff(n)) {// tile case
+
1397  if (LEVEL > level) {
+
1398  ChildT* child = new ChildT(xyz, mNodes[n].getValue(), mValueMask.isOn(n));
+
1399  this->setChildNode(n, child);
+
1400  acc.insert(xyz, child);
+
1401  child->addTileAndCache(level, xyz, value, state, acc);
+
1402  } else {
+
1403  mValueMask.set(n, state);
+
1404  mNodes[n].setValue(value);
+
1405  }
+
1406  } else {// child branch case
+
1407  ChildT* child = mNodes[n].getChild();
+
1408  if (LEVEL > level) {
+
1409  acc.insert(xyz, child);
+
1410  child->addTileAndCache(level, xyz, value, state, acc);
+
1411  } else {
+
1412  delete child;
+
1413  mChildMask.setOff(n);
+
1414  mValueMask.set(n, state);
+
1415  mNodes[n].setValue(value);
+
1416  }
+
1417  }
+
1418  }
+
1419 }
+
1420 
+
1421 
+
1423 
+
1424 
+
1425 template<typename ChildT, Index Log2Dim>
+
1426 inline typename ChildT::LeafNodeType*
+ +
1428 {
+
1429  const Index n = this->coordToOffset(xyz);
+
1430  ChildT* child = NULL;
+
1431  if (mChildMask.isOff(n)) {
+
1432  child = new ChildT(xyz, mNodes[n].getValue(), mValueMask.isOn(n));
+
1433  this->setChildNode(n, child);
+
1434  } else {
+
1435  child = mNodes[n].getChild();
+
1436  }
+
1437  return child->touchLeaf(xyz);
+
1438 }
+
1439 
+
1440 
+
1441 template<typename ChildT, Index Log2Dim>
+
1442 template<typename AccessorT>
+
1443 inline typename ChildT::LeafNodeType*
+
1444 InternalNode<ChildT, Log2Dim>::touchLeafAndCache(const Coord& xyz, AccessorT& acc)
+
1445 {
+
1446  const Index n = this->coordToOffset(xyz);
+
1447  if (mChildMask.isOff(n)) {
+
1448  this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), mValueMask.isOn(n)));
+
1449  }
+
1450  acc.insert(xyz, mNodes[n].getChild());
+
1451  return mNodes[n].getChild()->touchLeafAndCache(xyz, acc);
+
1452 }
+
1453 
+
1454 
+
1456 
+
1457 
+
1458 template<typename ChildT, Index Log2Dim>
+
1459 inline bool
+
1460 InternalNode<ChildT, Log2Dim>::isConstant(ValueType& value, bool& state,
+
1461  const ValueType& tolerance) const
+
1462 {
+
1463  if ( !(mChildMask.isOff()) ) return false;
+
1464 
+
1465  state = mValueMask.isOn();
+
1466  if (!(state || mValueMask.isOff())) return false;// Are values neither active nor inactive?
+
1467 
+
1468  value = mNodes[0].getValue();
+
1469  for (Index i = 1; i < NUM_VALUES; ++i) {
+
1470  if ( !math::isApproxEqual(mNodes[i].getValue(), value, tolerance) ) return false;
+
1471  }
+
1472  return true;
+
1473 }
+
1474 
+
1476 
+
1477 
+
1478 template<typename ChildT, Index Log2Dim>
+
1479 inline bool
+
1480 InternalNode<ChildT, Log2Dim>::isConstant(ValueType& minValue, ValueType& maxValue,
+
1481  bool& state, const ValueType& tolerance) const
+
1482 {
+
1483  if ( !(mChildMask.isOff()) ) return false;
+
1484 
+
1485  state = mValueMask.isOn();
+
1486  if (!(state || mValueMask.isOff())) return false;// Are values neither active nor inactive?
+
1487 
+
1488  const ValueType range = 2 * tolerance;
+
1489  minValue = maxValue = mNodes[0].getValue();
+
1490  for (Index i = 1; i < NUM_VALUES; ++i) {
+
1491  const ValueType& v = mNodes[i].getValue();
+
1492  if (v < minValue) {
+
1493  if ((maxValue - v) > range) return false;
+
1494  minValue = v;
+
1495  } else if (v > maxValue) {
+
1496  if ((v - minValue) > range) return false;
+
1497  maxValue = v;
+
1498  }
+
1499  }
+
1500  return true;
+
1501 }
+
1502 
+
1503 
+
1505 
+
1506 
+
1507 template<typename ChildT, Index Log2Dim>
+
1508 inline bool
+ +
1510 {
+ +
1512  const bool anyActiveTiles = !mValueMask.isOff();
+
1513  if (LEVEL==1 || anyActiveTiles) return anyActiveTiles;
+
1514  for (ChildOnCIter iter = this->cbeginChildOn(); iter; ++iter) {
+
1515  if (iter->hasActiveTiles()) return true;
+
1516  }
+
1517  return false;
+ +
1519 }
+
1520 
+
1521 
+
1522 template<typename ChildT, Index Log2Dim>
+
1523 inline bool
+ +
1525 {
+
1526  const Index n = this->coordToOffset(xyz);
+
1527  if (this->isChildMaskOff(n)) return this->isValueMaskOn(n);
+
1528  return mNodes[n].getChild()->isValueOn(xyz);
+
1529 }
+
1530 
+
1531 template<typename ChildT, Index Log2Dim>
+
1532 template<typename AccessorT>
+
1533 inline bool
+
1534 InternalNode<ChildT, Log2Dim>::isValueOnAndCache(const Coord& xyz, AccessorT& acc) const
+
1535 {
+
1536  const Index n = this->coordToOffset(xyz);
+
1537  if (this->isChildMaskOff(n)) return this->isValueMaskOn(n);
+
1538  acc.insert(xyz, mNodes[n].getChild());
+
1539  return mNodes[n].getChild()->isValueOnAndCache(xyz, acc);
+
1540 }
+
1541 
+
1542 
+
1543 template<typename ChildT, Index Log2Dim>
+
1544 inline const typename ChildT::ValueType&
+ +
1546 {
+
1547  const Index n = this->coordToOffset(xyz);
+
1548  return this->isChildMaskOff(n) ? mNodes[n].getValue()
+
1549  : mNodes[n].getChild()->getValue(xyz);
+
1550 }
+
1551 
+
1552 template<typename ChildT, Index Log2Dim>
+
1553 template<typename AccessorT>
+
1554 inline const typename ChildT::ValueType&
+
1555 InternalNode<ChildT, Log2Dim>::getValueAndCache(const Coord& xyz, AccessorT& acc) const
+
1556 {
+
1557  const Index n = this->coordToOffset(xyz);
+
1558  if (this->isChildMaskOn(n)) {
+
1559  acc.insert(xyz, mNodes[n].getChild());
+
1560  return mNodes[n].getChild()->getValueAndCache(xyz, acc);
+
1561  }
+
1562  return mNodes[n].getValue();
+
1563 }
+
1564 
+
1565 
+
1566 template<typename ChildT, Index Log2Dim>
+
1567 inline Index
+ +
1569 {
+
1570  const Index n = this->coordToOffset(xyz);
+
1571  return this->isChildMaskOff(n) ? LEVEL : mNodes[n].getChild()->getValueLevel(xyz);
+
1572 }
+
1573 
+
1574 template<typename ChildT, Index Log2Dim>
+
1575 template<typename AccessorT>
+
1576 inline Index
+
1577 InternalNode<ChildT, Log2Dim>::getValueLevelAndCache(const Coord& xyz, AccessorT& acc) const
+
1578 {
+
1579  const Index n = this->coordToOffset(xyz);
+
1580  if (this->isChildMaskOn(n)) {
+
1581  acc.insert(xyz, mNodes[n].getChild());
+
1582  return mNodes[n].getChild()->getValueLevelAndCache(xyz, acc);
+
1583  }
+
1584  return LEVEL;
+
1585 }
+
1586 
+
1587 
+
1588 template<typename ChildT, Index Log2Dim>
+
1589 inline bool
+
1590 InternalNode<ChildT, Log2Dim>::probeValue(const Coord& xyz, ValueType& value) const
+
1591 {
+
1592  const Index n = this->coordToOffset(xyz);
+
1593  if (this->isChildMaskOff(n)) {
+
1594  value = mNodes[n].getValue();
+
1595  return this->isValueMaskOn(n);
+
1596  }
+
1597  return mNodes[n].getChild()->probeValue(xyz, value);
+
1598 }
+
1599 
+
1600 template<typename ChildT, Index Log2Dim>
+
1601 template<typename AccessorT>
+
1602 inline bool
+ +
1604  ValueType& value, AccessorT& acc) const
+
1605 {
+
1606  const Index n = this->coordToOffset(xyz);
+
1607  if (this->isChildMaskOn(n)) {
+
1608  acc.insert(xyz, mNodes[n].getChild());
+
1609  return mNodes[n].getChild()->probeValueAndCache(xyz, value, acc);
+
1610  }
+
1611  value = mNodes[n].getValue();
+
1612  return this->isValueMaskOn(n);
+
1613 }
+
1614 
+
1615 
+
1616 template<typename ChildT, Index Log2Dim>
+
1617 inline void
+ +
1619 {
+
1620  const Index n = this->coordToOffset(xyz);
+
1621  bool hasChild = this->isChildMaskOn(n);
+
1622  if (!hasChild && this->isValueMaskOn(n)) {
+
1623  // If the voxel belongs to a constant tile that is active,
+
1624  // a child subtree must be constructed.
+
1625  hasChild = true;
+
1626  this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), /*active=*/true));
+
1627  }
+
1628  if (hasChild) mNodes[n].getChild()->setValueOff(xyz);
+
1629 }
+
1630 
+
1631 
+
1632 template<typename ChildT, Index Log2Dim>
+
1633 inline void
+ +
1635 {
+
1636  const Index n = this->coordToOffset(xyz);
+
1637  bool hasChild = this->isChildMaskOn(n);
+
1638  if (!hasChild && !this->isValueMaskOn(n)) {
+
1639  // If the voxel belongs to a constant tile that is inactive,
+
1640  // a child subtree must be constructed.
+
1641  hasChild = true;
+
1642  this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), /*active=*/false));
+
1643  }
+
1644  if (hasChild) mNodes[n].getChild()->setValueOn(xyz);
+
1645 }
+
1646 
+
1647 
+
1648 template<typename ChildT, Index Log2Dim>
+
1649 inline void
+
1650 InternalNode<ChildT, Log2Dim>::setValueOff(const Coord& xyz, const ValueType& value)
+
1651 {
+
1652  const Index n = InternalNode::coordToOffset(xyz);
+
1653  bool hasChild = this->isChildMaskOn(n);
+
1654  if (!hasChild) {
+
1655  const bool active = this->isValueMaskOn(n);
+
1656  if (active || !math::isExactlyEqual(mNodes[n].getValue(), value)) {
+
1657  // If the voxel belongs to a tile that is either active or that
+
1658  // has a constant value that is different from the one provided,
+
1659  // a child subtree must be constructed.
+
1660  hasChild = true;
+
1661  this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), active));
+
1662  }
+
1663  }
+
1664  if (hasChild) mNodes[n].getChild()->setValueOff(xyz, value);
+
1665 }
+
1666 
+
1667 template<typename ChildT, Index Log2Dim>
+
1668 template<typename AccessorT>
+
1669 inline void
+ +
1671  const ValueType& value, AccessorT& acc)
+
1672 {
+
1673  const Index n = InternalNode::coordToOffset(xyz);
+
1674  bool hasChild = this->isChildMaskOn(n);
+
1675  if (!hasChild) {
+
1676  const bool active = this->isValueMaskOn(n);
+
1677  if (active || !math::isExactlyEqual(mNodes[n].getValue(), value)) {
+
1678  // If the voxel belongs to a tile that is either active or that
+
1679  // has a constant value that is different from the one provided,
+
1680  // a child subtree must be constructed.
+
1681  hasChild = true;
+
1682  this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), active));
+
1683  }
+
1684  }
+
1685  if (hasChild) {
+
1686  ChildT* child = mNodes[n].getChild();
+
1687  acc.insert(xyz, child);
+
1688  child->setValueOffAndCache(xyz, value, acc);
+
1689  }
+
1690 }
+
1691 
+
1692 
+
1693 template<typename ChildT, Index Log2Dim>
+
1694 inline void
+
1695 InternalNode<ChildT, Log2Dim>::setValueOn(const Coord& xyz, const ValueType& value)
+
1696 {
+
1697  const Index n = this->coordToOffset(xyz);
+
1698  bool hasChild = this->isChildMaskOn(n);
+
1699  if (!hasChild) {
+
1700  const bool active = this->isValueMaskOn(n); // tile's active state
+
1701  if (!active || !math::isExactlyEqual(mNodes[n].getValue(), value)) {
+
1702  // If the voxel belongs to a tile that is either inactive or that
+
1703  // has a constant value that is different from the one provided,
+
1704  // a child subtree must be constructed.
+
1705  hasChild = true;
+
1706  this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), active));
+
1707  }
+
1708  }
+
1709  if (hasChild) mNodes[n].getChild()->setValueOn(xyz, value);
+
1710 }
+
1711 
+
1712 template<typename ChildT, Index Log2Dim>
+
1713 template<typename AccessorT>
+
1714 inline void
+ +
1716  const ValueType& value, AccessorT& acc)
+
1717 {
+
1718  const Index n = this->coordToOffset(xyz);
+
1719  bool hasChild = this->isChildMaskOn(n);
+
1720  if (!hasChild) {
+
1721  const bool active = this->isValueMaskOn(n);
+
1722  if (!active || !math::isExactlyEqual(mNodes[n].getValue(), value)) {
+
1723  // If the voxel belongs to a tile that is either inactive or that
+
1724  // has a constant value that is different from the one provided,
+
1725  // a child subtree must be constructed.
+
1726  hasChild = true;
+
1727  this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), active));
+
1728  }
+
1729  }
+
1730  if (hasChild) {
+
1731  acc.insert(xyz, mNodes[n].getChild());
+
1732  mNodes[n].getChild()->setValueAndCache(xyz, value, acc);
+
1733  }
+
1734 }
+
1735 
+
1736 
+
1737 template<typename ChildT, Index Log2Dim>
+
1738 inline void
+
1739 InternalNode<ChildT, Log2Dim>::setValueOnly(const Coord& xyz, const ValueType& value)
+
1740 {
+
1741  const Index n = this->coordToOffset(xyz);
+
1742  bool hasChild = this->isChildMaskOn(n);
+
1743  if (!hasChild && !math::isExactlyEqual(mNodes[n].getValue(), value)) {
+
1744  // If the voxel has a tile value that is different from the one provided,
+
1745  // a child subtree must be constructed.
+
1746  const bool active = this->isValueMaskOn(n);
+
1747  hasChild = true;
+
1748  this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), active));
+
1749  }
+
1750  if (hasChild) mNodes[n].getChild()->setValueOnly(xyz, value);
+
1751 }
+
1752 
+
1753 template<typename ChildT, Index Log2Dim>
+
1754 template<typename AccessorT>
+
1755 inline void
+ +
1757  const ValueType& value, AccessorT& acc)
+
1758 {
+
1759  const Index n = this->coordToOffset(xyz);
+
1760  bool hasChild = this->isChildMaskOn(n);
+
1761  if (!hasChild && !math::isExactlyEqual(mNodes[n].getValue(), value)) {
+
1762  // If the voxel has a tile value that is different from the one provided,
+
1763  // a child subtree must be constructed.
+
1764  const bool active = this->isValueMaskOn(n);
+
1765  hasChild = true;
+
1766  this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), active));
+
1767  }
+
1768  if (hasChild) {
+
1769  acc.insert(xyz, mNodes[n].getChild());
+
1770  mNodes[n].getChild()->setValueOnlyAndCache(xyz, value, acc);
+
1771  }
+
1772 }
+
1773 
+
1774 
+
1775 template<typename ChildT, Index Log2Dim>
+
1776 inline void
+ +
1778 {
+
1779  const Index n = this->coordToOffset(xyz);
+
1780  bool hasChild = this->isChildMaskOn(n);
+
1781  if (!hasChild) {
+
1782  if (on != this->isValueMaskOn(n)) {
+
1783  // If the voxel belongs to a tile with the wrong active state,
+
1784  // then a child subtree must be constructed.
+
1785  // 'on' is the voxel's new state, therefore '!on' is the tile's current state
+
1786  hasChild = true;
+
1787  this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), !on));
+
1788  }
+
1789  }
+
1790  if (hasChild) mNodes[n].getChild()->setActiveState(xyz, on);
+
1791 }
+
1792 
+
1793 template<typename ChildT, Index Log2Dim>
+
1794 template<typename AccessorT>
+
1795 inline void
+
1796 InternalNode<ChildT, Log2Dim>::setActiveStateAndCache(const Coord& xyz, bool on, AccessorT& acc)
+
1797 {
+
1798  const Index n = this->coordToOffset(xyz);
+
1799  bool hasChild = this->isChildMaskOn(n);
+
1800  if (!hasChild) {
+
1801  if (on != this->isValueMaskOn(n)) {
+
1802  // If the voxel belongs to a tile with the wrong active state,
+
1803  // then a child subtree must be constructed.
+
1804  // 'on' is the voxel's new state, therefore '!on' is the tile's current state
+
1805  hasChild = true;
+
1806  this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), !on));
+
1807  }
+
1808  }
+
1809  if (hasChild) {
+
1810  ChildT* child = mNodes[n].getChild();
+
1811  acc.insert(xyz, child);
+
1812  child->setActiveStateAndCache(xyz, on, acc);
+
1813  }
+
1814 }
+
1815 
+
1816 
+
1817 template<typename ChildT, Index Log2Dim>
+
1818 inline void
+ +
1820 {
+
1821  mValueMask = !mChildMask;
+
1822  for (ChildOnIter iter = this->beginChildOn(); iter; ++iter) {
+
1823  mNodes[iter.pos()].getChild()->setValuesOn();
+
1824  }
+
1825 }
+
1826 
+
1827 
+
1828 template<typename ChildT, Index Log2Dim>
+
1829 template<typename ModifyOp>
+
1830 inline void
+
1831 InternalNode<ChildT, Log2Dim>::modifyValue(const Coord& xyz, const ModifyOp& op)
+
1832 {
+
1833  const Index n = InternalNode::coordToOffset(xyz);
+
1834  bool hasChild = this->isChildMaskOn(n);
+
1835  if (!hasChild) {
+
1836  // Need to create a child if the tile is inactive,
+
1837  // in order to activate voxel (x, y, z).
+
1838  const bool active = this->isValueMaskOn(n);
+
1839  bool createChild = !active;
+
1840  if (!createChild) {
+
1841  // Need to create a child if applying the functor
+
1842  // to the tile value produces a different value.
+
1843  const ValueType& tileVal = mNodes[n].getValue();
+
1844  ValueType modifiedVal = tileVal;
+
1845  op(modifiedVal);
+
1846  createChild = !math::isExactlyEqual(tileVal, modifiedVal);
+
1847  }
+
1848  if (createChild) {
+
1849  hasChild = true;
+
1850  this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), active));
+
1851  }
+
1852  }
+
1853  if (hasChild) mNodes[n].getChild()->modifyValue(xyz, op);
+
1854 }
+
1855 
+
1856 template<typename ChildT, Index Log2Dim>
+
1857 template<typename ModifyOp, typename AccessorT>
+
1858 inline void
+
1859 InternalNode<ChildT, Log2Dim>::modifyValueAndCache(const Coord& xyz, const ModifyOp& op,
+
1860  AccessorT& acc)
+
1861 {
+
1862  const Index n = InternalNode::coordToOffset(xyz);
+
1863  bool hasChild = this->isChildMaskOn(n);
+
1864  if (!hasChild) {
+
1865  // Need to create a child if the tile is inactive,
+
1866  // in order to activate voxel (x, y, z).
+
1867  const bool active = this->isValueMaskOn(n);
+
1868  bool createChild = !active;
+
1869  if (!createChild) {
+
1870  // Need to create a child if applying the functor
+
1871  // to the tile value produces a different value.
+
1872  const ValueType& tileVal = mNodes[n].getValue();
+
1873  ValueType modifiedVal = tileVal;
+
1874  op(modifiedVal);
+
1875  createChild = !math::isExactlyEqual(tileVal, modifiedVal);
+
1876  }
+
1877  if (createChild) {
+
1878  hasChild = true;
+
1879  this->setChildNode(n, new ChildNodeType(xyz, mNodes[n].getValue(), active));
+
1880  }
+
1881  }
+
1882  if (hasChild) {
+
1883  ChildNodeType* child = mNodes[n].getChild();
+
1884  acc.insert(xyz, child);
+
1885  child->modifyValueAndCache(xyz, op, acc);
+
1886  }
+
1887 }
+
1888 
+
1889 
+
1890 template<typename ChildT, Index Log2Dim>
+
1891 template<typename ModifyOp>
+
1892 inline void
+ +
1894 {
+
1895  const Index n = InternalNode::coordToOffset(xyz);
+
1896  bool hasChild = this->isChildMaskOn(n);
+
1897  if (!hasChild) {
+
1898  const bool tileState = this->isValueMaskOn(n);
+
1899  const ValueType& tileVal = mNodes[n].getValue();
+
1900  bool modifiedState = !tileState;
+
1901  ValueType modifiedVal = tileVal;
+
1902  op(modifiedVal, modifiedState);
+
1903  // Need to create a child if applying the functor to the tile
+
1904  // produces a different value or active state.
+
1905  if (modifiedState != tileState || !math::isExactlyEqual(modifiedVal, tileVal)) {
+
1906  hasChild = true;
+
1907  this->setChildNode(n, new ChildNodeType(xyz, tileVal, tileState));
+
1908  }
+
1909  }
+
1910  if (hasChild) mNodes[n].getChild()->modifyValueAndActiveState(xyz, op);
+
1911 }
+
1912 
+
1913 template<typename ChildT, Index Log2Dim>
+
1914 template<typename ModifyOp, typename AccessorT>
+
1915 inline void
+ +
1917  const Coord& xyz, const ModifyOp& op, AccessorT& acc)
+
1918 {
+
1919  const Index n = InternalNode::coordToOffset(xyz);
+
1920  bool hasChild = this->isChildMaskOn(n);
+
1921  if (!hasChild) {
+
1922  const bool tileState = this->isValueMaskOn(n);
+
1923  const ValueType& tileVal = mNodes[n].getValue();
+
1924  bool modifiedState = !tileState;
+
1925  ValueType modifiedVal = tileVal;
+
1926  op(modifiedVal, modifiedState);
+
1927  // Need to create a child if applying the functor to the tile
+
1928  // produces a different value or active state.
+
1929  if (modifiedState != tileState || !math::isExactlyEqual(modifiedVal, tileVal)) {
+
1930  hasChild = true;
+
1931  this->setChildNode(n, new ChildNodeType(xyz, tileVal, tileState));
+
1932  }
+
1933  }
+
1934  if (hasChild) {
+
1935  ChildNodeType* child = mNodes[n].getChild();
+
1936  acc.insert(xyz, child);
+
1937  child->modifyValueAndActiveStateAndCache(xyz, op, acc);
+
1938  }
+
1939 }
+
1940 
+
1941 
+
1943 
+
1944 
+
1945 template<typename ChildT, Index Log2Dim>
+
1946 inline void
+
1947 InternalNode<ChildT, Log2Dim>::clip(const CoordBBox& clipBBox, const ValueType& background)
+
1948 {
+
1949  CoordBBox nodeBBox = this->getNodeBoundingBox();
+
1950  if (!clipBBox.hasOverlap(nodeBBox)) {
+
1951  // This node lies completely outside the clipping region. Fill it with background tiles.
+
1952  this->fill(nodeBBox, background, /*active=*/false);
+
1953  } else if (clipBBox.isInside(nodeBBox)) {
+
1954  // This node lies completely inside the clipping region. Leave it intact.
+
1955  return;
+
1956  }
+
1957 
+
1958  // This node isn't completely contained inside the clipping region.
+
1959  // Clip tiles and children, and replace any that lie outside the region
+
1960  // with background tiles.
+
1961 
+
1962  for (Index pos = 0; pos < NUM_VALUES; ++pos) {
+
1963  const Coord xyz = this->offsetToGlobalCoord(pos); // tile or child origin
+
1964  CoordBBox tileBBox(xyz, xyz.offsetBy(ChildT::DIM - 1)); // tile or child bounds
+
1965  if (!clipBBox.hasOverlap(tileBBox)) {
+
1966  // This table entry lies completely outside the clipping region.
+
1967  // Replace it with a background tile.
+
1968  this->makeChildNodeEmpty(pos, background);
+
1969  mValueMask.setOff(pos);
+
1970  } else if (!clipBBox.isInside(tileBBox)) {
+
1971  // This table entry does not lie completely inside the clipping region
+
1972  // and must be clipped.
+
1973  if (this->isChildMaskOn(pos)) {
+
1974  mNodes[pos].getChild()->clip(clipBBox, background);
+
1975  } else {
+
1976  // Replace this tile with a background tile, then fill the clip region
+
1977  // with the tile's original value. (This might create a child branch.)
+
1978  tileBBox.intersect(clipBBox);
+
1979  const ValueType val = mNodes[pos].getValue();
+
1980  const bool on = this->isValueMaskOn(pos);
+
1981  mNodes[pos].setValue(background);
+
1982  mValueMask.setOff(pos);
+
1983  this->fill(tileBBox, val, on);
+
1984  }
+
1985  } else {
+
1986  // This table entry lies completely inside the clipping region. Leave it intact.
+
1987  }
+
1988  }
+
1989 }
+
1990 
+
1991 
+
1993 
+
1994 
+
1995 template<typename ChildT, Index Log2Dim>
+
1996 inline void
+
1997 InternalNode<ChildT, Log2Dim>::fill(const CoordBBox& bbox, const ValueType& value, bool active)
+
1998 {
+
1999  Coord xyz, tileMin, tileMax;
+
2000  for (int x = bbox.min().x(); x <= bbox.max().x(); x = tileMax.x() + 1) {
+
2001  xyz.setX(x);
+
2002  for (int y = bbox.min().y(); y <= bbox.max().y(); y = tileMax.y() + 1) {
+
2003  xyz.setY(y);
+
2004  for (int z = bbox.min().z(); z <= bbox.max().z(); z = tileMax.z() + 1) {
+
2005  xyz.setZ(z);
+
2006 
+
2007  // Get the bounds of the tile that contains voxel (x, y, z).
+
2008  const Index n = this->coordToOffset(xyz);
+
2009  tileMin = this->offsetToGlobalCoord(n);
+
2010  tileMax = tileMin.offsetBy(ChildT::DIM - 1);
+
2011 
+
2012  if (xyz != tileMin || Coord::lessThan(bbox.max(), tileMax)) {
+
2013  // If the box defined by (xyz, bbox.max()) doesn't completely enclose
+
2014  // the tile to which xyz belongs, create a child node (or retrieve
+
2015  // the existing one).
+
2016  ChildT* child = NULL;
+
2017  if (this->isChildMaskOff(n)) {
+
2018  // Replace the tile with a newly-created child that is initialized
+
2019  // with the tile's value and active state.
+
2020  child = new ChildT(xyz, mNodes[n].getValue(), this->isValueMaskOn(n));
+
2021  this->setChildNode(n, child);
+
2022  } else {
+
2023  child = mNodes[n].getChild();
+
2024  }
+
2025 
+
2026  // Forward the fill request to the child.
+
2027  if (child) {
+
2028  child->fill(CoordBBox(xyz, Coord::minComponent(bbox.max(), tileMax)),
+
2029  value, active);
+
2030  }
+
2031 
+
2032  } else {
+
2033  // If the box given by (xyz, bbox.max()) completely encloses
+
2034  // the tile to which xyz belongs, create the tile (if it
+
2035  // doesn't already exist) and give it the fill value.
+
2036  this->makeChildNodeEmpty(n, value);
+
2037  mValueMask.set(n, active);
+
2038  }
+
2039  }
+
2040  }
+
2041  }
+
2042 }
+
2043 
+
2044 
+
2046 
+
2047 
+
2048 template<typename ChildT, Index Log2Dim>
+
2049 template<typename DenseT>
+
2050 inline void
+
2051 InternalNode<ChildT, Log2Dim>::copyToDense(const CoordBBox& bbox, DenseT& dense) const
+
2052 {
+
2053  typedef typename DenseT::ValueType DenseValueType;
+
2054 
+
2055  const size_t xStride = dense.xStride(), yStride = dense.yStride(), zStride = dense.zStride();
+
2056  const Coord& min = dense.bbox().min();
+
2057  for (Coord xyz = bbox.min(), max; xyz[0] <= bbox.max()[0]; xyz[0] = max[0] + 1) {
+
2058  for (xyz[1] = bbox.min()[1]; xyz[1] <= bbox.max()[1]; xyz[1] = max[1] + 1) {
+
2059  for (xyz[2] = bbox.min()[2]; xyz[2] <= bbox.max()[2]; xyz[2] = max[2] + 1) {
+
2060  const Index n = this->coordToOffset(xyz);
+
2061  // Get max coordinates of the child node that contains voxel xyz.
+
2062  max = this->offsetToGlobalCoord(n).offsetBy(ChildT::DIM-1);
+
2063 
+
2064  // Get the bbox of the interection of bbox and the child node
+
2065  CoordBBox sub(xyz, Coord::minComponent(bbox.max(), max));
+
2066 
+
2067  if (this->isChildMaskOn(n)) {//is a child
+
2068  mNodes[n].getChild()->copyToDense(sub, dense);
+
2069  } else {//a tile value
+
2070  const ValueType value = mNodes[n].getValue();
+
2071  sub.translate(-min);
+
2072  DenseValueType* a0 = dense.data() + zStride*sub.min()[2];
+
2073  for (Int32 x=sub.min()[0], ex=sub.max()[0]+1; x<ex; ++x) {
+
2074  DenseValueType* a1 = a0 + x*xStride;
+
2075  for (Int32 y=sub.min()[1], ey=sub.max()[1]+1; y<ey; ++y) {
+
2076  DenseValueType* a2 = a1 + y*yStride;
+
2077  for (Int32 z=sub.min()[2], ez=sub.max()[2]+1; z<ez; ++z, a2 += zStride) {
+
2078  *a2 = DenseValueType(value);
+
2079  }
+
2080  }
+
2081  }
+
2082  }
+
2083  }
+
2084  }
+
2085  }
+
2086 }
+
2087 
+
2088 
+
2090 
+
2091 
+
2092 template<typename ChildT, Index Log2Dim>
+
2093 inline void
+
2094 InternalNode<ChildT, Log2Dim>::writeTopology(std::ostream& os, bool toHalf) const
+
2095 {
+
2096  mChildMask.save(os);
+
2097  mValueMask.save(os);
+
2098 
+
2099  {
+
2100  // Copy all of this node's values into an array.
+
2101  boost::shared_array<ValueType> values(new ValueType[NUM_VALUES]);
+
2102  const ValueType zero = zeroVal<ValueType>();
+
2103  for (Index i = 0; i < NUM_VALUES; ++i) {
+
2104  values[i] = (mChildMask.isOff(i) ? mNodes[i].getValue() : zero);
+
2105  }
+
2106  // Compress (optionally) and write out the contents of the array.
+
2107  io::writeCompressedValues(os, values.get(), NUM_VALUES, mValueMask, mChildMask, toHalf);
+
2108  }
+
2109  // Write out the child nodes in order.
+
2110  for (ChildOnCIter iter = this->cbeginChildOn(); iter; ++iter) {
+
2111  iter->writeTopology(os, toHalf);
+
2112  }
+
2113 }
+
2114 
+
2115 
+
2116 template<typename ChildT, Index Log2Dim>
+
2117 inline void
+
2118 InternalNode<ChildT, Log2Dim>::readTopology(std::istream& is, bool fromHalf)
+
2119 {
+
2120 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
2121  const ValueType background = (!io::getGridBackgroundValuePtr(is) ? zeroVal<ValueType>()
+
2122  : *static_cast<const ValueType*>(io::getGridBackgroundValuePtr(is)));
+
2123 #endif
+
2124 
+
2125  mChildMask.load(is);
+
2126  mValueMask.load(is);
+
2127 
+ +
2129  for (Index i = 0; i < NUM_VALUES; ++i) {
+
2130  if (this->isChildMaskOn(i)) {
+
2131  ChildNodeType* child =
+
2132 #ifdef OPENVDB_2_ABI_COMPATIBLE
+
2133  new ChildNodeType(offsetToGlobalCoord(i), zeroVal<ValueType>());
+
2134 #else
+
2135  new ChildNodeType(PartialCreate(), offsetToGlobalCoord(i), background);
+
2136 #endif
+
2137  mNodes[i].setChild(child);
+
2138  child->readTopology(is);
+
2139  } else {
+
2140  ValueType value;
+
2141  is.read(reinterpret_cast<char*>(&value), sizeof(ValueType));
+
2142  mNodes[i].setValue(value);
+
2143  }
+
2144  }
+
2145  } else {
+
2146  const bool oldVersion =
+ +
2148  const Index numValues = (oldVersion ? mChildMask.countOff() : NUM_VALUES);
+
2149  {
+
2150  // Read in (and uncompress, if necessary) all of this node's values
+
2151  // into a contiguous array.
+
2152  boost::shared_array<ValueType> values(new ValueType[numValues]);
+
2153  io::readCompressedValues(is, values.get(), numValues, mValueMask, fromHalf);
+
2154 
+
2155  // Copy values from the array into this node's table.
+
2156  if (oldVersion) {
+
2157  Index n = 0;
+
2158  for (ValueAllIter iter = this->beginValueAll(); iter; ++iter) {
+
2159  mNodes[iter.pos()].setValue(values[n++]);
+
2160  }
+
2161  assert(n == numValues);
+
2162  } else {
+
2163  for (ValueAllIter iter = this->beginValueAll(); iter; ++iter) {
+
2164  mNodes[iter.pos()].setValue(values[iter.pos()]);
+
2165  }
+
2166  }
+
2167  }
+
2168  // Read in all child nodes and insert them into the table at their proper locations.
+
2169  for (ChildOnIter iter = this->beginChildOn(); iter; ++iter) {
+
2170 #ifdef OPENVDB_2_ABI_COMPATIBLE
+
2171  ChildNodeType* child = new ChildNodeType(iter.getCoord(), zeroVal<ValueType>());
+
2172 #else
+
2173  ChildNodeType* child = new ChildNodeType(PartialCreate(), iter.getCoord(), background);
+
2174 #endif
+
2175  mNodes[iter.pos()].setChild(child);
+
2176  child->readTopology(is, fromHalf);
+
2177  }
+
2178  }
+
2179 }
+
2180 
+
2181 
+
2183 
+
2184 
+
2185 template<typename ChildT, Index Log2Dim>
+
2186 inline const typename ChildT::ValueType&
+ +
2188 {
+
2189  return (this->isChildMaskOn(0) ? mNodes[0].getChild()->getFirstValue() : mNodes[0].getValue());
+
2190 }
+
2191 
+
2192 
+
2193 template<typename ChildT, Index Log2Dim>
+
2194 inline const typename ChildT::ValueType&
+ +
2196 {
+
2197  const Index n = NUM_VALUES - 1;
+
2198  return (this->isChildMaskOn(n) ? mNodes[n].getChild()->getLastValue() : mNodes[n].getValue());
+
2199 }
+
2200 
+
2201 
+
2203 
+
2204 
+
2205 template<typename ChildT, Index Log2Dim>
+
2206 inline void
+ +
2208 {
+
2209  for (Index i = 0; i < NUM_VALUES; ++i) {
+
2210  if (this->isChildMaskOn(i)) {
+
2211  mNodes[i].getChild()->negate();
+
2212  } else {
+
2213  mNodes[i].setValue(math::negative(mNodes[i].getValue()));
+
2214  }
+
2215  }
+
2216 
+
2217 }
+
2218 
+
2220 
+
2221 template<typename ChildT, Index Log2Dim>
+ +
2223 {
+
2224  VoxelizeActiveTiles(InternalNode &node) : mNode(&node) {
+
2225  //(*this)(tbb::blocked_range<Index>(0, NUM_VALUES));//single thread for debugging
+
2226  tbb::parallel_for(tbb::blocked_range<Index>(0, NUM_VALUES), *this);
+
2227 
+
2228  node.mChildMask |= node.mValueMask;
+
2229  node.mValueMask.setOff();
+
2230  }
+
2231  void operator()(const tbb::blocked_range<Index> &r) const
+
2232  {
+
2233  for (Index i = r.begin(), end=r.end(); i!=end; ++i) {
+
2234  if (mNode->mChildMask.isOn(i)) {// Loop over node's child nodes
+
2235  mNode->mNodes[i].getChild()->voxelizeActiveTiles(true);
+
2236  } else if (mNode->mValueMask.isOn(i)) {// Loop over node's active tiles
+
2237  const Coord &ijk = mNode->offsetToGlobalCoord(i);
+
2238  ChildNodeType *child = new ChildNodeType(ijk, mNode->mNodes[i].getValue(), true);
+
2239  child->voxelizeActiveTiles(true);
+
2240  mNode->mNodes[i].setChild(child);
+
2241  }
+
2242  }
+
2243  }
+ +
2245 };// VoxelizeActiveTiles
+
2246 
+
2247 template<typename ChildT, Index Log2Dim>
+
2248 inline void
+ +
2250 {
+
2251  if (threaded) {
+
2252  VoxelizeActiveTiles tmp(*this);
+
2253  } else {
+
2254  for (ValueOnIter iter = this->beginValueOn(); iter; ++iter) {
+
2255  this->setChildNode(iter.pos(), new ChildNodeType(iter.getCoord(), iter.getValue(), true));
+
2256  }
+
2257  for (ChildOnIter iter = this->beginChildOn(); iter; ++iter)
+
2258  iter->voxelizeActiveTiles(false);
+
2259  }
+
2260 }
+
2261 
+
2262 
+
2264 
+
2265 
+
2266 template<typename ChildT, Index Log2Dim>
+
2267 template<MergePolicy Policy>
+
2268 inline void
+ +
2270  const ValueType& background, const ValueType& otherBackground)
+
2271 {
+ +
2273 
+
2274  switch (Policy) {
+
2275 
+
2276  case MERGE_ACTIVE_STATES:
+
2277  default:
+
2278  {
+
2279  for (ChildOnIter iter = other.beginChildOn(); iter; ++iter) {
+
2280  const Index n = iter.pos();
+
2281  if (mChildMask.isOn(n)) {
+
2282  // Merge this node's child with the other node's child.
+
2283  mNodes[n].getChild()->template merge<MERGE_ACTIVE_STATES>(*iter,
+
2284  background, otherBackground);
+
2285  } else if (mValueMask.isOff(n)) {
+
2286  // Replace this node's inactive tile with the other node's child
+
2287  // and replace the other node's child with a tile of undefined value
+
2288  // (which is okay since the other tree is assumed to be cannibalized
+
2289  // in the process of merging).
+
2290  ChildNodeType* child = other.mNodes[n].getChild();
+
2291  other.mChildMask.setOff(n);
+
2292  child->resetBackground(otherBackground, background);
+
2293  this->setChildNode(n, child);
+
2294  }
+
2295  }
+
2296 
+
2297  // Copy active tile values.
+
2298  for (ValueOnCIter iter = other.cbeginValueOn(); iter; ++iter) {
+
2299  const Index n = iter.pos();
+
2300  if (mValueMask.isOff(n)) {
+
2301  // Replace this node's child or inactive tile with the other node's active tile.
+
2302  this->makeChildNodeEmpty(n, iter.getValue());
+
2303  mValueMask.setOn(n);
+
2304  }
+
2305  }
+
2306  break;
+
2307  }
+
2308 
+
2309  case MERGE_NODES:
+
2310  {
+
2311  for (ChildOnIter iter = other.beginChildOn(); iter; ++iter) {
+
2312  const Index n = iter.pos();
+
2313  if (mChildMask.isOn(n)) {
+
2314  // Merge this node's child with the other node's child.
+
2315  mNodes[n].getChild()->template merge<Policy>(*iter, background, otherBackground);
+
2316  } else {
+
2317  // Replace this node's tile (regardless of its active state) with
+
2318  // the other node's child and replace the other node's child with
+
2319  // a tile of undefined value (which is okay since the other tree
+
2320  // is assumed to be cannibalized in the process of merging).
+
2321  ChildNodeType* child = other.mNodes[n].getChild();
+
2322  other.mChildMask.setOff(n);
+
2323  child->resetBackground(otherBackground, background);
+
2324  this->setChildNode(n, child);
+
2325  }
+
2326  }
+
2327  break;
+
2328  }
+
2329 
+ +
2331  {
+
2332  // Transfer children from the other tree to this tree.
+
2333  for (ChildOnIter iter = other.beginChildOn(); iter; ++iter) {
+
2334  const Index n = iter.pos();
+
2335  if (mChildMask.isOn(n)) {
+
2336  // Merge this node's child with the other node's child.
+
2337  mNodes[n].getChild()->template merge<Policy>(*iter, background, otherBackground);
+
2338  } else {
+
2339  // Replace this node's tile with the other node's child, leaving the other
+
2340  // node with an inactive tile of undefined value (which is okay since
+
2341  // the other tree is assumed to be cannibalized in the process of merging).
+
2342  ChildNodeType* child = other.mNodes[n].getChild();
+
2343  other.mChildMask.setOff(n);
+
2344  child->resetBackground(otherBackground, background);
+
2345  if (mValueMask.isOn(n)) {
+
2346  // Merge the child with this node's active tile.
+
2347  child->template merge<Policy>(mNodes[n].getValue(), /*on=*/true);
+
2348  mValueMask.setOff(n);
+
2349  }
+
2350  mChildMask.setOn(n);
+
2351  mNodes[n].setChild(child);
+
2352  }
+
2353  }
+
2354 
+
2355  // Merge active tiles into this tree.
+
2356  for (ValueOnCIter iter = other.cbeginValueOn(); iter; ++iter) {
+
2357  const Index n = iter.pos();
+
2358  if (mChildMask.isOn(n)) {
+
2359  // Merge the other node's active tile into this node's child.
+
2360  mNodes[n].getChild()->template merge<Policy>(iter.getValue(), /*on=*/true);
+
2361  } else if (mValueMask.isOff(n)) {
+
2362  // Replace this node's inactive tile with the other node's active tile.
+
2363  mNodes[n].setValue(iter.getValue());
+
2364  mValueMask.setOn(n);
+
2365  }
+
2366  }
+
2367  break;
+
2368  }
+
2369 
+
2370  }
+ +
2372 }
+
2373 
+
2374 
+
2375 template<typename ChildT, Index Log2Dim>
+
2376 template<MergePolicy Policy>
+
2377 inline void
+
2378 InternalNode<ChildT, Log2Dim>::merge(const ValueType& tileValue, bool tileActive)
+
2379 {
+ +
2381 
+
2382  if (Policy != MERGE_ACTIVE_STATES_AND_NODES) return;
+
2383 
+
2384  // For MERGE_ACTIVE_STATES_AND_NODES, inactive tiles in the other tree are ignored.
+
2385  if (!tileActive) return;
+
2386 
+
2387  // Iterate over this node's children and inactive tiles.
+
2388  for (ValueOffIter iter = this->beginValueOff(); iter; ++iter) {
+
2389  const Index n = iter.pos();
+
2390  if (mChildMask.isOn(n)) {
+
2391  // Merge the other node's active tile into this node's child.
+
2392  mNodes[n].getChild()->template merge<Policy>(tileValue, /*on=*/true);
+
2393  } else {
+
2394  // Replace this node's inactive tile with the other node's active tile.
+
2395  iter.setValue(tileValue);
+
2396  mValueMask.setOn(n);
+
2397  }
+
2398  }
+ +
2400 }
+
2401 
+
2403 
+
2404 template<typename ChildT, Index Log2Dim>
+
2405 template<typename OtherInternalNode>
+ +
2407 {
+
2408  typedef typename NodeMaskType::Word W;
+
2409  struct A { inline void operator()(W &tV, const W& sV, const W& tC) const
+
2410  { tV = (tV | sV) & ~tC; }
+
2411  };
+
2412  TopologyUnion(const OtherInternalNode* source, InternalNode* target) : s(source), t(target) {
+
2413  //(*this)(tbb::blocked_range<Index>(0, NUM_VALUES));//single thread for debugging
+
2414  tbb::parallel_for(tbb::blocked_range<Index>(0, NUM_VALUES), *this);
+
2415 
+
2416  // Bit processing is done in a single thread!
+
2417  t->mChildMask |= s->mChildMask;//serial but very fast bitwise post-process
+
2418  A op;
+
2419  t->mValueMask.foreach(s->mValueMask, t->mChildMask, op);
+
2420  assert((t->mValueMask & t->mChildMask).isOff());//no overlapping active tiles and child nodes
+
2421  }
+
2422  void operator()(const tbb::blocked_range<Index> &r) const {
+
2423  for (Index i = r.begin(), end=r.end(); i!=end; ++i) {
+
2424  if (s->mChildMask.isOn(i)) {// Loop over other node's child nodes
+
2425  const typename OtherInternalNode::ChildNodeType& other = *(s->mNodes[i].getChild());
+
2426  if (t->mChildMask.isOn(i)) {//this has a child node
+
2427  t->mNodes[i].getChild()->topologyUnion(other);
+
2428  } else {// this is a tile so replace it with a child branch with identical topology
+
2429  ChildT* child = new ChildT(other, t->mNodes[i].getValue(), TopologyCopy());
+
2430  if (t->mValueMask.isOn(i)) child->setValuesOn();//activate all values
+
2431  t->mNodes[i].setChild(child);
+
2432  }
+
2433  } else if (s->mValueMask.isOn(i) && t->mChildMask.isOn(i)) {
+
2434  t->mNodes[i].getChild()->setValuesOn();
+
2435  }
+
2436  }
+
2437  }
+
2438  const OtherInternalNode* s;
+ +
2440 };// TopologyUnion
+
2441 
+
2442 template<typename ChildT, Index Log2Dim>
+
2443 template<typename OtherChildT>
+
2444 inline void
+ +
2446 {
+ +
2448 }
+
2449 
+
2450 template<typename ChildT, Index Log2Dim>
+
2451 template<typename OtherInternalNode>
+
2452 struct InternalNode<ChildT, Log2Dim>::TopologyIntersection
+
2453 {
+
2454  typedef typename NodeMaskType::Word W;
+
2455  struct A { inline void operator()(W &tC, const W& sC, const W& sV, const W& tV) const
+
2456  { tC = (tC & (sC | sV)) | (tV & sC); }
+
2457  };
+
2458  TopologyIntersection(const OtherInternalNode* source, InternalNode* target,
+
2459  const ValueType& background) : s(source), t(target), b(background) {
+
2460  //(*this)(tbb::blocked_range<Index>(0, NUM_VALUES));//single thread for debugging
+
2461  tbb::parallel_for(tbb::blocked_range<Index>(0, NUM_VALUES), *this);
+
2462 
+
2463  // Bit processing is done in a single thread!
+
2464  A op;
+
2465  t->mChildMask.foreach(s->mChildMask, s->mValueMask, t->mValueMask, op);
+
2466 
+
2467  t->mValueMask &= s->mValueMask;
+
2468  assert((t->mValueMask & t->mChildMask).isOff());//no overlapping active tiles and child nodes
+
2469  }
+
2470  void operator()(const tbb::blocked_range<Index> &r) const {
+
2471  for (Index i = r.begin(), end=r.end(); i!=end; ++i) {
+
2472  if (t->mChildMask.isOn(i)) {// Loop over this node's child nodes
+
2473  ChildT* child = t->mNodes[i].getChild();
+
2474  if (s->mChildMask.isOn(i)) {//other also has a child node
+
2475  child->topologyIntersection(*(s->mNodes[i].getChild()), b);
+
2476  } else if (s->mValueMask.isOff(i)) {//other is an inactive tile
+
2477  delete child;//convert child to an inactive tile
+
2478  t->mNodes[i].setValue(b);
+
2479  }
+
2480  } else if (t->mValueMask.isOn(i) && s->mChildMask.isOn(i)) {//active tile -> a branch
+
2481  t->mNodes[i].setChild(new ChildT(*(s->mNodes[i].getChild()),
+
2482  t->mNodes[i].getValue(), TopologyCopy()));
+
2483  }
+
2484  }
+
2485  }
+
2486  const OtherInternalNode* s;
+ +
2488  const ValueType& b;
+
2489 };// TopologyIntersection
+
2490 
+
2491 template<typename ChildT, Index Log2Dim>
+
2492 template<typename OtherChildT>
+
2493 inline void
+ +
2495  const ValueType& background)
+
2496 {
+
2497  TopologyIntersection<InternalNode<OtherChildT, Log2Dim> > tmp(&other, this, background);
+
2498 }
+
2499 
+
2500 template<typename ChildT, Index Log2Dim>
+
2501 template<typename OtherInternalNode>
+
2502 struct InternalNode<ChildT, Log2Dim>::TopologyDifference
+
2503 {
+
2504  typedef typename NodeMaskType::Word W;
+
2505  struct A {inline void operator()(W &tC, const W& sC, const W& sV, const W& tV) const
+
2506  { tC = (tC & (sC | ~sV)) | (tV & sC); }
+
2507  };
+
2508  struct B {inline void operator()(W &tV, const W& sC, const W& sV, const W& tC) const
+
2509  { tV &= ~((tC & sV) | (sC | sV)); }
+
2510  };
+
2511  TopologyDifference(const OtherInternalNode* source, InternalNode* target,
+
2512  const ValueType& background) : s(source), t(target), b(background) {
+
2513  //(*this)(tbb::blocked_range<Index>(0, NUM_VALUES));//single thread for debugging
+
2514  tbb::parallel_for(tbb::blocked_range<Index>(0, NUM_VALUES), *this);
+
2515 
+
2516  // Bit processing is done in a single thread!
+
2517  const NodeMaskType oldChildMask(t->mChildMask);//important to avoid cross pollution
+
2518  A op1;
+
2519  t->mChildMask.foreach(s->mChildMask, s->mValueMask, t->mValueMask, op1);
+
2520 
+
2521  B op2;
+
2522  t->mValueMask.foreach(t->mChildMask, s->mValueMask, oldChildMask, op2);
+
2523  assert((t->mValueMask & t->mChildMask).isOff());//no overlapping active tiles and child nodes
+
2524  }
+
2525  void operator()(const tbb::blocked_range<Index> &r) const {
+
2526  for (Index i = r.begin(), end=r.end(); i!=end; ++i) {
+
2527  if (t->mChildMask.isOn(i)) {// Loop over this node's child nodes
+
2528  ChildT* child = t->mNodes[i].getChild();
+
2529  if (s->mChildMask.isOn(i)) {
+
2530  child->topologyDifference(*(s->mNodes[i].getChild()), b);
+
2531  } else if (s->mValueMask.isOn(i)) {
+
2532  delete child;//convert child to an inactive tile
+
2533  t->mNodes[i].setValue(b);
+
2534  }
+
2535  } else if (t->mValueMask.isOn(i)) {//this is an active tile
+
2536  if (s->mChildMask.isOn(i)) {
+
2537  const typename OtherInternalNode::ChildNodeType& other = *(s->mNodes[i].getChild());
+
2538  ChildT* child = new ChildT(other.origin(), t->mNodes[i].getValue(), true);
+
2539  child->topologyDifference(other, b);
+
2540  t->mNodes[i].setChild(child);//replace the active tile with a child branch
+
2541  }
+
2542  }
+
2543  }
+
2544  }
+
2545  const OtherInternalNode* s;
+ +
2547  const ValueType& b;
+
2548 };// TopologyDifference
+
2549 
+
2550 template<typename ChildT, Index Log2Dim>
+
2551 template<typename OtherChildT>
+
2552 inline void
+ +
2554  const ValueType& background)
+
2555 {
+
2556  TopologyDifference<InternalNode<OtherChildT, Log2Dim> > tmp(&other, this, background);
+
2557 }
+
2558 
+
2560 
+
2561 
+
2562 template<typename ChildT, Index Log2Dim>
+
2563 template<typename CombineOp>
+
2564 inline void
+ +
2566 {
+
2567  const ValueType zero = zeroVal<ValueType>();
+
2568 
+ +
2570 
+
2571  for (Index i = 0; i < NUM_VALUES; ++i) {
+
2572  if (this->isChildMaskOff(i) && other.isChildMaskOff(i)) {
+
2573  // Both this node and the other node have constant values (tiles).
+
2574  // Combine the two values and store the result as this node's new tile value.
+
2575  op(args.setARef(mNodes[i].getValue())
+
2576  .setAIsActive(isValueMaskOn(i))
+
2577  .setBRef(other.mNodes[i].getValue())
+
2578  .setBIsActive(other.isValueMaskOn(i)));
+
2579  mNodes[i].setValue(args.result());
+
2580  mValueMask.set(i, args.resultIsActive());
+
2581  } else if (this->isChildMaskOn(i) && other.isChildMaskOff(i)) {
+
2582  // Combine this node's child with the other node's constant value.
+
2583  ChildNodeType* child = mNodes[i].getChild();
+
2584  assert(child);
+
2585  if (child) {
+
2586  child->combine(other.mNodes[i].getValue(), other.isValueMaskOn(i), op);
+
2587  }
+
2588  } else if (this->isChildMaskOff(i) && other.isChildMaskOn(i)) {
+
2589  // Combine this node's constant value with the other node's child.
+
2590  ChildNodeType* child = other.mNodes[i].getChild();
+
2591  assert(child);
+
2592  if (child) {
+
2593  // Combine this node's constant value with the other node's child,
+
2594  // but use a new functor in which the A and B values are swapped,
+
2595  // since the constant value is the A value, not the B value.
+ +
2597  child->combine(mNodes[i].getValue(), isValueMaskOn(i), swappedOp);
+
2598 
+
2599  // Steal the other node's child.
+
2600  other.mChildMask.setOff(i);
+
2601  other.mNodes[i].setValue(zero);
+
2602  this->setChildNode(i, child);
+
2603  }
+
2604 
+
2605  } else /*if (isChildMaskOn(i) && other.isChildMaskOn(i))*/ {
+
2606  // Combine this node's child with the other node's child.
+
2607  ChildNodeType
+
2608  *child = mNodes[i].getChild(),
+
2609  *otherChild = other.mNodes[i].getChild();
+
2610  assert(child);
+
2611  assert(otherChild);
+
2612  if (child && otherChild) {
+
2613  child->combine(*otherChild, op);
+
2614  }
+
2615  }
+
2616  }
+
2617 }
+
2618 
+
2619 
+
2620 template<typename ChildT, Index Log2Dim>
+
2621 template<typename CombineOp>
+
2622 inline void
+
2623 InternalNode<ChildT, Log2Dim>::combine(const ValueType& value, bool valueIsActive, CombineOp& op)
+
2624 {
+ +
2626 
+
2627  for (Index i = 0; i < NUM_VALUES; ++i) {
+
2628  if (this->isChildMaskOff(i)) {
+
2629  // Combine this node's constant value with the given constant value.
+
2630  op(args.setARef(mNodes[i].getValue())
+
2631  .setAIsActive(isValueMaskOn(i))
+
2632  .setBRef(value)
+
2633  .setBIsActive(valueIsActive));
+
2634  mNodes[i].setValue(args.result());
+
2635  mValueMask.set(i, args.resultIsActive());
+
2636  } else /*if (isChildMaskOn(i))*/ {
+
2637  // Combine this node's child with the given constant value.
+
2638  ChildNodeType* child = mNodes[i].getChild();
+
2639  assert(child);
+
2640  if (child) child->combine(value, valueIsActive, op);
+
2641  }
+
2642  }
+
2643 }
+
2644 
+
2645 
+
2647 
+
2648 
+
2649 template<typename ChildT, Index Log2Dim>
+
2650 template<typename CombineOp, typename OtherNodeType>
+
2651 inline void
+
2652 InternalNode<ChildT, Log2Dim>::combine2(const InternalNode& other0, const OtherNodeType& other1,
+
2653  CombineOp& op)
+
2654 {
+ +
2656 
+
2657  for (Index i = 0; i < NUM_VALUES; ++i) {
+
2658  if (other0.isChildMaskOff(i) && other1.isChildMaskOff(i)) {
+
2659  op(args.setARef(other0.mNodes[i].getValue())
+
2660  .setAIsActive(other0.isValueMaskOn(i))
+
2661  .setBRef(other1.mNodes[i].getValue())
+
2662  .setBIsActive(other1.isValueMaskOn(i)));
+
2663  // Replace child i with a constant value.
+
2664  this->makeChildNodeEmpty(i, args.result());
+
2665  mValueMask.set(i, args.resultIsActive());
+
2666  } else {
+
2667  if (this->isChildMaskOff(i)) {
+
2668  // Add a new child with the same coordinates, etc. as the other node's child.
+
2669  const Coord& childOrigin = other0.isChildMaskOn(i)
+
2670  ? other0.mNodes[i].getChild()->origin()
+
2671  : other1.mNodes[i].getChild()->origin();
+
2672  this->setChildNode(i, new ChildNodeType(childOrigin, mNodes[i].getValue()));
+
2673  }
+
2674 
+
2675  if (other0.isChildMaskOff(i)) {
+
2676  // Combine node1's child with node0's constant value
+
2677  // and write the result into child i.
+
2678  mNodes[i].getChild()->combine2(other0.mNodes[i].getValue(),
+
2679  *other1.mNodes[i].getChild(), other0.isValueMaskOn(i), op);
+
2680  } else if (other1.isChildMaskOff(i)) {
+
2681  // Combine node0's child with node1's constant value
+
2682  // and write the result into child i.
+
2683  mNodes[i].getChild()->combine2(*other0.mNodes[i].getChild(),
+
2684  other1.mNodes[i].getValue(), other1.isValueMaskOn(i), op);
+
2685  } else {
+
2686  // Combine node0's child with node1's child
+
2687  // and write the result into child i.
+
2688  mNodes[i].getChild()->combine2(*other0.mNodes[i].getChild(),
+
2689  *other1.mNodes[i].getChild(), op);
+
2690  }
+
2691  }
+
2692  }
+
2693 }
+
2694 
+
2695 
+
2696 template<typename ChildT, Index Log2Dim>
+
2697 template<typename CombineOp, typename OtherNodeType>
+
2698 inline void
+
2699 InternalNode<ChildT, Log2Dim>::combine2(const ValueType& value, const OtherNodeType& other,
+
2700  bool valueIsActive, CombineOp& op)
+
2701 {
+ +
2703 
+
2704  for (Index i = 0; i < NUM_VALUES; ++i) {
+
2705  if (other.isChildMaskOff(i)) {
+
2706  op(args.setARef(value)
+
2707  .setAIsActive(valueIsActive)
+
2708  .setBRef(other.mNodes[i].getValue())
+
2709  .setBIsActive(other.isValueMaskOn(i)));
+
2710  // Replace child i with a constant value.
+
2711  this->makeChildNodeEmpty(i, args.result());
+
2712  mValueMask.set(i, args.resultIsActive());
+
2713  } else {
+
2714  typename OtherNodeType::ChildNodeType* otherChild = other.mNodes[i].getChild();
+
2715  assert(otherChild);
+
2716  if (this->isChildMaskOff(i)) {
+
2717  // Add a new child with the same coordinates, etc.
+
2718  // as the other node's child.
+
2719  this->setChildNode(i, new ChildNodeType(*otherChild));
+
2720  }
+
2721  // Combine the other node's child with a constant value
+
2722  // and write the result into child i.
+
2723  mNodes[i].getChild()->combine2(value, *otherChild, valueIsActive, op);
+
2724  }
+
2725  }
+
2726 }
+
2727 
+
2728 
+
2729 template<typename ChildT, Index Log2Dim>
+
2730 template<typename CombineOp, typename OtherValueType>
+
2731 inline void
+
2732 InternalNode<ChildT, Log2Dim>::combine2(const InternalNode& other, const OtherValueType& value,
+
2733  bool valueIsActive, CombineOp& op)
+
2734 {
+ +
2736 
+
2737  for (Index i = 0; i < NUM_VALUES; ++i) {
+
2738  if (other.isChildMaskOff(i)) {
+
2739  op(args.setARef(other.mNodes[i].getValue())
+
2740  .setAIsActive(other.isValueMaskOn(i))
+
2741  .setBRef(value)
+
2742  .setBIsActive(valueIsActive));
+
2743  // Replace child i with a constant value.
+
2744  this->makeChildNodeEmpty(i, args.result());
+
2745  mValueMask.set(i, args.resultIsActive());
+
2746  } else {
+
2747  ChildNodeType* otherChild = other.mNodes[i].getChild();
+
2748  assert(otherChild);
+
2749  if (this->isChildMaskOff(i)) {
+
2750  // Add a new child with the same coordinates, etc. as the other node's child.
+
2751  this->setChildNode(i,
+
2752  new ChildNodeType(otherChild->origin(), mNodes[i].getValue()));
+
2753  }
+
2754  // Combine the other node's child with a constant value
+
2755  // and write the result into child i.
+
2756  mNodes[i].getChild()->combine2(*otherChild, value, valueIsActive, op);
+
2757  }
+
2758  }
+
2759 }
+
2760 
+
2761 
+
2763 
+
2764 
+
2765 template<typename ChildT, Index Log2Dim>
+
2766 template<typename BBoxOp>
+
2767 inline void
+ +
2769 {
+
2770  for (ValueOnCIter i = this->cbeginValueOn(); i; ++i) {
+
2771 #ifdef _MSC_VER
+
2772  op.operator()<LEVEL>(CoordBBox::createCube(i.getCoord(), ChildNodeType::DIM));
+
2773 #else
+
2774  op.template operator()<LEVEL>(CoordBBox::createCube(i.getCoord(), ChildNodeType::DIM));
+
2775 #endif
+
2776  }
+
2777  if (op.template descent<LEVEL>()) {
+
2778  for (ChildOnCIter i = this->cbeginChildOn(); i; ++i) i->visitActiveBBox(op);
+
2779  } else {
+
2780  for (ChildOnCIter i = this->cbeginChildOn(); i; ++i) {
+
2781 #ifdef _MSC_VER
+
2782  op.operator()<LEVEL>(i->getNodeBoundingBox());
+
2783 #else
+
2784  op.template operator()<LEVEL>(i->getNodeBoundingBox());
+
2785 #endif
+
2786  }
+
2787  }
+
2788 }
+
2789 
+
2790 
+
2791 template<typename ChildT, Index Log2Dim>
+
2792 template<typename VisitorOp>
+
2793 inline void
+ +
2795 {
+
2796  doVisit<InternalNode, VisitorOp, ChildAllIter>(*this, op);
+
2797 }
+
2798 
+
2799 
+
2800 template<typename ChildT, Index Log2Dim>
+
2801 template<typename VisitorOp>
+
2802 inline void
+ +
2804 {
+
2805  doVisit<const InternalNode, VisitorOp, ChildAllCIter>(*this, op);
+
2806 }
+
2807 
+
2808 
+
2809 template<typename ChildT, Index Log2Dim>
+
2810 template<typename NodeT, typename VisitorOp, typename ChildAllIterT>
+
2811 inline void
+
2812 InternalNode<ChildT, Log2Dim>::doVisit(NodeT& self, VisitorOp& op)
+
2813 {
+
2814  typename NodeT::ValueType val;
+
2815  for (ChildAllIterT iter = self.beginChildAll(); iter; ++iter) {
+
2816  if (op(iter)) continue;
+
2817  if (typename ChildAllIterT::ChildNodeType* child = iter.probeChild(val)) {
+
2818  child->visit(op);
+
2819  }
+
2820  }
+
2821 }
+
2822 
+
2823 
+
2825 
+
2826 
+
2827 template<typename ChildT, Index Log2Dim>
+
2828 template<typename OtherNodeType, typename VisitorOp>
+
2829 inline void
+
2830 InternalNode<ChildT, Log2Dim>::visit2Node(OtherNodeType& other, VisitorOp& op)
+
2831 {
+
2832  doVisit2Node<InternalNode, OtherNodeType, VisitorOp, ChildAllIter,
+
2833  typename OtherNodeType::ChildAllIter>(*this, other, op);
+
2834 }
+
2835 
+
2836 
+
2837 template<typename ChildT, Index Log2Dim>
+
2838 template<typename OtherNodeType, typename VisitorOp>
+
2839 inline void
+
2840 InternalNode<ChildT, Log2Dim>::visit2Node(OtherNodeType& other, VisitorOp& op) const
+
2841 {
+
2842  doVisit2Node<const InternalNode, OtherNodeType, VisitorOp, ChildAllCIter,
+
2843  typename OtherNodeType::ChildAllCIter>(*this, other, op);
+
2844 }
+
2845 
+
2846 
+
2847 template<typename ChildT, Index Log2Dim>
+
2848 template<
+
2849  typename NodeT,
+
2850  typename OtherNodeT,
+
2851  typename VisitorOp,
+
2852  typename ChildAllIterT,
+
2853  typename OtherChildAllIterT>
+
2854 inline void
+
2855 InternalNode<ChildT, Log2Dim>::doVisit2Node(NodeT& self, OtherNodeT& other, VisitorOp& op)
+
2856 {
+
2857  // Allow the two nodes to have different ValueTypes, but not different dimensions.
+
2858  BOOST_STATIC_ASSERT(OtherNodeT::NUM_VALUES == NodeT::NUM_VALUES);
+
2859  BOOST_STATIC_ASSERT(OtherNodeT::LEVEL == NodeT::LEVEL);
+
2860 
+
2861  typename NodeT::ValueType val;
+
2862  typename OtherNodeT::ValueType otherVal;
+
2863 
+
2864  ChildAllIterT iter = self.beginChildAll();
+
2865  OtherChildAllIterT otherIter = other.beginChildAll();
+
2866 
+
2867  for ( ; iter && otherIter; ++iter, ++otherIter)
+
2868  {
+
2869  const size_t skipBranch = static_cast<size_t>(op(iter, otherIter));
+
2870 
+
2871  typename ChildAllIterT::ChildNodeType* child =
+
2872  (skipBranch & 1U) ? NULL : iter.probeChild(val);
+
2873  typename OtherChildAllIterT::ChildNodeType* otherChild =
+
2874  (skipBranch & 2U) ? NULL : otherIter.probeChild(otherVal);
+
2875 
+
2876  if (child != NULL && otherChild != NULL) {
+
2877  child->visit2Node(*otherChild, op);
+
2878  } else if (child != NULL) {
+
2879  child->visit2(otherIter, op);
+
2880  } else if (otherChild != NULL) {
+
2881  otherChild->visit2(iter, op, /*otherIsLHS=*/true);
+
2882  }
+
2883  }
+
2884 }
+
2885 
+
2886 
+
2888 
+
2889 
+
2890 template<typename ChildT, Index Log2Dim>
+
2891 template<typename OtherChildAllIterType, typename VisitorOp>
+
2892 inline void
+
2893 InternalNode<ChildT, Log2Dim>::visit2(OtherChildAllIterType& otherIter,
+
2894  VisitorOp& op, bool otherIsLHS)
+
2895 {
+
2896  doVisit2<InternalNode, VisitorOp, ChildAllIter, OtherChildAllIterType>(
+
2897  *this, otherIter, op, otherIsLHS);
+
2898 }
+
2899 
+
2900 
+
2901 template<typename ChildT, Index Log2Dim>
+
2902 template<typename OtherChildAllIterType, typename VisitorOp>
+
2903 inline void
+
2904 InternalNode<ChildT, Log2Dim>::visit2(OtherChildAllIterType& otherIter,
+
2905  VisitorOp& op, bool otherIsLHS) const
+
2906 {
+
2907  doVisit2<const InternalNode, VisitorOp, ChildAllCIter, OtherChildAllIterType>(
+
2908  *this, otherIter, op, otherIsLHS);
+
2909 }
+
2910 
+
2911 
+
2912 template<typename ChildT, Index Log2Dim>
+
2913 template<typename NodeT, typename VisitorOp, typename ChildAllIterT, typename OtherChildAllIterT>
+
2914 inline void
+
2915 InternalNode<ChildT, Log2Dim>::doVisit2(NodeT& self, OtherChildAllIterT& otherIter,
+
2916  VisitorOp& op, bool otherIsLHS)
+
2917 {
+
2918  if (!otherIter) return;
+
2919 
+
2920  const size_t skipBitMask = (otherIsLHS ? 2U : 1U);
+
2921 
+
2922  typename NodeT::ValueType val;
+
2923  for (ChildAllIterT iter = self.beginChildAll(); iter; ++iter) {
+
2924  const size_t skipBranch = static_cast<size_t>(
+
2925  otherIsLHS ? op(otherIter, iter) : op(iter, otherIter));
+
2926 
+
2927  typename ChildAllIterT::ChildNodeType* child =
+
2928  (skipBranch & skipBitMask) ? NULL : iter.probeChild(val);
+
2929 
+
2930  if (child != NULL) child->visit2(otherIter, op, otherIsLHS);
+
2931  }
+
2932 }
+
2933 
+
2934 
+
2936 
+
2937 
+
2938 template<typename ChildT, Index Log2Dim>
+
2939 inline void
+
2940 InternalNode<ChildT, Log2Dim>::writeBuffers(std::ostream& os, bool toHalf) const
+
2941 {
+
2942  for (ChildOnCIter iter = this->cbeginChildOn(); iter; ++iter) {
+
2943  iter->writeBuffers(os, toHalf);
+
2944  }
+
2945 }
+
2946 
+
2947 
+
2948 template<typename ChildT, Index Log2Dim>
+
2949 inline void
+
2950 InternalNode<ChildT, Log2Dim>::readBuffers(std::istream& is, bool fromHalf)
+
2951 {
+
2952  for (ChildOnIter iter = this->beginChildOn(); iter; ++iter) {
+
2953  iter->readBuffers(is, fromHalf);
+
2954  }
+
2955 }
+
2956 
+
2957 
+
2958 template<typename ChildT, Index Log2Dim>
+
2959 inline void
+ +
2961  const CoordBBox& clipBBox, bool fromHalf)
+
2962 {
+
2963  for (ChildOnIter iter = this->beginChildOn(); iter; ++iter) {
+
2964  // Stream in the branch rooted at this child.
+
2965  // (We can't skip over children that lie outside the clipping region,
+
2966  // because buffers are serialized in depth-first order and need to be
+
2967  // unserialized in the same order.)
+
2968  iter->readBuffers(is, clipBBox, fromHalf);
+
2969  }
+
2970 
+
2971  // Get this tree's background value.
+
2972  ValueType background = zeroVal<ValueType>();
+
2973  if (const void* bgPtr = io::getGridBackgroundValuePtr(is)) {
+
2974  background = *static_cast<const ValueType*>(bgPtr);
+
2975  }
+
2976  this->clip(clipBBox, background);
+
2977 }
+
2978 
+
2979 
+
2981 
+
2982 
+
2983 template<typename ChildT, Index Log2Dim>
+
2984 void
+ +
2986 {
+
2987  dims.push_back(Log2Dim);
+
2988  ChildNodeType::getNodeLog2Dims(dims);
+
2989 }
+
2990 
+
2991 
+
2992 template<typename ChildT, Index Log2Dim>
+
2993 inline void
+ +
2995 {
+
2996  assert(n<(1<<3*Log2Dim));
+
2997  xyz.setX(n >> 2*Log2Dim);
+
2998  n &= ((1<<2*Log2Dim)-1);
+
2999  xyz.setY(n >> Log2Dim);
+
3000  xyz.setZ(n & ((1<<Log2Dim)-1));
+
3001 }
+
3002 
+
3003 
+
3004 template<typename ChildT, Index Log2Dim>
+
3005 inline Index
+ +
3007 {
+
3008  return (((xyz[0] & (DIM-1u)) >> ChildNodeType::TOTAL) << 2*Log2Dim)
+
3009  + (((xyz[1] & (DIM-1u)) >> ChildNodeType::TOTAL) << Log2Dim)
+
3010  + ((xyz[2] & (DIM-1u)) >> ChildNodeType::TOTAL);
+
3011 }
+
3012 
+
3013 
+
3014 template<typename ChildT, Index Log2Dim>
+
3015 inline Coord
+ +
3017 {
+
3018  Coord local;
+
3019  this->offsetToLocalCoord(n, local);
+
3020  local <<= ChildT::TOTAL;
+
3021  return local + this->origin();
+
3022 }
+
3023 
+
3025 
+
3026 template<typename ChildT, Index Log2Dim>
+
3027 template<typename ArrayT>
+
3028 inline void
+ +
3030 {
+
3031  typedef typename ArrayT::value_type T;
+
3032  BOOST_STATIC_ASSERT(boost::is_pointer<T>::value);
+
3033  typedef typename boost::mpl::if_<boost::is_const<typename boost::remove_pointer<T>::type>,
+
3034  const ChildT, ChildT>::type ArrayChildT;
+
3035  for (ChildOnIter iter = this->beginChildOn(); iter; ++iter) {
+ +
3037  if (boost::is_same<T, ArrayChildT*>::value) {
+
3038  array.push_back(reinterpret_cast<T>(mNodes[iter.pos()].getChild()));
+
3039  } else {
+
3040  iter->getNodes(array);//descent
+
3041  }
+ +
3043  }
+
3044 }
+
3045 
+
3046 template<typename ChildT, Index Log2Dim>
+
3047 template<typename ArrayT>
+
3048 inline void
+ +
3050 {
+
3051  typedef typename ArrayT::value_type T;
+
3052  BOOST_STATIC_ASSERT(boost::is_pointer<T>::value);
+
3053  BOOST_STATIC_ASSERT(boost::is_const<typename boost::remove_pointer<T>::type>::value);
+
3054  for (ChildOnCIter iter = this->cbeginChildOn(); iter; ++iter) {
+ +
3056  if (boost::is_same<T, const ChildT*>::value) {
+
3057  array.push_back(reinterpret_cast<T>(mNodes[iter.pos()].getChild()));
+
3058  } else {
+
3059  iter->getNodes(array);//descent
+
3060  }
+ +
3062  }
+
3063 }
+
3064 
+
3066 
+
3067 template<typename ChildT, Index Log2Dim>
+
3068 template<typename ArrayT>
+
3069 inline void
+
3070 InternalNode<ChildT, Log2Dim>::stealNodes(ArrayT& array, const ValueType& value, bool state)
+
3071 {
+
3072  typedef typename ArrayT::value_type T;
+
3073  BOOST_STATIC_ASSERT(boost::is_pointer<T>::value);
+
3074  typedef typename boost::mpl::if_<boost::is_const<typename boost::remove_pointer<T>::type>,
+
3075  const ChildT, ChildT>::type ArrayChildT;
+ +
3077  for (ChildOnIter iter = this->beginChildOn(); iter; ++iter) {
+
3078  const Index n = iter.pos();
+
3079  if (boost::is_same<T, ArrayChildT*>::value) {
+
3080  array.push_back(reinterpret_cast<T>(mNodes[n].getChild()));
+
3081  mValueMask.set(n, state);
+
3082  mNodes[n].setValue(value);
+
3083  } else {
+
3084  iter->stealNodes(array, value, state);//descent
+
3085  }
+
3086  }
+
3087  if (boost::is_same<T, ArrayChildT*>::value) mChildMask.setOff();
+ +
3089 }
+
3090 
+
3092 
+
3093 
+
3094 template<typename ChildT, Index Log2Dim>
+
3095 inline void
+
3096 InternalNode<ChildT, Log2Dim>::resetBackground(const ValueType& oldBackground,
+
3097  const ValueType& newBackground)
+
3098 {
+
3099  if (math::isExactlyEqual(oldBackground, newBackground)) return;
+
3100  for (Index i = 0; i < NUM_VALUES; ++i) {
+
3101  if (this->isChildMaskOn(i)) {
+
3102  mNodes[i].getChild()->resetBackground(oldBackground, newBackground);
+
3103  } else if (this->isValueMaskOff(i)) {
+
3104  if (math::isApproxEqual(mNodes[i].getValue(), oldBackground)) {
+
3105  mNodes[i].setValue(newBackground);
+
3106  } else if (math::isApproxEqual(mNodes[i].getValue(), math::negative(oldBackground))) {
+
3107  mNodes[i].setValue(math::negative(newBackground));
+
3108  }
+
3109  }
+
3110  }
+
3111 }
+
3112 
+
3113 template<typename ChildT, Index Log2Dim>
+
3114 template<typename OtherChildNodeType, Index OtherLog2Dim>
+
3115 inline bool
+ + +
3118 {
+
3119  if (Log2Dim != OtherLog2Dim || mChildMask != other->mChildMask ||
+
3120  mValueMask != other->mValueMask) return false;
+
3121  for (ChildOnCIter iter = this->cbeginChildOn(); iter; ++iter) {
+
3122  if (!iter->hasSameTopology(other->mNodes[iter.pos()].getChild())) return false;
+
3123  }
+
3124  return true;
+
3125 }
+
3126 
+
3127 
+
3128 template<typename ChildT, Index Log2Dim>
+
3129 inline void
+ +
3131 {
+
3132  assert(child);
+
3133  if (this->isChildMaskOn(i)) {
+
3134  delete mNodes[i].getChild();
+
3135  } else {
+
3136  mChildMask.setOn(i);
+
3137  mValueMask.setOff(i);
+
3138  }
+
3139  mNodes[i].setChild(child);
+
3140 }
+
3141 
+
3142 template<typename ChildT, Index Log2Dim>
+
3143 inline void
+ +
3145 {
+
3146  assert(child);
+
3147  assert(mChildMask.isOff(i));
+
3148  mChildMask.setOn(i);
+
3149  mValueMask.setOff(i);
+
3150  mNodes[i].setChild(child);
+
3151 }
+
3152 
+
3153 
+
3154 template<typename ChildT, Index Log2Dim>
+
3155 inline ChildT*
+ +
3157 {
+
3158  if (this->isChildMaskOff(i)) {
+
3159  mNodes[i].setValue(value);
+
3160  return NULL;
+
3161  }
+
3162  ChildNodeType* child = mNodes[i].getChild();
+
3163  mChildMask.setOff(i);
+
3164  mNodes[i].setValue(value);
+
3165  return child;
+
3166 }
+
3167 
+
3168 
+
3169 template<typename ChildT, Index Log2Dim>
+
3170 inline void
+ +
3172 {
+
3173  delete this->unsetChildNode(n, value);
+
3174 }
+
3175 
+
3176 template<typename ChildT, Index Log2Dim>
+
3177 inline ChildT*
+ +
3179 {
+
3180  assert(this->isChildMaskOn(n));
+
3181  return mNodes[n].getChild();
+
3182 }
+
3183 
+
3184 
+
3185 template<typename ChildT, Index Log2Dim>
+
3186 inline const ChildT*
+ +
3188 {
+
3189  assert(this->isChildMaskOn(n));
+
3190  return mNodes[n].getChild();
+
3191 }
+
3192 
+
3193 } // namespace tree
+
3194 } // namespace OPENVDB_VERSION_NAME
+
3195 } // namespace openvdb
+
3196 
+
3197 #endif // OPENVDB_TREE_INTERNALNODE_HAS_BEEN_INCLUDED
+
3198 
+
3199 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
3200 // All rights reserved. This software is distributed under the
+
3201 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
ChildT & getItem(Index pos) const
Definition: InternalNode.h:160
+
InternalNode< typename ChildNodeType::template ValueConverter< OtherValueType >::Type, Log2Dim > Type
Definition: InternalNode.h:90
+
ChildIter< const InternalNode, const ChildNodeType, MaskOnIterator, ChildOn > ChildOnCIter
Definition: InternalNode.h:231
+
ValueOffCIter cbeginValueOff() const
Definition: InternalNode.h:256
+ +
void setOrigin(const Coord &origin)
Set the grid index coordinates of this node's local origin.
Definition: InternalNode.h:284
+
void getNodes(ArrayT &array)
Adds all nodes of a certain type to a container with the following API:
Definition: InternalNode.h:3029
+
void copyToDense(const CoordBBox &bbox, DenseT &dense) const
Copy into a dense grid the values of the voxels that lie within a given bounding box.
Definition: InternalNode.h:2051
+
const OtherInternalNode * s
Definition: InternalNode.h:2438
+ +
void visit(VisitorOp &)
Definition: InternalNode.h:2794
+ +
const OtherInternalNode * s
Definition: InternalNode.h:2545
+
bool isExactlyEqual(const T0 &a, const T1 &b)
Return true if a is exactly equal to b.
Definition: Math.h:407
+
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
InternalNode * t
Definition: InternalNode.h:931
+
ValueIter< InternalNode, const ValueType, MaskOffIterator, ValueOff > ValueOffIter
Definition: InternalNode.h:239
+
Vec2< T > minComponent(const Vec2< T > &v1, const Vec2< T > &v2)
Return component-wise minimum of the two vectors.
Definition: Vec2.h:519
+
void copyToDense(const GridOrTreeT &sparse, DenseT &dense, bool serial=false)
Populate a dense grid with the values of voxels from a sparse grid, where the sparse grid intersects ...
Definition: Dense.h:443
+
ValueOnCIter cbeginValueOn() const
Definition: InternalNode.h:254
+
Definition: Types.h:442
+
bool isConstant(ValueType &constValue, bool &state, const ValueType &tolerance=zeroVal< ValueType >()) const
Definition: InternalNode.h:1460
+
const ValueType & getValueAndCache(const Coord &xyz, AccessorT &) const
+
bool hasSameTopology(const InternalNode< OtherChildNodeType, OtherLog2Dim > *other) const
Return true if the given tree branch has the same node and active value topology as this tree branch ...
Definition: InternalNode.h:3116
+
InternalNode * t
Definition: InternalNode.h:2546
+ +
void writeTopology(std::ostream &, bool toHalf=false) const
Definition: InternalNode.h:2094
+
TopologyDifference(const OtherInternalNode *source, InternalNode *target, const ValueType &background)
Definition: InternalNode.h:2511
+
void resetChildNode(Index i, ChildNodeType *child)
Definition: InternalNode.h:3130
+
ChildIter(const MaskIterT &iter, NodeT *parent)
Definition: InternalNode.h:157
+
void fill(const CoordBBox &bbox, const ValueType &, bool active=true)
Set all voxels within an axis-aligned box to a constant value. (The min and max coordinates are inclu...
Definition: InternalNode.h:1997
+ +
VoxelizeActiveTiles(InternalNode &node)
Definition: InternalNode.h:2224
+
static void doVisit2(NodeT &, OtherChildAllIterT &, VisitorOp &, bool otherIsLHS)
Definition: InternalNode.h:2915
+
bool isValueOn(Index offset) const
Return true if the voxel at the given offset is active.
Definition: InternalNode.h:340
+
ChildOnCIter cbeginChildOn() const
Definition: InternalNode.h:244
+
Definition: InternalNode.h:147
+
ChildNodeType * unsetChildNode(Index i, const ValueType &value)
Definition: InternalNode.h:3156
+ +
void prune(const ValueType &tolerance=zeroVal< ValueType >())
Reduce the memory footprint of this tree by replacing with tiles any nodes whose values are all the s...
Definition: InternalNode.h:1115
+
static Index getLevel()
Definition: InternalNode.h:269
+
CombineArgs & setARef(const AValueType &a)
Redirect the A value to a new external source.
Definition: Types.h:365
+
void addLeaf(LeafNodeType *leaf)
Add the specified leaf to this node, possibly creating a child branch in the process. If the leaf node already exists, replace it.
Definition: InternalNode.h:1287
+ +
ValueOnCIter beginValueOn() const
Definition: InternalNode.h:258
+
NodeMaskType mChildMask
Definition: InternalNode.h:806
+
static Index dim()
Definition: InternalNode.h:268
+
Coord offsetToGlobalCoord(Index n) const
Return the global coordinates for a linear table offset.
Definition: InternalNode.h:3016
+
bool isValueMaskOn() const
Definition: InternalNode.h:747
+
bool isChildMaskOff() const
Definition: InternalNode.h:752
+
const ValueType & b
Definition: InternalNode.h:2547
+
static void getNodeLog2Dims(std::vector< Index > &dims)
Definition: InternalNode.h:2985
+
ChildNodeType::ValueType ValueType
Definition: InternalNode.h:71
+
bool probeValue(const Coord &xyz, ValueType &value) const
Definition: InternalNode.h:1590
+
void modifyValueAndActiveStateAndCache(const Coord &xyz, const ModifyOp &op, AccessorT &)
Definition: InternalNode.h:1916
+
bool isChildMaskOff(Index n) const
Definition: InternalNode.h:751
+
Definition: Types.h:403
+
const OtherInternalNode * s
Definition: InternalNode.h:966
+
InternalNode * t
Definition: InternalNode.h:885
+
Index64 onTileCount() const
Definition: InternalNode.h:1073
+
Index32 nonLeafCount() const
Definition: InternalNode.h:1013
+
void merge(InternalNode &other, const ValueType &background, const ValueType &otherBackground)
Efficiently merge another tree into this tree using one of several schemes.
Definition: InternalNode.h:2269
+
ChildAllIter beginChildAll()
Definition: InternalNode.h:252
+
const ValueType & getLastValue() const
If the last entry in this node's table is a tile, return the tile's value. Otherwise, return the result of calling getLastValue() on the child.
Definition: InternalNode.h:2195
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & max(const T &a, const T &b)
Definition: Composite.h:132
+
TopologyCopy1(const OtherInternalNode *source, InternalNode *target, const ValueType &background)
Definition: InternalNode.h:915
+
ValueIter()
Definition: InternalNode.h:176
+
ValueIter< InternalNode, const ValueType, MaskOnIterator, ValueOn > ValueOnIter
Definition: InternalNode.h:237
+
SameConfiguration::value is true if and only if OtherNodeType is the type of an Intern...
Definition: InternalNode.h:97
+
DenseIter()
Definition: InternalNode.h:200
+
bool isValueMaskOn(Index n) const
Definition: InternalNode.h:746
+
const UnionType * getTable() const
Definition: InternalNode.h:762
+
OPENVDB_API const void * getGridBackgroundValuePtr(std::ios_base &)
Return a pointer to the background value of the grid currently being read from or written to the give...
+
void modifyValueAndActiveState(const Coord &xyz, const ModifyOp &op)
Apply a functor to the voxel at the given coordinates.
Definition: InternalNode.h:1893
+
void operator()(const tbb::blocked_range< Index > &r) const
Definition: InternalNode.h:2422
+
Index64 onVoxelCount() const
Definition: InternalNode.h:1026
+
DenseIter< InternalNode, ChildNodeType, ValueType, ChildAll > ChildAllIter
Definition: InternalNode.h:234
+
ValueAllCIter cbeginValueAll() const
Definition: InternalNode.h:257
+
Definition: InternalNode.h:146
+
Index getValueLevelAndCache(const Coord &xyz, AccessorT &) const
Return the level of the tree (0 = leaf) at which the value at the given coordinates resides...
Definition: InternalNode.h:1577
+
void topologyIntersection(const InternalNode< OtherChildNodeType, Log2Dim > &other, const ValueType &background)
Intersects this tree's set of active values with the active values of the other tree, whose ValueType may be different.
+ +
bool isApproxEqual(const Type &a, const Type &b)
Return true if a is equal to b to within the default floating-point comparison tolerance.
Definition: Math.h:370
+
void visit2(IterT &otherIter, VisitorOp &, bool otherIsLHS=false)
+
Index32 Index
Definition: Types.h:58
+
void toggle(Index32 n)
Toggle the state of the nth bit.
Definition: NodeMasks.h:480
+
TopologyUnion(const OtherInternalNode *source, InternalNode *target)
Definition: InternalNode.h:2412
+
NodeT * stealNode(const Coord &xyz, const ValueType &value, bool state)
Return a pointer to the node of type NodeT that contains voxel (x, y, z) and replace it with a tile o...
Definition: InternalNode.h:1139
+
ChildOnIter beginChildOn()
Definition: InternalNode.h:250
+
void operator()(const tbb::blocked_range< Index > &r) const
Definition: InternalNode.h:956
+
NodeMaskType::OffIterator MaskOffIterator
Definition: InternalNode.h:142
+
NodeMaskType::OnIterator MaskOnIterator
Definition: InternalNode.h:141
+
int32_t Int32
Definition: Types.h:60
+
void operator()(const tbb::blocked_range< Index > &r) const
Definition: InternalNode.h:2470
+
void readBuffers(std::istream &, bool fromHalf=false)
Definition: InternalNode.h:2950
+
uint64_t Index64
Definition: Types.h:57
+
InternalNode * mNode
Definition: InternalNode.h:2244
+
ChildOffCIter beginChildOff() const
Definition: InternalNode.h:248
+
NodeUnion< ValueType, ChildNodeType > UnionType
Definition: InternalNode.h:73
+
void operator()(const tbb::blocked_range< Index > &r) const
Definition: InternalNode.h:2231
+ +
NodeMaskType::Word W
Definition: InternalNode.h:2504
+
const ValueType & b
Definition: InternalNode.h:2488
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
void setItem(Index pos, const ValueT &v) const
Definition: InternalNode.h:183
+
void operator()(W &tV, const W &sC, const W &sV, const W &tC) const
Definition: InternalNode.h:2508
+
static Index coordToOffset(const Coord &xyz)
Return the linear table offset of the given global or local coordinates.
Definition: InternalNode.h:3006
+
OPENVDB_STATIC_SPECIALIZATION GridType::Ptr clip(const GridType &grid, const BBoxd &)
Clip the given grid against a world-space bounding box and return a new grid containing the result...
Definition: Clip.h:356
+
void addLeafAndCache(LeafNodeType *leaf, AccessorT &)
Same as addLeaf() except, if necessary, update the accessor with pointers to the nodes along the path...
Definition: InternalNode.h:1316
+
const LeafNodeType * probeConstLeafAndCache(const Coord &xyz, AccessorT &acc) const
Same as probeLeaf() except, if necessary, update the accessor with pointers to the nodes along the pa...
+
const AValueType & result() const
Get the output value.
Definition: Types.h:357
+
bool isChildMaskOn(Index n) const
Definition: InternalNode.h:750
+
void readCompressedValues(std::istream &is, ValueT *destBuf, Index destCount, const MaskT &valueMask, bool fromHalf)
Definition: Compression.h:329
+
const NodeMaskType & getChildMask() const
Definition: InternalNode.h:754
+
const ValueT & getItem(Index pos) const
Definition: InternalNode.h:180
+
Definition: InternalNode.h:66
+
const ValueType & getValue(const Coord &xyz) const
Definition: InternalNode.h:1545
+
static void doVisit(NodeT &, VisitorOp &)
Definition: InternalNode.h:2812
+
void operator()(const tbb::blocked_range< Index > &r) const
Definition: InternalNode.h:2525
+
void topologyUnion(const InternalNode< OtherChildNodeType, Log2Dim > &other)
Union this branch's set of active values with the other branch's active values. The value type of the...
+
NodeType * probeNodeAndCache(const Coord &xyz, AccessorT &)
Same as probeNode() except, if necessary, update the accessor with pointers to the nodes along the pa...
+ +
void resetBackground(const ValueType &oldBackground, const ValueType &newBackground)
Change inactive tiles or voxels with value oldBackground to newBackground or -oldBackground to -newBa...
Definition: InternalNode.h:3096
+
LeafNodeType * probeLeaf(const Coord &xyz)
Return a pointer to the leaf node that contains voxel (x, y, z). If no such node exists, return NULL.
Definition: InternalNode.h:1241
+
bool isValueOn(const Coord &xyz) const
Return true if the voxel at the given coordinates is active.
Definition: InternalNode.h:1524
+
_ChildNodeType ChildNodeType
Definition: InternalNode.h:69
+
bool isInactive() const
Return true if this node has no children and only contains inactive values.
Definition: InternalNode.h:335
+ + +
void setActiveStateAndCache(const Coord &xyz, bool on, AccessorT &)
Definition: InternalNode.h:1796
+
TopologyCopy2(const OtherInternalNode *source, InternalNode *target, const ValueType &offValue, const ValueType &onValue)
Definition: InternalNode.h:951
+
ChildOnCIter beginChildOn() const
Definition: InternalNode.h:247
+
CoordBBox getNodeBoundingBox() const
Return the bounding box of this node, i.e., the full index space spanned by the node regardless of it...
Definition: InternalNode.h:305
+
void modifyValue(const Coord &xyz, const ModifyOp &op)
Apply a functor to the value of the voxel at the given coordinates and mark the voxel as active...
Definition: InternalNode.h:1831
+
ValueIter< const InternalNode, const ValueType, MaskOffIterator, ChildOff > ChildOffCIter
Definition: InternalNode.h:233
+
InternalNode * t
Definition: InternalNode.h:2487
+
InternalNode * t
Definition: InternalNode.h:967
+
OPENVDB_API uint32_t getFormatVersion(std::ios_base &)
Return the file format version number associated with the given input stream.
+
void visitActiveBBox(BBoxOp &) const
Calls the templated functor BBoxOp with bounding box information for all active tiles and leaf nodes ...
Definition: InternalNode.h:2768
+
Index64 offVoxelCount() const
Definition: InternalNode.h:1038
+
static const Index NUM_VALUES
Definition: InternalNode.h:80
+
static void offsetToLocalCoord(Index n, Coord &xyz)
Return the local coordinates for a linear table offset, where offset 0 has coordinates (0...
Definition: InternalNode.h:2994
+
void topologyDifference(const InternalNode< OtherChildNodeType, Log2Dim > &other, const ValueType &background)
Difference this node's set of active values with the active values of the other node, whose ValueType may be different. So a resulting voxel will be active only if the original voxel is active in this node and inactive in the other node.
+
Bit mask for the internal and leaf nodes of VDB. This is a 64-bit implementation. ...
Definition: NodeMasks.h:304
+
void setValueOn(const Coord &xyz)
Mark the voxel at the given coordinates as active but don't change its value.
Definition: InternalNode.h:1634
+
void writeCompressedValues(std::ostream &os, ValueT *srcBuf, Index srcCount, const MaskT &valueMask, const MaskT &childMask, bool toHalf)
Definition: Compression.h:431
+
NodeMaskType::Word W
Definition: InternalNode.h:2408
+
ValueOffCIter beginValueOff() const
Definition: InternalNode.h:260
+
void operator()(W &tC, const W &sC, const W &sV, const W &tV) const
Definition: InternalNode.h:2455
+
const Coord & origin() const
Return the grid index coordinates of this node's local origin.
Definition: InternalNode.h:282
+
Definition: Exceptions.h:39
+
void evalActiveBoundingBox(CoordBBox &bbox, bool visitVoxels=true) const
Expand the specified bounding box so that it includes the active tiles of this internal node as well ...
Definition: InternalNode.h:1097
+
UnionType mNodes[NUM_VALUES]
Definition: InternalNode.h:802
+
void setValueAndCache(const Coord &xyz, const ValueType &value, AccessorT &)
Definition: InternalNode.h:1715
+
uint32_t Index32
Definition: Types.h:56
+
#define OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN
Definition: Platform.h:129
+
NodeMaskType mValueMask
Definition: InternalNode.h:806
+
ValueConverter::Type is the type of an InternalNode having the same child hierarchy and dimensions...
Definition: InternalNode.h:88
+
const OtherInternalNode * s
Definition: InternalNode.h:884
+
void setChildNode(Index i, ChildNodeType *child)
Definition: InternalNode.h:3144
+
void setItem(Index pos, const ChildT &c) const
Definition: InternalNode.h:167
+
Index64 Word
Definition: NodeMasks.h:313
+
bool probeValueAndCache(const Coord &xyz, ValueType &value, AccessorT &) const
Definition: InternalNode.h:1603
+
ValueIter< InternalNode, const ValueType, MaskOffIterator, ValueAll > ValueAllIter
Definition: InternalNode.h:241
+
Index32 leafCount() const
Definition: InternalNode.h:1000
+
NodeMaskType::DenseIterator MaskDenseIterator
Definition: InternalNode.h:143
+
void visit2Node(OtherNodeType &other, VisitorOp &)
Definition: InternalNode.h:2830
+
void unsetItem(Index pos, const ValueT &value) const
Definition: InternalNode.h:222
+
Base class for dense iterators over internal and leaf nodes.
Definition: Iterator.h:211
+
Definition: InternalNode.h:62
+
Base class for sparse iterators over internal and leaf nodes.
Definition: Iterator.h:148
+
void setValuesOn()
Mark all values (both tiles and voxels) as active.
Definition: InternalNode.h:1819
+
const NodeType * probeConstNodeAndCache(const Coord &xyz, AccessorT &) const
Same as probeNode() except, if necessary, update the accessor with pointers to the nodes along the pa...
+
DenseIteratorBase< MaskDenseIterator, DenseIter, NodeT, ChildT, ValueT > BaseT
Definition: InternalNode.h:197
+
boost::remove_const< UnsetItemT >::type NonConstValueType
Definition: Iterator.h:217
+
void setActiveState(const Coord &xyz, bool on)
Set the active state of the voxel at the given coordinates but don't change its value.
Definition: InternalNode.h:1777
+
ValueOffIter beginValueOff()
Definition: InternalNode.h:264
+
ChildNodeType * getChildNode(Index n)
Returns a pointer to the child node at the linear offset n.
Definition: InternalNode.h:3178
+
Definition: NodeMasks.h:267
+
Definition: InternalNode.h:797
+ +
Coord mOrigin
Global grid index coordinates (x,y,z) of the local origin of this node.
Definition: InternalNode.h:808
+
ChildIter()
Definition: InternalNode.h:156
+ + +
const NodeType * probeConstNode(const Coord &xyz) const
Return a pointer to the node that contains voxel (x, y, z). If no such node exists, return NULL.
+
void clip(const CoordBBox &, const ValueType &background)
Set all voxels that lie outside the given axis-aligned box to the background.
Definition: InternalNode.h:1947
+
void setOn(Index32 n)
Set the nth bit on.
Definition: NodeMasks.h:449
+
const OtherInternalNode * s
Definition: InternalNode.h:930
+
void stealNodes(ArrayT &array, const ValueType &value, bool state)
Steals all nodes of a certain type from the tree and adds them to a container with the following API:...
Definition: InternalNode.h:3070
+
ChildOffIter beginChildOff()
Definition: InternalNode.h:251
+ +
static void doVisit2Node(NodeT &, OtherNodeT &, VisitorOp &)
Definition: InternalNode.h:2855
+
bool isValueMaskOff() const
Definition: InternalNode.h:749
+
ChildNodeType::LeafNodeType LeafNodeType
Definition: InternalNode.h:70
+
Index64 offLeafVoxelCount() const
Definition: InternalNode.h:1062
+
Index64 onLeafVoxelCount() const
Definition: InternalNode.h:1050
+
ValueIter< const InternalNode, const ValueType, MaskOnIterator, ValueOn > ValueOnCIter
Definition: InternalNode.h:238
+
void setValueOnlyAndCache(const Coord &xyz, const ValueType &value, AccessorT &)
Definition: InternalNode.h:1756
+
InternalNode()
Definition: InternalNode.h:103
+
static Index getChildDim()
Definition: InternalNode.h:271
+
void negate()
Definition: InternalNode.h:2207
+
#define OPENVDB_NO_UNREACHABLE_CODE_WARNING_END
Definition: Platform.h:130
+
const ValueType & getFirstValue() const
If the first entry in this node's table is a tile, return the tile's value. Otherwise, return the result of calling getFirstValue() on the child.
Definition: InternalNode.h:2187
+
void setValueOffAndCache(const Coord &xyz, const ValueType &value, AccessorT &)
Definition: InternalNode.h:1670
+
bool getItem(Index pos, ChildT *&child, NonConstValueT &value) const
Definition: InternalNode.h:204
+
NodeMaskType getValueOffMask() const
Definition: InternalNode.h:755
+
util::NodeMask< Log2Dim > NodeMaskType
Definition: InternalNode.h:74
+
ChildIter< InternalNode, ChildNodeType, MaskOnIterator, ChildOn > ChildOnIter
Definition: InternalNode.h:230
+
ValueOnIter beginValueOn()
Definition: InternalNode.h:262
+
const OtherInternalNode * s
Definition: InternalNode.h:2486
+ +
void setItem(Index pos, ChildT *child) const
Definition: InternalNode.h:216
+ +
void modifyValueAndCache(const Coord &xyz, const ModifyOp &op, AccessorT &)
Apply a functor to the value of the voxel at the given coordinates and mark the voxel as active...
Definition: InternalNode.h:1859
+
void combine(InternalNode &other, CombineOp &)
Definition: InternalNode.h:2565
+ +
void addTileAndCache(Index level, const Coord &xyz, const ValueType &, bool state, AccessorT &)
Same as addTile() except, if necessary, update the accessor with pointers to the nodes along the path...
Definition: InternalNode.h:1391
+
void setOff(Index32 n)
Set the nth bit off.
Definition: NodeMasks.h:454
+
void modifyItem(Index pos, const ModifyOp &op) const
Definition: InternalNode.h:187
+
void operator()(const tbb::blocked_range< Index > &r) const
Definition: InternalNode.h:875
+
ChildNodeType::BuildType BuildType
Definition: InternalNode.h:72
+
ValueIter< const InternalNode, const ValueType, MaskOffIterator, ValueOff > ValueOffCIter
Definition: InternalNode.h:240
+
void operator()(W &tC, const W &sC, const W &sV, const W &tV) const
Definition: InternalNode.h:2505
+
void setValueOff(const Coord &xyz)
Mark the voxel at the given coordinates as inactive but don't change its value.
Definition: InternalNode.h:1618
+ +
NodeMaskType::Word W
Definition: InternalNode.h:2454
+
TopologyIntersection(const OtherInternalNode *source, InternalNode *target, const ValueType &background)
Definition: InternalNode.h:2458
+
void makeChildNodeEmpty(Index n, const ValueType &value)
Definition: InternalNode.h:3171
+
void prune(TreeT &tree, typename TreeT::ValueType tolerance=zeroVal< typename TreeT::ValueType >(), bool threaded=true, size_t grainSize=1)
Reduce the memory footprint of a tree by replacing with tiles any nodes whose values are all the same...
Definition: Prune.h:347
+
DenseIter< const InternalNode, const ChildNodeType, ValueType, ChildAll > ChildAllCIter
Definition: InternalNode.h:235
+ +
ChildOffCIter cbeginChildOff() const
Definition: InternalNode.h:245
+
DenseIter(const MaskDenseIterator &iter, NodeT *parent)
Definition: InternalNode.h:201
+ +
void writeBuffers(std::ostream &, bool toHalf=false) const
Definition: InternalNode.h:2940
+
void voxelizeActiveTiles(bool threaded=true)
Densify active tiles, i.e., replace them with leaf-level active voxels.
Definition: InternalNode.h:2249
+
Definition: NodeMasks.h:205
+
bool isValueOnAndCache(const Coord &xyz, AccessorT &) const
Definition: InternalNode.h:1534
+
InternalNode * t
Definition: InternalNode.h:2439
+
ChildAllCIter beginChildAll() const
Definition: InternalNode.h:249
+
Definition: NodeMasks.h:236
+
T negative(const T &val)
Return the unary negation of the given value.
Definition: Math.h:116
+ +
BaseT::NonConstValueType NonConstValueT
Definition: InternalNode.h:198
+
Definition: Types.h:444
+
NodeType * probeNode(const Coord &xyz)
Return a pointer to the node that contains voxel (x, y, z). If no such node exists, return NULL.
+
ValueIter(const MaskIterT &iter, NodeT *parent)
Definition: InternalNode.h:177
+
ValueIter< InternalNode, const ValueType, MaskOffIterator, ChildOff > ChildOffIter
Definition: InternalNode.h:232
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
Definition: InternalNode.h:147
+
const NodeMaskType & getValueMask() const
Definition: InternalNode.h:753
+
ValueIter< const InternalNode, const ValueType, MaskOffIterator, ValueAll > ValueAllCIter
Definition: InternalNode.h:242
+
void operator()(W &tV, const W &sV, const W &tC) const
Definition: InternalNode.h:2409
+
void addTile(Index level, const Coord &xyz, const ValueType &value, bool state)
Add a tile at the specified tree level that contains voxel (x, y, z), possibly creating a parent bran...
Definition: InternalNode.h:1359
+
Index64 memUsage() const
Return the total amount of memory in bytes occupied by this node and its children.
Definition: InternalNode.h:1084
+
void setValueOnly(const Coord &xyz, const ValueType &value)
Set the value of the voxel at the given coordinates but don't change its active state.
Definition: InternalNode.h:1739
+
Definition: Types.h:266
+
LeafNodeType * touchLeaf(const Coord &xyz)
Return the leaf node that contains voxel (x, y, z). If no such node exists, create one...
Definition: InternalNode.h:1427
+
TreeT * tree
Definition: MaskToLevelSet.h:118
+
bool isEmpty() const
Definition: InternalNode.h:307
+
virtual ~InternalNode()
Definition: InternalNode.h:987
+
const ValueType & b
Definition: InternalNode.h:932
+
bool hasActiveTiles() const
Return true if this node or any of its child nodes have any active tiles.
Definition: InternalNode.h:1509
+
Index getValueLevel(const Coord &xyz) const
Return the level of the tree (0 = leaf) at which the value at the given coordinates resides...
Definition: InternalNode.h:1568
+
This struct collects both input and output arguments to "grid combiner" functors used with the tree::...
Definition: Types.h:312
+
bool resultIsActive() const
Definition: Types.h:376
+
const LeafNodeType * probeConstLeaf(const Coord &xyz) const
Return a pointer to the leaf node that contains voxel (x, y, z). If no such node exists, return NULL.
Definition: InternalNode.h:1267
+ +
Definition: InternalNode.h:146
+
const ValueType & onV
Definition: InternalNode.h:968
+
LeafNodeType * touchLeafAndCache(const Coord &xyz, AccessorT &)
Same as touchLeaf() except, if necessary, update the accessor with pointers to the nodes along the pa...
+
ValueAllCIter beginValueAll() const
Definition: InternalNode.h:261
+
LeafNodeType * probeLeafAndCache(const Coord &xyz, AccessorT &acc)
Same as probeLeaf() except, if necessary, update the accessor with pointers to the nodes along the pa...
+
void combine2(const InternalNode &other0, const OtherNodeType &other1, CombineOp &)
Definition: InternalNode.h:2652
+
DeepCopy(const OtherInternalNode *source, InternalNode *target)
Definition: InternalNode.h:871
+
void operator()(const tbb::blocked_range< Index > &r) const
Definition: InternalNode.h:920
+
void readTopology(std::istream &, bool fromHalf=false)
Definition: InternalNode.h:2118
+ +
ValueAllIter beginValueAll()
Definition: InternalNode.h:265
+
Base class for iterators over internal and leaf nodes.
Definition: Iterator.h:58
+
bool isValueMaskOff(Index n) const
Definition: InternalNode.h:748
+
ChildAllCIter cbeginChildAll() const
Definition: InternalNode.h:246
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & min(const T &a, const T &b)
Definition: Composite.h:128
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/Interpolation_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/Interpolation_8h_source.html new file mode 100644 index 00000000..c82d37f8 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/Interpolation_8h_source.html @@ -0,0 +1,1082 @@ + + + + + + +OpenVDB: Interpolation.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Interpolation.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
66 
+
67 #ifndef OPENVDB_TOOLS_INTERPOLATION_HAS_BEEN_INCLUDED
+
68 #define OPENVDB_TOOLS_INTERPOLATION_HAS_BEEN_INCLUDED
+
69 
+
70 #include <cmath>
+
71 #include <boost/shared_ptr.hpp>
+
72 #include <openvdb/version.h> // for OPENVDB_VERSION_NAME
+
73 #include <openvdb/Platform.h> // for round()
+
74 #include <openvdb/math/Math.h>// for SmoothUnitStep
+
75 #include <openvdb/math/Transform.h> // for Transform
+
76 #include <openvdb/Grid.h>
+ +
78 
+
79 namespace openvdb {
+ +
81 namespace OPENVDB_VERSION_NAME {
+
82 namespace tools {
+
83 
+
89 template <size_t Order, bool Staggered = false>
+
90 struct Sampler
+
91 {
+
92  BOOST_STATIC_ASSERT(Order < 3);
+
93  static const char* name();
+
94  static int radius();
+
95  static bool mipmap();
+
96  static bool consistent();
+
97  static bool staggered();
+
98  static size_t order();
+
99 
+
104  template<class TreeT>
+
105  static bool sample(const TreeT& inTree, const Vec3R& inCoord,
+
106  typename TreeT::ValueType& result);
+
107 
+
111  template<class TreeT>
+
112  static typename TreeT::ValueType sample(const TreeT& inTree, const Vec3R& inCoord);
+
113 };
+
114 
+
116 
+
117 // The following samplers operate in voxel space.
+
118 // When the samplers are applied to grids holding vector or other non-scalar data,
+
119 // the data is assumed to be collocated. For example, using the BoxSampler on a grid
+
120 // with ValueType Vec3f assumes that all three elements in a vector can be assigned
+
121 // the same physical location. Consider using the GridSampler below instead.
+
122 
+ +
124 {
+
125  static const char* name() { return "point"; }
+
126  static int radius() { return 0; }
+
127  static bool mipmap() { return false; }
+
128  static bool consistent() { return true; }
+
129  static bool staggered() { return false; }
+
130  static size_t order() { return 0; }
+
131 
+
135  template<class TreeT>
+
136  static bool sample(const TreeT& inTree, const Vec3R& inCoord,
+
137  typename TreeT::ValueType& result);
+
138 
+
141  template<class TreeT>
+
142  static typename TreeT::ValueType sample(const TreeT& inTree, const Vec3R& inCoord);
+
143 };
+
144 
+
145 
+ +
147 {
+
148  static const char* name() { return "box"; }
+
149  static int radius() { return 1; }
+
150  static bool mipmap() { return true; }
+
151  static bool consistent() { return true; }
+
152  static bool staggered() { return false; }
+
153  static size_t order() { return 1; }
+
154 
+
158  template<class TreeT>
+
159  static bool sample(const TreeT& inTree, const Vec3R& inCoord,
+
160  typename TreeT::ValueType& result);
+
161 
+
164  template<class TreeT>
+
165  static typename TreeT::ValueType sample(const TreeT& inTree, const Vec3R& inCoord);
+
166 
+
169  template<class ValueT, class TreeT, size_t N>
+
170  static inline void getValues(ValueT (&data)[N][N][N], const TreeT& inTree, Coord ijk);
+
171 
+
175  template<class ValueT, class TreeT, size_t N>
+
176  static inline bool probeValues(ValueT (&data)[N][N][N], const TreeT& inTree, Coord ijk);
+
177 
+
180  template<class ValueT, size_t N>
+
181  static inline void extrema(ValueT (&data)[N][N][N], ValueT& vMin, ValueT& vMax);
+
182 
+
184  template<class ValueT, size_t N>
+
185  static inline ValueT trilinearInterpolation(ValueT (&data)[N][N][N], const Vec3R& uvw);
+
186 };
+
187 
+
188 
+ +
190 {
+
191  static const char* name() { return "quadratic"; }
+
192  static int radius() { return 1; }
+
193  static bool mipmap() { return true; }
+
194  static bool consistent() { return false; }
+
195  static bool staggered() { return false; }
+
196  static size_t order() { return 2; }
+
197 
+
201  template<class TreeT>
+
202  static bool sample(const TreeT& inTree, const Vec3R& inCoord,
+
203  typename TreeT::ValueType& result);
+
204 
+
207  template<class TreeT>
+
208  static typename TreeT::ValueType sample(const TreeT& inTree, const Vec3R& inCoord);
+
209 
+
210  template<class ValueT, size_t N>
+
211  static inline ValueT triquadraticInterpolation(ValueT (&data)[N][N][N], const Vec3R& uvw);
+
212 };
+
213 
+
214 
+
216 
+
217 
+
218 // The following samplers operate in voxel space and are designed for Vec3
+
219 // staggered grid data (e.g., fluid simulations using the Marker-and-Cell approach
+
220 // associate elements of the velocity vector with different physical locations:
+
221 // the faces of a cube).
+
222 
+ +
224 {
+
225  static const char* name() { return "point"; }
+
226  static int radius() { return 0; }
+
227  static bool mipmap() { return false; }
+
228  static bool consistent() { return false; }
+
229  static bool staggered() { return true; }
+
230  static size_t order() { return 0; }
+
231 
+
235  template<class TreeT>
+
236  static bool sample(const TreeT& inTree, const Vec3R& inCoord,
+
237  typename TreeT::ValueType& result);
+
238 
+
241  template<class TreeT>
+
242  static typename TreeT::ValueType sample(const TreeT& inTree, const Vec3R& inCoord);
+
243 };
+
244 
+
245 
+ +
247 {
+
248  static const char* name() { return "box"; }
+
249  static int radius() { return 1; }
+
250  static bool mipmap() { return true; }
+
251  static bool consistent() { return false; }
+
252  static bool staggered() { return true; }
+
253  static size_t order() { return 1; }
+
254 
+
258  template<class TreeT>
+
259  static bool sample(const TreeT& inTree, const Vec3R& inCoord,
+
260  typename TreeT::ValueType& result);
+
261 
+
264  template<class TreeT>
+
265  static typename TreeT::ValueType sample(const TreeT& inTree, const Vec3R& inCoord);
+
266 };
+
267 
+
268 
+ +
270 {
+
271  static const char* name() { return "quadratic"; }
+
272  static int radius() { return 1; }
+
273  static bool mipmap() { return true; }
+
274  static bool consistent() { return false; }
+
275  static bool staggered() { return true; }
+
276  static size_t order() { return 2; }
+
277 
+
281  template<class TreeT>
+
282  static bool sample(const TreeT& inTree, const Vec3R& inCoord,
+
283  typename TreeT::ValueType& result);
+
284 
+
287  template<class TreeT>
+
288  static typename TreeT::ValueType sample(const TreeT& inTree, const Vec3R& inCoord);
+
289 };
+
290 
+
291 
+
293 
+
294 
+
309 template<typename GridOrTreeType, typename SamplerType>
+ +
311 {
+
312 public:
+
313  typedef boost::shared_ptr<GridSampler> Ptr;
+
314  typedef typename GridOrTreeType::ValueType ValueType;
+ + + +
318 
+
320  explicit GridSampler(const GridType& grid)
+
321  : mTree(&(grid.tree())), mTransform(&(grid.transform())) {}
+
322 
+
325  GridSampler(const TreeType& tree, const math::Transform& transform)
+
326  : mTree(&tree), mTransform(&transform) {}
+
327 
+
328  const math::Transform& transform() const { return *mTransform; }
+
329 
+
334  template<typename RealType>
+
335  ValueType sampleVoxel(const RealType& x, const RealType& y, const RealType& z) const
+
336  {
+
337  return this->isSample(Vec3d(x,y,z));
+
338  }
+
339 
+
344  ValueType sampleVoxel(typename Coord::ValueType i,
+
345  typename Coord::ValueType j,
+
346  typename Coord::ValueType k) const
+
347  {
+
348  return this->isSample(Coord(i,j,k));
+
349  }
+
350 
+
353  ValueType isSample(const Coord& ijk) const { return mTree->getValue(ijk); }
+
354 
+
357  ValueType isSample(const Vec3d& ispoint) const
+
358  {
+
359  ValueType result = zeroVal<ValueType>();
+
360  SamplerType::sample(*mTree, ispoint, result);
+
361  return result;
+
362  }
+
363 
+
366  ValueType wsSample(const Vec3d& wspoint) const
+
367  {
+
368  ValueType result = zeroVal<ValueType>();
+
369  SamplerType::sample(*mTree, mTransform->worldToIndex(wspoint), result);
+
370  return result;
+
371  }
+
372 
+
373 private:
+
374  const TreeType* mTree;
+
375  const math::Transform* mTransform;
+
376 }; // class GridSampler
+
377 
+
378 
+
391 template<typename TreeT, typename SamplerType>
+
392 class GridSampler<tree::ValueAccessor<TreeT>, SamplerType>
+
393 {
+
394 public:
+
395  typedef boost::shared_ptr<GridSampler> Ptr;
+
396  typedef typename TreeT::ValueType ValueType;
+
397  typedef TreeT TreeType;
+ + +
400 
+
403  GridSampler(const AccessorType& acc,
+
404  const math::Transform& transform)
+
405  : mAccessor(&acc), mTransform(&transform) {}
+
406 
+
407  const math::Transform& transform() const { return *mTransform; }
+
408 
+
413  template<typename RealType>
+
414  ValueType sampleVoxel(const RealType& x, const RealType& y, const RealType& z) const
+
415  {
+
416  return this->isSample(Vec3d(x,y,z));
+
417  }
+
418 
+
423  ValueType sampleVoxel(typename Coord::ValueType i,
+
424  typename Coord::ValueType j,
+
425  typename Coord::ValueType k) const
+
426  {
+
427  return this->isSample(Coord(i,j,k));
+
428  }
+
429 
+
432  ValueType isSample(const Coord& ijk) const { return mAccessor->getValue(ijk); }
+
433 
+
436  ValueType isSample(const Vec3d& ispoint) const
+
437  {
+
438  ValueType result = zeroVal<ValueType>();
+
439  SamplerType::sample(*mAccessor, ispoint, result);
+
440  return result;
+
441  }
+
442 
+
445  ValueType wsSample(const Vec3d& wspoint) const
+
446  {
+
447  ValueType result = zeroVal<ValueType>();
+
448  SamplerType::sample(*mAccessor, mTransform->worldToIndex(wspoint), result);
+
449  return result;
+
450  }
+
451 
+
452 private:
+
453  const AccessorType* mAccessor;//not thread-safe!
+
454  const math::Transform* mTransform;
+
455 };//Specialization of GridSampler
+
456 
+
457 
+
459 
+
460 
+
470 template<typename GridOrTreeT,
+
471  typename SamplerT>
+ +
473 {
+
474 public:
+
475  typedef typename GridOrTreeT::ValueType ValueType;
+ + + +
479 
+
483  DualGridSampler(const GridType& sourceGrid,
+
484  const math::Transform& targetXform)
+
485  : mSourceTree(&(sourceGrid.tree()))
+
486  , mSourceXform(&(sourceGrid.transform()))
+
487  , mTargetXform(&targetXform)
+
488  , mAligned(targetXform == *mSourceXform)
+
489  {
+
490  }
+
495  DualGridSampler(const TreeType& sourceTree,
+
496  const math::Transform& sourceXform,
+
497  const math::Transform& targetXform)
+
498  : mSourceTree(&sourceTree)
+
499  , mSourceXform(&sourceXform)
+
500  , mTargetXform(&targetXform)
+
501  , mAligned(targetXform == sourceXform)
+
502  {
+
503  }
+
506  inline ValueType operator()(const Coord& ijk) const
+
507  {
+
508  if (mAligned) return mSourceTree->getValue(ijk);
+
509  const Vec3R world = mTargetXform->indexToWorld(ijk);
+
510  return SamplerT::sample(*mSourceTree, mSourceXform->worldToIndex(world));
+
511  }
+
513  inline bool isAligned() const { return mAligned; }
+
514 private:
+
515  const TreeType* mSourceTree;
+
516  const math::Transform* mSourceXform;
+
517  const math::Transform* mTargetXform;
+
518  const bool mAligned;
+
519 };// DualGridSampler
+
520 
+
522 template<typename TreeT,
+
523  typename SamplerT>
+
524 class DualGridSampler<tree::ValueAccessor<TreeT>, SamplerT>
+
525 {
+
526  public:
+
527  typedef typename TreeT::ValueType ValueType;
+
528  typedef TreeT TreeType;
+ + +
531 
+
536  DualGridSampler(const AccessorType& sourceAccessor,
+
537  const math::Transform& sourceXform,
+
538  const math::Transform& targetXform)
+
539  : mSourceAcc(&sourceAccessor)
+
540  , mSourceXform(&sourceXform)
+
541  , mTargetXform(&targetXform)
+
542  , mAligned(targetXform == sourceXform)
+
543  {
+
544  }
+
547  inline ValueType operator()(const Coord& ijk) const
+
548  {
+
549  if (mAligned) return mSourceAcc->getValue(ijk);
+
550  const Vec3R world = mTargetXform->indexToWorld(ijk);
+
551  return SamplerT::sample(*mSourceAcc, mSourceXform->worldToIndex(world));
+
552  }
+
554  inline bool isAligned() const { return mAligned; }
+
555 private:
+
556  const AccessorType* mSourceAcc;
+
557  const math::Transform* mSourceXform;
+
558  const math::Transform* mTargetXform;
+
559  const bool mAligned;
+
560 };//Specialization of DualGridSampler
+
561 
+
563 
+
564 
+
565 // Class to derive the normalized alpha mask
+
566 template <typename GridT,
+
567  typename MaskT,
+
568  typename SamplerT = tools::BoxSampler,
+
569  typename FloatT = float>
+ +
571 {
+
572 public:
+
573  BOOST_STATIC_ASSERT(boost::is_floating_point<FloatT>::value);
+
574  typedef GridT GridType;
+
575  typedef MaskT MaskType;
+
576  typedef SamplerT SamlerType;
+
577  typedef FloatT FloatType;
+
578 
+
579  AlphaMask(const GridT& grid, const MaskT& mask, FloatT min, FloatT max, bool invert)
+
580  : mAcc(mask.tree())
+
581  , mSampler(mAcc, mask.transform() , grid.transform())
+
582  , mMin(min)
+
583  , mInvNorm(1/(max-min))
+
584  , mInvert(invert)
+
585  {
+
586  assert(min < max);
+
587  }
+
588 
+
589  inline bool operator()(const Coord& xyz, FloatT& a, FloatT& b) const
+
590  {
+
591  a = math::SmoothUnitStep( (mSampler(xyz) - mMin) * mInvNorm );//smooth mapping to 0->1
+
592  b = 1 - a;
+
593  if (mInvert) std::swap(a,b);
+
594  return a>0;
+
595  }
+
596 
+
597 protected:
+
598  typedef typename MaskType::ConstAccessor AccT;
+
599  AccT mAcc;
+ +
601  const FloatT mMin, mInvNorm;
+
602  const bool mInvert;
+
603 };// AlphaMask
+
604 
+
606 
+
607 namespace local_util {
+
608 
+
609 inline Vec3i
+
610 floorVec3(const Vec3R& v)
+
611 {
+
612  return Vec3i(int(std::floor(v(0))), int(std::floor(v(1))), int(std::floor(v(2))));
+
613 }
+
614 
+
615 
+
616 inline Vec3i
+
617 ceilVec3(const Vec3R& v)
+
618 {
+
619  return Vec3i(int(std::ceil(v(0))), int(std::ceil(v(1))), int(std::ceil(v(2))));
+
620 }
+
621 
+
622 
+
623 inline Vec3i
+
624 roundVec3(const Vec3R& v)
+
625 {
+
626  return Vec3i(int(::round(v(0))), int(::round(v(1))), int(::round(v(2))));
+
627 }
+
628 
+
629 } // namespace local_util
+
630 
+
631 
+
633 
+
634 
+
635 template<class TreeT>
+
636 inline bool
+
637 PointSampler::sample(const TreeT& inTree, const Vec3R& inCoord,
+
638  typename TreeT::ValueType& result)
+
639 {
+
640  return inTree.probeValue(Coord(local_util::roundVec3(inCoord)), result);
+
641 }
+
642 
+
643 template<class TreeT>
+
644 inline typename TreeT::ValueType
+
645 PointSampler::sample(const TreeT& inTree, const Vec3R& inCoord)
+
646 {
+
647  return inTree.getValue(Coord(local_util::roundVec3(inCoord)));
+
648 }
+
649 
+
650 
+
652 
+
653 template<class ValueT, class TreeT, size_t N>
+
654 inline void
+
655 BoxSampler::getValues(ValueT (&data)[N][N][N], const TreeT& inTree, Coord ijk)
+
656 {
+
657  data[0][0][0] = inTree.getValue(ijk); // i, j, k
+
658 
+
659  ijk[2] += 1;
+
660  data[0][0][1] = inTree.getValue(ijk); // i, j, k + 1
+
661 
+
662  ijk[1] += 1;
+
663  data[0][1][1] = inTree.getValue(ijk); // i, j+1, k + 1
+
664 
+
665  ijk[2] -= 1;
+
666  data[0][1][0] = inTree.getValue(ijk); // i, j+1, k
+
667 
+
668  ijk[0] += 1;
+
669  ijk[1] -= 1;
+
670  data[1][0][0] = inTree.getValue(ijk); // i+1, j, k
+
671 
+
672  ijk[2] += 1;
+
673  data[1][0][1] = inTree.getValue(ijk); // i+1, j, k + 1
+
674 
+
675  ijk[1] += 1;
+
676  data[1][1][1] = inTree.getValue(ijk); // i+1, j+1, k + 1
+
677 
+
678  ijk[2] -= 1;
+
679  data[1][1][0] = inTree.getValue(ijk); // i+1, j+1, k
+
680 }
+
681 
+
682 template<class ValueT, class TreeT, size_t N>
+
683 inline bool
+
684 BoxSampler::probeValues(ValueT (&data)[N][N][N], const TreeT& inTree, Coord ijk)
+
685 {
+
686  bool hasActiveValues = false;
+
687  hasActiveValues |= inTree.probeValue(ijk, data[0][0][0]); // i, j, k
+
688 
+
689  ijk[2] += 1;
+
690  hasActiveValues |= inTree.probeValue(ijk, data[0][0][1]); // i, j, k + 1
+
691 
+
692  ijk[1] += 1;
+
693  hasActiveValues |= inTree.probeValue(ijk, data[0][1][1]); // i, j+1, k + 1
+
694 
+
695  ijk[2] -= 1;
+
696  hasActiveValues |= inTree.probeValue(ijk, data[0][1][0]); // i, j+1, k
+
697 
+
698  ijk[0] += 1;
+
699  ijk[1] -= 1;
+
700  hasActiveValues |= inTree.probeValue(ijk, data[1][0][0]); // i+1, j, k
+
701 
+
702  ijk[2] += 1;
+
703  hasActiveValues |= inTree.probeValue(ijk, data[1][0][1]); // i+1, j, k + 1
+
704 
+
705  ijk[1] += 1;
+
706  hasActiveValues |= inTree.probeValue(ijk, data[1][1][1]); // i+1, j+1, k + 1
+
707 
+
708  ijk[2] -= 1;
+
709  hasActiveValues |= inTree.probeValue(ijk, data[1][1][0]); // i+1, j+1, k
+
710 
+
711  return hasActiveValues;
+
712 }
+
713 
+
714 template<class ValueT, size_t N>
+
715 inline void
+
716 BoxSampler::extrema(ValueT (&data)[N][N][N], ValueT& vMin, ValueT &vMax)
+
717 {
+
718  vMin = vMax = data[0][0][0];
+
719  vMin = math::Min(vMin, data[0][0][1]);
+
720  vMax = math::Max(vMax, data[0][0][1]);
+
721  vMin = math::Min(vMin, data[0][1][0]);
+
722  vMax = math::Max(vMax, data[0][1][0]);
+
723  vMin = math::Min(vMin, data[0][1][1]);
+
724  vMax = math::Max(vMax, data[0][1][1]);
+
725  vMin = math::Min(vMin, data[1][0][0]);
+
726  vMax = math::Max(vMax, data[1][0][0]);
+
727  vMin = math::Min(vMin, data[1][0][1]);
+
728  vMax = math::Max(vMax, data[1][0][1]);
+
729  vMin = math::Min(vMin, data[1][1][0]);
+
730  vMax = math::Max(vMax, data[1][1][0]);
+
731  vMin = math::Min(vMin, data[1][1][1]);
+
732  vMax = math::Max(vMax, data[1][1][1]);
+
733 }
+
734 
+
735 
+
736 template<class ValueT, size_t N>
+
737 inline ValueT
+
738 BoxSampler::trilinearInterpolation(ValueT (&data)[N][N][N], const Vec3R& uvw)
+
739 {
+
740  // Trilinear interpolation:
+
741  // The eight surrounding latice values are used to construct the result. \n
+
742  // result(x,y,z) =
+
743  // v000 (1-x)(1-y)(1-z) + v001 (1-x)(1-y)z + v010 (1-x)y(1-z) + v011 (1-x)yz
+
744  // + v100 x(1-y)(1-z) + v101 x(1-y)z + v110 xy(1-z) + v111 xyz
+
745 
+
746  ValueT resultA, resultB;
+
747 
+
748  resultA = data[0][0][0] + ValueT((data[0][0][1] - data[0][0][0]) * uvw[2]);
+
749  resultB = data[0][1][0] + ValueT((data[0][1][1] - data[0][1][0]) * uvw[2]);
+
750  ValueT result1 = resultA + ValueT((resultB-resultA) * uvw[1]);
+
751 
+
752  resultA = data[1][0][0] + ValueT((data[1][0][1] - data[1][0][0]) * uvw[2]);
+
753  resultB = data[1][1][0] + ValueT((data[1][1][1] - data[1][1][0]) * uvw[2]);
+
754  ValueT result2 = resultA + ValueT((resultB - resultA) * uvw[1]);
+
755 
+
756  return result1 + ValueT(uvw[0] * (result2 - result1));
+
757 }
+
758 
+
759 
+
760 template<class TreeT>
+
761 inline bool
+
762 BoxSampler::sample(const TreeT& inTree, const Vec3R& inCoord,
+
763  typename TreeT::ValueType& result)
+
764 {
+
765  typedef typename TreeT::ValueType ValueT;
+
766 
+
767  const Vec3i inIdx = local_util::floorVec3(inCoord);
+
768  const Vec3R uvw = inCoord - inIdx;
+
769 
+
770  // Retrieve the values of the eight voxels surrounding the
+
771  // fractional source coordinates.
+
772  ValueT data[2][2][2];
+
773 
+
774  const bool hasActiveValues = BoxSampler::probeValues(data, inTree, Coord(inIdx));
+
775 
+
776  result = BoxSampler::trilinearInterpolation(data, uvw);
+
777 
+
778  return hasActiveValues;
+
779 }
+
780 
+
781 
+
782 template<class TreeT>
+
783 inline typename TreeT::ValueType
+
784 BoxSampler::sample(const TreeT& inTree, const Vec3R& inCoord)
+
785 {
+
786  typedef typename TreeT::ValueType ValueT;
+
787 
+
788  const Vec3i inIdx = local_util::floorVec3(inCoord);
+
789  const Vec3R uvw = inCoord - inIdx;
+
790 
+
791  // Retrieve the values of the eight voxels surrounding the
+
792  // fractional source coordinates.
+
793  ValueT data[2][2][2];
+
794 
+
795  BoxSampler::getValues(data, inTree, Coord(inIdx));
+
796 
+
797  return BoxSampler::trilinearInterpolation(data, uvw);
+
798 }
+
799 
+
800 
+
802 
+
803 template<class ValueT, size_t N>
+
804 inline ValueT
+
805 QuadraticSampler::triquadraticInterpolation(ValueT (&data)[N][N][N], const Vec3R& uvw)
+
806 {
+
808  ValueT vx[3];
+
809  for (int dx = 0; dx < 3; ++dx) {
+
810  ValueT vy[3];
+
811  for (int dy = 0; dy < 3; ++dy) {
+
812  // Fit a parabola to three contiguous samples in z
+
813  // (at z=-1, z=0 and z=1), then evaluate the parabola at z',
+
814  // where z' is the fractional part of inCoord.z, i.e.,
+
815  // inCoord.z - inIdx.z. The coefficients come from solving
+
816  //
+
817  // | (-1)^2 -1 1 || a | | v0 |
+
818  // | 0 0 1 || b | = | v1 |
+
819  // | 1^2 1 1 || c | | v2 |
+
820  //
+
821  // for a, b and c.
+
822  const ValueT* vz = &data[dx][dy][0];
+
823  const ValueT
+
824  az = static_cast<ValueT>(0.5 * (vz[0] + vz[2]) - vz[1]),
+
825  bz = static_cast<ValueT>(0.5 * (vz[2] - vz[0])),
+
826  cz = static_cast<ValueT>(vz[1]);
+
827  vy[dy] = static_cast<ValueT>(uvw.z() * (uvw.z() * az + bz) + cz);
+
828  }//loop over y
+
829  // Fit a parabola to three interpolated samples in y, then
+
830  // evaluate the parabola at y', where y' is the fractional
+
831  // part of inCoord.y.
+
832  const ValueT
+
833  ay = static_cast<ValueT>(0.5 * (vy[0] + vy[2]) - vy[1]),
+
834  by = static_cast<ValueT>(0.5 * (vy[2] - vy[0])),
+
835  cy = static_cast<ValueT>(vy[1]);
+
836  vx[dx] = static_cast<ValueT>(uvw.y() * (uvw.y() * ay + by) + cy);
+
837  }//loop over x
+
838  // Fit a parabola to three interpolated samples in x, then
+
839  // evaluate the parabola at the fractional part of inCoord.x.
+
840  const ValueT
+
841  ax = static_cast<ValueT>(0.5 * (vx[0] + vx[2]) - vx[1]),
+
842  bx = static_cast<ValueT>(0.5 * (vx[2] - vx[0])),
+
843  cx = static_cast<ValueT>(vx[1]);
+
844  return static_cast<ValueT>(uvw.x() * (uvw.x() * ax + bx) + cx);
+
845 }
+
846 
+
847 template<class TreeT>
+
848 inline bool
+
849 QuadraticSampler::sample(const TreeT& inTree, const Vec3R& inCoord,
+
850  typename TreeT::ValueType& result)
+
851 {
+
852  typedef typename TreeT::ValueType ValueT;
+
853 
+
854  const Vec3i inIdx = local_util::floorVec3(inCoord), inLoIdx = inIdx - Vec3i(1, 1, 1);
+
855  const Vec3R uvw = inCoord - inIdx;
+
856 
+
857  // Retrieve the values of the 27 voxels surrounding the
+
858  // fractional source coordinates.
+
859  bool active = false;
+
860  ValueT data[3][3][3];
+
861  for (int dx = 0, ix = inLoIdx.x(); dx < 3; ++dx, ++ix) {
+
862  for (int dy = 0, iy = inLoIdx.y(); dy < 3; ++dy, ++iy) {
+
863  for (int dz = 0, iz = inLoIdx.z(); dz < 3; ++dz, ++iz) {
+
864  if (inTree.probeValue(Coord(ix, iy, iz), data[dx][dy][dz])) active = true;
+
865  }
+
866  }
+
867  }
+
868 
+
869  result = QuadraticSampler::triquadraticInterpolation(data, uvw);
+
870 
+
871  return active;
+
872 }
+
873 
+
874 template<class TreeT>
+
875 inline typename TreeT::ValueType
+
876 QuadraticSampler::sample(const TreeT& inTree, const Vec3R& inCoord)
+
877 {
+
878  typedef typename TreeT::ValueType ValueT;
+
879 
+
880  const Vec3i inIdx = local_util::floorVec3(inCoord), inLoIdx = inIdx - Vec3i(1, 1, 1);
+
881  const Vec3R uvw = inCoord - inIdx;
+
882 
+
883  // Retrieve the values of the 27 voxels surrounding the
+
884  // fractional source coordinates.
+
885  ValueT data[3][3][3];
+
886  for (int dx = 0, ix = inLoIdx.x(); dx < 3; ++dx, ++ix) {
+
887  for (int dy = 0, iy = inLoIdx.y(); dy < 3; ++dy, ++iy) {
+
888  for (int dz = 0, iz = inLoIdx.z(); dz < 3; ++dz, ++iz) {
+
889  data[dx][dy][dz] = inTree.getValue(Coord(ix, iy, iz));
+
890  }
+
891  }
+
892  }
+
893 
+
894  return QuadraticSampler::triquadraticInterpolation(data, uvw);
+
895 }
+
896 
+
897 
+
899 
+
900 
+
901 template<class TreeT>
+
902 inline bool
+
903 StaggeredPointSampler::sample(const TreeT& inTree, const Vec3R& inCoord,
+
904  typename TreeT::ValueType& result)
+
905 {
+
906  typedef typename TreeT::ValueType ValueType;
+
907 
+
908  ValueType tempX, tempY, tempZ;
+
909  bool active = false;
+
910 
+
911  active = PointSampler::sample<TreeT>(inTree, inCoord + Vec3R(0.5, 0, 0), tempX) || active;
+
912  active = PointSampler::sample<TreeT>(inTree, inCoord + Vec3R(0, 0.5, 0), tempY) || active;
+
913  active = PointSampler::sample<TreeT>(inTree, inCoord + Vec3R(0, 0, 0.5), tempZ) || active;
+
914 
+
915  result.x() = tempX.x();
+
916  result.y() = tempY.y();
+
917  result.z() = tempZ.z();
+
918 
+
919  return active;
+
920 }
+
921 
+
922 template<class TreeT>
+
923 inline typename TreeT::ValueType
+
924 StaggeredPointSampler::sample(const TreeT& inTree, const Vec3R& inCoord)
+
925 {
+
926  typedef typename TreeT::ValueType ValueT;
+
927 
+
928  const ValueT tempX = PointSampler::sample<TreeT>(inTree, inCoord + Vec3R(0.5, 0.0, 0.0));
+
929  const ValueT tempY = PointSampler::sample<TreeT>(inTree, inCoord + Vec3R(0.0, 0.5, 0.0));
+
930  const ValueT tempZ = PointSampler::sample<TreeT>(inTree, inCoord + Vec3R(0.0, 0.0, 0.5));
+
931 
+
932  return ValueT(tempX.x(), tempY.y(), tempZ.z());
+
933 }
+
934 
+
935 
+
937 
+
938 
+
939 template<class TreeT>
+
940 inline bool
+
941 StaggeredBoxSampler::sample(const TreeT& inTree, const Vec3R& inCoord,
+
942  typename TreeT::ValueType& result)
+
943 {
+
944  typedef typename TreeT::ValueType ValueType;
+
945 
+
946  ValueType tempX, tempY, tempZ;
+
947  tempX = tempY = tempZ = zeroVal<ValueType>();
+
948  bool active = false;
+
949 
+
950  active = BoxSampler::sample<TreeT>(inTree, inCoord + Vec3R(0.5, 0, 0), tempX) || active;
+
951  active = BoxSampler::sample<TreeT>(inTree, inCoord + Vec3R(0, 0.5, 0), tempY) || active;
+
952  active = BoxSampler::sample<TreeT>(inTree, inCoord + Vec3R(0, 0, 0.5), tempZ) || active;
+
953 
+
954  result.x() = tempX.x();
+
955  result.y() = tempY.y();
+
956  result.z() = tempZ.z();
+
957 
+
958  return active;
+
959 }
+
960 
+
961 template<class TreeT>
+
962 inline typename TreeT::ValueType
+
963 StaggeredBoxSampler::sample(const TreeT& inTree, const Vec3R& inCoord)
+
964 {
+
965  typedef typename TreeT::ValueType ValueT;
+
966 
+
967  const ValueT tempX = BoxSampler::sample<TreeT>(inTree, inCoord + Vec3R(0.5, 0.0, 0.0));
+
968  const ValueT tempY = BoxSampler::sample<TreeT>(inTree, inCoord + Vec3R(0.0, 0.5, 0.0));
+
969  const ValueT tempZ = BoxSampler::sample<TreeT>(inTree, inCoord + Vec3R(0.0, 0.0, 0.5));
+
970 
+
971  return ValueT(tempX.x(), tempY.y(), tempZ.z());
+
972 }
+
973 
+
974 
+
976 
+
977 
+
978 template<class TreeT>
+
979 inline bool
+
980 StaggeredQuadraticSampler::sample(const TreeT& inTree, const Vec3R& inCoord,
+
981  typename TreeT::ValueType& result)
+
982 {
+
983  typedef typename TreeT::ValueType ValueType;
+
984 
+
985  ValueType tempX, tempY, tempZ;
+
986  bool active = false;
+
987 
+
988  active = QuadraticSampler::sample<TreeT>(inTree, inCoord + Vec3R(0.5, 0, 0), tempX) || active;
+
989  active = QuadraticSampler::sample<TreeT>(inTree, inCoord + Vec3R(0, 0.5, 0), tempY) || active;
+
990  active = QuadraticSampler::sample<TreeT>(inTree, inCoord + Vec3R(0, 0, 0.5), tempZ) || active;
+
991 
+
992  result.x() = tempX.x();
+
993  result.y() = tempY.y();
+
994  result.z() = tempZ.z();
+
995 
+
996  return active;
+
997 }
+
998 
+
999 template<class TreeT>
+
1000 inline typename TreeT::ValueType
+
1001 StaggeredQuadraticSampler::sample(const TreeT& inTree, const Vec3R& inCoord)
+
1002 {
+
1003  typedef typename TreeT::ValueType ValueT;
+
1004 
+
1005  const ValueT tempX = QuadraticSampler::sample<TreeT>(inTree, inCoord + Vec3R(0.5, 0.0, 0.0));
+
1006  const ValueT tempY = QuadraticSampler::sample<TreeT>(inTree, inCoord + Vec3R(0.0, 0.5, 0.0));
+
1007  const ValueT tempZ = QuadraticSampler::sample<TreeT>(inTree, inCoord + Vec3R(0.0, 0.0, 0.5));
+
1008 
+
1009  return ValueT(tempX.x(), tempY.y(), tempZ.z());
+
1010 }
+
1011 
+
1013 
+
1014 template <>
+
1015 struct Sampler<0, false> : public PointSampler {};
+
1016 
+
1017 template <>
+
1018 struct Sampler<1, false> : public BoxSampler {};
+
1019 
+
1020 template <>
+
1021 struct Sampler<2, false> : public QuadraticSampler {};
+
1022 
+
1023 template <>
+
1024 struct Sampler<0, true> : public StaggeredPointSampler {};
+
1025 
+
1026 template <>
+
1027 struct Sampler<1, true> : public StaggeredBoxSampler {};
+
1028 
+
1029 template <>
+
1030 struct Sampler<2, true> : public StaggeredQuadraticSampler {};
+
1031 
+
1032 } // namespace tools
+
1033 } // namespace OPENVDB_VERSION_NAME
+
1034 } // namespace openvdb
+
1035 
+
1036 #endif // OPENVDB_TOOLS_INTERPOLATION_HAS_BEEN_INCLUDED
+
1037 
+
1038 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
1039 // All rights reserved. This software is distributed under the
+
1040 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
static bool staggered()
Definition: Interpolation.h:229
+
static bool staggered()
Definition: Interpolation.h:252
+
MaskT MaskType
Definition: Interpolation.h:575
+
static size_t order()
Definition: Interpolation.h:130
+
Vec3i ceilVec3(const Vec3R &v)
Definition: Interpolation.h:617
+
static bool mipmap()
Definition: Interpolation.h:127
+
static bool mipmap()
Definition: Interpolation.h:273
+
TreeAdapter< GridOrTreeType >::AccessorType AccessorType
Definition: Interpolation.h:317
+
T & z()
Definition: Vec3.h:99
+
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
static bool consistent()
Definition: Interpolation.h:228
+
GridSampler(const TreeType &tree, const math::Transform &transform)
Definition: Interpolation.h:325
+
ValueType sampleVoxel(const RealType &x, const RealType &y, const RealType &z) const
Sample a point in index space in the grid.
Definition: Interpolation.h:414
+
static bool staggered()
Definition: Interpolation.h:152
+
ValueType wsSample(const Vec3d &wspoint) const
Sample in world space.
Definition: Interpolation.h:366
+
const Type & Min(const Type &a, const Type &b)
Return the minimum of two values.
Definition: Math.h:622
+ +
Vec3i roundVec3(const Vec3R &v)
Definition: Interpolation.h:624
+
static size_t order()
Definition: Interpolation.h:230
+
static const char * name()
Definition: Interpolation.h:191
+
TreeAdapter< GridOrTreeType >::TreeType TreeType
Definition: Interpolation.h:316
+
static const char * name()
Definition: Interpolation.h:125
+
bool isAligned() const
Return true if the two grids are aligned.
Definition: Interpolation.h:513
+
ValueType isSample(const Vec3d &ispoint) const
Sample in fractional index space.
Definition: Interpolation.h:357
+
FloatT FloatType
Definition: Interpolation.h:577
+
ValueType wsSample(const Vec3d &wspoint) const
Sample in world space.
Definition: Interpolation.h:445
+
static bool staggered()
Definition: Interpolation.h:275
+
static int radius()
Definition: Interpolation.h:226
+
static bool staggered()
Definition: Interpolation.h:195
+
static int radius()
Definition: Interpolation.h:192
+
static bool consistent()
Definition: Interpolation.h:128
+
DualGridSampler(const GridType &sourceGrid, const math::Transform &targetXform)
Grid and transform constructor.
Definition: Interpolation.h:483
+
boost::shared_ptr< GridSampler > Ptr
Definition: Interpolation.h:313
+
ValueType sampleVoxel(typename Coord::ValueType i, typename Coord::ValueType j, typename Coord::ValueType k) const
Sample value in integer index space.
Definition: Interpolation.h:344
+ +
static bool consistent()
Definition: Interpolation.h:151
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & max(const T &a, const T &b)
Definition: Composite.h:132
+ + +
static int radius()
Definition: Interpolation.h:272
+
TreeAdapter< GridOrTreeT >::GridType GridType
Definition: Interpolation.h:476
+
Type SmoothUnitStep(Type x)
Return 0 if x < 0, 1 if x > 1 or else .
Definition: Math.h:272
+
ValueType operator()(const Coord &ijk) const
Return the value of the source grid at the index coordinates, ijk, relative to the target grid (or it...
Definition: Interpolation.h:506
+
static bool mipmap()
Definition: Interpolation.h:150
+
Definition: Interpolation.h:246
+
bool operator()(const Coord &xyz, FloatT &a, FloatT &b) const
Definition: Interpolation.h:589
+
ValueType sampleVoxel(const RealType &x, const RealType &y, const RealType &z) const
Sample a point in index space in the grid.
Definition: Interpolation.h:335
+ + +
Vec3< int32_t > Vec3i
Definition: Vec3.h:648
+
static size_t order()
Definition: Interpolation.h:196
+
static const char * name()
Definition: Interpolation.h:271
+
static const char * name()
Definition: Interpolation.h:248
+
Provises a unified interface for sampling, i.e. interpolation.
Definition: Interpolation.h:90
+
static const char * name()
Definition: Interpolation.h:225
+
Definition: Interpolation.h:146
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
This is a simple convenience class that allows for sampling from a source grid into the index space o...
Definition: Interpolation.h:472
+
Vec3< double > Vec3d
Definition: Vec3.h:651
+
Definition: Interpolation.h:223
+ +
static const char * name()
Definition: Interpolation.h:148
+
tools::DualGridSampler< AccT, SamplerT > mSampler
Definition: Interpolation.h:600
+
tree::ValueAccessor< TreeT > AccessorType
Definition: Interpolation.h:530
+
static int radius()
Definition: Interpolation.h:249
+
AlphaMask(const GridT &grid, const MaskT &mask, FloatT min, FloatT max, bool invert)
Definition: Interpolation.h:579
+
DualGridSampler(const TreeType &sourceTree, const math::Transform &sourceXform, const math::Transform &targetXform)
Tree and transform constructor.
Definition: Interpolation.h:495
+
T & x()
Reference to the component, e.g. v.x() = 4.5f;.
Definition: Vec3.h:97
+
Calculate an axis-aligned bounding box in index space from a bounding sphere in world space...
Definition: Transform.h:66
+
Definition: Interpolation.h:570
+
static bool consistent()
Definition: Interpolation.h:274
+
const math::Transform & transform() const
Definition: Interpolation.h:328
+
GridSampler(const AccessorType &acc, const math::Transform &transform)
Definition: Interpolation.h:403
+
boost::shared_ptr< GridSampler > Ptr
Definition: Interpolation.h:395
+
Definition: Exceptions.h:39
+
static int radius()
Definition: Interpolation.h:126
+
ValueType sampleVoxel(typename Coord::ValueType i, typename Coord::ValueType j, typename Coord::ValueType k) const
Sample value in integer index space.
Definition: Interpolation.h:423
+
ValueType isSample(const Vec3d &ispoint) const
Sample in fractional index space.
Definition: Interpolation.h:436
+
SamplerT SamlerType
Definition: Interpolation.h:576
+
ValueType isSample(const Coord &ijk) const
Sample value in integer index space.
Definition: Interpolation.h:353
+
const math::Transform & transform() const
Definition: Interpolation.h:407
+
static bool mipmap()
Definition: Interpolation.h:193
+
static bool consistent()
Definition: Interpolation.h:194
+ + +
GridT GridType
Definition: Interpolation.h:574
+
_TreeType TreeType
Definition: Grid.h:885
+
static int radius()
Definition: Interpolation.h:149
+
Vec3i floorVec3(const Vec3R &v)
Definition: Interpolation.h:610
+
static size_t order()
Definition: Interpolation.h:253
+ +
Definition: Interpolation.h:189
+
T & y()
Definition: Vec3.h:98
+
GridOrTreeType::ValueType ValueType
Definition: Interpolation.h:314
+
AccT mAcc
Definition: Interpolation.h:599
+
MaskType::ConstAccessor AccT
Definition: Interpolation.h:598
+ +
const FloatT mMin
Definition: Interpolation.h:601
+ +
const Type & Max(const Type &a, const Type &b)
Return the maximum of two values.
Definition: Math.h:561
+
tree::ValueAccessor< TreeT > AccessorType
Definition: Interpolation.h:399
+
math::Vec3< Real > Vec3R
Definition: Types.h:76
+
ValueType operator()(const Coord &ijk) const
Return the value of the source grid at the index coordinates, ijk, relative to the target grid...
Definition: Interpolation.h:547
+
math::Extrema extrema(const IterT &iter, bool threaded=true)
Iterate over a scalar grid and compute extrema (min/max) of the values of the voxels that are visited...
Definition: Statistics.h:379
+
static bool consistent()
Definition: Interpolation.h:251
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
static size_t order()
Definition: Interpolation.h:276
+
GridOrTreeT::ValueType ValueType
Definition: Interpolation.h:475
+ +
const bool mInvert
Definition: Interpolation.h:602
+
static bool mipmap()
Definition: Interpolation.h:227
+
DualGridSampler(const AccessorType &sourceAccessor, const math::Transform &sourceXform, const math::Transform &targetXform)
ValueAccessor and transform constructor.
Definition: Interpolation.h:536
+
static bool staggered()
Definition: Interpolation.h:129
+
static size_t order()
Definition: Interpolation.h:153
+
TreeT * tree
Definition: MaskToLevelSet.h:118
+
Class that provides the interface for continuous sampling of values in a tree.
Definition: Interpolation.h:310
+
Definition: Interpolation.h:123
+
TreeAdapter< GridOrTreeT >::TreeType TreeType
Definition: Interpolation.h:477
+
Container class that associates a tree with a transform and metadata.
Definition: Grid.h:54
+
GridSampler(const GridType &grid)
Definition: Interpolation.h:320
+
TreeAdapter< GridOrTreeType >::GridType GridType
Definition: Interpolation.h:315
+
ValueType isSample(const Coord &ijk) const
Sample value in integer index space.
Definition: Interpolation.h:432
+
TreeAdapter< GridType >::AccessorType AccessorType
Definition: Interpolation.h:478
+
bool isAligned() const
Return true if the two grids are aligned.
Definition: Interpolation.h:554
+
static bool mipmap()
Definition: Interpolation.h:250
+ +
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & min(const T &a, const T &b)
Definition: Composite.h:128
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/Iterator_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/Iterator_8h_source.html new file mode 100644 index 00000000..b4d38530 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/Iterator_8h_source.html @@ -0,0 +1,369 @@ + + + + + + +OpenVDB: Iterator.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Iterator.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
34 
+
35 #ifndef OPENVDB_TREE_ITERATOR_HAS_BEEN_INCLUDED
+
36 #define OPENVDB_TREE_ITERATOR_HAS_BEEN_INCLUDED
+
37 
+
38 #include <sstream>
+
39 #include <boost/static_assert.hpp>
+
40 #include <boost/type_traits/is_const.hpp>
+
41 #include <boost/type_traits/remove_const.hpp>
+
42 #include <openvdb/util/NodeMasks.h>
+
43 #include <openvdb/Exceptions.h>
+
44 
+
45 namespace openvdb {
+ +
47 namespace OPENVDB_VERSION_NAME {
+
48 namespace tree {
+
49 
+
57 template<typename MaskIterT, typename NodeT>
+ +
59 {
+
60 public:
+
61  IteratorBase(): mParentNode(NULL) {}
+
62  IteratorBase(const MaskIterT& iter, NodeT* parent):
+
63  mParentNode(parent), mMaskIter(iter) {}
+
64 
+
65  void operator=(const IteratorBase& other)
+
66  {
+
67  mParentNode = other.mParentNode;
+
68  mMaskIter = other.mMaskIter;
+
69  }
+
70 
+
71  bool operator==(const IteratorBase& other) const
+
72  {
+
73  return (mParentNode == other.mParentNode) && (mMaskIter == other.mMaskIter);
+
74  }
+
75  bool operator!=(const IteratorBase& other) const
+
76  {
+
77  return !(*this == other);
+
78  }
+
79 
+
81  NodeT* getParentNode() const { return mParentNode; }
+
84  NodeT& parent() const
+
85  {
+
86  if (!mParentNode) OPENVDB_THROW(ValueError, "iterator references a null node");
+
87  return *mParentNode;
+
88  }
+
89 
+
91  Index offset() const { return mMaskIter.offset(); }
+
92 
+
94  Index pos() const { return mMaskIter.offset(); }
+
95 
+
97  bool test() const { return mMaskIter.test(); }
+
99  operator bool() const { return this->test(); }
+
100 
+
102  bool next() { return mMaskIter.next(); }
+
104  void increment() { mMaskIter.increment(); }
+
106  IteratorBase& operator++() { this->increment(); return *this; }
+
108  void increment(Index n) { mMaskIter.increment(n); }
+
109 
+
112  bool isValueOn() const { return parent().isValueMaskOn(this->pos()); }
+
115  void setValueOn(bool on = true) const { parent().setValueMask(this->pos(), on); }
+
120  void setValueOff() const { parent().mValueMask.setOff(this->pos()); }
+
121 
+
123  Coord getCoord() const { return parent().offsetToGlobalCoord(this->pos()); }
+
125  void getCoord(Coord& xyz) const { xyz = this->getCoord(); }
+
126 
+
127 private:
+
134  mutable NodeT* mParentNode;
+
135  MaskIterT mMaskIter;
+
136 }; // class IteratorBase
+
137 
+
138 
+
140 
+
141 
+
143 template<
+
144  typename MaskIterT, // mask iterator type (OnIterator, OffIterator, etc.)
+
145  typename IterT, // SparseIteratorBase subclass (the "Curiously Recurring Template Pattern")
+
146  typename NodeT, // type of node over which to iterate
+
147  typename ItemT> // type of value to which this iterator points
+
148 struct SparseIteratorBase: public IteratorBase<MaskIterT, NodeT>
+
149 {
+
150  typedef NodeT NodeType;
+
151  typedef ItemT ValueType;
+
152  typedef typename boost::remove_const<NodeT>::type NonConstNodeType;
+
153  typedef typename boost::remove_const<ItemT>::type NonConstValueType;
+
154  static const bool IsSparseIterator = true, IsDenseIterator = false;
+
155 
+ +
157  SparseIteratorBase(const MaskIterT& iter, NodeT* parent):
+
158  IteratorBase<MaskIterT, NodeT>(iter, parent) {}
+
159 
+
162  ItemT& getItem(Index) const;
+
165  void setItem(Index, const ItemT&) const;
+
166 
+
168  ItemT& operator*() const { return this->getValue(); }
+
170  ItemT* operator->() const { return &(this->operator*()); }
+
171 
+
173  ItemT& getValue() const
+
174  {
+
175  return static_cast<const IterT*>(this)->getItem(this->pos()); // static polymorphism
+
176  }
+
179  void setValue(const ItemT& value) const
+
180  {
+
181  BOOST_STATIC_ASSERT(!boost::is_const<NodeT>::value);
+
182  static_cast<const IterT*>(this)->setItem(this->pos(), value); // static polymorphism
+
183  }
+
189  template<typename ModifyOp>
+
190  void modifyValue(const ModifyOp& op) const
+
191  {
+
192  BOOST_STATIC_ASSERT(!boost::is_const<NodeT>::value);
+
193  static_cast<const IterT*>(this)->modifyItem(this->pos(), op); // static polymorphism
+
194  }
+
195 }; // class SparseIteratorBase
+
196 
+
197 
+
199 
+
200 
+
205 template<
+
206  typename MaskIterT, // mask iterator type (typically a DenseIterator)
+
207  typename IterT, // DenseIteratorBase subclass (the "Curiously Recurring Template Pattern")
+
208  typename NodeT, // type of node over which to iterate
+
209  typename SetItemT, // type of set value (ChildNodeType, for non-leaf nodes)
+
210  typename UnsetItemT> // type of unset value (ValueType, usually)
+
211 struct DenseIteratorBase: public IteratorBase<MaskIterT, NodeT>
+
212 {
+
213  typedef NodeT NodeType;
+
214  typedef UnsetItemT ValueType;
+
215  typedef SetItemT ChildNodeType;
+
216  typedef typename boost::remove_const<NodeT>::type NonConstNodeType;
+
217  typedef typename boost::remove_const<UnsetItemT>::type NonConstValueType;
+
218  typedef typename boost::remove_const<SetItemT>::type NonConstChildNodeType;
+
219  static const bool IsSparseIterator = false, IsDenseIterator = true;
+
220 
+ +
222  DenseIteratorBase(const MaskIterT& iter, NodeT* parent):
+
223  IteratorBase<MaskIterT, NodeT>(iter, parent) {}
+
224 
+
229  bool getItem(Index, SetItemT*& child, NonConstValueType& value) const;
+
232  void setItem(Index, SetItemT*) const;
+
235  void unsetItem(Index, const UnsetItemT&) const;
+
236 
+
238  bool isChildNode() const { return this->parent().isChildMaskOn(this->pos()); }
+
239 
+
242  SetItemT* probeChild(NonConstValueType& value) const
+
243  {
+
244  SetItemT* child = NULL;
+
245  static_cast<const IterT*>(this)->getItem(this->pos(), child, value); // static polymorphism
+
246  return child;
+
247  }
+
251  bool probeChild(SetItemT*& child, NonConstValueType& value) const
+
252  {
+
253  child = probeChild(value);
+
254  return (child != NULL);
+
255  }
+
256 
+
259  bool probeValue(NonConstValueType& value) const
+
260  {
+
261  SetItemT* child = NULL;
+
262  const bool isChild = static_cast<const IterT*>(this)-> // static polymorphism
+
263  getItem(this->pos(), child, value);
+
264  return !isChild;
+
265  }
+
266 
+
269  void setChild(SetItemT* child) const
+
270  {
+
271  static_cast<const IterT*>(this)->setItem(this->pos(), child); // static polymorphism
+
272  }
+
273 
+
276  void setValue(const UnsetItemT& value) const
+
277  {
+
278  static_cast<const IterT*>(this)->unsetItem(this->pos(), value); // static polymorphism
+
279  }
+
280 }; // struct DenseIteratorBase
+
281 
+
282 } // namespace tree
+
283 } // namespace OPENVDB_VERSION_NAME
+
284 } // namespace openvdb
+
285 
+
286 #endif // OPENVDB_TREE_ITERATOR_HAS_BEEN_INCLUDED
+
287 
+
288 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
289 // All rights reserved. This software is distributed under the
+
290 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
IteratorBase & operator++()
Advance to the next item in the parent node's table.
Definition: Iterator.h:106
+
NodeT NodeType
Definition: Iterator.h:213
+
bool operator==(const IteratorBase &other) const
Definition: Iterator.h:71
+
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
+
Index offset() const
Return this iterator's position as an index into the parent node's table.
Definition: Iterator.h:91
+
SparseIteratorBase(const MaskIterT &iter, NodeT *parent)
Definition: Iterator.h:157
+
SetItemT * probeChild(NonConstValueType &value) const
If this iterator is pointing to a child node, return a pointer to the node. Otherwise, return NULL and, in value, the value to which this iterator is pointing.
Definition: Iterator.h:242
+
ItemT * operator->() const
Return a pointer to the item to which this iterator is pointing.
Definition: Iterator.h:170
+
Mat3< typename promote< T0, T1 >::type > operator*(const Mat3< T0 > &m0, const Mat3< T1 > &m1)
Matrix multiplication.
Definition: Mat3.h:658
+
void setValueOff() const
If this iterator is pointing to a value, mark the value as inactive.
Definition: Iterator.h:120
+
Coord getCoord() const
Return the coordinates of the item to which this iterator is pointing.
Definition: Iterator.h:123
+
bool isValueOn() const
Return true if this iterator is pointing to an active value. Return false if it is pointing to either...
Definition: Iterator.h:112
+
NodeT & parent() const
Return a reference to the node over which this iterator is iterating.
Definition: Iterator.h:84
+
Index32 Index
Definition: Types.h:58
+
boost::remove_const< NodeT >::type NonConstNodeType
Definition: Iterator.h:152
+
bool test() const
Return true if this iterator is not yet exhausted.
Definition: Iterator.h:97
+
ItemT & getValue() const
Return the item to which this iterator is pointing.
Definition: Iterator.h:173
+
boost::remove_const< SetItemT >::type NonConstChildNodeType
Definition: Iterator.h:218
+ +
bool next()
Advance to the next item in the parent node's table.
Definition: Iterator.h:102
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
void setValueOn(bool on=true) const
If this iterator is pointing to a value, set the value's active state. Otherwise, do nothing...
Definition: Iterator.h:115
+
void increment(Index n)
Advance n items in the parent node's table.
Definition: Iterator.h:108
+
void setValue(const UnsetItemT &value) const
Replace with the given value the item in the parent node's table to which this iterator is pointing...
Definition: Iterator.h:276
+
UnsetItemT ValueType
Definition: Iterator.h:214
+
ItemT ValueType
Definition: Iterator.h:151
+
NodeT NodeType
Definition: Iterator.h:150
+
IteratorBase()
Definition: Iterator.h:61
+
Definition: Exceptions.h:39
+
ItemT & operator*() const
Return a reference to the item to which this iterator is pointing.
Definition: Iterator.h:168
+
void increment()
Advance to the next item in the parent node's table.
Definition: Iterator.h:104
+
Base class for dense iterators over internal and leaf nodes.
Definition: Iterator.h:211
+
DenseIteratorBase(const MaskIterT &iter, NodeT *parent)
Definition: Iterator.h:222
+
Base class for sparse iterators over internal and leaf nodes.
Definition: Iterator.h:148
+
boost::remove_const< UnsetItemT >::type NonConstValueType
Definition: Iterator.h:217
+
bool probeChild(SetItemT *&child, NonConstValueType &value) const
If this iterator is pointing to a child node, return true and return a pointer to the child node in c...
Definition: Iterator.h:251
+
DenseIteratorBase()
Definition: Iterator.h:221
+
boost::remove_const< ItemT >::type NonConstValueType
Definition: Iterator.h:153
+
bool probeValue(NonConstValueType &value) const
Return true if this iterator is pointing to a value and return the value in value. Otherwise, return false.
Definition: Iterator.h:259
+
SetItemT ChildNodeType
Definition: Iterator.h:215
+
bool isChildNode() const
Return true if this iterator is pointing to a child node.
Definition: Iterator.h:238
+
NodeT * getParentNode() const
Return a pointer to the node (if any) over which this iterator is iterating.
Definition: Iterator.h:81
+
Index pos() const
Identical to offset.
Definition: Iterator.h:94
+
bool operator!=(const IteratorBase &other) const
Definition: Iterator.h:75
+
IteratorBase(const MaskIterT &iter, NodeT *parent)
Definition: Iterator.h:62
+
Definition: Exceptions.h:88
+ +
void operator=(const IteratorBase &other)
Definition: Iterator.h:65
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
SparseIteratorBase()
Definition: Iterator.h:156
+
boost::remove_const< NodeT >::type NonConstNodeType
Definition: Iterator.h:216
+
void getCoord(Coord &xyz) const
Return in xyz the coordinates of the item to which this iterator is pointing.
Definition: Iterator.h:125
+
void modifyValue(const ModifyOp &op) const
Apply a functor to the item to which this iterator is pointing. (Not valid for const iterators...
Definition: Iterator.h:190
+
TreeT * tree
Definition: MaskToLevelSet.h:118
+
void setChild(SetItemT *child) const
Replace with the given child node the item in the parent node's table to which this iterator is point...
Definition: Iterator.h:269
+
Base class for iterators over internal and leaf nodes.
Definition: Iterator.h:58
+
void setValue(const ItemT &value) const
Set the value of the item to which this iterator is pointing. (Not valid for const iterators...
Definition: Iterator.h:179
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/LeafManager_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/LeafManager_8h_source.html new file mode 100644 index 00000000..c27e0c41 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/LeafManager_8h_source.html @@ -0,0 +1,802 @@ + + + + + + +OpenVDB: LeafManager.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
LeafManager.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
41 
+
42 #ifndef OPENVDB_TREE_LEAFMANAGER_HAS_BEEN_INCLUDED
+
43 #define OPENVDB_TREE_LEAFMANAGER_HAS_BEEN_INCLUDED
+
44 
+
45 #include <boost/shared_ptr.hpp>
+
46 #include <boost/bind.hpp>
+
47 #include <boost/function.hpp>
+
48 #include <boost/mpl/if.hpp>
+
49 #include <boost/type_traits/is_const.hpp>
+
50 #include <boost/type_traits/is_pointer.hpp>
+
51 #include <boost/type_traits/is_same.hpp>
+
52 #include <boost/type_traits/remove_pointer.hpp>
+
53 #include <tbb/blocked_range.h>
+
54 #include <tbb/parallel_for.h>
+
55 #include <tbb/parallel_reduce.h>
+
56 #include <openvdb/Types.h>
+
57 #include "TreeIterator.h" // for CopyConstness
+
58 
+
59 namespace openvdb {
+ +
61 namespace OPENVDB_VERSION_NAME {
+
62 namespace tree {
+
63 
+
64 namespace leafmgr {
+
65 
+
67 template<typename TreeT> struct TreeTraits {
+
69  static const bool IsConstTree = false;
+
70  typedef typename TreeT::LeafIter LeafIterType;
+
71 };
+
72 template<typename TreeT> struct TreeTraits<const TreeT> {
+
73  static const bool IsConstTree = true;
+
74  typedef typename TreeT::LeafCIter LeafIterType;
+
75 };
+
77 
+
78 } // namespace leafmgr
+
79 
+
80 
+
83 template<typename ManagerT>
+ +
85 {
+
86  typedef typename ManagerT::RangeType RangeT;
+
87  typedef typename ManagerT::LeafType LeafT;
+
88  typedef typename ManagerT::BufferType BufT;
+
89 
+
90  static inline void doSwapLeafBuffer(const RangeT& r, size_t auxBufferIdx,
+
91  LeafT** leafs, BufT* bufs, size_t bufsPerLeaf)
+
92  {
+
93  for (size_t n = r.begin(), m = r.end(), N = bufsPerLeaf; n != m; ++n) {
+
94  leafs[n]->swap(bufs[n * N + auxBufferIdx]);
+
95  }
+
96  }
+
97 };
+
98 
+
99 
+
101 
+
102 
+
114 template<typename TreeT>
+ +
116 {
+
117 public:
+
118  typedef TreeT TreeType;
+
119  typedef typename TreeT::ValueType ValueType;
+
120  typedef typename TreeT::RootNodeType RootNodeType;
+
121  typedef typename TreeType::LeafNodeType NonConstLeafType;
+ +
123  typedef LeafType LeafNodeType;
+ +
125  typedef typename LeafType::Buffer NonConstBufferType;
+ +
127  typedef tbb::blocked_range<size_t> RangeType;//leaf index range
+
128  static const Index DEPTH = 2;//root + leafs
+
129 
+
130  static const bool IsConstTree = leafmgr::TreeTraits<TreeT>::IsConstTree;
+
131 
+
132  class LeafRange
+
133  {
+
134  public:
+
135  class Iterator
+
136  {
+
137  public:
+
138  Iterator(const LeafRange& range, size_t pos): mRange(range), mPos(pos)
+
139  {
+
140  assert(this->isValid());
+
141  }
+
142  Iterator& operator=(const Iterator& other)
+
143  {
+
144  mRange = other.mRange; mPos = other.mPos; return *this;
+
145  }
+
147  Iterator& operator++() { ++mPos; return *this; }
+
149  LeafType& operator*() const { return mRange.mLeafManager.leaf(mPos); }
+
151  LeafType* operator->() const { return &(this->operator*()); }
+
154  BufferType& buffer(size_t bufferIdx)
+
155  {
+
156  return mRange.mLeafManager.getBuffer(mPos, bufferIdx);
+
157  }
+
159  size_t pos() const { return mPos; }
+
161  bool isValid() const { return mPos>=mRange.mBegin && mPos<=mRange.mEnd; }
+
163  bool test() const { return mPos < mRange.mEnd; }
+
165  operator bool() const { return this->test(); }
+
167  bool empty() const { return !this->test(); }
+
168  bool operator!=(const Iterator& other) const
+
169  {
+
170  return (mPos != other.mPos) || (&mRange != &other.mRange);
+
171  }
+
172  bool operator==(const Iterator& other) const { return !(*this != other); }
+
173  const LeafRange& leafRange() const { return mRange; }
+
174 
+
175  private:
+
176  const LeafRange& mRange;
+
177  size_t mPos;
+
178  };// end Iterator
+
179 
+
180  LeafRange(size_t begin, size_t end, const LeafManager& leafManager, size_t grainSize=1)
+
181  : mEnd(end)
+
182  , mBegin(begin)
+
183  , mGrainSize(grainSize)
+
184  , mLeafManager(leafManager)
+
185  {
+
186  }
+
187 
+
188  Iterator begin() const {return Iterator(*this, mBegin);}
+
189 
+
190  Iterator end() const {return Iterator(*this, mEnd);}
+
191 
+
192  size_t size() const { return mEnd - mBegin; }
+
193 
+
194  size_t grainsize() const { return mGrainSize; }
+
195 
+
196  const LeafManager& leafManager() const { return mLeafManager; }
+
197 
+
198  bool empty() const {return !(mBegin < mEnd);}
+
199 
+
200  bool is_divisible() const {return mGrainSize < this->size();}
+
201 
+
202  LeafRange(LeafRange& r, tbb::split)
+
203  : mEnd(r.mEnd)
+
204  , mBegin(doSplit(r))
+
205  , mGrainSize(r.mGrainSize)
+
206  , mLeafManager(r.mLeafManager)
+
207  {
+
208  }
+
209 
+
210  private:
+
211  size_t mEnd, mBegin, mGrainSize;
+
212  const LeafManager& mLeafManager;
+
213 
+
214  static size_t doSplit(LeafRange& r)
+
215  {
+
216  assert(r.is_divisible());
+
217  size_t middle = r.mBegin + (r.mEnd - r.mBegin) / 2u;
+
218  r.mEnd = middle;
+
219  return middle;
+
220  }
+
221  };// end of LeafRange
+
222 
+
225  LeafManager(TreeType& tree, size_t auxBuffersPerLeaf=0, bool serial=false)
+
226  : mTree(&tree)
+
227  , mLeafCount(0)
+
228  , mAuxBufferCount(0)
+
229  , mAuxBuffersPerLeaf(auxBuffersPerLeaf)
+
230  , mLeafs(NULL)
+
231  , mAuxBuffers(NULL)
+
232  , mTask(0)
+
233  , mIsMaster(true)
+
234  {
+
235  this->rebuild(serial);
+
236  }
+
237 
+
241  LeafManager(TreeType& tree, LeafType** begin, LeafType** end,
+
242  size_t auxBuffersPerLeaf=0, bool serial=false)
+
243  : mTree(&tree)
+
244  , mLeafCount(end-begin)
+
245  , mAuxBufferCount(0)
+
246  , mAuxBuffersPerLeaf(auxBuffersPerLeaf)
+
247  , mLeafs(new LeafType*[mLeafCount])
+
248  , mAuxBuffers(NULL)
+
249  , mTask(0)
+
250  , mIsMaster(true)
+
251  {
+
252  size_t n = mLeafCount;
+
253  LeafType **target = mLeafs, **source = begin;
+
254  while (n--) *target++ = *source++;
+
255  if (auxBuffersPerLeaf) this->initAuxBuffers(serial);
+
256  }
+
257 
+
261  LeafManager(const LeafManager& other)
+
262  : mTree(other.mTree)
+
263  , mLeafCount(other.mLeafCount)
+
264  , mAuxBufferCount(other.mAuxBufferCount)
+
265  , mAuxBuffersPerLeaf(other.mAuxBuffersPerLeaf)
+
266  , mLeafs(other.mLeafs)
+
267  , mAuxBuffers(other.mAuxBuffers)
+
268  , mTask(other.mTask)
+
269  , mIsMaster(false)
+
270  {
+
271  }
+
272 
+
273  virtual ~LeafManager()
+
274  {
+
275  if (mIsMaster) {
+
276  delete [] mLeafs;
+
277  delete [] mAuxBuffers;
+
278  }
+
279  }
+
280 
+
286  void rebuild(bool serial=false)
+
287  {
+
288  this->initLeafArray();
+
289  this->initAuxBuffers(serial);
+
290  }
+
292  void rebuild(size_t auxBuffersPerLeaf, bool serial=false)
+
294  {
+
295  mAuxBuffersPerLeaf = auxBuffersPerLeaf;
+
296  this->rebuild(serial);
+
297  }
+
298  void rebuild(TreeType& tree, bool serial=false)
+
299  {
+
300  mTree = &tree;
+
301  this->rebuild(serial);
+
302  }
+
303  void rebuild(TreeType& tree, size_t auxBuffersPerLeaf, bool serial=false)
+
304  {
+
305  mTree = &tree;
+
306  mAuxBuffersPerLeaf = auxBuffersPerLeaf;
+
307  this->rebuild(serial);
+
308  }
+
310  void rebuildAuxBuffers(size_t auxBuffersPerLeaf, bool serial=false)
+
315  {
+
316  mAuxBuffersPerLeaf = auxBuffersPerLeaf;
+
317  this->initAuxBuffers(serial);
+
318  }
+
320  void removeAuxBuffers() { this->rebuildAuxBuffers(0); }
+
321 
+ +
324  {
+
325  this->removeAuxBuffers();
+
326  this->initLeafArray();
+
327  }
+
328 
+
330  size_t auxBufferCount() const { return mAuxBufferCount; }
+
332  size_t auxBuffersPerLeaf() const { return mAuxBuffersPerLeaf; }
+
333 
+
335  size_t leafCount() const { return mLeafCount; }
+
336 
+
338  const TreeType& tree() const { return *mTree; }
+
339 
+
341  TreeType& tree() { return *mTree; }
+
342 
+
344  const RootNodeType& root() const { return mTree->root(); }
+
345 
+
347  RootNodeType& root() { return mTree->root(); }
+
348 
+
350  bool isConstTree() const { return this->IsConstTree; }
+
351 
+
354  LeafType& leaf(size_t leafIdx) const { assert(leafIdx<mLeafCount); return *mLeafs[leafIdx]; }
+
355 
+
366  BufferType& getBuffer(size_t leafIdx, size_t bufferIdx) const
+
367  {
+
368  assert(leafIdx < mLeafCount);
+
369  assert(bufferIdx == 0 || bufferIdx - 1 < mAuxBuffersPerLeaf);
+
370  return bufferIdx == 0 ? mLeafs[leafIdx]->buffer()
+
371  : mAuxBuffers[leafIdx * mAuxBuffersPerLeaf + bufferIdx - 1];
+
372  }
+
373 
+
378  RangeType getRange(size_t grainsize = 1) const { return RangeType(0, mLeafCount, grainsize); }
+
379 
+
381  LeafRange leafRange(size_t grainsize = 1) const
+
382  {
+
383  return LeafRange(0, mLeafCount, *this, grainsize);
+
384  }
+
385 
+
395  bool swapLeafBuffer(size_t bufferIdx, bool serial = false)
+
396  {
+
397  if (bufferIdx == 0 || bufferIdx > mAuxBuffersPerLeaf || this->isConstTree()) return false;
+
398  mTask = boost::bind(&LeafManager::doSwapLeafBuffer, _1, _2, bufferIdx - 1);
+
399  this->cook(serial ? 0 : 512);
+
400  return true;//success
+
401  }
+
406  bool swapBuffer(size_t bufferIdx1, size_t bufferIdx2, bool serial = false)
+
407  {
+
408  const size_t b1 = std::min(bufferIdx1, bufferIdx2);
+
409  const size_t b2 = std::max(bufferIdx1, bufferIdx2);
+
410  if (b1 == b2 || b2 > mAuxBuffersPerLeaf) return false;
+
411  if (b1 == 0) {
+
412  if (this->isConstTree()) return false;
+
413  mTask = boost::bind(&LeafManager::doSwapLeafBuffer, _1, _2, b2-1);
+
414  } else {
+
415  mTask = boost::bind(&LeafManager::doSwapAuxBuffer, _1, _2, b1-1, b2-1);
+
416  }
+
417  this->cook(serial ? 0 : 512);
+
418  return true;//success
+
419  }
+
420 
+
429  bool syncAuxBuffer(size_t bufferIdx, bool serial = false)
+
430  {
+
431  if (bufferIdx == 0 || bufferIdx > mAuxBuffersPerLeaf) return false;
+
432  mTask = boost::bind(&LeafManager::doSyncAuxBuffer, _1, _2, bufferIdx - 1);
+
433  this->cook(serial ? 0 : 64);
+
434  return true;//success
+
435  }
+
436 
+
440  bool syncAllBuffers(bool serial = false)
+
441  {
+
442  switch (mAuxBuffersPerLeaf) {
+
443  case 0: return false;//nothing to do
+
444  case 1: mTask = boost::bind(&LeafManager::doSyncAllBuffers1, _1, _2); break;
+
445  case 2: mTask = boost::bind(&LeafManager::doSyncAllBuffers2, _1, _2); break;
+
446  default: mTask = boost::bind(&LeafManager::doSyncAllBuffersN, _1, _2); break;
+
447  }
+
448  this->cook(serial ? 0 : 64);
+
449  return true;//success
+
450  }
+
451 
+
514  template<typename LeafOp>
+
515  void foreach(const LeafOp& op, bool threaded = true, size_t grainSize=1)
+
516  {
+
517  LeafTransformer<LeafOp> transform(op);
+
518  transform.run(this->leafRange(grainSize), threaded);
+
519  }
+
520 
+
563  template<typename LeafOp>
+
564  void reduce(LeafOp& op, bool threaded = true, size_t grainSize=1)
+
565  {
+
566  LeafReducer<LeafOp> transform(op);
+
567  transform.run(this->leafRange(grainSize), threaded);
+
568  }
+
569 
+
570 
+
575  template<typename ArrayT>
+
576  void getNodes(ArrayT& array)
+
577  {
+
578  typedef typename ArrayT::value_type T;
+
579  BOOST_STATIC_ASSERT(boost::is_pointer<T>::value);
+
580  typedef typename boost::mpl::if_<boost::is_const<typename boost::remove_pointer<T>::type>,
+
581  const LeafType, LeafType>::type LeafT;
+
582 
+ +
584  if (boost::is_same<T, LeafT*>::value) {
+
585  array.resize(mLeafCount);
+
586  for (size_t i=0; i<mLeafCount; ++i) array[i] = reinterpret_cast<T>(mLeafs[i]);
+
587  } else {
+
588  mTree->getNodes(array);
+
589  }
+ +
591  }
+
592 
+
597  template<typename ArrayT>
+
598  void getNodes(ArrayT& array) const
+
599  {
+
600  typedef typename ArrayT::value_type T;
+
601  BOOST_STATIC_ASSERT(boost::is_pointer<T>::value);
+
602  BOOST_STATIC_ASSERT(boost::is_const<typename boost::remove_pointer<T>::type>::value);
+
603 
+ +
605  if (boost::is_same<T, const LeafType*>::value) {
+
606  array.resize(mLeafCount);
+
607  for (size_t i=0; i<mLeafCount; ++i) array[i] = reinterpret_cast<T>(mLeafs[i]);
+
608  } else {
+
609  mTree->getNodes(array);
+
610  }
+ +
612  }
+
613 
+
627  size_t getPreFixSum(size_t*& offsets, size_t& size, size_t grainSize=1) const
+
628  {
+
629  if (offsets == NULL || size < mLeafCount) {
+
630  delete [] offsets;
+
631  offsets = new size_t[mLeafCount];
+
632  size = mLeafCount;
+
633  }
+
634  size_t prefix = 0;
+
635  if ( grainSize > 0 ) {
+
636  PreFixSum tmp(this->leafRange( grainSize ), offsets, prefix);
+
637  } else {// serial
+
638  for (size_t i=0; i<mLeafCount; ++i) {
+
639  offsets[i] = prefix;
+
640  prefix += mLeafs[i]->onVoxelCount();
+
641  }
+
642  }
+
643  return prefix;
+
644  }
+
645 
+
647  // All methods below are for internal use only and should never be called directly
+
648 
+
650  void operator()(const RangeType& r) const
+
651  {
+
652  if (mTask) mTask(const_cast<LeafManager*>(this), r);
+
653  else OPENVDB_THROW(ValueError, "task is undefined");
+
654  }
+
655 
+
656  private:
+
657 
+
658  // This a simple wrapper for a c-style array so it mimics the api
+
659  // of a std container, e.g. std::vector or std::deque, and can be
+
660  // passed to Tree::getNodes().
+
661  struct MyArray {
+
662  typedef LeafType* value_type;//required by Tree::getNodes
+
663  value_type* ptr;
+
664  MyArray(value_type* array) : ptr(array) {}
+
665  void push_back(value_type leaf) { *ptr++ = leaf; }//required by Tree::getNodes
+
666  };
+
667 
+
668  void initLeafArray()
+
669  {
+
670  const size_t leafCount = mTree->leafCount();
+
671  if (leafCount != mLeafCount) {
+
672  delete [] mLeafs;
+
673  mLeafs = (leafCount == 0) ? NULL : new LeafType*[leafCount];
+
674  mLeafCount = leafCount;
+
675  }
+
676  MyArray a(mLeafs);
+
677  mTree->getNodes(a);
+
678  }
+
679 
+
680  void initAuxBuffers(bool serial)
+
681  {
+
682  const size_t auxBufferCount = mLeafCount * mAuxBuffersPerLeaf;
+
683  if (auxBufferCount != mAuxBufferCount) {
+
684  delete [] mAuxBuffers;
+
685  mAuxBuffers = (auxBufferCount == 0) ? NULL : new NonConstBufferType[auxBufferCount];
+
686  mAuxBufferCount = auxBufferCount;
+
687  }
+
688  this->syncAllBuffers(serial);
+
689  }
+
690 
+
691  void cook(size_t grainsize)
+
692  {
+
693  if (grainsize>0) {
+
694  tbb::parallel_for(this->getRange(grainsize), *this);
+
695  } else {
+
696  (*this)(this->getRange());
+
697  }
+
698  }
+
699 
+
700  void doSwapLeafBuffer(const RangeType& r, size_t auxBufferIdx)
+
701  {
+
702  LeafManagerImpl<LeafManager>::doSwapLeafBuffer(
+
703  r, auxBufferIdx, mLeafs, mAuxBuffers, mAuxBuffersPerLeaf);
+
704  }
+
705 
+
706  void doSwapAuxBuffer(const RangeType& r, size_t auxBufferIdx1, size_t auxBufferIdx2)
+
707  {
+
708  for (size_t N = mAuxBuffersPerLeaf, n = N*r.begin(), m = N*r.end(); n != m; n+=N) {
+
709  mAuxBuffers[n + auxBufferIdx1].swap(mAuxBuffers[n + auxBufferIdx2]);
+
710  }
+
711  }
+
712 
+
713  void doSyncAuxBuffer(const RangeType& r, size_t auxBufferIdx)
+
714  {
+
715  for (size_t n = r.begin(), m = r.end(), N = mAuxBuffersPerLeaf; n != m; ++n) {
+
716  mAuxBuffers[n*N + auxBufferIdx] = mLeafs[n]->buffer();
+
717  }
+
718  }
+
719 
+
720  void doSyncAllBuffers1(const RangeType& r)
+
721  {
+
722  for (size_t n = r.begin(), m = r.end(); n != m; ++n) {
+
723  mAuxBuffers[n] = mLeafs[n]->buffer();
+
724  }
+
725  }
+
726 
+
727  void doSyncAllBuffers2(const RangeType& r)
+
728  {
+
729  for (size_t n = r.begin(), m = r.end(); n != m; ++n) {
+
730  const BufferType& leafBuffer = mLeafs[n]->buffer();
+
731  mAuxBuffers[2*n ] = leafBuffer;
+
732  mAuxBuffers[2*n+1] = leafBuffer;
+
733  }
+
734  }
+
735 
+
736  void doSyncAllBuffersN(const RangeType& r)
+
737  {
+
738  for (size_t n = r.begin(), m = r.end(), N = mAuxBuffersPerLeaf; n != m; ++n) {
+
739  const BufferType& leafBuffer = mLeafs[n]->buffer();
+
740  for (size_t i=n*N, j=i+N; i!=j; ++i) mAuxBuffers[i] = leafBuffer;
+
741  }
+
742  }
+
743 
+
746  template<typename LeafOp>
+
747  struct LeafTransformer
+
748  {
+
749  LeafTransformer(const LeafOp &leafOp) : mLeafOp(leafOp)
+
750  {
+
751  }
+
752  void run(const LeafRange &range, bool threaded) const
+
753  {
+
754  threaded ? tbb::parallel_for(range, *this) : (*this)(range);
+
755  }
+
756  void operator()(const LeafRange &range) const
+
757  {
+
758  for (typename LeafRange::Iterator it = range.begin(); it; ++it) mLeafOp(*it, it.pos());
+
759  }
+
760  const LeafOp mLeafOp;
+
761  };// LeafTransformer
+
762 
+
765  template<typename LeafOp>
+
766  struct LeafReducer
+
767  {
+
768  LeafReducer(LeafOp &leafOp) : mLeafOp(&leafOp), mOwnsOp(false)
+
769  {
+
770  }
+
771  LeafReducer(const LeafReducer &other, tbb::split)
+
772  : mLeafOp(new LeafOp(*(other.mLeafOp), tbb::split())), mOwnsOp(true)
+
773  {
+
774  }
+
775  ~LeafReducer() { if (mOwnsOp) delete mLeafOp; }
+
776  void run(const LeafRange& range, bool threaded)
+
777  {
+
778  threaded ? tbb::parallel_reduce(range, *this) : (*this)(range);
+
779  }
+
780  void operator()(const LeafRange& range)
+
781  {
+
782  LeafOp &op = *mLeafOp;//local registry
+
783  for (typename LeafRange::Iterator it = range.begin(); it; ++it) op(*it, it.pos());
+
784  }
+
785  void join(const LeafReducer& other) { mLeafOp->join(*(other.mLeafOp)); }
+
786  LeafOp *mLeafOp;
+
787  const bool mOwnsOp;
+
788  };// LeafReducer
+
789 
+
790  // Helper class to compute a pre-fix sum of offsets to active voxels
+
791  struct PreFixSum
+
792  {
+
793  PreFixSum(const LeafRange& r, size_t* offsets, size_t& prefix)
+
794  : mOffsets(offsets)
+
795  {
+
796  tbb::parallel_for( r, *this);
+
797  for (size_t i=0, leafCount = r.size(); i<leafCount; ++i) {
+
798  size_t tmp = offsets[i];
+
799  offsets[i] = prefix;
+
800  prefix += tmp;
+
801  }
+
802  }
+
803  inline void operator()(const LeafRange& r) const {
+
804  for (typename LeafRange::Iterator i = r.begin(); i; ++i) {
+
805  mOffsets[i.pos()] = i->onVoxelCount();
+
806  }
+
807  }
+
808  size_t* mOffsets;
+
809  };// PreFixSum
+
810 
+
811  typedef typename boost::function<void (LeafManager*, const RangeType&)> FuncType;
+
812 
+
813  TreeType* mTree;
+
814  size_t mLeafCount, mAuxBufferCount, mAuxBuffersPerLeaf;
+
815  LeafType** mLeafs;//array of LeafNode pointers
+
816  NonConstBufferType* mAuxBuffers;//array of auxiliary buffers
+
817  FuncType mTask;
+
818  const bool mIsMaster;
+
819 };//end of LeafManager class
+
820 
+
821 
+
822 // Partial specializations of LeafManager methods for const trees
+
823 template<typename TreeT>
+
824 struct LeafManagerImpl<LeafManager<const TreeT> >
+
825 {
+ +
827  typedef typename ManagerT::RangeType RangeT;
+
828  typedef typename ManagerT::LeafType LeafT;
+
829  typedef typename ManagerT::BufferType BufT;
+
830 
+
831  static inline void doSwapLeafBuffer(const RangeT&, size_t /*auxBufferIdx*/,
+
832  LeafT**, BufT*, size_t /*bufsPerLeaf*/)
+
833  {
+
834  // Buffers can't be swapped into const trees.
+
835  }
+
836 };
+
837 
+
838 } // namespace tree
+
839 } // namespace OPENVDB_VERSION_NAME
+
840 } // namespace openvdb
+
841 
+
842 #endif // OPENVDB_TREE_LEAFMANAGER_HAS_BEEN_INCLUDED
+
843 
+
844 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
845 // All rights reserved. This software is distributed under the
+
846 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
bool swapBuffer(size_t bufferIdx1, size_t bufferIdx2, bool serial=false)
Swap any two buffers for each leaf node.
Definition: LeafManager.h:406
+
ManagerT::LeafType LeafT
Definition: LeafManager.h:87
+
void getNodes(ArrayT &array) const
Insert node pointers of the specified type into the array.
Definition: LeafManager.h:598
+
LeafRange(LeafRange &r, tbb::split)
Definition: LeafManager.h:202
+ + +
ManagerT::RangeType RangeT
Definition: LeafManager.h:827
+
virtual ~LeafManager()
Definition: LeafManager.h:273
+
size_t size() const
Definition: LeafManager.h:192
+
bool isValid() const
Return true if the position of this iterator is in a valid range.
Definition: LeafManager.h:161
+
ManagerT::RangeType RangeT
Definition: LeafManager.h:86
+
bool empty() const
Return true if this iterator is exhausted.
Definition: LeafManager.h:167
+
LeafRange leafRange(size_t grainsize=1) const
Return a TBB-compatible LeafRange.
Definition: LeafManager.h:381
+
bool is_divisible() const
Definition: LeafManager.h:200
+
BufferType & getBuffer(size_t leafIdx, size_t bufferIdx) const
Return the leaf or auxiliary buffer for the leaf node at index leafIdx. If bufferIdx is zero...
Definition: LeafManager.h:366
+
void rebuildLeafArray()
Remove the auxiliary buffers and rebuild the leaf array.
Definition: LeafManager.h:323
+
void operator()(const RangeType &r) const
Used internally by tbb::parallel_for() - never call it directly!
Definition: LeafManager.h:650
+
size_t auxBufferCount() const
Return the total number of allocated auxiliary buffers.
Definition: LeafManager.h:330
+
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
+
bool syncAuxBuffer(size_t bufferIdx, bool serial=false)
Sync up the specified auxiliary buffer with the corresponding leaf node buffer.
Definition: LeafManager.h:429
+
void rebuild(TreeType &tree, bool serial=false)
Repopulate the leaf array and delete and reallocate auxiliary buffers.
Definition: LeafManager.h:298
+
This class manages a linear array of pointers to a given tree's leaf nodes, as well as optional auxil...
Definition: LeafManager.h:115
+
Mat3< typename promote< T0, T1 >::type > operator*(const Mat3< T0 > &m0, const Mat3< T1 > &m1)
Matrix multiplication.
Definition: Mat3.h:658
+
bool isConstTree() const
Return true if the tree associated with this manager is immutable.
Definition: LeafManager.h:350
+
bool swapLeafBuffer(size_t bufferIdx, bool serial=false)
Swap each leaf node's buffer with the nth corresponding auxiliary buffer, where n = bufferIdx...
Definition: LeafManager.h:395
+
ManagerT::BufferType BufT
Definition: LeafManager.h:88
+
LeafManager< const TreeT > ManagerT
Definition: LeafManager.h:826
+
boost::remove_const< ToType >::type Type
Definition: TreeIterator.h:66
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & max(const T &a, const T &b)
Definition: Composite.h:132
+
void removeAuxBuffers()
Remove the auxiliary buffers, but don't rebuild the leaf array.
Definition: LeafManager.h:320
+
leafmgr::TreeTraits< TreeT >::LeafIterType LeafIterType
Definition: LeafManager.h:124
+
void rebuild(bool serial=false)
(Re)initialize by resizing (if necessary) and repopulating the leaf array and by deleting existing au...
Definition: LeafManager.h:286
+
LeafType::Buffer NonConstBufferType
Definition: LeafManager.h:125
+
Definition: LeafManager.h:84
+
const int size
Definition: MaskToLevelSet.h:119
+
void rebuild(TreeType &tree, size_t auxBuffersPerLeaf, bool serial=false)
Repopulate the leaf array and delete and reallocate auxiliary buffers.
Definition: LeafManager.h:303
+
Index32 Index
Definition: Types.h:58
+
bool operator==(const Iterator &other) const
Definition: LeafManager.h:172
+
const TreeType & tree() const
Return a const reference to tree associated with this manager.
Definition: LeafManager.h:338
+ +
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
Iterator(const LeafRange &range, size_t pos)
Definition: LeafManager.h:138
+
Useful traits for Tree types.
Definition: LeafManager.h:68
+
ManagerT::LeafType LeafT
Definition: LeafManager.h:828
+
static void doSwapLeafBuffer(const RangeT &r, size_t auxBufferIdx, LeafT **leafs, BufT *bufs, size_t bufsPerLeaf)
Definition: LeafManager.h:90
+
LeafType & leaf(size_t leafIdx) const
Return a pointer to the leaf node at index leafIdx in the array.
Definition: LeafManager.h:354
+
TreeT::LeafIter LeafIterType
Definition: LeafManager.h:70
+
void reduce(LeafOp &op, bool threaded=true, size_t grainSize=1)
Threaded method that applies a user-supplied functor to each leaf node in the LeafManager. Unlike foreach (defined above) this method performs a reduction on all the leaf nodes.
Definition: LeafManager.h:564
+
CopyConstness< TreeType, NonConstBufferType >::Type BufferType
Definition: LeafManager.h:126
+
LeafManager(const LeafManager &other)
Definition: LeafManager.h:261
+
bool empty() const
Definition: LeafManager.h:198
+
CopyConstness< TreeType, NonConstLeafType >::Type LeafType
Definition: LeafManager.h:122
+
LeafType LeafNodeType
Definition: LeafManager.h:123
+
LeafManager(TreeType &tree, LeafType **begin, LeafType **end, size_t auxBuffersPerLeaf=0, bool serial=false)
Constructor from a tree reference and an existing array of pointers to LeafNodes from said tree...
Definition: LeafManager.h:241
+
Definition: Exceptions.h:39
+
TreeType::LeafNodeType NonConstLeafType
Definition: LeafManager.h:121
+
tbb::blocked_range< size_t > RangeType
Definition: LeafManager.h:127
+
#define OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN
Definition: Platform.h:129
+
const RootNodeType & root() const
Return a const reference to root node associated with this manager.
Definition: LeafManager.h:344
+
bool operator!=(const Iterator &other) const
Definition: LeafManager.h:168
+
BufferType & buffer(size_t bufferIdx)
Return the nth buffer for the leaf node to which this iterator is pointing, where n = bufferIdx and n...
Definition: LeafManager.h:154
+
Iterator begin() const
Definition: LeafManager.h:188
+
bool test() const
Return true if this iterator is not yet exhausted.
Definition: LeafManager.h:163
+
TreeT::LeafCIter LeafIterType
Definition: LeafManager.h:74
+
RangeType getRange(size_t grainsize=1) const
Return a tbb::blocked_range of leaf array indices.
Definition: LeafManager.h:378
+
LeafType * operator->() const
Return a pointer to the leaf node to which this iterator is pointing.
Definition: LeafManager.h:151
+
#define OPENVDB_NO_UNREACHABLE_CODE_WARNING_END
Definition: Platform.h:130
+
LeafRange(size_t begin, size_t end, const LeafManager &leafManager, size_t grainSize=1)
Definition: LeafManager.h:180
+
Definition: Coord.h:38
+
void getNodes(ArrayT &array)
Insert pointers to nodes of the specified type into the array.
Definition: LeafManager.h:576
+ +
Definition: Exceptions.h:88
+
bool syncAllBuffers(bool serial=false)
Sync up all auxiliary buffers with their corresponding leaf node buffers.
Definition: LeafManager.h:440
+
Iterator & operator++()
Advance to the next leaf node.
Definition: LeafManager.h:147
+
TreeType & tree()
Return a reference to the tree associated with this manager.
Definition: LeafManager.h:341
+
size_t grainsize() const
Definition: LeafManager.h:194
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
LeafType & operator*() const
Return a reference to the leaf node to which this iterator is pointing.
Definition: LeafManager.h:149
+
TreeT TreeType
Definition: LeafManager.h:118
+
size_t pos() const
Return the index into the leaf array of the current leaf node.
Definition: LeafManager.h:159
+
Iterator & operator=(const Iterator &other)
Definition: LeafManager.h:142
+
RootNodeType & root()
Return a reference to the root node associated with this manager.
Definition: LeafManager.h:347
+
TreeT::RootNodeType RootNodeType
Definition: LeafManager.h:120
+
const LeafRange & leafRange() const
Definition: LeafManager.h:173
+
TreeT * tree
Definition: MaskToLevelSet.h:118
+
static void doSwapLeafBuffer(const RangeT &, size_t, LeafT **, BufT *, size_t)
Definition: LeafManager.h:831
+
const LeafManager & leafManager() const
Definition: LeafManager.h:196
+
size_t leafCount() const
Return the number of leaf nodes.
Definition: LeafManager.h:335
+
size_t auxBuffersPerLeaf() const
Return the number of auxiliary buffers per leaf node.
Definition: LeafManager.h:332
+
LeafManager(TreeType &tree, size_t auxBuffersPerLeaf=0, bool serial=false)
Constructor from a tree reference and an auxiliary buffer count (default is no auxiliary buffers) ...
Definition: LeafManager.h:225
+
ManagerT::BufferType BufT
Definition: LeafManager.h:829
+
TreeT::ValueType ValueType
Definition: LeafManager.h:119
+
size_t getPreFixSum(size_t *&offsets, size_t &size, size_t grainSize=1) const
Generate a linear array of pre-fix sums of offsets into the active voxels in the leafs. So offsets[n]+m is the offset to the mth active voxel in the nth leaf node (useful for user-managed value buffers, e.g. in tools/LevelSetAdvect.h).
Definition: LeafManager.h:627
+
Iterator end() const
Definition: LeafManager.h:190
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & min(const T &a, const T &b)
Definition: Composite.h:128
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/LeafNodeBool_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/LeafNodeBool_8h_source.html new file mode 100644 index 00000000..521f9daf --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/LeafNodeBool_8h_source.html @@ -0,0 +1,1931 @@ + + + + + + +OpenVDB: LeafNodeBool.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
LeafNodeBool.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 
+
31 #ifndef OPENVDB_TREE_LEAF_NODE_BOOL_HAS_BEEN_INCLUDED
+
32 #define OPENVDB_TREE_LEAF_NODE_BOOL_HAS_BEEN_INCLUDED
+
33 
+
34 #include <iostream>
+
35 #include <boost/shared_ptr.hpp>
+
36 #include <boost/shared_array.hpp>
+
37 #include <boost/static_assert.hpp>
+
38 #include <openvdb/Types.h>
+
39 #include <openvdb/io/Compression.h> // for io::readData(), etc.
+
40 #include <openvdb/math/Math.h> // for math::isZero()
+
41 #include <openvdb/util/NodeMasks.h>
+
42 #include "LeafNode.h"
+
43 #include "Iterator.h"
+
44 
+
45 
+
46 namespace openvdb {
+ +
48 namespace OPENVDB_VERSION_NAME {
+
49 namespace tree {
+
50 
+
53 template<Index Log2Dim>
+
54 class LeafNode<bool, Log2Dim>
+
55 {
+
56 public:
+ +
58  typedef boost::shared_ptr<LeafNodeType> Ptr;
+
59  typedef bool BuildType;
+
60  typedef bool ValueType;
+ +
62 
+
63  // These static declarations must be on separate lines to avoid VC9 compiler errors.
+
64  static const Index LOG2DIM = Log2Dim; // needed by parent nodes
+
65  static const Index TOTAL = Log2Dim; // needed by parent nodes
+
66  static const Index DIM = 1 << TOTAL; // dimension along one coordinate direction
+
67  static const Index NUM_VALUES = 1 << 3 * Log2Dim;
+
68  static const Index NUM_VOXELS = NUM_VALUES; // total number of voxels represented by this node
+
69  static const Index SIZE = NUM_VALUES;
+
70  static const Index LEVEL = 0; // level 0 = leaf
+
71 
+
74  template<typename ValueType>
+
75  struct ValueConverter { typedef LeafNode<ValueType, Log2Dim> Type; };
+
76 
+
79  template<typename OtherNodeType>
+
80  struct SameConfiguration {
+ +
82  };
+
83 
+
84 
+
85  class Buffer
+
86  {
+
87  public:
+
88  typedef typename NodeMaskType::Word WordType;
+
89  static const Index WORD_COUNT = NodeMaskType::WORD_COUNT;
+
90  Buffer() {}
+
91  Buffer(bool on) : mData(on) {}
+
92  Buffer(const NodeMaskType& other): mData(other) {}
+
93  Buffer(const Buffer& other): mData(other.mData) {}
+
94  ~Buffer() {}
+
95  void fill(bool val) { mData.set(val); }
+
96  Buffer& operator=(const Buffer& b) { if (&b != this) { mData = b.mData; } return *this; }
+
97 
+
98  const bool& getValue(Index i) const
+
99  {
+
100  assert(i < SIZE);
+
101  // We can't use the ternary operator here, otherwise Visual C++ returns
+
102  // a reference to a temporary.
+
103  if (mData.isOn(i)) return LeafNode::sOn; else return LeafNode::sOff;
+
104  }
+
105  const bool& operator[](Index i) const { return this->getValue(i); }
+
106 
+
107  bool operator==(const Buffer& other) const { return mData == other.mData; }
+
108  bool operator!=(const Buffer& other) const { return mData != other.mData; }
+
109 
+
110  void setValue(Index i, bool val) { assert(i < SIZE); mData.set(i, val); }
+
111 
+
112  void swap(Buffer& other) { if (&other != this) std::swap(mData, other.mData); }
+
113 
+
114  Index memUsage() const { return mData.memUsage(); }
+
115  static Index size() { return SIZE; }
+
116 
+
120  WordType* data()
+
121  {
+
122  return &(mData.template getWord<WordType>(0));
+
123  }
+
128  const WordType* data() const
+
129  {
+
130  return const_cast<Buffer*>(this)->data();
+
131  }
+
132 
+
133  private:
+
134  friend class ::TestLeaf;
+
135  // Allow the parent LeafNode to access this Buffer's bit mask.
+
136  friend class LeafNode;
+
137 
+
138  NodeMaskType mData;
+
139  }; // class Buffer
+
140 
+
141 
+
143  LeafNode();
+
144 
+
149  explicit LeafNode(const Coord& xyz, bool value = false, bool active = false);
+
150 
+
151 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
152  LeafNode(PartialCreate, const Coord& xyz, bool value = false, bool active = false);
+
154 #endif
+
155 
+
157  LeafNode(const LeafNode&);
+
158 
+
160  template<typename OtherValueType>
+
161  explicit LeafNode(const LeafNode<OtherValueType, Log2Dim>& other);
+
162 
+
164  template<typename ValueType>
+ +
166 
+
168  template<typename ValueType>
+
171  LeafNode(const LeafNode<ValueType, Log2Dim>& other, bool offValue, bool onValue, TopologyCopy);
+
172  template<typename ValueType>
+
173  LeafNode(const LeafNode<ValueType, Log2Dim>& other, bool background, TopologyCopy);
+
175 
+
177  ~LeafNode();
+
178 
+
179  //
+
180  // Statistics
+
181  //
+
183  static Index log2dim() { return Log2Dim; }
+
185  static Index dim() { return DIM; }
+
186  static Index size() { return SIZE; }
+
187  static Index numValues() { return SIZE; }
+
188  static Index getLevel() { return LEVEL; }
+
189  static void getNodeLog2Dims(std::vector<Index>& dims) { dims.push_back(Log2Dim); }
+
190  static Index getChildDim() { return 1; }
+
191 
+
192  static Index32 leafCount() { return 1; }
+
193  static Index32 nonLeafCount() { return 0; }
+
194 
+
196  Index64 onVoxelCount() const { return mValueMask.countOn(); }
+
198  Index64 offVoxelCount() const { return mValueMask.countOff(); }
+
199  Index64 onLeafVoxelCount() const { return onVoxelCount(); }
+
200  Index64 offLeafVoxelCount() const { return offVoxelCount(); }
+
201  static Index64 onTileCount() { return 0; }
+
202  static Index64 offTileCount() { return 0; }
+
203 
+
205  bool isEmpty() const { return mValueMask.isOff(); }
+
207  bool isDense() const { return mValueMask.isOn(); }
+
208 
+
209 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
210  bool isAllocated() const { return true; }
+
217  bool allocate() { return true; }
+
218 #endif
+
219 
+
221  Index64 memUsage() const;
+
222 
+
226  void evalActiveBoundingBox(CoordBBox& bbox, bool visitVoxels = true) const;
+
227 
+
230  CoordBBox getNodeBoundingBox() const { return CoordBBox::createCube(mOrigin, DIM); }
+
231 
+
233  void setOrigin(const Coord& origin) { mOrigin = origin; }
+
235  const Coord& origin() const { return mOrigin; }
+
237  void getOrigin(Coord& origin) const { origin = mOrigin; }
+
238  void getOrigin(Int32& x, Int32& y, Int32& z) const { mOrigin.asXYZ(x, y, z); }
+
240 
+
242  static Index coordToOffset(const Coord& xyz);
+
245  static Coord offsetToLocalCoord(Index n);
+
247  Coord offsetToGlobalCoord(Index n) const;
+
248 
+
250  std::string str() const;
+
251 
+
254  template<typename OtherType, Index OtherLog2Dim>
+
255  bool hasSameTopology(const LeafNode<OtherType, OtherLog2Dim>* other) const;
+
256 
+
258  bool operator==(const LeafNode&) const;
+
259  bool operator!=(const LeafNode&) const;
+
260 
+
261  //
+
262  // Buffer management
+
263  //
+
266  void swap(Buffer& other) { mBuffer.swap(other); }
+
267  const Buffer& buffer() const { return mBuffer; }
+
268  Buffer& buffer() { return mBuffer; }
+
269 
+
270  //
+
271  // I/O methods
+
272  //
+
274  void readTopology(std::istream&, bool fromHalf = false);
+
276  void writeTopology(std::ostream&, bool toHalf = false) const;
+
277 
+
279  void readBuffers(std::istream&, bool fromHalf = false);
+
280  void readBuffers(std::istream& is, const CoordBBox&, bool fromHalf = false);
+
282  void writeBuffers(std::ostream&, bool toHalf = false) const;
+
283 
+
284  //
+
285  // Accessor methods
+
286  //
+
288  const bool& getValue(const Coord& xyz) const;
+
290  const bool& getValue(Index offset) const;
+
291 
+
295  bool probeValue(const Coord& xyz, bool& val) const;
+
296 
+
298  static Index getValueLevel(const Coord&) { return LEVEL; }
+
299 
+
301  void setActiveState(const Coord& xyz, bool on);
+
303  void setActiveState(Index offset, bool on) { assert(offset<SIZE); mValueMask.set(offset, on); }
+
304 
+
306  void setValueOnly(const Coord& xyz, bool val);
+
308  void setValueOnly(Index offset, bool val) { assert(offset<SIZE); mBuffer.setValue(offset,val); }
+
309 
+
311  void setValueOff(const Coord& xyz) { mValueMask.setOff(this->coordToOffset(xyz)); }
+
313  void setValueOff(Index offset) { assert(offset < SIZE); mValueMask.setOff(offset); }
+
314 
+
316  void setValueOff(const Coord& xyz, bool val);
+
318  void setValueOff(Index offset, bool val);
+
319 
+
321  void setValueOn(const Coord& xyz) { mValueMask.setOn(this->coordToOffset(xyz)); }
+
323  void setValueOn(Index offset) { assert(offset < SIZE); mValueMask.setOn(offset); }
+
324 
+
326  void setValueOn(const Coord& xyz, bool val);
+
328  void setValue(const Coord& xyz, bool val) { this->setValueOn(xyz, val); }
+
330  void setValueOn(Index offset, bool val);
+
331 
+
334  template<typename ModifyOp>
+
335  void modifyValue(Index offset, const ModifyOp& op);
+
338  template<typename ModifyOp>
+
339  void modifyValue(const Coord& xyz, const ModifyOp& op);
+
340 
+
342  template<typename ModifyOp>
+
343  void modifyValueAndActiveState(const Coord& xyz, const ModifyOp& op);
+
344 
+
346  void setValuesOn() { mValueMask.setOn(); }
+
348  void setValuesOff() { mValueMask.setOff(); }
+
349 
+
351  bool isValueOn(const Coord& xyz) const { return mValueMask.isOn(this->coordToOffset(xyz)); }
+
353  bool isValueOn(Index offset) const { assert(offset < SIZE); return mValueMask.isOn(offset); }
+
354 
+
356  static bool hasActiveTiles() { return false; }
+
357 
+
359  void clip(const CoordBBox&, bool background);
+
360 
+
362  void fill(const CoordBBox& bbox, bool value, bool active = true);
+
363 
+
365  void fill(const bool& value);
+
367  void fill(const bool& value, bool active);
+
368 
+
380  template<typename DenseT>
+
381  void copyToDense(const CoordBBox& bbox, DenseT& dense) const;
+
382 
+
399  template<typename DenseT>
+
400  void copyFromDense(const CoordBBox& bbox, const DenseT& dense, bool background, bool tolerance);
+
401 
+
404  template<typename AccessorT>
+
405  const bool& getValueAndCache(const Coord& xyz, AccessorT&) const {return this->getValue(xyz);}
+
406 
+
409  template<typename AccessorT>
+
410  bool isValueOnAndCache(const Coord& xyz, AccessorT&) const { return this->isValueOn(xyz); }
+
411 
+
414  template<typename AccessorT>
+
415  void setValueAndCache(const Coord& xyz, bool val, AccessorT&) { this->setValueOn(xyz, val); }
+
416 
+
420  template<typename AccessorT>
+
421  void setValueOnlyAndCache(const Coord& xyz, bool val, AccessorT&) {this->setValueOnly(xyz,val);}
+
422 
+
425  template<typename AccessorT>
+
426  void setValueOffAndCache(const Coord& xyz, bool value, AccessorT&)
+
427  {
+
428  this->setValueOff(xyz, value);
+
429  }
+
430 
+
434  template<typename ModifyOp, typename AccessorT>
+
435  void modifyValueAndCache(const Coord& xyz, const ModifyOp& op, AccessorT&)
+
436  {
+
437  this->modifyValue(xyz, op);
+
438  }
+
439 
+
442  template<typename ModifyOp, typename AccessorT>
+
443  void modifyValueAndActiveStateAndCache(const Coord& xyz, const ModifyOp& op, AccessorT&)
+
444  {
+
445  this->modifyValueAndActiveState(xyz, op);
+
446  }
+
447 
+
451  template<typename AccessorT>
+
452  void setActiveStateAndCache(const Coord& xyz, bool on, AccessorT&)
+
453  {
+
454  this->setActiveState(xyz, on);
+
455  }
+
456 
+
460  template<typename AccessorT>
+
461  bool probeValueAndCache(const Coord& xyz, bool& val, AccessorT&) const
+
462  {
+
463  return this->probeValue(xyz, val);
+
464  }
+
465 
+
468  template<typename AccessorT>
+
469  static Index getValueLevelAndCache(const Coord&, AccessorT&) { return LEVEL; }
+
470 
+
474  const bool& getFirstValue() const { if (mValueMask.isOn(0)) return sOn; else return sOff; }
+
478  const bool& getLastValue() const { if (mValueMask.isOn(SIZE-1)) return sOn; else return sOff; }
+
479 
+
483  bool isConstant(bool& constValue, bool& state, bool tolerance = 0) const;
+
485  bool isInactive() const { return mValueMask.isOff(); }
+
486 
+
487  void resetBackground(bool oldBackground, bool newBackground);
+
488 
+
489  void negate() { mBuffer.mData.toggle(); }
+
490 
+
491  template<MergePolicy Policy>
+
492  void merge(const LeafNode& other, bool bg = false, bool otherBG = false);
+
493  template<MergePolicy Policy> void merge(bool tileValue, bool tileActive);
+
494 
+
497  void voxelizeActiveTiles(bool = true) {}
+
498 
+
505  template<typename OtherType>
+
506  void topologyUnion(const LeafNode<OtherType, Log2Dim>& other);
+
507 
+
519  template<typename OtherType>
+
520  void topologyIntersection(const LeafNode<OtherType, Log2Dim>& other, const bool&);
+
521 
+
533  template<typename OtherType>
+
534  void topologyDifference(const LeafNode<OtherType, Log2Dim>& other, const bool&);
+
535 
+
536  template<typename CombineOp>
+
537  void combine(const LeafNode& other, CombineOp& op);
+
538  template<typename CombineOp>
+
539  void combine(bool, bool valueIsActive, CombineOp& op);
+
540 
+
541  template<typename CombineOp, typename OtherType /*= bool*/>
+
542  void combine2(const LeafNode& other, const OtherType&, bool valueIsActive, CombineOp&);
+
543  template<typename CombineOp, typename OtherNodeT /*= LeafNode*/>
+
544  void combine2(bool, const OtherNodeT& other, bool valueIsActive, CombineOp&);
+
545  template<typename CombineOp, typename OtherNodeT /*= LeafNode*/>
+
546  void combine2(const LeafNode& b0, const OtherNodeT& b1, CombineOp&);
+
547 
+
552  template<typename BBoxOp> void visitActiveBBox(BBoxOp&) const;
+
553 
+
554  template<typename VisitorOp> void visit(VisitorOp&);
+
555  template<typename VisitorOp> void visit(VisitorOp&) const;
+
556 
+
557  template<typename OtherLeafNodeType, typename VisitorOp>
+
558  void visit2Node(OtherLeafNodeType& other, VisitorOp&);
+
559  template<typename OtherLeafNodeType, typename VisitorOp>
+
560  void visit2Node(OtherLeafNodeType& other, VisitorOp&) const;
+
561  template<typename IterT, typename VisitorOp>
+
562  void visit2(IterT& otherIter, VisitorOp&, bool otherIsLHS = false);
+
563  template<typename IterT, typename VisitorOp>
+
564  void visit2(IterT& otherIter, VisitorOp&, bool otherIsLHS = false) const;
+
565 
+
567  void prune(const ValueType& /*tolerance*/ = zeroVal<ValueType>()) {}
+
569  void addLeaf(LeafNode*) {}
+
570  template<typename AccessorT>
+
571  void addLeafAndCache(LeafNode*, AccessorT&) {}
+
572  template<typename NodeT>
+
573  NodeT* stealNode(const Coord&, const ValueType&, bool) { return NULL; }
+
574  template<typename NodeT>
+
575  NodeT* probeNode(const Coord&) { return NULL; }
+
576  template<typename NodeT>
+
577  const NodeT* probeConstNode(const Coord&) const { return NULL; }
+
578  template<typename ArrayT> void getNodes(ArrayT&) const {}
+
579  template<typename ArrayT> void stealNodes(ArrayT&, const ValueType&, bool) {}
+
581 
+
582  void addTile(Index level, const Coord&, bool val, bool active);
+
583  void addTile(Index offset, bool val, bool active);
+
584  template<typename AccessorT>
+
585  void addTileAndCache(Index level, const Coord&, bool val, bool active, AccessorT&);
+
586 
+
588  LeafNode* touchLeaf(const Coord&) { return this; }
+
590  template<typename AccessorT>
+
591  LeafNode* touchLeafAndCache(const Coord&, AccessorT&) { return this; }
+
592  LeafNode* probeLeaf(const Coord&) { return this; }
+
593  template<typename AccessorT>
+
594  LeafNode* probeLeafAndCache(const Coord&, AccessorT&) { return this; }
+
595  template<typename NodeT, typename AccessorT>
+
596  NodeT* probeNodeAndCache(const Coord&, AccessorT&)
+
597  {
+ +
599  if (!(boost::is_same<NodeT,LeafNode>::value)) return NULL;
+
600  return reinterpret_cast<NodeT*>(this);
+ +
602  }
+
604 
+
605  const LeafNode* probeLeaf(const Coord&) const { return this; }
+
607  template<typename AccessorT>
+
608  const LeafNode* probeLeafAndCache(const Coord&, AccessorT&) const { return this; }
+
609  const LeafNode* probeConstLeaf(const Coord&) const { return this; }
+
610  template<typename AccessorT>
+
611  const LeafNode* probeConstLeafAndCache(const Coord&, AccessorT&) const { return this; }
+
612  template<typename NodeT, typename AccessorT>
+
613  const NodeT* probeConstNodeAndCache(const Coord&, AccessorT&) const
+
614  {
+ +
616  if (!(boost::is_same<NodeT,LeafNode>::value)) return NULL;
+
617  return reinterpret_cast<const NodeT*>(this);
+ +
619  }
+
621 
+
622  //
+
623  // Iterators
+
624  //
+
625 protected:
+ + + +
629 
+
630  template<typename MaskIterT, typename NodeT, typename ValueT>
+
631  struct ValueIter:
+
632  // Derives from SparseIteratorBase, but can also be used as a dense iterator,
+
633  // if MaskIterT is a dense mask iterator type.
+
634  public SparseIteratorBase<MaskIterT, ValueIter<MaskIterT, NodeT, ValueT>, NodeT, ValueT>
+
635  {
+ +
637 
+ +
639  ValueIter(const MaskIterT& iter, NodeT* parent): BaseT(iter, parent) {}
+
640 
+
641  const bool& getItem(Index pos) const { return this->parent().getValue(pos); }
+
642  const bool& getValue() const { return this->getItem(this->pos()); }
+
643 
+
644  // Note: setItem() can't be called on const iterators.
+
645  void setItem(Index pos, bool value) const { this->parent().setValueOnly(pos, value); }
+
646  // Note: setValue() can't be called on const iterators.
+
647  void setValue(bool value) const { this->setItem(this->pos(), value); }
+
648 
+
649  // Note: modifyItem() can't be called on const iterators.
+
650  template<typename ModifyOp>
+
651  void modifyItem(Index n, const ModifyOp& op) const { this->parent().modifyValue(n, op); }
+
652  // Note: modifyValue() can't be called on const iterators.
+
653  template<typename ModifyOp>
+
654  void modifyValue(const ModifyOp& op) const { this->modifyItem(this->pos(), op); }
+
655  };
+
656 
+
658  template<typename MaskIterT, typename NodeT>
+
659  struct ChildIter:
+
660  public SparseIteratorBase<MaskIterT, ChildIter<MaskIterT, NodeT>, NodeT, bool>
+
661  {
+ +
663  ChildIter(const MaskIterT& iter, NodeT* parent): SparseIteratorBase<
+
664  MaskIterT, ChildIter<MaskIterT, NodeT>, NodeT, bool>(iter, parent) {}
+
665  };
+
666 
+
667  template<typename NodeT, typename ValueT>
+
668  struct DenseIter: public DenseIteratorBase<
+
669  MaskDenseIter, DenseIter<NodeT, ValueT>, NodeT, /*ChildT=*/void, ValueT>
+
670  {
+ + +
673 
+ +
675  DenseIter(const MaskDenseIter& iter, NodeT* parent): BaseT(iter, parent) {}
+
676 
+
677  bool getItem(Index pos, void*& child, NonConstValueT& value) const
+
678  {
+
679  value = this->parent().getValue(pos);
+
680  child = NULL;
+
681  return false; // no child
+
682  }
+
683 
+
684  // Note: setItem() can't be called on const iterators.
+
685  //void setItem(Index pos, void* child) const {}
+
686 
+
687  // Note: unsetItem() can't be called on const iterators.
+
688  void unsetItem(Index pos, const ValueT& val) const {this->parent().setValueOnly(pos, val);}
+
689  };
+
690 
+
691 public:
+
692  typedef ValueIter<MaskOnIter, LeafNode, const bool> ValueOnIter;
+
693  typedef ValueIter<MaskOnIter, const LeafNode, const bool> ValueOnCIter;
+
694  typedef ValueIter<MaskOffIter, LeafNode, const bool> ValueOffIter;
+
695  typedef ValueIter<MaskOffIter, const LeafNode, const bool> ValueOffCIter;
+
696  typedef ValueIter<MaskDenseIter, LeafNode, const bool> ValueAllIter;
+
697  typedef ValueIter<MaskDenseIter, const LeafNode, const bool> ValueAllCIter;
+
698  typedef ChildIter<MaskOnIter, LeafNode> ChildOnIter;
+
699  typedef ChildIter<MaskOnIter, const LeafNode> ChildOnCIter;
+
700  typedef ChildIter<MaskOffIter, LeafNode> ChildOffIter;
+
701  typedef ChildIter<MaskOffIter, const LeafNode> ChildOffCIter;
+
702  typedef DenseIter<LeafNode, bool> ChildAllIter;
+
703  typedef DenseIter<const LeafNode, const bool> ChildAllCIter;
+
704 
+
705  ValueOnCIter cbeginValueOn() const { return ValueOnCIter(mValueMask.beginOn(), this); }
+
706  ValueOnCIter beginValueOn() const { return ValueOnCIter(mValueMask.beginOn(), this); }
+
707  ValueOnIter beginValueOn() { return ValueOnIter(mValueMask.beginOn(), this); }
+
708  ValueOffCIter cbeginValueOff() const { return ValueOffCIter(mValueMask.beginOff(), this); }
+
709  ValueOffCIter beginValueOff() const { return ValueOffCIter(mValueMask.beginOff(), this); }
+
710  ValueOffIter beginValueOff() { return ValueOffIter(mValueMask.beginOff(), this); }
+
711  ValueAllCIter cbeginValueAll() const { return ValueAllCIter(mValueMask.beginDense(), this); }
+
712  ValueAllCIter beginValueAll() const { return ValueAllCIter(mValueMask.beginDense(), this); }
+
713  ValueAllIter beginValueAll() { return ValueAllIter(mValueMask.beginDense(), this); }
+
714 
+
715  ValueOnCIter cendValueOn() const { return ValueOnCIter(mValueMask.endOn(), this); }
+
716  ValueOnCIter endValueOn() const { return ValueOnCIter(mValueMask.endOn(), this); }
+
717  ValueOnIter endValueOn() { return ValueOnIter(mValueMask.endOn(), this); }
+
718  ValueOffCIter cendValueOff() const { return ValueOffCIter(mValueMask.endOff(), this); }
+
719  ValueOffCIter endValueOff() const { return ValueOffCIter(mValueMask.endOff(), this); }
+
720  ValueOffIter endValueOff() { return ValueOffIter(mValueMask.endOff(), this); }
+
721  ValueAllCIter cendValueAll() const { return ValueAllCIter(mValueMask.endDense(), this); }
+
722  ValueAllCIter endValueAll() const { return ValueAllCIter(mValueMask.endDense(), this); }
+
723  ValueAllIter endValueAll() { return ValueAllIter(mValueMask.endDense(), this); }
+
724 
+
725  // Note that [c]beginChildOn() and [c]beginChildOff() actually return end iterators,
+
726  // because leaf nodes have no children.
+
727  ChildOnCIter cbeginChildOn() const { return ChildOnCIter(mValueMask.endOn(), this); }
+
728  ChildOnCIter beginChildOn() const { return ChildOnCIter(mValueMask.endOn(), this); }
+
729  ChildOnIter beginChildOn() { return ChildOnIter(mValueMask.endOn(), this); }
+
730  ChildOffCIter cbeginChildOff() const { return ChildOffCIter(mValueMask.endOff(), this); }
+
731  ChildOffCIter beginChildOff() const { return ChildOffCIter(mValueMask.endOff(), this); }
+
732  ChildOffIter beginChildOff() { return ChildOffIter(mValueMask.endOff(), this); }
+
733  ChildAllCIter cbeginChildAll() const { return ChildAllCIter(mValueMask.beginDense(), this); }
+
734  ChildAllCIter beginChildAll() const { return ChildAllCIter(mValueMask.beginDense(), this); }
+
735  ChildAllIter beginChildAll() { return ChildAllIter(mValueMask.beginDense(), this); }
+
736 
+
737  ChildOnCIter cendChildOn() const { return ChildOnCIter(mValueMask.endOn(), this); }
+
738  ChildOnCIter endChildOn() const { return ChildOnCIter(mValueMask.endOn(), this); }
+
739  ChildOnIter endChildOn() { return ChildOnIter(mValueMask.endOn(), this); }
+
740  ChildOffCIter cendChildOff() const { return ChildOffCIter(mValueMask.endOff(), this); }
+
741  ChildOffCIter endChildOff() const { return ChildOffCIter(mValueMask.endOff(), this); }
+
742  ChildOffIter endChildOff() { return ChildOffIter(mValueMask.endOff(), this); }
+
743  ChildAllCIter cendChildAll() const { return ChildAllCIter(mValueMask.endDense(), this); }
+
744  ChildAllCIter endChildAll() const { return ChildAllCIter(mValueMask.endDense(), this); }
+
745  ChildAllIter endChildAll() { return ChildAllIter(mValueMask.endDense(), this); }
+
746 
+
747  //
+
748  // Mask accessors
+
749  //
+
750  bool isValueMaskOn(Index n) const { return mValueMask.isOn(n); }
+
751  bool isValueMaskOn() const { return mValueMask.isOn(); }
+
752  bool isValueMaskOff(Index n) const { return mValueMask.isOff(n); }
+
753  bool isValueMaskOff() const { return mValueMask.isOff(); }
+
754  const NodeMaskType& getValueMask() const { return mValueMask; }
+
755  const NodeMaskType& valueMask() const { return mValueMask; }
+
756  NodeMaskType& getValueMask() { return mValueMask; }
+
757  void setValueMask(const NodeMaskType& mask) { mValueMask = mask; }
+
758  bool isChildMaskOn(Index) const { return false; } // leaf nodes have no children
+
759  bool isChildMaskOff(Index) const { return true; }
+
760  bool isChildMaskOff() const { return true; }
+
761 protected:
+
762  void setValueMask(Index n, bool on) { mValueMask.set(n, on); }
+
763  void setValueMaskOn(Index n) { mValueMask.setOn(n); }
+
764  void setValueMaskOff(Index n) { mValueMask.setOff(n); }
+
765 
+
767  static void evalNodeOrigin(Coord& xyz) { xyz &= ~(DIM - 1); }
+
768 
+
769  template<typename NodeT, typename VisitorOp, typename ChildAllIterT>
+
770  static inline void doVisit(NodeT&, VisitorOp&);
+
771 
+
772  template<typename NodeT, typename OtherNodeT, typename VisitorOp,
+
773  typename ChildAllIterT, typename OtherChildAllIterT>
+
774  static inline void doVisit2Node(NodeT& self, OtherNodeT& other, VisitorOp&);
+
775 
+
776  template<typename NodeT, typename VisitorOp,
+
777  typename ChildAllIterT, typename OtherChildAllIterT>
+
778  static inline void doVisit2(NodeT& self, OtherChildAllIterT&, VisitorOp&, bool otherIsLHS);
+
779 
+
780 
+
782  NodeMaskType mValueMask;
+
784  Buffer mBuffer;
+
786  Coord mOrigin;
+
787 
+
788  // These static declarations must be on separate lines to avoid VC9 compiler errors.
+
789  static const bool sOn;
+
790  static const bool sOff;
+
791 
+
792 private:
+
795  template<typename, Index> friend class LeafNode;
+
796 
+
797  friend struct ValueIter<MaskOnIter, LeafNode, bool>;
+
798  friend struct ValueIter<MaskOffIter, LeafNode, bool>;
+
799  friend struct ValueIter<MaskDenseIter, LeafNode, bool>;
+
800  friend struct ValueIter<MaskOnIter, const LeafNode, bool>;
+
801  friend struct ValueIter<MaskOffIter, const LeafNode, bool>;
+
802  friend struct ValueIter<MaskDenseIter, const LeafNode, bool>;
+
803 
+
805  friend class IteratorBase<MaskOnIter, LeafNode>;
+
808  friend class IteratorBase<MaskOffIter, LeafNode>;
+
809  friend class IteratorBase<MaskDenseIter, LeafNode>;
+
811 
+
812 }; // class LeafNode<bool>
+
813 
+
814 
+
819 template<Index Log2Dim> const bool LeafNode<bool, Log2Dim>::sOn = true;
+
820 template<Index Log2Dim> const bool LeafNode<bool, Log2Dim>::sOff = false;
+
821 
+
822 
+
824 
+
825 
+
826 template<Index Log2Dim>
+
827 inline
+ +
829  : mOrigin(0, 0, 0)
+
830 {
+
831 }
+
832 
+
833 
+
834 template<Index Log2Dim>
+
835 inline
+
836 LeafNode<bool, Log2Dim>::LeafNode(const Coord& xyz, bool value, bool active)
+
837  : mValueMask(active)
+
838  , mBuffer(value)
+
839  , mOrigin(xyz & (~(DIM - 1)))
+
840 {
+
841 }
+
842 
+
843 
+
844 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
845 template<Index Log2Dim>
+
846 inline
+
847 LeafNode<bool, Log2Dim>::LeafNode(PartialCreate, const Coord& xyz, bool value, bool active)
+
848  : mValueMask(active)
+
849  , mBuffer(value)
+
850  , mOrigin(xyz & (~(DIM - 1)))
+
851 {
+
855 }
+
856 #endif
+
857 
+
858 
+
859 template<Index Log2Dim>
+
860 inline
+ +
862  : mValueMask(other.valueMask())
+
863  , mBuffer(other.mBuffer)
+
864  , mOrigin(other.mOrigin)
+
865 {
+
866 }
+
867 
+
868 
+
869 // Copy-construct from a leaf node with the same configuration but a different ValueType.
+
870 template<Index Log2Dim>
+
871 template<typename ValueT>
+
872 inline
+ +
874  : mValueMask(other.valueMask())
+
875  , mOrigin(other.origin())
+
876 {
+
877  struct Local {
+
879  static inline bool convertValue(const ValueT& val) { return bool(val); }
+
880  };
+
881 
+
882  for (Index i = 0; i < SIZE; ++i) {
+
883  mBuffer.setValue(i, Local::convertValue(other.mBuffer[i]));
+
884  }
+
885 }
+
886 
+
887 
+
888 template<Index Log2Dim>
+
889 template<typename ValueT>
+
890 inline
+ +
892  bool background, TopologyCopy)
+
893  : mValueMask(other.valueMask())
+
894  , mBuffer(background)
+
895  , mOrigin(other.origin())
+
896 {
+
897 }
+
898 
+
899 
+
900 template<Index Log2Dim>
+
901 template<typename ValueT>
+
902 inline
+ +
904  : mValueMask(other.valueMask())
+
905  , mBuffer(other.valueMask())// value = active state
+
906  , mOrigin(other.origin())
+
907 {
+
908 }
+
909 
+
910 
+
911 template<Index Log2Dim>
+
912 template<typename ValueT>
+
913 inline
+ +
915  bool offValue, bool onValue, TopologyCopy)
+
916  : mValueMask(other.valueMask())
+
917  , mBuffer(other.valueMask())
+
918  , mOrigin(other.origin())
+
919 {
+
920  if (offValue) { if (!onValue) mBuffer.mData.toggle(); else mBuffer.mData.setOn(); }
+
921 }
+
922 
+
923 
+
924 template<Index Log2Dim>
+
925 inline
+ +
927 {
+
928 }
+
929 
+
930 
+
932 
+
933 
+
934 template<Index Log2Dim>
+
935 inline Index64
+ +
937 {
+
938  return sizeof(mOrigin) + mValueMask.memUsage() + mBuffer.memUsage();
+
939 }
+
940 
+
941 
+
942 template<Index Log2Dim>
+
943 inline void
+
944 LeafNode<bool, Log2Dim>::evalActiveBoundingBox(CoordBBox& bbox, bool visitVoxels) const
+
945 {
+
946  CoordBBox this_bbox = this->getNodeBoundingBox();
+
947  if (bbox.isInside(this_bbox)) return;//this LeafNode is already enclosed in the bbox
+
948  if (ValueOnCIter iter = this->cbeginValueOn()) {//any active values?
+
949  if (visitVoxels) {//use voxel granularity?
+
950  this_bbox.reset();
+
951  for(; iter; ++iter) this_bbox.expand(this->offsetToLocalCoord(iter.pos()));
+
952  this_bbox.translate(this->origin());
+
953  }
+
954  bbox.expand(this_bbox);
+
955  }
+
956 }
+
957 
+
958 
+
959 template<Index Log2Dim>
+
960 template<typename OtherType, Index OtherLog2Dim>
+
961 inline bool
+ +
963 {
+
964  assert(other);
+
965  return (Log2Dim == OtherLog2Dim && mValueMask == other->getValueMask());
+
966 }
+
967 
+
968 
+
969 template<Index Log2Dim>
+
970 inline std::string
+ +
972 {
+
973  std::ostringstream ostr;
+
974  ostr << "LeafNode @" << mOrigin << ": ";
+
975  for (Index32 n = 0; n < SIZE; ++n) ostr << (mValueMask.isOn(n) ? '#' : '.');
+
976  return ostr.str();
+
977 }
+
978 
+
979 
+
981 
+
982 
+
983 template<Index Log2Dim>
+
984 inline Index
+ +
986 {
+
987  assert ((xyz[0] & (DIM-1u)) < DIM && (xyz[1] & (DIM-1u)) < DIM && (xyz[2] & (DIM-1u)) < DIM);
+
988  return ((xyz[0] & (DIM-1u)) << 2*Log2Dim)
+
989  + ((xyz[1] & (DIM-1u)) << Log2Dim)
+
990  + (xyz[2] & (DIM-1u));
+
991 }
+
992 
+
993 
+
994 template<Index Log2Dim>
+
995 inline Coord
+ +
997 {
+
998  assert(n < (1 << 3*Log2Dim));
+
999  Coord xyz;
+
1000  xyz.setX(n >> 2*Log2Dim);
+
1001  n &= ((1 << 2*Log2Dim) - 1);
+
1002  xyz.setY(n >> Log2Dim);
+
1003  xyz.setZ(n & ((1 << Log2Dim) - 1));
+
1004  return xyz;
+
1005 }
+
1006 
+
1007 
+
1008 template<Index Log2Dim>
+
1009 inline Coord
+ +
1011 {
+
1012  return (this->offsetToLocalCoord(n) + this->origin());
+
1013 }
+
1014 
+
1015 
+
1017 
+
1018 
+
1019 template<Index Log2Dim>
+
1020 inline void
+
1021 LeafNode<bool, Log2Dim>::readTopology(std::istream& is, bool /*fromHalf*/)
+
1022 {
+
1023  mValueMask.load(is);
+
1024 }
+
1025 
+
1026 
+
1027 template<Index Log2Dim>
+
1028 inline void
+
1029 LeafNode<bool, Log2Dim>::writeTopology(std::ostream& os, bool /*toHalf*/) const
+
1030 {
+
1031  mValueMask.save(os);
+
1032 }
+
1033 
+
1034 
+
1035 template<Index Log2Dim>
+
1036 inline void
+
1037 LeafNode<bool, Log2Dim>::readBuffers(std::istream& is, const CoordBBox& clipBBox, bool fromHalf)
+
1038 {
+
1039  // Boolean LeafNodes don't currently implement lazy loading.
+
1040  // Instead, load the full buffer, then clip it.
+
1041 
+
1042  this->readBuffers(is, fromHalf);
+
1043 
+
1044  // Get this tree's background value.
+
1045  bool background = false;
+
1046  if (const void* bgPtr = io::getGridBackgroundValuePtr(is)) {
+
1047  background = *static_cast<const bool*>(bgPtr);
+
1048  }
+
1049  this->clip(clipBBox, background);
+
1050 }
+
1051 
+
1052 
+
1053 template<Index Log2Dim>
+
1054 inline void
+
1055 LeafNode<bool, Log2Dim>::readBuffers(std::istream& is, bool /*fromHalf*/)
+
1056 {
+
1057  // Read in the value mask.
+
1058  mValueMask.load(is);
+
1059  // Read in the origin.
+
1060  is.read(reinterpret_cast<char*>(&mOrigin), sizeof(Coord::ValueType) * 3);
+
1061 
+ +
1063  // Read in the mask for the voxel values.
+
1064  mBuffer.mData.load(is);
+
1065  } else {
+
1066  // Older files stored one or more bool arrays.
+
1067 
+
1068  // Read in the number of buffers, which should now always be one.
+
1069  int8_t numBuffers = 0;
+
1070  is.read(reinterpret_cast<char*>(&numBuffers), sizeof(int8_t));
+
1071 
+
1072  // Read in the buffer.
+
1073  // (Note: prior to the bool leaf optimization, buffers were always compressed.)
+
1074  boost::shared_array<bool> buf(new bool[SIZE]);
+
1075  io::readData<bool>(is, buf.get(), SIZE, /*isCompressed=*/true);
+
1076 
+
1077  // Transfer values to mBuffer.
+
1078  mBuffer.mData.setOff();
+
1079  for (Index i = 0; i < SIZE; ++i) {
+
1080  if (buf[i]) mBuffer.mData.setOn(i);
+
1081  }
+
1082 
+
1083  if (numBuffers > 1) {
+
1084  // Read in and discard auxiliary buffers that were created with
+
1085  // earlier versions of the library.
+
1086  for (int i = 1; i < numBuffers; ++i) {
+
1087  io::readData<bool>(is, buf.get(), SIZE, /*isCompressed=*/true);
+
1088  }
+
1089  }
+
1090  }
+
1091 }
+
1092 
+
1093 
+
1094 template<Index Log2Dim>
+
1095 inline void
+
1096 LeafNode<bool, Log2Dim>::writeBuffers(std::ostream& os, bool /*toHalf*/) const
+
1097 {
+
1098  // Write out the value mask.
+
1099  mValueMask.save(os);
+
1100  // Write out the origin.
+
1101  os.write(reinterpret_cast<const char*>(&mOrigin), sizeof(Coord::ValueType) * 3);
+
1102  // Write out the voxel values.
+
1103  mBuffer.mData.save(os);
+
1104 }
+
1105 
+
1106 
+
1108 
+
1109 
+
1110 template<Index Log2Dim>
+
1111 inline bool
+ +
1113 {
+
1114  return mOrigin == other.mOrigin &&
+
1115  mValueMask == other.valueMask() &&
+
1116  mBuffer == other.mBuffer;
+
1117 }
+
1118 
+
1119 
+
1120 template<Index Log2Dim>
+
1121 inline bool
+ +
1123 {
+
1124  return !(this->operator==(other));
+
1125 }
+
1126 
+
1127 
+
1129 
+
1130 
+
1131 template<Index Log2Dim>
+
1132 inline bool
+
1133 LeafNode<bool, Log2Dim>::isConstant(bool& constValue, bool& state, bool tolerance) const
+
1134 {
+
1135  state = mValueMask.isOn();
+
1136 
+
1137  if (!(state || mValueMask.isOff())) return false;
+
1138 
+
1139  // Note: if tolerance is true (i.e., 1), then all boolean values compare equal.
+
1140  if (!tolerance && !(mBuffer.mData.isOn() || mBuffer.mData.isOff())) return false;
+
1141 
+
1142  constValue = mBuffer.mData.isOn();
+
1143  return true;
+
1144 }
+
1145 
+
1146 
+
1148 
+
1149 
+
1150 template<Index Log2Dim>
+
1151 inline void
+
1152 LeafNode<bool, Log2Dim>::addTile(Index /*level*/, const Coord& xyz, bool val, bool active)
+
1153 {
+
1154  this->addTile(this->coordToOffset(xyz), val, active);
+
1155 }
+
1156 
+
1157 template<Index Log2Dim>
+
1158 inline void
+
1159 LeafNode<bool, Log2Dim>::addTile(Index offset, bool val, bool active)
+
1160 {
+
1161  assert(offset < SIZE);
+
1162  this->setValueOnly(offset, val);
+
1163  this->setActiveState(offset, active);
+
1164 }
+
1165 
+
1166 template<Index Log2Dim>
+
1167 template<typename AccessorT>
+
1168 inline void
+ +
1170  bool val, bool active, AccessorT&)
+
1171 {
+
1172  this->addTile(level, xyz, val, active);
+
1173 }
+
1174 
+
1175 
+
1177 
+
1178 
+
1179 template<Index Log2Dim>
+
1180 inline const bool&
+
1181 LeafNode<bool, Log2Dim>::getValue(const Coord& xyz) const
+
1182 {
+
1183  // This *CANNOT* use operator ? because Visual C++
+
1184  if (mBuffer.mData.isOn(this->coordToOffset(xyz))) return sOn; else return sOff;
+
1185 }
+
1186 
+
1187 
+
1188 template<Index Log2Dim>
+
1189 inline const bool&
+ +
1191 {
+
1192  assert(offset < SIZE);
+
1193  // This *CANNOT* use operator ? for Windows
+
1194  if (mBuffer.mData.isOn(offset)) return sOn; else return sOff;
+
1195 }
+
1196 
+
1197 
+
1198 template<Index Log2Dim>
+
1199 inline bool
+
1200 LeafNode<bool, Log2Dim>::probeValue(const Coord& xyz, bool& val) const
+
1201 {
+
1202  const Index offset = this->coordToOffset(xyz);
+
1203  val = mBuffer.mData.isOn(offset);
+
1204  return mValueMask.isOn(offset);
+
1205 }
+
1206 
+
1207 
+
1208 template<Index Log2Dim>
+
1209 inline void
+
1210 LeafNode<bool, Log2Dim>::setValueOn(const Coord& xyz, bool val)
+
1211 {
+
1212  this->setValueOn(this->coordToOffset(xyz), val);
+
1213 }
+
1214 
+
1215 
+
1216 template<Index Log2Dim>
+
1217 inline void
+ +
1219 {
+
1220  assert(offset < SIZE);
+
1221  mValueMask.setOn(offset);
+
1222  mBuffer.mData.set(offset, val);
+
1223 }
+
1224 
+
1225 
+
1226 template<Index Log2Dim>
+
1227 inline void
+
1228 LeafNode<bool, Log2Dim>::setValueOnly(const Coord& xyz, bool val)
+
1229 {
+
1230  this->setValueOnly(this->coordToOffset(xyz), val);
+
1231 }
+
1232 
+
1233 
+
1234 template<Index Log2Dim>
+
1235 inline void
+ +
1237 {
+
1238  mValueMask.set(this->coordToOffset(xyz), on);
+
1239 }
+
1240 
+
1241 
+
1242 template<Index Log2Dim>
+
1243 inline void
+
1244 LeafNode<bool, Log2Dim>::setValueOff(const Coord& xyz, bool val)
+
1245 {
+
1246  this->setValueOff(this->coordToOffset(xyz), val);
+
1247 }
+
1248 
+
1249 
+
1250 template<Index Log2Dim>
+
1251 inline void
+ +
1253 {
+
1254  assert(offset < SIZE);
+
1255  mValueMask.setOff(offset);
+
1256  mBuffer.mData.set(offset, val);
+
1257 }
+
1258 
+
1259 
+
1260 template<Index Log2Dim>
+
1261 template<typename ModifyOp>
+
1262 inline void
+
1263 LeafNode<bool, Log2Dim>::modifyValue(Index offset, const ModifyOp& op)
+
1264 {
+
1265  bool val = mBuffer.mData.isOn(offset);
+
1266  op(val);
+
1267  mBuffer.mData.set(offset, val);
+
1268  mValueMask.setOn(offset);
+
1269 }
+
1270 
+
1271 
+
1272 template<Index Log2Dim>
+
1273 template<typename ModifyOp>
+
1274 inline void
+
1275 LeafNode<bool, Log2Dim>::modifyValue(const Coord& xyz, const ModifyOp& op)
+
1276 {
+
1277  this->modifyValue(this->coordToOffset(xyz), op);
+
1278 }
+
1279 
+
1280 
+
1281 template<Index Log2Dim>
+
1282 template<typename ModifyOp>
+
1283 inline void
+
1284 LeafNode<bool, Log2Dim>::modifyValueAndActiveState(const Coord& xyz, const ModifyOp& op)
+
1285 {
+
1286  const Index offset = this->coordToOffset(xyz);
+
1287  bool val = mBuffer.mData.isOn(offset), state = mValueMask.isOn(offset);
+
1288  op(val, state);
+
1289  mBuffer.mData.set(offset, val);
+
1290  mValueMask.set(offset, state);
+
1291 }
+
1292 
+
1293 
+
1295 
+
1296 
+
1297 template<Index Log2Dim>
+
1298 inline void
+
1299 LeafNode<bool, Log2Dim>::resetBackground(bool oldBackground, bool newBackground)
+
1300 {
+
1301  if (newBackground != oldBackground) {
+
1302  // Flip mBuffer's background bits and zero its foreground bits.
+
1303  NodeMaskType bgMask = !(mBuffer.mData | mValueMask);
+
1304  // Overwrite mBuffer's background bits, leaving its foreground bits intact.
+
1305  mBuffer.mData = (mBuffer.mData & mValueMask) | bgMask;
+
1306  }
+
1307 }
+
1308 
+
1309 
+
1311 
+
1312 
+
1313 template<Index Log2Dim>
+
1314 template<MergePolicy Policy>
+
1315 inline void
+
1316 LeafNode<bool, Log2Dim>::merge(const LeafNode& other, bool /*bg*/, bool /*otherBG*/)
+
1317 {
+ +
1319  if (Policy == MERGE_NODES) return;
+
1320  for (typename NodeMaskType::OnIterator iter = other.valueMask().beginOn(); iter; ++iter) {
+
1321  const Index n = iter.pos();
+
1322  if (mValueMask.isOff(n)) {
+
1323  mBuffer.mData.set(n, other.mBuffer.mData.isOn(n));
+
1324  mValueMask.setOn(n);
+
1325  }
+
1326  }
+ +
1328 }
+
1329 
+
1330 template<Index Log2Dim>
+
1331 template<MergePolicy Policy>
+
1332 inline void
+
1333 LeafNode<bool, Log2Dim>::merge(bool tileValue, bool tileActive)
+
1334 {
+ +
1336  if (Policy != MERGE_ACTIVE_STATES_AND_NODES) return;
+
1337  if (!tileActive) return;
+
1338  // Replace all inactive values with the active tile value.
+
1339  if (tileValue) mBuffer.mData |= !mValueMask; // -0=>1, +0=>0, -1=>1, +1=>1 (-,+ = off,on)
+
1340  else mBuffer.mData &= mValueMask; // -0=>0, +0=>0, -1=>0, +1=>1
+
1341  mValueMask.setOn();
+ +
1343 }
+
1344 
+
1345 
+
1347 
+
1348 
+
1349 template<Index Log2Dim>
+
1350 template<typename OtherType>
+
1351 inline void
+ +
1353 {
+
1354  mValueMask |= other.valueMask();
+
1355 }
+
1356 
+
1357 
+
1358 template<Index Log2Dim>
+
1359 template<typename OtherType>
+
1360 inline void
+ +
1362  const bool&)
+
1363 {
+
1364  mValueMask &= other.valueMask();
+
1365 }
+
1366 
+
1367 
+
1368 template<Index Log2Dim>
+
1369 template<typename OtherType>
+
1370 inline void
+ +
1372  const bool&)
+
1373 {
+
1374  mValueMask &= !other.valueMask();
+
1375 }
+
1376 
+
1377 
+
1379 
+
1380 
+
1381 template<Index Log2Dim>
+
1382 inline void
+
1383 LeafNode<bool, Log2Dim>::clip(const CoordBBox& clipBBox, bool background)
+
1384 {
+
1385  CoordBBox nodeBBox = this->getNodeBoundingBox();
+
1386  if (!clipBBox.hasOverlap(nodeBBox)) {
+
1387  // This node lies completely outside the clipping region. Fill it with background tiles.
+
1388  this->fill(nodeBBox, background, /*active=*/false);
+
1389  } else if (clipBBox.isInside(nodeBBox)) {
+
1390  // This node lies completely inside the clipping region. Leave it intact.
+
1391  return;
+
1392  }
+
1393 
+
1394  // This node isn't completely contained inside the clipping region.
+
1395  // Set any voxels that lie outside the region to the background value.
+
1396 
+
1397  // Construct a boolean mask that is on inside the clipping region and off outside it.
+
1398  NodeMaskType mask;
+
1399  nodeBBox.intersect(clipBBox);
+
1400  Coord xyz;
+
1401  int &x = xyz.x(), &y = xyz.y(), &z = xyz.z();
+
1402  for (x = nodeBBox.min().x(); x <= nodeBBox.max().x(); ++x) {
+
1403  for (y = nodeBBox.min().y(); y <= nodeBBox.max().y(); ++y) {
+
1404  for (z = nodeBBox.min().z(); z <= nodeBBox.max().z(); ++z) {
+
1405  mask.setOn(static_cast<Index32>(this->coordToOffset(xyz)));
+
1406  }
+
1407  }
+
1408  }
+
1409 
+
1410  // Set voxels that lie in the inactive region of the mask (i.e., outside
+
1411  // the clipping region) to the background value.
+
1412  for (MaskOffIter maskIter = mask.beginOff(); maskIter; ++maskIter) {
+
1413  this->setValueOff(maskIter.pos(), background);
+
1414  }
+
1415 }
+
1416 
+
1417 
+
1419 
+
1420 
+
1421 template<Index Log2Dim>
+
1422 inline void
+
1423 LeafNode<bool, Log2Dim>::fill(const CoordBBox& bbox, bool value, bool active)
+
1424 {
+
1425  for (Int32 x = bbox.min().x(); x <= bbox.max().x(); ++x) {
+
1426  const Index offsetX = (x & (DIM-1u))<<2*Log2Dim;
+
1427  for (Int32 y = bbox.min().y(); y <= bbox.max().y(); ++y) {
+
1428  const Index offsetXY = offsetX + ((y & (DIM-1u))<< Log2Dim);
+
1429  for (Int32 z = bbox.min().z(); z <= bbox.max().z(); ++z) {
+
1430  const Index offset = offsetXY + (z & (DIM-1u));
+
1431  mValueMask.set(offset, active);
+
1432  mBuffer.mData.set(offset, value);
+
1433  }
+
1434  }
+
1435  }
+
1436 }
+
1437 
+
1438 template<Index Log2Dim>
+
1439 inline void
+ +
1441 {
+
1442  mBuffer.fill(value);
+
1443 }
+
1444 
+
1445 template<Index Log2Dim>
+
1446 inline void
+
1447 LeafNode<bool, Log2Dim>::fill(const bool& value, bool active)
+
1448 {
+
1449  mBuffer.fill(value);
+
1450  mValueMask.set(active);
+
1451 }
+
1452 
+
1453 
+
1455 
+
1456 
+
1457 template<Index Log2Dim>
+
1458 template<typename DenseT>
+
1459 inline void
+
1460 LeafNode<bool, Log2Dim>::copyToDense(const CoordBBox& bbox, DenseT& dense) const
+
1461 {
+
1462  typedef typename DenseT::ValueType DenseValueType;
+
1463 
+
1464  const size_t xStride = dense.xStride(), yStride = dense.yStride(), zStride = dense.zStride();
+
1465  const Coord& min = dense.bbox().min();
+
1466  DenseValueType* t0 = dense.data() + zStride * (bbox.min()[2] - min[2]); // target array
+
1467  const Int32 n0 = bbox.min()[2] & (DIM-1u);
+
1468  for (Int32 x = bbox.min()[0], ex = bbox.max()[0] + 1; x < ex; ++x) {
+
1469  DenseValueType* t1 = t0 + xStride * (x - min[0]);
+
1470  const Int32 n1 = n0 + ((x & (DIM-1u)) << 2*LOG2DIM);
+
1471  for (Int32 y = bbox.min()[1], ey = bbox.max()[1] + 1; y < ey; ++y) {
+
1472  DenseValueType* t2 = t1 + yStride * (y - min[1]);
+
1473  Int32 n2 = n1 + ((y & (DIM-1u)) << LOG2DIM);
+
1474  for (Int32 z = bbox.min()[2], ez = bbox.max()[2] + 1; z < ez; ++z, t2 += zStride) {
+
1475  *t2 = DenseValueType(mBuffer.mData.isOn(n2++));
+
1476  }
+
1477  }
+
1478  }
+
1479 }
+
1480 
+
1481 
+
1482 template<Index Log2Dim>
+
1483 template<typename DenseT>
+
1484 inline void
+
1485 LeafNode<bool, Log2Dim>::copyFromDense(const CoordBBox& bbox, const DenseT& dense,
+
1486  bool background, bool tolerance)
+
1487 {
+
1488  typedef typename DenseT::ValueType DenseValueType;
+
1489  struct Local {
+
1490  inline static bool toBool(const DenseValueType& v) { return !math::isZero(v); }
+
1491  };
+
1492 
+
1493  const size_t xStride = dense.xStride(), yStride = dense.yStride(), zStride = dense.zStride();
+
1494  const Coord& min = dense.bbox().min();
+
1495  const DenseValueType* s0 = dense.data() + zStride * (bbox.min()[2] - min[2]); // source
+
1496  const Int32 n0 = bbox.min()[2] & (DIM-1u);
+
1497  for (Int32 x = bbox.min()[0], ex = bbox.max()[0] + 1; x < ex; ++x) {
+
1498  const DenseValueType* s1 = s0 + xStride * (x - min[0]);
+
1499  const Int32 n1 = n0 + ((x & (DIM-1u)) << 2*LOG2DIM);
+
1500  for (Int32 y = bbox.min()[1], ey = bbox.max()[1] + 1; y < ey; ++y) {
+
1501  const DenseValueType* s2 = s1 + yStride * (y - min[1]);
+
1502  Int32 n2 = n1 + ((y & (DIM-1u)) << LOG2DIM);
+
1503  for (Int32 z = bbox.min()[2], ez = bbox.max()[2]+1; z < ez; ++z, ++n2, s2 += zStride) {
+
1504  // Note: if tolerance is true (i.e., 1), then all boolean values compare equal.
+
1505  if (tolerance || (background == Local::toBool(*s2))) {
+
1506  mValueMask.setOff(n2);
+
1507  mBuffer.mData.set(n2, background);
+
1508  } else {
+
1509  mValueMask.setOn(n2);
+
1510  mBuffer.mData.set(n2, Local::toBool(*s2));
+
1511  }
+
1512  }
+
1513  }
+
1514  }
+
1515 }
+
1516 
+
1517 
+
1519 
+
1520 
+
1521 template<Index Log2Dim>
+
1522 template<typename CombineOp>
+
1523 inline void
+
1524 LeafNode<bool, Log2Dim>::combine(const LeafNode& other, CombineOp& op)
+
1525 {
+
1526  CombineArgs<bool> args;
+
1527  for (Index i = 0; i < SIZE; ++i) {
+
1528  bool result = false, aVal = mBuffer.mData.isOn(i), bVal = other.mBuffer.mData.isOn(i);
+
1529  op(args.setARef(aVal)
+
1530  .setAIsActive(mValueMask.isOn(i))
+
1531  .setBRef(bVal)
+
1532  .setBIsActive(other.valueMask().isOn(i))
+
1533  .setResultRef(result));
+
1534  mValueMask.set(i, args.resultIsActive());
+
1535  mBuffer.mData.set(i, result);
+
1536  }
+
1537 }
+
1538 
+
1539 
+
1540 template<Index Log2Dim>
+
1541 template<typename CombineOp>
+
1542 inline void
+
1543 LeafNode<bool, Log2Dim>::combine(bool value, bool valueIsActive, CombineOp& op)
+
1544 {
+
1545  CombineArgs<bool> args;
+
1546  args.setBRef(value).setBIsActive(valueIsActive);
+
1547  for (Index i = 0; i < SIZE; ++i) {
+
1548  bool result = false, aVal = mBuffer.mData.isOn(i);
+
1549  op(args.setARef(aVal)
+
1550  .setAIsActive(mValueMask.isOn(i))
+
1551  .setResultRef(result));
+
1552  mValueMask.set(i, args.resultIsActive());
+
1553  mBuffer.mData.set(i, result);
+
1554  }
+
1555 }
+
1556 
+
1557 
+
1559 
+
1560 
+
1561 template<Index Log2Dim>
+
1562 template<typename CombineOp, typename OtherType>
+
1563 inline void
+
1564 LeafNode<bool, Log2Dim>::combine2(const LeafNode& other, const OtherType& value,
+
1565  bool valueIsActive, CombineOp& op)
+
1566 {
+ +
1568  args.setBRef(value).setBIsActive(valueIsActive);
+
1569  for (Index i = 0; i < SIZE; ++i) {
+
1570  bool result = false, aVal = other.mBuffer.mData.isOn(i);
+
1571  op(args.setARef(aVal)
+
1572  .setAIsActive(other.valueMask().isOn(i))
+
1573  .setResultRef(result));
+
1574  mValueMask.set(i, args.resultIsActive());
+
1575  mBuffer.mData.set(i, result);
+
1576  }
+
1577 }
+
1578 
+
1579 
+
1580 template<Index Log2Dim>
+
1581 template<typename CombineOp, typename OtherNodeT>
+
1582 inline void
+
1583 LeafNode<bool, Log2Dim>::combine2(bool value, const OtherNodeT& other,
+
1584  bool valueIsActive, CombineOp& op)
+
1585 {
+ +
1587  args.setARef(value).setAIsActive(valueIsActive);
+
1588  for (Index i = 0; i < SIZE; ++i) {
+
1589  bool result = false, bVal = other.mBuffer.mData.isOn(i);
+
1590  op(args.setBRef(bVal)
+
1591  .setBIsActive(other.valueMask().isOn(i))
+
1592  .setResultRef(result));
+
1593  mValueMask.set(i, args.resultIsActive());
+
1594  mBuffer.mData.set(i, result);
+
1595  }
+
1596 }
+
1597 
+
1598 
+
1599 template<Index Log2Dim>
+
1600 template<typename CombineOp, typename OtherNodeT>
+
1601 inline void
+
1602 LeafNode<bool, Log2Dim>::combine2(const LeafNode& b0, const OtherNodeT& b1, CombineOp& op)
+
1603 {
+ +
1605  for (Index i = 0; i < SIZE; ++i) {
+
1606  // Default behavior: output voxel is active if either input voxel is active.
+
1607  mValueMask.set(i, b0.valueMask().isOn(i) || b1.valueMask().isOn(i));
+
1608 
+
1609  bool result = false, b0Val = b0.mBuffer.mData.isOn(i), b1Val = b1.mBuffer.mData.isOn(i);
+
1610  op(args.setARef(b0Val)
+
1611  .setAIsActive(b0.valueMask().isOn(i))
+
1612  .setBRef(b1Val)
+
1613  .setBIsActive(b1.valueMask().isOn(i))
+
1614  .setResultRef(result));
+
1615  mValueMask.set(i, args.resultIsActive());
+
1616  mBuffer.mData.set(i, result);
+
1617  }
+
1618 }
+
1619 
+
1620 
+
1622 
+
1623 template<Index Log2Dim>
+
1624 template<typename BBoxOp>
+
1625 inline void
+ +
1627 {
+
1628  if (op.template descent<LEVEL>()) {
+
1629  for (ValueOnCIter i=this->cbeginValueOn(); i; ++i) {
+
1630 #ifdef _MSC_VER
+
1631  op.operator()<LEVEL>(CoordBBox::createCube(i.getCoord(), 1));
+
1632 #else
+
1633  op.template operator()<LEVEL>(CoordBBox::createCube(i.getCoord(), 1));
+
1634 #endif
+
1635  }
+
1636  } else {
+
1637 #ifdef _MSC_VER
+
1638  op.operator()<LEVEL>(this->getNodeBoundingBox());
+
1639 #else
+
1640  op.template operator()<LEVEL>(this->getNodeBoundingBox());
+
1641 #endif
+
1642  }
+
1643 }
+
1644 
+
1645 
+
1646 template<Index Log2Dim>
+
1647 template<typename VisitorOp>
+
1648 inline void
+ +
1650 {
+
1651  doVisit<LeafNode, VisitorOp, ChildAllIter>(*this, op);
+
1652 }
+
1653 
+
1654 
+
1655 template<Index Log2Dim>
+
1656 template<typename VisitorOp>
+
1657 inline void
+ +
1659 {
+
1660  doVisit<const LeafNode, VisitorOp, ChildAllCIter>(*this, op);
+
1661 }
+
1662 
+
1663 
+
1664 template<Index Log2Dim>
+
1665 template<typename NodeT, typename VisitorOp, typename ChildAllIterT>
+
1666 inline void
+
1667 LeafNode<bool, Log2Dim>::doVisit(NodeT& self, VisitorOp& op)
+
1668 {
+
1669  for (ChildAllIterT iter = self.beginChildAll(); iter; ++iter) {
+
1670  op(iter);
+
1671  }
+
1672 }
+
1673 
+
1674 
+
1676 
+
1677 
+
1678 template<Index Log2Dim>
+
1679 template<typename OtherLeafNodeType, typename VisitorOp>
+
1680 inline void
+
1681 LeafNode<bool, Log2Dim>::visit2Node(OtherLeafNodeType& other, VisitorOp& op)
+
1682 {
+
1683  doVisit2Node<LeafNode, OtherLeafNodeType, VisitorOp, ChildAllIter,
+
1684  typename OtherLeafNodeType::ChildAllIter>(*this, other, op);
+
1685 }
+
1686 
+
1687 
+
1688 template<Index Log2Dim>
+
1689 template<typename OtherLeafNodeType, typename VisitorOp>
+
1690 inline void
+
1691 LeafNode<bool, Log2Dim>::visit2Node(OtherLeafNodeType& other, VisitorOp& op) const
+
1692 {
+
1693  doVisit2Node<const LeafNode, OtherLeafNodeType, VisitorOp, ChildAllCIter,
+
1694  typename OtherLeafNodeType::ChildAllCIter>(*this, other, op);
+
1695 }
+
1696 
+
1697 
+
1698 template<Index Log2Dim>
+
1699 template<
+
1700  typename NodeT,
+
1701  typename OtherNodeT,
+
1702  typename VisitorOp,
+
1703  typename ChildAllIterT,
+
1704  typename OtherChildAllIterT>
+
1705 inline void
+
1706 LeafNode<bool, Log2Dim>::doVisit2Node(NodeT& self, OtherNodeT& other, VisitorOp& op)
+
1707 {
+
1708  // Allow the two nodes to have different ValueTypes, but not different dimensions.
+
1709  BOOST_STATIC_ASSERT(OtherNodeT::SIZE == NodeT::SIZE);
+
1710  BOOST_STATIC_ASSERT(OtherNodeT::LEVEL == NodeT::LEVEL);
+
1711 
+
1712  ChildAllIterT iter = self.beginChildAll();
+
1713  OtherChildAllIterT otherIter = other.beginChildAll();
+
1714 
+
1715  for ( ; iter && otherIter; ++iter, ++otherIter) {
+
1716  op(iter, otherIter);
+
1717  }
+
1718 }
+
1719 
+
1720 
+
1722 
+
1723 
+
1724 template<Index Log2Dim>
+
1725 template<typename IterT, typename VisitorOp>
+
1726 inline void
+
1727 LeafNode<bool, Log2Dim>::visit2(IterT& otherIter, VisitorOp& op, bool otherIsLHS)
+
1728 {
+
1729  doVisit2<LeafNode, VisitorOp, ChildAllIter, IterT>(*this, otherIter, op, otherIsLHS);
+
1730 }
+
1731 
+
1732 
+
1733 template<Index Log2Dim>
+
1734 template<typename IterT, typename VisitorOp>
+
1735 inline void
+
1736 LeafNode<bool, Log2Dim>::visit2(IterT& otherIter, VisitorOp& op, bool otherIsLHS) const
+
1737 {
+
1738  doVisit2<const LeafNode, VisitorOp, ChildAllCIter, IterT>(*this, otherIter, op, otherIsLHS);
+
1739 }
+
1740 
+
1741 
+
1742 template<Index Log2Dim>
+
1743 template<
+
1744  typename NodeT,
+
1745  typename VisitorOp,
+
1746  typename ChildAllIterT,
+
1747  typename OtherChildAllIterT>
+
1748 inline void
+
1749 LeafNode<bool, Log2Dim>::doVisit2(NodeT& self, OtherChildAllIterT& otherIter,
+
1750  VisitorOp& op, bool otherIsLHS)
+
1751 {
+
1752  if (!otherIter) return;
+
1753 
+
1754  if (otherIsLHS) {
+
1755  for (ChildAllIterT iter = self.beginChildAll(); iter; ++iter) {
+
1756  op(otherIter, iter);
+
1757  }
+
1758  } else {
+
1759  for (ChildAllIterT iter = self.beginChildAll(); iter; ++iter) {
+
1760  op(iter, otherIter);
+
1761  }
+
1762  }
+
1763 }
+
1764 
+
1765 } // namespace tree
+
1766 } // namespace OPENVDB_VERSION_NAME
+
1767 } // namespace openvdb
+
1768 
+
1769 #endif // OPENVDB_TREE_LEAF_NODE_BOOL_HAS_BEEN_INCLUDED
+
1770 
+
1771 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
1772 // All rights reserved. This software is distributed under the
+
1773 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
NodeMaskType & getValueMask()
Definition: LeafNodeBool.h:756
+
bool isChildMaskOff(Index) const
Definition: LeafNodeBool.h:759
+
bool probeValueAndCache(const Coord &xyz, bool &val, AccessorT &) const
Return true if the voxel at the given coordinates is active and return the voxel value in val...
Definition: LeafNodeBool.h:461
+
bool isConstant(ValueType &constValue, bool &state, const ValueType &tolerance=zeroVal< ValueType >()) const
Definition: LeafNode.h:1754
+
Index64 onLeafVoxelCount() const
Definition: LeafNodeBool.h:199
+
bool isValueOn(const Coord &xyz) const
Return true if the voxel at the given coordinates is active.
Definition: LeafNodeBool.h:351
+
static bool hasActiveTiles()
Return false since leaf nodes never contain tiles.
Definition: LeafNodeBool.h:356
+
Index64 offVoxelCount() const
Return the number of inactive voxels.
Definition: LeafNodeBool.h:198
+ + +
static Index32 nonLeafCount()
Definition: LeafNodeBool.h:193
+
ValueOnIter endValueOn()
Definition: LeafNodeBool.h:717
+
static Index coordToOffset(const Coord &xyz)
Return the linear table offset of the given global or local coordinates.
Definition: LeafNode.h:1276
+
void setValueOffAndCache(const Coord &xyz, bool value, AccessorT &)
Change the value of the voxel at the given coordinates and mark it as inactive.
Definition: LeafNodeBool.h:426
+
void stealNodes(ArrayT &, const ValueType &, bool)
This function exists only to enable template instantiation.
Definition: LeafNodeBool.h:579
+
const Coord & origin() const
Return the grid index coordinates of this node's local origin.
Definition: LeafNode.h:475
+ +
DenseIter< LeafNode, bool > ChildAllIter
Definition: LeafNodeBool.h:702
+
ValueOffCIter cendValueOff() const
Definition: LeafNodeBool.h:718
+
static Index32 leafCount()
Definition: LeafNodeBool.h:192
+
void modifyItem(Index n, const ModifyOp &op) const
Definition: LeafNodeBool.h:651
+
bool allocate()
Allocate memory for this node's buffer if it has not already been allocated.
Definition: LeafNodeBool.h:217
+
ChildOnCIter beginChildOn() const
Definition: LeafNodeBool.h:728
+
const NodeT * probeConstNodeAndCache(const Coord &, AccessorT &) const
Return a const pointer to this node.
Definition: LeafNodeBool.h:613
+
CoordBBox getNodeBoundingBox() const
Return the bounding box of this node, i.e., the full index space spanned by this leaf node...
Definition: LeafNode.h:469
+
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
static const bool sOn
Definition: LeafNodeBool.h:789
+
void addTile(Index level, const Coord &, const ValueType &, bool)
Definition: LeafNode.h:1795
+
bool operator!=(const Buffer &other) const
Definition: LeafNodeBool.h:108
+
NodeT * stealNode(const Coord &, const ValueType &, bool)
This function exists only to enable template instantiation.
Definition: LeafNodeBool.h:573
+
void copyToDense(const GridOrTreeT &sparse, DenseT &dense, bool serial=false)
Populate a dense grid with the values of voxels from a sparse grid, where the sparse grid intersects ...
Definition: Dense.h:443
+
bool BuildType
Definition: LeafNodeBool.h:59
+
const NodeMaskType & valueMask() const
Definition: LeafNodeBool.h:755
+
void unsetItem(Index pos, const ValueT &val) const
Definition: LeafNodeBool.h:688
+
Definition: Types.h:442
+
const NodeMaskType & getValueMask() const
Definition: LeafNode.h:1109
+ +
DenseIteratorBase< MaskDenseIter, DenseIter, NodeT, void, ValueT > BaseT
Definition: LeafNodeBool.h:671
+
bool operator==(const LeafNode &other) const
Check for buffer, state and origin equivalence.
Definition: LeafNode.h:1707
+
Coord offsetToGlobalCoord(Index n) const
Return the global coordinates for a linear table offset.
Definition: LeafNode.h:1300
+
void getOrigin(Coord &origin) const
Return the grid index coordinates of this node's local origin.
Definition: LeafNodeBool.h:237
+ +
static Index size()
Definition: LeafNodeBool.h:186
+
void load(std::istream &is)
Definition: NodeMasks.h:555
+
void setValueMaskOff(Index n)
Definition: LeafNodeBool.h:764
+
void setValueOn(const Coord &xyz)
Mark the voxel at the given coordinates as active but don't change its value.
Definition: LeafNode.h:714
+
void visit(VisitorOp &)
Definition: LeafNode.h:2071
+
static Coord offsetToLocalCoord(Index n)
Return the local coordinates for a linear table offset, where offset 0 has coordinates (0...
Definition: LeafNode.h:1286
+
bool isValueMaskOn(Index n) const
Definition: LeafNodeBool.h:750
+
ChildIter(const MaskIterT &iter, NodeT *parent)
Definition: LeafNodeBool.h:663
+
ChildOnCIter endChildOn() const
Definition: LeafNodeBool.h:738
+
void setValueMaskOn(Index n)
Definition: LeafNodeBool.h:763
+
CombineArgs & setARef(const AValueType &a)
Redirect the A value to a new external source.
Definition: Types.h:365
+
void setValueOnly(Index offset, bool val)
Set the value of the voxel at the given offset but don't change its active state. ...
Definition: LeafNodeBool.h:308
+
void topologyDifference(const LeafNode< OtherType, Log2Dim > &other, const ValueType &)
Difference this node's set of active values with the active values of the other node, whose ValueType may be different. So a resulting voxel will be active only if the original voxel is active in this LeafNode and inactive in the other LeafNode.
Definition: LeafNode.h:1917
+
static void getNodeLog2Dims(std::vector< Index > &dims)
Definition: LeafNodeBool.h:189
+
const bool & getFirstValue() const
Return a const reference to the first entry in the buffer.
Definition: LeafNodeBool.h:474
+
static const bool sOff
Definition: LeafNodeBool.h:790
+
ChildOnCIter cendChildOn() const
Definition: LeafNodeBool.h:737
+
void setItem(Index pos, bool value) const
Definition: LeafNodeBool.h:645
+
void setValueOnlyAndCache(const Coord &xyz, bool val, AccessorT &)
Change the value of the voxel at the given coordinates but preserve its state.
Definition: LeafNodeBool.h:421
+
bool isZero(const Type &x)
Return true if x is exactly equal to zero.
Definition: Math.h:324
+
ValueOnCIter endValueOn() const
Definition: LeafNodeBool.h:716
+
bool isValueMaskOff() const
Definition: LeafNodeBool.h:753
+
void modifyValue(Index offset, const ModifyOp &op)
Apply a functor to the value of the voxel at the given offset and mark the voxel as active...
Definition: LeafNode.h:732
+
void readBuffers(std::istream &is, bool fromHalf=false)
Read buffers from a stream.
Definition: LeafNode.h:1598
+
Definition: PointIndexGrid.h:68
+
DenseIter< const LeafNode, const ValueType, ChildAll > ChildAllCIter
Definition: LeafNode.h:592
+
static Index dim()
Return the number of voxels in each dimension.
Definition: LeafNodeBool.h:185
+
const NodeMaskType & getValueMask() const
Definition: LeafNodeBool.h:754
+
bool operator!=(const LeafNode &other) const
Definition: LeafNode.h:498
+
ChildAllCIter endChildAll() const
Definition: LeafNodeBool.h:744
+
static Index64 onTileCount()
Definition: LeafNodeBool.h:201
+
void visitActiveBBox(BBoxOp &) const
Calls the templated functor BBoxOp with bounding box information. An additional level argument is pro...
Definition: LeafNode.h:2048
+
ValueIter< MaskOnIter, LeafNode, const bool > ValueOnIter
Definition: LeafNodeBool.h:692
+
util::NodeMask< Log2Dim > NodeMaskType
Definition: LeafNodeBool.h:61
+
void setValueAndCache(const Coord &xyz, bool val, AccessorT &)
Change the value of the voxel at the given coordinates and mark it as active.
Definition: LeafNodeBool.h:415
+
ChildOnCIter cbeginChildOn() const
Definition: LeafNodeBool.h:727
+
OPENVDB_API const void * getGridBackgroundValuePtr(std::ios_base &)
Return a pointer to the background value of the grid currently being read from or written to the give...
+
void setActiveStateAndCache(const Coord &xyz, bool on, AccessorT &)
Set the active state of the voxel at the given coordinates without changing its value.
Definition: LeafNodeBool.h:452
+
NodeMaskType::DenseIterator MaskDenseIter
Definition: LeafNodeBool.h:628
+
static Index getChildDim()
Definition: LeafNodeBool.h:190
+
Index memUsage() const
Return the memory footprint of this buffer in bytes.
Definition: LeafNode.h:251
+
const bool & getValue(Index i) const
Definition: LeafNodeBool.h:98
+
NodeT * probeNode(const Coord &)
This function exists only to enable template instantiation.
Definition: LeafNodeBool.h:575
+
ValueAllIter endValueAll()
Definition: LeafNodeBool.h:723
+
ValueAllCIter cbeginValueAll() const
Definition: LeafNodeBool.h:711
+
void setValue(Index i, const ValueType &val)
Set the i'th value of this buffer to the specified value.
Definition: LeafNode.h:186
+
const WordType * data() const
Definition: LeafNodeBool.h:128
+
void copyFromDense(const DenseT &dense, GridOrTreeT &sparse, const typename GridOrTreeT::ValueType &tolerance, bool serial=false)
Populate a sparse grid with the values of all of the voxels of a dense grid.
Definition: Dense.h:590
+
boost::shared_ptr< LeafNodeType > Ptr
Definition: LeafNodeBool.h:58
+
ValueType * mData
Definition: LeafNode.h:361
+
DenseIter< const LeafNode, const bool > ChildAllCIter
Definition: LeafNodeBool.h:703
+
static Index numValues()
Definition: LeafNodeBool.h:187
+
OffIterator beginOff() const
Definition: NodeMasks.h:351
+
LeafNode< bool, Log2Dim > LeafNodeType
Definition: LeafNodeBool.h:57
+
void resetBackground(const ValueType &oldBackground, const ValueType &newBackground)
Replace inactive occurrences of oldBackground with newBackground, and inactive occurrences of -oldBac...
Definition: LeafNode.h:1824
+
Index32 Index
Definition: Types.h:58
+
ValueIter< MaskDenseIter, LeafNode, const bool > ValueAllIter
Definition: LeafNodeBool.h:696
+
ChildOffCIter beginChildOff() const
Definition: LeafNodeBool.h:731
+
NodeT * probeNodeAndCache(const Coord &, AccessorT &)
Return a pointer to this node.
Definition: LeafNodeBool.h:596
+
ChildAllCIter beginChildAll() const
Definition: LeafNode.h:623
+
ChildIter< MaskOnIter, const LeafNode > ChildOnCIter
Definition: LeafNodeBool.h:699
+
ValueAllCIter endValueAll() const
Definition: LeafNodeBool.h:722
+
bool hasSameTopology(const LeafNode< OtherType, OtherLog2Dim > *other) const
Return true if the given node (which may have a different ValueType than this node) has the same acti...
Definition: LeafNode.h:1745
+
int32_t Int32
Definition: Types.h:60
+
ChildAllIter beginChildAll()
Definition: LeafNodeBool.h:735
+
bool isValueOn(Index offset) const
Return true if the voxel at the given offset is active.
Definition: LeafNodeBool.h:353
+
void combine2(const LeafNode &other, const OtherType &, bool valueIsActive, CombineOp &)
Definition: LeafNode.h:1984
+
uint64_t Index64
Definition: Types.h:57
+
void fill(const ValueType &val)
Populate this buffer with a constant value.
Definition: LeafNode.h:171
+
ChildOffCIter cendChildOff() const
Definition: LeafNodeBool.h:740
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
OPENVDB_STATIC_SPECIALIZATION GridType::Ptr clip(const GridType &grid, const BBoxd &)
Clip the given grid against a world-space bounding box and return a new grid containing the result...
Definition: Clip.h:356
+
ValueOnCIter cendValueOn() const
Definition: LeafNodeBool.h:715
+
bool getItem(Index pos, void *&child, NonConstValueT &value) const
Definition: LeafNodeBool.h:677
+
bool isOn(Index32 n) const
Return true if the nth bit is on.
Definition: NodeMasks.h:499
+
WordType * data()
Definition: LeafNodeBool.h:120
+ +
NodeMaskType::Word WordType
Definition: LeafNodeBool.h:88
+
void clip(const CoordBBox &, const ValueType &background)
Set all voxels that lie outside the given axis-aligned box to the background.
Definition: LeafNode.h:1387
+
const bool & getValue() const
Definition: LeafNodeBool.h:642
+
Buffer mBuffer
Bitmask representing the values of voxels.
Definition: LeafNodeBool.h:784
+
void fill(bool val)
Definition: LeafNodeBool.h:95
+
LeafNode * touchLeafAndCache(const Coord &, AccessorT &)
Return a pointer to this node.
Definition: LeafNodeBool.h:591
+
void swap(Buffer &other)
Definition: LeafNodeBool.h:112
+
void setValuesOff()
Mark all voxels as inactive but don't change their values.
Definition: LeafNodeBool.h:348
+
Index64 onVoxelCount() const
Return the number of active voxels.
Definition: LeafNodeBool.h:196
+
bool isValueMaskOff(Index n) const
Definition: LeafNodeBool.h:752
+
Templated block class to hold specific data types and a fixed number of values determined by Log2Dim...
Definition: LeafNode.h:65
+
void visit2Node(OtherLeafNodeType &other, VisitorOp &)
Definition: LeafNode.h:2103
+
ValueOffIter endValueOff()
Definition: LeafNodeBool.h:720
+
void setActiveState(const Coord &xyz, bool on)
Set the active state of the voxel at the given coordinates but don't change its value.
Definition: LeafNode.h:1361
+
OPENVDB_API uint32_t getFormatVersion(std::ios_base &)
Return the file format version number associated with the given input stream.
+
CoordBBox getNodeBoundingBox() const
Return the bounding box of this node, i.e., the full index space spanned by this leaf node...
Definition: LeafNodeBool.h:230
+
ValueAllCIter beginValueAll() const
Definition: LeafNodeBool.h:712
+
Bit mask for the internal and leaf nodes of VDB. This is a 64-bit implementation. ...
Definition: NodeMasks.h:304
+
void addTileAndCache(Index, const Coord &, const ValueType &, bool, AccessorT &)
Definition: LeafNode.h:1812
+
~LeafNode()
Destructor.
Definition: LeafNode.h:1256
+
const bool & getLastValue() const
Return a const reference to the last entry in the buffer.
Definition: LeafNodeBool.h:478
+
bool isInactive() const
Return true if all of this node's values are inactive.
Definition: LeafNodeBool.h:485
+
void setValue(bool value) const
Definition: LeafNodeBool.h:647
+
NodeMaskType::OnIterator MaskOnIter
Definition: LeafNodeBool.h:626
+
void readTopology(std::istream &is, bool fromHalf=false)
Read in just the topology.
Definition: LeafNode.h:1536
+
Definition: Exceptions.h:39
+
void topologyUnion(const LeafNode< OtherType, Log2Dim > &other)
Union this node's set of active values with the active values of the other node, whose ValueType may ...
Definition: LeafNode.h:1900
+
uint32_t Index32
Definition: Types.h:56
+
#define OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN
Definition: Platform.h:129
+
std::string str() const
Return a string representation of this node.
Definition: LeafNode.h:1263
+
ChildIter< MaskOnIter, LeafNode > ChildOnIter
Definition: LeafNodeBool.h:698
+
ValueIter< MaskOnIter, const LeafNode, const bool > ValueOnCIter
Definition: LeafNodeBool.h:693
+
const NodeT * probeConstNode(const Coord &) const
This function exists only to enable template instantiation.
Definition: LeafNodeBool.h:577
+
bool ValueType
Definition: LeafNodeBool.h:60
+
Index memUsage() const
Definition: LeafNodeBool.h:114
+
void getOrigin(Int32 &x, Int32 &y, Int32 &z) const
Return the grid index coordinates of this node's local origin.
Definition: LeafNodeBool.h:238
+
Index64 Word
Definition: NodeMasks.h:313
+
static Index64 offTileCount()
Definition: LeafNodeBool.h:202
+
Base class for dense iterators over internal and leaf nodes.
Definition: Iterator.h:211
+
static Index size()
Definition: LeafNodeBool.h:115
+
bool isDense() const
Return true if this node only contains active voxels.
Definition: LeafNodeBool.h:207
+
Base class for sparse iterators over internal and leaf nodes.
Definition: Iterator.h:148
+
const ValueType & getValue(const Coord &xyz) const
Return the value of the voxel at the given coordinates.
Definition: LeafNode.h:1311
+
boost::remove_const< UnsetItemT >::type NonConstValueType
Definition: Iterator.h:217
+
static Index getLevel()
Definition: LeafNodeBool.h:188
+
void set(Index32 n, bool On)
Set the nth bit to the specified state.
Definition: NodeMasks.h:459
+
ValueIter< MaskOffIter, LeafNode, const bool > ValueOffIter
Definition: LeafNodeBool.h:694
+
static void doVisit2(NodeT &self, OtherChildAllIterT &, VisitorOp &, bool otherIsLHS)
Definition: LeafNode.h:2173
+
ValueAllCIter cendValueAll() const
Definition: LeafNodeBool.h:721
+
void addLeaf(LeafNode *)
This function exists only to enable template instantiation.
Definition: LeafNodeBool.h:569
+
ChildAllCIter cendChildAll() const
Definition: LeafNodeBool.h:743
+
bool isOff(Index32 n) const
Return true if the nth bit is off.
Definition: NodeMasks.h:505
+
ValueOnCIter cbeginValueOn() const
Definition: LeafNode.h:594
+
void setValuesOn()
Mark all voxels as active but don't change their values.
Definition: LeafNodeBool.h:346
+
LeafNode * probeLeafAndCache(const Coord &, AccessorT &)
Return a pointer to this node.
Definition: LeafNodeBool.h:594
+ +
void negate()
Definition: LeafNodeBool.h:489
+
Buffer & operator=(const Buffer &b)
Definition: LeafNodeBool.h:96
+
static Index32 memUsage()
Return the byte size of this NodeMask.
Definition: NodeMasks.h:438
+
Definition: NodeMasks.h:267
+
bool probeValue(const Coord &xyz, ValueType &val) const
Return true if the voxel at the given coordinates is active.
Definition: LeafNode.h:1327
+
static const Index SIZE
Definition: LeafNode.h:80
+
ChildOffCIter cbeginChildOff() const
Definition: LeafNodeBool.h:730
+
void setValueMask(const NodeMaskType &mask)
Definition: LeafNodeBool.h:757
+
ChildAllIter endChildAll()
Definition: LeafNodeBool.h:745
+
const bool & operator[](Index i) const
Definition: LeafNodeBool.h:105
+
void setOn(Index32 n)
Set the nth bit on.
Definition: NodeMasks.h:449
+
ValueOffCIter cbeginValueOff() const
Definition: LeafNodeBool.h:708
+
void combine(const LeafNode &other, CombineOp &op)
Definition: LeafNode.h:1942
+
void setOrigin(const Coord &origin)
Set the grid index coordinates of this node's local origin.
Definition: LeafNodeBool.h:233
+
bool isEmpty() const
Return true if this node has no active voxels.
Definition: LeafNodeBool.h:205
+
ChildAllCIter cbeginChildAll() const
Definition: LeafNodeBool.h:733
+
void setValueOff(const Coord &xyz)
Mark the voxel at the given coordinates as inactive but don't change its value.
Definition: LeafNodeBool.h:311
+
Index64 memUsage() const
Return the memory in bytes occupied by this node.
Definition: LeafNode.h:1717
+
ChildIter< MaskOffIter, const LeafNode > ChildOffCIter
Definition: LeafNodeBool.h:701
+
ChildOffIter endChildOff()
Definition: LeafNodeBool.h:742
+
void copyToDense(const CoordBBox &bbox, DenseT &dense) const
Copy into a dense grid the values of the voxels that lie within a given bounding box.
Definition: LeafNode.h:1468
+
Buffer(const NodeMaskType &other)
Definition: LeafNodeBool.h:92
+
void modifyValue(const ModifyOp &op) const
Definition: LeafNodeBool.h:654
+
static void doVisit2Node(NodeT &self, OtherNodeT &other, VisitorOp &)
Definition: LeafNode.h:2128
+
ValueOnCIter cbeginValueOn() const
Definition: LeafNodeBool.h:705
+
bool operator==(const Vec3< T0 > &v0, const Vec3< T1 > &v1)
Equality operator, does exact floating point comparisons.
Definition: Vec3.h:450
+
LeafNode()
Default constructor.
Definition: LeafNode.h:1170
+
ValueOffIter beginValueOff()
Definition: LeafNodeBool.h:710
+
ValueIter(const MaskIterT &iter, NodeT *parent)
Definition: LeafNodeBool.h:639
+
void modifyValueAndCache(const Coord &xyz, const ModifyOp &op, AccessorT &)
Apply a functor to the value of the voxel at the given coordinates and mark the voxel as active...
Definition: LeafNodeBool.h:435
+
Buffer(bool on)
Definition: LeafNodeBool.h:91
+
#define OPENVDB_NO_UNREACHABLE_CODE_WARNING_END
Definition: Platform.h:130
+
ValueOffCIter endValueOff() const
Definition: LeafNodeBool.h:719
+
ChildAllCIter beginChildAll() const
Definition: LeafNodeBool.h:734
+
OnIterator beginOn() const
Definition: NodeMasks.h:349
+
BaseT::NonConstValueType NonConstValueT
Definition: LeafNodeBool.h:672
+
CombineArgs & setBRef(const BValueType &b)
Redirect the B value to a new external source.
Definition: Types.h:367
+
void setValueOnly(const Coord &xyz, const ValueType &val)
Set the value of the voxel at the given coordinates but don't change its active state.
Definition: LeafNode.h:1369
+
ChildOnIter endChildOn()
Definition: LeafNodeBool.h:739
+
static const Index LOG2DIM
Definition: LeafNode.h:75
+ +
void voxelizeActiveTiles(bool=true)
No-op.
Definition: LeafNodeBool.h:497
+
void setOff(Index32 n)
Set the nth bit off.
Definition: NodeMasks.h:454
+
LeafNode specialization for values of type bool that stores both the active states and the values of ...
Definition: LeafNodeBool.h:54
+
bool isValueOnAndCache(const Coord &xyz, AccessorT &) const
Return true if the voxel at the given coordinates is active.
Definition: LeafNodeBool.h:410
+
void evalActiveBoundingBox(CoordBBox &bbox, bool visitVoxels=true) const
Definition: LeafNode.h:1727
+
Index64 offLeafVoxelCount() const
Definition: LeafNodeBool.h:200
+
ChildOnIter beginChildOn()
Definition: LeafNodeBool.h:729
+
bool isChildMaskOff() const
Definition: LeafNodeBool.h:760
+
const NodeMaskType & valueMask() const
Definition: LeafNode.h:1111
+
DenseIter(const MaskDenseIter &iter, NodeT *parent)
Definition: LeafNodeBool.h:675
+
DenseIter< LeafNode, ValueType, ChildAll > ChildAllIter
Definition: LeafNode.h:591
+
void modifyValueAndActiveStateAndCache(const Coord &xyz, const ModifyOp &op, AccessorT &)
Definition: LeafNodeBool.h:443
+ +
NodeMaskType::OffIterator MaskOffIter
Definition: LeafNodeBool.h:627
+
Buffer(const Buffer &other)
Definition: LeafNodeBool.h:93
+
bool operator!=(const Vec3< T0 > &v0, const Vec3< T1 > &v1)
Inequality operator, does exact floating point comparisons.
Definition: Vec3.h:458
+
void prune(TreeT &tree, typename TreeT::ValueType tolerance=zeroVal< typename TreeT::ValueType >(), bool threaded=true, size_t grainSize=1)
Reduce the memory footprint of a tree by replacing with tiles any nodes whose values are all the same...
Definition: Prune.h:347
+
void addLeafAndCache(LeafNode *, AccessorT &)
This function exists only to enable template instantiation.
Definition: LeafNodeBool.h:571
+
void copyFromDense(const CoordBBox &bbox, const DenseT &dense, const ValueType &background, const ValueType &tolerance)
Copy from a dense grid into this node the values of the voxels that lie within a given bounding box...
Definition: LeafNode.h:1497
+
const bool & getValueAndCache(const Coord &xyz, AccessorT &) const
Return the value of the voxel at the given coordinates.
Definition: LeafNodeBool.h:405
+
void setActiveState(Index offset, bool on)
Set the active state of the voxel at the given offset but don't change its value. ...
Definition: LeafNodeBool.h:303
+
void setValueOn(Index offset)
Mark the voxel at the given offset as active but don't change its value.
Definition: LeafNodeBool.h:323
+
bool isChildMaskOn(Index) const
Definition: LeafNodeBool.h:758
+
ValueOnIter beginValueOn()
Definition: LeafNodeBool.h:707
+
SparseIteratorBase< MaskIterT, ValueIter, NodeT, ValueT > BaseT
Definition: LeafNodeBool.h:636
+ +
Definition: NodeMasks.h:205
+
ValueOnCIter beginValueOn() const
Definition: LeafNodeBool.h:706
+
Definition: NodeMasks.h:236
+ +
bool operator==(const Buffer &other) const
Definition: LeafNodeBool.h:107
+
void setValueOn(const Coord &xyz)
Mark the voxel at the given coordinates as active but don't change its value.
Definition: LeafNodeBool.h:321
+
ChildIter< MaskOffIter, LeafNode > ChildOffIter
Definition: LeafNodeBool.h:700
+
LeafNode * probeLeaf(const Coord &)
Return a pointer to this node.
Definition: LeafNodeBool.h:592
+
Definition: Types.h:444
+
static void doVisit(NodeT &, VisitorOp &)
Definition: LeafNode.h:2089
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
void setValueOff(Index offset)
Mark the voxel at the given offset as inactive but don't change its value.
Definition: LeafNodeBool.h:313
+
Buffer & buffer()
Definition: LeafNodeBool.h:268
+
void topologyIntersection(const LeafNode< OtherType, Log2Dim > &other, const ValueType &)
Intersect this node's set of active values with the active values of the other node, whose ValueType may be different. So a resulting voxel will be active only if both of the original voxels were active.
Definition: LeafNode.h:1908
+
void save(std::ostream &os) const
Definition: NodeMasks.h:551
+
void setValue(const Coord &xyz, bool val)
Set the value of the voxel at the given coordinates and mark the voxel as active. ...
Definition: LeafNodeBool.h:328
+
static void evalNodeOrigin(Coord &xyz)
Compute the origin of the leaf node that contains the voxel with the given coordinates.
Definition: LeafNodeBool.h:767
+
void merge(const LeafNode &)
Definition: LeafNode.h:1847
+
void setValue(Index i, bool val)
Definition: LeafNodeBool.h:110
+
ValueIter< MaskOffIter, const LeafNode, const bool > ValueOffCIter
Definition: LeafNodeBool.h:695
+
void modifyValueAndActiveState(const Coord &xyz, const ModifyOp &op)
Apply a functor to the voxel at the given coordinates.
Definition: LeafNode.h:749
+
LeafNode< ValueType, Log2Dim > Type
Definition: LeafNodeBool.h:75
+
ValueIter< MaskDenseIter, const LeafNode, const bool > ValueAllCIter
Definition: LeafNodeBool.h:697
+
Definition: Types.h:266
+
bool isValueMaskOn() const
Definition: LeafNodeBool.h:751
+
TreeT * tree
Definition: MaskToLevelSet.h:118
+
Coord mOrigin
Global grid index coordinates (x,y,z) of the local origin of this node.
Definition: LeafNodeBool.h:786
+
void visit2(IterT &otherIter, VisitorOp &, bool otherIsLHS=false)
Definition: LeafNode.h:2149
+
void fill(const CoordBBox &bbox, const ValueType &, bool active=true)
Set all voxels within an axis-aligned box to the specified value and active state.
Definition: LeafNode.h:1427
+
const Buffer & buffer() const
Definition: LeafNodeBool.h:267
+
void setValueOff(const Coord &xyz)
Mark the voxel at the given coordinates as inactive but don't change its value.
Definition: LeafNode.h:704
+
ValueOffCIter beginValueOff() const
Definition: LeafNodeBool.h:709
+
static Index log2dim()
Return log2 of the size of the buffer storage.
Definition: LeafNodeBool.h:183
+
ChildOffIter beginChildOff()
Definition: LeafNodeBool.h:732
+
void swap(Buffer &other)
Exchange this node's data buffer with the given data buffer without changing the active states of the...
Definition: LeafNodeBool.h:266
+
NodeMaskType mValueMask
Bitmask that determines which voxels are active.
Definition: LeafNodeBool.h:782
+
void writeTopology(std::ostream &os, bool toHalf=false) const
Write out just the topology.
Definition: LeafNode.h:1544
+
This struct collects both input and output arguments to "grid combiner" functors used with the tree::...
Definition: Types.h:312
+
bool resultIsActive() const
Definition: Types.h:376
+
void writeBuffers(std::ostream &os, bool toHalf=false) const
Write buffers to a stream.
Definition: LeafNode.h:1690
+
const LeafNode * probeLeafAndCache(const Coord &, AccessorT &) const
Return a const pointer to this node.
Definition: LeafNodeBool.h:608
+
ChildOffCIter endChildOff() const
Definition: LeafNodeBool.h:741
+
ValueAllIter beginValueAll()
Definition: LeafNodeBool.h:713
+ +
void setValueMask(Index n, bool on)
Definition: LeafNodeBool.h:762
+
const LeafNode * probeConstLeaf(const Coord &) const
Return a const pointer to this node.
Definition: LeafNodeBool.h:609
+
const bool & getItem(Index pos) const
Definition: LeafNodeBool.h:641
+
const LeafNode * probeConstLeafAndCache(const Coord &, AccessorT &) const
Return a const pointer to this node.
Definition: LeafNodeBool.h:611
+
void getNodes(ArrayT &) const
This function exists only to enable template instantiation.
Definition: LeafNodeBool.h:578
+
Base class for iterators over internal and leaf nodes.
Definition: Iterator.h:58
+
static Index getValueLevelAndCache(const Coord &, AccessorT &)
Return the LEVEL (=0) at which leaf node values reside.
Definition: LeafNodeBool.h:469
+
static Index getValueLevel(const Coord &)
Return the level (0) at which leaf node values reside.
Definition: LeafNodeBool.h:298
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & min(const T &a, const T &b)
Definition: Composite.h:128
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/LeafNodeMask_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/LeafNodeMask_8h_source.html new file mode 100644 index 00000000..98ea2ad6 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/LeafNodeMask_8h_source.html @@ -0,0 +1,1829 @@ + + + + + + +OpenVDB: LeafNodeMask.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
LeafNodeMask.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 
+
31 #ifndef OPENVDB_TREE_LEAF_NODE_MASK_HAS_BEEN_INCLUDED
+
32 #define OPENVDB_TREE_LEAF_NODE_MASK_HAS_BEEN_INCLUDED
+
33 
+
34 #include <iostream>
+
35 #include <boost/shared_ptr.hpp>
+
36 #include <boost/shared_array.hpp>
+
37 #include <boost/static_assert.hpp>
+
38 #include <openvdb/Types.h>
+
39 #include <openvdb/io/Compression.h> // for io::readData(), etc.
+
40 #include <openvdb/math/Math.h> // for math::isZero()
+
41 #include <openvdb/util/NodeMasks.h>
+
42 #include "LeafNode.h"
+
43 #include "Iterator.h"
+
44 
+
45 
+
46 namespace openvdb {
+ +
48 namespace OPENVDB_VERSION_NAME {
+
49 namespace tree {
+
50 
+
54 template<Index Log2Dim>
+
55 class LeafNode<ValueMask, Log2Dim>
+
56 {
+
57 public:
+ +
59  typedef boost::shared_ptr<LeafNodeType> Ptr;
+
60  typedef ValueMask BuildType;// this is a rare case where
+
61  typedef bool ValueType;// value type != build type
+ +
63 
+
64  // These static declarations must be on separate lines to avoid VC9 compiler errors.
+
65  static const Index LOG2DIM = Log2Dim; // needed by parent nodes
+
66  static const Index TOTAL = Log2Dim; // needed by parent nodes
+
67  static const Index DIM = 1 << TOTAL; // dimension along one coordinate direction
+
68  static const Index NUM_VALUES = 1 << 3 * Log2Dim;
+
69  static const Index NUM_VOXELS = NUM_VALUES; // total number of voxels represented by this node
+
70  static const Index SIZE = NUM_VALUES;
+
71  static const Index LEVEL = 0; // level 0 = leaf
+
72 
+
75  template<typename OtherValueType>
+
76  struct ValueConverter {
+ +
78  };
+
79 
+
82  template<typename OtherNodeType>
+
83  struct SameConfiguration {
+ +
85  };
+
86 
+
87  class Buffer
+
88  {
+
89  public:
+
90  typedef typename NodeMaskType::Word WordType;
+
91  static const Index WORD_COUNT = NodeMaskType::WORD_COUNT;
+
92  Buffer() {}
+
93  explicit Buffer(bool on) : mData(on) {}
+
94  Buffer(const NodeMaskType& other): mData(other) {}
+
95  Buffer(const Buffer& other): mData(other.mData) {}
+
96  ~Buffer() {}
+
97  void fill(bool val) { mData.set(val); }
+
98  Buffer& operator=(const Buffer& b)
+
99  {
+
100  if (&b != this) mData = b.mData;
+
101  return *this;
+
102  }
+
103 
+
104  const bool& getValue(Index i) const
+
105  {
+
106  assert(i < SIZE);
+
107  // We can't use the ternary operator here, otherwise Visual C++ returns
+
108  // a reference to a temporary.
+
109  if (mData.isOn(i)) return LeafNode::sOn;
+
110  return LeafNode::sOff;
+
111  }
+
112  const bool& operator[](Index i) const { return this->getValue(i); }
+
113 
+
114  bool operator==(const Buffer& other) const { return mData == other.mData; }
+
115  bool operator!=(const Buffer& other) const { return mData != other.mData; }
+
116 
+
117  void setValue(Index i, bool val) { assert(i < SIZE); mData.set(i, val); }
+
118 
+
119  void swap(Buffer& other) { if (&other != this) std::swap(mData, other.mData); }
+
120 
+
121  Index memUsage() const { return mData.memUsage(); }
+
122  static Index size() { return SIZE; }
+
123 
+
127  WordType* data()
+
128  {
+
129  return &(mData.template getWord<WordType>(0));
+
130  }
+
135  const WordType* data() const
+
136  {
+
137  return const_cast<Buffer*>(this)->data();
+
138  }
+
139 
+
140  private:
+
141  friend class ::TestLeaf;
+
142  // Allow the parent LeafNode to access this Buffer's bit mask.
+
143  friend class LeafNode;
+
144 
+
145  NodeMaskType mData;
+
146  }; // class Buffer
+
147 
+
148 
+
150  LeafNode();
+
151 
+
156  explicit LeafNode(const Coord& xyz, bool value = false, bool dummy = false);
+
157 
+
158 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
159  LeafNode(PartialCreate, const Coord& xyz, bool value = false, bool dummy = false);
+
161 #endif
+
162 
+
164  LeafNode(const LeafNode&);
+
165 
+
167  template<typename OtherValueType>
+
168  explicit LeafNode(const LeafNode<OtherValueType, Log2Dim>& other);
+
169 
+
171  template<typename ValueType>
+ +
173 
+
175  template<typename ValueType>
+
178  LeafNode(const LeafNode<ValueType, Log2Dim>& other, bool offValue, bool onValue, TopologyCopy);
+
179  template<typename ValueType>
+
180  LeafNode(const LeafNode<ValueType, Log2Dim>& other, bool background, TopologyCopy);
+
182 
+
184  ~LeafNode();
+
185 
+
186  //
+
187  // Statistics
+
188  //
+
190  static Index log2dim() { return Log2Dim; }
+
192  static Index dim() { return DIM; }
+
194  static Index size() { return SIZE; }
+
196  static Index numValues() { return SIZE; }
+
198  static Index getLevel() { return LEVEL; }
+
200  static void getNodeLog2Dims(std::vector<Index>& dims) { dims.push_back(Log2Dim); }
+
202  static Index getChildDim() { return 1; }
+
204  static Index32 leafCount() { return 1; }
+
206  static Index32 nonLeafCount() { return 0; }
+
207 
+
209  Index64 onVoxelCount() const { return mBuffer.mData.countOn(); }
+
211  Index64 offVoxelCount() const { return mBuffer.mData.countOff(); }
+
212  Index64 onLeafVoxelCount() const { return this->onVoxelCount(); }
+
213  Index64 offLeafVoxelCount() const { return this->offVoxelCount(); }
+
214  static Index64 onTileCount() { return 0; }
+
215  static Index64 offTileCount() { return 0; }
+
216 
+
218  bool isEmpty() const { return mBuffer.mData.isOff(); }
+
220  bool isDense() const { return mBuffer.mData.isOn(); }
+
221 
+
222 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
223  bool isAllocated() const { return true; }
+
230  bool allocate() { return true; }
+
231 #endif
+
232 
+
234  Index64 memUsage() const;
+
235 
+
239  void evalActiveBoundingBox(CoordBBox& bbox, bool visitVoxels = true) const;
+
240 
+
243  CoordBBox getNodeBoundingBox() const { return CoordBBox::createCube(mOrigin, DIM); }
+
244 
+
246  void setOrigin(const Coord& origin) { mOrigin = origin; }
+
248  const Coord& origin() const { return mOrigin; }
+
250  void getOrigin(Coord& origin) const { origin = mOrigin; }
+
251  void getOrigin(Int32& x, Int32& y, Int32& z) const { mOrigin.asXYZ(x, y, z); }
+
253 
+
255  static Index coordToOffset(const Coord& xyz);
+
258  static Coord offsetToLocalCoord(Index n);
+
260  Coord offsetToGlobalCoord(Index n) const;
+
261 
+
263  std::string str() const;
+
264 
+
267  template<typename OtherType, Index OtherLog2Dim>
+
268  bool hasSameTopology(const LeafNode<OtherType, OtherLog2Dim>* other) const;
+
269 
+
271  bool operator==(const LeafNode&) const;
+
272  bool operator!=(const LeafNode&) const;
+
273 
+
274  //
+
275  // Buffer management
+
276  //
+
279  void swap(Buffer& other) { mBuffer.swap(other); }
+
280  const Buffer& buffer() const { return mBuffer; }
+
281  Buffer& buffer() { return mBuffer; }
+
282 
+
283  //
+
284  // I/O methods
+
285  //
+
287  void readTopology(std::istream&, bool fromHalf = false);
+
289  void writeTopology(std::ostream&, bool toHalf = false) const;
+
290 
+
292  void readBuffers(std::istream&, bool fromHalf = false);
+
293  void readBuffers(std::istream& is, const CoordBBox&, bool fromHalf = false);
+
295  void writeBuffers(std::ostream&, bool toHalf = false) const;
+
296 
+
297  //
+
298  // Accessor methods
+
299  //
+
301  const bool& getValue(const Coord& xyz) const;
+
303  const bool& getValue(Index offset) const;
+
304 
+
308  bool probeValue(const Coord& xyz, bool& val) const;
+
309 
+
311  static Index getValueLevel(const Coord&) { return LEVEL; }
+
312 
+
314  void setActiveState(const Coord& xyz, bool on);
+
316  void setActiveState(Index offset, bool on) { assert(offset<SIZE); mBuffer.mData.set(offset, on); }
+
317 
+
319  void setValueOnly(const Coord& xyz, bool val);
+
321  void setValueOnly(Index offset, bool val) { assert(offset<SIZE); mBuffer.setValue(offset,val); }
+
322 
+
324  void setValueOff(const Coord& xyz) { mBuffer.mData.setOff(this->coordToOffset(xyz)); }
+
326  void setValueOff(Index offset) { assert(offset < SIZE); mBuffer.mData.setOff(offset); }
+
327 
+
329  void setValueOff(const Coord& xyz, bool val);
+
331  void setValueOff(Index offset, bool val);
+
332 
+
334  void setValueOn(const Coord& xyz) { mBuffer.mData.setOn(this->coordToOffset(xyz)); }
+
336  void setValueOn(Index offset) { assert(offset < SIZE); mBuffer.mData.setOn(offset); }
+
337 
+
339  void setValueOn(const Coord& xyz, bool val);
+
341  void setValue(const Coord& xyz, bool val) { this->setValueOn(xyz, val); }
+
343  void setValueOn(Index offset, bool val);
+
344 
+
347  template<typename ModifyOp>
+
348  void modifyValue(Index offset, const ModifyOp& op);
+
351  template<typename ModifyOp>
+
352  void modifyValue(const Coord& xyz, const ModifyOp& op);
+
353 
+
355  template<typename ModifyOp>
+
356  void modifyValueAndActiveState(const Coord& xyz, const ModifyOp& op);
+
357 
+
359  void setValuesOn() { mBuffer.mData.setOn(); }
+
361  void setValuesOff() { mBuffer.mData.setOff(); }
+
362 
+
364  bool isValueOn(const Coord& xyz) const { return mBuffer.mData.isOn(this->coordToOffset(xyz)); }
+
366  bool isValueOn(Index offset) const { assert(offset < SIZE); return mBuffer.mData.isOn(offset); }
+
367 
+
369  static bool hasActiveTiles() { return false; }
+
370 
+
372  void clip(const CoordBBox&, bool background);
+
373 
+
375  void fill(const CoordBBox& bbox, bool value, bool dummy = false);
+
376 
+
378  void fill(const bool& value, bool dummy = false);
+
379 
+
391  template<typename DenseT>
+
392  void copyToDense(const CoordBBox& bbox, DenseT& dense) const;
+
393 
+
410  template<typename DenseT>
+
411  void copyFromDense(const CoordBBox& bbox, const DenseT& dense, bool background, bool tolerance);
+
412 
+
415  template<typename AccessorT>
+
416  const bool& getValueAndCache(const Coord& xyz, AccessorT&) const {return this->getValue(xyz);}
+
417 
+
420  template<typename AccessorT>
+
421  bool isValueOnAndCache(const Coord& xyz, AccessorT&) const { return this->isValueOn(xyz); }
+
422 
+
425  template<typename AccessorT>
+
426  void setValueAndCache(const Coord& xyz, bool val, AccessorT&) { this->setValueOn(xyz, val); }
+
427 
+
431  template<typename AccessorT>
+
432  void setValueOnlyAndCache(const Coord& xyz, bool val, AccessorT&) {this->setValueOnly(xyz,val);}
+
433 
+
436  template<typename AccessorT>
+
437  void setValueOffAndCache(const Coord& xyz, bool value, AccessorT&)
+
438  {
+
439  this->setValueOff(xyz, value);
+
440  }
+
441 
+
445  template<typename ModifyOp, typename AccessorT>
+
446  void modifyValueAndCache(const Coord& xyz, const ModifyOp& op, AccessorT&)
+
447  {
+
448  this->modifyValue(xyz, op);
+
449  }
+
450 
+
453  template<typename ModifyOp, typename AccessorT>
+
454  void modifyValueAndActiveStateAndCache(const Coord& xyz, const ModifyOp& op, AccessorT&)
+
455  {
+
456  this->modifyValueAndActiveState(xyz, op);
+
457  }
+
458 
+
462  template<typename AccessorT>
+
463  void setActiveStateAndCache(const Coord& xyz, bool on, AccessorT&)
+
464  {
+
465  this->setActiveState(xyz, on);
+
466  }
+
467 
+
471  template<typename AccessorT>
+
472  bool probeValueAndCache(const Coord& xyz, bool& val, AccessorT&) const
+
473  {
+
474  return this->probeValue(xyz, val);
+
475  }
+
476 
+
479  template<typename AccessorT>
+
480  static Index getValueLevelAndCache(const Coord&, AccessorT&) { return LEVEL; }
+
481 
+
485  const bool& getFirstValue() const { if (mBuffer.mData.isOn(0)) return sOn; else return sOff; }
+
489  const bool& getLastValue() const { if (mBuffer.mData.isOn(SIZE-1)) return sOn; else return sOff; }
+
490 
+
494  bool isConstant(bool& constValue, bool& state, bool tolerance = 0) const;
+
496  bool isInactive() const { return mBuffer.mData.isOff(); }
+
497 
+
500  void resetBackground(bool, bool) {}
+
501 
+
503  void negate() { mBuffer.mData.toggle(); }
+
504 
+
505  template<MergePolicy Policy>
+
506  void merge(const LeafNode& other, bool bg = false, bool otherBG = false);
+
507  template<MergePolicy Policy> void merge(bool tileValue, bool tileActive=false);
+
508 
+
511  void voxelizeActiveTiles(bool = true) {}
+
512 
+
519  template<typename OtherType>
+
520  void topologyUnion(const LeafNode<OtherType, Log2Dim>& other);
+
521 
+
533  template<typename OtherType>
+
534  void topologyIntersection(const LeafNode<OtherType, Log2Dim>& other, const bool&);
+
535 
+
547  template<typename OtherType>
+
548  void topologyDifference(const LeafNode<OtherType, Log2Dim>& other, const bool&);
+
549 
+
550  template<typename CombineOp>
+
551  void combine(const LeafNode& other, CombineOp& op);
+
552  template<typename CombineOp>
+
553  void combine(bool, bool valueIsActive, CombineOp& op);
+
554 
+
555  template<typename CombineOp, typename OtherType /*= bool*/>
+
556  void combine2(const LeafNode& other, const OtherType&, bool valueIsActive, CombineOp&);
+
557  template<typename CombineOp, typename OtherNodeT /*= LeafNode*/>
+
558  void combine2(bool, const OtherNodeT& other, bool valueIsActive, CombineOp&);
+
559  template<typename CombineOp, typename OtherNodeT /*= LeafNode*/>
+
560  void combine2(const LeafNode& b0, const OtherNodeT& b1, CombineOp&);
+
561 
+
566  template<typename BBoxOp> void visitActiveBBox(BBoxOp&) const;
+
567 
+
568  template<typename VisitorOp> void visit(VisitorOp&);
+
569  template<typename VisitorOp> void visit(VisitorOp&) const;
+
570 
+
571  template<typename OtherLeafNodeType, typename VisitorOp>
+
572  void visit2Node(OtherLeafNodeType& other, VisitorOp&);
+
573  template<typename OtherLeafNodeType, typename VisitorOp>
+
574  void visit2Node(OtherLeafNodeType& other, VisitorOp&) const;
+
575  template<typename IterT, typename VisitorOp>
+
576  void visit2(IterT& otherIter, VisitorOp&, bool otherIsLHS = false);
+
577  template<typename IterT, typename VisitorOp>
+
578  void visit2(IterT& otherIter, VisitorOp&, bool otherIsLHS = false) const;
+
579 
+
581  void prune(const ValueType& /*tolerance*/ = zeroVal<ValueType>()) {}
+
583  void addLeaf(LeafNode*) {}
+
584  template<typename AccessorT>
+
585  void addLeafAndCache(LeafNode*, AccessorT&) {}
+
586  template<typename NodeT>
+
587  NodeT* stealNode(const Coord&, const ValueType&, bool) { return NULL; }
+
588  template<typename NodeT>
+
589  NodeT* probeNode(const Coord&) { return NULL; }
+
590  template<typename NodeT>
+
591  const NodeT* probeConstNode(const Coord&) const { return NULL; }
+
592  template<typename ArrayT> void getNodes(ArrayT&) const {}
+
593  template<typename ArrayT> void stealNodes(ArrayT&, const ValueType&, bool) {}
+
595 
+
596  void addTile(Index level, const Coord&, bool val, bool active);
+
597  void addTile(Index offset, bool val, bool active);
+
598  template<typename AccessorT>
+
599  void addTileAndCache(Index level, const Coord&, bool val, bool active, AccessorT&);
+
600 
+
602  LeafNode* touchLeaf(const Coord&) { return this; }
+
604  template<typename AccessorT>
+
605  LeafNode* touchLeafAndCache(const Coord&, AccessorT&) { return this; }
+
606  LeafNode* probeLeaf(const Coord&) { return this; }
+
607  template<typename AccessorT>
+
608  LeafNode* probeLeafAndCache(const Coord&, AccessorT&) { return this; }
+
609  template<typename NodeT, typename AccessorT>
+
610  NodeT* probeNodeAndCache(const Coord&, AccessorT&)
+
611  {
+ +
613  if (!(boost::is_same<NodeT,LeafNode>::value)) return NULL;
+
614  return reinterpret_cast<NodeT*>(this);
+ +
616  }
+
618 
+
619  const LeafNode* probeLeaf(const Coord&) const { return this; }
+
621  template<typename AccessorT>
+
622  const LeafNode* probeLeafAndCache(const Coord&, AccessorT&) const { return this; }
+
623  const LeafNode* probeConstLeaf(const Coord&) const { return this; }
+
624  template<typename AccessorT>
+
625  const LeafNode* probeConstLeafAndCache(const Coord&, AccessorT&) const { return this; }
+
626  template<typename NodeT, typename AccessorT>
+
627  const NodeT* probeConstNodeAndCache(const Coord&, AccessorT&) const
+
628  {
+ +
630  if (!(boost::is_same<NodeT,LeafNode>::value)) return NULL;
+
631  return reinterpret_cast<const NodeT*>(this);
+ +
633  }
+
635 
+
636  //
+
637  // Iterators
+
638  //
+
639 protected:
+ + + +
643 
+
644  template<typename MaskIterT, typename NodeT, typename ValueT>
+
645  struct ValueIter:
+
646  // Derives from SparseIteratorBase, but can also be used as a dense iterator,
+
647  // if MaskIterT is a dense mask iterator type.
+
648  public SparseIteratorBase<MaskIterT, ValueIter<MaskIterT, NodeT, ValueT>, NodeT, ValueT>
+
649  {
+ +
651 
+ +
653  ValueIter(const MaskIterT& iter, NodeT* parent): BaseT(iter, parent) {}
+
654 
+
655  const bool& getItem(Index pos) const { return this->parent().getValue(pos); }
+
656  const bool& getValue() const { return this->getItem(this->pos()); }
+
657 
+
658  // Note: setItem() can't be called on const iterators.
+
659  void setItem(Index pos, bool value) const { this->parent().setValueOnly(pos, value); }
+
660  // Note: setValue() can't be called on const iterators.
+
661  void setValue(bool value) const { this->setItem(this->pos(), value); }
+
662 
+
663  // Note: modifyItem() can't be called on const iterators.
+
664  template<typename ModifyOp>
+
665  void modifyItem(Index n, const ModifyOp& op) const { this->parent().modifyValue(n, op); }
+
666  // Note: modifyValue() can't be called on const iterators.
+
667  template<typename ModifyOp>
+
668  void modifyValue(const ModifyOp& op) const { this->modifyItem(this->pos(), op); }
+
669  };
+
670 
+
672  template<typename MaskIterT, typename NodeT>
+
673  struct ChildIter:
+
674  public SparseIteratorBase<MaskIterT, ChildIter<MaskIterT, NodeT>, NodeT, bool>
+
675  {
+ +
677  ChildIter(const MaskIterT& iter, NodeT* parent): SparseIteratorBase<
+
678  MaskIterT, ChildIter<MaskIterT, NodeT>, NodeT, bool>(iter, parent) {}
+
679  };
+
680 
+
681  template<typename NodeT, typename ValueT>
+
682  struct DenseIter: public DenseIteratorBase<
+
683  MaskDenseIter, DenseIter<NodeT, ValueT>, NodeT, /*ChildT=*/void, ValueT>
+
684  {
+ + +
687 
+ +
689  DenseIter(const MaskDenseIter& iter, NodeT* parent): BaseT(iter, parent) {}
+
690 
+
691  bool getItem(Index pos, void*& child, NonConstValueT& value) const
+
692  {
+
693  value = this->parent().getValue(pos);
+
694  child = NULL;
+
695  return false; // no child
+
696  }
+
697 
+
698  // Note: setItem() can't be called on const iterators.
+
699  //void setItem(Index pos, void* child) const {}
+
700 
+
701  // Note: unsetItem() can't be called on const iterators.
+
702  void unsetItem(Index pos, const ValueT& val) const {this->parent().setValueOnly(pos, val);}
+
703  };
+
704 
+
705 public:
+
706  typedef ValueIter<MaskOnIter, LeafNode, const bool> ValueOnIter;
+
707  typedef ValueIter<MaskOnIter, const LeafNode, const bool> ValueOnCIter;
+
708  typedef ValueIter<MaskOffIter, LeafNode, const bool> ValueOffIter;
+
709  typedef ValueIter<MaskOffIter, const LeafNode, const bool> ValueOffCIter;
+
710  typedef ValueIter<MaskDenseIter, LeafNode, const bool> ValueAllIter;
+
711  typedef ValueIter<MaskDenseIter, const LeafNode, const bool> ValueAllCIter;
+
712  typedef ChildIter<MaskOnIter, LeafNode> ChildOnIter;
+
713  typedef ChildIter<MaskOnIter, const LeafNode> ChildOnCIter;
+
714  typedef ChildIter<MaskOffIter, LeafNode> ChildOffIter;
+
715  typedef ChildIter<MaskOffIter, const LeafNode> ChildOffCIter;
+
716  typedef DenseIter<LeafNode, bool> ChildAllIter;
+
717  typedef DenseIter<const LeafNode, const bool> ChildAllCIter;
+
718 
+
719  ValueOnCIter cbeginValueOn() const { return ValueOnCIter(mBuffer.mData.beginOn(), this); }
+
720  ValueOnCIter beginValueOn() const { return ValueOnCIter(mBuffer.mData.beginOn(), this); }
+
721  ValueOnIter beginValueOn() { return ValueOnIter(mBuffer.mData.beginOn(), this); }
+
722  ValueOffCIter cbeginValueOff() const { return ValueOffCIter(mBuffer.mData.beginOff(), this); }
+
723  ValueOffCIter beginValueOff() const { return ValueOffCIter(mBuffer.mData.beginOff(), this); }
+
724  ValueOffIter beginValueOff() { return ValueOffIter(mBuffer.mData.beginOff(), this); }
+
725  ValueAllCIter cbeginValueAll() const { return ValueAllCIter(mBuffer.mData.beginDense(), this); }
+
726  ValueAllCIter beginValueAll() const { return ValueAllCIter(mBuffer.mData.beginDense(), this); }
+
727  ValueAllIter beginValueAll() { return ValueAllIter(mBuffer.mData.beginDense(), this); }
+
728 
+
729  ValueOnCIter cendValueOn() const { return ValueOnCIter(mBuffer.mData.endOn(), this); }
+
730  ValueOnCIter endValueOn() const { return ValueOnCIter(mBuffer.mData.endOn(), this); }
+
731  ValueOnIter endValueOn() { return ValueOnIter(mBuffer.mData.endOn(), this); }
+
732  ValueOffCIter cendValueOff() const { return ValueOffCIter(mBuffer.mData.endOff(), this); }
+
733  ValueOffCIter endValueOff() const { return ValueOffCIter(mBuffer.mData.endOff(), this); }
+
734  ValueOffIter endValueOff() { return ValueOffIter(mBuffer.mData.endOff(), this); }
+
735  ValueAllCIter cendValueAll() const { return ValueAllCIter(mBuffer.mData.endDense(), this); }
+
736  ValueAllCIter endValueAll() const { return ValueAllCIter(mBuffer.mData.endDense(), this); }
+
737  ValueAllIter endValueAll() { return ValueAllIter(mBuffer.mData.endDense(), this); }
+
738 
+
739  // Note that [c]beginChildOn() and [c]beginChildOff() actually return end iterators,
+
740  // because leaf nodes have no children.
+
741  ChildOnCIter cbeginChildOn() const { return ChildOnCIter(mBuffer.mData.endOn(), this); }
+
742  ChildOnCIter beginChildOn() const { return ChildOnCIter(mBuffer.mData.endOn(), this); }
+
743  ChildOnIter beginChildOn() { return ChildOnIter(mBuffer.mData.endOn(), this); }
+
744  ChildOffCIter cbeginChildOff() const { return ChildOffCIter(mBuffer.mData.endOff(), this); }
+
745  ChildOffCIter beginChildOff() const { return ChildOffCIter(mBuffer.mData.endOff(), this); }
+
746  ChildOffIter beginChildOff() { return ChildOffIter(mBuffer.mData.endOff(), this); }
+
747  ChildAllCIter cbeginChildAll() const { return ChildAllCIter(mBuffer.mData.beginDense(), this); }
+
748  ChildAllCIter beginChildAll() const { return ChildAllCIter(mBuffer.mData.beginDense(), this); }
+
749  ChildAllIter beginChildAll() { return ChildAllIter(mBuffer.mData.beginDense(), this); }
+
750 
+
751  ChildOnCIter cendChildOn() const { return ChildOnCIter(mBuffer.mData.endOn(), this); }
+
752  ChildOnCIter endChildOn() const { return ChildOnCIter(mBuffer.mData.endOn(), this); }
+
753  ChildOnIter endChildOn() { return ChildOnIter(mBuffer.mData.endOn(), this); }
+
754  ChildOffCIter cendChildOff() const { return ChildOffCIter(mBuffer.mData.endOff(), this); }
+
755  ChildOffCIter endChildOff() const { return ChildOffCIter(mBuffer.mData.endOff(), this); }
+
756  ChildOffIter endChildOff() { return ChildOffIter(mBuffer.mData.endOff(), this); }
+
757  ChildAllCIter cendChildAll() const { return ChildAllCIter(mBuffer.mData.endDense(), this); }
+
758  ChildAllCIter endChildAll() const { return ChildAllCIter(mBuffer.mData.endDense(), this); }
+
759  ChildAllIter endChildAll() { return ChildAllIter(mBuffer.mData.endDense(), this); }
+
760 
+
761  //
+
762  // Mask accessors
+
763  //
+
764  bool isValueMaskOn(Index n) const { return mBuffer.mData.isOn(n); }
+
765  bool isValueMaskOn() const { return mBuffer.mData.isOn(); }
+
766  bool isValueMaskOff(Index n) const { return mBuffer.mData.isOff(n); }
+
767  bool isValueMaskOff() const { return mBuffer.mData.isOff(); }
+
768  const NodeMaskType& getValueMask() const { return mBuffer.mData; }
+
769  const NodeMaskType& valueMask() const { return mBuffer.mData; }
+
770  NodeMaskType& getValueMask() { return mBuffer.mData; }
+
771  void setValueMask(const NodeMaskType& mask) { mBuffer.mData = mask; }
+
772  bool isChildMaskOn(Index) const { return false; } // leaf nodes have no children
+
773  bool isChildMaskOff(Index) const { return true; }
+
774  bool isChildMaskOff() const { return true; }
+
775 protected:
+
776  void setValueMask(Index n, bool on) { mBuffer.mData.set(n, on); }
+
777  void setValueMaskOn(Index n) { mBuffer.mData.setOn(n); }
+
778  void setValueMaskOff(Index n) { mBuffer.mData.setOff(n); }
+
779 
+
781  static void evalNodeOrigin(Coord& xyz) { xyz &= ~(DIM - 1); }
+
782 
+
783  template<typename NodeT, typename VisitorOp, typename ChildAllIterT>
+
784  static inline void doVisit(NodeT&, VisitorOp&);
+
785 
+
786  template<typename NodeT, typename OtherNodeT, typename VisitorOp,
+
787  typename ChildAllIterT, typename OtherChildAllIterT>
+
788  static inline void doVisit2Node(NodeT& self, OtherNodeT& other, VisitorOp&);
+
789 
+
790  template<typename NodeT, typename VisitorOp,
+
791  typename ChildAllIterT, typename OtherChildAllIterT>
+
792  static inline void doVisit2(NodeT& self, OtherChildAllIterT&, VisitorOp&, bool otherIsLHS);
+
793 
+
795  Buffer mBuffer;
+
796 
+
798  Coord mOrigin;
+
799 
+
800  // These static declarations must be on separate lines to avoid VC9 compiler errors.
+
801  static const bool sOn;
+
802  static const bool sOff;
+
803 
+
804 private:
+
807  template<typename, Index> friend class LeafNode;
+
808 
+
809  friend struct ValueIter<MaskOnIter, LeafNode, bool>;
+
810  friend struct ValueIter<MaskOffIter, LeafNode, bool>;
+
811  friend struct ValueIter<MaskDenseIter, LeafNode, bool>;
+
812  friend struct ValueIter<MaskOnIter, const LeafNode, bool>;
+
813  friend struct ValueIter<MaskOffIter, const LeafNode, bool>;
+
814  friend struct ValueIter<MaskDenseIter, const LeafNode, bool>;
+
815 
+
817  friend class IteratorBase<MaskOnIter, LeafNode>;
+
820  friend class IteratorBase<MaskOffIter, LeafNode>;
+
821  friend class IteratorBase<MaskDenseIter, LeafNode>;
+
823 
+
824 }; // class LeafNode<ValueMask>
+
825 
+
826 
+
831 template<Index Log2Dim> const bool LeafNode<ValueMask, Log2Dim>::sOn = true;
+
832 template<Index Log2Dim> const bool LeafNode<ValueMask, Log2Dim>::sOff = false;
+
833 
+
834 
+
836 
+
837 
+
838 template<Index Log2Dim>
+
839 inline
+ +
841  : mOrigin(0, 0, 0)
+
842 {
+
843 }
+
844 
+
845 template<Index Log2Dim>
+
846 inline
+
847 LeafNode<ValueMask, Log2Dim>::LeafNode(const Coord& xyz, bool value, bool)
+
848  : mBuffer(value)
+
849  , mOrigin(xyz & (~(DIM - 1)))
+
850 {
+
851 }
+
852 
+
853 
+
854 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
855 template<Index Log2Dim>
+
856 inline
+
857 LeafNode<ValueMask, Log2Dim>::LeafNode(PartialCreate, const Coord& xyz, bool value, bool)
+
858  : mBuffer(value)
+
859  , mOrigin(xyz & (~(DIM - 1)))
+
860 {
+
861 }
+
862 #endif
+
863 
+
864 
+
865 template<Index Log2Dim>
+
866 inline
+ +
868  : mBuffer(other.mBuffer)
+
869  , mOrigin(other.mOrigin)
+
870 {
+
871 }
+
872 
+
873 
+
874 // Copy-construct from a leaf node with the same configuration but a different ValueType.
+
875 template<Index Log2Dim>
+
876 template<typename ValueT>
+
877 inline
+ +
879  : mBuffer(other.valueMask())
+
880  , mOrigin(other.origin())
+
881 {
+
882 }
+
883 
+
884 
+
885 template<Index Log2Dim>
+
886 template<typename ValueT>
+
887 inline
+ +
889  bool, TopologyCopy)
+
890  : mBuffer(other.valueMask())// value = active state
+
891  , mOrigin(other.origin())
+
892 {
+
893 }
+
894 
+
895 
+
896 template<Index Log2Dim>
+
897 template<typename ValueT>
+
898 inline
+ +
900  : mBuffer(other.valueMask())// value = active state
+
901  , mOrigin(other.origin())
+
902 {
+
903 }
+
904 
+
905 
+
906 template<Index Log2Dim>
+
907 template<typename ValueT>
+
908 inline
+ +
910  bool offValue, bool onValue, TopologyCopy)
+
911  : mBuffer(other.valueMask())
+
912  , mOrigin(other.origin())
+
913 {
+
914  if (offValue==true) {
+
915  if (onValue==false) {
+
916  mBuffer.mData.toggle();
+
917  } else {
+
918  mBuffer.mData.setOn();
+
919  }
+
920  }
+
921 }
+
922 
+
923 
+
924 template<Index Log2Dim>
+
925 inline
+ +
927 {
+
928 }
+
929 
+
930 
+
932 
+
933 
+
934 template<Index Log2Dim>
+
935 inline Index64
+ +
937 {
+
938  return sizeof(mOrigin) + mBuffer.memUsage();
+
939 }
+
940 
+
941 
+
942 template<Index Log2Dim>
+
943 inline void
+
944 LeafNode<ValueMask, Log2Dim>::evalActiveBoundingBox(CoordBBox& bbox, bool visitVoxels) const
+
945 {
+
946  CoordBBox this_bbox = this->getNodeBoundingBox();
+
947  if (bbox.isInside(this_bbox)) return;//this LeafNode is already enclosed in the bbox
+
948  if (ValueOnCIter iter = this->cbeginValueOn()) {//any active values?
+
949  if (visitVoxels) {//use voxel granularity?
+
950  this_bbox.reset();
+
951  for(; iter; ++iter) this_bbox.expand(this->offsetToLocalCoord(iter.pos()));
+
952  this_bbox.translate(this->origin());
+
953  }
+
954  bbox.expand(this_bbox);
+
955  }
+
956 }
+
957 
+
958 
+
959 template<Index Log2Dim>
+
960 template<typename OtherType, Index OtherLog2Dim>
+
961 inline bool
+ +
963 {
+
964  assert(other);
+
965  return (Log2Dim == OtherLog2Dim && mBuffer.mData == other->getValueMask());
+
966 }
+
967 
+
968 
+
969 template<Index Log2Dim>
+
970 inline std::string
+ +
972 {
+
973  std::ostringstream ostr;
+
974  ostr << "LeafNode @" << mOrigin << ": ";
+
975  for (Index32 n = 0; n < SIZE; ++n) ostr << (mBuffer.mData.isOn(n) ? '#' : '.');
+
976  return ostr.str();
+
977 }
+
978 
+
979 
+
981 
+
982 
+
983 template<Index Log2Dim>
+
984 inline Index
+ +
986 {
+
987  assert ((xyz[0] & (DIM-1u)) < DIM && (xyz[1] & (DIM-1u)) < DIM && (xyz[2] & (DIM-1u)) < DIM);
+
988  return ((xyz[0] & (DIM-1u)) << 2*Log2Dim)
+
989  + ((xyz[1] & (DIM-1u)) << Log2Dim)
+
990  + (xyz[2] & (DIM-1u));
+
991 }
+
992 
+
993 
+
994 template<Index Log2Dim>
+
995 inline Coord
+ +
997 {
+
998  assert(n < (1 << 3*Log2Dim));
+
999  Coord xyz;
+
1000  xyz.setX(n >> 2*Log2Dim);
+
1001  n &= ((1 << 2*Log2Dim) - 1);
+
1002  xyz.setY(n >> Log2Dim);
+
1003  xyz.setZ(n & ((1 << Log2Dim) - 1));
+
1004  return xyz;
+
1005 }
+
1006 
+
1007 
+
1008 template<Index Log2Dim>
+
1009 inline Coord
+ +
1011 {
+
1012  return (this->offsetToLocalCoord(n) + this->origin());
+
1013 }
+
1014 
+
1015 
+
1017 
+
1018 
+
1019 template<Index Log2Dim>
+
1020 inline void
+
1021 LeafNode<ValueMask, Log2Dim>::readTopology(std::istream& is, bool /*fromHalf*/)
+
1022 {
+
1023  mBuffer.mData.load(is);
+
1024 }
+
1025 
+
1026 
+
1027 template<Index Log2Dim>
+
1028 inline void
+
1029 LeafNode<ValueMask, Log2Dim>::writeTopology(std::ostream& os, bool /*toHalf*/) const
+
1030 {
+
1031  mBuffer.mData.save(os);
+
1032 }
+
1033 
+
1034 
+
1035 template<Index Log2Dim>
+
1036 inline void
+
1037 LeafNode<ValueMask, Log2Dim>::readBuffers(std::istream& is, const CoordBBox& clipBBox, bool fromHalf)
+
1038 {
+
1039  // Boolean LeafNodes don't currently implement lazy loading.
+
1040  // Instead, load the full buffer, then clip it.
+
1041 
+
1042  this->readBuffers(is, fromHalf);
+
1043 
+
1044  // Get this tree's background value.
+
1045  bool background = false;
+
1046  if (const void* bgPtr = io::getGridBackgroundValuePtr(is)) {
+
1047  background = *static_cast<const bool*>(bgPtr);
+
1048  }
+
1049  this->clip(clipBBox, background);
+
1050 }
+
1051 
+
1052 
+
1053 template<Index Log2Dim>
+
1054 inline void
+
1055 LeafNode<ValueMask, Log2Dim>::readBuffers(std::istream& is, bool /*fromHalf*/)
+
1056 {
+
1057  // Read in the value mask = buffer.
+
1058  mBuffer.mData.load(is);
+
1059  // Read in the origin.
+
1060  is.read(reinterpret_cast<char*>(&mOrigin), sizeof(Coord::ValueType) * 3);
+
1061 }
+
1062 
+
1063 
+
1064 template<Index Log2Dim>
+
1065 inline void
+
1066 LeafNode<ValueMask, Log2Dim>::writeBuffers(std::ostream& os, bool /*toHalf*/) const
+
1067 {
+
1068  // Write out the value mask = buffer.
+
1069  mBuffer.mData.save(os);
+
1070  // Write out the origin.
+
1071  os.write(reinterpret_cast<const char*>(&mOrigin), sizeof(Coord::ValueType) * 3);
+
1072 }
+
1073 
+
1074 
+
1076 
+
1077 
+
1078 template<Index Log2Dim>
+
1079 inline bool
+ +
1081 {
+
1082  return mOrigin == other.mOrigin && mBuffer == other.mBuffer;
+
1083 }
+
1084 
+
1085 
+
1086 template<Index Log2Dim>
+
1087 inline bool
+ +
1089 {
+
1090  return !(this->operator==(other));
+
1091 }
+
1092 
+
1093 
+
1095 
+
1096 
+
1097 template<Index Log2Dim>
+
1098 inline bool
+
1099 LeafNode<ValueMask, Log2Dim>::isConstant(bool& constValue, bool& state, bool) const
+
1100 {
+
1101  state = mBuffer.mData.isOn();
+
1102 
+
1103  if (!(state || mBuffer.mData.isOff())) return false;
+
1104 
+
1105  constValue = state;
+
1106  return true;
+
1107 }
+
1108 
+
1109 
+
1111 
+
1112 
+
1113 template<Index Log2Dim>
+
1114 inline void
+
1115 LeafNode<ValueMask, Log2Dim>::addTile(Index /*level*/, const Coord& xyz, bool val, bool active)
+
1116 {
+
1117  this->addTile(this->coordToOffset(xyz), val, active);
+
1118 }
+
1119 
+
1120 template<Index Log2Dim>
+
1121 inline void
+
1122 LeafNode<ValueMask, Log2Dim>::addTile(Index offset, bool val, bool active)
+
1123 {
+
1124  assert(offset < SIZE);
+
1125  this->setValueOnly(offset, val);
+
1126  this->setActiveState(offset, active);
+
1127 }
+
1128 
+
1129 template<Index Log2Dim>
+
1130 template<typename AccessorT>
+
1131 inline void
+ +
1133  bool val, bool active, AccessorT&)
+
1134 {
+
1135  this->addTile(level, xyz, val, active);
+
1136 }
+
1137 
+
1138 
+
1140 
+
1141 
+
1142 template<Index Log2Dim>
+
1143 inline const bool&
+ +
1145 {
+
1146  // This *CANNOT* use operator ? because Visual C++
+
1147  if (mBuffer.mData.isOn(this->coordToOffset(xyz))) return sOn; else return sOff;
+
1148 }
+
1149 
+
1150 
+
1151 template<Index Log2Dim>
+
1152 inline const bool&
+ +
1154 {
+
1155  assert(offset < SIZE);
+
1156  // This *CANNOT* use operator ? for Windows
+
1157  if (mBuffer.mData.isOn(offset)) return sOn; else return sOff;
+
1158 }
+
1159 
+
1160 
+
1161 template<Index Log2Dim>
+
1162 inline bool
+
1163 LeafNode<ValueMask, Log2Dim>::probeValue(const Coord& xyz, bool& val) const
+
1164 {
+
1165  const Index offset = this->coordToOffset(xyz);
+
1166  val = mBuffer.mData.isOn(offset);
+
1167  return val;
+
1168 }
+
1169 
+
1170 
+
1171 template<Index Log2Dim>
+
1172 inline void
+
1173 LeafNode<ValueMask, Log2Dim>::setValueOn(const Coord& xyz, bool val)
+
1174 {
+
1175  this->setValueOn(this->coordToOffset(xyz), val);
+
1176 }
+
1177 
+
1178 
+
1179 template<Index Log2Dim>
+
1180 inline void
+ +
1182 {
+
1183  assert(offset < SIZE);
+
1184  mBuffer.mData.set(offset, val);
+
1185 }
+
1186 
+
1187 
+
1188 template<Index Log2Dim>
+
1189 inline void
+ +
1191 {
+
1192  this->setValueOnly(this->coordToOffset(xyz), val);
+
1193 }
+
1194 
+
1195 
+
1196 template<Index Log2Dim>
+
1197 inline void
+ +
1199 {
+
1200  mBuffer.mData.set(this->coordToOffset(xyz), on);
+
1201 }
+
1202 
+
1203 
+
1204 template<Index Log2Dim>
+
1205 inline void
+ +
1207 {
+
1208  this->setValueOff(this->coordToOffset(xyz), val);
+
1209 }
+
1210 
+
1211 
+
1212 template<Index Log2Dim>
+
1213 inline void
+ +
1215 {
+
1216  assert(offset < SIZE);
+
1217  mBuffer.mData.set(offset, val);
+
1218 }
+
1219 
+
1220 
+
1221 template<Index Log2Dim>
+
1222 template<typename ModifyOp>
+
1223 inline void
+ +
1225 {
+
1226  bool val = mBuffer.mData.isOn(offset);
+
1227  op(val);
+
1228  mBuffer.mData.set(offset, val);
+
1229 }
+
1230 
+
1231 
+
1232 template<Index Log2Dim>
+
1233 template<typename ModifyOp>
+
1234 inline void
+
1235 LeafNode<ValueMask, Log2Dim>::modifyValue(const Coord& xyz, const ModifyOp& op)
+
1236 {
+
1237  this->modifyValue(this->coordToOffset(xyz), op);
+
1238 }
+
1239 
+
1240 
+
1241 template<Index Log2Dim>
+
1242 template<typename ModifyOp>
+
1243 inline void
+
1244 LeafNode<ValueMask, Log2Dim>::modifyValueAndActiveState(const Coord& xyz, const ModifyOp& op)
+
1245 {
+
1246  const Index offset = this->coordToOffset(xyz);
+
1247  bool val = mBuffer.mData.isOn(offset), state = val;
+
1248  op(val, state);
+
1249  mBuffer.mData.set(offset, val);
+
1250 }
+
1251 
+
1252 
+
1254 
+
1255 
+
1256 template<Index Log2Dim>
+
1257 template<MergePolicy Policy>
+
1258 inline void
+
1259 LeafNode<ValueMask, Log2Dim>::merge(const LeafNode& other, bool /*bg*/, bool /*otherBG*/)
+
1260 {
+ +
1262  if (Policy == MERGE_NODES) return;
+
1263  mBuffer.mData |= other.mBuffer.mData;
+ +
1265 }
+
1266 
+
1267 template<Index Log2Dim>
+
1268 template<MergePolicy Policy>
+
1269 inline void
+ +
1271 {
+ +
1273  if (Policy != MERGE_ACTIVE_STATES_AND_NODES) return;
+
1274  if (tileValue) mBuffer.mData.setOn();
+ +
1276 }
+
1277 
+
1278 
+
1280 
+
1281 
+
1282 template<Index Log2Dim>
+
1283 template<typename OtherType>
+
1284 inline void
+ +
1286 {
+
1287  mBuffer.mData |= other.valueMask();
+
1288 }
+
1289 
+
1290 
+
1291 template<Index Log2Dim>
+
1292 template<typename OtherType>
+
1293 inline void
+ +
1295  const bool&)
+
1296 {
+
1297  mBuffer.mData &= other.valueMask();
+
1298 }
+
1299 
+
1300 
+
1301 template<Index Log2Dim>
+
1302 template<typename OtherType>
+
1303 inline void
+ +
1305  const bool&)
+
1306 {
+
1307  mBuffer.mData &= !other.valueMask();
+
1308 }
+
1309 
+
1310 
+
1312 
+
1313 
+
1314 template<Index Log2Dim>
+
1315 inline void
+
1316 LeafNode<ValueMask, Log2Dim>::clip(const CoordBBox& clipBBox, bool background)
+
1317 {
+
1318  CoordBBox nodeBBox = this->getNodeBoundingBox();
+
1319  if (!clipBBox.hasOverlap(nodeBBox)) {
+
1320  // This node lies completely outside the clipping region. Fill it with background tiles.
+
1321  this->fill(nodeBBox, background, /*active=*/false);
+
1322  } else if (clipBBox.isInside(nodeBBox)) {
+
1323  // This node lies completely inside the clipping region. Leave it intact.
+
1324  return;
+
1325  }
+
1326 
+
1327  // This node isn't completely contained inside the clipping region.
+
1328  // Set any voxels that lie outside the region to the background value.
+
1329 
+
1330  // Construct a boolean mask that is on inside the clipping region and off outside it.
+
1331  NodeMaskType mask;
+
1332  nodeBBox.intersect(clipBBox);
+
1333  Coord xyz;
+
1334  int &x = xyz.x(), &y = xyz.y(), &z = xyz.z();
+
1335  for (x = nodeBBox.min().x(); x <= nodeBBox.max().x(); ++x) {
+
1336  for (y = nodeBBox.min().y(); y <= nodeBBox.max().y(); ++y) {
+
1337  for (z = nodeBBox.min().z(); z <= nodeBBox.max().z(); ++z) {
+
1338  mask.setOn(static_cast<Index32>(this->coordToOffset(xyz)));
+
1339  }
+
1340  }
+
1341  }
+
1342 
+
1343  // Set voxels that lie in the inactive region of the mask (i.e., outside
+
1344  // the clipping region) to the background value.
+
1345  for (MaskOffIter maskIter = mask.beginOff(); maskIter; ++maskIter) {
+
1346  this->setValueOff(maskIter.pos(), background);
+
1347  }
+
1348 }
+
1349 
+
1350 
+
1352 
+
1353 
+
1354 template<Index Log2Dim>
+
1355 inline void
+
1356 LeafNode<ValueMask, Log2Dim>::fill(const CoordBBox& bbox, bool value, bool)
+
1357 {
+
1358  for (Int32 x = bbox.min().x(); x <= bbox.max().x(); ++x) {
+
1359  const Index offsetX = (x & (DIM-1u))<<2*Log2Dim;
+
1360  for (Int32 y = bbox.min().y(); y <= bbox.max().y(); ++y) {
+
1361  const Index offsetXY = offsetX + ((y & (DIM-1u))<< Log2Dim);
+
1362  for (Int32 z = bbox.min().z(); z <= bbox.max().z(); ++z) {
+
1363  const Index offset = offsetXY + (z & (DIM-1u));
+
1364  mBuffer.mData.set(offset, value);
+
1365  }
+
1366  }
+
1367  }
+
1368 }
+
1369 
+
1370 template<Index Log2Dim>
+
1371 inline void
+
1372 LeafNode<ValueMask, Log2Dim>::fill(const bool& value, bool)
+
1373 {
+
1374  mBuffer.fill(value);
+
1375 }
+
1376 
+
1377 
+
1379 
+
1380 
+
1381 template<Index Log2Dim>
+
1382 template<typename DenseT>
+
1383 inline void
+
1384 LeafNode<ValueMask, Log2Dim>::copyToDense(const CoordBBox& bbox, DenseT& dense) const
+
1385 {
+
1386  typedef typename DenseT::ValueType DenseValueType;
+
1387 
+
1388  const size_t xStride = dense.xStride(), yStride = dense.yStride(), zStride = dense.zStride();
+
1389  const Coord& min = dense.bbox().min();
+
1390  DenseValueType* t0 = dense.data() + zStride * (bbox.min()[2] - min[2]); // target array
+
1391  const Int32 n0 = bbox.min()[2] & (DIM-1u);
+
1392  for (Int32 x = bbox.min()[0], ex = bbox.max()[0] + 1; x < ex; ++x) {
+
1393  DenseValueType* t1 = t0 + xStride * (x - min[0]);
+
1394  const Int32 n1 = n0 + ((x & (DIM-1u)) << 2*LOG2DIM);
+
1395  for (Int32 y = bbox.min()[1], ey = bbox.max()[1] + 1; y < ey; ++y) {
+
1396  DenseValueType* t2 = t1 + yStride * (y - min[1]);
+
1397  Int32 n2 = n1 + ((y & (DIM-1u)) << LOG2DIM);
+
1398  for (Int32 z = bbox.min()[2], ez = bbox.max()[2] + 1; z < ez; ++z, t2 += zStride) {
+
1399  *t2 = DenseValueType(mBuffer.mData.isOn(n2++));
+
1400  }
+
1401  }
+
1402  }
+
1403 }
+
1404 
+
1405 
+
1406 template<Index Log2Dim>
+
1407 template<typename DenseT>
+
1408 inline void
+
1409 LeafNode<ValueMask, Log2Dim>::copyFromDense(const CoordBBox& bbox, const DenseT& dense,
+
1410  bool background, bool tolerance)
+
1411 {
+
1412  typedef typename DenseT::ValueType DenseValueType;
+
1413  struct Local {
+
1414  inline static bool toBool(const DenseValueType& v) { return !math::isZero(v); }
+
1415  };
+
1416 
+
1417  const size_t xStride = dense.xStride(), yStride = dense.yStride(), zStride = dense.zStride();
+
1418  const Coord& min = dense.bbox().min();
+
1419  const DenseValueType* s0 = dense.data() + zStride * (bbox.min()[2] - min[2]); // source
+
1420  const Int32 n0 = bbox.min()[2] & (DIM-1u);
+
1421  for (Int32 x = bbox.min()[0], ex = bbox.max()[0] + 1; x < ex; ++x) {
+
1422  const DenseValueType* s1 = s0 + xStride * (x - min[0]);
+
1423  const Int32 n1 = n0 + ((x & (DIM-1u)) << 2*LOG2DIM);
+
1424  for (Int32 y = bbox.min()[1], ey = bbox.max()[1] + 1; y < ey; ++y) {
+
1425  const DenseValueType* s2 = s1 + yStride * (y - min[1]);
+
1426  Int32 n2 = n1 + ((y & (DIM-1u)) << LOG2DIM);
+
1427  for (Int32 z = bbox.min()[2], ez = bbox.max()[2]+1; z < ez; ++z, ++n2, s2 += zStride) {
+
1428  // Note: if tolerance is true (i.e., 1), then all boolean values compare equal.
+
1429  if (tolerance || (background == Local::toBool(*s2))) {
+
1430  mBuffer.mData.set(n2, background);
+
1431  } else {
+
1432  mBuffer.mData.set(n2, Local::toBool(*s2));
+
1433  }
+
1434  }
+
1435  }
+
1436  }
+
1437 }
+
1438 
+
1439 
+
1441 
+
1442 
+
1443 template<Index Log2Dim>
+
1444 template<typename CombineOp>
+
1445 inline void
+ +
1447 {
+
1448  CombineArgs<bool> args;
+
1449  for (Index i = 0; i < SIZE; ++i) {
+
1450  bool result = false, aVal = mBuffer.mData.isOn(i), bVal = other.mBuffer.mData.isOn(i);
+
1451  op(args.setARef(aVal)
+
1452  .setAIsActive(aVal)
+
1453  .setBRef(bVal)
+
1454  .setBIsActive(bVal)
+
1455  .setResultRef(result));
+
1456  mBuffer.mData.set(i, result);
+
1457  }
+
1458 }
+
1459 
+
1460 
+
1461 template<Index Log2Dim>
+
1462 template<typename CombineOp>
+
1463 inline void
+
1464 LeafNode<ValueMask, Log2Dim>::combine(bool value, bool valueIsActive, CombineOp& op)
+
1465 {
+
1466  CombineArgs<bool> args;
+
1467  args.setBRef(value).setBIsActive(valueIsActive);
+
1468  for (Index i = 0; i < SIZE; ++i) {
+
1469  bool result = false, aVal = mBuffer.mData.isOn(i);
+
1470  op(args.setARef(aVal)
+
1471  .setAIsActive(aVal)
+
1472  .setResultRef(result));
+
1473  mBuffer.mData.set(i, result);
+
1474  }
+
1475 }
+
1476 
+
1477 
+
1479 
+
1480 
+
1481 template<Index Log2Dim>
+
1482 template<typename CombineOp, typename OtherType>
+
1483 inline void
+
1484 LeafNode<ValueMask, Log2Dim>::combine2(const LeafNode& other, const OtherType& value,
+
1485  bool valueIsActive, CombineOp& op)
+
1486 {
+ +
1488  args.setBRef(value).setBIsActive(valueIsActive);
+
1489  for (Index i = 0; i < SIZE; ++i) {
+
1490  bool result = false, aVal = other.mBuffer.mData.isOn(i);
+
1491  op(args.setARef(aVal)
+
1492  .setAIsActive(aVal)
+
1493  .setResultRef(result));
+
1494  mBuffer.mData.set(i, result);
+
1495  }
+
1496 }
+
1497 
+
1498 
+
1499 template<Index Log2Dim>
+
1500 template<typename CombineOp, typename OtherNodeT>
+
1501 inline void
+
1502 LeafNode<ValueMask, Log2Dim>::combine2(bool value, const OtherNodeT& other,
+
1503  bool valueIsActive, CombineOp& op)
+
1504 {
+ +
1506  args.setARef(value).setAIsActive(valueIsActive);
+
1507  for (Index i = 0; i < SIZE; ++i) {
+
1508  bool result = false, bVal = other.mBuffer.mData.isOn(i);
+
1509  op(args.setBRef(bVal)
+
1510  .setBIsActive(bVal)
+
1511  .setResultRef(result));
+
1512  mBuffer.mData.set(i, result);
+
1513  }
+
1514 }
+
1515 
+
1516 
+
1517 template<Index Log2Dim>
+
1518 template<typename CombineOp, typename OtherNodeT>
+
1519 inline void
+
1520 LeafNode<ValueMask, Log2Dim>::combine2(const LeafNode& b0, const OtherNodeT& b1, CombineOp& op)
+
1521 {
+ +
1523  for (Index i = 0; i < SIZE; ++i) {
+
1524  bool result = false, b0Val = b0.mBuffer.mData.isOn(i), b1Val = b1.mBuffer.mData.isOn(i);
+
1525  op(args.setARef(b0Val)
+
1526  .setAIsActive(b0Val)
+
1527  .setBRef(b1Val)
+
1528  .setBIsActive(b1Val)
+
1529  .setResultRef(result));
+
1530  mBuffer.mData.set(i, result);
+
1531  }
+
1532 }
+
1533 
+
1534 
+
1536 
+
1537 template<Index Log2Dim>
+
1538 template<typename BBoxOp>
+
1539 inline void
+ +
1541 {
+
1542  if (op.template descent<LEVEL>()) {
+
1543  for (ValueOnCIter i=this->cbeginValueOn(); i; ++i) {
+
1544 #ifdef _MSC_VER
+
1545  op.operator()<LEVEL>(CoordBBox::createCube(i.getCoord(), 1));
+
1546 #else
+
1547  op.template operator()<LEVEL>(CoordBBox::createCube(i.getCoord(), 1));
+
1548 #endif
+
1549  }
+
1550  } else {
+
1551 #ifdef _MSC_VER
+
1552  op.operator()<LEVEL>(this->getNodeBoundingBox());
+
1553 #else
+
1554  op.template operator()<LEVEL>(this->getNodeBoundingBox());
+
1555 #endif
+
1556  }
+
1557 }
+
1558 
+
1559 
+
1560 template<Index Log2Dim>
+
1561 template<typename VisitorOp>
+
1562 inline void
+ +
1564 {
+
1565  doVisit<LeafNode, VisitorOp, ChildAllIter>(*this, op);
+
1566 }
+
1567 
+
1568 
+
1569 template<Index Log2Dim>
+
1570 template<typename VisitorOp>
+
1571 inline void
+ +
1573 {
+
1574  doVisit<const LeafNode, VisitorOp, ChildAllCIter>(*this, op);
+
1575 }
+
1576 
+
1577 
+
1578 template<Index Log2Dim>
+
1579 template<typename NodeT, typename VisitorOp, typename ChildAllIterT>
+
1580 inline void
+
1581 LeafNode<ValueMask, Log2Dim>::doVisit(NodeT& self, VisitorOp& op)
+
1582 {
+
1583  for (ChildAllIterT iter = self.beginChildAll(); iter; ++iter) {
+
1584  op(iter);
+
1585  }
+
1586 }
+
1587 
+
1588 
+
1590 
+
1591 
+
1592 template<Index Log2Dim>
+
1593 template<typename OtherLeafNodeType, typename VisitorOp>
+
1594 inline void
+
1595 LeafNode<ValueMask, Log2Dim>::visit2Node(OtherLeafNodeType& other, VisitorOp& op)
+
1596 {
+
1597  doVisit2Node<LeafNode, OtherLeafNodeType, VisitorOp, ChildAllIter,
+
1598  typename OtherLeafNodeType::ChildAllIter>(*this, other, op);
+
1599 }
+
1600 
+
1601 
+
1602 template<Index Log2Dim>
+
1603 template<typename OtherLeafNodeType, typename VisitorOp>
+
1604 inline void
+
1605 LeafNode<ValueMask, Log2Dim>::visit2Node(OtherLeafNodeType& other, VisitorOp& op) const
+
1606 {
+
1607  doVisit2Node<const LeafNode, OtherLeafNodeType, VisitorOp, ChildAllCIter,
+
1608  typename OtherLeafNodeType::ChildAllCIter>(*this, other, op);
+
1609 }
+
1610 
+
1611 
+
1612 template<Index Log2Dim>
+
1613 template<
+
1614  typename NodeT,
+
1615  typename OtherNodeT,
+
1616  typename VisitorOp,
+
1617  typename ChildAllIterT,
+
1618  typename OtherChildAllIterT>
+
1619 inline void
+
1620 LeafNode<ValueMask, Log2Dim>::doVisit2Node(NodeT& self, OtherNodeT& other, VisitorOp& op)
+
1621 {
+
1622  // Allow the two nodes to have different ValueTypes, but not different dimensions.
+
1623  BOOST_STATIC_ASSERT(OtherNodeT::SIZE == NodeT::SIZE);
+
1624  BOOST_STATIC_ASSERT(OtherNodeT::LEVEL == NodeT::LEVEL);
+
1625 
+
1626  ChildAllIterT iter = self.beginChildAll();
+
1627  OtherChildAllIterT otherIter = other.beginChildAll();
+
1628 
+
1629  for ( ; iter && otherIter; ++iter, ++otherIter) {
+
1630  op(iter, otherIter);
+
1631  }
+
1632 }
+
1633 
+
1634 
+
1636 
+
1637 
+
1638 template<Index Log2Dim>
+
1639 template<typename IterT, typename VisitorOp>
+
1640 inline void
+
1641 LeafNode<ValueMask, Log2Dim>::visit2(IterT& otherIter, VisitorOp& op, bool otherIsLHS)
+
1642 {
+
1643  doVisit2<LeafNode, VisitorOp, ChildAllIter, IterT>(*this, otherIter, op, otherIsLHS);
+
1644 }
+
1645 
+
1646 
+
1647 template<Index Log2Dim>
+
1648 template<typename IterT, typename VisitorOp>
+
1649 inline void
+
1650 LeafNode<ValueMask, Log2Dim>::visit2(IterT& otherIter, VisitorOp& op, bool otherIsLHS) const
+
1651 {
+
1652  doVisit2<const LeafNode, VisitorOp, ChildAllCIter, IterT>(*this, otherIter, op, otherIsLHS);
+
1653 }
+
1654 
+
1655 
+
1656 template<Index Log2Dim>
+
1657 template<
+
1658  typename NodeT,
+
1659  typename VisitorOp,
+
1660  typename ChildAllIterT,
+
1661  typename OtherChildAllIterT>
+
1662 inline void
+
1663 LeafNode<ValueMask, Log2Dim>::doVisit2(NodeT& self, OtherChildAllIterT& otherIter,
+
1664  VisitorOp& op, bool otherIsLHS)
+
1665 {
+
1666  if (!otherIter) return;
+
1667 
+
1668  if (otherIsLHS) {
+
1669  for (ChildAllIterT iter = self.beginChildAll(); iter; ++iter) {
+
1670  op(otherIter, iter);
+
1671  }
+
1672  } else {
+
1673  for (ChildAllIterT iter = self.beginChildAll(); iter; ++iter) {
+
1674  op(iter, otherIter);
+
1675  }
+
1676  }
+
1677 }
+
1678 
+
1679 } // namespace tree
+
1680 } // namespace OPENVDB_VERSION_NAME
+
1681 } // namespace openvdb
+
1682 
+
1683 #endif // OPENVDB_TREE_LEAF_NODE_MASK_HAS_BEEN_INCLUDED
+
1684 
+
1685 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
1686 // All rights reserved. This software is distributed under the
+
1687 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
bool isConstant(ValueType &constValue, bool &state, const ValueType &tolerance=zeroVal< ValueType >()) const
Definition: LeafNode.h:1754
+
void setOrigin(const Coord &origin)
Set the grid index coordinates of this node's local origin.
Definition: LeafNodeMask.h:246
+
LeafNode specialization for values of type ValueMask that encodes both the active states and the bool...
Definition: LeafNodeMask.h:55
+
ValueOffCIter endValueOff() const
Definition: LeafNodeMask.h:733
+
NodeMaskType & getValueMask()
Definition: LeafNodeMask.h:770
+
const NodeMaskType & valueMask() const
Definition: LeafNodeMask.h:769
+
ChildIter< MaskOnIter, const LeafNode > ChildOnCIter
Definition: LeafNodeMask.h:713
+ +
static Index coordToOffset(const Coord &xyz)
Return the linear table offset of the given global or local coordinates.
Definition: LeafNode.h:1276
+
const WordType * data() const
Definition: LeafNodeMask.h:135
+
const Coord & origin() const
Return the grid index coordinates of this node's local origin.
Definition: LeafNode.h:475
+ +
ValueIter< MaskOnIter, const LeafNode, const bool > ValueOnCIter
Definition: LeafNodeMask.h:707
+
static Index32 leafCount()
Return the leaf count for this node, which is one.
Definition: LeafNodeMask.h:204
+
NodeMaskType::Word WordType
Definition: LeafNodeMask.h:90
+
Index64 onLeafVoxelCount() const
Definition: LeafNodeMask.h:212
+
void unsetItem(Index pos, const ValueT &val) const
Definition: LeafNodeMask.h:702
+
bool isDense() const
Return true if this node only contains active voxels.
Definition: LeafNodeMask.h:220
+
CoordBBox getNodeBoundingBox() const
Return the bounding box of this node, i.e., the full index space spanned by this leaf node...
Definition: LeafNode.h:469
+
WordType * data()
Definition: LeafNodeMask.h:127
+
void setItem(Index pos, bool value) const
Definition: LeafNodeMask.h:659
+
static Index getValueLevel(const Coord &)
Return the level (0) at which leaf node values reside.
Definition: LeafNodeMask.h:311
+
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
static void getNodeLog2Dims(std::vector< Index > &dims)
Append the Log2Dim of this LeafNode to the specified vector.
Definition: LeafNodeMask.h:200
+
void addTile(Index level, const Coord &, const ValueType &, bool)
Definition: LeafNode.h:1795
+
static const bool sOn
Definition: LeafNodeMask.h:801
+
void copyToDense(const GridOrTreeT &sparse, DenseT &dense, bool serial=false)
Populate a dense grid with the values of voxels from a sparse grid, where the sparse grid intersects ...
Definition: Dense.h:443
+
Definition: Types.h:442
+
bool isValueMaskOn(Index n) const
Definition: LeafNodeMask.h:764
+
const NodeMaskType & getValueMask() const
Definition: LeafNode.h:1109
+
void setValuesOff()
Mark all voxels as inactive but don't change their values.
Definition: LeafNodeMask.h:361
+
bool operator==(const LeafNode &other) const
Check for buffer, state and origin equivalence.
Definition: LeafNode.h:1707
+
ValueAllIter endValueAll()
Definition: LeafNodeMask.h:737
+
void setValue(bool value) const
Definition: LeafNodeMask.h:661
+
Coord offsetToGlobalCoord(Index n) const
Return the global coordinates for a linear table offset.
Definition: LeafNode.h:1300
+
void resetBackground(bool, bool)
no-op since for this temaplte specialization voxel values and states are indistinguishable.
Definition: LeafNodeMask.h:500
+
static Index getChildDim()
Return the dimension of child nodes of this LeafNode, which is one for voxels.
Definition: LeafNodeMask.h:202
+
void getNodes(ArrayT &) const
This function exists only to enable template instantiation.
Definition: LeafNodeMask.h:592
+
void setValueOn(const Coord &xyz)
Mark the voxel at the given coordinates as active but don't change its value.
Definition: LeafNode.h:714
+
void visit(VisitorOp &)
Definition: LeafNode.h:2071
+
static Coord offsetToLocalCoord(Index n)
Return the local coordinates for a linear table offset, where offset 0 has coordinates (0...
Definition: LeafNode.h:1286
+
const NodeT * probeConstNode(const Coord &) const
This function exists only to enable template instantiation.
Definition: LeafNodeMask.h:591
+
const LeafNode * probeConstLeafAndCache(const Coord &, AccessorT &) const
Return a const pointer to this node.
Definition: LeafNodeMask.h:625
+
void setActiveState(Index offset, bool on)
Set the active state of the voxel at the given offset but don't change its value. ...
Definition: LeafNodeMask.h:316
+
ChildOffCIter endChildOff() const
Definition: LeafNodeMask.h:755
+
ChildAllCIter cbeginChildAll() const
Definition: LeafNodeMask.h:747
+ +
CombineArgs & setARef(const AValueType &a)
Redirect the A value to a new external source.
Definition: Types.h:365
+
Buffer(const Buffer &other)
Definition: LeafNodeMask.h:95
+
void setValueOff(Index offset)
Mark the voxel at the given offset as inactive but don't change its value.
Definition: LeafNodeMask.h:326
+
void topologyDifference(const LeafNode< OtherType, Log2Dim > &other, const ValueType &)
Difference this node's set of active values with the active values of the other node, whose ValueType may be different. So a resulting voxel will be active only if the original voxel is active in this LeafNode and inactive in the other LeafNode.
Definition: LeafNode.h:1917
+
bool isChildMaskOff() const
Definition: LeafNodeMask.h:774
+
ChildOnCIter endChildOn() const
Definition: LeafNodeMask.h:752
+
ChildAllCIter beginChildAll() const
Definition: LeafNodeMask.h:748
+
ValueOffIter endValueOff()
Definition: LeafNodeMask.h:734
+
bool isZero(const Type &x)
Return true if x is exactly equal to zero.
Definition: Math.h:324
+
ValueOnCIter beginValueOn() const
Definition: LeafNodeMask.h:720
+
static Index dim()
Return the number of voxels in each dimension.
Definition: LeafNodeMask.h:192
+
void modifyValue(Index offset, const ModifyOp &op)
Apply a functor to the value of the voxel at the given offset and mark the voxel as active...
Definition: LeafNode.h:732
+
void readBuffers(std::istream &is, bool fromHalf=false)
Read buffers from a stream.
Definition: LeafNode.h:1598
+
Definition: PointIndexGrid.h:68
+
DenseIter< const LeafNode, const ValueType, ChildAll > ChildAllCIter
Definition: LeafNode.h:592
+
void addLeaf(LeafNode *)
This function exists only to enable template instantiation.
Definition: LeafNodeMask.h:583
+
void modifyItem(Index n, const ModifyOp &op) const
Definition: LeafNodeMask.h:665
+
void setValueOn(Index offset)
Mark the voxel at the given offset as active but don't change its value.
Definition: LeafNodeMask.h:336
+
Index64 offLeafVoxelCount() const
Definition: LeafNodeMask.h:213
+
bool operator!=(const LeafNode &other) const
Definition: LeafNode.h:498
+
ChildAllCIter endChildAll() const
Definition: LeafNodeMask.h:758
+
boost::shared_ptr< LeafNodeType > Ptr
Definition: LeafNodeMask.h:59
+
bool isValueMaskOff() const
Definition: LeafNodeMask.h:767
+
Index64 onVoxelCount() const
Return the number of active voxels.
Definition: LeafNodeMask.h:209
+
ChildAllCIter cendChildAll() const
Definition: LeafNodeMask.h:757
+
void visitActiveBBox(BBoxOp &) const
Calls the templated functor BBoxOp with bounding box information. An additional level argument is pro...
Definition: LeafNode.h:2048
+
DenseIteratorBase< MaskDenseIter, DenseIter, NodeT, void, ValueT > BaseT
Definition: LeafNodeMask.h:685
+
static Index getValueLevelAndCache(const Coord &, AccessorT &)
Return the LEVEL (=0) at which leaf node values reside.
Definition: LeafNodeMask.h:480
+
ValueAllCIter cendValueAll() const
Definition: LeafNodeMask.h:735
+
const bool & getValue() const
Definition: LeafNodeMask.h:656
+
void stealNodes(ArrayT &, const ValueType &, bool)
This function exists only to enable template instantiation.
Definition: LeafNodeMask.h:593
+
ValueOffCIter cendValueOff() const
Definition: LeafNodeMask.h:732
+
ValueOnIter endValueOn()
Definition: LeafNodeMask.h:731
+
ValueOnCIter cendValueOn() const
Definition: LeafNodeMask.h:729
+
void modifyValueAndActiveStateAndCache(const Coord &xyz, const ModifyOp &op, AccessorT &)
Definition: LeafNodeMask.h:454
+
NodeMaskType::DenseIterator MaskDenseIter
Definition: LeafNodeMask.h:642
+
OPENVDB_API const void * getGridBackgroundValuePtr(std::ios_base &)
Return a pointer to the background value of the grid currently being read from or written to the give...
+
Index memUsage() const
Return the memory footprint of this buffer in bytes.
Definition: LeafNode.h:251
+
util::NodeMask< Log2Dim > NodeMaskType
Definition: LeafNodeMask.h:62
+
DenseIter< LeafNode, bool > ChildAllIter
Definition: LeafNodeMask.h:716
+ +
void setValueOn(const Coord &xyz)
Mark the voxel at the given coordinates as active but don't change its value.
Definition: LeafNodeMask.h:334
+
bool isChildMaskOff(Index) const
Definition: LeafNodeMask.h:773
+
void copyFromDense(const DenseT &dense, GridOrTreeT &sparse, const typename GridOrTreeT::ValueType &tolerance, bool serial=false)
Populate a sparse grid with the values of all of the voxels of a dense grid.
Definition: Dense.h:590
+
ValueType * mData
Definition: LeafNode.h:361
+
const bool & getValueAndCache(const Coord &xyz, AccessorT &) const
Return the value of the voxel at the given coordinates.
Definition: LeafNodeMask.h:416
+
OffIterator beginOff() const
Definition: NodeMasks.h:351
+
Index32 Index
Definition: Types.h:58
+
bool allocate()
Allocate memory for this node's buffer if it has not already been allocated.
Definition: LeafNodeMask.h:230
+
ChildAllCIter beginChildAll() const
Definition: LeafNode.h:623
+
ValueMask BuildType
Definition: LeafNodeMask.h:60
+
Buffer(const NodeMaskType &other)
Definition: LeafNodeMask.h:94
+
void getOrigin(Int32 &x, Int32 &y, Int32 &z) const
Return the grid index coordinates of this node's local origin.
Definition: LeafNodeMask.h:251
+
ValueAllCIter beginValueAll() const
Definition: LeafNodeMask.h:726
+
bool hasSameTopology(const LeafNode< OtherType, OtherLog2Dim > *other) const
Return true if the given node (which may have a different ValueType than this node) has the same acti...
Definition: LeafNode.h:1745
+
int32_t Int32
Definition: Types.h:60
+
void combine2(const LeafNode &other, const OtherType &, bool valueIsActive, CombineOp &)
Definition: LeafNode.h:1984
+
const bool & getFirstValue() const
Return a const reference to the first entry in the buffer.
Definition: LeafNodeMask.h:485
+
uint64_t Index64
Definition: Types.h:57
+
void fill(const ValueType &val)
Populate this buffer with a constant value.
Definition: LeafNode.h:171
+
void fill(bool val)
Definition: LeafNodeMask.h:97
+
NodeT * probeNode(const Coord &)
This function exists only to enable template instantiation.
Definition: LeafNodeMask.h:589
+
ValueOffIter beginValueOff()
Definition: LeafNodeMask.h:724
+
ValueIter(const MaskIterT &iter, NodeT *parent)
Definition: LeafNodeMask.h:653
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
NodeMaskType::OnIterator MaskOnIter
Definition: LeafNodeMask.h:640
+
OPENVDB_STATIC_SPECIALIZATION GridType::Ptr clip(const GridType &grid, const BBoxd &)
Clip the given grid against a world-space bounding box and return a new grid containing the result...
Definition: Clip.h:356
+
void clip(const CoordBBox &, const ValueType &background)
Set all voxels that lie outside the given axis-aligned box to the background.
Definition: LeafNode.h:1387
+
ValueOffCIter cbeginValueOff() const
Definition: LeafNodeMask.h:722
+
bool isValueOn(const Coord &xyz) const
Return true if the voxel at the given coordinates is active.
Definition: LeafNodeMask.h:364
+
ChildIter< MaskOnIter, LeafNode > ChildOnIter
Definition: LeafNodeMask.h:712
+
LeafNode< ValueMask, Log2Dim > LeafNodeType
Definition: LeafNodeMask.h:58
+
DenseIter(const MaskDenseIter &iter, NodeT *parent)
Definition: LeafNodeMask.h:689
+
const NodeMaskType & getValueMask() const
Definition: LeafNodeMask.h:768
+
ChildOnIter endChildOn()
Definition: LeafNodeMask.h:753
+
const LeafNode * probeConstLeaf(const Coord &) const
Return a const pointer to this node.
Definition: LeafNodeMask.h:623
+
Coord mOrigin
Global grid index coordinates (x,y,z) of the local origin of this node.
Definition: LeafNodeMask.h:798
+
static Index64 offTileCount()
Definition: LeafNodeMask.h:215
+
void negate()
Invert the bits of the voxels, i.e. states and values.
Definition: LeafNodeMask.h:503
+
Templated block class to hold specific data types and a fixed number of values determined by Log2Dim...
Definition: LeafNode.h:65
+
void visit2Node(OtherLeafNodeType &other, VisitorOp &)
Definition: LeafNode.h:2103
+
NodeT * probeNodeAndCache(const Coord &, AccessorT &)
Return a pointer to this node.
Definition: LeafNodeMask.h:610
+
void setActiveState(const Coord &xyz, bool on)
Set the active state of the voxel at the given coordinates but don't change its value.
Definition: LeafNode.h:1361
+
void setValueMaskOn(Index n)
Definition: LeafNodeMask.h:777
+
void setValueAndCache(const Coord &xyz, bool val, AccessorT &)
Change the value of the voxel at the given coordinates and mark it as active.
Definition: LeafNodeMask.h:426
+
void modifyValue(const ModifyOp &op) const
Definition: LeafNodeMask.h:668
+
Bit mask for the internal and leaf nodes of VDB. This is a 64-bit implementation. ...
Definition: NodeMasks.h:304
+
void addTileAndCache(Index, const Coord &, const ValueType &, bool, AccessorT &)
Definition: LeafNode.h:1812
+
~LeafNode()
Destructor.
Definition: LeafNode.h:1256
+
BaseT::NonConstValueType NonConstValueT
Definition: LeafNodeMask.h:686
+
ValueAllCIter cbeginValueAll() const
Definition: LeafNodeMask.h:725
+
void readTopology(std::istream &is, bool fromHalf=false)
Read in just the topology.
Definition: LeafNode.h:1536
+
const bool & operator[](Index i) const
Definition: LeafNodeMask.h:112
+
Definition: Exceptions.h:39
+
LeafNode< OtherValueType, Log2Dim > Type
Definition: LeafNodeMask.h:77
+
static Index log2dim()
Return log2 of the size of the buffer storage.
Definition: LeafNodeMask.h:190
+
void topologyUnion(const LeafNode< OtherType, Log2Dim > &other)
Union this node's set of active values with the active values of the other node, whose ValueType may ...
Definition: LeafNode.h:1900
+
static Index32 nonLeafCount()
Return the non-leaf count for this node, which is zero.
Definition: LeafNodeMask.h:206
+
static Index getLevel()
Return the level of this node, which by definition is zero for LeafNodes.
Definition: LeafNodeMask.h:198
+
NodeMaskType::OffIterator MaskOffIter
Definition: LeafNodeMask.h:641
+
uint32_t Index32
Definition: Types.h:56
+
#define OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN
Definition: Platform.h:129
+
ValueAllIter beginValueAll()
Definition: LeafNodeMask.h:727
+
ChildIter< MaskOffIter, LeafNode > ChildOffIter
Definition: LeafNodeMask.h:714
+
std::string str() const
Return a string representation of this node.
Definition: LeafNode.h:1263
+
void setValueMaskOff(Index n)
Definition: LeafNodeMask.h:778
+
void setValuesOn()
Mark all voxels as active but don't change their values.
Definition: LeafNodeMask.h:359
+
Index64 Word
Definition: NodeMasks.h:313
+
LeafNode * probeLeafAndCache(const Coord &, AccessorT &)
Return a pointer to this node.
Definition: LeafNodeMask.h:608
+
ValueIter< MaskDenseIter, LeafNode, const bool > ValueAllIter
Definition: LeafNodeMask.h:710
+
Base class for dense iterators over internal and leaf nodes.
Definition: Iterator.h:211
+
const Buffer & buffer() const
Definition: LeafNodeMask.h:280
+
SparseIteratorBase< MaskIterT, ValueIter, NodeT, ValueT > BaseT
Definition: LeafNodeMask.h:650
+
Base class for sparse iterators over internal and leaf nodes.
Definition: Iterator.h:148
+
const ValueType & getValue(const Coord &xyz) const
Return the value of the voxel at the given coordinates.
Definition: LeafNode.h:1311
+
ChildOffCIter cendChildOff() const
Definition: LeafNodeMask.h:754
+
boost::remove_const< UnsetItemT >::type NonConstValueType
Definition: Iterator.h:217
+
static void doVisit2(NodeT &self, OtherChildAllIterT &, VisitorOp &, bool otherIsLHS)
Definition: LeafNode.h:2173
+
ValueOnCIter cbeginValueOn() const
Definition: LeafNode.h:594
+ +
static Index64 onTileCount()
Definition: LeafNodeMask.h:214
+
Definition: NodeMasks.h:267
+
bool probeValue(const Coord &xyz, ValueType &val) const
Return true if the voxel at the given coordinates is active.
Definition: LeafNode.h:1327
+
ChildAllIter beginChildAll()
Definition: LeafNodeMask.h:749
+
static const Index SIZE
Definition: LeafNode.h:80
+
void setValueMask(Index n, bool on)
Definition: LeafNodeMask.h:776
+
bool getItem(Index pos, void *&child, NonConstValueT &value) const
Definition: LeafNodeMask.h:691
+
static const bool sOff
Definition: LeafNodeMask.h:802
+
ValueAllCIter endValueAll() const
Definition: LeafNodeMask.h:736
+
ChildOffIter beginChildOff()
Definition: LeafNodeMask.h:746
+
void setOn(Index32 n)
Set the nth bit on.
Definition: NodeMasks.h:449
+
bool isChildMaskOn(Index) const
Definition: LeafNodeMask.h:772
+
void combine(const LeafNode &other, CombineOp &op)
Definition: LeafNode.h:1942
+
ValueOnCIter endValueOn() const
Definition: LeafNodeMask.h:730
+
ChildOnCIter beginChildOn() const
Definition: LeafNodeMask.h:742
+
ValueIter< MaskOffIter, const LeafNode, const bool > ValueOffCIter
Definition: LeafNodeMask.h:709
+
bool isValueMaskOn() const
Definition: LeafNodeMask.h:765
+
bool ValueType
Definition: LeafNodeMask.h:61
+
Index64 memUsage() const
Return the memory in bytes occupied by this node.
Definition: LeafNode.h:1717
+
bool isEmpty() const
Return true if this node has no active voxels.
Definition: LeafNodeMask.h:218
+
void copyToDense(const CoordBBox &bbox, DenseT &dense) const
Copy into a dense grid the values of the voxels that lie within a given bounding box.
Definition: LeafNode.h:1468
+
static void doVisit2Node(NodeT &self, OtherNodeT &other, VisitorOp &)
Definition: LeafNode.h:2128
+
bool operator==(const Vec3< T0 > &v0, const Vec3< T1 > &v1)
Equality operator, does exact floating point comparisons.
Definition: Vec3.h:450
+
LeafNode()
Default constructor.
Definition: LeafNode.h:1170
+
ChildOnCIter cendChildOn() const
Definition: LeafNodeMask.h:751
+
ValueOnCIter cbeginValueOn() const
Definition: LeafNodeMask.h:719
+
void setActiveStateAndCache(const Coord &xyz, bool on, AccessorT &)
Set the active state of the voxel at the given coordinates without changing its value.
Definition: LeafNodeMask.h:463
+
ChildIter(const MaskIterT &iter, NodeT *parent)
Definition: LeafNodeMask.h:677
+
#define OPENVDB_NO_UNREACHABLE_CODE_WARNING_END
Definition: Platform.h:130
+
void setValueOff(const Coord &xyz)
Mark the voxel at the given coordinates as inactive but don't change its value.
Definition: LeafNodeMask.h:324
+
Buffer & buffer()
Definition: LeafNodeMask.h:281
+
CombineArgs & setBRef(const BValueType &b)
Redirect the B value to a new external source.
Definition: Types.h:367
+
static void evalNodeOrigin(Coord &xyz)
Compute the origin of the leaf node that contains the voxel with the given coordinates.
Definition: LeafNodeMask.h:781
+
static Index size()
Definition: LeafNodeMask.h:122
+
void modifyValueAndCache(const Coord &xyz, const ModifyOp &op, AccessorT &)
Apply a functor to the value of the voxel at the given coordinates and mark the voxel as active...
Definition: LeafNodeMask.h:446
+
void setValueOnly(const Coord &xyz, const ValueType &val)
Set the value of the voxel at the given coordinates but don't change its active state.
Definition: LeafNode.h:1369
+ +
void setValueOffAndCache(const Coord &xyz, bool value, AccessorT &)
Change the value of the voxel at the given coordinates and mark it as inactive.
Definition: LeafNodeMask.h:437
+
static const Index LOG2DIM
Definition: LeafNode.h:75
+
const bool & getValue(Index i) const
Definition: LeafNodeMask.h:104
+ +
void swap(Buffer &other)
Exchange this node's data buffer with the given data buffer without changing the active states of the...
Definition: LeafNodeMask.h:279
+
Index memUsage() const
Definition: LeafNodeMask.h:121
+
ChildOnCIter cbeginChildOn() const
Definition: LeafNodeMask.h:741
+
ChildOffCIter beginChildOff() const
Definition: LeafNodeMask.h:745
+
bool probeValueAndCache(const Coord &xyz, bool &val, AccessorT &) const
Return true if the voxel at the given coordinates is active and return the voxel value in val...
Definition: LeafNodeMask.h:472
+
void evalActiveBoundingBox(CoordBBox &bbox, bool visitVoxels=true) const
Definition: LeafNode.h:1727
+
const NodeMaskType & valueMask() const
Definition: LeafNode.h:1111
+
DenseIter< LeafNode, ValueType, ChildAll > ChildAllIter
Definition: LeafNode.h:591
+ +
bool isValueMaskOff(Index n) const
Definition: LeafNodeMask.h:766
+
void setValue(const Coord &xyz, bool val)
Set the value of the voxel at the given coordinates and mark the voxel as active. ...
Definition: LeafNodeMask.h:341
+
ChildIter< MaskOffIter, const LeafNode > ChildOffCIter
Definition: LeafNodeMask.h:715
+
bool isValueOn(Index offset) const
Return true if the voxel at the given offset is active.
Definition: LeafNodeMask.h:366
+
bool operator!=(const Vec3< T0 > &v0, const Vec3< T1 > &v1)
Inequality operator, does exact floating point comparisons.
Definition: Vec3.h:458
+
void prune(TreeT &tree, typename TreeT::ValueType tolerance=zeroVal< typename TreeT::ValueType >(), bool threaded=true, size_t grainSize=1)
Reduce the memory footprint of a tree by replacing with tiles any nodes whose values are all the same...
Definition: Prune.h:347
+
void copyFromDense(const CoordBBox &bbox, const DenseT &dense, const ValueType &background, const ValueType &tolerance)
Copy from a dense grid into this node the values of the voxels that lie within a given bounding box...
Definition: LeafNode.h:1497
+
const bool & getLastValue() const
Return a const reference to the last entry in the buffer.
Definition: LeafNodeMask.h:489
+
ValueIter< MaskOffIter, LeafNode, const bool > ValueOffIter
Definition: LeafNodeMask.h:708
+
ChildAllIter endChildAll()
Definition: LeafNodeMask.h:759
+
void setValueMask(const NodeMaskType &mask)
Definition: LeafNodeMask.h:771
+
Definition: NodeMasks.h:205
+
void voxelizeActiveTiles(bool=true)
No-op.
Definition: LeafNodeMask.h:511
+
ChildOffIter endChildOff()
Definition: LeafNodeMask.h:756
+
Definition: NodeMasks.h:236
+ +
ValueIter< MaskOnIter, LeafNode, const bool > ValueOnIter
Definition: LeafNodeMask.h:706
+
bool isInactive() const
Return true if all of this node's values are inactive.
Definition: LeafNodeMask.h:496
+
const LeafNode * probeLeafAndCache(const Coord &, AccessorT &) const
Return a const pointer to this node.
Definition: LeafNodeMask.h:622
+
Definition: Types.h:444
+
static void doVisit(NodeT &, VisitorOp &)
Definition: LeafNode.h:2089
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
void swap(Buffer &other)
Definition: LeafNodeMask.h:119
+
static bool hasActiveTiles()
Return false since leaf nodes never contain tiles.
Definition: LeafNodeMask.h:369
+
ValueOffCIter beginValueOff() const
Definition: LeafNodeMask.h:723
+
void setValueOnly(Index offset, bool val)
Set the value of the voxel at the given offset but don't change its active state. ...
Definition: LeafNodeMask.h:321
+
Index64 offVoxelCount() const
Return the number of inactive voxels.
Definition: LeafNodeMask.h:211
+
bool isValueOnAndCache(const Coord &xyz, AccessorT &) const
Return true if the voxel at the given coordinates is active.
Definition: LeafNodeMask.h:421
+
void setValueOnlyAndCache(const Coord &xyz, bool val, AccessorT &)
Change the value of the voxel at the given coordinates but preserve its state.
Definition: LeafNodeMask.h:432
+
bool operator!=(const Buffer &other) const
Definition: LeafNodeMask.h:115
+
void topologyIntersection(const LeafNode< OtherType, Log2Dim > &other, const ValueType &)
Intersect this node's set of active values with the active values of the other node, whose ValueType may be different. So a resulting voxel will be active only if both of the original voxels were active.
Definition: LeafNode.h:1908
+
ValueIter< MaskDenseIter, const LeafNode, const bool > ValueAllCIter
Definition: LeafNodeMask.h:711
+
static Index numValues()
Return the total number of voxels represented by this LeafNode.
Definition: LeafNodeMask.h:196
+
static Index size()
Return the total number of voxels represented by this LeafNode.
Definition: LeafNodeMask.h:194
+
void merge(const LeafNode &)
Definition: LeafNode.h:1847
+
void modifyValueAndActiveState(const Coord &xyz, const ModifyOp &op)
Apply a functor to the voxel at the given coordinates.
Definition: LeafNode.h:749
+
Definition: Types.h:109
+
CoordBBox getNodeBoundingBox() const
Return the bounding box of this node, i.e., the full index space spanned by this leaf node...
Definition: LeafNodeMask.h:243
+
Buffer mBuffer
Bitmask representing the values AND state of voxels.
Definition: LeafNodeMask.h:795
+
Definition: Types.h:266
+
Buffer & operator=(const Buffer &b)
Definition: LeafNodeMask.h:98
+
TreeT * tree
Definition: MaskToLevelSet.h:118
+
LeafNode * probeLeaf(const Coord &)
Return a pointer to this node.
Definition: LeafNodeMask.h:606
+
void visit2(IterT &otherIter, VisitorOp &, bool otherIsLHS=false)
Definition: LeafNode.h:2149
+
DenseIter< const LeafNode, const bool > ChildAllCIter
Definition: LeafNodeMask.h:717
+
void fill(const CoordBBox &bbox, const ValueType &, bool active=true)
Set all voxels within an axis-aligned box to the specified value and active state.
Definition: LeafNode.h:1427
+
ValueOnIter beginValueOn()
Definition: LeafNodeMask.h:721
+
void setValue(Index i, bool val)
Definition: LeafNodeMask.h:117
+
void setValueOff(const Coord &xyz)
Mark the voxel at the given coordinates as inactive but don't change its value.
Definition: LeafNode.h:704
+
void addLeafAndCache(LeafNode *, AccessorT &)
This function exists only to enable template instantiation.
Definition: LeafNodeMask.h:585
+ +
void writeTopology(std::ostream &os, bool toHalf=false) const
Write out just the topology.
Definition: LeafNode.h:1544
+ +
This struct collects both input and output arguments to "grid combiner" functors used with the tree::...
Definition: Types.h:312
+
ChildOnIter beginChildOn()
Definition: LeafNodeMask.h:743
+
void writeBuffers(std::ostream &os, bool toHalf=false) const
Write buffers to a stream.
Definition: LeafNode.h:1690
+
const NodeT * probeConstNodeAndCache(const Coord &, AccessorT &) const
Return a const pointer to this node.
Definition: LeafNodeMask.h:627
+ +
void getOrigin(Coord &origin) const
Return the grid index coordinates of this node's local origin.
Definition: LeafNodeMask.h:250
+
const bool & getItem(Index pos) const
Definition: LeafNodeMask.h:655
+
ChildOffCIter cbeginChildOff() const
Definition: LeafNodeMask.h:744
+
NodeT * stealNode(const Coord &, const ValueType &, bool)
This function exists only to enable template instantiation.
Definition: LeafNodeMask.h:587
+
Base class for iterators over internal and leaf nodes.
Definition: Iterator.h:58
+
bool operator==(const Buffer &other) const
Definition: LeafNodeMask.h:114
+
LeafNode * touchLeafAndCache(const Coord &, AccessorT &)
Return a pointer to this node.
Definition: LeafNodeMask.h:605
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & min(const T &a, const T &b)
Definition: Composite.h:128
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/LeafNode_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/LeafNode_8h_source.html new file mode 100644 index 00000000..d483d812 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/LeafNode_8h_source.html @@ -0,0 +1,2325 @@ + + + + + + +OpenVDB: LeafNode.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
LeafNode.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 
+
31 #ifndef OPENVDB_TREE_LEAFNODE_HAS_BEEN_INCLUDED
+
32 #define OPENVDB_TREE_LEAFNODE_HAS_BEEN_INCLUDED
+
33 
+
34 #include <iostream>
+
35 #include <algorithm> // for std::swap
+
36 #include <cstring> // for std::memcpy()
+
37 #include <boost/shared_ptr.hpp>
+
38 #include <boost/static_assert.hpp>
+
39 #include <boost/bind.hpp>
+
40 #include <tbb/blocked_range.h>
+
41 #include <tbb/spin_mutex.h>
+
42 #include <tbb/parallel_for.h>
+
43 #include <openvdb/Types.h>
+
44 #include <openvdb/util/NodeMasks.h>
+
45 #include <openvdb/io/Compression.h> // for io::readData(), etc.
+
46 #include "Iterator.h"
+
47 
+
48 
+
49 class TestLeaf;
+
50 template<typename> class TestLeafIO;
+
51 
+
52 namespace openvdb {
+ +
54 namespace OPENVDB_VERSION_NAME {
+
55 namespace tree {
+
56 
+
57 template<Index, typename> struct SameLeafConfig; // forward declaration
+
58 
+
59 
+
64 template<typename T, Index Log2Dim>
+
65 class LeafNode
+
66 {
+
67 public:
+
68  typedef T BuildType;
+
69  typedef T ValueType;
+ +
71  typedef boost::shared_ptr<LeafNode> Ptr;
+ +
73 
+
74  static const Index
+
75  LOG2DIM = Log2Dim, // needed by parent nodes
+
76  TOTAL = Log2Dim, // needed by parent nodes
+
77  DIM = 1 << TOTAL, // dimension along one coordinate direction
+
78  NUM_VALUES = 1 << 3 * Log2Dim,
+
79  NUM_VOXELS = NUM_VALUES, // total number of voxels represented by this node
+
80  SIZE = NUM_VALUES,
+
81  LEVEL = 0; // level 0 = leaf
+
82 
+
85  template<typename OtherValueType>
+
86  struct ValueConverter {
+ +
88  };
+
89 
+
92  template<typename OtherNodeType>
+ + +
95  };
+
96 
+
97 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
98  struct FileInfo
+
99  {
+
100  FileInfo(): bufpos(0) , maskpos(0) {}
+
101  std::streamoff bufpos;
+
102  std::streamoff maskpos;
+ +
104  boost::shared_ptr<io::StreamMetadata> meta;
+
105  };
+
106 #endif
+
107 
+
110  class Buffer
+
111  {
+
112  public:
+
113 #ifdef OPENVDB_2_ABI_COMPATIBLE
+
114  Buffer(): mData(new ValueType[SIZE]) {}
+
117  explicit Buffer(const ValueType& val): mData(new ValueType[SIZE]) { this->fill(val); }
+
119  Buffer(const Buffer& other): mData(new ValueType[SIZE]) { *this = other; }
+
121  ~Buffer() { delete[] mData; }
+
122 
+
124  bool isOutOfCore() const { return false; }
+
126  bool empty() const { return (mData == NULL); }
+
127 #else
+
128  typedef ValueType WordType;
+
129  static const Index WORD_COUNT = SIZE;
+
131  Buffer(): mData(new ValueType[SIZE]), mOutOfCore(0) {}
+
133  explicit Buffer(const ValueType& val): mData(new ValueType[SIZE]), mOutOfCore(0)
+
134  {
+
135  this->fill(val);
+
136  }
+
138  Buffer(const Buffer& other): mData(NULL), mOutOfCore(other.mOutOfCore)
+
139  {
+
140  if (other.isOutOfCore()) {
+
141  mFileInfo = new FileInfo(*other.mFileInfo);
+
142  } else {
+
143  this->allocate();
+
144  ValueType* target = mData;
+
145  const ValueType* source = other.mData;
+
146  Index n = SIZE;
+
147  while (n--) *target++ = *source++;
+
148  }
+
149  }
+
151  Buffer(PartialCreate, const ValueType&): mData(NULL), mOutOfCore(0) {}
+ +
154  {
+
155  if (this->isOutOfCore()) {
+
156  this->detachFromFile();
+
157  } else {
+
158  this->deallocate();
+
159  }
+
160  }
+
161 
+
163  bool isOutOfCore() const { return bool(mOutOfCore); }
+
165  bool empty() const { return !mData || this->isOutOfCore(); }
+
166 #endif
+
167  bool allocate() { if (mData == NULL) mData = new ValueType[SIZE]; return !this->empty(); }
+
169 
+
171  void fill(const ValueType& val)
+
172  {
+
173  this->detachFromFile();
+
174  if (mData != NULL) {
+
175  ValueType* target = mData;
+
176  Index n = SIZE;
+
177  while (n--) *target++ = val;
+
178  }
+
179  }
+
180 
+
182  const ValueType& getValue(Index i) const { return this->at(i); }
+
184  const ValueType& operator[](Index i) const { return this->at(i); }
+
186  void setValue(Index i, const ValueType& val)
+
187  {
+
188  assert(i < SIZE);
+
189 #ifdef OPENVDB_2_ABI_COMPATIBLE
+
190  mData[i] = val;
+
191 #else
+
192  this->loadValues();
+
193  if (mData) mData[i] = val;
+
194 #endif
+
195  }
+
196 
+
198  Buffer& operator=(const Buffer& other)
+
199  {
+
200  if (&other != this) {
+
201 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
202  if (this->isOutOfCore()) {
+
203  this->detachFromFile();
+
204  } else {
+
205  if (other.isOutOfCore()) this->deallocate();
+
206  }
+
207  if (other.isOutOfCore()) {
+
208  mOutOfCore = other.mOutOfCore;
+
209  mFileInfo = new FileInfo(*other.mFileInfo);
+
210  } else {
+
211 #endif
+
212  this->allocate();
+
213  ValueType* target = mData;
+
214  const ValueType* source = other.mData;
+
215  Index n = SIZE;
+
216  while (n--) *target++ = *source++;
+
217 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
218  }
+
219 #endif
+
220  }
+
221  return *this;
+
222  }
+
223 
+
226  bool operator==(const Buffer& other) const
+
227  {
+
228  this->loadValues();
+
229  other.loadValues();
+
230  const ValueType *target = mData, *source = other.mData;
+
231  if (!target && !source) return true;
+
232  if (!target || !source) return false;
+
233  Index n = SIZE;
+
234  while (n && math::isExactlyEqual(*target++, *source++)) --n;
+
235  return n == 0;
+
236  }
+
239  bool operator!=(const Buffer& other) const { return !(other == *this); }
+
240 
+
242  void swap(Buffer& other)
+
243  {
+
244  std::swap(mData, other.mData);
+
245 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
246  std::swap(mOutOfCore, other.mOutOfCore);
+
247 #endif
+
248  }
+
249 
+
251  Index memUsage() const
+
252  {
+
253  size_t n = sizeof(*this);
+
254 #ifdef OPENVDB_2_ABI_COMPATIBLE
+
255  if (mData) n += SIZE * sizeof(ValueType);
+
256 #else
+
257  if (this->isOutOfCore()) n += sizeof(FileInfo);
+
258  else if (mData) n += SIZE * sizeof(ValueType);
+
259 #endif
+
260  return static_cast<Index>(n);
+
261  }
+
263  static Index size() { return SIZE; }
+
264 
+
268  const ValueType* data() const
+
269  {
+
270 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
271  this->loadValues();
+
272  if (mData == NULL) {
+
273  Buffer* self = const_cast<Buffer*>(this);
+
274  // This lock will be contended at most once.
+
275  tbb::spin_mutex::scoped_lock lock(self->mMutex);
+
276  if (mData == NULL) self->mData = new ValueType[SIZE];
+
277  }
+
278 #endif
+
279  return mData;
+
280  }
+
281 
+
285  ValueType* data()
+
286  {
+
287 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
288  this->loadValues();
+
289  if (mData == NULL) {
+
290  // This lock will be contended at most once.
+
291  tbb::spin_mutex::scoped_lock lock(mMutex);
+
292  if (mData == NULL) mData = new ValueType[SIZE];
+
293  }
+
294 #endif
+
295  return mData;
+
296  }
+
297 
+
298  private:
+
300  const ValueType& at(Index i) const
+
301  {
+
302  assert(i < SIZE);
+
303 #ifdef OPENVDB_2_ABI_COMPATIBLE
+
304  return mData[i];
+
305 #else
+
306  this->loadValues();
+
307  // We can't use the ternary operator here, otherwise Visual C++ returns
+
308  // a reference to a temporary.
+
309  if (mData) return mData[i]; else return sZero;
+
310 #endif
+
311  }
+
312 
+
318  ValueType& operator[](Index i) { return const_cast<ValueType&>(this->at(i)); }
+
319 
+
320  bool deallocate()
+
321  {
+
322  if (mData != NULL && !this->isOutOfCore()) {
+
323  delete[] mData;
+
324  mData = NULL;
+
325  return true;
+
326  }
+
327  return false;
+
328  }
+
329 
+
330 #ifdef OPENVDB_2_ABI_COMPATIBLE
+
331  void setOutOfCore(bool) {}
+
332  void loadValues() const {}
+
333  void doLoad() const {}
+
334  bool detachFromFile() { return false; }
+
335 #else
+
336  inline void setOutOfCore(bool b) { mOutOfCore = b; }
+
337  // To facilitate inlining in the common case in which the buffer is in-core,
+
338  // the loading logic is split into a separate function, doLoad().
+
339  inline void loadValues() const { if (this->isOutOfCore()) this->doLoad(); }
+
340  inline void doLoad() const;
+
341  inline bool detachFromFile()
+
342  {
+
343  if (this->isOutOfCore()) {
+
344  delete mFileInfo;
+
345  mFileInfo = NULL;
+
346  this->setOutOfCore(false);
+
347  return true;
+
348  }
+
349  return false;
+
350  }
+
351 #endif
+
352 
+
353  friend class ::TestLeaf;
+
354  // Allow the parent LeafNode to access this buffer's data pointer.
+
355  friend class LeafNode;
+
356 
+
357 #ifdef OPENVDB_2_ABI_COMPATIBLE
+
358  ValueType* mData;
+
359 #else
+
360  union {
+
361  ValueType* mData;
+ +
363  };
+
364  Index32 mOutOfCore; // currently interpreted as bool; extra bits reserved for future use
+
365  tbb::spin_mutex mMutex; // 1 byte
+
366  //int8_t mReserved[3]; // padding for alignment
+
367 
+
368  static const ValueType sZero;
+
369 #endif
+
370  }; // class Buffer
+
371 
+
372 
+
374  LeafNode();
+
375 
+
380  explicit LeafNode(const Coord& coords,
+
381  const ValueType& value = zeroVal<ValueType>(),
+
382  bool active = false);
+
383 
+
384 
+
385 #ifndef OPENVDB_2_ABI_COMPATIBLE
+ +
392  const Coord& coords,
+
393  const ValueType& value = zeroVal<ValueType>(),
+
394  bool active = false);
+
395 #endif
+
396 
+
398  LeafNode(const LeafNode&);
+
399 
+
401  template<typename OtherValueType>
+
402  explicit LeafNode(const LeafNode<OtherValueType, Log2Dim>& other);
+
403 
+
405  template<typename OtherValueType>
+ +
407  const ValueType& offValue, const ValueType& onValue, TopologyCopy);
+
408 
+
410  template<typename OtherValueType>
+ +
412  const ValueType& background, TopologyCopy);
+
413 
+
415  ~LeafNode();
+
416 
+
417  //
+
418  // Statistics
+
419  //
+
421  static Index log2dim() { return Log2Dim; }
+
423  static Index dim() { return DIM; }
+
425  static Index size() { return SIZE; }
+
427  static Index numValues() { return SIZE; }
+
429  static Index getLevel() { return LEVEL; }
+
431  static void getNodeLog2Dims(std::vector<Index>& dims) { dims.push_back(Log2Dim); }
+
433  static Index getChildDim() { return 1; }
+
435  static Index32 leafCount() { return 1; }
+
437  static Index32 nonLeafCount() { return 0; }
+
438 
+
440  Index64 onVoxelCount() const { return mValueMask.countOn(); }
+
442  Index64 offVoxelCount() const { return mValueMask.countOff(); }
+
443  Index64 onLeafVoxelCount() const { return onVoxelCount(); }
+
444  Index64 offLeafVoxelCount() const { return offVoxelCount(); }
+
445  static Index64 onTileCount() { return 0; }
+
446  static Index64 offTileCount() { return 0; }
+
448  bool isEmpty() const { return mValueMask.isOff(); }
+
450  bool isDense() const { return mValueMask.isOn(); }
+
451 
+
452 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
453  bool isAllocated() const { return !mBuffer.isOutOfCore() && !mBuffer.empty(); }
+
456  bool allocate() { return mBuffer.allocate(); }
+
457 #endif
+
458 
+
460  Index64 memUsage() const;
+
461 
+
465  void evalActiveBoundingBox(CoordBBox& bbox, bool visitVoxels = true) const;
+
466 
+
469  CoordBBox getNodeBoundingBox() const { return CoordBBox::createCube(mOrigin, DIM); }
+
470 
+
472  void setOrigin(const Coord& origin) { mOrigin = origin; }
+
474  const Coord& origin() const { return mOrigin; }
+
476  void getOrigin(Coord& origin) const { origin = mOrigin; }
+
477  void getOrigin(Int32& x, Int32& y, Int32& z) const { mOrigin.asXYZ(x, y, z); }
+
479 
+
481  static Index coordToOffset(const Coord& xyz);
+
484  static Coord offsetToLocalCoord(Index n);
+
486  Coord offsetToGlobalCoord(Index n) const;
+
487 
+
489  std::string str() const;
+
490 
+
493  template<typename OtherType, Index OtherLog2Dim>
+
494  bool hasSameTopology(const LeafNode<OtherType, OtherLog2Dim>* other) const;
+
495 
+
497  bool operator==(const LeafNode& other) const;
+
498  bool operator!=(const LeafNode& other) const { return !(other == *this); }
+
499 
+
500 protected:
+ + + +
504 
+
505  // Type tags to disambiguate template instantiations
+
506  struct ValueOn {}; struct ValueOff {}; struct ValueAll {};
+
507  struct ChildOn {}; struct ChildOff {}; struct ChildAll {};
+
508 
+
509  template<typename MaskIterT, typename NodeT, typename ValueT, typename TagT>
+
510  struct ValueIter:
+
511  // Derives from SparseIteratorBase, but can also be used as a dense iterator,
+
512  // if MaskIterT is a dense mask iterator type.
+
513  public SparseIteratorBase<
+
514  MaskIterT, ValueIter<MaskIterT, NodeT, ValueT, TagT>, NodeT, ValueT>
+
515  {
+ +
517 
+ +
519  ValueIter(const MaskIterT& iter, NodeT* parent): BaseT(iter, parent) {}
+
520 
+
521  ValueT& getItem(Index pos) const { return this->parent().getValue(pos); }
+
522  ValueT& getValue() const { return this->parent().getValue(this->pos()); }
+
523 
+
524  // Note: setItem() can't be called on const iterators.
+
525  void setItem(Index pos, const ValueT& value) const
+
526  {
+
527  this->parent().setValueOnly(pos, value);
+
528  }
+
529  // Note: setValue() can't be called on const iterators.
+
530  void setValue(const ValueT& value) const
+
531  {
+
532  this->parent().setValueOnly(this->pos(), value);
+
533  }
+
534 
+
535  // Note: modifyItem() can't be called on const iterators.
+
536  template<typename ModifyOp>
+
537  void modifyItem(Index n, const ModifyOp& op) const { this->parent().modifyValue(n, op); }
+
538  // Note: modifyValue() can't be called on const iterators.
+
539  template<typename ModifyOp>
+
540  void modifyValue(const ModifyOp& op) const { this->parent().modifyValue(this->pos(), op); }
+
541  };
+
542 
+
544  template<typename MaskIterT, typename NodeT, typename TagT>
+
545  struct ChildIter:
+
546  public SparseIteratorBase<MaskIterT, ChildIter<MaskIterT, NodeT, TagT>, NodeT, ValueType>
+
547  {
+ +
549  ChildIter(const MaskIterT& iter, NodeT* parent): SparseIteratorBase<
+
550  MaskIterT, ChildIter<MaskIterT, NodeT, TagT>, NodeT, ValueType>(iter, parent) {}
+
551  };
+
552 
+
553  template<typename NodeT, typename ValueT, typename TagT>
+
554  struct DenseIter: public DenseIteratorBase<
+
555  MaskDenseIterator, DenseIter<NodeT, ValueT, TagT>, NodeT, /*ChildT=*/void, ValueT>
+
556  {
+ + +
559 
+ +
561  DenseIter(const MaskDenseIterator& iter, NodeT* parent): BaseT(iter, parent) {}
+
562 
+
563  bool getItem(Index pos, void*& child, NonConstValueT& value) const
+
564  {
+
565  value = this->parent().getValue(pos);
+
566  child = NULL;
+
567  return false; // no child
+
568  }
+
569 
+
570  // Note: setItem() can't be called on const iterators.
+
571  //void setItem(Index pos, void* child) const {}
+
572 
+
573  // Note: unsetItem() can't be called on const iterators.
+
574  void unsetItem(Index pos, const ValueT& value) const
+
575  {
+
576  this->parent().setValueOnly(pos, value);
+
577  }
+
578  };
+
579 
+
580 public:
+ + + + + + + + + + + + +
593 
+
594  ValueOnCIter cbeginValueOn() const { return ValueOnCIter(mValueMask.beginOn(), this); }
+
595  ValueOnCIter beginValueOn() const { return ValueOnCIter(mValueMask.beginOn(), this); }
+
596  ValueOnIter beginValueOn() { return ValueOnIter(mValueMask.beginOn(), this); }
+
597  ValueOffCIter cbeginValueOff() const { return ValueOffCIter(mValueMask.beginOff(), this); }
+
598  ValueOffCIter beginValueOff() const { return ValueOffCIter(mValueMask.beginOff(), this); }
+
599  ValueOffIter beginValueOff() { return ValueOffIter(mValueMask.beginOff(), this); }
+
600  ValueAllCIter cbeginValueAll() const { return ValueAllCIter(mValueMask.beginDense(), this); }
+
601  ValueAllCIter beginValueAll() const { return ValueAllCIter(mValueMask.beginDense(), this); }
+
602  ValueAllIter beginValueAll() { return ValueAllIter(mValueMask.beginDense(), this); }
+
603 
+
604  ValueOnCIter cendValueOn() const { return ValueOnCIter(mValueMask.endOn(), this); }
+
605  ValueOnCIter endValueOn() const { return ValueOnCIter(mValueMask.endOn(), this); }
+
606  ValueOnIter endValueOn() { return ValueOnIter(mValueMask.endOn(), this); }
+
607  ValueOffCIter cendValueOff() const { return ValueOffCIter(mValueMask.endOff(), this); }
+
608  ValueOffCIter endValueOff() const { return ValueOffCIter(mValueMask.endOff(), this); }
+
609  ValueOffIter endValueOff() { return ValueOffIter(mValueMask.endOff(), this); }
+
610  ValueAllCIter cendValueAll() const { return ValueAllCIter(mValueMask.endDense(), this); }
+
611  ValueAllCIter endValueAll() const { return ValueAllCIter(mValueMask.endDense(), this); }
+
612  ValueAllIter endValueAll() { return ValueAllIter(mValueMask.endDense(), this); }
+
613 
+
614  // Note that [c]beginChildOn() and [c]beginChildOff() actually return end iterators,
+
615  // because leaf nodes have no children.
+
616  ChildOnCIter cbeginChildOn() const { return ChildOnCIter(mValueMask.endOn(), this); }
+
617  ChildOnCIter beginChildOn() const { return ChildOnCIter(mValueMask.endOn(), this); }
+
618  ChildOnIter beginChildOn() { return ChildOnIter(mValueMask.endOn(), this); }
+
619  ChildOffCIter cbeginChildOff() const { return ChildOffCIter(mValueMask.endOff(), this); }
+
620  ChildOffCIter beginChildOff() const { return ChildOffCIter(mValueMask.endOff(), this); }
+
621  ChildOffIter beginChildOff() { return ChildOffIter(mValueMask.endOff(), this); }
+
622  ChildAllCIter cbeginChildAll() const { return ChildAllCIter(mValueMask.beginDense(), this); }
+
623  ChildAllCIter beginChildAll() const { return ChildAllCIter(mValueMask.beginDense(), this); }
+
624  ChildAllIter beginChildAll() { return ChildAllIter(mValueMask.beginDense(), this); }
+
625 
+
626  ChildOnCIter cendChildOn() const { return ChildOnCIter(mValueMask.endOn(), this); }
+
627  ChildOnCIter endChildOn() const { return ChildOnCIter(mValueMask.endOn(), this); }
+
628  ChildOnIter endChildOn() { return ChildOnIter(mValueMask.endOn(), this); }
+
629  ChildOffCIter cendChildOff() const { return ChildOffCIter(mValueMask.endOff(), this); }
+
630  ChildOffCIter endChildOff() const { return ChildOffCIter(mValueMask.endOff(), this); }
+
631  ChildOffIter endChildOff() { return ChildOffIter(mValueMask.endOff(), this); }
+
632  ChildAllCIter cendChildAll() const { return ChildAllCIter(mValueMask.endDense(), this); }
+
633  ChildAllCIter endChildAll() const { return ChildAllCIter(mValueMask.endDense(), this); }
+
634  ChildAllIter endChildAll() { return ChildAllIter(mValueMask.endDense(), this); }
+
635 
+
636  //
+
637  // Buffer management
+
638  //
+
641  void swap(Buffer& other) { mBuffer.swap(other); }
+
642  const Buffer& buffer() const { return mBuffer; }
+
643  Buffer& buffer() { return mBuffer; }
+
644 
+
645  //
+
646  // I/O methods
+
647  //
+
651  void readTopology(std::istream& is, bool fromHalf = false);
+
655  void writeTopology(std::ostream& os, bool toHalf = false) const;
+
656 
+
660  void readBuffers(std::istream& is, bool fromHalf = false);
+
665  void readBuffers(std::istream& is, const CoordBBox& bbox, bool fromHalf = false);
+
669  void writeBuffers(std::ostream& os, bool toHalf = false) const;
+
670 
+
671  size_t streamingSize(bool toHalf = false) const;
+
672 
+
673  //
+
674  // Accessor methods
+
675  //
+
677  const ValueType& getValue(const Coord& xyz) const;
+
679  const ValueType& getValue(Index offset) const;
+
680 
+
684  bool probeValue(const Coord& xyz, ValueType& val) const;
+
688  bool probeValue(Index offset, ValueType& val) const;
+
689 
+
691  static Index getValueLevel(const Coord&) { return LEVEL; }
+
692 
+
694  void setActiveState(const Coord& xyz, bool on);
+
696  void setActiveState(Index offset, bool on) { assert(offset<SIZE); mValueMask.set(offset, on); }
+
697 
+
699  void setValueOnly(const Coord& xyz, const ValueType& val);
+
701  void setValueOnly(Index offset, const ValueType& val);
+
702 
+
704  void setValueOff(const Coord& xyz) { mValueMask.setOff(LeafNode::coordToOffset(xyz)); }
+
706  void setValueOff(Index offset) { assert(offset < SIZE); mValueMask.setOff(offset); }
+
707 
+
709  void setValueOff(const Coord& xyz, const ValueType& val);
+
711  void setValueOff(Index offset, const ValueType& val);
+
712 
+
714  void setValueOn(const Coord& xyz) { mValueMask.setOn(LeafNode::coordToOffset(xyz)); }
+
716  void setValueOn(Index offset) { assert(offset < SIZE); mValueMask.setOn(offset); }
+
718  void setValueOn(const Coord& xyz, const ValueType& val) {
+
719  this->setValueOn(LeafNode::coordToOffset(xyz), val);
+
720  }
+
722  void setValue(const Coord& xyz, const ValueType& val) { this->setValueOn(xyz, val); }
+
724  void setValueOn(Index offset, const ValueType& val) {
+
725  mBuffer.setValue(offset, val);
+
726  mValueMask.setOn(offset);
+
727  }
+
728 
+
731  template<typename ModifyOp>
+
732  void modifyValue(Index offset, const ModifyOp& op)
+
733  {
+
734  ValueType val = mBuffer[offset];
+
735  op(val);
+
736  mBuffer.setValue(offset, val);
+
737  mValueMask.setOn(offset);
+
738  }
+
741  template<typename ModifyOp>
+
742  void modifyValue(const Coord& xyz, const ModifyOp& op)
+
743  {
+
744  this->modifyValue(this->coordToOffset(xyz), op);
+
745  }
+
746 
+
748  template<typename ModifyOp>
+
749  void modifyValueAndActiveState(const Coord& xyz, const ModifyOp& op)
+
750  {
+
751  const Index offset = this->coordToOffset(xyz);
+
752  bool state = mValueMask.isOn(offset);
+
753  ValueType val = mBuffer[offset];
+
754  op(val, state);
+
755  mBuffer.setValue(offset, val);
+
756  mValueMask.set(offset, state);
+
757  }
+
758 
+
760  void setValuesOn() { mValueMask.setOn(); }
+
762  void setValuesOff() { mValueMask.setOff(); }
+
763 
+
765  bool isValueOn(const Coord& xyz) const {return this->isValueOn(LeafNode::coordToOffset(xyz));}
+
767  bool isValueOn(Index offset) const { return mValueMask.isOn(offset); }
+
768 
+
770  static bool hasActiveTiles() { return false; }
+
771 
+
773  void clip(const CoordBBox&, const ValueType& background);
+
774 
+
776  void fill(const CoordBBox& bbox, const ValueType&, bool active = true);
+
777 
+
779  void fill(const ValueType& value);
+
781  void fill(const ValueType& value, bool active);
+
782 
+
794  template<typename DenseT>
+
795  void copyToDense(const CoordBBox& bbox, DenseT& dense) const;
+
796 
+
813  template<typename DenseT>
+
814  void copyFromDense(const CoordBBox& bbox, const DenseT& dense,
+
815  const ValueType& background, const ValueType& tolerance);
+
816 
+
819  template<typename AccessorT>
+
820  const ValueType& getValueAndCache(const Coord& xyz, AccessorT&) const
+
821  {
+
822  return this->getValue(xyz);
+
823  }
+
824 
+
827  template<typename AccessorT>
+
828  bool isValueOnAndCache(const Coord& xyz, AccessorT&) const { return this->isValueOn(xyz); }
+
829 
+
832  template<typename AccessorT>
+
833  void setValueAndCache(const Coord& xyz, const ValueType& val, AccessorT&)
+
834  {
+
835  this->setValueOn(xyz, val);
+
836  }
+
837 
+
841  template<typename AccessorT>
+
842  void setValueOnlyAndCache(const Coord& xyz, const ValueType& val, AccessorT&)
+
843  {
+
844  this->setValueOnly(xyz, val);
+
845  }
+
846 
+
850  template<typename ModifyOp, typename AccessorT>
+
851  void modifyValueAndCache(const Coord& xyz, const ModifyOp& op, AccessorT&)
+
852  {
+
853  this->modifyValue(xyz, op);
+
854  }
+
855 
+
858  template<typename ModifyOp, typename AccessorT>
+
859  void modifyValueAndActiveStateAndCache(const Coord& xyz, const ModifyOp& op, AccessorT&)
+
860  {
+
861  this->modifyValueAndActiveState(xyz, op);
+
862  }
+
863 
+
866  template<typename AccessorT>
+
867  void setValueOffAndCache(const Coord& xyz, const ValueType& value, AccessorT&)
+
868  {
+
869  this->setValueOff(xyz, value);
+
870  }
+
871 
+
875  template<typename AccessorT>
+
876  void setActiveStateAndCache(const Coord& xyz, bool on, AccessorT&)
+
877  {
+
878  this->setActiveState(xyz, on);
+
879  }
+
880 
+
884  template<typename AccessorT>
+
885  bool probeValueAndCache(const Coord& xyz, ValueType& val, AccessorT&) const
+
886  {
+
887  return this->probeValue(xyz, val);
+
888  }
+
889 
+
893  template<typename AccessorT>
+
894  const ValueType& getValue(const Coord& xyz, bool& state, int& level, AccessorT&) const
+
895  {
+
896  const Index offset = this->coordToOffset(xyz);
+
897  state = mValueMask.isOn(offset);
+
898  level = LEVEL;
+
899  return mBuffer[offset];
+
900  }
+
901 
+
904  template<typename AccessorT>
+
905  static Index getValueLevelAndCache(const Coord&, AccessorT&) { return LEVEL; }
+
906 
+
910  const ValueType& getFirstValue() const { return mBuffer[0]; }
+
912  const ValueType& getLastValue() const { return mBuffer[SIZE - 1]; }
+
913 
+
916  void resetBackground(const ValueType& oldBackground, const ValueType& newBackground);
+
917 
+
918  void negate();
+
919 
+
922  void voxelizeActiveTiles(bool = true) {}
+
923 
+
924  template<MergePolicy Policy> void merge(const LeafNode&);
+
925  template<MergePolicy Policy> void merge(const ValueType& tileValue, bool tileActive);
+
926  template<MergePolicy Policy>
+
927  void merge(const LeafNode& other, const ValueType& /*bg*/, const ValueType& /*otherBG*/);
+
928 
+
935  template<typename OtherType>
+
936  void topologyUnion(const LeafNode<OtherType, Log2Dim>& other);
+
937 
+
949  template<typename OtherType>
+
950  void topologyIntersection(const LeafNode<OtherType, Log2Dim>& other, const ValueType&);
+
951 
+
963  template<typename OtherType>
+
964  void topologyDifference(const LeafNode<OtherType, Log2Dim>& other, const ValueType&);
+
965 
+
966  template<typename CombineOp>
+
967  void combine(const LeafNode& other, CombineOp& op);
+
968  template<typename CombineOp>
+
969  void combine(const ValueType& value, bool valueIsActive, CombineOp& op);
+
970 
+
971  template<typename CombineOp, typename OtherType /*= ValueType*/>
+
972  void combine2(const LeafNode& other, const OtherType&, bool valueIsActive, CombineOp&);
+
973  template<typename CombineOp, typename OtherNodeT /*= LeafNode*/>
+
974  void combine2(const ValueType&, const OtherNodeT& other, bool valueIsActive, CombineOp&);
+
975  template<typename CombineOp, typename OtherNodeT /*= LeafNode*/>
+
976  void combine2(const LeafNode& b0, const OtherNodeT& b1, CombineOp&);
+
977 
+
983  template<typename BBoxOp> void visitActiveBBox(BBoxOp&) const;
+
984 
+
985  template<typename VisitorOp> void visit(VisitorOp&);
+
986  template<typename VisitorOp> void visit(VisitorOp&) const;
+
987 
+
988  template<typename OtherLeafNodeType, typename VisitorOp>
+
989  void visit2Node(OtherLeafNodeType& other, VisitorOp&);
+
990  template<typename OtherLeafNodeType, typename VisitorOp>
+
991  void visit2Node(OtherLeafNodeType& other, VisitorOp&) const;
+
992  template<typename IterT, typename VisitorOp>
+
993  void visit2(IterT& otherIter, VisitorOp&, bool otherIsLHS = false);
+
994  template<typename IterT, typename VisitorOp>
+
995  void visit2(IterT& otherIter, VisitorOp&, bool otherIsLHS = false) const;
+
996 
+
998  void prune(const ValueType& /*tolerance*/ = zeroVal<ValueType>()) {}
+
1000  void addLeaf(LeafNode*) {}
+
1001  template<typename AccessorT>
+
1002  void addLeafAndCache(LeafNode*, AccessorT&) {}
+
1003  template<typename NodeT>
+
1004  NodeT* stealNode(const Coord&, const ValueType&, bool) { return NULL; }
+
1005  template<typename NodeT>
+
1006  NodeT* probeNode(const Coord&) { return NULL; }
+
1007  template<typename NodeT>
+
1008  const NodeT* probeConstNode(const Coord&) const { return NULL; }
+
1009  template<typename ArrayT> void getNodes(ArrayT&) const {}
+
1010  template<typename ArrayT> void stealNodes(ArrayT&, const ValueType&, bool) {}
+
1012 
+
1013  void addTile(Index level, const Coord&, const ValueType&, bool);
+
1014  void addTile(Index offset, const ValueType&, bool);
+
1015  template<typename AccessorT>
+
1016  void addTileAndCache(Index, const Coord&, const ValueType&, bool, AccessorT&);
+
1017 
+
1019  LeafNode* touchLeaf(const Coord&) { return this; }
+
1021  template<typename AccessorT>
+
1022  LeafNode* touchLeafAndCache(const Coord&, AccessorT&) { return this; }
+
1023  template<typename NodeT, typename AccessorT>
+
1024  NodeT* probeNodeAndCache(const Coord&, AccessorT&)
+
1025  {
+ +
1027  if (!(boost::is_same<NodeT,LeafNode>::value)) return NULL;
+
1028  return reinterpret_cast<NodeT*>(this);
+ +
1030  }
+
1031  LeafNode* probeLeaf(const Coord&) { return this; }
+
1032  template<typename AccessorT>
+
1033  LeafNode* probeLeafAndCache(const Coord&, AccessorT&) { return this; }
+
1035 
+
1036  const LeafNode* probeConstLeaf(const Coord&) const { return this; }
+
1038  template<typename AccessorT>
+
1039  const LeafNode* probeConstLeafAndCache(const Coord&, AccessorT&) const { return this; }
+
1040  template<typename AccessorT>
+
1041  const LeafNode* probeLeafAndCache(const Coord&, AccessorT&) const { return this; }
+
1042  const LeafNode* probeLeaf(const Coord&) const { return this; }
+
1043  template<typename NodeT, typename AccessorT>
+
1044  const NodeT* probeConstNodeAndCache(const Coord&, AccessorT&) const
+
1045  {
+ +
1047  if (!(boost::is_same<NodeT,LeafNode>::value)) return NULL;
+
1048  return reinterpret_cast<const NodeT*>(this);
+ +
1050  }
+
1052 
+
1062  bool isConstant(ValueType& constValue, bool& state,
+
1063  const ValueType& tolerance = zeroVal<ValueType>()) const;
+
1064 
+
1076  bool isConstant(ValueType& minValue, ValueType& maxValue,
+
1077  bool& state, const ValueType& tolerance = zeroVal<ValueType>()) const;
+
1078 
+
1080  bool isInactive() const { return mValueMask.isOff(); }
+
1081 
+
1082 protected:
+
1083  friend class ::TestLeaf;
+
1084  template<typename> friend class ::TestLeafIO;
+
1085 
+
1086  // During topology-only construction, access is needed
+
1087  // to protected/private members of other template instances.
+
1088  template<typename, Index> friend class LeafNode;
+
1089 
+
1090  friend struct ValueIter<MaskOnIterator, LeafNode, ValueType, ValueOn>;
+
1091  friend struct ValueIter<MaskOffIterator, LeafNode, ValueType, ValueOff>;
+
1092  friend struct ValueIter<MaskDenseIterator, LeafNode, ValueType, ValueAll>;
+
1093  friend struct ValueIter<MaskOnIterator, const LeafNode, ValueType, ValueOn>;
+
1094  friend struct ValueIter<MaskOffIterator, const LeafNode, ValueType, ValueOff>;
+
1095  friend struct ValueIter<MaskDenseIterator, const LeafNode, ValueType, ValueAll>;
+
1096 
+
1097  // Allow iterators to call mask accessor methods (see below).
+
1099  friend class IteratorBase<MaskOnIterator, LeafNode>;
+
1100  friend class IteratorBase<MaskOffIterator, LeafNode>;
+
1101  friend class IteratorBase<MaskDenseIterator, LeafNode>;
+
1102 
+
1103  // Mask accessors
+
1104 public:
+
1105  bool isValueMaskOn(Index n) const { return mValueMask.isOn(n); }
+
1106  bool isValueMaskOn() const { return mValueMask.isOn(); }
+
1107  bool isValueMaskOff(Index n) const { return mValueMask.isOff(n); }
+
1108  bool isValueMaskOff() const { return mValueMask.isOff(); }
+
1109  const NodeMaskType& getValueMask() const { return mValueMask; }
+
1110  NodeMaskType& getValueMask() { return mValueMask; }
+
1111  const NodeMaskType& valueMask() const { return mValueMask; }
+
1112  void setValueMask(const NodeMaskType& mask) { mValueMask = mask; }
+
1113  bool isChildMaskOn(Index) const { return false; } // leaf nodes have no children
+
1114  bool isChildMaskOff(Index) const { return true; }
+
1115  bool isChildMaskOff() const { return true; }
+
1116 protected:
+
1117  void setValueMask(Index n, bool on) { mValueMask.set(n, on); }
+
1118  void setValueMaskOn(Index n) { mValueMask.setOn(n); }
+
1119  void setValueMaskOff(Index n) { mValueMask.setOff(n); }
+
1120 
+
1122  static void evalNodeOrigin(Coord& xyz) { xyz &= ~(DIM - 1); }
+
1123 
+
1124  template<typename NodeT, typename VisitorOp, typename ChildAllIterT>
+
1125  static inline void doVisit(NodeT&, VisitorOp&);
+
1126 
+
1127  template<typename NodeT, typename OtherNodeT, typename VisitorOp,
+
1128  typename ChildAllIterT, typename OtherChildAllIterT>
+
1129  static inline void doVisit2Node(NodeT& self, OtherNodeT& other, VisitorOp&);
+
1130 
+
1131  template<typename NodeT, typename VisitorOp,
+
1132  typename ChildAllIterT, typename OtherChildAllIterT>
+
1133  static inline void doVisit2(NodeT& self, OtherChildAllIterT&, VisitorOp&, bool otherIsLHS);
+
1134 
+
1135 private:
+
1137  Buffer mBuffer;
+
1139  NodeMaskType mValueMask;
+
1141  Coord mOrigin;
+
1142 }; // end of LeafNode class
+
1143 
+
1144 
+
1145 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
1146 template<typename T, Index Log2Dim>
+
1147 const T LeafNode<T, Log2Dim>::Buffer::sZero = zeroVal<T>();
+
1148 #endif
+
1149 
+
1150 
+
1152 
+
1153 
+
1155 template<Index Dim1, typename NodeT2>
+
1158 struct SameLeafConfig { static const bool value = false; };
+
1159 
+
1160 template<Index Dim1, typename T2>
+
1161 struct SameLeafConfig<Dim1, LeafNode<T2, Dim1> > { static const bool value = true; };
+
1163 
+
1164 
+
1166 
+
1167 
+
1168 template<typename T, Index Log2Dim>
+
1169 inline
+ +
1171  mValueMask(),//default is off!
+
1172  mOrigin(0, 0, 0)
+
1173 {
+
1174 }
+
1175 
+
1176 
+
1177 template<typename T, Index Log2Dim>
+
1178 inline
+
1179 LeafNode<T, Log2Dim>::LeafNode(const Coord& xyz, const ValueType& val, bool active):
+
1180  mBuffer(val),
+
1181  mValueMask(active),
+
1182  mOrigin(xyz & (~(DIM - 1)))
+
1183 {
+
1184 }
+
1185 
+
1186 
+
1187 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
1188 template<typename T, Index Log2Dim>
+
1189 inline
+
1190 LeafNode<T, Log2Dim>::LeafNode(PartialCreate, const Coord& xyz, const ValueType& val, bool active):
+
1191  mBuffer(PartialCreate(), val),
+
1192  mValueMask(active),
+
1193  mOrigin(xyz & (~(DIM - 1)))
+
1194 {
+
1195 }
+
1196 #endif
+
1197 
+
1198 
+
1199 template<typename T, Index Log2Dim>
+
1200 inline
+ +
1202  mBuffer(other.mBuffer),
+
1203  mValueMask(other.valueMask()),
+
1204  mOrigin(other.mOrigin)
+
1205 {
+
1206 }
+
1207 
+
1208 
+
1209 // Copy-construct from a leaf node with the same configuration but a different ValueType.
+
1210 template<typename T, Index Log2Dim>
+
1211 template<typename OtherValueType>
+
1212 inline
+ +
1214  mValueMask(other.valueMask()),
+
1215  mOrigin(other.mOrigin)
+
1216 {
+
1217  struct Local {
+
1219  static inline ValueType convertValue(const OtherValueType& val) { return ValueType(val); }
+
1220  };
+
1221 
+
1222  for (Index i = 0; i < SIZE; ++i) {
+
1223  mBuffer[i] = Local::convertValue(other.mBuffer[i]);
+
1224  }
+
1225 }
+
1226 
+
1227 
+
1228 template<typename T, Index Log2Dim>
+
1229 template<typename OtherValueType>
+
1230 inline
+ +
1232  const ValueType& background, TopologyCopy):
+
1233  mBuffer(background),
+
1234  mValueMask(other.valueMask()),
+
1235  mOrigin(other.mOrigin)
+
1236 {
+
1237 }
+
1238 
+
1239 
+
1240 template<typename T, Index Log2Dim>
+
1241 template<typename OtherValueType>
+
1242 inline
+ +
1244  const ValueType& offValue, const ValueType& onValue, TopologyCopy):
+
1245  mValueMask(other.valueMask()),
+
1246  mOrigin(other.mOrigin)
+
1247 {
+
1248  for (Index i = 0; i < SIZE; ++i) {
+
1249  mBuffer[i] = (mValueMask.isOn(i) ? onValue : offValue);
+
1250  }
+
1251 }
+
1252 
+
1253 
+
1254 template<typename T, Index Log2Dim>
+
1255 inline
+ +
1257 {
+
1258 }
+
1259 
+
1260 
+
1261 template<typename T, Index Log2Dim>
+
1262 inline std::string
+ +
1264 {
+
1265  std::ostringstream ostr;
+
1266  ostr << "LeafNode @" << mOrigin << ": " << mBuffer;
+
1267  return ostr.str();
+
1268 }
+
1269 
+
1270 
+
1272 
+
1273 
+
1274 template<typename T, Index Log2Dim>
+
1275 inline Index
+ +
1277 {
+
1278  assert ((xyz[0] & (DIM-1u)) < DIM && (xyz[1] & (DIM-1u)) < DIM && (xyz[2] & (DIM-1u)) < DIM);
+
1279  return ((xyz[0] & (DIM-1u)) << 2*Log2Dim)
+
1280  + ((xyz[1] & (DIM-1u)) << Log2Dim)
+
1281  + (xyz[2] & (DIM-1u));
+
1282 }
+
1283 
+
1284 template<typename T, Index Log2Dim>
+
1285 inline Coord
+ +
1287 {
+
1288  assert(n<(1<< 3*Log2Dim));
+
1289  Coord xyz;
+
1290  xyz.setX(n >> 2*Log2Dim);
+
1291  n &= ((1<<2*Log2Dim)-1);
+
1292  xyz.setY(n >> Log2Dim);
+
1293  xyz.setZ(n & ((1<<Log2Dim)-1));
+
1294  return xyz;
+
1295 }
+
1296 
+
1297 
+
1298 template<typename T, Index Log2Dim>
+
1299 inline Coord
+ +
1301 {
+
1302  return (this->offsetToLocalCoord(n) + this->origin());
+
1303 }
+
1304 
+
1305 
+
1307 
+
1308 
+
1309 template<typename ValueT, Index Log2Dim>
+
1310 inline const ValueT&
+ +
1312 {
+
1313  return this->getValue(LeafNode::coordToOffset(xyz));
+
1314 }
+
1315 
+
1316 template<typename ValueT, Index Log2Dim>
+
1317 inline const ValueT&
+ +
1319 {
+
1320  assert(offset < SIZE);
+
1321  return mBuffer[offset];
+
1322 }
+
1323 
+
1324 
+
1325 template<typename T, Index Log2Dim>
+
1326 inline bool
+
1327 LeafNode<T, Log2Dim>::probeValue(const Coord& xyz, ValueType& val) const
+
1328 {
+
1329  return this->probeValue(LeafNode::coordToOffset(xyz), val);
+
1330 }
+
1331 
+
1332 template<typename T, Index Log2Dim>
+
1333 inline bool
+
1334 LeafNode<T, Log2Dim>::probeValue(Index offset, ValueType& val) const
+
1335 {
+
1336  assert(offset < SIZE);
+
1337  val = mBuffer[offset];
+
1338  return mValueMask.isOn(offset);
+
1339 }
+
1340 
+
1341 
+
1342 template<typename T, Index Log2Dim>
+
1343 inline void
+
1344 LeafNode<T, Log2Dim>::setValueOff(const Coord& xyz, const ValueType& val)
+
1345 {
+
1346  this->setValueOff(LeafNode::coordToOffset(xyz), val);
+
1347 }
+
1348 
+
1349 template<typename T, Index Log2Dim>
+
1350 inline void
+
1351 LeafNode<T, Log2Dim>::setValueOff(Index offset, const ValueType& val)
+
1352 {
+
1353  assert(offset < SIZE);
+
1354  mBuffer.setValue(offset, val);
+
1355  mValueMask.setOff(offset);
+
1356 }
+
1357 
+
1358 
+
1359 template<typename T, Index Log2Dim>
+
1360 inline void
+
1361 LeafNode<T, Log2Dim>::setActiveState(const Coord& xyz, bool on)
+
1362 {
+
1363  mValueMask.set(this->coordToOffset(xyz), on);
+
1364 }
+
1365 
+
1366 
+
1367 template<typename T, Index Log2Dim>
+
1368 inline void
+
1369 LeafNode<T, Log2Dim>::setValueOnly(const Coord& xyz, const ValueType& val)
+
1370 {
+
1371  this->setValueOnly(LeafNode::coordToOffset(xyz), val);
+
1372 }
+
1373 
+
1374 template<typename T, Index Log2Dim>
+
1375 inline void
+
1376 LeafNode<T, Log2Dim>::setValueOnly(Index offset, const ValueType& val)
+
1377 {
+
1378  assert(offset<SIZE); mBuffer.setValue(offset, val);
+
1379 }
+
1380 
+
1381 
+
1383 
+
1384 
+
1385 template<typename T, Index Log2Dim>
+
1386 inline void
+
1387 LeafNode<T, Log2Dim>::clip(const CoordBBox& clipBBox, const T& background)
+
1388 {
+
1389  CoordBBox nodeBBox = this->getNodeBoundingBox();
+
1390  if (!clipBBox.hasOverlap(nodeBBox)) {
+
1391  // This node lies completely outside the clipping region. Fill it with the background.
+
1392  this->fill(background, /*active=*/false);
+
1393  } else if (clipBBox.isInside(nodeBBox)) {
+
1394  // This node lies completely inside the clipping region. Leave it intact.
+
1395  return;
+
1396  }
+
1397 
+
1398  // This node isn't completely contained inside the clipping region.
+
1399  // Set any voxels that lie outside the region to the background value.
+
1400 
+
1401  // Construct a boolean mask that is on inside the clipping region and off outside it.
+
1402  NodeMaskType mask;
+
1403  nodeBBox.intersect(clipBBox);
+
1404  Coord xyz;
+
1405  int &x = xyz.x(), &y = xyz.y(), &z = xyz.z();
+
1406  for (x = nodeBBox.min().x(); x <= nodeBBox.max().x(); ++x) {
+
1407  for (y = nodeBBox.min().y(); y <= nodeBBox.max().y(); ++y) {
+
1408  for (z = nodeBBox.min().z(); z <= nodeBBox.max().z(); ++z) {
+
1409  mask.setOn(static_cast<Index32>(this->coordToOffset(xyz)));
+
1410  }
+
1411  }
+
1412  }
+
1413 
+
1414  // Set voxels that lie in the inactive region of the mask (i.e., outside
+
1415  // the clipping region) to the background value.
+
1416  for (MaskOffIterator maskIter = mask.beginOff(); maskIter; ++maskIter) {
+
1417  this->setValueOff(maskIter.pos(), background);
+
1418  }
+
1419 }
+
1420 
+
1421 
+
1423 
+
1424 
+
1425 template<typename T, Index Log2Dim>
+
1426 inline void
+
1427 LeafNode<T, Log2Dim>::fill(const CoordBBox& bbox, const ValueType& value, bool active)
+
1428 {
+
1429 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
1430  if (!this->allocate()) return;
+
1431 #endif
+
1432 
+
1433  for (Int32 x = bbox.min().x(); x <= bbox.max().x(); ++x) {
+
1434  const Index offsetX = (x & (DIM-1u)) << 2*Log2Dim;
+
1435  for (Int32 y = bbox.min().y(); y <= bbox.max().y(); ++y) {
+
1436  const Index offsetXY = offsetX + ((y & (DIM-1u)) << Log2Dim);
+
1437  for (Int32 z = bbox.min().z(); z <= bbox.max().z(); ++z) {
+
1438  const Index offset = offsetXY + (z & (DIM-1u));
+
1439  mBuffer[offset] = value;
+
1440  mValueMask.set(offset, active);
+
1441  }
+
1442  }
+
1443  }
+
1444 }
+
1445 
+
1446 template<typename T, Index Log2Dim>
+
1447 inline void
+
1448 LeafNode<T, Log2Dim>::fill(const ValueType& value)
+
1449 {
+
1450  mBuffer.fill(value);
+
1451 }
+
1452 
+
1453 template<typename T, Index Log2Dim>
+
1454 inline void
+
1455 LeafNode<T, Log2Dim>::fill(const ValueType& value, bool active)
+
1456 {
+
1457  mBuffer.fill(value);
+
1458  mValueMask.set(active);
+
1459 }
+
1460 
+
1461 
+
1463 
+
1464 
+
1465 template<typename T, Index Log2Dim>
+
1466 template<typename DenseT>
+
1467 inline void
+
1468 LeafNode<T, Log2Dim>::copyToDense(const CoordBBox& bbox, DenseT& dense) const
+
1469 {
+
1470 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
1471  if (!this->isAllocated()) return;
+
1472 #endif
+
1473 
+
1474  typedef typename DenseT::ValueType DenseValueType;
+
1475 
+
1476  const size_t xStride = dense.xStride(), yStride = dense.yStride(), zStride = dense.zStride();
+
1477  const Coord& min = dense.bbox().min();
+
1478  DenseValueType* t0 = dense.data() + zStride * (bbox.min()[2] - min[2]); // target array
+
1479  const T* s0 = &mBuffer[bbox.min()[2] & (DIM-1u)]; // source array
+
1480  for (Int32 x = bbox.min()[0], ex = bbox.max()[0] + 1; x < ex; ++x) {
+
1481  DenseValueType* t1 = t0 + xStride * (x - min[0]);
+
1482  const T* s1 = s0 + ((x & (DIM-1u)) << 2*Log2Dim);
+
1483  for (Int32 y = bbox.min()[1], ey = bbox.max()[1] + 1; y < ey; ++y) {
+
1484  DenseValueType* t2 = t1 + yStride * (y - min[1]);
+
1485  const T* s2 = s1 + ((y & (DIM-1u)) << Log2Dim);
+
1486  for (Int32 z = bbox.min()[2], ez = bbox.max()[2] + 1; z < ez; ++z, t2 += zStride) {
+
1487  *t2 = DenseValueType(*s2++);
+
1488  }
+
1489  }
+
1490  }
+
1491 }
+
1492 
+
1493 
+
1494 template<typename T, Index Log2Dim>
+
1495 template<typename DenseT>
+
1496 inline void
+
1497 LeafNode<T, Log2Dim>::copyFromDense(const CoordBBox& bbox, const DenseT& dense,
+
1498  const ValueType& background, const ValueType& tolerance)
+
1499 {
+
1500 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
1501  if (!this->allocate()) return;
+
1502 #endif
+
1503 
+
1504  typedef typename DenseT::ValueType DenseValueType;
+
1505 
+
1506  const size_t xStride = dense.xStride(), yStride = dense.yStride(), zStride = dense.zStride();
+
1507  const Coord& min = dense.bbox().min();
+
1508 
+
1509  const DenseValueType* s0 = dense.data() + zStride * (bbox.min()[2] - min[2]); // source
+
1510  const Int32 n0 = bbox.min()[2] & (DIM-1u);
+
1511  for (Int32 x = bbox.min()[0], ex = bbox.max()[0]+1; x < ex; ++x) {
+
1512  const DenseValueType* s1 = s0 + xStride * (x - min[0]);
+
1513  const Int32 n1 = n0 + ((x & (DIM-1u)) << 2*LOG2DIM);
+
1514  for (Int32 y = bbox.min()[1], ey = bbox.max()[1]+1; y < ey; ++y) {
+
1515  const DenseValueType* s2 = s1 + yStride * (y - min[1]);
+
1516  Int32 n2 = n1 + ((y & (DIM-1u)) << LOG2DIM);
+
1517  for (Int32 z = bbox.min()[2], ez = bbox.max()[2]+1; z < ez; ++z, ++n2, s2 += zStride) {
+
1518  if (math::isApproxEqual(background, ValueType(*s2), tolerance)) {
+
1519  mValueMask.setOff(n2);
+
1520  mBuffer[n2] = background;
+
1521  } else {
+
1522  mValueMask.setOn(n2);
+
1523  mBuffer[n2] = ValueType(*s2);
+
1524  }
+
1525  }
+
1526  }
+
1527  }
+
1528 }
+
1529 
+
1530 
+
1532 
+
1533 
+
1534 template<typename T, Index Log2Dim>
+
1535 inline void
+
1536 LeafNode<T, Log2Dim>::readTopology(std::istream& is, bool /*fromHalf*/)
+
1537 {
+
1538  mValueMask.load(is);
+
1539 }
+
1540 
+
1541 
+
1542 template<typename T, Index Log2Dim>
+
1543 inline void
+
1544 LeafNode<T, Log2Dim>::writeTopology(std::ostream& os, bool /*toHalf*/) const
+
1545 {
+
1546  mValueMask.save(os);
+
1547 }
+
1548 
+
1549 
+
1551 
+
1552 
+
1553 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
1554 template<typename T, Index Log2Dim>
+
1555 inline void
+ +
1557 {
+
1558  if (!this->isOutOfCore()) return;
+
1559 
+
1560  Buffer* self = const_cast<Buffer*>(this);
+
1561 
+
1562  // This lock will be contended at most once, after which this buffer
+
1563  // will no longer be out-of-core.
+
1564  tbb::spin_mutex::scoped_lock lock(self->mMutex);
+
1565  if (!this->isOutOfCore()) return;
+
1566 
+
1567  boost::scoped_ptr<FileInfo> info(self->mFileInfo);
+
1568  assert(info.get() != NULL);
+
1569  assert(info->mapping.get() != NULL);
+
1570  assert(info->meta.get() != NULL);
+
1571 
+
1573  self->mData = NULL;
+
1574  self->allocate();
+
1575 
+
1576  boost::shared_ptr<std::streambuf> buf = info->mapping->createBuffer();
+
1577  std::istream is(buf.get());
+
1578 
+
1579  io::setStreamMetadataPtr(is, info->meta, /*transfer=*/true);
+
1580 
+
1581  NodeMaskType mask;
+
1582  is.seekg(info->maskpos);
+
1583  mask.load(is);
+
1584 
+
1585  is.seekg(info->bufpos);
+
1586  io::readCompressedValues(is, self->mData, SIZE, mask, io::getHalfFloat(is));
+
1587 
+
1588  self->setOutOfCore(false);
+
1589 }
+
1590 #endif
+
1591 
+
1592 
+
1594 
+
1595 
+
1596 template<typename T, Index Log2Dim>
+
1597 inline void
+
1598 LeafNode<T,Log2Dim>::readBuffers(std::istream& is, bool fromHalf)
+
1599 {
+
1600  this->readBuffers(is, CoordBBox::inf(), fromHalf);
+
1601 }
+
1602 
+
1603 
+
1604 template<typename T, Index Log2Dim>
+
1605 inline void
+
1606 LeafNode<T,Log2Dim>::readBuffers(std::istream& is, const CoordBBox& clipBBox, bool fromHalf)
+
1607 {
+
1608 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
1609  std::streamoff maskpos = is.tellg();
+
1610 #endif
+
1611 
+
1612  // Read in the value mask.
+
1613  mValueMask.load(is);
+
1614 
+
1615  int8_t numBuffers = 1;
+ +
1617  // Read in the origin.
+
1618  is.read(reinterpret_cast<char*>(&mOrigin), sizeof(Coord::ValueType) * 3);
+
1619 
+
1620  // Read in the number of buffers, which should now always be one.
+
1621  is.read(reinterpret_cast<char*>(&numBuffers), sizeof(int8_t));
+
1622  }
+
1623 
+
1624  CoordBBox nodeBBox = this->getNodeBoundingBox();
+
1625  if (!clipBBox.hasOverlap(nodeBBox)) {
+
1626  // This node lies completely outside the clipping region.
+
1627  // Read and discard its voxel values.
+
1628  Buffer temp;
+
1629  io::readCompressedValues(is, temp.mData, SIZE, mValueMask, fromHalf);
+
1630  mValueMask.setOff();
+
1631  mBuffer.setOutOfCore(false);
+
1632  } else {
+
1633 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
1634  // If this node lies completely inside the clipping region and it is being read
+
1635  // from a memory-mapped file, delay loading of its buffer until the buffer
+
1636  // is actually accessed. (If this node requires clipping, its buffer
+
1637  // must be accessed and therefore must be loaded.)
+
1638  io::MappedFile::Ptr mappedFile = io::getMappedFilePtr(is);
+
1639  const bool delayLoad = ((mappedFile.get() != NULL) && clipBBox.isInside(nodeBBox));
+
1640 
+
1641  if (delayLoad) {
+
1642  mBuffer.setOutOfCore(true);
+
1643  mBuffer.mFileInfo = new FileInfo;
+
1644  mBuffer.mFileInfo->bufpos = is.tellg();
+
1645  mBuffer.mFileInfo->mapping = mappedFile;
+
1646  // Save the offset to the value mask, because the in-memory copy
+
1647  // might change before the value buffer gets read.
+
1648  mBuffer.mFileInfo->maskpos = maskpos;
+
1649 
+
1650  mBuffer.mFileInfo->meta = io::getStreamMetadataPtr(is);
+
1651 
+
1652  // Read and discard voxel values.
+
1653  Buffer temp;
+
1654  io::readCompressedValues(is, temp.mData, SIZE, mValueMask, fromHalf);
+
1655  } else {
+
1656 #endif
+
1657  mBuffer.allocate();
+
1658  io::readCompressedValues(is, mBuffer.mData, SIZE, mValueMask, fromHalf);
+
1659  mBuffer.setOutOfCore(false);
+
1660 
+
1661  // Get this tree's background value.
+
1662  T background = zeroVal<T>();
+
1663  if (const void* bgPtr = io::getGridBackgroundValuePtr(is)) {
+
1664  background = *static_cast<const T*>(bgPtr);
+
1665  }
+
1666  this->clip(clipBBox, background);
+
1667 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
1668  }
+
1669 #endif
+
1670  }
+
1671 
+
1672  if (numBuffers > 1) {
+
1673  // Read in and discard auxiliary buffers that were created with earlier
+
1674  // versions of the library. (Auxiliary buffers are not mask compressed.)
+
1675  const bool zipped = io::getDataCompression(is) & io::COMPRESS_ZIP;
+
1676  Buffer temp;
+
1677  for (int i = 1; i < numBuffers; ++i) {
+
1678  if (fromHalf) {
+
1679  io::HalfReader<io::RealToHalf<T>::isReal, T>::read(is, temp.mData, SIZE, zipped);
+
1680  } else {
+
1681  io::readData<T>(is, temp.mData, SIZE, zipped);
+
1682  }
+
1683  }
+
1684  }
+
1685 }
+
1686 
+
1687 
+
1688 template<typename T, Index Log2Dim>
+
1689 inline void
+
1690 LeafNode<T, Log2Dim>::writeBuffers(std::ostream& os, bool toHalf) const
+
1691 {
+
1692  // Write out the value mask.
+
1693  mValueMask.save(os);
+
1694 
+
1695  mBuffer.loadValues();
+
1696 
+
1697  io::writeCompressedValues(os, mBuffer.mData, SIZE,
+
1698  mValueMask, /*childMask=*/NodeMaskType(), toHalf);
+
1699 }
+
1700 
+
1701 
+
1703 
+
1704 
+
1705 template<typename T, Index Log2Dim>
+
1706 inline bool
+ +
1708 {
+
1709  return mOrigin == other.mOrigin &&
+
1710  mValueMask == other.valueMask() &&
+
1711  mBuffer == other.mBuffer;
+
1712 }
+
1713 
+
1714 
+
1715 template<typename T, Index Log2Dim>
+
1716 inline Index64
+ +
1718 {
+
1719  // Use sizeof(*this) to capture alignment-related padding
+
1720  // (but note that sizeof(*this) includes sizeof(mBuffer)).
+
1721  return sizeof(*this) + mBuffer.memUsage() - sizeof(mBuffer);
+
1722 }
+
1723 
+
1724 
+
1725 template<typename T, Index Log2Dim>
+
1726 inline void
+
1727 LeafNode<T, Log2Dim>::evalActiveBoundingBox(CoordBBox& bbox, bool visitVoxels) const
+
1728 {
+
1729  CoordBBox this_bbox = this->getNodeBoundingBox();
+
1730  if (bbox.isInside(this_bbox)) return;//this LeafNode is already enclosed in the bbox
+
1731  if (ValueOnCIter iter = this->cbeginValueOn()) {//any active values?
+
1732  if (visitVoxels) {//use voxel granularity?
+
1733  this_bbox.reset();
+
1734  for(; iter; ++iter) this_bbox.expand(this->offsetToLocalCoord(iter.pos()));
+
1735  this_bbox.translate(this->origin());
+
1736  }
+
1737  bbox.expand(this_bbox);
+
1738  }
+
1739 }
+
1740 
+
1741 
+
1742 template<typename T, Index Log2Dim>
+
1743 template<typename OtherType, Index OtherLog2Dim>
+
1744 inline bool
+ +
1746 {
+
1747  assert(other);
+
1748  return (Log2Dim == OtherLog2Dim && mValueMask == other->getValueMask());
+
1749 }
+
1750 
+
1751 
+
1752 template<typename T, Index Log2Dim>
+
1753 inline bool
+
1754 LeafNode<T, Log2Dim>::isConstant(ValueType& value, bool& state,
+
1755  const ValueType& tolerance) const
+
1756 {
+
1757  state = mValueMask.isOn();
+
1758  if (!(state || mValueMask.isOff())) return false;// Are values neither active nor inactive?
+
1759 
+
1760  value = mBuffer[0];
+
1761  for (Index i = 1; i < SIZE; ++i) {
+
1762  if ( !math::isApproxEqual(mBuffer[i], value, tolerance) ) return false;
+
1763  }
+
1764  return true;
+
1765 }
+
1766 
+
1767 template<typename T, Index Log2Dim>
+
1768 inline bool
+
1769 LeafNode<T, Log2Dim>::isConstant(ValueType& minValue, ValueType& maxValue,
+
1770  bool& state, const ValueType& tolerance) const
+
1771 {
+
1772  state = mValueMask.isOn();
+
1773  if (!(state || mValueMask.isOff())) return false;// Are values neither active nor inactive?
+
1774 
+
1775  const T range = 2 * tolerance;
+
1776  minValue = maxValue = mBuffer[0];
+
1777  for (Index i = 1; i < SIZE; ++i) {// early termination
+
1778  const T& v = mBuffer[i];
+
1779  if (v < minValue) {
+
1780  if ((maxValue - v) > range) return false;
+
1781  minValue = v;
+
1782  } else if (v > maxValue) {
+
1783  if ((v - minValue) > range) return false;
+
1784  maxValue = v;
+
1785  }
+
1786  }
+
1787  return true;
+
1788 }
+
1789 
+
1791 
+
1792 
+
1793 template<typename T, Index Log2Dim>
+
1794 inline void
+
1795 LeafNode<T, Log2Dim>::addTile(Index /*level*/, const Coord& xyz, const ValueType& val, bool active)
+
1796 {
+
1797  this->addTile(this->coordToOffset(xyz), val, active);
+
1798 }
+
1799 
+
1800 template<typename T, Index Log2Dim>
+
1801 inline void
+
1802 LeafNode<T, Log2Dim>::addTile(Index offset, const ValueType& val, bool active)
+
1803 {
+
1804  assert(offset < SIZE);
+
1805  setValueOnly(offset, val);
+
1806  setActiveState(offset, active);
+
1807 }
+
1808 
+
1809 template<typename T, Index Log2Dim>
+
1810 template<typename AccessorT>
+
1811 inline void
+ +
1813  const ValueType& val, bool active, AccessorT&)
+
1814 {
+
1815  this->addTile(level, xyz, val, active);
+
1816 }
+
1817 
+
1818 
+
1820 
+
1821 
+
1822 template<typename T, Index Log2Dim>
+
1823 inline void
+
1824 LeafNode<T, Log2Dim>::resetBackground(const ValueType& oldBackground,
+
1825  const ValueType& newBackground)
+
1826 {
+
1827 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
1828  if (!this->allocate()) return;
+
1829 #endif
+
1830 
+
1831  typename NodeMaskType::OffIterator iter;
+
1832  // For all inactive values...
+
1833  for (iter = this->mValueMask.beginOff(); iter; ++iter) {
+
1834  ValueType &inactiveValue = mBuffer[iter.pos()];
+
1835  if (math::isApproxEqual(inactiveValue, oldBackground)) {
+
1836  inactiveValue = newBackground;
+
1837  } else if (math::isApproxEqual(inactiveValue, math::negative(oldBackground))) {
+
1838  inactiveValue = math::negative(newBackground);
+
1839  }
+
1840  }
+
1841 }
+
1842 
+
1843 
+
1844 template<typename T, Index Log2Dim>
+
1845 template<MergePolicy Policy>
+
1846 inline void
+ +
1848 {
+
1849 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
1850  if (!this->allocate()) return;
+
1851 #endif
+
1852 
+ +
1854  if (Policy == MERGE_NODES) return;
+
1855  typename NodeMaskType::OnIterator iter = other.valueMask().beginOn();
+
1856  for (; iter; ++iter) {
+
1857  const Index n = iter.pos();
+
1858  if (mValueMask.isOff(n)) {
+
1859  mBuffer[n] = other.mBuffer[n];
+
1860  mValueMask.setOn(n);
+
1861  }
+
1862  }
+ +
1864 }
+
1865 
+
1866 template<typename T, Index Log2Dim>
+
1867 template<MergePolicy Policy>
+
1868 inline void
+ +
1870  const ValueType& /*bg*/, const ValueType& /*otherBG*/)
+
1871 {
+
1872  this->template merge<Policy>(other);
+
1873 }
+
1874 
+
1875 template<typename T, Index Log2Dim>
+
1876 template<MergePolicy Policy>
+
1877 inline void
+
1878 LeafNode<T, Log2Dim>::merge(const ValueType& tileValue, bool tileActive)
+
1879 {
+
1880 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
1881  if (!this->allocate()) return;
+
1882 #endif
+
1883 
+ +
1885  if (Policy != MERGE_ACTIVE_STATES_AND_NODES) return;
+
1886  if (!tileActive) return;
+
1887  // Replace all inactive values with the active tile value.
+
1888  for (typename NodeMaskType::OffIterator iter = mValueMask.beginOff(); iter; ++iter) {
+
1889  const Index n = iter.pos();
+
1890  mBuffer[n] = tileValue;
+
1891  mValueMask.setOn(n);
+
1892  }
+ +
1894 }
+
1895 
+
1896 
+
1897 template<typename T, Index Log2Dim>
+
1898 template<typename OtherType>
+
1899 inline void
+ +
1901 {
+
1902  mValueMask |= other.valueMask();
+
1903 }
+
1904 
+
1905 template<typename T, Index Log2Dim>
+
1906 template<typename OtherType>
+
1907 inline void
+ +
1909  const ValueType&)
+
1910 {
+
1911  mValueMask &= other.valueMask();
+
1912 }
+
1913 
+
1914 template<typename T, Index Log2Dim>
+
1915 template<typename OtherType>
+
1916 inline void
+ +
1918  const ValueType&)
+
1919 {
+
1920  mValueMask &= !other.valueMask();
+
1921 }
+
1922 
+
1923 template<typename T, Index Log2Dim>
+
1924 inline void
+ +
1926 {
+
1927 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
1928  if (!this->allocate()) return;
+
1929 #endif
+
1930  for (Index i = 0; i < SIZE; ++i) {
+
1931  mBuffer[i] = -mBuffer[i];
+
1932  }
+
1933 }
+
1934 
+
1935 
+
1937 
+
1938 
+
1939 template<typename T, Index Log2Dim>
+
1940 template<typename CombineOp>
+
1941 inline void
+
1942 LeafNode<T, Log2Dim>::combine(const LeafNode& other, CombineOp& op)
+
1943 {
+
1944 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
1945  if (!this->allocate()) return;
+
1946 #endif
+
1947  CombineArgs<T> args;
+
1948  for (Index i = 0; i < SIZE; ++i) {
+
1949  op(args.setARef(mBuffer[i])
+
1950  .setAIsActive(mValueMask.isOn(i))
+
1951  .setBRef(other.mBuffer[i])
+
1952  .setBIsActive(other.valueMask().isOn(i))
+
1953  .setResultRef(mBuffer[i]));
+
1954  mValueMask.set(i, args.resultIsActive());
+
1955  }
+
1956 }
+
1957 
+
1958 
+
1959 template<typename T, Index Log2Dim>
+
1960 template<typename CombineOp>
+
1961 inline void
+
1962 LeafNode<T, Log2Dim>::combine(const ValueType& value, bool valueIsActive, CombineOp& op)
+
1963 {
+
1964 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
1965  if (!this->allocate()) return;
+
1966 #endif
+
1967  CombineArgs<T> args;
+
1968  args.setBRef(value).setBIsActive(valueIsActive);
+
1969  for (Index i = 0; i < SIZE; ++i) {
+
1970  op(args.setARef(mBuffer[i])
+
1971  .setAIsActive(mValueMask.isOn(i))
+
1972  .setResultRef(mBuffer[i]));
+
1973  mValueMask.set(i, args.resultIsActive());
+
1974  }
+
1975 }
+
1976 
+
1977 
+
1979 
+
1980 
+
1981 template<typename T, Index Log2Dim>
+
1982 template<typename CombineOp, typename OtherType>
+
1983 inline void
+
1984 LeafNode<T, Log2Dim>::combine2(const LeafNode& other, const OtherType& value,
+
1985  bool valueIsActive, CombineOp& op)
+
1986 {
+
1987 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
1988  if (!this->allocate()) return;
+
1989 #endif
+ +
1991  args.setBRef(value).setBIsActive(valueIsActive);
+
1992  for (Index i = 0; i < SIZE; ++i) {
+
1993  op(args.setARef(other.mBuffer[i])
+
1994  .setAIsActive(other.valueMask().isOn(i))
+
1995  .setResultRef(mBuffer[i]));
+
1996  mValueMask.set(i, args.resultIsActive());
+
1997  }
+
1998 }
+
1999 
+
2000 
+
2001 template<typename T, Index Log2Dim>
+
2002 template<typename CombineOp, typename OtherNodeT>
+
2003 inline void
+
2004 LeafNode<T, Log2Dim>::combine2(const ValueType& value, const OtherNodeT& other,
+
2005  bool valueIsActive, CombineOp& op)
+
2006 {
+
2007 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
2008  if (!this->allocate()) return;
+
2009 #endif
+ +
2011  args.setARef(value).setAIsActive(valueIsActive);
+
2012  for (Index i = 0; i < SIZE; ++i) {
+
2013  op(args.setBRef(other.mBuffer[i])
+
2014  .setBIsActive(other.valueMask().isOn(i))
+
2015  .setResultRef(mBuffer[i]));
+
2016  mValueMask.set(i, args.resultIsActive());
+
2017  }
+
2018 }
+
2019 
+
2020 
+
2021 template<typename T, Index Log2Dim>
+
2022 template<typename CombineOp, typename OtherNodeT>
+
2023 inline void
+
2024 LeafNode<T, Log2Dim>::combine2(const LeafNode& b0, const OtherNodeT& b1, CombineOp& op)
+
2025 {
+
2026 #ifndef OPENVDB_2_ABI_COMPATIBLE
+
2027  if (!this->allocate()) return;
+
2028 #endif
+ +
2030  for (Index i = 0; i < SIZE; ++i) {
+
2031  mValueMask.set(i, b0.valueMask().isOn(i) || b1.valueMask().isOn(i));
+
2032  op(args.setARef(b0.mBuffer[i])
+
2033  .setAIsActive(b0.valueMask().isOn(i))
+
2034  .setBRef(b1.mBuffer[i])
+
2035  .setBIsActive(b1.valueMask().isOn(i))
+
2036  .setResultRef(mBuffer[i]));
+
2037  mValueMask.set(i, args.resultIsActive());
+
2038  }
+
2039 }
+
2040 
+
2041 
+
2043 
+
2044 
+
2045 template<typename T, Index Log2Dim>
+
2046 template<typename BBoxOp>
+
2047 inline void
+ +
2049 {
+
2050  if (op.template descent<LEVEL>()) {
+
2051  for (ValueOnCIter i=this->cbeginValueOn(); i; ++i) {
+
2052 #ifdef _MSC_VER
+
2053  op.operator()<LEVEL>(CoordBBox::createCube(i.getCoord(), 1));
+
2054 #else
+
2055  op.template operator()<LEVEL>(CoordBBox::createCube(i.getCoord(), 1));
+
2056 #endif
+
2057  }
+
2058  } else {
+
2059 #ifdef _MSC_VER
+
2060  op.operator()<LEVEL>(this->getNodeBoundingBox());
+
2061 #else
+
2062  op.template operator()<LEVEL>(this->getNodeBoundingBox());
+
2063 #endif
+
2064  }
+
2065 }
+
2066 
+
2067 
+
2068 template<typename T, Index Log2Dim>
+
2069 template<typename VisitorOp>
+
2070 inline void
+ +
2072 {
+
2073  doVisit<LeafNode, VisitorOp, ChildAllIter>(*this, op);
+
2074 }
+
2075 
+
2076 
+
2077 template<typename T, Index Log2Dim>
+
2078 template<typename VisitorOp>
+
2079 inline void
+
2080 LeafNode<T, Log2Dim>::visit(VisitorOp& op) const
+
2081 {
+
2082  doVisit<const LeafNode, VisitorOp, ChildAllCIter>(*this, op);
+
2083 }
+
2084 
+
2085 
+
2086 template<typename T, Index Log2Dim>
+
2087 template<typename NodeT, typename VisitorOp, typename ChildAllIterT>
+
2088 inline void
+
2089 LeafNode<T, Log2Dim>::doVisit(NodeT& self, VisitorOp& op)
+
2090 {
+
2091  for (ChildAllIterT iter = self.beginChildAll(); iter; ++iter) {
+
2092  op(iter);
+
2093  }
+
2094 }
+
2095 
+
2096 
+
2098 
+
2099 
+
2100 template<typename T, Index Log2Dim>
+
2101 template<typename OtherLeafNodeType, typename VisitorOp>
+
2102 inline void
+
2103 LeafNode<T, Log2Dim>::visit2Node(OtherLeafNodeType& other, VisitorOp& op)
+
2104 {
+
2105  doVisit2Node<LeafNode, OtherLeafNodeType, VisitorOp, ChildAllIter,
+
2106  typename OtherLeafNodeType::ChildAllIter>(*this, other, op);
+
2107 }
+
2108 
+
2109 
+
2110 template<typename T, Index Log2Dim>
+
2111 template<typename OtherLeafNodeType, typename VisitorOp>
+
2112 inline void
+
2113 LeafNode<T, Log2Dim>::visit2Node(OtherLeafNodeType& other, VisitorOp& op) const
+
2114 {
+
2115  doVisit2Node<const LeafNode, OtherLeafNodeType, VisitorOp, ChildAllCIter,
+
2116  typename OtherLeafNodeType::ChildAllCIter>(*this, other, op);
+
2117 }
+
2118 
+
2119 
+
2120 template<typename T, Index Log2Dim>
+
2121 template<
+
2122  typename NodeT,
+
2123  typename OtherNodeT,
+
2124  typename VisitorOp,
+
2125  typename ChildAllIterT,
+
2126  typename OtherChildAllIterT>
+
2127 inline void
+
2128 LeafNode<T, Log2Dim>::doVisit2Node(NodeT& self, OtherNodeT& other, VisitorOp& op)
+
2129 {
+
2130  // Allow the two nodes to have different ValueTypes, but not different dimensions.
+
2131  BOOST_STATIC_ASSERT(OtherNodeT::SIZE == NodeT::SIZE);
+
2132  BOOST_STATIC_ASSERT(OtherNodeT::LEVEL == NodeT::LEVEL);
+
2133 
+
2134  ChildAllIterT iter = self.beginChildAll();
+
2135  OtherChildAllIterT otherIter = other.beginChildAll();
+
2136 
+
2137  for ( ; iter && otherIter; ++iter, ++otherIter) {
+
2138  op(iter, otherIter);
+
2139  }
+
2140 }
+
2141 
+
2142 
+
2144 
+
2145 
+
2146 template<typename T, Index Log2Dim>
+
2147 template<typename IterT, typename VisitorOp>
+
2148 inline void
+
2149 LeafNode<T, Log2Dim>::visit2(IterT& otherIter, VisitorOp& op, bool otherIsLHS)
+
2150 {
+
2151  doVisit2<LeafNode, VisitorOp, ChildAllIter, IterT>(
+
2152  *this, otherIter, op, otherIsLHS);
+
2153 }
+
2154 
+
2155 
+
2156 template<typename T, Index Log2Dim>
+
2157 template<typename IterT, typename VisitorOp>
+
2158 inline void
+
2159 LeafNode<T, Log2Dim>::visit2(IterT& otherIter, VisitorOp& op, bool otherIsLHS) const
+
2160 {
+
2161  doVisit2<const LeafNode, VisitorOp, ChildAllCIter, IterT>(
+
2162  *this, otherIter, op, otherIsLHS);
+
2163 }
+
2164 
+
2165 
+
2166 template<typename T, Index Log2Dim>
+
2167 template<
+
2168  typename NodeT,
+
2169  typename VisitorOp,
+
2170  typename ChildAllIterT,
+
2171  typename OtherChildAllIterT>
+
2172 inline void
+
2173 LeafNode<T, Log2Dim>::doVisit2(NodeT& self, OtherChildAllIterT& otherIter,
+
2174  VisitorOp& op, bool otherIsLHS)
+
2175 {
+
2176  if (!otherIter) return;
+
2177 
+
2178  if (otherIsLHS) {
+
2179  for (ChildAllIterT iter = self.beginChildAll(); iter; ++iter) {
+
2180  op(otherIter, iter);
+
2181  }
+
2182  } else {
+
2183  for (ChildAllIterT iter = self.beginChildAll(); iter; ++iter) {
+
2184  op(iter, otherIter);
+
2185  }
+
2186  }
+
2187 }
+
2188 
+
2189 
+
2191 
+
2192 
+
2193 template<typename T, Index Log2Dim>
+
2194 inline std::ostream&
+
2195 operator<<(std::ostream& os, const typename LeafNode<T, Log2Dim>::Buffer& buf)
+
2196 {
+
2197  for (Index32 i = 0, N = buf.size(); i < N; ++i) os << buf.mData[i] << ", ";
+
2198  return os;
+
2199 }
+
2200 
+
2201 } // namespace tree
+
2202 } // namespace OPENVDB_VERSION_NAME
+
2203 } // namespace openvdb
+
2204 
+
2205 
+
2207 
+
2208 
+
2209 // Specialization for LeafNodes of type bool
+
2210 #include "LeafNodeBool.h"
+
2211 
+
2212 // Specialization for LeafNodes with mask information only
+
2213 #include "LeafNodeMask.h"
+
2214 
+
2215 #endif // OPENVDB_TREE_LEAFNODE_HAS_BEEN_INCLUDED
+
2216 
+
2217 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
2218 // All rights reserved. This software is distributed under the
+
2219 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
ChildOnIter beginChildOn()
Definition: LeafNode.h:618
+
const ValueType & operator[](Index i) const
Return a const reference to the i'th element of this buffer.
Definition: LeafNode.h:184
+
T BuildType
Definition: LeafNode.h:68
+
bool isConstant(ValueType &constValue, bool &state, const ValueType &tolerance=zeroVal< ValueType >()) const
Definition: LeafNode.h:1754
+
bool operator==(const Buffer &other) const
Return true if the contents of the other buffer exactly equal the contents of this buffer...
Definition: LeafNode.h:226
+
boost::shared_ptr< MappedFile > Ptr
Definition: io.h:135
+ +
std::streamoff maskpos
Definition: LeafNode.h:102
+
void stealNodes(ArrayT &, const ValueType &, bool)
This function exists only to enable template instantiation.
Definition: LeafNode.h:1010
+
Index64 offVoxelCount() const
Return the number of voxels marked Off.
Definition: LeafNode.h:442
+
static const Index LEVEL
Definition: LeafNode.h:81
+ +
void negate()
Definition: LeafNode.h:1925
+
static Index coordToOffset(const Coord &xyz)
Return the linear table offset of the given global or local coordinates.
Definition: LeafNode.h:1276
+
static Index size()
Return the number of values contained in this buffer.
Definition: LeafNode.h:263
+
const Coord & origin() const
Return the grid index coordinates of this node's local origin.
Definition: LeafNode.h:475
+ +
ChildOffCIter beginChildOff() const
Definition: LeafNode.h:620
+
DenseIteratorBase< MaskDenseIterator, DenseIter, NodeT, void, ValueT > BaseT
Definition: LeafNode.h:557
+
OPENVDB_API void setStreamMetadataPtr(std::ios_base &, boost::shared_ptr< StreamMetadata > &, bool transfer=true)
Associate the given stream with (a shared pointer to) an object that stores metadata (file format...
+
ValueAllCIter cendValueAll() const
Definition: LeafNode.h:610
+
CoordBBox getNodeBoundingBox() const
Return the bounding box of this node, i.e., the full index space spanned by this leaf node...
Definition: LeafNode.h:469
+
static Index getLevel()
Return the level of this node, which by definition is zero for LeafNodes.
Definition: LeafNode.h:429
+
ChildIter< MaskOffIterator, const LeafNode, ChildOff > ChildOffCIter
Definition: LeafNode.h:590
+
bool isExactlyEqual(const T0 &a, const T1 &b)
Return true if a is exactly equal to b.
Definition: Math.h:407
+
bool isEmpty() const
Return true if this node has no active voxels.
Definition: LeafNode.h:448
+
void addTile(Index level, const Coord &, const ValueType &, bool)
Definition: LeafNode.h:1795
+
static Index32 nonLeafCount()
Return the non-leaf count for this node, which is zero.
Definition: LeafNode.h:437
+
void setValueMask(Index n, bool on)
Definition: LeafNode.h:1117
+
void copyToDense(const GridOrTreeT &sparse, DenseT &dense, bool serial=false)
Populate a dense grid with the values of voxels from a sparse grid, where the sparse grid intersects ...
Definition: Dense.h:443
+
Definition: LeafNode.h:50
+
Definition: Types.h:442
+
const NodeMaskType & getValueMask() const
Definition: LeafNode.h:1109
+
bool operator==(const LeafNode &other) const
Check for buffer, state and origin equivalence.
Definition: LeafNode.h:1707
+
FileInfo()
Definition: LeafNode.h:100
+
Coord offsetToGlobalCoord(Index n) const
Return the global coordinates for a linear table offset.
Definition: LeafNode.h:1300
+
void setValueOffAndCache(const Coord &xyz, const ValueType &value, AccessorT &)
Change the value of the voxel at the given coordinates and mark it as inactive.
Definition: LeafNode.h:867
+
bool probeValueAndCache(const Coord &xyz, ValueType &val, AccessorT &) const
Return true if the voxel at the given coordinates is active and return the voxel value in val...
Definition: LeafNode.h:885
+
void getOrigin(Int32 &x, Int32 &y, Int32 &z) const
Return the grid index coordinates of this node's local origin.
Definition: LeafNode.h:477
+
NodeT * probeNode(const Coord &)
This function exists only to enable template instantiation.
Definition: LeafNode.h:1006
+
bool isValueOn(const Coord &xyz) const
Return true if the voxel at the given coordinates is active.
Definition: LeafNode.h:765
+
void load(std::istream &is)
Definition: NodeMasks.h:555
+
bool getItem(Index pos, void *&child, NonConstValueT &value) const
Definition: LeafNode.h:563
+
void voxelizeActiveTiles(bool=true)
No-op.
Definition: LeafNode.h:922
+
BaseT::NonConstValueType NonConstValueT
Definition: LeafNode.h:558
+
bool operator!=(const Buffer &other) const
Return true if the contents of the other buffer are not exactly equal to the contents of this buffer...
Definition: LeafNode.h:239
+
void setValueOn(const Coord &xyz)
Mark the voxel at the given coordinates as active but don't change its value.
Definition: LeafNode.h:714
+
ValueAllCIter endValueAll() const
Definition: LeafNode.h:611
+
ValueOffIter beginValueOff()
Definition: LeafNode.h:599
+
SameConfiguration::value is true if and only if OtherNodeType is the type of a LeafNod...
Definition: LeafNode.h:93
+
ValueIter(const MaskIterT &iter, NodeT *parent)
Definition: LeafNode.h:519
+
void visit(VisitorOp &)
Definition: LeafNode.h:2071
+
io::MappedFile::Ptr mapping
Definition: LeafNode.h:103
+
static Coord offsetToLocalCoord(Index n)
Return the local coordinates for a linear table offset, where offset 0 has coordinates (0...
Definition: LeafNode.h:1286
+
OPENVDB_API boost::shared_ptr< StreamMetadata > getStreamMetadataPtr(std::ios_base &)
Return a shared pointer to an object that stores metadata (file format, compression scheme...
+
const ValueType & getLastValue() const
Return a const reference to the last value in the buffer.
Definition: LeafNode.h:912
+
Buffer & buffer()
Definition: LeafNode.h:643
+
void setValue(const Coord &xyz, const ValueType &val)
Set the value of the voxel at the given coordinates and mark the voxel as active. ...
Definition: LeafNode.h:722
+
NodeT * stealNode(const Coord &, const ValueType &, bool)
This function exists only to enable template instantiation.
Definition: LeafNode.h:1004
+
void setValueMask(const NodeMaskType &mask)
Definition: LeafNode.h:1112
+
ValueType * data()
Return a pointer to the array of voxel values.
Definition: LeafNode.h:285
+
CombineArgs & setARef(const AValueType &a)
Redirect the A value to a new external source.
Definition: Types.h:365
+
void topologyDifference(const LeafNode< OtherType, Log2Dim > &other, const ValueType &)
Difference this node's set of active values with the active values of the other node, whose ValueType may be different. So a resulting voxel will be active only if the original voxel is active in this LeafNode and inactive in the other LeafNode.
Definition: LeafNode.h:1917
+
ValueAllCIter beginValueAll() const
Definition: LeafNode.h:601
+
LeafNode< OtherValueType, Log2Dim > Type
Definition: LeafNode.h:87
+
const Buffer & buffer() const
Definition: LeafNode.h:642
+
ValueIter()
Definition: LeafNode.h:518
+
ChildAllCIter cbeginChildAll() const
Definition: LeafNode.h:622
+
bool allocate()
Allocate memory for this buffer if it has not already been allocated.
Definition: LeafNode.h:168
+
void setValueOn(const Coord &xyz, const ValueType &val)
Set the value of the voxel at the given coordinates and mark the voxel as active. ...
Definition: LeafNode.h:718
+
static Index dim()
Return the number of voxels in each coordinate dimension.
Definition: LeafNode.h:423
+
void setValue(const ValueT &value) const
Definition: LeafNode.h:530
+
void modifyValue(Index offset, const ModifyOp &op)
Apply a functor to the value of the voxel at the given offset and mark the voxel as active...
Definition: LeafNode.h:732
+
void readBuffers(std::istream &is, bool fromHalf=false)
Read buffers from a stream.
Definition: LeafNode.h:1598
+
Definition: PointIndexGrid.h:68
+
DenseIter< const LeafNode, const ValueType, ChildAll > ChildAllCIter
Definition: LeafNode.h:592
+
ChildOnCIter cendChildOn() const
Definition: LeafNode.h:626
+
ValueT & getValue() const
Definition: LeafNode.h:522
+
void setItem(Index pos, const ValueT &value) const
Definition: LeafNode.h:525
+
bool operator!=(const LeafNode &other) const
Definition: LeafNode.h:498
+
const ValueType & getValue(const Coord &xyz, bool &state, int &level, AccessorT &) const
Return the value of the voxel at the given coordinates and return its active state and level (i...
Definition: LeafNode.h:894
+
ValueIter< MaskDenseIterator, LeafNode, const ValueType, ValueAll > ValueAllIter
Definition: LeafNode.h:585
+
Index64 offLeafVoxelCount() const
Definition: LeafNode.h:444
+ +
void visitActiveBBox(BBoxOp &) const
Calls the templated functor BBoxOp with bounding box information. An additional level argument is pro...
Definition: LeafNode.h:2048
+
ValueConverter::Type is the type of a LeafNode having the same dimensions as this node but a diffe...
Definition: LeafNode.h:86
+ +
bool isChildMaskOn(Index) const
Definition: LeafNode.h:1113
+
ValueOnIter beginValueOn()
Definition: LeafNode.h:596
+
ValueIter< MaskOnIterator, const LeafNode, const ValueType, ValueOn > ValueOnCIter
Definition: LeafNode.h:582
+
const LeafNode * probeLeaf(const Coord &) const
Return a const pointer to this node.
Definition: LeafNode.h:1042
+
void setActiveState(Index offset, bool on)
Set the active state of the voxel at the given offset but don't change its value. ...
Definition: LeafNode.h:696
+
bool allocate()
Allocate memory for this node's buffer if it has not already been allocated.
Definition: LeafNode.h:456
+
ValueOnCIter endValueOn() const
Definition: LeafNode.h:605
+
ValueOnCIter cendValueOn() const
Definition: LeafNode.h:604
+
FileInfo * mFileInfo
Definition: LeafNode.h:362
+
ValueOffCIter endValueOff() const
Definition: LeafNode.h:608
+
ValueOnCIter beginValueOn() const
Definition: LeafNode.h:595
+
OPENVDB_API const void * getGridBackgroundValuePtr(std::ios_base &)
Return a pointer to the background value of the grid currently being read from or written to the give...
+
Index memUsage() const
Return the memory footprint of this buffer in bytes.
Definition: LeafNode.h:251
+
ValueOnIter endValueOn()
Definition: LeafNode.h:606
+
Array of fixed size that stores the voxel values of a LeafNode.
Definition: LeafNode.h:110
+
const NodeT * probeConstNodeAndCache(const Coord &, AccessorT &) const
Return a const pointer to this node.
Definition: LeafNode.h:1044
+
bool isValueMaskOff(Index n) const
Definition: LeafNode.h:1107
+
NodeT * probeNodeAndCache(const Coord &, AccessorT &)
Return a pointer to this node.
Definition: LeafNode.h:1024
+
void setValue(Index i, const ValueType &val)
Set the i'th value of this buffer to the specified value.
Definition: LeafNode.h:186
+
SparseIteratorBase< MaskIterT, ValueIter, NodeT, ValueT > BaseT
Definition: LeafNode.h:516
+
void copyFromDense(const DenseT &dense, GridOrTreeT &sparse, const typename GridOrTreeT::ValueType &tolerance, bool serial=false)
Populate a sparse grid with the values of all of the voxels of a dense grid.
Definition: Dense.h:590
+
ValueType * mData
Definition: LeafNode.h:361
+
OffIterator beginOff() const
Definition: NodeMasks.h:351
+
Index64 onLeafVoxelCount() const
Definition: LeafNode.h:443
+
ChildAllIter beginChildAll()
Definition: LeafNode.h:624
+
ChildIter< MaskOnIterator, const LeafNode, ChildOn > ChildOnCIter
Definition: LeafNode.h:588
+
void setValuesOn()
Mark all voxels as active but don't change their values.
Definition: LeafNode.h:760
+
bool isApproxEqual(const Type &a, const Type &b)
Return true if a is equal to b to within the default floating-point comparison tolerance.
Definition: Math.h:370
+
void resetBackground(const ValueType &oldBackground, const ValueType &newBackground)
Replace inactive occurrences of oldBackground with newBackground, and inactive occurrences of -oldBac...
Definition: LeafNode.h:1824
+
OPENVDB_API bool getHalfFloat(std::ios_base &)
Return true if floating-point values should be quantized to 16 bits when writing to the given stream ...
+
Index32 Index
Definition: Types.h:58
+
ChildAllCIter beginChildAll() const
Definition: LeafNode.h:623
+ +
bool hasSameTopology(const LeafNode< OtherType, OtherLog2Dim > *other) const
Return true if the given node (which may have a different ValueType than this node) has the same acti...
Definition: LeafNode.h:1745
+ +
static Index64 offTileCount()
Definition: LeafNode.h:446
+
ValueIter< MaskOffIterator, LeafNode, const ValueType, ValueOff > ValueOffIter
Definition: LeafNode.h:583
+
int32_t Int32
Definition: Types.h:60
+
boost::shared_ptr< io::StreamMetadata > meta
Definition: LeafNode.h:104
+
void combine2(const LeafNode &other, const OtherType &, bool valueIsActive, CombineOp &)
Definition: LeafNode.h:1984
+
ChildOffCIter cbeginChildOff() const
Definition: LeafNode.h:619
+
uint64_t Index64
Definition: Types.h:57
+
const ValueType & getValueAndCache(const Coord &xyz, AccessorT &) const
Return the value of the voxel at the given coordinates.
Definition: LeafNode.h:820
+
ValueAllCIter cbeginValueAll() const
Definition: LeafNode.h:600
+
void fill(const ValueType &val)
Populate this buffer with a constant value.
Definition: LeafNode.h:171
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
OPENVDB_API boost::shared_ptr< MappedFile > getMappedFilePtr(std::ios_base &)
Return a shared pointer to the memory-mapped file with which the given stream is associated, or a null pointer if the stream is not associated with a memory-mapped file.
+
ChildAllCIter cendChildAll() const
Definition: LeafNode.h:632
+
ChildOffCIter endChildOff() const
Definition: LeafNode.h:630
+
OPENVDB_STATIC_SPECIALIZATION GridType::Ptr clip(const GridType &grid, const BBoxd &)
Clip the given grid against a world-space bounding box and return a new grid containing the result...
Definition: Clip.h:356
+
Buffer()
Default constructor.
Definition: LeafNode.h:131
+
void readCompressedValues(std::istream &is, ValueT *destBuf, Index destCount, const MaskT &valueMask, bool fromHalf)
Definition: Compression.h:329
+
bool isOn(Index32 n) const
Return true if the nth bit is on.
Definition: NodeMasks.h:499
+
void clip(const CoordBBox &, const ValueType &background)
Set all voxels that lie outside the given axis-aligned box to the background.
Definition: LeafNode.h:1387
+ +
static void getNodeLog2Dims(std::vector< Index > &dims)
Append the Log2Dim of this LeafNode to the specified vector.
Definition: LeafNode.h:431
+ +
void swap(Buffer &other)
Exchange this node's data buffer with the given data buffer without changing the active states of the...
Definition: LeafNode.h:641
+
ValueIter< MaskOnIterator, LeafNode, const ValueType, ValueOn > ValueOnIter
Definition: LeafNode.h:581
+
bool isChildMaskOff() const
Definition: LeafNode.h:1115
+
Templated block class to hold specific data types and a fixed number of values determined by Log2Dim...
Definition: LeafNode.h:65
+
void visit2Node(OtherLeafNodeType &other, VisitorOp &)
Definition: LeafNode.h:2103
+
NodeMaskType::OnIterator MaskOnIterator
Definition: LeafNode.h:501
+
ChildOnIter endChildOn()
Definition: LeafNode.h:628
+
static Index getValueLevelAndCache(const Coord &, AccessorT &)
Return the LEVEL (=0) at which leaf node values reside.
Definition: LeafNode.h:905
+
ValueOffCIter beginValueOff() const
Definition: LeafNode.h:598
+
void modifyValue(const Coord &xyz, const ModifyOp &op)
Apply a functor to the value of the voxel at the given coordinates and mark the voxel as active...
Definition: LeafNode.h:742
+
void setActiveState(const Coord &xyz, bool on)
Set the active state of the voxel at the given coordinates but don't change its value.
Definition: LeafNode.h:1361
+
OPENVDB_API uint32_t getFormatVersion(std::ios_base &)
Return the file format version number associated with the given input stream.
+
ValueIter< MaskDenseIterator, const LeafNode, const ValueType, ValueAll > ValueAllCIter
Definition: LeafNode.h:586
+
void modifyValueAndActiveStateAndCache(const Coord &xyz, const ModifyOp &op, AccessorT &)
Definition: LeafNode.h:859
+
ChildOnCIter beginChildOn() const
Definition: LeafNode.h:617
+
Bit mask for the internal and leaf nodes of VDB. This is a 64-bit implementation. ...
Definition: NodeMasks.h:304
+
void addTileAndCache(Index, const Coord &, const ValueType &, bool, AccessorT &)
Definition: LeafNode.h:1812
+
~LeafNode()
Destructor.
Definition: LeafNode.h:1256
+
void writeCompressedValues(std::ostream &os, ValueT *srcBuf, Index srcCount, const MaskT &valueMask, const MaskT &childMask, bool toHalf)
Definition: Compression.h:431
+
static Index32 leafCount()
Return the leaf count for this node, which is one.
Definition: LeafNode.h:435
+
void readTopology(std::istream &is, bool fromHalf=false)
Read in just the topology.
Definition: LeafNode.h:1536
+
bool isInactive() const
Return true if all of this node's values are inactive.
Definition: LeafNode.h:1080
+
Definition: Exceptions.h:39
+
void topologyUnion(const LeafNode< OtherType, Log2Dim > &other)
Union this node's set of active values with the active values of the other node, whose ValueType may ...
Definition: LeafNode.h:1900
+
DenseIter(const MaskDenseIterator &iter, NodeT *parent)
Definition: LeafNode.h:561
+
void addLeafAndCache(LeafNode *, AccessorT &)
This function exists only to enable template instantiation.
Definition: LeafNode.h:1002
+
ChildOffIter endChildOff()
Definition: LeafNode.h:631
+
uint32_t Index32
Definition: Types.h:56
+ +
#define OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN
Definition: Platform.h:129
+
std::string str() const
Return a string representation of this node.
Definition: LeafNode.h:1263
+
void setActiveStateAndCache(const Coord &xyz, bool on, AccessorT &)
Set the active state of the voxel at the given coordinates without changing its value.
Definition: LeafNode.h:876
+
util::NodeMask< Log2Dim > NodeMaskType
Definition: LeafNode.h:72
+
const ValueType & getValue(Index i) const
Return a const reference to the i'th element of this buffer.
Definition: LeafNode.h:182
+
const ValueType * data() const
Return a const pointer to the array of voxel values.
Definition: LeafNode.h:268
+
std::streamoff bufpos
Definition: LeafNode.h:101
+
const LeafNode * probeLeafAndCache(const Coord &, AccessorT &) const
Return a const pointer to this node.
Definition: LeafNode.h:1041
+
void swap(Buffer &other)
Exchange this buffer's values with the other buffer's values.
Definition: LeafNode.h:242
+
bool isValueOn(Index offset) const
Return true if the voxel at the given offset is active.
Definition: LeafNode.h:767
+
static void evalNodeOrigin(Coord &xyz)
Compute the origin of the leaf node that contains the voxel with the given coordinates.
Definition: LeafNode.h:1122
+
Base class for dense iterators over internal and leaf nodes.
Definition: Iterator.h:211
+
void setValueMaskOn(Index n)
Definition: LeafNode.h:1118
+
Base class for sparse iterators over internal and leaf nodes.
Definition: Iterator.h:148
+
void getOrigin(Coord &origin) const
Return the grid index coordinates of this node's local origin.
Definition: LeafNode.h:476
+
const ValueType & getValue(const Coord &xyz) const
Return the value of the voxel at the given coordinates.
Definition: LeafNode.h:1311
+
boost::remove_const< UnsetItemT >::type NonConstValueType
Definition: Iterator.h:217
+
void set(Index32 n, bool On)
Set the nth bit to the specified state.
Definition: NodeMasks.h:459
+
static void doVisit2(NodeT &self, OtherChildAllIterT &, VisitorOp &, bool otherIsLHS)
Definition: LeafNode.h:2173
+
ChildIter()
Definition: LeafNode.h:548
+
bool isDense() const
Return true if this node contains only active voxels.
Definition: LeafNode.h:450
+
static Index64 onTileCount()
Definition: LeafNode.h:445
+
bool isOff(Index32 n) const
Return true if the nth bit is off.
Definition: NodeMasks.h:505
+
ValueOnCIter cbeginValueOn() const
Definition: LeafNode.h:594
+
ChildIter< MaskOffIterator, LeafNode, ChildOff > ChildOffIter
Definition: LeafNode.h:589
+
Definition: NodeMasks.h:267
+
void modifyValueAndCache(const Coord &xyz, const ModifyOp &op, AccessorT &)
Apply a functor to the value of the voxel at the given coordinates and mark the voxel as active...
Definition: LeafNode.h:851
+
bool probeValue(const Coord &xyz, ValueType &val) const
Return true if the voxel at the given coordinates is active.
Definition: LeafNode.h:1327
+
static const Index SIZE
Definition: LeafNode.h:80
+
ValueType WordType
Definition: LeafNode.h:128
+
NodeMaskType::OffIterator MaskOffIterator
Definition: LeafNode.h:502
+
void modifyItem(Index n, const ModifyOp &op) const
Definition: LeafNode.h:537
+ +
void unsetItem(Index pos, const ValueT &value) const
Definition: LeafNode.h:574
+
void getNodes(ArrayT &) const
This function exists only to enable template instantiation.
Definition: LeafNode.h:1009
+
void setOn(Index32 n)
Set the nth bit on.
Definition: NodeMasks.h:449
+
NodeMaskType & getValueMask()
Definition: LeafNode.h:1110
+
void setValueMaskOff(Index n)
Definition: LeafNode.h:1119
+
void combine(const LeafNode &other, CombineOp &op)
Definition: LeafNode.h:1942
+
ValueT & getItem(Index pos) const
Definition: LeafNode.h:521
+
Definition: Compression.h:211
+
Index64 onVoxelCount() const
Return the number of voxels marked On.
Definition: LeafNode.h:440
+
Buffer(PartialCreate, const ValueType &)
Construct a buffer but don't allocate memory for the full array of values.
Definition: LeafNode.h:151
+
bool isValueOnAndCache(const Coord &xyz, AccessorT &) const
Return true if the voxel at the given coordinates is active.
Definition: LeafNode.h:828
+
bool isValueMaskOn(Index n) const
Definition: LeafNode.h:1105
+
ChildOffIter beginChildOff()
Definition: LeafNode.h:621
+
ChildOnCIter cbeginChildOn() const
Definition: LeafNode.h:616
+
Index64 memUsage() const
Return the memory in bytes occupied by this node.
Definition: LeafNode.h:1717
+
void copyToDense(const CoordBBox &bbox, DenseT &dense) const
Copy into a dense grid the values of the voxels that lie within a given bounding box.
Definition: LeafNode.h:1468
+
static void doVisit2Node(NodeT &self, OtherNodeT &other, VisitorOp &)
Definition: LeafNode.h:2128
+
ChildAllCIter endChildAll() const
Definition: LeafNode.h:633
+
bool operator==(const Vec3< T0 > &v0, const Vec3< T1 > &v1)
Equality operator, does exact floating point comparisons.
Definition: Vec3.h:450
+
LeafNode()
Default constructor.
Definition: LeafNode.h:1170
+
bool isChildMaskOff(Index) const
Definition: LeafNode.h:1114
+
ChildAllIter endChildAll()
Definition: LeafNode.h:634
+
bool isValueMaskOn() const
Definition: LeafNode.h:1106
+
#define OPENVDB_NO_UNREACHABLE_CODE_WARNING_END
Definition: Platform.h:130
+
void setValueOff(Index offset)
Mark the voxel at the given offset as inactive but don't change its value.
Definition: LeafNode.h:706
+
OnIterator beginOn() const
Definition: NodeMasks.h:349
+
CombineArgs & setBRef(const BValueType &b)
Redirect the B value to a new external source.
Definition: Types.h:367
+
static Index getChildDim()
Return the dimension of child nodes of this LeafNode, which is one for voxels.
Definition: LeafNode.h:433
+
Index32 pos() const
Definition: NodeMasks.h:193
+
void setValueOnly(const Coord &xyz, const ValueType &val)
Set the value of the voxel at the given coordinates but don't change its active state.
Definition: LeafNode.h:1369
+
static Index size()
Return the total number of voxels represented by this LeafNode.
Definition: LeafNode.h:425
+ +
Leaf nodes have no children, so their child iterators have no get/set accessors.
Definition: LeafNode.h:545
+
void setOff(Index32 n)
Set the nth bit off.
Definition: NodeMasks.h:454
+
bool isOutOfCore() const
Return true if this buffer's values have not yet been read from disk.
Definition: LeafNode.h:163
+ +
void evalActiveBoundingBox(CoordBBox &bbox, bool visitVoxels=true) const
Definition: LeafNode.h:1727
+
Buffer(const ValueType &val)
Construct a buffer populated with the specified value.
Definition: LeafNode.h:133
+
NodeMaskType::DenseIterator MaskDenseIterator
Definition: LeafNode.h:503
+ +
const NodeMaskType & valueMask() const
Definition: LeafNode.h:1111
+
DenseIter< LeafNode, ValueType, ChildAll > ChildAllIter
Definition: LeafNode.h:591
+ +
void prune(TreeT &tree, typename TreeT::ValueType tolerance=zeroVal< typename TreeT::ValueType >(), bool threaded=true, size_t grainSize=1)
Reduce the memory footprint of a tree by replacing with tiles any nodes whose values are all the same...
Definition: Prune.h:347
+
void addLeaf(LeafNode *)
This function exists only to enable template instantiation.
Definition: LeafNode.h:1000
+
ValueAllIter endValueAll()
Definition: LeafNode.h:612
+
void copyFromDense(const CoordBBox &bbox, const DenseT &dense, const ValueType &background, const ValueType &tolerance)
Copy from a dense grid into this node the values of the voxels that lie within a given bounding box...
Definition: LeafNode.h:1497
+
const NodeT * probeConstNode(const Coord &) const
This function exists only to enable template instantiation.
Definition: LeafNode.h:1008
+
static Index getValueLevel(const Coord &)
Return the level (i.e., 0) at which leaf node values reside.
Definition: LeafNode.h:691
+
DenseIter()
Definition: LeafNode.h:560
+
static Index numValues()
Return the total number of voxels represented by this LeafNode.
Definition: LeafNode.h:427
+
Definition: NodeMasks.h:205
+
void modifyValue(const ModifyOp &op) const
Definition: LeafNode.h:540
+
Definition: NodeMasks.h:236
+
T negative(const T &val)
Return the unary negation of the given value.
Definition: Math.h:116
+ +
ValueAllIter beginValueAll()
Definition: LeafNode.h:602
+
void setValueAndCache(const Coord &xyz, const ValueType &val, AccessorT &)
Change the value of the voxel at the given coordinates and mark it as active.
Definition: LeafNode.h:833
+
ValueOffCIter cbeginValueOff() const
Definition: LeafNode.h:597
+
static bool hasActiveTiles()
Return false since leaf nodes never contain tiles.
Definition: LeafNode.h:770
+
Definition: Types.h:444
+
ChildIter< MaskOnIterator, LeafNode, ChildOn > ChildOnIter
Definition: LeafNode.h:587
+
static void doVisit(NodeT &, VisitorOp &)
Definition: LeafNode.h:2089
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
Definition: Compression.h:79
+
LeafNode * probeLeafAndCache(const Coord &, AccessorT &)
Return a pointer to this node.
Definition: LeafNode.h:1033
+
ValueIter< MaskOffIterator, const LeafNode, const ValueType, ValueOff > ValueOffCIter
Definition: LeafNode.h:584
+
void topologyIntersection(const LeafNode< OtherType, Log2Dim > &other, const ValueType &)
Intersect this node's set of active values with the active values of the other node, whose ValueType may be different. So a resulting voxel will be active only if both of the original voxels were active.
Definition: LeafNode.h:1908
+
ValueOffIter endValueOff()
Definition: LeafNode.h:609
+
static Index log2dim()
Return log2 of the dimension of this LeafNode, e.g. 3 if dimensions are 8^3.
Definition: LeafNode.h:421
+
boost::shared_ptr< LeafNode > Ptr
Definition: LeafNode.h:71
+
void save(std::ostream &os) const
Definition: NodeMasks.h:551
+
void merge(const LeafNode &)
Definition: LeafNode.h:1847
+
ChildOnCIter endChildOn() const
Definition: LeafNode.h:627
+
void modifyValueAndActiveState(const Coord &xyz, const ModifyOp &op)
Apply a functor to the voxel at the given coordinates.
Definition: LeafNode.h:749
+
const LeafNode * probeConstLeafAndCache(const Coord &, AccessorT &) const
Return a const pointer to this node.
Definition: LeafNode.h:1039
+
bool isValueMaskOff() const
Definition: LeafNode.h:1108
+
LeafNode * probeLeaf(const Coord &)
Return a pointer to this node.
Definition: LeafNode.h:1031
+
Definition: Types.h:266
+
TreeT * tree
Definition: MaskToLevelSet.h:118
+
void visit2(IterT &otherIter, VisitorOp &, bool otherIsLHS=false)
Definition: LeafNode.h:2149
+
LeafNode * touchLeafAndCache(const Coord &, AccessorT &)
Return a pointer to this node.
Definition: LeafNode.h:1022
+
void fill(const CoordBBox &bbox, const ValueType &, bool active=true)
Set all voxels within an axis-aligned box to the specified value and active state.
Definition: LeafNode.h:1427
+
void setValueOff(const Coord &xyz)
Mark the voxel at the given coordinates as inactive but don't change its value.
Definition: LeafNode.h:704
+
void setValueOn(Index offset, const ValueType &val)
Set the value of the voxel at the given offset and mark the voxel as active.
Definition: LeafNode.h:724
+
T ValueType
Definition: LeafNode.h:69
+
OPENVDB_API uint32_t getDataCompression(std::ios_base &)
Return a bitwise OR of compression option flags (COMPRESS_ZIP, COMPRESS_ACTIVE_MASK, etc.) specifying whether and how input data is compressed or output data should be compressed.
+
void setValueOn(Index offset)
Mark the voxel at the given offset as active but don't change its value.
Definition: LeafNode.h:716
+
ChildIter(const MaskIterT &iter, NodeT *parent)
Definition: LeafNode.h:549
+
LeafNode< ValueType, Log2Dim > LeafNodeType
Definition: LeafNode.h:70
+
void writeTopology(std::ostream &os, bool toHalf=false) const
Write out just the topology.
Definition: LeafNode.h:1544
+
void setOrigin(const Coord &origin)
Set the grid index coordinates of this node's local origin.
Definition: LeafNode.h:472
+
This struct collects both input and output arguments to "grid combiner" functors used with the tree::...
Definition: Types.h:312
+
bool empty() const
Return true if memory for this buffer has not yet been allocated.
Definition: LeafNode.h:165
+
bool resultIsActive() const
Definition: Types.h:376
+
void writeBuffers(std::ostream &os, bool toHalf=false) const
Write buffers to a stream.
Definition: LeafNode.h:1690
+
void setValuesOff()
Mark all voxels as inactive but don't change their values.
Definition: LeafNode.h:762
+
ValueOffCIter cendValueOff() const
Definition: LeafNode.h:607
+
~Buffer()
Destructor.
Definition: LeafNode.h:153
+
Buffer(const Buffer &other)
Copy constructor.
Definition: LeafNode.h:138
+
ChildOffCIter cendChildOff() const
Definition: LeafNode.h:629
+
Base class for iterators over internal and leaf nodes.
Definition: Iterator.h:58
+
const ValueType & getFirstValue() const
Return a const reference to the first value in the buffer.
Definition: LeafNode.h:910
+
Buffer & operator=(const Buffer &other)
Copy the other buffer's values into this buffer.
Definition: LeafNode.h:198
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & min(const T &a, const T &b)
Definition: Composite.h:128
+
void setValueOnlyAndCache(const Coord &xyz, const ValueType &val, AccessorT &)
Change the value of the voxel at the given coordinates but preserve its state.
Definition: LeafNode.h:842
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/LegacyFrustum_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/LegacyFrustum_8h_source.html new file mode 100644 index 00000000..91c27d46 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/LegacyFrustum_8h_source.html @@ -0,0 +1,325 @@ + + + + + + +OpenVDB: LegacyFrustum.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
LegacyFrustum.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
32 
+
33 #ifndef OPENVDB_MATH_LEGACYFRUSTUM_HAS_BEEN_INCLUDED
+
34 #define OPENVDB_MATH_LEGACYFRUSTUM_HAS_BEEN_INCLUDED
+
35 
+
36 #include <iostream>
+
37 #include <openvdb/Types.h> // for Real typedef
+
38 #include "Coord.h"
+
39 #include "Mat4.h"
+
40 #include "Vec3.h"
+
41 
+
42 
+
43 namespace openvdb {
+ +
45 namespace OPENVDB_VERSION_NAME {
+
46 namespace math {
+
47 namespace internal {
+
48 
+ +
51 {
+
52 public:
+
53  LegacyFrustum(std::istream& is)
+
54  {
+
55  // First read in the old transform's base class.
+
56  // the "extents"
+
57  Vec3i tmpMin, tmpMax;
+
58  is.read(reinterpret_cast<char*>(&tmpMin), sizeof(Vec3i::ValueType) * 3);
+
59  is.read(reinterpret_cast<char*>(&tmpMax), sizeof(Vec3i::ValueType) * 3);
+
60 
+
61  Coord tmpMinCoord(tmpMin);
+
62  Coord tmpMaxCoord(tmpMax);
+
63 
+
64  // set the extents
+
65  mExtents = CoordBBox(tmpMinCoord, tmpMaxCoord);
+
66 
+
67  // read the old-frustum class member data
+
68  //Mat4d tmpW2C;
+
69  Mat4d tmpW2C, tmpC2S, tmpS2C, tmpWorldToLocal;
+
70  Mat4d tmpS2U, tmpXYLocalToUnit, tmpZLocalToUnit;
+
71  Real tmpWindow[6];
+
72  Real tmpPadding;
+
73 
+
74  //Mat4d tmpXYUnitToLocal, tmpZUnitToLocal
+
75 
+
76  // read in each matrix.
+
77  is.read(reinterpret_cast<char*>(&tmpW2C),
+ +
79  is.read(reinterpret_cast<char*>(&mC2W),
+
80  sizeof(Mat4d::value_type) * Mat4d::size * Mat4d::size);
+
81  is.read(reinterpret_cast<char*>(&tmpC2S),
+
82  sizeof(Mat4d::value_type) * Mat4d::size * Mat4d::size);
+
83  is.read(reinterpret_cast<char*>(&tmpS2C),
+
84  sizeof(Mat4d::value_type) * Mat4d::size * Mat4d::size);
+
85  is.read(reinterpret_cast<char*>(&tmpWorldToLocal),
+
86  sizeof(Mat4d::value_type) * Mat4d::size * Mat4d::size);
+
87  is.read(reinterpret_cast<char*>(&mLocalToWorld),
+
88  sizeof(Mat4d::value_type) * Mat4d::size * Mat4d::size);
+
89 
+
90  is.read(reinterpret_cast<char*>(&tmpWindow[0]), sizeof(Real));
+
91  is.read(reinterpret_cast<char*>(&tmpWindow[1]), sizeof(Real));
+
92  is.read(reinterpret_cast<char*>(&tmpWindow[2]), sizeof(Real));
+
93  is.read(reinterpret_cast<char*>(&tmpWindow[3]), sizeof(Real));
+
94  is.read(reinterpret_cast<char*>(&tmpWindow[4]), sizeof(Real));
+
95  is.read(reinterpret_cast<char*>(&tmpWindow[5]), sizeof(Real));
+
96 
+
97  is.read(reinterpret_cast<char*>(&tmpPadding), sizeof(Real));
+
98 
+
99  is.read(reinterpret_cast<char*>(&tmpS2U),
+
100  sizeof(Mat4d::value_type) * Mat4d::size * Mat4d::size);
+
101  is.read(reinterpret_cast<char*>(&mXYUnitToLocal),
+
102  sizeof(Mat4d::value_type) * Mat4d::size * Mat4d::size);
+
103  is.read(reinterpret_cast<char*>(&tmpXYLocalToUnit),
+
104  sizeof(Mat4d::value_type) * Mat4d::size * Mat4d::size);
+
105  is.read(reinterpret_cast<char*>(&mZUnitToLocal),
+
106  sizeof(Mat4d::value_type) * Mat4d::size * Mat4d::size);
+
107  is.read(reinterpret_cast<char*>(&tmpZLocalToUnit),
+
108  sizeof(Mat4d::value_type) * Mat4d::size * Mat4d::size);
+
109 
+
110 
+
111  mNearPlane = tmpWindow[4];
+
112  mFarPlane = tmpWindow[5];
+
113 
+
114  // Look up the world space corners of the
+
115  // frustum grid.
+
116  mFrNearOrigin = unitToLocalFrustum(Vec3R(0,0,0));
+
117  mFrFarOrigin = unitToLocalFrustum(Vec3R(0,0,1));
+
118 
+
119  Vec3d frNearXTip = unitToLocalFrustum(Vec3R(1,0,0));
+
120  Vec3d frNearYTip = unitToLocalFrustum(Vec3R(0,1,0));
+
121  mFrNearXBasis = frNearXTip - mFrNearOrigin;
+
122  mFrNearYBasis = frNearYTip - mFrNearOrigin;
+
123 
+
124  Vec3R frFarXTip = unitToLocalFrustum(Vec3R(1,0,1));
+
125  Vec3R frFarYTip = unitToLocalFrustum(Vec3R(0,1,1));
+
126  mFrFarXBasis = frFarXTip - mFrFarOrigin;
+
127  mFrFarYBasis = frFarYTip - mFrFarOrigin;
+
128  }
+
129 
+ +
131 
+
132  const Mat4d& getCamXForm() const {return mC2W; }
+
133 
+
134  double getDepth() const {return (mFarPlane - mNearPlane); }
+
135  double getTaper() const {
+
136 
+
137  return getNearPlaneWidth() / getFarPlaneWidth();
+
138  }
+
139 
+
140  double getNearPlaneWidth() const {
+
141  double nearPlaneWidth = (unitToWorld(Vec3d(0,0,0)) - unitToWorld(Vec3d(1,0,0))).length();
+
142  return nearPlaneWidth;
+
143  }
+
144 
+
145  double getFarPlaneWidth() const {
+
146  double farPlaneWidth = (unitToWorld(Vec3d(0,0,1)) - unitToWorld(Vec3d(1,0,1))).length();
+
147  return farPlaneWidth;
+
148  }
+
149 
+
150  double getNearPlaneDist() const { return mNearPlane; }
+
151 
+
152  const CoordBBox& getBBox() const {return mExtents; }
+
153 
+
154  Vec3d unitToWorld(const Vec3d& in) const {return mLocalToWorld.transform( unitToLocal(in) ); }
+
155 
+
156 private:
+
157  LegacyFrustum() {}
+
158 
+
159  Vec3d unitToLocal(const Vec3d& U) const {
+
160 
+
161  // We first find the local space coordinates
+
162  // of the unit point projected onto the near
+
163  // and far planes of the frustum by using a
+
164  // linear combination of the planes basis vectors
+
165  Vec3d nearLS = ( U[0] * mFrNearXBasis ) + ( U[1] * mFrNearYBasis ) + mFrNearOrigin;
+
166  Vec3d farLS = ( U[0] * mFrFarXBasis ) + ( U[1] * mFrFarYBasis ) + mFrFarOrigin;
+
167 
+
168  // then we lerp the two ws points in frustum z space
+
169  return U[2] * farLS + ( 1.0 - U[2] ) * nearLS;
+
170  }
+
171 
+
172  Vec3d unitToLocalFrustum(const Vec3d& u) const {
+
173  Vec3d fzu = mZUnitToLocal.transformH(u);
+
174  Vec3d fu = u;
+
175  fu[2] = fzu.z();
+
176  return mXYUnitToLocal.transformH(fu);
+
177  }
+
178 
+
179 private:
+
180  Mat4d mC2W, mLocalToWorld, mXYUnitToLocal, mZUnitToLocal;
+
181  CoordBBox mExtents;
+
182  Vec3d mFrNearXBasis, mFrNearYBasis, mFrFarXBasis, mFrFarYBasis;
+
183  Vec3d mFrNearOrigin, mFrFarOrigin;
+
184  double mNearPlane, mFarPlane;
+
185 };
+
186 
+
187 } // namespace internal
+
188 } // namespace math
+
189 } // namespace OPENVDB_VERSION_NAME
+
190 } // namespace openvdb
+
191 
+
192 #endif // OPENVDB_MATH_LEGACYFRUSTUM_HAS_BEEN_INCLUDED
+
193 
+
194 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
195 // All rights reserved. This software is distributed under the
+
196 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+ +
double getFarPlaneWidth() const
Definition: LegacyFrustum.h:145
+ +
T & z()
Definition: Vec3.h:99
+
void read(std::istream &is)
Definition: Tuple.h:143
+ +
Definition: Mat.h:146
+
LegacyFrustum class used at DreamWorks for converting old vdb files.
Definition: LegacyFrustum.h:50
+ +
Signed (x, y, z) 32-bit integer coordinates.
Definition: Coord.h:47
+
LegacyFrustum(std::istream &is)
Definition: LegacyFrustum.h:53
+ +
double Real
Definition: Types.h:64
+
double getDepth() const
Definition: LegacyFrustum.h:134
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
Vec3< double > Vec3d
Definition: Vec3.h:651
+
T ValueType
Definition: Vec3.h:51
+
const CoordBBox & getBBox() const
Definition: LegacyFrustum.h:152
+
const Mat4d & getCamXForm() const
Definition: LegacyFrustum.h:132
+
Definition: Exceptions.h:39
+
double value_type
Data type held by the matrix.
Definition: Mat4.h:61
+
double getNearPlaneDist() const
Definition: LegacyFrustum.h:150
+
double getNearPlaneWidth() const
Definition: LegacyFrustum.h:140
+
double getTaper() const
Definition: LegacyFrustum.h:135
+
void read(std::istream &is)
Definition: Mat.h:135
+
Axis-aligned bounding box of signed integer coordinates.
Definition: Coord.h:254
+ +
math::Vec3< Real > Vec3R
Definition: Types.h:76
+
Vec3d unitToWorld(const Vec3d &in) const
Definition: LegacyFrustum.h:154
+
~LegacyFrustum()
Definition: LegacyFrustum.h:130
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetAdvect_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetAdvect_8h_source.html new file mode 100644 index 00000000..cec4d16a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetAdvect_8h_source.html @@ -0,0 +1,651 @@ + + + + + + +OpenVDB: LevelSetAdvect.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
LevelSetAdvect.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
32 //
+
38 
+
39 #ifndef OPENVDB_TOOLS_LEVEL_SET_ADVECT_HAS_BEEN_INCLUDED
+
40 #define OPENVDB_TOOLS_LEVEL_SET_ADVECT_HAS_BEEN_INCLUDED
+
41 
+
42 #include <tbb/parallel_for.h>
+
43 #include <tbb/parallel_reduce.h>
+
44 #include <openvdb/Platform.h>
+
45 #include "LevelSetTracker.h"
+
46 #include "VelocityFields.h" // for EnrightField
+ +
48 #include <boost/math/constants/constants.hpp>
+
49 #include <openvdb/util/CpuTimer.h>
+
50 
+
51 namespace openvdb {
+ +
53 namespace OPENVDB_VERSION_NAME {
+
54 namespace tools {
+
55 
+
97 
+
98 template<typename GridT,
+
99  typename FieldT = EnrightField<typename GridT::ValueType>,
+
100  typename InterruptT = util::NullInterrupter>
+ +
102 {
+
103 public:
+
104  typedef GridT GridType;
+ +
106  typedef typename TrackerT::LeafRange LeafRange;
+
107  typedef typename TrackerT::LeafType LeafType;
+ +
109  typedef typename TrackerT::ValueType ValueType;
+
110  typedef typename FieldT::VectorType VectorType;
+
111 
+
113  LevelSetAdvection(GridT& grid, const FieldT& field, InterruptT* interrupt = NULL):
+
114  mTracker(grid, interrupt), mField(field),
+
115  mSpatialScheme(math::HJWENO5_BIAS),
+
116  mTemporalScheme(math::TVD_RK2) {}
+
117 
+
118  virtual ~LevelSetAdvection() {}
+
119 
+
121  math::BiasedGradientScheme getSpatialScheme() const { return mSpatialScheme; }
+
123  void setSpatialScheme(math::BiasedGradientScheme scheme) { mSpatialScheme = scheme; }
+
124 
+
126  math::TemporalIntegrationScheme getTemporalScheme() const { return mTemporalScheme; }
+
128  void setTemporalScheme(math::TemporalIntegrationScheme scheme) { mTemporalScheme = scheme; }
+
129 
+
131  math::BiasedGradientScheme getTrackerSpatialScheme() const { return mTracker.getSpatialScheme(); }
+
133  void setTrackerSpatialScheme(math::BiasedGradientScheme scheme) { mTracker.setSpatialScheme(scheme); }
+
134 
+
136  math::TemporalIntegrationScheme getTrackerTemporalScheme() const { return mTracker.getTemporalScheme(); }
+
138  void setTrackerTemporalScheme(math::TemporalIntegrationScheme scheme) { mTracker.setTemporalScheme(scheme); }
+
139 
+
142  int getNormCount() const { return mTracker.getNormCount(); }
+
145  void setNormCount(int n) { mTracker.setNormCount(n); }
+
146 
+
148  int getGrainSize() const { return mTracker.getGrainSize(); }
+
151  void setGrainSize(int grainsize) { mTracker.setGrainSize(grainsize); }
+
152 
+
157  size_t advect(ValueType time0, ValueType time1);
+
158 
+
159 private:
+
160 
+
161  // disallow copy construction and copy by assinment!
+
162  LevelSetAdvection(const LevelSetAdvection&);// not implemented
+
163  LevelSetAdvection& operator=(const LevelSetAdvection&);// not implemented
+
164 
+
165  // This templated private struct implements all the level set magic.
+
166  template<typename MapT, math::BiasedGradientScheme SpatialScheme,
+
167  math::TemporalIntegrationScheme TemporalScheme>
+
168  struct Advect
+
169  {
+
171  Advect(LevelSetAdvection& parent);
+
173  Advect(const Advect& other);
+
175  virtual ~Advect() { if (mIsMaster) this->clearField(); }
+
178  size_t advect(ValueType time0, ValueType time1);
+
180  void operator()(const LeafRange& r) const
+
181  {
+
182  if (mTask) mTask(const_cast<Advect*>(this), r);
+
183  else OPENVDB_THROW(ValueError, "task is undefined - don\'t call this method directly");
+
184  }
+
186  void cook(const char* msg, size_t swapBuffer = 0);
+
188  typename GridT::ValueType sampleField(ValueType time0, ValueType time1);
+
189  template <bool Aligned> void sample(const LeafRange& r, ValueType t0, ValueType t1);
+
190  inline void sampleXformed(const LeafRange& r, ValueType t0, ValueType t1)
+
191  {
+
192  this->sample<false>(r, t0, t1);
+
193  }
+
194  inline void sampleAligned(const LeafRange& r, ValueType t0, ValueType t1)
+
195  {
+
196  this->sample<true>(r, t0, t1);
+
197  }
+
198  void clearField();
+
199  // Convex combination of Phi and a forward Euler advection steps:
+
200  // Phi(result) = alpha * Phi(phi) + (1-alpha) * (Phi(0) - dt * Speed(speed)*|Grad[Phi(0)]|);
+
201  template <int Nominator, int Denominator>
+
202  void euler(const LeafRange&, ValueType, Index, Index);
+
203  inline void euler01(const LeafRange& r, ValueType t) {this->euler<0,1>(r, t, 0, 1);}
+
204  inline void euler12(const LeafRange& r, ValueType t) {this->euler<1,2>(r, t, 1, 1);}
+
205  inline void euler34(const LeafRange& r, ValueType t) {this->euler<3,4>(r, t, 1, 2);}
+
206  inline void euler13(const LeafRange& r, ValueType t) {this->euler<1,3>(r, t, 1, 2);}
+
207 
+
208  LevelSetAdvection& mParent;
+
209  VectorType* mVelocity;
+
210  size_t* mOffsets;
+
211  const MapT* mMap;
+
212  typename boost::function<void (Advect*, const LeafRange&)> mTask;
+
213  const bool mIsMaster;
+
214  }; // end of private Advect struct
+
215 
+
216  template<math::BiasedGradientScheme SpatialScheme>
+
217  size_t advect1(ValueType time0, ValueType time1);
+
218 
+
219  template<math::BiasedGradientScheme SpatialScheme,
+
220  math::TemporalIntegrationScheme TemporalScheme>
+
221  size_t advect2(ValueType time0, ValueType time1);
+
222 
+
223  template<math::BiasedGradientScheme SpatialScheme,
+
224  math::TemporalIntegrationScheme TemporalScheme,
+
225  typename MapType>
+
226  size_t advect3(ValueType time0, ValueType time1);
+
227 
+
228  TrackerT mTracker;
+
229  //each thread needs a deep copy of the field since it might contain a ValueAccessor
+
230  const FieldT mField;
+
231  math::BiasedGradientScheme mSpatialScheme;
+
232  math::TemporalIntegrationScheme mTemporalScheme;
+
233 
+
234 };//end of LevelSetAdvection
+
235 
+
236 template<typename GridT, typename FieldT, typename InterruptT>
+
237 inline size_t
+ +
239 {
+
240  switch (mSpatialScheme) {
+
241  case math::FIRST_BIAS:
+
242  return this->advect1<math::FIRST_BIAS >(time0, time1);
+
243  case math::SECOND_BIAS:
+
244  return this->advect1<math::SECOND_BIAS >(time0, time1);
+
245  case math::THIRD_BIAS:
+
246  return this->advect1<math::THIRD_BIAS >(time0, time1);
+
247  case math::WENO5_BIAS:
+
248  return this->advect1<math::WENO5_BIAS >(time0, time1);
+
249  case math::HJWENO5_BIAS:
+
250  return this->advect1<math::HJWENO5_BIAS>(time0, time1);
+
251  default:
+
252  OPENVDB_THROW(ValueError, "Spatial difference scheme not supported!");
+
253  }
+
254  return 0;
+
255 }
+
256 
+
257 template<typename GridT, typename FieldT, typename InterruptT>
+
258 template<math::BiasedGradientScheme SpatialScheme>
+
259 inline size_t
+
260 LevelSetAdvection<GridT, FieldT, InterruptT>::advect1(ValueType time0, ValueType time1)
+
261 {
+
262  switch (mTemporalScheme) {
+
263  case math::TVD_RK1:
+
264  return this->advect2<SpatialScheme, math::TVD_RK1>(time0, time1);
+
265  case math::TVD_RK2:
+
266  return this->advect2<SpatialScheme, math::TVD_RK2>(time0, time1);
+
267  case math::TVD_RK3:
+
268  return this->advect2<SpatialScheme, math::TVD_RK3>(time0, time1);
+
269  default:
+
270  OPENVDB_THROW(ValueError, "Temporal integration scheme not supported!");
+
271  }
+
272  return 0;
+
273 }
+
274 
+
275 template<typename GridT, typename FieldT, typename InterruptT>
+
276 template<math::BiasedGradientScheme SpatialScheme,
+
277  math::TemporalIntegrationScheme TemporalScheme>
+
278 inline size_t
+
279 LevelSetAdvection<GridT, FieldT, InterruptT>::advect2(ValueType time0, ValueType time1)
+
280 {
+
281  const math::Transform& trans = mTracker.grid().transform();
+
282  if (trans.mapType() == math::UniformScaleMap::mapType()) {
+
283  return this->advect3<SpatialScheme, TemporalScheme, math::UniformScaleMap>(time0, time1);
+
284  } else if (trans.mapType() == math::UniformScaleTranslateMap::mapType()) {
+
285  return this->advect3<SpatialScheme, TemporalScheme, math::UniformScaleTranslateMap>(time0, time1);
+
286  } else if (trans.mapType() == math::UnitaryMap::mapType()) {
+
287  return this->advect3<SpatialScheme, TemporalScheme, math::UnitaryMap >(time0, time1);
+
288  } else if (trans.mapType() == math::TranslationMap::mapType()) {
+
289  return this->advect3<SpatialScheme, TemporalScheme, math::TranslationMap>(time0, time1);
+
290  } else {
+
291  OPENVDB_THROW(ValueError, "MapType not supported!");
+
292  }
+
293  return 0;
+
294 }
+
295 
+
296 template<typename GridT, typename FieldT, typename InterruptT>
+
297 template<math::BiasedGradientScheme SpatialScheme,
+
298  math::TemporalIntegrationScheme TemporalScheme,
+
299  typename MapT>
+
300 inline size_t
+
301 LevelSetAdvection<GridT, FieldT, InterruptT>::advect3(ValueType time0, ValueType time1)
+
302 {
+
303  Advect<MapT, SpatialScheme, TemporalScheme> tmp(*this);
+
304  return tmp.advect(time0, time1);
+
305 }
+
306 
+
307 
+
309 
+
310 
+
311 template<typename GridT, typename FieldT, typename InterruptT>
+
312 template <typename MapT, math::BiasedGradientScheme SpatialScheme,
+
313  math::TemporalIntegrationScheme TemporalScheme>
+
314 inline
+
315 LevelSetAdvection<GridT, FieldT, InterruptT>::
+
316 Advect<MapT, SpatialScheme, TemporalScheme>::
+
317 Advect(LevelSetAdvection& parent)
+
318  : mParent(parent)
+
319  , mVelocity(NULL)
+
320  , mOffsets(NULL)
+
321  , mMap(parent.mTracker.grid().transform().template constMap<MapT>().get())
+
322  , mTask(0)
+
323  , mIsMaster(true)
+
324 {
+
325 }
+
326 
+
327 template<typename GridT, typename FieldT, typename InterruptT>
+
328 template <typename MapT, math::BiasedGradientScheme SpatialScheme,
+
329  math::TemporalIntegrationScheme TemporalScheme>
+
330 inline
+
331 LevelSetAdvection<GridT, FieldT, InterruptT>::
+
332 Advect<MapT, SpatialScheme, TemporalScheme>::
+
333 Advect(const Advect& other)
+
334  : mParent(other.mParent)
+
335  , mVelocity(other.mVelocity)
+
336  , mOffsets(other.mOffsets)
+
337  , mMap(other.mMap)
+
338  , mTask(other.mTask)
+
339  , mIsMaster(false)
+
340 {
+
341 }
+
342 
+
343 template<typename GridT, typename FieldT, typename InterruptT>
+
344 template <typename MapT, math::BiasedGradientScheme SpatialScheme,
+
345  math::TemporalIntegrationScheme TemporalScheme>
+
346 inline size_t
+ + +
349 advect(ValueType time0, ValueType time1)
+
350 {
+
351  //util::CpuTimer timer;
+
352  size_t countCFL = 0;
+
353  if ( math::isZero(time0 - time1) ) return countCFL;
+
354  const bool isForward = time0 < time1;
+
355  while ((isForward ? time0<time1 : time0>time1) && mParent.mTracker.checkInterrupter()) {
+
357  //timer.start( "\nallocate buffers" );
+
358  mParent.mTracker.leafs().rebuildAuxBuffers(TemporalScheme == math::TVD_RK3 ? 2 : 1);
+
359  //timer.stop();
+
360 
+
361  const ValueType dt = this->sampleField(time0, time1);
+
362  if ( math::isZero(dt) ) break;//V is essentially zero so terminate
+
363 
+
364  OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN //switch is resolved at compile-time
+
365  switch(TemporalScheme) {
+
366  case math::TVD_RK1:
+
367  // Perform one explicit Euler step: t1 = t0 + dt
+
368  // Phi_t1(1) = Phi_t0(0) - dt * VdotG_t0(0)
+
369  mTask = boost::bind(&Advect::euler01, _1, _2, dt);
+
370 
+
371  // Cook and swap buffer 0 and 1 such that Phi_t1(0) and Phi_t0(1)
+
372  this->cook("Advecting level set using TVD_RK1", 1);
+
373  break;
+
374  case math::TVD_RK2:
+
375  // Perform one explicit Euler step: t1 = t0 + dt
+
376  // Phi_t1(1) = Phi_t0(0) - dt * VdotG_t0(0)
+
377  mTask = boost::bind(&Advect::euler01, _1, _2, dt);
+
378 
+
379  // Cook and swap buffer 0 and 1 such that Phi_t1(0) and Phi_t0(1)
+
380  this->cook("Advecting level set using TVD_RK1 (step 1 of 2)", 1);
+
381 
+
382  // Convex combine explict Euler step: t2 = t0 + dt
+
383  // Phi_t2(1) = 1/2 * Phi_t0(1) + 1/2 * (Phi_t1(0) - dt * V.Grad_t1(0))
+
384  mTask = boost::bind(&Advect::euler12, _1, _2, dt);
+
385 
+
386  // Cook and swap buffer 0 and 1 such that Phi_t2(0) and Phi_t1(1)
+
387  this->cook("Advecting level set using TVD_RK1 (step 2 of 2)", 1);
+
388  break;
+
389  case math::TVD_RK3:
+
390  // Perform one explicit Euler step: t1 = t0 + dt
+
391  // Phi_t1(1) = Phi_t0(0) - dt * VdotG_t0(0)
+
392  mTask = boost::bind(&Advect::euler01, _1, _2, dt);
+
393 
+
394  // Cook and swap buffer 0 and 1 such that Phi_t1(0) and Phi_t0(1)
+
395  this->cook("Advecting level set using TVD_RK3 (step 1 of 3)", 1);
+
396 
+
397  // Convex combine explict Euler step: t2 = t0 + dt/2
+
398  // Phi_t2(2) = 3/4 * Phi_t0(1) + 1/4 * (Phi_t1(0) - dt * V.Grad_t1(0))
+
399  mTask = boost::bind(&Advect::euler34, _1, _2, dt);
+
400 
+
401  // Cook and swap buffer 0 and 2 such that Phi_t2(0) and Phi_t1(2)
+
402  this->cook("Advecting level set using TVD_RK3 (step 2 of 3)", 2);
+
403 
+
404  // Convex combine explict Euler step: t3 = t0 + dt
+
405  // Phi_t3(2) = 1/3 * Phi_t0(1) + 2/3 * (Phi_t2(0) - dt * V.Grad_t2(0)
+
406  mTask = boost::bind(&Advect::euler13, _1, _2, dt);
+
407 
+
408  // Cook and swap buffer 0 and 2 such that Phi_t3(0) and Phi_t2(2)
+
409  this->cook("Advecting level set using TVD_RK3 (step 3 of 3)", 2);
+
410  break;
+
411  default:
+
412  OPENVDB_THROW(ValueError, "Temporal integration scheme not supported!");
+
413  }//end of compile-time resolved switch
+ +
415 
+
416  time0 += isForward ? dt : -dt;
+
417  ++countCFL;
+
418  mParent.mTracker.leafs().removeAuxBuffers();
+
419  this->clearField();
+
421  mParent.mTracker.track();
+
422  }//end wile-loop over time
+
423  return countCFL;//number of CLF propagation steps
+
424 }
+
425 
+
426 template<typename GridT, typename FieldT, typename InterruptT>
+
427 template<typename MapT, math::BiasedGradientScheme SpatialScheme,
+
428  math::TemporalIntegrationScheme TemporalScheme>
+
429 inline typename GridT::ValueType
+
430 LevelSetAdvection<GridT, FieldT, InterruptT>::
+
431 Advect<MapT, SpatialScheme, TemporalScheme>::
+
432 sampleField(ValueType time0, ValueType time1)
+
433 {
+
434  const int grainSize = mParent.mTracker.getGrainSize();
+
435  const size_t leafCount = mParent.mTracker.leafs().leafCount();
+
436  if (leafCount==0) return ValueType(0.0);
+
437 
+
438  // Compute the pre-fix sum of offsets to active voxels
+
439  size_t size=0, voxelCount=mParent.mTracker.leafs().getPreFixSum(mOffsets, size, grainSize);
+
440 
+
441  // Sample the velocity field
+
442  if (mParent.mField.transform() == mParent.mTracker.grid().transform()) {
+
443  mTask = boost::bind(&Advect::sampleAligned, _1, _2, time0, time1);
+
444  } else {
+
445  mTask = boost::bind(&Advect::sampleXformed, _1, _2, time0, time1);
+
446  }
+
447  assert(voxelCount != mParent.mTracker.grid().activeVoxelCount());
+
448  mVelocity = new VectorType[ voxelCount ];
+
449  this->cook("Sampling advection field");
+
450 
+
451  // Find the extrema of the magnitude of the velocities
+
452  ValueType maxAbsV = 0;
+
453  VectorType* v = mVelocity;
+
454  for (size_t i=0; i<voxelCount; ++i, ++v) maxAbsV = math::Max(maxAbsV, ValueType(v->lengthSqr()));
+
455 
+
456  // Compute the CFL number
+
457  if (math::isApproxZero(maxAbsV, math::Delta<ValueType>::value())) return ValueType(0);
+
458 #ifndef _MSC_VER // Visual C++ doesn't guarantee thread-safe initialization of local statics
+
459  static
+
460 #endif
+
461  const ValueType CFL = (TemporalScheme == math::TVD_RK1 ? ValueType(0.3) :
+
462  TemporalScheme == math::TVD_RK2 ? ValueType(0.9) :
+
463  ValueType(1.0))/math::Sqrt(ValueType(3.0));
+
464  const ValueType dt = math::Abs(time1 - time0), dx = mParent.mTracker.voxelSize();
+
465  return math::Min(dt, ValueType(CFL*dx/math::Sqrt(maxAbsV)));
+
466 }
+
467 
+
468 template<typename GridT, typename FieldT, typename InterruptT>
+
469 template <typename MapT, math::BiasedGradientScheme SpatialScheme,
+
470  math::TemporalIntegrationScheme TemporalScheme>
+
471 template <bool Aligned>
+
472 inline void
+
473 LevelSetAdvection<GridT, FieldT, InterruptT>::
+
474 Advect<MapT, SpatialScheme, TemporalScheme>::
+
475 sample(const LeafRange& range, ValueType time0, ValueType time1)
+
476 {
+
477  const bool isForward = time0 < time1;
+
478  typedef typename LeafType::ValueOnCIter VoxelIterT;
+
479  const MapT& map = *mMap;
+
480  const FieldT field( mParent.mField );
+
481  mParent.mTracker.checkInterrupter();
+
482  for (typename LeafRange::Iterator leafIter = range.begin(); leafIter; ++leafIter) {
+
483  VectorType* vel = mVelocity + mOffsets[ leafIter.pos() ];
+
484  for (VoxelIterT iter = leafIter->cbeginValueOn(); iter; ++iter, ++vel) {
+
485  const VectorType v = Aligned ? field(iter.getCoord(), time0) ://resolved at compile time
+
486  field(map.applyMap(iter.getCoord().asVec3d()), time0);
+
487  *vel = isForward ? v : -v;
+
488  }
+
489  }
+
490 }
+
491 
+
492 template<typename GridT, typename FieldT, typename InterruptT>
+
493 template <typename MapT, math::BiasedGradientScheme SpatialScheme,
+
494  math::TemporalIntegrationScheme TemporalScheme>
+
495 inline void
+
496 LevelSetAdvection<GridT, FieldT, InterruptT>::
+
497 Advect<MapT, SpatialScheme, TemporalScheme>::
+
498 clearField()
+
499 {
+
500  delete [] mOffsets;
+
501  delete [] mVelocity;
+
502  mOffsets = NULL;
+
503  mVelocity = NULL;
+
504 }
+
505 
+
506 template<typename GridT, typename FieldT, typename InterruptT>
+
507 template <typename MapT, math::BiasedGradientScheme SpatialScheme,
+
508  math::TemporalIntegrationScheme TemporalScheme>
+
509 inline void
+
510 LevelSetAdvection<GridT, FieldT, InterruptT>::
+
511 Advect<MapT, SpatialScheme, TemporalScheme>::
+
512 cook(const char* msg, size_t swapBuffer)
+
513 {
+
514  mParent.mTracker.startInterrupter( msg );
+
515 
+
516  const int grainSize = mParent.mTracker.getGrainSize();
+
517  const LeafRange range = mParent.mTracker.leafs().leafRange(grainSize);
+
518 
+
519  grainSize == 0 ? (*this)(range) : tbb::parallel_for(range, *this);
+
520 
+
521  mParent.mTracker.leafs().swapLeafBuffer(swapBuffer, grainSize == 0);
+
522 
+
523  mParent.mTracker.endInterrupter();
+
524 }
+
525 
+
526 // Convex combination of Phi and a forward Euler advection steps:
+
527 // Phi(result) = alpha * Phi(phi) + (1-alpha) * (Phi(0) - dt * V.Grad(0));
+
528 template<typename GridT, typename FieldT, typename InterruptT>
+
529 template<typename MapT, math::BiasedGradientScheme SpatialScheme,
+
530  math::TemporalIntegrationScheme TemporalScheme>
+
531 template <int Nominator, int Denominator>
+
532 inline void
+
533 LevelSetAdvection<GridT, FieldT, InterruptT>::
+
534 Advect<MapT, SpatialScheme, TemporalScheme>::
+
535 euler(const LeafRange& range, ValueType dt, Index phiBuffer, Index resultBuffer)
+
536 {
+
537  typedef math::BIAS_SCHEME<SpatialScheme> SchemeT;
+
538  typedef typename SchemeT::template ISStencil<GridType>::StencilType StencilT;
+
539  typedef typename LeafType::ValueOnCIter VoxelIterT;
+
540  typedef math::GradientBiased<MapT, SpatialScheme> GradT;
+
541 
+
542  static const ValueType Alpha = ValueType(Nominator)/ValueType(Denominator);
+
543  static const ValueType Beta = ValueType(1) - Alpha;
+
544 
+
545  mParent.mTracker.checkInterrupter();
+
546  const MapT& map = *mMap;
+
547  StencilT stencil(mParent.mTracker.grid());
+
548  for (typename LeafRange::Iterator leafIter = range.begin(); leafIter; ++leafIter) {
+
549  const VectorType* vel = mVelocity + mOffsets[ leafIter.pos() ];
+
550  const ValueType* phi = leafIter.buffer(phiBuffer).data();
+
551  ValueType* result = leafIter.buffer(resultBuffer).data();
+
552  for (VoxelIterT voxelIter = leafIter->cbeginValueOn(); voxelIter; ++voxelIter, ++vel) {
+
553  const Index i = voxelIter.pos();
+
554  stencil.moveTo(voxelIter);
+
555  const ValueType a = stencil.getValue() - dt * vel->dot(GradT::result(map, stencil, *vel));
+
556  result[i] = Nominator ? Alpha * phi[i] + Beta * a : a;
+
557  }//loop over active voxels in the leaf of the mask
+
558  }//loop over leafs of the level set
+
559 }
+
560 
+
561 } // namespace tools
+
562 } // namespace OPENVDB_VERSION_NAME
+
563 } // namespace openvdb
+
564 
+
565 #endif // OPENVDB_TOOLS_LEVEL_SET_ADVECT_HAS_BEEN_INCLUDED
+
566 
+
567 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
568 // All rights reserved. This software is distributed under the
+
569 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
TrackerT::BufferType BufferType
Definition: LevelSetAdvect.h:108
+ +
math::BiasedGradientScheme getTrackerSpatialScheme() const
Definition: LevelSetAdvect.h:131
+
Performs multi-threaded interface tracking of narrow band level sets. This is the building-block for ...
+ +
Defines two simple wrapper classes for advection velocity fields as well as VelocitySampler and Veloc...
+
float Sqrt(float x)
Return the square root of a floating-point value.
Definition: Math.h:709
+
Definition: FiniteDifference.h:195
+
TemporalIntegrationScheme
Temporal integration schemes.
Definition: FiniteDifference.h:261
+
const Type & Min(const Type &a, const Type &b)
Return the minimum of two values.
Definition: Math.h:622
+
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
+
Definition: FiniteDifference.h:194
+
Definition: FiniteDifference.h:263
+
void setTrackerSpatialScheme(math::BiasedGradientScheme scheme)
Set the spatial finite difference scheme.
Definition: LevelSetAdvect.h:133
+
TreeType::ValueType ValueType
Definition: LevelSetTracker.h:73
+
LevelSetAdvection(GridT &grid, const FieldT &field, InterruptT *interrupt=NULL)
Main constructor.
Definition: LevelSetAdvect.h:113
+
bool isZero(const Type &x)
Return true if x is exactly equal to zero.
Definition: Math.h:324
+
Definition: FiniteDifference.h:198
+
LevelSetTracker< GridT, InterruptT > TrackerT
Definition: LevelSetAdvect.h:105
+
void setTemporalScheme(math::TemporalIntegrationScheme scheme)
Set the spatial finite difference scheme.
Definition: LevelSetAdvect.h:128
+
Definition: FiniteDifference.h:197
+
TrackerT::ValueType ValueType
Definition: LevelSetAdvect.h:109
+
void setSpatialScheme(math::BiasedGradientScheme scheme)
Set the spatial finite difference scheme.
Definition: LevelSetAdvect.h:123
+
math::TemporalIntegrationScheme getTemporalScheme() const
Definition: LevelSetAdvect.h:126
+
const int size
Definition: MaskToLevelSet.h:119
+
Index32 Index
Definition: Types.h:58
+
void setNormCount(int n)
Set the number of normalizations performed per track or normalize call.
Definition: LevelSetAdvect.h:145
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
void setTrackerTemporalScheme(math::TemporalIntegrationScheme scheme)
Set the spatial finite difference scheme.
Definition: LevelSetAdvect.h:138
+
TrackerT::LeafRange LeafRange
Definition: LevelSetAdvect.h:106
+
Calculate an axis-aligned bounding box in index space from a bounding sphere in world space...
Definition: Transform.h:66
+
int getGrainSize() const
Definition: LevelSetAdvect.h:148
+
Name mapType() const
Return the transformation map's type-name.
Definition: Transform.h:93
+
Definition: Exceptions.h:39
+
BiasedGradientScheme
Biased Gradients are limited to non-centered differences.
Definition: FiniteDifference.h:192
+
#define OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN
Definition: Platform.h:129
+
virtual ~LevelSetAdvection()
Definition: LevelSetAdvect.h:118
+
Definition: FiniteDifference.h:265
+
int getNormCount() const
Definition: LevelSetAdvect.h:142
+
Hyperbolic advection of narrow-band level sets in an external velocity field.
Definition: LevelSetAdvect.h:101
+
GridT GridType
Definition: LevelSetAdvect.h:104
+
#define OPENVDB_NO_UNREACHABLE_CODE_WARNING_END
Definition: Platform.h:130
+
Definition: Exceptions.h:88
+
const Type & Max(const Type &a, const Type &b)
Return the maximum of two values.
Definition: Math.h:561
+
LeafManagerType::BufferType BufferType
Definition: LevelSetTracker.h:76
+
math::TemporalIntegrationScheme getTrackerTemporalScheme() const
Definition: LevelSetAdvect.h:136
+
bool isApproxZero(const Type &x)
Return true if x is equal to zero to within the default floating-point comparison tolerance...
Definition: Math.h:336
+
FieldT::VectorType VectorType
Definition: LevelSetAdvect.h:110
+
void setGrainSize(int grainsize)
Set the grain-size used for multi-threading.
Definition: LevelSetAdvect.h:151
+ +
int32_t Abs(int32_t i)
Return the absolute value of the given quantity.
Definition: Math.h:293
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
Definition: FiniteDifference.h:196
+
Performs multi-threaded interface tracking of narrow band level sets.
Definition: LevelSetTracker.h:67
+
math::BiasedGradientScheme getSpatialScheme() const
Definition: LevelSetAdvect.h:121
+
size_t advect(ValueType time0, ValueType time1)
Definition: LevelSetAdvect.h:238
+
Definition: FiniteDifference.h:264
+
TreeType::LeafNodeType LeafType
Definition: LevelSetTracker.h:72
+
TrackerT::LeafType LeafType
Definition: LevelSetAdvect.h:107
+ +
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetFilter_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetFilter_8h_source.html new file mode 100644 index 00000000..7da73845 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetFilter_8h_source.html @@ -0,0 +1,622 @@ + + + + + + +OpenVDB: LevelSetFilter.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
LevelSetFilter.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
41 
+
42 #ifndef OPENVDB_TOOLS_LEVELSETFILTER_HAS_BEEN_INCLUDED
+
43 #define OPENVDB_TOOLS_LEVELSETFILTER_HAS_BEEN_INCLUDED
+
44 
+
45 #include <assert.h>
+
46 #include <boost/type_traits/is_floating_point.hpp>
+
47 #include "LevelSetTracker.h"
+
48 #include "Interpolation.h"
+
49 
+
50 namespace openvdb {
+ +
52 namespace OPENVDB_VERSION_NAME {
+
53 namespace tools {
+
54 
+
61 template<typename GridT,
+
62  typename MaskT = typename GridT::template ValueConverter<float>::Type,
+
63  typename InterruptT = util::NullInterrupter>
+
64 class LevelSetFilter : public LevelSetTracker<GridT, InterruptT>
+
65 {
+
66 public:
+ +
68  typedef GridT GridType;
+
69  typedef MaskT MaskType;
+
70  typedef typename GridType::TreeType TreeType;
+
71  typedef typename TreeType::ValueType ValueType;
+
72  typedef typename MaskType::ValueType AlphaType;
+
73  BOOST_STATIC_ASSERT(boost::is_floating_point<AlphaType>::value);
+
74 
+
78  LevelSetFilter(GridType& grid, InterruptT* interrupt = NULL)
+
79  : BaseType(grid, interrupt)
+
80  , mMinMask(0)
+
81  , mMaxMask(1)
+
82  , mInvertMask(false)
+
83  {
+
84  }
+
86  virtual ~LevelSetFilter() {}
+
87 
+
90  AlphaType minMask() const { return mMinMask; }
+
93  AlphaType maxMask() const { return mMaxMask; }
+
101  void setMaskRange(AlphaType min, AlphaType max)
+
102  {
+
103  if (!(min < max)) OPENVDB_THROW(ValueError, "Invalid mask range (expects min < max)");
+
104  mMinMask = min;
+
105  mMaxMask = max;
+
106  }
+
107 
+
110  bool isMaskInverted() const { return mInvertMask; }
+
113  void invertMask(bool invert=true) { mInvertMask = invert; }
+
114 
+
117  void meanCurvature(const MaskType* mask = NULL)
+
118  {
+
119  Filter f(this, mask); f.meanCurvature();
+
120  }
+
121 
+
124  void laplacian(const MaskType* mask = NULL)
+
125  {
+
126  Filter f(this, mask); f.laplacian();
+
127  }
+
128 
+
135  void gaussian(int width = 1, const MaskType* mask = NULL)
+
136  {
+
137  Filter f(this, mask); f.gaussian(width);
+
138  }
+
139 
+
143  void offset(ValueType offset, const MaskType* mask = NULL)
+
144  {
+
145  Filter f(this, mask); f.offset(offset);
+
146  }
+
147 
+
154  void median(int width = 1, const MaskType* mask = NULL)
+
155  {
+
156  Filter f(this, mask); f.median(width);
+
157  }
+
158 
+
164  void mean(int width = 1, const MaskType* mask = NULL)
+
165  {
+
166  Filter f(this, mask); f.mean(width);
+
167  }
+
168 
+
169 private:
+
170  // disallow copy construction and copy by assignment!
+
171  LevelSetFilter(const LevelSetFilter&);// not implemented
+
172  LevelSetFilter& operator=(const LevelSetFilter&);// not implemented
+
173 
+
174  // Private struct that implements all the filtering.
+
175  struct Filter
+
176  {
+
177  typedef typename TreeType::LeafNodeType LeafT;
+
178  typedef typename LeafT::ValueOnIter VoxelIterT;
+
179  typedef typename LeafT::ValueOnCIter VoxelCIterT;
+
180  typedef typename tree::LeafManager<TreeType>::BufferType BufferT;
+
181  typedef typename tree::LeafManager<TreeType>::LeafRange LeafRange;
+
182  typedef typename LeafRange::Iterator LeafIterT;
+
183  typedef tools::AlphaMask<GridT, MaskT> AlphaMaskT;
+
184 
+
185  Filter(LevelSetFilter* parent, const MaskType* mask) : mParent(parent), mMask(mask) {}
+
186  virtual ~Filter() {}
+
187 
+
188  void box(int width);
+
189  void median(int width);
+
190  void mean(int width);
+
191  void gaussian(int width);
+
192  void laplacian();
+
193  void meanCurvature();
+
194  void offset(ValueType value);
+
195  void operator()(const LeafRange& r) const
+
196  {
+
197  if (mTask) mTask(const_cast<Filter*>(this), r);
+
198  else OPENVDB_THROW(ValueError, "task is undefined - don\'t call this method directly");
+
199  }
+
200  void cook(bool swap)
+
201  {
+
202  const int n = mParent->getGrainSize();
+
203  if (n>0) {
+
204  tbb::parallel_for(mParent->leafs().leafRange(n), *this);
+
205  } else {
+
206  (*this)(mParent->leafs().leafRange());
+
207  }
+
208  if (swap) mParent->leafs().swapLeafBuffer(1, n==0);
+
209  }
+
210 
+
211  template <size_t Axis>
+
212  struct Avg {
+
213  Avg(const GridT& grid, Int32 w) :
+
214  acc(grid.tree()), width(w), frac(1/ValueType(2*w+1)) {}
+
215  inline ValueType operator()(Coord xyz)
+
216  {
+
217  ValueType sum = zeroVal<ValueType>();
+
218  Int32& i = xyz[Axis], j = i + width;
+
219  for (i -= width; i <= j; ++i) sum += acc.getValue(xyz);
+
220  return sum*frac;
+
221  }
+
222  typename GridT::ConstAccessor acc;
+
223  const Int32 width;
+
224  const ValueType frac;
+
225  };
+
226 
+
227  template <typename AvgT>
+
228  void box( const LeafRange& r, Int32 w);
+
229 
+
230  void boxX(const LeafRange& r, Int32 w) { this->box<Avg<0> >(r,w); }
+
231  void boxZ(const LeafRange& r, Int32 w) { this->box<Avg<1> >(r,w); }
+
232  void boxY(const LeafRange& r, Int32 w) { this->box<Avg<2> >(r,w); }
+
233 
+
234  void median(const LeafRange&, int);
+
235  void meanCurvature(const LeafRange&);
+
236  void laplacian(const LeafRange&);
+
237  void offset(const LeafRange&, ValueType);
+
238 
+
239  LevelSetFilter* mParent;
+
240  const MaskType* mMask;
+
241  typename boost::function<void (Filter*, const LeafRange&)> mTask;
+
242  }; // end of private Filter struct
+
243 
+
244  AlphaType mMinMask, mMaxMask;
+
245  bool mInvertMask;
+
246 
+
247 }; // end of LevelSetFilter class
+
248 
+
249 
+
251 
+
252 template<typename GridT, typename MaskT, typename InterruptT>
+
253 inline void
+
254 LevelSetFilter<GridT, MaskT, InterruptT>::
+
255 Filter::median(int width)
+
256 {
+
257  mParent->startInterrupter("Median-value flow of level set");
+
258 
+
259  mParent->leafs().rebuildAuxBuffers(1, mParent->getGrainSize()==0);
+
260 
+
261  mTask = boost::bind(&Filter::median, _1, _2, std::max(1, width));
+
262  this->cook(true);
+
263 
+
264  mParent->track();
+
265 
+
266  mParent->endInterrupter();
+
267 }
+
268 
+
269 template<typename GridT, typename MaskT, typename InterruptT>
+
270 inline void
+
271 LevelSetFilter<GridT, MaskT, InterruptT>::
+
272 Filter::mean(int width)
+
273 {
+
274  mParent->startInterrupter("Mean-value flow of level set");
+
275 
+
276  this->box(width);
+
277 
+
278  mParent->endInterrupter();
+
279 }
+
280 
+
281 template<typename GridT, typename MaskT, typename InterruptT>
+
282 inline void
+
283 LevelSetFilter<GridT, MaskT, InterruptT>::
+
284 Filter::gaussian(int width)
+
285 {
+
286  mParent->startInterrupter("Gaussian flow of level set");
+
287 
+
288  for (int n=0; n<4; ++n) this->box(width);
+
289 
+
290  mParent->endInterrupter();
+
291 }
+
292 
+
293 template<typename GridT, typename MaskT, typename InterruptT>
+
294 inline void
+
295 LevelSetFilter<GridT, MaskT, InterruptT>::
+
296 Filter::box(int width)
+
297 {
+
298  mParent->leafs().rebuildAuxBuffers(1, mParent->getGrainSize()==0);
+
299 
+
300  width = std::max(1, width);
+
301 
+
302  mTask = boost::bind(&Filter::boxX, _1, _2, width);
+
303  this->cook(true);
+
304 
+
305  mTask = boost::bind(&Filter::boxY, _1, _2, width);
+
306  this->cook(true);
+
307 
+
308  mTask = boost::bind(&Filter::boxZ, _1, _2, width);
+
309  this->cook(true);
+
310 
+
311  mParent->track();
+
312 }
+
313 
+
314 template<typename GridT, typename MaskT, typename InterruptT>
+
315 inline void
+ + +
318 {
+
319  mParent->startInterrupter("Mean-curvature flow of level set");
+
320 
+
321  mParent->leafs().rebuildAuxBuffers(1, mParent->getGrainSize()==0);
+
322 
+
323  mTask = boost::bind(&Filter::meanCurvature, _1, _2);
+
324  this->cook(true);
+
325 
+
326  mParent->track();
+
327 
+
328  mParent->endInterrupter();
+
329 }
+
330 
+
331 template<typename GridT, typename MaskT, typename InterruptT>
+
332 inline void
+ + +
335 {
+
336  mParent->startInterrupter("Laplacian flow of level set");
+
337 
+
338  mParent->leafs().rebuildAuxBuffers(1, mParent->getGrainSize()==0);
+
339 
+
340  mTask = boost::bind(&Filter::laplacian, _1, _2);
+
341  this->cook(true);
+
342 
+
343  mParent->track();
+
344 
+
345  mParent->endInterrupter();
+
346 }
+
347 
+
348 template<typename GridT, typename MaskT, typename InterruptT>
+
349 inline void
+
350 LevelSetFilter<GridT, MaskT, InterruptT>::
+
351 Filter::offset(ValueType value)
+
352 {
+
353  mParent->startInterrupter("Offsetting level set");
+
354 
+
355  mParent->leafs().removeAuxBuffers();// no auxiliary buffers required
+
356 
+
357  const ValueType CFL = ValueType(0.5) * mParent->voxelSize(), offset = openvdb::math::Abs(value);
+
358  ValueType dist = 0.0;
+
359  while (offset-dist > ValueType(0.001)*CFL && mParent->checkInterrupter()) {
+
360  const ValueType delta = openvdb::math::Min(offset-dist, CFL);
+
361  dist += delta;
+
362 
+
363  mTask = boost::bind(&Filter::offset, _1, _2, copysign(delta, value));
+
364  this->cook(false);
+
365 
+
366  mParent->track();
+
367  }
+
368 
+
369  mParent->endInterrupter();
+
370 }
+
371 
+
372 
+
374 
+
376 template<typename GridT, typename MaskT, typename InterruptT>
+
377 inline void
+ +
379 Filter::meanCurvature(const LeafRange& range)
+
380 {
+
381  mParent->checkInterrupter();
+
382  //const float CFL = 0.9f, dt = CFL * mDx * mDx / 6.0f;
+
383  const ValueType dx = mParent->voxelSize(), dt = math::Pow2(dx) / ValueType(3.0);
+
384  math::CurvatureStencil<GridType> stencil(mParent->grid(), dx);
+
385  if (mMask) {
+
386  typename AlphaMaskT::FloatType a, b;
+
387  AlphaMaskT alpha(mParent->grid(), *mMask, mParent->minMask(),
+
388  mParent->maxMask(), mParent->isMaskInverted());
+
389  for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) {
+
390  ValueType* buffer = leafIter.buffer(1).data();
+
391  for (VoxelCIterT iter = leafIter->cbeginValueOn(); iter; ++iter) {
+
392  if (alpha(iter.getCoord(), a, b)) {
+
393  stencil.moveTo(iter);
+
394  const ValueType phi0 = *iter, phi1 = phi0 + dt*stencil.meanCurvatureNormGrad();
+
395  buffer[iter.pos()] = b * phi0 + a * phi1;
+
396  }
+
397  }
+
398  }
+
399  } else {
+
400  for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) {
+
401  ValueType* buffer = leafIter.buffer(1).data();
+
402  for (VoxelCIterT iter = leafIter->cbeginValueOn(); iter; ++iter) {
+
403  stencil.moveTo(iter);
+
404  buffer[iter.pos()] = *iter + dt*stencil.meanCurvatureNormGrad();
+
405  }
+
406  }
+
407  }
+
408 }
+
409 
+
417 template<typename GridT, typename MaskT, typename InterruptT>
+
418 inline void
+ +
420 Filter::laplacian(const LeafRange& range)
+
421 {
+
422  mParent->checkInterrupter();
+
423  //const float CFL = 0.9f, half_dt = CFL * mDx * mDx / 12.0f;
+
424  const ValueType dx = mParent->voxelSize(), dt = math::Pow2(dx) / ValueType(6.0);
+
425  math::GradStencil<GridType> stencil(mParent->grid(), dx);
+
426  if (mMask) {
+
427  typename AlphaMaskT::FloatType a, b;
+
428  AlphaMaskT alpha(mParent->grid(), *mMask, mParent->minMask(),
+
429  mParent->maxMask(), mParent->isMaskInverted());
+
430  for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) {
+
431  ValueType* buffer = leafIter.buffer(1).data();
+
432  for (VoxelCIterT iter = leafIter->cbeginValueOn(); iter; ++iter) {
+
433  if (alpha(iter.getCoord(), a, b)) {
+
434  stencil.moveTo(iter);
+
435  const ValueType phi0 = *iter, phi1 = phi0 + dt*stencil.laplacian();
+
436  buffer[iter.pos()] = b * phi0 + a * phi1;
+
437  }
+
438  }
+
439  }
+
440  } else {
+
441  for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) {
+
442  ValueType* buffer = leafIter.buffer(1).data();
+
443  for (VoxelCIterT iter = leafIter->cbeginValueOn(); iter; ++iter) {
+
444  stencil.moveTo(iter);
+
445  buffer[iter.pos()] = *iter + dt*stencil.laplacian();
+
446  }
+
447  }
+
448  }
+
449 }
+
450 
+
452 template<typename GridT, typename MaskT, typename InterruptT>
+
453 inline void
+
454 LevelSetFilter<GridT, MaskT, InterruptT>::
+
455 Filter::offset(const LeafRange& range, ValueType offset)
+
456 {
+
457  mParent->checkInterrupter();
+
458  if (mMask) {
+
459  typename AlphaMaskT::FloatType a, b;
+
460  AlphaMaskT alpha(mParent->grid(), *mMask, mParent->minMask(),
+
461  mParent->maxMask(), mParent->isMaskInverted());
+
462  for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) {
+
463  for (VoxelIterT iter = leafIter->beginValueOn(); iter; ++iter) {
+
464  if (alpha(iter.getCoord(), a, b)) iter.setValue(*iter + a*offset);
+
465  }
+
466  }
+
467  } else {
+
468  for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) {
+
469  for (VoxelIterT iter = leafIter->beginValueOn(); iter; ++iter) {
+
470  iter.setValue(*iter + offset);
+
471  }
+
472  }
+
473  }
+
474 }
+
475 
+
477 template<typename GridT, typename MaskT, typename InterruptT>
+
478 inline void
+
479 LevelSetFilter<GridT, MaskT, InterruptT>::
+
480 Filter::median(const LeafRange& range, int width)
+
481 {
+
482  mParent->checkInterrupter();
+
483  typename math::DenseStencil<GridType> stencil(mParent->grid(), width);//creates local cache!
+
484  if (mMask) {
+
485  typename AlphaMaskT::FloatType a, b;
+
486  AlphaMaskT alpha(mParent->grid(), *mMask, mParent->minMask(),
+
487  mParent->maxMask(), mParent->isMaskInverted());
+
488  for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) {
+
489  ValueType* buffer = leafIter.buffer(1).data();
+
490  for (VoxelCIterT iter = leafIter->cbeginValueOn(); iter; ++iter) {
+
491  if (alpha(iter.getCoord(), a, b)) {
+
492  stencil.moveTo(iter);
+
493  buffer[iter.pos()] = b * (*iter) + a * stencil.median();
+
494  }
+
495  }
+
496  }
+
497  } else {
+
498  for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) {
+
499  ValueType* buffer = leafIter.buffer(1).data();
+
500  for (VoxelCIterT iter = leafIter->cbeginValueOn(); iter; ++iter) {
+
501  stencil.moveTo(iter);
+
502  buffer[iter.pos()] = stencil.median();
+
503  }
+
504  }
+
505  }
+
506 }
+
507 
+
509 template<typename GridT, typename MaskT, typename InterruptT>
+
510 template <typename AvgT>
+
511 inline void
+
512 LevelSetFilter<GridT, MaskT, InterruptT>::
+
513 Filter::box(const LeafRange& range, Int32 w)
+
514 {
+
515  mParent->checkInterrupter();
+
516  AvgT avg(mParent->grid(), w);
+
517  if (mMask) {
+
518  typename AlphaMaskT::FloatType a, b;
+
519  AlphaMaskT alpha(mParent->grid(), *mMask, mParent->minMask(),
+
520  mParent->maxMask(), mParent->isMaskInverted());
+
521  for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) {
+
522  ValueType* buffer = leafIter.buffer(1).data();
+
523  for (VoxelCIterT iter = leafIter->cbeginValueOn(); iter; ++iter) {
+
524  const Coord xyz = iter.getCoord();
+
525  if (alpha(xyz, a, b)) buffer[iter.pos()] = b * (*iter)+ a * avg(xyz);
+
526  }
+
527  }
+
528  } else {
+
529  for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) {
+
530  ValueType* buffer = leafIter.buffer(1).data();
+
531  for (VoxelCIterT iter = leafIter->cbeginValueOn(); iter; ++iter) {
+
532  buffer[iter.pos()] = avg(iter.getCoord());
+
533  }
+
534  }
+
535  }
+
536 }
+
537 
+
538 } // namespace tools
+
539 } // namespace OPENVDB_VERSION_NAME
+
540 } // namespace openvdb
+
541 
+
542 #endif // OPENVDB_TOOLS_LEVELSETFILTER_HAS_BEEN_INCLUDED
+
543 
+
544 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
545 // All rights reserved. This software is distributed under the
+
546 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
void laplacian(const MaskType *mask=NULL)
One iteration of Laplacian flow of the level set.
Definition: LevelSetFilter.h:124
+
void median(int width=1, const MaskType *mask=NULL)
One iteration of median-value flow of the level set.
Definition: LevelSetFilter.h:154
+
void meanCurvature(const MaskType *mask=NULL)
One iteration of mean-curvature flow of the level set.
Definition: LevelSetFilter.h:117
+
void offset(ValueType offset, const MaskType *mask=NULL)
Offset the level set by the specified (world) distance.
Definition: LevelSetFilter.h:143
+
Performs multi-threaded interface tracking of narrow band level sets. This is the building-block for ...
+ +
Avg(const GridT &grid, Int32 w)
Definition: LevelSetFilter.h:213
+
void gaussian(int width=1, const MaskType *mask=NULL)
One iteration of a fast separable Gaussian filter.
Definition: LevelSetFilter.h:135
+
AlphaType minMask() const
Return the minimum value of the mask to be used for the derivation of a smooth alpha value...
Definition: LevelSetFilter.h:90
+
const Type & Min(const Type &a, const Type &b)
Return the minimum of two values.
Definition: Math.h:622
+
Type Pow2(Type x)
Return .
Definition: Math.h:514
+
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
+ +
virtual ~LevelSetFilter()
Default destructor.
Definition: LevelSetFilter.h:86
+
GridType::TreeType TreeType
Definition: LevelSetFilter.h:70
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & max(const T &a, const T &b)
Definition: Composite.h:132
+
const ValueType frac
Definition: LevelSetFilter.h:224
+
int32_t Int32
Definition: Types.h:60
+
TreeType::ValueType ValueType
Definition: LevelSetFilter.h:71
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
GridType::Ptr meanCurvature(const GridType &grid, bool threaded, InterruptT *interrupt)
Compute the mean curvature of the given grid.
Definition: GridOperators.h:1033
+
AlphaType maxMask() const
Return the maximum value of the mask to be used for the derivation of a smooth alpha value...
Definition: LevelSetFilter.h:93
+
Volume filtering (e.g., diffusion) with optional alpha masking.
Definition: Filter.h:66
+
CopyConstness< TreeType, NonConstBufferType >::Type BufferType
Definition: LeafManager.h:126
+
Definition: Interpolation.h:570
+
GridType::Ptr laplacian(const GridType &grid, bool threaded, InterruptT *interrupt)
Compute the Laplacian of the given scalar grid.
Definition: GridOperators.h:1016
+
bool isMaskInverted() const
Return true if the mask is inverted, i.e. min->max in the original mask maps to 1->0 in the inverted ...
Definition: LevelSetFilter.h:110
+
Filtering (e.g. diffusion) of narrow-band level sets. An optional scalar field can be used to produce...
Definition: LevelSetFilter.h:64
+
LevelSetFilter(GridType &grid, InterruptT *interrupt=NULL)
Main constructor from a grid.
Definition: LevelSetFilter.h:78
+
GridT::ConstAccessor acc
Definition: LevelSetFilter.h:222
+
Definition: Exceptions.h:39
+
ValueType operator()(Coord xyz)
Definition: LevelSetFilter.h:215
+
void invertMask(bool invert=true)
Invert the optional mask, i.e. min->max in the original mask maps to 1->0 in the inverted alpha mask...
Definition: LevelSetFilter.h:113
+ +
MaskType::ValueType AlphaType
Definition: LevelSetFilter.h:72
+
LevelSetTracker< GridT, InterruptT > BaseType
Definition: LevelSetFilter.h:67
+
Definition: Exceptions.h:88
+
void setMaskRange(AlphaType min, AlphaType max)
Define the range for the (optional) scalar mask.
Definition: LevelSetFilter.h:101
+
void mean(int width=1, const MaskType *mask=NULL)
One iteration of mean-value flow of the level set.
Definition: LevelSetFilter.h:164
+
Axis
Definition: Math.h:838
+
int32_t Abs(int32_t i)
Return the absolute value of the given quantity.
Definition: Math.h:293
+
GridT GridType
Definition: LevelSetFilter.h:68
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
Performs multi-threaded interface tracking of narrow band level sets.
Definition: LevelSetTracker.h:67
+
TreeT * tree
Definition: MaskToLevelSet.h:118
+
const Int32 width
Definition: LevelSetFilter.h:223
+
MaskT MaskType
Definition: LevelSetFilter.h:69
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & min(const T &a, const T &b)
Definition: Composite.h:128
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetFracture_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetFracture_8h_source.html new file mode 100644 index 00000000..3da6974a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetFracture_8h_source.html @@ -0,0 +1,457 @@ + + + + + + +OpenVDB: LevelSetFracture.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
LevelSetFracture.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
36 
+
37 #ifndef OPENVDB_TOOLS_LEVELSETFRACTURE_HAS_BEEN_INCLUDED
+
38 #define OPENVDB_TOOLS_LEVELSETFRACTURE_HAS_BEEN_INCLUDED
+
39 
+
40 #include <openvdb/Grid.h>
+
41 #include <openvdb/math/Quat.h>
+ +
43 
+
44 #include "Composite.h" // for csgIntersectionCopy() and csgDifferenceCopy()
+
45 #include "GridTransformer.h" // for resampleToMatch()
+
46 #include "LevelSetUtil.h" // for sdfSegmentation()
+
47 
+
48 #include <limits>
+
49 #include <list>
+
50 
+
51 #include <tbb/blocked_range.h>
+
52 #include <tbb/parallel_reduce.h>
+
53 
+
54 
+
55 namespace openvdb {
+ +
57 namespace OPENVDB_VERSION_NAME {
+
58 namespace tools {
+
59 
+
61 template<class GridType, class InterruptType = util::NullInterrupter>
+ +
63 {
+
64 public:
+
65  typedef std::vector<Vec3s> Vec3sList;
+
66  typedef std::vector<math::Quats> QuatsList;
+
67  typedef std::list<typename GridType::Ptr> GridPtrList;
+
68  typedef typename GridPtrList::iterator GridPtrListIter;
+
69 
+
70 
+
74  explicit LevelSetFracture(InterruptType* interrupter = NULL);
+
75 
+
94  void fracture(GridPtrList& grids, const GridType& cutter, bool segment = false,
+
95  const Vec3sList* points = NULL, const QuatsList* rotations = NULL,
+
96  bool cutterOverlap = true);
+
97 
+
99  GridPtrList& fragments() { return mFragments; }
+
100 
+
102  void clear() { mFragments.clear(); }
+
103 
+
104 private:
+
105  // disallow copy by assignment
+
106  void operator=(const LevelSetFracture&) {}
+
107 
+
108  bool wasInterrupted(int percent = -1) const {
+
109  return mInterrupter && mInterrupter->wasInterrupted(percent);
+
110  }
+
111 
+
112  bool isValidFragment(GridType&) const;
+
113  void segmentFragments(GridPtrList&) const;
+
114  void process(GridPtrList&, const GridType& cutter);
+
115 
+
116  InterruptType* mInterrupter;
+
117  GridPtrList mFragments;
+
118 };
+
119 
+
120 
+
122 
+
123 
+
124 // Internal utility objects and implementation details
+
125 
+
126 namespace level_set_fracture_internal {
+
127 
+
128 
+
129 template<typename LeafNodeType>
+ +
131 
+
132  typedef typename LeafNodeType::ValueType ValueType;
+
133 
+
134  FindMinMaxVoxelValue(const std::vector<const LeafNodeType*>& nodes)
+
135  : minValue(std::numeric_limits<ValueType>::max())
+
136  , maxValue(-minValue)
+
137  , mNodes(nodes.empty() ? NULL : &nodes.front())
+
138  {
+
139  }
+
140 
+ +
142  : minValue(std::numeric_limits<ValueType>::max())
+
143  , maxValue(-minValue)
+
144  , mNodes(rhs.mNodes)
+
145  {
+
146  }
+
147 
+
148  void operator()(const tbb::blocked_range<size_t>& range) {
+
149  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
150  const ValueType* data = mNodes[n]->buffer().data();
+
151  for (Index i = 0; i < LeafNodeType::SIZE; ++i) {
+
152  minValue = std::min(minValue, data[i]);
+
153  maxValue = std::max(maxValue, data[i]);
+
154  }
+
155  }
+
156  }
+
157 
+ +
159  minValue = std::min(minValue, rhs.minValue);
+
160  maxValue = std::max(maxValue, rhs.maxValue);
+
161  }
+
162 
+
163  ValueType minValue, maxValue;
+
164 
+
165  LeafNodeType const * const * const mNodes;
+
166 }; // struct FindMinMaxVoxelValue
+
167 
+
168 
+
169 } // namespace level_set_fracture_internal
+
170 
+
171 
+
173 
+
174 
+
175 template<class GridType, class InterruptType>
+ +
177  : mInterrupter(interrupter)
+
178  , mFragments()
+
179 {
+
180 }
+
181 
+
182 
+
183 template<class GridType, class InterruptType>
+
184 void
+
185 LevelSetFracture<GridType, InterruptType>::fracture(GridPtrList& grids, const GridType& cutter,
+
186  bool segmentation, const Vec3sList* points, const QuatsList* rotations, bool cutterOverlap)
+
187 {
+
188  // We can process all incoming grids with the same cutter instance,
+
189  // this optimization is enabled by the requirement of having matching
+
190  // transforms between all incoming grids and the cutter object.
+
191  if (points && points->size() != 0) {
+
192 
+
193 
+
194  math::Transform::Ptr originalCutterTransform = cutter.transform().copy();
+
195  GridType cutterGrid(cutter, ShallowCopy());
+
196 
+
197  const bool hasInstanceRotations =
+
198  points && rotations && points->size() == rotations->size();
+
199 
+
200  // for each instance point..
+
201  for (size_t p = 0, P = points->size(); p < P; ++p) {
+
202  int percent = int((float(p) / float(P)) * 100.0);
+
203  if (wasInterrupted(percent)) break;
+
204 
+
205  GridType instCutterGrid;
+
206  instCutterGrid.setTransform(originalCutterTransform->copy());
+
207  math::Transform::Ptr xform = originalCutterTransform->copy();
+
208 
+
209  if (hasInstanceRotations) {
+
210  const Vec3s& rot = (*rotations)[p].eulerAngles(math::XYZ_ROTATION);
+
211  xform->preRotate(rot[0], math::X_AXIS);
+
212  xform->preRotate(rot[1], math::Y_AXIS);
+
213  xform->preRotate(rot[2], math::Z_AXIS);
+
214  xform->postTranslate((*points)[p]);
+
215  } else {
+
216  xform->postTranslate((*points)[p]);
+
217  }
+
218 
+
219  cutterGrid.setTransform(xform);
+
220 
+
221  // Since there is no scaling, use the generic resampler instead of
+
222  // the more expensive level set rebuild tool.
+
223  if (mInterrupter != NULL) {
+
224 
+
225  if (hasInstanceRotations) {
+
226  doResampleToMatch<BoxSampler>(cutterGrid, instCutterGrid, *mInterrupter);
+
227  } else {
+
228  doResampleToMatch<PointSampler>(cutterGrid, instCutterGrid, *mInterrupter);
+
229  }
+
230  } else {
+
231  util::NullInterrupter interrupter;
+
232  if (hasInstanceRotations) {
+
233  doResampleToMatch<BoxSampler>(cutterGrid, instCutterGrid, interrupter);
+
234  } else {
+
235  doResampleToMatch<PointSampler>(cutterGrid, instCutterGrid, interrupter);
+
236  }
+
237  }
+
238 
+
239  if (wasInterrupted(percent)) break;
+
240 
+
241  if (cutterOverlap && !mFragments.empty()) process(mFragments, instCutterGrid);
+
242  process(grids, instCutterGrid);
+
243  }
+
244 
+
245  } else {
+
246  // use cutter in place
+
247  if (cutterOverlap && !mFragments.empty()) process(mFragments, cutter);
+
248  process(grids, cutter);
+
249  }
+
250 
+
251  if (segmentation) {
+
252  segmentFragments(mFragments);
+
253  segmentFragments(grids);
+
254  }
+
255 }
+
256 
+
257 
+
258 template<class GridType, class InterruptType>
+
259 bool
+ +
261 {
+
262  typedef typename GridType::TreeType::LeafNodeType LeafNodeType;
+
263 
+
264  if (grid.tree().leafCount() < 9) {
+
265 
+
266  std::vector<const LeafNodeType*> nodes;
+
267  grid.tree().getNodes(nodes);
+
268 
+
269  Index64 activeVoxelCount = 0;
+
270 
+
271  for (size_t n = 0, N = nodes.size(); n < N; ++n) {
+
272  activeVoxelCount += nodes[n]->onVoxelCount();
+
273  }
+
274 
+
275  if (activeVoxelCount < 27) return false;
+
276 
+
277  level_set_fracture_internal::FindMinMaxVoxelValue<LeafNodeType> op(nodes);
+
278  tbb::parallel_reduce(tbb::blocked_range<size_t>(0, nodes.size()), op);
+
279 
+
280  if ((op.minValue < 0) == (op.maxValue < 0)) return false;
+
281  }
+
282 
+
283  return true;
+
284 }
+
285 
+
286 
+
287 template<class GridType, class InterruptType>
+
288 void
+
289 LevelSetFracture<GridType, InterruptType>::segmentFragments(GridPtrList& grids) const
+
290 {
+
291  GridPtrList newFragments;
+
292 
+
293  for (GridPtrListIter it = grids.begin(); it != grids.end(); ++it) {
+
294 
+
295  std::vector<typename GridType::Ptr> segments;
+
296  segmentSDF(*(*it), segments);
+
297 
+
298  for (size_t n = 0, N = segments.size(); n < N; ++n) {
+
299  newFragments.push_back(segments[n]);
+
300  }
+
301  }
+
302 
+
303  grids.swap(newFragments);
+
304 }
+
305 
+
306 
+
307 template<class GridType, class InterruptType>
+
308 void
+
309 LevelSetFracture<GridType, InterruptType>::process(
+
310  GridPtrList& grids, const GridType& cutter)
+
311 {
+
312  typedef typename GridType::Ptr GridPtr;
+
313  GridPtrList newFragments;
+
314 
+
315  for (GridPtrListIter it = grids.begin(); it != grids.end(); ++it) {
+
316 
+
317  if (wasInterrupted()) break;
+
318 
+
319  GridPtr& grid = *it;
+
320 
+
321  GridPtr fragment = csgIntersectionCopy(*grid, cutter);
+
322  if (!isValidFragment(*fragment)) continue;
+
323 
+
324  GridPtr residual = csgDifferenceCopy(*grid, cutter);
+
325  if (!isValidFragment(*residual)) continue;
+
326 
+
327  newFragments.push_back(fragment);
+
328 
+
329  grid->tree().clear();
+
330  grid->tree().merge(residual->tree());
+
331  }
+
332 
+
333  if (!newFragments.empty()) {
+
334  mFragments.splice(mFragments.end(), newFragments);
+
335  }
+
336 }
+
337 
+
338 } // namespace tools
+
339 } // namespace OPENVDB_VERSION_NAME
+
340 } // namespace openvdb
+
341 
+
342 #endif // OPENVDB_TOOLS_LEVELSETFRACTURE_HAS_BEEN_INCLUDED
+
343 
+
344 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
345 // All rights reserved. This software is distributed under the
+
346 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
Definition: Types.h:439
+
Vec3< float > Vec3s
Definition: Vec3.h:650
+ +
Dummy NOOP interrupter class defining interface.
Definition: NullInterrupter.h:52
+
Definition: Math.h:839
+ +
FindMinMaxVoxelValue(const std::vector< const LeafNodeType * > &nodes)
Definition: LevelSetFracture.h:134
+
Functions to efficiently perform various compositing operations on grids.
+
std::vector< Vec3s > Vec3sList
Definition: LevelSetFracture.h:65
+
void segmentSDF(const GridOrTreeType &volume, std::vector< typename GridOrTreeType::Ptr > &segments)
Separates disjoint SDF surfaces into distinct grids or trees.
Definition: LevelSetUtil.h:2495
+
void clear()
Remove all elements from the fragment list.
Definition: LevelSetFracture.h:102
+
void join(FindMinMaxVoxelValue &rhs)
Definition: LevelSetFracture.h:158
+
std::vector< math::Quats > QuatsList
Definition: LevelSetFracture.h:66
+
Definition: Math.h:840
+ +
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & max(const T &a, const T &b)
Definition: Composite.h:132
+
void fracture(GridPtrList &grids, const GridType &cutter, bool segment=false, const Vec3sList *points=NULL, const QuatsList *rotations=NULL, bool cutterOverlap=true)
Divide volumes represented by level set grids into multiple, disjoint pieces by intersecting them wit...
Definition: LevelSetFracture.h:185
+
GridPtrList & fragments()
Return a list of new fragments, not including the residuals from the input grids. ...
Definition: LevelSetFracture.h:99
+
LeafNodeType const *const *const mNodes
Definition: LevelSetFracture.h:165
+ +
OPENVDB_STATIC_SPECIALIZATION GridOrTreeT::Ptr csgDifferenceCopy(const GridOrTreeT &a, const GridOrTreeT &b)
Threaded CSG difference operation that produces a new grid or tree from immutable inputs...
Definition: Composite.h:1087
+ +
Index32 Index
Definition: Types.h:58
+ +
uint64_t Index64
Definition: Types.h:57
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
Definition: Exceptions.h:39
+
Level set fracturing.
Definition: LevelSetFracture.h:62
+
FindMinMaxVoxelValue(FindMinMaxVoxelValue &rhs, tbb::split)
Definition: LevelSetFracture.h:141
+
Definition: Math.h:841
+
void operator()(const tbb::blocked_range< size_t > &range)
Definition: LevelSetFracture.h:148
+ +
Miscellaneous utility methods that operate primarily or exclusively on level set grids.
+
OPENVDB_STATIC_SPECIALIZATION GridOrTreeT::Ptr csgIntersectionCopy(const GridOrTreeT &a, const GridOrTreeT &b)
Threaded CSG intersection operation that produces a new grid or tree from immutable inputs...
Definition: Composite.h:1073
+ +
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
std::list< typename GridType::Ptr > GridPtrList
Definition: LevelSetFracture.h:67
+
boost::shared_ptr< Transform > Ptr
Definition: Transform.h:69
+
LeafNodeType::ValueType ValueType
Definition: LevelSetFracture.h:132
+
GridPtrList::iterator GridPtrListIter
Definition: LevelSetFracture.h:68
+
bool wasInterrupted(T *i, int percent=-1)
Definition: NullInterrupter.h:76
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & min(const T &a, const T &b)
Definition: Composite.h:128
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetMeasure_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetMeasure_8h_source.html new file mode 100644 index 00000000..85757df4 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetMeasure_8h_source.html @@ -0,0 +1,644 @@ + + + + + + +OpenVDB: LevelSetMeasure.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
LevelSetMeasure.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
34 
+
35 #ifndef OPENVDB_TOOLS_LEVELSETMEASURE_HAS_BEEN_INCLUDED
+
36 #define OPENVDB_TOOLS_LEVELSETMEASURE_HAS_BEEN_INCLUDED
+
37 
+
38 #include <tbb/parallel_for.h>
+
39 #include <tbb/parallel_sort.h>
+
40 #include <boost/bind.hpp>
+
41 #include <boost/function.hpp>
+
42 #include <boost/type_traits/is_floating_point.hpp>
+
43 #include <boost/utility/enable_if.hpp>
+
44 #include <boost/math/constants/constants.hpp>//for Pi
+
45 #include <openvdb/math/Math.h>
+
46 #include <openvdb/Types.h>
+
47 #include <openvdb/Grid.h>
+ + + +
51 #include <openvdb/math/Operators.h>
+ +
53 
+
54 namespace openvdb {
+ +
56 namespace OPENVDB_VERSION_NAME {
+
57 namespace tools {
+
58 
+
67 template<class GridType>
+
68 inline Real
+
69 levelSetArea(const GridType& grid, bool useWorldSpace = true);
+
70 
+
79 template<class GridType>
+
80 inline Real
+
81 levelSetVolume(const GridType& grid, bool useWorldSpace = true);
+
82 
+
93 template<class GridType>
+
94 inline void
+
95 levelSetMeasure(const GridType& grid, Real& area, Real& volume, bool useWorldSpace = true);
+
96 
+
108 template<class GridType>
+
109 inline void
+
110 levelSetMeasure(const GridType& grid, Real& area, Real& volume, Real& avgCurvature,
+
111  bool useWorldSpace = true);
+
112 
+
114 template<typename RealT>
+ +
116 {
+
117 public:
+
118  DiracDelta(RealT eps) : mC(0.5/eps), mD(2*boost::math::constants::pi<RealT>()*mC), mE(eps) {}
+
119  inline RealT operator()(RealT phi) const { return math::Abs(phi) > mE ? 0 : mC*(1+cos(mD*phi)); }
+
120 private:
+
121  const RealT mC, mD, mE;
+
122 };
+
123 
+
124 
+
132 template<typename GridT,
+
133  typename InterruptT = util::NullInterrupter>
+ +
135 {
+
136 public:
+
137  typedef GridT GridType;
+
138  typedef typename GridType::TreeType TreeType;
+
139  typedef typename TreeType::ValueType ValueType;
+ +
141  BOOST_STATIC_ASSERT(boost::is_floating_point<ValueType>::value);
+
142 
+
147  LevelSetMeasure(const GridType& grid, InterruptT* interrupt = NULL);
+
148 
+
149  LevelSetMeasure(ManagerType& leafs, Real Dx, InterruptT* interrupt);
+
150 
+
152  void reinit(const GridType& grid);
+
153 
+
155  void reinit(ManagerType& leafs, Real dx);
+
156 
+
158  virtual ~LevelSetMeasure() {}
+
159 
+
161  int getGrainSize() const { return mGrainSize; }
+
162 
+
165  void setGrainSize(int grainsize) { mGrainSize = grainsize; }
+
166 
+
172  void measure(Real& area, Real& volume, bool useWorldUnits = true);
+
173 
+
179  void measure(Real& area, Real& volume, Real& avgMeanCurvature, bool useWorldUnits = true);
+
180 
+
181 private:
+
182  // disallow copy construction and copy by assignment!
+
183  LevelSetMeasure(const LevelSetMeasure&);// not implemented
+
184  LevelSetMeasure& operator=(const LevelSetMeasure&);// not implemented
+
185 
+
186  const TreeType* mTree;
+
187  ManagerType* mLeafs;
+
188  InterruptT* mInterrupter;
+
189  double mDx;
+
190  double* mArray;
+
191  int mGrainSize;
+
192 
+
193  // @brief Return false if the process was interrupted
+
194  bool checkInterrupter();
+
195 
+
196  typedef typename TreeType::LeafNodeType LeafT;
+
197  typedef typename LeafT::ValueOnCIter VoxelCIterT;
+
198  typedef typename ManagerType::LeafRange LeafRange;
+
199  typedef typename LeafRange::Iterator LeafIterT;
+
200 
+
201  struct Measure2
+
202  {
+
203  Measure2(LevelSetMeasure* parent) : mParent(parent), mAcc(*mParent->mTree)
+
204  {
+
205  if (parent->mGrainSize>0) {
+
206  tbb::parallel_for(parent->mLeafs->leafRange(parent->mGrainSize), *this);
+
207  } else {
+
208  (*this)(parent->mLeafs->leafRange());
+
209  }
+
210  }
+
211  Measure2(const Measure2& other) : mParent(other.mParent), mAcc(*mParent->mTree) {}
+
212  void operator()(const LeafRange& range) const;
+
213  LevelSetMeasure* mParent;
+
214  typename GridT::ConstAccessor mAcc;
+
215  };
+
216  struct Measure3
+
217  {
+
218  Measure3(LevelSetMeasure* parent) : mParent(parent), mAcc(*mParent->mTree)
+
219  {
+
220  if (parent->mGrainSize>0) {
+
221  tbb::parallel_for(parent->mLeafs->leafRange(parent->mGrainSize), *this);
+
222  } else {
+
223  (*this)(parent->mLeafs->leafRange());
+
224  }
+
225  }
+
226  Measure3(const Measure3& other) : mParent(other.mParent), mAcc(*mParent->mTree) {}
+
227  void operator()(const LeafRange& range) const;
+
228  LevelSetMeasure* mParent;
+
229  typename GridT::ConstAccessor mAcc;
+
230  };
+
231  inline double reduce(double* first, double scale)
+
232  {
+
233  double* last = first + mLeafs->leafCount();
+
234  tbb::parallel_sort(first, last);//reduces catastrophic cancellation
+
235  Real sum = 0.0;
+
236  while(first != last) sum += *first++;
+
237  return scale * sum;
+
238  }
+
239 
+
240 }; // end of LevelSetMeasure class
+
241 
+
242 
+
243 template<typename GridT, typename InterruptT>
+
244 inline
+
245 LevelSetMeasure<GridT, InterruptT>::LevelSetMeasure(const GridType& grid, InterruptT* interrupt)
+
246  : mTree(&(grid.tree()))
+
247  , mLeafs(NULL)
+
248  , mInterrupter(interrupt)
+
249  , mDx(grid.voxelSize()[0])
+
250  , mArray(NULL)
+
251  , mGrainSize(1)
+
252 {
+
253  if (!grid.hasUniformVoxels()) {
+ +
255  "The transform must have uniform scale for the LevelSetMeasure to function");
+
256  }
+
257  if (grid.getGridClass() != GRID_LEVEL_SET) {
+ +
259  "LevelSetMeasure only supports level sets;"
+
260  " try setting the grid class to \"level set\"");
+
261  }
+
262 }
+
263 
+
264 
+
265 template<typename GridT, typename InterruptT>
+
266 inline
+ +
268  ManagerType& leafs, Real dx, InterruptT* interrupt)
+
269  : mTree(&(leafs.tree()))
+
270  , mLeafs(&leafs)
+
271  , mInterrupter(interrupt)
+
272  , mDx(dx)
+
273  , mArray(NULL)
+
274  , mGrainSize(1)
+
275 {
+
276 }
+
277 
+
278 template<typename GridT, typename InterruptT>
+
279 inline void
+ +
281 {
+
282  if (!grid.hasUniformVoxels()) {
+ +
284  "The transform must have uniform scale for the LevelSetMeasure to function");
+
285  }
+
286  if (grid.getGridClass() != GRID_LEVEL_SET) {
+ +
288  "LevelSetMeasure only supports level sets;"
+
289  " try setting the grid class to \"level set\"");
+
290  }
+
291  mTree = &(grid.tree());
+
292  mLeafs = NULL;
+
293  mDx = grid.voxelSize()[0];
+
294 }
+
295 
+
296 
+
297 template<typename GridT, typename InterruptT>
+
298 inline void
+ +
300 {
+
301  mLeafs = &leafs;
+
302  mTree = &(leafs.tree());
+
303  mDx = dx;
+
304 }
+
305 
+
307 
+
308 
+
309 template<typename GridT, typename InterruptT>
+
310 inline void
+
311 LevelSetMeasure<GridT, InterruptT>::measure(Real& area, Real& volume, bool useWorldUnits)
+
312 {
+
313  if (mInterrupter) mInterrupter->start("Measuring level set");
+
314 
+
315 
+
316  const bool newLeafs = mLeafs == NULL;
+
317  if (newLeafs) mLeafs = new ManagerType(*mTree);
+
318  const size_t leafCount = mLeafs->leafCount();
+
319  if (leafCount == 0) {
+
320  area = volume = 0;
+
321  return;
+
322  }
+
323  mArray = new double[2*leafCount];
+
324 
+
325  Measure2 m(this);
+
326 
+
327  const double dx = useWorldUnits ? mDx : 1.0;
+
328  area = this->reduce(mArray, math::Pow2(dx));
+
329  volume = this->reduce(mArray + leafCount, math::Pow3(dx) / 3.0);
+
330 
+
331  if (newLeafs) {
+
332  delete mLeafs;
+
333  mLeafs = NULL;
+
334  }
+
335  delete [] mArray;
+
336 
+
337  if (mInterrupter) mInterrupter->end();
+
338 }
+
339 
+
340 
+
341 template<typename GridT, typename InterruptT>
+
342 inline void
+ +
344  Real& avgMeanCurvature,
+
345  bool useWorldUnits)
+
346 {
+
347  if (mInterrupter) mInterrupter->start("Measuring level set");
+
348 
+
349  const bool newLeafs = mLeafs == NULL;
+
350  if (newLeafs) mLeafs = new ManagerType(*mTree);
+
351  const size_t leafCount = mLeafs->leafCount();
+
352  if (leafCount == 0) {
+
353  area = volume = avgMeanCurvature = 0;
+
354  return;
+
355  }
+
356  mArray = new double[3*leafCount];
+
357 
+
358  Measure3 m(this);
+
359 
+
360  const double dx = useWorldUnits ? mDx : 1.0;
+
361  area = this->reduce(mArray, math::Pow2(dx));
+
362  volume = this->reduce(mArray + leafCount, math::Pow3(dx) / 3.0);
+
363  avgMeanCurvature = this->reduce(mArray + 2*leafCount, dx/area);
+
364 
+
365  if (newLeafs) {
+
366  delete mLeafs;
+
367  mLeafs = NULL;
+
368  }
+
369  delete [] mArray;
+
370 
+
371  if (mInterrupter) mInterrupter->end();
+
372 }
+
373 
+
374 
+
376 
+
377 
+
378 template<typename GridT, typename InterruptT>
+
379 inline bool
+ +
381 {
+
382  if (util::wasInterrupted(mInterrupter)) {
+
383  tbb::task::self().cancel_group_execution();
+
384  return false;
+
385  }
+
386  return true;
+
387 }
+
388 
+
389 template<typename GridT, typename InterruptT>
+
390 inline void
+
391 LevelSetMeasure<GridT, InterruptT>::
+
392 Measure2::operator()(const LeafRange& range) const
+
393 {
+
394  typedef math::Vec3<ValueType> Vec3T;
+
395  typedef math::ISGradient<math::CD_2ND> Grad;
+
396  mParent->checkInterrupter();
+
397  const Real invDx = 1.0/mParent->mDx;
+
398  const DiracDelta<Real> DD(1.5);
+
399  const size_t leafCount = mParent->mLeafs->leafCount();
+
400  for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) {
+
401  Real sumA = 0, sumV = 0;//reduce risk of catastrophic cancellation
+
402  for (VoxelCIterT voxelIter = leafIter->cbeginValueOn(); voxelIter; ++voxelIter) {
+
403  const Real dd = DD(invDx * (*voxelIter));
+
404  if (dd > 0.0) {
+
405  const Coord p = voxelIter.getCoord();
+
406  const Vec3T g = invDx*Grad::result(mAcc, p);//voxel units
+
407  sumA += dd * g.dot(g);
+
408  sumV += dd * (g[0]*p[0]+g[1]*p[1]+g[2]*p[2]);
+
409  }
+
410  }
+
411  double* v = mParent->mArray + leafIter.pos();
+
412  *v = sumA;
+
413  v += leafCount;
+
414  *v = sumV;
+
415  }
+
416 }
+
417 
+
418 template<typename GridT, typename InterruptT>
+
419 inline void
+
420 LevelSetMeasure<GridT, InterruptT>::
+
421 Measure3::operator()(const LeafRange& range) const
+
422 {
+
423  typedef math::Vec3<ValueType> Vec3T;
+
424  typedef math::ISGradient<math::CD_2ND> Grad;
+
425  typedef math::ISMeanCurvature<math::CD_SECOND, math::CD_2ND> Curv;
+
426  mParent->checkInterrupter();
+
427  const Real invDx = 1.0/mParent->mDx;
+
428  const DiracDelta<Real> DD(1.5);
+
429  ValueType alpha, beta;
+
430  const size_t leafCount = mParent->mLeafs->leafCount();
+
431  for (LeafIterT leafIter=range.begin(); leafIter; ++leafIter) {
+
432  Real sumA = 0, sumV = 0, sumC = 0;//reduce risk of catastrophic cancellation
+
433  for (VoxelCIterT voxelIter = leafIter->cbeginValueOn(); voxelIter; ++voxelIter) {
+
434  const Real dd = DD(invDx * (*voxelIter));
+
435  if (dd > 0.0) {
+
436  const Coord p = voxelIter.getCoord();
+
437  const Vec3T g = invDx*Grad::result(mAcc, p);//voxel units
+
438  const Real dA = dd * g.dot(g);
+
439  sumA += dA;
+
440  sumV += dd * (g[0]*p[0]+g[1]*p[1]+g[2]*p[2]);
+
441  Curv::result(mAcc, p, alpha, beta);
+
442  sumC += dA * alpha/(2*math::Pow2(beta))*invDx;
+
443  }
+
444  }
+
445  double* v = mParent->mArray + leafIter.pos();
+
446  *v = sumA;
+
447  v += leafCount;
+
448  *v = sumV;
+
449  v += leafCount;
+
450  *v = sumC;
+
451  }
+
452 }
+
453 
+
455 
+
456 template<class GridT>
+
457 inline typename boost::enable_if<boost::is_floating_point<typename GridT::ValueType>, Real>::type
+
458 doLevelSetArea(const GridT& grid, bool useWorldSpace)
+
459 {
+
460  Real area, volume;
+
461  LevelSetMeasure<GridT> m(grid);
+
462  m.measure(area, volume, useWorldSpace);
+
463  return area;
+
464 }
+
465 
+
466 template<class GridT>
+
467 inline typename boost::disable_if<boost::is_floating_point<typename GridT::ValueType>, Real>::type
+
468 doLevelSetArea(const GridT&, bool)
+
469 {
+ +
471  "level set area is supported only for scalar, floating-point grids");
+
472 }
+
473 
+
474 template<class GridT>
+
475 inline Real
+
476 levelSetArea(const GridT& grid, bool useWorldSpace)
+
477 {
+
478  return doLevelSetArea<GridT>(grid, useWorldSpace);
+
479 }
+
480 
+
482 
+
483 template<class GridT>
+
484 inline typename boost::enable_if<boost::is_floating_point<typename GridT::ValueType>, Real>::type
+
485 doLevelSetVolume(const GridT& grid, bool useWorldSpace)
+
486 {
+
487  Real area, volume;
+
488  LevelSetMeasure<GridT> m(grid);
+
489  m.measure(area, volume, useWorldSpace);
+
490  return volume;
+
491 }
+
492 
+
493 template<class GridT>
+
494 inline typename boost::disable_if<boost::is_floating_point<typename GridT::ValueType>, Real>::type
+
495 doLevelSetVolume(const GridT&, bool)
+
496 {
+ +
498  "level set volume is supported only for scalar, floating-point grids");
+
499 }
+
500 
+
501 template<class GridT>
+
502 inline Real
+
503 levelSetVolume(const GridT& grid, bool useWorldSpace)
+
504 {
+
505  return doLevelSetVolume<GridT>(grid, useWorldSpace);
+
506 }
+
507 
+
509 
+
510 template<class GridT>
+
511 inline typename boost::enable_if<boost::is_floating_point<typename GridT::ValueType> >::type
+
512 doLevelSetMeasure(const GridT& grid, Real& area, Real& volume, bool useWorldSpace)
+
513 {
+
514  LevelSetMeasure<GridT> m(grid);
+
515  m.measure(area, volume, useWorldSpace);
+
516 }
+
517 
+
518 template<class GridT>
+
519 inline typename boost::disable_if<boost::is_floating_point<typename GridT::ValueType> >::type
+
520 doLevelSetMeasure(const GridT&, Real&, Real&, bool)
+
521 {
+ +
523  "level set measure is supported only for scalar, floating-point grids");
+
524 }
+
525 
+
526 template<class GridT>
+
527 inline void
+
528 levelSetMeasure(const GridT& grid, Real& area, Real& volume, bool useWorldSpace)
+
529 {
+
530  doLevelSetMeasure<GridT>(grid, area, volume, useWorldSpace);
+
531 }
+
532 
+
534 
+
535 template<class GridT>
+
536 inline typename boost::enable_if<boost::is_floating_point<typename GridT::ValueType> >::type
+
537 doLevelSetMeasure(const GridT& grid, Real& area, Real& volume, Real& avgCurvature,
+
538  bool useWorldSpace)
+
539 {
+
540  LevelSetMeasure<GridT> m(grid);
+
541  m.measure(area, volume, avgCurvature, useWorldSpace);
+
542 }
+
543 
+
544 template<class GridT>
+
545 inline typename boost::disable_if<boost::is_floating_point<typename GridT::ValueType> >::type
+
546 doLevelSetMeasure(const GridT&, Real&, Real&, Real&, bool)
+
547 {
+ +
549  "level set measure is supported only for scalar, floating-point grids");
+
550 }
+
551 
+
552 template<class GridT>
+
553 inline void
+
554 levelSetMeasure(const GridT& grid, Real& area, Real& volume, Real& avgCurvature, bool useWorldSpace)
+
555 {
+
556  doLevelSetMeasure<GridT>(grid, area, volume, avgCurvature, useWorldSpace);
+
557 }
+
558 
+
559 } // namespace tools
+
560 } // namespace OPENVDB_VERSION_NAME
+
561 } // namespace openvdb
+
562 
+
563 #endif // OPENVDB_TOOLS_LEVELSETMEASURE_HAS_BEEN_INCLUDED
+
564 
+
565 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
566 // All rights reserved. This software is distributed under the
+
567 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+ +
Real levelSetArea(const GridType &grid, bool useWorldSpace=true)
Return the surface area of a narrow-band level set.
+ +
GridType::TreeType TreeType
Definition: LevelSetMeasure.h:138
+ +
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
LeafRange leafRange(size_t grainsize=1) const
Return a TBB-compatible LeafRange.
Definition: LeafManager.h:381
+
Dummy NOOP interrupter class defining interface.
Definition: NullInterrupter.h:52
+
void levelSetMeasure(const GridType &grid, Real &area, Real &volume, bool useWorldSpace=true)
Compute the surface area and volume of a narrow-band level set.
+
Definition: Mat.h:146
+
Type Pow2(Type x)
Return .
Definition: Math.h:514
+
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
+
Real levelSetArea(const GridT &grid, bool useWorldSpace)
Definition: LevelSetMeasure.h:476
+
Type Pow3(Type x)
Return .
Definition: Math.h:518
+
This class manages a linear array of pointers to a given tree's leaf nodes, as well as optional auxil...
Definition: LeafManager.h:115
+
Smeared-out and continuous Dirac Delta function.
Definition: LevelSetMeasure.h:115
+
double Real
Definition: Types.h:64
+
int getGrainSize() const
Definition: LevelSetMeasure.h:161
+
tree::LeafManager< const TreeType > ManagerType
Definition: LevelSetMeasure.h:140
+
TreeType::ValueType ValueType
Definition: LevelSetMeasure.h:139
+
const TreeType & tree() const
Return a const reference to tree associated with this manager.
Definition: LeafManager.h:338
+
GridT GridType
Definition: LevelSetMeasure.h:137
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
Real levelSetVolume(const GridType &grid, bool useWorldSpace=true)
Return the volume of a narrow-band level set surface.
+
Multi-threaded computation of surface area, volume and average mean-curvature for narrow band level s...
Definition: LevelSetMeasure.h:134
+
boost::enable_if< boost::is_floating_point< typename GridT::ValueType >, Real >::type doLevelSetVolume(const GridT &grid, bool useWorldSpace)
Definition: LevelSetMeasure.h:485
+
Gradient operators defined in index space of various orders.
Definition: Operators.h:122
+
Definition: Exceptions.h:86
+
Definition: Exceptions.h:39
+
MatType scale(const Vec3< typename MatType::value_type > &s)
Return a matrix that scales by s.
Definition: Mat.h:594
+
void measure(Real &area, Real &volume, bool useWorldUnits=true)
Compute the surface area and volume of the level set. Use the last argument to specify the result in ...
Definition: LevelSetMeasure.h:311
+
Real levelSetVolume(const GridT &grid, bool useWorldSpace)
Definition: LevelSetMeasure.h:503
+
LevelSetMeasure(const GridType &grid, InterruptT *interrupt=NULL)
Main constructor from a grid.
Definition: LevelSetMeasure.h:245
+
boost::enable_if< boost::is_floating_point< typename GridT::ValueType >, Real >::type doLevelSetArea(const GridT &grid, bool useWorldSpace)
Definition: LevelSetMeasure.h:458
+
Definition: Exceptions.h:87
+ +
boost::enable_if< boost::is_floating_point< typename GridT::ValueType > >::type doLevelSetMeasure(const GridT &grid, Real &area, Real &volume, bool useWorldSpace)
Definition: LevelSetMeasure.h:512
+
virtual ~LevelSetMeasure()
Destructor.
Definition: LevelSetMeasure.h:158
+ +
int32_t Abs(int32_t i)
Return the absolute value of the given quantity.
Definition: Math.h:293
+
DiracDelta(RealT eps)
Definition: LevelSetMeasure.h:118
+
Definition: Types.h:213
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
A LeafManager manages a linear array of pointers to a given tree's leaf nodes, as well as optional au...
+
void reinit(const GridType &grid)
Re-initialize using the specified grid.
Definition: LevelSetMeasure.h:280
+
TreeT * tree
Definition: MaskToLevelSet.h:118
+
void setGrainSize(int grainsize)
Set the grain-size used for multi-threading.
Definition: LevelSetMeasure.h:165
+ +
void levelSetMeasure(const GridT &grid, Real &area, Real &volume, Real &avgCurvature, bool useWorldSpace)
Definition: LevelSetMeasure.h:554
+
bool wasInterrupted(T *i, int percent=-1)
Definition: NullInterrupter.h:76
+
RealT operator()(RealT phi) const
Definition: LevelSetMeasure.h:119
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetMorph_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetMorph_8h_source.html new file mode 100644 index 00000000..f1b50edc --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetMorph_8h_source.html @@ -0,0 +1,758 @@ + + + + + + +OpenVDB: LevelSetMorph.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
LevelSetMorph.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
32 //
+
39 
+
40 #ifndef OPENVDB_TOOLS_LEVEL_SET_MORPH_HAS_BEEN_INCLUDED
+
41 #define OPENVDB_TOOLS_LEVEL_SET_MORPH_HAS_BEEN_INCLUDED
+
42 
+
43 #include "LevelSetTracker.h"
+
44 #include "Interpolation.h" // for BoxSampler, etc.
+ +
46 
+
47 namespace openvdb {
+ +
49 namespace OPENVDB_VERSION_NAME {
+
50 namespace tools {
+
51 
+
52 
+
72 template<typename GridT,
+
73  typename InterruptT = util::NullInterrupter>
+ +
75 {
+
76 public:
+
77  typedef GridT GridType;
+
78  typedef typename GridT::TreeType TreeType;
+ +
80  typedef typename TrackerT::LeafRange LeafRange;
+
81  typedef typename TrackerT::LeafType LeafType;
+
82  typedef typename TrackerT::BufferType BufferType;
+
83  typedef typename TrackerT::ValueType ValueType;
+
84 
+
86  LevelSetMorphing(GridT& sourceGrid,
+
87  const GridT& targetGrid,
+
88  InterruptT* interrupt = NULL)
+
89  : mTracker(sourceGrid, interrupt)
+
90  , mTarget(&targetGrid)
+
91  , mMask(NULL)
+
92  , mSpatialScheme(math::HJWENO5_BIAS)
+
93  , mTemporalScheme(math::TVD_RK2)
+
94  , mMinMask(0)
+
95  , mDeltaMask(1)
+
96  , mInvertMask(false)
+
97  {
+
98  }
+
99 
+
100  virtual ~LevelSetMorphing() {}
+
101 
+
103  void setTarget(const GridT& targetGrid) { mTarget = &targetGrid; }
+
104 
+
106  void setAlphaMask(const GridT& maskGrid) { mMask = &maskGrid; }
+
107 
+
109  math::BiasedGradientScheme getSpatialScheme() const { return mSpatialScheme; }
+
111  void setSpatialScheme(math::BiasedGradientScheme scheme) { mSpatialScheme = scheme; }
+
112 
+
114  math::TemporalIntegrationScheme getTemporalScheme() const { return mTemporalScheme; }
+
116  void setTemporalScheme(math::TemporalIntegrationScheme scheme) { mTemporalScheme = scheme; }
+
117 
+ +
120  {
+
121  return mTracker.getSpatialScheme();
+
122  }
+ +
125  {
+
126  mTracker.setSpatialScheme(scheme);
+
127  }
+ +
130  {
+
131  return mTracker.getTemporalScheme();
+
132  }
+ +
135  {
+
136  mTracker.setTemporalScheme(scheme);
+
137  }
+
139  int getNormCount() const { return mTracker.getNormCount(); }
+
141  void setNormCount(int n) { mTracker.setNormCount(n); }
+
142 
+
144  int getGrainSize() const { return mTracker.getGrainSize(); }
+
147  void setGrainSize(int grainsize) { mTracker.setGrainSize(grainsize); }
+
148 
+
151  ValueType minMask() const { return mMinMask; }
+
152 
+
155  ValueType maxMask() const { return mDeltaMask + mMinMask; }
+
156 
+
164  void setMaskRange(ValueType min, ValueType max)
+
165  {
+
166  if (!(min < max)) OPENVDB_THROW(ValueError, "Invalid mask range (expects min < max)");
+
167  mMinMask = min;
+
168  mDeltaMask = max-min;
+
169  }
+
170 
+
173  bool isMaskInverted() const { return mInvertMask; }
+
176  void invertMask(bool invert=true) { mInvertMask = invert; }
+
177 
+
182  size_t advect(ValueType time0, ValueType time1);
+
183 
+
184 private:
+
185 
+
186  // disallow copy construction and copy by assignment!
+
187  LevelSetMorphing(const LevelSetMorphing&);// not implemented
+
188  LevelSetMorphing& operator=(const LevelSetMorphing&);// not implemented
+
189 
+
190  template<math::BiasedGradientScheme SpatialScheme>
+
191  size_t advect1(ValueType time0, ValueType time1);
+
192 
+
193  template<math::BiasedGradientScheme SpatialScheme,
+
194  math::TemporalIntegrationScheme TemporalScheme>
+
195  size_t advect2(ValueType time0, ValueType time1);
+
196 
+
197  template<math::BiasedGradientScheme SpatialScheme,
+
198  math::TemporalIntegrationScheme TemporalScheme,
+
199  typename MapType>
+
200  size_t advect3(ValueType time0, ValueType time1);
+
201 
+
202  TrackerT mTracker;
+
203  const GridT *mTarget, *mMask;
+
204  math::BiasedGradientScheme mSpatialScheme;
+
205  math::TemporalIntegrationScheme mTemporalScheme;
+
206  ValueType mMinMask, mDeltaMask;
+
207  bool mInvertMask;
+
208 
+
209  // This templated private class implements all the level set magic.
+
210  template<typename MapT, math::BiasedGradientScheme SpatialScheme,
+
211  math::TemporalIntegrationScheme TemporalScheme>
+
212  struct Morph
+
213  {
+ +
217  Morph(const Morph& other);
+
219  Morph(Morph& other, tbb::split);
+
221  virtual ~Morph() {}
+
224  size_t advect(ValueType time0, ValueType time1);
+
226  void operator()(const LeafRange& r) const
+
227  {
+
228  if (mTask) mTask(const_cast<Morph*>(this), r);
+
229  else OPENVDB_THROW(ValueError, "task is undefined - don\'t call this method directly");
+
230  }
+
232  void operator()(const LeafRange& r)
+
233  {
+
234  if (mTask) mTask(this, r);
+
235  else OPENVDB_THROW(ValueError, "task is undefined - don\'t call this method directly");
+
236  }
+
238  void join(const Morph& other) { mMaxAbsS = math::Max(mMaxAbsS, other.mMaxAbsS); }
+
239 
+
241  enum ThreadingMode { PARALLEL_FOR, PARALLEL_REDUCE }; // for internal use
+
242  // method calling tbb
+
243  void cook(ThreadingMode mode, size_t swapBuffer = 0);
+
244 
+
246  typename GridT::ValueType sampleSpeed(ValueType time0, ValueType time1, Index speedBuffer);
+
247  void sampleXformedSpeed(const LeafRange& r, Index speedBuffer);
+
248  void sampleAlignedSpeed(const LeafRange& r, Index speedBuffer);
+
249 
+
250  // Convex combination of Phi and a forward Euler advection steps:
+
251  // Phi(result) = alpha * Phi(phi) + (1-alpha) * (Phi(0) - dt * Speed(speed)*|Grad[Phi(0)]|);
+
252  template <int Nominator, int Denominator>
+
253  void euler(const LeafRange&, ValueType, Index, Index, Index);
+
254  inline void euler01(const LeafRange& r, ValueType t, Index s) {this->euler<0,1>(r,t,0,1,s);}
+
255  inline void euler12(const LeafRange& r, ValueType t) {this->euler<1,2>(r, t, 1, 1, 2);}
+
256  inline void euler34(const LeafRange& r, ValueType t) {this->euler<3,4>(r, t, 1, 2, 3);}
+
257  inline void euler13(const LeafRange& r, ValueType t) {this->euler<1,3>(r, t, 1, 2, 3);}
+
258 
+
259  typedef typename boost::function<void (Morph*, const LeafRange&)> FuncType;
+
260  LevelSetMorphing* mParent;
+
261  ValueType mMinAbsS, mMaxAbsS;
+
262  const MapT* mMap;
+
263  FuncType mTask;
+
264  }; // end of private Morph struct
+
265 
+
266 };//end of LevelSetMorphing
+
267 
+
268 template<typename GridT, typename InterruptT>
+
269 inline size_t
+
270 LevelSetMorphing<GridT, InterruptT>::advect(ValueType time0, ValueType time1)
+
271 {
+
272  switch (mSpatialScheme) {
+
273  case math::FIRST_BIAS:
+
274  return this->advect1<math::FIRST_BIAS >(time0, time1);
+
275  //case math::SECOND_BIAS:
+
276  //return this->advect1<math::SECOND_BIAS >(time0, time1);
+
277  //case math::THIRD_BIAS:
+
278  //return this->advect1<math::THIRD_BIAS >(time0, time1);
+
279  //case math::WENO5_BIAS:
+
280  //return this->advect1<math::WENO5_BIAS >(time0, time1);
+
281  case math::HJWENO5_BIAS:
+
282  return this->advect1<math::HJWENO5_BIAS>(time0, time1);
+
283  default:
+
284  OPENVDB_THROW(ValueError, "Spatial difference scheme not supported!");
+
285  }
+
286  return 0;
+
287 }
+
288 
+
289 template<typename GridT, typename InterruptT>
+
290 template<math::BiasedGradientScheme SpatialScheme>
+
291 inline size_t
+
292 LevelSetMorphing<GridT, InterruptT>::advect1(ValueType time0, ValueType time1)
+
293 {
+
294  switch (mTemporalScheme) {
+
295  case math::TVD_RK1:
+
296  return this->advect2<SpatialScheme, math::TVD_RK1>(time0, time1);
+
297  case math::TVD_RK2:
+
298  return this->advect2<SpatialScheme, math::TVD_RK2>(time0, time1);
+
299  case math::TVD_RK3:
+
300  return this->advect2<SpatialScheme, math::TVD_RK3>(time0, time1);
+
301  default:
+
302  OPENVDB_THROW(ValueError, "Temporal integration scheme not supported!");
+
303  }
+
304  return 0;
+
305 }
+
306 
+
307 template<typename GridT, typename InterruptT>
+
308 template<math::BiasedGradientScheme SpatialScheme,
+
309  math::TemporalIntegrationScheme TemporalScheme>
+
310 inline size_t
+
311 LevelSetMorphing<GridT, InterruptT>::advect2(ValueType time0, ValueType time1)
+
312 {
+
313  const math::Transform& trans = mTracker.grid().transform();
+
314  if (trans.mapType() == math::UniformScaleMap::mapType()) {
+
315  return this->advect3<SpatialScheme, TemporalScheme, math::UniformScaleMap>(time0, time1);
+
316  } else if (trans.mapType() == math::UniformScaleTranslateMap::mapType()) {
+
317  return this->advect3<SpatialScheme, TemporalScheme, math::UniformScaleTranslateMap>(
+
318  time0, time1);
+
319  } else if (trans.mapType() == math::UnitaryMap::mapType()) {
+
320  return this->advect3<SpatialScheme, TemporalScheme, math::UnitaryMap >(time0, time1);
+
321  } else if (trans.mapType() == math::TranslationMap::mapType()) {
+
322  return this->advect3<SpatialScheme, TemporalScheme, math::TranslationMap>(time0, time1);
+
323  } else {
+
324  OPENVDB_THROW(ValueError, "MapType not supported!");
+
325  }
+
326  return 0;
+
327 }
+
328 
+
329 template<typename GridT, typename InterruptT>
+
330 template<math::BiasedGradientScheme SpatialScheme,
+
331  math::TemporalIntegrationScheme TemporalScheme,
+
332  typename MapT>
+
333 inline size_t
+
334 LevelSetMorphing<GridT, InterruptT>::advect3(ValueType time0, ValueType time1)
+
335 {
+
336  Morph<MapT, SpatialScheme, TemporalScheme> tmp(*this);
+
337  return tmp.advect(time0, time1);
+
338 }
+
339 
+
340 
+
342 
+
343 template<typename GridT, typename InterruptT>
+
344 template <typename MapT, math::BiasedGradientScheme SpatialScheme,
+
345  math::TemporalIntegrationScheme TemporalScheme>
+
346 inline
+
347 LevelSetMorphing<GridT, InterruptT>::
+
348 Morph<MapT, SpatialScheme, TemporalScheme>::
+
349 Morph(LevelSetMorphing<GridT, InterruptT>& parent)
+
350  : mParent(&parent)
+
351  , mMinAbsS(ValueType(1e-6))
+
352  , mMap(parent.mTracker.grid().transform().template constMap<MapT>().get())
+
353  , mTask(0)
+
354 {
+
355 }
+
356 
+
357 template<typename GridT, typename InterruptT>
+
358 template <typename MapT, math::BiasedGradientScheme SpatialScheme,
+
359  math::TemporalIntegrationScheme TemporalScheme>
+
360 inline
+
361 LevelSetMorphing<GridT, InterruptT>::
+
362 Morph<MapT, SpatialScheme, TemporalScheme>::
+
363 Morph(const Morph& other)
+
364  : mParent(other.mParent)
+
365  , mMinAbsS(other.mMinAbsS)
+
366  , mMaxAbsS(other.mMaxAbsS)
+
367  , mMap(other.mMap)
+
368  , mTask(other.mTask)
+
369 {
+
370 }
+
371 
+
372 template<typename GridT, typename InterruptT>
+
373 template <typename MapT, math::BiasedGradientScheme SpatialScheme,
+
374  math::TemporalIntegrationScheme TemporalScheme>
+
375 inline
+
376 LevelSetMorphing<GridT, InterruptT>::
+
377 Morph<MapT, SpatialScheme, TemporalScheme>::
+
378 Morph(Morph& other, tbb::split)
+
379  : mParent(other.mParent)
+
380  , mMinAbsS(other.mMinAbsS)
+
381  , mMaxAbsS(other.mMaxAbsS)
+
382  , mMap(other.mMap)
+
383  , mTask(other.mTask)
+
384 {
+
385 }
+
386 
+
387 template<typename GridT, typename InterruptT>
+
388 template <typename MapT, math::BiasedGradientScheme SpatialScheme,
+
389  math::TemporalIntegrationScheme TemporalScheme>
+
390 inline size_t
+ + +
393 advect(ValueType time0, ValueType time1)
+
394 {
+
395  // Make sure we have enough temporal auxiliary buffers for the time
+
396  // integration AS WELL AS an extra buffer with the speed function!
+
397  static const Index auxBuffers = 1 + (TemporalScheme == math::TVD_RK3 ? 2 : 1);
+
398  size_t countCFL = 0;
+
399  while (time0 < time1 && mParent->mTracker.checkInterrupter()) {
+
400  mParent->mTracker.leafs().rebuildAuxBuffers(auxBuffers);
+
401 
+
402  const ValueType dt = this->sampleSpeed(time0, time1, auxBuffers);
+
403  if ( math::isZero(dt) ) break;//V is essentially zero so terminate
+
404 
+
405  OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN //switch is resolved at compile-time
+
406  switch(TemporalScheme) {
+
407  case math::TVD_RK1:
+
408  // Perform one explicit Euler step: t1 = t0 + dt
+
409  // Phi_t1(1) = Phi_t0(0) - dt * Speed(2) * |Grad[Phi(0)]|
+
410  mTask = boost::bind(&Morph::euler01, _1, _2, dt, /*speed*/2);
+
411 
+
412  // Cook and swap buffer 0 and 1 such that Phi_t1(0) and Phi_t0(1)
+
413  this->cook(PARALLEL_FOR, 1);
+
414  break;
+
415  case math::TVD_RK2:
+
416  // Perform one explicit Euler step: t1 = t0 + dt
+
417  // Phi_t1(1) = Phi_t0(0) - dt * Speed(2) * |Grad[Phi(0)]|
+
418  mTask = boost::bind(&Morph::euler01, _1, _2, dt, /*speed*/2);
+
419 
+
420  // Cook and swap buffer 0 and 1 such that Phi_t1(0) and Phi_t0(1)
+
421  this->cook(PARALLEL_FOR, 1);
+
422 
+
423  // Convex combine explict Euler step: t2 = t0 + dt
+
424  // Phi_t2(1) = 1/2 * Phi_t0(1) + 1/2 * (Phi_t1(0) - dt * Speed(2) * |Grad[Phi(0)]|)
+
425  mTask = boost::bind(&Morph::euler12, _1, _2, dt);
+
426 
+
427  // Cook and swap buffer 0 and 1 such that Phi_t2(0) and Phi_t1(1)
+
428  this->cook(PARALLEL_FOR, 1);
+
429  break;
+
430  case math::TVD_RK3:
+
431  // Perform one explicit Euler step: t1 = t0 + dt
+
432  // Phi_t1(1) = Phi_t0(0) - dt * Speed(3) * |Grad[Phi(0)]|
+
433  mTask = boost::bind(&Morph::euler01, _1, _2, dt, /*speed*/3);
+
434 
+
435  // Cook and swap buffer 0 and 1 such that Phi_t1(0) and Phi_t0(1)
+
436  this->cook(PARALLEL_FOR, 1);
+
437 
+
438  // Convex combine explict Euler step: t2 = t0 + dt/2
+
439  // Phi_t2(2) = 3/4 * Phi_t0(1) + 1/4 * (Phi_t1(0) - dt * Speed(3) * |Grad[Phi(0)]|)
+
440  mTask = boost::bind(&Morph::euler34, _1, _2, dt);
+
441 
+
442  // Cook and swap buffer 0 and 2 such that Phi_t2(0) and Phi_t1(2)
+
443  this->cook(PARALLEL_FOR, 2);
+
444 
+
445  // Convex combine explict Euler step: t3 = t0 + dt
+
446  // Phi_t3(2) = 1/3 * Phi_t0(1) + 2/3 * (Phi_t2(0) - dt * Speed(3) * |Grad[Phi(0)]|)
+
447  mTask = boost::bind(&Morph::euler13, _1, _2, dt);
+
448 
+
449  // Cook and swap buffer 0 and 2 such that Phi_t3(0) and Phi_t2(2)
+
450  this->cook(PARALLEL_FOR, 2);
+
451  break;
+
452  default:
+
453  OPENVDB_THROW(ValueError, "Temporal integration scheme not supported!");
+
454  }//end of compile-time resolved switch
+ +
456 
+
457  time0 += dt;
+
458  ++countCFL;
+
459  mParent->mTracker.leafs().removeAuxBuffers();
+
460 
+
461  // Track the narrow band
+
462  mParent->mTracker.track();
+
463  }//end wile-loop over time
+
464 
+
465  return countCFL;//number of CLF propagation steps
+
466 }
+
467 
+
468 template<typename GridT, typename InterruptT>
+
469 template<typename MapT, math::BiasedGradientScheme SpatialScheme,
+
470  math::TemporalIntegrationScheme TemporalScheme>
+
471 inline typename GridT::ValueType
+
472 LevelSetMorphing<GridT, InterruptT>::
+
473 Morph<MapT, SpatialScheme, TemporalScheme>::
+
474 sampleSpeed(ValueType time0, ValueType time1, Index speedBuffer)
+
475 {
+
476  mMaxAbsS = mMinAbsS;
+
477  const size_t leafCount = mParent->mTracker.leafs().leafCount();
+
478  if (leafCount==0 || time0 >= time1) return ValueType(0);
+
479 
+
480  const math::Transform& xform = mParent->mTracker.grid().transform();
+
481  if (mParent->mTarget->transform() == xform &&
+
482  (mParent->mMask == NULL || mParent->mMask->transform() == xform)) {
+
483  mTask = boost::bind(&Morph::sampleAlignedSpeed, _1, _2, speedBuffer);
+
484  } else {
+
485  mTask = boost::bind(&Morph::sampleXformedSpeed, _1, _2, speedBuffer);
+
486  }
+
487  this->cook(PARALLEL_REDUCE);
+
488  if (math::isApproxEqual(mMinAbsS, mMaxAbsS)) return ValueType(0);//speed is essentially zero
+
489  static const ValueType CFL = (TemporalScheme == math::TVD_RK1 ? ValueType(0.3) :
+
490  TemporalScheme == math::TVD_RK2 ? ValueType(0.9) :
+
491  ValueType(1.0))/math::Sqrt(ValueType(3.0));
+
492  const ValueType dt = math::Abs(time1 - time0), dx = mParent->mTracker.voxelSize();
+
493  return math::Min(dt, ValueType(CFL*dx/mMaxAbsS));
+
494 }
+
495 
+
496 template<typename GridT, typename InterruptT>
+
497 template <typename MapT, math::BiasedGradientScheme SpatialScheme,
+
498  math::TemporalIntegrationScheme TemporalScheme>
+
499 inline void
+
500 LevelSetMorphing<GridT, InterruptT>::
+
501 Morph<MapT, SpatialScheme, TemporalScheme>::
+
502 sampleXformedSpeed(const LeafRange& range, Index speedBuffer)
+
503 {
+
504  typedef typename LeafType::ValueOnCIter VoxelIterT;
+
505  typedef tools::GridSampler<typename GridT::ConstAccessor, tools::BoxSampler> SamplerT;
+
506  const MapT& map = *mMap;
+
507  mParent->mTracker.checkInterrupter();
+
508 
+
509  typename GridT::ConstAccessor targetAcc = mParent->mTarget->getAccessor();
+
510  SamplerT target(targetAcc, mParent->mTarget->transform());
+
511  if (mParent->mMask == NULL) {
+
512  for (typename LeafRange::Iterator leafIter = range.begin(); leafIter; ++leafIter) {
+
513  ValueType* speed = leafIter.buffer(speedBuffer).data();
+
514  bool isZero = true;
+
515  for (VoxelIterT voxelIter = leafIter->cbeginValueOn(); voxelIter; ++voxelIter) {
+
516  ValueType& s = speed[voxelIter.pos()];
+
517  s -= target.wsSample(map.applyMap(voxelIter.getCoord().asVec3d()));
+
518  if (!math::isApproxZero(s)) isZero = false;
+
519  mMaxAbsS = math::Max(mMaxAbsS, math::Abs(s));
+
520  }
+
521  if (isZero) speed[0] = std::numeric_limits<ValueType>::max();//tag first voxel
+
522  }
+
523  } else {
+
524  const ValueType min = mParent->mMinMask, invNorm = 1.0f/(mParent->mDeltaMask);
+
525  const bool invMask = mParent->isMaskInverted();
+
526  typename GridT::ConstAccessor maskAcc = mParent->mMask->getAccessor();
+
527  SamplerT mask(maskAcc, mParent->mMask->transform());
+
528  for (typename LeafRange::Iterator leafIter = range.begin(); leafIter; ++leafIter) {
+
529  ValueType* speed = leafIter.buffer(speedBuffer).data();
+
530  bool isZero = true;
+
531  for (VoxelIterT voxelIter = leafIter->cbeginValueOn(); voxelIter; ++voxelIter) {
+
532  const Vec3R xyz = map.applyMap(voxelIter.getCoord().asVec3d());//world space
+
533  const ValueType a = math::SmoothUnitStep((mask.wsSample(xyz)-min)*invNorm);
+
534  ValueType& s = speed[voxelIter.pos()];
+
535  s -= target.wsSample(xyz);
+
536  s *= invMask ? 1 - a : a;
+
537  if (!math::isApproxZero(s)) isZero = false;
+
538  mMaxAbsS = math::Max(mMaxAbsS, math::Abs(s));
+
539  }
+
540  if (isZero) speed[0] = std::numeric_limits<ValueType>::max();//tag first voxel
+
541  }
+
542  }
+
543 }
+
544 
+
545 template<typename GridT, typename InterruptT>
+
546 template <typename MapT, math::BiasedGradientScheme SpatialScheme,
+
547  math::TemporalIntegrationScheme TemporalScheme>
+
548 inline void
+
549 LevelSetMorphing<GridT, InterruptT>::
+
550 Morph<MapT, SpatialScheme, TemporalScheme>::
+
551 sampleAlignedSpeed(const LeafRange& range, Index speedBuffer)
+
552 {
+
553  typedef typename LeafType::ValueOnCIter VoxelIterT;
+
554  mParent->mTracker.checkInterrupter();
+
555 
+
556  typename GridT::ConstAccessor target = mParent->mTarget->getAccessor();
+
557 
+
558  if (mParent->mMask == NULL) {
+
559  for (typename LeafRange::Iterator leafIter = range.begin(); leafIter; ++leafIter) {
+
560  ValueType* speed = leafIter.buffer(speedBuffer).data();
+
561  bool isZero = true;
+
562  for (VoxelIterT voxelIter = leafIter->cbeginValueOn(); voxelIter; ++voxelIter) {
+
563  ValueType& s = speed[voxelIter.pos()];
+
564  s -= target.getValue(voxelIter.getCoord());
+
565  if (!math::isApproxZero(s)) isZero = false;
+
566  mMaxAbsS = math::Max(mMaxAbsS, math::Abs(s));
+
567  }
+
568  if (isZero) speed[0] = std::numeric_limits<ValueType>::max();//tag first voxel
+
569  }
+
570  } else {
+
571  const ValueType min = mParent->mMinMask, invNorm = 1.0f/(mParent->mDeltaMask);
+
572  const bool invMask = mParent->isMaskInverted();
+
573  typename GridT::ConstAccessor mask = mParent->mMask->getAccessor();
+
574  for (typename LeafRange::Iterator leafIter = range.begin(); leafIter; ++leafIter) {
+
575  ValueType* speed = leafIter.buffer(speedBuffer).data();
+
576  bool isZero = true;
+
577  for (VoxelIterT voxelIter = leafIter->cbeginValueOn(); voxelIter; ++voxelIter) {
+
578  const Coord ijk = voxelIter.getCoord();//index space
+
579  const ValueType a = math::SmoothUnitStep((mask.getValue(ijk)-min)*invNorm);
+
580  ValueType& s = speed[voxelIter.pos()];
+
581  s -= target.getValue(ijk);
+
582  s *= invMask ? 1 - a : a;
+
583  if (!math::isApproxZero(s)) isZero = false;
+
584  mMaxAbsS = math::Max(mMaxAbsS, math::Abs(s));
+
585  }
+
586  if (isZero) speed[0] = std::numeric_limits<ValueType>::max();//tag first voxel
+
587  }
+
588  }
+
589 }
+
590 
+
591 template<typename GridT, typename InterruptT>
+
592 template <typename MapT, math::BiasedGradientScheme SpatialScheme,
+
593  math::TemporalIntegrationScheme TemporalScheme>
+
594 inline void
+
595 LevelSetMorphing<GridT, InterruptT>::
+
596 Morph<MapT, SpatialScheme, TemporalScheme>::
+
597 cook(ThreadingMode mode, size_t swapBuffer)
+
598 {
+
599  mParent->mTracker.startInterrupter("Morphing level set");
+
600 
+
601  const int grainSize = mParent->mTracker.getGrainSize();
+
602  const LeafRange range = mParent->mTracker.leafs().leafRange(grainSize);
+
603 
+
604  if (mParent->mTracker.getGrainSize()==0) {
+
605  (*this)(range);
+
606  } else if (mode == PARALLEL_FOR) {
+
607  tbb::parallel_for(range, *this);
+
608  } else if (mode == PARALLEL_REDUCE) {
+
609  tbb::parallel_reduce(range, *this);
+
610  } else {
+
611  throw std::runtime_error("Undefined threading mode");
+
612  }
+
613 
+
614  mParent->mTracker.leafs().swapLeafBuffer(swapBuffer, grainSize == 0);
+
615 
+
616  mParent->mTracker.endInterrupter();
+
617 }
+
618 
+
619 template<typename GridT, typename InterruptT>
+
620 template<typename MapT, math::BiasedGradientScheme SpatialScheme,
+
621  math::TemporalIntegrationScheme TemporalScheme>
+
622 template <int Nominator, int Denominator>
+
623 inline void
+
624 LevelSetMorphing<GridT,InterruptT>::
+
625 Morph<MapT, SpatialScheme, TemporalScheme>::
+
626 euler(const LeafRange& range, ValueType dt,
+
627  Index phiBuffer, Index resultBuffer, Index speedBuffer)
+
628 {
+
629  typedef math::BIAS_SCHEME<SpatialScheme> SchemeT;
+
630  typedef typename SchemeT::template ISStencil<GridType>::StencilType StencilT;
+
631  typedef typename LeafType::ValueOnCIter VoxelIterT;
+
632  typedef math::GradientNormSqrd<MapT, SpatialScheme> NumGrad;
+
633 
+
634  static const ValueType Alpha = ValueType(Nominator)/ValueType(Denominator);
+
635  static const ValueType Beta = ValueType(1) - Alpha;
+
636 
+
637  mParent->mTracker.checkInterrupter();
+
638  const MapT& map = *mMap;
+
639  StencilT stencil(mParent->mTracker.grid());
+
640 
+
641  for (typename LeafRange::Iterator leafIter = range.begin(); leafIter; ++leafIter) {
+
642  const ValueType* speed = leafIter.buffer(speedBuffer).data();
+ +
644  const ValueType* phi = leafIter.buffer(phiBuffer).data();
+
645  ValueType* result = leafIter.buffer(resultBuffer).data();
+
646  for (VoxelIterT voxelIter = leafIter->cbeginValueOn(); voxelIter; ++voxelIter) {
+
647  const Index n = voxelIter.pos();
+
648  if (math::isApproxZero(speed[n])) continue;
+
649  stencil.moveTo(voxelIter);
+
650  const ValueType v = stencil.getValue() - dt * speed[n] * NumGrad::result(map, stencil);
+
651  result[n] = Nominator ? Alpha * phi[n] + Beta * v : v;
+
652  }//loop over active voxels in the leaf of the mask
+
653  }//loop over leafs of the level set
+
654 }
+
655 
+
656 } // namespace tools
+
657 } // namespace OPENVDB_VERSION_NAME
+
658 } // namespace openvdb
+
659 
+
660 #endif // OPENVDB_TOOLS_LEVEL_SET_MORPH_HAS_BEEN_INCLUDED
+
661 
+
662 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
663 // All rights reserved. This software is distributed under the
+
664 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+ +
TrackerT::LeafRange LeafRange
Definition: LevelSetMorph.h:80
+
math::TemporalIntegrationScheme getTemporalScheme() const
Return the temporal integration scheme.
Definition: LevelSetMorph.h:114
+
Performs multi-threaded interface tracking of narrow band level sets. This is the building-block for ...
+ +
void invertMask(bool invert=true)
Invert the optional mask, i.e. min->max in the original mask maps to 1->0 in the inverted alpha mask...
Definition: LevelSetMorph.h:176
+
bool isExactlyEqual(const T0 &a, const T1 &b)
Return true if a is exactly equal to b.
Definition: Math.h:407
+
float Sqrt(float x)
Return the square root of a floating-point value.
Definition: Math.h:709
+
ValueType minMask() const
Return the minimum value of the mask to be used for the derivation of a smooth alpha value...
Definition: LevelSetMorph.h:151
+
TemporalIntegrationScheme
Temporal integration schemes.
Definition: FiniteDifference.h:261
+
const Type & Min(const Type &a, const Type &b)
Return the minimum of two values.
Definition: Math.h:622
+
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
+
Definition: FiniteDifference.h:194
+
LevelSetMorphing(GridT &sourceGrid, const GridT &targetGrid, InterruptT *interrupt=NULL)
Main constructor.
Definition: LevelSetMorph.h:86
+
Definition: FiniteDifference.h:263
+
TreeType::ValueType ValueType
Definition: LevelSetTracker.h:73
+
Shape morphology of level sets. Morphing from a source narrow-band level sets to a target narrow-band...
Definition: LevelSetMorph.h:74
+
bool isZero(const Type &x)
Return true if x is exactly equal to zero.
Definition: Math.h:324
+
void setTrackerSpatialScheme(math::BiasedGradientScheme scheme)
Set the spatial finite-difference scheme.
Definition: LevelSetMorph.h:124
+
Definition: FiniteDifference.h:198
+
void setTrackerTemporalScheme(math::TemporalIntegrationScheme scheme)
Set the temporal integration scheme.
Definition: LevelSetMorph.h:134
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & max(const T &a, const T &b)
Definition: Composite.h:132
+
Type SmoothUnitStep(Type x)
Return 0 if x < 0, 1 if x > 1 or else .
Definition: Math.h:272
+
GridT GridType
Definition: LevelSetMorph.h:77
+
size_t advect(ValueType time0, ValueType time1)
Advect the level set from its current time, time0, to its final time, time1. If time0 > time1...
Definition: LevelSetMorph.h:270
+
void setTemporalScheme(math::TemporalIntegrationScheme scheme)
Set the temporal integration scheme.
Definition: LevelSetMorph.h:116
+
bool isApproxEqual(const Type &a, const Type &b)
Return true if a is equal to b to within the default floating-point comparison tolerance.
Definition: Math.h:370
+
bool isMaskInverted() const
Return true if the mask is inverted, i.e. min->max in the original mask maps to 1->0 in the inverted ...
Definition: LevelSetMorph.h:173
+
Index32 Index
Definition: Types.h:58
+
int getNormCount() const
Return the number of normalizations performed per track or normalize call.
Definition: LevelSetMorph.h:139
+
math::BiasedGradientScheme getSpatialScheme() const
Return the spatial finite-difference scheme.
Definition: LevelSetMorph.h:109
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
TrackerT::ValueType ValueType
Definition: LevelSetMorph.h:83
+
math::BiasedGradientScheme getTrackerSpatialScheme() const
Return the spatial finite-difference scheme.
Definition: LevelSetMorph.h:119
+
Calculate an axis-aligned bounding box in index space from a bounding sphere in world space...
Definition: Transform.h:66
+
Name mapType() const
Return the transformation map's type-name.
Definition: Transform.h:93
+
Definition: Exceptions.h:39
+
BiasedGradientScheme
Biased Gradients are limited to non-centered differences.
Definition: FiniteDifference.h:192
+
virtual ~LevelSetMorphing()
Definition: LevelSetMorph.h:100
+
void setSpatialScheme(math::BiasedGradientScheme scheme)
Set the spatial finite-difference scheme.
Definition: LevelSetMorph.h:111
+
#define OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN
Definition: Platform.h:129
+
GridT::TreeType TreeType
Definition: LevelSetMorph.h:78
+
int getGrainSize() const
Return the grain size used for multithreading.
Definition: LevelSetMorph.h:144
+
Definition: FiniteDifference.h:265
+
void setTarget(const GridT &targetGrid)
Redefine the target level set.
Definition: LevelSetMorph.h:103
+
math::TemporalIntegrationScheme getTrackerTemporalScheme() const
Return the temporal integration scheme.
Definition: LevelSetMorph.h:129
+
#define OPENVDB_NO_UNREACHABLE_CODE_WARNING_END
Definition: Platform.h:130
+ +
void setNormCount(int n)
Set the number of normalizations performed per track or normalize call.
Definition: LevelSetMorph.h:141
+
TrackerT::BufferType BufferType
Definition: LevelSetMorph.h:82
+
Definition: Exceptions.h:88
+
const Type & Max(const Type &a, const Type &b)
Return the maximum of two values.
Definition: Math.h:561
+
LeafManagerType::BufferType BufferType
Definition: LevelSetTracker.h:76
+
TrackerT::LeafType LeafType
Definition: LevelSetMorph.h:81
+
void setGrainSize(int grainsize)
Set the grain size used for multithreading.
Definition: LevelSetMorph.h:147
+
bool isApproxZero(const Type &x)
Return true if x is equal to zero to within the default floating-point comparison tolerance...
Definition: Math.h:336
+
math::Vec3< Real > Vec3R
Definition: Types.h:76
+
int32_t Abs(int32_t i)
Return the absolute value of the given quantity.
Definition: Math.h:293
+
void setMaskRange(ValueType min, ValueType max)
Define the range for the (optional) scalar mask.
Definition: LevelSetMorph.h:164
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
LevelSetTracker< GridT, InterruptT > TrackerT
Definition: LevelSetMorph.h:79
+
void setAlphaMask(const GridT &maskGrid)
Define the alpha mask.
Definition: LevelSetMorph.h:106
+
ValueType maxMask() const
Return the maximum value of the mask to be used for the derivation of a smooth alpha value...
Definition: LevelSetMorph.h:155
+
Performs multi-threaded interface tracking of narrow band level sets.
Definition: LevelSetTracker.h:67
+
Definition: FiniteDifference.h:264
+
TreeType::LeafNodeType LeafType
Definition: LevelSetTracker.h:72
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & min(const T &a, const T &b)
Definition: Composite.h:128
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetPlatonic_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetPlatonic_8h_source.html new file mode 100644 index 00000000..77c54dde --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetPlatonic_8h_source.html @@ -0,0 +1,482 @@ + + + + + + +OpenVDB: LevelSetPlatonic.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
LevelSetPlatonic.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
40 
+
41 #ifndef OPENVDB_TOOLS_LEVELSETPLATONIC_HAS_BEEN_INCLUDED
+
42 #define OPENVDB_TOOLS_LEVELSETPLATONIC_HAS_BEEN_INCLUDED
+
43 
+
44 #include <vector>
+
45 #include <openvdb/Grid.h>
+
46 #include <openvdb/Types.h>
+
47 #include <openvdb/math/Math.h>
+
48 #include <openvdb/math/Transform.h>
+ + +
51 #include <boost/utility.hpp>
+
52 #include <boost/type_traits/is_floating_point.hpp>
+
53 
+
54 namespace openvdb {
+ +
56 namespace OPENVDB_VERSION_NAME {
+
57 namespace tools {
+
58 
+
72 template<typename GridType, typename InterruptT>
+
73 typename GridType::Ptr
+
74 createLevelSetPlatonic(int faceCount,// 4, 6, 8, 12 or 20
+
75  float scale = 1.0f,
+
76  const Vec3f& center = Vec3f(0.0f),
+
77  float voxelSize = 0.1f,
+
78  float halfWidth = float(LEVEL_SET_HALF_WIDTH),
+
79  InterruptT* interrupt = NULL);
+
80 
+
93 template<typename GridType>
+
94 typename GridType::Ptr
+
95 createLevelSetPlatonic(int faceCount,// 4, 6, 8, 12 or 20
+
96  float scale = 1.0f,
+
97  const Vec3f& center = Vec3f(0.0f),
+
98  float voxelSize = 0.1f,
+
99  float halfWidth = float(LEVEL_SET_HALF_WIDTH))
+
100 {
+
101  return createLevelSetPlatonic<GridType, util::NullInterrupter>(faceCount,
+
102  scale,
+
103  center,
+
104  voxelSize,
+
105  halfWidth);
+
106 }
+
107 
+
109 
+
120 template<typename GridType, typename InterruptT>
+
121 typename GridType::Ptr
+ +
123  const Vec3f& center = Vec3f(0.0f),
+
124  float voxelSize = 0.1f,
+
125  float halfWidth = float(LEVEL_SET_HALF_WIDTH),
+
126  InterruptT* interrupt = NULL)
+
127 {
+
128  return createLevelSetPlatonic<GridType, InterruptT>(4, scale, center,
+
129  voxelSize, halfWidth, interrupt);
+
130 }
+
131 
+
141 template<typename GridType>
+
142 typename GridType::Ptr
+ +
144  const Vec3f& center = Vec3f(0.0f),
+
145  float voxelSize = 0.1f,
+
146  float halfWidth = float(LEVEL_SET_HALF_WIDTH))
+
147 {
+
148  return createLevelSetPlatonic<GridType, util::NullInterrupter>(4, scale, center,
+
149  voxelSize, halfWidth);
+
150 }
+
151 
+
153 
+
164 template<typename GridType, typename InterruptT>
+
165 typename GridType::Ptr
+ +
167  const Vec3f& center = Vec3f(0.0f),
+
168  float voxelSize = 0.1f,
+
169  float halfWidth = float(LEVEL_SET_HALF_WIDTH),
+
170  InterruptT* interrupt = NULL)
+
171 {
+
172  return createLevelSetPlatonic<GridType, InterruptT>(6, scale, center,
+
173  voxelSize, halfWidth, interrupt);
+
174 }
+
175 
+
185 template<typename GridType>
+
186 typename GridType::Ptr
+ +
188  const Vec3f& center = Vec3f(0.0f),
+
189  float voxelSize = 0.1f,
+
190  float halfWidth = float(LEVEL_SET_HALF_WIDTH))
+
191 {
+
192  return createLevelSetPlatonic<GridType, util::NullInterrupter>(6, scale, center,
+
193  voxelSize, halfWidth);
+
194 }
+
195 
+
197 
+
208 template<typename GridType, typename InterruptT>
+
209 typename GridType::Ptr
+ +
211  const Vec3f& center = Vec3f(0.0f),
+
212  float voxelSize = 0.1f,
+
213  float halfWidth = float(LEVEL_SET_HALF_WIDTH),
+
214  InterruptT* interrupt = NULL)
+
215 {
+
216  return createLevelSetPlatonic<GridType, InterruptT>(8, scale, center,
+
217  voxelSize, halfWidth, interrupt);
+
218 }
+
219 
+
229 template<typename GridType>
+
230 typename GridType::Ptr
+ +
232  const Vec3f& center = Vec3f(0.0f),
+
233  float voxelSize = 0.1f,
+
234  float halfWidth = float(LEVEL_SET_HALF_WIDTH))
+
235 {
+
236  return createLevelSetPlatonic<GridType, util::NullInterrupter>(8, scale, center,
+
237  voxelSize, halfWidth);
+
238 }
+
239 
+
241 
+
252 template<typename GridType, typename InterruptT>
+
253 typename GridType::Ptr
+ +
255  const Vec3f& center = Vec3f(0.0f),
+
256  float voxelSize = 0.1f,
+
257  float halfWidth = float(LEVEL_SET_HALF_WIDTH),
+
258  InterruptT* interrupt = NULL)
+
259 {
+
260  return createLevelSetPlatonic<GridType, InterruptT>(12, scale, center,
+
261  voxelSize, halfWidth, interrupt);
+
262 }
+
263 
+
273 template<typename GridType>
+
274 typename GridType::Ptr
+ +
276  const Vec3f& center = Vec3f(0.0f),
+
277  float voxelSize = 0.1f,
+
278  float halfWidth = float(LEVEL_SET_HALF_WIDTH))
+
279 {
+
280  return createLevelSetPlatonic<GridType, util::NullInterrupter>(12, scale, center,
+
281  voxelSize, halfWidth);
+
282 }
+
283 
+
285 
+
296 template<typename GridType, typename InterruptT>
+
297 typename GridType::Ptr
+ +
299  const Vec3f& center = Vec3f(0.0f),
+
300  float voxelSize = 0.1f,
+
301  float halfWidth = float(LEVEL_SET_HALF_WIDTH),
+
302  InterruptT* interrupt = NULL)
+
303 {
+
304  return createLevelSetPlatonic<GridType, InterruptT>(20, scale, center,
+
305  voxelSize, halfWidth, interrupt);
+
306 }
+
307 
+
317 template<typename GridType>
+
318 typename GridType::Ptr
+ +
320  const Vec3f& center = Vec3f(0.0f),
+
321  float voxelSize = 0.1f,
+
322  float halfWidth = float(LEVEL_SET_HALF_WIDTH))
+
323 {
+
324  return createLevelSetPlatonic<GridType, util::NullInterrupter>(20, scale, center,
+
325  voxelSize, halfWidth);
+
326 }
+
327 
+
329 
+
330 template<typename GridType, typename InterruptT>
+
331 typename GridType::Ptr
+
332 createLevelSetPlatonic(int faceCount,float scale, const Vec3f& center,
+
333  float voxelSize, float halfWidth, InterruptT* interrupt)
+
334 {
+
335  // GridType::ValueType is required to be a floating-point scalar.
+
336  BOOST_STATIC_ASSERT(boost::is_floating_point<typename GridType::ValueType>::value);
+
337 
+
338  const math::Transform::Ptr xform = math::Transform::createLinearTransform( voxelSize );
+
339 
+
340  std::vector<Vec3f> vtx;
+
341  std::vector<Vec3I> tri;
+
342  std::vector<Vec4I> qua;
+
343 
+
344  if (faceCount == 4) {// Tetrahedron
+
345 
+
346  vtx.push_back( Vec3f( 0.0f, 1.0f, 0.0f) );
+
347  vtx.push_back( Vec3f(-0.942810297f, -0.333329707f, 0.0f) );
+
348  vtx.push_back( Vec3f( 0.471405149f, -0.333329707f, 0.816497624) );
+
349  vtx.push_back( Vec3f( 0.471405149f, -0.333329707f, -0.816497624f) );
+
350 
+
351  tri.push_back( Vec3I(0, 2, 3) );
+
352  tri.push_back( Vec3I(0, 3, 1) );
+
353  tri.push_back( Vec3I(0, 1, 2) );
+
354  tri.push_back( Vec3I(1, 3, 2) );
+
355 
+
356  } else if (faceCount == 6) {// Cube
+
357 
+
358  vtx.push_back( Vec3f(-0.5f, -0.5f, -0.5f) );
+
359  vtx.push_back( Vec3f( 0.5f, -0.5f, -0.5f) );
+
360  vtx.push_back( Vec3f( 0.5f, -0.5f, 0.5f) );
+
361  vtx.push_back( Vec3f(-0.5f, -0.5f, 0.5f) );
+
362  vtx.push_back( Vec3f(-0.5f, 0.5f, -0.5f) );
+
363  vtx.push_back( Vec3f( 0.5f, 0.5f, -0.5f) );
+
364  vtx.push_back( Vec3f( 0.5f, 0.5f, 0.5f) );
+
365  vtx.push_back( Vec3f(-0.5f, 0.5f, 0.5f) );
+
366 
+
367  qua.push_back( Vec4I(1, 0, 4, 5) );
+
368  qua.push_back( Vec4I(2, 1, 5, 6) );
+
369  qua.push_back( Vec4I(3, 2, 6, 7) );
+
370  qua.push_back( Vec4I(0, 3, 7, 4) );
+
371  qua.push_back( Vec4I(2, 3, 0, 1) );
+
372  qua.push_back( Vec4I(5, 4, 7, 6) );
+
373 
+
374  } else if (faceCount == 8) {// Octahedron
+
375 
+
376  vtx.push_back( Vec3f( 0.0f, 0.0f, -1.0f) );
+
377  vtx.push_back( Vec3f( 1.0f, 0.0f, 0.0f) );
+
378  vtx.push_back( Vec3f( 0.0f, 0.0f, 1.0f) );
+
379  vtx.push_back( Vec3f(-1.0f, 0.0f, 0.0f) );
+
380  vtx.push_back( Vec3f( 0.0f,-1.0f, 0.0f) );
+
381  vtx.push_back( Vec3f( 0.0f, 1.0f, 0.0f) );
+
382 
+
383  tri.push_back( Vec3I(0, 4, 3) );
+
384  tri.push_back( Vec3I(0, 1, 4) );
+
385  tri.push_back( Vec3I(1, 2, 4) );
+
386  tri.push_back( Vec3I(2, 3, 4) );
+
387  tri.push_back( Vec3I(0, 3, 5) );
+
388  tri.push_back( Vec3I(0, 5, 1) );
+
389  tri.push_back( Vec3I(1, 5, 2) );
+
390  tri.push_back( Vec3I(2, 5, 3) );
+
391 
+
392  } else if (faceCount == 12) {// Dodecahedron
+
393 
+
394  vtx.push_back( Vec3f( 0.354437858f, 0.487842113f, -0.789344311f) );
+
395  vtx.push_back( Vec3f( 0.573492587f, -0.186338872f, -0.78934437f) );
+
396  vtx.push_back( Vec3f( 0.0f, -0.603005826f, -0.78934443f) );
+
397  vtx.push_back( Vec3f(-0.573492587f, -0.186338872f, -0.78934437f) );
+
398  vtx.push_back( Vec3f(-0.354437858f, 0.487842113f, -0.789344311f) );
+
399  vtx.push_back( Vec3f(-0.573492587f, 0.789345026f, -0.186338797f) );
+
400  vtx.push_back( Vec3f(-0.927930415f, -0.301502913f, -0.186338872f) );
+
401  vtx.push_back( Vec3f( 0.0f, -0.975683928f, -0.186338902f) );
+
402  vtx.push_back( Vec3f( 0.927930415f, -0.301502913f, -0.186338872f) );
+
403  vtx.push_back( Vec3f( 0.573492587f, 0.789345026f, -0.186338797f) );
+
404  vtx.push_back( Vec3f( 0.0f, 0.975683868f, 0.186338902f) );
+
405  vtx.push_back( Vec3f(-0.927930415f, 0.301502913f, 0.186338872f) );
+
406  vtx.push_back( Vec3f(-0.573492587f, -0.789345026f, 0.186338797f) );
+
407  vtx.push_back( Vec3f( 0.573492587f, -0.789345026f, 0.186338797f) );
+
408  vtx.push_back( Vec3f( 0.927930415f, 0.301502913f, 0.186338872f) );
+
409  vtx.push_back( Vec3f( 0.0f, 0.603005826f, 0.78934443f) );
+
410  vtx.push_back( Vec3f( 0.573492587f, 0.186338872f, 0.78934437f) );
+
411  vtx.push_back( Vec3f( 0.354437858f, -0.487842113f, 0.789344311f) );
+
412  vtx.push_back( Vec3f(-0.354437858f, -0.487842113f, 0.789344311f) );
+
413  vtx.push_back( Vec3f(-0.573492587f, 0.186338872f, 0.78934437f) );
+
414 
+
415  qua.push_back( Vec4I(0, 1, 2, 3) );
+
416  tri.push_back( Vec3I(0, 3, 4) );
+
417  qua.push_back( Vec4I(0, 4, 5, 10) );
+
418  tri.push_back( Vec3I(0, 10, 9) );
+
419  qua.push_back( Vec4I(0, 9, 14, 8) );
+
420  tri.push_back( Vec3I(0, 8, 1) );
+
421  qua.push_back( Vec4I(1, 8, 13, 7) );
+
422  tri.push_back( Vec3I(1, 7, 2) );
+
423  qua.push_back( Vec4I(2, 7, 12, 6) );
+
424  tri.push_back( Vec3I(2, 6, 3) );
+
425  qua.push_back( Vec4I(3, 6, 11, 5) );
+
426  tri.push_back( Vec3I(3, 5, 4) );
+
427  qua.push_back( Vec4I(5, 11, 19, 15) );
+
428  tri.push_back( Vec3I(5, 15, 10) );
+
429  qua.push_back( Vec4I(6, 12, 18, 19) );
+
430  tri.push_back( Vec3I(6, 19, 11) );
+
431  qua.push_back( Vec4I(7, 13, 17, 18) );
+
432  tri.push_back( Vec3I(7, 18, 12) );
+
433  qua.push_back( Vec4I(8, 14, 16, 17) );
+
434  tri.push_back( Vec3I(8, 17, 13) );
+
435  qua.push_back( Vec4I(9, 10, 15, 16) );
+
436  tri.push_back( Vec3I(9, 16, 14) );
+
437  qua.push_back( Vec4I(15, 19, 18, 17) );
+
438  tri.push_back( Vec3I(15, 17, 16) );
+
439 
+
440  } else if (faceCount == 20) {// Icosahedron
+
441 
+
442  vtx.push_back( Vec3f(0.0f, 0.0f, -1.0f) );
+
443  vtx.push_back( Vec3f(0.0f, 0.894427359f, -0.447213143f) );
+
444  vtx.push_back( Vec3f(0.850650847f, 0.276393682f, -0.447213203f) );
+
445  vtx.push_back( Vec3f(0.525731206f, -0.723606944f, -0.447213262f) );
+
446  vtx.push_back( Vec3f(-0.525731206f, -0.723606944f, -0.447213262f) );
+
447  vtx.push_back( Vec3f(-0.850650847f, 0.276393682f, -0.447213203f) );
+
448  vtx.push_back( Vec3f(-0.525731206f, 0.723606944f, 0.447213262f) );
+
449  vtx.push_back( Vec3f(-0.850650847f, -0.276393682f, 0.447213203f) );
+
450  vtx.push_back( Vec3f(0.0f, -0.894427359f, 0.447213143f) );
+
451  vtx.push_back( Vec3f(0.850650847f, -0.276393682f, 0.447213203f) );
+
452  vtx.push_back( Vec3f(0.525731206f, 0.723606944f, 0.447213262f) );
+
453  vtx.push_back( Vec3f(0.0f, 0.0f, 1.0f) );
+
454 
+
455  tri.push_back( Vec3I( 2, 0, 1) );
+
456  tri.push_back( Vec3I( 3, 0, 2) );
+
457  tri.push_back( Vec3I( 4, 0, 3) );
+
458  tri.push_back( Vec3I( 5, 0, 4) );
+
459  tri.push_back( Vec3I( 1, 0, 5) );
+
460  tri.push_back( Vec3I( 6, 1, 5) );
+
461  tri.push_back( Vec3I( 7, 5, 4) );
+
462  tri.push_back( Vec3I( 8, 4, 3) );
+
463  tri.push_back( Vec3I( 9, 3, 2) );
+
464  tri.push_back( Vec3I(10, 2, 1) );
+
465  tri.push_back( Vec3I(10, 1, 6) );
+
466  tri.push_back( Vec3I( 6, 5, 7) );
+
467  tri.push_back( Vec3I( 7, 4, 8) );
+
468  tri.push_back( Vec3I( 8, 3, 9) );
+
469  tri.push_back( Vec3I( 9, 2, 10) );
+
470  tri.push_back( Vec3I( 6, 11, 10) );
+
471  tri.push_back( Vec3I(10, 11, 9) );
+
472  tri.push_back( Vec3I( 9, 11, 8) );
+
473  tri.push_back( Vec3I( 8, 11, 7) );
+
474  tri.push_back( Vec3I( 7, 11, 6) );
+
475 
+
476  } else {
+
477  OPENVDB_THROW(RuntimeError, "Invalid face count");
+
478  }
+
479 
+
480  // Apply scale and translation to all the vertices
+
481  for ( size_t i = 0; i<vtx.size(); ++i ) vtx[i] = scale * vtx[i] + center;
+
482 
+
483  return meshToLevelSet<GridType>( *xform, vtx, tri, qua, halfWidth );
+
484 }
+
485 
+
486 } // namespace tools
+
487 } // namespace OPENVDB_VERSION_NAME
+
488 } // namespace openvdb
+
489 
+
490 #endif // OPENVDB_TOOLS_LEVELSETPLATONIC_HAS_BEEN_INCLUDED
+
491 
+
492 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
493 // All rights reserved. This software is distributed under the
+
494 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+ +
math::Vec4< Index32 > Vec4I
Definition: Types.h:90
+ +
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
Definition: Mat.h:146
+
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
+
static const Real LEVEL_SET_HALF_WIDTH
Definition: Types.h:219
+
GridType::Ptr createLevelSetTetrahedron(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH))
Return a grid of type GridType containing a narrow-band level set representation of a tetrahedron...
Definition: LevelSetPlatonic.h:143
+ +
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
GridType::Ptr createLevelSetCube(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH))
Return a grid of type GridType containing a narrow-band level set representation of a cube...
Definition: LevelSetPlatonic.h:187
+
Definition: Exceptions.h:86
+
math::Vec3< Index32 > Vec3I
Definition: Types.h:77
+
Convert polygonal meshes that consist of quads and/or triangles into signed or unsigned distance fiel...
+
Definition: Exceptions.h:39
+
GridType::Ptr createLevelSetOctahedron(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH))
Return a grid of type GridType containing a narrow-band level set representation of an octahedron...
Definition: LevelSetPlatonic.h:231
+
MatType scale(const Vec3< typename MatType::value_type > &s)
Return a matrix that scales by s.
Definition: Mat.h:594
+
GridType::Ptr createLevelSetPlatonic(int faceCount, float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH))
Return a grid of type GridType containing a narrow-band level set representation of a platonic solid...
Definition: LevelSetPlatonic.h:95
+ +
GridType::Ptr createLevelSetIcosahedron(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH))
Return a grid of type GridType containing a narrow-band level set representation of an icosahedron...
Definition: LevelSetPlatonic.h:319
+
math::Vec3< float > Vec3f
Definition: Types.h:78
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
GridType::Ptr createLevelSetDodecahedron(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH))
Return a grid of type GridType containing a narrow-band level set representation of a dodecahedron...
Definition: LevelSetPlatonic.h:275
+
boost::shared_ptr< Transform > Ptr
Definition: Transform.h:69
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetRebuild_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetRebuild_8h_source.html new file mode 100644 index 00000000..47083284 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetRebuild_8h_source.html @@ -0,0 +1,447 @@ + + + + + + +OpenVDB: LevelSetRebuild.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
LevelSetRebuild.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 
+
31 #ifndef OPENVDB_TOOLS_LEVELSETREBUILD_HAS_BEEN_INCLUDED
+
32 #define OPENVDB_TOOLS_LEVELSETREBUILD_HAS_BEEN_INCLUDED
+
33 
+
34 #include <openvdb/Grid.h>
+
35 #include <openvdb/Exceptions.h>
+
36 #include <openvdb/math/Math.h>
+
37 #include <openvdb/math/Transform.h>
+ + + +
41 #include <openvdb/util/Util.h>
+
42 #include <boost/type_traits/is_floating_point.hpp>
+
43 #include <boost/utility/enable_if.hpp>
+
44 #include <tbb/blocked_range.h>
+
45 #include <tbb/parallel_for.h>
+
46 
+
47 
+
48 namespace openvdb {
+ +
50 namespace OPENVDB_VERSION_NAME {
+
51 namespace tools {
+
52 
+
53 
+
69 template<class GridType>
+
70 inline typename GridType::Ptr
+
71 levelSetRebuild(const GridType& grid, float isovalue = 0,
+
72  float halfWidth = float(LEVEL_SET_HALF_WIDTH), const math::Transform* xform = NULL);
+
73 
+
74 
+
89 template<class GridType>
+
90 inline typename GridType::Ptr
+
91 levelSetRebuild(const GridType& grid, float isovalue, float exBandWidth, float inBandWidth,
+
92  const math::Transform* xform = NULL);
+
93 
+
94 
+
110 template<class GridType, typename InterruptT>
+
111 inline typename GridType::Ptr
+
112 levelSetRebuild(const GridType& grid, float isovalue, float exBandWidth, float inBandWidth,
+
113  const math::Transform* xform = NULL, InterruptT* interrupter = NULL);
+
114 
+
115 
+
117 
+
118 
+
119 // Internal utility objects and implementation details
+
120 
+
121 namespace internal {
+
122 
+ +
124 {
+
125 public:
+
126  PointListTransform(const PointList& pointsIn, std::vector<Vec3s>& pointsOut,
+
127  const math::Transform& xform)
+
128  : mPointsIn(pointsIn)
+
129  , mPointsOut(&pointsOut)
+
130  , mXform(xform)
+
131  {
+
132  }
+
133 
+
134  void runParallel()
+
135  {
+
136  tbb::parallel_for(tbb::blocked_range<size_t>(0, mPointsOut->size()), *this);
+
137  }
+
138 
+
139  void runSerial()
+
140  {
+
141  (*this)(tbb::blocked_range<size_t>(0, mPointsOut->size()));
+
142  }
+
143 
+
144  inline void operator()(const tbb::blocked_range<size_t>& range) const
+
145  {
+
146  for (size_t n = range.begin(); n < range.end(); ++n) {
+
147  (*mPointsOut)[n] = Vec3s(mXform.worldToIndex(mPointsIn[n]));
+
148  }
+
149  }
+
150 
+
151 private:
+
152  const PointList& mPointsIn;
+
153  std::vector<Vec3s> * const mPointsOut;
+
154  const math::Transform& mXform;
+
155 };
+
156 
+
157 
+
158 class PrimCpy
+
159 {
+
160 public:
+
161  PrimCpy(const PolygonPoolList& primsIn, const std::vector<size_t>& indexList,
+
162  std::vector<Vec4I>& primsOut)
+
163  : mPrimsIn(primsIn)
+
164  , mIndexList(indexList)
+
165  , mPrimsOut(&primsOut)
+
166  {
+
167  }
+
168 
+
169  void runParallel()
+
170  {
+
171  tbb::parallel_for(tbb::blocked_range<size_t>(0, mIndexList.size()), *this);
+
172  }
+
173 
+
174  void runSerial()
+
175  {
+
176  (*this)(tbb::blocked_range<size_t>(0, mIndexList.size()));
+
177  }
+
178 
+
179  inline void operator()(const tbb::blocked_range<size_t>& range) const
+
180  {
+
181  openvdb::Vec4I quad;
+
182  quad[3] = openvdb::util::INVALID_IDX;
+
183  std::vector<Vec4I>& primsOut = *mPrimsOut;
+
184 
+
185  for (size_t n = range.begin(); n < range.end(); ++n) {
+
186  size_t index = mIndexList[n];
+
187  PolygonPool& polygons = mPrimsIn[n];
+
188 
+
189  // Copy quads
+
190  for (size_t i = 0, I = polygons.numQuads(); i < I; ++i) {
+
191  primsOut[index++] = polygons.quad(i);
+
192  }
+
193  polygons.clearQuads();
+
194 
+
195  // Copy triangles (adaptive mesh)
+
196  for (size_t i = 0, I = polygons.numTriangles(); i < I; ++i) {
+
197  const openvdb::Vec3I& triangle = polygons.triangle(i);
+
198  quad[0] = triangle[0];
+
199  quad[1] = triangle[1];
+
200  quad[2] = triangle[2];
+
201  primsOut[index++] = quad;
+
202  }
+
203 
+
204  polygons.clearTriangles();
+
205  }
+
206  }
+
207 
+
208 private:
+
209  const PolygonPoolList& mPrimsIn;
+
210  const std::vector<size_t>& mIndexList;
+
211  std::vector<Vec4I> * const mPrimsOut;
+
212 };
+
213 
+
214 } // namespace internal
+
215 
+
216 
+
218 
+
219 
+
226 template<class GridType, typename InterruptT>
+
227 inline typename boost::enable_if<boost::is_floating_point<typename GridType::ValueType>,
+
228 typename GridType::Ptr>::type
+
229 doLevelSetRebuild(const GridType& grid, typename GridType::ValueType iso,
+
230  typename GridType::ValueType exWidth, typename GridType::ValueType inWidth,
+
231  const math::Transform* xform, InterruptT* interrupter)
+
232 {
+
233  const float
+
234  isovalue = float(iso),
+
235  exBandWidth = float(exWidth),
+
236  inBandWidth = float(inWidth);
+
237 
+
238  tools::VolumeToMesh mesher(isovalue);
+
239  mesher(grid);
+
240 
+
241  math::Transform::Ptr transform = (xform != NULL) ? xform->copy() : grid.transform().copy();
+
242 
+
243  std::vector<Vec3s> points(mesher.pointListSize());
+
244 
+
245  { // Copy and transform (required for MeshToVolume) points to grid space.
+
246  internal::PointListTransform ptnXForm(mesher.pointList(), points, *transform);
+
247  ptnXForm.runParallel();
+
248  mesher.pointList().reset(NULL);
+
249  }
+
250 
+
251  std::vector<Vec4I> primitives;
+
252 
+
253  { // Copy primitives.
+
254  PolygonPoolList& polygonPoolList = mesher.polygonPoolList();
+
255 
+
256  size_t numPrimitives = 0;
+
257  std::vector<size_t> indexlist(mesher.polygonPoolListSize());
+
258 
+
259  for (size_t n = 0, N = mesher.polygonPoolListSize(); n < N; ++n) {
+
260  const openvdb::tools::PolygonPool& polygons = polygonPoolList[n];
+
261  indexlist[n] = numPrimitives;
+
262  numPrimitives += polygons.numQuads();
+
263  numPrimitives += polygons.numTriangles();
+
264  }
+
265 
+
266  primitives.resize(numPrimitives);
+
267  internal::PrimCpy primCpy(polygonPoolList, indexlist, primitives);
+
268  primCpy.runParallel();
+
269  }
+
270 
+
271  QuadAndTriangleDataAdapter<Vec3s, Vec4I> mesh(points, primitives);
+
272 
+
273  if (interrupter) {
+
274  return meshToVolume<GridType>(*interrupter, mesh, *transform, exBandWidth, inBandWidth,
+ +
276  }
+
277 
+
278  return meshToVolume<GridType>(mesh, *transform, exBandWidth, inBandWidth,
+ +
280 }
+
281 
+
282 
+
285 template<class GridType, typename InterruptT>
+
286 inline typename boost::disable_if<boost::is_floating_point<typename GridType::ValueType>,
+
287 typename GridType::Ptr>::type
+
288 doLevelSetRebuild(const GridType&, typename GridType::ValueType /*isovalue*/,
+
289  typename GridType::ValueType /*exWidth*/, typename GridType::ValueType /*inWidth*/,
+
290  const math::Transform*, InterruptT*)
+
291 {
+ +
293  "level set rebuild is supported only for scalar, floating-point grids");
+
294 }
+
295 
+
296 
+
298 
+
299 
+
300 template<class GridType, typename InterruptT>
+
301 inline typename GridType::Ptr
+
302 levelSetRebuild(const GridType& grid, float iso, float exWidth, float inWidth,
+
303  const math::Transform* xform, InterruptT* interrupter)
+
304 {
+
305  typedef typename GridType::ValueType ValueT;
+
306  ValueT
+
307  isovalue(zeroVal<ValueT>() + ValueT(iso)),
+
308  exBandWidth(zeroVal<ValueT>() + ValueT(exWidth)),
+
309  inBandWidth(zeroVal<ValueT>() + ValueT(inWidth));
+
310 
+
311  return doLevelSetRebuild(grid, isovalue, exBandWidth, inBandWidth, xform, interrupter);
+
312 }
+
313 
+
314 
+
315 template<class GridType>
+
316 inline typename GridType::Ptr
+
317 levelSetRebuild(const GridType& grid, float iso, float exWidth, float inWidth,
+
318  const math::Transform* xform)
+
319 {
+
320  typedef typename GridType::ValueType ValueT;
+
321  ValueT
+
322  isovalue(zeroVal<ValueT>() + ValueT(iso)),
+
323  exBandWidth(zeroVal<ValueT>() + ValueT(exWidth)),
+
324  inBandWidth(zeroVal<ValueT>() + ValueT(inWidth));
+
325 
+
326  return doLevelSetRebuild<GridType, util::NullInterrupter>(
+
327  grid, isovalue, exBandWidth, inBandWidth, xform, NULL);
+
328 }
+
329 
+
330 
+
331 template<class GridType>
+
332 inline typename GridType::Ptr
+
333 levelSetRebuild(const GridType& grid, float iso, float halfVal, const math::Transform* xform)
+
334 {
+
335  typedef typename GridType::ValueType ValueT;
+
336  ValueT
+
337  isovalue(zeroVal<ValueT>() + ValueT(iso)),
+
338  halfWidth(zeroVal<ValueT>() + ValueT(halfVal));
+
339 
+
340  return doLevelSetRebuild<GridType, util::NullInterrupter>(
+
341  grid, isovalue, halfWidth, halfWidth, xform, NULL);
+
342 }
+
343 
+
344 
+
345 } // namespace tools
+
346 } // namespace OPENVDB_VERSION_NAME
+
347 } // namespace openvdb
+
348 
+
349 #endif // OPENVDB_TOOLS_LEVELSETREBUILD_HAS_BEEN_INCLUDED
+
350 
+
351 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
352 // All rights reserved. This software is distributed under the
+
353 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+ +
OPENVDB_API const Index32 INVALID_IDX
+
void runParallel()
Definition: LevelSetRebuild.h:134
+
boost::disable_if< boost::is_floating_point< typename GridType::ValueType >, typename GridType::Ptr >::type doLevelSetRebuild(const GridType &, typename GridType::ValueType, typename GridType::ValueType, typename GridType::ValueType, const math::Transform *, InterruptT *)
Definition: LevelSetRebuild.h:288
+
Vec3< float > Vec3s
Definition: Vec3.h:650
+
PointList & pointList()
Definition: VolumeToMesh.h:3934
+ +
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
Mesh any scalar grid that has a continuous isosurface.
Definition: VolumeToMesh.h:183
+
Definition: Mat.h:146
+
openvdb::Vec4I & quad(size_t n)
Definition: VolumeToMesh.h:136
+
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
+
static const Real LEVEL_SET_HALF_WIDTH
Definition: Types.h:219
+
GridType::Ptr levelSetRebuild(const GridType &grid, float isovalue, float exBandWidth, float inBandWidth, const math::Transform *xform=NULL, InterruptT *interrupter=NULL)
Return a new grid of type GridType that contains a narrow-band level set representation of an isosurf...
Definition: LevelSetRebuild.h:302
+
PolygonPoolList & polygonPoolList()
Definition: VolumeToMesh.h:3948
+
openvdb::Vec3I & triangle(size_t n)
Definition: VolumeToMesh.h:142
+ +
const size_t & numTriangles() const
Definition: VolumeToMesh.h:140
+
Collection of quads and triangles.
Definition: VolumeToMesh.h:115
+
void runSerial()
Definition: LevelSetRebuild.h:139
+
PrimCpy(const PolygonPoolList &primsIn, const std::vector< size_t > &indexList, std::vector< Vec4I > &primsOut)
Definition: LevelSetRebuild.h:161
+
Ptr copy() const
Definition: Transform.h:77
+ + +
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
boost::scoped_array< openvdb::Vec3s > PointList
Point and primitive list types.
Definition: VolumeToMesh.h:174
+
Calculate an axis-aligned bounding box in index space from a bounding sphere in world space...
Definition: Transform.h:66
+
Convert polygonal meshes that consist of quads and/or triangles into signed or unsigned distance fiel...
+
const size_t & polygonPoolListSize() const
Definition: VolumeToMesh.h:3962
+ +
Definition: Exceptions.h:39
+
void runSerial()
Definition: LevelSetRebuild.h:174
+
const size_t & numQuads() const
Definition: VolumeToMesh.h:134
+ +
PointListTransform(const PointList &pointsIn, std::vector< Vec3s > &pointsOut, const math::Transform &xform)
Definition: LevelSetRebuild.h:126
+
Definition: Exceptions.h:87
+
void operator()(const tbb::blocked_range< size_t > &range) const
Definition: LevelSetRebuild.h:179
+
void operator()(const tbb::blocked_range< size_t > &range) const
Definition: LevelSetRebuild.h:144
+
void runParallel()
Definition: LevelSetRebuild.h:169
+ +
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
const size_t & pointListSize() const
Definition: VolumeToMesh.h:3941
+
Definition: LevelSetRebuild.h:158
+
Contiguous quad and triangle data adapter class.
Definition: MeshToVolume.h:190
+
boost::scoped_array< PolygonPool > PolygonPoolList
Point and primitive list types.
Definition: VolumeToMesh.h:175
+
boost::shared_ptr< Transform > Ptr
Definition: Transform.h:69
+
Definition: Mat4.h:51
+
void clearQuads()
Definition: VolumeToMesh.h:3822
+
void clearTriangles()
Definition: VolumeToMesh.h:3840
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetSphere_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetSphere_8h_source.html new file mode 100644 index 00000000..8e46ad87 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetSphere_8h_source.html @@ -0,0 +1,292 @@ + + + + + + +OpenVDB: LevelSetSphere.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
LevelSetSphere.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
38 
+
39 #ifndef OPENVDB_TOOLS_LEVELSETSPHERE_HAS_BEEN_INCLUDED
+
40 #define OPENVDB_TOOLS_LEVELSETSPHERE_HAS_BEEN_INCLUDED
+
41 
+
42 #include <openvdb/Grid.h>
+
43 #include <openvdb/Types.h>
+
44 #include <openvdb/math/Math.h>
+ +
46 #include <boost/utility.hpp>
+
47 #include <boost/type_traits/is_floating_point.hpp>
+
48 #include "SignedFloodFill.h"
+
49 
+
50 namespace openvdb {
+ +
52 namespace OPENVDB_VERSION_NAME {
+
53 namespace tools {
+
54 
+
68 template<typename GridType, typename InterruptT>
+
69 typename GridType::Ptr
+
70 createLevelSetSphere(float radius, const openvdb::Vec3f& center, float voxelSize,
+
71  float halfWidth = float(LEVEL_SET_HALF_WIDTH), InterruptT* interrupt = NULL);
+
72 
+
85 template<typename GridType>
+
86 typename GridType::Ptr
+
87 createLevelSetSphere(float radius, const openvdb::Vec3f& center, float voxelSize,
+
88  float halfWidth = float(LEVEL_SET_HALF_WIDTH))
+
89 {
+
90  return createLevelSetSphere<GridType, util::NullInterrupter>(radius,center,voxelSize,halfWidth);
+
91 }
+
92 
+
93 
+
95 
+
96 
+
103 template<typename GridT, typename InterruptT = util::NullInterrupter>
+ +
105 {
+
106 public:
+
107  typedef typename GridT::ValueType ValueT;
+
108  typedef typename math::Vec3<ValueT> Vec3T;
+
109  BOOST_STATIC_ASSERT(boost::is_floating_point<ValueT>::value);
+
110 
+
121  LevelSetSphere(ValueT radius, const Vec3T &center, InterruptT* interrupt = NULL)
+
122  : mRadius(radius), mCenter(center), mInterrupt(interrupt)
+
123  {
+
124  if (mRadius<=0) OPENVDB_THROW(ValueError, "radius must be positive");
+
125  }
+
126 
+
131  typename GridT::Ptr getLevelSet(ValueT voxelSize, ValueT halfWidth)
+
132  {
+
133  mGrid = createLevelSet<GridT>(voxelSize, halfWidth);
+
134  this->rasterSphere(voxelSize, halfWidth);
+
135  mGrid->setGridClass(GRID_LEVEL_SET);
+
136  return mGrid;
+
137  }
+
138 
+
139 private:
+
140  void rasterSphere(ValueT dx, ValueT w)
+
141  {
+
142  if (!(dx>0.0f)) OPENVDB_THROW(ValueError, "voxel size must be positive");
+
143  if (!(w>1)) OPENVDB_THROW(ValueError, "half-width must be larger than one");
+
144 
+
145  // Define radius of sphere and narrow-band in voxel units
+
146  const ValueT r0 = mRadius/dx, rmax = r0 + w;
+
147 
+
148  // Radius below the Nyquist frequency
+
149  if (r0 < 1.5f) return;
+
150 
+
151  // Define center of sphere in voxel units
+
152  const Vec3T c(mCenter[0]/dx, mCenter[1]/dx, mCenter[2]/dx);
+
153 
+
154  // Define index coordinates and their respective bounds
+
155  openvdb::Coord ijk;
+
156  int &i = ijk[0], &j = ijk[1], &k = ijk[2], m=1;
+
157  const int imin=math::Floor(c[0]-rmax), imax=math::Ceil(c[0]+rmax);
+
158  const int jmin=math::Floor(c[1]-rmax), jmax=math::Ceil(c[1]+rmax);
+
159  const int kmin=math::Floor(c[2]-rmax), kmax=math::Ceil(c[2]+rmax);
+
160 
+
161  // Allocate a ValueAccessor for accelerated random access
+
162  typename GridT::Accessor accessor = mGrid->getAccessor();
+
163 
+
164  if (mInterrupt) mInterrupt->start("Generating level set of sphere");
+
165  // Compute signed distances to sphere using leapfrogging in k
+
166  for ( i = imin; i <= imax; ++i ) {
+
167  if (util::wasInterrupted(mInterrupt)) return;
+
168  const float x2 = math::Pow2(i - c[0]);
+
169  for ( j = jmin; j <= jmax; ++j ) {
+
170  const float x2y2 = math::Pow2(j - c[1]) + x2;
+
171  for (k=kmin; k<=kmax; k += m) {
+
172  m = 1;
+
174  const float v = math::Sqrt(x2y2 + math::Pow2(k-c[2]))-r0,
+
175  d = math::Abs(v);
+
176  if ( d < w ){ // inside narrow band
+
177  accessor.setValue(ijk, dx*v);// distance in world units
+
178  } else {// outside narrow band
+
179  m += math::Floor(d-w);// leapfrog
+
180  }
+
181  }//end leapfrog over k
+
182  }//end loop over j
+
183  }//end loop over i
+
184 
+
185  // Define consistent signed distances outside the narrow-band
+
186  tools::signedFloodFill(mGrid->tree());
+
187 
+
188  if (mInterrupt) mInterrupt->end();
+
189  }
+
190 
+
191  const ValueT mRadius;
+
192  const Vec3T mCenter;
+
193  InterruptT* mInterrupt;
+
194  typename GridT::Ptr mGrid;
+
195 };// LevelSetSphere
+
196 
+
197 
+
199 
+
200 
+
201 template<typename GridType, typename InterruptT>
+
202 typename GridType::Ptr
+
203 createLevelSetSphere(float radius, const openvdb::Vec3f& center, float voxelSize,
+
204  float halfWidth, InterruptT* interrupt)
+
205 {
+
206  // GridType::ValueType is required to be a floating-point scalar.
+
207  BOOST_STATIC_ASSERT(boost::is_floating_point<typename GridType::ValueType>::value);
+
208 
+
209  typedef typename GridType::ValueType ValueT;
+
210  LevelSetSphere<GridType, InterruptT> factory(ValueT(radius), center, interrupt);
+
211  return factory.getLevelSet(ValueT(voxelSize), ValueT(halfWidth));
+
212 }
+
213 
+
214 } // namespace tools
+
215 } // namespace OPENVDB_VERSION_NAME
+
216 } // namespace openvdb
+
217 
+
218 #endif // OPENVDB_TOOLS_LEVELSETSPHERE_HAS_BEEN_INCLUDED
+
219 
+
220 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
221 // All rights reserved. This software is distributed under the
+
222 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
math::Vec3< ValueT > Vec3T
Definition: LevelSetSphere.h:108
+
void signedFloodFill(TreeOrLeafManagerT &tree, bool threaded=true, size_t grainSize=1, Index minLevel=0)
Set the values of all inactive voxels and tiles of a narrow-band level set from the signs of the acti...
Definition: SignedFloodFill.h:294
+ + +
LevelSetSphere(ValueT radius, const Vec3T &center, InterruptT *interrupt=NULL)
Constructor.
Definition: LevelSetSphere.h:121
+
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
float Sqrt(float x)
Return the square root of a floating-point value.
Definition: Math.h:709
+
Definition: Mat.h:146
+
Type Pow2(Type x)
Return .
Definition: Math.h:514
+
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
+
static const Real LEVEL_SET_HALF_WIDTH
Definition: Types.h:219
+
int Ceil(float x)
Return the ceiling of x.
Definition: Math.h:804
+
Generates a signed distance field (or narrow band level set) to a single sphere.
Definition: LevelSetSphere.h:104
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
GridT::Ptr getLevelSet(ValueT voxelSize, ValueT halfWidth)
Definition: LevelSetSphere.h:131
+
Propagates the sign of distance values from the active voxels in the narrow band to the inactive valu...
+
Definition: Exceptions.h:39
+
GridT::ValueType ValueT
Definition: LevelSetSphere.h:107
+
int Floor(float x)
Return the floor of x.
Definition: Math.h:796
+ +
Definition: Exceptions.h:88
+
GridType::Ptr createLevelSetSphere(float radius, const openvdb::Vec3f &center, float voxelSize, float halfWidth=float(LEVEL_SET_HALF_WIDTH))
Return a grid of type GridType containing a narrow-band level set representation of a sphere...
Definition: LevelSetSphere.h:87
+
int32_t Abs(int32_t i)
Return the absolute value of the given quantity.
Definition: Math.h:293
+
Definition: Types.h:213
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
bool wasInterrupted(T *i, int percent=-1)
Definition: NullInterrupter.h:76
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetTracker_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetTracker_8h_source.html new file mode 100644 index 00000000..0b6bb20d --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetTracker_8h_source.html @@ -0,0 +1,786 @@ + + + + + + +OpenVDB: LevelSetTracker.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
LevelSetTracker.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
38 
+
39 #ifndef OPENVDB_TOOLS_LEVEL_SET_TRACKER_HAS_BEEN_INCLUDED
+
40 #define OPENVDB_TOOLS_LEVEL_SET_TRACKER_HAS_BEEN_INCLUDED
+
41 
+
42 #include <tbb/parallel_for.h>
+
43 #include <boost/bind.hpp>
+
44 #include <boost/function.hpp>
+
45 #include <boost/type_traits/is_floating_point.hpp>
+
46 #include <openvdb/Types.h>
+
47 #include <openvdb/math/Math.h>
+ +
49 #include <openvdb/math/Operators.h>
+
50 #include <openvdb/math/Stencils.h>
+
51 #include <openvdb/math/Transform.h>
+
52 #include <openvdb/Grid.h>
+ + + +
56 #include "ChangeBackground.h"// for changeLevelSetBackground
+
57 #include "Morphology.h"//for dilateActiveValues
+
58 #include "Prune.h"// for pruneLevelSet
+
59 
+
60 namespace openvdb {
+ +
62 namespace OPENVDB_VERSION_NAME {
+
63 namespace tools {
+
64 
+
66 template<typename GridT, typename InterruptT = util::NullInterrupter>
+ +
68 {
+
69 public:
+
70  typedef GridT GridType;
+
71  typedef typename GridT::TreeType TreeType;
+
72  typedef typename TreeType::LeafNodeType LeafType;
+
73  typedef typename TreeType::ValueType ValueType;
+
74  typedef typename tree::LeafManager<TreeType> LeafManagerType; // leafs + buffers
+ + +
77  typedef typename TreeType::template ValueConverter<ValueMask>::Type MaskTreeType;
+
78  BOOST_STATIC_ASSERT(boost::is_floating_point<ValueType>::value);
+
79 
+
81  struct State {
+ + +
84  int n = static_cast<int>(LEVEL_SET_HALF_WIDTH), int g = 1)
+
85  : spatialScheme(s), temporalScheme(t), normCount(n), grainSize(g) {}
+ + +
88  int normCount;// Number of iterations of normalization
+
89  int grainSize;
+
90  };
+
91 
+
94  LevelSetTracker(GridT& grid, InterruptT* interrupt = NULL);
+
95 
+
96  virtual ~LevelSetTracker() { delete mLeafs; }
+
97 
+
100  template <typename MaskType>
+
101  void normalize(const MaskType* mask);
+
102 
+
104  void normalize() { this->normalize<MaskTreeType>(NULL); }
+
105 
+
108  void track();
+
109 
+
111  void prune();
+
112 
+
128  void dilate(int iterations = 1);
+
129 
+
132  void erode(int iterations = 1);
+
133 
+
136  bool resize(Index halfWidth = static_cast<Index>(LEVEL_SET_HALF_WIDTH));
+
137 
+
139  ValueType getHalfWidth() const { return mGrid->background()/mDx; }
+
140 
+
142  State getState() const { return mState; }
+
143 
+
145  void setState(const State& s) { mState =s; }
+
146 
+
148  math::BiasedGradientScheme getSpatialScheme() const { return mState.spatialScheme; }
+
149 
+
151  void setSpatialScheme(math::BiasedGradientScheme scheme) { mState.spatialScheme = scheme; }
+
152 
+
154  math::TemporalIntegrationScheme getTemporalScheme() const { return mState.temporalScheme; }
+
155 
+
157  void setTemporalScheme(math::TemporalIntegrationScheme scheme) { mState.temporalScheme = scheme;}
+
158 
+
161  int getNormCount() const { return mState.normCount; }
+
162 
+
165  void setNormCount(int n) { mState.normCount = n; }
+
166 
+
168  int getGrainSize() const { return mState.grainSize; }
+
169 
+
172  void setGrainSize(int grainsize) { mState.grainSize = grainsize; }
+
173 
+
174  ValueType voxelSize() const { return mDx; }
+
175 
+
176  void startInterrupter(const char* msg);
+
177 
+
178  void endInterrupter();
+
179 
+
181  bool checkInterrupter();
+
182 
+
183  const GridType& grid() const { return *mGrid; }
+
184 
+
185  LeafManagerType& leafs() { return *mLeafs; }
+
186 
+
187  const LeafManagerType& leafs() const { return *mLeafs; }
+
188 
+
189 private:
+
190 
+
191  // disallow copy construction and copy by assignment!
+
192  LevelSetTracker(const LevelSetTracker&);// not implemented
+
193  LevelSetTracker& operator=(const LevelSetTracker&);// not implemented
+
194 
+
195  // Private class to perform multi-threaded trimming of
+
196  // voxels that are too far away from the zero-crossing.
+
197  struct Trim
+
198  {
+
199  Trim(LevelSetTracker& tracker) : mTracker(tracker) {}
+
200  void trim();
+
201  void operator()(const LeafRange& r) const;
+
202  LevelSetTracker& mTracker;
+
203  };// Trim
+
204 
+
205  // Private struct to perform multi-threaded normalization
+
206  template<math::BiasedGradientScheme SpatialScheme,
+
207  math::TemporalIntegrationScheme TemporalScheme,
+
208  typename MaskT>
+
209  struct Normalizer
+
210  {
+
211  typedef math::BIAS_SCHEME<SpatialScheme> SchemeT;
+
212  typedef typename SchemeT::template ISStencil<GridType>::StencilType StencilT;
+
213  typedef typename MaskT::LeafNodeType MaskLeafT;
+
214  typedef typename MaskLeafT::ValueOnCIter MaskIterT;
+
215  typedef typename LeafType::ValueOnCIter VoxelIterT;
+
216  Normalizer(LevelSetTracker& tracker, const MaskT* mask);
+
217  void normalize();
+
218  void operator()(const LeafRange& r) const {mTask(const_cast<Normalizer*>(this), r);}
+
219  void cook(const char* msg, int swapBuffer=0);
+
220  template <int Nominator, int Denominator>
+
221  void euler(const LeafRange& range, Index phiBuffer, Index resultBuffer);
+
222  inline void euler01(const LeafRange& r) {this->euler<0,1>(r, 0, 1);}
+
223  inline void euler12(const LeafRange& r) {this->euler<1,2>(r, 1, 1);}
+
224  inline void euler34(const LeafRange& r) {this->euler<3,4>(r, 1, 2);}
+
225  inline void euler13(const LeafRange& r) {this->euler<1,3>(r, 1, 2);}
+
226  template <int Nominator, int Denominator>
+
227  void eval(StencilT& stencil, const ValueType* phi, ValueType* result, Index n) const;
+
228  LevelSetTracker& mTracker;
+
229  const MaskT* mMask;
+
230  const ValueType mDt, mInvDx;
+
231  typename boost::function<void (Normalizer*, const LeafRange&)> mTask;
+
232  }; // Normalizer struct
+
233 
+
234  template<math::BiasedGradientScheme SpatialScheme, typename MaskT>
+
235  void normalize1(const MaskT* mask);
+
236 
+
237  template<math::BiasedGradientScheme SpatialScheme,
+
238  math::TemporalIntegrationScheme TemporalScheme, typename MaskT>
+
239  void normalize2(const MaskT* mask);
+
240 
+
241  // Throughout the methods below mLeafs is always assumed to contain
+
242  // a list of the current LeafNodes! The auxiliary buffers on the
+
243  // other hand always have to be allocated locally, since some
+
244  // methods need them and others don't!
+
245  GridType* mGrid;
+
246  LeafManagerType* mLeafs;
+
247  InterruptT* mInterrupter;
+
248  const ValueType mDx;
+
249  State mState;
+
250 }; // end of LevelSetTracker class
+
251 
+
252 template<typename GridT, typename InterruptT>
+
253 LevelSetTracker<GridT, InterruptT>::
+
254 LevelSetTracker(GridT& grid, InterruptT* interrupt):
+
255  mGrid(&grid),
+
256  mLeafs(new LeafManagerType(grid.tree())),
+
257  mInterrupter(interrupt),
+
258  mDx(static_cast<ValueType>(grid.voxelSize()[0])),
+
259  mState()
+
260 {
+
261  if ( !grid.hasUniformVoxels() ) {
+ +
263  "The transform must have uniform scale for the LevelSetTracker to function");
+
264  }
+
265  if ( grid.getGridClass() != GRID_LEVEL_SET) {
+ +
267  "LevelSetTracker expected a level set, got a grid of class \""
+
268  + grid.gridClassToString(grid.getGridClass())
+
269  + "\" [hint: Grid::setGridClass(openvdb::GRID_LEVEL_SET)]");
+
270  }
+
271 }
+
272 
+
273 template<typename GridT, typename InterruptT>
+
274 inline void
+ + +
277 {
+
278  this->startInterrupter("Pruning Level Set");
+
279 
+
280  // Prune voxels that are too far away from the zero-crossing
+
281  Trim t(*this);
+
282  t.trim();
+
283 
+
284  // Remove inactive nodes from tree
+
285  tools::pruneLevelSet(mGrid->tree());
+
286 
+
287  // The tree topology has changes so rebuild the list of leafs
+
288  mLeafs->rebuildLeafArray();
+
289  this->endInterrupter();
+
290 }
+
291 
+
292 template<typename GridT, typename InterruptT>
+
293 inline void
+ + +
296 {
+
297  // Dilate narrow-band (this also rebuilds the leaf array!)
+ +
299 
+
300  // Compute signed distances in dilated narrow-band
+
301  this->normalize();
+
302 
+
303  // Remove voxels that are outside the narrow band
+
304  this->prune();
+
305 }
+
306 
+
307 template<typename GridT, typename InterruptT>
+
308 inline void
+ +
310 dilate(int iterations)
+
311 {
+
312  if (this->getNormCount() == 0) {
+
313  for (int i=0; i < iterations; ++i) {
+ +
315  tools::changeLevelSetBackground(this->leafs(), mDx + mGrid->background());
+
316  }
+
317  } else {
+
318  for (int i=0; i < iterations; ++i) {
+
319  MaskTreeType mask0(mGrid->tree(), false, TopologyCopy());
+ +
321  tools::changeLevelSetBackground(this->leafs(), mDx + mGrid->background());
+
322  MaskTreeType mask(mGrid->tree(), false, TopologyCopy());
+
323  mask.topologyDifference(mask0);
+
324  this->normalize(&mask);
+
325  }
+
326  }
+
327 }
+
328 
+
329 template<typename GridT, typename InterruptT>
+
330 inline void
+ +
332 erode(int iterations)
+
333 {
+
334  tools::erodeVoxels(*mLeafs, iterations);
+
335  mLeafs->rebuildLeafArray();
+
336  const ValueType background = mGrid->background() - iterations*mDx;
+
337  tools::changeLevelSetBackground(this->leafs(), background);
+
338 }
+
339 
+
340 template<typename GridT, typename InterruptT>
+
341 inline bool
+ +
343 resize(Index halfWidth)
+
344 {
+
345  const int wOld = static_cast<int>(math::RoundDown(this->getHalfWidth()));
+
346  const int wNew = static_cast<int>(halfWidth);
+
347  if (wOld < wNew) {
+
348  this->dilate(wNew - wOld);
+
349  } else if (wOld > wNew) {
+
350  this->erode(wOld - wNew);
+
351  }
+
352  return wOld != wNew;
+
353 }
+
354 
+
355 template<typename GridT, typename InterruptT>
+
356 inline void
+ +
358 startInterrupter(const char* msg)
+
359 {
+
360  if (mInterrupter) mInterrupter->start(msg);
+
361 }
+
362 
+
363 template<typename GridT, typename InterruptT>
+
364 inline void
+ + +
367 {
+
368  if (mInterrupter) mInterrupter->end();
+
369 }
+
370 
+
371 template<typename GridT, typename InterruptT>
+
372 inline bool
+ + +
375 {
+
376  if (util::wasInterrupted(mInterrupter)) {
+
377  tbb::task::self().cancel_group_execution();
+
378  return false;
+
379  }
+
380  return true;
+
381 }
+
382 
+
383 template<typename GridT, typename InterruptT>
+
384 template<typename MaskT>
+
385 inline void
+ +
387 normalize(const MaskT* mask)
+
388 {
+
389  switch (this->getSpatialScheme()) {
+
390  case math::FIRST_BIAS:
+
391  this->normalize1<math::FIRST_BIAS , MaskT>(mask); break;
+
392  case math::SECOND_BIAS:
+
393  this->normalize1<math::SECOND_BIAS, MaskT>(mask); break;
+
394  case math::THIRD_BIAS:
+
395  this->normalize1<math::THIRD_BIAS, MaskT>(mask); break;
+
396  case math::WENO5_BIAS:
+
397  this->normalize1<math::WENO5_BIAS, MaskT>(mask); break;
+
398  case math::HJWENO5_BIAS:
+
399  this->normalize1<math::HJWENO5_BIAS, MaskT>(mask); break;
+
400  default:
+
401  OPENVDB_THROW(ValueError, "Spatial difference scheme not supported!");
+
402  }
+
403 }
+
404 
+
405 template<typename GridT, typename InterruptT>
+
406 template<math::BiasedGradientScheme SpatialScheme, typename MaskT>
+
407 inline void
+ +
409 normalize1(const MaskT* mask)
+
410 {
+
411  switch (this->getTemporalScheme()) {
+
412  case math::TVD_RK1:
+
413  this->normalize2<SpatialScheme, math::TVD_RK1, MaskT>(mask); break;
+
414  case math::TVD_RK2:
+
415  this->normalize2<SpatialScheme, math::TVD_RK2, MaskT>(mask); break;
+
416  case math::TVD_RK3:
+
417  this->normalize2<SpatialScheme, math::TVD_RK3, MaskT>(mask); break;
+
418  default:
+
419  OPENVDB_THROW(ValueError, "Temporal integration scheme not supported!");
+
420  }
+
421 }
+
422 
+
423 template<typename GridT, typename InterruptT>
+
424 template<math::BiasedGradientScheme SpatialScheme,
+
425  math::TemporalIntegrationScheme TemporalScheme,
+
426  typename MaskT>
+
427 inline void
+
428 LevelSetTracker<GridT, InterruptT>::
+
429 normalize2(const MaskT* mask)
+
430 {
+
431  Normalizer<SpatialScheme, TemporalScheme, MaskT> tmp(*this, mask);
+
432  tmp.normalize();
+
433 }
+
434 
+
436 
+
437 template<typename GridT, typename InterruptT>
+
438 inline void
+
439 LevelSetTracker<GridT, InterruptT>::
+
440 Trim::trim()
+
441 {
+
442  const int grainSize = mTracker.getGrainSize();
+
443  const LeafRange range = mTracker.leafs().leafRange(grainSize);
+
444 
+
445  if (grainSize>0) {
+
446  tbb::parallel_for(range, *this);
+
447  } else {
+
448  (*this)(range);
+
449  }
+
450 }
+
451 
+
453 template<typename GridT, typename InterruptT>
+
454 inline void
+
455 LevelSetTracker<GridT, InterruptT>::
+
456 Trim::operator()(const LeafRange& range) const
+
457 {
+
458  typedef typename LeafType::ValueOnIter VoxelIterT;
+
459  mTracker.checkInterrupter();
+
460  const ValueType gamma = mTracker.mGrid->background();
+
461 
+
462  for (typename LeafRange::Iterator leafIter = range.begin(); leafIter; ++leafIter) {
+
463  LeafType &leaf = *leafIter;
+
464  for (VoxelIterT iter = leaf.beginValueOn(); iter; ++iter) {
+
465  const ValueType val = *iter;
+
466  if (val <= -gamma)
+
467  leaf.setValueOff(iter.pos(), -gamma);
+
468  else if (val >= gamma)
+
469  leaf.setValueOff(iter.pos(), gamma);
+
470  }
+
471  }
+
472 }
+
473 
+
475 
+
476 template<typename GridT, typename InterruptT>
+
477 template<math::BiasedGradientScheme SpatialScheme,
+
478  math::TemporalIntegrationScheme TemporalScheme,
+
479  typename MaskT>
+
480 inline
+
481 LevelSetTracker<GridT, InterruptT>::
+
482 Normalizer<SpatialScheme, TemporalScheme, MaskT>::
+
483 Normalizer(LevelSetTracker& tracker, const MaskT* mask)
+
484  : mTracker(tracker)
+
485  , mMask(mask)
+
486  , mDt(tracker.voxelSize()*(TemporalScheme == math::TVD_RK1 ? 0.3f :
+
487  TemporalScheme == math::TVD_RK2 ? 0.9f : 1.0f))
+
488  , mInvDx(1.0f/tracker.voxelSize())
+
489  , mTask(0)
+
490 {
+
491 }
+
492 
+
493 template<typename GridT, typename InterruptT>
+
494 template<math::BiasedGradientScheme SpatialScheme,
+
495  math::TemporalIntegrationScheme TemporalScheme,
+
496  typename MaskT>
+
497 inline void
+ + +
500 normalize()
+
501 {
+
503  mTracker.mLeafs->rebuildAuxBuffers(TemporalScheme == math::TVD_RK3 ? 2 : 1);
+
504 
+
505  for (int n=0, e=mTracker.getNormCount(); n < e; ++n) {
+
506 
+ +
508  switch(TemporalScheme) {//switch is resolved at compile-time
+
509  case math::TVD_RK1:
+
510  // Perform one explicit Euler step: t1 = t0 + dt
+
511  // Phi_t1(0) = Phi_t0(0) - dt * VdotG_t0(1)
+
512  mTask = boost::bind(&Normalizer::euler01, _1, _2);
+
513 
+
514  // Cook and swap buffer 0 and 1 such that Phi_t1(0) and Phi_t0(1)
+
515  this->cook("Normalizing level set using TVD_RK1", 1);
+
516  break;
+
517  case math::TVD_RK2:
+
518  // Perform one explicit Euler step: t1 = t0 + dt
+
519  // Phi_t1(1) = Phi_t0(0) - dt * VdotG_t0(1)
+
520  mTask = boost::bind(&Normalizer::euler01, _1, _2);
+
521 
+
522  // Cook and swap buffer 0 and 1 such that Phi_t1(0) and Phi_t0(1)
+
523  this->cook("Normalizing level set using TVD_RK1 (step 1 of 2)", 1);
+
524 
+
525  // Convex combine explicit Euler step: t2 = t0 + dt
+
526  // Phi_t2(1) = 1/2 * Phi_t0(1) + 1/2 * (Phi_t1(0) - dt * V.Grad_t1(0))
+
527  mTask = boost::bind(&Normalizer::euler12, _1, _2);
+
528 
+
529  // Cook and swap buffer 0 and 1 such that Phi_t2(0) and Phi_t1(1)
+
530  this->cook("Normalizing level set using TVD_RK1 (step 2 of 2)", 1);
+
531  break;
+
532  case math::TVD_RK3:
+
533  // Perform one explicit Euler step: t1 = t0 + dt
+
534  // Phi_t1(1) = Phi_t0(0) - dt * VdotG_t0(1)
+
535  mTask = boost::bind(&Normalizer::euler01, _1, _2);
+
536 
+
537  // Cook and swap buffer 0 and 1 such that Phi_t1(0) and Phi_t0(1)
+
538  this->cook("Normalizing level set using TVD_RK3 (step 1 of 3)", 1);
+
539 
+
540  // Convex combine explicit Euler step: t2 = t0 + dt/2
+
541  // Phi_t2(2) = 3/4 * Phi_t0(1) + 1/4 * (Phi_t1(0) - dt * V.Grad_t1(0))
+
542  mTask = boost::bind(&Normalizer::euler34, _1, _2);
+
543 
+
544  // Cook and swap buffer 0 and 2 such that Phi_t2(0) and Phi_t1(2)
+
545  this->cook("Normalizing level set using TVD_RK3 (step 2 of 3)", 2);
+
546 
+
547  // Convex combine explicit Euler step: t3 = t0 + dt
+
548  // Phi_t3(2) = 1/3 * Phi_t0(1) + 2/3 * (Phi_t2(0) - dt * V.Grad_t2(0)
+
549  mTask = boost::bind(&Normalizer::euler13, _1, _2);
+
550 
+
551  // Cook and swap buffer 0 and 2 such that Phi_t3(0) and Phi_t2(2)
+
552  this->cook("Normalizing level set using TVD_RK3 (step 3 of 3)", 2);
+
553  break;
+
554  default:
+
555  OPENVDB_THROW(ValueError, "Temporal integration scheme not supported!");
+
556  }
+ +
558  }
+
559  mTracker.mLeafs->removeAuxBuffers();
+
560 }
+
561 
+
564 template<typename GridT, typename InterruptT>
+
565 template<math::BiasedGradientScheme SpatialScheme,
+
566  math::TemporalIntegrationScheme TemporalScheme,
+
567  typename MaskT>
+
568 inline void
+
569 LevelSetTracker<GridT, InterruptT>::
+
570 Normalizer<SpatialScheme, TemporalScheme, MaskT>::
+
571 cook(const char* msg, int swapBuffer)
+
572 {
+
573  mTracker.startInterrupter( msg );
+
574 
+
575  const int grainSize = mTracker.getGrainSize();
+
576  const LeafRange range = mTracker.leafs().leafRange(grainSize);
+
577 
+
578  grainSize>0 ? tbb::parallel_for(range, *this) : (*this)(range);
+
579 
+
580  mTracker.leafs().swapLeafBuffer(swapBuffer, grainSize==0);
+
581 
+
582  mTracker.endInterrupter();
+
583 }
+
584 
+
585 template<typename GridT, typename InterruptT>
+
586 template<math::BiasedGradientScheme SpatialScheme,
+
587  math::TemporalIntegrationScheme TemporalScheme,
+
588  typename MaskT>
+
589 template <int Nominator, int Denominator>
+
590 inline void
+
591 LevelSetTracker<GridT, InterruptT>::
+
592 Normalizer<SpatialScheme, TemporalScheme, MaskT>::
+
593 eval(StencilT& stencil, const ValueType* phi, ValueType* result, Index n) const
+
594 {
+
595  typedef typename math::ISGradientNormSqrd<SpatialScheme> GradientT;
+
596  static const ValueType alpha = ValueType(Nominator)/ValueType(Denominator);
+
597  static const ValueType beta = ValueType(1) - alpha;
+
598 
+
599  const ValueType normSqGradPhi = GradientT::result(stencil);
+
600  const ValueType phi0 = stencil.getValue();
+
601  ValueType v = phi0 / ( math::Sqrt(math::Pow2(phi0) + normSqGradPhi) +
+ +
603  v = phi0 - mDt * v * (math::Sqrt(normSqGradPhi) * mInvDx - 1.0f);
+
604  result[n] = Nominator ? alpha * phi[n] + beta * v : v;
+
605 }
+
606 
+
607 template<typename GridT, typename InterruptT>
+
608 template<math::BiasedGradientScheme SpatialScheme,
+
609  math::TemporalIntegrationScheme TemporalScheme,
+
610  typename MaskT>
+
611 template <int Nominator, int Denominator>
+
612 inline void
+
613 LevelSetTracker<GridT,InterruptT>::
+
614 Normalizer<SpatialScheme, TemporalScheme, MaskT>::
+
615 euler(const LeafRange& range, Index phiBuffer, Index resultBuffer)
+
616 {
+
617  typedef typename LeafType::ValueOnCIter VoxelIterT;
+
618 
+
619  mTracker.checkInterrupter();
+
620 
+
621  StencilT stencil(mTracker.grid());
+
622 
+
623  for (typename LeafRange::Iterator leafIter = range.begin(); leafIter; ++leafIter) {
+
624  const ValueType* phi = leafIter.buffer(phiBuffer).data();
+
625  ValueType* result = leafIter.buffer(resultBuffer).data();
+
626  if (mMask == NULL) {
+
627  for (VoxelIterT iter = leafIter->cbeginValueOn(); iter; ++iter) {
+
628  stencil.moveTo(iter);
+
629  this->eval<Nominator, Denominator>(stencil, phi, result, iter.pos());
+
630  }//loop over active voxels in the leaf of the level set
+
631  } else if (const MaskLeafT* mask = mMask->probeLeaf(leafIter->origin())) {
+
632  const ValueType* phi0 = leafIter->buffer().data();
+
633  for (MaskIterT iter = mask->cbeginValueOn(); iter; ++iter) {
+
634  const Index i = iter.pos();
+
635  stencil.moveTo(iter.getCoord(), phi0[i]);
+
636  this->eval<Nominator, Denominator>(stencil, phi, result, i);
+
637  }//loop over active voxels in the leaf of the mask
+
638  }
+
639  }//loop over leafs of the level set
+
640 }
+
641 
+
642 } // namespace tools
+
643 } // namespace OPENVDB_VERSION_NAME
+
644 } // namespace openvdb
+
645 
+
646 #endif // OPENVDB_TOOLS_LEVEL_SET_TRACKER_HAS_BEEN_INCLUDED
+
647 
+
648 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
649 // All rights reserved. This software is distributed under the
+
650 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
const LeafManagerType & leafs() const
Definition: LevelSetTracker.h:187
+
Definition: Morphology.h:87
+ + + +
void setGrainSize(int grainsize)
Set the grain-size used for multi-threading.
Definition: LevelSetTracker.h:172
+
GridT::TreeType TreeType
Definition: LevelSetTracker.h:71
+
void setSpatialScheme(math::BiasedGradientScheme scheme)
Set the spatial finite difference scheme.
Definition: LevelSetTracker.h:151
+ +
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
void setTemporalScheme(math::TemporalIntegrationScheme scheme)
Set the spatial finite difference scheme.
Definition: LevelSetTracker.h:157
+
void normalize()
Iterative normalization, i.e. solving the Eikonal equation.
Definition: LevelSetTracker.h:104
+
OPENVDB_STATIC_SPECIALIZATION void erodeVoxels(TreeType &tree, int iterations=1, NearestNeighbors nn=NN_FACE)
Topologically erode all leaf-level active voxels in the given tree.
Definition: Morphology.h:872
+
Definition: Types.h:442
+
float Sqrt(float x)
Return the square root of a floating-point value.
Definition: Math.h:709
+
Definition: FiniteDifference.h:195
+
int getGrainSize() const
Definition: LevelSetTracker.h:168
+
TemporalIntegrationScheme
Temporal integration schemes.
Definition: FiniteDifference.h:261
+
State(math::BiasedGradientScheme s=math::HJWENO5_BIAS, math::TemporalIntegrationScheme t=math::TVD_RK1, int n=static_cast< int >(LEVEL_SET_HALF_WIDTH), int g=1)
Definition: LevelSetTracker.h:82
+
Type Pow2(Type x)
Return .
Definition: Math.h:514
+
virtual ~LevelSetTracker()
Definition: LevelSetTracker.h:96
+
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
+
void track()
Track the level set interface, i.e. rebuild and normalize the narrow band of the level set...
Definition: LevelSetTracker.h:295
+
Definition: FiniteDifference.h:194
+
Efficient multi-threaded replacement of the background values in tree.
+
static const Real LEVEL_SET_HALF_WIDTH
Definition: Types.h:219
+
Definition: FiniteDifference.h:263
+
TreeType::ValueType ValueType
Definition: LevelSetTracker.h:73
+
void changeLevelSetBackground(TreeOrLeafManagerT &tree, const typename TreeOrLeafManagerT::ValueType &halfWidth, bool threaded=true, size_t grainSize=32)
Replace the background value in all the nodes of a floating-point tree containing a symmetric narrow-...
Definition: ChangeBackground.h:260
+
This class manages a linear array of pointers to a given tree's leaf nodes, as well as optional auxil...
Definition: LeafManager.h:115
+
void erode(int iterations=1)
Erodes the width of the narrow-band and update the background values.
Definition: LevelSetTracker.h:332
+
int normCount
Definition: LevelSetTracker.h:88
+
math::BiasedGradientScheme getSpatialScheme() const
Definition: LevelSetTracker.h:148
+
tree::LeafManager< TreeType > LeafManagerType
Definition: LevelSetTracker.h:74
+
LeafManagerType::LeafRange LeafRange
Definition: LevelSetTracker.h:75
+
int grainSize
Definition: LevelSetTracker.h:89
+
Definition: FiniteDifference.h:198
+
bool resize(Index halfWidth=static_cast< Index >(LEVEL_SET_HALF_WIDTH))
Resize the width of the narrow band, i.e. perform dilation and renormalization or erosion as required...
Definition: LevelSetTracker.h:343
+
Definition: Operators.h:152
+ +
void pruneLevelSet(TreeT &tree, bool threaded=true, size_t grainSize=1)
Reduce the memory footprint of a tree by replacing nodes whose values are all inactive with inactive ...
Definition: Prune.h:402
+
Definition: FiniteDifference.h:197
+
ValueType voxelSize() const
Definition: LevelSetTracker.h:174
+
Defined various multi-threaded utility functions for trees.
+
Index32 Index
Definition: Types.h:58
+
Lightweight struct that stores the state of the LevelSetTracker.
Definition: LevelSetTracker.h:81
+
static T value()
Definition: Math.h:125
+
TreeType::template ValueConverter< ValueMask >::Type MaskTreeType
Definition: LevelSetTracker.h:77
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
void dilate(int iterations=1)
Fast but approximate dilation of the narrow band - one layer at a time. Normally we recommend using t...
Definition: LevelSetTracker.h:310
+
void setNormCount(int n)
Set the number of normalizations performed per track or normalize call.
Definition: LevelSetTracker.h:165
+
State getState() const
Return the state of the tracker (see struct defined above)
Definition: LevelSetTracker.h:142
+
Definition: Exceptions.h:86
+
CopyConstness< TreeType, NonConstBufferType >::Type BufferType
Definition: LeafManager.h:126
+
Implementation of morphological dilation and erosion.
+
LeafManagerType & leafs()
Definition: LevelSetTracker.h:185
+
Definition: Exceptions.h:39
+
BiasedGradientScheme
Biased Gradients are limited to non-centered differences.
Definition: FiniteDifference.h:192
+
ValueType getHalfWidth() const
Return the half width of the narrow band in floating-point voxel units.
Definition: LevelSetTracker.h:139
+
math::TemporalIntegrationScheme getTemporalScheme() const
Definition: LevelSetTracker.h:154
+
#define OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN
Definition: Platform.h:129
+
Definition: FiniteDifference.h:265
+
GridT GridType
Definition: LevelSetTracker.h:70
+
void startInterrupter(const char *msg)
Definition: LevelSetTracker.h:358
+
int getNormCount() const
Definition: LevelSetTracker.h:161
+ +
#define OPENVDB_NO_UNREACHABLE_CODE_WARNING_END
Definition: Platform.h:130
+
OPENVDB_STATIC_SPECIALIZATION void dilateActiveValues(TreeType &tree, int iterations=1, NearestNeighbors nn=NN_FACE, TilePolicy mode=PRESERVE_TILES)
Topologically dilate all active values (i.e. both voxels and tiles) in a tree using one of three near...
Definition: Morphology.h:1071
+
float RoundDown(float x)
Return x rounded down to the nearest integer.
Definition: Math.h:751
+ +
Definition: Exceptions.h:88
+
LeafManagerType::BufferType BufferType
Definition: LevelSetTracker.h:76
+
void prune(TreeT &tree, typename TreeT::ValueType tolerance=zeroVal< typename TreeT::ValueType >(), bool threaded=true, size_t grainSize=1)
Reduce the memory footprint of a tree by replacing with tiles any nodes whose values are all the same...
Definition: Prune.h:347
+
Defines various finite difference stencils by means of the "curiously recurring template pattern" on ...
+
const GridType & grid() const
Definition: LevelSetTracker.h:183
+
void setState(const State &s)
Set the state of the tracker (see struct defined above)
Definition: LevelSetTracker.h:145
+
Definition: Types.h:213
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
void endInterrupter()
Definition: LevelSetTracker.h:366
+
A LeafManager manages a linear array of pointers to a given tree's leaf nodes, as well as optional au...
+
bool checkInterrupter()
Definition: LevelSetTracker.h:374
+
Definition: FiniteDifference.h:196
+
Performs multi-threaded interface tracking of narrow band level sets.
Definition: LevelSetTracker.h:67
+
TreeT * tree
Definition: MaskToLevelSet.h:118
+
math::TemporalIntegrationScheme temporalScheme
Definition: LevelSetTracker.h:87
+
Definition: Morphology.h:102
+
Definition: FiniteDifference.h:264
+
TreeType::LeafNodeType LeafType
Definition: LevelSetTracker.h:72
+ +
void prune()
Remove voxels that are outside the narrow band. (substep of track)
Definition: LevelSetTracker.h:276
+
bool wasInterrupted(T *i, int percent=-1)
Definition: NullInterrupter.h:76
+
math::BiasedGradientScheme spatialScheme
Definition: LevelSetTracker.h:86
+
GridType::Ptr normalize(const GridType &grid, bool threaded, InterruptT *interrupt)
Normalize the vectors of the given vector-valued grid.
Definition: GridOperators.h:1067
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetUtil_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetUtil_8h_source.html new file mode 100644 index 00000000..79bea1c2 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/LevelSetUtil_8h_source.html @@ -0,0 +1,2786 @@ + + + + + + +OpenVDB: LevelSetUtil.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
LevelSetUtil.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
37 
+
38 
+
39 #ifndef OPENVDB_TOOLS_LEVEL_SET_UTIL_HAS_BEEN_INCLUDED
+
40 #define OPENVDB_TOOLS_LEVEL_SET_UTIL_HAS_BEEN_INCLUDED
+
41 
+
42 #include "MeshToVolume.h" // for traceExteriorBoundaries
+
43 #include "SignedFloodFill.h" // for signedFloodFillWithValues
+
44 
+
45 #include <openvdb/Types.h>
+
46 #include <openvdb/Grid.h>
+
47 
+
48 #include <tbb/blocked_range.h>
+
49 #include <tbb/parallel_for.h>
+
50 #include <tbb/parallel_reduce.h>
+
51 #include <tbb/parallel_sort.h>
+
52 
+
53 #include <limits>
+
54 
+
55 namespace openvdb {
+ +
57 namespace OPENVDB_VERSION_NAME {
+
58 namespace tools {
+
59 
+
60 // MS Visual C++ requires this extra level of indirection in order to compile
+
61 // THIS MUST EXIST IN AN UNNAMED NAMESPACE IN ORDER TO COMPILE ON WINDOWS
+
62 namespace {
+
63 
+
64 template<typename GridType>
+
65 inline typename GridType::ValueType lsutilGridMax()
+
66 {
+ +
68 }
+
69 
+
70 template<typename GridType>
+
71 inline typename GridType::ValueType lsutilGridZero()
+
72 {
+
73  return zeroVal<typename GridType::ValueType>();
+
74 }
+
75 
+
76 } // unnamed namespace
+
77 
+
78 
+
80 
+
81 
+
96 template<class GridType>
+
97 inline void
+ +
99  GridType& grid,
+
100  typename GridType::ValueType cutoffDistance = lsutilGridMax<GridType>());
+
101 
+
102 
+
113 template<class GridOrTreeType>
+
114 inline typename GridOrTreeType::template ValueConverter<bool>::Type::Ptr
+ +
116  const GridOrTreeType& volume,
+
117  typename GridOrTreeType::ValueType isovalue = lsutilGridZero<GridOrTreeType>());
+
118 
+
119 
+
140 template<typename GridOrTreeType>
+
141 inline typename GridOrTreeType::template ValueConverter<bool>::Type::Ptr
+
142 extractEnclosedRegion(const GridOrTreeType& volume,
+
143  typename GridOrTreeType::ValueType isovalue = lsutilGridZero<GridOrTreeType>(),
+
144  const typename TreeAdapter<GridOrTreeType>::TreeType::template ValueConverter<bool>::Type* fillMask = NULL);
+
145 
+
146 
+
151 template<typename GridOrTreeType>
+
152 inline typename GridOrTreeType::template ValueConverter<bool>::Type::Ptr
+
153 extractIsosurfaceMask(const GridOrTreeType& volume, typename GridOrTreeType::ValueType isovalue);
+
154 
+
155 
+
161 template<typename GridOrTreeType>
+
162 inline void
+
163 extractActiveVoxelSegmentMasks(const GridOrTreeType& volume,
+
164  std::vector<typename GridOrTreeType::template ValueConverter<bool>::Type::Ptr>& masks);
+
165 
+
166 
+
174 template<typename GridOrTreeType>
+
175 inline void
+
176 segmentActiveVoxels(const GridOrTreeType& volume, std::vector<typename GridOrTreeType::Ptr>& segments);
+
177 
+
178 
+
187 template<typename GridOrTreeType>
+
188 inline void
+
189 segmentSDF(const GridOrTreeType& volume, std::vector<typename GridOrTreeType::Ptr>& segments);
+
190 
+
191 
+
194 
+
195 // Internal utility objects and implementation details
+
196 
+
197 
+
198 namespace level_set_util_internal {
+
199 
+
200 
+
201 template<typename LeafNodeType>
+ +
203 
+
204  typedef typename LeafNodeType::ValueType ValueType;
+ +
206 
+ +
208  ValueType isovalue, const LeafNodeType ** nodes, BoolLeafNodeType ** maskNodes)
+
209  : mNodes(nodes), mMaskNodes(maskNodes), mIsovalue(isovalue)
+
210  {
+
211  }
+
212 
+
213  void operator()(const tbb::blocked_range<size_t>& range) const {
+
214 
+
215  BoolLeafNodeType * maskNodePt = NULL;
+
216 
+
217  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
218 
+
219  mMaskNodes[n] = NULL;
+
220  const LeafNodeType& node = *mNodes[n];
+
221 
+
222  if (!maskNodePt) {
+
223  maskNodePt = new BoolLeafNodeType(node.origin(), false);
+
224  } else {
+
225  maskNodePt->setOrigin(node.origin());
+
226  }
+
227 
+
228  const ValueType* values = &node.getValue(0);
+
229  for (Index i = 0; i < LeafNodeType::SIZE; ++i) {
+
230  if (values[i] < mIsovalue) maskNodePt->setValueOn(i, true);
+
231  }
+
232 
+
233  if (maskNodePt->onVoxelCount() > 0) {
+
234  mMaskNodes[n] = maskNodePt;
+
235  maskNodePt = NULL;
+
236  }
+
237  }
+
238 
+
239  if (maskNodePt) delete maskNodePt;
+
240  }
+
241 
+
242  LeafNodeType const * const * const mNodes;
+
243  BoolLeafNodeType ** const mMaskNodes;
+
244  ValueType const mIsovalue;
+
245 }; // MaskInteriorVoxels
+
246 
+
247 
+
248 template<typename TreeType, typename InternalNodeType>
+ +
250 
+
251  typedef typename TreeType::ValueType ValueType;
+
252 
+
253  MaskInteriorTiles(ValueType isovalue, const TreeType& tree, InternalNodeType ** maskNodes)
+
254  : mTree(&tree), mMaskNodes(maskNodes), mIsovalue(isovalue) { }
+
255 
+
256  void operator()(const tbb::blocked_range<size_t>& range) const {
+ +
258  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
259  typename InternalNodeType::ValueAllIter it = mMaskNodes[n]->beginValueAll();
+
260  for (; it; ++it) {
+
261  if (acc.getValue(it.getCoord()) < mIsovalue) {
+
262  it.setValue(true);
+
263  it.setValueOn(true);
+
264  }
+
265  }
+
266  }
+
267  }
+
268 
+
269  TreeType const * const mTree;
+
270  InternalNodeType ** const mMaskNodes;
+
271  ValueType const mIsovalue;
+
272 }; // MaskInteriorTiles
+
273 
+
274 
+
275 template<typename TreeType>
+
276 struct PopulateTree {
+
277 
+
278  typedef typename TreeType::ValueType ValueType;
+
279  typedef typename TreeType::LeafNodeType LeafNodeType;
+
280 
+
281  PopulateTree(TreeType& tree, LeafNodeType** leafnodes,
+
282  const size_t * nodexIndexMap, ValueType background)
+
283  : mNewTree(background)
+
284  , mTreePt(&tree)
+
285  , mNodes(leafnodes)
+
286  , mNodeIndexMap(nodexIndexMap)
+
287  {
+
288  }
+
289 
+
290  PopulateTree(PopulateTree& rhs, tbb::split)
+
291  : mNewTree(rhs.mNewTree.background())
+
292  , mTreePt(&mNewTree)
+
293  , mNodes(rhs.mNodes)
+
294  , mNodeIndexMap(rhs.mNodeIndexMap)
+
295  {
+
296  }
+
297 
+
298  void operator()(const tbb::blocked_range<size_t>& range) {
+
299 
+
300  tree::ValueAccessor<TreeType> acc(*mTreePt);
+
301 
+
302  if (mNodeIndexMap) {
+
303  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
304  for (size_t i = mNodeIndexMap[n], I = mNodeIndexMap[n + 1]; i < I; ++i) {
+
305  if (mNodes[i] != NULL) acc.addLeaf(mNodes[i]);
+
306  }
+
307  }
+
308  } else {
+
309  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
310  acc.addLeaf(mNodes[n]);
+
311  }
+
312  }
+
313  }
+
314 
+
315  void join(PopulateTree& rhs) { mTreePt->merge(*rhs.mTreePt); }
+
316 
+
317 private:
+
318  TreeType mNewTree;
+
319  TreeType * const mTreePt;
+
320  LeafNodeType ** const mNodes;
+
321  size_t const * const mNodeIndexMap;
+
322 }; // PopulateTree
+
323 
+
324 
+
326 template<typename LeafNodeType>
+ +
328 
+
329  typedef typename LeafNodeType::ValueType ValueType;
+ +
331 
+ +
333  ValueType isovalue, const LeafNodeType ** nodes, CharLeafNodeType ** maskNodes)
+
334  : mNodes(nodes), mMaskNodes(maskNodes), mIsovalue(isovalue)
+
335  {
+
336  }
+
337 
+
338  void operator()(const tbb::blocked_range<size_t>& range) const {
+
339 
+
340  CharLeafNodeType * maskNodePt = NULL;
+
341 
+
342  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
343 
+
344  mMaskNodes[n] = NULL;
+
345  const LeafNodeType& node = *mNodes[n];
+
346 
+
347  if (!maskNodePt) {
+
348  maskNodePt = new CharLeafNodeType(node.origin(), 1);
+
349  } else {
+
350  maskNodePt->setOrigin(node.origin());
+
351  }
+
352 
+
353  typename LeafNodeType::ValueOnCIter it;
+
354  for (it = node.cbeginValueOn(); it; ++it) {
+
355  maskNodePt->setValueOn(it.pos(), ((*it - mIsovalue) < 0.0) ? 0 : 1);
+
356  }
+
357 
+
358  if (maskNodePt->onVoxelCount() > 0) {
+
359  mMaskNodes[n] = maskNodePt;
+
360  maskNodePt = NULL;
+
361  }
+
362  }
+
363 
+
364  if (maskNodePt) delete maskNodePt;
+
365  }
+
366 
+
367  LeafNodeType const * const * const mNodes;
+
368  CharLeafNodeType ** const mMaskNodes;
+
369  ValueType const mIsovalue;
+
370 }; // LabelBoundaryVoxels
+
371 
+
372 
+
373 template<typename LeafNodeType>
+ +
375  typedef typename LeafNodeType::ValueType ValueType;
+
376 
+
377  FlipRegionSign(LeafNodeType ** nodes) : mNodes(nodes) { }
+
378 
+
379  void operator()(const tbb::blocked_range<size_t>& range) const {
+
380  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
381  ValueType* values = const_cast<ValueType*>(&mNodes[n]->getValue(0));
+
382  for (Index i = 0; i < LeafNodeType::SIZE; ++i) {
+
383  values[i] = values[i] < 0 ? 1 : -1;
+
384  }
+
385  }
+
386  }
+
387 
+
388  LeafNodeType ** const mNodes;
+
389 }; // FlipRegionSign
+
390 
+
391 
+
392 template<typename LeafNodeType>
+ +
394 
+
395  typedef typename LeafNodeType::ValueType ValueType;
+
396 
+
397  FindMinVoxelValue(LeafNodeType const * const * const leafnodes)
+
398  : minValue(std::numeric_limits<ValueType>::max())
+
399  , mNodes(leafnodes)
+
400  {
+
401  }
+
402 
+ +
404  : minValue(std::numeric_limits<ValueType>::max())
+
405  , mNodes(rhs.mNodes)
+
406  {
+
407  }
+
408 
+
409  void operator()(const tbb::blocked_range<size_t>& range) {
+
410  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
411  const ValueType* data = mNodes[n]->buffer().data();
+
412  for (Index i = 0; i < LeafNodeType::SIZE; ++i) {
+
413  minValue = std::min(minValue, data[i]);
+
414  }
+
415  }
+
416  }
+
417 
+
418  void join(FindMinVoxelValue& rhs) { minValue = std::min(minValue, rhs.minValue); }
+
419 
+
420  ValueType minValue;
+
421 
+
422  LeafNodeType const * const * const mNodes;
+
423 }; // FindMinVoxelValue
+
424 
+
425 
+
426 template<typename InternalNodeType>
+ +
428 
+
429  typedef typename InternalNodeType::ValueType ValueType;
+
430 
+
431  FindMinTileValue(InternalNodeType const * const * const nodes)
+
432  : minValue(std::numeric_limits<ValueType>::max())
+
433  , mNodes(nodes)
+
434  {
+
435  }
+
436 
+ +
438  : minValue(std::numeric_limits<ValueType>::max())
+
439  , mNodes(rhs.mNodes)
+
440  {
+
441  }
+
442 
+
443  void operator()(const tbb::blocked_range<size_t>& range) {
+
444  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
445  typename InternalNodeType::ValueAllCIter it = mNodes[n]->beginValueAll();
+
446  for (; it; ++it) {
+
447  minValue = std::min(minValue, *it);
+
448  }
+
449  }
+
450  }
+
451 
+
452  void join(FindMinTileValue& rhs) { minValue = std::min(minValue, rhs.minValue); }
+
453 
+
454  ValueType minValue;
+
455 
+
456  InternalNodeType const * const * const mNodes;
+
457 }; // FindMinTileValue
+
458 
+
459 
+
460 template<typename LeafNodeType>
+ +
462 
+
463  typedef typename LeafNodeType::ValueType ValueType;
+
464 
+
465  SDFVoxelsToFogVolume(LeafNodeType ** nodes, ValueType cutoffDistance)
+
466  : mNodes(nodes), mWeight(ValueType(1.0) / cutoffDistance)
+
467  {
+
468  }
+
469 
+
470  void operator()(const tbb::blocked_range<size_t>& range) const {
+
471 
+
472  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
473 
+
474  LeafNodeType& node = *mNodes[n];
+
475  node.setValuesOff();
+
476 
+
477  ValueType* values = node.buffer().data();
+
478  for (Index i = 0; i < LeafNodeType::SIZE; ++i) {
+
479  values[i] = values[i] > ValueType(0.0) ? ValueType(0.0) : values[i] * mWeight;
+
480  if (values[i] > ValueType(0.0)) node.setValueOn(i);
+
481  }
+
482 
+
483  if (node.onVoxelCount() == 0) {
+
484  delete mNodes[n];
+
485  mNodes[n] = NULL;
+
486  }
+
487  }
+
488  }
+
489 
+
490  LeafNodeType ** const mNodes;
+
491  ValueType const mWeight;
+
492 }; // SDFVoxelsToFogVolume
+
493 
+
494 
+
495 template<typename TreeType, typename InternalNodeType>
+ +
497 
+
498  SDFTilesToFogVolume(const TreeType& tree, InternalNodeType ** nodes)
+
499  : mTree(&tree), mNodes(nodes) { }
+
500 
+
501  void operator()(const tbb::blocked_range<size_t>& range) const {
+
502 
+
503  typedef typename TreeType::ValueType ValueType;
+ +
505 
+
506  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
507  typename InternalNodeType::ValueAllIter it = mNodes[n]->beginValueAll();
+
508  for (; it; ++it) {
+
509  if (acc.getValue(it.getCoord()) < ValueType(0.0)) {
+
510  it.setValue(ValueType(1.0));
+
511  it.setValueOn(true);
+
512  }
+
513  }
+
514  }
+
515  }
+
516 
+
517  TreeType const * const mTree;
+
518  InternalNodeType ** const mNodes;
+
519 }; // SDFTilesToFogVolume
+
520 
+
521 
+
522 template<typename TreeType>
+ +
524 
+
525  typedef typename TreeType::ValueType ValueType;
+
526  typedef typename TreeType::LeafNodeType LeafNodeType;
+
527  typedef typename TreeType::template ValueConverter<bool>::Type BoolTreeType;
+
528  typedef typename BoolTreeType::LeafNodeType BoolLeafNodeType;
+
529 
+
530  FillMaskBoundary(const TreeType& tree, ValueType isovalue, const BoolTreeType& fillMask,
+
531  const BoolLeafNodeType ** fillNodes, BoolLeafNodeType ** newNodes)
+
532  : mTree(&tree), mFillMask(&fillMask), mFillNodes(fillNodes), mNewNodes(newNodes), mIsovalue(isovalue)
+
533  {
+
534  }
+
535 
+
536  void operator()(const tbb::blocked_range<size_t>& range) const {
+
537 
+
538  tree::ValueAccessor<const BoolTreeType> maskAcc(*mFillMask);
+
539  tree::ValueAccessor<const TreeType> distAcc(*mTree);
+
540 
+
541  boost::scoped_array<char> valueMask(new char[BoolLeafNodeType::SIZE]);
+
542 
+
543  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
544 
+
545  mNewNodes[n] = NULL;
+
546  const BoolLeafNodeType& node = *mFillNodes[n];
+
547  const Coord& origin = node.origin();
+
548 
+
549  const bool denseNode = node.isDense();
+
550 
+
551  // possible early out if the fill mask is dense
+
552  if (denseNode) {
+
553 
+
554  int denseNeighbors = 0;
+
555 
+
556  const BoolLeafNodeType* neighborNode = maskAcc.probeConstLeaf(origin.offsetBy(-1, 0, 0));
+
557  if (neighborNode && neighborNode->isDense()) ++denseNeighbors;
+
558 
+
559  neighborNode = maskAcc.probeConstLeaf(origin.offsetBy(BoolLeafNodeType::DIM, 0, 0));
+
560  if (neighborNode && neighborNode->isDense()) ++denseNeighbors;
+
561 
+
562  neighborNode = maskAcc.probeConstLeaf(origin.offsetBy(0, -1, 0));
+
563  if (neighborNode && neighborNode->isDense()) ++denseNeighbors;
+
564 
+
565  neighborNode = maskAcc.probeConstLeaf(origin.offsetBy(0, BoolLeafNodeType::DIM, 0));
+
566  if (neighborNode && neighborNode->isDense()) ++denseNeighbors;
+
567 
+
568  neighborNode = maskAcc.probeConstLeaf(origin.offsetBy(0, 0, -1));
+
569  if (neighborNode && neighborNode->isDense()) ++denseNeighbors;
+
570 
+
571  neighborNode = maskAcc.probeConstLeaf(origin.offsetBy(0, 0, BoolLeafNodeType::DIM));
+
572  if (neighborNode && neighborNode->isDense()) ++denseNeighbors;
+
573 
+
574  if (denseNeighbors == 6) continue;
+
575  }
+
576 
+
577  // rest value mask
+
578  memset(valueMask.get(), 0, sizeof(char) * BoolLeafNodeType::SIZE);
+
579 
+
580  const typename TreeType::LeafNodeType* distNode = distAcc.probeConstLeaf(origin);
+
581 
+
582  // check internal voxel neighbors
+
583 
+
584  bool earlyTermination = false;
+
585 
+
586  if (!denseNode) {
+
587  if (distNode) {
+
588  evalInternalNeighborsP(valueMask.get(), node, *distNode);
+
589  evalInternalNeighborsN(valueMask.get(), node, *distNode);
+
590  } else if (distAcc.getValue(origin) > mIsovalue) {
+
591  earlyTermination = evalInternalNeighborsP(valueMask.get(), node);
+
592  if (!earlyTermination) earlyTermination = evalInternalNeighborsN(valueMask.get(), node);
+
593  }
+
594  }
+
595 
+
596  // check external voxel neighbors
+
597 
+
598  if (!earlyTermination) {
+
599  evalExternalNeighborsX<true>(valueMask.get(), node, maskAcc, distAcc);
+
600  evalExternalNeighborsX<false>(valueMask.get(), node, maskAcc, distAcc);
+
601  evalExternalNeighborsY<true>(valueMask.get(), node, maskAcc, distAcc);
+
602  evalExternalNeighborsY<false>(valueMask.get(), node, maskAcc, distAcc);
+
603  evalExternalNeighborsZ<true>(valueMask.get(), node, maskAcc, distAcc);
+
604  evalExternalNeighborsZ<false>(valueMask.get(), node, maskAcc, distAcc);
+
605  }
+
606 
+
607  // Export marked boundary voxels.
+
608 
+
609  int numBoundaryValues = 0;
+
610  for (Index i = 0, I = BoolLeafNodeType::SIZE; i < I; ++i) {
+
611  numBoundaryValues += valueMask[i] == 1;
+
612  }
+
613 
+
614  if (numBoundaryValues > 0) {
+
615  mNewNodes[n] = new BoolLeafNodeType(origin, false);
+
616  for (Index i = 0, I = BoolLeafNodeType::SIZE; i < I; ++i) {
+
617  if (valueMask[i] == 1) mNewNodes[n]->setValueOn(i);
+
618  }
+
619  }
+
620  }
+
621  }
+
622 
+
623 private:
+
624 
+
625  // Check internal voxel neighbors in positive {x, y, z} directions.
+
626 
+
627  void evalInternalNeighborsP(char* valueMask, const BoolLeafNodeType& node, const LeafNodeType& distNode) const {
+
628 
+
629  for (Index x = 0; x < BoolLeafNodeType::DIM; ++x) {
+
630  const Index xPos = x << (2 * BoolLeafNodeType::LOG2DIM);
+
631  for (Index y = 0; y < BoolLeafNodeType::DIM; ++y) {
+
632  const Index yPos = xPos + (y << BoolLeafNodeType::LOG2DIM);
+
633  for (Index z = 0; z < BoolLeafNodeType::DIM - 1; ++z) {
+
634  const Index pos = yPos + z;
+
635 
+
636  if (valueMask[pos] != 0 || !node.isValueOn(pos)) continue;
+
637 
+
638  if (!node.isValueOn(pos + 1) && distNode.getValue(pos + 1) > mIsovalue) {
+
639  valueMask[pos] = 1;
+
640  }
+
641  }
+
642  }
+
643  }
+
644 
+
645  for (Index x = 0; x < BoolLeafNodeType::DIM; ++x) {
+
646  const Index xPos = x << (2 * BoolLeafNodeType::LOG2DIM);
+
647  for (Index y = 0; y < BoolLeafNodeType::DIM - 1; ++y) {
+
648  const Index yPos = xPos + (y << BoolLeafNodeType::LOG2DIM);
+
649  for (Index z = 0; z < BoolLeafNodeType::DIM; ++z) {
+
650  const Index pos = yPos + z;
+
651 
+
652  if (valueMask[pos] != 0 || !node.isValueOn(pos)) continue;
+
653 
+
654  if (!node.isValueOn(pos + BoolLeafNodeType::DIM) &&
+
655  distNode.getValue(pos + BoolLeafNodeType::DIM) > mIsovalue) {
+
656  valueMask[pos] = 1;
+
657  }
+
658  }
+
659  }
+
660  }
+
661 
+
662  for (Index x = 0; x < BoolLeafNodeType::DIM - 1; ++x) {
+
663  const Index xPos = x << (2 * BoolLeafNodeType::LOG2DIM);
+
664  for (Index y = 0; y < BoolLeafNodeType::DIM; ++y) {
+
665  const Index yPos = xPos + (y << BoolLeafNodeType::LOG2DIM);
+
666  for (Index z = 0; z < BoolLeafNodeType::DIM; ++z) {
+
667  const Index pos = yPos + z;
+
668 
+
669  if (valueMask[pos] != 0 || !node.isValueOn(pos)) continue;
+
670 
+
671  if (!node.isValueOn(pos + BoolLeafNodeType::DIM * BoolLeafNodeType::DIM) &&
+
672  distNode.getValue(pos + BoolLeafNodeType::DIM * BoolLeafNodeType::DIM) > mIsovalue) {
+
673  valueMask[pos] = 1;
+
674  }
+
675  }
+
676  }
+
677  }
+
678  }
+
679 
+
680  bool evalInternalNeighborsP(char* valueMask, const BoolLeafNodeType& node) const {
+
681 
+
682  for (Index x = 0; x < BoolLeafNodeType::DIM; ++x) {
+
683  const Index xPos = x << (2 * BoolLeafNodeType::LOG2DIM);
+
684  for (Index y = 0; y < BoolLeafNodeType::DIM; ++y) {
+
685  const Index yPos = xPos + (y << BoolLeafNodeType::LOG2DIM);
+
686  for (Index z = 0; z < BoolLeafNodeType::DIM - 1; ++z) {
+
687  const Index pos = yPos + z;
+
688 
+
689  if (node.isValueOn(pos) && !node.isValueOn(pos + 1)) {
+
690  valueMask[pos] = 1;
+
691  return true;
+
692  }
+
693  }
+
694  }
+
695  }
+
696 
+
697  for (Index x = 0; x < BoolLeafNodeType::DIM; ++x) {
+
698  const Index xPos = x << (2 * BoolLeafNodeType::LOG2DIM);
+
699  for (Index y = 0; y < BoolLeafNodeType::DIM - 1; ++y) {
+
700  const Index yPos = xPos + (y << BoolLeafNodeType::LOG2DIM);
+
701  for (Index z = 0; z < BoolLeafNodeType::DIM; ++z) {
+
702  const Index pos = yPos + z;
+
703 
+
704  if (node.isValueOn(pos) && !node.isValueOn(pos + BoolLeafNodeType::DIM)) {
+
705  valueMask[pos] = 1;
+
706  return true;
+
707  }
+
708  }
+
709  }
+
710  }
+
711 
+
712  for (Index x = 0; x < BoolLeafNodeType::DIM - 1; ++x) {
+
713  const Index xPos = x << (2 * BoolLeafNodeType::LOG2DIM);
+
714  for (Index y = 0; y < BoolLeafNodeType::DIM; ++y) {
+
715  const Index yPos = xPos + (y << BoolLeafNodeType::LOG2DIM);
+
716  for (Index z = 0; z < BoolLeafNodeType::DIM; ++z) {
+
717  const Index pos = yPos + z;
+
718 
+
719  if (node.isValueOn(pos) &&
+
720  !node.isValueOn(pos + BoolLeafNodeType::DIM * BoolLeafNodeType::DIM)) {
+
721  valueMask[pos] = 1;
+
722  return true;
+
723  }
+
724  }
+
725  }
+
726  }
+
727 
+
728  return false;
+
729  }
+
730 
+
731  // Check internal voxel neighbors in negative {x, y, z} directions.
+
732 
+
733  void evalInternalNeighborsN(char* valueMask, const BoolLeafNodeType& node, const LeafNodeType& distNode) const {
+
734 
+
735  for (Index x = 0; x < BoolLeafNodeType::DIM; ++x) {
+
736  const Index xPos = x << (2 * BoolLeafNodeType::LOG2DIM);
+
737  for (Index y = 0; y < BoolLeafNodeType::DIM; ++y) {
+
738  const Index yPos = xPos + (y << BoolLeafNodeType::LOG2DIM);
+
739  for (Index z = 1; z < BoolLeafNodeType::DIM; ++z) {
+
740  const Index pos = yPos + z;
+
741 
+
742  if (valueMask[pos] != 0 || !node.isValueOn(pos)) continue;
+
743 
+
744  if (!node.isValueOn(pos - 1) && distNode.getValue(pos - 1) > mIsovalue) {
+
745  valueMask[pos] = 1;
+
746  }
+
747  }
+
748  }
+
749  }
+
750 
+
751  for (Index x = 0; x < BoolLeafNodeType::DIM; ++x) {
+
752  const Index xPos = x << (2 * BoolLeafNodeType::LOG2DIM);
+
753  for (Index y = 1; y < BoolLeafNodeType::DIM; ++y) {
+
754  const Index yPos = xPos + (y << BoolLeafNodeType::LOG2DIM);
+
755  for (Index z = 0; z < BoolLeafNodeType::DIM; ++z) {
+
756  const Index pos = yPos + z;
+
757 
+
758  if (valueMask[pos] != 0 || !node.isValueOn(pos)) continue;
+
759 
+
760  if (!node.isValueOn(pos - BoolLeafNodeType::DIM) &&
+
761  distNode.getValue(pos - BoolLeafNodeType::DIM) > mIsovalue) {
+
762  valueMask[pos] = 1;
+
763  }
+
764  }
+
765  }
+
766  }
+
767 
+
768  for (Index x = 1; x < BoolLeafNodeType::DIM; ++x) {
+
769  const Index xPos = x << (2 * BoolLeafNodeType::LOG2DIM);
+
770  for (Index y = 0; y < BoolLeafNodeType::DIM; ++y) {
+
771  const Index yPos = xPos + (y << BoolLeafNodeType::LOG2DIM);
+
772  for (Index z = 0; z < BoolLeafNodeType::DIM; ++z) {
+
773  const Index pos = yPos + z;
+
774 
+
775  if (valueMask[pos] != 0 || !node.isValueOn(pos)) continue;
+
776 
+
777  if (!node.isValueOn(pos - BoolLeafNodeType::DIM * BoolLeafNodeType::DIM) &&
+
778  distNode.getValue(pos - BoolLeafNodeType::DIM * BoolLeafNodeType::DIM) > mIsovalue) {
+
779  valueMask[pos] = 1;
+
780  }
+
781  }
+
782  }
+
783  }
+
784  }
+
785 
+
786 
+
787  bool evalInternalNeighborsN(char* valueMask, const BoolLeafNodeType& node) const {
+
788 
+
789  for (Index x = 0; x < BoolLeafNodeType::DIM; ++x) {
+
790  const Index xPos = x << (2 * BoolLeafNodeType::LOG2DIM);
+
791  for (Index y = 0; y < BoolLeafNodeType::DIM; ++y) {
+
792  const Index yPos = xPos + (y << BoolLeafNodeType::LOG2DIM);
+
793  for (Index z = 1; z < BoolLeafNodeType::DIM; ++z) {
+
794  const Index pos = yPos + z;
+
795 
+
796  if (node.isValueOn(pos) && !node.isValueOn(pos - 1)) {
+
797  valueMask[pos] = 1;
+
798  return true;
+
799  }
+
800  }
+
801  }
+
802  }
+
803 
+
804  for (Index x = 0; x < BoolLeafNodeType::DIM; ++x) {
+
805  const Index xPos = x << (2 * BoolLeafNodeType::LOG2DIM);
+
806  for (Index y = 1; y < BoolLeafNodeType::DIM; ++y) {
+
807  const Index yPos = xPos + (y << BoolLeafNodeType::LOG2DIM);
+
808  for (Index z = 0; z < BoolLeafNodeType::DIM; ++z) {
+
809  const Index pos = yPos + z;
+
810 
+
811  if (node.isValueOn(pos) && !node.isValueOn(pos - BoolLeafNodeType::DIM)) {
+
812  valueMask[pos] = 1;
+
813  return true;
+
814  }
+
815  }
+
816  }
+
817  }
+
818 
+
819  for (Index x = 1; x < BoolLeafNodeType::DIM; ++x) {
+
820  const Index xPos = x << (2 * BoolLeafNodeType::LOG2DIM);
+
821  for (Index y = 0; y < BoolLeafNodeType::DIM; ++y) {
+
822  const Index yPos = xPos + (y << BoolLeafNodeType::LOG2DIM);
+
823  for (Index z = 0; z < BoolLeafNodeType::DIM; ++z) {
+
824  const Index pos = yPos + z;
+
825 
+
826  if (node.isValueOn(pos) &&
+
827  !node.isValueOn(pos - BoolLeafNodeType::DIM * BoolLeafNodeType::DIM)) {
+
828  valueMask[pos] = 1;
+
829  return true;
+
830  }
+
831  }
+
832  }
+
833  }
+
834 
+
835  return false;
+
836  }
+
837 
+
838 
+
839  // Check external voxel neighbors
+
840 
+
841  // If UpWind is true check the X+ oriented node face, else the X- oriented face.
+
842  template<bool UpWind>
+
843  void evalExternalNeighborsX(char* valueMask, const BoolLeafNodeType& node,
+
844  const tree::ValueAccessor<const BoolTreeType>& maskAcc,
+
845  const tree::ValueAccessor<const TreeType>& distAcc) const {
+
846 
+
847  const Coord& origin = node.origin();
+
848  Coord ijk(0, 0, 0), nijk;
+
849  int step = -1;
+
850 
+
851  if (UpWind) {
+
852  step = 1;
+
853  ijk[0] = int(BoolLeafNodeType::DIM) - 1;
+
854  }
+
855 
+
856  const Index xPos = ijk[0] << (2 * int(BoolLeafNodeType::LOG2DIM));
+
857 
+
858  for (ijk[1] = 0; ijk[1] < int(BoolLeafNodeType::DIM); ++ijk[1]) {
+
859  const Index yPos = xPos + (ijk[1] << int(BoolLeafNodeType::LOG2DIM));
+
860 
+
861  for (ijk[2] = 0; ijk[2] < int(BoolLeafNodeType::DIM); ++ijk[2]) {
+
862  const Index pos = yPos + ijk[2];
+
863 
+
864  if (valueMask[pos] == 0 && node.isValueOn(pos)) {
+
865 
+
866  nijk = origin + ijk.offsetBy(step, 0, 0);
+
867 
+
868  if (!maskAcc.isValueOn(nijk) && distAcc.getValue(nijk) > mIsovalue) {
+
869  valueMask[pos] = 1;
+
870  }
+
871  }
+
872  }
+
873  }
+
874  }
+
875 
+
876  // If UpWind is true check the Y+ oriented node face, else the Y- oriented face.
+
877  template<bool UpWind>
+
878  void evalExternalNeighborsY(char* valueMask, const BoolLeafNodeType& node,
+
879  const tree::ValueAccessor<const BoolTreeType>& maskAcc,
+
880  const tree::ValueAccessor<const TreeType>& distAcc) const {
+
881 
+
882  const Coord& origin = node.origin();
+
883  Coord ijk(0, 0, 0), nijk;
+
884  int step = -1;
+
885 
+
886  if (UpWind) {
+
887  step = 1;
+
888  ijk[1] = int(BoolLeafNodeType::DIM) - 1;
+
889  }
+
890 
+
891  const Index yPos = ijk[1] << int(BoolLeafNodeType::LOG2DIM);
+
892 
+
893  for (ijk[0] = 0; ijk[0] < int(BoolLeafNodeType::DIM); ++ijk[0]) {
+
894  const Index xPos = yPos + (ijk[0] << (2 * int(BoolLeafNodeType::LOG2DIM)));
+
895 
+
896  for (ijk[2] = 0; ijk[2] < int(BoolLeafNodeType::DIM); ++ijk[2]) {
+
897  const Index pos = xPos + ijk[2];
+
898 
+
899  if (valueMask[pos] == 0 && node.isValueOn(pos)) {
+
900 
+
901  nijk = origin + ijk.offsetBy(0, step, 0);
+
902  if (!maskAcc.isValueOn(nijk) && distAcc.getValue(nijk) > mIsovalue) {
+
903  valueMask[pos] = 1;
+
904  }
+
905  }
+
906  }
+
907  }
+
908  }
+
909 
+
910  // If UpWind is true check the Z+ oriented node face, else the Z- oriented face.
+
911  template<bool UpWind>
+
912  void evalExternalNeighborsZ(char* valueMask, const BoolLeafNodeType& node,
+
913  const tree::ValueAccessor<const BoolTreeType>& maskAcc,
+
914  const tree::ValueAccessor<const TreeType>& distAcc) const {
+
915 
+
916  const Coord& origin = node.origin();
+
917  Coord ijk(0, 0, 0), nijk;
+
918  int step = -1;
+
919 
+
920  if (UpWind) {
+
921  step = 1;
+
922  ijk[2] = int(BoolLeafNodeType::DIM) - 1;
+
923  }
+
924 
+
925  for (ijk[0] = 0; ijk[0] < int(BoolLeafNodeType::DIM); ++ijk[0]) {
+
926  const Index xPos = ijk[0] << (2 * int(BoolLeafNodeType::LOG2DIM));
+
927 
+
928  for (ijk[1] = 0; ijk[1] < int(BoolLeafNodeType::DIM); ++ijk[1]) {
+
929  const Index pos = ijk[2] + xPos + (ijk[1] << int(BoolLeafNodeType::LOG2DIM));
+
930 
+
931  if (valueMask[pos] == 0 && node.isValueOn(pos)) {
+
932 
+
933  nijk = origin + ijk.offsetBy(0, 0, step);
+
934  if (!maskAcc.isValueOn(nijk) && distAcc.getValue(nijk) > mIsovalue) {
+
935  valueMask[pos] = 1;
+
936  }
+
937  }
+
938  }
+
939  }
+
940  }
+
941 
+
943 
+
944  TreeType const * const mTree;
+
945  BoolTreeType const * const mFillMask;
+
946  BoolLeafNodeType const * const * const mFillNodes;
+
947  BoolLeafNodeType ** const mNewNodes;
+
948  ValueType const mIsovalue;
+
949 }; // FillMaskBoundary
+
950 
+
951 
+
954 template <class TreeType>
+
955 inline typename TreeType::template ValueConverter<char>::Type::Ptr
+
956 computeEnclosedRegionMask(const TreeType& tree, typename TreeType::ValueType isovalue,
+
957  const typename TreeType::template ValueConverter<bool>::Type* fillMask)
+
958 {
+
959  typedef typename TreeType::LeafNodeType LeafNodeType;
+
960  typedef typename TreeType::RootNodeType RootNodeType;
+
961  typedef typename RootNodeType::NodeChainType NodeChainType;
+
962  typedef typename boost::mpl::at<NodeChainType, boost::mpl::int_<1> >::type InternalNodeType;
+
963 
+
964  typedef typename TreeType::template ValueConverter<char>::Type CharTreeType;
+
965  typedef typename CharTreeType::LeafNodeType CharLeafNodeType;
+
966  typedef typename CharTreeType::RootNodeType CharRootNodeType;
+
967  typedef typename CharRootNodeType::NodeChainType CharNodeChainType;
+
968 
+
969  typedef typename TreeType::template ValueConverter<bool>::Type BoolTreeType;
+
970  typedef typename BoolTreeType::LeafNodeType BoolLeafNodeType;
+
971 
+
973 
+
974  const TreeType* treePt = &tree;
+
975 
+
976  size_t numLeafNodes = 0, numInternalNodes = 0;
+
977 
+
978  std::vector<const LeafNodeType*> nodes;
+
979  std::vector<size_t> leafnodeCount;
+
980 
+
981  {
+
982  // compute the prefix sum of the leafnode count in each internal node.
+
983  std::vector<const InternalNodeType*> internalNodes;
+
984  treePt->getNodes(internalNodes);
+
985 
+
986  numInternalNodes = internalNodes.size();
+
987 
+
988  leafnodeCount.push_back(0);
+
989  for (size_t n = 0; n < numInternalNodes; ++n) {
+
990  leafnodeCount.push_back(leafnodeCount.back() + internalNodes[n]->leafCount());
+
991  }
+
992 
+
993  numLeafNodes = leafnodeCount.back();
+
994 
+
995  // extract all leafnodes
+
996  nodes.reserve(numLeafNodes);
+
997 
+
998  for (size_t n = 0; n < numInternalNodes; ++n) {
+
999  internalNodes[n]->getNodes(nodes);
+
1000  }
+
1001  }
+
1002 
+
1003  // create mask leafnodes
+
1004  boost::scoped_array<CharLeafNodeType*> maskNodes(new CharLeafNodeType*[numLeafNodes]);
+
1005 
+
1006  tbb::parallel_for(tbb::blocked_range<size_t>(0, numLeafNodes),
+
1007  LabelBoundaryVoxels<LeafNodeType>(isovalue, &nodes[0], maskNodes.get()));
+
1008 
+
1009  // create mask grid
+
1010  typename CharTreeType::Ptr maskTree(new CharTreeType(1));
+
1011 
+
1012  PopulateTree<CharTreeType> populate(*maskTree, maskNodes.get(), &leafnodeCount[0], 1);
+
1013  tbb::parallel_reduce(tbb::blocked_range<size_t>(0, numInternalNodes), populate);
+
1014 
+
1015  // optionally evaluate the fill mask
+
1016 
+
1017  std::vector<CharLeafNodeType*> extraMaskNodes;
+
1018 
+
1019  if (fillMask) {
+
1020 
+
1021  std::vector<const BoolLeafNodeType*> fillMaskNodes;
+
1022  fillMask->getNodes(fillMaskNodes);
+
1023 
+
1024  boost::scoped_array<BoolLeafNodeType*> boundaryMaskNodes(new BoolLeafNodeType*[fillMaskNodes.size()]);
+
1025 
+
1026  tbb::parallel_for(tbb::blocked_range<size_t>(0, fillMaskNodes.size()),
+
1027  FillMaskBoundary<TreeType>(tree, isovalue, *fillMask, &fillMaskNodes[0], boundaryMaskNodes.get()));
+
1028 
+
1029  tree::ValueAccessor<CharTreeType> maskAcc(*maskTree);
+
1030 
+
1031  for (size_t n = 0, N = fillMaskNodes.size(); n < N; ++n) {
+
1032 
+
1033  if (boundaryMaskNodes[n] == NULL) continue;
+
1034 
+
1035  const BoolLeafNodeType& boundaryNode = *boundaryMaskNodes[n];
+
1036  const Coord& origin = boundaryNode.origin();
+
1037 
+
1038  CharLeafNodeType* maskNodePt = maskAcc.probeLeaf(origin);
+
1039 
+
1040  if (!maskNodePt) {
+
1041  maskNodePt = maskAcc.touchLeaf(origin);
+
1042  extraMaskNodes.push_back(maskNodePt);
+
1043  }
+
1044 
+
1045  char* data = maskNodePt->buffer().data();
+
1046 
+
1047  typename BoolLeafNodeType::ValueOnCIter it = boundaryNode.cbeginValueOn();
+
1048  for (; it; ++it) {
+
1049  if (data[it.pos()] != 0) data[it.pos()] = -1;
+
1050  }
+
1051 
+
1052  delete boundaryMaskNodes[n];
+
1053  }
+
1054  }
+
1055 
+
1056  // eliminate enclosed regions
+
1057  tools::traceExteriorBoundaries(*maskTree);
+
1058 
+
1059  // flip voxel sign to negative inside and positive outside.
+
1060  tbb::parallel_for(tbb::blocked_range<size_t>(0, numLeafNodes),
+
1061  FlipRegionSign<CharLeafNodeType>(maskNodes.get()));
+
1062 
+
1063  if (!extraMaskNodes.empty()) {
+
1064  tbb::parallel_for(tbb::blocked_range<size_t>(0, extraMaskNodes.size()),
+
1065  FlipRegionSign<CharLeafNodeType>(&extraMaskNodes[0]));
+
1066  }
+
1067 
+
1068  // propagate sign information into tile region
+
1069  tools::signedFloodFill(*maskTree);
+
1070 
+
1071  return maskTree;
+
1072 } // computeEnclosedRegionMask()
+
1073 
+
1074 
+
1075 template <class TreeType>
+
1076 inline typename TreeType::template ValueConverter<bool>::Type::Ptr
+
1077 computeInteriorMask(const TreeType& tree, typename TreeType::ValueType iso)
+
1078 {
+
1079  typedef typename TreeType::LeafNodeType LeafNodeType;
+
1080  typedef typename TreeType::RootNodeType RootNodeType;
+
1081  typedef typename RootNodeType::NodeChainType NodeChainType;
+
1082  typedef typename boost::mpl::at<NodeChainType, boost::mpl::int_<1> >::type InternalNodeType;
+
1083 
+
1084  typedef typename TreeType::template ValueConverter<bool>::Type BoolTreeType;
+
1085  typedef typename BoolTreeType::LeafNodeType BoolLeafNodeType;
+
1086  typedef typename BoolTreeType::RootNodeType BoolRootNodeType;
+
1087  typedef typename BoolRootNodeType::NodeChainType BoolNodeChainType;
+
1088  typedef typename boost::mpl::at<BoolNodeChainType, boost::mpl::int_<1> >::type BoolInternalNodeType;
+
1089 
+
1091  size_t numLeafNodes = 0, numInternalNodes = 0;
+
1092 
+
1093  std::vector<const LeafNodeType*> nodes;
+
1094  std::vector<size_t> leafnodeCount;
+
1095 
+
1096  {
+
1097  // compute the prefix sum of the leafnode count in each internal node.
+
1098  std::vector<const InternalNodeType*> internalNodes;
+
1099  tree.getNodes(internalNodes);
+
1100 
+
1101  numInternalNodes = internalNodes.size();
+
1102 
+
1103  leafnodeCount.push_back(0);
+
1104  for (size_t n = 0; n < numInternalNodes; ++n) {
+
1105  leafnodeCount.push_back(leafnodeCount.back() + internalNodes[n]->leafCount());
+
1106  }
+
1107 
+
1108  numLeafNodes = leafnodeCount.back();
+
1109 
+
1110  // extract all leafnodes
+
1111  nodes.reserve(numLeafNodes);
+
1112 
+
1113  for (size_t n = 0; n < numInternalNodes; ++n) {
+
1114  internalNodes[n]->getNodes(nodes);
+
1115  }
+
1116  }
+
1117 
+
1118  // create mask leafnodes
+
1119  boost::scoped_array<BoolLeafNodeType*> maskNodes(new BoolLeafNodeType*[numLeafNodes]);
+
1120 
+
1121  tbb::parallel_for(tbb::blocked_range<size_t>(0, numLeafNodes),
+
1122  MaskInteriorVoxels<LeafNodeType>(iso, &nodes[0], maskNodes.get()));
+
1123 
+
1124 
+
1125  // create mask grid
+
1126  typename BoolTreeType::Ptr maskTree(new BoolTreeType(false));
+
1127 
+
1128  PopulateTree<BoolTreeType> populate(*maskTree, maskNodes.get(), &leafnodeCount[0], false);
+
1129  tbb::parallel_reduce(tbb::blocked_range<size_t>(0, numInternalNodes), populate);
+
1130 
+
1131 
+
1132  // evaluate tile values
+
1133  std::vector<BoolInternalNodeType*> internalMaskNodes;
+
1134  maskTree->getNodes(internalMaskNodes);
+
1135 
+
1136  tbb::parallel_for(tbb::blocked_range<size_t>(0, internalMaskNodes.size()),
+
1137  MaskInteriorTiles<TreeType, BoolInternalNodeType>(iso, tree, &internalMaskNodes[0]));
+
1138 
+ +
1140 
+
1141  typename BoolTreeType::ValueAllIter it(*maskTree);
+
1142  it.setMaxDepth(BoolTreeType::ValueAllIter::LEAF_DEPTH - 2);
+
1143 
+
1144  for ( ; it; ++it) {
+
1145  if (acc.getValue(it.getCoord()) < iso) {
+
1146  it.setValue(true);
+
1147  it.setActiveState(true);
+
1148  }
+
1149  }
+
1150 
+
1151  return maskTree;
+
1152 } // computeInteriorMask()
+
1153 
+
1154 
+
1155 template<typename InputTreeType>
+ +
1157 {
+
1158  typedef typename InputTreeType::ValueType InputValueType;
+
1159  typedef typename InputTreeType::LeafNodeType InputLeafNodeType;
+
1160  typedef typename InputTreeType::template ValueConverter<bool>::Type BoolTreeType;
+
1161  typedef typename BoolTreeType::LeafNodeType BoolLeafNodeType;
+
1162 
+ +
1164  const InputTreeType& inputTree,
+
1165  const std::vector<const InputLeafNodeType*>& inputLeafNodes,
+
1166  BoolTreeType& maskTree,
+
1167  InputValueType iso)
+
1168  : mInputAccessor(inputTree)
+
1169  , mInputNodes(!inputLeafNodes.empty() ? &inputLeafNodes.front() : NULL)
+
1170  , mMaskTree(false)
+
1171  , mMaskAccessor(maskTree)
+
1172  , mIsovalue(iso)
+
1173  {
+
1174  }
+
1175 
+ +
1177  : mInputAccessor(rhs.mInputAccessor.tree())
+
1178  , mInputNodes(rhs.mInputNodes)
+
1179  , mMaskTree(false)
+
1180  , mMaskAccessor(mMaskTree)
+
1181  , mIsovalue(rhs.mIsovalue)
+
1182  {
+
1183  }
+
1184 
+
1185  void operator()(const tbb::blocked_range<size_t>& range) {
+
1186 
+
1187  const InputValueType iso = mIsovalue;
+
1188  Coord ijk(0, 0, 0);
+
1189 
+
1190  BoolLeafNodeType* maskNodePt = NULL;
+
1191 
+
1192  for (size_t n = range.begin(); mInputNodes && (n != range.end()); ++n) {
+
1193 
+
1194  const InputLeafNodeType& node = *mInputNodes[n];
+
1195 
+
1196  if (!maskNodePt) maskNodePt = new BoolLeafNodeType(node.origin(), false);
+
1197  else maskNodePt->setOrigin(node.origin());
+
1198 
+
1199  bool collectedData = false;
+
1200 
+
1201  for (typename InputLeafNodeType::ValueOnCIter it = node.cbeginValueOn(); it; ++it) {
+
1202 
+
1203  bool isUnder = *it < iso;
+
1204 
+
1205  ijk = it.getCoord();
+
1206 
+
1207  ++ijk[2];
+
1208  bool signChange = isUnder != (mInputAccessor.getValue(ijk) < iso); // +z edge
+
1209  --ijk[2];
+
1210 
+
1211  if (!signChange) {
+
1212  --ijk[2];
+
1213  signChange = isUnder != (mInputAccessor.getValue(ijk) < iso); // -z edge
+
1214  ++ijk[2];
+
1215  }
+
1216 
+
1217  if (!signChange) {
+
1218  ++ijk[1];
+
1219  signChange = isUnder != (mInputAccessor.getValue(ijk) < iso); // +y edge
+
1220  --ijk[1];
+
1221  }
+
1222 
+
1223  if (!signChange) {
+
1224  --ijk[1];
+
1225  signChange = isUnder != (mInputAccessor.getValue(ijk) < iso); // -y edge
+
1226  ++ijk[1];
+
1227  }
+
1228 
+
1229  if (!signChange) {
+
1230  ++ijk[0];
+
1231  signChange = isUnder != (mInputAccessor.getValue(ijk) < iso); // +x edge
+
1232  --ijk[0];
+
1233  }
+
1234 
+
1235  if (!signChange) {
+
1236  --ijk[0];
+
1237  signChange = isUnder != (mInputAccessor.getValue(ijk) < iso); // -x edge
+
1238  ++ijk[0];
+
1239  }
+
1240 
+
1241  if (signChange) {
+
1242  collectedData = true;
+
1243  maskNodePt->setValueOn(it.pos(), true);
+
1244  }
+
1245  }
+
1246 
+
1247  if (collectedData) {
+
1248  mMaskAccessor.addLeaf(maskNodePt);
+
1249  maskNodePt = NULL;
+
1250  }
+
1251  }
+
1252 
+
1253  if (maskNodePt) delete maskNodePt;
+
1254  }
+
1255 
+ +
1257  mMaskAccessor.tree().merge(rhs.mMaskAccessor.tree());
+
1258  }
+
1259 
+
1260 private:
+ +
1262  InputLeafNodeType const * const * const mInputNodes;
+
1263 
+
1264  BoolTreeType mMaskTree;
+
1265  tree::ValueAccessor<BoolTreeType> mMaskAccessor;
+
1266 
+
1267  InputValueType mIsovalue;
+
1268 }; // MaskIsovalueCrossingVoxels
+
1269 
+
1270 
+
1272 
+
1273 
+
1274 template<typename NodeType>
+ +
1276 {
+
1277  typedef boost::shared_ptr<NodeMaskSegment> Ptr;
+
1278  typedef typename NodeType::NodeMaskType NodeMaskType;
+
1279 
+
1280  NodeMaskSegment() : connections(), mask(false), origin(0,0,0), visited(false) {}
+
1281 
+
1282  std::vector<NodeMaskSegment*> connections;
+
1283  NodeMaskType mask;
+
1284  Coord origin;
+
1285  bool visited;
+
1286 }; // struct NodeMaskSegment
+
1287 
+
1288 
+
1289 template<typename NodeType>
+
1290 inline void
+
1291 nodeMaskSegmentation(const NodeType& node,
+
1292  std::vector<typename NodeMaskSegment<NodeType>::Ptr>& segments)
+
1293 {
+
1294  typedef typename NodeType::NodeMaskType NodeMaskType;
+
1295  typedef NodeMaskSegment<NodeType> NodeMaskSegmentType;
+
1296  typedef typename NodeMaskSegmentType::Ptr NodeMaskSegmentTypePtr;
+
1297 
+
1298  NodeMaskType nodeMask(node.getValueMask());
+
1299  std::deque<Index> indexList;
+
1300 
+
1301  while (!nodeMask.isOff()) {
+
1302 
+
1303  NodeMaskSegmentTypePtr segment(new NodeMaskSegmentType());
+
1304  segment->origin = node.origin();
+
1305 
+
1306  NodeMaskType& mask = segment->mask;
+
1307 
+
1308  indexList.push_back(nodeMask.findFirstOn());
+
1309  nodeMask.setOff(indexList.back()); // mark as visited
+
1310  Coord ijk(0, 0, 0);
+
1311 
+
1312  while (!indexList.empty()) {
+
1313 
+
1314  const Index pos = indexList.back();
+
1315  indexList.pop_back();
+
1316 
+
1317  if (mask.isOn(pos)) continue;
+
1318  mask.setOn(pos);
+
1319 
+
1320  ijk = NodeType::offsetToLocalCoord(pos);
+
1321 
+
1322  Index npos = pos - 1;
+
1323  if (ijk[2] != 0 && nodeMask.isOn(npos)) {
+
1324  nodeMask.setOff(npos);
+
1325  indexList.push_back(npos);
+
1326  }
+
1327 
+
1328  npos = pos + 1;
+
1329  if (ijk[2] != (NodeType::DIM - 1) && nodeMask.isOn(npos)) {
+
1330  nodeMask.setOff(npos);
+
1331  indexList.push_back(npos);
+
1332  }
+
1333 
+
1334  npos = pos - NodeType::DIM;
+
1335  if (ijk[1] != 0 && nodeMask.isOn(npos)) {
+
1336  nodeMask.setOff(npos);
+
1337  indexList.push_back(npos);
+
1338  }
+
1339 
+
1340  npos = pos + NodeType::DIM;
+
1341  if (ijk[1] != (NodeType::DIM - 1) && nodeMask.isOn(npos)) {
+
1342  nodeMask.setOff(npos);
+
1343  indexList.push_back(npos);
+
1344  }
+
1345 
+
1346  npos = pos - NodeType::DIM * NodeType::DIM;
+
1347  if (ijk[0] != 0 && nodeMask.isOn(npos)) {
+
1348  nodeMask.setOff(npos);
+
1349  indexList.push_back(npos);
+
1350  }
+
1351 
+
1352  npos = pos + NodeType::DIM * NodeType::DIM;
+
1353  if (ijk[0] != (NodeType::DIM - 1) && nodeMask.isOn(npos)) {
+
1354  nodeMask.setOff(npos);
+
1355  indexList.push_back(npos);
+
1356  }
+
1357 
+
1358  }
+
1359 
+
1360  segments.push_back(segment);
+
1361  }
+
1362 }
+
1363 
+
1364 
+
1365 template<typename NodeType>
+ +
1367 {
+ + +
1370  typedef typename std::vector<NodeMaskSegmentTypePtr> NodeMaskSegmentVector;
+
1371 
+
1372  SegmentNodeMask(std::vector<NodeType*>& nodes, NodeMaskSegmentVector* nodeMaskArray)
+
1373  : mNodes(!nodes.empty() ? &nodes.front() : NULL)
+
1374  , mNodeMaskArray(nodeMaskArray)
+
1375  {
+
1376  }
+
1377 
+
1378  void operator()(const tbb::blocked_range<size_t>& range) const {
+
1379  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
1380  NodeType& node = *mNodes[n];
+
1381  nodeMaskSegmentation(node, mNodeMaskArray[n]);
+
1382 
+
1383  // hack origin data to store array offset
+
1384  Coord& origin = const_cast<Coord&>(node.origin());
+
1385  origin[0] = static_cast<int>(n);
+
1386  }
+
1387  }
+
1388 
+
1389  NodeType * const * const mNodes;
+
1390  NodeMaskSegmentVector * const mNodeMaskArray;
+
1391 }; // struct SegmentNodeMask
+
1392 
+
1393 
+
1394 template<typename TreeType, typename NodeType>
+ +
1396 {
+
1397  typedef typename NodeType::NodeMaskType NodeMaskType;
+ + +
1400  typedef typename std::vector<NodeMaskSegmentTypePtr> NodeMaskSegmentVector;
+
1401 
+
1402  ConnectNodeMaskSegments(const TreeType& tree, NodeMaskSegmentVector* nodeMaskArray)
+
1403  : mTree(&tree)
+
1404  , mNodeMaskArray(nodeMaskArray)
+
1405  {
+
1406  }
+
1407 
+
1408  void operator()(const tbb::blocked_range<size_t>& range) const {
+
1409 
+ +
1411 
+
1412  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
1413 
+
1414  NodeMaskSegmentVector& segments = mNodeMaskArray[n];
+
1415  if (segments.empty()) continue;
+
1416 
+
1417  std::vector<std::set<NodeMaskSegmentType*> > connections(segments.size());
+
1418 
+
1419  Coord ijk = segments[0]->origin;
+
1420 
+
1421  const NodeType* node = acc.template probeConstNode<NodeType>(ijk);
+
1422  if (!node) continue;
+
1423 
+
1424  // get neighbour nodes
+
1425 
+
1426  ijk[2] += NodeType::DIM;
+
1427  const NodeType* nodeZUp = acc.template probeConstNode<NodeType>(ijk);
+
1428  ijk[2] -= (NodeType::DIM + NodeType::DIM);
+
1429  const NodeType* nodeZDown = acc.template probeConstNode<NodeType>(ijk);
+
1430  ijk[2] += NodeType::DIM;
+
1431 
+
1432  ijk[1] += NodeType::DIM;
+
1433  const NodeType* nodeYUp = acc.template probeConstNode<NodeType>(ijk);
+
1434  ijk[1] -= (NodeType::DIM + NodeType::DIM);
+
1435  const NodeType* nodeYDown = acc.template probeConstNode<NodeType>(ijk);
+
1436  ijk[1] += NodeType::DIM;
+
1437 
+
1438  ijk[0] += NodeType::DIM;
+
1439  const NodeType* nodeXUp = acc.template probeConstNode<NodeType>(ijk);
+
1440  ijk[0] -= (NodeType::DIM + NodeType::DIM);
+
1441  const NodeType* nodeXDown = acc.template probeConstNode<NodeType>(ijk);
+
1442  ijk[0] += NodeType::DIM;
+
1443 
+
1444  const Index startPos = node->getValueMask().findFirstOn();
+
1445  for (Index pos = startPos; pos < NodeMaskType::SIZE; ++pos) {
+
1446 
+
1447  if (!node->isValueOn(pos)) continue;
+
1448 
+
1449  ijk = NodeType::offsetToLocalCoord(pos);
+
1450  Index npos = 0;
+
1451 
+
1452  if (ijk[2] == 0) {
+
1453  npos = pos + (NodeType::DIM - 1);
+
1454  if (nodeZDown && nodeZDown->isValueOn(npos)) {
+
1455  NodeMaskSegmentType* nsegment =
+
1456  findNodeMaskSegment(mNodeMaskArray[getNodeOffset(*nodeZDown)], npos);
+
1457  const Index idx = findNodeMaskSegmentIndex(segments, pos);
+
1458  connections[idx].insert(nsegment);
+
1459  }
+
1460  } else if (ijk[2] == (NodeType::DIM - 1)) {
+
1461  npos = pos - (NodeType::DIM - 1);
+
1462  if (nodeZUp && nodeZUp->isValueOn(npos)) {
+
1463  NodeMaskSegmentType* nsegment =
+
1464  findNodeMaskSegment(mNodeMaskArray[getNodeOffset(*nodeZUp)], npos);
+
1465  const Index idx = findNodeMaskSegmentIndex(segments, pos);
+
1466  connections[idx].insert(nsegment);
+
1467  }
+
1468  }
+
1469 
+
1470  if (ijk[1] == 0) {
+
1471  npos = pos + (NodeType::DIM - 1) * NodeType::DIM;
+
1472  if (nodeYDown && nodeYDown->isValueOn(npos)) {
+
1473  NodeMaskSegmentType* nsegment =
+
1474  findNodeMaskSegment(mNodeMaskArray[getNodeOffset(*nodeYDown)], npos);
+
1475  const Index idx = findNodeMaskSegmentIndex(segments, pos);
+
1476  connections[idx].insert(nsegment);
+
1477  }
+
1478  } else if (ijk[1] == (NodeType::DIM - 1)) {
+
1479  npos = pos - (NodeType::DIM - 1) * NodeType::DIM;
+
1480  if (nodeYUp && nodeYUp->isValueOn(npos)) {
+
1481  NodeMaskSegmentType* nsegment =
+
1482  findNodeMaskSegment(mNodeMaskArray[getNodeOffset(*nodeYUp)], npos);
+
1483  const Index idx = findNodeMaskSegmentIndex(segments, pos);
+
1484  connections[idx].insert(nsegment);
+
1485  }
+
1486  }
+
1487 
+
1488  if (ijk[0] == 0) {
+
1489  npos = pos + (NodeType::DIM - 1) * NodeType::DIM * NodeType::DIM;
+
1490  if (nodeXDown && nodeXDown->isValueOn(npos)) {
+
1491  NodeMaskSegmentType* nsegment =
+
1492  findNodeMaskSegment(mNodeMaskArray[getNodeOffset(*nodeXDown)], npos);
+
1493  const Index idx = findNodeMaskSegmentIndex(segments, pos);
+
1494  connections[idx].insert(nsegment);
+
1495  }
+
1496  } else if (ijk[0] == (NodeType::DIM - 1)) {
+
1497  npos = pos - (NodeType::DIM - 1) * NodeType::DIM * NodeType::DIM;
+
1498  if (nodeXUp && nodeXUp->isValueOn(npos)) {
+
1499  NodeMaskSegmentType* nsegment =
+
1500  findNodeMaskSegment(mNodeMaskArray[getNodeOffset(*nodeXUp)], npos);
+
1501  const Index idx = findNodeMaskSegmentIndex(segments, pos);
+
1502  connections[idx].insert(nsegment);
+
1503  }
+
1504  }
+
1505  }
+
1506 
+
1507  for (size_t i = 0, I = connections.size(); i < I; ++i) {
+
1508 
+
1509  typename std::set<NodeMaskSegmentType*>::iterator
+
1510  it = connections[i].begin(), end = connections[i].end();
+
1511 
+
1512  std::vector<NodeMaskSegmentType*>& segmentConnections = segments[i]->connections;
+
1513  segmentConnections.reserve(connections.size());
+
1514  for (; it != end; ++it) {
+
1515  segmentConnections.push_back(*it);
+
1516  }
+
1517  }
+
1518  } // end range loop
+
1519  }
+
1520 
+
1521 private:
+
1522 
+
1523  static inline size_t getNodeOffset(const NodeType& node) {
+
1524  return static_cast<size_t>(node.origin()[0]);
+
1525  }
+
1526 
+
1527  static inline NodeMaskSegmentType*
+
1528  findNodeMaskSegment(NodeMaskSegmentVector& segments, Index pos)
+
1529  {
+
1530  NodeMaskSegmentType* segment = NULL;
+
1531 
+
1532  for (size_t n = 0, N = segments.size(); n < N; ++n) {
+
1533  if (segments[n]->mask.isOn(pos)) {
+
1534  segment = segments[n].get();
+
1535  break;
+
1536  }
+
1537  }
+
1538 
+
1539  return segment;
+
1540  }
+
1541 
+
1542  static inline Index
+
1543  findNodeMaskSegmentIndex(NodeMaskSegmentVector& segments, Index pos)
+
1544  {
+
1545  for (Index n = 0, N = Index(segments.size()); n < N; ++n) {
+
1546  if (segments[n]->mask.isOn(pos)) return n;
+
1547  }
+
1548  return Index(-1);
+
1549  }
+
1550 
+
1551  TreeType const * const mTree;
+
1552  NodeMaskSegmentVector * const mNodeMaskArray;
+
1553 }; // struct ConnectNodeMaskSegments
+
1554 
+
1555 
+
1556 template<typename TreeType>
+ +
1558 {
+
1559  typedef typename TreeType::LeafNodeType LeafNodeType;
+
1560  typedef typename TreeType::Ptr TreeTypePtr;
+ +
1562 
+
1563  MaskSegmentGroup(const std::vector<NodeMaskSegmentType*>& segments)
+
1564  : mSegments(!segments.empty() ? &segments.front() : NULL)
+
1565  , mTree(new TreeType(false))
+
1566  {
+
1567  }
+
1568 
+
1569  MaskSegmentGroup(const MaskSegmentGroup& rhs, tbb::split)
+
1570  : mSegments(rhs.mSegments)
+
1571  , mTree(new TreeType(false))
+
1572  {
+
1573  }
+
1574 
+
1575  TreeTypePtr& mask() { return mTree; }
+
1576 
+
1577  void join(MaskSegmentGroup& rhs) { mTree->merge(*rhs.mTree); }
+
1578 
+
1579  void operator()(const tbb::blocked_range<size_t>& range) {
+
1580 
+
1581  tree::ValueAccessor<TreeType> acc(*mTree);
+
1582 
+
1583  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
1584  NodeMaskSegmentType& segment = *mSegments[n];
+
1585  LeafNodeType* node = acc.touchLeaf(segment.origin);
+
1586  node->getValueMask() |= segment.mask;
+
1587  }
+
1588  }
+
1589 
+
1590 private:
+
1591  NodeMaskSegmentType * const * const mSegments;
+
1592  TreeTypePtr mTree;
+
1593 }; // struct MaskSegmentGroup
+
1594 
+
1595 
+
1597 
+
1598 
+
1599 template<typename TreeType>
+ +
1601 {
+
1602  typedef typename TreeType::ValueType ValueType;
+
1603  typedef typename TreeType::LeafNodeType LeafNodeType;
+
1604  typedef typename LeafNodeType::NodeMaskType NodeMaskType;
+
1605 
+
1606  typedef typename TreeType::template ValueConverter<bool>::Type BoolTreeType;
+
1607  typedef typename BoolTreeType::LeafNodeType BoolLeafNodeType;
+
1608 
+
1610 
+
1611  ExpandLeafNodeRegion(const TreeType& distTree, BoolTreeType& maskTree, std::vector<BoolLeafNodeType*>& maskNodes)
+
1612  : mDistTree(&distTree)
+
1613  , mMaskTree(&maskTree)
+
1614  , mMaskNodes(!maskNodes.empty() ? &maskNodes.front() : NULL)
+
1615  , mNewMaskTree(false)
+
1616  {
+
1617  }
+
1618 
+ +
1620  : mDistTree(rhs.mDistTree)
+
1621  , mMaskTree(rhs.mMaskTree)
+
1622  , mMaskNodes(rhs.mMaskNodes)
+
1623  , mNewMaskTree(false)
+
1624  {
+
1625  }
+
1626 
+
1627  BoolTreeType& newMaskTree() { return mNewMaskTree; }
+
1628 
+
1629  void join(ExpandLeafNodeRegion& rhs) { mNewMaskTree.merge(rhs.mNewMaskTree); }
+
1630 
+
1631  void operator()(const tbb::blocked_range<size_t>& range) {
+
1632 
+
1633  typedef LeafNodeType NodeType;
+
1634 
+
1635  tree::ValueAccessor<const TreeType> distAcc(*mDistTree);
+
1636  tree::ValueAccessor<const BoolTreeType> maskAcc(*mMaskTree);
+
1637  tree::ValueAccessor<BoolTreeType> newMaskAcc(mNewMaskTree);
+
1638 
+
1639  NodeMaskType maskZUp, maskZDown, maskYUp, maskYDown, maskXUp, maskXDown;
+
1640 
+
1641  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
1642 
+
1643  BoolLeafNodeType& maskNode = *mMaskNodes[n];
+
1644  if (maskNode.isEmpty()) continue;
+
1645 
+
1646  Coord ijk = maskNode.origin(), nijk;
+
1647 
+
1648  const LeafNodeType* distNode = distAcc.probeConstLeaf(ijk);
+
1649  if (!distNode) continue;
+
1650 
+
1651  const ValueType *dataZUp = NULL, *dataZDown = NULL,
+
1652  *dataYUp = NULL, *dataYDown = NULL,
+
1653  *dataXUp = NULL, *dataXDown = NULL;
+
1654 
+
1655  ijk[2] += NodeType::DIM;
+
1656  getData(ijk, distAcc, maskAcc, maskZUp, dataZUp);
+
1657  ijk[2] -= (NodeType::DIM + NodeType::DIM);
+
1658  getData(ijk, distAcc, maskAcc, maskZDown, dataZDown);
+
1659  ijk[2] += NodeType::DIM;
+
1660 
+
1661  ijk[1] += NodeType::DIM;
+
1662  getData(ijk, distAcc, maskAcc, maskYUp, dataYUp);
+
1663  ijk[1] -= (NodeType::DIM + NodeType::DIM);
+
1664  getData(ijk, distAcc, maskAcc, maskYDown, dataYDown);
+
1665  ijk[1] += NodeType::DIM;
+
1666 
+
1667  ijk[0] += NodeType::DIM;
+
1668  getData(ijk, distAcc, maskAcc, maskXUp, dataXUp);
+
1669  ijk[0] -= (NodeType::DIM + NodeType::DIM);
+
1670  getData(ijk, distAcc, maskAcc, maskXDown, dataXDown);
+
1671  ijk[0] += NodeType::DIM;
+
1672 
+
1673  for (typename BoolLeafNodeType::ValueOnIter it = maskNode.beginValueOn(); it; ++it) {
+
1674 
+
1675  const Index pos = it.pos();
+
1676  const ValueType val = std::abs(distNode->getValue(pos));
+
1677 
+
1678  ijk = BoolLeafNodeType::offsetToLocalCoord(pos);
+
1679  nijk = ijk + maskNode.origin();
+
1680 
+
1681  if (dataZUp && ijk[2] == (BoolLeafNodeType::DIM - 1)) {
+
1682  const Index npos = pos - (NodeType::DIM - 1);
+
1683  if (maskZUp.isOn(npos) && std::abs(dataZUp[npos]) > val) {
+
1684  newMaskAcc.setValueOn(nijk.offsetBy(0, 0, 1));
+
1685  }
+
1686  } else if (dataZDown && ijk[2] == 0) {
+
1687  const Index npos = pos + (NodeType::DIM - 1);
+
1688  if (maskZDown.isOn(npos) && std::abs(dataZDown[npos]) > val) {
+
1689  newMaskAcc.setValueOn(nijk.offsetBy(0, 0, -1));
+
1690  }
+
1691  }
+
1692 
+
1693  if (dataYUp && ijk[1] == (BoolLeafNodeType::DIM - 1)) {
+
1694  const Index npos = pos - (NodeType::DIM - 1) * NodeType::DIM;
+
1695  if (maskYUp.isOn(npos) && std::abs(dataYUp[npos]) > val) {
+
1696  newMaskAcc.setValueOn(nijk.offsetBy(0, 1, 0));
+
1697  }
+
1698  } else if (dataYDown && ijk[1] == 0) {
+
1699  const Index npos = pos + (NodeType::DIM - 1) * NodeType::DIM;
+
1700  if (maskYDown.isOn(npos) && std::abs(dataYDown[npos]) > val) {
+
1701  newMaskAcc.setValueOn(nijk.offsetBy(0, -1, 0));
+
1702  }
+
1703  }
+
1704 
+
1705  if (dataXUp && ijk[0] == (BoolLeafNodeType::DIM - 1)) {
+
1706  const Index npos = pos - (NodeType::DIM - 1) * NodeType::DIM * NodeType::DIM;
+
1707  if (maskXUp.isOn(npos) && std::abs(dataXUp[npos]) > val) {
+
1708  newMaskAcc.setValueOn(nijk.offsetBy(1, 0, 0));
+
1709  }
+
1710  } else if (dataXDown && ijk[0] == 0) {
+
1711  const Index npos = pos + (NodeType::DIM - 1) * NodeType::DIM * NodeType::DIM;
+
1712  if (maskXDown.isOn(npos) && std::abs(dataXDown[npos]) > val) {
+
1713  newMaskAcc.setValueOn(nijk.offsetBy(-1, 0, 0));
+
1714  }
+
1715  }
+
1716 
+
1717  } // end value on loop
+
1718  } // end range loop
+
1719  }
+
1720 
+
1721 private:
+
1722 
+
1723  static inline void
+
1724  getData(const Coord& ijk, tree::ValueAccessor<const TreeType>& distAcc,
+
1725  tree::ValueAccessor<const BoolTreeType>& maskAcc, NodeMaskType& mask, const ValueType*& data)
+
1726  {
+
1727  const LeafNodeType* node = distAcc.probeConstLeaf(ijk);
+
1728  if (node) {
+
1729  data = node->buffer().data();
+
1730  mask = node->getValueMask();
+
1731  const BoolLeafNodeType* maskNodePt = maskAcc.probeConstLeaf(ijk);
+
1732  if (maskNodePt) mask -= maskNodePt->getValueMask();
+
1733  }
+
1734  }
+
1735 
+
1736  TreeType const * const mDistTree;
+
1737  BoolTreeType * const mMaskTree;
+
1738  BoolLeafNodeType ** const mMaskNodes;
+
1739 
+
1740  BoolTreeType mNewMaskTree;
+
1741 }; // struct ExpandLeafNodeRegion
+
1742 
+
1743 
+
1744 template<typename TreeType>
+ +
1746 {
+
1747  typedef typename TreeType::ValueType ValueType;
+
1748  typedef typename TreeType::LeafNodeType LeafNodeType;
+
1749  typedef typename LeafNodeType::NodeMaskType NodeMaskType;
+ +
1751 
+
1752  FillLeafNodeVoxels(const TreeType& tree, std::vector<BoolLeafNodeType*>& maskNodes)
+
1753  : mTree(&tree), mMaskNodes(!maskNodes.empty() ? &maskNodes.front() : NULL)
+
1754  {
+
1755  }
+
1756 
+
1757  void operator()(const tbb::blocked_range<size_t>& range) const {
+
1758 
+
1759  tree::ValueAccessor<const TreeType> distAcc(*mTree);
+
1760 
+
1761  std::vector<Index> indexList;
+
1762  indexList.reserve(NodeMaskType::SIZE);
+
1763 
+
1764  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
1765 
+
1766  BoolLeafNodeType& maskNode = *mMaskNodes[n];
+
1767 
+
1768  const LeafNodeType * distNode = distAcc.probeConstLeaf(maskNode.origin());
+
1769  if (!distNode) continue;
+
1770 
+
1771  NodeMaskType mask(distNode->getValueMask());
+
1772  NodeMaskType& narrowbandMask = maskNode.getValueMask();
+
1773 
+
1774  for (Index pos = narrowbandMask.findFirstOn(); pos < NodeMaskType::SIZE; ++pos) {
+
1775  if (narrowbandMask.isOn(pos)) indexList.push_back(pos);
+
1776  }
+
1777 
+
1778  mask -= narrowbandMask; // bitwise difference
+
1779  narrowbandMask.setOff();
+
1780 
+
1781  const ValueType* data = distNode->buffer().data();
+
1782  Coord ijk(0, 0, 0);
+
1783 
+
1784  while (!indexList.empty()) {
+
1785 
+
1786  const Index pos = indexList.back();
+
1787  indexList.pop_back();
+
1788 
+
1789  if (narrowbandMask.isOn(pos)) continue;
+
1790  narrowbandMask.setOn(pos);
+
1791 
+
1792  const ValueType dist = std::abs(data[pos]);
+
1793 
+
1794  ijk = LeafNodeType::offsetToLocalCoord(pos);
+
1795 
+
1796  Index npos = pos - 1;
+
1797  if (ijk[2] != 0 && mask.isOn(npos) && std::abs(data[npos]) > dist) {
+
1798  mask.setOff(npos);
+
1799  indexList.push_back(npos);
+
1800  }
+
1801 
+
1802  npos = pos + 1;
+
1803  if (ijk[2] != (LeafNodeType::DIM - 1) && mask.isOn(npos) && std::abs(data[npos]) > dist) {
+
1804  mask.setOff(npos);
+
1805  indexList.push_back(npos);
+
1806  }
+
1807 
+
1808  npos = pos - LeafNodeType::DIM;
+
1809  if (ijk[1] != 0 && mask.isOn(npos) && std::abs(data[npos]) > dist) {
+
1810  mask.setOff(npos);
+
1811  indexList.push_back(npos);
+
1812  }
+
1813 
+
1814  npos = pos + LeafNodeType::DIM;
+
1815  if (ijk[1] != (LeafNodeType::DIM - 1) && mask.isOn(npos) && std::abs(data[npos]) > dist) {
+
1816  mask.setOff(npos);
+
1817  indexList.push_back(npos);
+
1818  }
+
1819 
+
1820  npos = pos - LeafNodeType::DIM * LeafNodeType::DIM;
+
1821  if (ijk[0] != 0 && mask.isOn(npos) && std::abs(data[npos]) > dist) {
+
1822  mask.setOff(npos);
+
1823  indexList.push_back(npos);
+
1824  }
+
1825 
+
1826  npos = pos + LeafNodeType::DIM * LeafNodeType::DIM;
+
1827  if (ijk[0] != (LeafNodeType::DIM - 1) && mask.isOn(npos) && std::abs(data[npos]) > dist) {
+
1828  mask.setOff(npos);
+
1829  indexList.push_back(npos);
+
1830  }
+
1831  } // end flood fill loop
+
1832  } // end range loop
+
1833  }
+
1834 
+
1835  TreeType const * const mTree;
+
1836  BoolLeafNodeType ** const mMaskNodes;
+
1837 }; // FillLeafNodeVoxels
+
1838 
+
1839 
+
1840 template<typename TreeType>
+ +
1842 {
+
1843  typedef typename TreeType::template ValueConverter<bool>::Type BoolTreeType;
+
1844  typedef typename BoolTreeType::LeafNodeType BoolLeafNodeType;
+
1845  typedef typename BoolTreeType::Ptr BoolTreeTypePtr;
+
1846 
+
1847  ExpandNarrowbandMask(const TreeType& tree, std::vector<BoolTreeTypePtr>& segments)
+
1848  : mTree(&tree), mSegments(!segments.empty() ? &segments.front() : NULL)
+
1849  {
+
1850  }
+
1851 
+
1852  void operator()(const tbb::blocked_range<size_t>& range) const {
+
1853 
+
1854  const TreeType& distTree = *mTree;
+
1855  std::vector<BoolLeafNodeType*> nodes;
+
1856 
+
1857  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
1858 
+
1859  BoolTreeType& narrowBandMask = *mSegments[n];
+
1860 
+
1861  BoolTreeType candidateMask(narrowBandMask, false, TopologyCopy());
+
1862 
+
1863  while (true) {
+
1864 
+
1865  nodes.clear();
+
1866  candidateMask.getNodes(nodes);
+
1867  if (nodes.empty()) break;
+
1868 
+
1869  const tbb::blocked_range<size_t> nodeRange(0, nodes.size());
+
1870 
+
1871  tbb::parallel_for(nodeRange, FillLeafNodeVoxels<TreeType>(distTree, nodes));
+
1872 
+
1873  narrowBandMask.topologyUnion(candidateMask);
+
1874 
+
1875  ExpandLeafNodeRegion<TreeType> op(distTree, narrowBandMask, nodes);
+
1876  tbb::parallel_reduce(nodeRange, op);
+
1877 
+
1878  if (op.newMaskTree().empty()) break;
+
1879 
+
1880  candidateMask.clear();
+
1881  candidateMask.merge(op.newMaskTree());
+
1882  } // end expand loop
+
1883  } // end range loop
+
1884  }
+
1885 
+
1886  TreeType const * const mTree;
+
1887  BoolTreeTypePtr * const mSegments;
+
1888 }; // ExpandNarrowbandMask
+
1889 
+
1890 
+
1891 template<typename TreeType>
+ +
1893 {
+
1894  typedef typename TreeType::Ptr TreeTypePtr;
+
1895  typedef typename TreeType::ValueType ValueType;
+
1896  typedef typename TreeType::LeafNodeType LeafNodeType;
+
1897  typedef typename TreeType::RootNodeType RootNodeType;
+
1898  typedef typename RootNodeType::NodeChainType NodeChainType;
+
1899  typedef typename boost::mpl::at<NodeChainType, boost::mpl::int_<1> >::type InternalNodeType;
+
1900 
+
1901  FloodFillSign(const TreeType& tree, std::vector<TreeTypePtr>& segments)
+
1902  : mTree(&tree)
+
1903  , mSegments(!segments.empty() ? &segments.front() : NULL)
+
1904  , mMinValue(ValueType(0.0))
+
1905  {
+
1906  ValueType minSDFValue = std::numeric_limits<ValueType>::max();
+
1907 
+
1908  {
+
1909  std::vector<const InternalNodeType*> nodes;
+
1910  tree.getNodes(nodes);
+
1911 
+
1912  if (!nodes.empty()) {
+
1913  FindMinTileValue<InternalNodeType> minOp(&nodes[0]);
+
1914  tbb::parallel_reduce(tbb::blocked_range<size_t>(0, nodes.size()), minOp);
+
1915  minSDFValue = std::min(minSDFValue, minOp.minValue);
+
1916  }
+
1917  }
+
1918 
+
1919  if (minSDFValue > ValueType(0.0)) {
+
1920  std::vector<const LeafNodeType*> nodes;
+
1921  tree.getNodes(nodes);
+
1922  if (!nodes.empty()) {
+
1923  FindMinVoxelValue<LeafNodeType> minOp(&nodes[0]);
+
1924  tbb::parallel_reduce(tbb::blocked_range<size_t>(0, nodes.size()), minOp);
+
1925  minSDFValue = std::min(minSDFValue, minOp.minValue);
+
1926  }
+
1927  }
+
1928 
+
1929  mMinValue = minSDFValue;
+
1930  }
+
1931 
+
1932  void operator()(const tbb::blocked_range<size_t>& range) const {
+
1933  const ValueType interiorValue = -std::abs(mMinValue);
+
1934  const ValueType exteriorValue = std::abs(mTree->background());
+
1935  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
1936  tools::signedFloodFillWithValues(*mSegments[n], exteriorValue, interiorValue);
+
1937  }
+
1938  }
+
1939 
+
1940 private:
+
1941 
+
1942  TreeType const * const mTree;
+
1943  TreeTypePtr * const mSegments;
+
1944  ValueType mMinValue;
+
1945 }; // FloodFillSign
+
1946 
+
1947 
+
1948 template<typename TreeType>
+ +
1950 {
+
1951  typedef typename TreeType::Ptr TreeTypePtr;
+
1952  typedef typename TreeType::ValueType ValueType;
+
1953  typedef typename TreeType::LeafNodeType LeafNodeType;
+
1954 
+
1955  typedef typename TreeType::template ValueConverter<bool>::Type BoolTreeType;
+
1956  typedef typename BoolTreeType::Ptr BoolTreeTypePtr;
+
1957  typedef typename BoolTreeType::LeafNodeType BoolLeafNodeType;
+
1958 
+
1959  MaskedCopy(const TreeType& tree, std::vector<TreeTypePtr>& segments, std::vector<BoolTreeTypePtr>& masks)
+
1960  : mTree(&tree)
+
1961  , mSegments(!segments.empty() ? &segments.front() : NULL)
+
1962  , mMasks(!masks.empty() ? &masks.front() : NULL)
+
1963  {
+
1964  }
+
1965 
+
1966  void operator()(const tbb::blocked_range<size_t>& range) const {
+
1967 
+
1968  std::vector<const BoolLeafNodeType*> nodes;
+
1969 
+
1970  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
1971 
+
1972  const BoolTreeType& mask = *mMasks[n];
+
1973 
+
1974  nodes.clear();
+
1975  mask.getNodes(nodes);
+
1976 
+
1977  Copy op(*mTree, nodes);
+
1978  tbb::parallel_reduce(tbb::blocked_range<size_t>(0, nodes.size()), op);
+
1979  mSegments[n] = op.outputTree();
+
1980  }
+
1981  }
+
1982 
+
1983 private:
+
1984 
+
1985  struct Copy {
+
1986  Copy(const TreeType& inputTree, std::vector<const BoolLeafNodeType*>& maskNodes)
+
1987  : mInputTree(&inputTree)
+
1988  , mMaskNodes(!maskNodes.empty() ? &maskNodes.front() : NULL)
+
1989  , mOutputTreePtr(new TreeType(inputTree.background()))
+
1990  {
+
1991  }
+
1992 
+
1993  Copy(const Copy& rhs, tbb::split)
+
1994  : mInputTree(rhs.mInputTree)
+
1995  , mMaskNodes(rhs.mMaskNodes)
+
1996  , mOutputTreePtr(new TreeType(mInputTree->background()))
+
1997  {
+
1998  }
+
1999 
+
2000  TreeTypePtr& outputTree() { return mOutputTreePtr; }
+
2001 
+
2002  void join(Copy& rhs) { mOutputTreePtr->merge(*rhs.mOutputTreePtr); }
+
2003 
+
2004  void operator()(const tbb::blocked_range<size_t>& range) {
+
2005 
+
2006  tree::ValueAccessor<const TreeType> inputAcc(*mInputTree);
+
2007  tree::ValueAccessor<TreeType> outputAcc(*mOutputTreePtr);
+
2008 
+
2009  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
2010 
+
2011  const BoolLeafNodeType& maskNode = *mMaskNodes[n];
+
2012  if (maskNode.isEmpty()) continue;
+
2013 
+
2014  const Coord& ijk = maskNode.origin();
+
2015 
+
2016  const LeafNodeType* inputNode = inputAcc.probeConstLeaf(ijk);
+
2017  if (inputNode) {
+
2018 
+
2019  LeafNodeType* outputNode = outputAcc.touchLeaf(ijk);
+
2020 
+
2021  for (typename BoolLeafNodeType::ValueOnCIter it = maskNode.cbeginValueOn(); it; ++it) {
+
2022  const Index idx = it.pos();
+
2023  outputNode->setValueOn(idx, inputNode->getValue(idx));
+
2024  }
+
2025  } else {
+
2026  const int valueDepth = inputAcc.getValueDepth(ijk);
+
2027  if (valueDepth >= 0) {
+
2028  outputAcc.addTile(TreeType::RootNodeType::LEVEL - valueDepth,
+
2029  ijk, inputAcc.getValue(ijk), true);
+
2030  }
+
2031  }
+
2032  }
+
2033  }
+
2034 
+
2035  private:
+
2036  TreeType const * const mInputTree;
+
2037  BoolLeafNodeType const * const * const mMaskNodes;
+
2038  TreeTypePtr mOutputTreePtr;
+
2039  }; // struct Copy
+
2040 
+
2041  TreeType const * const mTree;
+
2042  TreeTypePtr * const mSegments;
+
2043  BoolTreeTypePtr * const mMasks;
+
2044 }; // MaskedCopy
+
2045 
+
2046 
+
2048 
+
2049 
+
2050 template<typename VolumePtrType>
+ +
2052 {
+
2053  ComputeActiveVoxelCount(std::vector<VolumePtrType>& segments, size_t *countArray)
+
2054  : mSegments(!segments.empty() ? &segments.front() : NULL)
+
2055  , mCountArray(countArray)
+
2056  {
+
2057  }
+
2058 
+
2059  void operator()(const tbb::blocked_range<size_t>& range) const {
+
2060  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
2061  mCountArray[n] = mSegments[n]->activeVoxelCount();
+
2062  }
+
2063  }
+
2064 
+
2065  VolumePtrType * const mSegments;
+
2066  size_t * const mCountArray;
+
2067 };
+
2068 
+
2069 
+ +
2071 {
+
2072  GreaterCount(const size_t *countArray) : mCountArray(countArray) {}
+
2073 
+
2074  inline bool operator() (const size_t& lhs, const size_t& rhs) const
+
2075  {
+
2076  return (mCountArray[lhs] > mCountArray[rhs]);
+
2077  }
+
2078 
+
2079  size_t const * const mCountArray;
+
2080 };
+
2081 
+
2083 
+
2084 
+
2085 template<typename TreeType>
+ +
2087 {
+
2088  typedef typename TreeType::Ptr TreeTypePtr;
+
2089  typedef typename TreeType::template ValueConverter<bool>::Type::Ptr BoolTreePtrType;
+
2090 
+
2091  static BoolTreePtrType constructMask(const TreeType&, BoolTreePtrType& maskTree) { return maskTree; }
+
2092  static TreeTypePtr construct(const TreeType&, TreeTypePtr& tree) { return tree; }
+
2093 };
+
2094 
+
2095 
+
2096 template<typename TreeType>
+
2097 struct GridOrTreeConstructor<Grid<TreeType> >
+
2098 {
+ + +
2101  typedef typename TreeType::Ptr TreeTypePtr;
+
2102 
+
2103  typedef typename TreeType::template ValueConverter<bool>::Type BoolTreeType;
+
2104  typedef typename BoolTreeType::Ptr BoolTreePtrType;
+ + +
2107 
+
2108  static BoolGridPtrType constructMask(const GridType& grid, BoolTreePtrType& maskTree) {
+
2109  BoolGridPtrType maskGrid(BoolGridType::create(maskTree));
+
2110  maskGrid->setTransform(grid.transform().copy());
+
2111  return maskGrid;
+
2112  }
+
2113 
+
2114  static GridTypePtr construct(const GridType& grid, TreeTypePtr& maskTree) {
+
2115  GridTypePtr maskGrid(GridType::create(maskTree));
+
2116  maskGrid->setTransform(grid.transform().copy());
+
2117  maskGrid->insertMeta(grid);
+
2118  return maskGrid;
+
2119  }
+
2120 };
+
2121 
+
2122 
+
2123 } // namespace level_set_util_internal
+
2124 
+
2125 
+
2127 
+
2128 
+
2129 template <class GridType>
+
2130 inline void
+
2131 sdfToFogVolume(GridType& grid, typename GridType::ValueType cutoffDistance)
+
2132 {
+
2133  typedef typename GridType::ValueType ValueType;
+
2134  typedef typename GridType::TreeType TreeType;
+
2135  typedef typename TreeType::LeafNodeType LeafNodeType;
+
2136  typedef typename TreeType::RootNodeType RootNodeType;
+
2137  typedef typename RootNodeType::NodeChainType NodeChainType;
+
2138  typedef typename boost::mpl::at<NodeChainType, boost::mpl::int_<1> >::type InternalNodeType;
+
2139 
+
2141 
+
2142  TreeType& tree = grid.tree();
+
2143 
+
2144  size_t numLeafNodes = 0, numInternalNodes = 0;
+
2145 
+
2146  std::vector<LeafNodeType*> nodes;
+
2147  std::vector<size_t> leafnodeCount;
+
2148 
+
2149  {
+
2150  // Compute the prefix sum of the leafnode count in each internal node.
+
2151  std::vector<InternalNodeType*> internalNodes;
+
2152  tree.getNodes(internalNodes);
+
2153 
+
2154  numInternalNodes = internalNodes.size();
+
2155 
+
2156  leafnodeCount.push_back(0);
+
2157  for (size_t n = 0; n < numInternalNodes; ++n) {
+
2158  leafnodeCount.push_back(leafnodeCount.back() + internalNodes[n]->leafCount());
+
2159  }
+
2160 
+
2161  numLeafNodes = leafnodeCount.back();
+
2162 
+
2163  // Steal all leafnodes (Removes them from the tree and transfers ownership.)
+
2164  nodes.reserve(numLeafNodes);
+
2165 
+
2166  for (size_t n = 0; n < numInternalNodes; ++n) {
+
2167  internalNodes[n]->stealNodes(nodes, tree.background(), false);
+
2168  }
+
2169 
+
2170  // Clamp cutoffDistance to min sdf value
+
2171  ValueType minSDFValue = std::numeric_limits<ValueType>::max();
+
2172 
+
2173  {
+ +
2175  tbb::parallel_reduce(tbb::blocked_range<size_t>(0, internalNodes.size()), minOp);
+
2176  minSDFValue = std::min(minSDFValue, minOp.minValue);
+
2177  }
+
2178 
+
2179  if (minSDFValue > ValueType(0.0)) {
+ +
2181  tbb::parallel_reduce(tbb::blocked_range<size_t>(0, nodes.size()), minOp);
+
2182  minSDFValue = std::min(minSDFValue, minOp.minValue);
+
2183  }
+
2184 
+
2185  cutoffDistance = -std::abs(cutoffDistance);
+
2186  cutoffDistance = minSDFValue > cutoffDistance ? minSDFValue : cutoffDistance;
+
2187  }
+
2188 
+
2189  // Transform voxel values and delete leafnodes that are uniformly zero after the transformation.
+
2190  // (Positive values are set to zero with inactive state and negative values are remapped
+
2191  // from zero to one with active state.)
+
2192  tbb::parallel_for(tbb::blocked_range<size_t>(0, nodes.size()),
+ +
2194 
+
2195  // Populate a new tree with the remaining leafnodes
+
2196  typename TreeType::Ptr newTree(new TreeType(ValueType(0.0)));
+
2197 
+
2198  level_set_util_internal::PopulateTree<TreeType> populate(*newTree, &nodes[0], &leafnodeCount[0], 0);
+
2199  tbb::parallel_reduce(tbb::blocked_range<size_t>(0, numInternalNodes), populate);
+
2200 
+
2201  // Transform tile values (Negative valued tiles are set to 1.0 with active state.)
+
2202  std::vector<InternalNodeType*> internalNodes;
+
2203  newTree->getNodes(internalNodes);
+
2204 
+
2205  tbb::parallel_for(tbb::blocked_range<size_t>(0, internalNodes.size()),
+ +
2207 
+
2208  {
+ +
2210 
+
2211  typename TreeType::ValueAllIter it(*newTree);
+
2212  it.setMaxDepth(TreeType::ValueAllIter::LEAF_DEPTH - 2);
+
2213 
+
2214  for ( ; it; ++it) {
+
2215  if (acc.getValue(it.getCoord()) < ValueType(0.0)) {
+
2216  it.setValue(ValueType(1.0));
+
2217  it.setActiveState(true);
+
2218  }
+
2219  }
+
2220  }
+
2221 
+
2222  // Insert missing root level tiles. (The new tree is constructed from the remaining leafnodes
+
2223  // and will therefore not contain any root level tiles that may exist in the original tree.)
+
2224  {
+
2225  typename TreeType::ValueAllIter it(tree);
+
2226  it.setMaxDepth(TreeType::ValueAllIter::ROOT_DEPTH);
+
2227  for ( ; it; ++it) {
+
2228  if (it.getValue() < ValueType(0.0)) {
+
2229  newTree->addTile(TreeType::ValueAllIter::ROOT_LEVEL, it.getCoord(), ValueType(1.0), true);
+
2230  }
+
2231  }
+
2232  }
+
2233 
+
2234  grid.setTree(newTree);
+
2235  grid.setGridClass(GRID_FOG_VOLUME);
+
2236 }
+
2237 
+
2238 
+
2240 
+
2241 
+
2242 template <class GridOrTreeType>
+
2243 inline typename GridOrTreeType::template ValueConverter<bool>::Type::Ptr
+
2244 sdfInteriorMask(const GridOrTreeType& volume, typename GridOrTreeType::ValueType isovalue)
+
2245 {
+
2246  typedef typename TreeAdapter<GridOrTreeType>::TreeType TreeType;
+
2247  const TreeType& tree = TreeAdapter<GridOrTreeType>::tree(volume);
+
2248 
+
2249  typedef typename TreeType::template ValueConverter<bool>::Type::Ptr BoolTreePtrType;
+
2250  BoolTreePtrType mask = level_set_util_internal::computeInteriorMask(tree, isovalue);
+
2251 
+ +
2253 }
+
2254 
+
2255 
+
2256 template<typename GridOrTreeType>
+
2257 inline typename GridOrTreeType::template ValueConverter<bool>::Type::Ptr
+
2258 extractEnclosedRegion(const GridOrTreeType& volume,
+
2259  typename GridOrTreeType::ValueType isovalue,
+
2260  const typename TreeAdapter<GridOrTreeType>::TreeType::template ValueConverter<bool>::Type* fillMask)
+
2261 {
+
2262  typedef typename TreeAdapter<GridOrTreeType>::TreeType TreeType;
+
2263  const TreeType& tree = TreeAdapter<GridOrTreeType>::tree(volume);
+
2264 
+
2265  typedef typename TreeType::template ValueConverter<char>::Type::Ptr CharTreePtrType;
+
2266  CharTreePtrType regionMask = level_set_util_internal::computeEnclosedRegionMask(tree, isovalue, fillMask);
+
2267 
+
2268  typedef typename TreeType::template ValueConverter<bool>::Type::Ptr BoolTreePtrType;
+
2269  BoolTreePtrType mask = level_set_util_internal::computeInteriorMask(*regionMask, 0);
+
2270 
+ +
2272 }
+
2273 
+
2274 
+
2276 
+
2277 
+
2278 template<typename GridOrTreeType>
+
2279 inline typename GridOrTreeType::template ValueConverter<bool>::Type::Ptr
+
2280 extractIsosurfaceMask(const GridOrTreeType& volume, typename GridOrTreeType::ValueType isovalue)
+
2281 {
+
2282  typedef typename TreeAdapter<GridOrTreeType>::TreeType TreeType;
+
2283  const TreeType& tree = TreeAdapter<GridOrTreeType>::tree(volume);
+
2284 
+
2285  std::vector<const typename TreeType::LeafNodeType*> nodes;
+
2286  tree.getNodes(nodes);
+
2287 
+
2288  typedef typename TreeType::template ValueConverter<bool>::Type BoolTreeType;
+
2289  typename BoolTreeType::Ptr mask(new BoolTreeType(false));
+
2290 
+
2291  level_set_util_internal::MaskIsovalueCrossingVoxels<TreeType> op(tree, nodes, *mask, isovalue);
+
2292  tbb::parallel_reduce(tbb::blocked_range<size_t>(0, nodes.size()), op);
+
2293 
+ +
2295 }
+
2296 
+
2297 
+
2299 
+
2300 
+
2301 template<typename GridOrTreeType>
+
2302 inline void
+
2303 extractActiveVoxelSegmentMasks(const GridOrTreeType& volume,
+
2304  std::vector<typename GridOrTreeType::template ValueConverter<bool>::Type::Ptr>& masks)
+
2305 {
+
2306  typedef typename TreeAdapter<GridOrTreeType>::TreeType TreeType;
+
2307  typedef typename TreeType::template ValueConverter<bool>::Type BoolTreeType;
+
2308  typedef typename BoolTreeType::Ptr BoolTreePtrType;
+
2309  typedef typename BoolTreeType::LeafNodeType BoolLeafNodeType;
+
2310 
+ +
2312  typedef typename NodeMaskSegmentType::Ptr NodeMaskSegmentPtrType;
+
2313  typedef typename std::vector<NodeMaskSegmentPtrType> NodeMaskSegmentPtrVector;
+
2314  typedef typename std::vector<NodeMaskSegmentType*> NodeMaskSegmentRawPtrVector;
+
2315 
+
2317 
+
2318  const TreeType& tree = TreeAdapter<GridOrTreeType>::tree(volume);
+
2319 
+
2320  BoolTreeType topologyMask(tree, false, TopologyCopy());
+
2321 
+
2322  if (topologyMask.hasActiveTiles()) {
+
2323  topologyMask.voxelizeActiveTiles();
+
2324  }
+
2325 
+
2326  std::vector<BoolLeafNodeType*> leafnodes;
+
2327  topologyMask.getNodes(leafnodes);
+
2328 
+
2329  if (leafnodes.empty()) return;
+
2330 
+
2331  // 1. Split node masks into disjoint segments
+
2332  // Note: The LeafNode origin coord is modified to record the 'leafnodes' array offset.
+
2333 
+
2334  boost::scoped_array<NodeMaskSegmentPtrVector> nodeSegmentArray(new NodeMaskSegmentPtrVector[leafnodes.size()]);
+
2335 
+
2336  tbb::parallel_for(tbb::blocked_range<size_t>(0, leafnodes.size()),
+
2337  level_set_util_internal::SegmentNodeMask<BoolLeafNodeType>(leafnodes, nodeSegmentArray.get()));
+
2338 
+
2339 
+
2340  // 2. Compute segment connectivity
+
2341 
+
2342  tbb::parallel_for(tbb::blocked_range<size_t>(0, leafnodes.size()),
+ +
2344  topologyMask, nodeSegmentArray.get()));
+
2345 
+
2346  topologyMask.clear();
+
2347 
+
2348  size_t nodeSegmentCount = 0;
+
2349  for (size_t n = 0, N = leafnodes.size(); n < N; ++n) {
+
2350  nodeSegmentCount += nodeSegmentArray[n].size();
+
2351  }
+
2352 
+
2353  // 3. Group connected segments
+
2354 
+
2355  std::deque<NodeMaskSegmentRawPtrVector> nodeSegmentGroups;
+
2356 
+
2357  NodeMaskSegmentType* nextSegment = nodeSegmentArray[0][0].get();
+
2358  while (nextSegment) {
+
2359 
+
2360  nodeSegmentGroups.push_back(NodeMaskSegmentRawPtrVector());
+
2361 
+
2362  std::vector<NodeMaskSegmentType*>& segmentGroup = nodeSegmentGroups.back();
+
2363  segmentGroup.reserve(nodeSegmentCount);
+
2364 
+
2365  std::deque<NodeMaskSegmentType*> segmentQueue;
+
2366  segmentQueue.push_back(nextSegment);
+
2367  nextSegment = NULL;
+
2368 
+
2369  while (!segmentQueue.empty()) {
+
2370 
+
2371  NodeMaskSegmentType* segment = segmentQueue.back();
+
2372  segmentQueue.pop_back();
+
2373 
+
2374  if (segment->visited) continue;
+
2375  segment->visited = true;
+
2376 
+
2377  segmentGroup.push_back(segment);
+
2378 
+
2379  // queue connected segments
+
2380  std::vector<NodeMaskSegmentType*>& connections = segment->connections;
+
2381  for (size_t n = 0, N = connections.size(); n < N; ++n) {
+
2382  if (!connections[n]->visited) segmentQueue.push_back(connections[n]);
+
2383  }
+
2384  }
+
2385 
+
2386  // find first unvisited segment
+
2387  for (size_t n = 0, N = leafnodes.size(); n < N; ++n) {
+
2388  NodeMaskSegmentPtrVector& nodeSegments = nodeSegmentArray[n];
+
2389  for (size_t i = 0, I = nodeSegments.size(); i < I; ++i) {
+
2390  if (!nodeSegments[i]->visited) nextSegment = nodeSegments[i].get();
+
2391  }
+
2392  }
+
2393  }
+
2394 
+
2395  // 4. Mask segment groups
+
2396 
+
2397  if (nodeSegmentGroups.size() == 1) {
+
2398 
+
2399  BoolTreePtrType mask(new BoolTreeType(tree, false, TopologyCopy()));
+
2400 
+
2401  if (mask->hasActiveTiles()) {
+
2402  mask->voxelizeActiveTiles();
+
2403  }
+
2404 
+
2405  masks.push_back(
+ +
2407 
+
2408  } else if (nodeSegmentGroups.size() > 1) {
+
2409 
+
2410  for (size_t n = 0, N = nodeSegmentGroups.size(); n < N; ++n) {
+
2411 
+
2412  NodeMaskSegmentRawPtrVector& segmentGroup = nodeSegmentGroups[n];
+
2413 
+ +
2415  tbb::parallel_reduce(tbb::blocked_range<size_t>(0, segmentGroup.size()), op);
+
2416 
+
2417  masks.push_back(
+ +
2419  }
+
2420  }
+
2421 
+
2422  // 5. Sort segments in descending order based on the active voxel count.
+
2423 
+
2424  if (masks.size() > 1) {
+
2425  const size_t segmentCount = masks.size();
+
2426 
+
2427  boost::scoped_array<size_t> segmentOrderArray(new size_t[segmentCount]);
+
2428  boost::scoped_array<size_t> voxelCountArray(new size_t[segmentCount]);
+
2429 
+
2430  for (size_t n = 0; n < segmentCount; ++n) {
+
2431  segmentOrderArray[n] = n;
+
2432  }
+
2433 
+
2434  tbb::parallel_for(tbb::blocked_range<size_t>(0, segmentCount),
+ +
2436 
+
2437  size_t *begin = segmentOrderArray.get();
+
2438  tbb::parallel_sort(begin, begin + masks.size(), level_set_util_internal::GreaterCount(voxelCountArray.get()));
+
2439 
+
2440  std::vector<BoolTreePtrType> orderedMasks;
+
2441  orderedMasks.reserve(masks.size());
+
2442 
+
2443  for (size_t n = 0; n < segmentCount; ++n) {
+
2444  orderedMasks.push_back(masks[segmentOrderArray[n]]);
+
2445  }
+
2446 
+
2447  masks.swap(orderedMasks);
+
2448  }
+
2449 
+
2450 } // extractActiveVoxelSegmentMasks()
+
2451 
+
2452 
+
2453 template<typename GridOrTreeType>
+
2454 inline void
+
2455 segmentActiveVoxels(const GridOrTreeType& volume, std::vector<typename GridOrTreeType::Ptr>& segments)
+
2456 {
+
2457  typedef typename TreeAdapter<GridOrTreeType>::TreeType TreeType;
+
2458  typedef typename TreeType::Ptr TreePtrType;
+
2459  typedef typename TreeType::template ValueConverter<bool>::Type BoolTreeType;
+
2460  typedef typename BoolTreeType::Ptr BoolTreePtrType;
+
2461 
+
2462  const TreeType& inputTree = TreeAdapter<GridOrTreeType>::tree(volume);
+
2463 
+
2464  // 1. Segment active topology mask
+
2465  std::vector<BoolTreePtrType> maskSegmentArray;
+
2466  extractActiveVoxelSegmentMasks(inputTree, maskSegmentArray);
+
2467 
+
2468  const size_t numSegments = maskSegmentArray.size();
+
2469 
+
2470  if (numSegments < 2) {
+
2471  // single segment early-out
+
2472  TreePtrType segment(new TreeType(inputTree));
+
2473  segments.push_back(
+ +
2475  return;
+
2476  }
+
2477 
+
2478  const tbb::blocked_range<size_t> segmentRange(0, numSegments);
+
2479 
+
2480  // 2. Export segments
+
2481  std::vector<TreePtrType> outputSegmentArray(numSegments);
+
2482 
+
2483  tbb::parallel_for(segmentRange,
+
2484  level_set_util_internal::MaskedCopy<TreeType>(inputTree, outputSegmentArray, maskSegmentArray));
+
2485 
+
2486  for (size_t n = 0, N = numSegments; n < N; ++n) {
+
2487  segments.push_back(
+ +
2489  }
+
2490 }
+
2491 
+
2492 
+
2493 template<typename GridOrTreeType>
+
2494 inline void
+
2495 segmentSDF(const GridOrTreeType& volume, std::vector<typename GridOrTreeType::Ptr>& segments)
+
2496 {
+
2497  typedef typename TreeAdapter<GridOrTreeType>::TreeType TreeType;
+
2498  typedef typename TreeType::Ptr TreePtrType;
+
2499  typedef typename TreeType::template ValueConverter<bool>::Type BoolTreeType;
+
2500  typedef typename BoolTreeType::Ptr BoolTreePtrType;
+
2501 
+
2502  const TreeType& inputTree = TreeAdapter<GridOrTreeType>::tree(volume);
+
2503 
+
2504  // 1. Mask zero crossing voxels
+
2505  BoolTreePtrType mask = extractIsosurfaceMask(inputTree, lsutilGridZero<GridOrTreeType>());
+
2506 
+
2507  // 2. Segment the zero crossing mask
+
2508  std::vector<BoolTreePtrType> maskSegmentArray;
+
2509  extractActiveVoxelSegmentMasks(*mask, maskSegmentArray);
+
2510 
+
2511  const size_t numSegments = maskSegmentArray.size();
+
2512 
+
2513  if (numSegments < 2) {
+
2514  // single segment early-out
+
2515  TreePtrType segment(new TreeType(inputTree));
+
2516  segments.push_back(
+ +
2518  return;
+
2519  }
+
2520 
+
2521  const tbb::blocked_range<size_t> segmentRange(0, numSegments);
+
2522 
+
2523 
+
2524  // 3. Expand zero crossing mask to capture sdf narrow band
+
2525  tbb::parallel_for(segmentRange,
+
2526  level_set_util_internal::ExpandNarrowbandMask<TreeType>(inputTree, maskSegmentArray));
+
2527 
+
2528  // 4. Export sdf segments
+
2529  std::vector<TreePtrType> outputSegmentArray(numSegments);
+
2530 
+
2531  tbb::parallel_for(segmentRange,
+
2532  level_set_util_internal::MaskedCopy<TreeType>(inputTree, outputSegmentArray, maskSegmentArray));
+
2533 
+
2534  tbb::parallel_for(segmentRange,
+
2535  level_set_util_internal::FloodFillSign<TreeType>(inputTree, outputSegmentArray));
+
2536 
+
2537 
+
2538  for (size_t n = 0, N = numSegments; n < N; ++n) {
+
2539  segments.push_back(
+ +
2541  }
+
2542 }
+
2543 
+
2544 
+
2545 } // namespace tools
+
2546 } // namespace OPENVDB_VERSION_NAME
+
2547 } // namespace openvdb
+
2548 
+
2549 #endif // OPENVDB_TOOLS_LEVEL_SET_UTIL_HAS_BEEN_INCLUDED
+
2550 
+
2551 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
2552 // All rights reserved. This software is distributed under the
+
2553 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
2554 
+
tree::LeafNode< bool, LeafNodeType::LOG2DIM > BoolLeafNodeType
Definition: LevelSetUtil.h:1750
+
SDFVoxelsToFogVolume(LeafNodeType **nodes, ValueType cutoffDistance)
Definition: LevelSetUtil.h:465
+
void addLeaf(LeafNodeT *leaf)
Add the specified leaf to this tree, possibly creating a child branch in the process. If the leaf node already exists, replace it.
Definition: ValueAccessor.h:374
+
TreeType::template ValueConverter< bool >::Type BoolTreeType
Definition: LevelSetUtil.h:1843
+
void signedFloodFill(TreeOrLeafManagerT &tree, bool threaded=true, size_t grainSize=1, Index minLevel=0)
Set the values of all inactive voxels and tiles of a narrow-band level set from the signs of the acti...
Definition: SignedFloodFill.h:294
+
NodeMaskSegment< NodeType > NodeMaskSegmentType
Definition: LevelSetUtil.h:1398
+ +
TreeType::LeafNodeType LeafNodeType
Definition: LevelSetUtil.h:526
+
CharLeafNodeType **const mMaskNodes
Definition: LevelSetUtil.h:368
+
LeafNodeT * probeLeaf(const Coord &xyz)
Return a pointer to the leaf node that contains voxel (x, y, z), or NULL if no such node exists...
Definition: ValueAccessor.h:424
+
Definition: Types.h:214
+ +
LeafNodeType const *const *const mNodes
Definition: LevelSetUtil.h:242
+ +
const Coord & origin() const
Return the grid index coordinates of this node's local origin.
Definition: LeafNode.h:475
+
BoolLeafNodeType **const mMaskNodes
Definition: LevelSetUtil.h:1836
+
void operator()(const tbb::blocked_range< size_t > &range) const
Definition: LevelSetUtil.h:470
+
BoolTreeType::LeafNodeType BoolLeafNodeType
Definition: LevelSetUtil.h:1957
+
tree::LeafNode< bool, LeafNodeType::LOG2DIM > BoolLeafNodeType
Definition: LevelSetUtil.h:205
+ +
FillLeafNodeVoxels(const TreeType &tree, std::vector< BoolLeafNodeType * > &maskNodes)
Definition: LevelSetUtil.h:1752
+ +
BoolTreeType::LeafNodeType BoolLeafNodeType
Definition: LevelSetUtil.h:1844
+
Definition: Types.h:442
+
SegmentNodeMask(std::vector< NodeType * > &nodes, NodeMaskSegmentVector *nodeMaskArray)
Definition: LevelSetUtil.h:1372
+
const NodeMaskType & getValueMask() const
Definition: LeafNode.h:1109
+
BoolTreeType::LeafNodeType BoolLeafNodeType
Definition: LevelSetUtil.h:1161
+
void join(FindMinTileValue &rhs)
Definition: LevelSetUtil.h:452
+
LeafNodeType const *const *const mNodes
Definition: LevelSetUtil.h:367
+
TreeType::ValueType ValueType
Definition: LevelSetUtil.h:278
+ + + +
NodeMaskSegment< LeafNodeType > NodeMaskSegmentType
Definition: LevelSetUtil.h:1561
+ + +
void setValueOn(const Coord &xyz)
Mark the voxel at the given coordinates as active but don't change its value.
Definition: LeafNode.h:714
+
LeafNodeType::ValueType ValueType
Definition: LevelSetUtil.h:375
+
void operator()(const tbb::blocked_range< size_t > &range) const
Definition: LevelSetUtil.h:1757
+
MaskInteriorTiles(ValueType isovalue, const TreeType &tree, InternalNodeType **maskNodes)
Definition: LevelSetUtil.h:253
+
void segmentSDF(const GridOrTreeType &volume, std::vector< typename GridOrTreeType::Ptr > &segments)
Separates disjoint SDF surfaces into distinct grids or trees.
Definition: LevelSetUtil.h:2495
+ +
RootNodeType::NodeChainType NodeChainType
Definition: LevelSetUtil.h:1898
+
PopulateTree(PopulateTree &rhs, tbb::split)
Definition: LevelSetUtil.h:290
+
static BoolTreePtrType constructMask(const TreeType &, BoolTreePtrType &maskTree)
Definition: LevelSetUtil.h:2091
+
void operator()(const tbb::blocked_range< size_t > &range) const
Definition: LevelSetUtil.h:501
+
void operator()(const tbb::blocked_range< size_t > &range) const
Definition: LevelSetUtil.h:1378
+
tree::LeafNode< char, LeafNodeType::LOG2DIM > CharLeafNodeType
Definition: LevelSetUtil.h:330
+
LeafNodeType::ValueType ValueType
Definition: LevelSetUtil.h:463
+
NodeType::NodeMaskType NodeMaskType
Definition: LevelSetUtil.h:1278
+
ComputeActiveVoxelCount(std::vector< VolumePtrType > &segments, size_t *countArray)
Definition: LevelSetUtil.h:2053
+
InternalNodeType::ValueType ValueType
Definition: LevelSetUtil.h:429
+ + +
void operator()(const tbb::blocked_range< size_t > &range) const
Definition: LevelSetUtil.h:1852
+ +
TreeType::LeafNodeType LeafNodeType
Definition: LevelSetUtil.h:1748
+
NodeMaskSegmentType::Ptr NodeMaskSegmentTypePtr
Definition: LevelSetUtil.h:1399
+
TreeType::template ValueConverter< bool >::Type BoolTreeType
Definition: LevelSetUtil.h:527
+
TreeType::Ptr TreeTypePtr
Definition: LevelSetUtil.h:1951
+
LeafNodeType::ValueType ValueType
Definition: LevelSetUtil.h:395
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & max(const T &a, const T &b)
Definition: Composite.h:132
+
TreeType::template ValueConverter< bool >::Type::Ptr BoolTreePtrType
Definition: LevelSetUtil.h:2089
+
SDFTilesToFogVolume(const TreeType &tree, InternalNodeType **nodes)
Definition: LevelSetUtil.h:498
+
std::vector< NodeMaskSegment * > connections
Definition: LevelSetUtil.h:1282
+
void operator()(const tbb::blocked_range< size_t > &range)
Definition: LevelSetUtil.h:1631
+
BoolTreeTypePtr *const mSegments
Definition: LevelSetUtil.h:1887
+
MaskSegmentGroup(const std::vector< NodeMaskSegmentType * > &segments)
Definition: LevelSetUtil.h:1563
+
TreeType::Ptr TreeTypePtr
Definition: LevelSetUtil.h:1894
+
TreeType::template ValueConverter< bool >::Type BoolTreeType
Definition: LevelSetUtil.h:1955
+
boost::shared_ptr< Grid > Ptr
Definition: Grid.h:485
+
Ptr copy() const
Definition: Transform.h:77
+
ValueType const mIsovalue
Definition: LevelSetUtil.h:369
+ + +
void setValueOn(const Coord &xyz, const ValueType &value)
Set the value of the voxel at the given coordinates and mark the voxel as active. ...
Definition: ValueAccessor.h:292
+
math::Transform & transform()
Return a reference to this grid's transform, which might be shared with other grids.
Definition: Grid.h:335
+ +
void join(ExpandLeafNodeRegion &rhs)
Definition: LevelSetUtil.h:1629
+
TreeType::LeafNodeType LeafNodeType
Definition: LevelSetUtil.h:1559
+
MaskedCopy(const TreeType &tree, std::vector< TreeTypePtr > &segments, std::vector< BoolTreeTypePtr > &masks)
Definition: LevelSetUtil.h:1959
+ +
void sdfToFogVolume(GridType &grid, typename GridType::ValueType cutoffDistance=lsutilGridMax< GridType >())
Threaded method to convert a sparse level set/SDF into a sparse fog volume.
Definition: LevelSetUtil.h:2131
+
BoolTreeType::Ptr BoolTreeTypePtr
Definition: LevelSetUtil.h:1845
+ +
const ValueType & getValue(const Coord &xyz) const
Return the value of the voxel at the given coordinates.
Definition: ValueAccessor.h:256
+
Index32 Index
Definition: Types.h:58
+
GreaterCount(const size_t *countArray)
Definition: LevelSetUtil.h:2072
+
ValueType const mWeight
Definition: LevelSetUtil.h:491
+
MaskSegmentGroup(const MaskSegmentGroup &rhs, tbb::split)
Definition: LevelSetUtil.h:1569
+
NodeMaskSegment< NodeType > NodeMaskSegmentType
Definition: LevelSetUtil.h:1368
+
void extractActiveVoxelSegmentMasks(const GridOrTreeType &volume, std::vector< typename GridOrTreeType::template ValueConverter< bool >::Type::Ptr > &masks)
Return a mask for each connected component of the given grid's active voxels.
Definition: LevelSetUtil.h:2303
+ +
void operator()(const tbb::blocked_range< size_t > &range) const
Definition: LevelSetUtil.h:338
+
TreeType::template ValueConverter< char >::Type::Ptr computeEnclosedRegionMask(const TreeType &tree, typename TreeType::ValueType isovalue, const typename TreeType::template ValueConverter< bool >::Type *fillMask)
Constructs a memory light char tree that represents the exterior region with +1 and the interior regi...
Definition: LevelSetUtil.h:956
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
void join(PopulateTree &rhs)
Definition: LevelSetUtil.h:315
+
TreeType::template ValueConverter< bool >::Type BoolTreeType
Definition: LevelSetUtil.h:2103
+ +
void join(MaskIsovalueCrossingVoxels &rhs)
Definition: LevelSetUtil.h:1256
+
TreeType::ValueType ValueType
Definition: LevelSetUtil.h:1952
+
ExpandLeafNodeRegion(const TreeType &distTree, BoolTreeType &maskTree, std::vector< BoolLeafNodeType * > &maskNodes)
Definition: LevelSetUtil.h:1611
+ +
PopulateTree(TreeType &tree, LeafNodeType **leafnodes, const size_t *nodexIndexMap, ValueType background)
Definition: LevelSetUtil.h:281
+
TreeType::ValueType ValueType
Definition: LevelSetUtil.h:1895
+
Propagates the sign of distance values from the active voxels in the narrow band to the inactive valu...
+
InputTreeType::template ValueConverter< bool >::Type BoolTreeType
Definition: LevelSetUtil.h:1160
+
Templated block class to hold specific data types and a fixed number of values determined by Log2Dim...
Definition: LeafNode.h:65
+
ConnectNodeMaskSegments(const TreeType &tree, NodeMaskSegmentVector *nodeMaskArray)
Definition: LevelSetUtil.h:1402
+
TreeType::LeafNodeType LeafNodeType
Definition: LevelSetUtil.h:1953
+
TreeType::template ValueConverter< bool >::Type BoolTreeType
Definition: LevelSetUtil.h:1606
+
void signedFloodFillWithValues(TreeOrLeafManagerT &tree, const typename TreeOrLeafManagerT::ValueType &outsideWidth, const typename TreeOrLeafManagerT::ValueType &insideWidth, bool threaded=true, size_t grainSize=1, Index minLevel=0)
Set the values of all inactive voxels and tiles of a narrow-band level set from the signs of the acti...
Definition: SignedFloodFill.h:280
+ +
NodeMaskSegmentVector *const mNodeMaskArray
Definition: LevelSetUtil.h:1390
+
FloodFillSign(const TreeType &tree, std::vector< TreeTypePtr > &segments)
Definition: LevelSetUtil.h:1901
+
const LeafNodeT * probeConstLeaf(const Coord &xyz) const
Return a pointer to the leaf node that contains voxel (x, y, z), or NULL if no such node exists...
Definition: ValueAccessor.h:429
+
This adapter allows code that is templated on a Tree type to accept either a Tree type or a Grid type...
Definition: Grid.h:883
+
InternalNodeType **const mMaskNodes
Definition: LevelSetUtil.h:270
+
Convert polygonal meshes that consist of quads and/or triangles into signed or unsigned distance fiel...
+
TreeType::RootNodeType RootNodeType
Definition: LevelSetUtil.h:1897
+
void operator()(const tbb::blocked_range< size_t > &range) const
Definition: LevelSetUtil.h:1408
+ +
InputTreeType::LeafNodeType InputLeafNodeType
Definition: LevelSetUtil.h:1159
+
boost::shared_ptr< NodeMaskSegment > Ptr
Definition: LevelSetUtil.h:1277
+
Definition: Exceptions.h:39
+
FindMinVoxelValue(LeafNodeType const *const *const leafnodes)
Definition: LevelSetUtil.h:397
+ +
LeafNodeType const *const *const mNodes
Definition: LevelSetUtil.h:422
+
void join(MaskSegmentGroup &rhs)
Definition: LevelSetUtil.h:1577
+
ValueType const mIsovalue
Definition: LevelSetUtil.h:244
+
FillMaskBoundary(const TreeType &tree, ValueType isovalue, const BoolTreeType &fillMask, const BoolLeafNodeType **fillNodes, BoolLeafNodeType **newNodes)
Definition: LevelSetUtil.h:530
+
InputTreeType::ValueType InputValueType
Definition: LevelSetUtil.h:1158
+
void operator()(const tbb::blocked_range< size_t > &range)
Definition: LevelSetUtil.h:443
+
void join(FindMinVoxelValue &rhs)
Definition: LevelSetUtil.h:418
+
TreeType::LeafNodeType LeafNodeType
Definition: LevelSetUtil.h:1603
+
BoolTreeType::LeafNodeType BoolLeafNodeType
Definition: LevelSetUtil.h:528
+
GridOrTreeType::template ValueConverter< bool >::Type::Ptr sdfInteriorMask(const GridOrTreeType &volume, typename GridOrTreeType::ValueType isovalue=lsutilGridZero< GridOrTreeType >())
Threaded method to construct a boolean mask that represents interior regions in a signed distance fie...
Definition: LevelSetUtil.h:2244
+
void operator()(const tbb::blocked_range< size_t > &range) const
Definition: LevelSetUtil.h:1966
+
void traceExteriorBoundaries(FloatTreeT &tree)
Traces the exterior voxel boundary of closed objects in the input volume tree. Exterior voxels are ma...
Definition: MeshToVolume.h:2928
+
FlipRegionSign(LeafNodeType **nodes)
Definition: LevelSetUtil.h:377
+ +
VolumePtrType *const mSegments
Definition: LevelSetUtil.h:2065
+
void operator()(const tbb::blocked_range< size_t > &range) const
Definition: LevelSetUtil.h:256
+ +
LeafNodeT * touchLeaf(const Coord &xyz)
Return a pointer to the leaf node that contains voxel (x, y, z). If no such node exists, create one, but preserve the values and active states of all voxels.
Definition: ValueAccessor.h:393
+ +
BoolTreeType::LeafNodeType BoolLeafNodeType
Definition: LevelSetUtil.h:1607
+
std::vector< NodeMaskSegmentTypePtr > NodeMaskSegmentVector
Definition: LevelSetUtil.h:1400
+
_TreeType TreeType
Definition: Grid.h:885
+
TreeType::LeafNodeType LeafNodeType
Definition: LevelSetUtil.h:279
+
GridOrTreeType::template ValueConverter< bool >::Type::Ptr extractEnclosedRegion(const GridOrTreeType &volume, typename GridOrTreeType::ValueType isovalue=lsutilGridZero< GridOrTreeType >(), const typename TreeAdapter< GridOrTreeType >::TreeType::template ValueConverter< bool >::Type *fillMask=NULL)
Extracts the interior regions of a signed distance field and topologically enclosed (watertight) regi...
Definition: LevelSetUtil.h:2258
+
void operator()(const tbb::blocked_range< size_t > &range)
Definition: LevelSetUtil.h:1185
+
Index64 onVoxelCount() const
Return the number of voxels marked On.
Definition: LeafNode.h:440
+
Negative active values are set 0, everything else is set to 1.
Definition: LevelSetUtil.h:327
+
static BoolGridPtrType constructMask(const GridType &grid, BoolTreePtrType &maskTree)
Definition: LevelSetUtil.h:2108
+
void operator()(const tbb::blocked_range< size_t > &range) const
Definition: LevelSetUtil.h:2059
+
void operator()(const tbb::blocked_range< size_t > &range)
Definition: LevelSetUtil.h:409
+
static GridTypePtr construct(const GridType &grid, TreeTypePtr &maskTree)
Definition: LevelSetUtil.h:2114
+ +
static TreeType & tree(TreeType &t)
Definition: Grid.h:900
+ +
void nodeMaskSegmentation(const NodeType &node, std::vector< typename NodeMaskSegment< NodeType >::Ptr > &segments)
Definition: LevelSetUtil.h:1291
+
TreeType::ValueType ValueType
Definition: LevelSetUtil.h:525
+
TreeType::ValueType ValueType
Definition: LevelSetUtil.h:1602
+
LeafNodeType::NodeMaskType NodeMaskType
Definition: LevelSetUtil.h:1604
+
NodeType::NodeMaskType NodeMaskType
Definition: LevelSetUtil.h:1397
+
ExpandNarrowbandMask(const TreeType &tree, std::vector< BoolTreeTypePtr > &segments)
Definition: LevelSetUtil.h:1847
+
TreeType::Ptr TreeTypePtr
Definition: LevelSetUtil.h:2088
+
void setOff(Index32 n)
Set the nth bit off.
Definition: NodeMasks.h:454
+
void operator()(const tbb::blocked_range< size_t > &range)
Definition: LevelSetUtil.h:298
+ +
TreeType::ValueType ValueType
Definition: LevelSetUtil.h:1747
+ +
TreeType const *const mTree
Definition: LevelSetUtil.h:269
+ +
size_t const *const mCountArray
Definition: LevelSetUtil.h:2079
+
void operator()(const tbb::blocked_range< size_t > &range) const
Definition: LevelSetUtil.h:379
+
ValueType const mIsovalue
Definition: LevelSetUtil.h:271
+
TreeType::template ValueConverter< bool >::Type::Ptr computeInteriorMask(const TreeType &tree, typename TreeType::ValueType iso)
Definition: LevelSetUtil.h:1077
+
MaskInteriorVoxels(ValueType isovalue, const LeafNodeType **nodes, BoolLeafNodeType **maskNodes)
Definition: LevelSetUtil.h:207
+
TreeType::Ptr TreeTypePtr
Definition: LevelSetUtil.h:1560
+
void operator()(const tbb::blocked_range< size_t > &range) const
Definition: LevelSetUtil.h:213
+
LabelBoundaryVoxels(ValueType isovalue, const LeafNodeType **nodes, CharLeafNodeType **maskNodes)
Definition: LevelSetUtil.h:332
+
BoolTreeType & newMaskTree()
Definition: LevelSetUtil.h:1627
+
TreeType const *const mTree
Definition: LevelSetUtil.h:517
+ +
ExpandLeafNodeRegion(const ExpandLeafNodeRegion &rhs, tbb::split)
Definition: LevelSetUtil.h:1619
+
TreeType & tree() const
Return a reference to the tree associated with this accessor.
Definition: ValueAccessor.h:147
+
static TreeTypePtr construct(const TreeType &, TreeTypePtr &tree)
Definition: LevelSetUtil.h:2092
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
TreeTypePtr & mask()
Definition: LevelSetUtil.h:1575
+
LeafNodeType **const mNodes
Definition: LevelSetUtil.h:388
+ +
InternalNodeType **const mNodes
Definition: LevelSetUtil.h:518
+
BoolTreeType::Ptr BoolTreeTypePtr
Definition: LevelSetUtil.h:1956
+
LeafNodeType **const mNodes
Definition: LevelSetUtil.h:490
+
void segmentActiveVoxels(const GridOrTreeType &volume, std::vector< typename GridOrTreeType::Ptr > &segments)
Separates disjoint active topology components into distinct grids or trees.
Definition: LevelSetUtil.h:2455
+
void operator()(const tbb::blocked_range< size_t > &range) const
Definition: LevelSetUtil.h:1932
+
void operator()(const tbb::blocked_range< size_t > &range)
Definition: LevelSetUtil.h:1579
+
boost::mpl::at< NodeChainType, boost::mpl::int_< 1 > >::type InternalNodeType
Definition: LevelSetUtil.h:1899
+
TreeType const *const mTree
Definition: LevelSetUtil.h:1835
+
FindMinVoxelValue(FindMinVoxelValue &rhs, tbb::split)
Definition: LevelSetUtil.h:403
+
TreeT * tree
Definition: MaskToLevelSet.h:118
+
NodeMaskSegmentType::Ptr NodeMaskSegmentTypePtr
Definition: LevelSetUtil.h:1369
+
void operator()(const tbb::blocked_range< size_t > &range) const
Definition: LevelSetUtil.h:536
+ +
InternalNodeType const *const *const mNodes
Definition: LevelSetUtil.h:456
+
BoolLeafNodeType **const mMaskNodes
Definition: LevelSetUtil.h:243
+
void setOrigin(const Coord &origin)
Set the grid index coordinates of this node's local origin.
Definition: LeafNode.h:472
+
GridOrTreeType::template ValueConverter< bool >::Type::Ptr extractIsosurfaceMask(const GridOrTreeType &volume, typename GridOrTreeType::ValueType isovalue)
Return a mask of the voxels that intersect the implicit surface with the given isovalue.
Definition: LevelSetUtil.h:2280
+
TreeType::LeafNodeType LeafNodeType
Definition: LevelSetUtil.h:1896
+
LeafNodeType::ValueType ValueType
Definition: LevelSetUtil.h:204
+
Container class that associates a tree with a transform and metadata.
Definition: Grid.h:54
+
MaskIsovalueCrossingVoxels(const InputTreeType &inputTree, const std::vector< const InputLeafNodeType * > &inputLeafNodes, BoolTreeType &maskTree, InputValueType iso)
Definition: LevelSetUtil.h:1163
+
TreeType const *const mTree
Definition: LevelSetUtil.h:1886
+
FindMinTileValue(FindMinTileValue &rhs, tbb::split)
Definition: LevelSetUtil.h:437
+
NodeType *const *const mNodes
Definition: LevelSetUtil.h:1389
+
LeafNodeType::NodeMaskType NodeMaskType
Definition: LevelSetUtil.h:1749
+
MaskIsovalueCrossingVoxels(MaskIsovalueCrossingVoxels &rhs, tbb::split)
Definition: LevelSetUtil.h:1176
+
LeafNodeType::ValueType ValueType
Definition: LevelSetUtil.h:329
+
TreeType::ValueType ValueType
Definition: LevelSetUtil.h:251
+
std::vector< NodeMaskSegmentTypePtr > NodeMaskSegmentVector
Definition: LevelSetUtil.h:1370
+
NodeMaskType mask
Definition: LevelSetUtil.h:1283
+ +
FindMinTileValue(InternalNodeType const *const *const nodes)
Definition: LevelSetUtil.h:431
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & min(const T &a, const T &b)
Definition: Composite.h:128
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/MapsUtil_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/MapsUtil_8h_source.html new file mode 100644 index 00000000..8512d447 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/MapsUtil_8h_source.html @@ -0,0 +1,427 @@ + + + + + + +OpenVDB: MapsUtil.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
MapsUtil.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
32 
+
33 #ifndef OPENVDB_UTIL_MAPSUTIL_HAS_BEEN_INCLUDED
+
34 #define OPENVDB_UTIL_MAPSUTIL_HAS_BEEN_INCLUDED
+
35 
+
36 #include <openvdb/math/Maps.h>
+
37 
+
38 
+
39 namespace openvdb {
+ +
41 namespace OPENVDB_VERSION_NAME {
+
42 namespace util {
+
43 
+
44 // Utility methods for calculating bounding boxes
+
45 
+
49 template<typename MapType>
+
50 inline void
+
51 calculateBounds(const MapType& map, const BBoxd& in, BBoxd& out)
+
52 {
+
53  const Vec3d& min = in.min();
+
54  const Vec3d& max = in.max();
+
55 
+
56  // the pre-image of the 8 corners of the box
+
57  Vec3d corners[8];
+
58  corners[0] = in.min();;
+
59  corners[1] = Vec3d(min(0), min(1), min(2));
+
60  corners[2] = Vec3d(max(0), max(1), min(2));
+
61  corners[3] = Vec3d(min(0), max(1), min(2));
+
62  corners[4] = Vec3d(min(0), min(1), max(2));
+
63  corners[5] = Vec3d(max(0), min(1), max(2));
+
64  corners[6] = max;
+
65  corners[7] = Vec3d(min(0), max(1), max(2));
+
66 
+
67  Vec3d pre_image;
+
68  Vec3d& out_min = out.min();
+
69  Vec3d& out_max = out.max();
+
70  out_min = map.applyInverseMap(corners[0]);
+
71  out_max = min;
+
72  for (int i = 1; i < 8; ++i) {
+
73  pre_image = map.applyInverseMap(corners[i]);
+
74  for (int j = 0; j < 3; ++j) {
+
75  out_min(j) = std::min( out_min(j), pre_image(j));
+
76  out_max(j) = std::max( out_max(j), pre_image(j));
+
77  }
+
78  }
+
79 }
+
80 
+
81 
+
84 template<typename MapType>
+
85 inline void
+
86 calculateBounds(const MapType& map, const Vec3d& center, const Real radius, BBoxd& out)
+
87 {
+
88  // On return, out gives a bounding box in continuous index space
+
89  // that encloses the sphere.
+
90  //
+
91  // the image of a sphere under the inverse of the linearMap will be an ellipsoid.
+
92 
+ +
94  // I want to find extrema for three functions f(x', y', z') = x', or = y', or = z'
+
95  // with the constraint that g = (x-xo)^2 + (y-yo)^2 + (z-zo)^2 = r^2.
+
96  // Where the point x,y,z is the image of x',y',z'
+
97  // Solve: \lambda Grad(g) = Grad(f) and g = r^2.
+
98  // Note: here (x,y,z) is the image of (x',y',z'), and the gradient
+
99  // is w.r.t the (') space.
+
100  //
+
101  // This can be solved exactly: e_a^T (x' -xo') =\pm r\sqrt(e_a^T J^(-1)J^(-T)e_a)
+
102  // where e_a is one of the three unit vectors. - djh.
+
103 
+
105  Vec3d center_pre_image = map.applyInverseMap(center);
+
106 
+
107  std::vector<Vec3d> coordinate_units;
+
108  coordinate_units.push_back(Vec3d(1,0,0));
+
109  coordinate_units.push_back(Vec3d(0,1,0));
+
110  coordinate_units.push_back(Vec3d(0,0,1));
+
111 
+
112  Vec3d& out_min = out.min();
+
113  Vec3d& out_max = out.max();
+
114  for (int direction = 0; direction < 3; ++direction) {
+
115  Vec3d temp = map.applyIJT(coordinate_units[direction]);
+
116  double offset =
+
117  radius * sqrt(temp.x()*temp.x() + temp.y()*temp.y() + temp.z()*temp.z());
+
118  out_min(direction) = center_pre_image(direction) - offset;
+
119  out_max(direction) = center_pre_image(direction) + offset;
+
120  }
+
121 
+
122  } else {
+
123  // This is some unknown map type. In this case, we form an axis-aligned
+
124  // bounding box for the sphere in world space and find the pre-images of
+
125  // the corners in index space. From these corners we compute an axis-aligned
+
126  // bounding box in index space.
+
127  BBoxd bounding_box(center - radius*Vec3d(1,1,1), center + radius*Vec3d(1,1,1));
+
128  calculateBounds<MapType>(map, bounding_box, out);
+
129  }
+
130 }
+
131 
+
132 
+
133 namespace { // anonymous namespace for this helper function
+
134 
+
140 inline int
+
141 findTangentPoints(const double g, const double xo, const double zo,
+
142  const double r, double& xp, double& zp, double& xm, double& zm)
+
143 {
+
144  double x2 = xo * xo;
+
145  double r2 = r * r;
+
146  double xd = g * xo;
+
147  double xd2 = xd*xd;
+
148  double zd = g * zo + 1.;
+
149  double zd2 = zd*zd;
+
150  double rd2 = r2*g*g;
+
151 
+
152  double distA = xd2 + zd2;
+
153  double distB = distA - rd2;
+
154 
+
155  if (distB > 0) {
+
156  double discriminate = sqrt(distB);
+
157 
+
158  xp = xo - xo*rd2/distA + r * zd *discriminate / distA;
+
159  xm = xo - xo*rd2/distA - r * zd *discriminate / distA;
+
160 
+
161  zp = (zo*zd2 + zd*g*(x2 - r2) - xo*xo*g - r*xd*discriminate) / distA;
+
162  zm = (zo*zd2 + zd*g*(x2 - r2) - xo*xo*g + r*xd*discriminate) / distA;
+
163 
+
164  return 2;
+
165 
+
166  } if (0 >= distB && distB >= -1e-9) {
+
167  // the circle touches the focal point (x=0, z = -1/g)
+
168  xp = 0; xm = 0;
+
169  zp = -1/g; zm = -1/g;
+
170 
+
171  return 1;
+
172  }
+
173 
+
174  return 0;
+
175 }
+
176 
+
177 } // end anonymous namespace
+
178 
+
179 
+
183 template<>
+
184 inline void
+
185 calculateBounds<math::NonlinearFrustumMap>(const math::NonlinearFrustumMap& frustum,
+
186  const Vec3d& center, const Real radius, BBoxd& out)
+
187 {
+
188  // The frustum is a nonlinear map followed by a uniform scale, rotation, translation.
+
189  // First we invert the translation, rotation and scale to find the spherical pre-image
+
190  // of the sphere in "local" coordinates where the frustum is aligned with the near plane
+
191  // on the z=0 plane and the "camera" is located at (x=0, y=0, z=-1/g).
+
192 
+
193  // check that the internal map has no shear.
+
194  const math::AffineMap& secondMap = frustum.secondMap();
+
195  // test if the linear part has shear or non-uniform scaling
+
196  if (!frustum.hasSimpleAffine()) {
+
197 
+
198  // In this case, we form an axis-aligned bounding box for sphere in world space
+
199  // and find the pre_images of the corners in voxel space. From these corners we
+
200  // compute an axis-algined bounding box in voxel-spae
+
201  BBoxd bounding_box(center - radius*Vec3d(1,1,1), center + radius*Vec3d(1,1,1));
+
202  calculateBounds<math::NonlinearFrustumMap>(frustum, bounding_box, out);
+
203  return;
+
204  }
+
205 
+
206  // for convenience
+
207  Vec3d& out_min = out.min();
+
208  Vec3d& out_max = out.max();
+
209 
+
210  Vec3d centerLS = secondMap.applyInverseMap(center);
+
211  Vec3d voxelSize = secondMap.voxelSize();
+
212 
+
213  // all the voxels have the same size since we know this is a simple affine map
+
214  double radiusLS = radius / voxelSize(0);
+
215 
+
216  double gamma = frustum.getGamma();
+
217  double xp;
+
218  double zp;
+
219  double xm;
+
220  double zm;
+
221  int soln_number;
+
222 
+
223  // the bounding box in index space for the points in the frustum
+
224  const BBoxd& bbox = frustum.getBBox();
+
225  // initialize min and max
+
226  const double x_min = bbox.min().x();
+
227  const double y_min = bbox.min().y();
+
228  const double z_min = bbox.min().z();
+
229 
+
230  const double x_max = bbox.max().x();
+
231  const double y_max = bbox.max().y();
+
232  const double z_max = bbox.max().z();
+
233 
+
234  out_min.x() = x_min;
+
235  out_max.x() = x_max;
+
236  out_min.y() = y_min;
+
237  out_max.y() = y_max;
+
238 
+
239  Vec3d extreme;
+
240  Vec3d extreme2;
+
241  Vec3d pre_image;
+
242  // find the x-range
+
243  soln_number = findTangentPoints(gamma, centerLS.x(), centerLS.z(), radiusLS, xp, zp, xm, zm);
+
244  if (soln_number == 2) {
+
245  extreme.x() = xp;
+
246  extreme.y() = centerLS.y();
+
247  extreme.z() = zp;
+
248 
+
249  // location in world space of the tangent point
+
250  extreme2 = secondMap.applyMap(extreme);
+
251  // convert back to voxel space
+
252  pre_image = frustum.applyInverseMap(extreme2);
+
253  out_max.x() = std::max(x_min, std::min(x_max, pre_image.x()));
+
254 
+
255  extreme.x() = xm;
+
256  extreme.y() = centerLS.y();
+
257  extreme.z() = zm;
+
258  // location in world space of the tangent point
+
259  extreme2 = secondMap.applyMap(extreme);
+
260 
+
261  // convert back to voxel space
+
262  pre_image = frustum.applyInverseMap(extreme2);
+
263  out_min.x() = std::max(x_min, std::min(x_max, pre_image.x()));
+
264 
+
265  } else if (soln_number == 1) {
+
266  // the circle was tangent at the focal point
+
267  } else if (soln_number == 0) {
+
268  // the focal point was inside the circle
+
269  }
+
270 
+
271  // find the y-range
+
272  soln_number = findTangentPoints(gamma, centerLS.y(), centerLS.z(), radiusLS, xp, zp, xm, zm);
+
273  if (soln_number == 2) {
+
274  extreme.x() = centerLS.x();
+
275  extreme.y() = xp;
+
276  extreme.z() = zp;
+
277 
+
278  // location in world space of the tangent point
+
279  extreme2 = secondMap.applyMap(extreme);
+
280  // convert back to voxel space
+
281  pre_image = frustum.applyInverseMap(extreme2);
+
282  out_max.y() = std::max(y_min, std::min(y_max, pre_image.y()));
+
283 
+
284  extreme.x() = centerLS.x();
+
285  extreme.y() = xm;
+
286  extreme.z() = zm;
+
287  extreme2 = secondMap.applyMap(extreme);
+
288 
+
289  // convert back to voxel space
+
290  pre_image = frustum.applyInverseMap(extreme2);
+
291  out_min.y() = std::max(y_min, std::min(y_max, pre_image.y()));
+
292 
+
293  } else if (soln_number == 1) {
+
294  // the circle was tangent at the focal point
+
295  } else if (soln_number == 0) {
+
296  // the focal point was inside the circle
+
297  }
+
298 
+
299  // the near and far
+
300  // the closest point. The front of the frustum is at 0 in index space
+
301  double near_dist = std::max(centerLS.z() - radiusLS, 0.);
+
302  // the farthest point. The back of the frustum is at mDepth in index space
+
303  double far_dist = std::min(centerLS.z() + radiusLS, frustum.getDepth() );
+
304 
+
305  Vec3d near_point(0.f, 0.f, near_dist);
+
306  Vec3d far_point(0.f, 0.f, far_dist);
+
307 
+
308  out_min.z() = std::max(z_min, frustum.applyInverseMap(secondMap.applyMap(near_point)).z());
+
309  out_max.z() = std::min(z_max, frustum.applyInverseMap(secondMap.applyMap(far_point)).z());
+
310 
+
311 }
+
312 
+
313 } // namespace util
+
314 } // namespace OPENVDB_VERSION_NAME
+
315 } // namespace openvdb
+
316 
+
317 #endif // OPENVDB_UTIL_MAPSUTIL_HAS_BEEN_INCLUDED
+
318 
+
319 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
320 // All rights reserved. This software is distributed under the
+
321 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
T & z()
Definition: Vec3.h:99
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & max(const T &a, const T &b)
Definition: Composite.h:132
+ +
This map is composed of three steps. First it will take a box of size (Lx X Ly X Lz) defined by a mem...
Definition: Maps.h:1874
+ +
double Real
Definition: Types.h:64
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
Vec3< double > Vec3d
Definition: Vec3.h:651
+
Map traits.
Definition: Maps.h:80
+
T & x()
Reference to the component, e.g. v.x() = 4.5f;.
Definition: Vec3.h:97
+
A general linear transform using homogeneous coordinates to perform rotation, scaling, shear and translation.
Definition: Maps.h:324
+
Definition: Exceptions.h:39
+
T & y()
Definition: Vec3.h:98
+
void calculateBounds(const MapType &map, const Vec3d &center, const Real radius, BBoxd &out)
Calculate an axis-aligned bounding box in the given map's domain from a spherical bounding box in its...
Definition: MapsUtil.h:86
+
Vec3d applyMap(const Vec3d &in) const
Return the image of in under the map.
Definition: Maps.h:440
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
Vec3d voxelSize() const
Return the lengths of the images of the segments (0,0,0)-(1,0,0), (0,0,0)-(0,1,0) and (0...
Definition: Maps.h:484
+
const Vec3T & min() const
Return a const reference to the minimum point of the BBox.
Definition: BBox.h:81
+
const Vec3T & max() const
Return a const reference to the maximum point of the BBox.
Definition: BBox.h:84
+
Vec3d applyInverseMap(const Vec3d &in) const
Return the pre-image of in under the map.
Definition: Maps.h:442
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & min(const T &a, const T &b)
Definition: Composite.h:128
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/Maps_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/Maps_8h_source.html new file mode 100644 index 00000000..03dbf1a7 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/Maps_8h_source.html @@ -0,0 +1,2837 @@ + + + + + + +OpenVDB: Maps.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Maps.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
32 
+
33 #ifndef OPENVDB_MATH_MAPS_HAS_BEEN_INCLUDED
+
34 #define OPENVDB_MATH_MAPS_HAS_BEEN_INCLUDED
+
35 
+
36 #include "Math.h"
+
37 #include "Mat4.h"
+
38 #include "Vec3.h"
+
39 #include "BBox.h"
+
40 #include "Coord.h"
+
41 #include <openvdb/io/io.h> // for io::getFormatVersion()
+
42 #include <openvdb/util/Name.h>
+
43 #include <openvdb/Types.h>
+
44 #include <boost/shared_ptr.hpp>
+
45 #include <map>
+
46 
+
47 namespace openvdb {
+ +
49 namespace OPENVDB_VERSION_NAME {
+
50 namespace math {
+
51 
+
52 
+
54 
+
56 
+
57 class MapBase;
+
58 class ScaleMap;
+
59 class TranslationMap;
+
60 class ScaleTranslateMap;
+
61 class UniformScaleMap;
+
62 class UniformScaleTranslateMap;
+
63 class AffineMap;
+
64 class UnitaryMap;
+
65 class NonlinearFrustumMap;
+
66 
+
67 template<typename T1, typename T2> class CompoundMap;
+
68 
+ + +
71 typedef SpectralDecomposedMap SymmetricMap;
+ + +
74 
+
75 
+
77 
+
79 
+
80 template<typename T> struct is_linear { static const bool value = false; };
+
81 template<> struct is_linear<AffineMap> { static const bool value = true; };
+
82 template<> struct is_linear<ScaleMap> { static const bool value = true; };
+
83 template<> struct is_linear<UniformScaleMap> { static const bool value = true; };
+
84 template<> struct is_linear<UnitaryMap> { static const bool value = true; };
+
85 template<> struct is_linear<TranslationMap> { static const bool value = true; };
+
86 template<> struct is_linear<ScaleTranslateMap> { static const bool value = true; };
+
87 template<> struct is_linear<UniformScaleTranslateMap> { static const bool value = true; };
+
88 
+
89 template<typename T1, typename T2> struct is_linear<CompoundMap<T1, T2> > {
+
90  static const bool value = is_linear<T1>::value && is_linear<T2>::value;
+
91 };
+
92 
+
93 
+
94 template<typename T> struct is_uniform_scale { static const bool value = false; };
+
95 template<> struct is_uniform_scale<UniformScaleMap> { static const bool value = true; };
+
96 
+
97 template<typename T> struct is_uniform_scale_translate { static const bool value = false; };
+
98 template<> struct is_uniform_scale_translate<TranslationMap> { static const bool value = true; };
+ +
100  static const bool value = true;
+
101 };
+
102 
+
103 
+
104 template<typename T> struct is_scale { static const bool value = false; };
+
105 template<> struct is_scale<ScaleMap> { static const bool value = true; };
+
106 
+
107 template<typename T> struct is_scale_translate { static const bool value = false; };
+
108 template<> struct is_scale_translate<ScaleTranslateMap> { static const bool value = true; };
+
109 
+
110 
+
111 template<typename T> struct is_uniform_diagonal_jacobian {
+ +
113 };
+
114 
+
115 template<typename T> struct is_diagonal_jacobian {
+
116  static const bool value = is_scale<T>::value || is_scale_translate<T>::value;
+
117 };
+
118 
+
119 
+
121 
+
123 
+
126 OPENVDB_API boost::shared_ptr<SymmetricMap> createSymmetricMap(const Mat3d& m);
+
127 
+
128 
+
131 OPENVDB_API boost::shared_ptr<FullyDecomposedMap> createFullyDecomposedMap(const Mat4d& m);
+
132 
+
133 
+
144 OPENVDB_API boost::shared_ptr<PolarDecomposedMap> createPolarDecomposedMap(const Mat3d& m);
+
145 
+
146 
+
148 OPENVDB_API boost::shared_ptr<MapBase> simplify(boost::shared_ptr<AffineMap> affine);
+
149 
+ +
153 
+
154 
+
156 
+
157 
+ +
160 {
+
161 public:
+
162  typedef boost::shared_ptr<MapBase> Ptr;
+
163  typedef boost::shared_ptr<const MapBase> ConstPtr;
+
164  typedef Ptr (*MapFactory)();
+
165 
+
166  virtual ~MapBase(){}
+
167 
+
168  virtual boost::shared_ptr<AffineMap> getAffineMap() const = 0;
+
169 
+
171  virtual Name type() const = 0;
+
172 
+
174  template<typename MapT> bool isType() const { return this->type() == MapT::mapType(); }
+
175 
+
177  virtual bool isEqual(const MapBase& other) const = 0;
+
178 
+
180  virtual bool isLinear() const = 0;
+
182  virtual bool hasUniformScale() const = 0;
+
183 
+
184  virtual Vec3d applyMap(const Vec3d& in) const = 0;
+
185  virtual Vec3d applyInverseMap(const Vec3d& in) const = 0;
+
186 
+
188  virtual Vec3d applyIJT(const Vec3d& in) const = 0;
+
192  virtual Vec3d applyIJT(const Vec3d& in, const Vec3d& domainPos) const = 0;
+
194 
+
195  virtual Mat3d applyIJC(const Mat3d& m) const = 0;
+
196  virtual Mat3d applyIJC(const Mat3d& m, const Vec3d& v, const Vec3d& domainPos) const = 0;
+
197 
+
198 
+
199  virtual double determinant() const = 0;
+
200  virtual double determinant(const Vec3d&) const = 0;
+
201 
+
202 
+
204  virtual Vec3d voxelSize() const = 0;
+
208  virtual Vec3d voxelSize(const Vec3d&) const = 0;
+
210 
+
211  virtual void read(std::istream&) = 0;
+
212  virtual void write(std::ostream&) const = 0;
+
213 
+
214  virtual std::string str() const = 0;
+
215 
+
216  virtual MapBase::Ptr copy() const = 0;
+
217 
+
219  virtual MapBase::Ptr preRotate(double radians, Axis axis = X_AXIS) const = 0;
+
221  virtual MapBase::Ptr preTranslate(const Vec3d&) const = 0;
+
222  virtual MapBase::Ptr preScale(const Vec3d&) const = 0;
+
223  virtual MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const = 0;
+
224 
+
225  virtual MapBase::Ptr postRotate(double radians, Axis axis = X_AXIS) const = 0;
+
226  virtual MapBase::Ptr postTranslate(const Vec3d&) const = 0;
+
227  virtual MapBase::Ptr postScale(const Vec3d&) const = 0;
+
228  virtual MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const = 0;
+
230 
+
232  virtual Vec3d applyJacobian(const Vec3d& in) const = 0;
+
238  virtual Vec3d applyJacobian(const Vec3d& in, const Vec3d& domainPos) const = 0;
+
240 
+
242  virtual Vec3d applyInverseJacobian(const Vec3d& in) const = 0;
+
248  virtual Vec3d applyInverseJacobian(const Vec3d& in, const Vec3d& domainPos) const = 0;
+
250 
+
251 
+
253  virtual Vec3d applyJT(const Vec3d& in) const = 0;
+
260  virtual Vec3d applyJT(const Vec3d& in, const Vec3d& domainPos) const = 0;
+
262 
+
268  virtual MapBase::Ptr inverseMap() const = 0;
+
269 
+
270 protected:
+
271  MapBase() {}
+
272 
+
273  template<typename MapT>
+
274  static bool isEqualBase(const MapT& self, const MapBase& other)
+
275  {
+
276  return other.isType<MapT>() && (self == *static_cast<const MapT*>(&other));
+
277  }
+
278 };
+
279 
+
280 
+
282 
+
283 
+ +
287 {
+
288 public:
+
289  typedef std::map<Name, MapBase::MapFactory> MapDictionary;
+
290 
+
291  static MapRegistry* instance();
+
292 
+
294  static MapBase::Ptr createMap(const Name&);
+
295 
+
297  static bool isRegistered(const Name&);
+
298 
+
300  static void registerMap(const Name&, MapBase::MapFactory);
+
301 
+
303  static void unregisterMap(const Name&);
+
304 
+
306  static void clear();
+
307 
+
308 private:
+
309  MapRegistry() {}
+
310 
+
311  static MapRegistry* staticInstance();
+
312 
+
313  static MapRegistry* mInstance;
+
314 
+
315  MapDictionary mMap;
+
316 };
+
317 
+
318 
+
320 
+
321 
+ +
325 {
+
326 public:
+
327  typedef boost::shared_ptr<AffineMap> Ptr;
+
328  typedef boost::shared_ptr<const AffineMap> ConstPtr;
+
329 
+ +
331  mMatrix(Mat4d::identity()),
+
332  mMatrixInv(Mat4d::identity()),
+
333  mJacobianInv(Mat3d::identity()),
+
334  mDeterminant(1),
+
335  mVoxelSize(Vec3d(1,1,1)),
+
336  mIsDiagonal(true),
+
337  mIsIdentity(true)
+
338  // the default constructor for translation is zero
+
339  {
+
340  }
+
341 
+
342  AffineMap(const Mat3d& m)
+
343  {
+
344  Mat4d mat4(Mat4d::identity());
+
345  mat4.setMat3(m);
+
346  mMatrix = mat4;
+
347  updateAcceleration();
+
348  }
+
349 
+
350  AffineMap(const Mat4d& m): mMatrix(m)
+
351  {
+
352  if (!isAffine(m)) {
+ +
354  "Tried to initialize an affine transform from a non-affine 4x4 matrix");
+
355  }
+
356  updateAcceleration();
+
357  }
+
358 
+
359  AffineMap(const AffineMap& other):
+
360  MapBase(other),
+
361  mMatrix(other.mMatrix),
+
362  mMatrixInv(other.mMatrixInv),
+
363  mJacobianInv(other.mJacobianInv),
+
364  mDeterminant(other.mDeterminant),
+
365  mVoxelSize(other.mVoxelSize),
+
366  mIsDiagonal(other.mIsDiagonal),
+
367  mIsIdentity(other.mIsIdentity)
+
368  {
+
369  }
+
370 
+
372  AffineMap(const AffineMap& first, const AffineMap& second):
+
373  mMatrix(first.mMatrix * second.mMatrix)
+
374  {
+
375  updateAcceleration();
+
376  }
+
377 
+ +
379 
+
381  static MapBase::Ptr create() { return MapBase::Ptr(new AffineMap()); }
+
383  MapBase::Ptr copy() const { return MapBase::Ptr(new AffineMap(*this)); }
+
384 
+
385  MapBase::Ptr inverseMap() const { return MapBase::Ptr(new AffineMap(mMatrixInv)); }
+
386 
+
387  static bool isRegistered() { return MapRegistry::isRegistered(AffineMap::mapType()); }
+
388 
+
389  static void registerMap()
+
390  {
+
391  MapRegistry::registerMap(
+
392  AffineMap::mapType(),
+
393  AffineMap::create);
+
394  }
+
395 
+
396  Name type() const { return mapType(); }
+
397  static Name mapType() { return Name("AffineMap"); }
+
398 
+
400  bool isLinear() const { return true; }
+
401 
+
403  bool hasUniformScale() const
+
404  {
+
405  Mat3d mat = mMatrix.getMat3();
+
406  const double det = mat.det();
+
407  if (isApproxEqual(det, double(0))) {
+
408  return false;
+
409  } else {
+
410  mat *= (1.f / pow(std::abs(det),1./3.));
+
411  return isUnitary(mat);
+
412  }
+
413  }
+
414 
+
415  virtual bool isEqual(const MapBase& other) const { return isEqualBase(*this, other); }
+
416 
+
417  bool operator==(const AffineMap& other) const
+
418  {
+
419  // the Mat.eq() is approximate
+
420  if (!mMatrix.eq(other.mMatrix)) { return false; }
+
421  if (!mMatrixInv.eq(other.mMatrixInv)) { return false; }
+
422  return true;
+
423  }
+
424 
+
425  bool operator!=(const AffineMap& other) const { return !(*this == other); }
+
426 
+ +
428  {
+
429  mMatrix = other.mMatrix;
+
430  mMatrixInv = other.mMatrixInv;
+
431 
+
432  mJacobianInv = other.mJacobianInv;
+
433  mDeterminant = other.mDeterminant;
+
434  mVoxelSize = other.mVoxelSize;
+
435  mIsDiagonal = other.mIsDiagonal;
+
436  mIsIdentity = other.mIsIdentity;
+
437  return *this;
+
438  }
+
440  Vec3d applyMap(const Vec3d& in) const { return in * mMatrix; }
+
442  Vec3d applyInverseMap(const Vec3d& in) const {return in * mMatrixInv; }
+
443 
+
445  Vec3d applyJacobian(const Vec3d& in, const Vec3d&) const { return applyJacobian(in); }
+
447  Vec3d applyJacobian(const Vec3d& in) const { return mMatrix.transform3x3(in); }
+
448 
+
450  Vec3d applyInverseJacobian(const Vec3d& in, const Vec3d&) const { return applyInverseJacobian(in); }
+
452  Vec3d applyInverseJacobian(const Vec3d& in) const { return mMatrixInv.transform3x3(in); }
+
453 
+
456  Vec3d applyJT(const Vec3d& in, const Vec3d&) const { return applyJT(in); }
+
458  Vec3d applyJT(const Vec3d& in) const {
+
459  const double* m = mMatrix.asPointer();
+
460  return Vec3d( m[ 0] * in[0] + m[ 1] * in[1] + m[ 2] * in[2],
+
461  m[ 4] * in[0] + m[ 5] * in[1] + m[ 6] * in[2],
+
462  m[ 8] * in[0] + m[ 9] * in[1] + m[10] * in[2] );
+
463  }
+
464 
+
466  Vec3d applyIJT(const Vec3d& in, const Vec3d&) const { return applyIJT(in); }
+
468  Vec3d applyIJT(const Vec3d& in) const { return in * mJacobianInv; }
+
470  Mat3d applyIJC(const Mat3d& m) const {
+
471  return mJacobianInv.transpose()* m * mJacobianInv;
+
472  }
+
473  Mat3d applyIJC(const Mat3d& in, const Vec3d& , const Vec3d& ) const {
+
474  return applyIJC(in);
+
475  }
+
477  double determinant(const Vec3d& ) const { return determinant(); }
+
479  double determinant() const { return mDeterminant; }
+
480 
+
482  Vec3d voxelSize() const { return mVoxelSize; }
+
485  Vec3d voxelSize(const Vec3d&) const { return voxelSize(); }
+
487 
+
489  bool isIdentity() const { return mIsIdentity; }
+
491  bool isDiagonal() const { return mIsDiagonal; }
+
493  bool isScale() const { return isDiagonal(); }
+
495  bool isScaleTranslate() const { return math::isDiagonal(mMatrix.getMat3()); }
+
496 
+
497 
+
498  // Methods that modify the existing affine map
+
499 
+
501  void accumPreRotation(Axis axis, double radians)
+
503  {
+
504  mMatrix.preRotate(axis, radians);
+
505  updateAcceleration();
+
506  }
+
507  void accumPreScale(const Vec3d& v)
+
508  {
+
509  mMatrix.preScale(v);
+
510  updateAcceleration();
+
511  }
+
512  void accumPreTranslation(const Vec3d& v)
+
513  {
+
514  mMatrix.preTranslate(v);
+
515  updateAcceleration();
+
516  }
+
517  void accumPreShear(Axis axis0, Axis axis1, double shear)
+
518  {
+
519  mMatrix.preShear(axis0, axis1, shear);
+
520  updateAcceleration();
+
521  }
+
523 
+
524 
+
526  void accumPostRotation(Axis axis, double radians)
+
528  {
+
529  mMatrix.postRotate(axis, radians);
+
530  updateAcceleration();
+
531  }
+
532  void accumPostScale(const Vec3d& v)
+
533  {
+
534  mMatrix.postScale(v);
+
535  updateAcceleration();
+
536  }
+ +
538  {
+
539  mMatrix.postTranslate(v);
+
540  updateAcceleration();
+
541  }
+
542  void accumPostShear(Axis axis0, Axis axis1, double shear)
+
543  {
+
544  mMatrix.postShear(axis0, axis1, shear);
+
545  updateAcceleration();
+
546  }
+
548 
+
549 
+
551  void read(std::istream& is)
+
552  {
+
553  mMatrix.read(is);
+
554  updateAcceleration();
+
555  }
+
556 
+
558  void write(std::ostream& os) const
+
559  {
+
560  mMatrix.write(os);
+
561  }
+
562 
+
564  std::string str() const
+
565  {
+
566  std::ostringstream buffer;
+
567  buffer << " - mat4:\n" << mMatrix.str() << std::endl;
+
568  buffer << " - voxel dimensions: " << mVoxelSize << std::endl;
+
569  return buffer.str();
+
570  }
+
571 
+
573  boost::shared_ptr<FullyDecomposedMap> createDecomposedMap()
+
574  {
+
575  return createFullyDecomposedMap(mMatrix);
+
576  }
+
577 
+
579  AffineMap::Ptr getAffineMap() const { return AffineMap::Ptr(new AffineMap(*this)); }
+
580 
+
582  AffineMap::Ptr inverse() const { return AffineMap::Ptr(new AffineMap(mMatrixInv)); }
+
583 
+
584 
+
586  MapBase::Ptr preRotate(double radians, Axis axis = X_AXIS) const
+
589  {
+
590  AffineMap::Ptr affineMap = getAffineMap();
+
591  affineMap->accumPreRotation(axis, radians);
+
592  return simplify(affineMap);
+
593  }
+ +
595  {
+
596  AffineMap::Ptr affineMap = getAffineMap();
+
597  affineMap->accumPreTranslation(t);
+
598  return boost::static_pointer_cast<MapBase, AffineMap>(affineMap);
+
599  }
+
600  MapBase::Ptr preScale(const Vec3d& s) const
+
601  {
+
602  AffineMap::Ptr affineMap = getAffineMap();
+
603  affineMap->accumPreScale(s);
+
604  return boost::static_pointer_cast<MapBase, AffineMap>(affineMap);
+
605  }
+
606  MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const
+
607  {
+
608  AffineMap::Ptr affineMap = getAffineMap();
+
609  affineMap->accumPreShear(axis0, axis1, shear);
+
610  return simplify(affineMap);
+
611  }
+
613 
+
614 
+
616  MapBase::Ptr postRotate(double radians, Axis axis = X_AXIS) const
+
619  {
+
620  AffineMap::Ptr affineMap = getAffineMap();
+
621  affineMap->accumPostRotation(axis, radians);
+
622  return simplify(affineMap);
+
623  }
+ +
625  {
+
626  AffineMap::Ptr affineMap = getAffineMap();
+
627  affineMap->accumPostTranslation(t);
+
628  return boost::static_pointer_cast<MapBase, AffineMap>(affineMap);
+
629  }
+
630  MapBase::Ptr postScale(const Vec3d& s) const
+
631  {
+
632  AffineMap::Ptr affineMap = getAffineMap();
+
633  affineMap->accumPostScale(s);
+
634  return boost::static_pointer_cast<MapBase, AffineMap>(affineMap);
+
635  }
+
636  MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const
+
637  {
+
638  AffineMap::Ptr affineMap = getAffineMap();
+
639  affineMap->accumPostShear(axis0, axis1, shear);
+
640  return simplify(affineMap);
+
641  }
+
643 
+
645  Mat4d getMat4() const { return mMatrix;}
+
646  const Mat4d& getConstMat4() const {return mMatrix;}
+
647  const Mat3d& getConstJacobianInv() const {return mJacobianInv;}
+
648 
+
649 private:
+
650  void updateAcceleration() {
+
651  Mat3d mat3 = mMatrix.getMat3();
+
652  mDeterminant = mat3.det();
+
653 
+
654  if (std::abs(mDeterminant) < (3.0 * math::Tolerance<double>::value())) {
+ +
656  "Tried to initialize an affine transform from a nearly singular matrix");
+
657  }
+
658  mMatrixInv = mMatrix.inverse();
+
659  mJacobianInv = mat3.inverse().transpose();
+
660  mIsDiagonal = math::isDiagonal(mMatrix);
+
661  mIsIdentity = math::isIdentity(mMatrix);
+
662  Vec3d pos = applyMap(Vec3d(0,0,0));
+
663  mVoxelSize(0) = (applyMap(Vec3d(1,0,0)) - pos).length();
+
664  mVoxelSize(1) = (applyMap(Vec3d(0,1,0)) - pos).length();
+
665  mVoxelSize(2) = (applyMap(Vec3d(0,0,1)) - pos).length();
+
666  }
+
667 
+
668  // the underlying matrix
+
669  Mat4d mMatrix;
+
670 
+
671  // stored for acceleration
+
672  Mat4d mMatrixInv;
+
673  Mat3d mJacobianInv;
+
674  double mDeterminant;
+
675  Vec3d mVoxelSize;
+
676  bool mIsDiagonal, mIsIdentity;
+
677 }; // class AffineMap
+
678 
+
679 
+
681 
+
682 
+ +
686 {
+
687 public:
+
688  typedef boost::shared_ptr<ScaleMap> Ptr;
+
689  typedef boost::shared_ptr<const ScaleMap> ConstPtr;
+
690 
+
691  ScaleMap(): MapBase(), mScaleValues(Vec3d(1,1,1)), mVoxelSize(Vec3d(1,1,1)),
+
692  mScaleValuesInverse(Vec3d(1,1,1)),
+
693  mInvScaleSqr(1,1,1), mInvTwiceScale(0.5,0.5,0.5){}
+
694 
+ +
696  MapBase(),
+
697  mScaleValues(scale),
+
698  mVoxelSize(Vec3d(std::abs(scale(0)),std::abs(scale(1)), std::abs(scale(2))))
+
699  {
+
700  double determinant = scale[0]* scale[1] * scale[2];
+
701  if (std::abs(determinant) < 3.0 * math::Tolerance<double>::value()) {
+
702  OPENVDB_THROW(ArithmeticError, "Non-zero scale values required");
+
703  }
+
704  mScaleValuesInverse = 1.0 / mScaleValues;
+
705  mInvScaleSqr = mScaleValuesInverse * mScaleValuesInverse;
+
706  mInvTwiceScale = mScaleValuesInverse / 2;
+
707  }
+
708 
+
709  ScaleMap(const ScaleMap& other):
+
710  MapBase(),
+
711  mScaleValues(other.mScaleValues),
+
712  mVoxelSize(other.mVoxelSize),
+
713  mScaleValuesInverse(other.mScaleValuesInverse),
+
714  mInvScaleSqr(other.mInvScaleSqr),
+
715  mInvTwiceScale(other.mInvTwiceScale)
+
716  {
+
717  }
+
718 
+ +
720 
+
722  static MapBase::Ptr create() { return MapBase::Ptr(new ScaleMap()); }
+
724  MapBase::Ptr copy() const { return MapBase::Ptr(new ScaleMap(*this)); }
+
725 
+
726  MapBase::Ptr inverseMap() const { return MapBase::Ptr(new ScaleMap(mScaleValuesInverse)); }
+
727 
+
728  static bool isRegistered() { return MapRegistry::isRegistered(ScaleMap::mapType()); }
+
729 
+
730  static void registerMap()
+
731  {
+
732  MapRegistry::registerMap(
+
733  ScaleMap::mapType(),
+
734  ScaleMap::create);
+
735  }
+
736 
+
737  Name type() const { return mapType(); }
+
738  static Name mapType() { return Name("ScaleMap"); }
+
739 
+
741  bool isLinear() const { return true; }
+
742 
+
744  bool hasUniformScale() const
+
745  {
+
746  bool value = isApproxEqual(
+
747  std::abs(mScaleValues.x()), std::abs(mScaleValues.y()), double(5e-7));
+
748  value = value && isApproxEqual(
+
749  std::abs(mScaleValues.x()), std::abs(mScaleValues.z()), double(5e-7));
+
750  return value;
+
751  }
+
752 
+
754  Vec3d applyMap(const Vec3d& in) const
+
755  {
+
756  return Vec3d(
+
757  in.x() * mScaleValues.x(),
+
758  in.y() * mScaleValues.y(),
+
759  in.z() * mScaleValues.z());
+
760  }
+
762  Vec3d applyInverseMap(const Vec3d& in) const
+
763  {
+
764  return Vec3d(
+
765  in.x() * mScaleValuesInverse.x(),
+
766  in.y() * mScaleValuesInverse.y(),
+
767  in.z() * mScaleValuesInverse.z());
+
768  }
+
770  Vec3d applyJacobian(const Vec3d& in, const Vec3d&) const { return applyJacobian(in); }
+
772  Vec3d applyJacobian(const Vec3d& in) const { return applyMap(in); }
+
773 
+
775  Vec3d applyInverseJacobian(const Vec3d& in, const Vec3d&) const { return applyInverseJacobian(in); }
+
777  Vec3d applyInverseJacobian(const Vec3d& in) const { return applyInverseMap(in); }
+
778 
+
781  Vec3d applyJT(const Vec3d& in, const Vec3d&) const { return applyJT(in); }
+
783  Vec3d applyJT(const Vec3d& in) const { return applyMap(in); }
+
784 
+
785 
+
786 
+
789  Vec3d applyIJT(const Vec3d& in, const Vec3d&) const { return applyIJT(in);}
+
791  Vec3d applyIJT(const Vec3d& in) const { return applyInverseMap(in); }
+
793  Mat3d applyIJC(const Mat3d& in) const
+
794  {
+
795  Mat3d tmp;
+
796  for (int i = 0; i < 3; i++) {
+
797  tmp.setRow(i, in.row(i) * mScaleValuesInverse(i));
+
798  }
+
799  for (int i = 0; i < 3; i++) {
+
800  tmp.setCol(i, tmp.col(i) * mScaleValuesInverse(i));
+
801  }
+
802  return tmp;
+
803  }
+
804  Mat3d applyIJC(const Mat3d& in, const Vec3d&, const Vec3d&) const { return applyIJC(in); }
+
806  double determinant(const Vec3d&) const { return determinant(); }
+
808  double determinant() const { return mScaleValues.x() * mScaleValues.y() * mScaleValues.z(); }
+
809 
+
811  const Vec3d& getScale() const {return mScaleValues;}
+
812 
+
814  const Vec3d& getInvScaleSqr() const { return mInvScaleSqr; }
+
816  const Vec3d& getInvTwiceScale() const { return mInvTwiceScale; }
+
818  const Vec3d& getInvScale() const { return mScaleValuesInverse; }
+
819 
+
821  Vec3d voxelSize() const { return mVoxelSize; }
+
826  Vec3d voxelSize(const Vec3d&) const { return voxelSize(); }
+
828 
+
830  void read(std::istream& is)
+
831  {
+
832  mScaleValues.read(is);
+
833  mVoxelSize.read(is);
+
834  mScaleValuesInverse.read(is);
+
835  mInvScaleSqr.read(is);
+
836  mInvTwiceScale.read(is);
+
837  }
+
839  void write(std::ostream& os) const
+
840  {
+
841  mScaleValues.write(os);
+
842  mVoxelSize.write(os);
+
843  mScaleValuesInverse.write(os);
+
844  mInvScaleSqr.write(os);
+
845  mInvTwiceScale.write(os);
+
846  }
+
848  std::string str() const
+
849  {
+
850  std::ostringstream buffer;
+
851  buffer << " - scale: " << mScaleValues << std::endl;
+
852  buffer << " - voxel dimensions: " << mVoxelSize << std::endl;
+
853  return buffer.str();
+
854  }
+
855 
+
856  virtual bool isEqual(const MapBase& other) const { return isEqualBase(*this, other); }
+
857 
+
858  bool operator==(const ScaleMap& other) const
+
859  {
+
860  // ::eq() uses a tolerance
+
861  if (!mScaleValues.eq(other.mScaleValues)) { return false; }
+
862  return true;
+
863  }
+
864 
+
865  bool operator!=(const ScaleMap& other) const { return !(*this == other); }
+
866 
+ +
869  {
+
870  return AffineMap::Ptr(new AffineMap(math::scale<Mat4d>(mScaleValues)));
+
871  }
+
872 
+
873 
+
874 
+
876  MapBase::Ptr preRotate(double radians, Axis axis) const
+
879  {
+
880  AffineMap::Ptr affineMap = getAffineMap();
+
881  affineMap->accumPreRotation(axis, radians);
+
882  return simplify(affineMap);
+
883  }
+
884 
+
885  MapBase::Ptr preTranslate(const Vec3d& tr) const;
+
886 
+
887  MapBase::Ptr preScale(const Vec3d& v) const;
+
888 
+
889  MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const
+
890  {
+
891  AffineMap::Ptr affineMap = getAffineMap();
+
892  affineMap->accumPreShear(axis0, axis1, shear);
+
893  return simplify(affineMap);
+
894  }
+
896 
+
897 
+
899  MapBase::Ptr postRotate(double radians, Axis axis) const
+
902  {
+
903  AffineMap::Ptr affineMap = getAffineMap();
+
904  affineMap->accumPostRotation(axis, radians);
+
905  return simplify(affineMap);
+
906  }
+
907 
+
908  MapBase::Ptr postTranslate(const Vec3d& tr) const;
+
909 
+
910  MapBase::Ptr postScale(const Vec3d& v) const;
+
911 
+
912  MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const
+
913  {
+
914  AffineMap::Ptr affineMap = getAffineMap();
+
915  affineMap->accumPostShear(axis0, axis1, shear);
+
916  return simplify(affineMap);
+
917  }
+
919 
+
920 private:
+
921  Vec3d mScaleValues, mVoxelSize, mScaleValuesInverse, mInvScaleSqr, mInvTwiceScale;
+
922 }; // class ScaleMap
+
923 
+
924 
+ +
928 {
+
929 public:
+
930  typedef boost::shared_ptr<UniformScaleMap> Ptr;
+
931  typedef boost::shared_ptr<const UniformScaleMap> ConstPtr;
+
932 
+ +
934  UniformScaleMap(double scale): ScaleMap(Vec3d(scale, scale, scale)) {}
+
935  UniformScaleMap(const UniformScaleMap& other): ScaleMap(other) {}
+ +
937 
+
939  static MapBase::Ptr create() { return MapBase::Ptr(new UniformScaleMap()); }
+
941  MapBase::Ptr copy() const { return MapBase::Ptr(new UniformScaleMap(*this)); }
+
942 
+ +
944  {
+
945  const Vec3d& invScale = getInvScale();
+
946  return MapBase::Ptr(new UniformScaleMap( invScale[0]));
+
947  }
+
948 
+
949  static bool isRegistered() { return MapRegistry::isRegistered(UniformScaleMap::mapType()); }
+
950  static void registerMap()
+
951  {
+
952  MapRegistry::registerMap(
+
953  UniformScaleMap::mapType(),
+
954  UniformScaleMap::create);
+
955  }
+
956 
+
957  Name type() const { return mapType(); }
+
958  static Name mapType() { return Name("UniformScaleMap"); }
+
959 
+
960  virtual bool isEqual(const MapBase& other) const { return isEqualBase(*this, other); }
+
961 
+
962  bool operator==(const UniformScaleMap& other) const { return ScaleMap::operator==(other); }
+
963  bool operator!=(const UniformScaleMap& other) const { return !(*this == other); }
+
964 
+
967  MapBase::Ptr preTranslate(const Vec3d& tr) const;
+
968 
+
971  MapBase::Ptr postTranslate(const Vec3d& tr) const;
+
972 
+
973 }; // class UniformScaleMap
+
974 
+
975 
+
977 
+
978 
+
979 inline MapBase::Ptr
+
980 ScaleMap::preScale(const Vec3d& v) const
+
981 {
+
982  const Vec3d new_scale(v * mScaleValues);
+
983  if (isApproxEqual(new_scale[0],new_scale[1]) && isApproxEqual(new_scale[0],new_scale[2])) {
+
984  return MapBase::Ptr(new UniformScaleMap(new_scale[0]));
+
985  } else {
+
986  return MapBase::Ptr(new ScaleMap(new_scale));
+
987  }
+
988 }
+
989 
+
990 
+
991 inline MapBase::Ptr
+
992 ScaleMap::postScale(const Vec3d& v) const
+
993 { // pre-post Scale are the same for a scale map
+
994  return preScale(v);
+
995 }
+
996 
+
997 
+ +
1000 {
+
1001 public:
+
1002  typedef boost::shared_ptr<TranslationMap> Ptr;
+
1003  typedef boost::shared_ptr<const TranslationMap> ConstPtr;
+
1004 
+
1005  // default constructor is a translation by zero.
+
1006  TranslationMap(): MapBase(), mTranslation(Vec3d(0,0,0)) {}
+
1007  TranslationMap(const Vec3d& t): MapBase(), mTranslation(t) {}
+
1008  TranslationMap(const TranslationMap& other): MapBase(), mTranslation(other.mTranslation) {}
+
1009 
+ +
1011 
+
1013  static MapBase::Ptr create() { return MapBase::Ptr(new TranslationMap()); }
+
1015  MapBase::Ptr copy() const { return MapBase::Ptr(new TranslationMap(*this)); }
+
1016 
+
1017  MapBase::Ptr inverseMap() const { return MapBase::Ptr(new TranslationMap(-mTranslation)); }
+
1018 
+
1019  static bool isRegistered() { return MapRegistry::isRegistered(TranslationMap::mapType()); }
+
1020 
+
1021  static void registerMap()
+
1022  {
+
1023  MapRegistry::registerMap(
+
1024  TranslationMap::mapType(),
+
1025  TranslationMap::create);
+
1026  }
+
1027 
+
1028  Name type() const { return mapType(); }
+
1029  static Name mapType() { return Name("TranslationMap"); }
+
1030 
+
1032  bool isLinear() const { return true; }
+
1033 
+
1035  bool hasUniformScale() const { return true; }
+
1036 
+
1038  Vec3d applyMap(const Vec3d& in) const { return in + mTranslation; }
+
1040  Vec3d applyInverseMap(const Vec3d& in) const { return in - mTranslation; }
+
1042  Vec3d applyJacobian(const Vec3d& in, const Vec3d&) const { return applyJacobian(in); }
+
1044  Vec3d applyJacobian(const Vec3d& in) const { return in; }
+
1045 
+
1047  Vec3d applyInverseJacobian(const Vec3d& in, const Vec3d&) const { return applyInverseJacobian(in); }
+
1049  Vec3d applyInverseJacobian(const Vec3d& in) const { return in; }
+
1050 
+
1051 
+
1054  Vec3d applyJT(const Vec3d& in, const Vec3d&) const { return applyJT(in); }
+
1056  Vec3d applyJT(const Vec3d& in) const { return in; }
+
1057 
+
1060  Vec3d applyIJT(const Vec3d& in, const Vec3d& ) const { return applyIJT(in);}
+
1063  Vec3d applyIJT(const Vec3d& in) const {return in;}
+
1065  Mat3d applyIJC(const Mat3d& mat) const {return mat;}
+
1066  Mat3d applyIJC(const Mat3d& mat, const Vec3d&, const Vec3d&) const { return applyIJC(mat); }
+
1067 
+
1069  double determinant(const Vec3d& ) const { return determinant(); }
+
1071  double determinant() const { return 1.0; }
+
1072 
+
1074  Vec3d voxelSize() const { return Vec3d(1,1,1);}
+
1076  Vec3d voxelSize(const Vec3d&) const { return voxelSize();}
+
1077 
+
1079  const Vec3d& getTranslation() const { return mTranslation; }
+
1081  void read(std::istream& is) { mTranslation.read(is); }
+
1083  void write(std::ostream& os) const { mTranslation.write(os); }
+
1084 
+
1086  std::string str() const
+
1087  {
+
1088  std::ostringstream buffer;
+
1089  buffer << " - translation: " << mTranslation << std::endl;
+
1090  return buffer.str();
+
1091  }
+
1092 
+
1093  virtual bool isEqual(const MapBase& other) const { return isEqualBase(*this, other); }
+
1094 
+
1095  bool operator==(const TranslationMap& other) const
+
1096  {
+
1097  // ::eq() uses a tolerance
+
1098  return mTranslation.eq(other.mTranslation);
+
1099  }
+
1100 
+
1101  bool operator!=(const TranslationMap& other) const { return !(*this == other); }
+
1102 
+ +
1105  {
+
1106  Mat4d matrix(Mat4d::identity());
+
1107  matrix.setTranslation(mTranslation);
+
1108 
+
1109  AffineMap::Ptr affineMap(new AffineMap(matrix));
+
1110  return affineMap;
+
1111  }
+
1112 
+
1114  MapBase::Ptr preRotate(double radians, Axis axis) const
+
1117  {
+
1118  AffineMap::Ptr affineMap = getAffineMap();
+
1119  affineMap->accumPreRotation(axis, radians);
+
1120  return simplify(affineMap);
+
1121 
+
1122  }
+ +
1124  {
+
1125  return MapBase::Ptr(new TranslationMap(t + mTranslation));
+
1126  }
+
1127 
+
1128  MapBase::Ptr preScale(const Vec3d& v) const;
+
1129 
+
1130  MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const
+
1131  {
+
1132  AffineMap::Ptr affineMap = getAffineMap();
+
1133  affineMap->accumPreShear(axis0, axis1, shear);
+
1134  return simplify(affineMap);
+
1135  }
+
1137 
+
1139  MapBase::Ptr postRotate(double radians, Axis axis) const
+
1142  {
+
1143  AffineMap::Ptr affineMap = getAffineMap();
+
1144  affineMap->accumPostRotation(axis, radians);
+
1145  return simplify(affineMap);
+
1146 
+
1147  }
+ +
1149  { // post and pre are the same for this
+
1150  return MapBase::Ptr(new TranslationMap(t + mTranslation));
+
1151  }
+
1152 
+
1153  MapBase::Ptr postScale(const Vec3d& v) const;
+
1154 
+
1155  MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const
+
1156  {
+
1157  AffineMap::Ptr affineMap = getAffineMap();
+
1158  affineMap->accumPostShear(axis0, axis1, shear);
+
1159  return simplify(affineMap);
+
1160  }
+
1162 
+
1163 private:
+
1164  Vec3d mTranslation;
+
1165 }; // class TranslationMap
+
1166 
+
1167 
+
1169 
+
1170 
+ +
1175 {
+
1176 public:
+
1177  typedef boost::shared_ptr<ScaleTranslateMap> Ptr;
+
1178  typedef boost::shared_ptr<const ScaleTranslateMap> ConstPtr;
+
1179 
+ +
1181  MapBase(),
+
1182  mTranslation(Vec3d(0,0,0)),
+
1183  mScaleValues(Vec3d(1,1,1)),
+
1184  mVoxelSize(Vec3d(1,1,1)),
+
1185  mScaleValuesInverse(Vec3d(1,1,1)),
+
1186  mInvScaleSqr(1,1,1),
+
1187  mInvTwiceScale(0.5,0.5,0.5)
+
1188  {
+
1189  }
+
1190 
+
1191  ScaleTranslateMap(const Vec3d& scale, const Vec3d& translate):
+
1192  MapBase(),
+
1193  mTranslation(translate),
+
1194  mScaleValues(scale),
+
1195  mVoxelSize(std::abs(scale(0)), std::abs(scale(1)), std::abs(scale(2)))
+
1196  {
+
1197  const double determinant = scale[0]* scale[1] * scale[2];
+
1198  if (std::abs(determinant) < 3.0 * math::Tolerance<double>::value()) {
+
1199  OPENVDB_THROW(ArithmeticError, "Non-zero scale values required");
+
1200  }
+
1201  mScaleValuesInverse = 1.0 / mScaleValues;
+
1202  mInvScaleSqr = mScaleValuesInverse * mScaleValuesInverse;
+
1203  mInvTwiceScale = mScaleValuesInverse / 2;
+
1204  }
+
1205 
+
1206  ScaleTranslateMap(const ScaleMap& scale, const TranslationMap& translate):
+
1207  MapBase(),
+
1208  mTranslation(translate.getTranslation()),
+
1209  mScaleValues(scale.getScale()),
+
1210  mVoxelSize(std::abs(mScaleValues(0)),
+
1211  std::abs(mScaleValues(1)),
+
1212  std::abs(mScaleValues(2))),
+
1213  mScaleValuesInverse(1.0 / scale.getScale())
+
1214  {
+
1215  mInvScaleSqr = mScaleValuesInverse * mScaleValuesInverse;
+
1216  mInvTwiceScale = mScaleValuesInverse / 2;
+
1217  }
+
1218 
+ +
1220  MapBase(),
+
1221  mTranslation(other.mTranslation),
+
1222  mScaleValues(other.mScaleValues),
+
1223  mVoxelSize(other.mVoxelSize),
+
1224  mScaleValuesInverse(other.mScaleValuesInverse),
+
1225  mInvScaleSqr(other.mInvScaleSqr),
+
1226  mInvTwiceScale(other.mInvTwiceScale)
+
1227  {}
+
1228 
+ +
1230 
+ +
1234  MapBase::Ptr copy() const { return MapBase::Ptr(new ScaleTranslateMap(*this)); }
+
1235 
+ +
1237  {
+
1238  return MapBase::Ptr(new ScaleTranslateMap(
+
1239  mScaleValuesInverse, -mScaleValuesInverse * mTranslation));
+
1240  }
+
1241 
+
1242  static bool isRegistered() { return MapRegistry::isRegistered(ScaleTranslateMap::mapType()); }
+
1243 
+
1244  static void registerMap()
+
1245  {
+
1246  MapRegistry::registerMap(
+
1247  ScaleTranslateMap::mapType(),
+
1248  ScaleTranslateMap::create);
+
1249  }
+
1250 
+
1251  Name type() const { return mapType(); }
+
1252  static Name mapType() { return Name("ScaleTranslateMap"); }
+
1253 
+
1255  bool isLinear() const { return true; }
+
1256 
+
1259  bool hasUniformScale() const
+
1260  {
+
1261  bool value = isApproxEqual(
+
1262  std::abs(mScaleValues.x()), std::abs(mScaleValues.y()), double(5e-7));
+
1263  value = value && isApproxEqual(
+
1264  std::abs(mScaleValues.x()), std::abs(mScaleValues.z()), double(5e-7));
+
1265  return value;
+
1266  }
+
1267 
+
1269  Vec3d applyMap(const Vec3d& in) const
+
1270  {
+
1271  return Vec3d(
+
1272  in.x() * mScaleValues.x() + mTranslation.x(),
+
1273  in.y() * mScaleValues.y() + mTranslation.y(),
+
1274  in.z() * mScaleValues.z() + mTranslation.z());
+
1275  }
+
1277  Vec3d applyInverseMap(const Vec3d& in) const
+
1278  {
+
1279  return Vec3d(
+
1280  (in.x() - mTranslation.x() ) * mScaleValuesInverse.x(),
+
1281  (in.y() - mTranslation.y() ) * mScaleValuesInverse.y(),
+
1282  (in.z() - mTranslation.z() ) * mScaleValuesInverse.z());
+
1283  }
+
1284 
+
1286  Vec3d applyJacobian(const Vec3d& in, const Vec3d&) const { return applyJacobian(in); }
+
1288  Vec3d applyJacobian(const Vec3d& in) const { return in * mScaleValues; }
+
1289 
+
1291  Vec3d applyInverseJacobian(const Vec3d& in, const Vec3d&) const { return applyInverseJacobian(in); }
+
1293  Vec3d applyInverseJacobian(const Vec3d& in) const { return in * mScaleValuesInverse; }
+
1294 
+
1297  Vec3d applyJT(const Vec3d& in, const Vec3d&) const { return applyJT(in); }
+
1299  Vec3d applyJT(const Vec3d& in) const { return applyJacobian(in); }
+
1300 
+
1303  Vec3d applyIJT(const Vec3d& in, const Vec3d& ) const { return applyIJT(in);}
+
1305  Vec3d applyIJT(const Vec3d& in) const
+
1306  {
+
1307  return Vec3d(
+
1308  in.x() * mScaleValuesInverse.x(),
+
1309  in.y() * mScaleValuesInverse.y(),
+
1310  in.z() * mScaleValuesInverse.z());
+
1311  }
+
1313  Mat3d applyIJC(const Mat3d& in) const
+
1314  {
+
1315  Mat3d tmp;
+
1316  for (int i=0; i<3; i++){
+
1317  tmp.setRow(i, in.row(i)*mScaleValuesInverse(i));
+
1318  }
+
1319  for (int i=0; i<3; i++){
+
1320  tmp.setCol(i, tmp.col(i)*mScaleValuesInverse(i));
+
1321  }
+
1322  return tmp;
+
1323  }
+
1324  Mat3d applyIJC(const Mat3d& in, const Vec3d&, const Vec3d& ) const { return applyIJC(in); }
+
1325 
+
1327  double determinant(const Vec3d& ) const { return determinant(); }
+
1329  double determinant() const { return mScaleValues.x()*mScaleValues.y()*mScaleValues.z(); }
+
1331  Vec3d voxelSize() const { return mVoxelSize;}
+
1334  Vec3d voxelSize(const Vec3d&) const { return voxelSize();}
+
1335 
+
1337  const Vec3d& getScale() const { return mScaleValues; }
+
1339  const Vec3d& getTranslation() const { return mTranslation; }
+
1340 
+
1342  const Vec3d& getInvScaleSqr() const {return mInvScaleSqr;}
+
1344  const Vec3d& getInvTwiceScale() const {return mInvTwiceScale;}
+
1346  const Vec3d& getInvScale() const {return mScaleValuesInverse; }
+
1347 
+
1349  void read(std::istream& is)
+
1350  {
+
1351  mTranslation.read(is);
+
1352  mScaleValues.read(is);
+
1353  mVoxelSize.read(is);
+
1354  mScaleValuesInverse.read(is);
+
1355  mInvScaleSqr.read(is);
+
1356  mInvTwiceScale.read(is);
+
1357  }
+
1359  void write(std::ostream& os) const
+
1360  {
+
1361  mTranslation.write(os);
+
1362  mScaleValues.write(os);
+
1363  mVoxelSize.write(os);
+
1364  mScaleValuesInverse.write(os);
+
1365  mInvScaleSqr.write(os);
+
1366  mInvTwiceScale.write(os);
+
1367  }
+
1369  std::string str() const
+
1370  {
+
1371  std::ostringstream buffer;
+
1372  buffer << " - translation: " << mTranslation << std::endl;
+
1373  buffer << " - scale: " << mScaleValues << std::endl;
+
1374  buffer << " - voxel dimensions: " << mVoxelSize << std::endl;
+
1375  return buffer.str();
+
1376  }
+
1377 
+
1378  virtual bool isEqual(const MapBase& other) const { return isEqualBase(*this, other); }
+
1379 
+
1380  bool operator==(const ScaleTranslateMap& other) const
+
1381  {
+
1382  // ::eq() uses a tolerance
+
1383  if (!mScaleValues.eq(other.mScaleValues)) { return false; }
+
1384  if (!mTranslation.eq(other.mTranslation)) { return false; }
+
1385  return true;
+
1386  }
+
1387 
+
1388  bool operator!=(const ScaleTranslateMap& other) const { return !(*this == other); }
+
1389 
+ +
1392  {
+
1393  AffineMap::Ptr affineMap(new AffineMap(math::scale<Mat4d>(mScaleValues)));
+
1394  affineMap->accumPostTranslation(mTranslation);
+
1395  return affineMap;
+
1396  }
+
1397 
+
1399  MapBase::Ptr preRotate(double radians, Axis axis) const
+
1402  {
+
1403  AffineMap::Ptr affineMap = getAffineMap();
+
1404  affineMap->accumPreRotation(axis, radians);
+
1405  return simplify(affineMap);
+
1406  }
+ +
1408  {
+
1409  const Vec3d& s = mScaleValues;
+
1410  const Vec3d scaled_trans( t.x() * s.x(),
+
1411  t.y() * s.y(),
+
1412  t.z() * s.z() );
+
1413  return MapBase::Ptr( new ScaleTranslateMap(mScaleValues, mTranslation + scaled_trans));
+
1414  }
+
1415 
+
1416  MapBase::Ptr preScale(const Vec3d& v) const;
+
1417 
+
1418  MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const
+
1419  {
+
1420  AffineMap::Ptr affineMap = getAffineMap();
+
1421  affineMap->accumPreShear(axis0, axis1, shear);
+
1422  return simplify(affineMap);
+
1423  }
+
1425 
+
1427  MapBase::Ptr postRotate(double radians, Axis axis) const
+
1430  {
+
1431  AffineMap::Ptr affineMap = getAffineMap();
+
1432  affineMap->accumPostRotation(axis, radians);
+
1433  return simplify(affineMap);
+
1434  }
+ +
1436  {
+
1437  return MapBase::Ptr( new ScaleTranslateMap(mScaleValues, mTranslation + t));
+
1438  }
+
1439 
+
1440  MapBase::Ptr postScale(const Vec3d& v) const;
+
1441 
+
1442  MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const
+
1443  {
+
1444  AffineMap::Ptr affineMap = getAffineMap();
+
1445  affineMap->accumPostShear(axis0, axis1, shear);
+
1446  return simplify(affineMap);
+
1447  }
+
1449 
+
1450 private:
+
1451  Vec3d mTranslation, mScaleValues, mVoxelSize, mScaleValuesInverse,
+
1452  mInvScaleSqr, mInvTwiceScale;
+
1453 }; // class ScaleTanslateMap
+
1454 
+
1455 
+
1456 inline MapBase::Ptr
+
1457 ScaleMap::postTranslate(const Vec3d& t) const
+
1458 {
+
1459  return MapBase::Ptr(new ScaleTranslateMap(mScaleValues, t));
+
1460 }
+
1461 
+
1462 
+
1463 inline MapBase::Ptr
+
1464 ScaleMap::preTranslate(const Vec3d& t) const
+
1465 {
+
1466 
+
1467  const Vec3d& s = mScaleValues;
+
1468  const Vec3d scaled_trans( t.x() * s.x(),
+
1469  t.y() * s.y(),
+
1470  t.z() * s.z() );
+
1471  return MapBase::Ptr(new ScaleTranslateMap(mScaleValues, scaled_trans));
+
1472 }
+
1473 
+
1474 
+ +
1478 {
+
1479 public:
+
1480  typedef boost::shared_ptr<UniformScaleTranslateMap> Ptr;
+
1481  typedef boost::shared_ptr<const UniformScaleTranslateMap> ConstPtr;
+
1482 
+ +
1484  UniformScaleTranslateMap(double scale, const Vec3d& translate):
+
1485  ScaleTranslateMap(Vec3d(scale,scale,scale), translate) {}
+ +
1487  ScaleTranslateMap(scale.getScale(), translate.getTranslation()) {}
+
1488 
+ + +
1491 
+ +
1495  MapBase::Ptr copy() const { return MapBase::Ptr(new UniformScaleTranslateMap(*this)); }
+
1496 
+ +
1498  {
+
1499  const Vec3d& scaleInv = getInvScale();
+
1500  const Vec3d& trans = getTranslation();
+
1501  return MapBase::Ptr(new UniformScaleTranslateMap(scaleInv[0], -scaleInv[0] * trans));
+
1502  }
+
1503 
+
1504  static bool isRegistered()
+
1505  {
+
1506  return MapRegistry::isRegistered(UniformScaleTranslateMap::mapType());
+
1507  }
+
1508 
+
1509  static void registerMap()
+
1510  {
+
1511  MapRegistry::registerMap(
+
1512  UniformScaleTranslateMap::mapType(),
+
1513  UniformScaleTranslateMap::create);
+
1514  }
+
1515 
+
1516  Name type() const { return mapType(); }
+
1517  static Name mapType() { return Name("UniformScaleTranslateMap"); }
+
1518 
+
1519  virtual bool isEqual(const MapBase& other) const { return isEqualBase(*this, other); }
+
1520 
+
1521  bool operator==(const UniformScaleTranslateMap& other) const
+
1522  {
+
1523  return ScaleTranslateMap::operator==(other);
+
1524  }
+
1525  bool operator!=(const UniformScaleTranslateMap& other) const { return !(*this == other); }
+
1526 
+ +
1530  {
+
1531  const double scale = this->getScale().x();
+
1532  const Vec3d new_trans = this->getTranslation() + scale * t;
+
1533  return MapBase::Ptr( new UniformScaleTranslateMap(scale, new_trans));
+
1534  }
+
1535 
+ +
1539  {
+
1540  const double scale = this->getScale().x();
+
1541  return MapBase::Ptr( new UniformScaleTranslateMap(scale, this->getTranslation() + t));
+
1542  }
+
1543 }; // class UniformScaleTanslateMap
+
1544 
+
1545 
+
1546 inline MapBase::Ptr
+
1547 UniformScaleMap::postTranslate(const Vec3d& t) const
+
1548 {
+
1549  const double scale = this->getScale().x();
+
1550  return MapBase::Ptr(new UniformScaleTranslateMap(scale, t));
+
1551 }
+
1552 
+
1553 
+
1554 inline MapBase::Ptr
+
1555 UniformScaleMap::preTranslate(const Vec3d& t) const
+
1556 {
+
1557  const double scale = this->getScale().x();
+
1558  return MapBase::Ptr(new UniformScaleTranslateMap(scale, scale*t));
+
1559 }
+
1560 
+
1561 
+
1562 inline MapBase::Ptr
+
1563 TranslationMap::preScale(const Vec3d& v) const
+
1564 {
+
1565  if (isApproxEqual(v[0],v[1]) && isApproxEqual(v[0],v[2])) {
+
1566  return MapBase::Ptr(new UniformScaleTranslateMap(v[0], mTranslation));
+
1567  } else {
+
1568  return MapBase::Ptr(new ScaleTranslateMap(v, mTranslation));
+
1569  }
+
1570 }
+
1571 
+
1572 
+
1573 inline MapBase::Ptr
+
1574 TranslationMap::postScale(const Vec3d& v) const
+
1575 {
+
1576  if (isApproxEqual(v[0],v[1]) && isApproxEqual(v[0],v[2])) {
+
1577  return MapBase::Ptr(new UniformScaleTranslateMap(v[0], v[0]*mTranslation));
+
1578  } else {
+
1579  const Vec3d trans(mTranslation.x()*v.x(),
+
1580  mTranslation.y()*v.y(),
+
1581  mTranslation.z()*v.z());
+
1582  return MapBase::Ptr(new ScaleTranslateMap(v, trans));
+
1583  }
+
1584 }
+
1585 
+
1586 
+
1587 inline MapBase::Ptr
+
1588 ScaleTranslateMap::preScale(const Vec3d& v) const
+
1589 {
+
1590  const Vec3d new_scale( v * mScaleValues );
+
1591  if (isApproxEqual(new_scale[0],new_scale[1]) && isApproxEqual(new_scale[0],new_scale[2])) {
+
1592  return MapBase::Ptr( new UniformScaleTranslateMap(new_scale[0], mTranslation));
+
1593  } else {
+
1594  return MapBase::Ptr( new ScaleTranslateMap(new_scale, mTranslation));
+
1595  }
+
1596 }
+
1597 
+
1598 
+
1599 inline MapBase::Ptr
+
1600 ScaleTranslateMap::postScale(const Vec3d& v) const
+
1601 {
+
1602  const Vec3d new_scale( v * mScaleValues );
+
1603  const Vec3d new_trans( mTranslation.x()*v.x(),
+
1604  mTranslation.y()*v.y(),
+
1605  mTranslation.z()*v.z() );
+
1606 
+
1607  if (isApproxEqual(new_scale[0],new_scale[1]) && isApproxEqual(new_scale[0],new_scale[2])) {
+
1608  return MapBase::Ptr( new UniformScaleTranslateMap(new_scale[0], new_trans));
+
1609  } else {
+
1610  return MapBase::Ptr( new ScaleTranslateMap(new_scale, new_trans));
+
1611  }
+
1612 }
+
1613 
+
1614 
+
1616 
+
1617 
+ +
1621 {
+
1622 public:
+
1623  typedef boost::shared_ptr<UnitaryMap> Ptr;
+
1624  typedef boost::shared_ptr<const UnitaryMap> ConstPtr;
+
1625 
+
1627  UnitaryMap(): mAffineMap(Mat4d::identity())
+
1628  {
+
1629  }
+
1630 
+
1631  UnitaryMap(const Vec3d& axis, double radians)
+
1632  {
+
1633  Mat3d matrix;
+
1634  matrix.setToRotation(axis, radians);
+
1635  mAffineMap = AffineMap(matrix);
+
1636  }
+
1637 
+
1638  UnitaryMap(Axis axis, double radians)
+
1639  {
+
1640  Mat4d matrix;
+
1641  matrix.setToRotation(axis, radians);
+
1642  mAffineMap = AffineMap(matrix);
+
1643  }
+
1644 
+
1645  UnitaryMap(const Mat3d& m)
+
1646  {
+
1647  // test that the mat3 is a rotation || reflection
+
1648  if (!isUnitary(m)) {
+
1649  OPENVDB_THROW(ArithmeticError, "Matrix initializing unitary map was not unitary");
+
1650  }
+
1651 
+
1652  Mat4d matrix(Mat4d::identity());
+
1653  matrix.setMat3(m);
+
1654  mAffineMap = AffineMap(matrix);
+
1655  }
+
1656 
+
1657  UnitaryMap(const Mat4d& m)
+
1658  {
+
1659  if (!isInvertible(m)) {
+ +
1661  "4x4 Matrix initializing unitary map was not unitary: not invertible");
+
1662  }
+
1663 
+
1664  if (!isAffine(m)) {
+ +
1666  "4x4 Matrix initializing unitary map was not unitary: not affine");
+
1667  }
+
1668 
+
1669  if (hasTranslation(m)) {
+ +
1671  "4x4 Matrix initializing unitary map was not unitary: had translation");
+
1672  }
+
1673 
+
1674  if (!isUnitary(m.getMat3())) {
+ +
1676  "4x4 Matrix initializing unitary map was not unitary");
+
1677  }
+
1678 
+
1679  mAffineMap = AffineMap(m);
+
1680  }
+
1681 
+
1682  UnitaryMap(const UnitaryMap& other):
+
1683  MapBase(other),
+
1684  mAffineMap(other.mAffineMap)
+
1685  {
+
1686  }
+
1687 
+
1688  UnitaryMap(const UnitaryMap& first, const UnitaryMap& second):
+
1689  mAffineMap(*(first.getAffineMap()), *(second.getAffineMap()))
+
1690  {
+
1691  }
+
1692 
+ +
1695  static MapBase::Ptr create() { return MapBase::Ptr(new UnitaryMap()); }
+
1697  MapBase::Ptr copy() const { return MapBase::Ptr(new UnitaryMap(*this)); }
+
1698 
+ +
1700  {
+
1701  return MapBase::Ptr(new UnitaryMap(mAffineMap.getMat4().inverse()));
+
1702  }
+
1703 
+
1704  static bool isRegistered() { return MapRegistry::isRegistered(UnitaryMap::mapType()); }
+
1705 
+
1706  static void registerMap()
+
1707  {
+
1708  MapRegistry::registerMap(
+
1709  UnitaryMap::mapType(),
+
1710  UnitaryMap::create);
+
1711  }
+
1712 
+
1714  Name type() const { return mapType(); }
+
1716  static Name mapType() { return Name("UnitaryMap"); }
+
1717 
+
1719  bool isLinear() const { return true; }
+
1720 
+
1722  bool hasUniformScale() const { return true; }
+
1723 
+
1724  virtual bool isEqual(const MapBase& other) const { return isEqualBase(*this, other); }
+
1725 
+
1726  bool operator==(const UnitaryMap& other) const
+
1727  {
+
1728  // compare underlying linear map.
+
1729  if (mAffineMap!=other.mAffineMap) return false;
+
1730  return true;
+
1731  }
+
1732 
+
1733  bool operator!=(const UnitaryMap& other) const { return !(*this == other); }
+
1735  Vec3d applyMap(const Vec3d& in) const { return mAffineMap.applyMap(in); }
+
1737  Vec3d applyInverseMap(const Vec3d& in) const { return mAffineMap.applyInverseMap(in); }
+
1738 
+
1739  Vec3d applyJacobian(const Vec3d& in, const Vec3d&) const { return applyJacobian(in); }
+
1741  Vec3d applyJacobian(const Vec3d& in) const { return mAffineMap.applyJacobian(in); }
+
1742 
+
1744  Vec3d applyInverseJacobian(const Vec3d& in, const Vec3d&) const { return applyInverseJacobian(in); }
+
1746  Vec3d applyInverseJacobian(const Vec3d& in) const { return mAffineMap.applyInverseJacobian(in); }
+
1747 
+
1748 
+
1751  Vec3d applyJT(const Vec3d& in, const Vec3d&) const { return applyJT(in); }
+
1753  Vec3d applyJT(const Vec3d& in) const {
+
1754  // The transpose of the unitary map is its inverse
+
1755  return applyInverseMap(in);
+
1756  }
+
1757 
+
1758 
+
1761  Vec3d applyIJT(const Vec3d& in, const Vec3d& ) const { return applyIJT(in);}
+
1763  Vec3d applyIJT(const Vec3d& in) const { return mAffineMap.applyIJT(in); }
+
1765  Mat3d applyIJC(const Mat3d& in) const { return mAffineMap.applyIJC(in); }
+
1766  Mat3d applyIJC(const Mat3d& in, const Vec3d&, const Vec3d& ) const { return applyIJC(in); }
+
1768  double determinant(const Vec3d& ) const { return determinant(); }
+
1770  double determinant() const { return mAffineMap.determinant(); }
+
1771 
+
1772 
+
1777  Vec3d voxelSize() const { return mAffineMap.voxelSize();}
+
1778  Vec3d voxelSize(const Vec3d&) const { return voxelSize();}
+
1779 
+
1781  void read(std::istream& is)
+
1782  {
+
1783  mAffineMap.read(is);
+
1784  }
+
1785 
+
1787  void write(std::ostream& os) const
+
1788  {
+
1789  mAffineMap.write(os);
+
1790  }
+
1792  std::string str() const
+
1793  {
+
1794  std::ostringstream buffer;
+
1795  buffer << mAffineMap.str();
+
1796  return buffer.str();
+
1797  }
+
1799  AffineMap::Ptr getAffineMap() const { return AffineMap::Ptr(new AffineMap(mAffineMap)); }
+
1800 
+
1802  MapBase::Ptr preRotate(double radians, Axis axis) const
+
1805  {
+
1806  UnitaryMap first(axis, radians);
+
1807  UnitaryMap::Ptr unitaryMap(new UnitaryMap(first, *this));
+
1808  return boost::static_pointer_cast<MapBase, UnitaryMap>(unitaryMap);
+
1809  }
+ +
1811  {
+
1812  AffineMap::Ptr affineMap = getAffineMap();
+
1813  affineMap->accumPreTranslation(t);
+
1814  return simplify(affineMap);
+
1815  }
+
1816  MapBase::Ptr preScale(const Vec3d& v) const
+
1817  {
+
1818  AffineMap::Ptr affineMap = getAffineMap();
+
1819  affineMap->accumPreScale(v);
+
1820  return simplify(affineMap);
+
1821  }
+
1822  MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const
+
1823  {
+
1824  AffineMap::Ptr affineMap = getAffineMap();
+
1825  affineMap->accumPreShear(axis0, axis1, shear);
+
1826  return simplify(affineMap);
+
1827  }
+
1829 
+
1830 
+
1832  MapBase::Ptr postRotate(double radians, Axis axis) const
+
1835  {
+
1836  UnitaryMap second(axis, radians);
+
1837  UnitaryMap::Ptr unitaryMap(new UnitaryMap(*this, second));
+
1838  return boost::static_pointer_cast<MapBase, UnitaryMap>(unitaryMap);
+
1839  }
+ +
1841  {
+
1842  AffineMap::Ptr affineMap = getAffineMap();
+
1843  affineMap->accumPostTranslation(t);
+
1844  return simplify(affineMap);
+
1845  }
+
1846  MapBase::Ptr postScale(const Vec3d& v) const
+
1847  {
+
1848  AffineMap::Ptr affineMap = getAffineMap();
+
1849  affineMap->accumPostScale(v);
+
1850  return simplify(affineMap);
+
1851  }
+
1852  MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const
+
1853  {
+
1854  AffineMap::Ptr affineMap = getAffineMap();
+
1855  affineMap->accumPostShear(axis0, axis1, shear);
+
1856  return simplify(affineMap);
+
1857  }
+
1859 
+
1860 private:
+
1861  AffineMap mAffineMap;
+
1862 }; // class UnitaryMap
+
1863 
+
1864 
+
1866 
+
1867 
+ +
1875 {
+
1876 public:
+
1877  typedef boost::shared_ptr<NonlinearFrustumMap> Ptr;
+
1878  typedef boost::shared_ptr<const NonlinearFrustumMap> ConstPtr;
+
1879 
+ +
1881  MapBase(),
+
1882  mBBox(Vec3d(0), Vec3d(1)),
+
1883  mTaper(1),
+
1884  mDepth(1)
+
1885  {
+
1886  init();
+
1887  }
+
1888 
+
1892  NonlinearFrustumMap(const BBoxd& bb, double taper, double depth):
+
1893  MapBase(),mBBox(bb), mTaper(taper), mDepth(depth)
+
1894  {
+
1895  init();
+
1896  }
+
1897 
+
1903  NonlinearFrustumMap(const BBoxd& bb, double taper, double depth,
+
1904  const MapBase::Ptr& secondMap):
+
1905  mBBox(bb), mTaper(taper), mDepth(depth)
+
1906  {
+
1907  if (!secondMap->isLinear() ) {
+ +
1909  "The second map in the Frustum transfrom must be linear");
+
1910  }
+
1911  mSecondMap = *( secondMap->getAffineMap() );
+
1912  init();
+
1913  }
+
1914 
+ +
1916  MapBase(),
+
1917  mBBox(other.mBBox),
+
1918  mTaper(other.mTaper),
+
1919  mDepth(other.mDepth),
+
1920  mSecondMap(other.mSecondMap),
+
1921  mHasSimpleAffine(other.mHasSimpleAffine)
+
1922  {
+
1923  init();
+
1924  }
+
1925 
+
1941  NonlinearFrustumMap(const Vec3d& position,
+
1942  const Vec3d& direction,
+
1943  const Vec3d& up,
+
1944  double aspect /* width / height */,
+
1945  double z_near, double depth,
+
1946  Coord::ValueType x_count, Coord::ValueType z_count) {
+
1947 
+
1951  if (!(depth > 0)) {
+ +
1953  "The frustum depth must be non-zero and positive");
+
1954  }
+
1955  if (!(up.length() > 0)) {
+ +
1957  "The frustum height must be non-zero and positive");
+
1958  }
+
1959  if (!(aspect > 0)) {
+ +
1961  "The frustum aspect ratio must be non-zero and positive");
+
1962  }
+
1963  if (!(isApproxEqual(up.dot(direction), 0.))) {
+ +
1965  "The frustum up orientation must be perpendicular to into-frustum direction");
+
1966  }
+
1967 
+
1968  double near_plane_height = 2 * up.length();
+
1969  double near_plane_width = aspect * near_plane_height;
+
1970 
+
1971  Coord::ValueType y_count = static_cast<int>(Round(x_count / aspect));
+
1972 
+
1973  mBBox = BBoxd(Vec3d(0,0,0), Vec3d(x_count, y_count, z_count));
+
1974  mDepth = depth / near_plane_width; // depth non-dimensionalized on width
+
1975  double gamma = near_plane_width / z_near;
+
1976  mTaper = 1./(mDepth*gamma + 1.);
+
1977 
+
1978  Vec3d direction_unit = direction;
+
1979  direction_unit.normalize();
+
1980 
+
1981  Mat4d r1(Mat4d::identity());
+
1982  r1.setToRotation(/*from*/Vec3d(0,0,1), /*to */direction_unit);
+
1983  Mat4d r2(Mat4d::identity());
+
1984  Vec3d temp = r1.inverse().transform(up);
+
1985  r2.setToRotation(/*from*/Vec3d(0,1,0), /*to*/temp );
+
1986  Mat4d scale = math::scale<Mat4d>(
+
1987  Vec3d(near_plane_width, near_plane_width, near_plane_width));
+
1988 
+
1989  // move the near plane to origin, rotate to align with axis, and scale down
+
1990  // T_inv * R1_inv * R2_inv * scale_inv
+
1991  Mat4d mat = scale * r2 * r1;
+
1992  mat.setTranslation(position + z_near*direction_unit);
+
1993 
+
1994  mSecondMap = AffineMap(mat);
+
1995 
+
1996  init();
+
1997  }
+
1998 
+ + +
2003  MapBase::Ptr copy() const { return MapBase::Ptr(new NonlinearFrustumMap(*this)); }
+
2004 
+ +
2009  {
+ +
2011  "inverseMap() is not implemented for NonlinearFrustumMap");
+
2012  }
+
2013  static bool isRegistered() { return MapRegistry::isRegistered(NonlinearFrustumMap::mapType()); }
+
2014 
+
2015  static void registerMap()
+
2016  {
+
2017  MapRegistry::registerMap(
+
2018  NonlinearFrustumMap::mapType(),
+
2019  NonlinearFrustumMap::create);
+
2020  }
+
2022  Name type() const { return mapType(); }
+
2024  static Name mapType() { return Name("NonlinearFrustumMap"); }
+
2025 
+
2027  bool isLinear() const { return false; }
+
2028 
+
2030  bool hasUniformScale() const { return false; }
+
2031 
+
2033  bool isIdentity() const
+
2034  {
+
2035  // The frustum can only be consistent with a linear map if the taper value is 1
+
2036  if (!isApproxEqual(mTaper, double(1)) ) return false;
+
2037 
+
2038  // There are various ways an identity can decomposed between the two parts of the
+
2039  // map. Best to just check that the principle vectors are stationary.
+
2040  const Vec3d e1(1,0,0);
+
2041  if (!applyMap(e1).eq(e1)) return false;
+
2042 
+
2043  const Vec3d e2(0,1,0);
+
2044  if (!applyMap(e2).eq(e2)) return false;
+
2045 
+
2046  const Vec3d e3(0,0,1);
+
2047  if (!applyMap(e3).eq(e3)) return false;
+
2048 
+
2049  return true;
+
2050  }
+
2051 
+
2052  virtual bool isEqual(const MapBase& other) const { return isEqualBase(*this, other); }
+
2053 
+
2054  bool operator==(const NonlinearFrustumMap& other) const
+
2055  {
+
2056  if (mBBox!=other.mBBox) return false;
+
2057  if (!isApproxEqual(mTaper, other.mTaper)) return false;
+
2058  if (!isApproxEqual(mDepth, other.mDepth)) return false;
+
2059 
+
2060  // Two linear transforms are equivalent iff they have the same translation
+
2061  // and have the same affects on orthongal spanning basis check translation
+
2062  Vec3d e(0,0,0);
+
2063  if (!mSecondMap.applyMap(e).eq(other.mSecondMap.applyMap(e))) return false;
+
2065  e(0) = 1;
+
2066  if (!mSecondMap.applyMap(e).eq(other.mSecondMap.applyMap(e))) return false;
+
2067  e(0) = 0;
+
2068  e(1) = 1;
+
2069  if (!mSecondMap.applyMap(e).eq(other.mSecondMap.applyMap(e))) return false;
+
2070  e(1) = 0;
+
2071  e(2) = 1;
+
2072  if (!mSecondMap.applyMap(e).eq(other.mSecondMap.applyMap(e))) return false;
+
2073  return true;
+
2074  }
+
2075 
+
2076  bool operator!=(const NonlinearFrustumMap& other) const { return !(*this == other); }
+
2077 
+
2079  Vec3d applyMap(const Vec3d& in) const
+
2080  {
+
2081  return mSecondMap.applyMap(applyFrustumMap(in));
+
2082  }
+
2083 
+
2085  Vec3d applyInverseMap(const Vec3d& in) const
+
2086  {
+
2087  return applyFrustumInverseMap(mSecondMap.applyInverseMap(in));
+
2088  }
+
2090  Vec3d applyJacobian(const Vec3d& in) const { return mSecondMap.applyJacobian(in); }
+
2092  Vec3d applyJacobian(const Vec3d& in, const Vec3d& isloc) const
+
2093  {
+
2094  // Move the center of the x-face of the bbox
+
2095  // to the origin in index space.
+
2096  Vec3d centered(isloc);
+
2097  centered = centered - mBBox.min();
+
2098  centered.x() -= mXo;
+
2099  centered.y() -= mYo;
+
2100 
+
2101  // scale the z-direction on depth / K count
+
2102  const double zprime = centered.z()*mDepthOnLz;
+
2103 
+
2104  const double scale = (mGamma * zprime + 1.) / mLx;
+
2105  const double scale2 = mGamma * mDepthOnLz / mLx;
+
2106 
+
2107  const Vec3d tmp(scale * in.x() + scale2 * centered.x()* in.z(),
+
2108  scale * in.y() + scale2 * centered.y()* in.z(),
+
2109  mDepthOnLz * in.z());
+
2110 
+
2111  return mSecondMap.applyJacobian(tmp);
+
2112  }
+
2113 
+
2114 
+
2116  Vec3d applyInverseJacobian(const Vec3d& in) const { return mSecondMap.applyInverseJacobian(in); }
+
2118  Vec3d applyInverseJacobian(const Vec3d& in, const Vec3d& isloc) const {
+
2119 
+
2120  // Move the center of the x-face of the bbox
+
2121  // to the origin in index space.
+
2122  Vec3d centered(isloc);
+
2123  centered = centered - mBBox.min();
+
2124  centered.x() -= mXo;
+
2125  centered.y() -= mYo;
+
2126 
+
2127  // scale the z-direction on depth / K count
+
2128  const double zprime = centered.z()*mDepthOnLz;
+
2129 
+
2130  const double scale = (mGamma * zprime + 1.) / mLx;
+
2131  const double scale2 = mGamma * mDepthOnLz / mLx;
+
2132 
+
2133 
+
2134  Vec3d out = mSecondMap.applyInverseJacobian(in);
+
2135 
+
2136  out.x() = (out.x() - scale2 * centered.x() * out.z() / mDepthOnLz) / scale;
+
2137  out.y() = (out.y() - scale2 * centered.y() * out.z() / mDepthOnLz) / scale;
+
2138  out.z() = out.z() / mDepthOnLz;
+
2139 
+
2140  return out;
+
2141  }
+
2142 
+
2143 
+
2144 
+
2148  Vec3d applyJT(const Vec3d& in, const Vec3d& isloc) const {
+
2149  const Vec3d tmp = mSecondMap.applyJT(in);
+
2150  // Move the center of the x-face of the bbox
+
2151  // to the origin in index space.
+
2152  Vec3d centered(isloc);
+
2153  centered = centered - mBBox.min();
+
2154  centered.x() -= mXo;
+
2155  centered.y() -= mYo;
+
2156 
+
2157  // scale the z-direction on depth / K count
+
2158  const double zprime = centered.z()*mDepthOnLz;
+
2159 
+
2160  const double scale = (mGamma * zprime + 1.) / mLx;
+
2161  const double scale2 = mGamma * mDepthOnLz / mLx;
+
2162 
+
2163  return Vec3d(scale * tmp.x(),
+
2164  scale * tmp.y(),
+
2165  scale2 * centered.x()* tmp.x() +
+
2166  scale2 * centered.y()* tmp.y() +
+
2167  mDepthOnLz * tmp.z());
+
2168  }
+
2170  Vec3d applyJT(const Vec3d& in) const {
+
2171  return mSecondMap.applyJT(in);
+
2172  }
+
2173 
+
2175  Vec3d applyIJT(const Vec3d& in) const { return mSecondMap.applyIJT(in); }
+
2176 
+
2177  // the Jacobian of the nonlinear part of the transform is a sparse matrix
+
2178  // Jacobian^(-T) =
+
2179  //
+
2180  // (Lx)( 1/s 0 0 )
+
2181  // ( 0 1/s 0 )
+
2182  // ( -(x-xo)g/(sLx) -(y-yo)g/(sLx) Lz/(Depth Lx) )
+
2185  Vec3d applyIJT(const Vec3d& d1_is, const Vec3d& ijk) const
+
2186  {
+
2187  const Vec3d loc = applyFrustumMap(ijk);
+
2188  const double s = mGamma * loc.z() + 1.;
+
2189 
+
2190  // verify that we aren't at the singularity
+
2191  if (isApproxEqual(s, 0.)) {
+
2192  OPENVDB_THROW(ArithmeticError, "Tried to evaluate the frustum transform"
+
2193  " at the singular focal point (e.g. camera)");
+
2194  }
+
2195 
+
2196  const double sinv = 1.0/s; // 1/(z*gamma + 1)
+
2197  const double pt0 = mLx * sinv; // Lx / (z*gamma +1)
+
2198  const double pt1 = mGamma * pt0; // gamma * Lx / ( z*gamma +1)
+
2199  const double pt2 = pt1 * sinv; // gamma * Lx / ( z*gamma +1)**2
+
2200 
+
2201  const Mat3d& jacinv = mSecondMap.getConstJacobianInv();
+
2202 
+
2203  // compute \frac{\partial E_i}{\partial x_j}
+
2204  Mat3d gradE(Mat3d::zero());
+
2205  for (int j = 0; j < 3; ++j ) {
+
2206  gradE(0,j) = pt0 * jacinv(0,j) - pt2 * loc.x()*jacinv(2,j);
+
2207  gradE(1,j) = pt0 * jacinv(1,j) - pt2 * loc.y()*jacinv(2,j);
+
2208  gradE(2,j) = (1./mDepthOnLz) * jacinv(2,j);
+
2209  }
+
2210 
+
2211  Vec3d result;
+
2212  for (int i = 0; i < 3; ++i) {
+
2213  result(i) = d1_is(0) * gradE(0,i) + d1_is(1) * gradE(1,i) + d1_is(2) * gradE(2,i);
+
2214  }
+
2215 
+
2216  return result;
+
2217 
+
2218  }
+
2219 
+
2221  Mat3d applyIJC(const Mat3d& in) const { return mSecondMap.applyIJC(in); }
+
2226  Mat3d applyIJC(const Mat3d& d2_is, const Vec3d& d1_is, const Vec3d& ijk) const
+
2227  {
+
2228  const Vec3d loc = applyFrustumMap(ijk);
+
2229 
+
2230  const double s = mGamma * loc.z() + 1.;
+
2231 
+
2232  // verify that we aren't at the singularity
+
2233  if (isApproxEqual(s, 0.)) {
+
2234  OPENVDB_THROW(ArithmeticError, "Tried to evaluate the frustum transform"
+
2235  " at the singular focal point (e.g. camera)");
+
2236  }
+
2237 
+
2238  // precompute
+
2239  const double sinv = 1.0/s; // 1/(z*gamma + 1)
+
2240  const double pt0 = mLx * sinv; // Lx / (z*gamma +1)
+
2241  const double pt1 = mGamma * pt0; // gamma * Lx / ( z*gamma +1)
+
2242  const double pt2 = pt1 * sinv; // gamma * Lx / ( z*gamma +1)**2
+
2243  const double pt3 = pt2 * sinv; // gamma * Lx / ( z*gamma +1)**3
+
2244 
+
2245  const Mat3d& jacinv = mSecondMap.getConstJacobianInv();
+
2246 
+
2247  // compute \frac{\partial^2 E_i}{\partial x_j \partial x_k}
+
2248 
+
2249  Mat3d matE0(Mat3d::zero());
+
2250  Mat3d matE1(Mat3d::zero()); // matE2 = 0
+
2251  for(int j = 0; j < 3; j++) {
+
2252  for (int k = 0; k < 3; k++) {
+
2253 
+
2254  const double pt4 = 2. * jacinv(2,j) * jacinv(2,k) * pt3;
+
2255 
+
2256  matE0(j,k) = -(jacinv(0,j) * jacinv(2,k) + jacinv(2,j) * jacinv(0,k)) * pt2 +
+
2257  pt4 * loc.x();
+
2258 
+
2259  matE1(j,k) = -(jacinv(1,j) * jacinv(2,k) + jacinv(2,j) * jacinv(1,k)) * pt2 +
+
2260  pt4 * loc.y();
+
2261  }
+
2262  }
+
2263 
+
2264  // compute \frac{\partial E_i}{\partial x_j}
+
2265  Mat3d gradE(Mat3d::zero());
+
2266  for (int j = 0; j < 3; ++j ) {
+
2267  gradE(0,j) = pt0 * jacinv(0,j) - pt2 * loc.x()*jacinv(2,j);
+
2268  gradE(1,j) = pt0 * jacinv(1,j) - pt2 * loc.y()*jacinv(2,j);
+
2269  gradE(2,j) = (1./mDepthOnLz) * jacinv(2,j);
+
2270  }
+
2271 
+
2272  Mat3d result(Mat3d::zero());
+
2273  // compute \fac{\partial E_j}{\partial x_m} \fac{\partial E_i}{\partial x_n}
+
2274  // \frac{\partial^2 input}{\partial E_i \partial E_j}
+
2275  for (int m = 0; m < 3; ++m ) {
+
2276  for ( int n = 0; n < 3; ++n) {
+
2277  for (int i = 0; i < 3; ++i ) {
+
2278  for (int j = 0; j < 3; ++j) {
+
2279  result(m, n) += gradE(j, m) * gradE(i, n) * d2_is(i, j);
+
2280  }
+
2281  }
+
2282  }
+
2283  }
+
2284 
+
2285  for (int m = 0; m < 3; ++m ) {
+
2286  for ( int n = 0; n < 3; ++n) {
+
2287  result(m, n) +=
+
2288  matE0(m, n) * d1_is(0) + matE1(m, n) * d1_is(1);// + matE2(m, n) * d1_is(2);
+
2289  }
+
2290  }
+
2291 
+
2292  return result;
+
2293  }
+
2294 
+
2296  double determinant() const {return mSecondMap.determinant();} // no implementation
+
2297 
+
2300  double determinant(const Vec3d& loc) const
+
2301  {
+
2302  double s = mGamma * loc.z() + 1.0;
+
2303  double frustum_determinant = s * s * mDepthOnLzLxLx;
+
2304  return mSecondMap.determinant() * frustum_determinant;
+
2305  }
+
2306 
+ +
2309  {
+
2310  const Vec3d loc( 0.5*(mBBox.min().x() + mBBox.max().x()),
+
2311  0.5*(mBBox.min().y() + mBBox.max().y()),
+
2312  mBBox.min().z());
+
2313 
+
2314  return voxelSize(loc);
+
2315 
+
2316  }
+
2317 
+
2322  Vec3d voxelSize(const Vec3d& loc) const
+
2323  {
+
2324  Vec3d out, pos = applyMap(loc);
+
2325  out(0) = (applyMap(loc + Vec3d(1,0,0)) - pos).length();
+
2326  out(1) = (applyMap(loc + Vec3d(0,1,0)) - pos).length();
+
2327  out(2) = (applyMap(loc + Vec3d(0,0,1)) - pos).length();
+
2328  return out;
+
2329  }
+
2330 
+
2331  AffineMap::Ptr getAffineMap() const { return mSecondMap.getAffineMap(); }
+
2332 
+
2334  void setTaper(double t) { mTaper = t; init();}
+
2336  double getTaper() const { return mTaper; }
+
2338  void setDepth(double d) { mDepth = d; init();}
+
2340  double getDepth() const { return mDepth; }
+
2341  // gamma a non-dimensional number: nearplane x-width / camera to near plane distance
+
2342  double getGamma() const { return mGamma; }
+
2343 
+
2345  const BBoxd& getBBox() const { return mBBox; }
+
2346 
+
2348  const AffineMap& secondMap() const { return mSecondMap; }
+
2351  bool isValid() const { return !mBBox.empty();}
+
2352 
+
2354  bool hasSimpleAffine() const { return mHasSimpleAffine; }
+
2355 
+
2357  void read(std::istream& is)
+
2358  {
+
2359  // for backward compatibility with earlier version
+ +
2361  CoordBBox bb;
+
2362  bb.read(is);
+
2363  mBBox = BBoxd(bb.min().asVec3d(), bb.max().asVec3d());
+
2364  } else {
+
2365  mBBox.read(is);
+
2366  }
+
2367 
+
2368  is.read(reinterpret_cast<char*>(&mTaper), sizeof(double));
+
2369  is.read(reinterpret_cast<char*>(&mDepth), sizeof(double));
+
2370 
+
2371  // Read the second maps type.
+
2372  Name type = readString(is);
+
2373 
+
2374  // Check if the map has been registered.
+
2375  if(!MapRegistry::isRegistered(type)) {
+
2376  OPENVDB_THROW(KeyError, "Map " << type << " is not registered");
+
2377  }
+
2378 
+
2379  // Create the second map of the type and then read it in.
+
2380  MapBase::Ptr proxy = math::MapRegistry::createMap(type);
+
2381  proxy->read(is);
+
2382  mSecondMap = *(proxy->getAffineMap());
+
2383  init();
+
2384  }
+
2385 
+
2387  void write(std::ostream& os) const
+
2388  {
+
2389  mBBox.write(os);
+
2390  os.write(reinterpret_cast<const char*>(&mTaper), sizeof(double));
+
2391  os.write(reinterpret_cast<const char*>(&mDepth), sizeof(double));
+
2392 
+
2393  writeString(os, mSecondMap.type());
+
2394  mSecondMap.write(os);
+
2395  }
+
2396 
+
2398  std::string str() const
+
2399  {
+
2400  std::ostringstream buffer;
+
2401  buffer << " - taper: " << mTaper << std::endl;
+
2402  buffer << " - depth: " << mDepth << std::endl;
+
2403  buffer << " SecondMap: "<< mSecondMap.type() << std::endl;
+
2404  buffer << mSecondMap.str() << std::endl;
+
2405  return buffer.str();
+
2406  }
+
2407 
+
2409  MapBase::Ptr preRotate(double radians, Axis axis = X_AXIS) const
+
2412  {
+
2413  return MapBase::Ptr(
+
2414  new NonlinearFrustumMap(mBBox, mTaper, mDepth, mSecondMap.preRotate(radians, axis)));
+
2415  }
+ +
2417  {
+
2418  return MapBase::Ptr(
+
2419  new NonlinearFrustumMap(mBBox, mTaper, mDepth, mSecondMap.preTranslate(t)));
+
2420  }
+
2421  MapBase::Ptr preScale(const Vec3d& s) const
+
2422  {
+
2423  return MapBase::Ptr(
+
2424  new NonlinearFrustumMap(mBBox, mTaper, mDepth, mSecondMap.preScale(s)));
+
2425  }
+
2426  MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const
+
2427  {
+
2428  return MapBase::Ptr(new NonlinearFrustumMap(
+
2429  mBBox, mTaper, mDepth, mSecondMap.preShear(shear, axis0, axis1)));
+
2430  }
+
2432 
+
2434  MapBase::Ptr postRotate(double radians, Axis axis = X_AXIS) const
+
2437  {
+
2438  return MapBase::Ptr(
+
2439  new NonlinearFrustumMap(mBBox, mTaper, mDepth, mSecondMap.postRotate(radians, axis)));
+
2440  }
+ +
2442  {
+
2443  return MapBase::Ptr(
+
2444  new NonlinearFrustumMap(mBBox, mTaper, mDepth, mSecondMap.postTranslate(t)));
+
2445  }
+
2446  MapBase::Ptr postScale(const Vec3d& s) const
+
2447  {
+
2448  return MapBase::Ptr(
+
2449  new NonlinearFrustumMap(mBBox, mTaper, mDepth, mSecondMap.postScale(s)));
+
2450  }
+
2451  MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const
+
2452  {
+
2453  return MapBase::Ptr(new NonlinearFrustumMap(
+
2454  mBBox, mTaper, mDepth, mSecondMap.postShear(shear, axis0, axis1)));
+
2455  }
+
2457 
+
2458 private:
+
2459  void init()
+
2460  {
+
2461  // set up as a frustum
+
2462  mLx = mBBox.extents().x();
+
2463  mLy = mBBox.extents().y();
+
2464  mLz = mBBox.extents().z();
+
2465 
+
2466  if (isApproxEqual(mLx,0.) || isApproxEqual(mLy,0.) || isApproxEqual(mLz,0.) ) {
+
2467  OPENVDB_THROW(ArithmeticError, "The index space bounding box"
+
2468  " must have at least two index points in each direction.");
+
2469  }
+
2470 
+
2471  mXo = 0.5* mLx;
+
2472  mYo = 0.5* mLy;
+
2473 
+
2474  // mDepth is non-dimensionalized on near
+
2475  mGamma = (1./mTaper - 1) / mDepth;
+
2476 
+
2477  mDepthOnLz = mDepth/mLz;
+
2478  mDepthOnLzLxLx = mDepthOnLz/(mLx * mLx);
+
2479 
+
2481  mHasSimpleAffine = true;
+
2482  Vec3d tmp = mSecondMap.voxelSize();
+
2483 
+
2485  if (!isApproxEqual(tmp(0), tmp(1))) { mHasSimpleAffine = false; return; }
+
2486  if (!isApproxEqual(tmp(0), tmp(2))) { mHasSimpleAffine = false; return; }
+
2487 
+
2488  Vec3d trans = mSecondMap.applyMap(Vec3d(0,0,0));
+
2490  Vec3d tmp1 = mSecondMap.applyMap(Vec3d(1,0,0)) - trans;
+
2491  Vec3d tmp2 = mSecondMap.applyMap(Vec3d(0,1,0)) - trans;
+
2492  Vec3d tmp3 = mSecondMap.applyMap(Vec3d(0,0,1)) - trans;
+
2493 
+
2495  if (!isApproxEqual(tmp1.dot(tmp2), 0., 1.e-7)) { mHasSimpleAffine = false; return; }
+
2496  if (!isApproxEqual(tmp2.dot(tmp3), 0., 1.e-7)) { mHasSimpleAffine = false; return; }
+
2497  if (!isApproxEqual(tmp3.dot(tmp1), 0., 1.e-7)) { mHasSimpleAffine = false; return; }
+
2498  }
+
2499 
+
2500  Vec3d applyFrustumMap(const Vec3d& in) const
+
2501  {
+
2502 
+
2503  // Move the center of the x-face of the bbox
+
2504  // to the origin in index space.
+
2505  Vec3d out(in);
+
2506  out = out - mBBox.min();
+
2507  out.x() -= mXo;
+
2508  out.y() -= mYo;
+
2509 
+
2510  // scale the z-direction on depth / K count
+
2511  out.z() *= mDepthOnLz;
+
2512 
+
2513  double scale = (mGamma * out.z() + 1.)/ mLx;
+
2514 
+
2515  // scale the x-y on the length I count and apply tapper
+
2516  out.x() *= scale ;
+
2517  out.y() *= scale ;
+
2518 
+
2519  return out;
+
2520  }
+
2521 
+
2522  Vec3d applyFrustumInverseMap(const Vec3d& in) const
+
2523  {
+
2524  // invert taper and resize: scale = 1/( (z+1)/2 (mt-1) + 1)
+
2525  Vec3d out(in);
+
2526  double invScale = mLx / (mGamma * out.z() + 1.);
+
2527  out.x() *= invScale;
+
2528  out.y() *= invScale;
+
2529 
+
2530  out.x() += mXo;
+
2531  out.y() += mYo;
+
2532 
+
2533  out.z() /= mDepthOnLz;
+
2534 
+
2535  // move back
+
2536  out = out + mBBox.min();
+
2537  return out;
+
2538  }
+
2539 
+
2540  // bounding box in index space used in Frustum transforms.
+
2541  BBoxd mBBox;
+
2542 
+
2543  // taper value used in constructing Frustums.
+
2544  double mTaper;
+
2545  double mDepth;
+
2546 
+
2547  // defines the second map
+
2548  AffineMap mSecondMap;
+
2549 
+
2550  // these are derived from the above.
+
2551  double mLx, mLy, mLz;
+
2552  double mXo, mYo, mGamma, mDepthOnLz, mDepthOnLzLxLx;
+
2553 
+
2554  // true: if the mSecondMap is linear and has no shear, and has no non-uniform scale
+
2555  bool mHasSimpleAffine;
+
2556 }; // class NonlinearFrustumMap
+
2557 
+
2558 
+
2560 
+
2561 
+
2565 template<typename FirstMapType, typename SecondMapType>
+
2566 class CompoundMap
+
2567 {
+
2568 public:
+ +
2570 
+
2571  typedef boost::shared_ptr<MyType> Ptr;
+
2572  typedef boost::shared_ptr<const MyType> ConstPtr;
+
2573 
+
2574 
+
2575  CompoundMap() { updateAffineMatrix(); }
+
2576 
+
2577  CompoundMap(const FirstMapType& f, const SecondMapType& s): mFirstMap(f), mSecondMap(s)
+
2578  {
+
2579  updateAffineMatrix();
+
2580  }
+
2581 
+
2582  CompoundMap(const MyType& other):
+
2583  mFirstMap(other.mFirstMap),
+
2584  mSecondMap(other.mSecondMap),
+
2585  mAffineMap(other.mAffineMap)
+
2586  {}
+
2587 
+
2588  Name type() const { return mapType(); }
+
2589  static Name mapType()
+
2590  {
+
2591  return (FirstMapType::mapType() + Name(":") + SecondMapType::mapType());
+
2592  }
+
2593 
+
2594  bool operator==(const MyType& other) const
+
2595  {
+
2596  if (mFirstMap != other.mFirstMap) return false;
+
2597  if (mSecondMap != other.mSecondMap) return false;
+
2598  if (mAffineMap != other.mAffineMap) return false;
+
2599  return true;
+
2600  }
+
2601 
+
2602  bool operator!=(const MyType& other) const { return !(*this == other); }
+
2603 
+
2604  MyType& operator=(const MyType& other)
+
2605  {
+
2606  mFirstMap = other.mFirstMap;
+
2607  mSecondMap = other.mSecondMap;
+
2608  mAffineMap = other.mAffineMap;
+
2609  return *this;
+
2610  }
+
2611 
+
2612  bool isIdentity() const
+
2613  {
+ +
2615  return mAffineMap.isIdentity();
+
2616  } else {
+
2617  return mFirstMap.isIdentity()&&mSecondMap.isIdentity();
+
2618  }
+
2619  }
+
2620 
+
2621  bool isDiagonal() const {
+ +
2623  return mAffineMap.isDiagonal();
+
2624  } else {
+
2625  return mFirstMap.isDiagonal()&&mSecondMap.isDiagonal();
+
2626  }
+
2627  }
+
2628 
+ +
2630  {
+ +
2632  AffineMap::Ptr affine(new AffineMap(mAffineMap));
+
2633  return affine;
+
2634  } else {
+ +
2636  "Constant affine matrix representation not possible for this nonlinear map");
+
2637  }
+
2638  }
+
2639 
+
2640  // direct decompotion
+
2641  const FirstMapType& firstMap() const { return mFirstMap; }
+
2642  const SecondMapType& secondMap() const {return mSecondMap; }
+
2643 
+
2644  void setFirstMap(const FirstMapType& first) { mFirstMap = first; updateAffineMatrix(); }
+
2645  void setSecondMap(const SecondMapType& second) { mSecondMap = second; updateAffineMatrix(); }
+
2646 
+
2647  void read(std::istream& is)
+
2648  {
+
2649  mAffineMap.read(is);
+
2650  mFirstMap.read(is);
+
2651  mSecondMap.read(is);
+
2652  }
+
2653  void write(std::ostream& os) const
+
2654  {
+
2655  mAffineMap.write(os);
+
2656  mFirstMap.write(os);
+
2657  mSecondMap.write(os);
+
2658  }
+
2659 
+
2660 private:
+
2661  void updateAffineMatrix()
+
2662  {
+ +
2664  // both maps need to be linear, these methods are only defined for linear maps
+
2665  AffineMap::Ptr first = mFirstMap.getAffineMap();
+
2666  AffineMap::Ptr second= mSecondMap.getAffineMap();
+
2667  mAffineMap = AffineMap(*first, *second);
+
2668  }
+
2669  }
+
2670 
+
2671  FirstMapType mFirstMap;
+
2672  SecondMapType mSecondMap;
+
2673  // used for acceleration
+
2674  AffineMap mAffineMap;
+
2675 }; // class CompoundMap
+
2676 
+
2677 } // namespace math
+
2678 } // namespace OPENVDB_VERSION_NAME
+
2679 } // namespace openvdb
+
2680 
+
2681 #endif // OPENVDB_MATH_MAPS_HAS_BEEN_INCLUDED
+
2682 
+
2683 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
2684 // All rights reserved. This software is distributed under the
+
2685 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
bool operator!=(const UniformScaleMap &other) const
Definition: Maps.h:963
+
Vec3d voxelSize(const Vec3d &loc) const
Returns the lengths of the images of the three segments from loc to loc + (1,0,0), from loc to loc + (0,1,0) and from loc to loc + (0,0,1)
Definition: Maps.h:2322
+
Vec3d applyInverseJacobian(const Vec3d &in, const Vec3d &) const
Return the Inverse Jacobian of the map applied to in. (i.e. inverse map with out translation) ...
Definition: Maps.h:1744
+
Vec3d applyInverseMap(const Vec3d &in) const
Return the pre-image of in under the map.
Definition: Maps.h:1737
+
static MapBase::Ptr create()
Return a MapBase::Ptr to a new UnitaryMap.
Definition: Maps.h:1695
+
void accumPostShear(Axis axis0, Axis axis1, double shear)
Modify the existing affine map by post-applying the given operation.
Definition: Maps.h:542
+
bool operator==(const UniformScaleMap &other) const
Definition: Maps.h:962
+
boost::shared_ptr< const ScaleMap > ConstPtr
Definition: Maps.h:689
+
NonlinearFrustumMap(const NonlinearFrustumMap &other)
Definition: Maps.h:1915
+
static bool isRegistered()
Definition: Maps.h:1504
+
MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const
Return a MapBase::Ptr to a new map that is the result of postfixing the appropiate operation to the l...
Definition: Maps.h:2451
+
Mat3< T > getMat3() const
Definition: Mat4.h:339
+
UniformScaleTranslateMap(const UniformScaleMap &scale, const TranslationMap &translate)
Definition: Maps.h:1486
+
#define OPENVDB_API
Helper macros for defining library symbol visibility.
Definition: Platform.h:195
+
MapBase::Ptr postScale(const Vec3d &v) const
Return a MapBase::Ptr to a new map that is the result of postfixing the appropraite operation...
Definition: Maps.h:1846
+
AffineMap & operator=(const AffineMap &other)
Definition: Maps.h:427
+
static void registerMap()
Definition: Maps.h:950
+
NonlinearFrustumMap(const BBoxd &bb, double taper, double depth, const MapBase::Ptr &secondMap)
Constructor that takes an index-space bounding box to be mapped into a frustum with a given depth and...
Definition: Maps.h:1903
+
Mat3d applyIJC(const Mat3d &mat) const
Return the Jacobian Curvature: zero for a linear map.
Definition: Maps.h:1065
+
Vec3d applyIJT(const Vec3d &in) const
Return the transpose of the inverse Jacobian of the map applied to in.
Definition: Maps.h:468
+
const Mat4d & getConstMat4() const
Definition: Maps.h:646
+
bool hasUniformScale() const
Return true if the values have the same magitude (eg. -1, 1, -1 would be a rotation).
Definition: Maps.h:744
+
Vec3d applyMap(const Vec3d &in) const
Return the image of in under the map.
Definition: Maps.h:754
+
bool operator==(const ScaleTranslateMap &other) const
Definition: Maps.h:1380
+
static MapBase::Ptr create()
Return a MapBase::Ptr to a new ScaleTranslateMap.
Definition: Maps.h:1232
+
~ScaleTranslateMap()
Definition: Maps.h:1229
+
static MapBase::Ptr create()
Return a MapBase::Ptr to a new NonlinearFrustumMap.
Definition: Maps.h:2001
+
OPENVDB_API boost::shared_ptr< FullyDecomposedMap > createFullyDecomposedMap(const Mat4d &m)
General decomposition of a Matrix into a Unitary (e.g. rotation) following a Symmetric (e...
+
double determinant() const
Return the product of the scale values.
Definition: Maps.h:1329
+
boost::shared_ptr< const UniformScaleMap > ConstPtr
Definition: Maps.h:931
+ +
Vec3d applyJT(const Vec3d &in, const Vec3d &) const
Definition: Maps.h:1054
+
MapBase::Ptr preScale(const Vec3d &s) const
Return a MapBase::Ptr to a new map that is the result of prepending the appropriate operation to the ...
Definition: Maps.h:2421
+
Vec3d applyInverseJacobian(const Vec3d &in, const Vec3d &) const
Return the Inverse Jacobian of the map applied to in. (i.e. inverse map with out translation) ...
Definition: Maps.h:450
+
void accumPostScale(const Vec3d &v)
Modify the existing affine map by post-applying the given operation.
Definition: Maps.h:532
+ +
Vec3d applyJacobian(const Vec3d &in, const Vec3d &isloc) const
Return the Jacobian defined at isloc applied to in.
Definition: Maps.h:2092
+
void read(std::istream &is)
read serialization
Definition: Maps.h:1349
+
static Name mapType()
Definition: Maps.h:738
+
T length() const
Length of the vector.
Definition: Vec3.h:212
+
boost::shared_ptr< NonlinearFrustumMap > Ptr
Definition: Maps.h:1877
+
T & z()
Definition: Vec3.h:99
+
Vec3d applyJT(const Vec3d &in) const
Return the Jacobian Transpose of the map applied to in.
Definition: Maps.h:1753
+
MapBase::Ptr copy() const
Return a MapBase::Ptr to a deep copy of this map.
Definition: Maps.h:724
+
Vec3< T > col(int j) const
Get jth column, e.g. Vec3d v = m.col(0);.
Definition: Mat3.h:191
+
std::string str() const
string serialization, useful for debugging
Definition: Maps.h:564
+
std::string str() const
string serialization, useful for debuging
Definition: Maps.h:1086
+
Vec3d applyInverseMap(const Vec3d &in) const
Return the pre-image of under the map.
Definition: Maps.h:1277
+
void setToRotation(Axis axis, T angle)
Sets the matrix to a rotation about the given axis.
Definition: Mat4.h:825
+
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
bool isScale() const
Return true if the map is equivalent to a ScaleMap.
Definition: Maps.h:493
+
void read(std::istream &is)
Unserialize this bounding box from the given stream.
Definition: Coord.h:444
+
UnitaryMap(const UnitaryMap &first, const UnitaryMap &second)
Definition: Maps.h:1688
+
Definition: Math.h:839
+
bool isIdentity() const
Definition: Maps.h:2612
+
AffineMap::Ptr getAffineMap() const
Return a AffineMap equivalent to this map.
Definition: Maps.h:868
+
Name type() const
Definition: Maps.h:2588
+
Vec3d applyIJT(const Vec3d &in, const Vec3d &) const
Return the transpose of the inverse Jacobian of the map applied to in.
Definition: Maps.h:1761
+
double determinant(const Vec3d &loc) const
Definition: Maps.h:2300
+
bool operator==(const TranslationMap &other) const
Definition: Maps.h:1095
+
MapBase::Ptr postTranslate(const Vec3d &t) const
Return a MapBase::Ptr to a new map that is the result of postfixing the appropraite operation...
Definition: Maps.h:624
+
CompoundMap(const FirstMapType &f, const SecondMapType &s)
Definition: Maps.h:2577
+
void read(std::istream &is)
read serialization
Definition: Maps.h:1781
+
static void registerMap()
Definition: Maps.h:1244
+
static const Mat4< double > & identity()
Predefined constant for identity matrix.
Definition: Mat4.h:152
+
double determinant(const Vec3d &) const
Return the determinant of the Jacobian, ignores argument.
Definition: Maps.h:1768
+
UnitaryMap(const Mat3d &m)
Definition: Maps.h:1645
+
void write(std::ostream &os) const
write serialization
Definition: Maps.h:1787
+
MapBase::Ptr inverseMap() const
Return a new map representing the inverse of this map.
Definition: Maps.h:943
+
NonlinearFrustumMap()
Definition: Maps.h:1880
+ +
bool operator!=(const TranslationMap &other) const
Definition: Maps.h:1101
+
Name type() const
Return UnitaryMap.
Definition: Maps.h:1714
+
OPENVDB_API Mat4d approxInverse(const Mat4d &mat)
Returns the left pseudoInverse of the input matrix when the 3x3 part is symmetric otherwise it zeros ...
+
Name type() const
Return NonlinearFrustumMap.
Definition: Maps.h:2022
+
Vec3d applyInverseJacobian(const Vec3d &in) const
Return the Inverse Jacobian of the map applied to in. (i.e. inverse map with out translation) ...
Definition: Maps.h:2116
+
CompoundMap()
Definition: Maps.h:2575
+
static void registerMap()
Definition: Maps.h:2015
+
Vec3d applyInverseMap(const Vec3d &in) const
Return the pre-image of in under the map.
Definition: Maps.h:762
+ +
boost::shared_ptr< AffineMap > Ptr
Definition: Maps.h:327
+
static bool isRegistered()
Definition: Maps.h:1704
+
void read(std::istream &is)
read serialization
Definition: Maps.h:1081
+
void writeString(std::ostream &os, const Name &name)
Definition: Name.h:58
+
bool isScaleTranslate() const
Return true if the map is equivalent to a ScaleTranslateMap.
Definition: Maps.h:495
+
static bool isRegistered()
Definition: Maps.h:1019
+
math::BBox< Vec3d > BBoxd
Definition: Types.h:86
+
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
+
MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const
Return a MapBase::Ptr to a new map that is the result of postfixing the appropraite operation...
Definition: Maps.h:636
+
~UniformScaleMap()
Definition: Maps.h:936
+
MapBase::Ptr copy() const
Return a MapBase::Ptr to a deep copy of this map.
Definition: Maps.h:1015
+
static void registerMap()
Definition: Maps.h:389
+
MapBase::Ptr preTranslate(const Vec3d &t) const
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation...
Definition: Maps.h:594
+
MapBase::Ptr postTranslate(const Vec3d &t) const
Return a MapBase::Ptr to a new map that is the result of postfixing the appropraite operation...
Definition: Maps.h:1840
+
static Name mapType()
Definition: Maps.h:2589
+
bool isUnitary(const MatType &m)
Determine if a matrix is unitary (i.e., rotation or reflection).
Definition: Mat.h:897
+
std::string Name
Definition: Name.h:44
+
void read(std::istream &is)
read serialization
Definition: Maps.h:830
+
ScaleMap(const ScaleMap &other)
Definition: Maps.h:709
+
Int32 ValueType
Definition: Coord.h:55
+
Vec3d applyJT(const Vec3d &in) const
Return the Jacobian Transpose of the map applied to in.
Definition: Maps.h:783
+
static Name mapType()
Definition: Maps.h:1252
+
~AffineMap()
Definition: Maps.h:378
+
double getDepth() const
Return the unscaled frustm depth.
Definition: Maps.h:2340
+
Vec3d applyInverseJacobian(const Vec3d &in, const Vec3d &isloc) const
Return the Inverse Jacobian defined at isloc of the map applied to in.
Definition: Maps.h:2118
+
MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation...
Definition: Maps.h:1822
+
bool operator!=(const MyType &other) const
Definition: Maps.h:2602
+
Definition: Exceptions.h:78
+
~TranslationMap()
Definition: Maps.h:1010
+
Mat4 inverse(T tolerance=0) const
Definition: Mat4.h:527
+
Name type() const
Return the name of this map's concrete type (e.g., "AffineMap").
Definition: Maps.h:1028
+
Vec3d applyInverseJacobian(const Vec3d &in) const
Return the Inverse Jacobian of the map applied to in. (i.e. inverse map with out translation) ...
Definition: Maps.h:777
+
static void registerMap()
Definition: Maps.h:1021
+
Vec3d applyInverseJacobian(const Vec3d &in) const
Return the Inverse Jacobian of the map applied to in. (i.e. inverse map with out translation) ...
Definition: Maps.h:452
+
CompoundMap< SymmetricMap, UnitaryAndTranslationMap > FullyDecomposedMap
Definition: Maps.h:72
+
bool isLinear() const
Return true (a TranslationMap is always linear).
Definition: Maps.h:1032
+
bool operator==(const MyType &other) const
Definition: Maps.h:2594
+ +
Mat4d getMat4() const
Return the matrix representation of this AffineMap.
Definition: Maps.h:645
+ +
AffineMap(const AffineMap &other)
Definition: Maps.h:359
+
double determinant() const
Return the determinant of the Jacobian.
Definition: Maps.h:1770
+
static void registerMap()
Definition: Maps.h:730
+
MapBase::Ptr copy() const
Return a MapBase::Ptr to a deep copy of this map.
Definition: Maps.h:383
+
MapBase::Ptr preTranslate(const Vec3d &t) const
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation...
Definition: Maps.h:1810
+
AffineMap(const Mat3d &m)
Definition: Maps.h:342
+
Vec3d applyMap(const Vec3d &in) const
Return the image of in under the map.
Definition: Maps.h:2079
+
bool hasUniformScale() const
Return false (by convention true)
Definition: Maps.h:1035
+
std::string str() const
string serialization, useful for debuging
Definition: Maps.h:848
+
Vec3d applyInverseMap(const Vec3d &in) const
Return the pre-image of in under the map.
Definition: Maps.h:2085
+
double determinant() const
Return the determinant of the Jacobian.
Definition: Maps.h:479
+
UniformScaleTranslateMap()
Definition: Maps.h:1483
+
void setTaper(double t)
set the taper value, the ratio of nearplane width / far plane width
Definition: Maps.h:2334
+
const BBoxd & getBBox() const
Return the bounding box that defines the frustum in pre-image space.
Definition: Maps.h:2345
+
double determinant(const Vec3d &) const
Return the determinant of the Jacobian, ignores argument.
Definition: Maps.h:477
+
Vec3d applyMap(const Vec3d &in) const
Return the image of in under the map.
Definition: Maps.h:1735
+
MatType shear(Axis axis0, Axis axis1, typename MatType::value_type shear)
Set the matrix to a shear along axis0 by a fraction of axis1.
Definition: Mat.h:667
+
const Vec3d & getInvScaleSqr() const
Return the square of the scale. Used to optimize some finite difference calculations.
Definition: Maps.h:814
+
AffineMap(const Mat4d &m)
Definition: Maps.h:350
+
ScaleTranslateMap(const ScaleMap &scale, const TranslationMap &translate)
Definition: Maps.h:1206
+
A specialized linear transform that performs a unitary maping i.e. rotation and or reflection...
Definition: Maps.h:1620
+
MapBase::Ptr copy() const
Return a MapBase::Ptr to a deep copy of this map.
Definition: Maps.h:2003
+
MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const
Return a MapBase::Ptr to a new map that is the result of postfixing the appropraite operation...
Definition: Maps.h:1442
+
MapBase::Ptr postScale(const Vec3d &s) const
Return a MapBase::Ptr to a new map that is the result of postfixing the appropraite operation...
Definition: Maps.h:630
+
Mat3d applyIJC(const Mat3d &in) const
Return the Jacobian Curvature for the linear second map.
Definition: Maps.h:2221
+
static bool isRegistered()
Definition: Maps.h:728
+
static void registerMap()
Definition: Maps.h:1509
+ +
AffineMap::Ptr getAffineMap() const
Return AffineMap::Ptr to a deep copy of the current AffineMap.
Definition: Maps.h:579
+
boost::shared_ptr< ScaleTranslateMap > Ptr
Definition: Maps.h:1177
+
OPENVDB_API boost::shared_ptr< MapBase > simplify(boost::shared_ptr< AffineMap > affine)
reduces an AffineMap to a ScaleMap or a ScaleTranslateMap when it can
+
void setSecondMap(const SecondMapType &second)
Definition: Maps.h:2645
+ +
const Vec3d & getTranslation() const
Return the translation vector.
Definition: Maps.h:1079
+ +
This map is composed of three steps. First it will take a box of size (Lx X Ly X Lz) defined by a mem...
Definition: Maps.h:1874
+
T * asPointer()
Definition: Vec3.h:106
+
double getGamma() const
Definition: Maps.h:2342
+
bool isLinear() const
Return true (an AffineMap is always linear).
Definition: Maps.h:400
+
static bool isRegistered()
Definition: Maps.h:2013
+
Name type() const
Return the name of this map's concrete type (e.g., "AffineMap").
Definition: Maps.h:1516
+
static Name mapType()
Return UnitaryMap.
Definition: Maps.h:1716
+
A specialized Affine transform that scales along the principal axis the scaling need not be uniform i...
Definition: Maps.h:685
+
A specialized linear transform that performs a translation.
Definition: Maps.h:999
+
Vec3d voxelSize() const
Return the size of a voxel at the center of the near plane.
Definition: Maps.h:2308
+
MapBase::Ptr inverseMap() const
Return a new map representing the inverse of this map.
Definition: Maps.h:1699
+
bool operator!=(const ScaleMap &other) const
Definition: Maps.h:865
+
bool isIdentity() const
Return true if the map is equivalent to an identity.
Definition: Maps.h:2033
+
bool operator!=(const ScaleTranslateMap &other) const
Definition: Maps.h:1388
+
bool operator!=(const UnitaryMap &other) const
Definition: Maps.h:1733
+
UniformScaleMap(double scale)
Definition: Maps.h:934
+
bool isLinear() const
Return true (a ScaleTranslateMap is always linear).
Definition: Maps.h:1255
+
NonlinearFrustumMap(const BBoxd &bb, double taper, double depth)
Constructor that takes an index-space bounding box to be mapped into a frustum with a given depth and...
Definition: Maps.h:1892
+
ScaleMap()
Definition: Maps.h:691
+
boost::shared_ptr< const ScaleTranslateMap > ConstPtr
Definition: Maps.h:1178
+
boost::shared_ptr< const UniformScaleTranslateMap > ConstPtr
Definition: Maps.h:1481
+
bool isDiagonal() const
Return true if the underylying matrix is diagonal.
Definition: Maps.h:491
+ +
Vec3d applyJacobian(const Vec3d &in) const
Return the Jacobian of the map applied to in.
Definition: Maps.h:772
+
bool isType() const
Return true if this map is of concrete type MapT (e.g., AffineMap).
Definition: Maps.h:174
+
Vec3d voxelSize(const Vec3d &) const
Definition: Maps.h:1334
+
virtual bool isEqual(const MapBase &other) const
Return true if this map is equal to the given map.
Definition: Maps.h:960
+
void write(std::ostream &os) const
write serialization
Definition: Maps.h:1359
+
CompoundMap(const MyType &other)
Definition: Maps.h:2582
+
Vec3d applyInverseJacobian(const Vec3d &in) const
Return the Inverse Jacobian of the map applied to in. (i.e. inverse map with out translation) ...
Definition: Maps.h:1049
+
boost::shared_ptr< MyType > Ptr
Definition: Maps.h:2571
+
bool hasUniformScale() const
Return true if the scale values have the same magnitude (eg. -1, 1, -1 would be a rotation)...
Definition: Maps.h:1259
+
MapBase::Ptr postTranslate(const Vec3d &t) const
Return a MapBase::Ptr to a new map that is the result of postfixing the appropiate operation to the l...
Definition: Maps.h:2441
+
MapBase::Ptr postTranslate(const Vec3d &t) const
Return a MapBase::Ptr to a UniformScaleTranslateMap that is the result of postfixing translation on t...
Definition: Maps.h:1538
+
bool isApproxEqual(const Type &a, const Type &b)
Return true if a is equal to b to within the default floating-point comparison tolerance.
Definition: Math.h:370
+
Vec3d applyMap(const Vec3d &in) const
Return the image of under the map.
Definition: Maps.h:1269
+
MapBase::Ptr postTranslate(const Vec3d &t) const
Return a MapBase::Ptr to a new map that is the result of postfixing the appropraite operation...
Definition: Maps.h:1435
+
virtual bool isEqual(const MapBase &other) const
Return true if this map is equal to the given map.
Definition: Maps.h:2052
+
MapBase::Ptr copy() const
Returns a MapBase::Ptr to a deep copy of *this.
Definition: Maps.h:1697
+
T det() const
Determinant of matrix.
Definition: Mat3.h:523
+
static Name mapType()
Definition: Maps.h:1517
+
MyType & operator=(const MyType &other)
Definition: Maps.h:2604
+
A specialized Affine transform that scales along the principal axis the scaling is uniform in the thr...
Definition: Maps.h:927
+
OPENVDB_API boost::shared_ptr< SymmetricMap > createSymmetricMap(const Mat3d &m)
Utility methods.
+
static MapBase::Ptr create()
Return a MapBase::Ptr to a new AffineMap.
Definition: Maps.h:381
+
Vec3d voxelSize(const Vec3d &) const
Return .
Definition: Maps.h:1076
+
Vec3d applyJacobian(const Vec3d &in) const
Return the Jacobian of the map applied to in.
Definition: Maps.h:1288
+
boost::shared_ptr< UniformScaleTranslateMap > Ptr
Definition: Maps.h:1480
+
Creates the composition of two maps, each of which could be a composition. In the case that each comp...
Definition: Maps.h:67
+
static bool isRegistered()
Definition: Maps.h:1242
+
void accumPostTranslation(const Vec3d &v)
Modify the existing affine map by post-applying the given operation.
Definition: Maps.h:537
+
Mat3d applyIJC(const Mat3d &in, const Vec3d &, const Vec3d &) const
Definition: Maps.h:804
+
MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const
Return a MapBase::Ptr to a new map that is the result of prepending the appropriate operation...
Definition: Maps.h:1130
+
bool operator!=(const UniformScaleTranslateMap &other) const
Definition: Maps.h:1525
+
bool operator==(const UniformScaleTranslateMap &other) const
Definition: Maps.h:1521
+
const AffineMap & secondMap() const
Return MapBase::Ptr& to the second map.
Definition: Maps.h:2348
+
static MapBase::Ptr create()
Return a MapBase::Ptr to a new UniformScaleTranslateMap.
Definition: Maps.h:1493
+
MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const
Return a MapBase::Ptr to a new map that is the result of prepending the appropriate operation to the ...
Definition: Maps.h:2426
+
bool operator!=(const AffineMap &other) const
Definition: Maps.h:425
+
Vec3d applyIJT(const Vec3d &in) const
Return the transpose of the inverse Jacobian of the map applied to in.
Definition: Maps.h:1305
+
MapBase::Ptr preScale(const Vec3d &s) const
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation...
Definition: Maps.h:600
+
Vec3d voxelSize(const Vec3d &) const
Return the lengths of the images of the segments (0,0,0)-(1,0,0), (0,0,0)-(0,1,0) and (0...
Definition: Maps.h:485
+ +
T dot(const Vec3< T > &v) const
Dot product.
Definition: Vec3.h:203
+
A specialized Affine transform that scales along the principal axis the scaling need not be uniform i...
Definition: Maps.h:1174
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
Vec3< double > Vec3d
Definition: Vec3.h:651
+
bool hasUniformScale() const
Return false (by convention true)
Definition: Maps.h:1722
+
void read(std::istream &is)
read serialization
Definition: Maps.h:2357
+
AffineMap::Ptr getAffineMap() const
Definition: Maps.h:2331
+
void setMat3(const Mat3< T > &m)
Set upper left to a Mat3.
Definition: Mat4.h:332
+
Vec3d applyIJT(const Vec3d &in) const
Return the transpose of the inverse Jacobian of the map applied to in.
Definition: Maps.h:791
+
UnitaryMap(const Vec3d &axis, double radians)
Definition: Maps.h:1631
+
Mat3d applyIJC(const Mat3d &in) const
Return the Jacobian Curvature: zero for a linear map.
Definition: Maps.h:1313
+
Vec3d applyJT(const Vec3d &in, const Vec3d &) const
Definition: Maps.h:781
+
~ScaleMap()
Definition: Maps.h:719
+
SpectralDecomposedMap SymmetricMap
Definition: Maps.h:71
+
Definition: Maps.h:104
+
const Coord & max() const
Definition: Coord.h:322
+
std::map< Name, MapBase::MapFactory > MapDictionary
Definition: Maps.h:289
+ +
Map traits.
Definition: Maps.h:80
+
boost::shared_ptr< MapBase > Ptr
Definition: Maps.h:162
+
Vec3d voxelSize(const Vec3d &) const
Returns the lengths of the images of the segments , , this is equivalent to the absolute values of t...
Definition: Maps.h:826
+
Vec3d applyJT(const Vec3d &in, const Vec3d &) const
Definition: Maps.h:456
+
Mat3d applyIJC(const Mat3d &in) const
Return the Jacobian Curvature: zero for a linear map.
Definition: Maps.h:1765
+
Vec3d applyJT(const Vec3d &in, const Vec3d &) const
Definition: Maps.h:1751
+
MapBase::Ptr postTranslate(const Vec3d &t) const
Return a MapBase::Ptr to a new map that is the result of postfixing the appropriate operation...
Definition: Maps.h:1148
+
UnitaryMap(const Mat4d &m)
Definition: Maps.h:1657
+
Mat3< double > Mat3d
Definition: Mat3.h:712
+
Vec3d applyJT(const Vec3d &in) const
Return the Jacobian Transpose of the map applied to in.
Definition: Maps.h:1299
+
MapBase::Ptr inverseMap() const
Return a new map representing the inverse of this map.
Definition: Maps.h:385
+
Name type() const
Return the name of this map's concrete type (e.g., "AffineMap").
Definition: Maps.h:396
+
T & x()
Reference to the component, e.g. v.x() = 4.5f;.
Definition: Vec3.h:97
+
Vec3d applyIJT(const Vec3d &in) const
Return the transpose of the inverse Jacobian of the map applied to in.
Definition: Maps.h:1763
+
Vec3d applyJT(const Vec3d &in, const Vec3d &isloc) const
Definition: Maps.h:2148
+
Vec3d applyJacobian(const Vec3d &in, const Vec3d &) const
Return the Jacobian of the map applied to in.
Definition: Maps.h:1286
+
void setDepth(double d)
set the frustum depth: distance between near and far plane = frustm depth * frustm x-width ...
Definition: Maps.h:2338
+
Vec3d applyIJT(const Vec3d &in, const Vec3d &) const
Return the transpose of the inverse Jacobian of the map applied to in.
Definition: Maps.h:466
+
OPENVDB_API uint32_t getFormatVersion(std::ios_base &)
Return the file format version number associated with the given input stream.
+
Vec3d applyJacobian(const Vec3d &in) const
Return the Jacobian of the map applied to in.
Definition: Maps.h:1741
+
static bool isRegistered()
Definition: Maps.h:387
+
UniformScaleMap()
Definition: Maps.h:933
+
void write(std::ostream &os) const
write serialization
Definition: Maps.h:2387
+
static MapBase::Ptr create()
Return a MapBase::Ptr to a new ScaleMap.
Definition: Maps.h:722
+
MapBase()
Definition: Maps.h:271
+
bool hasSimpleAffine() const
Return true if the second map is a uniform scale, Rotation and translation.
Definition: Maps.h:2354
+
bool isAffine(const Mat4< T > &m)
Definition: Mat4.h:1366
+
MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const
Return a MapBase::Ptr to a new map that is the result of postfixing the appropriate operation...
Definition: Maps.h:1155
+
const Coord & min() const
Definition: Coord.h:321
+
Vec3d applyIJT(const Vec3d &d1_is, const Vec3d &ijk) const
Definition: Maps.h:2185
+
virtual ~MapBase()
Definition: Maps.h:166
+
UnitaryMap()
default constructor makes an Idenity.
Definition: Maps.h:1627
+
A general linear transform using homogeneous coordinates to perform rotation, scaling, shear and translation.
Definition: Maps.h:324
+
Definition: Exceptions.h:39
+
Vec4< T0 > transform(const Vec4< T0 > &v) const
Transform a Vec4 by post-multiplication.
Definition: Mat4.h:1040
+
const Vec3d & getTranslation() const
Returns the translation.
Definition: Maps.h:1339
+
Tolerance for floating-point comparison.
Definition: Math.h:125
+
boost::shared_ptr< const TranslationMap > ConstPtr
Definition: Maps.h:1003
+
UnitaryMap(const UnitaryMap &other)
Definition: Maps.h:1682
+
A specialized Affine transform that uniformaly scales along the principal axis and then translates th...
Definition: Maps.h:1477
+
MatType scale(const Vec3< typename MatType::value_type > &s)
Return a matrix that scales by s.
Definition: Mat.h:594
+
virtual bool isEqual(const MapBase &other) const
Return true if this map is equal to the given map.
Definition: Maps.h:1093
+
static bool isRegistered()
Definition: Maps.h:949
+
NonlinearFrustumMap(const Vec3d &position, const Vec3d &direction, const Vec3d &up, double aspect, double z_near, double depth, Coord::ValueType x_count, Coord::ValueType z_count)
Constructor from a camera frustum.
Definition: Maps.h:1941
+ +
TranslationMap(const TranslationMap &other)
Definition: Maps.h:1008
+
boost::shared_ptr< TranslationMap > Ptr
Definition: Maps.h:1002
+
Abstract base class for maps.
Definition: Maps.h:159
+
boost::shared_ptr< const NonlinearFrustumMap > ConstPtr
Definition: Maps.h:1878
+
const Vec3d & getScale() const
Return the scale values that define the map.
Definition: Maps.h:811
+
ScaleTranslateMap(const ScaleTranslateMap &other)
Definition: Maps.h:1219
+
UniformScaleMap(const UniformScaleMap &other)
Definition: Maps.h:935
+
Vec3d applyJacobian(const Vec3d &in, const Vec3d &) const
Return the Jacobian of the map applied to in.
Definition: Maps.h:1042
+
void accumPreScale(const Vec3d &v)
Modify the existing affine map by pre-applying the given operation.
Definition: Maps.h:507
+
MapBase::Ptr preTranslate(const Vec3d &t) const
Return a MapBase::Ptr to a new map that is the result of prepending the appropriate operation to the ...
Definition: Maps.h:2416
+
AffineMap::Ptr inverse() const
Return AffineMap::Ptr to the inverse of this map.
Definition: Maps.h:582
+
double determinant(const Vec3d &) const
Return the product of the scale values, ignores argument.
Definition: Maps.h:806
+
double determinant() const
Return 1.
Definition: Maps.h:1071
+
bool operator==(const UnitaryMap &other) const
Definition: Maps.h:1726
+
bool isIdentity() const
Return true if the underlying matrix is approximately an identity.
Definition: Maps.h:489
+
MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation to the ...
Definition: Maps.h:912
+
void accumPreShear(Axis axis0, Axis axis1, double shear)
Modify the existing affine map by pre-applying the given operation.
Definition: Maps.h:517
+
CompoundMap< CompoundMap< UnitaryMap, ScaleMap >, UnitaryMap > SpectralDecomposedMap
Definition: Maps.h:70
+
MapBase::Ptr inverseMap() const
Return a new map representing the inverse of this map.
Definition: Maps.h:1017
+
Vec3d applyJacobian(const Vec3d &in) const
Return the Jacobian of the linear second map applied to in.
Definition: Maps.h:2090
+
const Mat3d & getConstJacobianInv() const
Definition: Maps.h:647
+
Vec3d voxelSize() const
Returns the lengths of the images of the segments , , .
Definition: Maps.h:1777
+
static void registerMap()
Definition: Maps.h:1706
+
const Vec3d & getInvScaleSqr() const
Return the square of the scale. Used to optimize some finite difference calculations.
Definition: Maps.h:1342
+
boost::shared_ptr< FullyDecomposedMap > createDecomposedMap()
on-demand decomposition of the affine map
Definition: Maps.h:573
+
Name type() const
Return the name of this map's concrete type (e.g., "AffineMap").
Definition: Maps.h:737
+
std::string str() const
string serialization, useful for debuging
Definition: Maps.h:2398
+
bool isLinear() const
Return true (a UnitaryMap is always linear).
Definition: Maps.h:1719
+
~UnitaryMap()
Definition: Maps.h:1693
+
MapBase::Ptr preTranslate(const Vec3d &t) const
Return a MapBase::Ptr to a UniformScaleTranslateMap that is the result of prepending translation on t...
Definition: Maps.h:1529
+
bool normalize(T eps=T(1.0e-7))
this = normalized this
Definition: Vec3.h:348
+
Name type() const
Return the name of this map's concrete type (e.g., "AffineMap").
Definition: Maps.h:957
+
~UniformScaleTranslateMap()
Definition: Maps.h:1490
+
void setTranslation(const Vec3< T > &t)
Definition: Mat4.h:356
+
const Vec3d & getInvScale() const
Return 1/(scale)
Definition: Maps.h:1346
+
Mat3d applyIJC(const Mat3d &m) const
Return the Jacobian Curvature: zero for a linear map.
Definition: Maps.h:470
+
double determinant(const Vec3d &) const
Return the product of the scale values, ignores argument.
Definition: Maps.h:1327
+
TranslationMap()
Definition: Maps.h:1006
+
MapBase::Ptr copy() const
Return a MapBase::Ptr to a deep copy of this map.
Definition: Maps.h:1234
+
Vec3d voxelSize(const Vec3d &) const
Method to return the local size of a voxel. When a location is specified as an argument, it is understood to be be in the domain of the map (i.e. index space)
Definition: Maps.h:1778
+
Vec3< typename MatType::value_type > getScale(const MatType &mat)
Return a Vec3 representing the lengths of the passed matrix's upper 3x3's rows.
Definition: Mat.h:612
+
void setRow(int i, const Vec3< T > &v)
Set ith row to vector v.
Definition: Mat3.h:164
+
void write(std::ostream &os) const
write serialization
Definition: Maps.h:1083
+
bool isDiagonal() const
Definition: Maps.h:2621
+
boost::shared_ptr< const MapBase > ConstPtr
Definition: Maps.h:163
+
bool operator==(const AffineMap &other) const
Definition: Maps.h:417
+
const Vec3d & getInvTwiceScale() const
Return 1/(2 scale). Used to optimize some finite difference calculations.
Definition: Maps.h:816
+
MapBase::Ptr inverseMap() const
Return a new map representing the inverse of this map.
Definition: Maps.h:1236
+
MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation to the ...
Definition: Maps.h:889
+
static Name mapType()
Return NonlinearFrustumMap.
Definition: Maps.h:2024
+
MapBase::Ptr postScale(const Vec3d &s) const
Return a MapBase::Ptr to a new map that is the result of postfixing the appropiate operation to the l...
Definition: Maps.h:2446
+
UnitaryMap(Axis axis, double radians)
Definition: Maps.h:1638
+
MapBase::Ptr inverseMap() const
Return a new map representing the inverse of this map.
Definition: Maps.h:1497
+
Mat3 inverse(T tolerance=0) const
Definition: Mat3.h:509
+
void write(std::ostream &os) const
write serialization
Definition: Maps.h:839
+
bool isInvertible(const MatType &m)
Determine if a matrix is invertible.
Definition: Mat.h:877
+
OPENVDB_API boost::shared_ptr< PolarDecomposedMap > createPolarDecomposedMap(const Mat3d &m)
Decomposes a general linear into translation following polar decomposition.
+
UniformScaleTranslateMap(double scale, const Vec3d &translate)
Definition: Maps.h:1484
+
CompoundMap< UnitaryMap, TranslationMap > UnitaryAndTranslationMap
Definition: Maps.h:67
+
ScaleMap(const Vec3d &scale)
Definition: Maps.h:695
+
Vec3d applyJT(const Vec3d &in) const
Return the Jacobian Transpose of the map applied to in.
Definition: Maps.h:1056
+
Vec3d applyInverseMap(const Vec3d &in) const
Return the pre-image of in under the map.
Definition: Maps.h:1040
+
void write(std::ostream &os) const
write serialization
Definition: Maps.h:558
+
boost::shared_ptr< const UnitaryMap > ConstPtr
Definition: Maps.h:1624
+
T & y()
Definition: Vec3.h:98
+ +
static Name mapType()
Definition: Maps.h:958
+
bool operator==(const Vec3< T0 > &v0, const Vec3< T1 > &v1)
Equality operator, does exact floating point comparisons.
Definition: Vec3.h:450
+
Mat3d applyIJC(const Mat3d &in) const
Return the Jacobian Curvature: zero for a linear map.
Definition: Maps.h:793
+
Vec3d voxelSize() const
Return the absolute values of the scale values.
Definition: Maps.h:1331
+
boost::shared_ptr< const AffineMap > ConstPtr
Definition: Maps.h:328
+
AffineMap()
Definition: Maps.h:330
+
Vec3d asVec3d() const
Definition: Coord.h:159
+
MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation...
Definition: Maps.h:1418
+
Vec3d applyMap(const Vec3d &in) const
Return the image of in under the map.
Definition: Maps.h:1038
+
void setCol(int j, const Vec3< T > &v)
Set jth column to vector v.
Definition: Mat3.h:182
+
const Vec3d & getInvTwiceScale() const
Return 1/(2 scale). Used to optimize some finite difference calculations.
Definition: Maps.h:1344
+
void accumPreTranslation(const Vec3d &v)
Modify the existing affine map by pre-applying the given operation.
Definition: Maps.h:512
+
AffineMap(const AffineMap &first, const AffineMap &second)
constructor that merges the matrixes for two affine maps
Definition: Maps.h:372
+
Axis-aligned bounding box of signed integer coordinates.
Definition: Coord.h:254
+
virtual bool isEqual(const MapBase &other) const
Return true if this map is equal to the given map.
Definition: Maps.h:856
+
MapBase::Ptr postShear(double shear, Axis axis0, Axis axis1) const
Return a MapBase::Ptr to a new map that is the result of postfixing the appropraite operation...
Definition: Maps.h:1852
+
bool operator==(const NonlinearFrustumMap &other) const
Definition: Maps.h:2054
+
MapBase::Ptr preTranslate(const Vec3d &t) const
Return a MapBase::Ptr to a new map that is the result of prepending the appropriate operation...
Definition: Maps.h:1123
+
Definition: Exceptions.h:84
+
Vec3d voxelSize() const
Return .
Definition: Maps.h:1074
+
Vec3d applyJacobian(const Vec3d &in) const
Return the Jacobian of the map applied to in.
Definition: Maps.h:1044
+
bool hasUniformScale() const
Return false ( test if this is unitary with translation )
Definition: Maps.h:403
+
Vec3d applyInverseJacobian(const Vec3d &in, const Vec3d &) const
Return the Inverse Jacobian of the map applied to in. (i.e. inverse map with out translation) ...
Definition: Maps.h:1047
+
Mat3d applyIJC(const Mat3d &in, const Vec3d &, const Vec3d &) const
Definition: Maps.h:1324
+
MapBase::Ptr preShear(double shear, Axis axis0, Axis axis1) const
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation...
Definition: Maps.h:606
+
Vec3d applyJacobian(const Vec3d &in, const Vec3d &) const
Apply the Jacobian of this map to a vector. For a linear map this is equivalent to applying the map e...
Definition: Maps.h:1739
+
Vec3d applyJT(const Vec3d &in) const
Return the Jacobian Transpose of the map applied to in.
Definition: Maps.h:458
+
bool hasTranslation(const Mat4< T > &m)
Definition: Mat4.h:1371
+
AffineMap::Ptr getAffineMap() const
Definition: Maps.h:2629
+ +
Vec3d applyIJT(const Vec3d &in, const Vec3d &) const
Return the transpose of the inverse Jacobian (Identity for TranslationMap) of the map applied to in...
Definition: Maps.h:1060
+
const FirstMapType & firstMap() const
Definition: Maps.h:2641
+
void read(std::istream &is)
Unserialize this bounding box from the given stream.
Definition: BBox.h:165
+
double getTaper() const
Return the taper value.
Definition: Maps.h:2336
+
MapBase::Ptr inverseMap() const
Not implemented, since there is currently no map type that can represent the inverse of a frustum...
Definition: Maps.h:2008
+
Name readString(std::istream &is)
Definition: Name.h:47
+
void read(std::istream &is)
Definition: Maps.h:2647
+
AffineMap::Ptr getAffineMap() const
Return AffineMap::Ptr to an AffineMap equivalent to *this.
Definition: Maps.h:1391
+
const Vec3d & getScale() const
Returns the scale values.
Definition: Maps.h:1337
+
MapBase::Ptr preTranslate(const Vec3d &t) const
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation...
Definition: Maps.h:1407
+
Vec3d applyJacobian(const Vec3d &in) const
Return the Jacobian of the map applied to in.
Definition: Maps.h:447
+
std::string str() const
string serialization, useful for debuging
Definition: Maps.h:1792
+
const SecondMapType & secondMap() const
Definition: Maps.h:2642
+
Mat3d applyIJC(const Mat3d &in, const Vec3d &, const Vec3d &) const
Definition: Maps.h:473
+
Definition: Exceptions.h:82
+
Axis
Definition: Math.h:838
+
boost::shared_ptr< UniformScaleMap > Ptr
Definition: Maps.h:930
+
Vec3d applyInverseJacobian(const Vec3d &in) const
Return the Inverse Jacobian of the map applied to in. (i.e. inverse map with out translation) ...
Definition: Maps.h:1746
+
Threadsafe singleton object for accessing the map type-name dictionary. Associates a map type-name wi...
Definition: Maps.h:286
+
MapBase::Ptr copy() const
Return a MapBase::Ptr to a deep copy of this map.
Definition: Maps.h:1495
+
Mat3d applyIJC(const Mat3d &mat, const Vec3d &, const Vec3d &) const
Definition: Maps.h:1066
+
virtual bool isEqual(const MapBase &other) const
Return true if this map is equal to the given map.
Definition: Maps.h:1519
+
Vec3d applyJacobian(const Vec3d &in, const Vec3d &) const
Return the Jacobian of the map applied to in.
Definition: Maps.h:445
+
Vec3d applyIJT(const Vec3d &in, const Vec3d &) const
Return the transpose of the inverse Jacobian of the map applied to in.
Definition: Maps.h:1303
+
Vec3d applyMap(const Vec3d &in) const
Return the image of in under the map.
Definition: Maps.h:440
+
ScaleTranslateMap(const Vec3d &scale, const Vec3d &translate)
Definition: Maps.h:1191
+
Vec3d applyIJT(const Vec3d &in) const
Return the transpose of the inverse Jacobian (Identity for TranslationMap) of the map applied to in...
Definition: Maps.h:1063
+
MapBase::Ptr preScale(const Vec3d &v) const
Return a MapBase::Ptr to a new map that is the result of prepending the appropraite operation...
Definition: Maps.h:1816
+
static MapBase::Ptr create()
Return a MapBase::Ptr to a new TranslationMap.
Definition: Maps.h:1013
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
Vec3< T > row(int i) const
Get ith row, e.g. Vec3d v = m.row(1);.
Definition: Mat3.h:175
+
Vec3d applyInverseJacobian(const Vec3d &in) const
Return the Inverse Jacobian of the map applied to in. (i.e. inverse map with out translation) ...
Definition: Maps.h:1293
+
static MapBase::Ptr create()
Return a MapBase::Ptr to a new UniformScaleMap.
Definition: Maps.h:939
+
void write(std::ostream &os) const
Definition: Maps.h:2653
+
UniformScaleTranslateMap(const UniformScaleTranslateMap &other)
Definition: Maps.h:1489
+
TranslationMap(const Vec3d &t)
Definition: Maps.h:1007
+
AffineMap::Ptr getAffineMap() const
Return AffineMap::Ptr to an AffineMap equivalent to *this.
Definition: Maps.h:1104
+
virtual bool isEqual(const MapBase &other) const
Return true if this map is equal to the given map.
Definition: Maps.h:415
+
Mat3d applyIJC(const Mat3d &in, const Vec3d &, const Vec3d &) const
Definition: Maps.h:1766
+
bool hasUniformScale() const
Return false (by convention false)
Definition: Maps.h:2030
+
Vec3d applyJT(const Vec3d &in) const
Return the Jacobian Transpose of the second map applied to in.
Definition: Maps.h:2170
+
CompoundMap< SymmetricMap, UnitaryMap > PolarDecomposedMap
Definition: Maps.h:73
+
Name type() const
Return the name of this map's concrete type (e.g., "AffineMap").
Definition: Maps.h:1251
+
MapBase::Ptr inverseMap() const
Return a new map representing the inverse of this map.
Definition: Maps.h:726
+
Vec3d applyIJT(const Vec3d &in, const Vec3d &) const
Return the transpose of the inverse Jacobian of the map applied to in.
Definition: Maps.h:789
+
void setFirstMap(const FirstMapType &first)
Definition: Maps.h:2644
+
std::string str() const
string serialization, useful for debuging
Definition: Maps.h:1369
+
static bool isEqualBase(const MapT &self, const MapBase &other)
Definition: Maps.h:274
+
bool isValid() const
Definition: Maps.h:2351
+
Mat3 transpose() const
returns transpose of this
Definition: Mat3.h:498
+
CompoundMap< FirstMapType, SecondMapType > MyType
Definition: Maps.h:2569
+
ScaleTranslateMap()
Definition: Maps.h:1180
+
bool isLinear() const
Return true (a ScaleMap is always linear).
Definition: Maps.h:741
+
bool isLinear() const
Return false (a NonlinearFrustumMap is never linear).
Definition: Maps.h:2027
+
void setToRotation(const Quat< T > &q)
Set this matrix to the rotation matrix specified by the quaternion.
Definition: Mat3.h:297
+
MapBase::Ptr copy() const
Return a MapBase::Ptr to a deep copy of this map.
Definition: Maps.h:941
+
void read(std::istream &is)
read serialization
Definition: Maps.h:551
+
Vec3d applyIJT(const Vec3d &in) const
Return the transpose of the inverse Jacobian of the linear second map applied to in.
Definition: Maps.h:2175
+
boost::shared_ptr< const MyType > ConstPtr
Definition: Maps.h:2572
+
Vec3d applyJT(const Vec3d &in, const Vec3d &) const
Definition: Maps.h:1297
+
AffineMap::Ptr getAffineMap() const
Return AffineMap::Ptr to an AffineMap equivalent to *this.
Definition: Maps.h:1799
+
Vec3d applyInverseJacobian(const Vec3d &in, const Vec3d &) const
Return the Inverse Jacobian of the map applied to in. (i.e. inverse map with out translation) ...
Definition: Maps.h:1291
+
bool operator==(const ScaleMap &other) const
Definition: Maps.h:858
+
static Name mapType()
Definition: Maps.h:397
+
boost::shared_ptr< ScaleMap > Ptr
Definition: Maps.h:688
+ +
float Round(float x)
Return x rounded to the nearest integer.
Definition: Math.h:767
+
boost::shared_ptr< UnitaryMap > Ptr
Definition: Maps.h:1623
+
Mat3d applyIJC(const Mat3d &d2_is, const Vec3d &d1_is, const Vec3d &ijk) const
Definition: Maps.h:2226
+
bool isDiagonal(const MatType &mat)
Determine if a matrix is diagonal.
Definition: Mat.h:910
+ +
double determinant() const
Return the determinant of the Jacobian of linear second map.
Definition: Maps.h:2296
+
const Vec3d & getInvScale() const
Return 1/(scale)
Definition: Maps.h:818
+
bool isIdentity(const MatType &m)
Determine if a matrix is an identity matrix.
Definition: Mat.h:868
+
virtual bool isEqual(const MapBase &other) const
Return true if this map is equal to the given map.
Definition: Maps.h:1724
+
Vec3d applyJacobian(const Vec3d &in, const Vec3d &) const
Return the Jacobian of the map applied to in.
Definition: Maps.h:770
+
Vec3d applyInverseMap(const Vec3d &in) const
Return the pre-image of in under the map.
Definition: Maps.h:442
+
bool operator!=(const NonlinearFrustumMap &other) const
Definition: Maps.h:2076
+
~NonlinearFrustumMap()
Definition: Maps.h:1999
+
Vec3d applyInverseJacobian(const Vec3d &in, const Vec3d &) const
Return the Inverse Jacobian of the map applied to in. (i.e. inverse map with out translation) ...
Definition: Maps.h:775
+
double determinant(const Vec3d &) const
Return 1.
Definition: Maps.h:1069
+
double determinant() const
Return the product of the scale values.
Definition: Maps.h:808
+
virtual bool isEqual(const MapBase &other) const
Return true if this map is equal to the given map.
Definition: Maps.h:1378
+
static Name mapType()
Definition: Maps.h:1029
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/MaskToLevelSet_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/MaskToLevelSet_8h_source.html new file mode 100644 index 00000000..74253818 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/MaskToLevelSet_8h_source.html @@ -0,0 +1,294 @@ + + + + + + +OpenVDB: MaskToLevelSet.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
MaskToLevelSet.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
41 
+
42 #ifndef OPENVDB_TOOLS_MASK_TO_LEVELSET_HAS_BEEN_INCLUDED
+
43 #define OPENVDB_TOOLS_MASK_TO_LEVELSET_HAS_BEEN_INCLUDED
+
44 
+
45 #include <tbb/task_group.h>
+
46 #include <openvdb/Grid.h>
+
47 #include <openvdb/util/CpuTimer.h>
+
48 #include <openvdb/Types.h>
+ +
50 #include <openvdb/math/Math.h> // for isNegative
+ +
52 #include "LevelSetFilter.h"
+
53 #include "Morphology.h" // for erodeVoxels and dilateActiveValues
+
54 #include "SignedFloodFill.h" // for signedFloodFill
+
55 
+
56 namespace openvdb {
+ +
58 namespace OPENVDB_VERSION_NAME {
+
59 namespace tools {
+
60 
+
73 template<typename GridT,
+ +
75  typename InterrupterT>
+
76 inline typename Grid<typename GridT::TreeType::template ValueConverter<float>::Type>::Ptr
+
77 maskToLevelSet(const GridT& grid,
+
78  int halfWidth = 3,
+
79  int dilation = 1,
+
80  int erosion = 1,
+
81  InterrupterT* interrupt = NULL);
+
82 
+
98 template<typename GridT>
+
99 inline typename Grid<typename GridT::TreeType::template ValueConverter<float>::Type>::Ptr
+
100 maskToLevelSet(const GridT& grid,
+
101  int halfWidth = 3,
+
102  int dilation = 1,
+
103  int erosion = 1)
+
104 {
+
105  typedef util::NullInterrupter T;
+
106  return maskToLevelSet<GridT, math::FIRST_BIAS, T>(grid, halfWidth, dilation, erosion);
+
107 }
+
108 
+
109 namespace {
+
110 
+
111 template<typename TreeT>
+
112 struct DilateOp
+
113 {
+
114  DilateOp(TreeT& t, int n) : tree(&t), size(n) {}
+
115  void operator()() const {
+ +
117  }
+
118  TreeT* tree;
+
119  const int size;
+
120 };
+
121 
+
122 
+
123 template<typename TreeT>
+
124 struct ErodeOp
+
125 {
+
126  ErodeOp(TreeT& t, int n) : tree(&t), size(n) {}
+
127  void operator()() const { erodeVoxels( *tree, size); }
+
128  TreeT* tree;
+
129  const int size;
+
130 };
+
131 
+
132 }// unnamed namespace
+
133 
+
134 
+
135 template<typename GridT, math::BiasedGradientScheme Scheme, typename InterrupterT>
+
136 inline typename Grid<typename GridT::TreeType::template ValueConverter<float>::Type>::Ptr
+
137 maskToLevelSet(const GridT& grid, int halfWidth, int dilation, int erosion, InterrupterT* interrupt)
+
138 {
+
139  typedef typename GridT::TreeType::template ValueConverter<ValueMask>::Type MaskTreeT;
+
140  typedef typename GridT::TreeType::template ValueConverter<float>::Type FloatTreeT;
+
141  typedef Grid<FloatTreeT> FloatGridT;
+
142 
+
143  // Check input.
+
144  if ( halfWidth <= 0 ) {
+
145  OPENVDB_THROW(ValueError, "Narrow band width must be non-zero!");
+
146  }
+
147  if ( !grid.hasUniformVoxels() ) {
+
148  OPENVDB_THROW(ValueError, "Non-uniform voxels are not supported!");
+
149  }
+
150 
+
151  // background value = outside value
+
152  const float outside = static_cast<float>(grid.voxelSize()[0]) * halfWidth;
+
153 
+
154  // Copy the topology into a MaskGrid.
+
155  MaskTreeT maskTree( grid.tree(), false/*background*/, openvdb::TopologyCopy() );
+
156 
+
157  // Morphological closing operation.
+ +
159  erodeVoxels( maskTree, erosion);
+
160 
+
161  // Generate a volume with an implicit zero crossing at the boundary
+
162  // between active and inactive values in the input grid.
+
163  typename FloatTreeT::Ptr lsTree( new FloatTreeT(maskTree,
+
164  outside,// = inactive
+
165  -outside,//= active
+ +
167 
+
168  tbb::task_group pool;
+
169  pool.run( ErodeOp< MaskTreeT >( maskTree, halfWidth ) );
+
170  pool.run( DilateOp<FloatTreeT>( *lsTree , halfWidth ) );
+
171  pool.wait();// wait for both tasks to complete
+
172 
+
173  lsTree->topologyDifference( maskTree );
+
174  tools::pruneLevelSet( *lsTree, /*threading=*/true);
+
175 
+
176  // Create a level set grid from the tree
+
177  typename FloatGridT::Ptr lsGrid = FloatGridT::create( lsTree );
+
178  lsGrid->setTransform( grid.transform().copy() );
+
179  lsGrid->setGridClass( openvdb::GRID_LEVEL_SET );
+
180 
+
181  // Normalize and prune level set
+
182  LevelSetTracker<FloatGridT, InterrupterT> tracker( *lsGrid, interrupt );
+
183  tracker.setSpatialScheme( Scheme );
+
184  tracker.setNormCount( 3 * halfWidth );
+
185  tracker.normalize();
+
186  tracker.prune();
+
187 
+
188  return lsGrid;
+
189 }
+
190 
+
191 } // namespace tools
+
192 } // namespace OPENVDB_VERSION_NAME
+
193 } // namespace openvdb
+
194 
+
195 #endif //OPENVDB_TOOLS_MASK_TO_LEVELSET_HAS_BEEN_INCLUDED
+
196 
+
197 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
198 // All rights reserved. This software is distributed under the
+
199 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
Definition: Morphology.h:87
+ +
void setSpatialScheme(math::BiasedGradientScheme scheme)
Set the spatial finite difference scheme.
Definition: LevelSetTracker.h:151
+ +
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
Dummy NOOP interrupter class defining interface.
Definition: NullInterrupter.h:52
+
OPENVDB_STATIC_SPECIALIZATION void erodeVoxels(TreeType &tree, int iterations=1, NearestNeighbors nn=NN_FACE)
Topologically erode all leaf-level active voxels in the given tree.
Definition: Morphology.h:872
+
Definition: Types.h:442
+
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
+
void pruneLevelSet(TreeT &tree, bool threaded=true, size_t grainSize=1)
Reduce the memory footprint of a tree by replacing nodes whose values are all inactive with inactive ...
Definition: Prune.h:402
+
const int size
Definition: MaskToLevelSet.h:119
+
Performs various types of level set deformations with interface tracking. These unrestricted deformat...
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
void setNormCount(int n)
Set the number of normalizations performed per track or normalize call.
Definition: LevelSetTracker.h:165
+
Propagates the sign of distance values from the active voxels in the narrow band to the inactive valu...
+
Implementation of morphological dilation and erosion.
+
Definition: Exceptions.h:39
+
BiasedGradientScheme
Biased Gradients are limited to non-centered differences.
Definition: FiniteDifference.h:192
+
Grid< typename GridT::TreeType::template ValueConverter< float >::Type >::Ptr maskToLevelSet(const GridT &grid, int halfWidth=3, int dilation=1, int erosion=1)
Compute the narrow band level set to the interface between active and inactive voxels in the input gr...
Definition: MaskToLevelSet.h:100
+
OPENVDB_STATIC_SPECIALIZATION void dilateActiveValues(TreeType &tree, int iterations=1, NearestNeighbors nn=NN_FACE, TilePolicy mode=PRESERVE_TILES)
Topologically dilate all active values (i.e. both voxels and tiles) in a tree using one of three near...
Definition: Morphology.h:1071
+
void normalize(const MaskType *mask)
Iterative normalization, i.e. solving the Eikonal equation.
+ +
Definition: Exceptions.h:88
+ +
Definition: Types.h:213
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
A LeafManager manages a linear array of pointers to a given tree's leaf nodes, as well as optional au...
+
Performs multi-threaded interface tracking of narrow band level sets.
Definition: LevelSetTracker.h:67
+
TreeT * tree
Definition: MaskToLevelSet.h:118
+
Definition: Morphology.h:102
+
Container class that associates a tree with a transform and metadata.
Definition: Grid.h:54
+
void prune()
Remove voxels that are outside the narrow band. (substep of track)
Definition: LevelSetTracker.h:276
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/Mat3_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/Mat3_8h_source.html new file mode 100644 index 00000000..355a85a9 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/Mat3_8h_source.html @@ -0,0 +1,938 @@ + + + + + + +OpenVDB: Mat3.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Mat3.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 
+
31 #ifndef OPENVDB_MATH_MAT3_H_HAS_BEEN_INCLUDED
+
32 #define OPENVDB_MATH_MAT3_H_HAS_BEEN_INCLUDED
+
33 
+
34 #include <iomanip>
+
35 #include <assert.h>
+
36 #include <math.h>
+
37 #include <openvdb/Exceptions.h>
+
38 #include "Vec3.h"
+
39 #include "Mat.h"
+
40 
+
41 
+
42 namespace openvdb {
+ +
44 namespace OPENVDB_VERSION_NAME {
+
45 namespace math {
+
46 
+
47 template<typename T> class Vec3;
+
48 template<typename T> class Mat4;
+
49 template<typename T> class Quat;
+
50 
+
53 template<typename T>
+
54 class Mat3: public Mat<3, T>
+
55 {
+
56 public:
+
58  typedef T value_type;
+
59  typedef T ValueType;
+
60  typedef Mat<3, T> MyBase;
+
62  Mat3() {}
+
63 
+
66  Mat3(const Quat<T> &q)
+
67  { setToRotation(q); }
+
68 
+
69 
+
71 
+
76  template<typename Source>
+
77  Mat3(Source a, Source b, Source c,
+
78  Source d, Source e, Source f,
+
79  Source g, Source h, Source i)
+
80  {
+
81  MyBase::mm[0] = static_cast<ValueType>(a);
+
82  MyBase::mm[1] = static_cast<ValueType>(b);
+
83  MyBase::mm[2] = static_cast<ValueType>(c);
+
84  MyBase::mm[3] = static_cast<ValueType>(d);
+
85  MyBase::mm[4] = static_cast<ValueType>(e);
+
86  MyBase::mm[5] = static_cast<ValueType>(f);
+
87  MyBase::mm[6] = static_cast<ValueType>(g);
+
88  MyBase::mm[7] = static_cast<ValueType>(h);
+
89  MyBase::mm[8] = static_cast<ValueType>(i);
+
90  } // constructor1Test
+
91 
+
94  template<typename Source>
+
95  Mat3(const Vec3<Source> &v1, const Vec3<Source> &v2, const Vec3<Source> &v3, bool rows = true)
+
96  {
+
97  if (rows) {
+
98  this->setRows(v1, v2, v3);
+
99  } else {
+
100  this->setColumns(v1, v2, v3);
+
101  }
+
102  }
+
103 
+
108  template<typename Source>
+
109  Mat3(Source *a)
+
110  {
+
111  MyBase::mm[0] = a[0];
+
112  MyBase::mm[1] = a[1];
+
113  MyBase::mm[2] = a[2];
+
114  MyBase::mm[3] = a[3];
+
115  MyBase::mm[4] = a[4];
+
116  MyBase::mm[5] = a[5];
+
117  MyBase::mm[6] = a[6];
+
118  MyBase::mm[7] = a[7];
+
119  MyBase::mm[8] = a[8];
+
120  } // constructor1Test
+
121 
+
123  Mat3(const Mat<3, T> &m)
+
124  {
+
125  for (int i=0; i<3; ++i) {
+
126  for (int j=0; j<3; ++j) {
+
127  MyBase::mm[i*3 + j] = m[i][j];
+
128  }
+
129  }
+
130  }
+
131 
+
133  template<typename Source>
+
134  explicit Mat3(const Mat3<Source> &m)
+
135  {
+
136  for (int i=0; i<3; ++i) {
+
137  for (int j=0; j<3; ++j) {
+
138  MyBase::mm[i*3 + j] = static_cast<T>(m[i][j]);
+
139  }
+
140  }
+
141  }
+
142 
+
144  explicit Mat3(const Mat4<T> &m)
+
145  {
+
146  for (int i=0; i<3; ++i) {
+
147  for (int j=0; j<3; ++j) {
+
148  MyBase::mm[i*3 + j] = m[i][j];
+
149  }
+
150  }
+
151  }
+
152 
+
154  static const Mat3<T>& identity() {
+
155  return sIdentity;
+
156  }
+
157 
+
159  static const Mat3<T>& zero() {
+
160  return sZero;
+
161  }
+
162 
+
164  void setRow(int i, const Vec3<T> &v)
+
165  {
+
166  // assert(i>=0 && i<3);
+
167  int i3 = i * 3;
+
168 
+
169  MyBase::mm[i3+0] = v[0];
+
170  MyBase::mm[i3+1] = v[1];
+
171  MyBase::mm[i3+2] = v[2];
+
172  } // rowColumnTest
+
173 
+
175  Vec3<T> row(int i) const
+
176  {
+
177  // assert(i>=0 && i<3);
+
178  return Vec3<T>((*this)(i,0), (*this)(i,1), (*this)(i,2));
+
179  } // rowColumnTest
+
180 
+
182  void setCol(int j, const Vec3<T>& v)
+
183  {
+
184  // assert(j>=0 && j<3);
+
185  MyBase::mm[0+j] = v[0];
+
186  MyBase::mm[3+j] = v[1];
+
187  MyBase::mm[6+j] = v[2];
+
188  } // rowColumnTest
+
189 
+
191  Vec3<T> col(int j) const
+
192  {
+
193  // assert(j>=0 && j<3);
+
194  return Vec3<T>((*this)(0,j), (*this)(1,j), (*this)(2,j));
+
195  } // rowColumnTest
+
196 
+
197  // NB: The following two methods were changed to
+
198  // work around a gccWS5 compiler issue related to strict
+
199  // aliasing (see FX-475).
+
200 
+
202  T* operator[](int i) { return &(MyBase::mm[i*3]); }
+
205  const T* operator[](int i) const { return &(MyBase::mm[i*3]); }
+
207 
+
208  T* asPointer() {return MyBase::mm;}
+
209  const T* asPointer() const {return MyBase::mm;}
+
210 
+
214  T& operator()(int i, int j)
+
215  {
+
216  // assert(i>=0 && i<3);
+
217  // assert(j>=0 && j<3);
+
218  return MyBase::mm[3*i+j];
+
219  } // trivial
+
220 
+
224  T operator()(int i, int j) const
+
225  {
+
226  // assert(i>=0 && i<3);
+
227  // assert(j>=0 && j<3);
+
228  return MyBase::mm[3*i+j];
+
229  } // trivial
+
230 
+
232  void setRows(const Vec3<T> &v1, const Vec3<T> &v2, const Vec3<T> &v3)
+
233  {
+
234  MyBase::mm[0] = v1[0];
+
235  MyBase::mm[1] = v1[1];
+
236  MyBase::mm[2] = v1[2];
+
237  MyBase::mm[3] = v2[0];
+
238  MyBase::mm[4] = v2[1];
+
239  MyBase::mm[5] = v2[2];
+
240  MyBase::mm[6] = v3[0];
+
241  MyBase::mm[7] = v3[1];
+
242  MyBase::mm[8] = v3[2];
+
243  } // setRows
+
244 
+
246  void setColumns(const Vec3<T> &v1, const Vec3<T> &v2, const Vec3<T> &v3)
+
247  {
+
248  MyBase::mm[0] = v1[0];
+
249  MyBase::mm[1] = v2[0];
+
250  MyBase::mm[2] = v3[0];
+
251  MyBase::mm[3] = v1[1];
+
252  MyBase::mm[4] = v2[1];
+
253  MyBase::mm[5] = v3[1];
+
254  MyBase::mm[6] = v1[2];
+
255  MyBase::mm[7] = v2[2];
+
256  MyBase::mm[8] = v3[2];
+
257  } // setColumns
+
258 
+
260  OPENVDB_DEPRECATED void setBasis(const Vec3<T> &v1, const Vec3<T> &v2, const Vec3<T> &v3)
+
261  {
+
262  this->setRows(v1, v2, v3);
+
263  }
+
264 
+
266  void setSymmetric(const Vec3<T> &vdiag, const Vec3<T> &vtri)
+
267  {
+
268  MyBase::mm[0] = vdiag[0];
+
269  MyBase::mm[1] = vtri[0];
+
270  MyBase::mm[2] = vtri[1];
+
271  MyBase::mm[3] = vtri[0];
+
272  MyBase::mm[4] = vdiag[1];
+
273  MyBase::mm[5] = vtri[2];
+
274  MyBase::mm[6] = vtri[1];
+
275  MyBase::mm[7] = vtri[2];
+
276  MyBase::mm[8] = vdiag[2];
+
277  } // setSymmetricTest
+
278 
+
281  static Mat3 symmetric(const Vec3<T> &vdiag, const Vec3<T> &vtri)
+
282  {
+
283  return Mat3(
+
284  vdiag[0], vtri[0], vtri[1],
+
285  vtri[0], vdiag[1], vtri[2],
+
286  vtri[1], vtri[2], vdiag[2]
+
287  );
+
288  }
+
289 
+
291  void setSkew(const Vec3<T> &v)
+
292  {*this = skew(v);}
+
293 
+
297  void setToRotation(const Quat<T> &q)
+
298  {*this = rotation<Mat3<T> >(q);}
+
299 
+
302  void setToRotation(const Vec3<T> &axis, T angle)
+
303  {*this = rotation<Mat3<T> >(axis, angle);}
+
304 
+
306  void setZero()
+
307  {
+
308  MyBase::mm[0] = 0;
+
309  MyBase::mm[1] = 0;
+
310  MyBase::mm[2] = 0;
+
311  MyBase::mm[3] = 0;
+
312  MyBase::mm[4] = 0;
+
313  MyBase::mm[5] = 0;
+
314  MyBase::mm[6] = 0;
+
315  MyBase::mm[7] = 0;
+
316  MyBase::mm[8] = 0;
+
317  } // trivial
+
318 
+
320  void setIdentity()
+
321  {
+
322  MyBase::mm[0] = 1;
+
323  MyBase::mm[1] = 0;
+
324  MyBase::mm[2] = 0;
+
325  MyBase::mm[3] = 0;
+
326  MyBase::mm[4] = 1;
+
327  MyBase::mm[5] = 0;
+
328  MyBase::mm[6] = 0;
+
329  MyBase::mm[7] = 0;
+
330  MyBase::mm[8] = 1;
+
331  } // trivial
+
332 
+
334  template<typename Source>
+
335  const Mat3& operator=(const Mat3<Source> &m)
+
336  {
+
337  const Source *src = m.asPointer();
+
338 
+
339  // don't suppress type conversion warnings
+
340  std::copy(src, (src + this->numElements()), MyBase::mm);
+
341  return *this;
+
342  } // opEqualToTest
+
343 
+
345  bool eq(const Mat3 &m, T eps=1.0e-8) const
+
346  {
+
347  return (isApproxEqual(MyBase::mm[0],m.mm[0],eps) &&
+
348  isApproxEqual(MyBase::mm[1],m.mm[1],eps) &&
+
349  isApproxEqual(MyBase::mm[2],m.mm[2],eps) &&
+
350  isApproxEqual(MyBase::mm[3],m.mm[3],eps) &&
+
351  isApproxEqual(MyBase::mm[4],m.mm[4],eps) &&
+
352  isApproxEqual(MyBase::mm[5],m.mm[5],eps) &&
+
353  isApproxEqual(MyBase::mm[6],m.mm[6],eps) &&
+
354  isApproxEqual(MyBase::mm[7],m.mm[7],eps) &&
+
355  isApproxEqual(MyBase::mm[8],m.mm[8],eps));
+
356  } // trivial
+
357 
+ +
360  {
+
361  return Mat3<T>(
+
362  -MyBase::mm[0], -MyBase::mm[1], -MyBase::mm[2],
+
363  -MyBase::mm[3], -MyBase::mm[4], -MyBase::mm[5],
+
364  -MyBase::mm[6], -MyBase::mm[7], -MyBase::mm[8]
+
365  );
+
366  } // trivial
+
367 
+
369  // friend Mat3 operator*(T scalar, const Mat3& m) {
+
370  // return m*scalar;
+
371  // }
+
372 
+
374  template <typename S>
+
375  const Mat3<T>& operator*=(S scalar)
+
376  {
+
377  MyBase::mm[0] *= scalar;
+
378  MyBase::mm[1] *= scalar;
+
379  MyBase::mm[2] *= scalar;
+
380  MyBase::mm[3] *= scalar;
+
381  MyBase::mm[4] *= scalar;
+
382  MyBase::mm[5] *= scalar;
+
383  MyBase::mm[6] *= scalar;
+
384  MyBase::mm[7] *= scalar;
+
385  MyBase::mm[8] *= scalar;
+
386  return *this;
+
387  }
+
388 
+
390  template <typename S>
+
391  const Mat3<T> &operator+=(const Mat3<S> &m1)
+
392  {
+
393  const S *s = m1.asPointer();
+
394 
+
395  MyBase::mm[0] += s[0];
+
396  MyBase::mm[1] += s[1];
+
397  MyBase::mm[2] += s[2];
+
398  MyBase::mm[3] += s[3];
+
399  MyBase::mm[4] += s[4];
+
400  MyBase::mm[5] += s[5];
+
401  MyBase::mm[6] += s[6];
+
402  MyBase::mm[7] += s[7];
+
403  MyBase::mm[8] += s[8];
+
404  return *this;
+
405  }
+
406 
+
408  template <typename S>
+
409  const Mat3<T> &operator-=(const Mat3<S> &m1)
+
410  {
+
411  const S *s = m1.asPointer();
+
412 
+
413  MyBase::mm[0] -= s[0];
+
414  MyBase::mm[1] -= s[1];
+
415  MyBase::mm[2] -= s[2];
+
416  MyBase::mm[3] -= s[3];
+
417  MyBase::mm[4] -= s[4];
+
418  MyBase::mm[5] -= s[5];
+
419  MyBase::mm[6] -= s[6];
+
420  MyBase::mm[7] -= s[7];
+
421  MyBase::mm[8] -= s[8];
+
422  return *this;
+
423  }
+
424 
+
426  template <typename S>
+
427  const Mat3<T> &operator*=(const Mat3<S> &m1)
+
428  {
+
429  Mat3<T> m0(*this);
+
430  const T* s0 = m0.asPointer();
+
431  const S* s1 = m1.asPointer();
+
432 
+
433  MyBase::mm[0] = static_cast<T>(s0[0] * s1[0] +
+
434  s0[1] * s1[3] +
+
435  s0[2] * s1[6]);
+
436  MyBase::mm[1] = static_cast<T>(s0[0] * s1[1] +
+
437  s0[1] * s1[4] +
+
438  s0[2] * s1[7]);
+
439  MyBase::mm[2] = static_cast<T>(s0[0] * s1[2] +
+
440  s0[1] * s1[5] +
+
441  s0[2] * s1[8]);
+
442 
+
443  MyBase::mm[3] = static_cast<T>(s0[3] * s1[0] +
+
444  s0[4] * s1[3] +
+
445  s0[5] * s1[6]);
+
446  MyBase::mm[4] = static_cast<T>(s0[3] * s1[1] +
+
447  s0[4] * s1[4] +
+
448  s0[5] * s1[7]);
+
449  MyBase::mm[5] = static_cast<T>(s0[3] * s1[2] +
+
450  s0[4] * s1[5] +
+
451  s0[5] * s1[8]);
+
452 
+
453  MyBase::mm[6] = static_cast<T>(s0[6] * s1[0] +
+
454  s0[7] * s1[3] +
+
455  s0[8] * s1[6]);
+
456  MyBase::mm[7] = static_cast<T>(s0[6] * s1[1] +
+
457  s0[7] * s1[4] +
+
458  s0[8] * s1[7]);
+
459  MyBase::mm[8] = static_cast<T>(s0[6] * s1[2] +
+
460  s0[7] * s1[5] +
+
461  s0[8] * s1[8]);
+
462 
+
463  return *this;
+
464  }
+
465 
+
467  Mat3 cofactor() const
+
468  {
+
469  return Mat3<T>(
+
470  MyBase::mm[4] * MyBase::mm[8] - MyBase::mm[5] * MyBase::mm[7],
+
471  MyBase::mm[5] * MyBase::mm[6] - MyBase::mm[3] * MyBase::mm[8],
+
472  MyBase::mm[3] * MyBase::mm[7] - MyBase::mm[4] * MyBase::mm[6],
+
473  MyBase::mm[2] * MyBase::mm[7] - MyBase::mm[1] * MyBase::mm[8],
+
474  MyBase::mm[0] * MyBase::mm[8] - MyBase::mm[2] * MyBase::mm[6],
+
475  MyBase::mm[1] * MyBase::mm[6] - MyBase::mm[0] * MyBase::mm[7],
+
476  MyBase::mm[1] * MyBase::mm[5] - MyBase::mm[2] * MyBase::mm[4],
+
477  MyBase::mm[2] * MyBase::mm[3] - MyBase::mm[0] * MyBase::mm[5],
+
478  MyBase::mm[0] * MyBase::mm[4] - MyBase::mm[1] * MyBase::mm[3]);
+
479  }
+
480 
+
482  Mat3 adjoint() const
+
483  {
+
484  return Mat3<T>(
+
485  MyBase::mm[4] * MyBase::mm[8] - MyBase::mm[5] * MyBase::mm[7],
+
486  MyBase::mm[2] * MyBase::mm[7] - MyBase::mm[1] * MyBase::mm[8],
+
487  MyBase::mm[1] * MyBase::mm[5] - MyBase::mm[2] * MyBase::mm[4],
+
488  MyBase::mm[5] * MyBase::mm[6] - MyBase::mm[3] * MyBase::mm[8],
+
489  MyBase::mm[0] * MyBase::mm[8] - MyBase::mm[2] * MyBase::mm[6],
+
490  MyBase::mm[2] * MyBase::mm[3] - MyBase::mm[0] * MyBase::mm[5],
+
491  MyBase::mm[3] * MyBase::mm[7] - MyBase::mm[4] * MyBase::mm[6],
+
492  MyBase::mm[1] * MyBase::mm[6] - MyBase::mm[0] * MyBase::mm[7],
+
493  MyBase::mm[0] * MyBase::mm[4] - MyBase::mm[1] * MyBase::mm[3]);
+
494 
+
495  } // adjointTest
+
496 
+
498  Mat3 transpose() const
+
499  {
+
500  return Mat3<T>(
+
501  MyBase::mm[0], MyBase::mm[3], MyBase::mm[6],
+
502  MyBase::mm[1], MyBase::mm[4], MyBase::mm[7],
+
503  MyBase::mm[2], MyBase::mm[5], MyBase::mm[8]);
+
504 
+
505  } // transposeTest
+
506 
+
509  Mat3 inverse(T tolerance = 0) const
+
510  {
+
511  Mat3<T> inv(this->adjoint());
+
512 
+
513  const T det = inv.mm[0]*MyBase::mm[0] + inv.mm[1]*MyBase::mm[3] + inv.mm[2]*MyBase::mm[6];
+
514 
+
515  // If the determinant is 0, m was singular and "this" will contain junk.
+
516  if (isApproxEqual(det,T(0.0),tolerance)) {
+
517  OPENVDB_THROW(ArithmeticError, "Inversion of singular 3x3 matrix");
+
518  }
+
519  return inv * (T(1)/det);
+
520  } // invertTest
+
521 
+
523  T det() const
+
524  {
+
525  const T co00 = MyBase::mm[4]*MyBase::mm[8] - MyBase::mm[5]*MyBase::mm[7];
+
526  const T co10 = MyBase::mm[5]*MyBase::mm[6] - MyBase::mm[3]*MyBase::mm[8];
+
527  const T co20 = MyBase::mm[3]*MyBase::mm[7] - MyBase::mm[4]*MyBase::mm[6];
+
528  return MyBase::mm[0]*co00 + MyBase::mm[1]*co10 + MyBase::mm[2]*co20;
+
529  } // determinantTest
+
530 
+
532  T trace() const
+
533  {
+
534  return MyBase::mm[0]+MyBase::mm[4]+MyBase::mm[8];
+
535  }
+
536 
+
541  Mat3 snapBasis(Axis axis, const Vec3<T> &direction)
+
542  {
+
543  return snapMatBasis(*this, axis, direction);
+
544  }
+
545 
+
548  template<typename T0>
+
549  Vec3<T0> transform(const Vec3<T0> &v) const
+
550  {
+
551  return static_cast< Vec3<T0> >(v * *this);
+
552  } // xformVectorTest
+
553 
+
556  template<typename T0>
+ +
558  {
+
559  return static_cast< Vec3<T0> >(*this * v);
+
560  } // xformTVectorTest
+
561 
+
562 
+
565  Mat3 timesDiagonal(const Vec3<T>& diag) const
+
566  {
+
567  Mat3 ret(*this);
+
568 
+
569  ret.mm[0] *= diag(0);
+
570  ret.mm[1] *= diag(1);
+
571  ret.mm[2] *= diag(2);
+
572  ret.mm[3] *= diag(0);
+
573  ret.mm[4] *= diag(1);
+
574  ret.mm[5] *= diag(2);
+
575  ret.mm[6] *= diag(0);
+
576  ret.mm[7] *= diag(1);
+
577  ret.mm[8] *= diag(2);
+
578  return ret;
+
579  }
+
580 
+
581 private:
+
582  static const Mat3<T> sIdentity;
+
583  static const Mat3<T> sZero;
+
584 }; // class Mat3
+
585 
+
586 
+
587 template <typename T>
+
588 const Mat3<T> Mat3<T>::sIdentity = Mat3<T>(1, 0, 0,
+
589  0, 1, 0,
+
590  0, 0, 1);
+
591 
+
592 template <typename T>
+
593 const Mat3<T> Mat3<T>::sZero = Mat3<T>(0, 0, 0,
+
594  0, 0, 0,
+
595  0, 0, 0);
+
596 
+
599 template <typename T0, typename T1>
+
600 bool operator==(const Mat3<T0> &m0, const Mat3<T1> &m1)
+
601 {
+
602  const T0 *t0 = m0.asPointer();
+
603  const T1 *t1 = m1.asPointer();
+
604 
+
605  for (int i=0; i<9; ++i) {
+
606  if (!isExactlyEqual(t0[i], t1[i])) return false;
+
607  }
+
608  return true;
+
609 }
+
610 
+
613 template <typename T0, typename T1>
+
614 bool operator!=(const Mat3<T0> &m0, const Mat3<T1> &m1) { return !(m0 == m1); }
+
615 
+
618 template <typename S, typename T>
+ +
620 { return m*scalar; }
+
621 
+
624 template <typename S, typename T>
+ +
626 {
+ +
628  result *= scalar;
+
629  return result;
+
630 }
+
631 
+
634 template <typename T0, typename T1>
+ +
636 {
+ +
638  result += m1;
+
639  return result;
+
640 }
+
641 
+
644 template <typename T0, typename T1>
+ +
646 {
+ +
648  result -= m1;
+
649  return result;
+
650 }
+
651 
+
652 
+
657 template <typename T0, typename T1>
+ +
659 {
+ +
661  result *= m1;
+
662  return result;
+
663 }
+
664 
+
667 template<typename T, typename MT>
+
668 inline Vec3<typename promote<T, MT>::type>
+
669 operator*(const Mat3<MT> &_m, const Vec3<T> &_v)
+
670 {
+
671  MT const *m = _m.asPointer();
+ +
673  _v[0]*m[0] + _v[1]*m[1] + _v[2]*m[2],
+
674  _v[0]*m[3] + _v[1]*m[4] + _v[2]*m[5],
+
675  _v[0]*m[6] + _v[1]*m[7] + _v[2]*m[8]);
+
676 }
+
677 
+
680 template<typename T, typename MT>
+ +
682 operator*(const Vec3<T> &_v, const Mat3<MT> &_m)
+
683 {
+
684  MT const *m = _m.asPointer();
+ +
686  _v[0]*m[0] + _v[1]*m[3] + _v[2]*m[6],
+
687  _v[0]*m[1] + _v[1]*m[4] + _v[2]*m[7],
+
688  _v[0]*m[2] + _v[1]*m[5] + _v[2]*m[8]);
+
689 }
+
690 
+
693 template<typename T, typename MT>
+
694 inline Vec3<T> &operator *= (Vec3<T> &_v, const Mat3<MT> &_m)
+
695 {
+
696  Vec3<T> mult = _v * _m;
+
697  _v = mult;
+
698  return _v;
+
699 }
+
700 
+
703 template <typename T>
+
704 Mat3<T> outerProduct(const Vec3<T>& v1, const Vec3<T>& v2)
+
705 {
+
706  return Mat3<T>(v1[0]*v2[0], v1[0]*v2[1], v1[0]*v2[2],
+
707  v1[1]*v2[0], v1[1]*v2[1], v1[1]*v2[2],
+
708  v1[2]*v2[0], v1[2]*v2[1], v1[2]*v2[2]);
+
709 }// outerProduct
+
710 
+ + +
713 
+
714 #if DWREAL_IS_DOUBLE == 1
+
715 typedef Mat3d Mat3f;
+
716 #else
+
717 typedef Mat3s Mat3f;
+
718 #endif // DWREAL_IS_DOUBLE
+
719 
+
720 
+
724 template<typename T, typename T0>
+
725 Mat3<T> powLerp(const Mat3<T0> &m1, const Mat3<T0> &m2, T t)
+
726 {
+
727  Mat3<T> x = m1.inverse() * m2;
+
728  powSolve(x, x, t);
+
729  Mat3<T> m = m1 * x;
+
730  return m;
+
731 }
+
732 
+
733 
+
734 namespace {
+
735  template<typename T>
+
736  void pivot(int i, int j, Mat3<T>& S, Vec3<T>& D, Mat3<T>& Q)
+
737  {
+
738  const int& n = Mat3<T>::size; // should be 3
+
739  T temp;
+
741  double cotan_of_2_theta;
+
742  double tan_of_theta;
+
743  double cosin_of_theta;
+
744  double sin_of_theta;
+
745  double z;
+
746 
+
747  double Sij = S(i,j);
+
748 
+
749  double Sjj_minus_Sii = D[j] - D[i];
+
750 
+
751  if (fabs(Sjj_minus_Sii) * (10*math::Tolerance<T>::value()) > fabs(Sij)) {
+
752  tan_of_theta = Sij / Sjj_minus_Sii;
+
753  } else {
+
755  cotan_of_2_theta = 0.5*Sjj_minus_Sii / Sij ;
+
756 
+
757  if (cotan_of_2_theta < 0.) {
+
758  tan_of_theta =
+
759  -1./(sqrt(1. + cotan_of_2_theta*cotan_of_2_theta) - cotan_of_2_theta);
+
760  } else {
+
761  tan_of_theta =
+
762  1./(sqrt(1. + cotan_of_2_theta*cotan_of_2_theta) + cotan_of_2_theta);
+
763  }
+
764  }
+
765 
+
766  cosin_of_theta = 1./sqrt( 1. + tan_of_theta * tan_of_theta);
+
767  sin_of_theta = cosin_of_theta * tan_of_theta;
+
768  z = tan_of_theta * Sij;
+
769  S(i,j) = 0;
+
770  D[i] -= z;
+
771  D[j] += z;
+
772  for (int k = 0; k < i; ++k) {
+
773  temp = S(k,i);
+
774  S(k,i) = cosin_of_theta * temp - sin_of_theta * S(k,j);
+
775  S(k,j)= sin_of_theta * temp + cosin_of_theta * S(k,j);
+
776  }
+
777  for (int k = i+1; k < j; ++k) {
+
778  temp = S(i,k);
+
779  S(i,k) = cosin_of_theta * temp - sin_of_theta * S(k,j);
+
780  S(k,j) = sin_of_theta * temp + cosin_of_theta * S(k,j);
+
781  }
+
782  for (int k = j+1; k < n; ++k) {
+
783  temp = S(i,k);
+
784  S(i,k) = cosin_of_theta * temp - sin_of_theta * S(j,k);
+
785  S(j,k) = sin_of_theta * temp + cosin_of_theta * S(j,k);
+
786  }
+
787  for (int k = 0; k < n; ++k)
+
788  {
+
789  temp = Q(k,i);
+
790  Q(k,i) = cosin_of_theta * temp - sin_of_theta*Q(k,j);
+
791  Q(k,j) = sin_of_theta * temp + cosin_of_theta*Q(k,j);
+
792  }
+
793  }
+
794 }
+
795 
+
796 
+
802 template<typename T>
+ +
804  unsigned int MAX_ITERATIONS=250)
+
805 {
+
808  Q = Mat3<T>::identity();
+
809  int n = Mat3<T>::size; // should be 3
+
810 
+
812  Mat3<T> S(input);
+
813 
+
814  for (int i = 0; i < n; ++i) {
+
815  D[i] = S(i,i);
+
816  }
+
817 
+
818  unsigned int iterations(0);
+
821  do {
+
824  double er = 0;
+
825  for (int i = 0; i < n; ++i) {
+
826  for (int j = i+1; j < n; ++j) {
+
827  er += fabs(S(i,j));
+
828  }
+
829  }
+
830  if (std::abs(er) < math::Tolerance<T>::value()) {
+
831  return true;
+
832  }
+
833  iterations++;
+
834 
+
835  T max_element = 0;
+
836  int ip = 0;
+
837  int jp = 0;
+
839  for (int i = 0; i < n; ++i) {
+
840  for (int j = i+1; j < n; ++j){
+
841 
+
842  if ( fabs(D[i]) * (10*math::Tolerance<T>::value()) > fabs(S(i,j))) {
+
844  S(i,j) = 0;
+
845  }
+
846  if (fabs(S(i,j)) > max_element) {
+
847  max_element = fabs(S(i,j));
+
848  ip = i;
+
849  jp = j;
+
850  }
+
851  }
+
852  }
+
853  pivot(ip, jp, S, D, Q);
+
854  } while (iterations < MAX_ITERATIONS);
+
855 
+
856  return false;
+
857 }
+
858 
+
859 } // namespace math
+
860 } // namespace OPENVDB_VERSION_NAME
+
861 } // namespace openvdb
+
862 
+
863 #endif // OPENVDB_MATH_MAT3_H_HAS_BEEN_INCLUDED
+
864 
+
865 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
866 // All rights reserved. This software is distributed under the
+
867 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
Mat3(const Quat< T > &q)
Definition: Mat3.h:66
+
T operator()(int i, int j) const
Definition: Mat3.h:224
+
const T * operator[](int i) const
Definition: Mat3.h:205
+
const Mat3 & operator=(const Mat3< Source > &m)
Assignment operator.
Definition: Mat3.h:335
+
static Mat3 symmetric(const Vec3< T > &vdiag, const Vec3< T > &vtri)
Definition: Mat3.h:281
+
#define OPENVDB_DEPRECATED
Definition: Platform.h:49
+ +
Vec3< T > col(int j) const
Get jth column, e.g. Vec3d v = m.col(0);.
Definition: Mat3.h:191
+
bool operator!=(const Mat3< T0 > &m0, const Mat3< T1 > &m1)
Inequality operator, does exact floating point comparisons.
Definition: Mat3.h:614
+
bool isExactlyEqual(const T0 &a, const T1 &b)
Return true if a is exactly equal to b.
Definition: Math.h:407
+
Mat3< float > Mat3s
Definition: Mat3.h:711
+
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
static const Mat3< T > & zero()
Predefined constant for zero matrix.
Definition: Mat3.h:159
+
Definition: Mat.h:146
+
Definition: Mat.h:145
+
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
+
T mm[SIZE *SIZE]
Definition: Mat.h:141
+
T trace() const
Trace of matrix.
Definition: Mat3.h:532
+
Definition: Exceptions.h:78
+
T & operator()(int i, int j)
Definition: Mat3.h:214
+
Mat3(Source a, Source b, Source c, Source d, Source e, Source f, Source g, Source h, Source i)
Constructor given array of elements, the ordering is in row major form:
Definition: Mat3.h:77
+
Mat3< T > operator-() const
Negation operator, for e.g. m1 = -m2;.
Definition: Mat3.h:359
+
void setRows(const Vec3< T > &v1, const Vec3< T > &v2, const Vec3< T > &v3)
Set the rows of "this" matrix to the vectors v1, v2, v3.
Definition: Mat3.h:232
+
Vec3< T0 > pretransform(const Vec3< T0 > &v) const
Definition: Mat3.h:557
+
Mat3< typename promote< T0, T1 >::type > operator*(const Mat3< T0 > &m0, const Mat3< T1 > &m1)
Matrix multiplication.
Definition: Mat3.h:658
+
bool operator==(const Mat3< T0 > &m0, const Mat3< T1 > &m1)
Equality operator, does exact floating point comparisons.
Definition: Mat3.h:600
+
Mat3(const Mat4< T > &m)
Conversion from Mat4 (copies top left)
Definition: Mat3.h:144
+
Mat3< typename promote< S, T >::type > operator*(const Mat3< T > &m, S scalar)
Returns M, where for .
Definition: Mat3.h:625
+
4x4 -matrix class.
Definition: Mat3.h:48
+
const int size
Definition: MaskToLevelSet.h:119
+
Mat3< typename promote< T0, T1 >::type > operator-(const Mat3< T0 > &m0, const Mat3< T1 > &m1)
Returns M, where for .
Definition: Mat3.h:645
+
Mat3< T > powLerp(const Mat3< T0 > &m1, const Mat3< T0 > &m2, T t)
Definition: Mat3.h:725
+
bool isApproxEqual(const Type &a, const Type &b)
Return true if a is equal to b to within the default floating-point comparison tolerance.
Definition: Math.h:370
+
T det() const
Determinant of matrix.
Definition: Mat3.h:523
+
void setZero()
Set this matrix to zero.
Definition: Mat3.h:306
+
Mat3(Source *a)
Definition: Mat3.h:109
+ +
Vec3< T0 > transform(const Vec3< T0 > &v) const
Definition: Mat3.h:549
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
Mat3< typename promote< S, T >::type > operator*(S scalar, const Mat3< T > &m)
Returns M, where for .
Definition: Mat3.h:619
+
void setColumns(const Vec3< T > &v1, const Vec3< T > &v2, const Vec3< T > &v3)
Set the columns of "this" matrix to the vectors v1, v2, v3.
Definition: Mat3.h:246
+
void setToRotation(const Vec3< T > &axis, T angle)
Set this matrix to the rotation specified by axis and angle.
Definition: Mat3.h:302
+
Vec3< typename promote< T, MT >::type > operator*(const Vec3< T > &_v, const Mat3< MT > &_m)
Returns v, where for .
Definition: Mat3.h:682
+
Mat3< double > Mat3d
Definition: Mat3.h:712
+
T ValueType
Definition: Mat3.h:59
+
void setSymmetric(const Vec3< T > &vdiag, const Vec3< T > &vtri)
Set diagonal and symmetric triangular components.
Definition: Mat3.h:266
+
const Mat3< T > & operator-=(const Mat3< S > &m1)
Returns m0, where for .
Definition: Mat3.h:409
+
void setSkew(const Vec3< T > &v)
Set the matrix as cross product of the given vector.
Definition: Mat3.h:291
+
Definition: Exceptions.h:39
+
Tolerance for floating-point comparison.
Definition: Math.h:125
+
3x3 matrix class.
Definition: Mat3.h:54
+
T angle(const Vec2< T > &v1, const Vec2< T > &v2)
Definition: Vec2.h:446
+
const Mat3< T > & operator*=(S scalar)
Multiplication operator, e.g. M = scalar * M;.
Definition: Mat3.h:375
+
bool diagonalizeSymmetricMatrix(const Mat3< T > &input, Mat3< T > &Q, Vec3< T > &D, unsigned int MAX_ITERATIONS=250)
Use Jacobi iterations to decompose a symmetric 3x3 matrix (diagonalize and compute eigenvectors) ...
Definition: Mat3.h:803
+
OPENVDB_DEPRECATED void setBasis(const Vec3< T > &v1, const Vec3< T > &v2, const Vec3< T > &v3)
Set the rows of "this" matrix to the vectors v1, v2, v3.
Definition: Mat3.h:260
+
Mat3(const Mat3< Source > &m)
Conversion constructor.
Definition: Mat3.h:134
+
Mat3< T > outerProduct(const Vec3< T > &v1, const Vec3< T > &v2)
Definition: Mat3.h:704
+
Mat3(const Mat< 3, T > &m)
Copy constructor.
Definition: Mat3.h:123
+
void setIdentity()
Set "this" matrix to identity.
Definition: Mat3.h:320
+
Mat< 3, T > MyBase
Definition: Mat3.h:60
+
void setRow(int i, const Vec3< T > &v)
Set ith row to vector v.
Definition: Mat3.h:164
+
static const Mat3< T > & identity()
Predefined constant for identity matrix.
Definition: Mat3.h:154
+
Mat3 inverse(T tolerance=0) const
Definition: Mat3.h:509
+
Vec3< typename promote< T, MT >::type > operator*(const Mat3< MT > &_m, const Vec3< T > &_v)
Returns v, where for .
Definition: Mat3.h:669
+
void setCol(int j, const Vec3< T > &v)
Set jth column to vector v.
Definition: Mat3.h:182
+
Mat3()
Trivial constructor, the matrix is NOT initialized.
Definition: Mat3.h:62
+
MatType snapMatBasis(const MatType &source, Axis axis, const Vec3< typename MatType::value_type > &direction)
This function snaps a specific axis to a specific direction, preserving scaling.
Definition: Mat.h:730
+
T value_type
Data type held by the matrix.
Definition: Mat3.h:58
+
Mat3s Mat3f
Definition: Mat3.h:717
+
Axis
Definition: Math.h:838
+
MatType skew(const Vec3< typename MatType::value_type > &skew)
Return a matrix as the cross product of the given vector.
Definition: Mat.h:687
+
const T * asPointer() const
Definition: Mat3.h:209
+
void powSolve(const MatType &aA, MatType &aB, double aPower, double aTol=0.01)
Definition: Mat.h:810
+
const Mat3< T > & operator*=(const Mat3< S > &m1)
Returns m0, where for .
Definition: Mat3.h:427
+
bool eq(const Mat3 &m, T eps=1.0e-8) const
Test if "this" is equivalent to m with tolerance of eps value.
Definition: Mat3.h:345
+
Mat3 adjoint() const
returns adjoint of "this", i.e. the transpose of the cofactor of "this"
Definition: Mat3.h:482
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
Vec3< T > row(int i) const
Get ith row, e.g. Vec3d v = m.row(1);.
Definition: Mat3.h:175
+
Definition: Mat.h:52
+
Mat3 cofactor() const
Return the cofactor matrix of "this".
Definition: Mat3.h:467
+
Mat3 transpose() const
returns transpose of this
Definition: Mat3.h:498
+
Mat3 timesDiagonal(const Vec3< T > &diag) const
Definition: Mat3.h:565
+
void setToRotation(const Quat< T > &q)
Set this matrix to the rotation matrix specified by the quaternion.
Definition: Mat3.h:297
+ +
Mat3(const Vec3< Source > &v1, const Vec3< Source > &v2, const Vec3< Source > &v3, bool rows=true)
Definition: Mat3.h:95
+
Mat3 snapBasis(Axis axis, const Vec3< T > &direction)
Definition: Mat3.h:541
+
const Mat3< T > & operator+=(const Mat3< S > &m1)
Returns m0, where for .
Definition: Mat3.h:391
+
T * asPointer()
Definition: Mat3.h:208
+
Mat3< typename promote< T0, T1 >::type > operator+(const Mat3< T0 > &m0, const Mat3< T1 > &m1)
Returns M, where for .
Definition: Mat3.h:635
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/Mat4_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/Mat4_8h_source.html new file mode 100644 index 00000000..61d59d65 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/Mat4_8h_source.html @@ -0,0 +1,1492 @@ + + + + + + +OpenVDB: Mat4.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Mat4.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 
+
31 #ifndef OPENVDB_MATH_MAT4_H_HAS_BEEN_INCLUDED
+
32 #define OPENVDB_MATH_MAT4_H_HAS_BEEN_INCLUDED
+
33 
+
34 #include <openvdb/Exceptions.h>
+
35 #include <openvdb/Platform.h>
+
36 #include <iomanip>
+
37 #include <assert.h>
+
38 #include <math.h>
+
39 #include <algorithm>
+
40 #include "Math.h"
+
41 #include "Mat3.h"
+
42 #include "Vec3.h"
+
43 #include "Vec4.h"
+
44 
+
45 
+
46 namespace openvdb {
+ +
48 namespace OPENVDB_VERSION_NAME {
+
49 namespace math {
+
50 
+
51 template<typename T> class Vec4;
+
52 
+
53 
+
56 template<typename T>
+
57 class Mat4: public Mat<4, T>
+
58 {
+
59 public:
+
61  typedef T value_type;
+
62  typedef T ValueType;
+
63  typedef Mat<4, T> MyBase;
+
64 
+
66  Mat4() {}
+
67 
+
69 
+
75  template<typename Source>
+
76  Mat4(Source *a)
+
77  {
+
78  for (int i = 0; i < 16; i++) {
+
79  MyBase::mm[i] = a[i];
+
80  }
+
81  }
+
82 
+
84 
+
90  template<typename Source>
+
91  Mat4(Source a, Source b, Source c, Source d,
+
92  Source e, Source f, Source g, Source h,
+
93  Source i, Source j, Source k, Source l,
+
94  Source m, Source n, Source o, Source p)
+
95  {
+
96  MyBase::mm[ 0] = T(a);
+
97  MyBase::mm[ 1] = T(b);
+
98  MyBase::mm[ 2] = T(c);
+
99  MyBase::mm[ 3] = T(d);
+
100 
+
101  MyBase::mm[ 4] = T(e);
+
102  MyBase::mm[ 5] = T(f);
+
103  MyBase::mm[ 6] = T(g);
+
104  MyBase::mm[ 7] = T(h);
+
105 
+
106  MyBase::mm[ 8] = T(i);
+
107  MyBase::mm[ 9] = T(j);
+
108  MyBase::mm[10] = T(k);
+
109  MyBase::mm[11] = T(l);
+
110 
+
111  MyBase::mm[12] = T(m);
+
112  MyBase::mm[13] = T(n);
+
113  MyBase::mm[14] = T(o);
+
114  MyBase::mm[15] = T(p);
+
115  }
+
116 
+
119  template<typename Source>
+
120  Mat4(const Vec4<Source> &v1, const Vec4<Source> &v2,
+
121  const Vec4<Source> &v3, const Vec4<Source> &v4, bool rows = true)
+
122  {
+
123  if (rows) {
+
124  this->setRows(v1, v2, v3);
+
125  } else {
+
126  this->setColumns(v1, v2, v3);
+
127  }
+
128  }
+
129 
+
131  Mat4(const Mat<4, T> &m)
+
132  {
+
133  for (int i = 0; i < 4; ++i) {
+
134  for (int j = 0; j < 4; ++j) {
+
135  MyBase::mm[i*4 + j] = m[i][j];
+
136  }
+
137  }
+
138  }
+
139 
+
141  template<typename Source>
+
142  explicit Mat4(const Mat4<Source> &m)
+
143  {
+
144  const Source *src = m.asPointer();
+
145 
+
146  for (int i=0; i<16; ++i) {
+
147  MyBase::mm[i] = static_cast<T>(src[i]);
+
148  }
+
149  }
+
150 
+
152  static const Mat4<T>& identity() {
+
153  return sIdentity;
+
154  }
+
155 
+
157  static const Mat4<T>& zero() {
+
158  return sZero;
+
159  }
+
160 
+
162  void setRow(int i, const Vec4<T> &v)
+
163  {
+
164  // assert(i>=0 && i<4);
+
165  int i4 = i * 4;
+
166  MyBase::mm[i4+0] = v[0];
+
167  MyBase::mm[i4+1] = v[1];
+
168  MyBase::mm[i4+2] = v[2];
+
169  MyBase::mm[i4+3] = v[3];
+
170  }
+
171 
+
173  Vec4<T> row(int i) const
+
174  {
+
175  // assert(i>=0 && i<3);
+
176  return Vec4<T>((*this)(i,0), (*this)(i,1), (*this)(i,2), (*this)(i,3));
+
177  }
+
178 
+
180  void setCol(int j, const Vec4<T>& v)
+
181  {
+
182  // assert(j>=0 && j<4);
+
183  MyBase::mm[ 0+j] = v[0];
+
184  MyBase::mm[ 4+j] = v[1];
+
185  MyBase::mm[ 8+j] = v[2];
+
186  MyBase::mm[12+j] = v[3];
+
187  }
+
188 
+
190  Vec4<T> col(int j) const
+
191  {
+
192  // assert(j>=0 && j<4);
+
193  return Vec4<T>((*this)(0,j), (*this)(1,j), (*this)(2,j), (*this)(3,j));
+
194  }
+
195 
+
197  T* operator[](int i) { return &(MyBase::mm[i<<2]); }
+
200  const T* operator[](int i) const { return &(MyBase::mm[i<<2]); }
+
202 
+
204  T* asPointer() {return MyBase::mm;}
+
205  const T* asPointer() const {return MyBase::mm;}
+
206 
+
210  T& operator()(int i, int j)
+
211  {
+
212  // assert(i>=0 && i<4);
+
213  // assert(j>=0 && j<4);
+
214  return MyBase::mm[4*i+j];
+
215  }
+
216 
+
220  T operator()(int i, int j) const
+
221  {
+
222  // assert(i>=0 && i<4);
+
223  // assert(j>=0 && j<4);
+
224  return MyBase::mm[4*i+j];
+
225  }
+
226 
+
228  void setRows(const Vec4<T> &v1, const Vec4<T> &v2,
+
229  const Vec4<T> &v3, const Vec4<T> &v4)
+
230  {
+
231  MyBase::mm[ 0] = v1[0];
+
232  MyBase::mm[ 1] = v1[1];
+
233  MyBase::mm[ 2] = v1[2];
+
234  MyBase::mm[ 3] = v1[3];
+
235 
+
236  MyBase::mm[ 4] = v2[0];
+
237  MyBase::mm[ 5] = v2[1];
+
238  MyBase::mm[ 6] = v2[2];
+
239  MyBase::mm[ 7] = v2[3];
+
240 
+
241  MyBase::mm[ 8] = v3[0];
+
242  MyBase::mm[ 9] = v3[1];
+
243  MyBase::mm[10] = v3[2];
+
244  MyBase::mm[11] = v3[3];
+
245 
+
246  MyBase::mm[12] = v4[0];
+
247  MyBase::mm[13] = v4[1];
+
248  MyBase::mm[14] = v4[2];
+
249  MyBase::mm[15] = v4[3];
+
250  }
+
251 
+
253  void setColumns(const Vec4<T> &v1, const Vec4<T> &v2,
+
254  const Vec4<T> &v3, const Vec4<T> &v4)
+
255  {
+
256  MyBase::mm[ 0] = v1[0];
+
257  MyBase::mm[ 1] = v2[0];
+
258  MyBase::mm[ 2] = v3[0];
+
259  MyBase::mm[ 3] = v4[0];
+
260 
+
261  MyBase::mm[ 4] = v1[1];
+
262  MyBase::mm[ 5] = v2[1];
+
263  MyBase::mm[ 6] = v3[1];
+
264  MyBase::mm[ 7] = v4[1];
+
265 
+
266  MyBase::mm[ 8] = v1[2];
+
267  MyBase::mm[ 9] = v2[2];
+
268  MyBase::mm[10] = v3[2];
+
269  MyBase::mm[11] = v4[2];
+
270 
+
271  MyBase::mm[12] = v1[3];
+
272  MyBase::mm[13] = v2[3];
+
273  MyBase::mm[14] = v3[3];
+
274  MyBase::mm[15] = v4[3];
+
275  }
+
276 
+
278  OPENVDB_DEPRECATED void setBasis(const Vec4<T> &v1, const Vec4<T> &v2,
+
279  const Vec4<T> &v3, const Vec4<T> &v4)
+
280  {
+
281  this->setRows(v1, v2, v3, v4);
+
282  }
+
283 
+
284 
+
285  // Set "this" matrix to zero
+
286  void setZero()
+
287  {
+
288  MyBase::mm[ 0] = 0;
+
289  MyBase::mm[ 1] = 0;
+
290  MyBase::mm[ 2] = 0;
+
291  MyBase::mm[ 3] = 0;
+
292  MyBase::mm[ 4] = 0;
+
293  MyBase::mm[ 5] = 0;
+
294  MyBase::mm[ 6] = 0;
+
295  MyBase::mm[ 7] = 0;
+
296  MyBase::mm[ 8] = 0;
+
297  MyBase::mm[ 9] = 0;
+
298  MyBase::mm[10] = 0;
+
299  MyBase::mm[11] = 0;
+
300  MyBase::mm[12] = 0;
+
301  MyBase::mm[13] = 0;
+
302  MyBase::mm[14] = 0;
+
303  MyBase::mm[15] = 0;
+
304  }
+
305 
+
307  void setIdentity()
+
308  {
+
309  MyBase::mm[ 0] = 1;
+
310  MyBase::mm[ 1] = 0;
+
311  MyBase::mm[ 2] = 0;
+
312  MyBase::mm[ 3] = 0;
+
313 
+
314  MyBase::mm[ 4] = 0;
+
315  MyBase::mm[ 5] = 1;
+
316  MyBase::mm[ 6] = 0;
+
317  MyBase::mm[ 7] = 0;
+
318 
+
319  MyBase::mm[ 8] = 0;
+
320  MyBase::mm[ 9] = 0;
+
321  MyBase::mm[10] = 1;
+
322  MyBase::mm[11] = 0;
+
323 
+
324  MyBase::mm[12] = 0;
+
325  MyBase::mm[13] = 0;
+
326  MyBase::mm[14] = 0;
+
327  MyBase::mm[15] = 1;
+
328  }
+
329 
+
330 
+
332  void setMat3(const Mat3<T> &m)
+
333  {
+
334  for (int i = 0; i < 3; i++)
+
335  for (int j=0; j < 3; j++)
+
336  MyBase::mm[i*4+j] = m[i][j];
+
337  }
+
338 
+
339  Mat3<T> getMat3() const
+
340  {
+
341  Mat3<T> m;
+
342 
+
343  for (int i = 0; i < 3; i++)
+
344  for (int j = 0; j < 3; j++)
+
345  m[i][j] = MyBase::mm[i*4+j];
+
346 
+
347  return m;
+
348  }
+
349 
+ +
352  {
+
353  return Vec3<T>(MyBase::mm[12], MyBase::mm[13], MyBase::mm[14]);
+
354  }
+
355 
+
356  void setTranslation(const Vec3<T> &t)
+
357  {
+
358  MyBase::mm[12] = t[0];
+
359  MyBase::mm[13] = t[1];
+
360  MyBase::mm[14] = t[2];
+
361  }
+
362 
+
364  template<typename Source>
+
365  const Mat4& operator=(const Mat4<Source> &m)
+
366  {
+
367  const Source *src = m.asPointer();
+
368 
+
369  // don't suppress warnings when assigning from different numerical types
+
370  std::copy(src, (src + this->numElements()), MyBase::mm);
+
371  return *this;
+
372  }
+
373 
+
375  bool eq(const Mat4 &m, T eps=1.0e-8) const
+
376  {
+
377  for (int i = 0; i < 16; i++) {
+
378  if (!isApproxEqual(MyBase::mm[i], m.mm[i], eps))
+
379  return false;
+
380  }
+
381  return true;
+
382  }
+
383 
+ +
386  {
+
387  return Mat4<T>(
+
388  -MyBase::mm[ 0], -MyBase::mm[ 1], -MyBase::mm[ 2], -MyBase::mm[ 3],
+
389  -MyBase::mm[ 4], -MyBase::mm[ 5], -MyBase::mm[ 6], -MyBase::mm[ 7],
+
390  -MyBase::mm[ 8], -MyBase::mm[ 9], -MyBase::mm[10], -MyBase::mm[11],
+
391  -MyBase::mm[12], -MyBase::mm[13], -MyBase::mm[14], -MyBase::mm[15]
+
392  );
+
393  } // trivial
+
394 
+
396  template <typename S>
+
397  const Mat4<T>& operator*=(S scalar)
+
398  {
+
399  MyBase::mm[ 0] *= scalar;
+
400  MyBase::mm[ 1] *= scalar;
+
401  MyBase::mm[ 2] *= scalar;
+
402  MyBase::mm[ 3] *= scalar;
+
403 
+
404  MyBase::mm[ 4] *= scalar;
+
405  MyBase::mm[ 5] *= scalar;
+
406  MyBase::mm[ 6] *= scalar;
+
407  MyBase::mm[ 7] *= scalar;
+
408 
+
409  MyBase::mm[ 8] *= scalar;
+
410  MyBase::mm[ 9] *= scalar;
+
411  MyBase::mm[10] *= scalar;
+
412  MyBase::mm[11] *= scalar;
+
413 
+
414  MyBase::mm[12] *= scalar;
+
415  MyBase::mm[13] *= scalar;
+
416  MyBase::mm[14] *= scalar;
+
417  MyBase::mm[15] *= scalar;
+
418  return *this;
+
419  }
+
420 
+
422  template <typename S>
+
423  const Mat4<T> &operator+=(const Mat4<S> &m1)
+
424  {
+
425  const S* s = m1.asPointer();
+
426 
+
427  MyBase::mm[ 0] += s[ 0];
+
428  MyBase::mm[ 1] += s[ 1];
+
429  MyBase::mm[ 2] += s[ 2];
+
430  MyBase::mm[ 3] += s[ 3];
+
431 
+
432  MyBase::mm[ 4] += s[ 4];
+
433  MyBase::mm[ 5] += s[ 5];
+
434  MyBase::mm[ 6] += s[ 6];
+
435  MyBase::mm[ 7] += s[ 7];
+
436 
+
437  MyBase::mm[ 8] += s[ 8];
+
438  MyBase::mm[ 9] += s[ 9];
+
439  MyBase::mm[10] += s[10];
+
440  MyBase::mm[11] += s[11];
+
441 
+
442  MyBase::mm[12] += s[12];
+
443  MyBase::mm[13] += s[13];
+
444  MyBase::mm[14] += s[14];
+
445  MyBase::mm[15] += s[15];
+
446 
+
447  return *this;
+
448  }
+
449 
+
451  template <typename S>
+
452  const Mat4<T> &operator-=(const Mat4<S> &m1)
+
453  {
+
454  const S* s = m1.asPointer();
+
455 
+
456  MyBase::mm[ 0] -= s[ 0];
+
457  MyBase::mm[ 1] -= s[ 1];
+
458  MyBase::mm[ 2] -= s[ 2];
+
459  MyBase::mm[ 3] -= s[ 3];
+
460 
+
461  MyBase::mm[ 4] -= s[ 4];
+
462  MyBase::mm[ 5] -= s[ 5];
+
463  MyBase::mm[ 6] -= s[ 6];
+
464  MyBase::mm[ 7] -= s[ 7];
+
465 
+
466  MyBase::mm[ 8] -= s[ 8];
+
467  MyBase::mm[ 9] -= s[ 9];
+
468  MyBase::mm[10] -= s[10];
+
469  MyBase::mm[11] -= s[11];
+
470 
+
471  MyBase::mm[12] -= s[12];
+
472  MyBase::mm[13] -= s[13];
+
473  MyBase::mm[14] -= s[14];
+
474  MyBase::mm[15] -= s[15];
+
475 
+
476  return *this;
+
477  }
+
478 
+
480  template <typename S>
+
481  const Mat4<T> &operator*=(const Mat4<S> &m1)
+
482  {
+
483  Mat4<T> m0(*this);
+
484 
+
485  const T* s0 = m0.asPointer();
+
486  const S* s1 = m1.asPointer();
+
487 
+
488  for (int i = 0; i < 4; i++) {
+
489  int i4 = 4 * i;
+
490  MyBase::mm[i4+0] = static_cast<T>(s0[i4+0] * s1[ 0] +
+
491  s0[i4+1] * s1[ 4] +
+
492  s0[i4+2] * s1[ 8] +
+
493  s0[i4+3] * s1[12]);
+
494 
+
495  MyBase::mm[i4+1] = static_cast<T>(s0[i4+0] * s1[ 1] +
+
496  s0[i4+1] * s1[ 5] +
+
497  s0[i4+2] * s1[ 9] +
+
498  s0[i4+3] * s1[13]);
+
499 
+
500  MyBase::mm[i4+2] = static_cast<T>(s0[i4+0] * s1[ 2] +
+
501  s0[i4+1] * s1[ 6] +
+
502  s0[i4+2] * s1[10] +
+
503  s0[i4+3] * s1[14]);
+
504 
+
505  MyBase::mm[i4+3] = static_cast<T>(s0[i4+0] * s1[ 3] +
+
506  s0[i4+1] * s1[ 7] +
+
507  s0[i4+2] * s1[11] +
+
508  s0[i4+3] * s1[15]);
+
509  }
+
510  return *this;
+
511  }
+
512 
+
514  Mat4 transpose() const
+
515  {
+
516  return Mat4<T>(
+
517  MyBase::mm[ 0], MyBase::mm[ 4], MyBase::mm[ 8], MyBase::mm[12],
+
518  MyBase::mm[ 1], MyBase::mm[ 5], MyBase::mm[ 9], MyBase::mm[13],
+
519  MyBase::mm[ 2], MyBase::mm[ 6], MyBase::mm[10], MyBase::mm[14],
+
520  MyBase::mm[ 3], MyBase::mm[ 7], MyBase::mm[11], MyBase::mm[15]
+
521  );
+
522  }
+
523 
+
524 
+
527  Mat4 inverse(T tolerance = 0) const
+
528  {
+
529  //
+
530  // inv [ A | b ] = [ E | f ] A: 3x3, b: 3x1, c': 1x3 d: 1x1
+
531  // [ c' | d ] [ g' | h ]
+
532  //
+
533  // If A is invertible use
+
534  //
+
535  // E = A^-1 + p*h*r
+
536  // p = A^-1 * b
+
537  // f = -p * h
+
538  // g' = -h * c'
+
539  // h = 1 / (d - c'*p)
+
540  // r' = c'*A^-1
+
541  //
+
542  // Otherwise use gauss-jordan elimination
+
543  //
+
544 
+
545  //
+
546  // We create this alias to ourself so we can easily use own subscript
+
547  // operator.
+
548  const Mat4<T>& m(*this);
+
549 
+
550  T m0011 = m[0][0] * m[1][1];
+
551  T m0012 = m[0][0] * m[1][2];
+
552  T m0110 = m[0][1] * m[1][0];
+
553  T m0210 = m[0][2] * m[1][0];
+
554  T m0120 = m[0][1] * m[2][0];
+
555  T m0220 = m[0][2] * m[2][0];
+
556 
+
557  T detA = m0011 * m[2][2] - m0012 * m[2][1] - m0110 * m[2][2]
+
558  + m0210 * m[2][1] + m0120 * m[1][2] - m0220 * m[1][1];
+
559 
+
560  bool hasPerspective =
+
561  (!isExactlyEqual(m[0][3], T(0.0)) ||
+
562  !isExactlyEqual(m[1][3], T(0.0)) ||
+
563  !isExactlyEqual(m[2][3], T(0.0)) ||
+
564  !isExactlyEqual(m[3][3], T(1.0)));
+
565 
+
566  T det;
+
567  if (hasPerspective) {
+
568  det = m[0][3] * det3(m, 1,2,3, 0,2,1)
+
569  + m[1][3] * det3(m, 2,0,3, 0,2,1)
+
570  + m[2][3] * det3(m, 3,0,1, 0,2,1)
+
571  + m[3][3] * detA;
+
572  } else {
+
573  det = detA * m[3][3];
+
574  }
+
575 
+
576  Mat4<T> inv;
+
577  bool invertible;
+
578 
+
579  if (isApproxEqual(det,T(0.0),tolerance)) {
+
580  invertible = false;
+
581 
+
582  } else if (isApproxEqual(detA,T(0.0),T(1e-8))) {
+
583  // det is too small to rely on inversion by subblocks
+
584  invertible = m.invert(inv, tolerance);
+
585 
+
586  } else {
+
587  invertible = true;
+
588  detA = 1.0 / detA;
+
589 
+
590  //
+
591  // Calculate A^-1
+
592  //
+
593  inv[0][0] = detA * ( m[1][1] * m[2][2] - m[1][2] * m[2][1]);
+
594  inv[0][1] = detA * (-m[0][1] * m[2][2] + m[0][2] * m[2][1]);
+
595  inv[0][2] = detA * ( m[0][1] * m[1][2] - m[0][2] * m[1][1]);
+
596 
+
597  inv[1][0] = detA * (-m[1][0] * m[2][2] + m[1][2] * m[2][0]);
+
598  inv[1][1] = detA * ( m[0][0] * m[2][2] - m0220);
+
599  inv[1][2] = detA * ( m0210 - m0012);
+
600 
+
601  inv[2][0] = detA * ( m[1][0] * m[2][1] - m[1][1] * m[2][0]);
+
602  inv[2][1] = detA * ( m0120 - m[0][0] * m[2][1]);
+
603  inv[2][2] = detA * ( m0011 - m0110);
+
604 
+
605  if (hasPerspective) {
+
606  //
+
607  // Calculate r, p, and h
+
608  //
+
609  Vec3<T> r;
+
610  r[0] = m[3][0] * inv[0][0] + m[3][1] * inv[1][0]
+
611  + m[3][2] * inv[2][0];
+
612  r[1] = m[3][0] * inv[0][1] + m[3][1] * inv[1][1]
+
613  + m[3][2] * inv[2][1];
+
614  r[2] = m[3][0] * inv[0][2] + m[3][1] * inv[1][2]
+
615  + m[3][2] * inv[2][2];
+
616 
+
617  Vec3<T> p;
+
618  p[0] = inv[0][0] * m[0][3] + inv[0][1] * m[1][3]
+
619  + inv[0][2] * m[2][3];
+
620  p[1] = inv[1][0] * m[0][3] + inv[1][1] * m[1][3]
+
621  + inv[1][2] * m[2][3];
+
622  p[2] = inv[2][0] * m[0][3] + inv[2][1] * m[1][3]
+
623  + inv[2][2] * m[2][3];
+
624 
+
625  T h = m[3][3] - p.dot(Vec3<T>(m[3][0],m[3][1],m[3][2]));
+
626  if (isApproxEqual(h,T(0.0),tolerance)) {
+
627  invertible = false;
+
628 
+
629  } else {
+
630  h = 1.0 / h;
+
631 
+
632  //
+
633  // Calculate h, g, and f
+
634  //
+
635  inv[3][3] = h;
+
636  inv[3][0] = -h * r[0];
+
637  inv[3][1] = -h * r[1];
+
638  inv[3][2] = -h * r[2];
+
639 
+
640  inv[0][3] = -h * p[0];
+
641  inv[1][3] = -h * p[1];
+
642  inv[2][3] = -h * p[2];
+
643 
+
644  //
+
645  // Calculate E
+
646  //
+
647  p *= h;
+
648  inv[0][0] += p[0] * r[0];
+
649  inv[0][1] += p[0] * r[1];
+
650  inv[0][2] += p[0] * r[2];
+
651  inv[1][0] += p[1] * r[0];
+
652  inv[1][1] += p[1] * r[1];
+
653  inv[1][2] += p[1] * r[2];
+
654  inv[2][0] += p[2] * r[0];
+
655  inv[2][1] += p[2] * r[1];
+
656  inv[2][2] += p[2] * r[2];
+
657  }
+
658  } else {
+
659  // Equations are much simpler in the non-perspective case
+
660  inv[3][0] = - (m[3][0] * inv[0][0] + m[3][1] * inv[1][0]
+
661  + m[3][2] * inv[2][0]);
+
662  inv[3][1] = - (m[3][0] * inv[0][1] + m[3][1] * inv[1][1]
+
663  + m[3][2] * inv[2][1]);
+
664  inv[3][2] = - (m[3][0] * inv[0][2] + m[3][1] * inv[1][2]
+
665  + m[3][2] * inv[2][2]);
+
666  inv[0][3] = 0.0;
+
667  inv[1][3] = 0.0;
+
668  inv[2][3] = 0.0;
+
669  inv[3][3] = 1.0;
+
670  }
+
671  }
+
672 
+
673  if (!invertible) OPENVDB_THROW(ArithmeticError, "Inversion of singular 4x4 matrix");
+
674  return inv;
+
675  }
+
676 
+
677 
+
679  T det() const
+
680  {
+
681  const T *ap;
+
682  Mat3<T> submat;
+
683  T det;
+
684  T *sp;
+
685  int i, j, k, sign;
+
686 
+
687  det = 0;
+
688  sign = 1;
+
689  for (i = 0; i < 4; i++) {
+
690  ap = &MyBase::mm[ 0];
+
691  sp = submat.asPointer();
+
692  for (j = 0; j < 4; j++) {
+
693  for (k = 0; k < 4; k++) {
+
694  if ((k != i) && (j != 0)) {
+
695  *sp++ = *ap;
+
696  }
+
697  ap++;
+
698  }
+
699  }
+
700 
+
701  det += sign * MyBase::mm[i] * submat.det();
+
702  sign = -sign;
+
703  }
+
704 
+
705  return det;
+
706  }
+
707 
+
709  static Mat4 translation(const Vec3d& v)
+
710  {
+
711  return Mat4(
+
712  T(1), T(0), T(0), T(0),
+
713  T(0), T(1), T(0), T(0),
+
714  T(0), T(0), T(1), T(0),
+
715  T(v.x()), T(v.y()),T(v.z()), T(1));
+
716  }
+
717 
+
719  template <typename T0>
+
720  void setToTranslation(const Vec3<T0>& v)
+
721  {
+
722  MyBase::mm[ 0] = 1;
+
723  MyBase::mm[ 1] = 0;
+
724  MyBase::mm[ 2] = 0;
+
725  MyBase::mm[ 3] = 0;
+
726 
+
727  MyBase::mm[ 4] = 0;
+
728  MyBase::mm[ 5] = 1;
+
729  MyBase::mm[ 6] = 0;
+
730  MyBase::mm[ 7] = 0;
+
731 
+
732  MyBase::mm[ 8] = 0;
+
733  MyBase::mm[ 9] = 0;
+
734  MyBase::mm[10] = 1;
+
735  MyBase::mm[11] = 0;
+
736 
+
737  MyBase::mm[12] = v.x();
+
738  MyBase::mm[13] = v.y();
+
739  MyBase::mm[14] = v.z();
+
740  MyBase::mm[15] = 1;
+
741  }
+
742 
+
744  template <typename T0>
+
745  void preTranslate(const Vec3<T0>& tr)
+
746  {
+
747  Vec3<T> tmp(tr.x(), tr.y(), tr.z());
+
748  Mat4<T> Tr = Mat4<T>::translation(tmp);
+
749 
+
750  *this = Tr * (*this);
+
751 
+
752  }
+
753 
+
755  template <typename T0>
+
756  void postTranslate(const Vec3<T0>& tr)
+
757  {
+
758  Vec3<T> tmp(tr.x(), tr.y(), tr.z());
+
759  Mat4<T> Tr = Mat4<T>::translation(tmp);
+
760 
+
761  *this = (*this) * Tr;
+
762 
+
763  }
+
764 
+
765 
+
767  template <typename T0>
+
768  void setToScale(const Vec3<T0>& v)
+
769  {
+
770  this->setIdentity();
+
771  MyBase::mm[ 0] = v.x();
+
772  MyBase::mm[ 5] = v.y();
+
773  MyBase::mm[10] = v.z();
+
774  }
+
775 
+
776  // Left multiples by the specified scale matrix, i.e. Sc * (*this)
+
777  template <typename T0>
+
778  void preScale(const Vec3<T0>& v)
+
779  {
+
780  MyBase::mm[ 0] *= v.x();
+
781  MyBase::mm[ 1] *= v.x();
+
782  MyBase::mm[ 2] *= v.x();
+
783  MyBase::mm[ 3] *= v.x();
+
784 
+
785  MyBase::mm[ 4] *= v.y();
+
786  MyBase::mm[ 5] *= v.y();
+
787  MyBase::mm[ 6] *= v.y();
+
788  MyBase::mm[ 7] *= v.y();
+
789 
+
790  MyBase::mm[ 8] *= v.z();
+
791  MyBase::mm[ 9] *= v.z();
+
792  MyBase::mm[10] *= v.z();
+
793  MyBase::mm[11] *= v.z();
+
794  }
+
795 
+
796 
+
797 
+
798  // Right multiples by the specified scale matrix, i.e. (*this) * Sc
+
799  template <typename T0>
+
800  void postScale(const Vec3<T0>& v)
+
801  {
+
802 
+
803  MyBase::mm[ 0] *= v.x();
+
804  MyBase::mm[ 1] *= v.y();
+
805  MyBase::mm[ 2] *= v.z();
+
806 
+
807  MyBase::mm[ 4] *= v.x();
+
808  MyBase::mm[ 5] *= v.y();
+
809  MyBase::mm[ 6] *= v.z();
+
810 
+
811  MyBase::mm[ 8] *= v.x();
+
812  MyBase::mm[ 9] *= v.y();
+
813  MyBase::mm[10] *= v.z();
+
814 
+
815  MyBase::mm[12] *= v.x();
+
816  MyBase::mm[13] *= v.y();
+
817  MyBase::mm[14] *= v.z();
+
818 
+
819  }
+
820 
+
821 
+
825  void setToRotation(Axis axis, T angle) {*this = rotation<Mat4<T> >(axis, angle);}
+
826 
+
830  void setToRotation(const Vec3<T>& axis, T angle) {*this = rotation<Mat4<T> >(axis, angle);}
+
831 
+
834  void setToRotation(const Vec3<T>& v1, const Vec3<T>& v2) {*this = rotation<Mat4<T> >(v1, v2);}
+
835 
+
836 
+
840  void preRotate(Axis axis, T angle)
+
841  {
+
842  T c = static_cast<T>(cos(angle));
+
843  T s = -static_cast<T>(sin(angle)); // the "-" makes it clockwise
+
844 
+
845  switch (axis) {
+
846  case X_AXIS:
+
847  {
+
848  T a4, a5, a6, a7;
+
849 
+
850  a4 = c * MyBase::mm[ 4] - s * MyBase::mm[ 8];
+
851  a5 = c * MyBase::mm[ 5] - s * MyBase::mm[ 9];
+
852  a6 = c * MyBase::mm[ 6] - s * MyBase::mm[10];
+
853  a7 = c * MyBase::mm[ 7] - s * MyBase::mm[11];
+
854 
+
855 
+
856  MyBase::mm[ 8] = s * MyBase::mm[ 4] + c * MyBase::mm[ 8];
+
857  MyBase::mm[ 9] = s * MyBase::mm[ 5] + c * MyBase::mm[ 9];
+
858  MyBase::mm[10] = s * MyBase::mm[ 6] + c * MyBase::mm[10];
+
859  MyBase::mm[11] = s * MyBase::mm[ 7] + c * MyBase::mm[11];
+
860 
+
861  MyBase::mm[ 4] = a4;
+
862  MyBase::mm[ 5] = a5;
+
863  MyBase::mm[ 6] = a6;
+
864  MyBase::mm[ 7] = a7;
+
865  }
+
866  break;
+
867 
+
868  case Y_AXIS:
+
869  {
+
870  T a0, a1, a2, a3;
+
871 
+
872  a0 = c * MyBase::mm[ 0] + s * MyBase::mm[ 8];
+
873  a1 = c * MyBase::mm[ 1] + s * MyBase::mm[ 9];
+
874  a2 = c * MyBase::mm[ 2] + s * MyBase::mm[10];
+
875  a3 = c * MyBase::mm[ 3] + s * MyBase::mm[11];
+
876 
+
877  MyBase::mm[ 8] = -s * MyBase::mm[ 0] + c * MyBase::mm[ 8];
+
878  MyBase::mm[ 9] = -s * MyBase::mm[ 1] + c * MyBase::mm[ 9];
+
879  MyBase::mm[10] = -s * MyBase::mm[ 2] + c * MyBase::mm[10];
+
880  MyBase::mm[11] = -s * MyBase::mm[ 3] + c * MyBase::mm[11];
+
881 
+
882 
+
883  MyBase::mm[ 0] = a0;
+
884  MyBase::mm[ 1] = a1;
+
885  MyBase::mm[ 2] = a2;
+
886  MyBase::mm[ 3] = a3;
+
887  }
+
888  break;
+
889 
+
890  case Z_AXIS:
+
891  {
+
892  T a0, a1, a2, a3;
+
893 
+
894  a0 = c * MyBase::mm[ 0] - s * MyBase::mm[ 4];
+
895  a1 = c * MyBase::mm[ 1] - s * MyBase::mm[ 5];
+
896  a2 = c * MyBase::mm[ 2] - s * MyBase::mm[ 6];
+
897  a3 = c * MyBase::mm[ 3] - s * MyBase::mm[ 7];
+
898 
+
899  MyBase::mm[ 4] = s * MyBase::mm[ 0] + c * MyBase::mm[ 4];
+
900  MyBase::mm[ 5] = s * MyBase::mm[ 1] + c * MyBase::mm[ 5];
+
901  MyBase::mm[ 6] = s * MyBase::mm[ 2] + c * MyBase::mm[ 6];
+
902  MyBase::mm[ 7] = s * MyBase::mm[ 3] + c * MyBase::mm[ 7];
+
903 
+
904  MyBase::mm[ 0] = a0;
+
905  MyBase::mm[ 1] = a1;
+
906  MyBase::mm[ 2] = a2;
+
907  MyBase::mm[ 3] = a3;
+
908  }
+
909  break;
+
910 
+
911  default:
+
912  assert(axis==X_AXIS || axis==Y_AXIS || axis==Z_AXIS);
+
913  }
+
914  }
+
915 
+
916 
+
920  void postRotate(Axis axis, T angle)
+
921  {
+
922  T c = static_cast<T>(cos(angle));
+
923  T s = -static_cast<T>(sin(angle)); // the "-" makes it clockwise
+
924 
+
925 
+
926 
+
927  switch (axis) {
+
928  case X_AXIS:
+
929  {
+
930  T a2, a6, a10, a14;
+
931 
+
932  a2 = c * MyBase::mm[ 2] - s * MyBase::mm[ 1];
+
933  a6 = c * MyBase::mm[ 6] - s * MyBase::mm[ 5];
+
934  a10 = c * MyBase::mm[10] - s * MyBase::mm[ 9];
+
935  a14 = c * MyBase::mm[14] - s * MyBase::mm[13];
+
936 
+
937 
+
938  MyBase::mm[ 1] = c * MyBase::mm[ 1] + s * MyBase::mm[ 2];
+
939  MyBase::mm[ 5] = c * MyBase::mm[ 5] + s * MyBase::mm[ 6];
+
940  MyBase::mm[ 9] = c * MyBase::mm[ 9] + s * MyBase::mm[10];
+
941  MyBase::mm[13] = c * MyBase::mm[13] + s * MyBase::mm[14];
+
942 
+
943  MyBase::mm[ 2] = a2;
+
944  MyBase::mm[ 6] = a6;
+
945  MyBase::mm[10] = a10;
+
946  MyBase::mm[14] = a14;
+
947  }
+
948  break;
+
949 
+
950  case Y_AXIS:
+
951  {
+
952  T a2, a6, a10, a14;
+
953 
+
954  a2 = c * MyBase::mm[ 2] + s * MyBase::mm[ 0];
+
955  a6 = c * MyBase::mm[ 6] + s * MyBase::mm[ 4];
+
956  a10 = c * MyBase::mm[10] + s * MyBase::mm[ 8];
+
957  a14 = c * MyBase::mm[14] + s * MyBase::mm[12];
+
958 
+
959  MyBase::mm[ 0] = c * MyBase::mm[ 0] - s * MyBase::mm[ 2];
+
960  MyBase::mm[ 4] = c * MyBase::mm[ 4] - s * MyBase::mm[ 6];
+
961  MyBase::mm[ 8] = c * MyBase::mm[ 8] - s * MyBase::mm[10];
+
962  MyBase::mm[12] = c * MyBase::mm[12] - s * MyBase::mm[14];
+
963 
+
964  MyBase::mm[ 2] = a2;
+
965  MyBase::mm[ 6] = a6;
+
966  MyBase::mm[10] = a10;
+
967  MyBase::mm[14] = a14;
+
968  }
+
969  break;
+
970 
+
971  case Z_AXIS:
+
972  {
+
973  T a1, a5, a9, a13;
+
974 
+
975  a1 = c * MyBase::mm[ 1] - s * MyBase::mm[ 0];
+
976  a5 = c * MyBase::mm[ 5] - s * MyBase::mm[ 4];
+
977  a9 = c * MyBase::mm[ 9] - s * MyBase::mm[ 8];
+
978  a13 = c * MyBase::mm[13] - s * MyBase::mm[12];
+
979 
+
980  MyBase::mm[ 0] = c * MyBase::mm[ 0] + s * MyBase::mm[ 1];
+
981  MyBase::mm[ 4] = c * MyBase::mm[ 4] + s * MyBase::mm[ 5];
+
982  MyBase::mm[ 8] = c * MyBase::mm[ 8] + s * MyBase::mm[ 9];
+
983  MyBase::mm[12] = c * MyBase::mm[12] + s * MyBase::mm[13];
+
984 
+
985  MyBase::mm[ 1] = a1;
+
986  MyBase::mm[ 5] = a5;
+
987  MyBase::mm[ 9] = a9;
+
988  MyBase::mm[13] = a13;
+
989 
+
990  }
+
991  break;
+
992 
+
993  default:
+
994  assert(axis==X_AXIS || axis==Y_AXIS || axis==Z_AXIS);
+
995  }
+
996  }
+
997 
+
1002  void setToShear(Axis axis0, Axis axis1, T shearby)
+
1003  {
+
1004  *this = shear<Mat4<T> >(axis0, axis1, shearby);
+
1005  }
+
1006 
+
1007 
+
1010  void preShear(Axis axis0, Axis axis1, T shear)
+
1011  {
+
1012  int index0 = static_cast<int>(axis0);
+
1013  int index1 = static_cast<int>(axis1);
+
1014 
+
1015  // to row "index1" add a multiple of the index0 row
+
1016  MyBase::mm[index1 * 4 + 0] += shear * MyBase::mm[index0 * 4 + 0];
+
1017  MyBase::mm[index1 * 4 + 1] += shear * MyBase::mm[index0 * 4 + 1];
+
1018  MyBase::mm[index1 * 4 + 2] += shear * MyBase::mm[index0 * 4 + 2];
+
1019  MyBase::mm[index1 * 4 + 3] += shear * MyBase::mm[index0 * 4 + 3];
+
1020  }
+
1021 
+
1022 
+
1025  void postShear(Axis axis0, Axis axis1, T shear)
+
1026  {
+
1027  int index0 = static_cast<int>(axis0);
+
1028  int index1 = static_cast<int>(axis1);
+
1029 
+
1030  // to collumn "index0" add a multiple of the index1 row
+
1031  MyBase::mm[index0 + 0] += shear * MyBase::mm[index1 + 0];
+
1032  MyBase::mm[index0 + 4] += shear * MyBase::mm[index1 + 4];
+
1033  MyBase::mm[index0 + 8] += shear * MyBase::mm[index1 + 8];
+
1034  MyBase::mm[index0 + 12] += shear * MyBase::mm[index1 + 12];
+
1035 
+
1036  }
+
1037 
+
1039  template<typename T0>
+
1040  Vec4<T0> transform(const Vec4<T0> &v) const
+
1041  {
+
1042  return static_cast< Vec4<T0> >(v * *this);
+
1043  }
+
1044 
+
1046  template<typename T0>
+
1047  Vec3<T0> transform(const Vec3<T0> &v) const
+
1048  {
+
1049  return static_cast< Vec3<T0> >(v * *this);
+
1050  }
+
1051 
+
1053  template<typename T0>
+ +
1055  {
+
1056  return static_cast< Vec4<T0> >(*this * v);
+
1057  }
+
1058 
+
1060  template<typename T0>
+ +
1062  {
+
1063  return static_cast< Vec3<T0> >(*this * v);
+
1064  }
+
1065 
+
1067  template<typename T0>
+
1068  Vec3<T0> transformH(const Vec3<T0> &p) const
+
1069  {
+
1070  T0 w;
+
1071 
+
1072  // w = p * (*this).col(3);
+
1073  w = static_cast<T0>(p[0] * MyBase::mm[ 3] + p[1] * MyBase::mm[ 7]
+
1074  + p[2] * MyBase::mm[11] + MyBase::mm[15]);
+
1075 
+
1076  if ( !isExactlyEqual(w , 0.0) ) {
+
1077  return Vec3<T0>(static_cast<T0>((p[0] * MyBase::mm[ 0] + p[1] * MyBase::mm[ 4] +
+
1078  p[2] * MyBase::mm[ 8] + MyBase::mm[12]) / w),
+
1079  static_cast<T0>((p[0] * MyBase::mm[ 1] + p[1] * MyBase::mm[ 5] +
+
1080  p[2] * MyBase::mm[ 9] + MyBase::mm[13]) / w),
+
1081  static_cast<T0>((p[0] * MyBase::mm[ 2] + p[1] * MyBase::mm[ 6] +
+
1082  p[2] * MyBase::mm[10] + MyBase::mm[14]) / w));
+
1083  }
+
1084 
+
1085  return Vec3<T0>(0, 0, 0);
+
1086  }
+
1087 
+
1089  template<typename T0>
+ +
1091  {
+
1092  T0 w;
+
1093 
+
1094  // w = p * (*this).col(3);
+
1095  w = p[0] * MyBase::mm[12] + p[1] * MyBase::mm[13] + p[2] * MyBase::mm[14] + MyBase::mm[15];
+
1096 
+
1097  if ( !isExactlyEqual(w , 0.0) ) {
+
1098  return Vec3<T0>(static_cast<T0>((p[0] * MyBase::mm[ 0] + p[1] * MyBase::mm[ 1] +
+
1099  p[2] * MyBase::mm[ 2] + MyBase::mm[ 3]) / w),
+
1100  static_cast<T0>((p[0] * MyBase::mm[ 4] + p[1] * MyBase::mm[ 5] +
+
1101  p[2] * MyBase::mm[ 6] + MyBase::mm[ 7]) / w),
+
1102  static_cast<T0>((p[0] * MyBase::mm[ 8] + p[1] * MyBase::mm[ 9] +
+
1103  p[2] * MyBase::mm[10] + MyBase::mm[11]) / w));
+
1104  }
+
1105 
+
1106  return Vec3<T0>(0, 0, 0);
+
1107  }
+
1108 
+
1110  template<typename T0>
+ +
1112  {
+
1113  return Vec3<T0>(
+
1114  static_cast<T0>(v[0] * MyBase::mm[ 0] + v[1] * MyBase::mm[ 4] + v[2] * MyBase::mm[ 8]),
+
1115  static_cast<T0>(v[0] * MyBase::mm[ 1] + v[1] * MyBase::mm[ 5] + v[2] * MyBase::mm[ 9]),
+
1116  static_cast<T0>(v[0] * MyBase::mm[ 2] + v[1] * MyBase::mm[ 6] + v[2] * MyBase::mm[10]));
+
1117  }
+
1118 
+
1119 
+
1120 private:
+
1121  bool invert(Mat4<T> &inverse, T tolerance) const;
+
1122 
+
1123  T det2(const Mat4<T> &a, int i0, int i1, int j0, int j1) const {
+
1124  int i0row = i0 * 4;
+
1125  int i1row = i1 * 4;
+
1126  return a.mm[i0row+j0]*a.mm[i1row+j1] - a.mm[i0row+j1]*a.mm[i1row+j0];
+
1127  }
+
1128 
+
1129  T det3(const Mat4<T> &a, int i0, int i1, int i2,
+
1130  int j0, int j1, int j2) const {
+
1131  int i0row = i0 * 4;
+
1132  return a.mm[i0row+j0]*det2(a, i1,i2, j1,j2) +
+
1133  a.mm[i0row+j1]*det2(a, i1,i2, j2,j0) +
+
1134  a.mm[i0row+j2]*det2(a, i1,i2, j0,j1);
+
1135  }
+
1136 
+
1137  static const Mat4<T> sIdentity;
+
1138  static const Mat4<T> sZero;
+
1139 }; // class Mat4
+
1140 
+
1141 
+
1142 template <typename T>
+
1143 const Mat4<T> Mat4<T>::sIdentity = Mat4<T>(1, 0, 0, 0,
+
1144  0, 1, 0, 0,
+
1145  0, 0, 1, 0,
+
1146  0, 0, 0, 1);
+
1147 
+
1148 template <typename T>
+
1149 const Mat4<T> Mat4<T>::sZero = Mat4<T>(0, 0, 0, 0,
+
1150  0, 0, 0, 0,
+
1151  0, 0, 0, 0,
+
1152  0, 0, 0, 0);
+
1153 
+
1156 template <typename T0, typename T1>
+
1157 bool operator==(const Mat4<T0> &m0, const Mat4<T1> &m1)
+
1158 {
+
1159  const T0 *t0 = m0.asPointer();
+
1160  const T1 *t1 = m1.asPointer();
+
1161 
+
1162  for (int i=0; i<16; ++i) if (!isExactlyEqual(t0[i], t1[i])) return false;
+
1163  return true;
+
1164 }
+
1165 
+
1168 template <typename T0, typename T1>
+
1169 bool operator!=(const Mat4<T0> &m0, const Mat4<T1> &m1) { return !(m0 == m1); }
+
1170 
+
1173 template <typename S, typename T>
+ +
1175 {
+
1176  return m*scalar;
+
1177 }
+
1178 
+
1181 template <typename S, typename T>
+ +
1183 {
+ +
1185  result *= scalar;
+
1186  return result;
+
1187 }
+
1188 
+
1191 template<typename T, typename MT>
+ + +
1194  const Vec4<T> &_v)
+
1195 {
+
1196  MT const *m = _m.asPointer();
+ +
1198  _v[0]*m[0] + _v[1]*m[1] + _v[2]*m[2] + _v[3]*m[3],
+
1199  _v[0]*m[4] + _v[1]*m[5] + _v[2]*m[6] + _v[3]*m[7],
+
1200  _v[0]*m[8] + _v[1]*m[9] + _v[2]*m[10] + _v[3]*m[11],
+
1201  _v[0]*m[12] + _v[1]*m[13] + _v[2]*m[14] + _v[3]*m[15]);
+
1202 }
+
1203 
+
1206 template<typename T, typename MT>
+ +
1208 operator*(const Vec4<T> &_v,
+
1209  const Mat4<MT> &_m)
+
1210 {
+
1211  MT const *m = _m.asPointer();
+ +
1213  _v[0]*m[0] + _v[1]*m[4] + _v[2]*m[8] + _v[3]*m[12],
+
1214  _v[0]*m[1] + _v[1]*m[5] + _v[2]*m[9] + _v[3]*m[13],
+
1215  _v[0]*m[2] + _v[1]*m[6] + _v[2]*m[10] + _v[3]*m[14],
+
1216  _v[0]*m[3] + _v[1]*m[7] + _v[2]*m[11] + _v[3]*m[15]);
+
1217 }
+
1218 
+
1222 template<typename T, typename MT>
+ + +
1225  const Vec3<T> &_v)
+
1226 {
+
1227  MT const *m = _m.asPointer();
+ +
1229  _v[0]*m[0] + _v[1]*m[1] + _v[2]*m[2] + m[3],
+
1230  _v[0]*m[4] + _v[1]*m[5] + _v[2]*m[6] + m[7],
+
1231  _v[0]*m[8] + _v[1]*m[9] + _v[2]*m[10] + m[11]);
+
1232 }
+
1233 
+
1237 template<typename T, typename MT>
+ +
1239 operator*(const Vec3<T> &_v,
+
1240  const Mat4<MT> &_m)
+
1241 {
+
1242  MT const *m = _m.asPointer();
+ +
1244  _v[0]*m[0] + _v[1]*m[4] + _v[2]*m[8] + m[12],
+
1245  _v[0]*m[1] + _v[1]*m[5] + _v[2]*m[9] + m[13],
+
1246  _v[0]*m[2] + _v[1]*m[6] + _v[2]*m[10] + m[14]);
+
1247 }
+
1248 
+
1251 template <typename T0, typename T1>
+ +
1253 operator+(const Mat4<T0> &m0, const Mat4<T1> &m1)
+
1254 {
+ +
1256  result += m1;
+
1257  return result;
+
1258 }
+
1259 
+
1262 template <typename T0, typename T1>
+ +
1264 operator-(const Mat4<T0> &m0, const Mat4<T1> &m1)
+
1265 {
+ +
1267  result -= m1;
+
1268  return result;
+
1269 }
+
1270 
+
1274 template <typename T0, typename T1>
+ +
1276 operator*(const Mat4<T0> &m0, const Mat4<T1> &m1)
+
1277 {
+ +
1279  result *= m1;
+
1280  return result;
+
1281 }
+
1282 
+
1283 
+
1287 template<typename T0, typename T1>
+ +
1289 {
+
1290  return Vec3<T1>(
+
1291  static_cast<T1>(m[0][0]*n[0] + m[0][1]*n[1] + m[0][2]*n[2]),
+
1292  static_cast<T1>(m[1][0]*n[0] + m[1][1]*n[1] + m[1][2]*n[2]),
+
1293  static_cast<T1>(m[2][0]*n[0] + m[2][1]*n[1] + m[2][2]*n[2]));
+
1294 }
+
1295 
+
1296 
+
1298 template<typename T>
+
1299 bool Mat4<T>::invert(Mat4<T> &inverse, T tolerance) const
+
1300 {
+
1301  Mat4<T> temp(*this);
+
1302  inverse.setIdentity();
+
1303 
+
1304  // Forward elimination step
+
1305  double det = 1.0;
+
1306  for (int i = 0; i < 4; ++i) {
+
1307  int row = i;
+
1308  double max = fabs(temp[i][i]);
+
1309 
+
1310  for (int k = i+1; k < 4; ++k) {
+
1311  if (fabs(temp[k][i]) > max) {
+
1312  row = k;
+
1313  max = fabs(temp[k][i]);
+
1314  }
+
1315  }
+
1316 
+
1317  if (isExactlyEqual(max, 0.0)) return false;
+
1318 
+
1319  // must move pivot to row i
+
1320  if (row != i) {
+
1321  det = -det;
+
1322  for (int k = 0; k < 4; ++k) {
+
1323  std::swap(temp[row][k], temp[i][k]);
+
1324  std::swap(inverse[row][k], inverse[i][k]);
+
1325  }
+
1326  }
+
1327 
+
1328  double pivot = temp[i][i];
+
1329  det *= pivot;
+
1330 
+
1331  // scale row i
+
1332  for (int k = 0; k < 4; ++k) {
+
1333  temp[i][k] /= pivot;
+
1334  inverse[i][k] /= pivot;
+
1335  }
+
1336 
+
1337  // eliminate in rows below i
+
1338  for (int j = i+1; j < 4; ++j) {
+
1339  double t = temp[j][i];
+
1340  if (!isExactlyEqual(t, 0.0)) {
+
1341  // subtract scaled row i from row j
+
1342  for (int k = 0; k < 4; ++k) {
+
1343  temp[j][k] -= temp[i][k] * t;
+
1344  inverse[j][k] -= inverse[i][k] * t;
+
1345  }
+
1346  }
+
1347  }
+
1348  }
+
1349 
+
1350  // Backward elimination step
+
1351  for (int i = 3; i > 0; --i) {
+
1352  for (int j = 0; j < i; ++j) {
+
1353  double t = temp[j][i];
+
1354 
+
1355  if (!isExactlyEqual(t, 0.0)) {
+
1356  for (int k = 0; k < 4; ++k) {
+
1357  inverse[j][k] -= inverse[i][k]*t;
+
1358  }
+
1359  }
+
1360  }
+
1361  }
+
1362  return det*det >= tolerance*tolerance;
+
1363 }
+
1364 
+
1365 template <typename T>
+
1366 inline bool isAffine(const Mat4<T>& m) {
+
1367  return (m.col(3) == Vec4<T>(0, 0, 0, 1));
+
1368 }
+
1369 
+
1370 template <typename T>
+
1371 inline bool hasTranslation(const Mat4<T>& m) {
+
1372  return (m.row(3) != Vec4<T>(0, 0, 0, 1));
+
1373 }
+
1374 
+
1375 
+ + +
1378 
+
1379 #if DWREAL_IS_DOUBLE == 1
+
1380 typedef Mat4d Mat4f;
+
1381 #else
+
1382 typedef Mat4s Mat4f;
+
1383 #endif // DWREAL_IS_DOUBLE
+
1384 
+
1385 } // namespace math
+
1386 
+
1387 
+
1388 template<> inline math::Mat4s zeroVal<math::Mat4s>() { return math::Mat4s::identity(); }
+
1389 template<> inline math::Mat4d zeroVal<math::Mat4d>() { return math::Mat4d::identity(); }
+
1390 
+
1391 } // namespace OPENVDB_VERSION_NAME
+
1392 } // namespace openvdb
+
1393 
+
1394 #endif // OPENVDB_UTIL_MAT4_H_HAS_BEEN_INCLUDED
+
1395 
+
1396 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
1397 // All rights reserved. This software is distributed under the
+
1398 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
void setZero()
Definition: Mat4.h:286
+
void postShear(Axis axis0, Axis axis1, T shear)
Right multiplies a shearing transformation into the matrix.
Definition: Mat4.h:1025
+
void preShear(Axis axis0, Axis axis1, T shear)
Left multiplies a shearing transformation into the matrix.
Definition: Mat4.h:1010
+
Mat3< T > getMat3() const
Definition: Mat4.h:339
+
Mat4< typename promote< T0, T1 >::type > operator-(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Returns M, where for .
Definition: Mat4.h:1264
+
const Mat4 & operator=(const Mat4< Source > &m)
Assignment operator.
Definition: Mat4.h:365
+
Mat4(const Vec4< Source > &v1, const Vec4< Source > &v2, const Vec4< Source > &v3, const Vec4< Source > &v4, bool rows=true)
Definition: Mat4.h:120
+
#define OPENVDB_DEPRECATED
Definition: Platform.h:49
+
const T * asPointer() const
Definition: Mat4.h:205
+ +
T & z()
Definition: Vec3.h:99
+
bool isExactlyEqual(const T0 &a, const T1 &b)
Return true if a is exactly equal to b.
Definition: Math.h:407
+
void postScale(const Vec3< T0 > &v)
Definition: Mat4.h:800
+
void setToRotation(Axis axis, T angle)
Sets the matrix to a rotation about the given axis.
Definition: Mat4.h:825
+
void setRow(int i, const Vec4< T > &v)
Set ith row to vector v.
Definition: Mat4.h:162
+
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
Definition: Math.h:839
+
const Mat4< T > & operator*=(const Mat4< S > &m1)
Return m, where for .
Definition: Mat4.h:481
+
static const Mat4< T > & identity()
Predefined constant for identity matrix.
Definition: Mat4.h:152
+
Definition: Mat.h:146
+
Mat4(const Mat< 4, T > &m)
Copy constructor.
Definition: Mat4.h:131
+
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
+
T mm[SIZE *SIZE]
Definition: Mat.h:141
+
Vec3< T0 > pretransformH(const Vec3< T0 > &p) const
Transform a Vec3 by pre-multiplication, doing homogenous division.
Definition: Mat4.h:1090
+
Definition: Exceptions.h:78
+
Mat4 inverse(T tolerance=0) const
Definition: Mat4.h:527
+
T * asPointer()
Direct access to the internal data.
Definition: Mat4.h:204
+
void setIdentity()
Set "this" matrix to identity.
Definition: Mat4.h:307
+
Vec3< typename promote< T, MT >::type > operator*(const Vec3< T > &_v, const Mat4< MT > &_m)
Returns v, where for .
Definition: Mat4.h:1239
+
Mat4< typename promote< S, T >::type > operator*(S scalar, const Mat4< T > &m)
Returns M, where for .
Definition: Mat4.h:1174
+
Definition: Math.h:840
+
MatType shear(Axis axis0, Axis axis1, typename MatType::value_type shear)
Set the matrix to a shear along axis0 by a fraction of axis1.
Definition: Mat.h:667
+
void setColumns(const Vec4< T > &v1, const Vec4< T > &v2, const Vec4< T > &v3, const Vec4< T > &v4)
Set the columns of "this" matrix to the vectors v1, v2, v3, v4.
Definition: Mat4.h:253
+
T ValueType
Definition: Mat4.h:62
+
OPENVDB_DEPRECATED void setBasis(const Vec4< T > &v1, const Vec4< T > &v2, const Vec4< T > &v3, const Vec4< T > &v4)
Set the rows of "this" matrix to the vectors v1, v2, v3, v4.
Definition: Mat4.h:278
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & max(const T &a, const T &b)
Definition: Composite.h:132
+
Mat4< T > operator-() const
Negation operator, for e.g. m1 = -m2;.
Definition: Mat4.h:385
+ +
Vec3< T > getTranslation() const
Return the translation component.
Definition: Mat4.h:351
+
Vec3< T0 > transform3x3(const Vec3< T0 > &v) const
Transform a Vec3 by post-multiplication, without translation.
Definition: Mat4.h:1111
+
bool eq(const Mat4 &m, T eps=1.0e-8) const
Test if "this" is equivalent to m with tolerance of eps value.
Definition: Mat4.h:375
+
Mat4s Mat4f
Definition: Mat4.h:1382
+
void preRotate(Axis axis, T angle)
Left multiplies by a rotation clock-wiseabout the given axis into this matrix.
Definition: Mat4.h:840
+
4x4 -matrix class.
Definition: Mat3.h:48
+
void preTranslate(const Vec3< T0 > &tr)
Left multiples by the specified translation, i.e. Trans * (*this)
Definition: Mat4.h:745
+
bool isApproxEqual(const Type &a, const Type &b)
Return true if a is equal to b to within the default floating-point comparison tolerance.
Definition: Math.h:370
+
Vec4< typename promote< T, MT >::type > operator*(const Vec4< T > &_v, const Mat4< MT > &_m)
Returns v, where for .
Definition: Mat4.h:1208
+
T det() const
Determinant of matrix.
Definition: Mat3.h:523
+
const Mat4< T > & operator+=(const Mat4< S > &m1)
Returns m0, where for .
Definition: Mat4.h:423
+
Vec4< T > col(int j) const
Get jth column, e.g. Vec4f v = m.col(0);.
Definition: Mat4.h:190
+
Mat4(Source *a)
Constructor given array of elements, the ordering is in row major form:
Definition: Mat4.h:76
+
T operator()(int i, int j) const
Definition: Mat4.h:220
+ +
void setToScale(const Vec3< T0 > &v)
Sets the matrix to a matrix that scales by v.
Definition: Mat4.h:768
+
T dot(const Vec3< T > &v) const
Dot product.
Definition: Vec3.h:203
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
Mat4 transpose() const
Definition: Mat4.h:514
+
void setMat3(const Mat3< T > &m)
Set upper left to a Mat3.
Definition: Mat4.h:332
+
const T * operator[](int i) const
Definition: Mat4.h:200
+
Vec3< T0 > transformH(const Vec3< T0 > &p) const
Transform a Vec3 by post-multiplication, doing homogenous divison.
Definition: Mat4.h:1068
+
Vec4< T > row(int i) const
Get ith row, e.g. Vec4f v = m.row(1);.
Definition: Mat4.h:173
+
bool operator==(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Equality operator, does exact floating point comparisons.
Definition: Mat4.h:1157
+
void postRotate(Axis axis, T angle)
Right multiplies by a rotation clock-wiseabout the given axis into this matrix.
Definition: Mat4.h:920
+
Mat4(Source a, Source b, Source c, Source d, Source e, Source f, Source g, Source h, Source i, Source j, Source k, Source l, Source m, Source n, Source o, Source p)
Constructor given array of elements, the ordering is in row major form:
Definition: Mat4.h:91
+
T & x()
Reference to the component, e.g. v.x() = 4.5f;.
Definition: Vec3.h:97
+
Vec4< T0 > pretransform(const Vec4< T0 > &v) const
Transform a Vec4 by pre-multiplication.
Definition: Mat4.h:1054
+
bool isAffine(const Mat4< T > &m)
Definition: Mat4.h:1366
+
Definition: Exceptions.h:39
+
Vec4< T0 > transform(const Vec4< T0 > &v) const
Transform a Vec4 by post-multiplication.
Definition: Mat4.h:1040
+
3x3 matrix class.
Definition: Mat3.h:54
+
void setToShear(Axis axis0, Axis axis1, T shearby)
Sets the matrix to a shear along axis0 by a fraction of axis1.
Definition: Mat4.h:1002
+
T value_type
Data type held by the matrix.
Definition: Mat4.h:61
+
const Mat4< T > & operator-=(const Mat4< S > &m1)
Returns m0, where for .
Definition: Mat4.h:452
+
T angle(const Vec2< T > &v1, const Vec2< T > &v2)
Definition: Vec2.h:446
+
Mat4< float > Mat4s
Definition: Mat4.h:1376
+
T & operator()(int i, int j)
Definition: Mat4.h:210
+
void setToRotation(const Vec3< T > &v1, const Vec3< T > &v2)
Sets the matrix to a rotation that maps v1 onto v2 about the cross product of v1 and v2...
Definition: Mat4.h:834
+
Mat< 4, T > MyBase
Definition: Mat4.h:63
+
const Mat4< T > & operator*=(S scalar)
Return m, where for .
Definition: Mat4.h:397
+
Definition: Math.h:841
+
Vec3< T0 > pretransform(const Vec3< T0 > &v) const
Transform a Vec3 by pre-multiplication, without homogenous division.
Definition: Mat4.h:1061
+
void setTranslation(const Vec3< T > &t)
Definition: Mat4.h:356
+
Mat4< double > Mat4d
Definition: Mat4.h:1377
+
T & y()
Definition: Vec3.h:98
+
void setToRotation(const Vec3< T > &axis, T angle)
Sets the matrix to a rotation about an arbitrary axis.
Definition: Mat4.h:830
+
static Mat4 translation(const Vec3d &v)
Sets the matrix to a matrix that translates by v.
Definition: Mat4.h:709
+
static const Mat4< T > & zero()
Predefined constant for zero matrix.
Definition: Mat4.h:157
+
bool hasTranslation(const Mat4< T > &m)
Definition: Mat4.h:1371
+
Mat4()
Trivial constructor, the matrix is NOT initialized.
Definition: Mat4.h:66
+
Vec4< typename promote< T, MT >::type > operator*(const Mat4< MT > &_m, const Vec4< T > &_v)
Returns v, where for .
Definition: Mat4.h:1193
+
Mat4< typename promote< T0, T1 >::type > operator*(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Returns M, where for .
Definition: Mat4.h:1276
+
T det() const
Determinant of matrix.
Definition: Mat4.h:679
+
Vec3< typename promote< T, MT >::type > operator*(const Mat4< MT > &_m, const Vec3< T > &_v)
Returns v, where for .
Definition: Mat4.h:1224
+
Mat4< typename promote< T0, T1 >::type > operator+(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Returns M, where for .
Definition: Mat4.h:1253
+
void setToTranslation(const Vec3< T0 > &v)
Sets the matrix to a matrix that translates by v.
Definition: Mat4.h:720
+
Axis
Definition: Math.h:838
+
void setCol(int j, const Vec4< T > &v)
Set jth column to vector v.
Definition: Mat4.h:180
+
Mat4< typename promote< S, T >::type > operator*(const Mat4< T > &m, S scalar)
Returns M, where for .
Definition: Mat4.h:1182
+
Vec3< T0 > transform(const Vec3< T0 > &v) const
Transform a Vec3 by post-multiplication, without homogenous division.
Definition: Mat4.h:1047
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
Definition: Mat.h:52
+
void setRows(const Vec4< T > &v1, const Vec4< T > &v2, const Vec4< T > &v3, const Vec4< T > &v4)
Set the rows of "this" matrix to the vectors v1, v2, v3, v4.
Definition: Mat4.h:228
+
Mat4(const Mat4< Source > &m)
Conversion constructor.
Definition: Mat4.h:142
+
void preScale(const Vec3< T0 > &v)
Definition: Mat4.h:778
+
void postTranslate(const Vec3< T0 > &tr)
Right multiplies by the specified translation matrix, i.e. (*this) * Trans.
Definition: Mat4.h:756
+
Definition: Mat4.h:51
+
bool operator!=(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Inequality operator, does exact floating point comparisons.
Definition: Mat4.h:1169
+ +
T * asPointer()
Definition: Mat3.h:208
+ +
Vec3< T1 > transformNormal(const Mat4< T0 > &m, const Vec3< T1 > &n)
Definition: Mat4.h:1288
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/Mat_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/Mat_8h_source.html new file mode 100644 index 00000000..c32447e7 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/Mat_8h_source.html @@ -0,0 +1,1097 @@ + + + + + + +OpenVDB: Mat.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Mat.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
33 
+
34 #ifndef OPENVDB_MATH_MAT_HAS_BEEN_INCLUDED
+
35 #define OPENVDB_MATH_MAT_HAS_BEEN_INCLUDED
+
36 
+
37 #include <math.h>
+
38 #include <iostream>
+
39 #include <boost/format.hpp>
+
40 #include <openvdb/Exceptions.h>
+
41 #include "Math.h"
+
42 
+
43 
+
44 namespace openvdb {
+ +
46 namespace OPENVDB_VERSION_NAME {
+
47 namespace math {
+
48 
+
51 template<unsigned SIZE, typename T>
+
52 class Mat
+
53 {
+
54 public:
+
55  typedef T value_type;
+
56  typedef T ValueType;
+
57  enum SIZE_ { size = SIZE };
+
58 
+
59  // Number of cols, rows, elements
+
60  static unsigned numRows() { return SIZE; }
+
61  static unsigned numColumns() { return SIZE; }
+
62  static unsigned numElements() { return SIZE*SIZE; }
+
63 
+
66  Mat() { }
+
67 
+
69  Mat(Mat const &src) {
+
70  for (unsigned i(0); i < numElements(); ++i) {
+
71  mm[i] = src.mm[i];
+
72  }
+
73  }
+
74 
+
84  std::string
+
85  str(unsigned indentation = 0) const {
+
86 
+
87  std::string ret;
+
88  std::string indent;
+
89 
+
90  // We add +1 since we're indenting one for the first '['
+
91  indent.append(indentation+1, ' ');
+
92 
+
93  ret.append("[");
+
94 
+
95  // For each row,
+
96  for (unsigned i(0); i < SIZE; i++) {
+
97 
+
98  ret.append("[");
+
99 
+
100  // For each column
+
101  for (unsigned j(0); j < SIZE; j++) {
+
102 
+
103  // Put a comma after everything except the last
+
104  if (j) ret.append(", ");
+
105  ret.append((boost::format("%1%") % mm[(i*SIZE)+j]).str());
+
106  }
+
107 
+
108  ret.append("]");
+
109 
+
110  // At the end of every row (except the last)...
+
111  if (i < SIZE-1 )
+
112  // ...suffix the row bracket with a comma, newline, and
+
113  // advance indentation
+
114  ret.append((boost::format(",\n%1%") % indent).str());
+
115  }
+
116 
+
117  ret.append("]");
+
118 
+
119  return ret;
+
120  }
+
121 
+
123  friend std::ostream& operator<<(
+
124  std::ostream& ostr,
+
125  const Mat<SIZE, T>& m)
+
126  {
+
127  ostr << m.str();
+
128  return ostr;
+
129  }
+
130 
+
131  void write(std::ostream& os) const {
+
132  os.write(reinterpret_cast<const char*>(&mm), sizeof(T)*SIZE*SIZE);
+
133  }
+
134 
+
135  void read(std::istream& is) {
+
136  is.read(reinterpret_cast<char*>(&mm), sizeof(T)*SIZE*SIZE);
+
137  }
+
138 
+
139 
+
140 protected:
+
141  T mm[SIZE*SIZE];
+
142 };
+
143 
+
144 
+
145 template<typename T> class Quat;
+
146 template<typename T> class Vec3;
+
147 
+
151 template<class MatType>
+
152 MatType
+ +
154  typename MatType::value_type eps = static_cast<typename MatType::value_type>(1.0e-8))
+
155 {
+
156  typedef typename MatType::value_type T;
+
157 
+
158  T qdot(q.dot(q));
+
159  T s(0);
+
160 
+
161  if (!isApproxEqual(qdot, T(0.0),eps)) {
+
162  s = T(2.0 / qdot);
+
163  }
+
164 
+
165  T x = s*q.x();
+
166  T y = s*q.y();
+
167  T z = s*q.z();
+
168  T wx = x*q.w();
+
169  T wy = y*q.w();
+
170  T wz = z*q.w();
+
171  T xx = x*q.x();
+
172  T xy = y*q.x();
+
173  T xz = z*q.x();
+
174  T yy = y*q.y();
+
175  T yz = z*q.y();
+
176  T zz = z*q.z();
+
177 
+
178  MatType r;
+
179  r[0][0]=T(1) - (yy+zz); r[0][1]=xy + wz; r[0][2]=xz - wy;
+
180  r[1][0]=xy - wz; r[1][1]=T(1) - (xx+zz); r[1][2]=yz + wx;
+
181  r[2][0]=xz + wy; r[2][1]=yz - wx; r[2][2]=T(1) - (xx+yy);
+
182 
+
183  if(MatType::numColumns() == 4) padMat4(r);
+
184  return r;
+
185 }
+
186 
+
187 
+
188 
+
192 template<class MatType>
+
193 MatType
+
194 rotation(Axis axis, typename MatType::value_type angle)
+
195 {
+
196  typedef typename MatType::value_type T;
+
197  T c = static_cast<T>(cos(angle));
+
198  T s = static_cast<T>(sin(angle));
+
199 
+
200  MatType result;
+
201  result.setIdentity();
+
202 
+
203  switch (axis) {
+
204  case X_AXIS:
+
205  result[1][1] = c;
+
206  result[1][2] = s;
+
207  result[2][1] = -s;
+
208  result[2][2] = c;
+
209  return result;
+
210  case Y_AXIS:
+
211  result[0][0] = c;
+
212  result[0][2] = -s;
+
213  result[2][0] = s;
+
214  result[2][2] = c;
+
215  return result;
+
216  case Z_AXIS:
+
217  result[0][0] = c;
+
218  result[0][1] = s;
+
219  result[1][0] = -s;
+
220  result[1][1] = c;
+
221  return result;
+
222  default:
+
223  throw ValueError("Unrecognized rotation axis");
+
224  }
+
225 }
+
226 
+
227 
+
230 template<class MatType>
+
231 MatType
+
232 rotation(const Vec3<typename MatType::value_type> &_axis, typename MatType::value_type angle)
+
233 {
+
234  typedef typename MatType::value_type T;
+
235  T txy, txz, tyz, sx, sy, sz;
+
236 
+
237  Vec3<T> axis(_axis.unit());
+
238 
+
239  // compute trig properties of angle:
+
240  T c(cos(double(angle)));
+
241  T s(sin(double(angle)));
+
242  T t(1 - c);
+
243 
+
244  MatType result;
+
245  // handle diagonal elements
+
246  result[0][0] = axis[0]*axis[0] * t + c;
+
247  result[1][1] = axis[1]*axis[1] * t + c;
+
248  result[2][2] = axis[2]*axis[2] * t + c;
+
249 
+
250  txy = axis[0]*axis[1] * t;
+
251  sz = axis[2] * s;
+
252 
+
253  txz = axis[0]*axis[2] * t;
+
254  sy = axis[1] * s;
+
255 
+
256  tyz = axis[1]*axis[2] * t;
+
257  sx = axis[0] * s;
+
258 
+
259  // right handed space
+
260  // Contribution from rotation about 'z'
+
261  result[0][1] = txy + sz;
+
262  result[1][0] = txy - sz;
+
263  // Contribution from rotation about 'y'
+
264  result[0][2] = txz - sy;
+
265  result[2][0] = txz + sy;
+
266  // Contribution from rotation about 'x'
+
267  result[1][2] = tyz + sx;
+
268  result[2][1] = tyz - sx;
+
269 
+
270  if(MatType::numColumns() == 4) padMat4(result);
+
271  return MatType(result);
+
272 }
+
273 
+
274 
+
312 template<class MatType>
+
313 Vec3<typename MatType::value_type>
+ +
315  const MatType& mat,
+
316  RotationOrder rotationOrder,
+
317  typename MatType::value_type eps = static_cast<typename MatType::value_type>(1.0e-8))
+
318 {
+
319  typedef typename MatType::value_type ValueType;
+
320  typedef Vec3<ValueType> V;
+
321  ValueType phi, theta, psi;
+
322 
+
323  switch(rotationOrder)
+
324  {
+
325  case XYZ_ROTATION:
+
326  if (isApproxEqual(mat[2][0], ValueType(1.0), eps)) {
+
327  theta = ValueType(M_PI_2);
+
328  phi = ValueType(0.5 * atan2(mat[1][2], mat[1][1]));
+
329  psi = phi;
+
330  } else if (isApproxEqual(mat[2][0], ValueType(-1.0), eps)) {
+
331  theta = ValueType(-M_PI_2);
+
332  phi = ValueType(0.5 * atan2(mat[1][2], mat[1][1]));
+
333  psi = -phi;
+
334  } else {
+
335  psi = ValueType(atan2(-mat[1][0],mat[0][0]));
+
336  phi = ValueType(atan2(-mat[2][1],mat[2][2]));
+
337  theta = ValueType(atan2(mat[2][0],
+
338  sqrt( mat[2][1]*mat[2][1] +
+
339  mat[2][2]*mat[2][2])));
+
340  }
+
341  return V(phi, theta, psi);
+
342  case ZXY_ROTATION:
+
343  if (isApproxEqual(mat[1][2], ValueType(1.0), eps)) {
+
344  theta = ValueType(M_PI_2);
+
345  phi = ValueType(0.5 * atan2(mat[0][1], mat[0][0]));
+
346  psi = phi;
+
347  } else if (isApproxEqual(mat[1][2], ValueType(-1.0), eps)) {
+
348  theta = ValueType(-M_PI/2);
+
349  phi = ValueType(0.5 * atan2(mat[0][1],mat[2][1]));
+
350  psi = -phi;
+
351  } else {
+
352  psi = ValueType(atan2(-mat[0][2], mat[2][2]));
+
353  phi = ValueType(atan2(-mat[1][0], mat[1][1]));
+
354  theta = ValueType(atan2(mat[1][2],
+
355  sqrt(mat[0][2] * mat[0][2] +
+
356  mat[2][2] * mat[2][2])));
+
357  }
+
358  return V(theta, psi, phi);
+
359 
+
360  case YZX_ROTATION:
+
361  if (isApproxEqual(mat[0][1], ValueType(1.0), eps)) {
+
362  theta = ValueType(M_PI_2);
+
363  phi = ValueType(0.5 * atan2(mat[2][0], mat[2][2]));
+
364  psi = phi;
+
365  } else if (isApproxEqual(mat[0][1], ValueType(-1.0), eps)) {
+
366  theta = ValueType(-M_PI/2);
+
367  phi = ValueType(0.5 * atan2(mat[2][0], mat[1][0]));
+
368  psi = -phi;
+
369  } else {
+
370  psi = ValueType(atan2(-mat[2][1], mat[1][1]));
+
371  phi = ValueType(atan2(-mat[0][2], mat[0][0]));
+
372  theta = ValueType(atan2(mat[0][1],
+
373  sqrt(mat[0][0] * mat[0][0] +
+
374  mat[0][2] * mat[0][2])));
+
375  }
+
376  return V(psi, phi, theta);
+
377 
+
378  case XZX_ROTATION:
+
379 
+
380  if (isApproxEqual(mat[0][0], ValueType(1.0), eps)) {
+
381  theta = ValueType(0.0);
+
382  phi = ValueType(0.5 * atan2(mat[1][2], mat[1][1]));
+
383  psi = phi;
+
384  } else if (isApproxEqual(mat[0][0], ValueType(-1.0), eps)) {
+
385  theta = ValueType(M_PI);
+
386  psi = ValueType(0.5 * atan2(mat[2][1], -mat[1][1]));
+
387  phi = - psi;
+
388  } else {
+
389  psi = ValueType(atan2(mat[2][0], -mat[1][0]));
+
390  phi = ValueType(atan2(mat[0][2], mat[0][1]));
+
391  theta = ValueType(atan2(sqrt(mat[0][1] * mat[0][1] +
+
392  mat[0][2] * mat[0][2]),
+
393  mat[0][0]));
+
394  }
+
395  return V(phi, psi, theta);
+
396 
+
397  case ZXZ_ROTATION:
+
398 
+
399  if (isApproxEqual(mat[2][2], ValueType(1.0), eps)) {
+
400  theta = ValueType(0.0);
+
401  phi = ValueType(0.5 * atan2(mat[0][1], mat[0][0]));
+
402  psi = phi;
+
403  } else if (isApproxEqual(mat[2][2], ValueType(-1.0), eps)) {
+
404  theta = ValueType(M_PI);
+
405  phi = ValueType(0.5 * atan2(mat[0][1], mat[0][0]));
+
406  psi = -phi;
+
407  } else {
+
408  psi = ValueType(atan2(mat[0][2], mat[1][2]));
+
409  phi = ValueType(atan2(mat[2][0], -mat[2][1]));
+
410  theta = ValueType(atan2(sqrt(mat[0][2] * mat[0][2] +
+
411  mat[1][2] * mat[1][2]),
+
412  mat[2][2]));
+
413  }
+
414  return V(theta, psi, phi);
+
415 
+
416  case YXZ_ROTATION:
+
417 
+
418  if (isApproxEqual(mat[2][1], ValueType(1.0), eps)) {
+
419  theta = ValueType(-M_PI_2);
+
420  phi = ValueType(0.5 * atan2(-mat[1][0], mat[0][0]));
+
421  psi = phi;
+
422  } else if (isApproxEqual(mat[2][1], ValueType(-1.0), eps)) {
+
423  theta = ValueType(M_PI_2);
+
424  phi = ValueType(0.5 * atan2(mat[1][0], mat[0][0]));
+
425  psi = -phi;
+
426  } else {
+
427  psi = ValueType(atan2(mat[0][1], mat[1][1]));
+
428  phi = ValueType(atan2(mat[2][0], mat[2][2]));
+
429  theta = ValueType(atan2(-mat[2][1],
+
430  sqrt(mat[0][1] * mat[0][1] +
+
431  mat[1][1] * mat[1][1])));
+
432  }
+
433  return V(theta, phi, psi);
+
434 
+
435  case ZYX_ROTATION:
+
436 
+
437  if (isApproxEqual(mat[0][2], ValueType(1.0), eps)) {
+
438  theta = ValueType(-M_PI_2);
+
439  phi = ValueType(0.5 * atan2(-mat[1][0], mat[1][1]));
+
440  psi = phi;
+
441  } else if (isApproxEqual(mat[0][2], ValueType(-1.0), eps)) {
+
442  theta = ValueType(M_PI_2);
+
443  phi = ValueType(0.5 * atan2(mat[2][1], mat[2][0]));
+
444  psi = -phi;
+
445  } else {
+
446  psi = ValueType(atan2(mat[1][2], mat[2][2]));
+
447  phi = ValueType(atan2(mat[0][1], mat[0][0]));
+
448  theta = ValueType(atan2(-mat[0][2],
+
449  sqrt(mat[0][1] * mat[0][1] +
+
450  mat[0][0] * mat[0][0])));
+
451  }
+
452  return V(psi, theta, phi);
+
453 
+
454  case XZY_ROTATION:
+
455 
+
456  if (isApproxEqual(mat[1][0], ValueType(-1.0), eps)) {
+
457  theta = ValueType(M_PI_2);
+
458  psi = ValueType(0.5 * atan2(mat[2][1], mat[2][2]));
+
459  phi = -psi;
+
460  } else if (isApproxEqual(mat[1][0], ValueType(1.0), eps)) {
+
461  theta = ValueType(-M_PI_2);
+
462  psi = ValueType(0.5 * atan2(- mat[2][1], mat[2][2]));
+
463  phi = psi;
+
464  } else {
+
465  psi = ValueType(atan2(mat[2][0], mat[0][0]));
+
466  phi = ValueType(atan2(mat[1][2], mat[1][1]));
+
467  theta = ValueType(atan2(- mat[1][0],
+
468  sqrt(mat[1][1] * mat[1][1] +
+
469  mat[1][2] * mat[1][2])));
+
470  }
+
471  return V(phi, psi, theta);
+
472  }
+
473 
+
474  OPENVDB_THROW(NotImplementedError, "Euler extraction sequence not implemented");
+
475 }
+
476 
+
477 
+
480 template<class MatType>
+
481 MatType
+ + + +
485  typename MatType::value_type eps=1.0e-8)
+
486 {
+
487  typedef typename MatType::value_type T;
+
488  Vec3<T> v1(_v1);
+
489  Vec3<T> v2(_v2);
+
490 
+
491  // Check if v1 and v2 are unit length
+
492  if (!isApproxEqual(1.0, v1.dot(v1), eps)) {
+
493  v1.normalize();
+
494  }
+
495  if (!isApproxEqual(1.0, v2.dot(v2), eps)) {
+
496  v2.normalize();
+
497  }
+
498 
+
499  Vec3<T> cross;
+
500  cross.cross(v1, v2);
+
501 
+
502  if (isApproxEqual(cross[0], 0.0, eps) &&
+
503  isApproxEqual(cross[1], 0.0, eps) &&
+
504  isApproxEqual(cross[2], 0.0, eps)) {
+
505 
+
506 
+
507  // Given two unit vectors v1 and v2 that are nearly parallel, build a
+
508  // rotation matrix that maps v1 onto v2. First find which principal axis
+
509  // p is closest to perpendicular to v1. Find a reflection that exchanges
+
510  // v1 and p, and find a reflection that exchanges p2 and v2. The desired
+
511  // rotation matrix is the composition of these two reflections. See the
+
512  // paper "Efficiently Building a Matrix to Rotate One Vector to
+
513  // Another" by Tomas Moller and John Hughes in Journal of Graphics
+
514  // Tools Vol 4, No 4 for details.
+
515 
+
516  Vec3<T> u, v, p(0.0, 0.0, 0.0);
+
517 
+
518  double x = Abs(v1[0]);
+
519  double y = Abs(v1[1]);
+
520  double z = Abs(v1[2]);
+
521 
+
522  if (x < y) {
+
523  if (z < x) {
+
524  p[2] = 1;
+
525  } else {
+
526  p[0] = 1;
+
527  }
+
528  } else {
+
529  if (z < y) {
+
530  p[2] = 1;
+
531  } else {
+
532  p[1] = 1;
+
533  }
+
534  }
+
535  u = p - v1;
+
536  v = p - v2;
+
537 
+
538  double udot = u.dot(u);
+
539  double vdot = v.dot(v);
+
540 
+
541  double a = -2 / udot;
+
542  double b = -2 / vdot;
+
543  double c = 4 * u.dot(v) / (udot * vdot);
+
544 
+
545  MatType result;
+
546  result.setIdentity();
+
547 
+
548  for (int j = 0; j < 3; j++) {
+
549  for (int i = 0; i < 3; i++)
+
550  result[i][j] =
+
551  a * u[i] * u[j] + b * v[i] * v[j] + c * v[j] * u[i];
+
552  }
+
553  result[0][0] += 1.0;
+
554  result[1][1] += 1.0;
+
555  result[2][2] += 1.0;
+
556 
+
557  if(MatType::numColumns() == 4) padMat4(result);
+
558  return result;
+
559 
+
560  } else {
+
561  double c = v1.dot(v2);
+
562  double a = (1.0 - c) / cross.dot(cross);
+
563 
+
564  double a0 = a * cross[0];
+
565  double a1 = a * cross[1];
+
566  double a2 = a * cross[2];
+
567 
+
568  double a01 = a0 * cross[1];
+
569  double a02 = a0 * cross[2];
+
570  double a12 = a1 * cross[2];
+
571 
+
572  MatType r;
+
573 
+
574  r[0][0] = c + a0 * cross[0];
+
575  r[0][1] = a01 + cross[2];
+
576  r[0][2] = a02 - cross[1],
+
577  r[1][0] = a01 - cross[2];
+
578  r[1][1] = c + a1 * cross[1];
+
579  r[1][2] = a12 + cross[0];
+
580  r[2][0] = a02 + cross[1];
+
581  r[2][1] = a12 - cross[0];
+
582  r[2][2] = c + a2 * cross[2];
+
583 
+
584  if(MatType::numColumns() == 4) padMat4(r);
+
585  return r;
+
586 
+
587  }
+
588 }
+
589 
+
590 
+
592 template<class MatType>
+
593 MatType
+ +
595 {
+
596  // Gets identity, then sets top 3 diagonal
+
597  // Inefficient by 3 sets.
+
598 
+
599  MatType result;
+
600  result.setIdentity();
+
601  result[0][0] = s[0];
+
602  result[1][1] = s[1];
+
603  result[2][2] = s[2];
+
604 
+
605  return result;
+
606 }
+
607 
+
608 
+
610 template<class MatType>
+
611 Vec3<typename MatType::value_type>
+
612 getScale(const MatType &mat)
+
613 {
+ +
615  return V(
+
616  V(mat[0][0], mat[0][1], mat[0][2]).length(),
+
617  V(mat[1][0], mat[1][1], mat[1][2]).length(),
+
618  V(mat[2][0], mat[2][1], mat[2][2]).length());
+
619 }
+
620 
+
621 
+
625 template<class MatType>
+
626 MatType
+
627 unit(const MatType &mat, typename MatType::value_type eps = 1.0e-8)
+
628 {
+ +
630  return unit(mat, eps, dud);
+
631 }
+
632 
+
633 
+
638 template<class MatType>
+
639 MatType
+ +
641  const MatType &in,
+
642  typename MatType::value_type eps,
+ +
644 {
+
645  typedef typename MatType::value_type T;
+
646  MatType result(in);
+
647 
+
648  for (int i(0); i < 3; i++) {
+
649  try {
+
650  const Vec3<T> u(
+
651  Vec3<T>(in[i][0], in[i][1], in[i][2]).unit(eps, scaling[i]));
+
652  for (int j=0; j<3; j++) result[i][j] = u[j];
+
653  } catch (ArithmeticError&) {
+
654  for (int j=0; j<3; j++) result[i][j] = 0;
+
655  }
+
656  }
+
657  return result;
+
658 }
+
659 
+
660 
+
665 template <class MatType>
+
666 MatType
+
667 shear(Axis axis0, Axis axis1, typename MatType::value_type shear)
+
668 {
+
669  int index0 = static_cast<int>(axis0);
+
670  int index1 = static_cast<int>(axis1);
+
671 
+
672  MatType result;
+
673  result.setIdentity();
+
674  if (axis0 == axis1) {
+
675  result[index1][index0] = shear + 1;
+
676  } else {
+
677  result[index1][index0] = shear;
+
678  }
+
679 
+
680  return result;
+
681 }
+
682 
+
683 
+
685 template<class MatType>
+
686 MatType
+ +
688 {
+
689  typedef typename MatType::value_type T;
+
690 
+
691  MatType r;
+
692  r[0][0] = T(0); r[0][1] = skew.z(); r[0][2] = -skew.y();
+
693  r[1][0] = -skew.z(); r[1][1] = T(0); r[2][1] = skew.x();
+
694  r[2][0] = skew.y(); r[2][1] = -skew.x(); r[2][2] = T(0);
+
695 
+
696  if(MatType::numColumns() == 4) padMat4(r);
+
697  return r;
+
698 }
+
699 
+
700 
+
703 template<class MatType>
+
704 MatType
+ +
706  const Vec3<typename MatType::value_type>& vertical)
+
707 {
+
708  typedef typename MatType::value_type T;
+
709  Vec3<T> forward(direction.unit());
+
710  Vec3<T> horizontal(vertical.unit().cross(forward).unit());
+
711  Vec3<T> up(forward.cross(horizontal).unit());
+
712 
+
713  MatType r;
+
714 
+
715  r[0][0]=horizontal.x(); r[0][1]=horizontal.y(); r[0][2]=horizontal.z();
+
716  r[1][0]=up.x(); r[1][1]=up.y(); r[1][2]=up.z();
+
717  r[2][0]=forward.x(); r[2][1]=forward.y(); r[2][2]=forward.z();
+
718 
+
719  if(MatType::numColumns() == 4) padMat4(r);
+
720  return r;
+
721 }
+
722 
+
728 template<class MatType>
+
729 inline MatType
+
730 snapMatBasis(const MatType& source, Axis axis, const Vec3<typename MatType::value_type>& direction)
+
731 {
+
732  typedef typename MatType::value_type T;
+
733 
+
734  Vec3<T> unitDir(direction.unit());
+
735  Vec3<T> ourUnitAxis(source.row(axis).unit());
+
736 
+
737  // Are the two parallel?
+
738  T parallel = unitDir.dot(ourUnitAxis);
+
739 
+
740  // Already snapped!
+
741  if (isApproxEqual(parallel, T(1.0))) return source;
+
742 
+
743  if (isApproxEqual(parallel, T(-1.0))) {
+
744  OPENVDB_THROW(ValueError, "Cannot snap to inverse axis");
+
745  }
+
746 
+
747  // Find angle between our basis and the one specified
+
748  T angleBetween(angle(unitDir, ourUnitAxis));
+
749  // Caclulate axis to rotate along
+
750  Vec3<T> rotationAxis = unitDir.cross(ourUnitAxis);
+
751 
+
752  MatType rotation;
+
753  rotation.setToRotation(rotationAxis, angleBetween);
+
754 
+
755  return source * rotation;
+
756 }
+
757 
+
760 template<class MatType>
+
761 static MatType&
+
762 padMat4(MatType& dest)
+
763 {
+
764  dest[0][3] = dest[1][3] = dest[2][3] = 0;
+
765  dest[3][2] = dest[3][1] = dest[3][0] = 0;
+
766  dest[3][3] = 1;
+
767 
+
768  return dest;
+
769 }
+
770 
+
771 
+
774 template <typename MatType>
+
775 inline void
+
776 sqrtSolve(const MatType &aA, MatType &aB, double aTol=0.01)
+
777 {
+
778  unsigned int iterations = (unsigned int)(log(aTol)/log(0.5));
+
779  MatType Y[2];
+
780  MatType Z[2];
+
781  MatType invY;
+
782  MatType invZ;
+
783 
+
784  unsigned int current = 0;
+
785 
+
786  Y[0]=aA;
+
787  Z[0] = MatType::identity();
+
788 
+
789  unsigned int iteration;
+
790  for (iteration=0; iteration<iterations; iteration++)
+
791  {
+
792  unsigned int last = current;
+
793  current = !current;
+
794 
+
795  invY = Y[last].inverse();
+
796  invZ = Z[last].inverse();
+
797 
+
798  Y[current]=0.5*(Y[last]+invZ);
+
799  Z[current]=0.5*(Z[last]+invY);
+
800  }
+
801 
+
802  MatType &R = Y[current];
+
803 
+
804  aB=R;
+
805 }
+
806 
+
807 
+
808 template <typename MatType>
+
809 inline void
+
810 powSolve(const MatType &aA, MatType &aB, double aPower, double aTol=0.01)
+
811 {
+
812  unsigned int iterations = (unsigned int)(log(aTol)/log(0.5));
+
813 
+
814  const bool inverted = ( aPower < 0.0 );
+
815 
+
816  if (inverted) {
+
817  aPower = -aPower;
+
818  }
+
819 
+
820  unsigned int whole = (unsigned int)aPower;
+
821  double fraction = aPower - whole;
+
822 
+
823  MatType R;
+
824  R = MatType::identity();
+
825 
+
826  MatType partial = aA;
+
827 
+
828  double contribution = 1.0;
+
829 
+
830  unsigned int iteration;
+
831 
+
832  for (iteration=0; iteration< iterations; iteration++)
+
833  {
+
834  sqrtSolve(partial, partial, aTol);
+
835  contribution *= 0.5;
+
836 
+
837  if (fraction>=contribution)
+
838  {
+
839  R *= partial;
+
840  fraction-=contribution;
+
841  }
+
842  }
+
843 
+
844  partial = aA;
+
845  while (whole)
+
846  {
+
847  if (whole & 1) {
+
848  R *= partial;
+
849  }
+
850  whole>>=1;
+
851  if(whole) {
+
852  partial*=partial;
+
853  }
+
854  }
+
855 
+
856  if (inverted) {
+
857  aB = R.inverse();
+
858  }
+
859  else {
+
860  aB = R;
+
861  }
+
862 }
+
863 
+
864 
+
866 template<typename MatType>
+
867 inline bool
+
868 isIdentity(const MatType& m)
+
869 {
+
870  return m.eq(MatType::identity());
+
871 }
+
872 
+
873 
+
875 template<typename MatType>
+
876 inline bool
+
877 isInvertible(const MatType& m)
+
878 {
+
879  typedef typename MatType::ValueType value_type;
+
880  return !isApproxEqual(m.det(), (value_type)0);
+
881 }
+
882 
+
883 
+
886 template<typename MatType>
+
887 inline bool
+
888 isSymmetric(const MatType& m)
+
889 {
+
890  return m.eq(m.transpose());
+
891 }
+
892 
+
893 
+
895 template<typename MatType>
+
896 inline bool
+
897 isUnitary(const MatType& m)
+
898 {
+
899  typedef typename MatType::ValueType value_type;
+
900  if (!isApproxEqual(std::abs(m.det()), value_type(1.0))) return false;
+
901  // check that the matrix transpose is the inverse
+
902  MatType temp = m * m.transpose();
+
903  return temp.eq(MatType::identity());
+
904 }
+
905 
+
906 
+
908 template<typename MatType>
+
909 inline bool
+
910 isDiagonal(const MatType& mat)
+
911 {
+
912  int n = MatType::size;
+
913  typename MatType::ValueType temp(0);
+
914  for (int i = 0; i < n; ++i) {
+
915  for (int j = 0; j < n; ++j) {
+
916  if (i != j) {
+
917  temp+=std::abs(mat(i,j));
+
918  }
+
919  }
+
920  }
+
921  return isApproxEqual(temp, typename MatType::ValueType(0.0));
+
922 }
+
923 
+
924 
+
926 template<typename MatType>
+
927 typename MatType::ValueType
+
928 lInfinityNorm(const MatType& matrix)
+
929 {
+
930  int n = MatType::size;
+
931  typename MatType::ValueType norm = 0;
+
932 
+
933  for( int j = 0; j<n; ++j) {
+
934  typename MatType::ValueType column_sum = 0;
+
935 
+
936  for (int i = 0; i<n; ++i) {
+
937  column_sum += fabs(matrix(i,j));
+
938  }
+
939  norm = std::max(norm, column_sum);
+
940  }
+
941 
+
942  return norm;
+
943 }
+
944 
+
945 
+
947 template<typename MatType>
+
948 typename MatType::ValueType
+
949 lOneNorm(const MatType& matrix)
+
950 {
+
951  int n = MatType::size;
+
952  typename MatType::ValueType norm = 0;
+
953 
+
954  for( int i = 0; i<n; ++i) {
+
955  typename MatType::ValueType row_sum = 0;
+
956 
+
957  for (int j = 0; j<n; ++j) {
+
958  row_sum += fabs(matrix(i,j));
+
959  }
+
960  norm = std::max(norm, row_sum);
+
961  }
+
962 
+
963  return norm;
+
964 }
+
965 
+
966 
+
974 template<typename MatType>
+
975 bool
+
976 polarDecomposition(const MatType& input, MatType& unitary,
+
977  MatType& positive_hermitian, unsigned int MAX_ITERATIONS=100)
+
978 {
+
979  unitary = input;
+
980  MatType new_unitary(input);
+
981  MatType unitary_inv;
+
982 
+
983  if (fabs(unitary.det()) < math::Tolerance<typename MatType::ValueType>::value()) return false;
+
984 
+
985  unsigned int iteration(0);
+
986 
+
987  typename MatType::ValueType linf_of_u;
+
988  typename MatType::ValueType l1nm_of_u;
+
989  typename MatType::ValueType linf_of_u_inv;
+
990  typename MatType::ValueType l1nm_of_u_inv;
+
991  typename MatType::ValueType l1_error = 100;
+
992  double gamma;
+
993 
+
994  do {
+
995  unitary_inv = unitary.inverse();
+
996  linf_of_u = lInfinityNorm(unitary);
+
997  l1nm_of_u = lOneNorm(unitary);
+
998 
+
999  linf_of_u_inv = lInfinityNorm(unitary_inv);
+
1000  l1nm_of_u_inv = lOneNorm(unitary_inv);
+
1001 
+
1002  gamma = sqrt( sqrt( (l1nm_of_u_inv * linf_of_u_inv ) / (l1nm_of_u * linf_of_u) ));
+
1003 
+
1004  new_unitary = 0.5*(gamma * unitary + (1./gamma) * unitary_inv.transpose() );
+
1005 
+
1006  l1_error = lInfinityNorm(unitary - new_unitary);
+
1007  unitary = new_unitary;
+
1008 
+
1010  if (iteration > MAX_ITERATIONS) return false;
+
1011  iteration++;
+ +
1013 
+
1014  positive_hermitian = unitary.transpose() * input;
+
1015  return true;
+
1016 }
+
1017 
+
1018 } // namespace math
+
1019 } // namespace OPENVDB_VERSION_NAME
+
1020 } // namespace openvdb
+
1021 
+
1022 #endif // OPENVDB_MATH_MAT_HAS_BEEN_INCLUDED
+
1023 
+
1024 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
1025 // All rights reserved. This software is distributed under the
+
1026 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
Mat(Mat const &src)
Copy constructor. Used when the class signature matches exactly.
Definition: Mat.h:69
+
T & z()
Definition: Quat.h:225
+
T & y()
Definition: Quat.h:224
+
void sqrtSolve(const MatType &aA, MatType &aB, double aTol=0.01)
Solve for A=B*B, given A.
Definition: Mat.h:776
+
T & z()
Definition: Vec3.h:99
+
MatType rotation(const Vec3< typename MatType::value_type > &_v1, const Vec3< typename MatType::value_type > &_v2, typename MatType::value_type eps=1.0e-8)
Return a rotation matrix that maps v1 onto v2 about the cross product of v1 and v2.
Definition: Mat.h:482
+
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
Definition: Math.h:839
+ +
Definition: Mat.h:146
+
void write(std::ostream &os) const
Definition: Mat.h:131
+
Definition: Mat.h:145
+
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
+
T mm[SIZE *SIZE]
Definition: Mat.h:141
+
bool isUnitary(const MatType &m)
Determine if a matrix is unitary (i.e., rotation or reflection).
Definition: Mat.h:897
+
T & w()
Definition: Quat.h:226
+
Definition: Exceptions.h:78
+
T ValueType
Definition: Mat.h:56
+
Definition: Math.h:840
+
T dot(const Quat &q) const
Dot product.
Definition: Quat.h:492
+
MatType::ValueType lInfinityNorm(const MatType &matrix)
Return the norm of an N x N matrix.
Definition: Mat.h:928
+
MatType shear(Axis axis0, Axis axis1, typename MatType::value_type shear)
Set the matrix to a shear along axis0 by a fraction of axis1.
Definition: Mat.h:667
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & max(const T &a, const T &b)
Definition: Composite.h:132
+
friend std::ostream & operator<<(std::ostream &ostr, const Mat< SIZE, T > &m)
Write a Mat to an output stream.
Definition: Mat.h:123
+ + +
Vec3< T > unit(T eps=0) const
return normalized this, throws if null vector
Definition: Vec3.h:360
+
const int size
Definition: MaskToLevelSet.h:119
+ + +
bool isApproxEqual(const Type &a, const Type &b)
Return true if a is equal to b to within the default floating-point comparison tolerance.
Definition: Math.h:370
+
static unsigned numRows()
Definition: Mat.h:60
+ +
RotationOrder
Definition: Math.h:845
+
MatType unit(const MatType &in, typename MatType::value_type eps, Vec3< typename MatType::value_type > &scaling)
Return a copy of the given matrix with its upper 3x3 rows normalized, and return the length of each o...
Definition: Mat.h:640
+ +
T dot(const Vec3< T > &v) const
Dot product.
Definition: Vec3.h:203
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
T & x()
Reference to the component, e.g. v.x() = 4.5f;.
Definition: Vec3.h:97
+
T value_type
Definition: Mat.h:55
+
Definition: Exceptions.h:39
+
Tolerance for floating-point comparison.
Definition: Math.h:125
+
MatType scale(const Vec3< typename MatType::value_type > &s)
Return a matrix that scales by s.
Definition: Mat.h:594
+
T angle(const Vec2< T > &v1, const Vec2< T > &v2)
Definition: Vec2.h:446
+
T & x()
Reference to the component, e.g. q.x() = 4.5f;.
Definition: Quat.h:223
+
Mat()
Definition: Mat.h:66
+
MatType::ValueType lOneNorm(const MatType &matrix)
Return the norm of an N x N matrix.
Definition: Mat.h:949
+
bool normalize(T eps=T(1.0e-7))
this = normalized this
Definition: Vec3.h:348
+
Definition: Math.h:841
+
Vec3< typename MatType::value_type > getScale(const MatType &mat)
Return a Vec3 representing the lengths of the passed matrix's upper 3x3's rows.
Definition: Mat.h:612
+
void read(std::istream &is)
Definition: Mat.h:135
+
bool isInvertible(const MatType &m)
Determine if a matrix is invertible.
Definition: Mat.h:877
+
T & y()
Definition: Vec3.h:98
+
MatType aim(const Vec3< typename MatType::value_type > &direction, const Vec3< typename MatType::value_type > &vertical)
Return an orientation matrix such that z points along direction, and y is along the direction / verti...
Definition: Mat.h:705
+
static unsigned numColumns()
Definition: Mat.h:61
+
std::string str(unsigned indentation=0) const
Definition: Mat.h:85
+
Vec3< typename MatType::value_type > eulerAngles(const MatType &mat, RotationOrder rotationOrder, typename MatType::value_type eps=static_cast< typename MatType::value_type >(1.0e-8))
Return the Euler angles composing the given rotation matrix.
Definition: Mat.h:314
+
Definition: Exceptions.h:84
+
Definition: Exceptions.h:88
+
MatType snapMatBasis(const MatType &source, Axis axis, const Vec3< typename MatType::value_type > &direction)
This function snaps a specific axis to a specific direction, preserving scaling.
Definition: Mat.h:730
+ +
Axis
Definition: Math.h:838
+ +
int32_t Abs(int32_t i)
Return the absolute value of the given quantity.
Definition: Math.h:293
+
MatType skew(const Vec3< typename MatType::value_type > &skew)
Return a matrix as the cross product of the given vector.
Definition: Mat.h:687
+ +
void powSolve(const MatType &aA, MatType &aB, double aPower, double aTol=0.01)
Definition: Mat.h:810
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
Definition: Mat.h:52
+
static MatType & padMat4(MatType &dest)
Write 0s along Mat4's last row and column, and a 1 on its diagonal.
Definition: Mat.h:762
+
Vec3< T > cross(const Vec3< T > &v) const
Return the cross product of "this" vector and v;.
Definition: Vec3.h:232
+
bool isSymmetric(const MatType &m)
Determine if a matrix is symmetric.
Definition: Mat.h:888
+
bool isDiagonal(const MatType &mat)
Determine if a matrix is diagonal.
Definition: Mat.h:910
+
static unsigned numElements()
Definition: Mat.h:62
+
bool isIdentity(const MatType &m)
Determine if a matrix is an identity matrix.
Definition: Mat.h:868
+
bool polarDecomposition(const MatType &input, MatType &unitary, MatType &positive_hermitian, unsigned int MAX_ITERATIONS=100)
Decompose an invertible 3x3 matrix into a unitary matrix followed by a symmetric matrix (positive sem...
Definition: Mat.h:976
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/Math_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/Math_8h_source.html new file mode 100644 index 00000000..9e5251e7 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/Math_8h_source.html @@ -0,0 +1,963 @@ + + + + + + +OpenVDB: Math.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
Math.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
34 
+
35 #ifndef OPENVDB_MATH_HAS_BEEN_INCLUDED
+
36 #define OPENVDB_MATH_HAS_BEEN_INCLUDED
+
37 
+
38 #include <assert.h>
+
39 #include <algorithm> // for std::max()
+
40 #include <cmath> // for floor(), ceil() and sqrt()
+
41 #include <math.h> // for pow(), fabs() etc
+
42 #include <cstdlib> // for srand(), abs(int)
+
43 #include <limits> // for std::numeric_limits<Type>::max()
+
44 #include <string>
+
45 #include <boost/numeric/conversion/conversion_traits.hpp>
+
46 #include <boost/math/special_functions/cbrt.hpp>
+
47 #include <boost/math/special_functions/fpclassify.hpp> // boost::math::isfinite
+
48 #include <boost/random/mersenne_twister.hpp> // for boost::random::mt19937
+
49 #include <boost/random/uniform_01.hpp>
+
50 #include <boost/random/uniform_int.hpp>
+
51 #include <boost/version.hpp> // for BOOST_VERSION
+
52 #include <openvdb/Platform.h>
+
53 #include <openvdb/version.h>
+
54 
+
55 
+
56 // Compile pragmas
+
57 
+
58 #define PRAGMA(x) _Pragma(#x)
+
59 
+
60 // Intel(r) compiler fires remark #1572: floating-point equality and inequality
+
61 // comparisons are unrealiable when == or != is used with floating point operands.
+
62 #if defined(__INTEL_COMPILER)
+
63  #define OPENVDB_NO_FP_EQUALITY_WARNING_BEGIN \
+
64  _Pragma("warning (push)") \
+
65  _Pragma("warning (disable:1572)")
+
66  #define OPENVDB_NO_FP_EQUALITY_WARNING_END \
+
67  _Pragma("warning (pop)")
+
68 #elif defined(__clang__)
+
69  #define OPENVDB_NO_FP_EQUALITY_WARNING_BEGIN \
+
70  PRAGMA(clang diagnostic push) \
+
71  PRAGMA(clang diagnostic ignored "-Wfloat-equal")
+
72  #define OPENVDB_NO_FP_EQUALITY_WARNING_END \
+
73  PRAGMA(clang diagnostic pop)
+
74 #else
+
75  // For GCC, #pragma GCC diagnostic ignored "-Wfloat-equal"
+
76  // isn't working until gcc 4.2+,
+
77  // Trying
+
78  // #pragma GCC system_header
+
79  // creates other problems, most notably "warning: will never be executed"
+
80  // in from templates, unsure of how to work around.
+
81  // If necessary, could use integer based comparisons for equality
+
82  #define OPENVDB_NO_FP_EQUALITY_WARNING_BEGIN
+
83  #define OPENVDB_NO_FP_EQUALITY_WARNING_END
+
84 #endif
+
85 
+
86 namespace openvdb {
+ +
88 namespace OPENVDB_VERSION_NAME {
+
89 
+
94 template<typename T> inline T zeroVal() { return T(0); }
+
96 template<> inline std::string zeroVal<std::string>() { return ""; }
+
98 template<> inline bool zeroVal<bool>() { return false; }
+
99 
+
101 
+
102 inline std::string operator+(const std::string& s, bool) { return s; }
+
105 inline std::string operator+(const std::string& s, int) { return s; }
+
106 inline std::string operator+(const std::string& s, float) { return s; }
+
107 inline std::string operator+(const std::string& s, double) { return s; }
+
109 
+
110 
+
111 namespace math {
+
112 
+
116 template<typename T> inline T negative(const T& val) { return T(-val); }
+
118 template<> inline bool negative(const bool& val) { return !val; }
+
120 template<> inline std::string negative(const std::string& val) { return val; }
+
121 
+
122 
+
124 template<typename T> struct Tolerance { static T value() { return zeroVal<T>(); } };
+
126 template<> struct Tolerance<float> { static float value() { return 1e-8f; } };
+
127 template<> struct Tolerance<double> { static double value() { return 1e-15; } };
+
129 
+
131 template<typename T> struct Delta { static T value() { return zeroVal<T>(); } };
+
133 template<> struct Delta<float> { static float value() { return 1e-5f; } };
+
134 template<> struct Delta<double> { static double value() { return 1e-9; } };
+
136 
+
137 
+
138 // ==========> Random Values <==================
+
139 
+
142 template<typename FloatType = double, typename EngineType = boost::mt19937>
+
143 class Rand01
+
144 {
+
145 private:
+
146  EngineType mEngine;
+
147  boost::uniform_01<FloatType> mRand;
+
148 
+
149 public:
+
150  typedef FloatType ValueType;
+
151 
+
154  Rand01(const EngineType& engine): mEngine(engine) {}
+
155 
+
158  Rand01(unsigned int seed): mEngine(static_cast<typename EngineType::result_type>(seed)) {}
+
159 
+
161  void setSeed(unsigned int seed)
+
162  {
+
163  mEngine.seed(static_cast<typename EngineType::result_type>(seed));
+
164  }
+
165 
+
167  const EngineType& engine() const { return mEngine; }
+
168 
+
170  FloatType operator()() { return mRand(mEngine); }
+
171 };
+
172 
+ +
174 
+
175 
+
178 template<typename IntType = int, typename EngineType = boost::mt19937>
+
179 class RandInt
+
180 {
+
181 private:
+
182 #if BOOST_VERSION >= 104700
+
183  typedef boost::random::uniform_int_distribution<IntType> Distr;
+
184 #else
+
185  typedef boost::uniform_int<IntType> Distr;
+
186 #endif
+
187  EngineType mEngine;
+
188  Distr mRand;
+
189 
+
190 public:
+
194  RandInt(const EngineType& engine, IntType imin, IntType imax):
+
195  mEngine(engine),
+
196  mRand(std::min(imin, imax), std::max(imin, imax))
+
197  {}
+
198 
+
202  RandInt(unsigned int seed, IntType imin, IntType imax):
+
203  mEngine(static_cast<typename EngineType::result_type>(seed)),
+
204  mRand(std::min(imin, imax), std::max(imin, imax))
+
205  {}
+
206 
+
208  void setRange(IntType imin, IntType imax)
+
209  {
+
210  mRand = Distr(std::min(imin, imax), std::max(imin, imax));
+
211  }
+
212 
+
214  void setSeed(unsigned int seed)
+
215  {
+
216  mEngine.seed(static_cast<typename EngineType::result_type>(seed));
+
217  }
+
218 
+
220  const EngineType& engine() const { return mEngine; }
+
221 
+
223  IntType operator()() { return mRand(mEngine); }
+
224 
+
227  IntType operator()(IntType imin, IntType imax)
+
228  {
+
229  const IntType lo = std::min(imin, imax), hi = std::max(imin, imax);
+
230 #if BOOST_VERSION >= 104700
+
231  return mRand(mEngine, typename Distr::param_type(lo, hi));
+
232 #else
+
233  return Distr(lo, hi)(mEngine);
+
234 #endif
+
235  }
+
236 };
+
237 
+ +
239 
+
240 
+
241 // ==========> Clamp <==================
+
242 
+
244 template<typename Type>
+
245 inline Type
+
246 Clamp(Type x, Type min, Type max)
+
247 {
+
248  assert( !(min>max) );
+
249  return x > min ? x < max ? x : max : min;
+
250 }
+
251 
+
252 
+
254 template<typename Type>
+
255 inline Type
+
256 Clamp01(Type x) { return x > Type(0) ? x < Type(1) ? x : Type(1) : Type(0); }
+
257 
+
258 
+
260 template<typename Type>
+
261 inline bool
+
262 ClampTest01(Type &x)
+
263 {
+
264  if (x >= Type(0) && x <= Type(1)) return false;
+
265  x = x < Type(0) ? Type(0) : Type(1);
+
266  return true;
+
267 }
+
268 
+
270 template<typename Type>
+
271 inline Type
+ +
273 {
+
274  return x > 0 ? x < 1 ? (3-2*x)*x*x : Type(1) : Type(0);
+
275 }
+
276 
+
279 template<typename Type>
+
280 inline Type
+
281 SmoothUnitStep(Type x, Type min, Type max)
+
282 {
+
283  assert(min < max);
+
284  return SmoothUnitStep((x-min)/(max-min));
+
285 }
+
286 
+
287 
+
288 // ==========> Absolute Value <==================
+
289 
+
290 
+
292 inline int32_t Abs(int32_t i) { return abs(i); }
+
294 inline int64_t Abs(int64_t i)
+
295 {
+
296 #ifdef _MSC_VER
+
297  return (i < int64_t(0) ? -i : i);
+
298 #else
+
299  return labs(i);
+
300 #endif
+
301 }
+
302 inline float Abs(float x) { return fabsf(x); }
+
303 inline double Abs(double x) { return fabs(x); }
+
304 inline long double Abs(long double x) { return fabsl(x); }
+
305 inline uint32_t Abs(uint32_t i) { return i; }
+
306 inline uint64_t Abs(uint64_t i) { return i; }
+
307 inline bool Abs(bool b) { return b; }
+
308 // On OSX size_t and uint64_t are different types
+
309 #if defined(__APPLE__) || defined(MACOSX)
+
310 inline size_t Abs(size_t i) { return i; }
+
311 #endif
+
312 
+
313 
+
314 
+
316 
+
317 
+
318 // ==========> Value Comparison <==================
+
319 
+
320 
+
322 template<typename Type>
+
323 inline bool
+
324 isZero(const Type& x)
+
325 {
+ +
327  return x == zeroVal<Type>();
+ +
329 }
+
330 
+
331 
+
334 template<typename Type>
+
335 inline bool
+
336 isApproxZero(const Type& x)
+
337 {
+
338  const Type tolerance = Type(zeroVal<Type>() + Tolerance<Type>::value());
+
339  return !(x > tolerance) && !(x < -tolerance);
+
340 }
+
341 
+
343 template<typename Type>
+
344 inline bool
+
345 isApproxZero(const Type& x, const Type& tolerance)
+
346 {
+
347  return !(x > tolerance) && !(x < -tolerance);
+
348 }
+
349 
+
350 
+
352 template<typename Type>
+
353 inline bool
+
354 isNegative(const Type& x) { return x < zeroVal<Type>(); }
+
355 
+
357 template<> inline bool isNegative<bool>(const bool&) { return false; }
+
358 
+
359 
+
361 template<typename Type>
+
362 inline bool
+
363 isFinite(const Type& x) { return boost::math::isfinite(x); }
+
364 
+
365 
+
368 template<typename Type>
+
369 inline bool
+
370 isApproxEqual(const Type& a, const Type& b)
+
371 {
+
372  const Type tolerance = Type(zeroVal<Type>() + Tolerance<Type>::value());
+
373  return !(Abs(a - b) > tolerance);
+
374 }
+
375 
+
376 
+
378 template<typename Type>
+
379 inline bool
+
380 isApproxEqual(const Type& a, const Type& b, const Type& tolerance)
+
381 {
+
382  return !(Abs(a - b) > tolerance);
+
383 }
+
384 
+
385 #define OPENVDB_EXACT_IS_APPROX_EQUAL(T) \
+
386  template<> inline bool isApproxEqual<T>(const T& a, const T& b) { return a == b; } \
+
387  template<> inline bool isApproxEqual<T>(const T& a, const T& b, const T&) { return a == b; } \
+
388 
+
389 
+ + +
392 
+
393 
+
396 template<typename Type>
+
397 inline bool
+
398 isApproxLarger(const Type& a, const Type& b, const Type& tolerance)
+
399 {
+
400  return (b - a < tolerance);
+
401 }
+
402 
+
403 
+
405 template<typename T0, typename T1>
+
406 inline bool
+
407 isExactlyEqual(const T0& a, const T1& b)
+
408 {
+ +
410  return a == b;
+ +
412 }
+
413 
+
414 
+
415 template<typename Type>
+
416 inline bool
+
417 isRelOrApproxEqual(const Type& a, const Type& b, const Type& absTol, const Type& relTol)
+
418 {
+
419  // First check to see if we are inside the absolute tolerance
+
420  // Necessary for numbers close to 0
+
421  if (!(Abs(a - b) > absTol)) return true;
+
422 
+
423  // Next check to see if we are inside the relative tolerance
+
424  // to handle large numbers that aren't within the abs tolerance
+
425  // but could be the closest floating point representation
+
426  double relError;
+
427  if (Abs(b) > Abs(a)) {
+
428  relError = Abs((a - b) / b);
+
429  } else {
+
430  relError = Abs((a - b) / a);
+
431  }
+
432  return (relError <= relTol);
+
433 }
+
434 
+
435 template<>
+
436 inline bool
+
437 isRelOrApproxEqual(const bool& a, const bool& b, const bool&, const bool&)
+
438 {
+
439  return (a == b);
+
440 }
+
441 
+
442 
+
443 // Avoid strict aliasing issues by using type punning
+
444 // http://cellperformance.beyond3d.com/articles/2006/06/understanding-strict-aliasing.html
+
445 // Using "casting through a union(2)"
+
446 inline int32_t
+
447 floatToInt32(const float aFloatValue)
+
448 {
+
449  union FloatOrInt32 { float floatValue; int32_t int32Value; };
+
450  const FloatOrInt32* foi = reinterpret_cast<const FloatOrInt32*>(&aFloatValue);
+
451  return foi->int32Value;
+
452 }
+
453 
+
454 
+
455 inline int64_t
+
456 doubleToInt64(const double aDoubleValue)
+
457 {
+
458  union DoubleOrInt64 { double doubleValue; int64_t int64Value; };
+
459  const DoubleOrInt64* dol = reinterpret_cast<const DoubleOrInt64*>(&aDoubleValue);
+
460  return dol->int64Value;
+
461 }
+
462 
+
463 
+
464 // aUnitsInLastPlace is the allowed difference between the least significant digits
+
465 // of the numbers' floating point representation
+
466 // Please read the reference paper before trying to use isUlpsEqual
+
467 // http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
+
468 inline bool
+
469 isUlpsEqual(const double aLeft, const double aRight, const int64_t aUnitsInLastPlace)
+
470 {
+
471  int64_t longLeft = doubleToInt64(aLeft);
+
472  // Because of 2's complement, must restore lexicographical order
+
473  if (longLeft < 0) {
+
474  longLeft = INT64_C(0x8000000000000000) - longLeft;
+
475  }
+
476 
+
477  int64_t longRight = doubleToInt64(aRight);
+
478  // Because of 2's complement, must restore lexicographical order
+
479  if (longRight < 0) {
+
480  longRight = INT64_C(0x8000000000000000) - longRight;
+
481  }
+
482 
+
483  int64_t difference = labs(longLeft - longRight);
+
484  return (difference <= aUnitsInLastPlace);
+
485 }
+
486 
+
487 inline bool
+
488 isUlpsEqual(const float aLeft, const float aRight, const int32_t aUnitsInLastPlace)
+
489 {
+
490  int32_t intLeft = floatToInt32(aLeft);
+
491  // Because of 2's complement, must restore lexicographical order
+
492  if (intLeft < 0) {
+
493  intLeft = 0x80000000 - intLeft;
+
494  }
+
495 
+
496  int32_t intRight = floatToInt32(aRight);
+
497  // Because of 2's complement, must restore lexicographical order
+
498  if (intRight < 0) {
+
499  intRight = 0x80000000 - intRight;
+
500  }
+
501 
+
502  int32_t difference = abs(intLeft - intRight);
+
503  return (difference <= aUnitsInLastPlace);
+
504 }
+
505 
+
506 
+
508 
+
509 
+
510 // ==========> Pow <==================
+
511 
+
513 template<typename Type>
+
514 inline Type Pow2(Type x) { return x*x; }
+
515 
+
517 template<typename Type>
+
518 inline Type Pow3(Type x) { return x*x*x; }
+
519 
+
521 template<typename Type>
+
522 inline Type Pow4(Type x) { return Pow2(Pow2(x)); }
+
523 
+
525 template<typename Type>
+
526 Type
+
527 Pow(Type x, int n)
+
528 {
+
529  Type ans = 1;
+
530  if (n < 0) {
+
531  n = -n;
+
532  x = Type(1)/x;
+
533  }
+
534  while (n--) ans *= x;
+
535  return ans;
+
536 }
+
537 
+
539 inline float
+
541 Pow(float b, float e)
+
542 {
+
543  assert( b >= 0.0f && "Pow(float,float): base is negative" );
+
544  return powf(b,e);
+
545 }
+
546 
+
547 inline double
+
548 Pow(double b, double e)
+
549 {
+
550  assert( b >= 0.0 && "Pow(double,double): base is negative" );
+
551  return pow(b,e);
+
552 }
+
554 
+
555 
+
556 // ==========> Max <==================
+
557 
+
559 template<typename Type>
+
560 inline const Type&
+
561 Max(const Type& a, const Type& b)
+
562 {
+
563  return std::max(a,b) ;
+
564 }
+
565 
+
567 template<typename Type>
+
568 inline const Type&
+
569 Max(const Type& a, const Type& b, const Type& c)
+
570 {
+
571  return std::max( std::max(a,b), c ) ;
+
572 }
+
573 
+
575 template<typename Type>
+
576 inline const Type&
+
577 Max(const Type& a, const Type& b, const Type& c, const Type& d)
+
578 {
+
579  return std::max(std::max(a,b), std::max(c,d));
+
580 }
+
581 
+
583 template<typename Type>
+
584 inline const Type&
+
585 Max(const Type& a, const Type& b, const Type& c, const Type& d, const Type& e)
+
586 {
+
587  return std::max(std::max(a,b), Max(c,d,e));
+
588 }
+
589 
+
591 template<typename Type>
+
592 inline const Type&
+
593 Max(const Type& a, const Type& b, const Type& c, const Type& d, const Type& e, const Type& f)
+
594 {
+
595  return std::max(Max(a,b,c), Max(d,e,f));
+
596 }
+
597 
+
599 template<typename Type>
+
600 inline const Type&
+
601 Max(const Type& a, const Type& b, const Type& c, const Type& d,
+
602  const Type& e, const Type& f, const Type& g)
+
603 {
+
604  return std::max(Max(a,b,c,d), Max(e,f,g));
+
605 }
+
606 
+
608 template<typename Type>
+
609 inline const Type&
+
610 Max(const Type& a, const Type& b, const Type& c, const Type& d,
+
611  const Type& e, const Type& f, const Type& g, const Type& h)
+
612 {
+
613  return std::max(Max(a,b,c,d), Max(e,f,g,h));
+
614 }
+
615 
+
616 
+
617 // ==========> Min <==================
+
618 
+
620 template<typename Type>
+
621 inline const Type&
+
622 Min(const Type& a, const Type& b) { return std::min(a, b); }
+
623 
+
625 template<typename Type>
+
626 inline const Type&
+
627 Min(const Type& a, const Type& b, const Type& c) { return std::min(std::min(a, b), c); }
+
628 
+
630 template<typename Type>
+
631 inline const Type&
+
632 Min(const Type& a, const Type& b, const Type& c, const Type& d)
+
633 {
+
634  return std::min(std::min(a, b), std::min(c, d));
+
635 }
+
636 
+
638 template<typename Type>
+
639 inline const Type&
+
640 Min(const Type& a, const Type& b, const Type& c, const Type& d, const Type& e)
+
641 {
+
642  return std::min(std::min(a,b), Min(c,d,e));
+
643 }
+
644 
+
646 template<typename Type>
+
647 inline const Type&
+
648 Min(const Type& a, const Type& b, const Type& c, const Type& d, const Type& e, const Type& f)
+
649 {
+
650  return std::min(Min(a,b,c), Min(d,e,f));
+
651 }
+
652 
+
654 template<typename Type>
+
655 inline const Type&
+
656 Min(const Type& a, const Type& b, const Type& c, const Type& d,
+
657  const Type& e, const Type& f, const Type& g)
+
658 {
+
659  return std::min(Min(a,b,c,d), Min(e,f,g));
+
660 }
+
661 
+
663 template<typename Type>
+
664 inline const Type&
+
665 Min(const Type& a, const Type& b, const Type& c, const Type& d,
+
666  const Type& e, const Type& f, const Type& g, const Type& h)
+
667 {
+
668  return std::min(Min(a,b,c,d), Min(e,f,g,h));
+
669 }
+
670 
+
671 
+
672 // ============> Exp <==================
+
673 
+
675 template<typename Type>
+
676 inline Type Exp(const Type& x) { return std::exp(x); }
+
677 
+
678 
+
680 
+
681 
+
683 template <typename Type>
+
684 inline int Sign(const Type &x) { return (zeroVal<Type>() < x) - (x < zeroVal<Type>()); }
+
685 
+
686 
+
689 template <typename Type>
+
690 inline bool
+
691 SignChange(const Type& a, const Type& b)
+
692 {
+
693  return ( (a<zeroVal<Type>()) ^ (b<zeroVal<Type>()) );
+
694 }
+
695 
+
696 
+
699 template <typename Type>
+
700 inline bool
+
701 ZeroCrossing(const Type& a, const Type& b)
+
702 {
+
703  return a * b <= zeroVal<Type>();
+
704 }
+
705 
+
706 
+
708 inline float Sqrt(float x) { return sqrtf(x); }
+
710 inline double Sqrt(double x) { return sqrt(x); }
+
711 inline long double Sqrt(long double x) { return sqrtl(x); }
+
713 
+
714 
+
716 inline float Cbrt(float x) { return boost::math::cbrt(x); }
+
718 inline double Cbrt(double x) { return boost::math::cbrt(x); }
+
719 inline long double Cbrt(long double x) { return boost::math::cbrt(x); }
+
721 
+
722 
+
724 inline int Mod(int x, int y) { return (x % y); }
+
726 inline float Mod(float x, float y) { return fmodf(x,y); }
+
727 inline double Mod(double x, double y) { return fmod(x,y); }
+
728 inline long double Mod(long double x, long double y) { return fmodl(x,y); }
+
729 template<typename Type> inline Type Remainder(Type x, Type y) { return Mod(x,y); }
+
731 
+
732 
+
734 inline float RoundUp(float x) { return ceilf(x); }
+
736 inline double RoundUp(double x) { return ceil(x); }
+
737 inline long double RoundUp(long double x) { return ceill(x); }
+
739 template<typename Type>
+
741 inline Type
+
742 RoundUp(Type x, Type base)
+
743 {
+
744  Type remainder = Remainder(x, base);
+
745  return remainder ? x-remainder+base : x;
+
746 }
+
747 
+
748 
+
750 inline float RoundDown(float x) { return floorf(x); }
+
752 inline double RoundDown(double x) { return floor(x); }
+
753 inline long double RoundDown(long double x) { return floorl(x); }
+
755 template<typename Type>
+
757 inline Type
+
758 RoundDown(Type x, Type base)
+
759 {
+
760  Type remainder = Remainder(x, base);
+
761  return remainder ? x-remainder : x;
+
762 }
+
763 
+
764 
+
766 inline float Round(float x) { return RoundDown(x + 0.5f); }
+
768 inline double Round(double x) { return RoundDown(x + 0.5); }
+
769 inline long double Round(long double x) { return RoundDown(x + 0.5l); }
+
771 
+
772 
+
775 template<typename Type>
+
776 inline Type
+
777 EuclideanRemainder(Type x) { return x - RoundDown(x); }
+
778 
+
779 
+
781 template<typename Type>
+
782 inline Type
+
783 IntegerPart(Type x)
+
784 {
+
785  return (x > 0 ? RoundDown(x) : RoundUp(x));
+
786 }
+
787 
+
789 template<typename Type>
+
790 inline Type
+
791 FractionalPart(Type x) { return Mod(x,Type(1)); }
+
792 
+
793 
+
795 inline int Floor(float x) { return int(RoundDown(x)); }
+
797 inline int Floor(double x) { return int(RoundDown(x)); }
+
798 inline int Floor(long double x) { return int(RoundDown(x)); }
+
800 
+
801 
+
803 inline int Ceil(float x) { return int(RoundUp(x)); }
+
805 inline int Ceil(double x) { return int(RoundUp(x)); }
+
806 inline int Ceil(long double x) { return int(RoundUp(x)); }
+
808 
+
809 
+
811 template<typename Type>
+
812 inline Type Chop(Type x, Type delta) { return (Abs(x) < delta ? zeroVal<Type>() : x); }
+
813 
+
814 
+
816 template<typename Type>
+
817 inline Type
+
818 Truncate(Type x, unsigned int digits)
+
819 {
+
820  Type tenth = Pow(10,digits);
+
821  return RoundDown(x*tenth+0.5)/tenth;
+
822 }
+
823 
+
824 
+
826 
+
827 
+
829 template<typename Type>
+
830 inline Type
+
831 Inv(Type x)
+
832 {
+
833  assert(x);
+
834  return Type(1)/x;
+
835 }
+
836 
+
837 
+
838 enum Axis {
+
839  X_AXIS = 0,
+
840  Y_AXIS = 1,
+
841  Z_AXIS = 2
+
842 };
+
843 
+
844 // enum values are consistent with their historical mx analogs.
+ + + + + + + + + +
854 };
+
855 
+
856 
+
857 template <typename S, typename T>
+
858 struct promote {
+
859  typedef typename boost::numeric::conversion_traits<S, T>::supertype type;
+
860 };
+
861 
+
862 
+
870 template<typename Vec3T>
+
871 size_t
+
872 MinIndex(const Vec3T& v)
+
873 {
+
874 #ifndef _MSC_VER // Visual C++ doesn't guarantee thread-safe initialization of local statics
+
875  static
+
876 #endif
+
877  const size_t hashTable[8] = { 2, 1, 9, 1, 2, 9, 0, 0 };//9 is a dummy value
+
878  const size_t hashKey =
+
879  ((v[0] < v[1]) << 2) + ((v[0] < v[2]) << 1) + (v[1] < v[2]);// ?*4+?*2+?*1
+
880  return hashTable[hashKey];
+
881 }
+
882 
+
883 
+
891 template<typename Vec3T>
+
892 size_t
+
893 MaxIndex(const Vec3T& v)
+
894 {
+
895 #ifndef _MSC_VER // Visual C++ doesn't guarantee thread-safe initialization of local statics
+
896  static
+
897 #endif
+
898  const size_t hashTable[8] = { 2, 1, 9, 1, 2, 9, 0, 0 };//9 is a dummy value
+
899  const size_t hashKey =
+
900  ((v[0] > v[1]) << 2) + ((v[0] > v[2]) << 1) + (v[1] > v[2]);// ?*4+?*2+?*1
+
901  return hashTable[hashKey];
+
902 }
+
903 
+
904 } // namespace math
+
905 } // namespace OPENVDB_VERSION_NAME
+
906 } // namespace openvdb
+
907 
+
908 #endif // OPENVDB_MATH_MATH_HAS_BEEN_INCLUDED
+
909 
+
910 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
911 // All rights reserved. This software is distributed under the
+
912 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
long double Cbrt(long double x)
Return the cube root of a floating-point value.
Definition: Math.h:719
+
bool isApproxEqual(const Type &a, const Type &b, const Type &tolerance)
Return true if a is equal to b to within the given tolerance.
Definition: Math.h:380
+
bool isExactlyEqual(const T0 &a, const T1 &b)
Return true if a is exactly equal to b.
Definition: Math.h:407
+
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
+
Definition: Math.h:839
+
Delta for small floating-point offsets.
Definition: Math.h:132
+
FloatType ValueType
Definition: Math.h:150
+ +
bool isFinite(const Type &x)
Return true if x is finite.
Definition: Math.h:363
+
Rand01(const EngineType &engine)
Initialize the generator.
Definition: Math.h:154
+
static double value()
Definition: Math.h:127
+
Type Pow2(Type x)
Return .
Definition: Math.h:514
+
Type Truncate(Type x, unsigned int digits)
Return x truncated to the given number of decimal digits.
Definition: Math.h:818
+
Type Remainder(Type x, Type y)
Return the remainder of x / y.
Definition: Math.h:729
+
Simple generator of random numbers over the range [0, 1)
Definition: Math.h:143
+
bool isApproxLarger(const Type &a, const Type &b, const Type &tolerance)
Return true if a is larger than b to within the given tolerance, i.e., if b - a < tolerance...
Definition: Math.h:398
+
Type Pow3(Type x)
Return .
Definition: Math.h:518
+
bool isZero(const Type &x)
Return true if x is exactly equal to zero.
Definition: Math.h:324
+
Type RoundDown(Type x, Type base)
Return x rounded down to the nearest multiple of base.
Definition: Math.h:758
+
bool isNegative< bool >(const bool &)
Return false, since bool values are never less than zero.
Definition: Math.h:357
+
Definition: Math.h:840
+
Type Clamp(Type x, Type min, Type max)
Return x clamped to [min, max].
Definition: Math.h:246
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & max(const T &a, const T &b)
Definition: Composite.h:132
+
Type Chop(Type x, Type delta)
Return x if it is greater or equal in magnitude than delta. Otherwise, return zero.
Definition: Math.h:812
+
bool isRelOrApproxEqual(const bool &a, const bool &b, const bool &, const bool &)
Definition: Math.h:437
+ + +
std::string negative(const std::string &val)
Return the "negation" of the given string.
Definition: Math.h:120
+
Simple random integer generator.
Definition: Math.h:179
+
long double Mod(long double x, long double y)
Return the remainder of x / y.
Definition: Math.h:728
+
void setSeed(unsigned int seed)
Set the seed value for the random number generator.
Definition: Math.h:214
+ + +
Type Exp(const Type &x)
Return .
Definition: Math.h:676
+
static float value()
Definition: Math.h:133
+
static double value()
Definition: Math.h:134
+ +
static float value()
Definition: Math.h:126
+
RotationOrder
Definition: Math.h:845
+
Rand01(unsigned int seed)
Initialize the generator.
Definition: Math.h:158
+
int Sign(const Type &x)
Return the sign of the given value as an integer (either -1, 0 or 1).
Definition: Math.h:684
+
int Ceil(long double x)
Return the ceiling of x.
Definition: Math.h:806
+
Type SmoothUnitStep(Type x, Type min, Type max)
Return 0 if x < min, 1 if x > max or else , where .
Definition: Math.h:281
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
Type Clamp01(Type x)
Return x clamped to [0, 1].
Definition: Math.h:256
+
bool ClampTest01(Type &x)
Return true if x is outside [0,1].
Definition: Math.h:262
+
void setRange(IntType imin, IntType imax)
Change the range over which integers are distributed to [imin, imax].
Definition: Math.h:208
+
int Floor(long double x)
Return the floor of x.
Definition: Math.h:798
+
RandInt< int, boost::mt19937 > RandomInt
Definition: Math.h:238
+
Type RoundUp(Type x, Type base)
Return x rounded up to the nearest multiple of base.
Definition: Math.h:742
+
IntType operator()()
Return a randomly-generated integer in the current range.
Definition: Math.h:223
+
const EngineType & engine() const
Return a const reference to the random number generator.
Definition: Math.h:167
+
const Type & Min(const Type &a, const Type &b, const Type &c, const Type &d, const Type &e, const Type &f, const Type &g, const Type &h)
Return the minimum of eight values.
Definition: Math.h:665
+
Definition: Exceptions.h:39
+
Rand01< double, boost::mt19937 > Random01
Definition: Math.h:173
+
Tolerance for floating-point comparison.
Definition: Math.h:125
+
FloatType operator()()
Return a uniformly distributed random number in the range [0, 1).
Definition: Math.h:170
+
IntType operator()(IntType imin, IntType imax)
Return a randomly-generated integer in the new range [imin, imax], without changing the current range...
Definition: Math.h:227
+
#define OPENVDB_NO_FP_EQUALITY_WARNING_END
Definition: Math.h:83
+
bool SignChange(const Type &a, const Type &b)
Return true if a and b have different signs.
Definition: Math.h:691
+
Type EuclideanRemainder(Type x)
Definition: Math.h:777
+
void setSeed(unsigned int seed)
Set the seed value for the random number generator.
Definition: Math.h:161
+
Type FractionalPart(Type x)
Return the fractional part of x.
Definition: Math.h:791
+
Definition: Math.h:841
+ +
boost::numeric::conversion_traits< S, T >::supertype type
Definition: Math.h:859
+
int64_t doubleToInt64(const double aDoubleValue)
Definition: Math.h:456
+
const Type & Max(const Type &a, const Type &b, const Type &c, const Type &d, const Type &e, const Type &f, const Type &g, const Type &h)
Return the maximum of eight values.
Definition: Math.h:610
+
#define OPENVDB_NO_FP_EQUALITY_WARNING_BEGIN
Definition: Math.h:82
+
long double Sqrt(long double x)
Return the square root of a floating-point value.
Definition: Math.h:711
+
std::string operator+(const std::string &s, double)
Needed to support the (zeroVal() + val) idiom when ValueType is std::string.
Definition: Math.h:107
+
const EngineType & engine() const
Return a const reference to the random number generator.
Definition: Math.h:220
+
size_t MaxIndex(const Vec3T &v)
Return the index [0,1,2] of the largest value in a 3D vector.
Definition: Math.h:893
+
bool Abs(bool b)
Return the absolute value of the given quantity.
Definition: Math.h:307
+ +
Type Inv(Type x)
Return the inverse of x.
Definition: Math.h:831
+
bool isNegative(const Type &x)
Return true if x is less than zero.
Definition: Math.h:354
+
Axis
Definition: Math.h:838
+
double Pow(double b, double e)
Return .
Definition: Math.h:548
+
RandInt(unsigned int seed, IntType imin, IntType imax)
Initialize the generator.
Definition: Math.h:202
+
bool ZeroCrossing(const Type &a, const Type &b)
Return true if the interval [a, b] includes zero, i.e., if either a or b is zero or if they have diff...
Definition: Math.h:701
+
bool zeroVal< bool >()
Return the bool value that corresponds to zero.
Definition: Math.h:98
+ +
long double Round(long double x)
Return x rounded to the nearest integer.
Definition: Math.h:769
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
Type Pow4(Type x)
Return .
Definition: Math.h:522
+
Type IntegerPart(Type x)
Return the integer part of x.
Definition: Math.h:783
+
bool isUlpsEqual(const float aLeft, const float aRight, const int32_t aUnitsInLastPlace)
Definition: Math.h:488
+
size_t MinIndex(const Vec3T &v)
Return the index [0,1,2] of the smallest value in a 3D vector.
Definition: Math.h:872
+
Definition: Math.h:858
+
RandInt(const EngineType &engine, IntType imin, IntType imax)
Initialize the generator.
Definition: Math.h:194
+
#define OPENVDB_EXACT_IS_APPROX_EQUAL(T)
Definition: Math.h:385
+
bool isApproxZero(const Type &x, const Type &tolerance)
Return true if x is equal to zero to within the given tolerance.
Definition: Math.h:345
+
int32_t floatToInt32(const float aFloatValue)
Definition: Math.h:447
+ +
T zeroVal()
Return the value of type T that corresponds to zero.
Definition: Math.h:94
+
const boost::disable_if_c< VecTraits< T >::IsVec, T >::type & min(const T &a, const T &b)
Definition: Composite.h:128
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/MeshToVolume_8h_source.html b/nuparu/include/openvdb/share/doc/openvdb/html/MeshToVolume_8h_source.html new file mode 100644 index 00000000..35eb1721 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/MeshToVolume_8h_source.html @@ -0,0 +1,663 @@ + + + + + + +OpenVDB: MeshToVolume.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
OpenVDB +  3.2.0 +
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
MeshToVolume.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 //
+
42 
+
43 
+
44 #ifndef OPENVDB_TOOLS_MESH_TO_VOLUME_HAS_BEEN_INCLUDED
+
45 #define OPENVDB_TOOLS_MESH_TO_VOLUME_HAS_BEEN_INCLUDED
+
46 
+
47 #include <openvdb/Types.h>
+
48 #include <openvdb/math/FiniteDifference.h> // for GodunovsNormSqrd
+
49 #include <openvdb/math/Proximity.h> // for closestPointOnTriangleToPoint
+ +
51 #include <openvdb/util/Util.h>
+
52 
+
53 #include "ChangeBackground.h"
+
54 #include "Prune.h" // for pruneInactive and pruneLevelSet
+
55 #include "SignedFloodFill.h" // for signedFloodFillWithValues
+
56 
+
57 #include <tbb/blocked_range.h>
+
58 #include <tbb/enumerable_thread_specific.h>
+
59 #include <tbb/parallel_for.h>
+
60 #include <tbb/parallel_reduce.h>
+
61 #include <tbb/partitioner.h>
+
62 #include <tbb/task_group.h>
+
63 #include <tbb/task_scheduler_init.h>
+
64 
+
65 #include <boost/integer_traits.hpp> // const_max
+
66 #include <boost/math/special_functions/fpclassify.hpp> // for isfinite
+
67 #include <boost/scoped_array.hpp>
+
68 
+
69 #include <algorithm> // for std::sort
+
70 #include <deque>
+
71 #include <limits>
+
72 #include <sstream>
+
73 #include <vector>
+
74 
+
75 
+
76 namespace openvdb {
+ +
78 namespace OPENVDB_VERSION_NAME {
+
79 namespace tools {
+
80 
+
81 
+
83 
+
84 
+ +
87 
+ +
93 
+ +
97 
+ +
101 
+ +
105 };
+
106 
+
107 
+
138 template <typename GridType, typename MeshDataAdapter>
+
139 inline typename GridType::Ptr
+ +
141  const MeshDataAdapter& mesh,
+
142  const math::Transform& transform,
+
143  float exteriorBandWidth = 3.0f,
+
144  float interiorBandWidth = 3.0f,
+
145  int flags = 0,
+
146  typename GridType::template ValueConverter<Int32>::Type * polygonIndexGrid = NULL);
+
147 
+
148 
+
164 template <typename GridType, typename MeshDataAdapter, typename Interrupter>
+
165 inline typename GridType::Ptr
+ +
167  Interrupter& interrupter,
+
168  const MeshDataAdapter& mesh,
+
169  const math::Transform& transform,
+
170  float exteriorBandWidth = 3.0f,
+
171  float interiorBandWidth = 3.0f,
+
172  int flags = 0,
+
173  typename GridType::template ValueConverter<Int32>::Type * polygonIndexGrid = NULL);
+
174 
+
175 
+
177 
+
178 
+
189 template<typename PointType, typename PolygonType>
+ +
191 
+
192  QuadAndTriangleDataAdapter(const std::vector<PointType>& points,
+
193  const std::vector<PolygonType>& polygons)
+
194  : mPointArray(points.empty() ? NULL : &points[0])
+
195  , mPointArraySize(points.size())
+
196  , mPolygonArray(polygons.empty() ? NULL : &polygons[0])
+
197  , mPolygonArraySize(polygons.size())
+
198  {
+
199  }
+
200 
+
201  QuadAndTriangleDataAdapter(const PointType * pointArray, size_t pointArraySize,
+
202  const PolygonType* polygonArray, size_t polygonArraySize)
+
203  : mPointArray(pointArray)
+
204  , mPointArraySize(pointArraySize)
+
205  , mPolygonArray(polygonArray)
+
206  , mPolygonArraySize(polygonArraySize)
+
207  {
+
208  }
+
209 
+
210  size_t polygonCount() const { return mPolygonArraySize; }
+
211  size_t pointCount() const { return mPointArraySize; }
+
212 
+
214  size_t vertexCount(size_t n) const {
+
215  return (PolygonType::size == 3 || mPolygonArray[n][3] == util::INVALID_IDX) ? 3 : 4;
+
216  }
+
217 
+
220  void getIndexSpacePoint(size_t n, size_t v, Vec3d& pos) const {
+
221  const PointType& p = mPointArray[mPolygonArray[n][int(v)]];
+
222  pos[0] = double(p[0]);
+
223  pos[1] = double(p[1]);
+
224  pos[2] = double(p[2]);
+
225  }
+
226 
+
227 private:
+
228  PointType const * const mPointArray;
+
229  size_t const mPointArraySize;
+
230  PolygonType const * const mPolygonArray;
+
231  size_t const mPolygonArraySize;
+
232 }; // struct QuadAndTriangleDataAdapter
+
233 
+
234 
+
236 
+
237 
+
238 // Wrapper functions for the mesh to volume converter
+
239 
+
240 
+
256 template<typename GridType>
+
257 inline typename GridType::Ptr
+ +
259  const openvdb::math::Transform& xform,
+
260  const std::vector<Vec3s>& points,
+
261  const std::vector<Vec3I>& triangles,
+
262  float halfWidth = float(LEVEL_SET_HALF_WIDTH));
+
263 
+
264 
+
280 template<typename GridType>
+
281 inline typename GridType::Ptr
+ +
283  const openvdb::math::Transform& xform,
+
284  const std::vector<Vec3s>& points,
+
285  const std::vector<Vec4I>& quads,
+
286  float halfWidth = float(LEVEL_SET_HALF_WIDTH));
+
287 
+
288 
+
305 template<typename GridType>
+
306 inline typename GridType::Ptr
+ +
308  const openvdb::math::Transform& xform,
+
309  const std::vector<Vec3s>& points,
+
310  const std::vector<Vec3I>& triangles,
+
311  const std::vector<Vec4I>& quads,
+
312  float halfWidth = float(LEVEL_SET_HALF_WIDTH));
+
313 
+
314 
+
333 template<typename GridType>
+
334 inline typename GridType::Ptr
+ +
336  const openvdb::math::Transform& xform,
+
337  const std::vector<Vec3s>& points,
+
338  const std::vector<Vec3I>& triangles,
+
339  const std::vector<Vec4I>& quads,
+
340  float exBandWidth,
+
341  float inBandWidth);
+
342 
+
343 
+
358 template<typename GridType>
+
359 inline typename GridType::Ptr
+ +
361  const openvdb::math::Transform& xform,
+
362  const std::vector<Vec3s>& points,
+
363  const std::vector<Vec3I>& triangles,
+
364  const std::vector<Vec4I>& quads,
+
365  float bandWidth);
+
366 
+
367 
+
369 
+
370 
+
377 template<typename GridType, typename VecType>
+
378 inline typename GridType::Ptr
+ +
380  const openvdb::math::Transform& xform,
+
381  typename VecType::ValueType halfWidth = LEVEL_SET_HALF_WIDTH);
+
382 
+
383 
+
385 
+
386 
+
393 template <typename FloatTreeT>
+
394 inline void
+
395 traceExteriorBoundaries(FloatTreeT& tree);
+
396 
+
397 
+
399 
+
400 
+ +
403 {
+
404 public:
+
405 
+
407 
+
409  struct EdgeData {
+
410  EdgeData(float dist = 1.0)
+
411  : mXDist(dist), mYDist(dist), mZDist(dist)
+
412  , mXPrim(util::INVALID_IDX)
+
413  , mYPrim(util::INVALID_IDX)
+
414  , mZPrim(util::INVALID_IDX)
+
415  {
+
416  }
+
417 
+
419  bool operator< (const EdgeData&) const { return false; }
+
422  bool operator> (const EdgeData&) const { return false; }
+
423  template<class T> EdgeData operator+(const T&) const { return *this; }
+
424  template<class T> EdgeData operator-(const T&) const { return *this; }
+
425  EdgeData operator-() const { return *this; }
+
427 
+
428  bool operator==(const EdgeData& rhs) const
+
429  {
+
430  return mXPrim == rhs.mXPrim && mYPrim == rhs.mYPrim && mZPrim == rhs.mZPrim;
+
431  }
+
432 
+
433  float mXDist, mYDist, mZDist;
+
434  Index32 mXPrim, mYPrim, mZPrim;
+
435  };
+
436 
+ + +
439 
+
440 
+
442 
+
443 
+ +
445 
+
446 
+
454  void convert(const std::vector<Vec3s>& pointList, const std::vector<Vec4I>& polygonList);
+
455 
+
456 
+
459  void getEdgeData(Accessor& acc, const Coord& ijk,
+
460  std::vector<Vec3d>& points, std::vector<Index32>& primitives);
+
461 
+
464  Accessor getAccessor() { return Accessor(mTree); }
+
465 
+
466 private:
+
467  void operator=(const MeshToVoxelEdgeData&) {}
+
468  TreeType mTree;
+
469  class GenEdgeData;
+
470 };
+
471 
+
472 
+
475 
+
476 
+
477 // Internal utility objects and implementation details
+
478 
+
479 namespace mesh_to_volume_internal {
+
480 
+
481 template<typename PointType>
+ +
483 
+
484  TransformPoints(const PointType* pointsIn, PointType* pointsOut,
+
485  const math::Transform& xform)
+
486  : mPointsIn(pointsIn), mPointsOut(pointsOut), mXform(&xform)
+
487  {
+
488  }
+
489 
+
490  void operator()(const tbb::blocked_range<size_t>& range) const {
+
491 
+
492  Vec3d pos;
+
493 
+
494  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
495 
+
496  const PointType& wsP = mPointsIn[n];
+
497  pos[0] = double(wsP[0]);
+
498  pos[1] = double(wsP[1]);
+
499  pos[2] = double(wsP[2]);
+
500 
+
501  pos = mXform->worldToIndex(pos);
+
502 
+
503  PointType& isP = mPointsOut[n];
+
504  isP[0] = typename PointType::value_type(pos[0]);
+
505  isP[1] = typename PointType::value_type(pos[1]);
+
506  isP[2] = typename PointType::value_type(pos[2]);
+
507  }
+
508  }
+
509 
+
510  PointType const * const mPointsIn;
+
511  PointType * const mPointsOut;
+
512  math::Transform const * const mXform;
+
513 }; // TransformPoints
+
514 
+
515 
+
516 template<typename ValueType>
+
517 struct Tolerance
+
518 {
+
519  static ValueType epsilon() { return ValueType(1e-7); }
+
520  static ValueType minNarrowBandWidth() { return ValueType(1.0 + 1e-6); }
+
521 };
+
522 
+
523 
+
525 
+
526 
+
527 template<typename TreeType>
+ +
529 {
+
530 public:
+
531 
+
532  typedef typename TreeType::template ValueConverter<Int32>::Type Int32TreeType;
+
533 
+
534  typedef typename TreeType::LeafNodeType LeafNodeType;
+
535  typedef typename Int32TreeType::LeafNodeType Int32LeafNodeType;
+
536 
+
537  CombineLeafNodes(TreeType& lhsDistTree, Int32TreeType& lhsIdxTree,
+
538  LeafNodeType ** rhsDistNodes, Int32LeafNodeType ** rhsIdxNodes)
+
539  : mDistTree(&lhsDistTree)
+
540  , mIdxTree(&lhsIdxTree)
+
541  , mRhsDistNodes(rhsDistNodes)
+
542  , mRhsIdxNodes(rhsIdxNodes)
+
543  {
+
544  }
+
545 
+
546  void operator()(const tbb::blocked_range<size_t>& range) const {
+
547 
+
548  tree::ValueAccessor<TreeType> distAcc(*mDistTree);
+
549  tree::ValueAccessor<Int32TreeType> idxAcc(*mIdxTree);
+
550 
+
551  typedef typename LeafNodeType::ValueType DistValueType;
+
552  typedef typename Int32LeafNodeType::ValueType IndexValueType;
+
553 
+
554  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
555 
+
556  const Coord& origin = mRhsDistNodes[n]->origin();
+
557 
+
558  LeafNodeType* lhsDistNode = distAcc.probeLeaf(origin);
+
559  Int32LeafNodeType* lhsIdxNode = idxAcc.probeLeaf(origin);
+
560 
+
561  DistValueType* lhsDistData = lhsDistNode->buffer().data();
+
562  IndexValueType* lhsIdxData = lhsIdxNode->buffer().data();
+
563 
+
564  const DistValueType* rhsDistData = mRhsDistNodes[n]->buffer().data();
+
565  const IndexValueType* rhsIdxData = mRhsIdxNodes[n]->buffer().data();
+
566 
+
567 
+
568  for (Index32 offset = 0; offset < LeafNodeType::SIZE; ++offset) {
+
569 
+
570  if (rhsIdxData[offset] != Int32(util::INVALID_IDX)) {
+
571 
+
572  const DistValueType& lhsValue = lhsDistData[offset];
+
573  const DistValueType& rhsValue = rhsDistData[offset];
+
574 
+
575  if (rhsValue < lhsValue) {
+
576  lhsDistNode->setValueOn(offset, rhsValue);
+
577  lhsIdxNode->setValueOn(offset, rhsIdxData[offset]);
+
578  } else if (math::isExactlyEqual(rhsValue, lhsValue)) {
+
579  lhsIdxNode->setValueOn(offset,
+
580  std::min(lhsIdxData[offset], rhsIdxData[offset]));
+
581  }
+
582  }
+
583  }
+
584 
+
585  delete mRhsDistNodes[n];
+
586  delete mRhsIdxNodes[n];
+
587  }
+
588  }
+
589 
+
590 private:
+
591 
+
592  TreeType * const mDistTree;
+
593  Int32TreeType * const mIdxTree;
+
594 
+
595  LeafNodeType ** const mRhsDistNodes;
+
596  Int32LeafNodeType ** const mRhsIdxNodes;
+
597 }; // class CombineLeafNodes
+
598 
+
599 
+
601 
+
602 
+
603 template<typename TreeType>
+ +
605 {
+
606  typedef typename TreeType::LeafNodeType LeafNodeType;
+
607 
+
608  StashOriginAndStoreOffset(std::vector<LeafNodeType*>& nodes, Coord* coordinates)
+
609  : mNodes(nodes.empty() ? NULL : &nodes[0]), mCoordinates(coordinates)
+
610  {
+
611  }
+
612 
+
613  void operator()(const tbb::blocked_range<size_t>& range) const {
+
614  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
615  Coord& origin = const_cast<Coord&>(mNodes[n]->origin());
+
616  mCoordinates[n] = origin;
+
617  origin[0] = static_cast<int>(n);
+
618  }
+
619  }
+
620 
+
621  LeafNodeType ** const mNodes;
+
622  Coord * const mCoordinates;
+
623 };
+
624 
+
625 
+
626 template<typename TreeType>
+ +
628 {
+
629  typedef typename TreeType::LeafNodeType LeafNodeType;
+
630 
+
631  RestoreOrigin(std::vector<LeafNodeType*>& nodes, const Coord* coordinates)
+
632  : mNodes(nodes.empty() ? NULL : &nodes[0]), mCoordinates(coordinates)
+
633  {
+
634  }
+
635 
+
636  void operator()(const tbb::blocked_range<size_t>& range) const {
+
637  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
638  Coord& origin = const_cast<Coord&>(mNodes[n]->origin());
+
639  origin[0] = mCoordinates[n][0];
+
640  }
+
641  }
+
642 
+
643  LeafNodeType ** const mNodes;
+
644  Coord const * const mCoordinates;
+
645 };
+
646 
+
647 
+
648 template<typename TreeType>
+ +
650 {
+
651 public:
+
652  typedef typename TreeType::LeafNodeType LeafNodeType;
+
653 
+
654  ComputeNodeConnectivity(const TreeType& tree, const Coord* coordinates,
+
655  size_t* offsets, size_t numNodes, const CoordBBox& bbox)
+
656  : mTree(&tree)
+
657  , mCoordinates(coordinates)
+
658  , mOffsets(offsets)
+
659  , mNumNodes(numNodes)
+
660  , mBBox(bbox)
+
661  {
+
662  }
+
663 
+
664  void operator()(const tbb::blocked_range<size_t>& range) const {
+
665 
+
666  size_t* offsetsNextX = mOffsets;
+
667  size_t* offsetsPrevX = mOffsets + mNumNodes;
+
668  size_t* offsetsNextY = mOffsets + mNumNodes * 2;
+
669  size_t* offsetsPrevY = mOffsets + mNumNodes * 3;
+
670  size_t* offsetsNextZ = mOffsets + mNumNodes * 4;
+
671  size_t* offsetsPrevZ = mOffsets + mNumNodes * 5;
+
672 
+ +
674  Coord ijk;
+
675 
+
676  for (size_t n = range.begin(), N = range.end(); n < N; ++n) {
+
677  const Coord& origin = mCoordinates[n];
+
678  offsetsNextX[n] = findNeighbourNode(acc, origin, Coord(LeafNodeType::DIM, 0, 0));
+
679  offsetsPrevX[n] = findNeighbourNode(acc, origin, Coord(-LeafNodeType::DIM, 0, 0));
+
680  offsetsNextY[n] = findNeighbourNode(acc, origin, Coord(0, LeafNodeType::DIM, 0));
+
681  offsetsPrevY[n] = findNeighbourNode(acc, origin, Coord(0, -LeafNodeType::DIM, 0));
+
682  offsetsNextZ[n] = findNeighbourNode(acc, origin, Coord(0, 0, LeafNodeType::DIM));
+
683  offsetsPrevZ[n] = findNeighbourNode(acc, origin, Coord(0, 0, -LeafNodeType::DIM));
+
684  }
+
685  }
+
686 
+
687  size_t findNeighbourNode(tree::ValueAccessor<const TreeType>& acc, const Coord& start, const Coord& step) const {
+
688 
+
689  Coord ijk = start + step;
+
690  CoordBBox bbox(mBBox);
+
691 
+
692  while (bbox.isInside(ijk)) {
+
693  const LeafNodeType* node = acc.probeConstLeaf(ijk);
+
694  if (node) return static_cast<size_t>(node->origin()[0]);
+
695  ijk += step;
+
696  }
+
697 
+
698  return boost::integer_traits<size_t>::const_max;
+
699  }
+
700 
+
701 
+
702 private:
+
703  // Disallow assignment
+ +
705 
+
706  TreeType const * const mTree;
+
707  Coord const * const mCoordinates;
+
708  size_t * const mOffsets;
+
709 
+
710  const size_t mNumNodes;
+
711  const CoordBBox mBBox;
+
712 }; // class ComputeNodeConnectivity
+
713 
+
714 
+
715 template<typename TreeType>
+ +
717 
+
718  enum { INVALID_OFFSET = boost::integer_traits<size_t>::const_max };
+
719 
+
720  typedef typename TreeType::LeafNodeType LeafNodeType;
+
721 
+ +
723  : mLeafNodes()
+
724  , mOffsets(NULL)
+
725  {
+
726  mLeafNodes.reserve(tree.leafCount());
+
727  tree.getNodes(mLeafNodes);
+
728 
+
729  if (mLeafNodes.empty()) return;
+
730 
+
731  CoordBBox bbox;
+
732  tree.evalLeafBoundingBox(bbox);
+
733 
+
734  const tbb::blocked_range<size_t> range(0, mLeafNodes.size());
+
735 
+
736  // stash the leafnode origin coordinate and temporarily store the
+
737  // linear offset in the origin.x variable.
+
738  boost::scoped_array<Coord> coordinates(new Coord[mLeafNodes.size()]);
+
739  tbb::parallel_for(range, StashOriginAndStoreOffset<TreeType>(mLeafNodes, coordinates.get()));
+
740 
+
741  // build the leafnode offset table
+
742  mOffsets.reset(new size_t[mLeafNodes.size() * 6]);
+
743 
+
744 
+
745  tbb::parallel_for(range,
+
746  ComputeNodeConnectivity<TreeType>(tree, coordinates.get(), mOffsets.get(), mLeafNodes.size(), bbox));
+
747 
+
748  // restore the leafnode origin coordinate
+
749  tbb::parallel_for(range, RestoreOrigin<TreeType>(mLeafNodes, coordinates.get()));
+
750  }
+
751 
+
752  size_t size() const { return mLeafNodes.size(); }
+
753 
+
754  std::vector<LeafNodeType*>& nodes() { return mLeafNodes; }
+
755  const std::vector<LeafNodeType*>& nodes() const { return mLeafNodes; }
+
756 
+
757 
+
758  const size_t* offsetsNextX() const { return mOffsets.get(); }
+
759  const size_t* offsetsPrevX() const { return mOffsets.get() + mLeafNodes.size(); }
+
760 
+
761  const size_t* offsetsNextY() const { return mOffsets.get() + mLeafNodes.size() * 2; }
+
762  const size_t* offsetsPrevY() const { return mOffsets.get() + mLeafNodes.size() * 3; }
+
763 
+
764  const size_t* offsetsNextZ() const { return mOffsets.get() + mLeafNodes.size() * 4; }
+
765  const size_t* offsetsPrevZ() const { return mOffsets.get() + mLeafNodes.size() * 5; }
+
766 
+
767 private:
+
768  std::vector<LeafNodeType*> mLeafNodes;
+
769  boost::scoped_array<size_t> mOffsets;
+
770 }; // struct LeafNodeConnectivityTable
+
+ + + + + +OpenVDB: io.h Source File + + + + + + + + + + + +
+
+
io.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 
+
31 #ifndef OPENVDB_IO_IO_HAS_BEEN_INCLUDED
+
32 #define OPENVDB_IO_IO_HAS_BEEN_INCLUDED
+
33 
+
34 #include <openvdb/Platform.h>
+
35 #include <openvdb/version.h>
+
36 #include <boost/any.hpp>
+
37 #include <boost/function.hpp>
+
38 #include <boost/scoped_ptr.hpp>
+
39 #include <boost/shared_ptr.hpp>
+
40 #include <iosfwd> // for std::ios_base
+
41 #include <map>
+
42 #include <string>
+
43 
+
44 
+
45 namespace openvdb {
+ +
47 namespace OPENVDB_VERSION_NAME {
+
48 
+
49 class MetaMap;
+
50 
+
51 namespace io {
+
52 
+ +
57 {
+
58 public:
+
59  typedef boost::shared_ptr<StreamMetadata> Ptr;
+
60  typedef boost::shared_ptr<const StreamMetadata> ConstPtr;
+
61 
+ + +
64  explicit StreamMetadata(std::ios_base&);
+
65  ~StreamMetadata();
+
66 
+
67  StreamMetadata& operator=(const StreamMetadata&);
+
68 
+
71  void transferTo(std::ios_base&) const;
+
72 
+
73  uint32_t fileVersion() const;
+
74  void setFileVersion(uint32_t);
+
75 
+
76  VersionId libraryVersion() const;
+
77  void setLibraryVersion(VersionId);
+
78 
+
79  uint32_t compression() const;
+
80  void setCompression(uint32_t);
+
81 
+
82  uint32_t gridClass() const;
+
83  void setGridClass(uint32_t);
+
84 
+
85  const void* backgroundPtr() const;
+
86  void setBackgroundPtr(const void*);
+
87 
+
88  bool halfFloat() const;
+
89  void setHalfFloat(bool);
+
90 
+
91  bool writeGridStats() const;
+
92  void setWriteGridStats(bool);
+
93 
+
95  MetaMap& gridMetadata();
+
101  const MetaMap& gridMetadata() const;
+
103 
+
104  typedef std::map<std::string, boost::any> AuxDataMap;
+
106  AuxDataMap& auxData();
+
108  const AuxDataMap& auxData() const;
+
110 
+
112  std::string str() const;
+
113 
+
114 private:
+
115  struct Impl;
+
116  boost::scoped_ptr<Impl> mImpl;
+
117 }; // class StreamMetadata
+
118 
+
119 
+
121 std::ostream& operator<<(std::ostream&, const StreamMetadata&);
+
122 
+
123 std::ostream& operator<<(std::ostream&, const StreamMetadata::AuxDataMap&);
+
124 
+
125 
+
127 
+
128 
+
129 class File;
+
130 
+ +
133 {
+
134 public:
+
135  typedef boost::shared_ptr<MappedFile> Ptr;
+
136 
+
137  ~MappedFile();
+
138 
+
140  std::string filename() const;
+
141 
+
151  boost::shared_ptr<std::streambuf> createBuffer() const;
+
152 
+
153  typedef boost::function<void(std::string /*filename*/)> Notifier;
+
156  void setNotifier(const Notifier&);
+
158  void clearNotifier();
+
159 
+
160 private:
+
161  friend class File;
+
162 
+
163  explicit MappedFile(const std::string& filename, bool autoDelete = false);
+
164 
+
165  MappedFile(const MappedFile&); // not copyable
+
166  MappedFile& operator=(const MappedFile&); // not copyable
+
167 
+
168  class Impl;
+
169  boost::scoped_ptr<Impl> mImpl;
+
170 }; // class MappedFile
+
171 
+
172 
+
174 
+
175 
+
177 std::string getErrorString(int errorNum);
+
178 
+
179 
+
181 std::string getErrorString();
+
182 
+
183 
+
185 
+
186 
+
189 OPENVDB_API uint32_t getFormatVersion(std::ios_base&);
+
190 
+
193 OPENVDB_API VersionId getLibraryVersion(std::ios_base&);
+
194 
+
197 OPENVDB_API std::string getVersion(std::ios_base&);
+
198 
+
200 OPENVDB_API void setCurrentVersion(std::istream&);
+
201 
+
205 OPENVDB_API void setVersion(std::ios_base&, const VersionId& libraryVersion, uint32_t fileVersion);
+
206 
+
210 OPENVDB_API uint32_t getDataCompression(std::ios_base&);
+
214 OPENVDB_API void setDataCompression(std::ios_base&, uint32_t compressionFlags);
+
215 
+
218 OPENVDB_API uint32_t getGridClass(std::ios_base&);
+
221 OPENVDB_API void setGridClass(std::ios_base&, uint32_t);
+
222 
+
225 OPENVDB_API bool getHalfFloat(std::ios_base&);
+
228 OPENVDB_API void setHalfFloat(std::ios_base&, bool);
+
229 
+
232 OPENVDB_API const void* getGridBackgroundValuePtr(std::ios_base&);
+
236 OPENVDB_API void setGridBackgroundValuePtr(std::ios_base&, const void* background);
+
237 
+
240 OPENVDB_API bool getWriteGridStatsMetadata(std::ios_base&);
+
243 OPENVDB_API void setWriteGridStatsMetadata(std::ios_base&, bool writeGridStats);
+
244 
+
247 OPENVDB_API boost::shared_ptr<MappedFile> getMappedFilePtr(std::ios_base&);
+
251 OPENVDB_API void setMappedFilePtr(std::ios_base&, boost::shared_ptr<MappedFile>&);
+
252 
+
255 OPENVDB_API boost::shared_ptr<StreamMetadata> getStreamMetadataPtr(std::ios_base&);
+
263 OPENVDB_API void setStreamMetadataPtr(std::ios_base&,
+
264  boost::shared_ptr<StreamMetadata>&, bool transfer = true);
+
267 OPENVDB_API boost::shared_ptr<StreamMetadata> clearStreamMetadataPtr(std::ios_base&);
+
268 
+
269 } // namespace io
+
270 } // namespace OPENVDB_VERSION_NAME
+
271 } // namespace openvdb
+
272 
+
273 #endif // OPENVDB_IO_IO_HAS_BEEN_INCLUDED
+
274 
+
275 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
276 // All rights reserved. This software is distributed under the
+
277 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
OPENVDB_API VersionId getLibraryVersion(std::ios_base &)
Return the (major, minor) library version number associated with the given input stream.
+
boost::shared_ptr< MappedFile > Ptr
Definition: io.h:135
+
#define OPENVDB_API
Helper macros for defining library symbol visibility.
Definition: Platform.h:195
+
OPENVDB_API void setStreamMetadataPtr(std::ios_base &, boost::shared_ptr< StreamMetadata > &, bool transfer=true)
Associate the given stream with (a shared pointer to) an object that stores metadata (file format...
+
OPENVDB_API void setDataCompression(std::ios_base &, uint32_t compressionFlags)
Associate with the given stream a bitwise OR of compression option flags (COMPRESS_ZIP, COMPRESS_ACTIVE_MASK, etc.) specifying whether and how input data is compressed or output data should be compressed.
+
OPENVDB_API uint32_t getGridClass(std::ios_base &)
Return the class (GRID_LEVEL_SET, GRID_UNKNOWN, etc.) of the grid currently being read from or writte...
+
Container for metadata describing how to unserialize grids from and/or serialize grids to a stream (w...
Definition: io.h:56
+
OPENVDB_API boost::shared_ptr< StreamMetadata > getStreamMetadataPtr(std::ios_base &)
Return a shared pointer to an object that stores metadata (file format, compression scheme...
+
Container that maps names (strings) to values of arbitrary types.
Definition: MetaMap.h:46
+
OPENVDB_API void setHalfFloat(std::ios_base &, bool)
Specify whether floating-point values should be quantized to 16 bits when writing to the given stream...
+
OPENVDB_API const void * getGridBackgroundValuePtr(std::ios_base &)
Return a pointer to the background value of the grid currently being read from or written to the give...
+
OPENVDB_API void setCurrentVersion(std::istream &)
Associate the current file format and library version numbers with the given input stream...
+
Grid archive associated with a file on disk.
Definition: File.h:54
+
OPENVDB_API bool getHalfFloat(std::ios_base &)
Return true if floating-point values should be quantized to 16 bits when writing to the given stream ...
+
OPENVDB_API boost::shared_ptr< StreamMetadata > clearStreamMetadataPtr(std::ios_base &)
Dissociate the given stream from its metadata object (if it has one) and return a shared pointer to t...
+
Handle to control the lifetime of a memory-mapped .vdb file.
Definition: io.h:132
+
boost::shared_ptr< StreamMetadata > Ptr
Definition: io.h:59
+
#define OPENVDB_VERSION_NAME
Definition: version.h:43
+
OPENVDB_API boost::shared_ptr< MappedFile > getMappedFilePtr(std::ios_base &)
Return a shared pointer to the memory-mapped file with which the given stream is associated, or a null pointer if the stream is not associated with a memory-mapped file.
+
OPENVDB_API std::string getVersion(std::ios_base &)
Return a string of the form "./", giving the library and file format version nu...
+
OPENVDB_API void setGridBackgroundValuePtr(std::ios_base &, const void *background)
Specify (a pointer to) the background value of the grid currently being read from or written to the g...
+
OPENVDB_API void setMappedFilePtr(std::ios_base &, boost::shared_ptr< MappedFile > &)
Associate the given stream with (a shared pointer to) a memory-mapped file.
+
OPENVDB_API uint32_t getFormatVersion(std::ios_base &)
Return the file format version number associated with the given input stream.
+
Definition: version.h:120
+
Definition: Exceptions.h:39
+
OPENVDB_API bool getWriteGridStatsMetadata(std::ios_base &)
Return true if grid statistics (active voxel count and bounding box, etc.) should be computed and sto...
+ +
OPENVDB_API void setGridClass(std::ios_base &, uint32_t)
Associate with the given stream the class (GRID_LEVEL_SET, GRID_UNKNOWN, etc.) of the grid currently ...
+
OPENVDB_API void setWriteGridStatsMetadata(std::ios_base &, bool writeGridStats)
Specify whether to compute grid statistics (active voxel count and bounding box, etc.) and store them as grid metadata when writing to the given stream.
+
std::ostream & operator<<(std::ostream &, const StreamMetadata::AuxDataMap &)
+
std::map< std::string, boost::any > AuxDataMap
Definition: io.h:104
+
boost::shared_ptr< const StreamMetadata > ConstPtr
Definition: io.h:60
+
std::string getErrorString()
Return a string (possibly empty) describing the most recent system error.
+
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
+
boost::function< void(std::string)> Notifier
Definition: io.h:153
+
OPENVDB_API void setVersion(std::ios_base &, const VersionId &libraryVersion, uint32_t fileVersion)
Associate specific file format and library version numbers with the given stream. ...
+
OPENVDB_API uint32_t getDataCompression(std::ios_base &)
Return a bitwise OR of compression option flags (COMPRESS_ZIP, COMPRESS_ACTIVE_MASK, etc.) specifying whether and how input data is compressed or output data should be compressed.
+ +
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/jquery.js b/nuparu/include/openvdb/share/doc/openvdb/html/jquery.js new file mode 100644 index 00000000..1f4d0b47 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/jquery.js @@ -0,0 +1,68 @@ +/*! + * jQuery JavaScript Library v1.7.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon Nov 21 21:11:03 2011 -0500 + */ +(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b40){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bb.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bb.attachEvent("onload",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0&&typeof b0==="object"&&"setInterval" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb["eval"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b40&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b21?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv
a";bI=bv.getElementsByTagName("*");bF=bv.getElementsByTagName("a")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement("select");bx=bG.appendChild(av.createElement("option"));bE=bv.getElementsByTagName("input")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bF.getAttribute("style")),hrefNormalized:(bF.getAttribute("href")==="/a"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bE=av.createElement("input");bE.value="t";bE.setAttribute("type","radio");bJ.radioValue=bE.value==="t";bE.setAttribute("checked","checked");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML="";if(bb.getComputedStyle){bA=av.createElement("div");bA.style.width="0";bA.style.marginRight="0";bv.style.width="2px";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB="on"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,"return;");bw=(typeof bv[bB]==="function")}bJ[by+"Bubbles"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName("body")[0];if(!bQ){return}bL=1;bS="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";bR="visibility:hidden;border:0;";e="style='"+bS+"border:5px solid #000;padding:0;'";bP="
";bM=av.createElement("div");bM.style.cssText=bR+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="
t
";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML="";bv.style.width=bv.style.paddingLeft="1px";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!=="undefined"){bv.style.display="inline";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display="";bv.innerHTML="
";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position="fixed";bV.style.top="20px";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top="";bU.style.overflow="hidden";bU.style.position="relative";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aU,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/\bhover(\.\S+)?\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bCbA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}}); +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1},lt:function(bS,bR,e){return bRe[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="

";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="
";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT0){for(bB=bA;bB=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},ac=a(av);ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div
","
"]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1>");try{for(var bw=0,bv=this.length;bw1&&bw0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function al(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]===""&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":(bv||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length;if(bA>0){if(bv!=="border"){for(;bx)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("
").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"":"")+"");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b})}})(window);/*! + * jQuery UI 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*! + * jQuery UI Widget 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Widget + */ +(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*! + * jQuery UI Mouse 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Mouse + * + * Depends: + * jquery.ui.widget.js + */ +(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('
').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g
');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(hl.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null;p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*! + * jQuery hashchange event - v1.3 - 7/21/2010 + * http://benalman.com/projects/jquery-hashchange-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$(' + + + + +
+
+
logging.h
+
+
+Go to the documentation of this file.
1 //
+
3 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
4 //
+
5 // All rights reserved. This software is distributed under the
+
6 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
7 //
+
8 // Redistributions of source code must retain the above copyright
+
9 // and license notice and the following restrictions and disclaimer.
+
10 //
+
11 // * Neither the name of DreamWorks Animation nor the names of
+
12 // its contributors may be used to endorse or promote products derived
+
13 // from this software without specific prior written permission.
+
14 //
+
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+
16 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+
17 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+
18 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+
19 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
+
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+
21 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+
22 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+
23 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+
24 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
26 // IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
+
27 // LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
+
28 //
+
30 
+
31 #ifndef OPENVDB_UTIL_LOGGING_HAS_BEEN_INCLUDED
+
32 #define OPENVDB_UTIL_LOGGING_HAS_BEEN_INCLUDED
+
33 
+
34 #ifndef OPENVDB_USE_LOG4CPLUS
+
35 
+
37 #define OPENVDB_LOG_INFO(message)
+
38 #define OPENVDB_LOG_WARN(message) do { std::cerr << message << std::endl; } while (0);
+
40 #define OPENVDB_LOG_ERROR(message) do { std::cerr << message << std::endl; } while (0);
+
42 #define OPENVDB_LOG_FATAL(message) do { std::cerr << message << std::endl; } while (0);
+
44 #define OPENVDB_LOG_DEBUG(message)
+
46 #define OPENVDB_LOG_DEBUG_RUNTIME(message)
+
49 
+
50 #else // ifdef OPENVDB_USE_LOG4CPLUS
+
51 
+
52 #include <log4cplus/logger.h>
+
53 #include <log4cplus/loglevel.h>
+
54 #include <sstream>
+
55 
+
56 #define OPENVDB_LOG(level, message) \
+
57  do { \
+
58  log4cplus::Logger _log = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("main")); \
+
59  if (_log.isEnabledFor(log4cplus::level##_LOG_LEVEL)) { \
+
60  std::ostringstream _buf; \
+
61  _buf << message; \
+
62  _log.forcedLog(log4cplus::level##_LOG_LEVEL, _buf.str(), __FILE__, __LINE__); \
+
63  } \
+
64  } while (0);
+
65 
+
66 #define OPENVDB_LOG_INFO(message) OPENVDB_LOG(INFO, message)
+
67 #define OPENVDB_LOG_WARN(message) OPENVDB_LOG(WARN, message)
+
68 #define OPENVDB_LOG_ERROR(message) OPENVDB_LOG(ERROR, message)
+
69 #define OPENVDB_LOG_FATAL(message) OPENVDB_LOG(FATAL, message)
+
70 #ifdef DEBUG
+
71 #define OPENVDB_LOG_DEBUG(message) OPENVDB_LOG(DEBUG, message)
+
72 #else
+
73 #define OPENVDB_LOG_DEBUG(message)
+
74 #endif
+
75 #define OPENVDB_LOG_DEBUG_RUNTIME(message) OPENVDB_LOG(DEBUG, message)
+
76 
+
77 #endif // OPENVDB_USE_LOG4CPLUS
+
78 
+
79 #endif // OPENVDB_UTIL_LOGGING_HAS_BEEN_INCLUDED
+
80 
+
81 // Copyright (c) 2012-2016 DreamWorks Animation LLC
+
82 // All rights reserved. This software is distributed under the
+
83 // Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
+
+ + + + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/nav_f.png b/nuparu/include/openvdb/share/doc/openvdb/html/nav_f.png new file mode 100644 index 00000000..91c8024f Binary files /dev/null and b/nuparu/include/openvdb/share/doc/openvdb/html/nav_f.png differ diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/nav_g.png b/nuparu/include/openvdb/share/doc/openvdb/html/nav_g.png new file mode 100644 index 00000000..2093a237 Binary files /dev/null and b/nuparu/include/openvdb/share/doc/openvdb/html/nav_g.png differ diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/nav_h.png b/nuparu/include/openvdb/share/doc/openvdb/html/nav_h.png new file mode 100644 index 00000000..0c16da47 Binary files /dev/null and b/nuparu/include/openvdb/share/doc/openvdb/html/nav_h.png differ diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/open.png b/nuparu/include/openvdb/share/doc/openvdb/html/open.png new file mode 100644 index 00000000..725a40ab Binary files /dev/null and b/nuparu/include/openvdb/share/doc/openvdb/html/open.png differ diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_0.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_0.html new file mode 100644 index 00000000..c491fd8f --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_0.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_0.js new file mode 100644 index 00000000..0a6de9a5 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['testfile',['TestFile',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#acf953049eacd7a2525b86ea7ec25be5a',1,'openvdb::v3_2_0::io::Archive::TestFile()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#acf953049eacd7a2525b86ea7ec25be5a',1,'openvdb::v3_2_0::io::File::TestFile()']]], + ['testleaf',['TestLeaf',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#aa1afd221f2a74a02081ab42f04511b84',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::TestLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aa1afd221f2a74a02081ab42f04511b84',1,'openvdb::v3_2_0::tree::LeafNode::TestLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#aa1afd221f2a74a02081ab42f04511b84',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::TestLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#aa1afd221f2a74a02081ab42f04511b84',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::TestLeaf()']]], + ['testleafio',['TestLeafIO',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a4ec250a46a39d26ead24aff07632e82b',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['testmultiresgrid',['TestMultiResGrid',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a868d6184b07911a2d2e36e351fc9793a',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['teststream',['TestStream',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a44f87839bb17db5d4f50b1cc375a2c37',1,'openvdb::v3_2_0::io::File']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_1.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_1.html new file mode 100644 index 00000000..89fd5f83 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_1.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_1.js new file mode 100644 index 00000000..98ea3554 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['_5fnodet',['_NodeT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#acdd0d59217dacc1c61a9fb7ffa448d3a',1,'openvdb::v3_2_0::tree::IterListItem::_NodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#acdd0d59217dacc1c61a9fb7ffa448d3a',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::_NodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#acdd0d59217dacc1c61a9fb7ffa448d3a',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::_NodeT()']]], + ['_5fresulttreetype',['_ResultTreeType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#a4d8056e5a52ce98b80e8fdaf5df3913c',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor']]], + ['_5fuse_5fmath_5fdefines',['_USE_MATH_DEFINES',['../Platform_8h.html#a525335710b53cb064ca56b936120431e',1,'Platform.h']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_10.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_10.html new file mode 100644 index 00000000..2abed7b2 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_10.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_10.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_10.js new file mode 100644 index 00000000..781c7db4 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_10.js @@ -0,0 +1,198 @@ +var searchData= +[ + ['activation',['activation',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1activation.html',1,'openvdb::v3_2_0::tools']]], + ['clip_5finternal',['clip_internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal.html',1,'openvdb::v3_2_0::tools']]], + ['openvdb_20cookbook',['OpenVDB Cookbook',['../codeExamples.html',1,'faq']]], + ['composite',['composite',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html',1,'openvdb::v3_2_0::tools']]], + ['diagnostics_5finternal',['diagnostics_internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal.html',1,'openvdb::v3_2_0::tools']]], + ['ds',['ds',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1ds.html',1,'openvdb::v3_2_0::tools']]], + ['filter_5finternal',['filter_internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1filter__internal.html',1,'openvdb::v3_2_0::tools']]], + ['gridop',['gridop',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1gridop.html',1,'openvdb::v3_2_0::tools']]], + ['openvdb',['OpenVDB',['../index.html',1,'']]], + ['internal',['internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html',1,'openvdb::v3_2_0::tools']]], + ['internal',['internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal.html',1,'openvdb::v3_2_0::tools::poisson']]], + ['internal',['internal',['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal.html',1,'openvdb::v3_2_0::math::pcg']]], + ['internal',['internal',['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1internal.html',1,'openvdb::v3_2_0::math']]], + ['io',['io',['../namespaceopenvdb_1_1v3__2__0_1_1io.html',1,'openvdb::v3_2_0']]], + ['iter',['iter',['../namespaceopenvdb_1_1v3__2__0_1_1tree_1_1iter.html',1,'openvdb::v3_2_0::tree']]], + ['leafmgr',['leafmgr',['../namespaceopenvdb_1_1v3__2__0_1_1tree_1_1leafmgr.html',1,'openvdb::v3_2_0::tree']]], + ['level_5fset_5ffracture_5finternal',['level_set_fracture_internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1level__set__fracture__internal.html',1,'openvdb::v3_2_0::tools']]], + ['level_5fset_5futil_5finternal',['level_set_util_internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal.html',1,'openvdb::v3_2_0::tools']]], + ['local_5futil',['local_util',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1local__util.html',1,'openvdb::v3_2_0::tools']]], + ['math',['math',['../namespaceopenvdb_1_1v3__2__0_1_1math.html',1,'openvdb::v3_2_0']]], + ['mesh_5fto_5fvolume_5finternal',['mesh_to_volume_internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal.html',1,'openvdb::v3_2_0::tools']]], + ['offiterator',['OffIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OffIterator.html',1,'openvdb::v3_2_0::util::RootNodeMask']]], + ['offiterator',['OffIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a1f638b980a5663b7b3f8adc42076aeb4',1,'openvdb::v3_2_0::util::NodeMask::OffIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a1f638b980a5663b7b3f8adc42076aeb4',1,'openvdb::v3_2_0::util::NodeMask< 1 >::OffIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a1f638b980a5663b7b3f8adc42076aeb4',1,'openvdb::v3_2_0::util::NodeMask< 2 >::OffIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OffIterator.html#a5a888056a21c9317b9d31e061201577d',1,'openvdb::v3_2_0::util::RootNodeMask::OffIterator::OffIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OffIterator.html#a77855a9afa6df1aacb23bef870cd8e2d',1,'openvdb::v3_2_0::util::RootNodeMask::OffIterator::OffIterator(Index32 pos, const RootNodeMask *parent)']]], + ['offleafvoxelcount',['offLeafVoxelCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a78ac72edbf61ebf466b06f6bb4f1ffc6',1,'openvdb::v3_2_0::tree::InternalNode::offLeafVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a78ac72edbf61ebf466b06f6bb4f1ffc6',1,'openvdb::v3_2_0::tree::LeafNode::offLeafVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a78ac72edbf61ebf466b06f6bb4f1ffc6',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::offLeafVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a78ac72edbf61ebf466b06f6bb4f1ffc6',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::offLeafVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a78ac72edbf61ebf466b06f6bb4f1ffc6',1,'openvdb::v3_2_0::tree::RootNode::offLeafVoxelCount()']]], + ['offmaskiterator',['OffMaskIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1OffMaskIterator.html',1,'openvdb::v3_2_0::util']]], + ['offmaskiterator',['OffMaskIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1OffMaskIterator.html#a4370c2cd07bc10bf400c3af458cfcf2e',1,'openvdb::v3_2_0::util::OffMaskIterator::OffMaskIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1OffMaskIterator.html#a5dbb630dfcfaa2227df73017f434fb52',1,'openvdb::v3_2_0::util::OffMaskIterator::OffMaskIterator(Index32 pos, const NodeMask *parent)']]], + ['offset',['offset',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#aa01a0fa4a62cb4585b0ac0e5db5d5a79',1,'openvdb::v3_2_0::math::Coord::offset(Int32 dx, Int32 dy, Int32 dz)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a397fd90fcb6ac28df7b7f45443ad8127',1,'openvdb::v3_2_0::math::Coord::offset(Int32 n)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#abac6b3b6b2bda7ff44f4cd9c0d775a04',1,'openvdb::v3_2_0::tools::Filter::offset()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#abac6b3b6b2bda7ff44f4cd9c0d775a04',1,'openvdb::v3_2_0::tools::LevelSetFilter::offset()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#a40cf8952b548ef07eb6fd0fa091914c0',1,'openvdb::v3_2_0::tree::IteratorBase::offset()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html#a3a6a6bede646a208af46044270a02747',1,'openvdb::v3_2_0::util::BaseMaskIterator::offset()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#a3a6a6bede646a208af46044270a02747',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::offset()']]], + ['offsetandmincomp',['OffsetAndMinComp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ttls__internal_1_1OffsetAndMinComp.html',1,'openvdb::v3_2_0::tools::ttls_internal']]], + ['offsetandmincomp',['OffsetAndMinComp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ttls__internal_1_1OffsetAndMinComp.html#a428e707f61ee2883d1d4319ab7ad053a',1,'openvdb::v3_2_0::tools::ttls_internal::OffsetAndMinComp']]], + ['offsetby',['offsetBy',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a4e1bfb7f53c8e565af01ab37cf5bc7c5',1,'openvdb::v3_2_0::math::Coord::offsetBy(Int32 dx, Int32 dy, Int32 dz) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a454eb2f938b1303dced2c1d356248d80',1,'openvdb::v3_2_0::math::Coord::offsetBy(Int32 n) const ']]], + ['offsetsnextx',['offsetsNextX',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html#adbe85880cfc9a2a9da602efd9edf8b96',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::LeafNodeConnectivityTable']]], + ['offsetsnexty',['offsetsNextY',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html#a7398dcf73888b161ad4f89bc90d78402',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::LeafNodeConnectivityTable']]], + ['offsetsnextz',['offsetsNextZ',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html#af9f285ce5b5e6c5834d864d5db73062a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::LeafNodeConnectivityTable']]], + ['offsetsprevx',['offsetsPrevX',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html#a543c64e19bb0fa608f6a06b8f3db1fce',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::LeafNodeConnectivityTable']]], + ['offsetsprevy',['offsetsPrevY',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html#a3005bf63790a1d9a60afa60de72e0388',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::LeafNodeConnectivityTable']]], + ['offsetsprevz',['offsetsPrevZ',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html#a189473d11bce9dca6f59f9c4f556cc9b',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::LeafNodeConnectivityTable']]], + ['offsettocoord',['offsetToCoord',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a5657262321ae0bc8da1ef47ecc16e63e',1,'openvdb::v3_2_0::tools::Dense']]], + ['offsettoglobalcoord',['offsetToGlobalCoord',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a79eb1621afd1bcf8ca45386b04a839bb',1,'openvdb::v3_2_0::tree::InternalNode::offsetToGlobalCoord()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a79eb1621afd1bcf8ca45386b04a839bb',1,'openvdb::v3_2_0::tree::LeafNode::offsetToGlobalCoord()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a79eb1621afd1bcf8ca45386b04a839bb',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::offsetToGlobalCoord()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a79eb1621afd1bcf8ca45386b04a839bb',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::offsetToGlobalCoord()']]], + ['offsettolocalcoord',['offsetToLocalCoord',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutZYX_01_4.html#a185a7dc62527f8d54252cc7a443595a8',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutZYX >::offsetToLocalCoord()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutXYZ_01_4.html#a185a7dc62527f8d54252cc7a443595a8',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutXYZ >::offsetToLocalCoord()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#addacd0d833277c846d6c519fc3a46c68',1,'openvdb::v3_2_0::tree::InternalNode::offsetToLocalCoord()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a0780d59f892d82bf5fab713b6991a9ce',1,'openvdb::v3_2_0::tree::LeafNode::offsetToLocalCoord()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a0780d59f892d82bf5fab713b6991a9ce',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::offsetToLocalCoord()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a0780d59f892d82bf5fab713b6991a9ce',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::offsetToLocalCoord()']]], + ['offsetvalues',['OffsetValues',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1OffsetValues.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['offsetvalues',['OffsetValues',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1OffsetValues.html#a9657f7176d1e398f6236e6c4ac72140e',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::OffsetValues']]], + ['offtile',['offTile',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#a349e0f8a033548c4a9edd7ffb6119d2e',1,'openvdb::v3_2_0::tools::Morphology::LeafCache']]], + ['offtilecount',['offTileCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a8907e9fc37d18f869f928ee7906da0c6',1,'openvdb::v3_2_0::tree::LeafNode::offTileCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8907e9fc37d18f869f928ee7906da0c6',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::offTileCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8907e9fc37d18f869f928ee7906da0c6',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::offTileCount()']]], + ['offv',['offV',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy2.html#a14cde73a5412cff3cbab9889d534e41e',1,'openvdb::v3_2_0::tree::InternalNode::TopologyCopy2']]], + ['offvoxelcount',['offVoxelCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a22486b1420a67aaf492e7e4ca2ca6fb6',1,'openvdb::v3_2_0::tree::InternalNode::offVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a22486b1420a67aaf492e7e4ca2ca6fb6',1,'openvdb::v3_2_0::tree::LeafNode::offVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a22486b1420a67aaf492e7e4ca2ca6fb6',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::offVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a22486b1420a67aaf492e7e4ca2ca6fb6',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::offVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a22486b1420a67aaf492e7e4ca2ca6fb6',1,'openvdb::v3_2_0::tree::RootNode::offVoxelCount()']]], + ['oniterator',['OnIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ad1770ff270617ac685e52d4ed719f353',1,'openvdb::v3_2_0::util::NodeMask::OnIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ad1770ff270617ac685e52d4ed719f353',1,'openvdb::v3_2_0::util::NodeMask< 1 >::OnIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ad1770ff270617ac685e52d4ed719f353',1,'openvdb::v3_2_0::util::NodeMask< 2 >::OnIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OnIterator.html#a14ec0457cc69b58b5702402610536a8d',1,'openvdb::v3_2_0::util::RootNodeMask::OnIterator::OnIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OnIterator.html#ab8bc3f2e10dde61889aea4d0a48b4b9e',1,'openvdb::v3_2_0::util::RootNodeMask::OnIterator::OnIterator(Index32 pos, const RootNodeMask *parent)']]], + ['oniterator',['OnIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OnIterator.html',1,'openvdb::v3_2_0::util::RootNodeMask']]], + ['onleafvoxelcount',['onLeafVoxelCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#abe2ccd641ba4842769eb649c856d05b9',1,'openvdb::v3_2_0::tree::InternalNode::onLeafVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#abe2ccd641ba4842769eb649c856d05b9',1,'openvdb::v3_2_0::tree::LeafNode::onLeafVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#abe2ccd641ba4842769eb649c856d05b9',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::onLeafVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#abe2ccd641ba4842769eb649c856d05b9',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::onLeafVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#abe2ccd641ba4842769eb649c856d05b9',1,'openvdb::v3_2_0::tree::RootNode::onLeafVoxelCount()']]], + ['onmaskiterator',['OnMaskIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1OnMaskIterator.html#ae0b0082295385bfd8050e6c47298a0c2',1,'openvdb::v3_2_0::util::OnMaskIterator::OnMaskIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1OnMaskIterator.html#a99dc046c8ea356aee7de91310ec65d53',1,'openvdb::v3_2_0::util::OnMaskIterator::OnMaskIterator(Index32 pos, const NodeMask *parent)']]], + ['onmaskiterator',['OnMaskIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1OnMaskIterator.html',1,'openvdb::v3_2_0::util']]], + ['ontile',['onTile',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#acc19f07338e67564b697fb7a275c2793',1,'openvdb::v3_2_0::tools::Morphology::LeafCache']]], + ['ontilecount',['onTileCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ad8c7f5922acf9662196a81ec4470aedd',1,'openvdb::v3_2_0::tree::InternalNode::onTileCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a060eb262f663c1f12224ede7b83d78c4',1,'openvdb::v3_2_0::tree::LeafNode::onTileCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a060eb262f663c1f12224ede7b83d78c4',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::onTileCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a060eb262f663c1f12224ede7b83d78c4',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::onTileCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ad8c7f5922acf9662196a81ec4470aedd',1,'openvdb::v3_2_0::tree::RootNode::onTileCount()']]], + ['onv',['onV',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy2.html#ac227f8b4c8fda27b3e8788fe17309171',1,'openvdb::v3_2_0::tree::InternalNode::TopologyCopy2']]], + ['onvoxelcount',['onVoxelCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ae41639979a334066f76633037c605a77',1,'openvdb::v3_2_0::tree::InternalNode::onVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ae41639979a334066f76633037c605a77',1,'openvdb::v3_2_0::tree::LeafNode::onVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ae41639979a334066f76633037c605a77',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::onVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ae41639979a334066f76633037c605a77',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::onVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ae41639979a334066f76633037c605a77',1,'openvdb::v3_2_0::tree::RootNode::onVoxelCount()']]], + ['op',['op',['../structopenvdb_1_1v3__2__0_1_1SwappedCombineOp.html#af397ea1d2b713e547c15e949890313da',1,'openvdb::v3_2_0::SwappedCombineOp::op()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1CombineOpAdapter.html#af397ea1d2b713e547c15e949890313da',1,'openvdb::v3_2_0::tree::CombineOpAdapter::op()']]], + ['opaccumulator',['OpAccumulator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1OpAccumulator.html#a467c5e2b847ca314de0d2eecdd16144b',1,'openvdb::v3_2_0::tools::valxform::OpAccumulator::OpAccumulator(const IterT &iter, OpT &op)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1OpAccumulator.html#a71c6cb5d781ca8c740c65e9804ee706e',1,'openvdb::v3_2_0::tools::valxform::OpAccumulator::OpAccumulator(OpAccumulator &other, tbb::split)']]], + ['opaccumulator',['OpAccumulator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1OpAccumulator.html',1,'openvdb::v3_2_0::tools::valxform']]], + ['opadd',['OpAdd',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1OpAdd.html',1,'openvdb::v3_2_0::tools::ds']]], + ['open',['open',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#ab9e653cf43c03bbfe0decd34494892ca',1,'openvdb::v3_2_0::io::File']]], + ['openvdb',['openvdb',['../namespaceopenvdb.html',1,'']]], + ['openvdb_2eh',['openvdb.h',['../openvdb_8h.html',1,'']]], + ['openvdb_5fapi',['OPENVDB_API',['../Platform_8h.html#a78ead02913edfee18be9d5982b788611',1,'Platform.h']]], + ['openvdb_5fcheck_5fgcc',['OPENVDB_CHECK_GCC',['../Platform_8h.html#a0059a19e8b0edca86629ef0f74e5b41a',1,'Platform.h']]], + ['openvdb_5fdeprecated',['OPENVDB_DEPRECATED',['../Platform_8h.html#acad6915d4aac81665b540218e8b1e06c',1,'Platform.h']]], + ['openvdb_5fexact_5fis_5fapprox_5fequal',['OPENVDB_EXACT_IS_APPROX_EQUAL',['../Math_8h.html#a6b253af5feb78da3c382919eb161e94f',1,'Math.h']]], + ['openvdb_5fexception',['OPENVDB_EXCEPTION',['../Exceptions_8h.html#a82231e85176ee365b2fe7ec5dae79830',1,'Exceptions.h']]], + ['openvdb_5ffile_5fversion',['OPENVDB_FILE_VERSION',['../namespaceopenvdb_1_1v3__2__0.html#a92a71ea4cce8e2e9c931d01b5b24b9d1',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5fblosc_5fcompression',['OPENVDB_FILE_VERSION_BLOSC_COMPRESSION',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fcea734c8591d73ade4e36928409a6c8781f',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5fbool_5fleaf_5foptimization',['OPENVDB_FILE_VERSION_BOOL_LEAF_OPTIMIZATION',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fcea39944ff09038abccb66cb4734bb04b76',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5fboost_5fuuid',['OPENVDB_FILE_VERSION_BOOST_UUID',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fcea92530ad33f099f8f49b3db20fcd63d0c',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5ffloat_5ffrustum_5fbbox',['OPENVDB_FILE_VERSION_FLOAT_FRUSTUM_BBOX',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fcea9f0a34f01c923448692ebab6fc8157ea',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5fgrid_5finstancing',['OPENVDB_FILE_VERSION_GRID_INSTANCING',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fcea5b1955bdc7bfb97200c01693499d86ed',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5finternalnode_5fcompression',['OPENVDB_FILE_VERSION_INTERNALNODE_COMPRESSION',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fceaa0ba864e79bace97c0ff5d303c85e062',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5fnew_5ftransform',['OPENVDB_FILE_VERSION_NEW_TRANSFORM',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fceacf27fdeb27c14dd0fa37afaa9e860943',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5fno_5fgridmap',['OPENVDB_FILE_VERSION_NO_GRIDMAP',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fceabe6c412205fd80009e7e0c9612de53dd',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5fnode_5fmask_5fcompression',['OPENVDB_FILE_VERSION_NODE_MASK_COMPRESSION',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fcea71883b4156db5731c39d342a04e79e5a',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5fpoint_5findex_5fgrid',['OPENVDB_FILE_VERSION_POINT_INDEX_GRID',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fceaeef748e6dd4df219116923abd299dffa',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5frootnode_5fmap',['OPENVDB_FILE_VERSION_ROOTNODE_MAP',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fceaba32c7339fc3df797f72fbfe2a0cc136',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5fselective_5fcompression',['OPENVDB_FILE_VERSION_SELECTIVE_COMPRESSION',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fcea4f68b777de5275a442ac62582cec2754',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5fsimplified_5fgrid_5ftypename',['OPENVDB_FILE_VERSION_SIMPLIFIED_GRID_TYPENAME',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fceab9c004ca1c701249a07a6ea2e0f7943c',1,'openvdb::v3_2_0']]], + ['openvdb_5ffinish_5fnon_5fthreadsafe_5fstatic_5faddress',['OPENVDB_FINISH_NON_THREADSAFE_STATIC_ADDRESS',['../Types_8h.html#a04a587fd9ae1911115d6c9ea3d7b2ecd',1,'Types.h']]], + ['openvdb_5ffinish_5fnon_5fthreadsafe_5fstatic_5freference',['OPENVDB_FINISH_NON_THREADSAFE_STATIC_REFERENCE',['../Types_8h.html#a4c25fe5ebce981d186bc0d5b7094ec34',1,'Types.h']]], + ['openvdb_5ffinish_5fnon_5fthreadsafe_5fstatic_5fwrite',['OPENVDB_FINISH_NON_THREADSAFE_STATIC_WRITE',['../Types_8h.html#a9154d689727e60526e308351485a8187',1,'Types.h']]], + ['openvdb_5ffinish_5fthreadsafe_5fstatic_5faddress',['OPENVDB_FINISH_THREADSAFE_STATIC_ADDRESS',['../Types_8h.html#ae8027565fe483ff8ce9956b0c04de75c',1,'Types.h']]], + ['openvdb_5ffinish_5fthreadsafe_5fstatic_5freference',['OPENVDB_FINISH_THREADSAFE_STATIC_REFERENCE',['../Types_8h.html#ac68bc3e353838aee46b122d1035467e8',1,'Types.h']]], + ['openvdb_5ffinish_5fthreadsafe_5fstatic_5fwrite',['OPENVDB_FINISH_THREADSAFE_STATIC_WRITE',['../Types_8h.html#ac1bb06f94f61bbd95e69522ec6d184dd',1,'Types.h']]], + ['openvdb_5fhoudini_5fapi',['OPENVDB_HOUDINI_API',['../Platform_8h.html#a88b26daa45bbdd69d6bb12f9c7bfa3b2',1,'Platform.h']]], + ['openvdb_5flibrary_5fmajor_5fversion',['OPENVDB_LIBRARY_MAJOR_VERSION',['../namespaceopenvdb_1_1v3__2__0.html#a6a9f092ecf0f16defadb23a13629cd62',1,'openvdb::v3_2_0']]], + ['openvdb_5flibrary_5fmajor_5fversion_5fnumber',['OPENVDB_LIBRARY_MAJOR_VERSION_NUMBER',['../version_8h.html#ab04cca0a808617a2145460fc13d77534',1,'version.h']]], + ['openvdb_5flibrary_5fminor_5fversion',['OPENVDB_LIBRARY_MINOR_VERSION',['../namespaceopenvdb_1_1v3__2__0.html#ad72210c9b211de996a18108009e71979',1,'openvdb::v3_2_0']]], + ['openvdb_5flibrary_5fminor_5fversion_5fnumber',['OPENVDB_LIBRARY_MINOR_VERSION_NUMBER',['../version_8h.html#a998b52f43bf6f90248e86ce19814a22e',1,'version.h']]], + ['openvdb_5flibrary_5fpatch_5fversion',['OPENVDB_LIBRARY_PATCH_VERSION',['../namespaceopenvdb_1_1v3__2__0.html#a9fca3ac01682078c4721c6a109d171d1',1,'openvdb::v3_2_0']]], + ['openvdb_5flibrary_5fpatch_5fversion_5fnumber',['OPENVDB_LIBRARY_PATCH_VERSION_NUMBER',['../version_8h.html#ac0c88b27e16ed63fa759b577f290e7e8',1,'version.h']]], + ['openvdb_5flibrary_5fversion',['OPENVDB_LIBRARY_VERSION',['../namespaceopenvdb_1_1v3__2__0.html#adb9dac755c814d036506d1e7a41ebc10',1,'openvdb::v3_2_0']]], + ['openvdb_5flibrary_5fversion_5fnumber',['OPENVDB_LIBRARY_VERSION_NUMBER',['../version_8h.html#a42d8e4a1da2a0d797b1382579095055a',1,'version.h']]], + ['openvdb_5flibrary_5fversion_5fstring',['OPENVDB_LIBRARY_VERSION_STRING',['../version_8h.html#a473ea1fceaac55f6e7766789543e2259',1,'version.h']]], + ['openvdb_5flog_5fdebug',['OPENVDB_LOG_DEBUG',['../logging_8h.html#abc3f222c3f229a5447085e6ee867af13',1,'logging.h']]], + ['openvdb_5flog_5fdebug_5fruntime',['OPENVDB_LOG_DEBUG_RUNTIME',['../logging_8h.html#abdcf8b979065a205aaa7492d3aec79e6',1,'logging.h']]], + ['openvdb_5flog_5ferror',['OPENVDB_LOG_ERROR',['../logging_8h.html#a46b2f70df6eb9ea3f1313bdaa610693a',1,'logging.h']]], + ['openvdb_5flog_5ffatal',['OPENVDB_LOG_FATAL',['../logging_8h.html#a743e36b29932fefe6fd87519d85fdce2',1,'logging.h']]], + ['openvdb_5flog_5finfo',['OPENVDB_LOG_INFO',['../logging_8h.html#a613aa93b2e98f1b56e66f731bf6928ec',1,'logging.h']]], + ['openvdb_5flog_5fwarn',['OPENVDB_LOG_WARN',['../logging_8h.html#a5a55a6912fba67df50a02fd549bea63f',1,'logging.h']]], + ['openvdb_5fmagic',['OPENVDB_MAGIC',['../namespaceopenvdb_1_1v3__2__0.html#ad39fdafd7bf1a352a9459ae46fb2cf1c',1,'openvdb::v3_2_0']]], + ['openvdb_5fno_5ffp_5fequality_5fwarning_5fbegin',['OPENVDB_NO_FP_EQUALITY_WARNING_BEGIN',['../Math_8h.html#aa07e40c3d7f010bcb5c1369f6a78c8b0',1,'Math.h']]], + ['openvdb_5fno_5ffp_5fequality_5fwarning_5fend',['OPENVDB_NO_FP_EQUALITY_WARNING_END',['../Math_8h.html#a97049404e8b5906163c092580a6d394a',1,'Math.h']]], + ['openvdb_5fno_5funreachable_5fcode_5fwarning_5fbegin',['OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN',['../Platform_8h.html#ac8dadf7b858eb1987194e570f80bff79',1,'Platform.h']]], + ['openvdb_5fno_5funreachable_5fcode_5fwarning_5fend',['OPENVDB_NO_UNREACHABLE_CODE_WARNING_END',['../Platform_8h.html#aa4a2916120921a779c15e6182c8d8118',1,'Platform.h']]], + ['openvdb_5fstart_5fnon_5fthreadsafe_5fstatic_5faddress',['OPENVDB_START_NON_THREADSAFE_STATIC_ADDRESS',['../Types_8h.html#a7576930a67c5438495f5b4eca806a209',1,'Types.h']]], + ['openvdb_5fstart_5fnon_5fthreadsafe_5fstatic_5freference',['OPENVDB_START_NON_THREADSAFE_STATIC_REFERENCE',['../Types_8h.html#a1de5e38ab3511d8aa63ff49be1703a3c',1,'Types.h']]], + ['openvdb_5fstart_5fnon_5fthreadsafe_5fstatic_5fwrite',['OPENVDB_START_NON_THREADSAFE_STATIC_WRITE',['../Types_8h.html#ac303d44a9c746b4fc7882bb57ef4c0e2',1,'Types.h']]], + ['openvdb_5fstart_5fthreadsafe_5fstatic_5faddress',['OPENVDB_START_THREADSAFE_STATIC_ADDRESS',['../Types_8h.html#aba3a523e76beaaf0d8cc51e8bbdbe8ae',1,'Types.h']]], + ['openvdb_5fstart_5fthreadsafe_5fstatic_5freference',['OPENVDB_START_THREADSAFE_STATIC_REFERENCE',['../Types_8h.html#a116c03460d08a7c8124d77f0025aa5d6',1,'Types.h']]], + ['openvdb_5fstart_5fthreadsafe_5fstatic_5fwrite',['OPENVDB_START_THREADSAFE_STATIC_WRITE',['../Types_8h.html#a7b933d956cd2f602c346ec80f34d7efa',1,'Types.h']]], + ['openvdb_5fstatic_5fspecialization',['OPENVDB_STATIC_SPECIALIZATION',['../Platform_8h.html#a137393cc1430a98b19104b48694bb764',1,'Platform.h']]], + ['openvdb_5fthreadsafe_5fstatic_5faddress',['OPENVDB_THREADSAFE_STATIC_ADDRESS',['../Types_8h.html#a4221a82a55c24552c9b9812961654b94',1,'Types.h']]], + ['openvdb_5fthreadsafe_5fstatic_5freference',['OPENVDB_THREADSAFE_STATIC_REFERENCE',['../Types_8h.html#af45bfee6bdac4fd25ebba777d6ae8609',1,'Types.h']]], + ['openvdb_5fthreadsafe_5fstatic_5fwrite',['OPENVDB_THREADSAFE_STATIC_WRITE',['../Types_8h.html#a74544cfe36b32ed0637ff78e5b26e19e',1,'Types.h']]], + ['openvdb_5fthrow',['OPENVDB_THROW',['../Exceptions_8h.html#a3eec2ef3138c64fc5844490187c1b8d1',1,'Exceptions.h']]], + ['openvdb_5fuse_5fversion_5fnamespace',['OPENVDB_USE_VERSION_NAMESPACE',['../version_8h.html#a2dde157791cd7558cdf886489256ba14',1,'version.h']]], + ['openvdb_5fversion_5fname',['OPENVDB_VERSION_NAME',['../version_8h.html#a00be3835cb8ad1ded8abd821fad20fc0',1,'version.h']]], + ['operator_20bool',['operator bool',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::math::BBox::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1ConstValueIter.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::ConstValueIter::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox_1_1Iterator.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::math::CoordBBox::Iterator::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::math::CoordBBox::operator bool()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::operator bool()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::tools::PointIndexIterator::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::tree::IteratorBase::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::tree::NodeIteratorBase::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::tree::LeafIteratorBase::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorRange.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::tree::IteratorRange::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::util::BaseMaskIterator::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::operator bool()']]], + ['operator_20const_20t_20_2a',['operator const T *',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#af015545c1c88375a1fff0fd898f0d34e',1,'openvdb::v3_2_0::math::Quat']]], + ['operator_20inttype',['operator IntType',['../structopenvdb_1_1v3__2__0_1_1PointIndex.html#a5a37309c2e6fbc2eae2923f08446fd3a',1,'openvdb::v3_2_0::PointIndex']]], + ['operator_20t_20_2a',['operator T *',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a4e20322854ce5d78776cdaf1a87aacd9',1,'openvdb::v3_2_0::math::Quat']]], + ['operator_21',['operator!',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ad1c03d624d523f3931c833ae5e78b52b',1,'openvdb::v3_2_0::util::NodeMask::operator!()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ad1c03d624d523f3931c833ae5e78b52b',1,'openvdb::v3_2_0::util::NodeMask< 1 >::operator!()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ad1c03d624d523f3931c833ae5e78b52b',1,'openvdb::v3_2_0::util::NodeMask< 2 >::operator!()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a4737924bdaa559fe3f14eba5a8c065d8',1,'openvdb::v3_2_0::util::RootNodeMask::operator!()']]], + ['operator_21_3d',['operator!=',['../classopenvdb_1_1v3__2__0_1_1io_1_1File_1_1NameIterator.html#ad731ea38f82bc7860e8433d848277c51',1,'openvdb::v3_2_0::io::File::NameIterator::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a89e388b14180bed405a8a79515147289',1,'openvdb::v3_2_0::math::BBox::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#ad9e5ec82eff0fda53c118df6e5238e32',1,'openvdb::v3_2_0::math::Coord::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a58e1c19d8f710a140c032df0013e904c',1,'openvdb::v3_2_0::math::CoordBBox::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#af4182351a8514afb9e7e67522eca08e1',1,'openvdb::v3_2_0::math::AffineMap::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#aef40ae86c50b1e10c1dad269496487d9',1,'openvdb::v3_2_0::math::ScaleMap::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#a6a31c78b78ebc140d30c36f8ecc1d356',1,'openvdb::v3_2_0::math::UniformScaleMap::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a7ad4c5c42c645dc90dd5e58603d21b36',1,'openvdb::v3_2_0::math::TranslationMap::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#aef659ece0e1424a8d95ad612dfc73c70',1,'openvdb::v3_2_0::math::ScaleTranslateMap::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#a901caac11b12ab77117021639f89f7d8',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a8e04f29c9cea4dcff8b3649aca6d2154',1,'openvdb::v3_2_0::math::UnitaryMap::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#af341fca5459db88643203d9dd5dc2cb1',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#a9b64e962db3abd01438b76d6385c7545',1,'openvdb::v3_2_0::math::CompoundMap::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a3f0aa5f483c1b26faf9e90b19e41b01b',1,'openvdb::v3_2_0::math::Transform::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ab5c8425b0e68d6ade1af1f5eb6c67e89',1,'openvdb::v3_2_0::math::Vec2::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a48a8614b8bf344ff90eb97546b65e8c2',1,'openvdb::v3_2_0::Metadata::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a6dab276e85d6d39f851627dc2a59f7d4',1,'openvdb::v3_2_0::MetaMap::operator!=()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#aa9de743b41d10fa23ec01eac2fb3a7fb',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::operator!=()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#aaf3d0b0f1b6a05bbfa2e9d06250077ce',1,'openvdb::v3_2_0::tools::PointIndexIterator::operator!=()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ad36e89f6be128b5cbfb838313ea6008c',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#a14acdab1503d84949f8990590036ccfd',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#a29eff03eadeb4d3fef8f68516b3dd11e',1,'openvdb::v3_2_0::tree::IteratorBase::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#a8c6df673280990e664cbf787369ef582',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#ab1cf65525fdc5fcfed175ca83afbe5d9',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ab2435a9d5ed7aff17a894950d296e070',1,'openvdb::v3_2_0::tree::LeafNode::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#ab1cf65525fdc5fcfed175ca83afbe5d9',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aede954bfcde9f04fd10627324cc528be',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#ab1cf65525fdc5fcfed175ca83afbe5d9',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aede954bfcde9f04fd10627324cc528be',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#a8c6df673280990e664cbf787369ef582',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a959590aa97e5f65a585a3c0a5ff6375f',1,'openvdb::v3_2_0::tree::Tree::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html#ad9ff37fe97916e12f1dd3837625ab526',1,'openvdb::v3_2_0::util::BaseMaskIterator::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a0d9fa5484e29c67516f279af02832f9b',1,'openvdb::v3_2_0::util::NodeMask::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a0d9fa5484e29c67516f279af02832f9b',1,'openvdb::v3_2_0::util::NodeMask< 1 >::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a0d9fa5484e29c67516f279af02832f9b',1,'openvdb::v3_2_0::util::NodeMask< 2 >::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#a61e196cdfb06bb5f8872b73924542217',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a3dfc951161e78be4395f68474be1fa2d',1,'openvdb::v3_2_0::util::RootNodeMask::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#af2589a4ffc907771127419cd41a33dcb',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a8c6df673280990e664cbf787369ef582',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a1b96b467feb95a206a604818a079be80',1,'openvdb::v3_2_0::math::Mat3::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#ab6fc63084c691d2dab40d617ea6651ca',1,'openvdb::v3_2_0::math::Mat4::operator!=()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a11cf47180047164e5a58f4544dbf6bb4',1,'openvdb::v3_2_0::math::operator!=(const Vec3< T0 > &v0, const Vec3< T1 > &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab06c7c478c16261c5890d6a6bc5f89c9',1,'openvdb::v3_2_0::math::operator!=(const Vec4< T0 > &v0, const Vec4< T1 > &v1)']]], + ['operator_26',['operator&',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#ada52b01155b31f1e74a565e9928b20bf',1,'openvdb::v3_2_0::math::Coord::operator&()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#aa4ba4ee5b2f8066ebb398a6b5d36e6b8',1,'openvdb::v3_2_0::math::CoordBBox::operator&()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a37fffa038bb93361898368d410fcd821',1,'openvdb::v3_2_0::util::NodeMask::operator&()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a37fffa038bb93361898368d410fcd821',1,'openvdb::v3_2_0::util::NodeMask< 1 >::operator&()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a37fffa038bb93361898368d410fcd821',1,'openvdb::v3_2_0::util::NodeMask< 2 >::operator&()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#ad4a426dc0c3bb5d7e0b673d75bb5035e',1,'openvdb::v3_2_0::util::RootNodeMask::operator&()']]], + ['operator_26_3d',['operator&=',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#ace0899d6352cccd9cc453f68f35fd799',1,'openvdb::v3_2_0::math::Coord::operator&=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#ad37a6e54afd41f55937d1d66157c007e',1,'openvdb::v3_2_0::math::CoordBBox::operator&=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#abeacdb85957f00d5ba1805a7081f46c9',1,'openvdb::v3_2_0::util::NodeMask::operator&=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#abeacdb85957f00d5ba1805a7081f46c9',1,'openvdb::v3_2_0::util::NodeMask< 1 >::operator&=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#abeacdb85957f00d5ba1805a7081f46c9',1,'openvdb::v3_2_0::util::NodeMask< 2 >::operator&=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a92f7b922ea0f5aa5882315fdc6c467f1',1,'openvdb::v3_2_0::util::RootNodeMask::operator&=()']]], + ['operator_28_29',['operator()',['../structopenvdb_1_1v3__2__0_1_1GridNamePred.html#afd282c9630283c6d0fa16e65cf1a6821',1,'openvdb::v3_2_0::GridNamePred::operator()()'],['../structopenvdb_1_1v3__2__0_1_1SwappedCombineOp.html#a59279775385d3f45e923bbbf5fd14ed7',1,'openvdb::v3_2_0::SwappedCombineOp::operator()()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#aacf0f35e98dd04febf9c1b428ae7c779',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::operator()()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1CopyOp.html#a70594558a5d2b66b30dd8157882d88e7',1,'openvdb::v3_2_0::math::pcg::internal::CopyOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1FillOp.html#a70594558a5d2b66b30dd8157882d88e7',1,'openvdb::v3_2_0::math::pcg::internal::FillOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1LinearOp.html#a70594558a5d2b66b30dd8157882d88e7',1,'openvdb::v3_2_0::math::pcg::internal::LinearOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1DeterministicDotProductOp.html#a70594558a5d2b66b30dd8157882d88e7',1,'openvdb::v3_2_0::math::pcg::Vector::DeterministicDotProductOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1InfNormOp.html#a88765d3a82417a34b4dcb14b14687514',1,'openvdb::v3_2_0::math::pcg::Vector::InfNormOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1IsFiniteOp.html#a8c710fdfda02c711aebe97145d853f34',1,'openvdb::v3_2_0::math::pcg::Vector::IsFiniteOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1MatrixCopyOp.html#a70594558a5d2b66b30dd8157882d88e7',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::MatrixCopyOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1IsFiniteOp.html#a8c710fdfda02c711aebe97145d853f34',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::IsFiniteOp::operator()()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a8c8ceabc696d63c5c1949706e5f949af',1,'openvdb::v3_2_0::math::Mat3::operator()(int i, int j)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a52f400707bfe09b4abe0f2cc6dac6e74',1,'openvdb::v3_2_0::math::Mat3::operator()(int i, int j) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a8c8ceabc696d63c5c1949706e5f949af',1,'openvdb::v3_2_0::math::Mat4::operator()(int i, int j)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a52f400707bfe09b4abe0f2cc6dac6e74',1,'openvdb::v3_2_0::math::Mat4::operator()(int i, int j) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Rand01.html#a72e333a0205ea074b388ef83727c8960',1,'openvdb::v3_2_0::math::Rand01::operator()()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1RandInt.html#a51b68caa26bd35621916edcf08af6b1f',1,'openvdb::v3_2_0::math::RandInt::operator()()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1RandInt.html#ae2c5638d9d44fa42f045913b43b0311d',1,'openvdb::v3_2_0::math::RandInt::operator()(IntType imin, IntType imax)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#adce494aef973cb47c29682e6e99dbc56',1,'openvdb::v3_2_0::math::Quat::operator()(int i)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ad0e4e848d2b4ddc9f50872e020ed3f2b',1,'openvdb::v3_2_0::math::Quat::operator()(int i) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#afaf6d5f6f5a6accd065787f4d65ef7e9',1,'openvdb::v3_2_0::math::Ray::operator()()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#adce494aef973cb47c29682e6e99dbc56',1,'openvdb::v3_2_0::math::Vec2::operator()(int i)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ad0e4e848d2b4ddc9f50872e020ed3f2b',1,'openvdb::v3_2_0::math::Vec2::operator()(int i) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#adce494aef973cb47c29682e6e99dbc56',1,'openvdb::v3_2_0::math::Vec3::operator()(int i)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ad0e4e848d2b4ddc9f50872e020ed3f2b',1,'openvdb::v3_2_0::math::Vec3::operator()(int i) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#adce494aef973cb47c29682e6e99dbc56',1,'openvdb::v3_2_0::math::Vec4::operator()(int i)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#ad0e4e848d2b4ddc9f50872e020ed3f2b',1,'openvdb::v3_2_0::math::Vec4::operator()(int i) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeBackgroundOp.html#a45e16956bbe5cbfb5c7f6e71e7696187',1,'openvdb::v3_2_0::tools::ChangeBackgroundOp::operator()(RootT &root) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeBackgroundOp.html#a13593e8b1a097836618fa1b804a9d229',1,'openvdb::v3_2_0::tools::ChangeBackgroundOp::operator()(LeafT &node) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeBackgroundOp.html#ae1f5ed28c41182784d3730246694abea',1,'openvdb::v3_2_0::tools::ChangeBackgroundOp::operator()(NodeT &node) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeLevelSetBackgroundOp.html#a45e16956bbe5cbfb5c7f6e71e7696187',1,'openvdb::v3_2_0::tools::ChangeLevelSetBackgroundOp::operator()(RootT &root) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeLevelSetBackgroundOp.html#a13593e8b1a097836618fa1b804a9d229',1,'openvdb::v3_2_0::tools::ChangeLevelSetBackgroundOp::operator()(LeafT &node) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeLevelSetBackgroundOp.html#ae1f5ed28c41182784d3730246694abea',1,'openvdb::v3_2_0::tools::ChangeLevelSetBackgroundOp::operator()(NodeT &node) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1MaskInteriorVoxels.html#addf70f6c2ad52e155e55d8019aea7696',1,'openvdb::v3_2_0::tools::clip_internal::MaskInteriorVoxels::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1CopyLeafNodes.html#ad6b1ade4989f783bd95d99185c8d8f4a',1,'openvdb::v3_2_0::tools::clip_internal::CopyLeafNodes::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1ConvertGrid.html#a10f2c5a2677278e33187e70cc1d2a35c',1,'openvdb::v3_2_0::tools::clip_internal::ConvertGrid::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1ConvertGrid_3_01GridT_00_01GridT_01_4.html#a51d9c6d1c3a463279e38a5ea085b1da6',1,'openvdb::v3_2_0::tools::clip_internal::ConvertGrid< GridT, GridT >::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildPrimarySegment.html#a3ca27034df6644c0a57e145dfbc72613',1,'openvdb::v3_2_0::tools::composite::BuildPrimarySegment::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildSecondarySegment.html#a3ca27034df6644c0a57e145dfbc72613',1,'openvdb::v3_2_0::tools::composite::BuildSecondarySegment::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CompReplaceOp.html#a8730cfdf672ddfa8df0b5fcb97fdd12e',1,'openvdb::v3_2_0::tools::CompReplaceOp::operator()(const typename TreeT::ValueOnCIter &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CompReplaceOp.html#accd3c4b8b4c0fef2b6ba71956fe024b5',1,'openvdb::v3_2_0::tools::CompReplaceOp::operator()(const typename TreeT::LeafCIter &leafIter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgUnionVisitor.html#a3287046d8080bbff842ea83190d824dc',1,'openvdb::v3_2_0::tools::CsgUnionVisitor::operator()(AIterT &, BIterT &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgUnionVisitor.html#a78629ce4e4e3d34a530c8ca05d0a9787',1,'openvdb::v3_2_0::tools::CsgUnionVisitor::operator()(IterT &aIter, IterT &bIter)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgUnionVisitor.html#a3fd0588fd3783a1ab7cbfab3524df02e',1,'openvdb::v3_2_0::tools::CsgUnionVisitor::operator()(ChildIterT &aIter, ChildIterT &bIter)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgIntersectVisitor.html#a3287046d8080bbff842ea83190d824dc',1,'openvdb::v3_2_0::tools::CsgIntersectVisitor::operator()(AIterT &, BIterT &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgIntersectVisitor.html#a78629ce4e4e3d34a530c8ca05d0a9787',1,'openvdb::v3_2_0::tools::CsgIntersectVisitor::operator()(IterT &aIter, IterT &bIter)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgIntersectVisitor.html#a3fd0588fd3783a1ab7cbfab3524df02e',1,'openvdb::v3_2_0::tools::CsgIntersectVisitor::operator()(ChildIterT &aIter, ChildIterT &bIter)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgDiffVisitor.html#a3287046d8080bbff842ea83190d824dc',1,'openvdb::v3_2_0::tools::CsgDiffVisitor::operator()(AIterT &, BIterT &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgDiffVisitor.html#a78629ce4e4e3d34a530c8ca05d0a9787',1,'openvdb::v3_2_0::tools::CsgDiffVisitor::operator()(IterT &aIter, IterT &bIter)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgDiffVisitor.html#a3fd0588fd3783a1ab7cbfab3524df02e',1,'openvdb::v3_2_0::tools::CsgDiffVisitor::operator()(ChildIterT &aIter, ChildIterT &bIter)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyToDense.html#ac6f1be3197a00b75d474be1652e5d61e',1,'openvdb::v3_2_0::tools::CopyToDense::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyFromDense.html#a8e3d01c07ed0cfc820050e4e43e39307',1,'openvdb::v3_2_0::tools::CopyFromDense::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#a63e264c67f7b3f7a7a58d2d86c856b04',1,'openvdb::v3_2_0::tools::SparseExtractor::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ExtractAll.html#a67ec018dbfb5f53f53b400de16adb9ca',1,'openvdb::v3_2_0::tools::ExtractAll::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseTransformer.html#a2695ba889acb169f0e7cc2bf17f37151',1,'openvdb::v3_2_0::tools::DenseTransformer::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#a4b2a0005a957c56761a791a7b150d914',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor::operator()(const MaskLeafT &maskLeaf, size_t) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#a6a071f315936181b62c6ccf686b67e76',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor::operator()(const Range3d &range) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNan.html#a57250505f7f6f1ba83f3d237a071128d',1,'openvdb::v3_2_0::tools::CheckNan::operator()(const ElementType &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNan.html#ae18c14600b4c2d664f22691f61d8385f',1,'openvdb::v3_2_0::tools::CheckNan::operator()(const T &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNan.html#a04986e385f35b8f1d6d9ef739b7ddf1f',1,'openvdb::v3_2_0::tools::CheckNan::operator()(const TreeIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNan.html#a985e64420b68db1b91d44c9fc347db7d',1,'openvdb::v3_2_0::tools::CheckNan::operator()(const VoxelIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckInf.html#a57250505f7f6f1ba83f3d237a071128d',1,'openvdb::v3_2_0::tools::CheckInf::operator()(const ElementType &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckInf.html#ae18c14600b4c2d664f22691f61d8385f',1,'openvdb::v3_2_0::tools::CheckInf::operator()(const T &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckInf.html#a04986e385f35b8f1d6d9ef739b7ddf1f',1,'openvdb::v3_2_0::tools::CheckInf::operator()(const TreeIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckInf.html#a985e64420b68db1b91d44c9fc347db7d',1,'openvdb::v3_2_0::tools::CheckInf::operator()(const VoxelIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckFinite.html#a57250505f7f6f1ba83f3d237a071128d',1,'openvdb::v3_2_0::tools::CheckFinite::operator()(const ElementType &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckFinite.html#ae18c14600b4c2d664f22691f61d8385f',1,'openvdb::v3_2_0::tools::CheckFinite::operator()(const T &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckFinite.html#a04986e385f35b8f1d6d9ef739b7ddf1f',1,'openvdb::v3_2_0::tools::CheckFinite::operator()(const TreeIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckFinite.html#a985e64420b68db1b91d44c9fc347db7d',1,'openvdb::v3_2_0::tools::CheckFinite::operator()(const VoxelIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMagnitude.html#a57250505f7f6f1ba83f3d237a071128d',1,'openvdb::v3_2_0::tools::CheckMagnitude::operator()(const ElementType &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMagnitude.html#ae18c14600b4c2d664f22691f61d8385f',1,'openvdb::v3_2_0::tools::CheckMagnitude::operator()(const T &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMagnitude.html#a04986e385f35b8f1d6d9ef739b7ddf1f',1,'openvdb::v3_2_0::tools::CheckMagnitude::operator()(const TreeIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMagnitude.html#a985e64420b68db1b91d44c9fc347db7d',1,'openvdb::v3_2_0::tools::CheckMagnitude::operator()(const VoxelIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckRange.html#a57250505f7f6f1ba83f3d237a071128d',1,'openvdb::v3_2_0::tools::CheckRange::operator()(const ElementType &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckRange.html#ae18c14600b4c2d664f22691f61d8385f',1,'openvdb::v3_2_0::tools::CheckRange::operator()(const T &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckRange.html#a04986e385f35b8f1d6d9ef739b7ddf1f',1,'openvdb::v3_2_0::tools::CheckRange::operator()(const TreeIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckRange.html#a985e64420b68db1b91d44c9fc347db7d',1,'openvdb::v3_2_0::tools::CheckRange::operator()(const VoxelIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMin.html#a57250505f7f6f1ba83f3d237a071128d',1,'openvdb::v3_2_0::tools::CheckMin::operator()(const ElementType &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMin.html#ae18c14600b4c2d664f22691f61d8385f',1,'openvdb::v3_2_0::tools::CheckMin::operator()(const T &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMin.html#a04986e385f35b8f1d6d9ef739b7ddf1f',1,'openvdb::v3_2_0::tools::CheckMin::operator()(const TreeIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMin.html#a985e64420b68db1b91d44c9fc347db7d',1,'openvdb::v3_2_0::tools::CheckMin::operator()(const VoxelIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMax.html#a57250505f7f6f1ba83f3d237a071128d',1,'openvdb::v3_2_0::tools::CheckMax::operator()(const ElementType &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMax.html#ae18c14600b4c2d664f22691f61d8385f',1,'openvdb::v3_2_0::tools::CheckMax::operator()(const T &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMax.html#a04986e385f35b8f1d6d9ef739b7ddf1f',1,'openvdb::v3_2_0::tools::CheckMax::operator()(const TreeIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMax.html#a985e64420b68db1b91d44c9fc347db7d',1,'openvdb::v3_2_0::tools::CheckMax::operator()(const VoxelIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#a66a68e890f02f21bdc10dcf27aa388a1',1,'openvdb::v3_2_0::tools::CheckNormGrad::operator()(const ValueType &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#a741c1faff3a670224b3bfe2d42d8f301',1,'openvdb::v3_2_0::tools::CheckNormGrad::operator()(const TreeIterT &) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#a985e64420b68db1b91d44c9fc347db7d',1,'openvdb::v3_2_0::tools::CheckNormGrad::operator()(const VoxelIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#a66a68e890f02f21bdc10dcf27aa388a1',1,'openvdb::v3_2_0::tools::CheckEikonal::operator()(const ValueType &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#a741c1faff3a670224b3bfe2d42d8f301',1,'openvdb::v3_2_0::tools::CheckEikonal::operator()(const TreeIterT &) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#a985e64420b68db1b91d44c9fc347db7d',1,'openvdb::v3_2_0::tools::CheckEikonal::operator()(const VoxelIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#a57250505f7f6f1ba83f3d237a071128d',1,'openvdb::v3_2_0::tools::CheckDivergence::operator()(const ElementType &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#a741c1faff3a670224b3bfe2d42d8f301',1,'openvdb::v3_2_0::tools::CheckDivergence::operator()(const TreeIterT &) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#a985e64420b68db1b91d44c9fc347db7d',1,'openvdb::v3_2_0::tools::CheckDivergence::operator()(const VoxelIterT &iter) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveVoxelValues.html#ad6b1ade4989f783bd95d99185c8d8f4a',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveVoxelValues::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveTileValues.html#a9f9d607b5947cffbbf7943011dc4a741',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveTileValues::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a2695ba889acb169f0e7cc2bf17f37151',1,'openvdb::v3_2_0::tools::Filter::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html#a344bc988a2b07b9f463f4ef2b9db7043',1,'openvdb::v3_2_0::tools::gridop::GridOperator::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Divergence_1_1Functor.html#a1424bc766170676bbac147c2a81f8ec0',1,'openvdb::v3_2_0::tools::Divergence::Functor::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Gradient_1_1Functor.html#a1424bc766170676bbac147c2a81f8ec0',1,'openvdb::v3_2_0::tools::Gradient::Functor::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian_1_1Functor.html#a1424bc766170676bbac147c2a81f8ec0',1,'openvdb::v3_2_0::tools::Laplacian::Functor::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature_1_1Functor.html#a1424bc766170676bbac147c2a81f8ec0',1,'openvdb::v3_2_0::tools::MeanCurvature::Functor::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude_1_1Functor.html#a1424bc766170676bbac147c2a81f8ec0',1,'openvdb::v3_2_0::tools::Magnitude::Functor::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Normalize_1_1Functor.html#a1424bc766170676bbac147c2a81f8ec0',1,'openvdb::v3_2_0::tools::Normalize::Functor::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler.html#a001957a4aac16be9ead6766fff314145',1,'openvdb::v3_2_0::tools::DualGridSampler::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerT_01_4.html#a001957a4aac16be9ead6766fff314145',1,'openvdb::v3_2_0::tools::DualGridSampler< tree::ValueAccessor< TreeT >, SamplerT >::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#ae5992863e8fdf13ecb37765222d3110c',1,'openvdb::v3_2_0::tools::AlphaMask::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter_1_1Filter_1_1Avg.html#a98c29532afc34180783d5f045fd1cbb4',1,'openvdb::v3_2_0::tools::LevelSetFilter::Filter::Avg::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__fracture__internal_1_1FindMinMaxVoxelValue.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::level_set_fracture_internal::FindMinMaxVoxelValue::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiracDelta.html#a0b91f4e08854f5c5aec5455de2f4607f',1,'openvdb::v3_2_0::tools::DiracDelta::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PointListTransform.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::internal::PointListTransform::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PrimCpy.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::internal::PrimCpy::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorVoxels.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorVoxels::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorTiles.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorTiles::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1PopulateTree.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::level_set_util_internal::PopulateTree::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1LabelBoundaryVoxels.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::LabelBoundaryVoxels::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FlipRegionSign.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::FlipRegionSign::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinVoxelValue.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinVoxelValue::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinTileValue.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinTileValue::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SDFVoxelsToFogVolume.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::SDFVoxelsToFogVolume::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SDFTilesToFogVolume.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::SDFTilesToFogVolume::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillMaskBoundary.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillMaskBoundary::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskIsovalueCrossingVoxels.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskIsovalueCrossingVoxels::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SegmentNodeMask.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::SegmentNodeMask::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ConnectNodeMaskSegments.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::ConnectNodeMaskSegments::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskSegmentGroup.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskSegmentGroup::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandLeafNodeRegion.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandLeafNodeRegion::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillLeafNodeVoxels.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillLeafNodeVoxels::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandNarrowbandMask.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandNarrowbandMask::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FloodFillSign.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::FloodFillSign::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskedCopy.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskedCopy::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ComputeActiveVoxelCount.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::ComputeActiveVoxelCount::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GreaterCount.html#a4ad0421e425d69339f8f89dc25e4d8ce',1,'openvdb::v3_2_0::tools::level_set_util_internal::GreaterCount::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1TransformPoints.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::TransformPoints::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1CombineLeafNodes.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::CombineLeafNodes::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1StashOriginAndStoreOffset.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::StashOriginAndStoreOffset::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RestoreOrigin.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RestoreOrigin::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeNodeConnectivity.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ComputeNodeConnectivity::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SweepExteriorSign.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SweepExteriorSign::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedFillExteriorSign.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedFillExteriorSign::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1FillArray.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::FillArray::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SyncVoxelMask.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SyncVoxelMask::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedPoints::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeIntersectingVoxelSign.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ComputeIntersectingVoxelSign::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ValidateIntersectingVoxels.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ValidateIntersectingVoxels::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RemoveSelfIntersectingSurface.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RemoveSelfIntersectingSurface::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ReleaseChildNodes.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ReleaseChildNodes::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1StealUniqueLeafNodes.html#a3ca27034df6644c0a57e145dfbc72613',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::StealUniqueLeafNodes::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizePolygons.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizePolygons::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1DiffLeafNodeMask.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::DiffLeafNodeMask::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1UnionValueMasks.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::UnionValueMasks::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ConstructVoxelMask.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ConstructVoxelMask::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1AddNodes.html#a3ca27034df6644c0a57e145dfbc72613',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::AddNodes::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1TransformValues.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::TransformValues::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1InactivateValues.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::InactivateValues::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1OffsetValues.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::OffsetValues::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1Renormalize.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::Renormalize::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1MinCombine.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::MinCombine::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1GenEdgeData.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::GenEdgeData::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1ErodeVoxelsOp.html#a65781f4ff82f1267c1d4c99b5b9b66cf',1,'openvdb::v3_2_0::tools::Morphology::ErodeVoxelsOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1MaskManager.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::Morphology::MaskManager::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1UpdateMasks.html#a8e3d01c07ed0cfc820050e4e43e39307',1,'openvdb::v3_2_0::tools::Morphology::UpdateMasks::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1CopyMasks.html#a8e3d01c07ed0cfc820050e4e43e39307',1,'openvdb::v3_2_0::tools::Morphology::CopyMasks::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1activation_1_1ActivationOp.html#a1d0397a159289d339286bec39049d217',1,'openvdb::v3_2_0::tools::activation::ActivationOp::operator()(const typename TreeType::ValueOnIter &it) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1activation_1_1ActivationOp.html#ae479a1e413badeffb302cf8a60ab82b3',1,'openvdb::v3_2_0::tools::activation::ActivationOp::operator()(const typename TreeType::ValueOffIter &it) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1activation_1_1ActivationOp.html#a4cfbb89bbdc7d51be4b56a3ffa0ccd21',1,'openvdb::v3_2_0::tools::activation::ActivationOp::operator()(const typename TreeType::LeafIter &lit) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DilationOp.html#a0dd2104bc82c7b0e8644d381fd2eb0f8',1,'openvdb::v3_2_0::tools::DilationOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1MaskOp.html#a48af7dca4ffa67b1db6e3bf1fe2b8312',1,'openvdb::v3_2_0::tools::MultiResGrid::MaskOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1ComputeExtremas.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::particle_atlas_internal::ComputeExtremas::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RemapIndices.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::particle_atlas_internal::RemapIndices::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::PointAdvect::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1ValidPartitioningOp.html#a139cc413e962180c1171a851b1ea2d82',1,'openvdb::v3_2_0::tools::point_index_grid_internal::ValidPartitioningOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1PopulateLeafNodesOp.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::point_index_grid_internal::PopulateLeafNodesOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid_1_1ReducePool.html#a8590a7fd0babb5affc029945e2ca93f2',1,'openvdb::v3_2_0::tools::PointMaskGrid::ReducePool::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1ComputePointOrderOp.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::point_partitioner_internal::ComputePointOrderOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1CreateOrderedPointIndexArrayOp.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::point_partitioner_internal::CreateOrderedPointIndexArrayOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1VoxelOrderOp.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::point_partitioner_internal::VoxelOrderOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1LeafNodeOriginOp.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::point_partitioner_internal::LeafNodeOriginOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MoveSegmentDataOp.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MoveSegmentDataOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MergeBinsOp.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MergeBinsOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1OrderSegmentsOp.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::point_partitioner_internal::OrderSegmentsOp::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1UniformPointScatter.html#ac0e0546d8df4f8666b5f744f24b61598',1,'openvdb::v3_2_0::tools::UniformPointScatter::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseUniformPointScatter.html#ac0e0546d8df4f8666b5f744f24b61598',1,'openvdb::v3_2_0::tools::DenseUniformPointScatter::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1NonUniformPointScatter.html#ac0e0546d8df4f8666b5f744f24b61598',1,'openvdb::v3_2_0::tools::NonUniformPointScatter::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1LeafCountOp.html#a99e83f626900952369798ef653da027e',1,'openvdb::v3_2_0::tools::poisson::internal::LeafCountOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1LeafIndexOp.html#aa29f38f727f0b484818db1c326c4bcaf',1,'openvdb::v3_2_0::tools::poisson::internal::LeafIndexOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyToVecOp.html#a3f13cff3dad5f7a0f5f07f56ac64dab4',1,'openvdb::v3_2_0::tools::poisson::internal::CopyToVecOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyFromVecOp.html#a3f13cff3dad5f7a0f5f07f56ac64dab4',1,'openvdb::v3_2_0::tools::poisson::internal::CopyFromVecOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1DirichletOp.html#a44787a05ab39eb89d39fae1b585d7e7d',1,'openvdb::v3_2_0::tools::poisson::internal::DirichletOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1ISLaplacianOp.html#a3f13cff3dad5f7a0f5f07f56ac64dab4',1,'openvdb::v3_2_0::tools::poisson::internal::ISLaplacianOp::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1InactivePruneOp.html#a0063eb96b185ab4be93954864d5f91b0',1,'openvdb::v3_2_0::tools::InactivePruneOp::operator()(LeafT &) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1InactivePruneOp.html#ae1f5ed28c41182784d3730246694abea',1,'openvdb::v3_2_0::tools::InactivePruneOp::operator()(NodeT &node) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1InactivePruneOp.html#a45e16956bbe5cbfb5c7f6e71e7696187',1,'openvdb::v3_2_0::tools::InactivePruneOp::operator()(RootT &root) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1TolerancePruneOp.html#a45e16956bbe5cbfb5c7f6e71e7696187',1,'openvdb::v3_2_0::tools::TolerancePruneOp::operator()(RootT &root) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1TolerancePruneOp.html#ae1f5ed28c41182784d3730246694abea',1,'openvdb::v3_2_0::tools::TolerancePruneOp::operator()(NodeT &node) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1TolerancePruneOp.html#a0063eb96b185ab4be93954864d5f91b0',1,'openvdb::v3_2_0::tools::TolerancePruneOp::operator()(LeafT &) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetPruneOp.html#a0063eb96b185ab4be93954864d5f91b0',1,'openvdb::v3_2_0::tools::LevelSetPruneOp::operator()(LeafT &) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetPruneOp.html#ae1f5ed28c41182784d3730246694abea',1,'openvdb::v3_2_0::tools::LevelSetPruneOp::operator()(NodeT &node) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetPruneOp.html#a45e16956bbe5cbfb5c7f6e71e7696187',1,'openvdb::v3_2_0::tools::LevelSetPruneOp::operator()(RootT &root) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::LevelSetRayTracer::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::VolumeRender::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseShader.html#a638bffd471802ef321f8c95087f0682e',1,'openvdb::v3_2_0::tools::BaseShader::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MatteShader.html#a225b39f7a269aca826a1f41431c1a1d2',1,'openvdb::v3_2_0::tools::MatteShader::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MatteShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#af47f9c1997335deb9977b37236bd7c27',1,'openvdb::v3_2_0::tools::MatteShader< Film::RGBA, SamplerType >::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1NormalShader.html#a7431a14e8637855f3601ab67487f3df8',1,'openvdb::v3_2_0::tools::NormalShader::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1NormalShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#a194c5249ca8960eb6f1ff69c743ab9bd',1,'openvdb::v3_2_0::tools::NormalShader< Film::RGBA, SamplerType >::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PositionShader.html#a225b39f7a269aca826a1f41431c1a1d2',1,'openvdb::v3_2_0::tools::PositionShader::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PositionShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#a225b39f7a269aca826a1f41431c1a1d2',1,'openvdb::v3_2_0::tools::PositionShader< Film::RGBA, SamplerType >::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiffuseShader.html#ab3faef4e0a74e29ce19485cea03fc1d4',1,'openvdb::v3_2_0::tools::DiffuseShader::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiffuseShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#a7b2caefe81e1b8a49105f75b4bc28540',1,'openvdb::v3_2_0::tools::DiffuseShader< Film::RGBA, SamplerType >::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SignedFloodFillOp.html#abc80a0c613395cdc62d75e988aff356f',1,'openvdb::v3_2_0::tools::SignedFloodFillOp::operator()(LeafT &leaf) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SignedFloodFillOp.html#ae1f5ed28c41182784d3730246694abea',1,'openvdb::v3_2_0::tools::SignedFloodFillOp::operator()(NodeT &node) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SignedFloodFillOp.html#a45e16956bbe5cbfb5c7f6e71e7696187',1,'openvdb::v3_2_0::tools::SignedFloodFillOp::operator()(RootT &root) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1GetVal.html#ace4d6f46ef543010e33756b8d6a6e08e',1,'openvdb::v3_2_0::tools::stats_internal::GetVal::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1StatsOp.html#a19d0e346d3589cfcd45168275e0a7aa4',1,'openvdb::v3_2_0::tools::stats_internal::StatsOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1HistOp.html#a19d0e346d3589cfcd45168275e0a7aa4',1,'openvdb::v3_2_0::tools::stats_internal::HistOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1MathOp.html#ad29b7c8264935700b9183f2fee447972',1,'openvdb::v3_2_0::tools::stats_internal::MathOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ttls__internal_1_1OffsetAndMinComp.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::ttls_internal::OffsetAndMinComp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1MinOp.html#abbf28485b26b972edbb5e24281423303',1,'openvdb::v3_2_0::tools::valxform::MinOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1MaxOp.html#abbf28485b26b972edbb5e24281423303',1,'openvdb::v3_2_0::tools::valxform::MaxOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SumOp.html#abbf28485b26b972edbb5e24281423303',1,'openvdb::v3_2_0::tools::valxform::SumOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1MultOp.html#abbf28485b26b972edbb5e24281423303',1,'openvdb::v3_2_0::tools::valxform::MultOp::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpApplier.html#a70faa237b9ab17dd3cf38b978f850a34',1,'openvdb::v3_2_0::tools::valxform::SharedOpApplier::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpApplier.html#a70faa237b9ab17dd3cf38b978f850a34',1,'openvdb::v3_2_0::tools::valxform::CopyableOpApplier::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpTransformer.html#a1e2a84509e672c74f4afba484efde31d',1,'openvdb::v3_2_0::tools::valxform::SharedOpTransformer::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpTransformer.html#a62ac0d182d61dae21671bd16c10ae160',1,'openvdb::v3_2_0::tools::valxform::CopyableOpTransformer::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1OpAccumulator.html#a2fbc4895ec930e032b0c6a7d14ceb054',1,'openvdb::v3_2_0::tools::valxform::OpAccumulator::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1HomogeneousMatMul.html#acaceb3fad0005e8130a71b2e54af7e43',1,'openvdb::v3_2_0::tools::HomogeneousMatMul::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MatMul.html#acaceb3fad0005e8130a71b2e54af7e43',1,'openvdb::v3_2_0::tools::MatMul::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MatMulNormalize.html#acaceb3fad0005e8130a71b2e54af7e43',1,'openvdb::v3_2_0::tools::MatMulNormalize::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiscreteField.html#adaace498ef214e1a9a2881dda506bbdf',1,'openvdb::v3_2_0::tools::DiscreteField::operator()(const Vec3d &xyz, ValueType) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiscreteField.html#a184217ae3991646d17488916603d9c78',1,'openvdb::v3_2_0::tools::DiscreteField::operator()(const Coord &ijk, ValueType) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1EnrightField.html#a73310ed490a1c3dab30b8a4de175e2fd',1,'openvdb::v3_2_0::tools::EnrightField::operator()(const Vec3d &xyz, ValueType time) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1EnrightField.html#a1367246a67d63c5c1bc7f2c5d565cee2',1,'openvdb::v3_2_0::tools::EnrightField::operator()(const Coord &ijk, ValueType time) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#ae152d18af6cedcc024f5d388dd9ab1d5',1,'openvdb::v3_2_0::tools::VolumeToMesh::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#ad6b1ade4989f783bd95d99185c8d8f4a',1,'openvdb::v3_2_0::tools::internal::SignData::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1CountPoints.html#a9606fbf9d4c9c9af5e599c4a08298822',1,'openvdb::v3_2_0::tools::internal::CountPoints::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MapPoints.html#a9606fbf9d4c9c9af5e599c4a08298822',1,'openvdb::v3_2_0::tools::internal::MapPoints::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1CountRegions.html#a9606fbf9d4c9c9af5e599c4a08298822',1,'openvdb::v3_2_0::tools::internal::CountRegions::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPoints.html#ad41b3aed152b59aa8429e47730aea8e5',1,'openvdb::v3_2_0::tools::internal::GenPoints::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SeamWeights.html#abf0e2661d40e48d95cefe9adfec00dd9',1,'openvdb::v3_2_0::tools::internal::SeamWeights::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#ad41b3aed152b59aa8429e47730aea8e5',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPolygons.html#ad41b3aed152b59aa8429e47730aea8e5',1,'openvdb::v3_2_0::tools::internal::GenPolygons::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartOp.html#a9606fbf9d4c9c9af5e599c4a08298822',1,'openvdb::v3_2_0::tools::internal::PartOp::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartGen.html#ad6b1ade4989f783bd95d99185c8d8f4a',1,'openvdb::v3_2_0::tools::internal::PartGen::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenSeamMask.html#ad6b1ade4989f783bd95d99185c8d8f4a',1,'openvdb::v3_2_0::tools::internal::GenSeamMask::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TagSeamEdges.html#addf70f6c2ad52e155e55d8019aea7696',1,'openvdb::v3_2_0::tools::internal::TagSeamEdges::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MaskEdges.html#addf70f6c2ad52e155e55d8019aea7696',1,'openvdb::v3_2_0::tools::internal::MaskEdges::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1FlagUsedPoints.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::internal::FlagUsedPoints::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1RemapIndices.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::internal::RemapIndices::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MovePoints.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::internal::MovePoints::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTopologyMask.html#ad6b1ade4989f783bd95d99185c8d8f4a',1,'openvdb::v3_2_0::tools::internal::GenTopologyMask::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenBoundaryMask.html#ad6b1ade4989f783bd95d99185c8d8f4a',1,'openvdb::v3_2_0::tools::internal::GenBoundaryMask::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTileMask.html#ad6b1ade4989f783bd95d99185c8d8f4a',1,'openvdb::v3_2_0::tools::internal::GenTileMask::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PointListCopy.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::internal::PointListCopy::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1LeafBS.html#ad41b3aed152b59aa8429e47730aea8e5',1,'openvdb::v3_2_0::tools::internal::LeafBS::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1NodeBS.html#ad41b3aed152b59aa8429e47730aea8e5',1,'openvdb::v3_2_0::tools::internal::NodeBS::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1ClosestPointDist.html#ad41b3aed152b59aa8429e47730aea8e5',1,'openvdb::v3_2_0::tools::internal::ClosestPointDist::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UpdatePoints.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::internal::UpdatePoints::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DeepCopy.html#aa243eb741f43f85866f9c476e6f48b8a',1,'openvdb::v3_2_0::tree::InternalNode::DeepCopy::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy1.html#aa243eb741f43f85866f9c476e6f48b8a',1,'openvdb::v3_2_0::tree::InternalNode::TopologyCopy1::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy2.html#aa243eb741f43f85866f9c476e6f48b8a',1,'openvdb::v3_2_0::tree::InternalNode::TopologyCopy2::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1VoxelizeActiveTiles.html#aa243eb741f43f85866f9c476e6f48b8a',1,'openvdb::v3_2_0::tree::InternalNode::VoxelizeActiveTiles::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyUnion_1_1A.html#a65d726a271a2c304ecf948f1aa2a228a',1,'openvdb::v3_2_0::tree::InternalNode::TopologyUnion::A::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyUnion.html#aa243eb741f43f85866f9c476e6f48b8a',1,'openvdb::v3_2_0::tree::InternalNode::TopologyUnion::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyIntersection_1_1A.html#a0e1e9e3dbd63fe0f2513c4a2bc1aa13a',1,'openvdb::v3_2_0::tree::InternalNode::TopologyIntersection::A::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyIntersection.html#aa243eb741f43f85866f9c476e6f48b8a',1,'openvdb::v3_2_0::tree::InternalNode::TopologyIntersection::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyDifference_1_1A.html#a0e1e9e3dbd63fe0f2513c4a2bc1aa13a',1,'openvdb::v3_2_0::tree::InternalNode::TopologyDifference::A::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyDifference_1_1B.html#a9864eef76ed469b611a54647810eaf1e',1,'openvdb::v3_2_0::tree::InternalNode::TopologyDifference::B::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyDifference.html#aa243eb741f43f85866f9c476e6f48b8a',1,'openvdb::v3_2_0::tree::InternalNode::TopologyDifference::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#ae79d211818696dc7678e3e5ada3d6848',1,'openvdb::v3_2_0::tree::LeafManager::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#aa20054c74aed6085ab2e292fc2962a49',1,'openvdb::v3_2_0::tree::NodeList::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree_1_1DeallocateLeafNodes.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tree::Tree::DeallocateLeafNodes::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1CombineOpAdapter.html#a7e5747f5c7f79b8735eaabc511345595',1,'openvdb::v3_2_0::tree::CombineOpAdapter::operator()()'],['../structopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Fill.html#a8e3d01c07ed0cfc820050e4e43e39307',1,'openvdb::v3_2_0::util::PagedArray::Fill::operator()()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1LeafTopologyIntOp.html#aff0d41b6385657507733671f37a0237b',1,'openvdb::v3_2_0::util::LeafTopologyIntOp::operator()()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1LeafTopologyDiffOp.html#aff0d41b6385657507733671f37a0237b',1,'openvdb::v3_2_0::util::LeafTopologyDiffOp::operator()()']]], + ['operator_2a',['operator*',['../classopenvdb_1_1v3__2__0_1_1io_1_1File_1_1NameIterator.html#a19d7c668b510da6e6531446927c77e9e',1,'openvdb::v3_2_0::io::File::NameIterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1ConstValueIter.html#a563c7bf6f8b0e5d2be59a11001c16c57',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::ConstValueIter::operator*()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox_1_1Iterator.html#afc156e7ba9ab5fdfb860fafab83be758',1,'openvdb::v3_2_0::math::CoordBBox::Iterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a8ca5cae7cb4c2bdd22af6d69496b44ef',1,'openvdb::v3_2_0::math::Quat::operator*(const Quat &q) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a5ee0bfb534161e16ae8189956e453c47',1,'openvdb::v3_2_0::math::Quat::operator*(T scalar) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#ad09c1ea5be390e76e162d079e185ba4e',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::operator*()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a563c7bf6f8b0e5d2be59a11001c16c57',1,'openvdb::v3_2_0::tools::PointIndexIterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#a860eeebd5a7d24bb152fda47d4bcdfa4',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#ad09c1ea5be390e76e162d079e185ba4e',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator::operator*() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#a8c31a20ec1078b4e1e71f9fafcbc3661',1,'openvdb::v3_2_0::tools::Film::RGBA::operator*(ValueT scale) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#a2b98a2ef8e25e0c7fd1f445c657036d2',1,'openvdb::v3_2_0::tools::Film::RGBA::operator*(const RGBA &rhs) const '],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#a3270e2b3442d81232e7922f658b60d5b',1,'openvdb::v3_2_0::tree::SparseIteratorBase::operator*()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#a4df7784912276f1ca6a7f75ffc2cb541',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#ab84f5b878aa6bcc73309a5aa21451c38',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a0c2aa4bb7ebc2734389a1e396353ad3b',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::operator*()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#a0d9591749ec78328966e05b5303dfa8b',1,'openvdb::v3_2_0::tree::LeafIteratorBase::operator*()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1OnMaskIterator.html#a9e97de71e9a2b74e270c58741acc7c8f',1,'openvdb::v3_2_0::util::OnMaskIterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1OffMaskIterator.html#a9e97de71e9a2b74e270c58741acc7c8f',1,'openvdb::v3_2_0::util::OffMaskIterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1DenseMaskIterator.html#a9e97de71e9a2b74e270c58741acc7c8f',1,'openvdb::v3_2_0::util::DenseMaskIterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OnIterator.html#a9e97de71e9a2b74e270c58741acc7c8f',1,'openvdb::v3_2_0::util::RootNodeMask::OnIterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OffIterator.html#a9e97de71e9a2b74e270c58741acc7c8f',1,'openvdb::v3_2_0::util::RootNodeMask::OffIterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1DenseIterator.html#a9e97de71e9a2b74e270c58741acc7c8f',1,'openvdb::v3_2_0::util::RootNodeMask::DenseIterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#a0c2aa4bb7ebc2734389a1e396353ad3b',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#ad9ec29fddecc43414a3b2ff6680c9261',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a183889763b75627c4b28e788cc1fbb5f',1,'openvdb::v3_2_0::math::Mat3::operator*(S scalar, const Mat3< T > &m)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a2d8407c20855b9b45a081be54284fe00',1,'openvdb::v3_2_0::math::Mat3::operator*(const Mat3< T > &m, S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a8e40ccbd3c218d03cf886c78410e30a9',1,'openvdb::v3_2_0::math::Mat3::operator*(const Mat3< MT > &_m, const Vec3< T > &_v)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#ae802fb6965c388c782b388d0b65e3398',1,'openvdb::v3_2_0::math::Mat3::operator*(const Vec3< T > &_v, const Mat3< MT > &_m)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#aa9be65e76ae6c34be7cfcf0920c8ab2e',1,'openvdb::v3_2_0::math::Mat4::operator*(S scalar, const Mat4< T > &m)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a3c8dfb84ee5364be6e46ad2e957227ac',1,'openvdb::v3_2_0::math::Mat4::operator*(const Mat4< T > &m, S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#aef4da8365964b954dbf45fc89b478c3b',1,'openvdb::v3_2_0::math::Mat4::operator*(const Mat4< MT > &_m, const Vec4< T > &_v)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a40b16531473bae42fced2e2af0ed3ef8',1,'openvdb::v3_2_0::math::Mat4::operator*(const Vec4< T > &_v, const Mat4< MT > &_m)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a6bb7dbbe6eac76c5ab56d14a44e42054',1,'openvdb::v3_2_0::math::Mat4::operator*(const Mat4< MT > &_m, const Vec3< T > &_v)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a6c1c733f608528224d3921d30adafb75',1,'openvdb::v3_2_0::math::Mat4::operator*(const Vec3< T > &_v, const Mat4< MT > &_m)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#acaedaf8e88143243abe7729a82507b65',1,'openvdb::v3_2_0::math::Mat4::operator*(const Mat4< T0 > &m0, const Mat4< T1 > &m1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a43c54bf1abde3f44911edcd8f3671350',1,'openvdb::v3_2_0::math::operator*(const Mat3< T0 > &m0, const Mat3< T1 > &m1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a8b9cad896989813d8d1bfa844f0bb0c0',1,'openvdb::v3_2_0::math::operator*(S scalar, const Quat< T > &q)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aacaba1aaed35294f5fb2f0b809699cbc',1,'openvdb::v3_2_0::math::operator*(S scalar, const Vec2< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a2eea014c346322868020c787a66c6e32',1,'openvdb::v3_2_0::math::operator*(const Vec2< T > &v, S scalar)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a96614e9559d5edb22569fc606c5cee29',1,'openvdb::v3_2_0::math::operator*(const Vec2< T0 > &v0, const Vec2< T1 > &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae9cfc3f2b93db5c8b0258ec412527f78',1,'openvdb::v3_2_0::math::operator*(S scalar, const Vec3< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a0a4ad86a81441624ffdae9e2c1cd02c8',1,'openvdb::v3_2_0::math::operator*(const Vec3< T > &v, S scalar)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ac94844ded83b683bd3e7a09e9a28380a',1,'openvdb::v3_2_0::math::operator*(const Vec3< T0 > &v0, const Vec3< T1 > &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a3c2360d38dddde7b427a5d36d1d3b97b',1,'openvdb::v3_2_0::math::operator*(S scalar, const Vec4< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1b0f6fc09e61cb19d6bb6f1c2660378b',1,'openvdb::v3_2_0::math::operator*(const Vec4< T > &v, S scalar)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a901f05a8b5ea2b73fc60116c6b6687dc',1,'openvdb::v3_2_0::math::operator*(const Vec4< T0 > &v0, const Vec4< T1 > &v1)']]], + ['operator_2a_3d',['operator*=',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a27ea78526e0f3b6240710ea942208740',1,'openvdb::v3_2_0::math::pcg::Vector::operator*=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a25d5a16479fb4356c7dd3791d9d7a7d5',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::operator*=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1RowEditor.html#a73fb7547492d0c9c1e2d6b41a152d13f',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::RowEditor::operator*=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a8295899e1b57c9a37c82160699499a83',1,'openvdb::v3_2_0::math::Mat3::operator*=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#af36beb09939dbde7b69db617402e562a',1,'openvdb::v3_2_0::math::Mat3::operator*=(const Mat3< S > &m1)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#ac8aacd8fbff44f48de698b93a31b7913',1,'openvdb::v3_2_0::math::Mat4::operator*=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a9adf02885b273ef7b0ac15e9f8c8c13f',1,'openvdb::v3_2_0::math::Mat4::operator*=(const Mat4< S > &m1)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ab6cc50b94a1ef5337d6200d839454b89',1,'openvdb::v3_2_0::math::Quat::operator*=(T scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a994071f122d2134e01826c6d7cc03d46',1,'openvdb::v3_2_0::math::Quat::operator*=(const Quat &q)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a09eae3167eaf188f3dd764a990c3f7f5',1,'openvdb::v3_2_0::math::Vec2::operator*=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ae4291c3fb31bda3369a102e3df5de221',1,'openvdb::v3_2_0::math::Vec2::operator*=(const Vec2< S > &v1)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#af8b1f78792e6990c352e6b73dc3b7053',1,'openvdb::v3_2_0::math::Vec3::operator*=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a77226dd58f28508c7ea4672aa3fb1016',1,'openvdb::v3_2_0::math::Vec3::operator*=(const Vec3< S > &v1)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a1945d3a8ed7e42b41fa44ae467cc5546',1,'openvdb::v3_2_0::math::Vec4::operator*=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a8a75cae3ac9ccf4a4809451c05608242',1,'openvdb::v3_2_0::math::Vec4::operator*=(const Vec4< S > &v1)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#abc0082904f548f43f95c2b50128ec4da',1,'openvdb::v3_2_0::math::Mat3::operator*=()']]], + ['operator_2b',['operator+',['../structopenvdb_1_1v3__2__0_1_1PointIndex.html#aa0ba79d45c04189d10a5d5068e8a3c1d',1,'openvdb::v3_2_0::PointIndex::operator+()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#afd954fe5ced3d887516899c9443934a7',1,'openvdb::v3_2_0::math::Coord::operator+()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a743a9d8e0a93cc65bbefd9e715f306f8',1,'openvdb::v3_2_0::math::Quat::operator+()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#a2ceb08966a7fb4cf6dded4a767779353',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData::operator+()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#a3f68e703097b166d5f7e19488500606c',1,'openvdb::v3_2_0::tools::Film::RGBA::operator+()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#ab37c41eef1666e2d7fa2f604817acfdb',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator+()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#aac0e40288cebe4b50d685eb66035e90c',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator+()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a284c2cc8c0492ec2a2c1d5c48465abad',1,'openvdb::v3_2_0::math::Mat3::operator+()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a1beb2d5aaa98378e767f9f0cd314a9f4',1,'openvdb::v3_2_0::math::Mat4::operator+()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a73325f420b5ed5a925f5fd027f8ba6ec',1,'openvdb::v3_2_0::math::operator+(const Vec3< T > &v0, const Coord &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a37c30689accfa3867b4e679d5682dce7',1,'openvdb::v3_2_0::math::operator+(const Coord &v1, const Vec3< T > &v0)'],['../namespaceopenvdb_1_1v3__2__0.html#af373f304cae5a0ea4879c67769ddcec1',1,'openvdb::v3_2_0::operator+(const std::string &s, bool)'],['../namespaceopenvdb_1_1v3__2__0.html#a92017926cc8ffdf352132ca9d6f77169',1,'openvdb::v3_2_0::operator+(const std::string &s, int)'],['../namespaceopenvdb_1_1v3__2__0.html#adaed9173be18bf669c3ad91e7bd727b5',1,'openvdb::v3_2_0::operator+(const std::string &s, float)'],['../namespaceopenvdb_1_1v3__2__0.html#a2ba3199ed758769ee881eb0991119d71',1,'openvdb::v3_2_0::operator+(const std::string &s, double)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a0789b6f39c976ba7b6d7b4cd6a956620',1,'openvdb::v3_2_0::math::operator+(const Vec2< T0 > &v0, const Vec2< T1 > &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a94c603d7f7adae0fdc1c30cf8a47e519',1,'openvdb::v3_2_0::math::operator+(const Vec2< T > &v, S scalar)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a606df55a1993b40f2840edd8f90c19fd',1,'openvdb::v3_2_0::math::operator+(const Vec3< T0 > &v0, const Vec3< T1 > &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a5e837c962aac8ae9aca90427db8a93cd',1,'openvdb::v3_2_0::math::operator+(const Vec3< T > &v, S scalar)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab467c81fbcc8ac35a0f709dd4977134e',1,'openvdb::v3_2_0::math::operator+(const Vec4< T0 > &v0, const Vec4< T1 > &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a84ba7cf64535f308e151693f1b259895',1,'openvdb::v3_2_0::math::operator+(const Vec4< T > &v, S scalar)']]], + ['operator_2b_2b',['operator++',['../classopenvdb_1_1v3__2__0_1_1io_1_1File_1_1NameIterator.html#ab654c152dce5fb4213d8eff68303b4f4',1,'openvdb::v3_2_0::io::File::NameIterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1ConstValueIter.html#a2e438db871de1cda325e7d8085360339',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::ConstValueIter::operator++()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox_1_1Iterator.html#aef12ef33726bc591f569f822c7b5ac41',1,'openvdb::v3_2_0::math::CoordBBox::Iterator::operator++()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#a00f008b80917746917b874d00abd02a9',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::operator++()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a00f008b80917746917b874d00abd02a9',1,'openvdb::v3_2_0::tools::PointIndexIterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#ac5dc603a326175611a77c94a6413584d',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#a3e1ce44f40bb701a250e2614f5438791',1,'openvdb::v3_2_0::tree::IteratorBase::operator++()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#aef12ef33726bc591f569f822c7b5ac41',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#aef12ef33726bc591f569f822c7b5ac41',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a7475897440e38eea95f3a7208a8ba029',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::operator++()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#adef55c16eb0bcf0b1245c2dbf1416a88',1,'openvdb::v3_2_0::tree::NodeIteratorBase::operator++()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#aae76048af20d9c79c5df4def75e9c13a',1,'openvdb::v3_2_0::tree::LeafIteratorBase::operator++()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorRange.html#a838a2b1e48837a88318d9781d9cf9a66',1,'openvdb::v3_2_0::tree::IteratorRange::operator++()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1OnMaskIterator.html#aac9a3ef2576b4b2012abaa1d87f64a91',1,'openvdb::v3_2_0::util::OnMaskIterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1OffMaskIterator.html#a3c51cfd8a0807c848490bfdf5273b36b',1,'openvdb::v3_2_0::util::OffMaskIterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1DenseMaskIterator.html#ae2c3ac67a8bedc4954c11f0a18382a5c',1,'openvdb::v3_2_0::util::DenseMaskIterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OnIterator.html#af7a25b7831116ec03cba6b6fe3ee1a2b',1,'openvdb::v3_2_0::util::RootNodeMask::OnIterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OffIterator.html#a158870b80fe6765adc383ff74b95d2f6',1,'openvdb::v3_2_0::util::RootNodeMask::OffIterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1DenseIterator.html#ae6c9279638b333f2ed53819f803a4493',1,'openvdb::v3_2_0::util::RootNodeMask::DenseIterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#a858a8f58b67c9fc79d628f5ebef436b3',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#ab7eab0ba59cfdc636f6acdd4c86ed8f8',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator++(int)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#aef12ef33726bc591f569f822c7b5ac41',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#ac1702aedba13b4112b891b58dfd78eba',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator++(int)']]], + ['operator_2b_3d',['operator+=',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#af30f4c2a8d8809d508eefd8888244e51',1,'openvdb::v3_2_0::math::Coord::operator+=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a7a8842a64a40e6dbf5b7f41e8b33406e',1,'openvdb::v3_2_0::math::Mat3::operator+=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a7192ad4c0ffc0a3f632b8cf75a719f26',1,'openvdb::v3_2_0::math::Mat4::operator+=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a61a6b1d3b4fd9c5f799f7d4c1155a20c',1,'openvdb::v3_2_0::math::Quat::operator+=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a399f5332e5e50eba2b71568dfa5697b4',1,'openvdb::v3_2_0::math::Vec2::operator+=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a880e5b0a5dc13327283848c29e8ce4b9',1,'openvdb::v3_2_0::math::Vec2::operator+=(const Vec2< S > &v1)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ac6e6acd15e2e5d39969d18681dd4e925',1,'openvdb::v3_2_0::math::Vec3::operator+=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a3c74a5d5f64c54cf3f888b0fe0fa1756',1,'openvdb::v3_2_0::math::Vec3::operator+=(const Vec3< S > &v1)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#ab379b07a84109d0e895b37b2a0f0a541',1,'openvdb::v3_2_0::math::Vec4::operator+=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#aa08c454f5ecb150947bc890aa2132051',1,'openvdb::v3_2_0::math::Vec4::operator+=(const Vec4< S > &v1)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#a3147d465f1bcaf5bc95e26ac3355c11c',1,'openvdb::v3_2_0::tools::Film::RGBA::operator+=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#ae8ff1b7777cfbe30e22f534b27123af0',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator+=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a0fdff6f56668772e186dfbcc818496ce',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator+=()']]], + ['operator_2d',['operator-',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a9666dd0685a288085cae8c718dceaba4',1,'openvdb::v3_2_0::math::Coord::operator-(const Coord &rhs) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#ae60baccf9f7829ec5b1e5b4e2593fbb3',1,'openvdb::v3_2_0::math::Coord::operator-() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#ab728c0163ae1bfea054716efa2c9589b',1,'openvdb::v3_2_0::math::Mat3::operator-()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#ae5fb13158e0e81260e69dff3915b4b26',1,'openvdb::v3_2_0::math::Mat4::operator-()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a259c54ac7d96344a6642a34c5f157bf7',1,'openvdb::v3_2_0::math::Quat::operator-(const Quat &q) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#aaa87f73b2254aab1910584494a51ea81',1,'openvdb::v3_2_0::math::Quat::operator-() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a19c068782e6ef6c8bf7e4656f73a0e3c',1,'openvdb::v3_2_0::math::Vec2::operator-()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a3d2db871fdefc92a633f83ac95276ee2',1,'openvdb::v3_2_0::math::Vec3::operator-()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a45f295757d2399d81d75016902443403',1,'openvdb::v3_2_0::math::Vec4::operator-()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#aa4a308848e72fd3e59844da0154590dd',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData::operator-(const T &) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#a9d3e445be91311a23c0426c7a350fc17',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData::operator-() const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#ab83c03ced4a8c51b4855e534b32613c5',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator-(const difference_type &pos) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#a26d501a5964f0f7b4550ec436f8db2b4',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator-(const ConstIterator &other) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a51dbcc20d285e2d6927d78b668610f4e',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator-(const difference_type &pos) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#aa560a6ec40067d94d75b854ac8c9e2b9',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator-(const Iterator &other) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#af5ad76a5628a7b1effff4eea41653e1e',1,'openvdb::v3_2_0::math::Mat3::operator-()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#ab0af2cb0604fcc0bec0a63f0980ce3b6',1,'openvdb::v3_2_0::math::Mat4::operator-()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aa2fdd07184e0ba994b79a54c0f934b5a',1,'openvdb::v3_2_0::math::operator-(const Vec3< T > &v0, const Coord &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#abe5bcacb4c3969bb6e1420c80946776e',1,'openvdb::v3_2_0::math::operator-(const Coord &v1, const Vec3< T > &v0)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a47f2e9c8a24b4179f7403da033cbdf94',1,'openvdb::v3_2_0::math::operator-(const Vec2< T0 > &v0, const Vec2< T1 > &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab86a2d13f4f7f6041dcf5b0d822e2b63',1,'openvdb::v3_2_0::math::operator-(const Vec2< T > &v, S scalar)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a06bede4f23a4ccc7e2f90b628f70c427',1,'openvdb::v3_2_0::math::operator-(const Vec3< T0 > &v0, const Vec3< T1 > &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a8e25a116ed1babb11c055b5bf4d6b553',1,'openvdb::v3_2_0::math::operator-(const Vec3< T > &v, S scalar)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a0b11f5d137919683230de46be2c4c6e2',1,'openvdb::v3_2_0::math::operator-(const Vec4< T0 > &v0, const Vec4< T1 > &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a2b8a41a79f16a91f0dc44b975dae8e7f',1,'openvdb::v3_2_0::math::operator-(const Vec4< T > &v, S scalar)']]], + ['operator_2d_2d',['operator--',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#a60a4a4f63e7493cf8afb2278a9cd2ed4',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator--()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#af84e31447f5dc1dd3e746d10acffb868',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator--(int)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a34e5ed23ddc31b7d8d4bfb5bfacbaab6',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator--()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a826422223993becdf7c1e60aea56e9c0',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator--(int)']]], + ['operator_2d_3d',['operator-=',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#acb0910b9c001a4632594439423a704d5',1,'openvdb::v3_2_0::math::Coord::operator-=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a3663d2dfdc62875340f7e30bbb59e6ba',1,'openvdb::v3_2_0::math::Mat3::operator-=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#ad647c7d2b6246e17671289edf08f45f1',1,'openvdb::v3_2_0::math::Mat4::operator-=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#aa140b4a600627aba04b1d6b885284996',1,'openvdb::v3_2_0::math::Quat::operator-=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#add694ad7f19ad946272ab081a4c478ce',1,'openvdb::v3_2_0::math::Vec2::operator-=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ab5466d034823a88fac147d68afc616af',1,'openvdb::v3_2_0::math::Vec2::operator-=(const Vec2< S > &v1)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a81505c5b9e94c48f617ab7145e381d97',1,'openvdb::v3_2_0::math::Vec3::operator-=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#aa75d121f19376dcc2cdb22ccda794497',1,'openvdb::v3_2_0::math::Vec3::operator-=(const Vec3< S > &v1)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#af9651d37d9d9d20658a21d7d5a8c5e33',1,'openvdb::v3_2_0::math::Vec4::operator-=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a75e37bcfe0a6f4dc568cd36c137f70f8',1,'openvdb::v3_2_0::math::Vec4::operator-=(const Vec4< S > &v1)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ac1f6685961e34847c92688f580e04ecb',1,'openvdb::v3_2_0::util::NodeMask::operator-=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ac1f6685961e34847c92688f580e04ecb',1,'openvdb::v3_2_0::util::NodeMask< 1 >::operator-=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ac1f6685961e34847c92688f580e04ecb',1,'openvdb::v3_2_0::util::NodeMask< 2 >::operator-=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#a792a5cb53dc294863945ba72b5b74046',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator-=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a8980a96e3e2a47a0295df52e3947b47c',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator-=()']]], + ['operator_2d_3e',['operator->',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#a197bfaabb857d574f1d3c858ea8241ab',1,'openvdb::v3_2_0::tree::SparseIteratorBase::operator->()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#aa2b78c95f9367bd8fca00286d44122e7',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::operator->()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#a3d57be8c4b7459c658ea9a92fa6933f1',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::operator->()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#abc094ec2e24f4668b185fa526683ccfa',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::operator->()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#adf5829cfe2e8853fb0d23a4d4d7f3014',1,'openvdb::v3_2_0::tree::LeafIteratorBase::operator->()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#abc094ec2e24f4668b185fa526683ccfa',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator->()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a7b777b0d7945bd83f898e95192216024',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator->()']]], + ['operator_2f',['operator/',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a0e07479416e99018c281dc43c1cd6a16',1,'openvdb::v3_2_0::math::Quat::operator/()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a180b92ee97573582ffc46b94cb616b27',1,'openvdb::v3_2_0::math::operator/(S scalar, const Vec2< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a18465c34c7fa501e03f05bfc3466d218',1,'openvdb::v3_2_0::math::operator/(const Vec2< T > &v, S scalar)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a220e25e7166561ac1d8b9befc443f005',1,'openvdb::v3_2_0::math::operator/(const Vec2< T0 > &v0, const Vec2< T1 > &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aab5fd63ebdc87dc1648cf79533b52237',1,'openvdb::v3_2_0::math::operator/(S scalar, const Vec3< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a91fb728b585d4485347f0ec236a36b3a',1,'openvdb::v3_2_0::math::operator/(const Vec3< T > &v, S scalar)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9ff18578274dae7bf0cccb8d35e304ca',1,'openvdb::v3_2_0::math::operator/(const Vec3< T0 > &v0, const Vec3< T1 > &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a653a1a4b65d1d309ea0f7adb349268e3',1,'openvdb::v3_2_0::math::operator/(S scalar, const Vec4< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a60d89b63a90442b7af138f02314e412e',1,'openvdb::v3_2_0::math::operator/(const Vec4< T > &v, S scalar)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a11883f01476023b0a69fb56f1bd03479',1,'openvdb::v3_2_0::math::operator/(const Vec4< T0 > &v0, const Vec4< T1 > &v1)']]], + ['operator_2f_3d',['operator/=',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a60248c9829dd03bbc564a0ae3737b92f',1,'openvdb::v3_2_0::math::Vec2::operator/=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#aae9878e8d4adcc607ca9a4f7e8fd561f',1,'openvdb::v3_2_0::math::Vec2::operator/=(const Vec2< S > &v1)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a3529ccb28634eeaa3e9d465dace5f165',1,'openvdb::v3_2_0::math::Vec3::operator/=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a605d9d50dfd771afa2f600f86fb1c8c8',1,'openvdb::v3_2_0::math::Vec3::operator/=(const Vec3< S > &v1)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a53bfb8156f5fa45def1b1a365d6e2bb2',1,'openvdb::v3_2_0::math::Vec4::operator/=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a5d2b59f401c42db0f3380ec1d8fc8137',1,'openvdb::v3_2_0::math::Vec4::operator/=(const Vec4< S > &v1)']]], + ['operator_3c',['operator<',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a60f94d8417c5434836eb7d1c521dd9e4',1,'openvdb::v3_2_0::math::Coord::operator<()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#af9b1b292c4b6bff0b50fc927cf7d7965',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData::operator<()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband_1_1Fragment.html#ae6270b5afdf309fcd6cefa4b5477ba47',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::Fragment::operator<()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html#a65a93d73c497c81b7389ee74fbdccec3',1,'openvdb::v3_2_0::util::BaseMaskIterator::operator<()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#a43530c3f2563eb0493faa4a80fe4710a',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::operator<()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#af2576d9419b0d102db87a29e43bf245e',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator<()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#afc0acb4d4cd2dd135d49aecd33f4f2bd',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator<()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aa83ae5355b86a4d34bd9861541412561',1,'openvdb::v3_2_0::math::operator<()']]], + ['operator_3c_3c',['operator<<',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a8ca157fb9c69492d02ab9df2e2d449b6',1,'openvdb::v3_2_0::math::Coord::operator<<()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a91b8be809e8ee4564bea8bd082d3cdef',1,'openvdb::v3_2_0::math::CoordBBox::operator<<()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#a65608fdfdaa2b0cb5cfe77215a38b74e',1,'openvdb::v3_2_0::math::Mat::operator<<()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a182375dad7577cef9608ba55b9bd66ba',1,'openvdb::v3_2_0::math::Quat::operator<<()'],['../namespaceopenvdb_1_1v3__2__0_1_1io.html#add660b552aa6175549c83bddd94bd768',1,'openvdb::v3_2_0::io::operator<<(std::ostream &, const StreamMetadata &)'],['../namespaceopenvdb_1_1v3__2__0_1_1io.html#abc71a3088742b77cbfbe7134fef5ac7a',1,'openvdb::v3_2_0::io::operator<<(std::ostream &, const StreamMetadata::AuxDataMap &)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4fdf607982655a8a8f8f446cd57e8015',1,'openvdb::v3_2_0::math::operator<<()'],['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg.html#ac1c8c0e2c87a517c469155dee4c0bfb3',1,'openvdb::v3_2_0::math::pcg::operator<<()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a346823971698aac10d1541edc13e0555',1,'openvdb::v3_2_0::math::operator<<(std::ostream &os, const Coord &xyz)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1ec3b7d4f14851ff4881fd2e5ab924cf',1,'openvdb::v3_2_0::math::operator<<(std::ostream &os, const CoordBBox &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#afcf4fd29cdfb99117fc63f381f8287b2',1,'openvdb::v3_2_0::math::operator<<(std::ostream &os, const DDA< RayT, Log2Dim > &dda)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae13e3a9927dba7cbe96607f8dba9afb8',1,'openvdb::v3_2_0::math::operator<<(std::ostream &os, const Ray< RealT > &r)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a88d1ed4b2bfcd72c4316b8743474815e',1,'openvdb::v3_2_0::math::operator<<(std::ostream &, const Transform &)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a0ccf30ed7b0b93f314e08a0ccb5e9798',1,'openvdb::v3_2_0::math::operator<<(std::ostream &ostr, const Tuple< SIZE, T > &classname)'],['../namespaceopenvdb_1_1v3__2__0.html#a7ea4a9046558b7ec2cc44a7e34bc6b75',1,'openvdb::v3_2_0::operator<<(std::ostream &ostr, const Metadata &metadata)'],['../namespaceopenvdb_1_1v3__2__0.html#ae26b2ef2621eba66db830603eff1c388',1,'openvdb::v3_2_0::operator<<(std::ostream &, const MetaMap &)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aeea3d8dcd3b18c32c08449294a806588',1,'openvdb::v3_2_0::tools::operator<<()'],['../namespaceopenvdb_1_1v3__2__0_1_1tree.html#a324e47e9417f0e0fb621eb3de60197e2',1,'openvdb::v3_2_0::tree::operator<<()'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a98dc3a7ced7805e1c707fc499ad12b3c',1,'openvdb::v3_2_0::util::operator<<()']]], + ['operator_3c_3c_3d',['operator<<=',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a809c80789b4036f012a3c326b54b2def',1,'openvdb::v3_2_0::math::Coord::operator<<=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#ab88d3fa04e5dc308e8bbdcd29d6ba54e',1,'openvdb::v3_2_0::math::CoordBBox::operator<<=()']]], + ['operator_3c_3d',['operator<=',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a70163b01bf0a3f8520e2359f2f124bd1',1,'openvdb::v3_2_0::math::Coord::operator<=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#a77bc21be9f255bbc6f347c045186bb42',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator<=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#ae206b92e415299c3fc072fb0fe2905b3',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator<=()']]], + ['operator_3d',['operator=',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a94d85a1d5aa83ae1109cf1636353a0a4',1,'openvdb::v3_2_0::io::File::operator=()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a0ea823cb2879d84a7018ae14c6d30676',1,'openvdb::v3_2_0::io::StreamMetadata::operator=()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Stream.html#afc298243ba26edc13ff0e947df21263c',1,'openvdb::v3_2_0::io::Stream::operator=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#ac97b0adbe2cd710bc0043dbbe0c62b55',1,'openvdb::v3_2_0::math::pcg::Vector::operator=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#af36fd380b0362d20353e18ad2b702972',1,'openvdb::v3_2_0::math::AffineMap::operator=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#aabeb9faba93106804760ed804b570c99',1,'openvdb::v3_2_0::math::CompoundMap::operator=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a301a7cfbf13259daeaca0ff326e7829a',1,'openvdb::v3_2_0::math::Mat3::operator=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a8388e3e849221e57cb9601f56d84460b',1,'openvdb::v3_2_0::math::Mat4::operator=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ad2fc720d6721dcef84c0628ae397655c',1,'openvdb::v3_2_0::math::Quat::operator=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a6a6d9b668b48a927a47e4e251b1f9e95',1,'openvdb::v3_2_0::math::Vec2::operator=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ac25017a4491a060a0a322ba7c5ae9561',1,'openvdb::v3_2_0::math::Vec3::operator=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a226123a8e1d3926d0c29195a8a3f0e3d',1,'openvdb::v3_2_0::math::Vec4::operator=()'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a2a7cfe69c863616f5528f279206c25bd',1,'openvdb::v3_2_0::MetaMap::operator=()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a5ef5a95cd07f9b7288edf67acb4831e5',1,'openvdb::v3_2_0::tools::PointIndexIterator::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#a3b1f367367768c391af7f2957a9e1953',1,'openvdb::v3_2_0::tree::IteratorBase::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#a175d0e9a7e069bd44866193cd15c3292',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#a17850d463855f899807c7eea266f4a2c',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#a4768c1ee6b9141a3d9e7c29c5efa7e20',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#a4768c1ee6b9141a3d9e7c29c5efa7e20',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#a175d0e9a7e069bd44866193cd15c3292',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01true_00_01ValueT_00_01ChildT_01_4.html#abeec9219eb994697fbb087dadccc18f5',1,'openvdb::v3_2_0::tree::NodeUnionImpl< true, ValueT, ChildT >::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a1b775efb979e2d7445d43aaf7cb900d0',1,'openvdb::v3_2_0::tree::RootNode::operator=(const RootNode &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a0447467224f7c21ad0e3926279ab7eb9',1,'openvdb::v3_2_0::tree::RootNode::operator=(const RootNode< OtherChildType > &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#aba4cc4656656e79a82aac5c9ce747e57',1,'openvdb::v3_2_0::tree::Tree::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a681d3357ee25ccb872f03cc0f0717195',1,'openvdb::v3_2_0::tree::IterListItem::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a681d3357ee25ccb872f03cc0f0717195',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a681d3357ee25ccb872f03cc0f0717195',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a8344620e951e52f43719236fac411523',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a3f806102bf7c7a87ef79c39c04518332',1,'openvdb::v3_2_0::tree::NodeIteratorBase::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#a39eeee9f00c9c02139414ce57b7e01f9',1,'openvdb::v3_2_0::tree::LeafIteratorBase::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html#a60087b50dd40da857cba105a9fb5e312',1,'openvdb::v3_2_0::tree::ValueAccessorBase::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a6643cfe0185b1d287b48cdbcd7374875',1,'openvdb::v3_2_0::tree::ValueAccessor::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a6e572954f375468efca4549222333fd9',1,'openvdb::v3_2_0::tree::ValueAccessor0::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a4fab6677cd80d297b83aa161e3c7c791',1,'openvdb::v3_2_0::tree::ValueAccessor1::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a89efbb2eca41711f84d84f916e71b3e1',1,'openvdb::v3_2_0::tree::ValueAccessor2::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a792a00c97806e398466f6feb8c8f9058',1,'openvdb::v3_2_0::tree::ValueAccessor3::operator=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html#a9ad59d0fd8c0ed1f370885f24bcf6f21',1,'openvdb::v3_2_0::util::BaseMaskIterator::operator=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a336b756005c07d48de0a6a8d1056a2c0',1,'openvdb::v3_2_0::util::NodeMask::operator=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#acb52e8d1be111920d9821e2f095a3fba',1,'openvdb::v3_2_0::util::NodeMask< 1 >::operator=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#acb52e8d1be111920d9821e2f095a3fba',1,'openvdb::v3_2_0::util::NodeMask< 2 >::operator=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#aca1a391bb41461cafd64c1f0250bcdb5',1,'openvdb::v3_2_0::util::RootNodeMask::operator=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#a77ead81103e15adc3a03e76c81d7924d',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::operator=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#a098521b7d40674cefdc71c327bf95f61',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a175d0e9a7e069bd44866193cd15c3292',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html#acfb0fbbae0d000eac86fbb180e486400',1,'openvdb::v3_2_0::util::PagedArray::Page::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#aef2b73375c068f1a01a7ee5b4f55d8b1',1,'openvdb::v3_2_0::tree::RootNode::operator=()']]], + ['operator_3d_3d',['operator==',['../classopenvdb_1_1v3__2__0_1_1io_1_1File_1_1NameIterator.html#a9d73d20213a22e433671dec0b4ce5537',1,'openvdb::v3_2_0::io::File::NameIterator::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a3c3b29f650a424a29bb8e346df0bfa07',1,'openvdb::v3_2_0::math::BBox::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a9d3adb1e959e70488f1897270ed10a80',1,'openvdb::v3_2_0::math::Coord::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a2f21cf39354306b2b782d6c8bfd34b65',1,'openvdb::v3_2_0::math::CoordBBox::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a2c044f52721ee1690c680810cc940786',1,'openvdb::v3_2_0::math::AffineMap::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#ac04e34de1681c37a7e5ec1a0b7052074',1,'openvdb::v3_2_0::math::ScaleMap::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#ae6cec21c41829338971b74594e94b710',1,'openvdb::v3_2_0::math::UniformScaleMap::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a3acdd826c9992def160d7dbaa3e20d9e',1,'openvdb::v3_2_0::math::TranslationMap::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#ad7c3cfa8d684ee1ae09050b95d60ecd3',1,'openvdb::v3_2_0::math::ScaleTranslateMap::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#ac3d19c5d4be0dec92691dd9dfb0ea99b',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a8c4b5dd0df786a8c159650a21ff46984',1,'openvdb::v3_2_0::math::UnitaryMap::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a7af826081bcc8e3961c0e8e3f5975088',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#afd00d6ece415c224a07da9ba51c7c4db',1,'openvdb::v3_2_0::math::CompoundMap::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#aa4aaba32df427ce2d6be263fed52141e',1,'openvdb::v3_2_0::math::Quat::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#ae44784e4c6086a3bffaf7d2eaf96159f',1,'openvdb::v3_2_0::math::Transform::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#aa8b8c2ed85b3f3c3e66b885fad74c5fb',1,'openvdb::v3_2_0::math::Vec2::operator==()'],['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a69319ad7ffb1adba19650a3eea15a063',1,'openvdb::v3_2_0::Metadata::operator==()'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a23564bccd2e94e800561c6253771254e',1,'openvdb::v3_2_0::MetaMap::operator==()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#a544b9a0cc876271323f097097868f020',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData::operator==()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#a780e8b40a1c045c0d9d057f1895266e7',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::operator==()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a227d88264b09d8d9264793a152e14cf9',1,'openvdb::v3_2_0::tools::PointIndexIterator::operator==()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#abb9d3f570b74142ccf2db6c3b0de92ee',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::operator==()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#a34a3abd63f1d106c1b06917c04c88c78',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator::operator==()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#a65a9d79e34ea49135c34a491468f6dce',1,'openvdb::v3_2_0::tree::IteratorBase::operator==()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#a1ea001976a5bc8ae8dc365e2a912b59a',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::operator==()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#a413a0a3b3768ad3e8ffed553aa107b08',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::operator==()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a173d413289af1fe67a5f2f3eeb909eec',1,'openvdb::v3_2_0::tree::LeafNode::operator==()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#a413a0a3b3768ad3e8ffed553aa107b08',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::operator==()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#adb5a9a18ada9456b31c4ce9961877978',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::operator==()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#a413a0a3b3768ad3e8ffed553aa107b08',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::operator==()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#adb5a9a18ada9456b31c4ce9961877978',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::operator==()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#a1ea001976a5bc8ae8dc365e2a912b59a',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::operator==()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ab55f4c7d759598db855f46080fe66617',1,'openvdb::v3_2_0::tree::Tree::operator==()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html#a948fa276b91fc02b51465aeddfcbe735',1,'openvdb::v3_2_0::util::BaseMaskIterator::operator==()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a050a5b69679a0ecf64e5463b7dcc6708',1,'openvdb::v3_2_0::util::NodeMask::operator==()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a050a5b69679a0ecf64e5463b7dcc6708',1,'openvdb::v3_2_0::util::NodeMask< 1 >::operator==()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a050a5b69679a0ecf64e5463b7dcc6708',1,'openvdb::v3_2_0::util::NodeMask< 2 >::operator==()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#a0b1b9ef7aad543db14a5e00eb025bbe6',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::operator==()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a6d07bb21181053e79fde7b97abe40ea3',1,'openvdb::v3_2_0::util::RootNodeMask::operator==()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#ac60a65eb14220a00258e801b8450725c',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator==()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a1ea001976a5bc8ae8dc365e2a912b59a',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#ad3a9a3613f47a3c3af263fe72599450c',1,'openvdb::v3_2_0::math::Mat3::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a679a33cc9a91af7a67b3a65bc61c9774',1,'openvdb::v3_2_0::math::Mat4::operator==()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a3e2c3e85acfcb944c3b1c9ef86396b66',1,'openvdb::v3_2_0::math::operator==(const Vec3< T0 > &v0, const Vec3< T1 > &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab0186df5f2423c17e699bbb05d2eafab',1,'openvdb::v3_2_0::math::operator==(const Vec4< T0 > &v0, const Vec4< T1 > &v1)']]], + ['operator_3e',['operator>',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#ae95f05b467295c58a4f638588d31c311',1,'openvdb::v3_2_0::math::Coord::operator>()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#aedb68d5d04e10071597b2678fb5c6162',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData::operator>()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#ace06f52dd966550726c6a70a82f090da',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator>()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#ac90b39fbbfb3065da1070feb98abc0cd',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator>()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae7143fe5273ca75da02de59834e08170',1,'openvdb::v3_2_0::math::operator>()']]], + ['operator_3e_3d',['operator>=',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#afe230713547c1df474bd959025293d86',1,'openvdb::v3_2_0::math::Coord::operator>=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#ae048628685abb87fa671248a918994b6',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator>=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a0a821d98fcfa64812e1a46a5682a37fe',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator>=()']]], + ['operator_3e_3e',['operator>>',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a3b91ca23468a9251915ad74c34c20cc7',1,'openvdb::v3_2_0::math::Coord::operator>>()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a139aaa72ce406dbac0511edd46836b3e',1,'openvdb::v3_2_0::math::CoordBBox::operator>>()']]], + ['operator_3e_3e_3d',['operator>>=',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a2788df1ec897a7b049ade9f126a53829',1,'openvdb::v3_2_0::math::Coord::operator>>=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a2d3fb8357b430c0c57f04511c8c1fb2a',1,'openvdb::v3_2_0::math::CoordBBox::operator>>=()']]], + ['operator_5b_5d',['operator[]',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a23025fcff737c99690e9d44fce06b547',1,'openvdb::v3_2_0::math::pcg::Vector::operator[](SizeType i)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#acd5ae8d09724aa6d52363b8b98a0671c',1,'openvdb::v3_2_0::math::pcg::Vector::operator[](SizeType i) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a24e1dafd2faebac8412cdacc9aeae4e1',1,'openvdb::v3_2_0::math::Coord::operator[](size_t i) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#adb02eea82af0bca01894ebfe1988e57a',1,'openvdb::v3_2_0::math::Coord::operator[](size_t i)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a904037f984db327b4058a9817c21a6fc',1,'openvdb::v3_2_0::math::Mat3::operator[](int i)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#af58f1c63abcf51bc57b462ccadd28e01',1,'openvdb::v3_2_0::math::Mat3::operator[](int i) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a904037f984db327b4058a9817c21a6fc',1,'openvdb::v3_2_0::math::Mat4::operator[](int i)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#af58f1c63abcf51bc57b462ccadd28e01',1,'openvdb::v3_2_0::math::Mat4::operator[](int i) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a0534e977fc9fee424b3ef94f27a9ed61',1,'openvdb::v3_2_0::math::Quat::operator[](int i)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a8b36789e9ecc47ad57fc55d85015651d',1,'openvdb::v3_2_0::math::Quat::operator[](int i) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#a8b36789e9ecc47ad57fc55d85015651d',1,'openvdb::v3_2_0::math::Tuple::operator[](int i) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#a0534e977fc9fee424b3ef94f27a9ed61',1,'openvdb::v3_2_0::math::Tuple::operator[](int i)'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a68d753337de4f85f9fa5cde7b916c102',1,'openvdb::v3_2_0::MetaMap::operator[](const Name &)'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a768c40208c2798a39b8482e12f0489e9',1,'openvdb::v3_2_0::MetaMap::operator[](const Name &) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#a89ad8333cad4f3b317bb4dee4001e4dd',1,'openvdb::v3_2_0::tools::Morphology::LeafCache::operator[]()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#abda484fc4c22d06aa481b74151208676',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::operator[]()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#a527e545f54ed0ed38fe3d5ac8278302f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::operator[]()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#a527e545f54ed0ed38fe3d5ac8278302f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::operator[]()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#a297495e5317027b2e01d36640dc9f99b',1,'openvdb::v3_2_0::tree::NodeList::operator[]()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#ace71b58daf79e5ba3a3b54391106015a',1,'openvdb::v3_2_0::util::PagedArray::operator[](size_t i)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a639335fbac6c8dfea293b113322bc90b',1,'openvdb::v3_2_0::util::PagedArray::operator[](size_t i) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#a1265918803de1cf81a86613659734fbd',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator[]()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#aae6f35718c1444c1e2c2cff2a7974f19',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator[]()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html#a4bb36966532a762570bffc6e92dcc45f',1,'openvdb::v3_2_0::util::PagedArray::Page::operator[](const size_t i)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html#a467af5f59bb2c072c93e3c08ce9314e2',1,'openvdb::v3_2_0::util::PagedArray::Page::operator[](const size_t i) const ']]], + ['operator_5e',['operator^',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ace3eead8e9218a35454c65d9bb3227cb',1,'openvdb::v3_2_0::util::NodeMask::operator^()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ace3eead8e9218a35454c65d9bb3227cb',1,'openvdb::v3_2_0::util::NodeMask< 1 >::operator^()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ace3eead8e9218a35454c65d9bb3227cb',1,'openvdb::v3_2_0::util::NodeMask< 2 >::operator^()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a00d753912b40d387976282541bd045db',1,'openvdb::v3_2_0::util::RootNodeMask::operator^()']]], + ['operator_5e_3d',['operator^=',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#aa0a300534a1ad94a1dd1c44e45f391b5',1,'openvdb::v3_2_0::util::NodeMask::operator^=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#aa0a300534a1ad94a1dd1c44e45f391b5',1,'openvdb::v3_2_0::util::NodeMask< 1 >::operator^=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#aa0a300534a1ad94a1dd1c44e45f391b5',1,'openvdb::v3_2_0::util::NodeMask< 2 >::operator^=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a0b62c6a283c7ebb1415ce779a19ceaf3',1,'openvdb::v3_2_0::util::RootNodeMask::operator^=()']]], + ['operators_2eh',['Operators.h',['../Operators_8h.html',1,'']]], + ['operator_7c',['operator|',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a4b09b2ac66db1e89bf0d53d0434bca49',1,'openvdb::v3_2_0::math::Coord::operator|()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#ab00c193b7f7b95a8722998c41de33cbb',1,'openvdb::v3_2_0::math::CoordBBox::operator|()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a4bc033b1803e7875e1d44a7191d4ccdf',1,'openvdb::v3_2_0::util::NodeMask::operator|()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a4bc033b1803e7875e1d44a7191d4ccdf',1,'openvdb::v3_2_0::util::NodeMask< 1 >::operator|()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a4bc033b1803e7875e1d44a7191d4ccdf',1,'openvdb::v3_2_0::util::NodeMask< 2 >::operator|()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#ad292a8f3f7779c54cd1be32c58a762c2',1,'openvdb::v3_2_0::util::RootNodeMask::operator|()']]], + ['operator_7c_3d',['operator|=',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a9cd598a971ac11acba6dc31fd1e7dfe3',1,'openvdb::v3_2_0::math::Coord::operator|=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a6ffa161a30062ffad30a7624c36307ac',1,'openvdb::v3_2_0::math::CoordBBox::operator|=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a15c13d8e7de79e77e851a6cc034c1e33',1,'openvdb::v3_2_0::util::NodeMask::operator|=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a15c13d8e7de79e77e851a6cc034c1e33',1,'openvdb::v3_2_0::util::NodeMask< 1 >::operator|=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a15c13d8e7de79e77e851a6cc034c1e33',1,'openvdb::v3_2_0::util::NodeMask< 2 >::operator|=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a255973eebe29eb2b2c0604b3fcf37c30',1,'openvdb::v3_2_0::util::RootNodeMask::operator|=()']]], + ['opextrema',['opExtrema',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ab4a308e2e6c2d283bfafb3bd80c8ca43',1,'openvdb::v3_2_0::tools']]], + ['opmagnitude',['OpMagnitude',['../structopenvdb_1_1v3__2__0_1_1math_1_1OpMagnitude.html',1,'openvdb::v3_2_0::math']]], + ['opmax',['OpMax',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1OpMax.html',1,'openvdb::v3_2_0::tools::ds']]], + ['opmin',['OpMin',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1OpMin.html',1,'openvdb::v3_2_0::tools::ds']]], + ['opmult',['OpMult',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1OpMult.html',1,'openvdb::v3_2_0::tools::ds']]], + ['opover',['OpOver',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1OpOver.html',1,'openvdb::v3_2_0::tools::ds']]], + ['opstatistics',['opStatistics',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a35876c2d474f3ed28fc6a6aa4b4f5678',1,'openvdb::v3_2_0::tools']]], + ['opsub',['OpSub',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1OpSub.html',1,'openvdb::v3_2_0::tools::ds']]], + ['opt',['OpT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Normalize_1_1OpT.html',1,'openvdb::v3_2_0::tools::Normalize']]], + ['opt',['OpT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator_3_01DS__OVER_00_01ValueT_01_4.html#a7bfab844eb8f687e08c0ec57995edf32',1,'openvdb::v3_2_0::tools::ds::CompositeFunctorTranslator< DS_OVER, ValueT >::OpT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator_3_01DS__ADD_00_01ValueT_01_4.html#ab95d5fc8e34b9eeee6990dacb80da353',1,'openvdb::v3_2_0::tools::ds::CompositeFunctorTranslator< DS_ADD, ValueT >::OpT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator_3_01DS__SUB_00_01ValueT_01_4.html#a5628d3e24c197d60481434f832a619b2',1,'openvdb::v3_2_0::tools::ds::CompositeFunctorTranslator< DS_SUB, ValueT >::OpT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator_3_01DS__MIN_00_01ValueT_01_4.html#a2361f3c4872d39273fc0668c66a2257d',1,'openvdb::v3_2_0::tools::ds::CompositeFunctorTranslator< DS_MIN, ValueT >::OpT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator_3_01DS__MAX_00_01ValueT_01_4.html#a03fd71ab63fc72220f638554618a4b51',1,'openvdb::v3_2_0::tools::ds::CompositeFunctorTranslator< DS_MAX, ValueT >::OpT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator_3_01DS__MULT_00_01ValueT_01_4.html#ad122bfc5875a0602920af0d28b8be029',1,'openvdb::v3_2_0::tools::ds::CompositeFunctorTranslator< DS_MULT, ValueT >::OpT()']]], + ['opt',['OpT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude_1_1OpT.html',1,'openvdb::v3_2_0::tools::Magnitude']]], + ['order',['order',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler.html#a4440d8900b99dab3c079c8b53775952f',1,'openvdb::v3_2_0::tools::Sampler::order()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointSampler.html#a4440d8900b99dab3c079c8b53775952f',1,'openvdb::v3_2_0::tools::PointSampler::order()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html#a4440d8900b99dab3c079c8b53775952f',1,'openvdb::v3_2_0::tools::BoxSampler::order()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadraticSampler.html#a4440d8900b99dab3c079c8b53775952f',1,'openvdb::v3_2_0::tools::QuadraticSampler::order()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredPointSampler.html#a4440d8900b99dab3c079c8b53775952f',1,'openvdb::v3_2_0::tools::StaggeredPointSampler::order()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredBoxSampler.html#a4440d8900b99dab3c079c8b53775952f',1,'openvdb::v3_2_0::tools::StaggeredBoxSampler::order()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredQuadraticSampler.html#a4440d8900b99dab3c079c8b53775952f',1,'openvdb::v3_2_0::tools::StaggeredQuadraticSampler::order()']]], + ['ordersegmentsop',['OrderSegmentsOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1OrderSegmentsOp.html#a56be7df1c1b16226efebf92df9146163',1,'openvdb::v3_2_0::tools::point_partitioner_internal::OrderSegmentsOp']]], + ['ordersegmentsop',['OrderSegmentsOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1OrderSegmentsOp.html',1,'openvdb::v3_2_0::tools::point_partitioner_internal']]], + ['origin',['origin',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1NodeMaskSegment.html#a8cf3c1fbda7d90f2e9c564d8ebad662a',1,'openvdb::v3_2_0::tools::level_set_util_internal::NodeMaskSegment::origin()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#a5c83dab7335e6e6ae3f08c24870a35ca',1,'openvdb::v3_2_0::tools::Morphology::LeafCache::origin()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a15521fcd64a8d8846a2d7bed78a9e2e6',1,'openvdb::v3_2_0::math::Vec4::origin()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a605928767da2cb90e6ad6b5021f49592',1,'openvdb::v3_2_0::tools::Dense::origin()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#a578da933fb822c6ed41100510d04f561',1,'openvdb::v3_2_0::tools::PointPartitioner::origin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a605928767da2cb90e6ad6b5021f49592',1,'openvdb::v3_2_0::tree::InternalNode::origin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a605928767da2cb90e6ad6b5021f49592',1,'openvdb::v3_2_0::tree::LeafNode::origin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a605928767da2cb90e6ad6b5021f49592',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::origin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a605928767da2cb90e6ad6b5021f49592',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::origin()']]], + ['orthographiccamera',['OrthographicCamera',['../classopenvdb_1_1v3__2__0_1_1tools_1_1OrthographicCamera.html#ac62a5cc4afa2c181a067e158054110eb',1,'openvdb::v3_2_0::tools::OrthographicCamera']]], + ['orthographiccamera',['OrthographicCamera',['../classopenvdb_1_1v3__2__0_1_1tools_1_1OrthographicCamera.html',1,'openvdb::v3_2_0::tools']]], + ['orthonormalize',['orthonormalize',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae85e544f961fd9e5701b699bde8fa9d3',1,'openvdb::v3_2_0::math::orthonormalize(Vec2< T > &v1, Vec2< T > &v2)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1af7472500d9d842f11740c28eaf6334',1,'openvdb::v3_2_0::math::orthonormalize(Vec3< T > &v1, Vec3< T > &v2, Vec3< T > &v3)']]], + ['out',['out',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1LinearOp.html#a81115d81febd7d8516d8b54f13ccdefc',1,'openvdb::v3_2_0::math::pcg::internal::LinearOp']]], + ['outerproduct',['outerProduct',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a24caa832f7cddb123cebc1249f4a0cc1',1,'openvdb::v3_2_0::math']]], + ['outgridtype',['OutGridType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Cpt.html#acd35ce15294339dd3fc52984762e954d',1,'openvdb::v3_2_0::tools::Cpt::OutGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Curl.html#a9a0f994472bae11c23894828bad7e189',1,'openvdb::v3_2_0::tools::Curl::OutGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Divergence.html#a94a036e8b78849f2ed656f3a15ee0b2b',1,'openvdb::v3_2_0::tools::Divergence::OutGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Gradient.html#acd35ce15294339dd3fc52984762e954d',1,'openvdb::v3_2_0::tools::Gradient::OutGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian.html#a9a0f994472bae11c23894828bad7e189',1,'openvdb::v3_2_0::tools::Laplacian::OutGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature.html#a9a0f994472bae11c23894828bad7e189',1,'openvdb::v3_2_0::tools::MeanCurvature::OutGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude.html#a94a036e8b78849f2ed656f3a15ee0b2b',1,'openvdb::v3_2_0::tools::Magnitude::OutGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Normalize.html#a9a0f994472bae11c23894828bad7e189',1,'openvdb::v3_2_0::tools::Normalize::OutGridType()']]], + ['outleaft',['OutLeafT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html#a3dbe0bcc241cbbfe38cd8ec65e0cfc2d',1,'openvdb::v3_2_0::tools::gridop::GridOperator::OutLeafT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyFromVecOp.html#a3dbe0bcc241cbbfe38cd8ec65e0cfc2d',1,'openvdb::v3_2_0::tools::poisson::internal::CopyFromVecOp::OutLeafT()']]], + ['outtreet',['OutTreeT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html#a27f776c4a676e749a189953b09a9df87',1,'openvdb::v3_2_0::tools::gridop::GridOperator::OutTreeT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyFromVecOp.html#ac8e23a8dcd2f88f5c3beeec23f1da01a',1,'openvdb::v3_2_0::tools::poisson::internal::CopyFromVecOp::OutTreeT()']]], + ['outvaluet',['OutValueT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpTransformer.html#afe142d4fbcc44d9f06217da4d80dd054',1,'openvdb::v3_2_0::tools::valxform::SharedOpTransformer::OutValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpTransformer.html#afe142d4fbcc44d9f06217da4d80dd054',1,'openvdb::v3_2_0::tools::valxform::CopyableOpTransformer::OutValueT()']]], + ['over',['over',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#ac81a1c000eb43d6df3b4ddfb8f287c77',1,'openvdb::v3_2_0::tools::Film::RGBA']]], + ['openvdb_20overview',['OpenVDB Overview',['../overview.html',1,'index']]], + ['particle_5fatlas_5finternal',['particle_atlas_internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal.html',1,'openvdb::v3_2_0::tools']]], + ['pcg',['pcg',['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg.html',1,'openvdb::v3_2_0::math']]], + ['point_5findex_5fgrid_5finternal',['point_index_grid_internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal.html',1,'openvdb::v3_2_0::tools']]], + ['point_5fpartitioner_5finternal',['point_partitioner_internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal.html',1,'openvdb::v3_2_0::tools']]], + ['poisson',['poisson',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html',1,'openvdb::v3_2_0::tools']]], + ['scheme',['Scheme',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1Scheme.html',1,'openvdb::v3_2_0::tools']]], + ['stats_5finternal',['stats_internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal.html',1,'openvdb::v3_2_0::tools']]], + ['tools',['tools',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html',1,'openvdb::v3_2_0']]], + ['tree',['tree',['../namespaceopenvdb_1_1v3__2__0_1_1tree.html',1,'openvdb::v3_2_0']]], + ['ttls_5finternal',['ttls_internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1ttls__internal.html',1,'openvdb::v3_2_0::tools']]], + ['util',['util',['../namespaceopenvdb_1_1v3__2__0_1_1util.html',1,'openvdb::v3_2_0']]], + ['v3_5f2_5f0',['v3_2_0',['../namespaceopenvdb_1_1v3__2__0.html',1,'openvdb']]], + ['valxform',['valxform',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1valxform.html',1,'openvdb::v3_2_0::tools']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_11.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_11.html new file mode 100644 index 00000000..0c414ce9 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_11.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_11.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_11.js new file mode 100644 index 00000000..47d653c8 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_11.js @@ -0,0 +1,176 @@ +var searchData= +[ + ['porting_20to_20openvdb_200_2e98_2e0',['Porting to OpenVDB 0.98.0',['../api_0_98_0.html',1,'changes']]], + ['pack',['pack',['../classopenvdb_1_1v3__2__0_1_1math_1_1QuantizedUnitVec.html#ad941c3e631b49b5726346754818f444a',1,'openvdb::v3_2_0::math::QuantizedUnitVec']]], + ['packpoint',['packPoint',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#ada09be2d2b80c4dfa43f71ba65dbb35c',1,'openvdb::v3_2_0::tools::internal']]], + ['padmat4',['padMat4',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a41d263c41993e8204f0c62662fbb6c10',1,'openvdb::v3_2_0::math']]], + ['page',['Page',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html',1,'openvdb::v3_2_0::util::PagedArray']]], + ['page',['Page',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html#ad46824bcf955eca748ab30370d74662f',1,'openvdb::v3_2_0::util::PagedArray::Page::Page()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html#ab495bfa40de68d32054260ce1898f4a5',1,'openvdb::v3_2_0::util::PagedArray::Page::Page(const Page &other)']]], + ['pagecount',['pageCount',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#afa45f1c72bbf184403757d41a180933d',1,'openvdb::v3_2_0::util::PagedArray']]], + ['pagedarray',['PagedArray',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html',1,'openvdb::v3_2_0::util']]], + ['pagedarray',['PagedArray',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a53d94f3afe55677c30f923898e0c85e3',1,'openvdb::v3_2_0::util::PagedArray']]], + ['pagedarray_2eh',['PagedArray.h',['../PagedArray_8h.html',1,'']]], + ['pagedarraytype',['PagedArrayType',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ValueBuffer.html#a559ccdc2513d129e335aba31aad8094e',1,'openvdb::v3_2_0::util::PagedArray::ValueBuffer']]], + ['pagesize',['pageSize',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#afa3a6d6e461b89bd214b04bb6ed883a6',1,'openvdb::v3_2_0::util::PagedArray']]], + ['parent',['parent',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#a028d46713c75897f22290e78fd4bb097',1,'openvdb::v3_2_0::tree::IteratorBase::parent()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ValueBuffer.html#a6cb3c26c0f735364e7c31953f9509779',1,'openvdb::v3_2_0::util::PagedArray::ValueBuffer::parent()']]], + ['partgen',['PartGen',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartGen.html',1,'openvdb::v3_2_0::tools::internal']]], + ['partgen',['PartGen',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartGen.html#a54cd529b5d19ddba8a4ac133162d85d1',1,'openvdb::v3_2_0::tools::internal::PartGen::PartGen(const LeafManagerT &leafs, size_t partitions, size_t activePart)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartGen.html#ae7abeabaf57d5b1143b666b190c14087',1,'openvdb::v3_2_0::tools::internal::PartGen::PartGen(PartGen &, tbb::split)']]], + ['partialcreate',['PartialCreate',['../classopenvdb_1_1v3__2__0_1_1PartialCreate.html',1,'openvdb::v3_2_0']]], + ['particlearray',['ParticleArray',['../interfaceParticleArray.html',1,'ParticleArray'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1ComputeExtremas.html#a0cf87abd365629ee564cab8a941f3890',1,'openvdb::v3_2_0::tools::particle_atlas_internal::ComputeExtremas::particleArray()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#a1aba85bb14440b49ddba69c4fa3b7c99',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray::particleArray() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#ac8203033b236ed43756038aca7d3b58c',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray::ParticleArray()']]], + ['particleatlas',['ParticleAtlas',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html',1,'openvdb::v3_2_0::tools']]], + ['particleatlas',['ParticleAtlas',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#a824e864e8d1f37ec1d425aae56d2a426',1,'openvdb::v3_2_0::tools::ParticleAtlas']]], + ['particleatlas_2eh',['ParticleAtlas.h',['../ParticleAtlas_8h.html',1,'']]], + ['particleindexatlas',['ParticleIndexAtlas',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aad26628d37f31050774f7517b55e31de',1,'openvdb::v3_2_0::tools']]], + ['particlestolevelset',['ParticlesToLevelSet',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html',1,'openvdb::v3_2_0::tools']]], + ['particlestolevelset',['ParticlesToLevelSet',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#ae726cfa78d37eb28295c1ce78c29e75b',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['particlestolevelset_2eh',['ParticlesToLevelSet.h',['../ParticlesToLevelSet_8h.html',1,'']]], + ['partition',['partition',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#ab533746a172398b14d0ea46edc67131f',1,'openvdb::v3_2_0::tools::VolumeToMesh::partition()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal.html#afc0d0c6f5908b2b57899e9ab764924f3',1,'openvdb::v3_2_0::tools::point_partitioner_internal::partition()']]], + ['partitioner',['Partitioner',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1PopulateLeafNodesOp.html#a5adda353541f797ab3e6f3e47c926999',1,'openvdb::v3_2_0::tools::point_index_grid_internal::PopulateLeafNodesOp']]], + ['partop',['PartOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartOp.html',1,'openvdb::v3_2_0::tools::internal']]], + ['partop',['PartOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartOp.html#a4a28185630b6f8294d1a805a175382e1',1,'openvdb::v3_2_0::tools::internal::PartOp']]], + ['pending',['PENDING',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba1869818fd53ff519eb8e429301bdff73',1,'openvdb::v3_2_0::io::Queue']]], + ['perspectivecamera',['PerspectiveCamera',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PerspectiveCamera.html',1,'openvdb::v3_2_0::tools']]], + ['perspectivecamera',['PerspectiveCamera',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PerspectiveCamera.html#a0e217dd4e8c18e046caed7fbee8b6bb6',1,'openvdb::v3_2_0::tools::PerspectiveCamera']]], + ['pixel',['pixel',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Film.html#a0c9b5f2b03ee43f2f9abdbce9f54b51e',1,'openvdb::v3_2_0::tools::Film::pixel(size_t w, size_t h) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Film.html#a5d9bc86ea99fdf1d8735de19ef424589',1,'openvdb::v3_2_0::tools::Film::pixel(size_t w, size_t h)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#a782e112415654e8e74d4faf06791032e',1,'openvdb::v3_2_0::tools::BaseCamera::pixel()']]], + ['pixels',['pixels',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Film.html#a688604aa803a696a002aa2256c915507',1,'openvdb::v3_2_0::tools::Film']]], + ['platform_2eh',['Platform.h',['../Platform_8h.html',1,'']]], + ['platformconfig_2eh',['PlatformConfig.h',['../PlatformConfig_8h.html',1,'']]], + ['pointaccessor',['PointAccessor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PointAccessor.html#a1f626dd36946df7f9c331f4205038abe',1,'openvdb::v3_2_0::tools::internal::PointAccessor']]], + ['pointaccessor',['PointAccessor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PointAccessor.html',1,'openvdb::v3_2_0::tools::internal']]], + ['pointadvect',['PointAdvect',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#a08fa08c7b462c711299c3eb78410a97f',1,'openvdb::v3_2_0::tools::PointAdvect::PointAdvect(const GridT &velGrid, InterrupterType *interrupter=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#af2014a5e562b98340ecf73991f6d0465',1,'openvdb::v3_2_0::tools::PointAdvect::PointAdvect(const PointAdvect &other)']]], + ['pointadvect',['PointAdvect',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html',1,'openvdb::v3_2_0::tools']]], + ['pointadvect_2eh',['PointAdvect.h',['../PointAdvect_8h.html',1,'']]], + ['pointarray',['PointArray',['../interfacePointArray.html',1,'PointArray'],['../interfacePointArray.html',1,'PointArray']]], + ['pointcount',['pointCount',['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadAndTriangleDataAdapter.html#a6187b928560add9deef56d5bf52206ba',1,'openvdb::v3_2_0::tools::QuadAndTriangleDataAdapter']]], + ['pointdataindex32',['PointDataIndex32',['../namespaceopenvdb_1_1v3__2__0.html#acb2dc492be2267cade6252554c5f48c4',1,'openvdb::v3_2_0']]], + ['pointdataindex64',['PointDataIndex64',['../namespaceopenvdb_1_1v3__2__0.html#a711d34e3130dc4e0dbd302f3c5579b7a',1,'openvdb::v3_2_0']]], + ['pointflags',['pointFlags',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#a3c99b75616a43477192d9dca14cd66fe',1,'openvdb::v3_2_0::tools::VolumeToMesh::pointFlags()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#adf931c7fffeebbc4d4d7f61a09c528bd',1,'openvdb::v3_2_0::tools::VolumeToMesh::pointFlags() const ']]], + ['pointindex',['PointIndex',['../structopenvdb_1_1v3__2__0_1_1PointIndex.html#a374fcf2ffb75483c7f0519a6441eaf23',1,'openvdb::v3_2_0::PointIndex']]], + ['pointindex',['PointIndex',['../structopenvdb_1_1v3__2__0_1_1PointIndex.html',1,'openvdb::v3_2_0']]], + ['pointindex32',['PointIndex32',['../namespaceopenvdb_1_1v3__2__0.html#a3db7d512d0ea530a58be65edc2cf2cbe',1,'openvdb::v3_2_0']]], + ['pointindex64',['PointIndex64',['../namespaceopenvdb_1_1v3__2__0.html#a6dd1a276b51e133a2d40a9f82a0abfe8',1,'openvdb::v3_2_0']]], + ['pointindexfilter',['PointIndexFilter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexFilter.html#a31e21f972b6328d0afe68293989ced43',1,'openvdb::v3_2_0::tools::PointIndexFilter::PointIndexFilter(const PointArray &points, const TreeType &tree, const math::Transform &xform)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexFilter.html#a4e80ac3da79ef7d89e6ade56ce7b6006',1,'openvdb::v3_2_0::tools::PointIndexFilter::PointIndexFilter(const PointIndexFilter &rhs)']]], + ['pointindexfilter',['PointIndexFilter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexFilter.html',1,'openvdb::v3_2_0::tools']]], + ['pointindexgrid',['pointIndexGrid',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#ab9efc7602c90b866f6f9cd429b084cfe',1,'openvdb::v3_2_0::tools::ParticleAtlas::pointIndexGrid(size_t n)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#a853892982d81c9eb6ab8b885ef8520e1',1,'openvdb::v3_2_0::tools::ParticleAtlas::pointIndexGrid(size_t n) const '],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a0d27cdf9655b62779d998856c77a1057',1,'openvdb::v3_2_0::tools::PointIndexGrid()']]], + ['pointindexgrid_2eh',['PointIndexGrid.h',['../PointIndexGrid_8h.html',1,'']]], + ['pointindexgridptr',['PointIndexGridPtr',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#a5001686ca559153137c3ce73f4b8630b',1,'openvdb::v3_2_0::tools::ParticleAtlas']]], + ['pointindexiterator',['PointIndexIterator',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html',1,'openvdb::v3_2_0::tools']]], + ['pointindexiterator',['PointIndexIterator',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a4e4afffbd814c870c852d2c35ec179ef',1,'openvdb::v3_2_0::tools::PointIndexIterator::PointIndexIterator()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a09130812bbbb7522393fb92f3388176a',1,'openvdb::v3_2_0::tools::PointIndexIterator::PointIndexIterator(const PointIndexIterator &rhs)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a35fa98f25d7bf1335ce920702e668714',1,'openvdb::v3_2_0::tools::PointIndexIterator::PointIndexIterator(const Coord &ijk, ConstAccessor &acc)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a59a38eaa08f11199d58d0b752acf288c',1,'openvdb::v3_2_0::tools::PointIndexIterator::PointIndexIterator(const CoordBBox &bbox, ConstAccessor &acc)']]], + ['pointindexleafnode',['PointIndexLeafNode',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html',1,'openvdb::v3_2_0::tools']]], + ['pointindexleafnode',['PointIndexLeafNode',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a3a3bf45757796b18e4a6b1dd33c41cac',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::PointIndexLeafNode()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a588802761d0d4120affc1744265cecd5',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::PointIndexLeafNode()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a0eb83a5db60623901bddc5cba5ac6a53',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::PointIndexLeafNode(const Coord &coords, const T &value=zeroVal< T >(), bool active=false)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a7b67f630151879400d660c13b27ed005',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::PointIndexLeafNode(PartialCreate, const Coord &coords, const T &value=zeroVal< T >(), bool active=false)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a43a3139912c984f08db8b2da458445fb',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::PointIndexLeafNode(const PointIndexLeafNode &rhs)']]], + ['pointindexsearch',['pointIndexSearch',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal.html#a37e6da3b3519fe210f327f4f46df6671',1,'openvdb::v3_2_0::tools::point_index_grid_internal']]], + ['pointindexsearchvoxels',['pointIndexSearchVoxels',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal.html#a855db80d38f4d21c84c0da733057fc43',1,'openvdb::v3_2_0::tools::point_index_grid_internal']]], + ['pointindextree',['PointIndexTree',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac6e92995301c99651f6ceba87ca894cd',1,'openvdb::v3_2_0::tools']]], + ['pointlist',['pointList',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#a4a884bcc7d41dea13808dfe8b335b029',1,'openvdb::v3_2_0::tools::VolumeToMesh::pointList()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a87a2501f5cad48bd50d422ffc6e7ea7a',1,'openvdb::v3_2_0::tools::PointList()']]], + ['pointlistcopy',['PointListCopy',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PointListCopy.html',1,'openvdb::v3_2_0::tools::internal']]], + ['pointlistcopy',['PointListCopy',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PointListCopy.html#a43cdb164968f7fe44ccd44b1c21a8e9c',1,'openvdb::v3_2_0::tools::internal::PointListCopy']]], + ['pointlistsize',['pointListSize',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#a66a0aa5d79111e4f11bebd3eaa286ae9',1,'openvdb::v3_2_0::tools::VolumeToMesh']]], + ['pointlisttransform',['PointListTransform',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PointListTransform.html#a067bfb6bdad10e80290a9ec1a345fab3',1,'openvdb::v3_2_0::tools::internal::PointListTransform']]], + ['pointlisttransform',['PointListTransform',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PointListTransform.html',1,'openvdb::v3_2_0::tools::internal']]], + ['pointlisttype',['PointListType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#a09cfcdbf2b5270867256281a7e966e46',1,'openvdb::v3_2_0::tools::PointAdvect::PointListType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#a09cfcdbf2b5270867256281a7e966e46',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect::PointListType()']]], + ['pointmaskgrid',['PointMaskGrid',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid.html',1,'openvdb::v3_2_0::tools']]], + ['pointmaskgrid',['PointMaskGrid',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid.html#ace7d5df0acb0591b23b3202377531565',1,'openvdb::v3_2_0::tools::PointMaskGrid::PointMaskGrid()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a3649899e0b20732ce887ccd09ec8d2fa',1,'openvdb::v3_2_0::tools::pointMaskGrid()']]], + ['pointmaskgrid_2eh',['PointMaskGrid.h',['../PointMaskGrid_8h.html',1,'']]], + ['pointpartitioner',['PointPartitioner',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html',1,'openvdb::v3_2_0::tools']]], + ['pointpartitioner',['PointPartitioner',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#aa26a1faf57c765343af4af93454bbc68',1,'openvdb::v3_2_0::tools::PointPartitioner']]], + ['pointpartitioner_2eh',['PointPartitioner.h',['../PointPartitioner_8h.html',1,'']]], + ['pointsampler',['PointSampler',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointSampler.html',1,'openvdb::v3_2_0::tools']]], + ['pointscatter_2eh',['PointScatter.h',['../PointScatter_8h.html',1,'']]], + ['poissonsolver_2eh',['PoissonSolver.h',['../PoissonSolver_8h.html',1,'']]], + ['polardecomposedmap',['PolarDecomposedMap',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7c666ca29a217070668b001227d01b08',1,'openvdb::v3_2_0::math']]], + ['polardecomposition',['polarDecomposition',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a34e588510016f4264e031d2b488ae0c1',1,'openvdb::v3_2_0::math']]], + ['polyflag_5fexterior',['POLYFLAG_EXTERIOR',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a85d881cb3816f77e92c1c8f721b54fc4aa911a2c909b228a84da11c9e7ec8d6f4',1,'openvdb::v3_2_0::tools']]], + ['polyflag_5ffracture_5fseam',['POLYFLAG_FRACTURE_SEAM',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a85d881cb3816f77e92c1c8f721b54fc4a6162751648b85f251927667c2b51ca67',1,'openvdb::v3_2_0::tools']]], + ['polyflag_5fsubdivided',['POLYFLAG_SUBDIVIDED',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a85d881cb3816f77e92c1c8f721b54fc4acbee21124fa14157f6c0c992c4728c7b',1,'openvdb::v3_2_0::tools']]], + ['polygoncount',['polygonCount',['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadAndTriangleDataAdapter.html#a6683cc1c6d9c84da78f63d0c84d81905',1,'openvdb::v3_2_0::tools::QuadAndTriangleDataAdapter']]], + ['polygonpool',['PolygonPool',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#ad139ee6421d6a459d3c6cc329fa8369c',1,'openvdb::v3_2_0::tools::PolygonPool::PolygonPool()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#a56b4ced4fb1457e22c8948e6a7e980ca',1,'openvdb::v3_2_0::tools::PolygonPool::PolygonPool(const size_t numQuads, const size_t numTriangles)']]], + ['polygonpool',['PolygonPool',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html',1,'openvdb::v3_2_0::tools']]], + ['polygonpoollist',['polygonPoolList',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#a47eaa59d46e277e0894282c29fd2e6f7',1,'openvdb::v3_2_0::tools::VolumeToMesh::polygonPoolList()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#a0e30e7904f1c1a19966f3f21293de9f6',1,'openvdb::v3_2_0::tools::VolumeToMesh::polygonPoolList() const '],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ae5ff19b45ed66a869844887351e1d10a',1,'openvdb::v3_2_0::tools::PolygonPoolList()']]], + ['polygonpoollistsize',['polygonPoolListSize',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#a6aecefda5d4b8e88c2ad911043a13a5c',1,'openvdb::v3_2_0::tools::VolumeToMesh']]], + ['pooltype',['PoolType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1MaskOp.html#ac498150ed381e14326499f9426cd846e',1,'openvdb::v3_2_0::tools::MultiResGrid::MaskOp']]], + ['pop_5fback',['pop_back',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#ab48f65e37130b674bc0f6220cbb59491',1,'openvdb::v3_2_0::util::PagedArray']]], + ['populateindextree',['populateIndexTree',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#a28bc96576c35b652d14262997693ef21',1,'openvdb::v3_2_0::tools::poisson']]], + ['populateleafnodesop',['PopulateLeafNodesOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1PopulateLeafNodesOp.html#a6a2ff4d707969e25e365d8209f879cb6',1,'openvdb::v3_2_0::tools::point_index_grid_internal::PopulateLeafNodesOp']]], + ['populateleafnodesop',['PopulateLeafNodesOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1PopulateLeafNodesOp.html',1,'openvdb::v3_2_0::tools::point_index_grid_internal']]], + ['populatetree',['PopulateTree',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1PopulateTree.html#a3ba76eb2a9ee89f1f9078f0e36c65e5d',1,'openvdb::v3_2_0::tools::level_set_util_internal::PopulateTree::PopulateTree(TreeType &tree, LeafNodeType **leafnodes, const size_t *nodexIndexMap, ValueType background)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1PopulateTree.html#a82daa4cf479cc03a01ebb86552e43df8',1,'openvdb::v3_2_0::tools::level_set_util_internal::PopulateTree::PopulateTree(PopulateTree &rhs, tbb::split)']]], + ['populatetree',['PopulateTree',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1PopulateTree.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['pos',['pos',['../classopenvdb_1_1v3__2__0_1_1math_1_1SevenPointStencil.html#a8a1412a115d1cf6b91b1e48da65bb44f',1,'openvdb::v3_2_0::math::SevenPointStencil::pos()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BoxStencil.html#a8a1412a115d1cf6b91b1e48da65bb44f',1,'openvdb::v3_2_0::math::BoxStencil::pos()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SecondOrderDenseStencil.html#a8a1412a115d1cf6b91b1e48da65bb44f',1,'openvdb::v3_2_0::math::SecondOrderDenseStencil::pos()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ThirteenPointStencil.html#a8a1412a115d1cf6b91b1e48da65bb44f',1,'openvdb::v3_2_0::math::ThirteenPointStencil::pos()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1FourthOrderDenseStencil.html#a8a1412a115d1cf6b91b1e48da65bb44f',1,'openvdb::v3_2_0::math::FourthOrderDenseStencil::pos()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NineteenPointStencil.html#a8a1412a115d1cf6b91b1e48da65bb44f',1,'openvdb::v3_2_0::math::NineteenPointStencil::pos()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SixthOrderDenseStencil.html#a8a1412a115d1cf6b91b1e48da65bb44f',1,'openvdb::v3_2_0::math::SixthOrderDenseStencil::pos()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#aa7079339b0d8f4039d67a7e8a25c190e',1,'openvdb::v3_2_0::tree::IteratorBase::pos()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#af80a47b72287661cccd127d6ea9b5c36',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::pos()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#af80a47b72287661cccd127d6ea9b5c36',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::pos()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#ac56586316283b607b1846ba5f264ee3e',1,'openvdb::v3_2_0::tree::IterListItem::pos()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#ac56586316283b607b1846ba5f264ee3e',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::pos()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#ac56586316283b607b1846ba5f264ee3e',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::pos()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html#a40e01968e3f2015064127f0227052f58',1,'openvdb::v3_2_0::util::BaseMaskIterator::pos()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#a40e01968e3f2015064127f0227052f58',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::pos()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#af80a47b72287661cccd127d6ea9b5c36',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::pos()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#af80a47b72287661cccd127d6ea9b5c36',1,'openvdb::v3_2_0::util::PagedArray::Iterator::pos()']]], + ['positionshader',['PositionShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PositionShader.html#afb3ce29d1fe4604e1f2c775c9b6725fe',1,'openvdb::v3_2_0::tools::PositionShader::PositionShader()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PositionShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#a5920d9c6e5f9c8d83f48cb58244df760',1,'openvdb::v3_2_0::tools::PositionShader< Film::RGBA, SamplerType >::PositionShader()']]], + ['positionshader',['PositionShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PositionShader.html',1,'openvdb::v3_2_0::tools']]], + ['positionshader_3c_20film_3a_3argba_2c_20samplertype_20_3e',['PositionShader< Film::RGBA, SamplerType >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PositionShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['postmult',['postMult',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a548d9f1c7b9af3790c9b8658222f33a5',1,'openvdb::v3_2_0::math::Transform::postMult(const Mat4d &)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a20ae8d3b76a69e5c9f08e8507ccf7508',1,'openvdb::v3_2_0::math::Transform::postMult(const Mat3d &)']]], + ['postrotate',['postRotate',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#aed096136416779ab650333931b2f9858',1,'openvdb::v3_2_0::math::MapBase::postRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#aae45404fb6a65190ce789f7671f7460c',1,'openvdb::v3_2_0::math::AffineMap::postRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#ab86ba48fb5953c630c9203d7900a41b7',1,'openvdb::v3_2_0::math::ScaleMap::postRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#ab86ba48fb5953c630c9203d7900a41b7',1,'openvdb::v3_2_0::math::TranslationMap::postRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#ab86ba48fb5953c630c9203d7900a41b7',1,'openvdb::v3_2_0::math::ScaleTranslateMap::postRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#ab86ba48fb5953c630c9203d7900a41b7',1,'openvdb::v3_2_0::math::UnitaryMap::postRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#aae45404fb6a65190ce789f7671f7460c',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::postRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a33aea91c54ba93aecc1a648e464f89a8',1,'openvdb::v3_2_0::math::Mat4::postRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a38a350340789d94656e71eee9916076c',1,'openvdb::v3_2_0::math::Transform::postRotate()']]], + ['postscale',['postScale',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#aef66dc19dc5723d057d4367d74356455',1,'openvdb::v3_2_0::math::MapBase::postScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a0c8efa8ae6bb141efc8cab673324e92c',1,'openvdb::v3_2_0::math::AffineMap::postScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a1bbd96799c4c8d0ff62eb8cc25e86395',1,'openvdb::v3_2_0::math::ScaleMap::postScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a1bbd96799c4c8d0ff62eb8cc25e86395',1,'openvdb::v3_2_0::math::TranslationMap::postScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a1bbd96799c4c8d0ff62eb8cc25e86395',1,'openvdb::v3_2_0::math::ScaleTranslateMap::postScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a1bbd96799c4c8d0ff62eb8cc25e86395',1,'openvdb::v3_2_0::math::UnitaryMap::postScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a0c8efa8ae6bb141efc8cab673324e92c',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::postScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#ac144e1db0c68fd87748e27fe4d96f80a',1,'openvdb::v3_2_0::math::Mat4::postScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#ad69f937f25ac5be7c9a71a3e0deddb2d',1,'openvdb::v3_2_0::math::Transform::postScale(const Vec3d &)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a82659cde4fe069a70880dfcb139e24db',1,'openvdb::v3_2_0::math::Transform::postScale(double)']]], + ['postshear',['postShear',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#aede26dff492edb1a38267b60ece00bc8',1,'openvdb::v3_2_0::math::MapBase::postShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a53a07c4faa1621f3b670818f5f046b5e',1,'openvdb::v3_2_0::math::AffineMap::postShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a53a07c4faa1621f3b670818f5f046b5e',1,'openvdb::v3_2_0::math::ScaleMap::postShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a53a07c4faa1621f3b670818f5f046b5e',1,'openvdb::v3_2_0::math::TranslationMap::postShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a53a07c4faa1621f3b670818f5f046b5e',1,'openvdb::v3_2_0::math::ScaleTranslateMap::postShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a53a07c4faa1621f3b670818f5f046b5e',1,'openvdb::v3_2_0::math::UnitaryMap::postShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a53a07c4faa1621f3b670818f5f046b5e',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::postShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a63c1c6744beeceedaa2b3bafe94aaf48',1,'openvdb::v3_2_0::math::Mat4::postShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#af73ca4f71e4871c9677e17d37b3c69ea',1,'openvdb::v3_2_0::math::Transform::postShear()']]], + ['posttranslate',['postTranslate',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#ac106d7886d3a2139a952331ed2d76250',1,'openvdb::v3_2_0::math::MapBase::postTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a0722d5393c41367cef98374f3e8c0f17',1,'openvdb::v3_2_0::math::AffineMap::postTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#ac92bf622b4d941cd239479748e5166c3',1,'openvdb::v3_2_0::math::ScaleMap::postTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#ac92bf622b4d941cd239479748e5166c3',1,'openvdb::v3_2_0::math::UniformScaleMap::postTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a0722d5393c41367cef98374f3e8c0f17',1,'openvdb::v3_2_0::math::TranslationMap::postTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a0722d5393c41367cef98374f3e8c0f17',1,'openvdb::v3_2_0::math::ScaleTranslateMap::postTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#a0722d5393c41367cef98374f3e8c0f17',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::postTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a0722d5393c41367cef98374f3e8c0f17',1,'openvdb::v3_2_0::math::UnitaryMap::postTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a0722d5393c41367cef98374f3e8c0f17',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::postTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a051d1c234447df316d9e611c13b526f6',1,'openvdb::v3_2_0::math::Mat4::postTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#aa37a11b327b78181359f5e35227156c0',1,'openvdb::v3_2_0::math::Transform::postTranslate()']]], + ['postype',['PosType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1ComputeExtremas.html#a329ed64dd1bd32258a09f921ee49dfef',1,'openvdb::v3_2_0::tools::particle_atlas_internal::ComputeExtremas::PosType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#a9f758e0f828c6d4a42d1d0e8da044bd6',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray::PosType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RadialRangeFilter.html#a7e6876dbec6ee12be049fd8e6356d907',1,'openvdb::v3_2_0::tools::particle_atlas_internal::RadialRangeFilter::PosType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1BBoxFilter.html#a7e6876dbec6ee12be049fd8e6356d907',1,'openvdb::v3_2_0::tools::particle_atlas_internal::BBoxFilter::PosType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexFilter.html#a30254b50da11af50261a73951ec71e93',1,'openvdb::v3_2_0::tools::PointIndexFilter::PosType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1BBoxFilter.html#a30254b50da11af50261a73951ec71e93',1,'openvdb::v3_2_0::tools::point_index_grid_internal::BBoxFilter::PosType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1RadialRangeFilter.html#a30254b50da11af50261a73951ec71e93',1,'openvdb::v3_2_0::tools::point_index_grid_internal::RadialRangeFilter::PosType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#a30254b50da11af50261a73951ec71e93',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp::PosType()']]], + ['pow',['Pow',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9d3a91c9312258022d3e34a212e2a130',1,'openvdb::v3_2_0::math::Pow(Type x, int n)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aadf1dd1bf05b3017841664ede48c343a',1,'openvdb::v3_2_0::math::Pow(float b, float e)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a46eb7772fda09f75afcbae730a29208d',1,'openvdb::v3_2_0::math::Pow(double b, double e)']]], + ['pow2',['Pow2',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4736afb360be55356565a64271b5ce3c',1,'openvdb::v3_2_0::math']]], + ['pow3',['Pow3',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af8b85f71555f3afc0a280f4b925433f1',1,'openvdb::v3_2_0::math']]], + ['pow4',['Pow4',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7cc76fba52ca4f8b0b64367b5d13d246',1,'openvdb::v3_2_0::math']]], + ['powlerp',['powLerp',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ac764dd6f0550faabdafc99e4de8d6e90',1,'openvdb::v3_2_0::math']]], + ['powsolve',['powSolve',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a423a0c217b954107035844a0248caffd',1,'openvdb::v3_2_0::math']]], + ['pragma',['PRAGMA',['../Platform_8h.html#a0878c1f32c35d22b03416a8e53a1d78a',1,'PRAGMA(): Platform.h'],['../Math_8h.html#a0878c1f32c35d22b03416a8e53a1d78a',1,'PRAGMA(): Math.h']]], + ['preconditioner',['Preconditioner',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Preconditioner.html#a275167db1b005dd48d695928098f46b7',1,'openvdb::v3_2_0::math::pcg::Preconditioner']]], + ['preconditioner',['Preconditioner',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Preconditioner.html',1,'openvdb::v3_2_0::math::pcg']]], + ['preconditioner_3c_20matrixtype_3a_3avaluetype_20_3e',['Preconditioner< MatrixType::ValueType >',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Preconditioner.html',1,'openvdb::v3_2_0::math::pcg']]], + ['premult',['preMult',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#adfb2cf25ab2e2d86da604c83fac6ff13',1,'openvdb::v3_2_0::math::Transform::preMult(const Mat4d &)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#afc3bae4fb226a832c0399a68e1d5a0f5',1,'openvdb::v3_2_0::math::Transform::preMult(const Mat3d &)']]], + ['prerotate',['preRotate',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#afe3c54df679a73cfa441d30942f2b4a4',1,'openvdb::v3_2_0::math::MapBase::preRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#ab3a4f47b042c11efd22aec7e41ec2383',1,'openvdb::v3_2_0::math::AffineMap::preRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a6cc8f42b8d2e0f79281762f7f3f48645',1,'openvdb::v3_2_0::math::ScaleMap::preRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a6cc8f42b8d2e0f79281762f7f3f48645',1,'openvdb::v3_2_0::math::TranslationMap::preRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a6cc8f42b8d2e0f79281762f7f3f48645',1,'openvdb::v3_2_0::math::ScaleTranslateMap::preRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a6cc8f42b8d2e0f79281762f7f3f48645',1,'openvdb::v3_2_0::math::UnitaryMap::preRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#ab3a4f47b042c11efd22aec7e41ec2383',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::preRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a553dbb93ea3eb9ccf0e075123bb48b90',1,'openvdb::v3_2_0::math::Mat4::preRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a827df214068afcf258e91d06dc9d52a8',1,'openvdb::v3_2_0::math::Transform::preRotate()']]], + ['prescale',['preScale',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#aa353a0418553cbbab46d50a751fec522',1,'openvdb::v3_2_0::math::MapBase::preScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a41ade2084e0355463c7eca46c78666d6',1,'openvdb::v3_2_0::math::AffineMap::preScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a86f8266f45d17c36039896bc5b0772f9',1,'openvdb::v3_2_0::math::ScaleMap::preScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a86f8266f45d17c36039896bc5b0772f9',1,'openvdb::v3_2_0::math::TranslationMap::preScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a86f8266f45d17c36039896bc5b0772f9',1,'openvdb::v3_2_0::math::ScaleTranslateMap::preScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a86f8266f45d17c36039896bc5b0772f9',1,'openvdb::v3_2_0::math::UnitaryMap::preScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a41ade2084e0355463c7eca46c78666d6',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::preScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a1442bceaea3367cd5b2d2ff89d0d1b4b',1,'openvdb::v3_2_0::math::Mat4::preScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a52c3265c5b7754792cc180b7f05ad379',1,'openvdb::v3_2_0::math::Transform::preScale(const Vec3d &)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#ae01329231434be4d1f32e4771b6582a4',1,'openvdb::v3_2_0::math::Transform::preScale(double)']]], + ['preserve_5ftiles',['PRESERVE_TILES',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac7a17ca003c7f18f411cab4e8b4f6e74ab963e977b12771992aceaf779527c26f',1,'openvdb::v3_2_0::tools']]], + ['preshear',['preShear',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a51695fff90d4242b4379a3317f46e3fa',1,'openvdb::v3_2_0::math::MapBase::preShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#aff99cd3a472d1ce6aa79a4fee4c2953c',1,'openvdb::v3_2_0::math::AffineMap::preShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#aff99cd3a472d1ce6aa79a4fee4c2953c',1,'openvdb::v3_2_0::math::ScaleMap::preShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#aff99cd3a472d1ce6aa79a4fee4c2953c',1,'openvdb::v3_2_0::math::TranslationMap::preShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#aff99cd3a472d1ce6aa79a4fee4c2953c',1,'openvdb::v3_2_0::math::ScaleTranslateMap::preShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#aff99cd3a472d1ce6aa79a4fee4c2953c',1,'openvdb::v3_2_0::math::UnitaryMap::preShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#aff99cd3a472d1ce6aa79a4fee4c2953c',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::preShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a788febd9a66a36a1c19f607079e61291',1,'openvdb::v3_2_0::math::Mat4::preShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#ae2352091736b5dc540b23ee612307422',1,'openvdb::v3_2_0::math::Transform::preShear()']]], + ['pretransform',['pretransform',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#aaf30abe93cba053480ccaa110aa13c3b',1,'openvdb::v3_2_0::math::Mat3::pretransform()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a30b6f926de87ee5c9fa638c51535707d',1,'openvdb::v3_2_0::math::Mat4::pretransform(const Vec4< T0 > &v) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#aaf30abe93cba053480ccaa110aa13c3b',1,'openvdb::v3_2_0::math::Mat4::pretransform(const Vec3< T0 > &v) const ']]], + ['pretransformh',['pretransformH',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a955f5393e942df350011b7e4fdb37ce4',1,'openvdb::v3_2_0::math::Mat4']]], + ['pretranslate',['preTranslate',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#aec333f513fcc5b569ec697b3f2c79d86',1,'openvdb::v3_2_0::math::MapBase::preTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a366e490514e0a76c4307eec7c4784bae',1,'openvdb::v3_2_0::math::AffineMap::preTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#ace58bd308ece873d3327a40bd30a090a',1,'openvdb::v3_2_0::math::ScaleMap::preTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#ace58bd308ece873d3327a40bd30a090a',1,'openvdb::v3_2_0::math::UniformScaleMap::preTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a366e490514e0a76c4307eec7c4784bae',1,'openvdb::v3_2_0::math::TranslationMap::preTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a366e490514e0a76c4307eec7c4784bae',1,'openvdb::v3_2_0::math::ScaleTranslateMap::preTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#a366e490514e0a76c4307eec7c4784bae',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::preTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a366e490514e0a76c4307eec7c4784bae',1,'openvdb::v3_2_0::math::UnitaryMap::preTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a366e490514e0a76c4307eec7c4784bae',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::preTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a2ea9bf4884840c97e8055d7dedc127b0',1,'openvdb::v3_2_0::math::Mat4::preTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a156d4b4a7608b24ec006a77932474bb1',1,'openvdb::v3_2_0::math::Transform::preTranslate()']]], + ['previtert',['PrevIterT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#addf975e03522433851c52a71cd22c0a1',1,'openvdb::v3_2_0::tree::IterListItem::PrevIterT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#addf975e03522433851c52a71cd22c0a1',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::PrevIterT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#addf975e03522433851c52a71cd22c0a1',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::PrevIterT()']]], + ['primcpy',['PrimCpy',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PrimCpy.html#a8a7a0cd5dbc5073fce67059be2c34773',1,'openvdb::v3_2_0::tools::internal::PrimCpy']]], + ['primcpy',['PrimCpy',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PrimCpy.html',1,'openvdb::v3_2_0::tools::internal']]], + ['primidacc',['primIdAcc',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#a6f0db7de900e18607a497752bb01321f',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData']]], + ['primidtree',['primIdTree',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#aa177442f5cd670e3066c433ac437e1f2',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData']]], + ['print',['print',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a90d0a29cd7eeaaa69057b57dbba56e08',1,'openvdb::v3_2_0::GridBase::print()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a64b3c93051a7b475b0ed59c10c901248',1,'openvdb::v3_2_0::Grid::print()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#a3d83bd59cda5c6a2e4d9cbaa484ef6e0',1,'openvdb::v3_2_0::math::DDA::print()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MinMax.html#a4c6b24818abce963a6c8823a9ae0d1dc',1,'openvdb::v3_2_0::math::MinMax::print()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#a4c6b24818abce963a6c8823a9ae0d1dc',1,'openvdb::v3_2_0::math::Extrema::print()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#a4c6b24818abce963a6c8823a9ae0d1dc',1,'openvdb::v3_2_0::math::Stats::print()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html#ae17eb77c1ea1c47a0c0c6a6fa82a6058',1,'openvdb::v3_2_0::math::Histogram::print()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#ad6b0bbfc212faafdbaecb6631f579718',1,'openvdb::v3_2_0::math::Transform::print()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a5d2a16e5a5dc7bd9b77421ae9bd646a0',1,'openvdb::v3_2_0::tools::Dense::print()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a64b3c93051a7b475b0ed59c10c901248',1,'openvdb::v3_2_0::tools::MultiResGrid::print()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1UniformPointScatter.html#a70fb4e9c5c323f3e57454cdf70c7b159',1,'openvdb::v3_2_0::tools::UniformPointScatter::print()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseUniformPointScatter.html#a70fb4e9c5c323f3e57454cdf70c7b159',1,'openvdb::v3_2_0::tools::DenseUniformPointScatter::print()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1NonUniformPointScatter.html#a70fb4e9c5c323f3e57454cdf70c7b159',1,'openvdb::v3_2_0::tools::NonUniformPointScatter::print()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a5474dcdd01eba8c989b9faf9e0e88f91',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::print()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#a5474dcdd01eba8c989b9faf9e0e88f91',1,'openvdb::v3_2_0::tools::VolumeRender::print()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a179b817778ec6b6608839c31de7c9da2',1,'openvdb::v3_2_0::tree::TreeBase::print()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a179b817778ec6b6608839c31de7c9da2',1,'openvdb::v3_2_0::tree::Tree::print()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a3d83bd59cda5c6a2e4d9cbaa484ef6e0',1,'openvdb::v3_2_0::util::PagedArray::print()']]], + ['printall',['printAll',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a163b6941a1d3877788ea4d11d8a3d991',1,'openvdb::v3_2_0::util::NodeMask::printAll()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a4f28028c364847215d634c0580d9451f',1,'openvdb::v3_2_0::util::NodeMask< 1 >::printAll()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a4f28028c364847215d634c0580d9451f',1,'openvdb::v3_2_0::util::NodeMask< 2 >::printAll()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a163b6941a1d3877788ea4d11d8a3d991',1,'openvdb::v3_2_0::util::RootNodeMask::printAll()']]], + ['printbits',['printBits',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#adbb2b267300ff6d49a26d3adcc571694',1,'openvdb::v3_2_0::util::NodeMask::printBits()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#aceaad207dfef320af7748398666b9721',1,'openvdb::v3_2_0::util::NodeMask< 1 >::printBits()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#aceaad207dfef320af7748398666b9721',1,'openvdb::v3_2_0::util::NodeMask< 2 >::printBits()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#adbb2b267300ff6d49a26d3adcc571694',1,'openvdb::v3_2_0::util::RootNodeMask::printBits()']]], + ['printbytes',['printBytes',['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a1b7fb487c9eddb26b58152c6acb19709',1,'openvdb::v3_2_0::util']]], + ['printinfo',['printInfo',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a4dc1f182fc93d3fd640b8d00c7f6738b',1,'openvdb::v3_2_0::util::NodeMask::printInfo()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a4dc1f182fc93d3fd640b8d00c7f6738b',1,'openvdb::v3_2_0::util::NodeMask< 1 >::printInfo()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a4dc1f182fc93d3fd640b8d00c7f6738b',1,'openvdb::v3_2_0::util::NodeMask< 2 >::printInfo()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a4dc1f182fc93d3fd640b8d00c7f6738b',1,'openvdb::v3_2_0::util::RootNodeMask::printInfo()']]], + ['printnumber',['printNumber',['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a1d637aa58ffb3ce95ea51108fb15b2b2',1,'openvdb::v3_2_0::util']]], + ['probechild',['probeChild',['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#ad714fb7774cad75ef742d4fa97b603fd',1,'openvdb::v3_2_0::tree::DenseIteratorBase::probeChild(NonConstValueType &value) const '],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#ab5ce147c7a8d7b56be7bedeb41c5bd64',1,'openvdb::v3_2_0::tree::DenseIteratorBase::probeChild(SetItemT *&child, NonConstValueType &value) const ']]], + ['probeconstleaf',['probeConstLeaf',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a488340833bdc0183cd16b071d917728d',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::probeConstLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ab0e736a8c396807bd2643176d6e7beee',1,'openvdb::v3_2_0::tree::InternalNode::probeConstLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#afbd1b7c386409e38d52b54a751b8401d',1,'openvdb::v3_2_0::tree::LeafNode::probeConstLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#afbd1b7c386409e38d52b54a751b8401d',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::probeConstLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#afbd1b7c386409e38d52b54a751b8401d',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::probeConstLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ab0e736a8c396807bd2643176d6e7beee',1,'openvdb::v3_2_0::tree::RootNode::probeConstLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a5730e3a8bc07b016c9c4f95f62651e32',1,'openvdb::v3_2_0::tree::Tree::probeConstLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a4a86e7d65de16a43a7b1eef5c5da1033',1,'openvdb::v3_2_0::tree::ValueAccessor::probeConstLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#ad3822b561fe227ab527e6bc9e7fd2761',1,'openvdb::v3_2_0::tree::CacheItem::probeConstLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#ad3822b561fe227ab527e6bc9e7fd2761',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::probeConstLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a4a86e7d65de16a43a7b1eef5c5da1033',1,'openvdb::v3_2_0::tree::ValueAccessor0::probeConstLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a4a86e7d65de16a43a7b1eef5c5da1033',1,'openvdb::v3_2_0::tree::ValueAccessor1::probeConstLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a152df98a1e265346919d5fa90283139d',1,'openvdb::v3_2_0::tree::ValueAccessor2::probeConstLeaf(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a4a86e7d65de16a43a7b1eef5c5da1033',1,'openvdb::v3_2_0::tree::ValueAccessor2::probeConstLeaf(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a4a86e7d65de16a43a7b1eef5c5da1033',1,'openvdb::v3_2_0::tree::ValueAccessor3::probeConstLeaf()']]], + ['probeconstleafandcache',['probeConstLeafAndCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ad9c7cd26fd2944ab72dda78a979ba0ff',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::probeConstLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a1df4d3142810d501c9a24a329e838536',1,'openvdb::v3_2_0::tree::InternalNode::probeConstLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a4fd7ba7b9a5dd59af220c5a145c70bc1',1,'openvdb::v3_2_0::tree::LeafNode::probeConstLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a4fd7ba7b9a5dd59af220c5a145c70bc1',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::probeConstLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a4fd7ba7b9a5dd59af220c5a145c70bc1',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::probeConstLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a1df4d3142810d501c9a24a329e838536',1,'openvdb::v3_2_0::tree::RootNode::probeConstLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a6df78afa72de28b8ffe278e4b40554f9',1,'openvdb::v3_2_0::tree::InternalNode::probeConstLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a6df78afa72de28b8ffe278e4b40554f9',1,'openvdb::v3_2_0::tree::RootNode::probeConstLeafAndCache()']]], + ['probeconstnode',['probeConstNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a5d69d156fff1dfe3f65db583558c8d52',1,'openvdb::v3_2_0::tree::InternalNode::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a9a2464f7acaee2ea2cb6caf2d2a24914',1,'openvdb::v3_2_0::tree::LeafNode::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a9a2464f7acaee2ea2cb6caf2d2a24914',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a9a2464f7acaee2ea2cb6caf2d2a24914',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ae193824374c84407959836af2b954d24',1,'openvdb::v3_2_0::tree::RootNode::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a6a15e82fdd32905312c0260f66f9129a',1,'openvdb::v3_2_0::tree::Tree::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#ad1db5a3cd9f727c41548cecb5a6c633a',1,'openvdb::v3_2_0::tree::ValueAccessor::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a5823dba000645b7eee8cec1908e2d49f',1,'openvdb::v3_2_0::tree::CacheItem::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a8f0f94778aeb2d83da174ea39f2e760c',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#ad1db5a3cd9f727c41548cecb5a6c633a',1,'openvdb::v3_2_0::tree::ValueAccessor0::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#ad1db5a3cd9f727c41548cecb5a6c633a',1,'openvdb::v3_2_0::tree::ValueAccessor1::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#ad1db5a3cd9f727c41548cecb5a6c633a',1,'openvdb::v3_2_0::tree::ValueAccessor2::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#ad1db5a3cd9f727c41548cecb5a6c633a',1,'openvdb::v3_2_0::tree::ValueAccessor3::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ad1db5a3cd9f727c41548cecb5a6c633a',1,'openvdb::v3_2_0::tree::InternalNode::probeConstNode()']]], + ['probeconstnodeandcache',['probeConstNodeAndCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a008c0f4a1887952d6f1abe2a1f50ebda',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::probeConstNodeAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#add8131519ed759d408a0a4d57563efab',1,'openvdb::v3_2_0::tree::InternalNode::probeConstNodeAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a008c0f4a1887952d6f1abe2a1f50ebda',1,'openvdb::v3_2_0::tree::LeafNode::probeConstNodeAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a008c0f4a1887952d6f1abe2a1f50ebda',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::probeConstNodeAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a008c0f4a1887952d6f1abe2a1f50ebda',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::probeConstNodeAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#aa5343004e67df99c4720888555351b29',1,'openvdb::v3_2_0::tree::RootNode::probeConstNodeAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a8f6136a9adc7cb5bd213a75f9a37ca03',1,'openvdb::v3_2_0::tree::InternalNode::probeConstNodeAndCache()']]], + ['probeleaf',['probeLeaf',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a978340cfc174f809203a7eb56ae43357',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::probeLeaf(const Coord &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a8f35954f2e082c780a1f3b8a9dc336d7',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::probeLeaf(const Coord &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a416387666c1bf211debea718d27e5e2f',1,'openvdb::v3_2_0::tree::InternalNode::probeLeaf(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a0565d3c3e0bd185197352b63e4d7a1e7',1,'openvdb::v3_2_0::tree::InternalNode::probeLeaf(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a1bf288e37bf3e1e2811374d4b29b9d17',1,'openvdb::v3_2_0::tree::LeafNode::probeLeaf(const Coord &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a3d9829bdb6a976e32a4d38dab5af9421',1,'openvdb::v3_2_0::tree::LeafNode::probeLeaf(const Coord &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a1bf288e37bf3e1e2811374d4b29b9d17',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::probeLeaf(const Coord &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a3d9829bdb6a976e32a4d38dab5af9421',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::probeLeaf(const Coord &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a1bf288e37bf3e1e2811374d4b29b9d17',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::probeLeaf(const Coord &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a3d9829bdb6a976e32a4d38dab5af9421',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::probeLeaf(const Coord &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a416387666c1bf211debea718d27e5e2f',1,'openvdb::v3_2_0::tree::RootNode::probeLeaf(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a0565d3c3e0bd185197352b63e4d7a1e7',1,'openvdb::v3_2_0::tree::RootNode::probeLeaf(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a48bab17c2781af76eacbc64ba399e1d7',1,'openvdb::v3_2_0::tree::Tree::probeLeaf(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a0565d3c3e0bd185197352b63e4d7a1e7',1,'openvdb::v3_2_0::tree::Tree::probeLeaf(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a0b1a8557f5239a416f76dbc2e99dbd82',1,'openvdb::v3_2_0::tree::ValueAccessor::probeLeaf(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a1073bed5f60f76508014a877796d8082',1,'openvdb::v3_2_0::tree::ValueAccessor::probeLeaf(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a4a4d3e3612ea8bda4adc059ac9b87e5c',1,'openvdb::v3_2_0::tree::CacheItem::probeLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a4a4d3e3612ea8bda4adc059ac9b87e5c',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::probeLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a0b1a8557f5239a416f76dbc2e99dbd82',1,'openvdb::v3_2_0::tree::ValueAccessor0::probeLeaf(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a1073bed5f60f76508014a877796d8082',1,'openvdb::v3_2_0::tree::ValueAccessor0::probeLeaf(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a0b1a8557f5239a416f76dbc2e99dbd82',1,'openvdb::v3_2_0::tree::ValueAccessor1::probeLeaf(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a1073bed5f60f76508014a877796d8082',1,'openvdb::v3_2_0::tree::ValueAccessor1::probeLeaf(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a0b1a8557f5239a416f76dbc2e99dbd82',1,'openvdb::v3_2_0::tree::ValueAccessor2::probeLeaf(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a1073bed5f60f76508014a877796d8082',1,'openvdb::v3_2_0::tree::ValueAccessor2::probeLeaf(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a0b1a8557f5239a416f76dbc2e99dbd82',1,'openvdb::v3_2_0::tree::ValueAccessor3::probeLeaf(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a1073bed5f60f76508014a877796d8082',1,'openvdb::v3_2_0::tree::ValueAccessor3::probeLeaf(const Coord &xyz) const ']]], + ['probeleafandcache',['probeLeafAndCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#afe22f5356467d106fda49b77d4f4f87d',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::probeLeafAndCache(const Coord &, AccessorT &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a32e507889d4cca30bba783d8b8b2bc4a',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::probeLeafAndCache(const Coord &, AccessorT &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a69eaa58a07109bba3487f514bc5d03bf',1,'openvdb::v3_2_0::tree::InternalNode::probeLeafAndCache(const Coord &xyz, AccessorT &acc)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ac52a4f527e2f7c37f9cacb2e12676628',1,'openvdb::v3_2_0::tree::InternalNode::probeLeafAndCache(const Coord &xyz, AccessorT &acc) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a99121ff7318d421a7ffc24f5c9c7092e',1,'openvdb::v3_2_0::tree::LeafNode::probeLeafAndCache(const Coord &, AccessorT &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a0b60fbdbc81d9dd21200a542d1f09acb',1,'openvdb::v3_2_0::tree::LeafNode::probeLeafAndCache(const Coord &, AccessorT &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a99121ff7318d421a7ffc24f5c9c7092e',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::probeLeafAndCache(const Coord &, AccessorT &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a0b60fbdbc81d9dd21200a542d1f09acb',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::probeLeafAndCache(const Coord &, AccessorT &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a99121ff7318d421a7ffc24f5c9c7092e',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::probeLeafAndCache(const Coord &, AccessorT &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a0b60fbdbc81d9dd21200a542d1f09acb',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::probeLeafAndCache(const Coord &, AccessorT &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a69eaa58a07109bba3487f514bc5d03bf',1,'openvdb::v3_2_0::tree::RootNode::probeLeafAndCache(const Coord &xyz, AccessorT &acc)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ac52a4f527e2f7c37f9cacb2e12676628',1,'openvdb::v3_2_0::tree::RootNode::probeLeafAndCache(const Coord &xyz, AccessorT &acc) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a3337cf5ee7f6e4190d74a28320d226e3',1,'openvdb::v3_2_0::tree::InternalNode::probeLeafAndCache(const Coord &xyz, AccessorT &acc)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a19109c78ded455aa6750cf943d70a96e',1,'openvdb::v3_2_0::tree::InternalNode::probeLeafAndCache(const Coord &xyz, AccessorT &acc) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a3337cf5ee7f6e4190d74a28320d226e3',1,'openvdb::v3_2_0::tree::RootNode::probeLeafAndCache(const Coord &xyz, AccessorT &acc)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a19109c78ded455aa6750cf943d70a96e',1,'openvdb::v3_2_0::tree::RootNode::probeLeafAndCache(const Coord &xyz, AccessorT &acc) const ']]], + ['probenode',['probeNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#af75b5bd4a7cdb2d9472f3327e1c28277',1,'openvdb::v3_2_0::tree::InternalNode::probeNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#af8bae6cfc399078500a25075c8392340',1,'openvdb::v3_2_0::tree::LeafNode::probeNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#af8bae6cfc399078500a25075c8392340',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::probeNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#af8bae6cfc399078500a25075c8392340',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::probeNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#af4aba8013df108be4d7eb3f58dd72cc6',1,'openvdb::v3_2_0::tree::RootNode::probeNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a1096806c2a3867c6a168981093c5a0fe',1,'openvdb::v3_2_0::tree::Tree::probeNode(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a8aeba79ef14e7bd1c9ec1a00f959e3b6',1,'openvdb::v3_2_0::tree::Tree::probeNode(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#ab1f0b235067a11fd0a6a03f48573723c',1,'openvdb::v3_2_0::tree::ValueAccessor::probeNode(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#aecd6f4986aeee9221c8eec8b637fbb9b',1,'openvdb::v3_2_0::tree::ValueAccessor::probeNode(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#ab1f0b235067a11fd0a6a03f48573723c',1,'openvdb::v3_2_0::tree::CacheItem::probeNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#af75b5bd4a7cdb2d9472f3327e1c28277',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::probeNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#ab1f0b235067a11fd0a6a03f48573723c',1,'openvdb::v3_2_0::tree::ValueAccessor0::probeNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#ab1f0b235067a11fd0a6a03f48573723c',1,'openvdb::v3_2_0::tree::ValueAccessor1::probeNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#ab1f0b235067a11fd0a6a03f48573723c',1,'openvdb::v3_2_0::tree::ValueAccessor2::probeNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#ab1f0b235067a11fd0a6a03f48573723c',1,'openvdb::v3_2_0::tree::ValueAccessor3::probeNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ab1f0b235067a11fd0a6a03f48573723c',1,'openvdb::v3_2_0::tree::InternalNode::probeNode()']]], + ['probenodeandcache',['probeNodeAndCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a25259439cdd265f95cea4b55ded1a1c6',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::probeNodeAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ab553194d6f24e37d0486b99f12d5b970',1,'openvdb::v3_2_0::tree::InternalNode::probeNodeAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a25259439cdd265f95cea4b55ded1a1c6',1,'openvdb::v3_2_0::tree::LeafNode::probeNodeAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a25259439cdd265f95cea4b55ded1a1c6',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::probeNodeAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a25259439cdd265f95cea4b55ded1a1c6',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::probeNodeAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a4603c14d21fce223c55c03783fb7a8b2',1,'openvdb::v3_2_0::tree::RootNode::probeNodeAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a93451bf57e5716c6f7d5d01c28c611d3',1,'openvdb::v3_2_0::tree::InternalNode::probeNodeAndCache()']]], + ['probevalue',['probeValue',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a0535ed999c1364a5bc5f31e668e5ef7c',1,'openvdb::v3_2_0::tree::InternalNode::probeValue()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a15daa1515991b5da293bc31b3d1af167',1,'openvdb::v3_2_0::tree::DenseIteratorBase::probeValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ad45d685c273174dfb07180a2f0d38a8f',1,'openvdb::v3_2_0::tree::LeafNode::probeValue(const Coord &xyz, ValueType &val) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aa133b9ced16d8e132ed376e9fe712157',1,'openvdb::v3_2_0::tree::LeafNode::probeValue(Index offset, ValueType &val) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a384ddbb5e1f9bdad64f4f3f430fce809',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::probeValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a384ddbb5e1f9bdad64f4f3f430fce809',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::probeValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a0535ed999c1364a5bc5f31e668e5ef7c',1,'openvdb::v3_2_0::tree::RootNode::probeValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a0535ed999c1364a5bc5f31e668e5ef7c',1,'openvdb::v3_2_0::tree::Tree::probeValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a0535ed999c1364a5bc5f31e668e5ef7c',1,'openvdb::v3_2_0::tree::ValueAccessor::probeValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a34e96f272ab481eb549ee29fff242881',1,'openvdb::v3_2_0::tree::CacheItem::probeValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a34e96f272ab481eb549ee29fff242881',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::probeValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a0535ed999c1364a5bc5f31e668e5ef7c',1,'openvdb::v3_2_0::tree::ValueAccessor0::probeValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a0535ed999c1364a5bc5f31e668e5ef7c',1,'openvdb::v3_2_0::tree::ValueAccessor1::probeValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a0535ed999c1364a5bc5f31e668e5ef7c',1,'openvdb::v3_2_0::tree::ValueAccessor2::probeValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a0535ed999c1364a5bc5f31e668e5ef7c',1,'openvdb::v3_2_0::tree::ValueAccessor3::probeValue()']]], + ['probevalueandcache',['probeValueAndCache',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ab682876d96e5d4b4c7bd90ef19638d7c',1,'openvdb::v3_2_0::tree::InternalNode::probeValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a930652dd91d4aab8c576638b30617cbf',1,'openvdb::v3_2_0::tree::LeafNode::probeValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a935e893263dc341b5de98a10c4012d9f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::probeValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a935e893263dc341b5de98a10c4012d9f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::probeValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ab682876d96e5d4b4c7bd90ef19638d7c',1,'openvdb::v3_2_0::tree::RootNode::probeValueAndCache()']]], + ['probevalues',['probeValues',['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html#a37fdab3245bdf482be42fb117bfd1023',1,'openvdb::v3_2_0::tools::BoxSampler']]], + ['process',['process',['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html#aca2bdc8824a91b01803bca6955bc8ce9',1,'openvdb::v3_2_0::tools::gridop::GridOperator::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Cpt.html#ae9f30f1c39da5131d000088cdf9afea0',1,'openvdb::v3_2_0::tools::Cpt::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Curl.html#a076055e501cef7a05a5894cd279e643b',1,'openvdb::v3_2_0::tools::Curl::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Divergence.html#a75672d8d2b16d7e9b353841f031b340c',1,'openvdb::v3_2_0::tools::Divergence::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Gradient.html#a75672d8d2b16d7e9b353841f031b340c',1,'openvdb::v3_2_0::tools::Gradient::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian.html#a076055e501cef7a05a5894cd279e643b',1,'openvdb::v3_2_0::tools::Laplacian::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature.html#a076055e501cef7a05a5894cd279e643b',1,'openvdb::v3_2_0::tools::MeanCurvature::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude.html#a75672d8d2b16d7e9b353841f031b340c',1,'openvdb::v3_2_0::tools::Magnitude::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Normalize.html#a076055e501cef7a05a5894cd279e643b',1,'openvdb::v3_2_0::tools::Normalize::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpApplier.html#a8ec24e20adbeeac65646f4884899d863',1,'openvdb::v3_2_0::tools::valxform::SharedOpApplier::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpApplier.html#a8ec24e20adbeeac65646f4884899d863',1,'openvdb::v3_2_0::tools::valxform::CopyableOpApplier::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpTransformer.html#a8ec24e20adbeeac65646f4884899d863',1,'openvdb::v3_2_0::tools::valxform::SharedOpTransformer::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpTransformer.html#a8ec24e20adbeeac65646f4884899d863',1,'openvdb::v3_2_0::tools::valxform::CopyableOpTransformer::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1OpAccumulator.html#a8ec24e20adbeeac65646f4884899d863',1,'openvdb::v3_2_0::tools::valxform::OpAccumulator::process()']]], + ['processbottomup',['processBottomUp',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#afd8f485ce126b9b529db0402611ff40a',1,'openvdb::v3_2_0::tree::NodeManagerLink::processBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#afd8f485ce126b9b529db0402611ff40a',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::processBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#a0b18cc46435bfdadfbfb3fa1690b7e80',1,'openvdb::v3_2_0::tree::NodeManager::processBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#aaa0a11643bab9f481137b0a693f13863',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::processBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a0b18cc46435bfdadfbfb3fa1690b7e80',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::processBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a0b18cc46435bfdadfbfb3fa1690b7e80',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::processBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a0b18cc46435bfdadfbfb3fa1690b7e80',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::processBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a0b18cc46435bfdadfbfb3fa1690b7e80',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::processBottomUp()']]], + ['processtopdown',['processTopDown',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#a3bacd204719eecf8ef3c3696e814211b',1,'openvdb::v3_2_0::tree::NodeManagerLink::processTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#a3bacd204719eecf8ef3c3696e814211b',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::processTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#a1bc8ebde233bb904affc56fd51b6d08a',1,'openvdb::v3_2_0::tree::NodeManager::processTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#a501e50ba175715c92d651e171afac1fc',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::processTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a1bc8ebde233bb904affc56fd51b6d08a',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::processTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a1bc8ebde233bb904affc56fd51b6d08a',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::processTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a1bc8ebde233bb904affc56fd51b6d08a',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::processTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a1bc8ebde233bb904affc56fd51b6d08a',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::processTopDown()']]], + ['processtypedmap',['processTypedMap',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#adb714febefb61aa1286b349e086557e3',1,'openvdb::v3_2_0::math']]], + ['processx',['processX',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html#a71e793ff431e4493936f9ab608d17d66',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedPoints']]], + ['processy',['processY',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html#af9a0bfb47d9a770e49dd3c6d1c06c958',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedPoints']]], + ['processz',['processZ',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html#a3f99d497af5a0dacc9da390f332d9f54',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedPoints']]], + ['projection',['projection',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a188ce993b498175393d0706574746300',1,'openvdb::v3_2_0::math::Vec2::projection()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a77c0876ba7b5a8fb157df7110a44149b',1,'openvdb::v3_2_0::math::Vec3::projection()']]], + ['projecttoconstraintsurface',['projectToConstraintSurface',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestPointProjector.html#a0a3e45d84169d282eaa8913ba7c3a52f',1,'openvdb::v3_2_0::tools::ClosestPointProjector']]], + ['prolongate',['prolongate',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#aeb0449de717b38dd852cfaed5f093e34',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['prolongateactivevoxels',['prolongateActiveVoxels',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a18ddd896f767ca27ec505f1df38e98b5',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['prolongateop',['ProlongateOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1ProlongateOp.html',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['promote',['promote',['../structopenvdb_1_1v3__2__0_1_1math_1_1promote.html',1,'openvdb::v3_2_0::math']]], + ['proximity_2eh',['Proximity.h',['../Proximity_8h.html',1,'']]], + ['prune',['prune',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a66ec42d2ff5b84117b1da4cbba719f1b',1,'openvdb::v3_2_0::tools::LevelSetTracker::prune()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a462c7056adc55d8da2cc5828934ff859',1,'openvdb::v3_2_0::tree::InternalNode::prune()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a32b7de2717353e590fe2521c0243841a',1,'openvdb::v3_2_0::tree::LeafNode::prune()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a32b7de2717353e590fe2521c0243841a',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::prune()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a32b7de2717353e590fe2521c0243841a',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::prune()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a462c7056adc55d8da2cc5828934ff859',1,'openvdb::v3_2_0::tree::RootNode::prune()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a462c7056adc55d8da2cc5828934ff859',1,'openvdb::v3_2_0::tree::Tree::prune()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8057e1165c928a37703f90eb9496083c',1,'openvdb::v3_2_0::tools::prune()']]], + ['prune_2eh',['Prune.h',['../Prune_8h.html',1,'']]], + ['prunegrid',['pruneGrid',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a946aadf4f9405301582b15976dc8494f',1,'openvdb::v3_2_0::GridBase::pruneGrid()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a7e4352e92d2e25d4bfddadbb91ae4322',1,'openvdb::v3_2_0::Grid::pruneGrid()']]], + ['pruneinactive',['pruneInactive',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ae81e76930df0c635a4e175887352257e',1,'openvdb::v3_2_0::tools']]], + ['pruneinactivewithvalue',['pruneInactiveWithValue',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ad68447719ca38904491830b5c1caefa8',1,'openvdb::v3_2_0::tools']]], + ['prunelevelset',['pruneLevelSet',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a467d50f8a53357977d5720498a88d72c',1,'openvdb::v3_2_0::tools::pruneLevelSet(TreeT &tree, bool threaded=true, size_t grainSize=1)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac57eaa5cdb5f7180a68b88901e9421ad',1,'openvdb::v3_2_0::tools::pruneLevelSet(TreeT &tree, const typename TreeT::ValueType &outsideWidth, const typename TreeT::ValueType &insideWidth, bool threaded=true, size_t grainSize=1)']]], + ['prunetiles',['pruneTiles',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ab8ffdc3cdd984ae9e4c0742406cfdaee',1,'openvdb::v3_2_0::tools']]], + ['ptr',['Ptr',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ae5f073a322a4a562054f0b2506f48111',1,'openvdb::v3_2_0::GridBase::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#aac96d633d8cebcf0f08aa67d3e690dae',1,'openvdb::v3_2_0::Grid::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a71a34ec242e96e12ae593eb9e40e58f6',1,'openvdb::v3_2_0::io::Archive::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a3aac2584efac935b80ed22b4e6b1e026',1,'openvdb::v3_2_0::io::StreamMetadata::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1MappedFile.html#a56cdd0fe395e8c0a628d558493a98401',1,'openvdb::v3_2_0::io::MappedFile::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a6aa704ce9a9bf2476bfaa2e89c7aa647',1,'openvdb::v3_2_0::math::pcg::Vector::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#ad2bbf4b6e00be1bd4a0a86d235f4d57c',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Preconditioner.html#a726385a366d4dc25f4531bb9974f961c',1,'openvdb::v3_2_0::math::pcg::Preconditioner::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1JacobiPreconditioner.html#a4a0ff28ea3ad6cda00e5e577d23b1f84',1,'openvdb::v3_2_0::math::pcg::JacobiPreconditioner::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#a555f877187b569ec717e958a315b1e41',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#ac8b230da50a122307699d901092ff3f7',1,'openvdb::v3_2_0::math::MapBase::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a2598e25f6e75056603015c0c44f0a94c',1,'openvdb::v3_2_0::math::AffineMap::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#aee4c7ec1425731be3474bf10e2ff4224',1,'openvdb::v3_2_0::math::ScaleMap::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#ac2ef3b40e0494a8675a91bc8378d5aee',1,'openvdb::v3_2_0::math::UniformScaleMap::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a5544d07d373129b6e446d06cdfdee6f1',1,'openvdb::v3_2_0::math::TranslationMap::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#aeb20a8fcd79bd7f1ba2e5b462abfdfd5',1,'openvdb::v3_2_0::math::ScaleTranslateMap::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#a6514165e9bc1dc98da6ba0eb7d22a81b',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a9dbabdaa56462f5709c0820c071239eb',1,'openvdb::v3_2_0::math::UnitaryMap::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a51a06b16ab468a38ef3b65ab60e47f27',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#ad01e8505e5d52d526ace2ad796f9a479',1,'openvdb::v3_2_0::math::CompoundMap::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a8e4669fc90b6bb567b10c541f450d68e',1,'openvdb::v3_2_0::math::Transform::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a95ed14273597421f00f70344b5df704e',1,'openvdb::v3_2_0::Metadata::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#aec7d87af5f26a6fecec55566f89b3ddd',1,'openvdb::v3_2_0::TypedMetadata::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a885753a990797853172c3167e65b5afa',1,'openvdb::v3_2_0::MetaMap::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a78805283b66d1915c3803316569e43f7',1,'openvdb::v3_2_0::tools::Dense::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html#a2ac04c4ebd1b09d5c4233c84f81e0e22',1,'openvdb::v3_2_0::tools::GridResampler::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer.html#abc139d5c665814773b11b26db694a256',1,'openvdb::v3_2_0::tools::GridTransformer::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#a6c0c10a99f85980972e86772ea602883',1,'openvdb::v3_2_0::tools::GridSampler::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html#a6c0c10a99f85980972e86772ea602883',1,'openvdb::v3_2_0::tools::GridSampler< tree::ValueAccessor< TreeT >, SamplerType >::Ptr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1NodeMaskSegment.html#ac6c8bc65e36ad0f5bfbc92deef151fce',1,'openvdb::v3_2_0::tools::level_set_util_internal::NodeMaskSegment::Ptr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#a988b619d1c40122bfdd4cdf360d10192',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a17e238dcdf59e364f00cda1363a25907',1,'openvdb::v3_2_0::tools::MultiResGrid::Ptr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#a195b5c3d7c3368ff4dfc303f28caf1c3',1,'openvdb::v3_2_0::tools::ParticleAtlas::Ptr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#ae7e6c03e9242d5f437a7b7e569e43f88',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray::Ptr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a40a88b76b6996ab276e75795c6b00c76',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#a1997fae0d5e9bc397475816eb504106a',1,'openvdb::v3_2_0::tools::PointPartitioner::Ptr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1Array.html#a05d202de4db7bc6d2fcf416e50ebf369',1,'openvdb::v3_2_0::tools::point_partitioner_internal::Array::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ae3098610d5ce2b73b3268333ce3c31ee',1,'openvdb::v3_2_0::tree::LeafNode::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a50d93bdc3b1ea617993a7750eaa7599a',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a50d93bdc3b1ea617993a7750eaa7599a',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#aea4cbab691f3a5248e9ca56ed7e44917',1,'openvdb::v3_2_0::tree::TreeBase::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a147dd2d717216bac58c91dbb5c08f7c9',1,'openvdb::v3_2_0::tree::Tree::Ptr()']]], + ['push_5fback',['push_back',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#a46ec940815ed036de9c5b5cc94b9b916',1,'openvdb::v3_2_0::tree::NodeList::push_back()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#aafda3d7e372dc7bcbb6d4177b9fbee3f',1,'openvdb::v3_2_0::util::PagedArray::push_back()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ValueBuffer.html#a6b3c5ce2a81a96f719e6251941cc850b',1,'openvdb::v3_2_0::util::PagedArray::ValueBuffer::push_back()']]], + ['push_5fback_5funsafe',['push_back_unsafe',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a2db49bee5258957acd0317c8d4342fb3',1,'openvdb::v3_2_0::util::PagedArray']]], + ['put',['put',['../classopenvdb_1_1v3__2__0_1_1util_1_1FormattedInt.html#ad7f5328ef74c5ae08e6161c400b879ae',1,'openvdb::v3_2_0::util::FormattedInt']]], + ['pyopenvdb',['pyopenvdb',['../namespacepyopenvdb.html',1,'']]], + ['pyopenvdb_2eh',['pyopenvdb.h',['../pyopenvdb_8h.html',1,'']]], + ['python_2etxt',['python.txt',['../python_8txt.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_12.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_12.html new file mode 100644 index 00000000..96c8ac74 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_12.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_12.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_12.js new file mode 100644 index 00000000..02c72f77 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_12.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['quad',['quad',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#a46b98c7e8bddaf88d1e1d80cbd2ea3bb',1,'openvdb::v3_2_0::tools::PolygonPool::quad(size_t n)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#a23551b27204457100b9025e49a1db28d',1,'openvdb::v3_2_0::tools::PolygonPool::quad(size_t n) const ']]], + ['quadandtriangledataadapter',['QuadAndTriangleDataAdapter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadAndTriangleDataAdapter.html',1,'openvdb::v3_2_0::tools']]], + ['quadandtriangledataadapter',['QuadAndTriangleDataAdapter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadAndTriangleDataAdapter.html#a77132b44ec7d41809377d4bd855ba459',1,'openvdb::v3_2_0::tools::QuadAndTriangleDataAdapter::QuadAndTriangleDataAdapter(const std::vector< PointType > &points, const std::vector< PolygonType > &polygons)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadAndTriangleDataAdapter.html#abed5272d67f448d98ffb5530a78c8040',1,'openvdb::v3_2_0::tools::QuadAndTriangleDataAdapter::QuadAndTriangleDataAdapter(const PointType *pointArray, size_t pointArraySize, const PolygonType *polygonArray, size_t polygonArraySize)']]], + ['quadflags',['quadFlags',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#ace83320b1a904f7fc283ae27bf1cee18',1,'openvdb::v3_2_0::tools::PolygonPool::quadFlags(size_t n)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#a7ac088c07dbb87912e1eed398c6cfcec',1,'openvdb::v3_2_0::tools::PolygonPool::quadFlags(size_t n) const ']]], + ['quadraticsampler',['QuadraticSampler',['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadraticSampler.html',1,'openvdb::v3_2_0::tools']]], + ['quantizedpointlist',['QuantizedPointList',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPoints.html#acd50b5469e47cffdb459de4dcd5091e6',1,'openvdb::v3_2_0::tools::internal::GenPoints::QuantizedPointList()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SeamWeights.html#acd50b5469e47cffdb459de4dcd5091e6',1,'openvdb::v3_2_0::tools::internal::SeamWeights::QuantizedPointList()']]], + ['quantizedunitvec',['QuantizedUnitVec',['../classopenvdb_1_1v3__2__0_1_1math_1_1QuantizedUnitVec.html',1,'openvdb::v3_2_0::math']]], + ['quantizedunitvec_2eh',['QuantizedUnitVec.h',['../QuantizedUnitVec_8h.html',1,'']]], + ['quat',['Quat',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html',1,'openvdb::v3_2_0::math']]], + ['quat',['Quat',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#af22f1a8ea4be4e26bdb9417698c59bf7',1,'openvdb::v3_2_0::math::Quat::Quat()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#aa2de4bf209b4613bb9a148cd10d17e56',1,'openvdb::v3_2_0::math::Quat::Quat(T x, T y, T z, T w)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a55f983267a298932049687603f73e19e',1,'openvdb::v3_2_0::math::Quat::Quat(T *a)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a644f03043ec359f8149f2a590ed19ff4',1,'openvdb::v3_2_0::math::Quat::Quat(const Vec3< T > &axis, T angle)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a5ba702efec452553e1de05edfaae411d',1,'openvdb::v3_2_0::math::Quat::Quat(math::Axis axis, T angle)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a87e9a26f7bb5e7579fbee0453a2c2c42',1,'openvdb::v3_2_0::math::Quat::Quat(const Mat3< T1 > &rot)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a83df9837eed3738891de792843bff015',1,'openvdb::v3_2_0::math::Quat::Quat(const Quat &q)']]], + ['quat_2eh',['Quat.h',['../Quat_8h.html',1,'']]], + ['quatd',['Quatd',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a654db6f69ba779142505b111ec5728f9',1,'openvdb::v3_2_0::math']]], + ['quatr',['QuatR',['../namespaceopenvdb_1_1v3__2__0.html#a1e295ffc775b9956031b7867648cc215',1,'openvdb::v3_2_0']]], + ['quats',['Quats',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9e15946d603c11211474397ac969f512',1,'openvdb::v3_2_0::math']]], + ['quatslist',['QuatsList',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFracture.html#a57c99a05d30f9adf92b2daec6728b191',1,'openvdb::v3_2_0::tools::LevelSetFracture']]], + ['queue',['Queue',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html',1,'openvdb::v3_2_0::io']]], + ['queue',['Queue',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#ad9627bf962cb5c9e2d3e9b50e29f7f90',1,'openvdb::v3_2_0::io::Queue']]], + ['queue_2eh',['Queue.h',['../Queue_8h.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_13.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_13.html new file mode 100644 index 00000000..539b000c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_13.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_13.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_13.js new file mode 100644 index 00000000..faae3888 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_13.js @@ -0,0 +1,159 @@ +var searchData= +[ + ['release_20notes',['Release Notes',['../changes.html',1,'index']]], + ['r',['r',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#a642b9bbe27cd5a9c63c52f1bd62ead58',1,'openvdb::v3_2_0::tools::Film::RGBA']]], + ['radialrangefilter',['RadialRangeFilter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RadialRangeFilter.html',1,'openvdb::v3_2_0::tools::particle_atlas_internal']]], + ['radialrangefilter',['RadialRangeFilter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1RadialRangeFilter.html',1,'openvdb::v3_2_0::tools::point_index_grid_internal']]], + ['radialrangefilter',['RadialRangeFilter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RadialRangeFilter.html#a2823eecca5739187391cd091af34f599',1,'openvdb::v3_2_0::tools::particle_atlas_internal::RadialRangeFilter::RadialRangeFilter()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1RadialRangeFilter.html#a4f4cabaf6ae8111941666a80086fb78d',1,'openvdb::v3_2_0::tools::point_index_grid_internal::RadialRangeFilter::RadialRangeFilter()']]], + ['radius',['radius',['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1BoolSampler.html#a4836a8d316f4fbaaf3064e0b1acd10ec',1,'openvdb::v3_2_0::tools::clip_internal::BoolSampler::radius()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler.html#a4836a8d316f4fbaaf3064e0b1acd10ec',1,'openvdb::v3_2_0::tools::Sampler::radius()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointSampler.html#a4836a8d316f4fbaaf3064e0b1acd10ec',1,'openvdb::v3_2_0::tools::PointSampler::radius()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html#a4836a8d316f4fbaaf3064e0b1acd10ec',1,'openvdb::v3_2_0::tools::BoxSampler::radius()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadraticSampler.html#a4836a8d316f4fbaaf3064e0b1acd10ec',1,'openvdb::v3_2_0::tools::QuadraticSampler::radius()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredPointSampler.html#a4836a8d316f4fbaaf3064e0b1acd10ec',1,'openvdb::v3_2_0::tools::StaggeredPointSampler::radius()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredBoxSampler.html#a4836a8d316f4fbaaf3064e0b1acd10ec',1,'openvdb::v3_2_0::tools::StaggeredBoxSampler::radius()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredQuadraticSampler.html#a4836a8d316f4fbaaf3064e0b1acd10ec',1,'openvdb::v3_2_0::tools::StaggeredQuadraticSampler::radius()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UpdatePoints.html#afe45306f1c8ce176fcf6c80359b2f136',1,'openvdb::v3_2_0::tools::internal::UpdatePoints::radius()']]], + ['rand01',['Rand01',['../classopenvdb_1_1v3__2__0_1_1math_1_1Rand01.html#a503080d0706177fb9605c77e0b20bb42',1,'openvdb::v3_2_0::math::Rand01::Rand01(const EngineType &engine)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Rand01.html#aac98d221805cbaf767b06d81e44d6b79',1,'openvdb::v3_2_0::math::Rand01::Rand01(unsigned int seed)']]], + ['rand01',['Rand01',['../classopenvdb_1_1v3__2__0_1_1math_1_1Rand01.html',1,'openvdb::v3_2_0::math']]], + ['rand01_3c_20double_2c_20randomgenerator_20_3e',['Rand01< double, RandomGenerator >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Rand01.html',1,'openvdb::v3_2_0::math']]], + ['randint',['RandInt',['../classopenvdb_1_1v3__2__0_1_1math_1_1RandInt.html',1,'openvdb::v3_2_0::math']]], + ['randint',['RandInt',['../classopenvdb_1_1v3__2__0_1_1math_1_1RandInt.html#aaa7702417c351f612b7f109a89836eb7',1,'openvdb::v3_2_0::math::RandInt::RandInt(const EngineType &engine, IntType imin, IntType imax)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1RandInt.html#a27279fdddf927e62083a36b34a359143',1,'openvdb::v3_2_0::math::RandInt::RandInt(unsigned int seed, IntType imin, IntType imax)']]], + ['random01',['Random01',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a99f853a1b932705029be5e71607b6bbd',1,'openvdb::v3_2_0::math']]], + ['randomint',['RandomInt',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aa33e90af3e479e935569d50c20ddcb33',1,'openvdb::v3_2_0::math']]], + ['range',['Range',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RadialRangeFilter.html#abe03036ac3f8fd11ef5755b9403db347',1,'openvdb::v3_2_0::tools::particle_atlas_internal::RadialRangeFilter::Range()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1BBoxFilter.html#abe03036ac3f8fd11ef5755b9403db347',1,'openvdb::v3_2_0::tools::particle_atlas_internal::BBoxFilter::Range()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1BBoxFilter.html#abe03036ac3f8fd11ef5755b9403db347',1,'openvdb::v3_2_0::tools::point_index_grid_internal::BBoxFilter::Range()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1RadialRangeFilter.html#abe03036ac3f8fd11ef5755b9403db347',1,'openvdb::v3_2_0::tools::point_index_grid_internal::RadialRangeFilter::Range()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#a2c0001a9b45f59a550856e5127a49eda',1,'openvdb::v3_2_0::math::Extrema::range()']]], + ['range3d',['Range3d',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#ae5f6bcf730061b750b501b9b0103268a',1,'openvdb::v3_2_0::tools::SparseExtractor::Range3d()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#ae5f6bcf730061b750b501b9b0103268a',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor::Range3d()']]], + ['rangedeque',['RangeDeque',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RadialRangeFilter.html#af25c7dc3aaf69725d6fb47ab3a389e17',1,'openvdb::v3_2_0::tools::particle_atlas_internal::RadialRangeFilter::RangeDeque()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1BBoxFilter.html#af25c7dc3aaf69725d6fb47ab3a389e17',1,'openvdb::v3_2_0::tools::particle_atlas_internal::BBoxFilter::RangeDeque()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1BBoxFilter.html#af25c7dc3aaf69725d6fb47ab3a389e17',1,'openvdb::v3_2_0::tools::point_index_grid_internal::BBoxFilter::RangeDeque()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1RadialRangeFilter.html#af25c7dc3aaf69725d6fb47ab3a389e17',1,'openvdb::v3_2_0::tools::point_index_grid_internal::RadialRangeFilter::RangeDeque()']]], + ['ranget',['RangeT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1ErodeVoxelsOp.html#abfe0d11208733b830b3ce6feae7ff0ac',1,'openvdb::v3_2_0::tools::Morphology::ErodeVoxelsOp::RangeT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1MaskOp.html#ae2edd9b69d31605a76cc7b25d92d2ee1',1,'openvdb::v3_2_0::tools::MultiResGrid::MaskOp::RangeT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid_1_1ReducePool.html#a1e2d583ad6fc1b0bd295b9b0d07ab1db',1,'openvdb::v3_2_0::tools::PointMaskGrid::ReducePool::RangeT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafManagerImpl.html#a5ce1a5aa471bc457b54feeae47a8b04a',1,'openvdb::v3_2_0::tree::LeafManagerImpl::RangeT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafManagerImpl_3_01LeafManager_3_01const_01TreeT_01_4_01_4.html#a5ce1a5aa471bc457b54feeae47a8b04a',1,'openvdb::v3_2_0::tree::LeafManagerImpl< LeafManager< const TreeT > >::RangeT()']]], + ['rangetype',['RangeType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseTransformer.html#a73336be54755cd0438c9a7c2298dc2ea',1,'openvdb::v3_2_0::tools::DenseTransformer::RangeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a84a0f8c16513fb5cdef01b99531c8941',1,'openvdb::v3_2_0::tools::Filter::RangeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a02f5d57c17bb98d1720b2bd1ef5a38e0',1,'openvdb::v3_2_0::tree::LeafManager::RangeType()']]], + ['rasterizemask',['rasterizeMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a0dd5ff2b2920001e8fbedb75c4d8d0b5',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet::rasterizeMask(const GridT &grid, const int dilationInVoxels=1, const int erosionInVoxels=1)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a2c076d91f14a195eba7069b088857964',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet::rasterizeMask(const MaskGrid &maskGrid, int dilation, int erosion)']]], + ['rasterizepoints',['rasterizePoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a9f42651ade15ca68bbb165b38c665a5c',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['rasterizespheres',['rasterizeSpheres',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a6d05bbe98be845e930fb730ac3e33a4d',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet::rasterizeSpheres(const ParticleListT &pa)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a235ecfaac6a666140892d1775d2041b7',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet::rasterizeSpheres(const ParticleListT &pa, Real radius)']]], + ['rasterizetrails',['rasterizeTrails',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a0d7ecf476625b0834d172d48b5614972',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['rastertoscreen',['rasterToScreen',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#ace5b6dcb7b3a6a8ad135c02850f09a8b',1,'openvdb::v3_2_0::tools::BaseCamera']]], + ['ray',['Ray',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html',1,'openvdb::v3_2_0::math']]], + ['ray',['Ray',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a0b46663f5486c8d7b09318504523fdbc',1,'openvdb::v3_2_0::math::Ray']]], + ['ray_2eh',['Ray.h',['../Ray_8h.html',1,'']]], + ['ray_3c_20double_20_3e',['Ray< double >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html',1,'openvdb::v3_2_0::math']]], + ['rayintersector_2eh',['RayIntersector.h',['../RayIntersector_8h.html',1,'']]], + ['rayt',['RayT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#a1c5dcc505cff8f3a8f4198a777a2435e',1,'openvdb::v3_2_0::tools::LinearSearchImpl::RayT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseShader.html#accc82e9bfdabcaf82a7fcd1bfe32ff48',1,'openvdb::v3_2_0::tools::BaseShader::RayT()']]], + ['raytrace',['rayTrace',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8642ecf09da68f9d3d16f606be7ae301',1,'openvdb::v3_2_0::tools::rayTrace(const GridT &, const BaseShader &, BaseCamera &, size_t pixelSamples=1, unsigned int seed=0, bool threaded=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a02be13fa85c9edfa183b39d1255ff6c4',1,'openvdb::v3_2_0::tools::rayTrace(const GridT &, const IntersectorT &, const BaseShader &, BaseCamera &, size_t pixelSamples=1, unsigned int seed=0, bool threaded=true)']]], + ['raytracer_2eh',['RayTracer.h',['../RayTracer_8h.html',1,'']]], + ['raytype',['RayType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#a47e1d56b220e0d553fb1b48aeb3467bb',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::RayType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a47e1d56b220e0d553fb1b48aeb3467bb',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::RayType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#afec8f0d09ffa3c6d7a1fdfe2866dde6f',1,'openvdb::v3_2_0::tools::LevelSetRayTracer::RayType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#afec8f0d09ffa3c6d7a1fdfe2866dde6f',1,'openvdb::v3_2_0::tools::VolumeRender::RayType()']]], + ['read',['read',['../structopenvdb_1_1v3__2__0_1_1io_1_1HalfReader_3_01false_00_01T_01_4.html#aae92eae700f11f358af61334586184e5',1,'openvdb::v3_2_0::io::HalfReader< false, T >::read()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1HalfReader_3_01true_00_01T_01_4.html#aae92eae700f11f358af61334586184e5',1,'openvdb::v3_2_0::io::HalfReader< true, T >::read()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a625a8ac4631f76c21608537f437cd5aa',1,'openvdb::v3_2_0::io::GridDescriptor::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::BBox::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::Coord::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::CoordBBox::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a7b173acf2f1c9d71e6dc43bb2501dddb',1,'openvdb::v3_2_0::math::MapBase::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::AffineMap::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::ScaleMap::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::TranslationMap::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::ScaleTranslateMap::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::UnitaryMap::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::CompoundMap::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::Mat::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::Quat::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a8a43053947abc08a85ad9f53558ce19f',1,'openvdb::v3_2_0::math::Transform::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::Tuple::read()'],['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a8a43053947abc08a85ad9f53558ce19f',1,'openvdb::v3_2_0::Metadata::read()']]], + ['readallgridmetadata',['readAllGridMetadata',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#abf37aaa82022716eede54e8d58b94c20',1,'openvdb::v3_2_0::io::File']]], + ['readbuffers',['readBuffers',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a21616adb77e7d3fe436d342dbbc3f904',1,'openvdb::v3_2_0::GridBase::readBuffers(std::istream &)=0'],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#acbd2ddfaf3713feab2393a4e213a1ed6',1,'openvdb::v3_2_0::GridBase::readBuffers(std::istream &, const CoordBBox &)=0'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#aad15895857af5d3c39f9c2e91cfcf83a',1,'openvdb::v3_2_0::Grid::readBuffers(std::istream &)'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a0ed063ecc9bfce28275877aa96361539',1,'openvdb::v3_2_0::Grid::readBuffers(std::istream &, const CoordBBox &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ab4336a6e7f4195e943a76cd50fe0320e',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::readBuffers(std::istream &is, bool fromHalf=false)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#af94901d629d53f0ecab6bf1eb806fcee',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::readBuffers(std::istream &is, const CoordBBox &, bool fromHalf=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aef270a4e4900e5e0bd24e6664d6a8a82',1,'openvdb::v3_2_0::tree::InternalNode::readBuffers(std::istream &, bool fromHalf=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a9d516efdbb242e00e7c77ae85cc426b6',1,'openvdb::v3_2_0::tree::InternalNode::readBuffers(std::istream &, const CoordBBox &, bool fromHalf=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ab4336a6e7f4195e943a76cd50fe0320e',1,'openvdb::v3_2_0::tree::LeafNode::readBuffers(std::istream &is, bool fromHalf=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a859ff8bcfb4872c015b7a813c737eb7e',1,'openvdb::v3_2_0::tree::LeafNode::readBuffers(std::istream &is, const CoordBBox &bbox, bool fromHalf=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aef270a4e4900e5e0bd24e6664d6a8a82',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::readBuffers(std::istream &, bool fromHalf=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#af94901d629d53f0ecab6bf1eb806fcee',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::readBuffers(std::istream &is, const CoordBBox &, bool fromHalf=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aef270a4e4900e5e0bd24e6664d6a8a82',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::readBuffers(std::istream &, bool fromHalf=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#af94901d629d53f0ecab6bf1eb806fcee',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::readBuffers(std::istream &is, const CoordBBox &, bool fromHalf=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#aef270a4e4900e5e0bd24e6664d6a8a82',1,'openvdb::v3_2_0::tree::RootNode::readBuffers(std::istream &, bool fromHalf=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a9d516efdbb242e00e7c77ae85cc426b6',1,'openvdb::v3_2_0::tree::RootNode::readBuffers(std::istream &, const CoordBBox &, bool fromHalf=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a355f88e882ef5bab882472098c912ab1',1,'openvdb::v3_2_0::tree::TreeBase::readBuffers(std::istream &, bool saveFloatAsHalf=false)=0'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a6e32458712135f1dee4d084c88c9b23d',1,'openvdb::v3_2_0::tree::TreeBase::readBuffers(std::istream &, const CoordBBox &, bool saveFloatAsHalf=false)=0'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#abd7e6993b3e10e49eb17f6387ced71fb',1,'openvdb::v3_2_0::tree::Tree::readBuffers(std::istream &, bool saveFloatAsHalf=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#afbbcc1814fccd5c8ff5378c444441e39',1,'openvdb::v3_2_0::tree::Tree::readBuffers(std::istream &, const CoordBBox &, bool saveFloatAsHalf=false)']]], + ['readcompressedvalues',['readCompressedValues',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a1441af9c1d465be4b5012dcb1e479bd2',1,'openvdb::v3_2_0::io']]], + ['readdata',['readData',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#acb5ef6ae7798a46698c16fd2319b5c99',1,'openvdb::v3_2_0::io']]], + ['readdata_3c_20std_3a_3astring_20_3e',['readData< std::string >',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#adfe4d8c0b8287b2da5022fa65fd31d01',1,'openvdb::v3_2_0::io']]], + ['readgrid',['readGrid',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a1feee91a690bf00206d9e3aeebc7b5e2',1,'openvdb::v3_2_0::io::Archive::readGrid(GridBase::Ptr, const GridDescriptor &, std::istream &)'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a5d363638cdc74d9f5a762151079f1322',1,'openvdb::v3_2_0::io::Archive::readGrid(GridBase::Ptr, const GridDescriptor &, std::istream &, const BBoxd &)'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a90d53022b607480bbe36928056fec04e',1,'openvdb::v3_2_0::io::Archive::readGrid(GridBase::Ptr, const GridDescriptor &, std::istream &, const CoordBBox &)'],['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a91480f9c9b8612508353e01a47cbe176',1,'openvdb::v3_2_0::io::File::readGrid(const Name &)'],['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a4849f1481df698ce43518cb1924b0792',1,'openvdb::v3_2_0::io::File::readGrid(const Name &, const BBoxd &)']]], + ['readgridcompression',['readGridCompression',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a9bc6f0770123e65be73ffcaab35e6183',1,'openvdb::v3_2_0::io::Archive']]], + ['readgridcount',['readGridCount',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a81e623ab8158d4660b191a98ab6ba0a7',1,'openvdb::v3_2_0::io::Archive']]], + ['readgridmetadata',['readGridMetadata',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#ab12472377bbdbcab1d0bc3258c76f289',1,'openvdb::v3_2_0::io::File']]], + ['readgridpartial',['readGridPartial',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a069f364ed7ff5c9c7bd2a33bb62c9a09',1,'openvdb::v3_2_0::io::File']]], + ['readheader',['readHeader',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#ad758493a96282d6cf90a13772a685067',1,'openvdb::v3_2_0::io::Archive']]], + ['readmeta',['readMeta',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a89e8cec0af5988342e305537d910f4e5',1,'openvdb::v3_2_0::MetaMap']]], + ['readnonresidentbuffers',['readNonresidentBuffers',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#aa3282e612fc0505e919401f5c538c89b',1,'openvdb::v3_2_0::GridBase::readNonresidentBuffers()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a9407f1e13762f682d04c19e8dc8817c8',1,'openvdb::v3_2_0::Grid::readNonresidentBuffers()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#aa3282e612fc0505e919401f5c538c89b',1,'openvdb::v3_2_0::tree::TreeBase::readNonresidentBuffers()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a9407f1e13762f682d04c19e8dc8817c8',1,'openvdb::v3_2_0::tree::Tree::readNonresidentBuffers()']]], + ['readsize',['readSize',['../classopenvdb_1_1v3__2__0_1_1Metadata.html#ac3c5726797c8f93c8879e537fad05ff3',1,'openvdb::v3_2_0::Metadata']]], + ['readstring',['readString',['../namespaceopenvdb_1_1v3__2__0.html#af644b3e1a7055ff49275cf2a0f0635b0',1,'openvdb::v3_2_0']]], + ['readtopology',['readTopology',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#acb845830da0a693644475c847a236c51',1,'openvdb::v3_2_0::GridBase::readTopology()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#aeb32c070fe5c10d4a8c6539127549d35',1,'openvdb::v3_2_0::Grid::readTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#abcdf345c3364a34a9b0e3ba2883960e2',1,'openvdb::v3_2_0::tree::InternalNode::readTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a486b1ba5030fb24700ee3a2876ee40c9',1,'openvdb::v3_2_0::tree::LeafNode::readTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#abcdf345c3364a34a9b0e3ba2883960e2',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::readTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#abcdf345c3364a34a9b0e3ba2883960e2',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::readTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#af5537d3d93b7137d3f03007b31077921',1,'openvdb::v3_2_0::tree::RootNode::readTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#afc88b0cf680670594c72aa4ddba1336e',1,'openvdb::v3_2_0::tree::TreeBase::readTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#afc88b0cf680670594c72aa4ddba1336e',1,'openvdb::v3_2_0::tree::Tree::readTopology()']]], + ['readtransform',['readTransform',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#aa536912672363ecae4f88a9f19470123',1,'openvdb::v3_2_0::GridBase']]], + ['readvalue',['readValue',['../classopenvdb_1_1v3__2__0_1_1Metadata.html#af57de5c4cdb7f85f093737fab881f2e5',1,'openvdb::v3_2_0::Metadata::readValue()'],['../classopenvdb_1_1v3__2__0_1_1UnknownMetadata.html#af6bec02e761ce8818f57aeb7713a7556',1,'openvdb::v3_2_0::UnknownMetadata::readValue()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#ae0e6a2e59b031a221d980ed57c37dbeb',1,'openvdb::v3_2_0::TypedMetadata::readValue()']]], + ['real',['Real',['../namespaceopenvdb_1_1v3__2__0.html#a445a5f0e2a34c9d97d69a3c2d1957907',1,'openvdb::v3_2_0']]], + ['realt',['RealT',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#a1f1c2c964fdec9d9bf5991fef3734b16',1,'openvdb::v3_2_0::math::DDA']]], + ['realtohalf',['RealToHalf',['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf.html',1,'openvdb::v3_2_0::io']]], + ['realtohalf_3c_20double_20_3e',['RealToHalf< double >',['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01double_01_4.html',1,'openvdb::v3_2_0::io']]], + ['realtohalf_3c_20float_20_3e',['RealToHalf< float >',['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01float_01_4.html',1,'openvdb::v3_2_0::io']]], + ['realtohalf_3c_20vec2d_20_3e',['RealToHalf< Vec2d >',['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec2d_01_4.html',1,'openvdb::v3_2_0::io']]], + ['realtohalf_3c_20vec2s_20_3e',['RealToHalf< Vec2s >',['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec2s_01_4.html',1,'openvdb::v3_2_0::io']]], + ['realtohalf_3c_20vec3d_20_3e',['RealToHalf< Vec3d >',['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec3d_01_4.html',1,'openvdb::v3_2_0::io']]], + ['realtohalf_3c_20vec3s_20_3e',['RealToHalf< Vec3s >',['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec3s_01_4.html',1,'openvdb::v3_2_0::io']]], + ['realtype',['RealType',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#a655de90b5db96149fcf10f2ed06f6256',1,'openvdb::v3_2_0::math::DDA::RealType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a3ebd1e03ef474a8e9aca622ac8d4d09e',1,'openvdb::v3_2_0::math::Ray::RealType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#a655de90b5db96149fcf10f2ed06f6256',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::RealType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a655de90b5db96149fcf10f2ed06f6256',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::RealType()']]], + ['rebuild',['rebuild',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a27df2921c5308dcf3b8814d90d9ab5e1',1,'openvdb::v3_2_0::tree::LeafManager::rebuild(bool serial=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#abc9678b87fd0a3c643c20b733989bfa7',1,'openvdb::v3_2_0::tree::LeafManager::rebuild(size_t auxBuffersPerLeaf, bool serial=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a2512a475143e9bf424983e31b14b6d90',1,'openvdb::v3_2_0::tree::LeafManager::rebuild(TreeType &tree, bool serial=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a96b9faebed83c665e89d7dcd1ea73c5c',1,'openvdb::v3_2_0::tree::LeafManager::rebuild(TreeType &tree, size_t auxBuffersPerLeaf, bool serial=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#a4e478087e86d0dde36a39d33f473570f',1,'openvdb::v3_2_0::tree::NodeManagerLink::rebuild()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#a4e478087e86d0dde36a39d33f473570f',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::rebuild()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#a518e874f19ef2f2a390f96f3f63e2706',1,'openvdb::v3_2_0::tree::NodeManager::rebuild()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#a518e874f19ef2f2a390f96f3f63e2706',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::rebuild()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a518e874f19ef2f2a390f96f3f63e2706',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::rebuild()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a518e874f19ef2f2a390f96f3f63e2706',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::rebuild()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a518e874f19ef2f2a390f96f3f63e2706',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::rebuild()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a518e874f19ef2f2a390f96f3f63e2706',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::rebuild()']]], + ['rebuildauxbuffers',['rebuildAuxBuffers',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#aa8b77a7173180a24da3a10a28c0fe987',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['rebuildleafarray',['rebuildLeafArray',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a614ef559f7a068e087b7ffa1265c2480',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['reduce',['reduce',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a564f198735d281f486addac56f65751d',1,'openvdb::v3_2_0::tree::LeafManager::reduce()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#a05dcc849f802910606ab512e43485cc4',1,'openvdb::v3_2_0::tree::NodeList::reduce()']]], + ['reducebottomup',['reduceBottomUp',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#a561f91b367768813aa77853a081d3910',1,'openvdb::v3_2_0::tree::NodeManagerLink::reduceBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#a561f91b367768813aa77853a081d3910',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::reduceBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#a8daf022aab0ee45763e38b627c640138',1,'openvdb::v3_2_0::tree::NodeManager::reduceBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#aa99f7d9f3d01e6ea2505d179d35351d3',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::reduceBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a8daf022aab0ee45763e38b627c640138',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::reduceBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a8daf022aab0ee45763e38b627c640138',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::reduceBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a8daf022aab0ee45763e38b627c640138',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::reduceBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a8daf022aab0ee45763e38b627c640138',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::reduceBottomUp()']]], + ['reducepool',['ReducePool',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid_1_1ReducePool.html#ad998627a8994d91b05d0267933ce2fc5',1,'openvdb::v3_2_0::tools::PointMaskGrid::ReducePool::ReducePool(PoolType &pool, GridT *grid, size_t grainSize=1)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid_1_1ReducePool.html#acc67b229217cb166b1f152e6e2fbeae2',1,'openvdb::v3_2_0::tools::PointMaskGrid::ReducePool::ReducePool(const ReducePool &, tbb::split)']]], + ['reducepool',['ReducePool',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid_1_1ReducePool.html',1,'openvdb::v3_2_0::tools::PointMaskGrid']]], + ['reducetmp',['reducetmp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1DeterministicDotProductOp.html#a2c84dc413932c96285e8cb452dbf7615',1,'openvdb::v3_2_0::math::pcg::Vector::DeterministicDotProductOp']]], + ['reducetopdown',['reduceTopDown',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#a27cbac686031ec4282751447586c5d5a',1,'openvdb::v3_2_0::tree::NodeManagerLink::reduceTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#a27cbac686031ec4282751447586c5d5a',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::reduceTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#a078df3d081981ddb2fa5766331e17479',1,'openvdb::v3_2_0::tree::NodeManager::reduceTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#a5d6ef012eefafaf21a21a96c2d34e04f',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::reduceTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a078df3d081981ddb2fa5766331e17479',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::reduceTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a078df3d081981ddb2fa5766331e17479',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::reduceTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a078df3d081981ddb2fa5766331e17479',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::reduceTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a078df3d081981ddb2fa5766331e17479',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::reduceTopDown()']]], + ['referenceerror',['ReferenceError',['../classopenvdb_1_1v3__2__0_1_1ReferenceError.html',1,'openvdb::v3_2_0']]], + ['referenceerror',['ReferenceError',['../classopenvdb_1_1v3__2__0_1_1ReferenceError.html#a183d7d1f8b0b07068ec5a15bf9c44a42',1,'openvdb::v3_2_0::ReferenceError::ReferenceError()'],['../classopenvdb_1_1v3__2__0_1_1ReferenceError.html#ac4aea34dabfc2f3eb473b243d57a989d',1,'openvdb::v3_2_0::ReferenceError::ReferenceError(const std::string &msg)']]], + ['registergrid',['registerGrid',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#adbb97b380f21ed7e812f226385e5267e',1,'openvdb::v3_2_0::GridBase::registerGrid()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a8f3236ca1bbc1955d20cc561466838b1',1,'openvdb::v3_2_0::Grid::registerGrid()']]], + ['registermap',['registerMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapRegistry.html#afe2a28e2edf2e24cc1afa84305b00a27',1,'openvdb::v3_2_0::math::MapRegistry::registerMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a190c94b20fda48ae6342b573ba99ee25',1,'openvdb::v3_2_0::math::AffineMap::registerMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a190c94b20fda48ae6342b573ba99ee25',1,'openvdb::v3_2_0::math::ScaleMap::registerMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#a190c94b20fda48ae6342b573ba99ee25',1,'openvdb::v3_2_0::math::UniformScaleMap::registerMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a190c94b20fda48ae6342b573ba99ee25',1,'openvdb::v3_2_0::math::TranslationMap::registerMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a190c94b20fda48ae6342b573ba99ee25',1,'openvdb::v3_2_0::math::ScaleTranslateMap::registerMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#a190c94b20fda48ae6342b573ba99ee25',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::registerMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a190c94b20fda48ae6342b573ba99ee25',1,'openvdb::v3_2_0::math::UnitaryMap::registerMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a190c94b20fda48ae6342b573ba99ee25',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::registerMap()']]], + ['registertype',['registerType',['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a6e8722817dee3ec246918f5c239b39ed',1,'openvdb::v3_2_0::Metadata::registerType()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a861c2309bc118e7ddd54790980d258e0',1,'openvdb::v3_2_0::TypedMetadata::registerType()']]], + ['reinit',['reinit',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#af12fc201bcb051935b7c3730d8cc6e5e',1,'openvdb::v3_2_0::tools::LevelSetMeasure::reinit(const GridType &grid)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#abd21aa438981f3bd69b8a3d02b316490',1,'openvdb::v3_2_0::tools::LevelSetMeasure::reinit(ManagerType &leafs, Real dx)']]], + ['relativeerror',['relativeError',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1State.html#a7d9f74f0e442eb1bc448ad27678df9ed',1,'openvdb::v3_2_0::math::pcg::State']]], + ['release',['release',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html#af8a84115de3507728d5e19e804529052',1,'openvdb::v3_2_0::tree::ValueAccessorBase']]], + ['releaseaccessor',['releaseAccessor',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a962de7abe940ae19a2264253541e1b2f',1,'openvdb::v3_2_0::tree::Tree::releaseAccessor(ValueAccessorBase< Tree, true > &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a2449241b6e68fb4841220dca09575db7',1,'openvdb::v3_2_0::tree::Tree::releaseAccessor(ValueAccessorBase< const Tree, true > &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ab9eceec9b71042f1e896fe989d90e369',1,'openvdb::v3_2_0::tree::Tree::releaseAccessor(ValueAccessorBase< Tree, false > &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a13ef2b1e74b6e3ae8c0a4bfee21ccfb1',1,'openvdb::v3_2_0::tree::Tree::releaseAccessor(ValueAccessorBase< const Tree, false > &) const ']]], + ['releaseallaccessors',['releaseAllAccessors',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a7cb55df5cf1166cdd2873baa6259658f',1,'openvdb::v3_2_0::tree::Tree']]], + ['releasechildnodes',['ReleaseChildNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ReleaseChildNodes.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['releasechildnodes',['ReleaseChildNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ReleaseChildNodes.html#a4cc1b5faed099462b440b0be12fe78a9',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ReleaseChildNodes']]], + ['releaseleafnodes',['releaseLeafNodes',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal.html#a432a6580aab85fd4d25ef8ec1a750fb7',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['remainder',['Remainder',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aa1c3790086a8a0bb12c2ecd38e91b0f8',1,'openvdb::v3_2_0::math']]], + ['remapindices',['RemapIndices',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RemapIndices.html#a3b89676643795a192e838c12a972c563',1,'openvdb::v3_2_0::tools::particle_atlas_internal::RemapIndices::RemapIndices()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1RemapIndices.html#a25d62c0dcc062941fc3e990805d57242',1,'openvdb::v3_2_0::tools::internal::RemapIndices::RemapIndices()']]], + ['remapindices',['RemapIndices',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1RemapIndices.html',1,'openvdb::v3_2_0::tools::internal']]], + ['remapindices',['RemapIndices',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RemapIndices.html',1,'openvdb::v3_2_0::tools::particle_atlas_internal']]], + ['removeauxbuffers',['removeAuxBuffers',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#affa2e44cef7e0e027e7fcc5a404ad58a',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['removemeta',['removeMeta',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#abdae196275a55f43c1219169c5a2ed59',1,'openvdb::v3_2_0::MetaMap']]], + ['removenotifier',['removeNotifier',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a56e276747aa750f43c878f92d1cfa6c2',1,'openvdb::v3_2_0::io::Queue']]], + ['removeselfintersectingsurface',['RemoveSelfIntersectingSurface',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RemoveSelfIntersectingSurface.html#a563a58efdb054f789a449bfedfa9ba36',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RemoveSelfIntersectingSurface']]], + ['removeselfintersectingsurface',['RemoveSelfIntersectingSurface',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RemoveSelfIntersectingSurface.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['render',['render',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#a82c7363c515e6543e5a499bed1c99e5c',1,'openvdb::v3_2_0::tools::LevelSetRayTracer::render()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#a82c7363c515e6543e5a499bed1c99e5c',1,'openvdb::v3_2_0::tools::VolumeRender::render()']]], + ['renormalize',['Renormalize',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1Renormalize.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['renormalize',['Renormalize',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1Renormalize.html#a72d41b9385a64ee548463af3d904fdb5',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::Renormalize']]], + ['resampletomatch',['resampleToMatch',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ae190c2befe2b252b8d930bd632964ab7',1,'openvdb::v3_2_0::tools::resampleToMatch(const GridType &inGrid, GridType &outGrid, Interrupter &interrupter)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#af4c63aac5d546c4e73dd5f2e8bf734ca',1,'openvdb::v3_2_0::tools::resampleToMatch(const GridType &inGrid, GridType &outGrid)']]], + ['reset',['reset',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1ConstValueIter.html#ad20897c5c8bd47f5d4005989bead0e55',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::ConstValueIter::reset()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a122d66fbfd8cbd1a5d5e19211c8e5743',1,'openvdb::v3_2_0::math::Coord::reset(Int32 x, Int32 y, Int32 z)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a7c317c367ed6796104f368965985e02f',1,'openvdb::v3_2_0::math::Coord::reset(Int32 xyz)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#ad20897c5c8bd47f5d4005989bead0e55',1,'openvdb::v3_2_0::math::CoordBBox::reset()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#afc0bb35ad267c11c23b1f0e165c9af4b',1,'openvdb::v3_2_0::math::CoordBBox::reset(const Coord &min, const Coord &max)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#ab467ddd29bd1cfe0428228846c93216f',1,'openvdb::v3_2_0::math::Ray::reset()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#ad20897c5c8bd47f5d4005989bead0e55',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::reset()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#ad20897c5c8bd47f5d4005989bead0e55',1,'openvdb::v3_2_0::tools::PointIndexIterator::reset()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#ad20897c5c8bd47f5d4005989bead0e55',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator::reset()']]], + ['resetbackground',['resetBackground',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a2c47731038af98ea9445a6a40e47ba8c',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::resetBackground()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a588b2f18ac756153e26c68159c29ca01',1,'openvdb::v3_2_0::tree::InternalNode::resetBackground()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a588b2f18ac756153e26c68159c29ca01',1,'openvdb::v3_2_0::tree::LeafNode::resetBackground()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a4e7ab7ba66ffd76e0d04f73f28beace0',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::resetBackground()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a9548e9dab53d64460533da9b72045748',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::resetBackground()']]], + ['resetchildnode',['resetChildNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a9bb78998d4df933b8c845657ce5ab06e',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['resetquads',['resetQuads',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#a356a63ccc464d244426972ab61203e46',1,'openvdb::v3_2_0::tools::PolygonPool']]], + ['resettocube',['resetToCube',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a833c8f64bc350edb2b756b7b63279ed8',1,'openvdb::v3_2_0::math::CoordBBox']]], + ['resettriangles',['resetTriangles',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#ab4c6f1494bd4b21017329e53e84e52ba',1,'openvdb::v3_2_0::tools::PolygonPool']]], + ['resize',['resize',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a57c0b68de906f5f26118578b1ebfe0c6',1,'openvdb::v3_2_0::math::pcg::Vector::resize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#ab79c0aeb489968c37fc4e85125712293',1,'openvdb::v3_2_0::tools::LevelSetTracker::resize()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#a57b2556ee8993b06958b9c14511fd4ba',1,'openvdb::v3_2_0::tree::NodeList::resize()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a514affe27cc623fc5dccf1bf4648eb2a',1,'openvdb::v3_2_0::util::PagedArray::resize(size_t size)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a9027f383daa2bb7bc9078f5f98858d47',1,'openvdb::v3_2_0::util::PagedArray::resize(size_t size, const ValueType &v)']]], + ['restart',['restart',['../classopenvdb_1_1v3__2__0_1_1util_1_1CpuTimer.html#ab976f9009bf7b1f87ccb98ff657d1175',1,'openvdb::v3_2_0::util::CpuTimer']]], + ['restoreorigin',['RestoreOrigin',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RestoreOrigin.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['restoreorigin',['RestoreOrigin',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RestoreOrigin.html#adffb605da1f0725c74ea61f1ecbcb942',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RestoreOrigin']]], + ['restrict',['restrict',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#aed9bad87df04dfd707e0ed6b6f36e582',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['restrictactivevoxels',['restrictActiveVoxels',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#abf7b3e3d759b72f937fcbca1f23066ba',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['restrictop',['RestrictOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1RestrictOp.html',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['result',['result',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#adc1a533086ff2bead7eb17d58760629e',1,'openvdb::v3_2_0::CombineArgs::result() const '],['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#ac3011f4253a5b8511c7b54508dda0025',1,'openvdb::v3_2_0::CombineArgs::result()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MapAdapter.html#a7740ca0acfffae985a6bdf16a2ed8391',1,'openvdb::v3_2_0::math::MapAdapter::result(const AccessorType &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MapAdapter.html#a24cfb551302712103e01aa5f0e8ad909',1,'openvdb::v3_2_0::math::MapAdapter::result(const StencilType &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISOpMagnitude.html#a02b4f6161b90e3dd16fc6731ee468333',1,'openvdb::v3_2_0::math::ISOpMagnitude::result(const AccessorType &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISOpMagnitude.html#ab332f34f9f7f48fc63f5254b937087b9',1,'openvdb::v3_2_0::math::ISOpMagnitude::result(const StencilType &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1OpMagnitude.html#a5c6e5d8cf331653fdd1b3ef1a9f4e54a',1,'openvdb::v3_2_0::math::OpMagnitude::result(const MapT &map, const AccessorType &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1OpMagnitude.html#a0a9c81ebf6e5c530ff33c449daf47f72',1,'openvdb::v3_2_0::math::OpMagnitude::result(const MapT &map, const StencilType &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradient.html#a783e5f03c307a8fd9565a7602dbd1a80',1,'openvdb::v3_2_0::math::ISGradient::result(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradient.html#a4a5f6fd4efc79f7171b1180d84b45577',1,'openvdb::v3_2_0::math::ISGradient::result(const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradientBiased.html#a42bcaf50e38110c3ba5a2e5aa9d980fe',1,'openvdb::v3_2_0::math::ISGradientBiased::result(const Accessor &grid, const Coord &ijk, const Vec3Bias &V)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradientBiased.html#ad22a470cae1bb4727c9ff02a8b261b42',1,'openvdb::v3_2_0::math::ISGradientBiased::result(const StencilT &stencil, const Vec3Bias &V)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradientNormSqrd.html#a9ccc1179041e072d4862847b472ded98',1,'openvdb::v3_2_0::math::ISGradientNormSqrd::result(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradientNormSqrd.html#a7787aa8d95a2f8d7bfb6ad0d1ea31e75',1,'openvdb::v3_2_0::math::ISGradientNormSqrd::result(const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISLaplacian.html#a9ccc1179041e072d4862847b472ded98',1,'openvdb::v3_2_0::math::ISLaplacian::result(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISLaplacian.html#a7787aa8d95a2f8d7bfb6ad0d1ea31e75',1,'openvdb::v3_2_0::math::ISLaplacian::result(const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISLaplacian_3_01CD__SECOND_01_4.html#a9ccc1179041e072d4862847b472ded98',1,'openvdb::v3_2_0::math::ISLaplacian< CD_SECOND >::result(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISLaplacian_3_01CD__SECOND_01_4.html#a7787aa8d95a2f8d7bfb6ad0d1ea31e75',1,'openvdb::v3_2_0::math::ISLaplacian< CD_SECOND >::result(const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISLaplacian_3_01CD__FOURTH_01_4.html#a9ccc1179041e072d4862847b472ded98',1,'openvdb::v3_2_0::math::ISLaplacian< CD_FOURTH >::result(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISLaplacian_3_01CD__FOURTH_01_4.html#a7787aa8d95a2f8d7bfb6ad0d1ea31e75',1,'openvdb::v3_2_0::math::ISLaplacian< CD_FOURTH >::result(const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISLaplacian_3_01CD__SIXTH_01_4.html#a9ccc1179041e072d4862847b472ded98',1,'openvdb::v3_2_0::math::ISLaplacian< CD_SIXTH >::result(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISLaplacian_3_01CD__SIXTH_01_4.html#a7787aa8d95a2f8d7bfb6ad0d1ea31e75',1,'openvdb::v3_2_0::math::ISLaplacian< CD_SIXTH >::result(const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISDivergence.html#a5cbdb59edc5b2cea9415cf12cd32ea90',1,'openvdb::v3_2_0::math::ISDivergence::result(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISDivergence.html#afd2d09f8ae79e450afa4e9113e1ec2ba',1,'openvdb::v3_2_0::math::ISDivergence::result(const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISCurl.html#a9ccc1179041e072d4862847b472ded98',1,'openvdb::v3_2_0::math::ISCurl::result(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISCurl.html#a7787aa8d95a2f8d7bfb6ad0d1ea31e75',1,'openvdb::v3_2_0::math::ISCurl::result(const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISMeanCurvature.html#a3b26445bac50253b78cac12389b94f47',1,'openvdb::v3_2_0::math::ISMeanCurvature::result(const Accessor &grid, const Coord &ijk, typename Accessor::ValueType &alpha, typename Accessor::ValueType &beta)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISMeanCurvature.html#a963e5529fd72739ec7c2fdacf3770690',1,'openvdb::v3_2_0::math::ISMeanCurvature::result(const StencilT &stencil, typename StencilT::ValueType &alpha, typename StencilT::ValueType &beta)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient.html#ab43bf568ce463eed7cfb5ae2da1dde49',1,'openvdb::v3_2_0::math::Gradient::result(const MapType &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient.html#a7e1f69a88d274e83fd14873f7f0d79e8',1,'openvdb::v3_2_0::math::Gradient::result(const MapType &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01TranslationMap_00_01DiffScheme_01_4.html#a722aba433017a1c6474b8bbec0434c7e',1,'openvdb::v3_2_0::math::Gradient< TranslationMap, DiffScheme >::result(const TranslationMap &, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01TranslationMap_00_01DiffScheme_01_4.html#a923aa2b2359b3d85bf4e90e7ae9521f9',1,'openvdb::v3_2_0::math::Gradient< TranslationMap, DiffScheme >::result(const TranslationMap &, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01UniformScaleMap_00_01CD__2ND_01_4.html#a5cbe14edc0560a6cbdffd8e72c0d3e2d',1,'openvdb::v3_2_0::math::Gradient< UniformScaleMap, CD_2ND >::result(const UniformScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01UniformScaleMap_00_01CD__2ND_01_4.html#ab0ae2b235417cec2852fdb22701e4752',1,'openvdb::v3_2_0::math::Gradient< UniformScaleMap, CD_2ND >::result(const UniformScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01UniformScaleTranslateMap_00_01CD__2ND_01_4.html#afbdcd6bc0859849f711c88b5ab12ad8a',1,'openvdb::v3_2_0::math::Gradient< UniformScaleTranslateMap, CD_2ND >::result(const UniformScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01UniformScaleTranslateMap_00_01CD__2ND_01_4.html#a2ba0337eeedf957d9c231d88467c7363',1,'openvdb::v3_2_0::math::Gradient< UniformScaleTranslateMap, CD_2ND >::result(const UniformScaleTranslateMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01ScaleMap_00_01CD__2ND_01_4.html#afeb6abdb71890ece61aeb95973458c18',1,'openvdb::v3_2_0::math::Gradient< ScaleMap, CD_2ND >::result(const ScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01ScaleMap_00_01CD__2ND_01_4.html#acf980180661034304dd900550a42c8a3',1,'openvdb::v3_2_0::math::Gradient< ScaleMap, CD_2ND >::result(const ScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01ScaleTranslateMap_00_01CD__2ND_01_4.html#af4495016c6dbaff80f069f3864db8dca',1,'openvdb::v3_2_0::math::Gradient< ScaleTranslateMap, CD_2ND >::result(const ScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01ScaleTranslateMap_00_01CD__2ND_01_4.html#a6c6a77d7e9cc74da8143395fa7fb2d98',1,'openvdb::v3_2_0::math::Gradient< ScaleTranslateMap, CD_2ND >::result(const ScaleTranslateMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientBiased.html#a37e574f779ebfc096f16f7cef3a1efbf',1,'openvdb::v3_2_0::math::GradientBiased::result(const MapType &map, const Accessor &grid, const Coord &ijk, const Vec3< typename Accessor::ValueType > &V)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientBiased.html#ae69860e3cf82e0979240d83f8114d20b',1,'openvdb::v3_2_0::math::GradientBiased::result(const MapType &map, const StencilT &stencil, const Vec3< typename StencilT::ValueType > &V)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientNormSqrd.html#ad5ceea56eaf182996fb545565aa38052',1,'openvdb::v3_2_0::math::GradientNormSqrd::result(const MapType &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientNormSqrd.html#a85a5736e845c269f4b3e29b0517e79ac',1,'openvdb::v3_2_0::math::GradientNormSqrd::result(const MapType &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientNormSqrd_3_01UniformScaleMap_00_01GradScheme_01_4.html#af85554c6e06ec49eacf9b91a068e3760',1,'openvdb::v3_2_0::math::GradientNormSqrd< UniformScaleMap, GradScheme >::result(const UniformScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientNormSqrd_3_01UniformScaleMap_00_01GradScheme_01_4.html#aef9e3d9814ac317c9c8884ba9830a05b',1,'openvdb::v3_2_0::math::GradientNormSqrd< UniformScaleMap, GradScheme >::result(const UniformScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientNormSqrd_3_01UniformScaleTranslateMap_00_01GradScheme_01_4.html#a49f223335fc56375010a37441784aceb',1,'openvdb::v3_2_0::math::GradientNormSqrd< UniformScaleTranslateMap, GradScheme >::result(const UniformScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientNormSqrd_3_01UniformScaleTranslateMap_00_01GradScheme_01_4.html#a1a91a7680bcee954b64a01da30f092fa',1,'openvdb::v3_2_0::math::GradientNormSqrd< UniformScaleTranslateMap, GradScheme >::result(const UniformScaleTranslateMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence.html#a49f7b4a913dac8dac7ad0989ed363af9',1,'openvdb::v3_2_0::math::Divergence::result(const MapType &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence.html#a7e8bf7c1a18b13e72d81e2567fdcf85f',1,'openvdb::v3_2_0::math::Divergence::result(const MapType &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01TranslationMap_00_01DiffScheme_01_4.html#ab4d587fc575b14a96dca4dceac013a63',1,'openvdb::v3_2_0::math::Divergence< TranslationMap, DiffScheme >::result(const TranslationMap &, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01TranslationMap_00_01DiffScheme_01_4.html#a2bb33f7d727c239627af67069a1851dd',1,'openvdb::v3_2_0::math::Divergence< TranslationMap, DiffScheme >::result(const TranslationMap &, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01UniformScaleMap_00_01DiffScheme_01_4.html#a38600dbfb8695ddf9a7200adb1c17ea1',1,'openvdb::v3_2_0::math::Divergence< UniformScaleMap, DiffScheme >::result(const UniformScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01UniformScaleMap_00_01DiffScheme_01_4.html#ab70c8585f338c68592234661074f7621',1,'openvdb::v3_2_0::math::Divergence< UniformScaleMap, DiffScheme >::result(const UniformScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01UniformScaleTranslateMap_00_01DiffScheme_01_4.html#a8947d42fa099e098d5e92703093da883',1,'openvdb::v3_2_0::math::Divergence< UniformScaleTranslateMap, DiffScheme >::result(const UniformScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01UniformScaleTranslateMap_00_01DiffScheme_01_4.html#a585eef8cf3d4afeb366824e860ef9617',1,'openvdb::v3_2_0::math::Divergence< UniformScaleTranslateMap, DiffScheme >::result(const UniformScaleTranslateMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01UniformScaleMap_00_01CD__2ND_01_4.html#a38600dbfb8695ddf9a7200adb1c17ea1',1,'openvdb::v3_2_0::math::Divergence< UniformScaleMap, CD_2ND >::result(const UniformScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01UniformScaleMap_00_01CD__2ND_01_4.html#ab70c8585f338c68592234661074f7621',1,'openvdb::v3_2_0::math::Divergence< UniformScaleMap, CD_2ND >::result(const UniformScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01UniformScaleTranslateMap_00_01CD__2ND_01_4.html#a8947d42fa099e098d5e92703093da883',1,'openvdb::v3_2_0::math::Divergence< UniformScaleTranslateMap, CD_2ND >::result(const UniformScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01UniformScaleTranslateMap_00_01CD__2ND_01_4.html#a585eef8cf3d4afeb366824e860ef9617',1,'openvdb::v3_2_0::math::Divergence< UniformScaleTranslateMap, CD_2ND >::result(const UniformScaleTranslateMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01ScaleMap_00_01DiffScheme_01_4.html#aa75c6592282d0a683a5b14d734e96ca0',1,'openvdb::v3_2_0::math::Divergence< ScaleMap, DiffScheme >::result(const ScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01ScaleMap_00_01DiffScheme_01_4.html#acc226e9ff5203e3d45bfef13159f561d',1,'openvdb::v3_2_0::math::Divergence< ScaleMap, DiffScheme >::result(const ScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01ScaleTranslateMap_00_01DiffScheme_01_4.html#adbef10750e930b5576ff690a6281101e',1,'openvdb::v3_2_0::math::Divergence< ScaleTranslateMap, DiffScheme >::result(const ScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01ScaleTranslateMap_00_01DiffScheme_01_4.html#a28de0945f63d0193598321b1e72c5ef6',1,'openvdb::v3_2_0::math::Divergence< ScaleTranslateMap, DiffScheme >::result(const ScaleTranslateMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01ScaleMap_00_01CD__2ND_01_4.html#aa75c6592282d0a683a5b14d734e96ca0',1,'openvdb::v3_2_0::math::Divergence< ScaleMap, CD_2ND >::result(const ScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01ScaleMap_00_01CD__2ND_01_4.html#acc226e9ff5203e3d45bfef13159f561d',1,'openvdb::v3_2_0::math::Divergence< ScaleMap, CD_2ND >::result(const ScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01ScaleTranslateMap_00_01CD__2ND_01_4.html#adbef10750e930b5576ff690a6281101e',1,'openvdb::v3_2_0::math::Divergence< ScaleTranslateMap, CD_2ND >::result(const ScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01ScaleTranslateMap_00_01CD__2ND_01_4.html#a28de0945f63d0193598321b1e72c5ef6',1,'openvdb::v3_2_0::math::Divergence< ScaleTranslateMap, CD_2ND >::result(const ScaleTranslateMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl.html#ad5ceea56eaf182996fb545565aa38052',1,'openvdb::v3_2_0::math::Curl::result(const MapType &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl.html#a85a5736e845c269f4b3e29b0517e79ac',1,'openvdb::v3_2_0::math::Curl::result(const MapType &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl_3_01UniformScaleMap_00_01DiffScheme_01_4.html#af85554c6e06ec49eacf9b91a068e3760',1,'openvdb::v3_2_0::math::Curl< UniformScaleMap, DiffScheme >::result(const UniformScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl_3_01UniformScaleMap_00_01DiffScheme_01_4.html#aef9e3d9814ac317c9c8884ba9830a05b',1,'openvdb::v3_2_0::math::Curl< UniformScaleMap, DiffScheme >::result(const UniformScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl_3_01UniformScaleTranslateMap_00_01DiffScheme_01_4.html#a49f223335fc56375010a37441784aceb',1,'openvdb::v3_2_0::math::Curl< UniformScaleTranslateMap, DiffScheme >::result(const UniformScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl_3_01UniformScaleTranslateMap_00_01DiffScheme_01_4.html#a1a91a7680bcee954b64a01da30f092fa',1,'openvdb::v3_2_0::math::Curl< UniformScaleTranslateMap, DiffScheme >::result(const UniformScaleTranslateMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl_3_01UniformScaleMap_00_01CD__2ND_01_4.html#af85554c6e06ec49eacf9b91a068e3760',1,'openvdb::v3_2_0::math::Curl< UniformScaleMap, CD_2ND >::result(const UniformScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl_3_01UniformScaleMap_00_01CD__2ND_01_4.html#aef9e3d9814ac317c9c8884ba9830a05b',1,'openvdb::v3_2_0::math::Curl< UniformScaleMap, CD_2ND >::result(const UniformScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl_3_01UniformScaleTranslateMap_00_01CD__2ND_01_4.html#a49f223335fc56375010a37441784aceb',1,'openvdb::v3_2_0::math::Curl< UniformScaleTranslateMap, CD_2ND >::result(const UniformScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl_3_01UniformScaleTranslateMap_00_01CD__2ND_01_4.html#a1a91a7680bcee954b64a01da30f092fa',1,'openvdb::v3_2_0::math::Curl< UniformScaleTranslateMap, CD_2ND >::result(const UniformScaleTranslateMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian.html#ad5ceea56eaf182996fb545565aa38052',1,'openvdb::v3_2_0::math::Laplacian::result(const MapType &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian.html#a85a5736e845c269f4b3e29b0517e79ac',1,'openvdb::v3_2_0::math::Laplacian::result(const MapType &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01TranslationMap_00_01DiffScheme_01_4.html#a0cf64dfbabd4d9ddd676febeff60dfd2',1,'openvdb::v3_2_0::math::Laplacian< TranslationMap, DiffScheme >::result(const TranslationMap &, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01TranslationMap_00_01DiffScheme_01_4.html#a20a722726ef7560fb862dea6cc76496e',1,'openvdb::v3_2_0::math::Laplacian< TranslationMap, DiffScheme >::result(const TranslationMap &, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01UnitaryMap_00_01DiffScheme_01_4.html#a02c3b2bd712d3b2d2d5503aa5aca0f85',1,'openvdb::v3_2_0::math::Laplacian< UnitaryMap, DiffScheme >::result(const UnitaryMap &, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01UnitaryMap_00_01DiffScheme_01_4.html#af6e460af37f14055c71b6eab1edc1a8b',1,'openvdb::v3_2_0::math::Laplacian< UnitaryMap, DiffScheme >::result(const UnitaryMap &, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01UniformScaleMap_00_01DiffScheme_01_4.html#af85554c6e06ec49eacf9b91a068e3760',1,'openvdb::v3_2_0::math::Laplacian< UniformScaleMap, DiffScheme >::result(const UniformScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01UniformScaleMap_00_01DiffScheme_01_4.html#aef9e3d9814ac317c9c8884ba9830a05b',1,'openvdb::v3_2_0::math::Laplacian< UniformScaleMap, DiffScheme >::result(const UniformScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01UniformScaleTranslateMap_00_01DiffScheme_01_4.html#a49f223335fc56375010a37441784aceb',1,'openvdb::v3_2_0::math::Laplacian< UniformScaleTranslateMap, DiffScheme >::result(const UniformScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01UniformScaleTranslateMap_00_01DiffScheme_01_4.html#a1a91a7680bcee954b64a01da30f092fa',1,'openvdb::v3_2_0::math::Laplacian< UniformScaleTranslateMap, DiffScheme >::result(const UniformScaleTranslateMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01ScaleMap_00_01DiffScheme_01_4.html#a4eaa194e3c6fce81f458acb095a0b293',1,'openvdb::v3_2_0::math::Laplacian< ScaleMap, DiffScheme >::result(const ScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01ScaleMap_00_01DiffScheme_01_4.html#af6eb84e600df27459485219f2c7d08ed',1,'openvdb::v3_2_0::math::Laplacian< ScaleMap, DiffScheme >::result(const ScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01ScaleTranslateMap_00_01DiffScheme_01_4.html#a50c93fae991fa3fd7b9afb840543de38',1,'openvdb::v3_2_0::math::Laplacian< ScaleTranslateMap, DiffScheme >::result(const ScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01ScaleTranslateMap_00_01DiffScheme_01_4.html#a8faea6f3599c6be18783eb2b0192f8af',1,'openvdb::v3_2_0::math::Laplacian< ScaleTranslateMap, DiffScheme >::result(const ScaleTranslateMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1CPT.html#add4739a17a98839933fa52784ef5b179',1,'openvdb::v3_2_0::math::CPT::result(const MapType &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1CPT.html#a81f0b212ff17cdd88bf1ebfcdb076df9',1,'openvdb::v3_2_0::math::CPT::result(const MapType &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1CPT__RANGE.html#a23af0077968e9d5243cd8483b770b99f',1,'openvdb::v3_2_0::math::CPT_RANGE::result(const MapType &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1CPT__RANGE.html#ad691151eb0a45aa841174cadf385daa7',1,'openvdb::v3_2_0::math::CPT_RANGE::result(const MapType &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature.html#ad5ceea56eaf182996fb545565aa38052',1,'openvdb::v3_2_0::math::MeanCurvature::result(const MapType &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature.html#ab7d6d633c013798c798865828298e403',1,'openvdb::v3_2_0::math::MeanCurvature::result(const MapType &map, const StencilT stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01TranslationMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html#a0cf64dfbabd4d9ddd676febeff60dfd2',1,'openvdb::v3_2_0::math::MeanCurvature< TranslationMap, DiffScheme2, DiffScheme1 >::result(const TranslationMap &, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01TranslationMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html#a20a722726ef7560fb862dea6cc76496e',1,'openvdb::v3_2_0::math::MeanCurvature< TranslationMap, DiffScheme2, DiffScheme1 >::result(const TranslationMap &, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01UniformScaleMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html#af85554c6e06ec49eacf9b91a068e3760',1,'openvdb::v3_2_0::math::MeanCurvature< UniformScaleMap, DiffScheme2, DiffScheme1 >::result(const UniformScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01UniformScaleMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html#aef9e3d9814ac317c9c8884ba9830a05b',1,'openvdb::v3_2_0::math::MeanCurvature< UniformScaleMap, DiffScheme2, DiffScheme1 >::result(const UniformScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01UniformScaleTranslateMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html#a49f223335fc56375010a37441784aceb',1,'openvdb::v3_2_0::math::MeanCurvature< UniformScaleTranslateMap, DiffScheme2, DiffScheme1 >::result(const UniformScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01UniformScaleTranslateMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html#a1a91a7680bcee954b64a01da30f092fa',1,'openvdb::v3_2_0::math::MeanCurvature< UniformScaleTranslateMap, DiffScheme2, DiffScheme1 >::result(const UniformScaleTranslateMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude_1_1OpT.html#ad7955cc729c44f5c3619c988026abd3c',1,'openvdb::v3_2_0::tools::Magnitude::OpT::result()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Normalize_1_1OpT.html#ad7955cc729c44f5c3619c988026abd3c',1,'openvdb::v3_2_0::tools::Normalize::OpT::result()']]], + ['resultisactive',['resultIsActive',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a20ace609a15f11637a83c98956a456a5',1,'openvdb::v3_2_0::CombineArgs']]], + ['resultleafnodetype',['ResultLeafNodeType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#a60e7707bf58a6e2e68dbce787b37c0d7',1,'openvdb::v3_2_0::tools::SparseExtractor::ResultLeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#a60e7707bf58a6e2e68dbce787b37c0d7',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor::ResultLeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ExtractAll.html#a60e7707bf58a6e2e68dbce787b37c0d7',1,'openvdb::v3_2_0::tools::ExtractAll::ResultLeafNodeType()']]], + ['resulttreetype',['ResultTreeType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#a112dd01f9a043c86fcb3b364713a1340',1,'openvdb::v3_2_0::tools::SparseExtractor::ResultTreeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#aa56d457d9faa1117e1f8d5f4e55bffc1',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor::ResultTreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ExtractAll.html#aa56d457d9faa1117e1f8d5f4e55bffc1',1,'openvdb::v3_2_0::tools::ExtractAll::ResultTreeType()']]], + ['resultvaluetype',['ResultValueType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#afb8f7ff06ef34b92309df959428d6926',1,'openvdb::v3_2_0::tools::SparseExtractor::ResultValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#afb8f7ff06ef34b92309df959428d6926',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor::ResultValueType()']]], + ['returnvalue',['ReturnValue',['../structopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1ReturnValue.html',1,'openvdb::v3_2_0::math::internal']]], + ['revert',['REVERT',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1Scheme.html#a28fd66b0310514194a2fb1d2473e3e29a0ad105830a21e547b8f07c8d466b77bf',1,'openvdb::v3_2_0::tools::Scheme']]], + ['rgba',['RGBA',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html',1,'openvdb::v3_2_0::tools::Film']]], + ['rgba',['RGBA',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#af0f862e20c8d59b3ae245c662f137f61',1,'openvdb::v3_2_0::tools::Film::RGBA::RGBA()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#a5a24ee9e3becfba8b30b5c3cb5cc0ae2',1,'openvdb::v3_2_0::tools::Film::RGBA::RGBA(ValueT intensity)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#aa1d9b368af297fd7f40e0ebbedbd2675',1,'openvdb::v3_2_0::tools::Film::RGBA::RGBA(ValueT _r, ValueT _g, ValueT _b, ValueT _a=static_cast< ValueT >(1.0))']]], + ['rk3',['RK3',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1Scheme.html#a4010e0b09fbf6a975c479833d3001f42a9775c41ec65add712b9d4ada46e38672',1,'openvdb::v3_2_0::tools::Scheme']]], + ['rk4',['RK4',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1Scheme.html#a4010e0b09fbf6a975c479833d3001f42a5df275d4d2ef6e60437567adc263d488',1,'openvdb::v3_2_0::tools::Scheme']]], + ['root',['root',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a6dcdb35119698a5e8ce0059ae57fa887',1,'openvdb::v3_2_0::tree::LeafManager::root() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a1969dd5ae7c1715c8abcfcd82aeeff85',1,'openvdb::v3_2_0::tree::LeafManager::root()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#a6dcdb35119698a5e8ce0059ae57fa887',1,'openvdb::v3_2_0::tree::NodeManager::root()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#a6dcdb35119698a5e8ce0059ae57fa887',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::root()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a6dcdb35119698a5e8ce0059ae57fa887',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::root()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a6dcdb35119698a5e8ce0059ae57fa887',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::root()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a6dcdb35119698a5e8ce0059ae57fa887',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::root()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a6dcdb35119698a5e8ce0059ae57fa887',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::root()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a1969dd5ae7c1715c8abcfcd82aeeff85',1,'openvdb::v3_2_0::tree::Tree::root()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a6dcdb35119698a5e8ce0059ae57fa887',1,'openvdb::v3_2_0::tree::Tree::root() const ']]], + ['root_5fdepth',['ROOT_DEPTH',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a2039e543461c0875b463385909d98d2d',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::ROOT_DEPTH()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a2039e543461c0875b463385909d98d2d',1,'openvdb::v3_2_0::tree::NodeIteratorBase::ROOT_DEPTH()']]], + ['root_5flevel',['ROOT_LEVEL',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#ac882f329d7bac2f6ead8bd6eb878a1fd',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::ROOT_LEVEL()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#ac882f329d7bac2f6ead8bd6eb878a1fd',1,'openvdb::v3_2_0::tree::NodeIteratorBase::ROOT_LEVEL()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#ac882f329d7bac2f6ead8bd6eb878a1fd',1,'openvdb::v3_2_0::tree::LeafIteratorBase::ROOT_LEVEL()']]], + ['rootitert',['RootIterT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#abd99255809df525cc59410399f36682b',1,'openvdb::v3_2_0::tree::NodeIteratorBase::RootIterT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#abd99255809df525cc59410399f36682b',1,'openvdb::v3_2_0::tree::LeafIteratorBase::RootIterT()']]], + ['rootitertraits',['RootIterTraits',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#aa7596d9d02cec346533eed3baedd7ef0',1,'openvdb::v3_2_0::tree::NodeIteratorBase::RootIterTraits()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#aa7596d9d02cec346533eed3baedd7ef0',1,'openvdb::v3_2_0::tree::LeafIteratorBase::RootIterTraits()']]], + ['rootnode',['RootNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html',1,'openvdb::v3_2_0::tree']]], + ['rootnode',['RootNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#aff4f5e7209d5ad66394519639bd989f8',1,'openvdb::v3_2_0::tree::RootNode::RootNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#aff4f5e7209d5ad66394519639bd989f8',1,'openvdb::v3_2_0::tree::ValueAccessor::RootNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#aff4f5e7209d5ad66394519639bd989f8',1,'openvdb::v3_2_0::tree::ValueAccessor1::RootNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#aff4f5e7209d5ad66394519639bd989f8',1,'openvdb::v3_2_0::tree::ValueAccessor2::RootNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#aff4f5e7209d5ad66394519639bd989f8',1,'openvdb::v3_2_0::tree::ValueAccessor3::RootNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#aa5dbd319ba70f5491e4326ec341273d8',1,'openvdb::v3_2_0::tree::RootNode::RootNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a962d5c3401f8c0a8f60d71b141e7fb3b',1,'openvdb::v3_2_0::tree::RootNode::RootNode(const ValueType &background)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a08562b54850ff29ef167b7a1d1cfadd4',1,'openvdb::v3_2_0::tree::RootNode::RootNode(const RootNode &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ad4048d463e26625beb9e08adbd50528e',1,'openvdb::v3_2_0::tree::RootNode::RootNode(const RootNode< OtherChildType > &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ab6e523d80a6b90c3b63ef1c40939c7d5',1,'openvdb::v3_2_0::tree::RootNode::RootNode(const RootNode< OtherChildType > &other, const ValueType &background, const ValueType &foreground, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a1376f67d16d5de9a4d152a45f863f0cf',1,'openvdb::v3_2_0::tree::RootNode::RootNode(const RootNode< OtherChildType > &other, const ValueType &background, TopologyCopy)']]], + ['rootnode_2eh',['RootNode.h',['../RootNode_8h.html',1,'']]], + ['rootnodecombinehelper',['RootNodeCombineHelper',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a733720747a659027d37f72bd461207eb',1,'openvdb::v3_2_0::tree::RootNode']]], + ['rootnodecombinehelper',['RootNodeCombineHelper',['../structopenvdb_1_1v3__2__0_1_1tree_1_1RootNodeCombineHelper.html',1,'openvdb::v3_2_0::tree']]], + ['rootnodecombinehelper_3c_20combineop_2c_20roott_2c_20otherroott_2c_20true_20_3e',['RootNodeCombineHelper< CombineOp, RootT, OtherRootT, true >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1RootNodeCombineHelper_3_01CombineOp_00_01RootT_00_01OtherRootT_00_01true_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['rootnodecopyhelper',['RootNodeCopyHelper',['../structopenvdb_1_1v3__2__0_1_1tree_1_1RootNodeCopyHelper.html',1,'openvdb::v3_2_0::tree']]], + ['rootnodecopyhelper',['RootNodeCopyHelper',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#adac3b94dde9b204ff858644761361a95',1,'openvdb::v3_2_0::tree::RootNode']]], + ['rootnodecopyhelper_3c_20roott_2c_20otherroott_2c_20true_20_3e',['RootNodeCopyHelper< RootT, OtherRootT, true >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1RootNodeCopyHelper_3_01RootT_00_01OtherRootT_00_01true_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['rootnodemask',['RootNodeMask',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a130a9c45de181af1ccd5488ffd5e561f',1,'openvdb::v3_2_0::util::RootNodeMask::RootNodeMask()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#adcc7dbcd1b00dbd2db878a7748e6dce1',1,'openvdb::v3_2_0::util::RootNodeMask::RootNodeMask(Index32 bit_size)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a5de94a612f982b0a91e9861aae7607d3',1,'openvdb::v3_2_0::util::RootNodeMask::RootNodeMask(const RootNodeMask &B)']]], + ['rootnodemask',['RootNodeMask',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html',1,'openvdb::v3_2_0::util']]], + ['rootnodet',['RootNodeT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a23ad49b8cabe9f044a0820545616e8d6',1,'openvdb::v3_2_0::tree::NodeIteratorBase::RootNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#a23ad49b8cabe9f044a0820545616e8d6',1,'openvdb::v3_2_0::tree::LeafIteratorBase::RootNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a0cfb0158f94bbc0c07766058ac478e89',1,'openvdb::v3_2_0::tree::ValueAccessor::RootNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a0cfb0158f94bbc0c07766058ac478e89',1,'openvdb::v3_2_0::tree::ValueAccessor0::RootNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a0cfb0158f94bbc0c07766058ac478e89',1,'openvdb::v3_2_0::tree::ValueAccessor1::RootNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a0cfb0158f94bbc0c07766058ac478e89',1,'openvdb::v3_2_0::tree::ValueAccessor2::RootNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a0cfb0158f94bbc0c07766058ac478e89',1,'openvdb::v3_2_0::tree::ValueAccessor3::RootNodeT()']]], + ['rootnodetype',['RootNodeType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildPrimarySegment.html#a6eddacb347513c1a0b76ee5c77527aed',1,'openvdb::v3_2_0::tools::composite::BuildPrimarySegment::RootNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildSecondarySegment.html#a6eddacb347513c1a0b76ee5c77527aed',1,'openvdb::v3_2_0::tools::composite::BuildSecondarySegment::RootNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FloodFillSign.html#a6eddacb347513c1a0b76ee5c77527aed',1,'openvdb::v3_2_0::tools::level_set_util_internal::FloodFillSign::RootNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a5d77fefeb4e16e1bea6e770ab2175b56',1,'openvdb::v3_2_0::tree::LeafManager::RootNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#a7d08386e86e19d1a30b4f25d07aa0f4f',1,'openvdb::v3_2_0::tree::NodeManager::RootNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#a7d08386e86e19d1a30b4f25d07aa0f4f',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::RootNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a7d08386e86e19d1a30b4f25d07aa0f4f',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::RootNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a7d08386e86e19d1a30b4f25d07aa0f4f',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::RootNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a7d08386e86e19d1a30b4f25d07aa0f4f',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::RootNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a7d08386e86e19d1a30b4f25d07aa0f4f',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::RootNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#abc44cb0c032a80ed68bf3b9f782a6831',1,'openvdb::v3_2_0::tree::Tree::RootNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#aacd5236487edef4de7151627e6c0cef0',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::RootNodeType()']]], + ['roott',['RootT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeBackgroundOp.html#ae56cc657f7550cb1e4ecf8cfea6d2d93',1,'openvdb::v3_2_0::tools::ChangeBackgroundOp::RootT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeLevelSetBackgroundOp.html#ae56cc657f7550cb1e4ecf8cfea6d2d93',1,'openvdb::v3_2_0::tools::ChangeLevelSetBackgroundOp::RootT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1InactivePruneOp.html#af2b2500a72e5d85e7acf2347db844938',1,'openvdb::v3_2_0::tools::InactivePruneOp::RootT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1TolerancePruneOp.html#af2b2500a72e5d85e7acf2347db844938',1,'openvdb::v3_2_0::tools::TolerancePruneOp::RootT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetPruneOp.html#af2b2500a72e5d85e7acf2347db844938',1,'openvdb::v3_2_0::tools::LevelSetPruneOp::RootT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SignedFloodFillOp.html#ae56cc657f7550cb1e4ecf8cfea6d2d93',1,'openvdb::v3_2_0::tools::SignedFloodFillOp::RootT()']]], + ['roottype',['RootType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a8c2dad3c864cab35a447dff0e4a9a96f',1,'openvdb::v3_2_0::tools::VolumeRayIntersector']]], + ['rotatevector',['rotateVector',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#abaccd7726fb18ede19ef59cfef81cd95',1,'openvdb::v3_2_0::math::Quat']]], + ['rotation',['rotation',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aa47fd79773191e610a90ba1843ba0bef',1,'openvdb::v3_2_0::math::rotation(const Quat< typename MatType::value_type > &q, typename MatType::value_type eps=static_cast< typename MatType::value_type >(1.0e-8))'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a750c956a3703a57758da3b798eabdf20',1,'openvdb::v3_2_0::math::rotation(Axis axis, typename MatType::value_type angle)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ad3579880e5cce1c8e6a61c3facbcf2c6',1,'openvdb::v3_2_0::math::rotation(const Vec3< typename MatType::value_type > &_axis, typename MatType::value_type angle)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a902dae5c6ec2625a383892f96185892f',1,'openvdb::v3_2_0::math::rotation(const Vec3< typename MatType::value_type > &_v1, const Vec3< typename MatType::value_type > &_v2, typename MatType::value_type eps=1.0e-8)']]], + ['rotationorder',['RotationOrder',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af3d74c777e523f2725cdf87c15a4b5bc',1,'openvdb::v3_2_0::math']]], + ['round',['round',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a1649d8d4ce055207126587a34e16e812',1,'openvdb::v3_2_0::math::Coord::round()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1a3a42183a43640ec614ad1160b29865',1,'openvdb::v3_2_0::math::Round(float x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab3ec95b1ae65e00aba931501bb73a59a',1,'openvdb::v3_2_0::math::Round(double x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aebb424202d89bd7e39996d488cfaa744',1,'openvdb::v3_2_0::math::Round(long double x)']]], + ['rounddown',['RoundDown',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a372b8cc1d385407dda78f951faa0cdb4',1,'openvdb::v3_2_0::math::RoundDown(float x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a12cf2899837ca0e2fe7c0a2cecc87aa2',1,'openvdb::v3_2_0::math::RoundDown(double x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#abc519eefa680417f68f92c8285c07475',1,'openvdb::v3_2_0::math::RoundDown(long double x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aeb192c8b870a72cd4abf36755a0f033b',1,'openvdb::v3_2_0::math::RoundDown(Type x, Type base)']]], + ['roundup',['RoundUp',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4d78a8a9578c4016ea22cec6ec0c0061',1,'openvdb::v3_2_0::math::RoundUp(float x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aca5b1f4166bdd5e42942366b471a451b',1,'openvdb::v3_2_0::math::RoundUp(double x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ad4279490a8d34f1712e6020dc2974e66',1,'openvdb::v3_2_0::math::RoundUp(long double x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aba2b9503b52d7ada2bdda920c2829768',1,'openvdb::v3_2_0::math::RoundUp(Type x, Type base)']]], + ['roundvec3',['roundVec3',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1local__util.html#ad7b06ff18ff833d6a561371e791732f2',1,'openvdb::v3_2_0::tools::local_util']]], + ['row',['row',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a719c56136db619c38bc1bd057b0c5266',1,'openvdb::v3_2_0::math::Mat3::row()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a6918ef84a51ab39533d827f31203c756',1,'openvdb::v3_2_0::math::Mat4::row()']]], + ['roweditor',['RowEditor',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1RowEditor.html',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix']]], + ['roweditor',['RowEditor',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1RowEditor.html#aef1041dcc1f00817f2cc52a88322ede1',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::RowEditor']]], + ['run',['run',['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1CopyLeafNodes.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::clip_internal::CopyLeafNodes::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1GenEdgeData.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::GenEdgeData::run()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1RestrictOp.html#a9079a05d84c3360905c861af9ad33755',1,'openvdb::v3_2_0::tools::MultiResGrid::RestrictOp::run()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1ProlongateOp.html#af6f8cf5a9ad5eb3dc1f03bda59797b1d',1,'openvdb::v3_2_0::tools::MultiResGrid::ProlongateOp::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::SignData::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPoints.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::GenPoints::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPolygons.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::GenPolygons::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartGen.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::PartGen::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenSeamMask.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::GenSeamMask::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1FlagUsedPoints.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::FlagUsedPoints::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1RemapIndices.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::RemapIndices::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MovePoints.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::MovePoints::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTopologyMask.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::GenTopologyMask::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenBoundaryMask.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::GenBoundaryMask::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTileMask.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::GenTileMask::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1LeafBS.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::LeafBS::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1NodeBS.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::NodeBS::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1ClosestPointDist.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::ClosestPointDist::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UpdatePoints.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::UpdatePoints::run()']]], + ['rungekutta',['rungeKutta',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocityIntegrator.html#a1a38079a6673a1f008c9831c411cfeb7',1,'openvdb::v3_2_0::tools::VelocityIntegrator']]], + ['runparallel',['runParallel',['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveVoxelValues.html#a63ad06a0041cb535df105cf2f445a73c',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveVoxelValues::runParallel()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveTileValues.html#a8b104a8638dd272e083cfecc2e25ec55',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveTileValues::runParallel()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PointListTransform.html#a63ad06a0041cb535df105cf2f445a73c',1,'openvdb::v3_2_0::tools::internal::PointListTransform::runParallel()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PrimCpy.html#a63ad06a0041cb535df105cf2f445a73c',1,'openvdb::v3_2_0::tools::internal::PrimCpy::runParallel()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1ErodeVoxelsOp.html#a26fd0c672c9ba2dfb45daea148ff7fde',1,'openvdb::v3_2_0::tools::Morphology::ErodeVoxelsOp::runParallel()']]], + ['runserial',['runSerial',['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveVoxelValues.html#a1a38dc33eda2e5e7caa8e23ef4c69130',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveVoxelValues::runSerial()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveTileValues.html#ac48517e0a669066817d2075c5549c6a2',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveTileValues::runSerial()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PointListTransform.html#a1a38dc33eda2e5e7caa8e23ef4c69130',1,'openvdb::v3_2_0::tools::internal::PointListTransform::runSerial()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PrimCpy.html#a1a38dc33eda2e5e7caa8e23ef4c69130',1,'openvdb::v3_2_0::tools::internal::PrimCpy::runSerial()']]], + ['runtimeerror',['RuntimeError',['../classopenvdb_1_1v3__2__0_1_1RuntimeError.html',1,'openvdb::v3_2_0']]], + ['runtimeerror',['RuntimeError',['../classopenvdb_1_1v3__2__0_1_1RuntimeError.html#ab8c4e21e64d3bc7c983f82c7ed2717ef',1,'openvdb::v3_2_0::RuntimeError::RuntimeError()'],['../classopenvdb_1_1v3__2__0_1_1RuntimeError.html#a806ac2d117d18c7d18ee03d55ce8eb70',1,'openvdb::v3_2_0::RuntimeError::RuntimeError(const std::string &msg)']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_14.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_14.html new file mode 100644 index 00000000..8424e0c5 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_14.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_14.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_14.js new file mode 100644 index 00000000..a0f31e7a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_14.js @@ -0,0 +1,374 @@ +var searchData= +[ + ['s',['s',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DeepCopy.html#ab157c7a347098753bf74f90dd835b323',1,'openvdb::v3_2_0::tree::InternalNode::DeepCopy::s()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy1.html#ab157c7a347098753bf74f90dd835b323',1,'openvdb::v3_2_0::tree::InternalNode::TopologyCopy1::s()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy2.html#ab157c7a347098753bf74f90dd835b323',1,'openvdb::v3_2_0::tree::InternalNode::TopologyCopy2::s()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyUnion.html#ab157c7a347098753bf74f90dd835b323',1,'openvdb::v3_2_0::tree::InternalNode::TopologyUnion::s()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyIntersection.html#ab157c7a347098753bf74f90dd835b323',1,'openvdb::v3_2_0::tree::InternalNode::TopologyIntersection::s()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyDifference.html#ab157c7a347098753bf74f90dd835b323',1,'openvdb::v3_2_0::tree::InternalNode::TopologyDifference::s()']]], + ['sadaptable',['sAdaptable',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a4cb1143a21a18b6b91dcf29cca8cd836',1,'openvdb::v3_2_0::tools::internal']]], + ['sambiguousface',['sAmbiguousFace',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a23f508f76f4b48123161151698c99780',1,'openvdb::v3_2_0::tools::internal']]], + ['sameconfiguration',['SameConfiguration',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1SameConfiguration.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['sameconfiguration',['SameConfiguration',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1SameConfiguration.html',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >']]], + ['sameconfiguration',['SameConfiguration',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1SameConfiguration.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['sameconfiguration',['SameConfiguration',['../structopenvdb_1_1v3__2__0_1_1tree_1_1RootNode_1_1SameConfiguration.html',1,'openvdb::v3_2_0::tree::RootNode']]], + ['sameconfiguration',['SameConfiguration',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1SameConfiguration.html',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >']]], + ['sameinternalconfig',['SameInternalConfig',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameInternalConfig.html',1,'openvdb::v3_2_0::tree']]], + ['sameinternalconfig_3c_20childt1_2c_20dim1_2c_20internalnode_3c_20childt2_2c_20dim1_20_3e_20_3e',['SameInternalConfig< ChildT1, Dim1, InternalNode< ChildT2, Dim1 > >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameInternalConfig_3_01ChildT1_00_01Dim1_00_01InternalNode_3_01ChildT2_00_01Dim1_01_4_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['sameleafconfig',['SameLeafConfig',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameLeafConfig.html',1,'openvdb::v3_2_0::tree']]], + ['sameleafconfig_3c_20dim1_2c_20leafnode_3c_20t2_2c_20dim1_20_3e_20_3e',['SameLeafConfig< Dim1, LeafNode< T2, Dim1 > >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameLeafConfig_3_01Dim1_00_01LeafNode_3_01T2_00_01Dim1_01_4_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['sameleafconfig_3c_20dim1_2c_20openvdb_3a_3atools_3a_3apointindexleafnode_3c_20t2_2c_20dim1_20_3e_20_3e',['SameLeafConfig< Dim1, openvdb::tools::PointIndexLeafNode< T2, Dim1 > >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameLeafConfig_3_01Dim1_00_01openvdb_1_1tools_1_1PointIndex81825ed065985d5c1a4f0ecf51aab07a.html',1,'openvdb::v3_2_0::tree']]], + ['samerootconfig',['SameRootConfig',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameRootConfig.html',1,'openvdb::v3_2_0::tree']]], + ['samerootconfig_3c_20childt1_2c_20rootnode_3c_20childt2_20_3e_20_3e',['SameRootConfig< ChildT1, RootNode< ChildT2 > >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameRootConfig_3_01ChildT1_00_01RootNode_3_01ChildT2_01_4_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['samlertype',['SamlerType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#a5c22664ad3eac5cac5545e0d01e459e6',1,'openvdb::v3_2_0::tools::AlphaMask']]], + ['sample',['sample',['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1BoolSampler.html#ac6dc80e2a1753b4c79771e7d4ed37940',1,'openvdb::v3_2_0::tools::clip_internal::BoolSampler::sample()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TileSampler.html#a29134d4a118770355ca0ead2917356d9',1,'openvdb::v3_2_0::tools::internal::TileSampler::sample()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler.html#ac6dc80e2a1753b4c79771e7d4ed37940',1,'openvdb::v3_2_0::tools::Sampler::sample(const TreeT &inTree, const Vec3R &inCoord, typename TreeT::ValueType &result)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler.html#af016e16ec50405c877a06287d54e7c3e',1,'openvdb::v3_2_0::tools::Sampler::sample(const TreeT &inTree, const Vec3R &inCoord)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointSampler.html#aaa22ae89fd0aec39956caad811f550b8',1,'openvdb::v3_2_0::tools::PointSampler::sample(const TreeT &inTree, const Vec3R &inCoord, typename TreeT::ValueType &result)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointSampler.html#aa8ab47901cc813773d65645dfff1eb2e',1,'openvdb::v3_2_0::tools::PointSampler::sample(const TreeT &inTree, const Vec3R &inCoord)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html#aaa22ae89fd0aec39956caad811f550b8',1,'openvdb::v3_2_0::tools::BoxSampler::sample(const TreeT &inTree, const Vec3R &inCoord, typename TreeT::ValueType &result)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html#aa8ab47901cc813773d65645dfff1eb2e',1,'openvdb::v3_2_0::tools::BoxSampler::sample(const TreeT &inTree, const Vec3R &inCoord)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadraticSampler.html#aaa22ae89fd0aec39956caad811f550b8',1,'openvdb::v3_2_0::tools::QuadraticSampler::sample(const TreeT &inTree, const Vec3R &inCoord, typename TreeT::ValueType &result)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadraticSampler.html#aa8ab47901cc813773d65645dfff1eb2e',1,'openvdb::v3_2_0::tools::QuadraticSampler::sample(const TreeT &inTree, const Vec3R &inCoord)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredPointSampler.html#aaa22ae89fd0aec39956caad811f550b8',1,'openvdb::v3_2_0::tools::StaggeredPointSampler::sample(const TreeT &inTree, const Vec3R &inCoord, typename TreeT::ValueType &result)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredPointSampler.html#aa8ab47901cc813773d65645dfff1eb2e',1,'openvdb::v3_2_0::tools::StaggeredPointSampler::sample(const TreeT &inTree, const Vec3R &inCoord)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredBoxSampler.html#aaa22ae89fd0aec39956caad811f550b8',1,'openvdb::v3_2_0::tools::StaggeredBoxSampler::sample(const TreeT &inTree, const Vec3R &inCoord, typename TreeT::ValueType &result)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredBoxSampler.html#aa8ab47901cc813773d65645dfff1eb2e',1,'openvdb::v3_2_0::tools::StaggeredBoxSampler::sample(const TreeT &inTree, const Vec3R &inCoord)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredQuadraticSampler.html#aaa22ae89fd0aec39956caad811f550b8',1,'openvdb::v3_2_0::tools::StaggeredQuadraticSampler::sample(const TreeT &inTree, const Vec3R &inCoord, typename TreeT::ValueType &result)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredQuadraticSampler.html#aa8ab47901cc813773d65645dfff1eb2e',1,'openvdb::v3_2_0::tools::StaggeredQuadraticSampler::sample(const TreeT &inTree, const Vec3R &inCoord)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocitySampler.html#a1666010d10bc6565efbb0aa4242c72a0',1,'openvdb::v3_2_0::tools::VelocitySampler::sample(const LocationType &world, ValueType &result) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocitySampler.html#a6ca45331a9285cb2f4177811a7587019',1,'openvdb::v3_2_0::tools::VelocitySampler::sample(const LocationType &world) const ']]], + ['sampler',['Sampler',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler.html',1,'openvdb::v3_2_0::tools']]], + ['sampler_3c_200_2c_20false_20_3e',['Sampler< 0, false >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler_3_010_00_01false_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['sampler_3c_200_2c_20true_20_3e',['Sampler< 0, true >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler_3_010_00_01true_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['sampler_3c_201_2c_20false_20_3e',['Sampler< 1, false >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler_3_011_00_01false_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['sampler_3c_201_2c_20true_20_3e',['Sampler< 1, true >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler_3_011_00_01true_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['sampler_3c_202_2c_20false_20_3e',['Sampler< 2, false >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler_3_012_00_01false_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['sampler_3c_202_2c_20true_20_3e',['Sampler< 2, true >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler_3_012_00_01true_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['samplertype',['SamplerType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#a34d314fe0ad08b57e26dc5a5434e90fe',1,'openvdb::v3_2_0::tools::VolumeRender']]], + ['samplevalue',['sampleValue',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a43741686757b250d7b2483a103a45ab1',1,'openvdb::v3_2_0::tools::MultiResGrid::sampleValue(const Coord &in_ijk, size_t in_level, size_t out_level) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a751a78f7ffe1c603c357427687e76239',1,'openvdb::v3_2_0::tools::MultiResGrid::sampleValue(const Vec3R &in_ijk, size_t in_level, size_t out_level) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a3fa015f68f37d30d19629c4da779e747',1,'openvdb::v3_2_0::tools::MultiResGrid::sampleValue(const Coord &ijk, double level) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#ac702b49ec58ff2b75732f2122bd9ef68',1,'openvdb::v3_2_0::tools::MultiResGrid::sampleValue(const Vec3R &xyz, double level) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a24120de2a87f55b70a57e12f37ca97e7',1,'openvdb::v3_2_0::tools::MultiResGrid::sampleValue(const Coord &in_ijk, size_t in_level, size_t out_level) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#aea5a0fbafb960d511e9301486564ea5c',1,'openvdb::v3_2_0::tools::MultiResGrid::sampleValue(const Vec3R &in_xyz, size_t in_level, size_t out_level) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#adc1f84110e18934d7b0697622302a9a1',1,'openvdb::v3_2_0::tools::MultiResGrid::sampleValue(const Coord &ijk, double level) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#ac6c1c9ab834961e1dba209b9dbf71d7c',1,'openvdb::v3_2_0::tools::MultiResGrid::sampleValue(const Vec3R &xyz, double level) const ']]], + ['samplevoxel',['sampleVoxel',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#aefd15060203095771ce5a2eec2ad8cbd',1,'openvdb::v3_2_0::tools::GridSampler::sampleVoxel(const RealType &x, const RealType &y, const RealType &z) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#a46852f464b4624918d69f9d0bc935944',1,'openvdb::v3_2_0::tools::GridSampler::sampleVoxel(typename Coord::ValueType i, typename Coord::ValueType j, typename Coord::ValueType k) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html#aefd15060203095771ce5a2eec2ad8cbd',1,'openvdb::v3_2_0::tools::GridSampler< tree::ValueAccessor< TreeT >, SamplerType >::sampleVoxel(const RealType &x, const RealType &y, const RealType &z) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html#a46852f464b4624918d69f9d0bc935944',1,'openvdb::v3_2_0::tools::GridSampler< tree::ValueAccessor< TreeT >, SamplerType >::sampleVoxel(typename Coord::ValueType i, typename Coord::ValueType j, typename Coord::ValueType k) const ']]], + ['save',['save',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1MaskManager.html#aae2c382151ef7c9aa913361172b30db6',1,'openvdb::v3_2_0::tools::Morphology::MaskManager::save()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ada8db18b530657224fcba57b4faeb825',1,'openvdb::v3_2_0::util::NodeMask::save()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ada8db18b530657224fcba57b4faeb825',1,'openvdb::v3_2_0::util::NodeMask< 1 >::save()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ada8db18b530657224fcba57b4faeb825',1,'openvdb::v3_2_0::util::NodeMask< 2 >::save()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#ada8db18b530657224fcba57b4faeb825',1,'openvdb::v3_2_0::util::RootNodeMask::save()']]], + ['savefloatashalf',['saveFloatAsHalf',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ac838a0e531771a0328984635524dcaf6',1,'openvdb::v3_2_0::GridBase::saveFloatAsHalf()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#ac838a0e531771a0328984635524dcaf6',1,'openvdb::v3_2_0::io::GridDescriptor::saveFloatAsHalf()']]], + ['saveppm',['savePPM',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Film.html#a6b8eba669ee5b71c819b93bc2412ba05',1,'openvdb::v3_2_0::tools::Film']]], + ['scalargrid',['ScalarGrid',['../namespaceopenvdb_1_1v3__2__0.html#a0efc6e9fd1c6c24164eeeee2d50df801',1,'openvdb::v3_2_0']]], + ['scalartovectorconverter',['ScalarToVectorConverter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ScalarToVectorConverter.html',1,'openvdb::v3_2_0::tools']]], + ['scalartree',['ScalarTree',['../namespaceopenvdb_1_1v3__2__0.html#ad638a06eb446fed0cddb86dcbbd3c289',1,'openvdb::v3_2_0']]], + ['scalartype',['ScalarType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1ComputeExtremas.html#a9b8b8d426efe4ff5a7867bb79e8a347c',1,'openvdb::v3_2_0::tools::particle_atlas_internal::ComputeExtremas::ScalarType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#a9b8b8d426efe4ff5a7867bb79e8a347c',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray::ScalarType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RadialRangeFilter.html#a9b8b8d426efe4ff5a7867bb79e8a347c',1,'openvdb::v3_2_0::tools::particle_atlas_internal::RadialRangeFilter::ScalarType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1BBoxFilter.html#a9b8b8d426efe4ff5a7867bb79e8a347c',1,'openvdb::v3_2_0::tools::particle_atlas_internal::BBoxFilter::ScalarType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexFilter.html#a9b8b8d426efe4ff5a7867bb79e8a347c',1,'openvdb::v3_2_0::tools::PointIndexFilter::ScalarType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1BBoxFilter.html#a9b8b8d426efe4ff5a7867bb79e8a347c',1,'openvdb::v3_2_0::tools::point_index_grid_internal::BBoxFilter::ScalarType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1RadialRangeFilter.html#a9b8b8d426efe4ff5a7867bb79e8a347c',1,'openvdb::v3_2_0::tools::point_index_grid_internal::RadialRangeFilter::ScalarType()']]], + ['scale',['scale',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a7e70596f522e9d65e04a382c8f5cd348',1,'openvdb::v3_2_0::math::pcg::Vector::scale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a7e70596f522e9d65e04a382c8f5cd348',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::scale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1RowEditor.html#a7703ea9cba48e807b83414cbcafcd63f',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::RowEditor::scale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a2034b0136d7cb4e2d3bde521aab5fd00',1,'openvdb::v3_2_0::math::Quat::scale()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Ray_1_1TimeSpan.html#a4b062f7d1e17db9946e629bdc2df5062',1,'openvdb::v3_2_0::math::Ray::TimeSpan::scale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a8283e35ce9005e3b94e3d99c8b0e8247',1,'openvdb::v3_2_0::math::Vec2::scale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a81e3ab50fad13ed6c5ab8cf17174b857',1,'openvdb::v3_2_0::math::Vec3::scale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a69777ba70a2b8be3751efc48958e72b5',1,'openvdb::v3_2_0::math::Vec4::scale()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a233527deef2b7f93c5d0cf888254deaf',1,'openvdb::v3_2_0::math::scale()']]], + ['scalemap',['ScaleMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#aa7430778b140b9a67c6e32383677315b',1,'openvdb::v3_2_0::math::ScaleMap::ScaleMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a40c3088b3653c722b1c58fa3cc9fca74',1,'openvdb::v3_2_0::math::ScaleMap::ScaleMap(const Vec3d &scale)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#ab307fbabd19da3570e04ac8d98c40c61',1,'openvdb::v3_2_0::math::ScaleMap::ScaleMap(const ScaleMap &other)']]], + ['scalemap',['ScaleMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html',1,'openvdb::v3_2_0::math']]], + ['scaletimes',['scaleTimes',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a6f3a72d885b1e6ab1c6955ad00456635',1,'openvdb::v3_2_0::math::Ray']]], + ['scaletranslatemap',['ScaleTranslateMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#ac540089c84b4ddb7b5e62ce9bf5e4b76',1,'openvdb::v3_2_0::math::ScaleTranslateMap::ScaleTranslateMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a7ad72e448c273feece7354126f6a2855',1,'openvdb::v3_2_0::math::ScaleTranslateMap::ScaleTranslateMap(const Vec3d &scale, const Vec3d &translate)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#ab13953a2148cfc8388c41965362ce713',1,'openvdb::v3_2_0::math::ScaleTranslateMap::ScaleTranslateMap(const ScaleMap &scale, const TranslationMap &translate)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a13a5faa8c799dc12d79ca5f23ed29c59',1,'openvdb::v3_2_0::math::ScaleTranslateMap::ScaleTranslateMap(const ScaleTranslateMap &other)']]], + ['scaletranslatemap',['ScaleTranslateMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html',1,'openvdb::v3_2_0::math']]], + ['scanfill',['scanFill',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal.html#a7b860c0d9cb36e93e965e1fb705c21c3',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['scatter',['scatter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1Neighbor.html#aa31e0712c841997181fbba24bbbe3624',1,'openvdb::v3_2_0::tools::Morphology::Neighbor::scatter()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#a3124924570807364a28163005d0758b2',1,'openvdb::v3_2_0::tools::Morphology::LeafCache::scatter(int n, int indx)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#a10135979b82b169aada52b4c521dfcc3',1,'openvdb::v3_2_0::tools::Morphology::LeafCache::scatter(int n, int indx)']]], + ['scatteredgesxy',['scatterEdgesXY',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#a9ab5fdbd69937c32a6d839566515da0b',1,'openvdb::v3_2_0::tools::Morphology::LeafCache']]], + ['scatterfacesxy',['scatterFacesXY',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#acae59452d5ee025fed9281bdc1f56353',1,'openvdb::v3_2_0::tools::Morphology::LeafCache']]], + ['sdfgridtype',['SdfGridType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a86360109c4d4d028fc3526768e1978bf',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['sdfinteriormask',['sdfInteriorMask',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a59b83096927350f3324cba935be37717',1,'openvdb::v3_2_0::tools']]], + ['sdftilestofogvolume',['SDFTilesToFogVolume',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SDFTilesToFogVolume.html#a77f9d1913ab06a162424f0a87ac31703',1,'openvdb::v3_2_0::tools::level_set_util_internal::SDFTilesToFogVolume']]], + ['sdftilestofogvolume',['SDFTilesToFogVolume',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SDFTilesToFogVolume.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['sdftofogvolume',['sdfToFogVolume',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aad82d1b0039598209bc21cd9aa4511a0',1,'openvdb::v3_2_0::tools']]], + ['sdftype',['SdfType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#ab1864cab9091f84edfb8b6dfbd49d38b',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['sdfvoxelstofogvolume',['SDFVoxelsToFogVolume',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SDFVoxelsToFogVolume.html#a4d5e7bbc2ca56453650322d28dc07ae9',1,'openvdb::v3_2_0::tools::level_set_util_internal::SDFVoxelsToFogVolume']]], + ['sdfvoxelstofogvolume',['SDFVoxelsToFogVolume',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SDFVoxelsToFogVolume.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['seam',['SEAM',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a0341d081395407fd92061819ba76eb96a3ebbdf66b2d24cb8ec979e6315240971',1,'openvdb::v3_2_0::tools::internal']]], + ['seamweights',['SeamWeights',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SeamWeights.html#ad24b90fa071b7280eb8b12fa27d6f261',1,'openvdb::v3_2_0::tools::internal::SeamWeights']]], + ['seamweights',['SeamWeights',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SeamWeights.html',1,'openvdb::v3_2_0::tools::internal']]], + ['search',['search',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestSurfacePoint.html#a133abf20ded86e2e779ffbb89911e38f',1,'openvdb::v3_2_0::tools::ClosestSurfacePoint']]], + ['searchandapply',['searchAndApply',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexFilter.html#ad843178ba73e14db18a793ecc2378fdf',1,'openvdb::v3_2_0::tools::PointIndexFilter']]], + ['searchandreplace',['searchAndReplace',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestSurfacePoint.html#a6f52a83dc359cd1cabcddc56d8350ff3',1,'openvdb::v3_2_0::tools::ClosestSurfacePoint']]], + ['searchandupdate',['searchAndUpdate',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#add08dfc840f3c5064dc2e9eadc86cec1',1,'openvdb::v3_2_0::tools::PointIndexIterator::searchAndUpdate(const Coord &ijk, ConstAccessor &acc)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a7d5171b94aa5b11090c605f6dff4206d',1,'openvdb::v3_2_0::tools::PointIndexIterator::searchAndUpdate(const CoordBBox &bbox, ConstAccessor &acc)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a5bad5086a83606c21c539bcc921cf2ed',1,'openvdb::v3_2_0::tools::PointIndexIterator::searchAndUpdate(const BBoxd &bbox, ConstAccessor &acc, const PointArray &points, const math::Transform &xform)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a6b12fc822fc129ddebcffc9bf5f10c8f',1,'openvdb::v3_2_0::tools::PointIndexIterator::searchAndUpdate(const Vec3d &center, double radius, ConstAccessor &acc, const PointArray &points, const math::Transform &xform, bool subvoxelAccuracy=true)']]], + ['second',['second',['../structopenvdb_1_1v3__2__0_1_1VersionId.html#aaf698bc8e6905e3e97116abfea3c766c',1,'openvdb::v3_2_0::VersionId']]], + ['second_5fbias',['SECOND_BIAS',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9b59f0a0c54e6e3759f1418d40585656aafff1de1b18c68533db6495e2e750557',1,'openvdb::v3_2_0::math']]], + ['secondmap',['secondMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a16d5152ce40705e72e65d3b4e1469652',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::secondMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#aeb62a0e3afa539e3dc98ba965d6a9b77',1,'openvdb::v3_2_0::math::CompoundMap::secondMap()']]], + ['secondorderdensestencil',['SecondOrderDenseStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1SecondOrderDenseStencil.html#a74fa49b7b0d792318e7c1a7f263c2f93',1,'openvdb::v3_2_0::math::SecondOrderDenseStencil']]], + ['secondorderdensestencil',['SecondOrderDenseStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1SecondOrderDenseStencil.html',1,'openvdb::v3_2_0::math']]], + ['sedgegrouptable',['sEdgeGroupTable',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#aa4e425ab60c97125c0b59edba857b79a',1,'openvdb::v3_2_0::tools::internal']]], + ['seedfill',['seedFill',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal.html#af7467cf4d156427e4c5885779ee5f1ad',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['seedfillexteriorsign',['SeedFillExteriorSign',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedFillExteriorSign.html#aa6d93480817644073eee40bbc684fc16',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedFillExteriorSign']]], + ['seedfillexteriorsign',['SeedFillExteriorSign',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedFillExteriorSign.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['seedpoints',['SeedPoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html#ac656ee81f2d3c9f3409092603a619f84',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedPoints']]], + ['seedpoints',['SeedPoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['seektoblocks',['seekToBlocks',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a386c4afa0d8738328be0eeae4260f98a',1,'openvdb::v3_2_0::io::GridDescriptor::seekToBlocks(std::istream &) const '],['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a6ace5f2149dbf3e17a137bfe6b083699',1,'openvdb::v3_2_0::io::GridDescriptor::seekToBlocks(std::ostream &) const ']]], + ['seektoend',['seekToEnd',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#adb8cb673d5b7dba7759eaf4956b391c5',1,'openvdb::v3_2_0::io::GridDescriptor::seekToEnd(std::istream &) const '],['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#ac4deab7dd16c1380cc986a4a607a2471',1,'openvdb::v3_2_0::io::GridDescriptor::seekToEnd(std::ostream &) const ']]], + ['seektogrid',['seekToGrid',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#abbb685505ae84808444d1613ac9e0876',1,'openvdb::v3_2_0::io::GridDescriptor::seekToGrid(std::istream &) const '],['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a148f31b72a874fc877a143823fb0c192',1,'openvdb::v3_2_0::io::GridDescriptor::seekToGrid(std::ostream &) const ']]], + ['segment',['Segment',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MoveSegmentDataOp.html#a68fc89c821f0583c0e1e6e8fe96835a2',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MoveSegmentDataOp::Segment()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MergeBinsOp.html#a68fc89c821f0583c0e1e6e8fe96835a2',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MergeBinsOp::Segment()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildPrimarySegment.html#ab2ca9d867640a6da9080942f50cd0455',1,'openvdb::v3_2_0::tools::composite::BuildPrimarySegment::segment()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildSecondarySegment.html#ab2ca9d867640a6da9080942f50cd0455',1,'openvdb::v3_2_0::tools::composite::BuildSecondarySegment::segment()']]], + ['segmentactivevoxels',['segmentActiveVoxels',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a1cc2d4f60d561afd2fb248e386ca67d8',1,'openvdb::v3_2_0::tools']]], + ['segmentnodemask',['SegmentNodeMask',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SegmentNodeMask.html#a6c654db53ab9ed1b09d34159cafc148b',1,'openvdb::v3_2_0::tools::level_set_util_internal::SegmentNodeMask']]], + ['segmentnodemask',['SegmentNodeMask',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SegmentNodeMask.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['segmentptr',['SegmentPtr',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MoveSegmentDataOp.html#af87d89363ef176c69dd89a6db07b357a',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MoveSegmentDataOp::SegmentPtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MergeBinsOp.html#af87d89363ef176c69dd89a6db07b357a',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MergeBinsOp::SegmentPtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1OrderSegmentsOp.html#a6d6e781155b1e42926f2e12bc7a5f420',1,'openvdb::v3_2_0::tools::point_partitioner_internal::OrderSegmentsOp::SegmentPtr()']]], + ['segmentsdf',['segmentSDF',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac9f4df82ed92eb746d439ce4721ea8a5',1,'openvdb::v3_2_0::tools']]], + ['semi',['SEMI',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1Scheme.html#a4010e0b09fbf6a975c479833d3001f42a68cf729acfb0cf4857abec621022e0df',1,'openvdb::v3_2_0::tools::Scheme']]], + ['semilagrangian',['SemiLagrangian',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1Scheme.html#a4010e0b09fbf6a975c479833d3001f42',1,'openvdb::v3_2_0::tools::Scheme']]], + ['sep',['sep',['../classopenvdb_1_1v3__2__0_1_1util_1_1FormattedInt.html#a87555d9d1278c7f80b70dacabcaa7469',1,'openvdb::v3_2_0::util::FormattedInt']]], + ['set',['set',['../structopenvdb_1_1v3__2__0_1_1math_1_1Ray_1_1TimeSpan.html#ac91ae5b3a1a3537059fbb423a0c03a9c',1,'openvdb::v3_2_0::math::Ray::TimeSpan::set()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a4a0427f99be883dd54a9573e20870215',1,'openvdb::v3_2_0::util::NodeMask::set(Index32 n, bool On)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a86dfbad4f0db4e9a37b5e7544440a12e',1,'openvdb::v3_2_0::util::NodeMask::set(bool on)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a4a0427f99be883dd54a9573e20870215',1,'openvdb::v3_2_0::util::NodeMask< 1 >::set(Index32 n, bool On)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a86dfbad4f0db4e9a37b5e7544440a12e',1,'openvdb::v3_2_0::util::NodeMask< 1 >::set(bool on)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a4a0427f99be883dd54a9573e20870215',1,'openvdb::v3_2_0::util::NodeMask< 2 >::set(Index32 n, bool On)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a86dfbad4f0db4e9a37b5e7544440a12e',1,'openvdb::v3_2_0::util::NodeMask< 2 >::set(bool on)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a2ed7935a22760e8b1b79b60c7b02e3b4',1,'openvdb::v3_2_0::util::RootNodeMask::set()']]], + ['setabsorption',['setAbsorption',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#a503cbe745097f6dd16a953e977a493ed',1,'openvdb::v3_2_0::tools::VolumeRender']]], + ['setactivestate',['setActiveState',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#af37ceaf280f447def1bf5dc71e8ad41d',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setActiveState(const Coord &, bool)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a5c190f79c849e6a347d43da3d4380604',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setActiveState(Index, bool)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a7b3e82eb582914ac6f31f32fea77292f',1,'openvdb::v3_2_0::tree::InternalNode::setActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a7b3e82eb582914ac6f31f32fea77292f',1,'openvdb::v3_2_0::tree::LeafNode::setActiveState(const Coord &xyz, bool on)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ad92d76f17632c84c6eebe8b6c872a6fc',1,'openvdb::v3_2_0::tree::LeafNode::setActiveState(Index offset, bool on)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a7b3e82eb582914ac6f31f32fea77292f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setActiveState(const Coord &xyz, bool on)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ad92d76f17632c84c6eebe8b6c872a6fc',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setActiveState(Index offset, bool on)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a7b3e82eb582914ac6f31f32fea77292f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setActiveState(const Coord &xyz, bool on)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ad92d76f17632c84c6eebe8b6c872a6fc',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setActiveState(Index offset, bool on)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a7b3e82eb582914ac6f31f32fea77292f',1,'openvdb::v3_2_0::tree::RootNode::setActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a7b3e82eb582914ac6f31f32fea77292f',1,'openvdb::v3_2_0::tree::Tree::setActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a10c9560d1832cadc5ec67c49be2c6380',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::setActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a151020c757d73e8bf2545656110f7bd2',1,'openvdb::v3_2_0::tree::ValueAccessor::setActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a7b3e82eb582914ac6f31f32fea77292f',1,'openvdb::v3_2_0::tree::CacheItem::setActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a7b3e82eb582914ac6f31f32fea77292f',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::setActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a151020c757d73e8bf2545656110f7bd2',1,'openvdb::v3_2_0::tree::ValueAccessor0::setActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a151020c757d73e8bf2545656110f7bd2',1,'openvdb::v3_2_0::tree::ValueAccessor1::setActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a151020c757d73e8bf2545656110f7bd2',1,'openvdb::v3_2_0::tree::ValueAccessor2::setActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a151020c757d73e8bf2545656110f7bd2',1,'openvdb::v3_2_0::tree::ValueAccessor3::setActiveState()']]], + ['setactivestateandcache',['setActiveStateAndCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a60f6c5ca715dae26176276384e5b6b8b',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setActiveStateAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ac04db06362bfb5ec0ed6212469eb4ff3',1,'openvdb::v3_2_0::tree::InternalNode::setActiveStateAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ac04db06362bfb5ec0ed6212469eb4ff3',1,'openvdb::v3_2_0::tree::LeafNode::setActiveStateAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ac04db06362bfb5ec0ed6212469eb4ff3',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setActiveStateAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ac04db06362bfb5ec0ed6212469eb4ff3',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setActiveStateAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ac04db06362bfb5ec0ed6212469eb4ff3',1,'openvdb::v3_2_0::tree::RootNode::setActiveStateAndCache()']]], + ['setadaptivitymask',['setAdaptivityMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#ab66fc6c0bbf727d922e4067875635a4d',1,'openvdb::v3_2_0::tools::VolumeToMesh::setAdaptivityMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#a94f2c6853087f193524ffaaec891ff2f',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions::setAdaptivityMask()']]], + ['setaisactive',['setAIsActive',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#aa88acf4c6a0e5050e4518d948b690555',1,'openvdb::v3_2_0::CombineArgs']]], + ['setalphamask',['setAlphaMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#ad1fc9438cf4d0e664433c0098708488e',1,'openvdb::v3_2_0::tools::LevelSetMorphing']]], + ['setaref',['setARef',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a900c9ae9b589ed9887ee757faa6fe3a8',1,'openvdb::v3_2_0::CombineArgs']]], + ['setaxisangle',['setAxisAngle',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a0ea5cd538c513c29ac37288105de9d4b',1,'openvdb::v3_2_0::math::Quat']]], + ['setbackground',['setBackground',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ab9a9be183fae028c2479dd20163a52ee',1,'openvdb::v3_2_0::tree::RootNode']]], + ['setbackgroundptr',['setBackgroundPtr',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#ab1dc968f973ef0391a71a8d72f401094',1,'openvdb::v3_2_0::io::StreamMetadata']]], + ['setbasis',['setBasis',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a2e6981964dca01f637894e81df5fbe10',1,'openvdb::v3_2_0::math::Mat3::setBasis()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#af2a1d44293d2e171de8a0c34a54a5cbf',1,'openvdb::v3_2_0::math::Mat4::setBasis()']]], + ['setbisactive',['setBIsActive',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a7ad8c55591073255c5a83eff256f190b',1,'openvdb::v3_2_0::CombineArgs']]], + ['setblockpos',['setBlockPos',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a79c673cd02c7688efe0d5e4a8badc03f',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['setbref',['setBRef',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#ad560fb4a2f8a5ce1fea42695291a2091',1,'openvdb::v3_2_0::CombineArgs']]], + ['setcamera',['setCamera',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#a93b1e550b09dce77eeaf1acea10e4dfc',1,'openvdb::v3_2_0::tools::LevelSetRayTracer::setCamera()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#a93b1e550b09dce77eeaf1acea10e4dfc',1,'openvdb::v3_2_0::tools::VolumeRender::setCamera()']]], + ['setcapacity',['setCapacity',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#acbb37749d06eb94f56f9a742d66acf16',1,'openvdb::v3_2_0::io::Queue']]], + ['setchild',['setChild',['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a6e8d27e46c9047a417513978cc5a1312',1,'openvdb::v3_2_0::tree::DenseIteratorBase::setChild()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01false_00_01ValueT_00_01ChildT_01_4.html#a043790fd9cad19569d830db6077581f9',1,'openvdb::v3_2_0::tree::NodeUnionImpl< false, ValueT, ChildT >::setChild()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01true_00_01ValueT_00_01ChildT_01_4.html#a043790fd9cad19569d830db6077581f9',1,'openvdb::v3_2_0::tree::NodeUnionImpl< true, ValueT, ChildT >::setChild()']]], + ['setchildnode',['setChildNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a19c8be044c364a09575e4c25e8c269ab',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['setcol',['setCol',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a7f0d7198dacce6ce93401586263c4bbf',1,'openvdb::v3_2_0::math::Mat3::setCol()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a68c3859392fa67a8dbb7bda68fd7813f',1,'openvdb::v3_2_0::math::Mat4::setCol()']]], + ['setcolumns',['setColumns',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#af08e6152df053fe8980d55e7ccf607fd',1,'openvdb::v3_2_0::math::Mat3::setColumns()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a792bba2fb77c5beb92721efe95332585',1,'openvdb::v3_2_0::math::Mat4::setColumns()']]], + ['setcompression',['setCompression',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#aaac46d62e6470ece11e3c97d4c93dd6e',1,'openvdb::v3_2_0::io::Archive::setCompression()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a19824f6dee825d3576516adaa74a48ad',1,'openvdb::v3_2_0::io::StreamMetadata::setCompression()']]], + ['setconstraintiterations',['setConstraintIterations',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestPointProjector.html#ad9aca547788ac1c34d03b52702deb397',1,'openvdb::v3_2_0::tools::ClosestPointProjector::setConstraintIterations()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#ad60be188b98e1ab6a985d5cf6f979e7c',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect::setConstraintIterations()']]], + ['setcopymaxbytes',['setCopyMaxBytes',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a149180fbea28c88ffbb77739a21354cb',1,'openvdb::v3_2_0::io::File']]], + ['setcreator',['setCreator',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ab8ca1d751197a95b14a8b1f9cadbe81e',1,'openvdb::v3_2_0::GridBase']]], + ['setcurrentversion',['setCurrentVersion',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a802dfeaf3d089ecfe30a21e6d729723b',1,'openvdb::v3_2_0::io']]], + ['setcutoff',['setCutOff',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#afc9e4083cdcbb215111a8a0f20effb16',1,'openvdb::v3_2_0::tools::VolumeRender']]], + ['setdatacompression',['setDataCompression',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a2efc8dc6da3250694e391d11b71c5114',1,'openvdb::v3_2_0::io::Archive::setDataCompression()'],['../namespaceopenvdb_1_1v3__2__0_1_1io.html#aeb2a9d30a81b8e8f7f351837668c62b6',1,'openvdb::v3_2_0::io::setDataCompression()']]], + ['setdepth',['setDepth',['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#ae5912b944b946bb35a65bc080e0e529d',1,'openvdb::v3_2_0::math::NonlinearFrustumMap']]], + ['setdir',['setDir',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a5a59a1633e568f5466a2ce4d147426f7',1,'openvdb::v3_2_0::math::Ray']]], + ['setendpos',['setEndPos',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a2f4f761ce2afe2f52c0e2929488b2306',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['seteye',['setEye',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a293a80debe8291d87cd443ef3707d80a',1,'openvdb::v3_2_0::math::Ray']]], + ['setfileversion',['setFileVersion',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#abe6d1bd7d8e5771a2328d344f7bfd5f5',1,'openvdb::v3_2_0::io::StreamMetadata']]], + ['setfirstmap',['setFirstMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#a36cd56f3046fe8bdf8dfb9794624e355',1,'openvdb::v3_2_0::math::CompoundMap']]], + ['setfirstoff',['setFirstOff',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a75235dbdcf921410c7a02c6a9f7e2313',1,'openvdb::v3_2_0::util::NodeMask::setFirstOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a75235dbdcf921410c7a02c6a9f7e2313',1,'openvdb::v3_2_0::util::NodeMask< 1 >::setFirstOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a75235dbdcf921410c7a02c6a9f7e2313',1,'openvdb::v3_2_0::util::NodeMask< 2 >::setFirstOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a75235dbdcf921410c7a02c6a9f7e2313',1,'openvdb::v3_2_0::util::RootNodeMask::setFirstOff()']]], + ['setfirston',['setFirstOn',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a8d1574a0bde45311e7e79c3cb77455df',1,'openvdb::v3_2_0::util::NodeMask::setFirstOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a8d1574a0bde45311e7e79c3cb77455df',1,'openvdb::v3_2_0::util::NodeMask< 1 >::setFirstOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a8d1574a0bde45311e7e79c3cb77455df',1,'openvdb::v3_2_0::util::NodeMask< 2 >::setFirstOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a8d1574a0bde45311e7e79c3cb77455df',1,'openvdb::v3_2_0::util::RootNodeMask::setFirstOn()']]], + ['setformatversion',['setFormatVersion',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a0591fc7e869e0f74a6f9c8c54f09ec75',1,'openvdb::v3_2_0::io::Archive']]], + ['setgrainsize',['setGrainSize',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a74013cfeac75bec3a6ff587552cce836',1,'openvdb::v3_2_0::tools::Filter::setGrainSize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#a74013cfeac75bec3a6ff587552cce836',1,'openvdb::v3_2_0::tools::LevelSetAdvection::setGrainSize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#a74013cfeac75bec3a6ff587552cce836',1,'openvdb::v3_2_0::tools::LevelSetMeasure::setGrainSize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a74013cfeac75bec3a6ff587552cce836',1,'openvdb::v3_2_0::tools::LevelSetMorphing::setGrainSize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a74013cfeac75bec3a6ff587552cce836',1,'openvdb::v3_2_0::tools::LevelSetTracker::setGrainSize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a2abcbeae6971afd80df6d20223347704',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet::setGrainSize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#afaf3b04c07bc3e8e009a091fef3df197',1,'openvdb::v3_2_0::tools::VolumeAdvection::setGrainSize()']]], + ['setgrid',['setGrid',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#a540157e2ed2200bc3ce93b24dae2b5a8',1,'openvdb::v3_2_0::tools::LevelSetRayTracer']]], + ['setgridbackgroundvalueptr',['setGridBackgroundValuePtr',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#abfe2e9bf82a1272993a4aaa21af3b814',1,'openvdb::v3_2_0::io']]], + ['setgridclass',['setGridClass',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a60f870194239aba95a3a0a01597d391a',1,'openvdb::v3_2_0::GridBase::setGridClass()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a0d365bb95256e33f722d343699ccf8c1',1,'openvdb::v3_2_0::io::StreamMetadata::setGridClass()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a0494d4a7eba077606931479b8480e614',1,'openvdb::v3_2_0::tools::MultiResGrid::setGridClass()'],['../namespaceopenvdb_1_1v3__2__0_1_1io.html#ab46d00a93c47f2ff95d159e22b28b2cf',1,'openvdb::v3_2_0::io::setGridClass()']]], + ['setgridcompression',['setGridCompression',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a0dcca8f2fc0d2f1e88406fada3a32924',1,'openvdb::v3_2_0::io::Archive']]], + ['setgridpos',['setGridPos',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a3ee3288c1dba761230c76ac785456192',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['setgridstatsmetadataenabled',['setGridStatsMetadataEnabled',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#af08f61661d1d69b8e906340d4e610fcf',1,'openvdb::v3_2_0::io::Archive']]], + ['sethalffloat',['setHalfFloat',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a495e7f8479be3957eaefd00b33e56bf2',1,'openvdb::v3_2_0::io::StreamMetadata::setHalfFloat()'],['../namespaceopenvdb_1_1v3__2__0_1_1io.html#ace55a0ed6d5bd43fb9b6ca4519f91927',1,'openvdb::v3_2_0::io::setHalfFloat()']]], + ['setidentity',['setIdentity',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a382e6ad7e6721b121e510959e1011be3',1,'openvdb::v3_2_0::math::Mat3::setIdentity()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a382e6ad7e6721b121e510959e1011be3',1,'openvdb::v3_2_0::math::Mat4::setIdentity()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a03cfd2529447ab8bed5afbe5230e9a00',1,'openvdb::v3_2_0::math::Quat::setIdentity()']]], + ['setindexray',['setIndexRay',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a037f71f8178f967ca49b50e926c24cef',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::setIndexRay()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#a037f71f8178f967ca49b50e926c24cef',1,'openvdb::v3_2_0::tools::LinearSearchImpl::setIndexRay()']]], + ['setinputhasgridoffsets',['setInputHasGridOffsets',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#aff363fd722294a598094133a915f7a8d',1,'openvdb::v3_2_0::io::Archive']]], + ['setinstanceparentname',['setInstanceParentName',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#ab8c5f72ed3a07920389791decffbc5c4',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['setinstancingenabled',['setInstancingEnabled',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a930a90feb9d127ca695fb73eb75f8187',1,'openvdb::v3_2_0::io::Archive']]], + ['setintegrationorder',['setIntegrationOrder',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#a75c62d321d6fa2162639348017c483ef',1,'openvdb::v3_2_0::tools::PointAdvect::setIntegrationOrder()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#a75c62d321d6fa2162639348017c483ef',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect::setIntegrationOrder()']]], + ['setintegrator',['setIntegrator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#ae3e18e2dbd7b6499cea6b349ac0688dc',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['setinterrupter',['setInterrupter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html#a4696e5cc39df7c33478f29dd888f19d7',1,'openvdb::v3_2_0::tools::GridResampler']]], + ['setintersector',['setIntersector',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#a57d7fb7e072663fcbaa0d065ccf22214',1,'openvdb::v3_2_0::tools::LevelSetRayTracer::setIntersector()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#a57d7fb7e072663fcbaa0d065ccf22214',1,'openvdb::v3_2_0::tools::VolumeRender::setIntersector()']]], + ['setisinworldspace',['setIsInWorldSpace',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#af7d08f61e709400a7ecf2c8da101f52f',1,'openvdb::v3_2_0::GridBase']]], + ['setitem',['setItem',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ChildIter.html#a3acfab6b9e79ea9af8b8d2b74f6ed87f',1,'openvdb::v3_2_0::tree::InternalNode::ChildIter::setItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ValueIter.html#a15b7f3f846c57265f288db248c72e4f5',1,'openvdb::v3_2_0::tree::InternalNode::ValueIter::setItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DenseIter.html#a6e1f266528fc58aff13aa94b120e483c',1,'openvdb::v3_2_0::tree::InternalNode::DenseIter::setItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#ac5480a6ca2259acdff0bd72f869eb551',1,'openvdb::v3_2_0::tree::SparseIteratorBase::setItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a2a90fe02eea5e7257922f3f6b90bf826',1,'openvdb::v3_2_0::tree::DenseIteratorBase::setItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueIter.html#a03e38f1681b274cfa5f5219dc3c2b09a',1,'openvdb::v3_2_0::tree::LeafNode::ValueIter::setItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ValueIter.html#a7cb2781a108afee1323df5aa7a1236cd',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter::setItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ValueIter.html#a7cb2781a108afee1323df5aa7a1236cd',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter::setItem()']]], + ['setiter',['setIter',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#aa7e08a34cacae3b73125454d4f3de9c9',1,'openvdb::v3_2_0::tree::IterListItem::setIter(const IterT &iter)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a3ac6bb34c0d6347693e7cd490b3f1b61',1,'openvdb::v3_2_0::tree::IterListItem::setIter(const OtherIterT &iter)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#aa7e08a34cacae3b73125454d4f3de9c9',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::setIter(const IterT &iter)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a3ac6bb34c0d6347693e7cd490b3f1b61',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::setIter(const OtherIterT &iter)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#aa7e08a34cacae3b73125454d4f3de9c9',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::setIter()']]], + ['setlastoff',['setLastOff',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a5b5fea2f8c74c88c485d8ff1ca762acd',1,'openvdb::v3_2_0::util::NodeMask::setLastOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a5b5fea2f8c74c88c485d8ff1ca762acd',1,'openvdb::v3_2_0::util::NodeMask< 1 >::setLastOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a5b5fea2f8c74c88c485d8ff1ca762acd',1,'openvdb::v3_2_0::util::NodeMask< 2 >::setLastOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a5b5fea2f8c74c88c485d8ff1ca762acd',1,'openvdb::v3_2_0::util::RootNodeMask::setLastOff()']]], + ['setlaston',['setLastOn',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#af37125f5bb7fb22769790279ad0fd170',1,'openvdb::v3_2_0::util::NodeMask::setLastOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#af37125f5bb7fb22769790279ad0fd170',1,'openvdb::v3_2_0::util::NodeMask< 1 >::setLastOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#af37125f5bb7fb22769790279ad0fd170',1,'openvdb::v3_2_0::util::NodeMask< 2 >::setLastOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#af37125f5bb7fb22769790279ad0fd170',1,'openvdb::v3_2_0::util::RootNodeMask::setLastOn()']]], + ['setlibraryversion',['setLibraryVersion',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a10993f276cceeb4f23b4908813fc5e42',1,'openvdb::v3_2_0::io::Archive::setLibraryVersion()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#adeabd2c03ab7a98d4e27ed0809e62281',1,'openvdb::v3_2_0::io::StreamMetadata::setLibraryVersion()']]], + ['setlightcolor',['setLightColor',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#abb8bf1793b1a69aa29363f02ed2a7575',1,'openvdb::v3_2_0::tools::VolumeRender']]], + ['setlightdir',['setLightDir',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#a68cb82f6b355888ac15fbb663b6b4595',1,'openvdb::v3_2_0::tools::VolumeRender']]], + ['setlightgain',['setLightGain',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#afab49cc9d27769b21800377ed90eb5b2',1,'openvdb::v3_2_0::tools::VolumeRender']]], + ['setlimiter',['setLimiter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#a633de11f90d17e1afaff9fc6a09838b0',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['setmappedfileptr',['setMappedFilePtr',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a00a549e5ef97c9eaac2cd62a5a4c51f6',1,'openvdb::v3_2_0::io']]], + ['setmaskrange',['setMaskRange',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a84b5de0dab82e78703de694a347a166c',1,'openvdb::v3_2_0::tools::Filter::setMaskRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a84b5de0dab82e78703de694a347a166c',1,'openvdb::v3_2_0::tools::LevelSetFilter::setMaskRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a503a0921a543e2b52689aaabca665b09',1,'openvdb::v3_2_0::tools::LevelSetMorphing::setMaskRange()']]], + ['setmat3',['setMat3',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#adad43709ee54eb7b3dc9c1f283ce7a91',1,'openvdb::v3_2_0::math::Mat4']]], + ['setmaxdepth',['setMaxDepth',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#abb35acc58a2730ea34826a8f1f9d3f7a',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::setMaxDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#abb35acc58a2730ea34826a8f1f9d3f7a',1,'openvdb::v3_2_0::tree::NodeIteratorBase::setMaxDepth()']]], + ['setmaxtime',['setMaxTime',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a9440339d1ea197d90f0a382898f80406',1,'openvdb::v3_2_0::math::Ray']]], + ['setmindepth',['setMinDepth',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a957c4c84291f62d6f4175a7f09ac88c4',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::setMinDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a957c4c84291f62d6f4175a7f09ac88c4',1,'openvdb::v3_2_0::tree::NodeIteratorBase::setMinDepth()']]], + ['setmintime',['setMinTime',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#af860292fdf305f03570c001ef74b80c9',1,'openvdb::v3_2_0::math::Ray']]], + ['setname',['setName',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a36c59a26f0317be12cea01f8dea24ec7',1,'openvdb::v3_2_0::GridBase::setName()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a9d3a2685df23b5e7cbf59c19c4a1f9b5',1,'openvdb::v3_2_0::tools::MultiResGrid::setName()']]], + ['setnormcount',['setNormCount',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#a7fef851f02250854c863da6e0c8e7775',1,'openvdb::v3_2_0::tools::LevelSetAdvection::setNormCount()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a7fef851f02250854c863da6e0c8e7775',1,'openvdb::v3_2_0::tools::LevelSetMorphing::setNormCount()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a7fef851f02250854c863da6e0c8e7775',1,'openvdb::v3_2_0::tools::LevelSetTracker::setNormCount()']]], + ['setnotifier',['setNotifier',['../classopenvdb_1_1v3__2__0_1_1io_1_1MappedFile.html#ae03b6175ee1fbbf77d8613ef5cecdab0',1,'openvdb::v3_2_0::io::MappedFile']]], + ['setoff',['setOff',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#aa68c2d78bd0e575586d58b0462f8b408',1,'openvdb::v3_2_0::util::NodeMask::setOff(Index32 n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#aa1aeb8ff27de4c8cdc9a2168038c62aa',1,'openvdb::v3_2_0::util::NodeMask::setOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#aa68c2d78bd0e575586d58b0462f8b408',1,'openvdb::v3_2_0::util::NodeMask< 1 >::setOff(Index32 n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#aa1aeb8ff27de4c8cdc9a2168038c62aa',1,'openvdb::v3_2_0::util::NodeMask< 1 >::setOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#aa68c2d78bd0e575586d58b0462f8b408',1,'openvdb::v3_2_0::util::NodeMask< 2 >::setOff(Index32 n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#aa1aeb8ff27de4c8cdc9a2168038c62aa',1,'openvdb::v3_2_0::util::NodeMask< 2 >::setOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a667959a57d19bd2f1ec16bf1aded42e4',1,'openvdb::v3_2_0::util::RootNodeMask::setOff(Index32 i)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#aa1aeb8ff27de4c8cdc9a2168038c62aa',1,'openvdb::v3_2_0::util::RootNodeMask::setOff()']]], + ['setoffseton',['setOffsetOn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a913b5cc4cfdeaf5bd27474e060f2df4d',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['setoffsetonly',['setOffsetOnly',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a64f28428a2c721c25ae79d95a29b482e',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['seton',['setOn',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#aa75829d294f5c5aa5e388588d29bcd8e',1,'openvdb::v3_2_0::util::NodeMask::setOn(Index32 n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a4a08bd62f6d96a28aefa66c60cd095e8',1,'openvdb::v3_2_0::util::NodeMask::setOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#aa75829d294f5c5aa5e388588d29bcd8e',1,'openvdb::v3_2_0::util::NodeMask< 1 >::setOn(Index32 n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a4a08bd62f6d96a28aefa66c60cd095e8',1,'openvdb::v3_2_0::util::NodeMask< 1 >::setOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#aa75829d294f5c5aa5e388588d29bcd8e',1,'openvdb::v3_2_0::util::NodeMask< 2 >::setOn(Index32 n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a4a08bd62f6d96a28aefa66c60cd095e8',1,'openvdb::v3_2_0::util::NodeMask< 2 >::setOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a6b9f1c988262b633ae6a39f71b8574aa',1,'openvdb::v3_2_0::util::RootNodeMask::setOn(Index32 i)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a4a08bd62f6d96a28aefa66c60cd095e8',1,'openvdb::v3_2_0::util::RootNodeMask::setOn()']]], + ['setorigin',['setOrigin',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#ae88e4bb5275c11a053076c34d349d3c5',1,'openvdb::v3_2_0::tools::Morphology::LeafCache::setOrigin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a594b25da67e57a3b0f252ce8417bb5e1',1,'openvdb::v3_2_0::tree::InternalNode::setOrigin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a594b25da67e57a3b0f252ce8417bb5e1',1,'openvdb::v3_2_0::tree::LeafNode::setOrigin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a594b25da67e57a3b0f252ce8417bb5e1',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setOrigin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a594b25da67e57a3b0f252ce8417bb5e1',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setOrigin()']]], + ['setpixelsamples',['setPixelSamples',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#aec145a2bcd0682b7bd4d96e31a5722f8',1,'openvdb::v3_2_0::tools::LevelSetRayTracer']]], + ['setprimarystep',['setPrimaryStep',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#ab1247c2656d38e2144fec234c1601d85',1,'openvdb::v3_2_0::tools::VolumeRender']]], + ['setrange',['setRange',['../classopenvdb_1_1v3__2__0_1_1math_1_1RandInt.html#a45836924d088ae055f6a66cf1ab8d19e',1,'openvdb::v3_2_0::math::RandInt']]], + ['setrefdata',['setRefData',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPoints.html#a0e73850e20690f73ccad494d9ffd54b2',1,'openvdb::v3_2_0::tools::internal::GenPoints::setRefData()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#aa679f78ca65b434a1509b782d5d8564b',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions::setRefData()']]], + ['setrefgrid',['setRefGrid',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#a1f09765480f969c7883f7190c1d15b75',1,'openvdb::v3_2_0::tools::VolumeToMesh']]], + ['setrefsigntree',['setRefSignTree',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPolygons.html#a7682ac0718ee4919eb1688db14ab5059',1,'openvdb::v3_2_0::tools::internal::GenPolygons']]], + ['setresult',['setResult',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a0429b53fb51750f92b0d901ee429e4ed',1,'openvdb::v3_2_0::CombineArgs']]], + ['setresultisactive',['setResultIsActive',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#afc6a5268cc684406ceba1822d8285362',1,'openvdb::v3_2_0::CombineArgs']]], + ['setresultref',['setResultRef',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a7347090d3e7aceee571fee4dc6c2fa81',1,'openvdb::v3_2_0::CombineArgs']]], + ['setrmax',['setRmax',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a0dd9f3fd98a7eee8f8eaf91398fc49c6',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['setrmin',['setRmin',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#ad8dea37d3a808fef39a4e4db4d297b41',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['setrow',['setRow',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#ae2faf0b4df99037081173dda24e399a0',1,'openvdb::v3_2_0::math::Mat3::setRow()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#ab9ccd8d858c93f78abce438c9abad1be',1,'openvdb::v3_2_0::math::Mat4::setRow()']]], + ['setrows',['setRows',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a13403d9598581818322cb6a686a2370c',1,'openvdb::v3_2_0::math::Mat3::setRows()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a454011d03dc14216a6b68d03e5798cf1',1,'openvdb::v3_2_0::math::Mat4::setRows()']]], + ['setsavefloatashalf',['setSaveFloatAsHalf',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a2718ae098c784d28d4c13868e0aab0da',1,'openvdb::v3_2_0::GridBase']]], + ['setscattering',['setScattering',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#ac2e7631fdbd1842d6534de80e91ea7bd',1,'openvdb::v3_2_0::tools::VolumeRender']]], + ['setsecondmap',['setSecondMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#a1f61a3b80137a0eacdfb38a836e6d4e7',1,'openvdb::v3_2_0::math::CompoundMap']]], + ['setseed',['setSeed',['../classopenvdb_1_1v3__2__0_1_1math_1_1Rand01.html#a14b118cee58ff47c6b8f048524e5234e',1,'openvdb::v3_2_0::math::Rand01::setSeed()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1RandInt.html#a14b118cee58ff47c6b8f048524e5234e',1,'openvdb::v3_2_0::math::RandInt::setSeed()']]], + ['setshader',['setShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#ad5a29f4bcba7c7c912e1cb2acd486d26',1,'openvdb::v3_2_0::tools::LevelSetRayTracer']]], + ['setshadowstep',['setShadowStep',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#a0fdc89d0a66b65cc33703dbc306dd890',1,'openvdb::v3_2_0::tools::VolumeRender']]], + ['setskew',['setSkew',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a85e90281d3263d7d4fdc32ea86a4b954',1,'openvdb::v3_2_0::math::Mat3']]], + ['setspatialadaptivity',['setSpatialAdaptivity',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#a8d3ea4435cd57ee0673ed6f82bdace7d',1,'openvdb::v3_2_0::tools::VolumeToMesh::setSpatialAdaptivity()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#a78190ae7140c636921fc1378a06d1d58',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions::setSpatialAdaptivity()']]], + ['setspatialscheme',['setSpatialScheme',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#a6527431f85ca2f424ccffcc16890679c',1,'openvdb::v3_2_0::tools::LevelSetAdvection::setSpatialScheme()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a6527431f85ca2f424ccffcc16890679c',1,'openvdb::v3_2_0::tools::LevelSetMorphing::setSpatialScheme()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a6527431f85ca2f424ccffcc16890679c',1,'openvdb::v3_2_0::tools::LevelSetTracker::setSpatialScheme()']]], + ['setstate',['setState',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a48b4be579118c7039299e32066603204',1,'openvdb::v3_2_0::tools::LevelSetTracker']]], + ['setstreammetadataptr',['setStreamMetadataPtr',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a6b4cd4dddaaa42646767fc481fbdaa68',1,'openvdb::v3_2_0::io']]], + ['setsubsteps',['setSubSteps',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#a276266b548c72990768736d2dd49dd39',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['setsurfacemask',['setSurfaceMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#aad8409de3285ed2eca9535f24ce03b7e',1,'openvdb::v3_2_0::tools::VolumeToMesh']]], + ['setsymmetric',['setSymmetric',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#afad3fd94f0ab86957f4e52bb06a6f889',1,'openvdb::v3_2_0::math::Mat3']]], + ['settaper',['setTaper',['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a15089c08a25ccc50d986d1591c0c7914',1,'openvdb::v3_2_0::math::NonlinearFrustumMap']]], + ['settarget',['setTarget',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#adf5321c3abad8ac9a358baa05c94b2a2',1,'openvdb::v3_2_0::tools::LevelSetMorphing']]], + ['settemporalscheme',['setTemporalScheme',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#a573bb25036eaa55ba38a08fa71dcf90e',1,'openvdb::v3_2_0::tools::LevelSetAdvection::setTemporalScheme()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a573bb25036eaa55ba38a08fa71dcf90e',1,'openvdb::v3_2_0::tools::LevelSetMorphing::setTemporalScheme()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a573bb25036eaa55ba38a08fa71dcf90e',1,'openvdb::v3_2_0::tools::LevelSetTracker::setTemporalScheme()']]], + ['setthreaded',['setThreaded',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html#ac3fa2c9a94b6643ed5244fca102e11a8',1,'openvdb::v3_2_0::tools::GridResampler::setThreaded()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#a86283b3695c213b3b99845f7b5a142bf',1,'openvdb::v3_2_0::tools::PointAdvect::setThreaded()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#a86283b3695c213b3b99845f7b5a142bf',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect::setThreaded()']]], + ['settimeout',['setTimeout',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a527251f96d3fde97ae6fc2ce59404fa9',1,'openvdb::v3_2_0::io::Queue']]], + ['settimes',['setTimes',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a7bd88c13b8025a3c21d2564a8d9d6e09',1,'openvdb::v3_2_0::math::Ray']]], + ['settorotation',['setToRotation',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a65f688c9c1e21facca23a0d79fec4763',1,'openvdb::v3_2_0::math::Mat3::setToRotation(const Quat< T > &q)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a45287dd453383615dcb732a3e54df92a',1,'openvdb::v3_2_0::math::Mat3::setToRotation(const Vec3< T > &axis, T angle)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a685d4df4285b296c70bc8dbd8a46484a',1,'openvdb::v3_2_0::math::Mat4::setToRotation(Axis axis, T angle)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a45287dd453383615dcb732a3e54df92a',1,'openvdb::v3_2_0::math::Mat4::setToRotation(const Vec3< T > &axis, T angle)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a8e67c2d44a8b038838fb6e49d8a37ef3',1,'openvdb::v3_2_0::math::Mat4::setToRotation(const Vec3< T > &v1, const Vec3< T > &v2)']]], + ['settoscale',['setToScale',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a48787960db8612ebca270560134278f4',1,'openvdb::v3_2_0::math::Mat4']]], + ['settoshear',['setToShear',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a5b663434a1d79dac075e03314a139136',1,'openvdb::v3_2_0::math::Mat4']]], + ['settotranslation',['setToTranslation',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a8f656f58c602f9bda786a57c448920d4',1,'openvdb::v3_2_0::math::Mat4']]], + ['settrackerspatialscheme',['setTrackerSpatialScheme',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#a33c5bfbb6c55928e0220518950736182',1,'openvdb::v3_2_0::tools::LevelSetAdvection::setTrackerSpatialScheme()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a33c5bfbb6c55928e0220518950736182',1,'openvdb::v3_2_0::tools::LevelSetMorphing::setTrackerSpatialScheme()']]], + ['settrackertemporalscheme',['setTrackerTemporalScheme',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#a4470ca870c2cfbe5c608c8e38c8eaa01',1,'openvdb::v3_2_0::tools::LevelSetAdvection::setTrackerTemporalScheme()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a4470ca870c2cfbe5c608c8e38c8eaa01',1,'openvdb::v3_2_0::tools::LevelSetMorphing::setTrackerTemporalScheme()']]], + ['settransform',['setTransform',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a91cf0c9e3940765cb7282c58306cd6dc',1,'openvdb::v3_2_0::GridBase']]], + ['settransformtiles',['setTransformTiles',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html#a7b52c3107568cafcdd49c2251f0e55ca',1,'openvdb::v3_2_0::tools::GridResampler']]], + ['settranslation',['setTranslation',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a88fe526682c68a40911ab19cf6deb625',1,'openvdb::v3_2_0::math::Mat4']]], + ['settree',['setTree',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ae693ab309659d2332be7b5f28689f80d',1,'openvdb::v3_2_0::GridBase::setTree()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a74b29f374ee4fc6d366948bdf0017315',1,'openvdb::v3_2_0::Grid::setTree()']]], + ['settype',['SetType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveVoxelValues.html#abc8b747bc4ff51ee3a4bd3be9a5121b4',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveVoxelValues::SetType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveTileValues.html#abc8b747bc4ff51ee3a4bd3be9a5121b4',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveTileValues::SetType()']]], + ['setvalue',['setValue',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a1b5bae192c8a192dfc2b922d3a7579f9',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::setValue()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1RowEditor.html#a15e9d298c2303f14e160920f0b0e0841',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::RowEditor::setValue()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a64a77be68e3bd48960dad1e02318c6ae',1,'openvdb::v3_2_0::math::BaseStencil::setValue()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#ae3243d45e1b81863c339d4425aa7e5d1',1,'openvdb::v3_2_0::TypedMetadata::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a9b5df8b04f08faa7f2fa8a0b59195ba9',1,'openvdb::v3_2_0::tools::Dense::setValue(size_t offset, const ValueT &value)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#acef2f82b3e7e93c3d972f0c69037f9c9',1,'openvdb::v3_2_0::tools::Dense::setValue(size_t i, size_t j, size_t k, const ValueT &value)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a9cd15985c829cc671ce2b1a5b9abe3be',1,'openvdb::v3_2_0::tools::Dense::setValue(const Coord &xyz, const ValueT &value)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ab4a2386db00a844f4b25ef6c7cf91d47',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValue()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#a09c705b71880000fc851bf81b70628da',1,'openvdb::v3_2_0::tree::SparseIteratorBase::setValue()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a2c35bb3eb36168a4f33fd154b31845ac',1,'openvdb::v3_2_0::tree::DenseIteratorBase::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#a8ef005580e83f81e7eb0949baa5552b3',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::setValue()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueIter.html#ad32372deef8e50240267dc6c5e1be847',1,'openvdb::v3_2_0::tree::LeafNode::ValueIter::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a22f28ac746a165fb620a537f6af4f72b',1,'openvdb::v3_2_0::tree::LeafNode::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#afbaa829b05e2d5493eb14a2891b9ac27',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aed32e79c8692008209229a4ab80c72b2',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValue()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ValueIter.html#aeee8e4631a9e126a794fb4597117056c',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#afbaa829b05e2d5493eb14a2891b9ac27',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aed32e79c8692008209229a4ab80c72b2',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValue()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ValueIter.html#aeee8e4631a9e126a794fb4597117056c',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01false_00_01ValueT_00_01ChildT_01_4.html#a8141c87bb6668fe943167b5c9ccaaa1e',1,'openvdb::v3_2_0::tree::NodeUnionImpl< false, ValueT, ChildT >::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01true_00_01ValueT_00_01ChildT_01_4.html#a8141c87bb6668fe943167b5c9ccaaa1e',1,'openvdb::v3_2_0::tree::NodeUnionImpl< true, ValueT, ChildT >::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a83302a39df403b0b10ffcadac5856916',1,'openvdb::v3_2_0::tree::Tree::setValue(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#acbf7e55fdc58f2c5d03395bffe10410e',1,'openvdb::v3_2_0::tree::Tree::setValue(const Coord &xyz, const ValueType &value, AccessT &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a1d997a9de3287e7bec50bdbedbed444a',1,'openvdb::v3_2_0::tree::IterListItem::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a1d997a9de3287e7bec50bdbedbed444a',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a1d997a9de3287e7bec50bdbedbed444a',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a5d8687af03914b4c31a60def13d03158',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a83302a39df403b0b10ffcadac5856916',1,'openvdb::v3_2_0::tree::ValueAccessor::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a83302a39df403b0b10ffcadac5856916',1,'openvdb::v3_2_0::tree::CacheItem::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a83302a39df403b0b10ffcadac5856916',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a83302a39df403b0b10ffcadac5856916',1,'openvdb::v3_2_0::tree::ValueAccessor0::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a83302a39df403b0b10ffcadac5856916',1,'openvdb::v3_2_0::tree::ValueAccessor1::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a83302a39df403b0b10ffcadac5856916',1,'openvdb::v3_2_0::tree::ValueAccessor2::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a83302a39df403b0b10ffcadac5856916',1,'openvdb::v3_2_0::tree::ValueAccessor3::setValue()']]], + ['setvalueandcache',['setValueAndCache',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a01b75fc2aa129aa05ae677971dc1972e',1,'openvdb::v3_2_0::tree::InternalNode::setValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ae8ee72e6614f6ddc47ce05dcce1c9092',1,'openvdb::v3_2_0::tree::LeafNode::setValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ad1a716fa360b4fa06e5b931c14bffd73',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ad1a716fa360b4fa06e5b931c14bffd73',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a01b75fc2aa129aa05ae677971dc1972e',1,'openvdb::v3_2_0::tree::RootNode::setValueAndCache()']]], + ['setvaluemask',['setValueMask',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aac35a428ae112efe59a8f01d22056dcd',1,'openvdb::v3_2_0::tree::InternalNode::setValueMask()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a2951db6e10e3678b2af46f34982105a6',1,'openvdb::v3_2_0::tree::LeafNode::setValueMask(const NodeMaskType &mask)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aac35a428ae112efe59a8f01d22056dcd',1,'openvdb::v3_2_0::tree::LeafNode::setValueMask(Index n, bool on)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a2951db6e10e3678b2af46f34982105a6',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueMask(const NodeMaskType &mask)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aac35a428ae112efe59a8f01d22056dcd',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueMask(Index n, bool on)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a2951db6e10e3678b2af46f34982105a6',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueMask(const NodeMaskType &mask)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aac35a428ae112efe59a8f01d22056dcd',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueMask(Index n, bool on)']]], + ['setvaluemaskoff',['setValueMaskOff',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ae66c20c79af561b6bdf17cf3684dbcca',1,'openvdb::v3_2_0::tree::LeafNode::setValueMaskOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ae66c20c79af561b6bdf17cf3684dbcca',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueMaskOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ae66c20c79af561b6bdf17cf3684dbcca',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueMaskOff()']]], + ['setvaluemaskon',['setValueMaskOn',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a518b60edb92644e31806f5f8739afe07',1,'openvdb::v3_2_0::tree::LeafNode::setValueMaskOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a518b60edb92644e31806f5f8739afe07',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueMaskOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a518b60edb92644e31806f5f8739afe07',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueMaskOn()']]], + ['setvalueoff',['setValueOff',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a157acd52b5f423788579b691ec2b7e5d',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValueOff(const Coord &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a2662286679457e483ce4517a5e578856',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValueOff(Index)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a0d6ce7f9a237c1ea782a67e71894de43',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValueOff(const Coord &, const ValueType &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a422a33cd95ddd34f7c30c1570f63d837',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValueOff(Index, const ValueType &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a8a91d631df8f64f84a0aad7436cb11f3',1,'openvdb::v3_2_0::tree::InternalNode::setValueOff(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a73a6e7c85d37e7d677eddc3cce8aa11b',1,'openvdb::v3_2_0::tree::InternalNode::setValueOff(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#ac26d085986c07a363f7c5140858c0251',1,'openvdb::v3_2_0::tree::IteratorBase::setValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a8a91d631df8f64f84a0aad7436cb11f3',1,'openvdb::v3_2_0::tree::LeafNode::setValueOff(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a8cb1b188e8df2cb271dd3d2f50f41681',1,'openvdb::v3_2_0::tree::LeafNode::setValueOff(Index offset)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ab3688aa6f3ccd5cb20a3d8481d21d1e2',1,'openvdb::v3_2_0::tree::LeafNode::setValueOff(const Coord &xyz, const ValueType &val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a018fd2e0c199bb392d5eb5da3cdf62af',1,'openvdb::v3_2_0::tree::LeafNode::setValueOff(Index offset, const ValueType &val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8a91d631df8f64f84a0aad7436cb11f3',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueOff(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8cb1b188e8df2cb271dd3d2f50f41681',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueOff(Index offset)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8b17b9a15004fe221018c648099084f5',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueOff(const Coord &xyz, bool val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aa346d06a35c22d1d18f8da66dfd9f22d',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueOff(Index offset, bool val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8a91d631df8f64f84a0aad7436cb11f3',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueOff(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8cb1b188e8df2cb271dd3d2f50f41681',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueOff(Index offset)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8b17b9a15004fe221018c648099084f5',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueOff(const Coord &xyz, bool val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aa346d06a35c22d1d18f8da66dfd9f22d',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueOff(Index offset, bool val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a8a91d631df8f64f84a0aad7436cb11f3',1,'openvdb::v3_2_0::tree::RootNode::setValueOff(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a73a6e7c85d37e7d677eddc3cce8aa11b',1,'openvdb::v3_2_0::tree::RootNode::setValueOff(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a8a91d631df8f64f84a0aad7436cb11f3',1,'openvdb::v3_2_0::tree::Tree::setValueOff(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a73a6e7c85d37e7d677eddc3cce8aa11b',1,'openvdb::v3_2_0::tree::Tree::setValueOff(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#ad5be67d92ab97c5f5e5a9ff654b113a7',1,'openvdb::v3_2_0::tree::IterListItem::setValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#ad5be67d92ab97c5f5e5a9ff654b113a7',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::setValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#ad5be67d92ab97c5f5e5a9ff654b113a7',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::setValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#ac26d085986c07a363f7c5140858c0251',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::setValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a73a6e7c85d37e7d677eddc3cce8aa11b',1,'openvdb::v3_2_0::tree::ValueAccessor::setValueOff(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a8a91d631df8f64f84a0aad7436cb11f3',1,'openvdb::v3_2_0::tree::ValueAccessor::setValueOff(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a73a6e7c85d37e7d677eddc3cce8aa11b',1,'openvdb::v3_2_0::tree::CacheItem::setValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a73a6e7c85d37e7d677eddc3cce8aa11b',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::setValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a73a6e7c85d37e7d677eddc3cce8aa11b',1,'openvdb::v3_2_0::tree::ValueAccessor0::setValueOff(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a8a91d631df8f64f84a0aad7436cb11f3',1,'openvdb::v3_2_0::tree::ValueAccessor0::setValueOff(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a73a6e7c85d37e7d677eddc3cce8aa11b',1,'openvdb::v3_2_0::tree::ValueAccessor1::setValueOff(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a8a91d631df8f64f84a0aad7436cb11f3',1,'openvdb::v3_2_0::tree::ValueAccessor1::setValueOff(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a73a6e7c85d37e7d677eddc3cce8aa11b',1,'openvdb::v3_2_0::tree::ValueAccessor2::setValueOff(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a8a91d631df8f64f84a0aad7436cb11f3',1,'openvdb::v3_2_0::tree::ValueAccessor2::setValueOff(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a73a6e7c85d37e7d677eddc3cce8aa11b',1,'openvdb::v3_2_0::tree::ValueAccessor3::setValueOff(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a8a91d631df8f64f84a0aad7436cb11f3',1,'openvdb::v3_2_0::tree::ValueAccessor3::setValueOff(const Coord &xyz)']]], + ['setvalueoffandcache',['setValueOffAndCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#aa82f36fe9e6eeac9909952ed298af1b5',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValueOffAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a6c0c65991a0b3c81933cd944d8fc4267',1,'openvdb::v3_2_0::tree::InternalNode::setValueOffAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a6c0c65991a0b3c81933cd944d8fc4267',1,'openvdb::v3_2_0::tree::LeafNode::setValueOffAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a7dde8d936e742fde1718afa992e22464',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueOffAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a7dde8d936e742fde1718afa992e22464',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueOffAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a6c0c65991a0b3c81933cd944d8fc4267',1,'openvdb::v3_2_0::tree::RootNode::setValueOffAndCache()']]], + ['setvalueon',['setValueOn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ab7cbae071a9630574d285db352835a88',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValueOn(const Coord &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#abbc6b8f7bdd2f938a93daeea15f813e8',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValueOn(Index)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#afcf6e153d2643353e8295779462ef2f0',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValueOn(const Coord &, const ValueType &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a36f21a6d64bc316e96c89f54be5846cd',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValueOn(Index, const ValueType &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ad6cf12f28a771762327ba1578bc48e9c',1,'openvdb::v3_2_0::tree::InternalNode::setValueOn(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ae95653046c85afb743075f139a26df9d',1,'openvdb::v3_2_0::tree::InternalNode::setValueOn(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#af36e33ae54f981b0ef0c83d98f41ecc0',1,'openvdb::v3_2_0::tree::IteratorBase::setValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ad6cf12f28a771762327ba1578bc48e9c',1,'openvdb::v3_2_0::tree::LeafNode::setValueOn(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a0aed89e8ab2030604c9a7c471a456b7e',1,'openvdb::v3_2_0::tree::LeafNode::setValueOn(Index offset)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a3defa14b3fc5475f0dc86c70ec99a8f1',1,'openvdb::v3_2_0::tree::LeafNode::setValueOn(const Coord &xyz, const ValueType &val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a70286c78f2711d3e9a1e5b6a3caa27f4',1,'openvdb::v3_2_0::tree::LeafNode::setValueOn(Index offset, const ValueType &val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ad6cf12f28a771762327ba1578bc48e9c',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueOn(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a0aed89e8ab2030604c9a7c471a456b7e',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueOn(Index offset)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ad1a39a4b798e478aec4e23cbee484d5e',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueOn(const Coord &xyz, bool val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a96b8213558b242a41aad2c6bf850b885',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueOn(Index offset, bool val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ad6cf12f28a771762327ba1578bc48e9c',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueOn(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a0aed89e8ab2030604c9a7c471a456b7e',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueOn(Index offset)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ad1a39a4b798e478aec4e23cbee484d5e',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueOn(const Coord &xyz, bool val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a96b8213558b242a41aad2c6bf850b885',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueOn(Index offset, bool val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ae95653046c85afb743075f139a26df9d',1,'openvdb::v3_2_0::tree::RootNode::setValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ad6cf12f28a771762327ba1578bc48e9c',1,'openvdb::v3_2_0::tree::Tree::setValueOn(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ae95653046c85afb743075f139a26df9d',1,'openvdb::v3_2_0::tree::Tree::setValueOn(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#aae50a0550c4bb40ff60dac5e329acfe6',1,'openvdb::v3_2_0::tree::IterListItem::setValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#aae50a0550c4bb40ff60dac5e329acfe6',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::setValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#aae50a0550c4bb40ff60dac5e329acfe6',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::setValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#ae95653046c85afb743075f139a26df9d',1,'openvdb::v3_2_0::tree::ValueAccessor::setValueOn(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#ad6cf12f28a771762327ba1578bc48e9c',1,'openvdb::v3_2_0::tree::ValueAccessor::setValueOn(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#ae95653046c85afb743075f139a26df9d',1,'openvdb::v3_2_0::tree::CacheItem::setValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#ae95653046c85afb743075f139a26df9d',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::setValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#ae95653046c85afb743075f139a26df9d',1,'openvdb::v3_2_0::tree::ValueAccessor0::setValueOn(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#ad6cf12f28a771762327ba1578bc48e9c',1,'openvdb::v3_2_0::tree::ValueAccessor0::setValueOn(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#ae95653046c85afb743075f139a26df9d',1,'openvdb::v3_2_0::tree::ValueAccessor1::setValueOn(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#ad6cf12f28a771762327ba1578bc48e9c',1,'openvdb::v3_2_0::tree::ValueAccessor1::setValueOn(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#ae95653046c85afb743075f139a26df9d',1,'openvdb::v3_2_0::tree::ValueAccessor2::setValueOn(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#ad6cf12f28a771762327ba1578bc48e9c',1,'openvdb::v3_2_0::tree::ValueAccessor2::setValueOn(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#ae95653046c85afb743075f139a26df9d',1,'openvdb::v3_2_0::tree::ValueAccessor3::setValueOn(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#ad6cf12f28a771762327ba1578bc48e9c',1,'openvdb::v3_2_0::tree::ValueAccessor3::setValueOn(const Coord &xyz)']]], + ['setvalueonly',['setValueOnly',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a6f7e35635a5321cbf5a099560e461404',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValueOnly(const Coord &, const ValueType &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a49bfd89cfc59f0931ee27afa69b68352',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValueOnly(Index, const ValueType &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a63ff695beda11ed9ef625a28ce8a5faf',1,'openvdb::v3_2_0::tree::InternalNode::setValueOnly()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a2d72eba31e9c004daae5ebf141f981a0',1,'openvdb::v3_2_0::tree::LeafNode::setValueOnly(const Coord &xyz, const ValueType &val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ad8a9dc060855330127a4ce4e7bc868b3',1,'openvdb::v3_2_0::tree::LeafNode::setValueOnly(Index offset, const ValueType &val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8d424e19979700c977f9f450338dcf78',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueOnly(const Coord &xyz, bool val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a40305a11083d41832ad0eb65285bee66',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueOnly(Index offset, bool val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8d424e19979700c977f9f450338dcf78',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueOnly(const Coord &xyz, bool val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a40305a11083d41832ad0eb65285bee66',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueOnly(Index offset, bool val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a63ff695beda11ed9ef625a28ce8a5faf',1,'openvdb::v3_2_0::tree::RootNode::setValueOnly()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a63ff695beda11ed9ef625a28ce8a5faf',1,'openvdb::v3_2_0::tree::Tree::setValueOnly()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a63ff695beda11ed9ef625a28ce8a5faf',1,'openvdb::v3_2_0::tree::ValueAccessor::setValueOnly()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a63ff695beda11ed9ef625a28ce8a5faf',1,'openvdb::v3_2_0::tree::CacheItem::setValueOnly()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a63ff695beda11ed9ef625a28ce8a5faf',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::setValueOnly()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a63ff695beda11ed9ef625a28ce8a5faf',1,'openvdb::v3_2_0::tree::ValueAccessor0::setValueOnly()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a63ff695beda11ed9ef625a28ce8a5faf',1,'openvdb::v3_2_0::tree::ValueAccessor1::setValueOnly()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a63ff695beda11ed9ef625a28ce8a5faf',1,'openvdb::v3_2_0::tree::ValueAccessor2::setValueOnly()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a63ff695beda11ed9ef625a28ce8a5faf',1,'openvdb::v3_2_0::tree::ValueAccessor3::setValueOnly()']]], + ['setvalueonlyandcache',['setValueOnlyAndCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ac783868175708b77734e0aecde5e9fc8',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValueOnlyAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a5cefbe46cc3180e5394a2f4fc775bfe8',1,'openvdb::v3_2_0::tree::InternalNode::setValueOnlyAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ad7e47aea51f5577ab6e9f265ebd90784',1,'openvdb::v3_2_0::tree::LeafNode::setValueOnlyAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aa1b17f54c66de3d1179ffc993e0402df',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueOnlyAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aa1b17f54c66de3d1179ffc993e0402df',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueOnlyAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a5cefbe46cc3180e5394a2f4fc775bfe8',1,'openvdb::v3_2_0::tree::RootNode::setValueOnlyAndCache()']]], + ['setvalueonmax',['setValueOnMax',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a7c76dc587d3f1735c0113f04ace2f257',1,'openvdb::v3_2_0::tools']]], + ['setvalueonmin',['setValueOnMin',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#adbdcf782cb40fcb514524737e2f8e070',1,'openvdb::v3_2_0::tools']]], + ['setvalueonmult',['setValueOnMult',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a2fa019501d9dddd1891421935c31efba',1,'openvdb::v3_2_0::tools']]], + ['setvalueonsum',['setValueOnSum',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a92d1e43e1896e1a7fa9548c4fd4a2988',1,'openvdb::v3_2_0::tools']]], + ['setvaluesoff',['setValuesOff',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a3b57193b785bb1e6d88d8402613516fe',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValuesOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a3b57193b785bb1e6d88d8402613516fe',1,'openvdb::v3_2_0::tree::LeafNode::setValuesOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a3b57193b785bb1e6d88d8402613516fe',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValuesOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a3b57193b785bb1e6d88d8402613516fe',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValuesOff()']]], + ['setvalueson',['setValuesOn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ac155d78b56e45b4d18aad6b18d957d5a',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValuesOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ac155d78b56e45b4d18aad6b18d957d5a',1,'openvdb::v3_2_0::tree::InternalNode::setValuesOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ac155d78b56e45b4d18aad6b18d957d5a',1,'openvdb::v3_2_0::tree::LeafNode::setValuesOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ac155d78b56e45b4d18aad6b18d957d5a',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValuesOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ac155d78b56e45b4d18aad6b18d957d5a',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValuesOn()']]], + ['setvectortype',['setVectorType',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a84dcd39f42e4f0558516c040e576fe03',1,'openvdb::v3_2_0::GridBase']]], + ['setversion',['setVersion',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#aea8253e2780539b584149342000dde7f',1,'openvdb::v3_2_0::io']]], + ['setworldray',['setWorldRay',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#ad4334e396bf96feeb6e90634f63f907e',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::setWorldRay()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#ad4334e396bf96feeb6e90634f63f907e',1,'openvdb::v3_2_0::tools::LinearSearchImpl::setWorldRay()']]], + ['setwritegridstats',['setWriteGridStats',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#afef9484575d167652b8c68c694fb5684',1,'openvdb::v3_2_0::io::StreamMetadata']]], + ['setwritegridstatsmetadata',['setWriteGridStatsMetadata',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a2a87af919ccdeaad2d8284328c3dc43d',1,'openvdb::v3_2_0::io']]], + ['setx',['setX',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a076220dc99eeee3d14fa4a6d14e1afe2',1,'openvdb::v3_2_0::math::Coord']]], + ['sety',['setY',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a566e12e5b1da60fc46190aa3ed2becdc',1,'openvdb::v3_2_0::math::Coord']]], + ['setz',['setZ',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#ae76ceb6d7bb75bdfab3c397662f3acf1',1,'openvdb::v3_2_0::math::Coord']]], + ['setzero',['setZero',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a47affd1a10b589811fc4828c1a2e0c6d',1,'openvdb::v3_2_0::math::Mat3::setZero()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a47affd1a10b589811fc4828c1a2e0c6d',1,'openvdb::v3_2_0::math::Mat4::setZero()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a096c7b12001a1682c9a0deeaa836c962',1,'openvdb::v3_2_0::math::Quat::setZero()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a0adc29f49caf8f7f8581881b3a9a98aa',1,'openvdb::v3_2_0::math::Vec2::setZero()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a3efb51740d8cafa348fdeca7c7257398',1,'openvdb::v3_2_0::math::Vec3::setZero()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a7d6f1f79d33e75a1e14968a821f477b6',1,'openvdb::v3_2_0::math::Vec4::setZero()']]], + ['sevenpointstencil',['SevenPointStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1SevenPointStencil.html',1,'openvdb::v3_2_0::math']]], + ['sevenpointstencil',['SevenPointStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1SevenPointStencil.html#a4f35d9e1276e7bde47ba3e3383681721',1,'openvdb::v3_2_0::math::SevenPointStencil']]], + ['shallowcopy',['ShallowCopy',['../classopenvdb_1_1v3__2__0_1_1ShallowCopy.html',1,'openvdb::v3_2_0']]], + ['sharedopapplier',['SharedOpApplier',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpApplier.html',1,'openvdb::v3_2_0::tools::valxform']]], + ['sharedopapplier',['SharedOpApplier',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpApplier.html#a74c2a486c2ec7b3cd80d9b3c21e6e556',1,'openvdb::v3_2_0::tools::valxform::SharedOpApplier']]], + ['sharedoptransformer',['SharedOpTransformer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpTransformer.html',1,'openvdb::v3_2_0::tools::valxform']]], + ['sharedoptransformer',['SharedOpTransformer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpTransformer.html#a1f4ab4f7b3e751b36c0e35a0d65061bb',1,'openvdb::v3_2_0::tools::valxform::SharedOpTransformer::SharedOpTransformer(const InIterT &inIter, OutTreeT &outTree, OpT &op, MergePolicy merge)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpTransformer.html#a0b947f799501fdbb31f7317a8d68d0a5',1,'openvdb::v3_2_0::tools::valxform::SharedOpTransformer::SharedOpTransformer(SharedOpTransformer &other, tbb::split)']]], + ['shear',['shear',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a5efd58688e403badf8d1a3e3b0297063',1,'openvdb::v3_2_0::math']]], + ['shrink_5fto_5ffit',['shrink_to_fit',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a5f16304f80b6fb253c7b0ead3e16dd18',1,'openvdb::v3_2_0::util::PagedArray']]], + ['sign',['Sign',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4be789062070fa143eebdb4b14ff5221',1,'openvdb::v3_2_0::math']]], + ['signchange',['SignChange',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a0848094540c0f952759c78b8a185874a',1,'openvdb::v3_2_0::math']]], + ['signdata',['SignData',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html',1,'openvdb::v3_2_0::tools::internal']]], + ['signdata',['SignData',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#a25dbd5ebf42368e19641eabf1ff93db7',1,'openvdb::v3_2_0::tools::internal::SignData::SignData(const TreeT &distTree, const LeafManagerT &leafs, ValueT iso)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#a5c0cd54e0c28a74a9563b8a3fe618d14',1,'openvdb::v3_2_0::tools::internal::SignData::SignData(SignData &, tbb::split)']]], + ['signedfloodfill',['signedFloodFill',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ad2be2e532f18c739ca1abe49bbab4a16',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::signedFloodFill(const ValueType &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a59b8e25d1d3fd49ece8c4a467a974617',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::signedFloodFill(const ValueType &, const ValueType &)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ab8c1921d688e3c65c71aac5405f155a9',1,'openvdb::v3_2_0::tools::signedFloodFill()']]], + ['signedfloodfill_2eh',['SignedFloodFill.h',['../SignedFloodFill_8h.html',1,'']]], + ['signedfloodfillop',['SignedFloodFillOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SignedFloodFillOp.html',1,'openvdb::v3_2_0::tools']]], + ['signedfloodfillop',['SignedFloodFillOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SignedFloodFillOp.html#a149227b266169122fd3ca89e221fec8a',1,'openvdb::v3_2_0::tools::SignedFloodFillOp::SignedFloodFillOp(const TreeOrLeafManagerT &tree, Index minLevel=0)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SignedFloodFillOp.html#ab1b776b97b600f71b08275f60d6883c7',1,'openvdb::v3_2_0::tools::SignedFloodFillOp::SignedFloodFillOp(ValueT outsideValue, ValueT insideValue, Index minLevel=0)']]], + ['signedfloodfillwithvalues',['signedFloodFillWithValues',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a059130a68dd01092e7db04afa0f2580e',1,'openvdb::v3_2_0::tools']]], + ['signs',['SIGNS',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a0341d081395407fd92061819ba76eb96a4a285aeafad96018c303430889836f2b',1,'openvdb::v3_2_0::tools::internal']]], + ['signtree',['signTree',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#aed8f10efa418d1d1f09f1a7c822424a6',1,'openvdb::v3_2_0::tools::internal::SignData::signTree()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestSurfacePoint.html#a9179894dd802618d4d5840c9695cd4f2',1,'openvdb::v3_2_0::tools::ClosestSurfacePoint::signTree()']]], + ['simplify',['simplify',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9e71156c62c4944ae9fa8683d5e48657',1,'openvdb::v3_2_0::math']]], + ['sixthorderdensestencil',['SixthOrderDenseStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1SixthOrderDenseStencil.html#a3f8fa3beed4cdfe2c460987989b68703',1,'openvdb::v3_2_0::math::SixthOrderDenseStencil']]], + ['sixthorderdensestencil',['SixthOrderDenseStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1SixthOrderDenseStencil.html',1,'openvdb::v3_2_0::math']]], + ['size',['SIZE',['../classopenvdb_1_1v3__2__0_1_1math_1_1SevenPointStencil.html#af08413a3ee12cf78b0ddeea71e2648b3',1,'openvdb::v3_2_0::math::SevenPointStencil::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BoxStencil.html#af08413a3ee12cf78b0ddeea71e2648b3',1,'openvdb::v3_2_0::math::BoxStencil::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SecondOrderDenseStencil.html#af08413a3ee12cf78b0ddeea71e2648b3',1,'openvdb::v3_2_0::math::SecondOrderDenseStencil::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ThirteenPointStencil.html#af08413a3ee12cf78b0ddeea71e2648b3',1,'openvdb::v3_2_0::math::ThirteenPointStencil::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1FourthOrderDenseStencil.html#af08413a3ee12cf78b0ddeea71e2648b3',1,'openvdb::v3_2_0::math::FourthOrderDenseStencil::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NineteenPointStencil.html#af08413a3ee12cf78b0ddeea71e2648b3',1,'openvdb::v3_2_0::math::NineteenPointStencil::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SixthOrderDenseStencil.html#af08413a3ee12cf78b0ddeea71e2648b3',1,'openvdb::v3_2_0::math::SixthOrderDenseStencil::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#af08413a3ee12cf78b0ddeea71e2648b3',1,'openvdb::v3_2_0::math::GradStencil::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html#af08413a3ee12cf78b0ddeea71e2648b3',1,'openvdb::v3_2_0::math::WenoStencil::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CurvatureStencil.html#af08413a3ee12cf78b0ddeea71e2648b3',1,'openvdb::v3_2_0::math::CurvatureStencil::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#acc76c5cb3a1194e8709198916eb66671',1,'openvdb::v3_2_0::tree::LeafNode::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#acc76c5cb3a1194e8709198916eb66671',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#acc76c5cb3a1194e8709198916eb66671',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a8bef27a409ee3c3bfea14a7f91266b5d',1,'openvdb::v3_2_0::util::NodeMask::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a8bef27a409ee3c3bfea14a7f91266b5d',1,'openvdb::v3_2_0::util::NodeMask< 1 >::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a8bef27a409ee3c3bfea14a7f91266b5d',1,'openvdb::v3_2_0::util::NodeMask< 2 >::SIZE()'],['../structopenvdb_1_1v3__2__0_1_1VecTraits.html#a98e1f423a914fbfd9c6b25fa88a74460',1,'openvdb::v3_2_0::VecTraits::Size()'],['../structopenvdb_1_1v3__2__0_1_1VecTraits_3_01math_1_1Vec2_3_01T_01_4_01_4.html#a98e1f423a914fbfd9c6b25fa88a74460',1,'openvdb::v3_2_0::VecTraits< math::Vec2< T > >::Size()'],['../structopenvdb_1_1v3__2__0_1_1VecTraits_3_01math_1_1Vec3_3_01T_01_4_01_4.html#a98e1f423a914fbfd9c6b25fa88a74460',1,'openvdb::v3_2_0::VecTraits< math::Vec3< T > >::Size()'],['../structopenvdb_1_1v3__2__0_1_1VecTraits_3_01math_1_1Vec4_3_01T_01_4_01_4.html#a98e1f423a914fbfd9c6b25fa88a74460',1,'openvdb::v3_2_0::VecTraits< math::Vec4< T > >::Size()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html#ad9cbb88cc8635ed20ad0d21ab892fbdc',1,'openvdb::v3_2_0::util::PagedArray::Page::Size()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#acc53f18d7e15681bf742b1efa1be0060a052a2b4924452fb4a73f2cb52b6e9d41',1,'openvdb::v3_2_0::math::Mat::size()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#aab938108caad0d0e47d6885b5ba2d23a',1,'openvdb::v3_2_0::math::Tuple::size()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#a854352f53b148adc24983a58a1866d66',1,'openvdb::v3_2_0::tools::Morphology::LeafCache::size()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a149c924fd6068764bbce066e145b8c10',1,'openvdb::v3_2_0::io::Queue::size()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#af7dc069d46f652992610686c1cb4f781',1,'openvdb::v3_2_0::math::pcg::Vector::size()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#af7dc069d46f652992610686c1cb4f781',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::size()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#a0b6868dbef44fc07f11d050eb59e5f7e',1,'openvdb::v3_2_0::math::Extrema::size()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html#a0b6868dbef44fc07f11d050eb59e5f7e',1,'openvdb::v3_2_0::math::Histogram::size()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#af4b57d21919c42d55af03391f91a1c08',1,'openvdb::v3_2_0::math::BaseStencil::size()'],['../classopenvdb_1_1v3__2__0_1_1Metadata.html#add186f7d6005e31d34be264d7c62adb8',1,'openvdb::v3_2_0::Metadata::size()'],['../classopenvdb_1_1v3__2__0_1_1UnknownMetadata.html#a258a0a1d9b8dfba5d4a2ac2e33a3df56',1,'openvdb::v3_2_0::UnknownMetadata::size()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a149c924fd6068764bbce066e145b8c10',1,'openvdb::v3_2_0::TypedMetadata::size()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html#aac782da1f912bceb5d8ad00c8dc892ac',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::LeafNodeConnectivityTable::size()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#aac782da1f912bceb5d8ad00c8dc892ac',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::size()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#aac782da1f912bceb5d8ad00c8dc892ac',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray::size()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#aac782da1f912bceb5d8ad00c8dc892ac',1,'openvdb::v3_2_0::tools::PointIndexIterator::size()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#aac782da1f912bceb5d8ad00c8dc892ac',1,'openvdb::v3_2_0::tools::PointPartitioner::size()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#aac782da1f912bceb5d8ad00c8dc892ac',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator::size()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1Array.html#aac782da1f912bceb5d8ad00c8dc892ac',1,'openvdb::v3_2_0::tools::point_partitioner_internal::Array::size()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange.html#aac782da1f912bceb5d8ad00c8dc892ac',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::size()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#ac4afa5b077a3b036102da5ceef8c7b51',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::size()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ac4afa5b077a3b036102da5ceef8c7b51',1,'openvdb::v3_2_0::tree::LeafNode::size()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#ac4afa5b077a3b036102da5ceef8c7b51',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::size()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ac4afa5b077a3b036102da5ceef8c7b51',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::size()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#ac4afa5b077a3b036102da5ceef8c7b51',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::size()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ac4afa5b077a3b036102da5ceef8c7b51',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::size()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange.html#aac782da1f912bceb5d8ad00c8dc892ac',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::size()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#aac782da1f912bceb5d8ad00c8dc892ac',1,'openvdb::v3_2_0::util::PagedArray::size()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ValueBuffer.html#aac782da1f912bceb5d8ad00c8dc892ac',1,'openvdb::v3_2_0::util::PagedArray::ValueBuffer::size()'],['../MaskToLevelSet_8h.html#aab938108caad0d0e47d6885b5ba2d23a',1,'size(): MaskToLevelSet.h'],['../ParticlesToLevelSet_8h.html#aab938108caad0d0e47d6885b5ba2d23a',1,'size(): ParticlesToLevelSet.h']]], + ['size_5f',['SIZE_',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#acc53f18d7e15681bf742b1efa1be0060',1,'openvdb::v3_2_0::math::Mat']]], + ['sizerange',['SizeRange',['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg.html#af85676c715387990c429d7e4baa89200',1,'openvdb::v3_2_0::math::pcg']]], + ['sizetype',['SizeType',['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg.html#a51ed7a9d9dd68b654a0bc7772a1ba34f',1,'openvdb::v3_2_0::math::pcg']]], + ['skew',['skew',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af3812855c2b35358e1cbe31445fd5e31',1,'openvdb::v3_2_0::math']]], + ['slerp',['slerp',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#aea60bacac9490ebd9edc4efd1d2f294c',1,'openvdb::v3_2_0::math::Quat::slerp()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7997743b8ee33d2266278c9262e49768',1,'openvdb::v3_2_0::math::slerp(const Quat< T > &q1, const Quat< T > &q2, T t, T tolerance=0.00001)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a6f49cb641c4f0b73ab8a43179f1547f9',1,'openvdb::v3_2_0::math::slerp(const Mat3< T0 > &m1, const Mat3< T0 > &m2, T t)']]], + ['smoothlevelset',['smoothLevelSet',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1ttls__internal.html#a84b0b613fb2bd5af8aee0238dbbcc9d6',1,'openvdb::v3_2_0::tools::ttls_internal']]], + ['smoothunitstep',['SmoothUnitStep',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a6691afc8dd49ef476c2eef71f8e19d70',1,'openvdb::v3_2_0::math::SmoothUnitStep(Type x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a815bc68966e8fa82e1705edfd3392125',1,'openvdb::v3_2_0::math::SmoothUnitStep(Type x, Type min, Type max)']]], + ['snapbasis',['snapBasis',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a9529d44f4f5fa0a22b015b9a9f6f6730',1,'openvdb::v3_2_0::math::Mat3']]], + ['snapmatbasis',['snapMatBasis',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#abe8e9e9f721c2be033a93d15406f6d06',1,'openvdb::v3_2_0::math']]], + ['soff',['sOff',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a2c2dd94242d16c17b9144c58d05db4b4',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::sOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a2c2dd94242d16c17b9144c58d05db4b4',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::sOff()']]], + ['solve',['solve',['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg.html#abbf96ede759d64b2980bf2c9937fca8c',1,'openvdb::v3_2_0::math::pcg::solve(const PositiveDefMatrix &A, const Vector< typename PositiveDefMatrix::ValueType > &b, Vector< typename PositiveDefMatrix::ValueType > &x, Preconditioner< typename PositiveDefMatrix::ValueType > &preconditioner, const State &termination=terminationDefaults< typename PositiveDefMatrix::ValueType >())'],['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg.html#afb7c294cd591e6386c55b058398c98a1',1,'openvdb::v3_2_0::math::pcg::solve(const PositiveDefMatrix &A, const Vector< typename PositiveDefMatrix::ValueType > &b, Vector< typename PositiveDefMatrix::ValueType > &x, Preconditioner< typename PositiveDefMatrix::ValueType > &preconditioner, Interrupter &interrupter, const State &termination=terminationDefaults< typename PositiveDefMatrix::ValueType >())'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#a69eb7890056f6122acf09df794124307',1,'openvdb::v3_2_0::tools::poisson::solve(const TreeType &, math::pcg::State &)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#a6f2481b66207c7861c99da7c46201d13',1,'openvdb::v3_2_0::tools::poisson::solve(const TreeType &, math::pcg::State &, Interrupter &)']]], + ['solvewithboundaryconditions',['solveWithBoundaryConditions',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#aa7373f5baf9c844b4754a66f7659b25f',1,'openvdb::v3_2_0::tools::poisson']]], + ['solvewithboundaryconditionsandpreconditioner',['solveWithBoundaryConditionsAndPreconditioner',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#a8d7fbe4766c1a5d3248f4cbf38e74db3',1,'openvdb::v3_2_0::tools::poisson::solveWithBoundaryConditionsAndPreconditioner(const TreeType &, const BoundaryOp &, math::pcg::State &, Interrupter &)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#ac38e26bad110260e8dd67106631d6f83',1,'openvdb::v3_2_0::tools::poisson::solveWithBoundaryConditionsAndPreconditioner(const TreeType &, const DomainTreeType &, const BoundaryOp &, math::pcg::State &, Interrupter &)']]], + ['son',['sOn',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ad0df23e379999fac3d046d5d60299aca',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::sOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ad0df23e379999fac3d046d5d60299aca',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::sOn()']]], + ['sort',['sort',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a47fdc9eea42b6975cdc835bb2e08810e',1,'openvdb::v3_2_0::math::BBox::sort()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a47fdc9eea42b6975cdc835bb2e08810e',1,'openvdb::v3_2_0::util::PagedArray::sort()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#ad66b8f5aada32437d501b5a7fe7ff5e1',1,'openvdb::v3_2_0::util::PagedArray::sort()']]], + ['source',['source',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1ISLaplacianOp.html#afc7b08ed7dd68f1e1c2d802c318b43f8',1,'openvdb::v3_2_0::tools::poisson::internal::ISLaplacianOp']]], + ['sparsecomposite',['sparseComposite',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#a0d659e104915fecad70b4468799fa12b',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor']]], + ['sparseextractor',['SparseExtractor',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#afd2b371105b208b51695cc289c89681b',1,'openvdb::v3_2_0::tools::SparseExtractor::SparseExtractor(const DenseType &dense, const OpType &functor, const ResultValueType background)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#aff353c9b743e8f5295894a01ed7849a8',1,'openvdb::v3_2_0::tools::SparseExtractor::SparseExtractor(const DenseType &dense, const openvdb::math::CoordBBox &bbox, const OpType &functor, const ResultValueType background)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#af50d9021dfff27d07c273086b9f6b7e4',1,'openvdb::v3_2_0::tools::SparseExtractor::SparseExtractor(SparseExtractor &other, tbb::split)']]], + ['sparseextractor',['SparseExtractor',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html',1,'openvdb::v3_2_0::tools']]], + ['sparseiteratorbase',['SparseIteratorBase',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#a54985f7119d03653ec307d1046e5ae71',1,'openvdb::v3_2_0::tree::SparseIteratorBase::SparseIteratorBase()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#a4a9bb35b5a0262a993e0220b9f29a229',1,'openvdb::v3_2_0::tree::SparseIteratorBase::SparseIteratorBase(const MaskIterT &iter, NodeT *parent)']]], + ['sparseiteratorbase',['SparseIteratorBase',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['sparseiteratorbase_3c_20maskitert_2c_20childiter_3c_20maskitert_2c_20nodet_20_3e_2c_20nodet_2c_20bool_20_3e',['SparseIteratorBase< MaskIterT, ChildIter< MaskIterT, NodeT >, NodeT, bool >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['sparseiteratorbase_3c_20maskitert_2c_20childiter_3c_20maskitert_2c_20nodet_2c_20tagt_20_3e_2c_20nodet_2c_20valuetype_20_3e',['SparseIteratorBase< MaskIterT, ChildIter< MaskIterT, NodeT, TagT >, NodeT, ValueType >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['sparseiteratorbase_3c_20maskitert_2c_20childiter_3c_20nodet_2c_20childt_2c_20maskitert_2c_20tagt_20_3e_2c_20nodet_2c_20childt_20_3e',['SparseIteratorBase< MaskIterT, ChildIter< NodeT, ChildT, MaskIterT, TagT >, NodeT, ChildT >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['sparseiteratorbase_3c_20maskitert_2c_20valueiter_3c_20maskitert_2c_20nodet_2c_20valuet_20_3e_2c_20nodet_2c_20valuet_20_3e',['SparseIteratorBase< MaskIterT, ValueIter< MaskIterT, NodeT, ValueT >, NodeT, ValueT >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['sparseiteratorbase_3c_20maskitert_2c_20valueiter_3c_20maskitert_2c_20nodet_2c_20valuet_2c_20tagt_20_3e_2c_20nodet_2c_20valuet_20_3e',['SparseIteratorBase< MaskIterT, ValueIter< MaskIterT, NodeT, ValueT, TagT >, NodeT, ValueT >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['sparseiteratorbase_3c_20maskitert_2c_20valueiter_3c_20nodet_2c_20valuet_2c_20maskitert_2c_20tagt_20_3e_2c_20nodet_2c_20valuet_20_3e',['SparseIteratorBase< MaskIterT, ValueIter< NodeT, ValueT, MaskIterT, TagT >, NodeT, ValueT >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['sparsemaskedextractor',['SparseMaskedExtractor',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#a0caba8d020dc2c14173f888b7f209ecd',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor::SparseMaskedExtractor(const DenseType &dense, const ResultValueType &background, const MaskLeafVec &leafVec)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#a7331b36791b4451b7ded6db5814a7f46',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor::SparseMaskedExtractor(const SparseMaskedExtractor &other, tbb::split)']]], + ['sparsemaskedextractor',['SparseMaskedExtractor',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html',1,'openvdb::v3_2_0::tools']]], + ['sparsestencilmatrix',['SparseStencilMatrix',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1ConstValueIter.html#ae06102ac48be63f6223f2290bbb995ee',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::ConstValueIter::SparseStencilMatrix()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a27d2e12a292928a0ef4a05acbc321e94',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::SparseStencilMatrix(SizeType n)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a115a7055360393d51f45f6c4952c26a8',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::SparseStencilMatrix(const SparseStencilMatrix &)']]], + ['sparsestencilmatrix',['SparseStencilMatrix',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html',1,'openvdb::v3_2_0::math::pcg']]], + ['sparsestencilmatrix_3c_20othervaluetype_2c_20stencil_5fsize_20_3e',['SparseStencilMatrix< OtherValueType, STENCIL_SIZE >',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html',1,'openvdb::v3_2_0::math::pcg']]], + ['sparsestencilmatrix_3c_20valuetype_2c_204_20_3e',['SparseStencilMatrix< ValueType, 4 >',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html',1,'openvdb::v3_2_0::math::pcg']]], + ['sparsetodensecompositor',['SparseToDenseCompositor',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#a41e44f3b65c733e3a20427ca4b9ffb78',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor::SparseToDenseCompositor(DenseT &dense, const TreeT &source, const TreeT &alpha, const ValueT beta, const ValueT strength)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#a179a692f7470197d0c80f5b59c7f227b',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor::SparseToDenseCompositor(const SparseToDenseCompositor &other)']]], + ['sparsetodensecompositor',['SparseToDenseCompositor',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html',1,'openvdb::v3_2_0::tools']]], + ['spatialorder',['spatialOrder',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#a6a20cb9b519b684c63368b913c786f44',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['spatialscheme',['spatialScheme',['../structopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker_1_1State.html#a37891ce976dc0d9f47cc1f1d94dfd2e8',1,'openvdb::v3_2_0::tools::LevelSetTracker::State']]], + ['spectraldecomposedmap',['SpectralDecomposedMap',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7a4a32225b190fdb8ecc0d271581baa0',1,'openvdb::v3_2_0::math']]], + ['split',['split',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#a945ffc4851bbab1f16a8bf06473df6d3',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray']]], + ['splittableparticlearray',['SplittableParticleArray',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html',1,'openvdb::v3_2_0::tools::particle_atlas_internal']]], + ['splittableparticlearray',['SplittableParticleArray',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#a08db3d9bd58cc270503488a28841d4c2',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray::SplittableParticleArray(const ParticleArrayT &particles)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#a49b4b8da052e777d523ec17f6afd66a9',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray::SplittableParticleArray(const ParticleArrayT &particles, double minR, double maxR)']]], + ['sqrt',['Sqrt',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#afa819ca6a765dbb62eb2dc60e30a9a70',1,'openvdb::v3_2_0::math::Sqrt(float x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a894d34abe674ec96217f2c7c9a7f150f',1,'openvdb::v3_2_0::math::Sqrt(double x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab79897ec7f47a358386bf125afea13b5',1,'openvdb::v3_2_0::math::Sqrt(long double x)']]], + ['sqrtsolve',['sqrtSolve',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a75a72751b024e6cba7d1946cff749a9b',1,'openvdb::v3_2_0::math']]], + ['srcaccessort',['SrcAccessorT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTopologyMask.html#a248dfdcdfe3ea1e2aca1da758236faa4',1,'openvdb::v3_2_0::tools::internal::GenTopologyMask']]], + ['staggered',['staggered',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler.html#a0050bc9dc3e95de2ca035e98149763ed',1,'openvdb::v3_2_0::tools::Sampler::staggered()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointSampler.html#a0050bc9dc3e95de2ca035e98149763ed',1,'openvdb::v3_2_0::tools::PointSampler::staggered()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html#a0050bc9dc3e95de2ca035e98149763ed',1,'openvdb::v3_2_0::tools::BoxSampler::staggered()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadraticSampler.html#a0050bc9dc3e95de2ca035e98149763ed',1,'openvdb::v3_2_0::tools::QuadraticSampler::staggered()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredPointSampler.html#a0050bc9dc3e95de2ca035e98149763ed',1,'openvdb::v3_2_0::tools::StaggeredPointSampler::staggered()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredBoxSampler.html#a0050bc9dc3e95de2ca035e98149763ed',1,'openvdb::v3_2_0::tools::StaggeredBoxSampler::staggered()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredQuadraticSampler.html#a0050bc9dc3e95de2ca035e98149763ed',1,'openvdb::v3_2_0::tools::StaggeredQuadraticSampler::staggered()']]], + ['staggeredboxsampler',['StaggeredBoxSampler',['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredBoxSampler.html',1,'openvdb::v3_2_0::tools']]], + ['staggeredpointsampler',['StaggeredPointSampler',['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredPointSampler.html',1,'openvdb::v3_2_0::tools']]], + ['staggeredquadraticsampler',['StaggeredQuadraticSampler',['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredQuadraticSampler.html',1,'openvdb::v3_2_0::tools']]], + ['start',['start',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a26d38cbd13b87b6b332f393f2acc6fd2',1,'openvdb::v3_2_0::math::Ray::start()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#a3c039ac791f9242cc3c4dd6e57c5e551',1,'openvdb::v3_2_0::tools::BasePointScatter::start()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1CpuTimer.html#a60de64d75454385b23995437f1d72669',1,'openvdb::v3_2_0::util::CpuTimer::start()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1CpuTimer.html#a7d46aed22350e5e5430354ded9eb7dd0',1,'openvdb::v3_2_0::util::CpuTimer::start(const std::string &msg)'],['../structopenvdb_1_1v3__2__0_1_1util_1_1NullInterrupter.html#a7e779eeb0f935b24a2d4b87b973fa1e5',1,'openvdb::v3_2_0::util::NullInterrupter::start()']]], + ['startinterrupter',['startInterrupter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a94802a98ed1ced10e014d8bf08c9ca51',1,'openvdb::v3_2_0::tools::LevelSetTracker']]], + ['stashoriginandstoreoffset',['StashOriginAndStoreOffset',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1StashOriginAndStoreOffset.html#a46336cb01f4cee15282eee9e402c322e',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::StashOriginAndStoreOffset']]], + ['stashoriginandstoreoffset',['StashOriginAndStoreOffset',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1StashOriginAndStoreOffset.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['state',['State',['../structopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker_1_1State.html#ac1974630bc9011a261bd9f517663317b',1,'openvdb::v3_2_0::tools::LevelSetTracker::State']]], + ['state',['State',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1State.html',1,'openvdb::v3_2_0::math::pcg']]], + ['state',['State',['../structopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker_1_1State.html',1,'openvdb::v3_2_0::tools::LevelSetTracker']]], + ['statictypename',['staticTypeName',['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#acf959bd7e94562323ed426e09721a789',1,'openvdb::v3_2_0::TypedMetadata']]], + ['statistics',['statistics',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a0298e9e5b5b3a443d321bd24825f1d5a',1,'openvdb::v3_2_0::tools::statistics(const IterT &iter, bool threaded=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ada341f0cb3d7e02cb30f563ae58d77b8',1,'openvdb::v3_2_0::tools::statistics(const IterT &iter, const ValueOp &op, bool threaded)']]], + ['statistics_2eh',['Statistics.h',['../Statistics_8h.html',1,'']]], + ['stats',['stats',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1StatsOp.html#a833304e665c728361734b29f86332dca',1,'openvdb::v3_2_0::tools::stats_internal::StatsOp::stats()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#af861e682893a3245e96223ef38f01c54',1,'openvdb::v3_2_0::math::Stats::Stats()']]], + ['stats',['Stats',['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html',1,'openvdb::v3_2_0::math']]], + ['stats_2eh',['Stats.h',['../Stats_8h.html',1,'']]], + ['statsop',['StatsOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1StatsOp.html#a8084db4f07e59ae63530b34f1299785a',1,'openvdb::v3_2_0::tools::stats_internal::StatsOp']]], + ['statsop',['StatsOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1StatsOp.html',1,'openvdb::v3_2_0::tools::stats_internal']]], + ['status',['status',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#aa59c25a0c77c76484c16f0e58228c030',1,'openvdb::v3_2_0::io::Queue::status(Id) const '],['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a67a0db04d321a74b7e7fcfd3f1a3f70b',1,'openvdb::v3_2_0::io::Queue::Status()']]], + ['std',['std',['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#ad71e9170006001e093f5a5180c1216e5',1,'openvdb::v3_2_0::math::Stats']]], + ['stddev',['stdDev',['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#a125dc4e35d8b7cad320d92dee516e9bf',1,'openvdb::v3_2_0::math::Stats']]], + ['stealnode',['stealNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a37a91bb3ba79b24928bc0f68e950c837',1,'openvdb::v3_2_0::tree::InternalNode::stealNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a417e6fc02852696f66c7f1d6520fda86',1,'openvdb::v3_2_0::tree::LeafNode::stealNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a417e6fc02852696f66c7f1d6520fda86',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::stealNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a417e6fc02852696f66c7f1d6520fda86',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::stealNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a37a91bb3ba79b24928bc0f68e950c837',1,'openvdb::v3_2_0::tree::RootNode::stealNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a0f336548f0b7d3e0debadf68d43602b6',1,'openvdb::v3_2_0::tree::Tree::stealNode()']]], + ['stealnodes',['stealNodes',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ac4a8fd1479bd7b61a23884680d5d49e0',1,'openvdb::v3_2_0::tree::InternalNode::stealNodes()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a01345873904fa0f3b5b2dce6c52dca1e',1,'openvdb::v3_2_0::tree::LeafNode::stealNodes()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a01345873904fa0f3b5b2dce6c52dca1e',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::stealNodes()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a01345873904fa0f3b5b2dce6c52dca1e',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::stealNodes()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ac4a8fd1479bd7b61a23884680d5d49e0',1,'openvdb::v3_2_0::tree::RootNode::stealNodes(ArrayT &array, const ValueType &value, bool state)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ae9865f5a8eabf75fc2ad06581e22edcd',1,'openvdb::v3_2_0::tree::RootNode::stealNodes(ArrayT &array)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ae9865f5a8eabf75fc2ad06581e22edcd',1,'openvdb::v3_2_0::tree::Tree::stealNodes(ArrayT &array)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ac4a8fd1479bd7b61a23884680d5d49e0',1,'openvdb::v3_2_0::tree::Tree::stealNodes(ArrayT &array, const ValueType &value, bool state)']]], + ['stealuniqueleafnodes',['StealUniqueLeafNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1StealUniqueLeafNodes.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['stealuniqueleafnodes',['StealUniqueLeafNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1StealUniqueLeafNodes.html#abacf350768e7d6d9b2e1c64690a90a8e',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::StealUniqueLeafNodes']]], + ['stencil',['stencil',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#ae91bf08b0b38829442e3748dc6b60f96',1,'openvdb::v3_2_0::tools::CheckEikonal']]], + ['stencils_2eh',['Stencils.h',['../Stencils_8h.html',1,'']]], + ['stencilt',['StencilT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#a6741d6c7452a3b84e6c12c6f4912afd0',1,'openvdb::v3_2_0::tools::LinearSearchImpl']]], + ['stenciltype',['StencilType',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_1_1ISStencil.html#a58bbe5b8b1369a90c810be4a05d9690e',1,'openvdb::v3_2_0::math::BIAS_SCHEME::ISStencil::StencilType()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01FIRST__BIAS_01_4_1_1ISStencil.html#a58bbe5b8b1369a90c810be4a05d9690e',1,'openvdb::v3_2_0::math::BIAS_SCHEME< FIRST_BIAS >::ISStencil::StencilType()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01SECOND__BIAS_01_4_1_1ISStencil.html#afff00b618eeef85e6058c7af50d68e3e',1,'openvdb::v3_2_0::math::BIAS_SCHEME< SECOND_BIAS >::ISStencil::StencilType()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01THIRD__BIAS_01_4_1_1ISStencil.html#a55992f13d1e7771d27279b9e4a9f9f5e',1,'openvdb::v3_2_0::math::BIAS_SCHEME< THIRD_BIAS >::ISStencil::StencilType()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01WENO5__BIAS_01_4_1_1ISStencil.html#a55992f13d1e7771d27279b9e4a9f9f5e',1,'openvdb::v3_2_0::math::BIAS_SCHEME< WENO5_BIAS >::ISStencil::StencilType()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01HJWENO5__BIAS_01_4_1_1ISStencil.html#a55992f13d1e7771d27279b9e4a9f9f5e',1,'openvdb::v3_2_0::math::BIAS_SCHEME< HJWENO5_BIAS >::ISStencil::StencilType()']]], + ['step',['step',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#a0994dbbddbde8ffa85002f974979952f',1,'openvdb::v3_2_0::math::DDA']]], + ['stop',['stop',['../classopenvdb_1_1v3__2__0_1_1util_1_1CpuTimer.html#a9672fa7a05c257fd6b4ad4c096d20ece',1,'openvdb::v3_2_0::util::CpuTimer::stop()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CsgVisitorBase.html#ae91638596a8955da23581d7ad008e295a679ee5320d66c8322e310daeb2ee99b8',1,'openvdb::v3_2_0::tools::CsgVisitorBase::STOP()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgUnionVisitor.html#a0b59433d0ab361c389e51d79061c070ca679ee5320d66c8322e310daeb2ee99b8',1,'openvdb::v3_2_0::tools::CsgUnionVisitor::STOP()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgIntersectVisitor.html#a85f0f418e1a739554f3f904a501179dca679ee5320d66c8322e310daeb2ee99b8',1,'openvdb::v3_2_0::tools::CsgIntersectVisitor::STOP()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgDiffVisitor.html#a6813be44df52c18b08debbebca7d09a8a679ee5320d66c8322e310daeb2ee99b8',1,'openvdb::v3_2_0::tools::CsgDiffVisitor::STOP()']]], + ['str',['str',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::io::StreamMetadata::str()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::math::pcg::Vector::str()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::str()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a6522bc65bd97a6b1ef6cdfe78462a919',1,'openvdb::v3_2_0::math::MapBase::str()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::math::AffineMap::str()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::math::ScaleMap::str()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::math::TranslationMap::str()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::math::ScaleTranslateMap::str()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::math::UnitaryMap::str()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::str()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#a2a015c7bd325be6d8b44c34838d03ceb',1,'openvdb::v3_2_0::math::Mat::str()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::math::Quat::str()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::math::Tuple::str()'],['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a6522bc65bd97a6b1ef6cdfe78462a919',1,'openvdb::v3_2_0::Metadata::str()'],['../classopenvdb_1_1v3__2__0_1_1UnknownMetadata.html#a308c84d72eb5a3eb26bfbc41a0c6d0e7',1,'openvdb::v3_2_0::UnknownMetadata::str()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::TypedMetadata::str()'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a4311ad44c06b65c4bc66c7adb8c6fd49',1,'openvdb::v3_2_0::MetaMap::str()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNan.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tools::CheckNan::str()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckInf.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tools::CheckInf::str()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckFinite.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tools::CheckFinite::str()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMagnitude.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tools::CheckMagnitude::str()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckRange.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tools::CheckRange::str()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMin.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tools::CheckMin::str()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMax.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tools::CheckMax::str()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tools::CheckNormGrad::str()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tools::CheckEikonal::str()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tools::CheckDivergence::str()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tree::LeafNode::str()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::str()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::str()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#ae1e7b05645704653045e2b25b168f868',1,'openvdb::v3_2_0::TypedMetadata::str()']]], + ['stream',['Stream',['../classopenvdb_1_1v3__2__0_1_1io_1_1Stream.html',1,'openvdb::v3_2_0::io']]], + ['stream',['Stream',['../classopenvdb_1_1v3__2__0_1_1io_1_1Stream.html#afe860111b19809d05b84085ee31ef2a9',1,'openvdb::v3_2_0::io::Stream::Stream(std::istream &, bool delayLoad=true)'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Stream.html#a7411b49ed5fda5181dd182d64984906e',1,'openvdb::v3_2_0::io::Stream::Stream()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Stream.html#ab75946a88778ed7bb80b9dedab7327e4',1,'openvdb::v3_2_0::io::Stream::Stream(std::ostream &)'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Stream.html#a0b64003a4aa6dde92dff71c7d66aa138',1,'openvdb::v3_2_0::io::Stream::Stream(const Stream &)']]], + ['stream_2eh',['Stream.h',['../Stream_8h.html',1,'']]], + ['streamingsize',['streamingSize',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a44b383f3ad8530f6639bed48a1c587e7',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['streammetadata',['StreamMetadata',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a5ec028ae419e6247b78fa9b60f757430',1,'openvdb::v3_2_0::io::StreamMetadata::StreamMetadata()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#ae0696ac14ff930ec47b690583da6dd26',1,'openvdb::v3_2_0::io::StreamMetadata::StreamMetadata(const StreamMetadata &)'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a7379ee807207363f5186a10251241647',1,'openvdb::v3_2_0::io::StreamMetadata::StreamMetadata(std::ios_base &)']]], + ['streammetadata',['StreamMetadata',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html',1,'openvdb::v3_2_0::io']]], + ['streetypename',['sTreeTypeName',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#acc8fe71ac3494d1f468e2fc0ece4ca34',1,'openvdb::v3_2_0::tree::Tree']]], + ['stringasuniquename',['stringAsUniqueName',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#ac1474ab318c18009fbd28bd9b528bf9b',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['stringgrid',['StringGrid',['../namespaceopenvdb_1_1v3__2__0.html#ad1cbf3303b74ea0658f207a3ede75c07',1,'openvdb::v3_2_0']]], + ['stringmetadata',['StringMetadata',['../namespaceopenvdb_1_1v3__2__0.html#a5625a4354bb397a6ecfb7f44c9d59531',1,'openvdb::v3_2_0']]], + ['stringmetadata_2eh',['StringMetadata.h',['../StringMetadata_8h.html',1,'']]], + ['stringtobiasedgradientscheme',['stringToBiasedGradientScheme',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a90802a965597ce5a90476f34e899842b',1,'openvdb::v3_2_0::math']]], + ['stringtodscheme',['stringToDScheme',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a0191741b0daa54077add4ccb8c3a89e3',1,'openvdb::v3_2_0::math']]], + ['stringtogridclass',['stringToGridClass',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ab8a07627e9f39abca410b5cfe22698f3',1,'openvdb::v3_2_0::GridBase']]], + ['stringtotemporalintegrationscheme',['stringToTemporalIntegrationScheme',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae7ec4f29510c45a5dc82f9482e39054a',1,'openvdb::v3_2_0::math']]], + ['stringtovectype',['stringToVecType',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a9bd5802eea4b807fd33e6ea2507fe344',1,'openvdb::v3_2_0::GridBase']]], + ['stringtree',['StringTree',['../namespaceopenvdb_1_1v3__2__0.html#af3dad2a928121957fbd8abd81c4ceaaf',1,'openvdb::v3_2_0']]], + ['stripsuffix',['stripSuffix',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#aa05e83c427df9ff1893cf0c4c3c7f30e',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['sub',['sub',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ac6c69fcfe79709594433bcac59bed34b',1,'openvdb::v3_2_0::math::Quat::sub()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a41fa11ad7f3c0d7a0b2fa63aeb12d43a',1,'openvdb::v3_2_0::math::Vec2::sub()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#affe463a6cd94dd93c5e2341c7c2bfe93',1,'openvdb::v3_2_0::math::Vec3::sub()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a991ac01de97c37426fc7ee8e9aa8942e',1,'openvdb::v3_2_0::math::Vec4::sub()']]], + ['subtreet',['SubtreeT',['../structopenvdb_1_1v3__2__0_1_1tree_1_1NodeChain.html#a016896c4be194bf5136a3a8998940a5a',1,'openvdb::v3_2_0::tree::NodeChain::SubtreeT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1iter_1_1InvertedTree.html#a0119ecfd7ca680faf8987ef7d7e7260a',1,'openvdb::v3_2_0::tree::iter::InvertedTree::SubtreeT()']]], + ['succeeded',['SUCCEEDED',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a67a0db04d321a74b7e7fcfd3f1a3f70bac416a0ceff582d19692ee0238278f307',1,'openvdb::v3_2_0::io::Queue']]], + ['success',['success',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1State.html#a7960f9c558f9ee2c3d4a8fdea096fb56',1,'openvdb::v3_2_0::math::pcg::State']]], + ['sum',['sum',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a6099c71b51b35c00ac10686eb4557566',1,'openvdb::v3_2_0::math::Vec2::sum()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a6099c71b51b35c00ac10686eb4557566',1,'openvdb::v3_2_0::math::Vec3::sum()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a6099c71b51b35c00ac10686eb4557566',1,'openvdb::v3_2_0::math::Vec4::sum()']]], + ['summary',['summary',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a6fd5786597a0ae83ba243395ddf8f7ad',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::summary()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a6fd5786597a0ae83ba243395ddf8f7ad',1,'openvdb::v3_2_0::tree::NodeIteratorBase::summary()']]], + ['sumop',['SumOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SumOp.html#af462f646ea569148ee1dc2b3023555af',1,'openvdb::v3_2_0::tools::valxform::SumOp']]], + ['sumop',['SumOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SumOp.html',1,'openvdb::v3_2_0::tools::valxform']]], + ['swap',['swap',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a195ee4f1876e8f106d99c8df73f121ef',1,'openvdb::v3_2_0::math::pcg::Vector::swap()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#ae70107dafa8a4fc4751d9683ca23d59c',1,'openvdb::v3_2_0::tools::PointPartitioner::swap()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#ab3ec926460bc5d1a80ce411498ea04ef',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::swap()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ab3ec926460bc5d1a80ce411498ea04ef',1,'openvdb::v3_2_0::tree::LeafNode::swap()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#ab3ec926460bc5d1a80ce411498ea04ef',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::swap()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ab3ec926460bc5d1a80ce411498ea04ef',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::swap()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#ab3ec926460bc5d1a80ce411498ea04ef',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::swap()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ab3ec926460bc5d1a80ce411498ea04ef',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::swap()']]], + ['swapbuffer',['swapBuffer',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a288a8c0c3e8c6132e6284ab66cc591cd',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['swapleafbuffer',['swapLeafBuffer',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a22ac33d0549b786059b9c691f0a534f7',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['swappedcombineop',['SwappedCombineOp',['../structopenvdb_1_1v3__2__0_1_1SwappedCombineOp.html#a2abc52640eb88bd38a2cfeee4e4a5457',1,'openvdb::v3_2_0::SwappedCombineOp']]], + ['swappedcombineop',['SwappedCombineOp',['../structopenvdb_1_1v3__2__0_1_1SwappedCombineOp.html',1,'openvdb::v3_2_0']]], + ['sweepexteriorsign',['SweepExteriorSign',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SweepExteriorSign.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['sweepexteriorsign',['SweepExteriorSign',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SweepExteriorSign.html#aeebc3336a52f45e23511e56290e54a7c',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SweepExteriorSign']]], + ['symmetric',['symmetric',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#aba857b385008e1b1222d1dc6654473c4',1,'openvdb::v3_2_0::math::Mat3']]], + ['symmetricmap',['SymmetricMap',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a942f2c4fa2fd1d8a7271aab8edb6314b',1,'openvdb::v3_2_0::math']]], + ['syncallbuffers',['syncAllBuffers',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a3bad152cbc97be4c39b46f852cf523b4',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['syncauxbuffer',['syncAuxBuffer',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a2f5bb8c75cfd73036df566fba4dd693e',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['syncvoxelmask',['SyncVoxelMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SyncVoxelMask.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['syncvoxelmask',['SyncVoxelMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SyncVoxelMask.html#a48e6e05a359c1f7d0c9517865b0322c6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SyncVoxelMask']]], + ['szerovalue',['sZeroValue',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a790d50d17536c3f6b1db2efb43f20aa3',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_15.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_15.html new file mode 100644 index 00000000..71dd1057 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_15.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_15.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_15.js new file mode 100644 index 00000000..8ea6f7c8 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_15.js @@ -0,0 +1,189 @@ +var searchData= +[ + ['iteratorbase_3c_20maskdenseiterator_2c_20pointindexleafnode_20_3e',['IteratorBase< MaskDenseIterator, PointIndexLeafNode >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a3785363d3c61ef99db5b316626826bcf',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['iteratorbase_3c_20maskoffiterator_2c_20pointindexleafnode_20_3e',['IteratorBase< MaskOffIterator, PointIndexLeafNode >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a9027fb5ad7622da41c7136f73a4d7d97',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['iteratorbase_3c_20maskoniterator_2c_20pointindexleafnode_20_3e',['IteratorBase< MaskOnIterator, PointIndexLeafNode >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a7affd1f640ff2ba587c7d86076297d01',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['t',['t',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DeepCopy.html#a870bf8f16f4af48f5ea5ab1cef3b3990',1,'openvdb::v3_2_0::tree::InternalNode::DeepCopy::t()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy1.html#a870bf8f16f4af48f5ea5ab1cef3b3990',1,'openvdb::v3_2_0::tree::InternalNode::TopologyCopy1::t()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy2.html#a870bf8f16f4af48f5ea5ab1cef3b3990',1,'openvdb::v3_2_0::tree::InternalNode::TopologyCopy2::t()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyUnion.html#a870bf8f16f4af48f5ea5ab1cef3b3990',1,'openvdb::v3_2_0::tree::InternalNode::TopologyUnion::t()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyIntersection.html#a870bf8f16f4af48f5ea5ab1cef3b3990',1,'openvdb::v3_2_0::tree::InternalNode::TopologyIntersection::t()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyDifference.html#a870bf8f16f4af48f5ea5ab1cef3b3990',1,'openvdb::v3_2_0::tree::InternalNode::TopologyDifference::t()']]], + ['t0',['t0',['../structopenvdb_1_1v3__2__0_1_1math_1_1Ray_1_1TimeSpan.html#abad8605a6cc153d57057f85aff470296',1,'openvdb::v3_2_0::math::Ray::TimeSpan::t0()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a7f26a2b8eaf2ef80a4f16ab3836d262c',1,'openvdb::v3_2_0::math::Ray::t0()']]], + ['t1',['t1',['../structopenvdb_1_1v3__2__0_1_1math_1_1Ray_1_1TimeSpan.html#a95687fa19792f11baca73b61f0b88740',1,'openvdb::v3_2_0::math::Ray::TimeSpan::t1()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a49df3e0a4f95e18eabfe8e222ac38c4b',1,'openvdb::v3_2_0::math::Ray::t1()']]], + ['tagseamedges',['TagSeamEdges',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TagSeamEdges.html',1,'openvdb::v3_2_0::tools::internal']]], + ['tagseamedges',['TagSeamEdges',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TagSeamEdges.html#a61a2fd3fd13fec852cc50e5c3dcee121',1,'openvdb::v3_2_0::tools::internal::TagSeamEdges']]], + ['tbb',['tbb',['../namespacetbb.html',1,'']]], + ['tempfile',['TempFile',['../classopenvdb_1_1v3__2__0_1_1io_1_1TempFile.html',1,'openvdb::v3_2_0::io']]], + ['tempfile',['TempFile',['../classopenvdb_1_1v3__2__0_1_1io_1_1TempFile.html#a7888caff7974ef29ad45cf81d93ce9ca',1,'openvdb::v3_2_0::io::TempFile']]], + ['tempfile_2eh',['TempFile.h',['../TempFile_8h.html',1,'']]], + ['temporalintegrationscheme',['TemporalIntegrationScheme',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a03c27a767120b8c3ed1ac0be2f82c7fd',1,'openvdb::v3_2_0::math']]], + ['temporalintegrationschemetomenuname',['temporalIntegrationSchemeToMenuName',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9b7e2292b5fd33be821cf4900f0f15f8',1,'openvdb::v3_2_0::math']]], + ['temporalintegrationschemetostring',['temporalIntegrationSchemeToString',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a89282fad0cbf04e703077c554d14b3d9',1,'openvdb::v3_2_0::math']]], + ['temporalorder',['temporalOrder',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#aa0c9a59627d5406f067e1808aaa2115e',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['temporalscheme',['temporalScheme',['../structopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker_1_1State.html#aa5b428944097f49ee7303bf50657e0b3',1,'openvdb::v3_2_0::tools::LevelSetTracker::State']]], + ['terminationdefaults',['terminationDefaults',['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg.html#a72ae92f25b96214ce1465691435eadb2',1,'openvdb::v3_2_0::math::pcg']]], + ['test',['test',['../structopenvdb_1_1v3__2__0_1_1math_1_1LevelSetHDDA.html#a74d6a62e70d129db0329a4d6db757fc3',1,'openvdb::v3_2_0::math::LevelSetHDDA::test()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1LevelSetHDDA_3_01TreeT_00-1_01_4.html#a74d6a62e70d129db0329a4d6db757fc3',1,'openvdb::v3_2_0::math::LevelSetHDDA< TreeT,-1 >::test()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Ray_1_1TimeSpan.html#ae171513e6711b69a9e20fb12eddee5c3',1,'openvdb::v3_2_0::math::Ray::TimeSpan::test()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#abb31a297cc45aed1239349fedf34f0c2',1,'openvdb::v3_2_0::math::Ray::test() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#aaf71dafe5885504c1c55158c65e8ddb8',1,'openvdb::v3_2_0::math::Ray::test(RealT time) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#a3dae0444f1af776a3ca20eed3e132c16',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::test()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a3dae0444f1af776a3ca20eed3e132c16',1,'openvdb::v3_2_0::tools::PointIndexIterator::test()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#a3dae0444f1af776a3ca20eed3e132c16',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator::test()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#a3dae0444f1af776a3ca20eed3e132c16',1,'openvdb::v3_2_0::tree::IteratorBase::test()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#a3dae0444f1af776a3ca20eed3e132c16',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::test()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#a3dae0444f1af776a3ca20eed3e132c16',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::test()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#abb988e26b6fdc84928668e8cfc4314f9',1,'openvdb::v3_2_0::tree::IterListItem::test()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#abb988e26b6fdc84928668e8cfc4314f9',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::test()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#abb988e26b6fdc84928668e8cfc4314f9',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::test()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a3dae0444f1af776a3ca20eed3e132c16',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::test()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a3dae0444f1af776a3ca20eed3e132c16',1,'openvdb::v3_2_0::tree::NodeIteratorBase::test()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#a3dae0444f1af776a3ca20eed3e132c16',1,'openvdb::v3_2_0::tree::LeafIteratorBase::test()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorRange.html#a3dae0444f1af776a3ca20eed3e132c16',1,'openvdb::v3_2_0::tree::IteratorRange::test()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html#a3dae0444f1af776a3ca20eed3e132c16',1,'openvdb::v3_2_0::util::BaseMaskIterator::test()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#a3dae0444f1af776a3ca20eed3e132c16',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::test()']]], + ['testleafio',['TestLeafIO',['../classTestLeafIO.html',1,'']]], + ['third_5fbias',['THIRD_BIAS',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9b59f0a0c54e6e3759f1418d40585656a2f69723aeacbe98b0a99fb4e0eb2a799',1,'openvdb::v3_2_0::math']]], + ['thirteenpointstencil',['ThirteenPointStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1ThirteenPointStencil.html',1,'openvdb::v3_2_0::math']]], + ['thirteenpointstencil',['ThirteenPointStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1ThirteenPointStencil.html#a61d39aa280cb2bf9ce729e7ee99717e1',1,'openvdb::v3_2_0::math::ThirteenPointStencil']]], + ['threaded',['threaded',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html#a842968a1ac820ec8a5b28cf08af5e9b7',1,'openvdb::v3_2_0::tools::GridResampler']]], + ['throw_5fif_5fnull',['THROW_IF_NULL',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1MathOp.html#ad5f52ed4b4c883f10cd8483a3aee6209',1,'openvdb::v3_2_0::tools::stats_internal::MathOp']]], + ['tiledata',['tileData',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a960349c63621174a7e878720130cf0c0',1,'openvdb::v3_2_0::tools::internal']]], + ['tileitert',['TileIterT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNan.html#ab67c6a6c5c01dd172dfaa3c2fedd1699',1,'openvdb::v3_2_0::tools::CheckNan::TileIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckInf.html#ab67c6a6c5c01dd172dfaa3c2fedd1699',1,'openvdb::v3_2_0::tools::CheckInf::TileIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckFinite.html#ab67c6a6c5c01dd172dfaa3c2fedd1699',1,'openvdb::v3_2_0::tools::CheckFinite::TileIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMagnitude.html#ab67c6a6c5c01dd172dfaa3c2fedd1699',1,'openvdb::v3_2_0::tools::CheckMagnitude::TileIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckRange.html#ab67c6a6c5c01dd172dfaa3c2fedd1699',1,'openvdb::v3_2_0::tools::CheckRange::TileIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMin.html#ab67c6a6c5c01dd172dfaa3c2fedd1699',1,'openvdb::v3_2_0::tools::CheckMin::TileIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMax.html#ab67c6a6c5c01dd172dfaa3c2fedd1699',1,'openvdb::v3_2_0::tools::CheckMax::TileIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#ab67c6a6c5c01dd172dfaa3c2fedd1699',1,'openvdb::v3_2_0::tools::CheckNormGrad::TileIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#ab67c6a6c5c01dd172dfaa3c2fedd1699',1,'openvdb::v3_2_0::tools::CheckEikonal::TileIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#ab67c6a6c5c01dd172dfaa3c2fedd1699',1,'openvdb::v3_2_0::tools::CheckDivergence::TileIterT()']]], + ['tilepolicy',['TilePolicy',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac7a17ca003c7f18f411cab4e8b4f6e74',1,'openvdb::v3_2_0::tools']]], + ['tilesampler',['TileSampler',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TileSampler.html',1,'openvdb::v3_2_0::tools::internal']]], + ['tilesampler',['TileSampler',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TileSampler.html#ac2c41b61386bcb7dd537335decfdfd45',1,'openvdb::v3_2_0::tools::internal::TileSampler::TileSampler()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TileSampler_3_01PointSampler_00_01TreeT_01_4.html#a6843ead06315a58962e6639e4cc82731',1,'openvdb::v3_2_0::tools::internal::TileSampler< PointSampler, TreeT >::TileSampler()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TileSampler_3_01StaggeredPointSampler_00_01TreeT_01_4.html#a6843ead06315a58962e6639e4cc82731',1,'openvdb::v3_2_0::tools::internal::TileSampler< StaggeredPointSampler, TreeT >::TileSampler()']]], + ['tilesampler_3c_20pointsampler_2c_20treet_20_3e',['TileSampler< PointSampler, TreeT >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TileSampler_3_01PointSampler_00_01TreeT_01_4.html',1,'openvdb::v3_2_0::tools::internal']]], + ['tilesampler_3c_20staggeredpointsampler_2c_20treet_20_3e',['TileSampler< StaggeredPointSampler, TreeT >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TileSampler_3_01StaggeredPointSampler_00_01TreeT_01_4.html',1,'openvdb::v3_2_0::tools::internal']]], + ['time',['time',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#ac0bd5fd4c8579b0eb6b94e76946b7f41',1,'openvdb::v3_2_0::math::DDA']]], + ['timeout',['timeout',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#ac21cdac881dc20d1c9cfb8c068555ca2',1,'openvdb::v3_2_0::io::Queue']]], + ['timesdiagonal',['timesDiagonal',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a68d27f0742cab464c4d895064f857d5b',1,'openvdb::v3_2_0::math::Mat3']]], + ['timespan',['TimeSpan',['../structopenvdb_1_1v3__2__0_1_1math_1_1Ray_1_1TimeSpan.html',1,'openvdb::v3_2_0::math::Ray']]], + ['timespan',['TimeSpan',['../structopenvdb_1_1v3__2__0_1_1math_1_1Ray_1_1TimeSpan.html#a31c188f9e7756382a182bd3c2b75a6c6',1,'openvdb::v3_2_0::math::Ray::TimeSpan::TimeSpan()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Ray_1_1TimeSpan.html#a0285ee4fd348743376585fc136f77df9',1,'openvdb::v3_2_0::math::Ray::TimeSpan::TimeSpan(RealT _t0, RealT _t1)']]], + ['timespant',['TimeSpanT',['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA.html#a0cee5839ee2c2079aeae24aed498b3b0',1,'openvdb::v3_2_0::math::VolumeHDDA::TimeSpanT()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA_3_01TreeT_00_01RayT_00_010_01_4.html#a0cee5839ee2c2079aeae24aed498b3b0',1,'openvdb::v3_2_0::math::VolumeHDDA< TreeT, RayT, 0 >::TimeSpanT()']]], + ['to',['to',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1CopyOp.html#a03f14612204aafa51f37586ca182529b',1,'openvdb::v3_2_0::math::pcg::internal::CopyOp::to()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1MatrixCopyOp.html#a4303ffb50d15a06d4a5a45ebd74d277a',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::MatrixCopyOp::to()']]], + ['toggle',['toggle',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a5a0ca7e5e0f7344bf558f752b439b287',1,'openvdb::v3_2_0::util::NodeMask::toggle(Index32 n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ad277193b2dca0bab1e0ad24d45407dc3',1,'openvdb::v3_2_0::util::NodeMask::toggle()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a5a0ca7e5e0f7344bf558f752b439b287',1,'openvdb::v3_2_0::util::NodeMask< 1 >::toggle(Index32 n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ad277193b2dca0bab1e0ad24d45407dc3',1,'openvdb::v3_2_0::util::NodeMask< 1 >::toggle()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a5a0ca7e5e0f7344bf558f752b439b287',1,'openvdb::v3_2_0::util::NodeMask< 2 >::toggle(Index32 n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ad277193b2dca0bab1e0ad24d45407dc3',1,'openvdb::v3_2_0::util::NodeMask< 2 >::toggle()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#ac1a73e3e23193c8312eaafba244e009d',1,'openvdb::v3_2_0::util::RootNodeMask::toggle(Index32 i)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#ad277193b2dca0bab1e0ad24d45407dc3',1,'openvdb::v3_2_0::util::RootNodeMask::toggle()']]], + ['togridptrt',['ToGridPtrT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1ConvertGrid.html#a245d3550508c97ac67f8ba57419eccbf',1,'openvdb::v3_2_0::tools::clip_internal::ConvertGrid']]], + ['tolerance',['Tolerance',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1Tolerance.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['tolerance',['Tolerance',['../structopenvdb_1_1v3__2__0_1_1math_1_1Tolerance.html',1,'openvdb::v3_2_0::math']]], + ['tolerance_3c_20double_20_3e',['Tolerance< double >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Tolerance_3_01double_01_4.html',1,'openvdb::v3_2_0::math']]], + ['tolerance_3c_20float_20_3e',['Tolerance< float >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Tolerance_3_01float_01_4.html',1,'openvdb::v3_2_0::math']]], + ['tolerancepruneop',['TolerancePruneOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1TolerancePruneOp.html#a4b3f3b4a8a4e83168c4867f8c783123f',1,'openvdb::v3_2_0::tools::TolerancePruneOp']]], + ['tolerancepruneop',['TolerancePruneOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1TolerancePruneOp.html',1,'openvdb::v3_2_0::tools']]], + ['tolval',['tolVal',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMagnitude.html#a2b7938ed37487cabd6b7ef3338c1e8a6',1,'openvdb::v3_2_0::tools::CheckMagnitude']]], + ['tomaskgrid',['ToMaskGrid',['../structopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1ToMaskGrid.html',1,'openvdb::v3_2_0::tools::gridop']]], + ['topologycopy',['TopologyCopy',['../classopenvdb_1_1v3__2__0_1_1TopologyCopy.html',1,'openvdb::v3_2_0']]], + ['topologycopy1',['TopologyCopy1',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy1.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['topologycopy1',['TopologyCopy1',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy1.html#a0b181ce3addbeb38a5d8b0e7b800709f',1,'openvdb::v3_2_0::tree::InternalNode::TopologyCopy1']]], + ['topologycopy2',['TopologyCopy2',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy2.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['topologycopy2',['TopologyCopy2',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy2.html#a6b91f6a4a3e353a9cabf69fb53f877cd',1,'openvdb::v3_2_0::tree::InternalNode::TopologyCopy2']]], + ['topologydifference',['TopologyDifference',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyDifference.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['topologydifference',['topologyDifference',['../classopenvdb_1_1v3__2__0_1_1Grid.html#ac1438276e00ba2c0de099acf62e33331',1,'openvdb::v3_2_0::Grid::topologyDifference()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a77c47237feeecc609582460c08dbb242',1,'openvdb::v3_2_0::tree::InternalNode::topologyDifference()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a360f3f39eb6d02f55b36697c5b5c2d14',1,'openvdb::v3_2_0::tree::LeafNode::topologyDifference()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ab806ba12c5a214ace1c3637e8e1d78e2',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::topologyDifference()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ab806ba12c5a214ace1c3637e8e1d78e2',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::topologyDifference()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a4bfa9bd46c8206d75f01c69c05425b5d',1,'openvdb::v3_2_0::tree::RootNode::topologyDifference()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a7c6ad1abf61c3b13d7ad7408f4634226',1,'openvdb::v3_2_0::tree::Tree::topologyDifference()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a1a557187cdfa2028657e046b6b57ff45',1,'openvdb::v3_2_0::tree::InternalNode::topologyDifference()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyDifference.html#a68e41cc69d9b91e023e7c438d899f5cf',1,'openvdb::v3_2_0::tree::InternalNode::TopologyDifference::TopologyDifference()']]], + ['topologygrid',['TopologyGrid',['../namespaceopenvdb_1_1v3__2__0.html#a4956b51f1ebabcb911839053eb1d746a',1,'openvdb::v3_2_0']]], + ['topologyintersection',['TopologyIntersection',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyIntersection.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['topologyintersection',['topologyIntersection',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a19eef208eb58eeb2009d67519e1c291c',1,'openvdb::v3_2_0::Grid::topologyIntersection()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a2973e4d0d6266e3e42f1457262164347',1,'openvdb::v3_2_0::tree::InternalNode::topologyIntersection()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a6ea86b45ea34339f6c78389c7e61d10d',1,'openvdb::v3_2_0::tree::LeafNode::topologyIntersection()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#afd489fd5603909c27a0366ad1ee3c754',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::topologyIntersection()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#afd489fd5603909c27a0366ad1ee3c754',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::topologyIntersection()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ac29f98775a4d88dc3163abc979db6060',1,'openvdb::v3_2_0::tree::RootNode::topologyIntersection()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a4a4089e30211443f0d6431cff8bef3cc',1,'openvdb::v3_2_0::tree::Tree::topologyIntersection()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a6a3d6186a60c1234b213848bd2405ad9',1,'openvdb::v3_2_0::tree::InternalNode::topologyIntersection()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyIntersection.html#a214fdb2a58d4ae8293a76e9c955fe216',1,'openvdb::v3_2_0::tree::InternalNode::TopologyIntersection::TopologyIntersection()']]], + ['topologytolevelset',['topologyToLevelSet',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ae5a54d059eea613345a1708ea47ee08a',1,'openvdb::v3_2_0::tools::topologyToLevelSet(const GridType &grid, int halfBandWidth=3, int closingWidth=1, int dilation=0, int smoothingSteps=0)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a48655b6855e5ea9179ebd5e0f1b8ec93',1,'openvdb::v3_2_0::tools::topologyToLevelSet(const GridType &grid, int halfBandWidth=3, int closingWidth=1, int dilation=0, int smoothingSteps=0, InterrupterType *interrupt=NULL)']]], + ['topologytolevelset_2eh',['TopologyToLevelSet.h',['../TopologyToLevelSet_8h.html',1,'']]], + ['topologytree',['TopologyTree',['../namespaceopenvdb_1_1v3__2__0.html#a5484a70c5d53851cf79d78f62905c989',1,'openvdb::v3_2_0']]], + ['topologyunion',['TopologyUnion',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyUnion.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['topologyunion',['topologyUnion',['../classopenvdb_1_1v3__2__0_1_1Grid.html#afb09afd9d023da4b1dae7a140af6848a',1,'openvdb::v3_2_0::Grid::topologyUnion()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a089eb4c09e2e46b478de9235b91fd24d',1,'openvdb::v3_2_0::tree::InternalNode::topologyUnion()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a896e240bd3b8fd07d24b5e253fdc50cc',1,'openvdb::v3_2_0::tree::LeafNode::topologyUnion()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a896e240bd3b8fd07d24b5e253fdc50cc',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::topologyUnion()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a896e240bd3b8fd07d24b5e253fdc50cc',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::topologyUnion()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a522ff4d2548c10c1dbc5f3569fa5f449',1,'openvdb::v3_2_0::tree::RootNode::topologyUnion()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ac32b595dbcad270a15ed20df549c946f',1,'openvdb::v3_2_0::tree::Tree::topologyUnion()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a71f0146ca262b3ffd49b722c687b697b',1,'openvdb::v3_2_0::tree::InternalNode::topologyUnion()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyUnion.html#ab6e395318c127224cf8fddcf4d12ecd1',1,'openvdb::v3_2_0::tree::InternalNode::TopologyUnion::TopologyUnion()']]], + ['total',['TOTAL',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#adff5839c640682a9a122640e11486eaf',1,'openvdb::v3_2_0::tree::InternalNode::TOTAL()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#adff5839c640682a9a122640e11486eaf',1,'openvdb::v3_2_0::tree::LeafNode::TOTAL()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#adff5839c640682a9a122640e11486eaf',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::TOTAL()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#adff5839c640682a9a122640e11486eaf',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::TOTAL()']]], + ['touchleaf',['touchLeaf',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a7082c10cbb6529b4dcff9c7ea26d85f8',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ab67464c0a432fdd5591c830b5589ce42',1,'openvdb::v3_2_0::tree::InternalNode::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a92f3cf8a5cca66e226b52470f2afc68a',1,'openvdb::v3_2_0::tree::LeafNode::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a92f3cf8a5cca66e226b52470f2afc68a',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a92f3cf8a5cca66e226b52470f2afc68a',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ab67464c0a432fdd5591c830b5589ce42',1,'openvdb::v3_2_0::tree::RootNode::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a4b094186577cde9b7ad1f326389c815f',1,'openvdb::v3_2_0::tree::Tree::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a0d19cd16b0f5919fd95ce5ab20984a2b',1,'openvdb::v3_2_0::tree::ValueAccessor::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a70f1f2b22dd748450dfcf20791c085cb',1,'openvdb::v3_2_0::tree::CacheItem::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a70f1f2b22dd748450dfcf20791c085cb',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a0d19cd16b0f5919fd95ce5ab20984a2b',1,'openvdb::v3_2_0::tree::ValueAccessor0::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a0d19cd16b0f5919fd95ce5ab20984a2b',1,'openvdb::v3_2_0::tree::ValueAccessor1::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a0d19cd16b0f5919fd95ce5ab20984a2b',1,'openvdb::v3_2_0::tree::ValueAccessor2::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a0d19cd16b0f5919fd95ce5ab20984a2b',1,'openvdb::v3_2_0::tree::ValueAccessor3::touchLeaf()']]], + ['touchleafandcache',['touchLeafAndCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a89cdcafaee102ca1fb80390b3fc0b9fc',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::touchLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a9234b49b656ddd73fb2d5368e6088c06',1,'openvdb::v3_2_0::tree::InternalNode::touchLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a659c012dad460d849383b82dc32d7c23',1,'openvdb::v3_2_0::tree::LeafNode::touchLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a659c012dad460d849383b82dc32d7c23',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::touchLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a659c012dad460d849383b82dc32d7c23',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::touchLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a87111eb89261bcfaba2d9863f81c92d6',1,'openvdb::v3_2_0::tree::RootNode::touchLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a1b529733f0b52eb639833f197ca747ed',1,'openvdb::v3_2_0::tree::InternalNode::touchLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a1b529733f0b52eb639833f197ca747ed',1,'openvdb::v3_2_0::tree::RootNode::touchLeafAndCache()']]], + ['tov',['toV',['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#a415373fb8c9e4f2d3d53e29284587444',1,'openvdb::v3_2_0::math::Tuple']]], + ['trace',['trace',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a1d9030d1459f91027741424a262d31fd',1,'openvdb::v3_2_0::math::Mat3']]], + ['traceexteriorboundaries',['traceExteriorBoundaries',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a5c971c289dca66c2e8500e01aac41bdf',1,'openvdb::v3_2_0::tools']]], + ['tracevoxelline',['traceVoxelLine',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SweepExteriorSign.html#abc166ef13b191da0cb4a9e7d9cf28003',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SweepExteriorSign']]], + ['track',['track',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#af613bc7d3737c75db5f01a663a149614',1,'openvdb::v3_2_0::tools::LevelSetTracker']]], + ['trackert',['TrackerT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#ac165d5a7bddd0b4fdd763da4f6720439',1,'openvdb::v3_2_0::tools::LevelSetAdvection::TrackerT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#ac165d5a7bddd0b4fdd763da4f6720439',1,'openvdb::v3_2_0::tools::LevelSetMorphing::TrackerT()']]], + ['transferto',['transferTo',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a594c68f2fc06fa8171f22820e576faee',1,'openvdb::v3_2_0::io::StreamMetadata']]], + ['transform',['Transform',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html',1,'openvdb::v3_2_0::math']]], + ['transform',['Transform',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a9de68ec1c9b7809129814a3233ae4655',1,'openvdb::v3_2_0::math::Transform::Transform()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a8774c215ee4561048483333197e21d8e',1,'openvdb::v3_2_0::math::Transform::Transform(const MapBase::Ptr &)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a2f56f8c86798eb7420f8cfdc6cfc9316',1,'openvdb::v3_2_0::math::Transform::Transform(const Transform &)'],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a29489066f0a6b234e780dad3322f4040',1,'openvdb::v3_2_0::GridBase::transform()'],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a34320243b0a179d5089b9e67fcc00eb3',1,'openvdb::v3_2_0::GridBase::transform() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a66c7c913e921933b40c68c12c71626f9',1,'openvdb::v3_2_0::math::Mat3::transform()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#aa98b5754979a7c680da6bbab8b8e8d85',1,'openvdb::v3_2_0::math::Mat4::transform(const Vec4< T0 > &v) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a66c7c913e921933b40c68c12c71626f9',1,'openvdb::v3_2_0::math::Mat4::transform(const Vec3< T0 > &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ContiguousOp.html#aec12730063000c9af1e559dd776bde20',1,'openvdb::v3_2_0::tools::ContiguousOp::transform()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer_1_1MatrixTransform.html#a3bdde3e6789f1a251ef22b89c8444ced',1,'openvdb::v3_2_0::tools::GridTransformer::MatrixTransform::transform()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ABTransform.html#a273dcce2c3a35b295964de4702f943da',1,'openvdb::v3_2_0::tools::ABTransform::transform()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#a34320243b0a179d5089b9e67fcc00eb3',1,'openvdb::v3_2_0::tools::GridSampler::transform()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html#a34320243b0a179d5089b9e67fcc00eb3',1,'openvdb::v3_2_0::tools::GridSampler< tree::ValueAccessor< TreeT >, SamplerType >::transform()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a29489066f0a6b234e780dad3322f4040',1,'openvdb::v3_2_0::tools::MultiResGrid::transform()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a34320243b0a179d5089b9e67fcc00eb3',1,'openvdb::v3_2_0::tools::MultiResGrid::transform() const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiscreteField.html#a34320243b0a179d5089b9e67fcc00eb3',1,'openvdb::v3_2_0::tools::DiscreteField::transform()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1EnrightField.html#a1c5ab5215152d32cb6c472fdfebd7329',1,'openvdb::v3_2_0::tools::EnrightField::transform()']]], + ['transform_2eh',['Transform.h',['../Transform_8h.html',1,'']]], + ['transform3x3',['transform3x3',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#ad7ddb61aa28cebf719bdf59719c875bc',1,'openvdb::v3_2_0::math::Mat4']]], + ['transformdense',['transformDense',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aa53e1d4c0388a0325321061b565de688',1,'openvdb::v3_2_0::tools::transformDense(Dense< ValueT, openvdb::tools::LayoutZYX > &dense, const openvdb::CoordBBox &bbox, const OpType &op, bool parallel=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a298d2d95314acb02ec1cae132adbf49f',1,'openvdb::v3_2_0::tools::transformDense(Dense< ValueT, openvdb::tools::LayoutZYX > &dense, const openvdb::CoordBBox &bbox, const PointwiseOpT &functor, bool parallel)']]], + ['transformgrid',['transformGrid',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html#ad188eff3e1fb20d0f12e238a9d31d934',1,'openvdb::v3_2_0::tools::GridResampler::transformGrid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer.html#ac3b75824ebfd0591a034f86262715848',1,'openvdb::v3_2_0::tools::GridTransformer::transformGrid()']]], + ['transformh',['transformH',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a0a00e0cee96464deef181d12adb43c5d',1,'openvdb::v3_2_0::math::Mat4']]], + ['transformnormal',['transformNormal',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab5058d0329059c62556272839307aca5',1,'openvdb::v3_2_0::math']]], + ['transformpoints',['TransformPoints',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1TransformPoints.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['transformpoints',['TransformPoints',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1TransformPoints.html#a148efab8908bddb9ec25c408a91b4e35',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::TransformPoints']]], + ['transformptr',['transformPtr',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#aaeef9292b7aa4fd419dcdf4c83ede12c',1,'openvdb::v3_2_0::GridBase::transformPtr()'],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a1579bcd59be862f9db76338f2561255b',1,'openvdb::v3_2_0::GridBase::transformPtr() const ']]], + ['transforms_20and_20maps',['Transforms and Maps',['../transformsAndMaps.html',1,'overview']]], + ['transformtiles',['transformTiles',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html#a02045a43a7175ee80da871c55d282c54',1,'openvdb::v3_2_0::tools::GridResampler']]], + ['transformvalues',['TransformValues',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1TransformValues.html#a915dd347f3411405d58668845097b35e',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::TransformValues::TransformValues()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ae870e81ce652b9c057d92dbe4b4b9811',1,'openvdb::v3_2_0::tools::transformValues(const InIterT &inIter, OutGridT &outGrid, XformOp &op, bool threaded=true, bool shareOp=true, MergePolicy merge=MERGE_ACTIVE_STATES)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a21a43dc2e67d32098ee0f0b77e6b4aca',1,'openvdb::v3_2_0::tools::transformValues(const InIterT &inIter, OutGridT &outGrid, const XformOp &op, bool threaded=true, bool shareOp=true, MergePolicy merge=MERGE_ACTIVE_STATES)']]], + ['transformvalues',['TransformValues',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1TransformValues.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['transformvectors',['transformVectors',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a642190ccc3febe94d8b07ac37f892349',1,'openvdb::v3_2_0::tools']]], + ['translate',['translate',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a6b0b6b0cb3c738817e6cb73bcc324d33',1,'openvdb::v3_2_0::math::BBox::translate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a4be57e34cf9ad284ece51c8a46c6ddc1',1,'openvdb::v3_2_0::math::CoordBBox::translate()']]], + ['translation',['translation',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a54bfdafb84268d331ea8dd5abecd9579',1,'openvdb::v3_2_0::math::Mat4']]], + ['translationmap',['TranslationMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html',1,'openvdb::v3_2_0::math']]], + ['translationmap',['TranslationMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a68882ae92b983d700571e658b49f8dbe',1,'openvdb::v3_2_0::math::TranslationMap::TranslationMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a7aca669b9b0859bf74f55336a51ae44c',1,'openvdb::v3_2_0::math::TranslationMap::TranslationMap(const Vec3d &t)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a103f002dc741e175386a85e173e25746',1,'openvdb::v3_2_0::math::TranslationMap::TranslationMap(const TranslationMap &other)']]], + ['transpose',['transpose',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a4e8eabb325cbbf971fc8a03a7ad23d92',1,'openvdb::v3_2_0::math::Mat3::transpose()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a8109d997fd3a616f735ff95df91e37e1',1,'openvdb::v3_2_0::math::Mat4::transpose()']]], + ['tree',['Tree',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html',1,'openvdb::v3_2_0::tree']]], + ['tree',['tree',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyToVecOp.html#a3cfdbfcce0bf5c9da0af4cd4bae56bf8',1,'openvdb::v3_2_0::tools::poisson::internal::CopyToVecOp::tree()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyFromVecOp.html#a950a3ca7232fd6b385c321830ead6244',1,'openvdb::v3_2_0::tools::poisson::internal::CopyFromVecOp::tree()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a9041f381eeb1287165c1287603de9663',1,'openvdb::v3_2_0::Grid::tree()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a932dc28aa53e3961b2c4f8b3ff4c7242',1,'openvdb::v3_2_0::Grid::tree() const '],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a7fdbb97a777cbe597cdfa59410683bd9',1,'openvdb::v3_2_0::TreeAdapter::tree(TreeType &t)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#abab5ba35948b41bb831467273c979e49',1,'openvdb::v3_2_0::TreeAdapter::tree(GridType &g)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a2a045d738694275310c2820eca1eff95',1,'openvdb::v3_2_0::TreeAdapter::tree(const TreeType &t)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a5bf1ea8bbc254b6e9b4f395bb37d002b',1,'openvdb::v3_2_0::TreeAdapter::tree(const GridType &g)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a7fdbb97a777cbe597cdfa59410683bd9',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::tree(TreeType &t)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#abab5ba35948b41bb831467273c979e49',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::tree(GridType &g)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a2a045d738694275310c2820eca1eff95',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::tree(const TreeType &t)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a5bf1ea8bbc254b6e9b4f395bb37d002b',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::tree(const GridType &g)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a7fdbb97a777cbe597cdfa59410683bd9',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::tree(TreeType &t)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#abab5ba35948b41bb831467273c979e49',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::tree(GridType &g)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#afc35379e069a045c3d6e2ec80d375a55',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::tree(AccessorType &a)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a2a045d738694275310c2820eca1eff95',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::tree(const TreeType &t)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a5bf1ea8bbc254b6e9b4f395bb37d002b',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::tree(const GridType &g)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a33f02177c3365baa674abdac1c736110',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::tree(const AccessorType &a)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1CopyLeafNodes.html#aa4fbc4847cf2a90c4252120911106a14',1,'openvdb::v3_2_0::tools::clip_internal::CopyLeafNodes::tree()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1GenEdgeData.html#a9041f381eeb1287165c1287603de9663',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::GenEdgeData::tree()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a3eaefa9bfc7e8d743999ceaba0c8f9b1',1,'openvdb::v3_2_0::tools::MultiResGrid::tree()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a86621db4d1f486e9590128ff8c87c5ed',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::tree()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartGen.html#aa4bcecec8c047ca5aa744fe8b796759e',1,'openvdb::v3_2_0::tools::internal::PartGen::tree()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTopologyMask.html#aa4bcecec8c047ca5aa744fe8b796759e',1,'openvdb::v3_2_0::tools::internal::GenTopologyMask::tree()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenBoundaryMask.html#aa4bcecec8c047ca5aa744fe8b796759e',1,'openvdb::v3_2_0::tools::internal::GenBoundaryMask::tree()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTileMask.html#aa4bcecec8c047ca5aa744fe8b796759e',1,'openvdb::v3_2_0::tools::internal::GenTileMask::tree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a932dc28aa53e3961b2c4f8b3ff4c7242',1,'openvdb::v3_2_0::tree::LeafManager::tree() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a9041f381eeb1287165c1287603de9663',1,'openvdb::v3_2_0::tree::LeafManager::tree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html#a51e807b7c7a3ef45dbe459d62a3b715b',1,'openvdb::v3_2_0::tree::ValueAccessorBase::tree() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html#aa2f9f90efcd38311bf153da95f3561c0',1,'openvdb::v3_2_0::tree::ValueAccessorBase::Tree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#aa2f9f90efcd38311bf153da95f3561c0',1,'openvdb::v3_2_0::tree::ValueAccessor::Tree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#aa2f9f90efcd38311bf153da95f3561c0',1,'openvdb::v3_2_0::tree::ValueAccessor0::Tree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#aa2f9f90efcd38311bf153da95f3561c0',1,'openvdb::v3_2_0::tree::ValueAccessor1::Tree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#aa2f9f90efcd38311bf153da95f3561c0',1,'openvdb::v3_2_0::tree::ValueAccessor2::Tree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#aa2f9f90efcd38311bf153da95f3561c0',1,'openvdb::v3_2_0::tree::ValueAccessor3::Tree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a3dee5770ede29888f2c0136bbd7f5a95',1,'openvdb::v3_2_0::tree::Tree::Tree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a176bf2364d34c17e2e02eb44a21c520d',1,'openvdb::v3_2_0::tree::Tree::Tree(const Tree &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a213c0ce777bcd4328500431d3231a446',1,'openvdb::v3_2_0::tree::Tree::Tree(const Tree< OtherRootType > &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#adae3bd6c1599f80a0f3b518945195b9e',1,'openvdb::v3_2_0::tree::Tree::Tree(const OtherTreeType &other, const ValueType &inactiveValue, const ValueType &activeValue, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ab198c466f09f12bcd4d14367068450c6',1,'openvdb::v3_2_0::tree::Tree::Tree(const OtherTreeType &other, const ValueType &background, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ae65bce1b639b04c7f8004f54571e1453',1,'openvdb::v3_2_0::tree::Tree::Tree(const ValueType &background)'],['../MaskToLevelSet_8h.html#aa626f3df6e9e1c3192e1af84b51db04b',1,'tree(): MaskToLevelSet.h'],['../ParticlesToLevelSet_8h.html#aa626f3df6e9e1c3192e1af84b51db04b',1,'tree(): ParticlesToLevelSet.h']]], + ['tree_2eh',['Tree.h',['../Tree_8h.html',1,'']]], + ['tree3',['Tree3',['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree3.html',1,'openvdb::v3_2_0::tree']]], + ['tree4',['Tree4',['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree4.html',1,'openvdb::v3_2_0::tree']]], + ['tree4_3c_20edgedata_2c_205_2c_204_2c_203_20_3e',['Tree4< EdgeData, 5, 4, 3 >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree4.html',1,'openvdb::v3_2_0::tree']]], + ['tree5',['Tree5',['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree5.html',1,'openvdb::v3_2_0::tree']]], + ['treeadapter',['TreeAdapter',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html',1,'openvdb::v3_2_0']]], + ['treeadapter_3c_20grid_3c_20_5ftreetype_20_3e_20_3e',['TreeAdapter< Grid< _TreeType > >',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['treeadapter_3c_20tree_3a_3avalueaccessor_3c_20_5ftreetype_20_3e_20_3e',['TreeAdapter< tree::ValueAccessor< _TreeType > >',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['treebase',['TreeBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html',1,'openvdb::v3_2_0::tree']]], + ['treebase',['TreeBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a58f77a4e769811a4aea802b2e38b81b1',1,'openvdb::v3_2_0::tree::TreeBase::TreeBase()'],['../namespaceopenvdb_1_1v3__2__0.html#a15cd29f1deaf28e53f61fe753f176eb5',1,'openvdb::v3_2_0::TreeBase()']]], + ['treedepth',['treeDepth',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#ace18fe0a4642b592421789ed2f371a63',1,'openvdb::v3_2_0::tree::TreeBase::treeDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a914c980a4a12a76117400e549bde8872',1,'openvdb::v3_2_0::tree::Tree::treeDepth()']]], + ['treeiterator_2eh',['TreeIterator.h',['../TreeIterator_8h.html',1,'']]], + ['treeitertraits',['TreeIterTraits',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3aleafciter_20_3e',['TreeIterTraits< TreeT, typename TreeT::LeafCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1LeafCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3aleafiter_20_3e',['TreeIterTraits< TreeT, typename TreeT::LeafIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1LeafIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3anodeciter_20_3e',['TreeIterTraits< TreeT, typename TreeT::NodeCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1NodeCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3anodeiter_20_3e',['TreeIterTraits< TreeT, typename TreeT::NodeIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1NodeIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3arootnodetype_3a_3achildallciter_20_3e',['TreeIterTraits< TreeT, typename TreeT::RootNodeType::ChildAllCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1RootNodeType_1_1ChildAllCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3arootnodetype_3a_3achildalliter_20_3e',['TreeIterTraits< TreeT, typename TreeT::RootNodeType::ChildAllIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1RootNodeType_1_1ChildAllIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3arootnodetype_3a_3achildoffciter_20_3e',['TreeIterTraits< TreeT, typename TreeT::RootNodeType::ChildOffCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1RootNodeType_1_1ChildOffCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3arootnodetype_3a_3achildoffiter_20_3e',['TreeIterTraits< TreeT, typename TreeT::RootNodeType::ChildOffIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1RootNodeType_1_1ChildOffIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3arootnodetype_3a_3achildonciter_20_3e',['TreeIterTraits< TreeT, typename TreeT::RootNodeType::ChildOnCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1RootNodeType_1_1ChildOnCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3arootnodetype_3a_3achildoniter_20_3e',['TreeIterTraits< TreeT, typename TreeT::RootNodeType::ChildOnIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1RootNodeType_1_1ChildOnIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3avalueallciter_20_3e',['TreeIterTraits< TreeT, typename TreeT::ValueAllCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1ValueAllCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3avaluealliter_20_3e',['TreeIterTraits< TreeT, typename TreeT::ValueAllIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1ValueAllIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3avalueoffciter_20_3e',['TreeIterTraits< TreeT, typename TreeT::ValueOffCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1ValueOffCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3avalueoffiter_20_3e',['TreeIterTraits< TreeT, typename TreeT::ValueOffIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1ValueOffIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3avalueonciter_20_3e',['TreeIterTraits< TreeT, typename TreeT::ValueOnCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1ValueOnCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3avalueoniter_20_3e',['TreeIterTraits< TreeT, typename TreeT::ValueOnIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1ValueOnIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeptr',['treePtr',['../classopenvdb_1_1v3__2__0_1_1Grid.html#adc47070164ba764f5afe561998f88f17',1,'openvdb::v3_2_0::Grid::treePtr()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a2cc188500b338b27709910bf7d1a555a',1,'openvdb::v3_2_0::Grid::treePtr() const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#ad87d517cc6b96dfe176fccc2e3723162',1,'openvdb::v3_2_0::tools::MultiResGrid::treePtr(size_t level)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a1debe4564bc39db1b455b9bf7872bb4f',1,'openvdb::v3_2_0::tools::MultiResGrid::TreePtr()']]], + ['treeptrtype',['TreePtrType',['../classopenvdb_1_1v3__2__0_1_1Grid.html#afef2a21e48eda1f64f66669f7f826de3',1,'openvdb::v3_2_0::Grid::TreePtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a50074b4ecb1554dd79b20d1e2a238044',1,'openvdb::v3_2_0::TreeAdapter::TreePtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a50074b4ecb1554dd79b20d1e2a238044',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::TreePtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a50074b4ecb1554dd79b20d1e2a238044',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::TreePtrType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildPrimarySegment.html#a50074b4ecb1554dd79b20d1e2a238044',1,'openvdb::v3_2_0::tools::composite::BuildPrimarySegment::TreePtrType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildSecondarySegment.html#a50074b4ecb1554dd79b20d1e2a238044',1,'openvdb::v3_2_0::tools::composite::BuildSecondarySegment::TreePtrType()']]], + ['treet',['TreeT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CsgVisitorBase.html#a15967b95a876348b5a225bef7a3e6902',1,'openvdb::v3_2_0::tools::CsgVisitorBase::TreeT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgUnionVisitor.html#a15967b95a876348b5a225bef7a3e6902',1,'openvdb::v3_2_0::tools::CsgUnionVisitor::TreeT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgIntersectVisitor.html#a15967b95a876348b5a225bef7a3e6902',1,'openvdb::v3_2_0::tools::CsgIntersectVisitor::TreeT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgDiffVisitor.html#a15967b95a876348b5a225bef7a3e6902',1,'openvdb::v3_2_0::tools::CsgDiffVisitor::TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyToDense.html#af61d2fea6a53c3e0c9cd3fc35684b952',1,'openvdb::v3_2_0::tools::CopyToDense::TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyFromDense.html#af61d2fea6a53c3e0c9cd3fc35684b952',1,'openvdb::v3_2_0::tools::CopyFromDense::TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#af61d2fea6a53c3e0c9cd3fc35684b952',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor::TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#a6fc4d79a23d40016f923bc6fb59b57ca',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a3fa1cbd9a37dfb670f9cab7fb0b9f713',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::TreeT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1MathOp.html#abf54fa49495b0d1c2f23668106476e7d',1,'openvdb::v3_2_0::tools::stats_internal::MathOp::TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestSurfacePoint.html#a6fc4d79a23d40016f923bc6fb59b57ca',1,'openvdb::v3_2_0::tools::ClosestSurfacePoint::TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#af61d2fea6a53c3e0c9cd3fc35684b952',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#af61d2fea6a53c3e0c9cd3fc35684b952',1,'openvdb::v3_2_0::tree::NodeIteratorBase::TreeT()']]], + ['treetraits',['TreeTraits',['../structopenvdb_1_1v3__2__0_1_1tree_1_1leafmgr_1_1TreeTraits.html',1,'openvdb::v3_2_0::tree::leafmgr']]], + ['treetraits_3c_20const_20treet_20_3e',['TreeTraits< const TreeT >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1leafmgr_1_1TreeTraits_3_01const_01TreeT_01_4.html',1,'openvdb::v3_2_0::tree::leafmgr']]], + ['treetype',['TreeType',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a781db8c1f2c3f4f03715a0ac432b38a0',1,'openvdb::v3_2_0::Grid::TreeType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a781db8c1f2c3f4f03715a0ac432b38a0',1,'openvdb::v3_2_0::TreeAdapter::TreeType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a781db8c1f2c3f4f03715a0ac432b38a0',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::TreeType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a781db8c1f2c3f4f03715a0ac432b38a0',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::math::BaseStencil::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SevenPointStencil.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::math::SevenPointStencil::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BoxStencil.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::math::BoxStencil::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SecondOrderDenseStencil.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::math::SecondOrderDenseStencil::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ThirteenPointStencil.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::math::ThirteenPointStencil::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1FourthOrderDenseStencil.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::math::FourthOrderDenseStencil::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NineteenPointStencil.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::math::NineteenPointStencil::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SixthOrderDenseStencil.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::math::SixthOrderDenseStencil::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::math::GradStencil::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::math::WenoStencil::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CurvatureStencil.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::math::CurvatureStencil::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DenseStencil.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::math::DenseStencil::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#afb7bf3ee90caeae22f3bbd81e7aa7bcc',1,'openvdb::v3_2_0::tools::Filter::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#a36d460ea0a4df4f3dfa13b7e071e75d3',1,'openvdb::v3_2_0::tools::GridSampler::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html#af5ba81f3debea34f5eb54aa410259619',1,'openvdb::v3_2_0::tools::GridSampler< tree::ValueAccessor< TreeT >, SamplerType >::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler.html#aa72d230f274d703bad6bd9a6a2516190',1,'openvdb::v3_2_0::tools::DualGridSampler::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerT_01_4.html#af5ba81f3debea34f5eb54aa410259619',1,'openvdb::v3_2_0::tools::DualGridSampler< tree::ValueAccessor< TreeT >, SamplerT >::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#afb7bf3ee90caeae22f3bbd81e7aa7bcc',1,'openvdb::v3_2_0::tools::LevelSetFilter::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#afb7bf3ee90caeae22f3bbd81e7aa7bcc',1,'openvdb::v3_2_0::tools::LevelSetMeasure::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::tools::LevelSetMorphing::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::tools::LevelSetTracker::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData.html#aea106a722e3afdcc1416e9e9e130352e',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::TreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#a31ee3420fcda29b6bd440229afd01963',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#af5ba81f3debea34f5eb54aa410259619',1,'openvdb::v3_2_0::tree::LeafManager::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a781db8c1f2c3f4f03715a0ac432b38a0',1,'openvdb::v3_2_0::tree::ValueAccessor::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a781db8c1f2c3f4f03715a0ac432b38a0',1,'openvdb::v3_2_0::tree::ValueAccessor0::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a781db8c1f2c3f4f03715a0ac432b38a0',1,'openvdb::v3_2_0::tree::ValueAccessor1::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a781db8c1f2c3f4f03715a0ac432b38a0',1,'openvdb::v3_2_0::tree::ValueAccessor2::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a781db8c1f2c3f4f03715a0ac432b38a0',1,'openvdb::v3_2_0::tree::ValueAccessor3::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a34b9eb7da4505530a4199fa0a55ccf20',1,'openvdb::v3_2_0::tree::Tree::treeType()']]], + ['treetypeptr',['TreeTypePtr',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1GridOrTreeConstructor.html#ade86befaf01a9b9552b6073232a34de0',1,'openvdb::v3_2_0::tools::composite::GridOrTreeConstructor::TreeTypePtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#ade86befaf01a9b9552b6073232a34de0',1,'openvdb::v3_2_0::tools::composite::GridOrTreeConstructor< Grid< TreeType > >::TreeTypePtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskSegmentGroup.html#ade86befaf01a9b9552b6073232a34de0',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskSegmentGroup::TreeTypePtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FloodFillSign.html#ade86befaf01a9b9552b6073232a34de0',1,'openvdb::v3_2_0::tools::level_set_util_internal::FloodFillSign::TreeTypePtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskedCopy.html#ade86befaf01a9b9552b6073232a34de0',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskedCopy::TreeTypePtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor.html#ade86befaf01a9b9552b6073232a34de0',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor::TreeTypePtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#ade86befaf01a9b9552b6073232a34de0',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor< Grid< TreeType > >::TreeTypePtr()']]], + ['treevalueiteratorbase',['TreeValueIteratorBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#acabc2a875dca68c4bca2359fc5f6d292',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::TreeValueIteratorBase(TreeT &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#affd4cd4fa6bbd396d6c7e19ef603b862',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::TreeValueIteratorBase(const TreeValueIteratorBase &other)']]], + ['treevalueiteratorbase',['TreeValueIteratorBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['treevaluet',['TreeValueT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyToVecOp.html#ac57a660a29c8a6e5912851dbd08578eb',1,'openvdb::v3_2_0::tools::poisson::internal::CopyToVecOp']]], + ['triangle',['triangle',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#af09d9958a945f4b408df79091bdfead5',1,'openvdb::v3_2_0::tools::PolygonPool::triangle(size_t n)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#aea80f976e64558aef63fa5c7ab319130',1,'openvdb::v3_2_0::tools::PolygonPool::triangle(size_t n) const ']]], + ['triangleconstrow',['TriangleConstRow',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#a9c20229c5982d6722ea8fba79164e67f',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner']]], + ['triangleflags',['triangleFlags',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#a128bd1db3cb090bb4f7e0a6e54055ac7',1,'openvdb::v3_2_0::tools::PolygonPool::triangleFlags(size_t n)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#a5faa1c91247e0f29049ac508975e0c9f',1,'openvdb::v3_2_0::tools::PolygonPool::triangleFlags(size_t n) const ']]], + ['triangleroweditor',['TriangleRowEditor',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#a77cf11753a97abf94dc7fb57f9618d74',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner']]], + ['triangularmatrix',['TriangularMatrix',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#a316e64466934b9a1b9ef33cec98d6420',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner']]], + ['trilinearinterpolation',['trilinearInterpolation',['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html#a8cb99ca3a192bf933bc987a484894734',1,'openvdb::v3_2_0::tools::BoxSampler']]], + ['trimquads',['trimQuads',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#aff35a526ee23e9b98b8df46190b7af52',1,'openvdb::v3_2_0::tools::PolygonPool']]], + ['trimtrinagles',['trimTrinagles',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#a971b981830a3f0d5bea2d6281a9eb62b',1,'openvdb::v3_2_0::tools::PolygonPool']]], + ['triquadraticinterpolation',['triquadraticInterpolation',['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadraticSampler.html#a0861fd17ac9c8cb119b1a4de4617bf83',1,'openvdb::v3_2_0::tools::QuadraticSampler']]], + ['truncate',['Truncate',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a639d56dfede9f213b89b6325ddb89f7b',1,'openvdb::v3_2_0::math']]], + ['truncaterealtohalf',['truncateRealToHalf',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a27727fecb80234d26033a910aef4bb1e',1,'openvdb::v3_2_0::io']]], + ['tuple',['Tuple',['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html',1,'openvdb::v3_2_0::math']]], + ['tuple',['Tuple',['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#a4766c7b239a3a6c3980f7e84d5439377',1,'openvdb::v3_2_0::math::Tuple::Tuple()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#a36646643727b34842e2c9f2aa1b3fd75',1,'openvdb::v3_2_0::math::Tuple::Tuple(Tuple const &src)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#acd1c8953121142aed4cca66cd5500920',1,'openvdb::v3_2_0::math::Tuple::Tuple(Tuple< src_size, src_valtype > const &src)']]], + ['tuple_2eh',['Tuple.h',['../Tuple_8h.html',1,'']]], + ['tuple_3c_202_2c_20t_20_3e',['Tuple< 2, T >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html',1,'openvdb::v3_2_0::math']]], + ['tuple_3c_203_2c_20double_20_3e',['Tuple< 3, double >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html',1,'openvdb::v3_2_0::math']]], + ['tuple_3c_203_2c_20real_20_3e',['Tuple< 3, Real >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html',1,'openvdb::v3_2_0::math']]], + ['tuple_3c_203_2c_20t_20_3e',['Tuple< 3, T >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html',1,'openvdb::v3_2_0::math']]], + ['tuple_3c_204_2c_20t_20_3e',['Tuple< 4, T >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html',1,'openvdb::v3_2_0::math']]], + ['tvd_5frk1',['TVD_RK1',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a03c27a767120b8c3ed1ac0be2f82c7fda1c82568ca6ec9bbdcb7ba1dd20272e53',1,'openvdb::v3_2_0::math']]], + ['tvd_5frk2',['TVD_RK2',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a03c27a767120b8c3ed1ac0be2f82c7fdaade4c5f3d0823a2767f2ba8eedfec5fc',1,'openvdb::v3_2_0::math']]], + ['tvd_5frk3',['TVD_RK3',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a03c27a767120b8c3ed1ac0be2f82c7fdabb3714a3d71ccea2f448ec40f5b8a28a',1,'openvdb::v3_2_0::math']]], + ['type',['type',['../structopenvdb_1_1v3__2__0_1_1math_1_1promote.html#a9e155c97926413dbf4e714fb820f9c6a',1,'openvdb::v3_2_0::math::promote::type()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UniquePtr.html#a6e368a7fb23816e16795aa38b898cf2c',1,'openvdb::v3_2_0::tools::internal::UniquePtr::type()'],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ac84caf0458432553a758020564afd5b6',1,'openvdb::v3_2_0::GridBase::type()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a79fd411a77e6a2508e292d37512a2bab',1,'openvdb::v3_2_0::Grid::type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#ac84caf0458432553a758020564afd5b6',1,'openvdb::v3_2_0::math::MapBase::type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#ab402d4b033527d1a1fc000633f270494',1,'openvdb::v3_2_0::math::AffineMap::type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#ab402d4b033527d1a1fc000633f270494',1,'openvdb::v3_2_0::math::ScaleMap::type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#ab402d4b033527d1a1fc000633f270494',1,'openvdb::v3_2_0::math::UniformScaleMap::type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#ab402d4b033527d1a1fc000633f270494',1,'openvdb::v3_2_0::math::TranslationMap::type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#ab402d4b033527d1a1fc000633f270494',1,'openvdb::v3_2_0::math::ScaleTranslateMap::type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#ab402d4b033527d1a1fc000633f270494',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#ab402d4b033527d1a1fc000633f270494',1,'openvdb::v3_2_0::math::UnitaryMap::type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#ab402d4b033527d1a1fc000633f270494',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#ab402d4b033527d1a1fc000633f270494',1,'openvdb::v3_2_0::math::CompoundMap::type()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a5b3a00bb536b37d30bf04307b3fa15ec',1,'openvdb::v3_2_0::tree::TreeBase::type()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a8436ea82104526405e9cf8b816ddd55c',1,'openvdb::v3_2_0::tree::Tree::type()'],['../structopenvdb_1_1v3__2__0_1_1Grid_1_1ValueConverter.html#ab878c96052e4bd7ffd01406e542a419b',1,'openvdb::v3_2_0::Grid::ValueConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1DSConverter.html#a87d4cf7f297f6694fc209f3a6ec3f167',1,'openvdb::v3_2_0::tools::DSConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1VectorToScalarConverter.html#a11740aac462a0be7c37c692175a28e3a',1,'openvdb::v3_2_0::tools::VectorToScalarConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ScalarToVectorConverter.html#a8b727e6fbafe29f45e41f6dd34442324',1,'openvdb::v3_2_0::tools::ScalarToVectorConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1ToMaskGrid.html#ad1b893a92556ac5d1b808479729f5790',1,'openvdb::v3_2_0::tools::gridop::ToMaskGrid::Type()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1DimToWord_3_013_01_4.html#a9d11d1b8a430e90035e92601c81e727c',1,'openvdb::v3_2_0::tools::DimToWord< 3 >::Type()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1DimToWord_3_014_01_4.html#abbb059b13f910992506421a532f66d07',1,'openvdb::v3_2_0::tools::DimToWord< 4 >::Type()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1DimToWord_3_015_01_4.html#a26dc433e5d0d9824a01c3d8af7e09ca9',1,'openvdb::v3_2_0::tools::DimToWord< 5 >::Type()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1DimToWord_3_016_01_4.html#a913d787c8b2ab9d92605b20ad85fc5dd',1,'openvdb::v3_2_0::tools::DimToWord< 6 >::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ValueConverter.html#a241f44943eef08b01c13405a1c9f84ba',1,'openvdb::v3_2_0::tree::InternalNode::ValueConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueConverter.html#a96c3cfd601615c865529caf8aa3d39d5',1,'openvdb::v3_2_0::tree::LeafNode::ValueConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ValueConverter.html#ab7370e7563e54bb527a70c151700b39a',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ValueConverter.html#a96c3cfd601615c865529caf8aa3d39d5',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1RootNode_1_1ValueConverter.html#aa8fd1f62842d2bf20ffa71817f25f110',1,'openvdb::v3_2_0::tree::RootNode::ValueConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1NodeChain.html#a05a33b77c742935517ca2e34a5ca6507',1,'openvdb::v3_2_0::tree::NodeChain::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1NodeChain_3_01HeadT_00_011_01_4.html#a3c05a489a315d0caa6cbdee5940a3c4a',1,'openvdb::v3_2_0::tree::NodeChain< HeadT, 1 >::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree_1_1ValueConverter.html#aee1be7ed6a52b19655f813d536f35afd',1,'openvdb::v3_2_0::tree::Tree::ValueConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree3.html#a1012aacb1e7f5ebe56cb8acd3b78cebd',1,'openvdb::v3_2_0::tree::Tree3::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree4.html#a730b8e56ad8b5eca191d78546c8fc6c2',1,'openvdb::v3_2_0::tree::Tree4::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree5.html#ad7e9705f00a3dcfd7be60c992fd3a76a',1,'openvdb::v3_2_0::tree::Tree5::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1CopyConstness.html#a28a8146771b7ddd0b9ec08b41012c08d',1,'openvdb::v3_2_0::tree::CopyConstness::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1CopyConstness_3_01const_01FromType_00_01ToType_01_4.html#a393e31991d3756aecd249aba8d38224f',1,'openvdb::v3_2_0::tree::CopyConstness< const FromType, ToType >::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1iter_1_1InvertedTree.html#a05a33b77c742935517ca2e34a5ca6507',1,'openvdb::v3_2_0::tree::iter::InvertedTree::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1iter_1_1InvertedTree_3_01HeadT_00_011_01_4.html#a3c05a489a315d0caa6cbdee5940a3c4a',1,'openvdb::v3_2_0::tree::iter::InvertedTree< HeadT, 1 >::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOnIter_01_4_1_1NodeConverter.html#ae5ce22373ac106e412fd8cb585caf5b7',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOnIter >::NodeConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOnCIter_01_4_1_1NodeConverter.html#af2f91160480282d27e83171eafab3aba',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOnCIter >::NodeConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOffIter_01_4_1_1NodeConverter.html#aa12895ccb526efd3a57bed2d49ed4fc8',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOffIter >::NodeConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOffCIter_01_4_1_1NodeConverter.html#af1305dbc58a8503ac69f5b0a26cf64aa',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOffCIter >::NodeConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildAllIter_01_4_1_1NodeConverter.html#aa75d85eb65f948bf3303fa87ab8e8b17',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildAllIter >::NodeConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildAllCIter_01_4_1_1NodeConverter.html#a9cdc604bc85df2b3db1377797d91eba9',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildAllCIter >::NodeConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOnIter_01_4_1_1NodeConverter.html#acac1f09f1d13cdb7a686fa963ad0c1fd',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOnIter >::NodeConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOnCIter_01_4_1_1NodeConverter.html#a0e044311f5e7bcce228455eae33b9285',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOnCIter >::NodeConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOffIter_01_4_1_1NodeConverter.html#a96683c62e3c10a976f19f699528d6a16',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOffIter >::NodeConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOffCIter_01_4_1_1NodeConverter.html#a8c6b66ce0a05409bfb5cadda1e82d03e',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOffCIter >::NodeConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueAllIter_01_4_1_1NodeConverter.html#a3a797e676984c8492da21dbb50716840',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueAllIter >::NodeConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueAllCIter_01_4_1_1NodeConverter.html#a3ccec23c187f79376fa7028f4256409d',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueAllCIter >::NodeConverter::Type()']]], + ['typedmetadata',['TypedMetadata',['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html',1,'openvdb::v3_2_0']]], + ['typedmetadata',['TypedMetadata',['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a9e3ff5782592bf736509fce62509fe27',1,'openvdb::v3_2_0::TypedMetadata::TypedMetadata()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a0ca3a3d3d3c653db95d4d528328becc0',1,'openvdb::v3_2_0::TypedMetadata::TypedMetadata(const T &value)'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a8ba831ad4fc5d68c3a53b52c63688626',1,'openvdb::v3_2_0::TypedMetadata::TypedMetadata(const TypedMetadata< T > &other)']]], + ['typeerror',['TypeError',['../classopenvdb_1_1v3__2__0_1_1TypeError.html#a3d1f1e0e0c2d6935842a02c9ddfb0970',1,'openvdb::v3_2_0::TypeError::TypeError()'],['../classopenvdb_1_1v3__2__0_1_1TypeError.html#a1ce940b25998c3a78afab2566dae2b24',1,'openvdb::v3_2_0::TypeError::TypeError(const std::string &msg)']]], + ['typeerror',['TypeError',['../classopenvdb_1_1v3__2__0_1_1TypeError.html',1,'openvdb::v3_2_0']]], + ['typename',['typeName',['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a1b837ccf3ad9d9a585147e34194ab79f',1,'openvdb::v3_2_0::Metadata::typeName()'],['../classopenvdb_1_1v3__2__0_1_1UnknownMetadata.html#accdcf705ac8026130d5093a3a0d08203',1,'openvdb::v3_2_0::UnknownMetadata::typeName()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a0669e7e9e0854e4d6611b6a3f9f5387a',1,'openvdb::v3_2_0::TypedMetadata::typeName()']]], + ['typenameasstring',['typeNameAsString',['../namespaceopenvdb_1_1v3__2__0.html#a14e91546664c2686e256e850339064b6',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20bool_20_3e',['typeNameAsString< bool >',['../namespaceopenvdb_1_1v3__2__0.html#a4890e01190bc7c2f64e7237bf866b515',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20double_20_3e',['typeNameAsString< double >',['../namespaceopenvdb_1_1v3__2__0.html#a2438c22565639a140915d9855f58ecec',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20float_20_3e',['typeNameAsString< float >',['../namespaceopenvdb_1_1v3__2__0.html#af7970747248d59c6faa7e8c72230eb47',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20int32_5ft_20_3e',['typeNameAsString< int32_t >',['../namespaceopenvdb_1_1v3__2__0.html#a06f4ce6dc57d22ca7d613eacb5758772',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20int64_5ft_20_3e',['typeNameAsString< int64_t >',['../namespaceopenvdb_1_1v3__2__0.html#a30e4418303428d8a0971dab9b5a4345a',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20mat4d_20_3e',['typeNameAsString< Mat4d >',['../namespaceopenvdb_1_1v3__2__0.html#ac1a21f46fa3d478106675e91dba2a824',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20mat4s_20_3e',['typeNameAsString< Mat4s >',['../namespaceopenvdb_1_1v3__2__0.html#aabb320a0e5eae9f83f6bb9365789a41d',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20pointdataindex32_20_3e',['typeNameAsString< PointDataIndex32 >',['../namespaceopenvdb_1_1v3__2__0.html#a8bf8316a84b65e8df3384e6a6f320b9b',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20pointdataindex64_20_3e',['typeNameAsString< PointDataIndex64 >',['../namespaceopenvdb_1_1v3__2__0.html#a3c55b55c7f77c03274b1756c786134cb',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20pointindex32_20_3e',['typeNameAsString< PointIndex32 >',['../namespaceopenvdb_1_1v3__2__0.html#ada78f602692d995da873ed16214f606b',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20pointindex64_20_3e',['typeNameAsString< PointIndex64 >',['../namespaceopenvdb_1_1v3__2__0.html#ad780726e7c28b22829a8bf55ecf304ae',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20std_3a_3astring_20_3e',['typeNameAsString< std::string >',['../namespaceopenvdb_1_1v3__2__0.html#ae2bb60144ddd4b23e9ba4c1687e35a3d',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20uint32_5ft_20_3e',['typeNameAsString< uint32_t >',['../namespaceopenvdb_1_1v3__2__0.html#ab71b229545264ca59764777a6effa4fd',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20valuemask_20_3e',['typeNameAsString< ValueMask >',['../namespaceopenvdb_1_1v3__2__0.html#af71b8a0133b2572fce5cdb7c7ccf51d8',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20vec2d_20_3e',['typeNameAsString< Vec2d >',['../namespaceopenvdb_1_1v3__2__0.html#a7bb826b82553cfad26532f01f2bd520e',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20vec2i_20_3e',['typeNameAsString< Vec2i >',['../namespaceopenvdb_1_1v3__2__0.html#a35a82fb0e73264e7f286e248814fad78',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20vec2s_20_3e',['typeNameAsString< Vec2s >',['../namespaceopenvdb_1_1v3__2__0.html#a8b75cda4d422629032c35f1e17b393d6',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20vec3d_20_3e',['typeNameAsString< Vec3d >',['../namespaceopenvdb_1_1v3__2__0.html#a6a0699eaf1151409ec66ffdadcf70477',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20vec3f_20_3e',['typeNameAsString< Vec3f >',['../namespaceopenvdb_1_1v3__2__0.html#aaadb54933419379883d9df002239baef',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20vec3i_20_3e',['typeNameAsString< Vec3i >',['../namespaceopenvdb_1_1v3__2__0.html#a64ab4af10f11df00c1a0b2d0aab94eb5',1,'openvdb::v3_2_0']]], + ['types_2eh',['Types.h',['../Types_8h.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_16.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_16.html new file mode 100644 index 00000000..395304ea --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_16.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_16.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_16.js new file mode 100644 index 00000000..05e2774a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_16.js @@ -0,0 +1,59 @@ +var searchData= +[ + ['using_20openvdb_20in_20python',['Using OpenVDB in Python',['../python.html',1,'index']]], + ['uchartreeacc',['UCharTreeAcc',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#a751c230b1d43a58d51ba0bbad3bacb69',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData']]], + ['uchartreetype',['UCharTreeType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#a91730f2e8d4ce28c64a6b5e10e785da9',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData']]], + ['uint32pointpartitioner',['UInt32PointPartitioner',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a0f143f1cea06b16a55cd2523ab2d2df9',1,'openvdb::v3_2_0::tools']]], + ['uint32tree',['UInt32Tree',['../namespaceopenvdb_1_1v3__2__0.html#a3056a126b3e57feee79d0b7684e46cc2',1,'openvdb::v3_2_0']]], + ['uniformpointscatter',['UniformPointScatter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1UniformPointScatter.html',1,'openvdb::v3_2_0::tools']]], + ['uniformpointscatter',['UniformPointScatter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1UniformPointScatter.html#a72730b4f15d24f8fbf00c41636fb24b3',1,'openvdb::v3_2_0::tools::UniformPointScatter::UniformPointScatter(PointAccessorType &points, Index64 pointCount, RandomGenerator &randGen, InterruptType *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1UniformPointScatter.html#a4f3203350c74367e36aad40e1a305a2f',1,'openvdb::v3_2_0::tools::UniformPointScatter::UniformPointScatter(PointAccessorType &points, float pointsPerVolume, RandomGenerator &randGen, InterruptType *interrupt=NULL)']]], + ['uniformprimbuilder',['UniformPrimBuilder',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UniformPrimBuilder.html#a984fb4caa38f43010c993da6d0b61055',1,'openvdb::v3_2_0::tools::internal::UniformPrimBuilder']]], + ['uniformprimbuilder',['UniformPrimBuilder',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UniformPrimBuilder.html',1,'openvdb::v3_2_0::tools::internal']]], + ['uniformscalemap',['UniformScaleMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#a7bcdd97a9b4d189dd3a179a844db60e0',1,'openvdb::v3_2_0::math::UniformScaleMap::UniformScaleMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#a3528d6f4efb25f7eab4d5969991607b3',1,'openvdb::v3_2_0::math::UniformScaleMap::UniformScaleMap(double scale)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#ae97706e4dc9c99adbfcc8817d359c37a',1,'openvdb::v3_2_0::math::UniformScaleMap::UniformScaleMap(const UniformScaleMap &other)']]], + ['uniformscalemap',['UniformScaleMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html',1,'openvdb::v3_2_0::math']]], + ['uniformscaletranslatemap',['UniformScaleTranslateMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html',1,'openvdb::v3_2_0::math']]], + ['uniformscaletranslatemap',['UniformScaleTranslateMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#aedb9214b218332921bc3aeadb3040055',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::UniformScaleTranslateMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#a8629e7653eff3ed73d6c926d36915c64',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::UniformScaleTranslateMap(double scale, const Vec3d &translate)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#aa4219d4701a6d8cb3352ab46d19548c9',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::UniformScaleTranslateMap(const UniformScaleMap &scale, const TranslationMap &translate)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#a3dc4bf2db1a818113f4b99dd062221c0',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::UniformScaleTranslateMap(const UniformScaleTranslateMap &other)']]], + ['uninitialize',['uninitialize',['../namespaceopenvdb_1_1v3__2__0.html#a2146c402763d2083437538279eba3e7c',1,'openvdb::v3_2_0']]], + ['uniontype',['UnionType',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a57297009813014bcf584a1d4ba0cd053',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['unionvaluemasks',['UnionValueMasks',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1UnionValueMasks.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['unionvaluemasks',['UnionValueMasks',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1UnionValueMasks.html#ab2a5556f36415d1d97b27470b304387c',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::UnionValueMasks']]], + ['uniqueinactivevalues',['uniqueInactiveValues',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a136006bbdda1e616071dba827c34be79',1,'openvdb::v3_2_0::tools']]], + ['uniquename',['uniqueName',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a042c13a7b052c1c78e3b975b31aa59e3',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['uniqueptr',['UniquePtr',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UniquePtr.html',1,'openvdb::v3_2_0::tools::internal']]], + ['uniqueptr_3c_20openvdb_3a_3avec3s_20_3e',['UniquePtr< openvdb::Vec3s >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UniquePtr.html',1,'openvdb::v3_2_0::tools::internal']]], + ['unit',['unit',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a734342d43def849fdb0c7d73a1589fd4',1,'openvdb::v3_2_0::math::Quat::unit()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a266e8e802c38dad978f002776d565832',1,'openvdb::v3_2_0::math::Vec2::unit(T eps=0) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a4a3b6f7b1801c039c67b45b267015cf2',1,'openvdb::v3_2_0::math::Vec2::unit(T eps, T &len) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a6db66d00a325585eca99aef9951993bd',1,'openvdb::v3_2_0::math::Vec3::unit(T eps=0) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a3d3ef3ff0a90d9802d2e9767e034656e',1,'openvdb::v3_2_0::math::Vec3::unit(T eps, T &len) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#abd394719639cabb1263d512be286f81c',1,'openvdb::v3_2_0::math::Vec4::unit(T eps=0) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a00e9c9c1e2aa02e82c5c5f29744e7805',1,'openvdb::v3_2_0::math::Vec4::unit(T eps, T &len) const '],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a92e53d06b9ea9075d9b33a2b600720d0',1,'openvdb::v3_2_0::math::unit(const MatType &mat, typename MatType::value_type eps=1.0e-8)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab475125149e2de674468751f9da7c3f1',1,'openvdb::v3_2_0::math::unit(const MatType &in, typename MatType::value_type eps, Vec3< typename MatType::value_type > &scaling)']]], + ['unitaryandtranslationmap',['UnitaryAndTranslationMap',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a430b50ab102d4f232678ccc550a13e28',1,'openvdb::v3_2_0::math']]], + ['unitarymap',['UnitaryMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html',1,'openvdb::v3_2_0::math']]], + ['unitarymap',['UnitaryMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#ac64cc0340e36e70e0de20c0b58fed0d8',1,'openvdb::v3_2_0::math::UnitaryMap::UnitaryMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a882bbdb43bc2154565c3694b070fdb13',1,'openvdb::v3_2_0::math::UnitaryMap::UnitaryMap(const Vec3d &axis, double radians)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a9b514134b8b2cc386e60c6954a8949be',1,'openvdb::v3_2_0::math::UnitaryMap::UnitaryMap(Axis axis, double radians)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#aef71dc5f448f8d742082c109b24ee51d',1,'openvdb::v3_2_0::math::UnitaryMap::UnitaryMap(const Mat3d &m)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a3f1c3ad7407a9fed2b0360429a76a7f2',1,'openvdb::v3_2_0::math::UnitaryMap::UnitaryMap(const Mat4d &m)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#abeebf3f9938f7294debee94e46b53079',1,'openvdb::v3_2_0::math::UnitaryMap::UnitaryMap(const UnitaryMap &other)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#af07b4cb7b5d5afea6d5f69a05e404472',1,'openvdb::v3_2_0::math::UnitaryMap::UnitaryMap(const UnitaryMap &first, const UnitaryMap &second)']]], + ['unittoworld',['unitToWorld',['../classopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1LegacyFrustum.html#a8d133d36ae7600a429fcee4c6d161cd1',1,'openvdb::v3_2_0::math::internal::LegacyFrustum']]], + ['unknown',['UNKNOWN',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba6ce26a62afab55d7606ad4e92428b30c',1,'openvdb::v3_2_0::io::Queue']]], + ['unknown_5fbias',['UNKNOWN_BIAS',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9b59f0a0c54e6e3759f1418d40585656aaebd87e037a6230fff604d38747e040e',1,'openvdb::v3_2_0::math']]], + ['unknown_5fdd',['UNKNOWN_DD',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4994cfdf23949af8ea6889b3ec5c9e20a00457211044a17e1b9f5c4560cd25341',1,'openvdb::v3_2_0::math']]], + ['unknown_5fds',['UNKNOWN_DS',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57a256e16c1db4302e0fe17ffba4dbf8a7e',1,'openvdb::v3_2_0::math']]], + ['unknown_5ftis',['UNKNOWN_TIS',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a03c27a767120b8c3ed1ac0be2f82c7fda4c9ae606192e7d1f4e2dea35ab9d3142',1,'openvdb::v3_2_0::math']]], + ['unknownmetadata',['UnknownMetadata',['../classopenvdb_1_1v3__2__0_1_1UnknownMetadata.html',1,'openvdb::v3_2_0']]], + ['unknownmetadata',['UnknownMetadata',['../classopenvdb_1_1v3__2__0_1_1UnknownMetadata.html#a207888c54dec727ec87339385193be54',1,'openvdb::v3_2_0::UnknownMetadata']]], + ['unpack',['unpack',['../classopenvdb_1_1v3__2__0_1_1math_1_1QuantizedUnitVec.html#a380d7f4c5f08c980f560bdd3584f70d5',1,'openvdb::v3_2_0::math::QuantizedUnitVec']]], + ['unpackpoint',['unpackPoint',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#acab56c45850f15a1ddd6950bd798fbcf',1,'openvdb::v3_2_0::tools::internal']]], + ['unregistergrid',['unregisterGrid',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#aa275e35634a4e443a0804acb5f2cb0ac',1,'openvdb::v3_2_0::GridBase::unregisterGrid()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#adf3063b7ed272d322fdf4758fa3a70a7',1,'openvdb::v3_2_0::Grid::unregisterGrid()']]], + ['unregistermap',['unregisterMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapRegistry.html#a2271767b937f9bfdb1fbf3f7d0596af7',1,'openvdb::v3_2_0::math::MapRegistry']]], + ['unregistertype',['unregisterType',['../classopenvdb_1_1v3__2__0_1_1Metadata.html#ac36e5e8693aa2d6456d00c2bc68fd077',1,'openvdb::v3_2_0::Metadata::unregisterType()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a885f39d1666cf6461877ffc11949cb50',1,'openvdb::v3_2_0::TypedMetadata::unregisterType()']]], + ['unsafeaccessor',['UnsafeAccessor',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a0583888267e2dfc451e784097906afc6',1,'openvdb::v3_2_0::Grid']]], + ['unsetchildnode',['unsetChildNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aec7c1f8ba3b65cdaeb6030d5c8b5011f',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['unsetitem',['unsetItem',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DenseIter.html#a7984d3fc11284442b2e47343d93072d1',1,'openvdb::v3_2_0::tree::InternalNode::DenseIter::unsetItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#af754cdfbc3961357dbf7c4280a18cc7a',1,'openvdb::v3_2_0::tree::DenseIteratorBase::unsetItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1DenseIter.html#a7984d3fc11284442b2e47343d93072d1',1,'openvdb::v3_2_0::tree::LeafNode::DenseIter::unsetItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1DenseIter.html#a23194ff4a01a3982dc536c1670e84452',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::DenseIter::unsetItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1DenseIter.html#a23194ff4a01a3982dc536c1670e84452',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::DenseIter::unsetItem()']]], + ['unsigned_5fdistance_5ffield',['UNSIGNED_DISTANCE_FIELD',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a2623bf4797b966b29fbe45c87e60481ca99d80e217668e63e75cbd0591f034f70',1,'openvdb::v3_2_0::tools']]], + ['unzipfromstream',['unzipFromStream',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#abe3d337b2ef858b0bc4769e5973962dc',1,'openvdb::v3_2_0::io']]], + ['update',['update',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1MaskManager.html#ac5c54df7ed3b930268c8d7752c101725',1,'openvdb::v3_2_0::tools::Morphology::MaskManager::update()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1UpdateMasks.html#ac5c54df7ed3b930268c8d7752c101725',1,'openvdb::v3_2_0::tools::Morphology::UpdateMasks::update()']]], + ['updatebackpointers',['updateBackPointers',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a7ea63781e021eb8be8c9c7d1ac7be5bd',1,'openvdb::v3_2_0::tree::IterListItem::updateBackPointers()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a8dd4e90b61aa818e76d563826a85f43e',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::updateBackPointers()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a7ea63781e021eb8be8c9c7d1ac7be5bd',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::updateBackPointers()']]], + ['updateddistnodes',['updatedDistNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#ae735db2955c8bef664d98dcf661eaf55',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband']]], + ['updatedindexnodes',['updatedIndexNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#a3c3a03a17e4dd0c077ff0155068126af',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband']]], + ['updatefromlevel',['updateFromLevel',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#a11dc96378f417203ae0791a5022005f0',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator']]], + ['updatemasks',['UpdateMasks',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1UpdateMasks.html',1,'openvdb::v3_2_0::tools::Morphology']]], + ['updatemasks',['UpdateMasks',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1UpdateMasks.html#a95b7fefaff0e6c43af6b82651b66659d',1,'openvdb::v3_2_0::tools::Morphology::UpdateMasks']]], + ['updatepoints',['UpdatePoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UpdatePoints.html#a91397e1b9f6dbf06c8560925b7d2b555',1,'openvdb::v3_2_0::tools::internal::UpdatePoints::UpdatePoints(const Vec4s &sphere, const std::vector< Vec3R > &points, std::vector< float > &distances, std::vector< unsigned char > &mask, bool overlapping)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UpdatePoints.html#aa75f69cc58926c0df1f0d1d856cab345',1,'openvdb::v3_2_0::tools::internal::UpdatePoints::UpdatePoints(UpdatePoints &, tbb::split)']]], + ['updatepoints',['UpdatePoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UpdatePoints.html',1,'openvdb::v3_2_0::tools::internal']]], + ['updateresultactive',['updateResultActive',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a56ca9dc74d2f8df6b96a32a9ac4ed728',1,'openvdb::v3_2_0::CombineArgs']]], + ['uppermatrix',['upperMatrix',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#a9305d5b31c30ce2f43df9c64aab93c6f',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner']]], + ['use_5fhits',['USE_HITS',['../RayTracer_8h.html#afdd8a9f63fc84bda1998204d8bb3b3ea',1,'RayTracer.h']]], + ['util_2eh',['Util.h',['../Util_8h.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_17.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_17.html new file mode 100644 index 00000000..d64d1b99 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_17.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_17.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_17.js new file mode 100644 index 00000000..474126e7 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_17.js @@ -0,0 +1,256 @@ +var searchData= +[ + ['v',['v',['../structopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Fill.html#a3efae0f277f4e78cc0a6cb2bae75d24f',1,'openvdb::v3_2_0::util::PagedArray::Fill']]], + ['val',['val',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1FillOp.html#a0ae7fd0420096516284bce77e9cc8407',1,'openvdb::v3_2_0::math::pcg::internal::FillOp::val()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1MinOp.html#a4f2c20cf054c2c29fe71a612998129de',1,'openvdb::v3_2_0::tools::valxform::MinOp::val()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1MaxOp.html#a4f2c20cf054c2c29fe71a612998129de',1,'openvdb::v3_2_0::tools::valxform::MaxOp::val()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SumOp.html#a4f2c20cf054c2c29fe71a612998129de',1,'openvdb::v3_2_0::tools::valxform::SumOp::val()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1MultOp.html#a4f2c20cf054c2c29fe71a612998129de',1,'openvdb::v3_2_0::tools::valxform::MultOp::val()']]], + ['valid',['valid',['../structopenvdb_1_1v3__2__0_1_1math_1_1Ray_1_1TimeSpan.html#a7f7c402461c78df06683bba5f4f4f35d',1,'openvdb::v3_2_0::math::Ray::TimeSpan::valid()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a163e52144c2d51801e3b2999d4f13296',1,'openvdb::v3_2_0::math::Ray::valid()']]], + ['validateintersectingvoxels',['ValidateIntersectingVoxels',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ValidateIntersectingVoxels.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['validateintersectingvoxels',['ValidateIntersectingVoxels',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ValidateIntersectingVoxels.html#a85415620a7fda315ef3455c76b19fd25',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ValidateIntersectingVoxels']]], + ['validpartitioningop',['ValidPartitioningOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1ValidPartitioningOp.html',1,'openvdb::v3_2_0::tools::point_index_grid_internal']]], + ['validpartitioningop',['ValidPartitioningOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1ValidPartitioningOp.html#a1cea3bf73865d3dbb06ee95441686546',1,'openvdb::v3_2_0::tools::point_index_grid_internal::ValidPartitioningOp']]], + ['value',['value',['../structopenvdb_1_1v3__2__0_1_1CanConvertType.html#a99fb83031ce9923c84392b4e92f956b5a97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T_00_01math_1_1Vec2_3_01T_01_4_01_4.html#abc6126af1d45847bc59afa0aa3216b04a97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< T, math::Vec2< T > >::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T_00_01math_1_1Vec3_3_01T_01_4_01_4.html#adc29c2ff13d900c2f185ee95427fb06ca97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< T, math::Vec3< T > >::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T_00_01math_1_1Vec4_3_01T_01_4_01_4.html#a61dadd085c1777f559549e05962b2c9ea97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< T, math::Vec4< T > >::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01math_1_1Vec2_3_01T_01_4_00_01math_1_1Vec2_3_01T_01_4_01_4.html#a726ca809ffd3d67ab4b8476646f26635a97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< math::Vec2< T >, math::Vec2< T > >::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01math_1_1Vec3_3_01T_01_4_00_01math_1_1Vec3_3_01T_01_4_01_4.html#a0411cd49bb5b71852cecd93bcbf0ca2da97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< math::Vec3< T >, math::Vec3< T > >::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01math_1_1Vec4_3_01T_01_4_00_01math_1_1Vec4_3_01T_01_4_01_4.html#abed82baf7f470b522273a3e37c24c600a97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< math::Vec4< T >, math::Vec4< T > >::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T0_00_01math_1_1Vec2_3_01T1_01_4_01_4.html#ab04a0655cd1e3bcac5e8f48c18df1a57a97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< T0, math::Vec2< T1 > >::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T0_00_01math_1_1Vec3_3_01T1_01_4_01_4.html#a385c44f6fb256e5716a2302a5b940388a97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< T0, math::Vec3< T1 > >::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T0_00_01math_1_1Vec4_3_01T1_01_4_01_4.html#abc5c98fcc1211af2b80116dd6e0a035da97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< T0, math::Vec4< T1 > >::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01PointIndex32_00_01PointDataIndex32_01_4.html#ac36f475ca5b446f4fde4c9b90bec77c8a97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< PointIndex32, PointDataIndex32 >::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01PointDataIndex32_00_01PointIndex32_01_4.html#a05589fbab0657f08285ebdfe93f5ec9ea97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< PointDataIndex32, PointIndex32 >::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T_00_01ValueMask_01_4.html#a16af7b253440dadd46a80a4b9fddba4da97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< T, ValueMask >::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01ValueMask_00_01T_01_4.html#aba01db17f4a2bfbc3db60dc172972a25a97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< ValueMask, T >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_linear::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01AffineMap_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_linear< AffineMap >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01ScaleMap_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_linear< ScaleMap >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01UniformScaleMap_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_linear< UniformScaleMap >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01UnitaryMap_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_linear< UnitaryMap >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01TranslationMap_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_linear< TranslationMap >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01ScaleTranslateMap_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_linear< ScaleTranslateMap >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01UniformScaleTranslateMap_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_linear< UniformScaleTranslateMap >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01CompoundMap_3_01T1_00_01T2_01_4_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_linear< CompoundMap< T1, T2 > >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__uniform__scale.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_uniform_scale::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__uniform__scale_3_01UniformScaleMap_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_uniform_scale< UniformScaleMap >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__uniform__scale__translate.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_uniform_scale_translate::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__uniform__scale__translate_3_01TranslationMap_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_uniform_scale_translate< TranslationMap >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__uniform__scale__translate_3_01UniformScaleTranslateMap_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_uniform_scale_translate< UniformScaleTranslateMap >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__scale.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_scale::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__scale_3_01ScaleMap_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_scale< ScaleMap >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__scale__translate.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_scale_translate::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__scale__translate_3_01ScaleTranslateMap_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_scale_translate< ScaleTranslateMap >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__uniform__diagonal__jacobian.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_uniform_diagonal_jacobian::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__diagonal__jacobian.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_diagonal_jacobian::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__vec3d.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_vec3d::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__vec3d_3_01Vec3d_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_vec3d< Vec3d >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__double.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_double::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__double_3_01double_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_double< double >::value()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameLeafConfig_3_01Dim1_00_01openvdb_1_1tools_1_1PointIndex81825ed065985d5c1a4f0ecf51aab07a.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::tree::SameLeafConfig< Dim1, openvdb::tools::PointIndexLeafNode< T2, Dim1 > >::value()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1SameConfiguration.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::tree::InternalNode::SameConfiguration::value()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameInternalConfig.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::tree::SameInternalConfig::value()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameInternalConfig_3_01ChildT1_00_01Dim1_00_01InternalNode_3_01ChildT2_00_01Dim1_01_4_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::tree::SameInternalConfig< ChildT1, Dim1, InternalNode< ChildT2, Dim1 > >::value()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1SameConfiguration.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::tree::LeafNode::SameConfiguration::value()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameLeafConfig.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::tree::SameLeafConfig::value()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameLeafConfig_3_01Dim1_00_01LeafNode_3_01T2_00_01Dim1_01_4_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::tree::SameLeafConfig< Dim1, LeafNode< T2, Dim1 > >::value()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1SameConfiguration.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::SameConfiguration::value()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1SameConfiguration.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::SameConfiguration::value()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01false_00_01ValueT_00_01ChildT_01_4.html#a0bd8e8b76a16eb8c0d32d42313755c8e',1,'openvdb::v3_2_0::tree::NodeUnionImpl< false, ValueT, ChildT >::value()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01true_00_01ValueT_00_01ChildT_01_4.html#a3ca69d875de534c2e6495bce613700c1',1,'openvdb::v3_2_0::tree::NodeUnionImpl< true, ValueT, ChildT >::value()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1RootNode_1_1SameConfiguration.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::tree::RootNode::SameConfiguration::value()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameRootConfig.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::tree::SameRootConfig::value()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameRootConfig_3_01ChildT1_00_01RootNode_3_01ChildT2_01_4_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::tree::SameRootConfig< ChildT1, RootNode< ChildT2 > >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Tolerance.html#a0d4a3589a46d330e57d90da61dcf2510',1,'openvdb::v3_2_0::math::Tolerance::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Tolerance_3_01float_01_4.html#ad01a58509108920977f839f36046aa79',1,'openvdb::v3_2_0::math::Tolerance< float >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Tolerance_3_01double_01_4.html#a2054729453134a4eb594b51a6d9bb7ba',1,'openvdb::v3_2_0::math::Tolerance< double >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Delta.html#a0d4a3589a46d330e57d90da61dcf2510',1,'openvdb::v3_2_0::math::Delta::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Delta_3_01float_01_4.html#ad01a58509108920977f839f36046aa79',1,'openvdb::v3_2_0::math::Delta< float >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Delta_3_01double_01_4.html#a2054729453134a4eb594b51a6d9bb7ba',1,'openvdb::v3_2_0::math::Delta< double >::value()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#ab49416ba38b750a3ac3a320185f5224f',1,'openvdb::v3_2_0::TypedMetadata::value()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a20f4a96fd8932e0b4d89c65f95991bc9',1,'openvdb::v3_2_0::TypedMetadata::value() const ']]], + ['value_5ftype',['value_type',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#a265a253612b46abed17c61b0a5e5ce30',1,'openvdb::v3_2_0::math::Mat::value_type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a265a253612b46abed17c61b0a5e5ce30',1,'openvdb::v3_2_0::math::Mat3::value_type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a265a253612b46abed17c61b0a5e5ce30',1,'openvdb::v3_2_0::math::Mat4::value_type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#a265a253612b46abed17c61b0a5e5ce30',1,'openvdb::v3_2_0::math::Tuple::value_type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a265a253612b46abed17c61b0a5e5ce30',1,'openvdb::v3_2_0::math::Vec2::value_type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a265a253612b46abed17c61b0a5e5ce30',1,'openvdb::v3_2_0::math::Vec3::value_type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a265a253612b46abed17c61b0a5e5ce30',1,'openvdb::v3_2_0::math::Vec4::value_type()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#afb2098030697daa35ca2c6106c6467ed',1,'openvdb::v3_2_0::tree::NodeList::value_type()']]], + ['valueaccessor',['ValueAccessor',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor',['ValueAccessor',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a116ce48fb2f8350d31950944c3ff6ead',1,'openvdb::v3_2_0::tree::ValueAccessor::ValueAccessor(TreeType &tree)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#aebc7997cdda9421399e1075894bb5d38',1,'openvdb::v3_2_0::tree::ValueAccessor::ValueAccessor(const ValueAccessor &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_010_00_01tbb_1_1null__mutex_01_4.html#a116ce48fb2f8350d31950944c3ff6ead',1,'openvdb::v3_2_0::tree::ValueAccessor< TreeType, IsSafe, 0, tbb::null_mutex >::ValueAccessor(TreeType &tree)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_010_00_01tbb_1_1null__mutex_01_4.html#aebc7997cdda9421399e1075894bb5d38',1,'openvdb::v3_2_0::tree::ValueAccessor< TreeType, IsSafe, 0, tbb::null_mutex >::ValueAccessor(const ValueAccessor &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_011_00_01tbb_1_1null__mutex_01_4.html#a116ce48fb2f8350d31950944c3ff6ead',1,'openvdb::v3_2_0::tree::ValueAccessor< TreeType, IsSafe, 1, tbb::null_mutex >::ValueAccessor(TreeType &tree)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_011_00_01tbb_1_1null__mutex_01_4.html#aebc7997cdda9421399e1075894bb5d38',1,'openvdb::v3_2_0::tree::ValueAccessor< TreeType, IsSafe, 1, tbb::null_mutex >::ValueAccessor(const ValueAccessor &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_012_00_01tbb_1_1null__mutex_01_4.html#a116ce48fb2f8350d31950944c3ff6ead',1,'openvdb::v3_2_0::tree::ValueAccessor< TreeType, IsSafe, 2, tbb::null_mutex >::ValueAccessor(TreeType &tree)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_012_00_01tbb_1_1null__mutex_01_4.html#aebc7997cdda9421399e1075894bb5d38',1,'openvdb::v3_2_0::tree::ValueAccessor< TreeType, IsSafe, 2, tbb::null_mutex >::ValueAccessor(const ValueAccessor &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_013_00_01tbb_1_1null__mutex_01_4.html#a116ce48fb2f8350d31950944c3ff6ead',1,'openvdb::v3_2_0::tree::ValueAccessor< TreeType, IsSafe, 3, tbb::null_mutex >::ValueAccessor(TreeType &tree)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_013_00_01tbb_1_1null__mutex_01_4.html#aebc7997cdda9421399e1075894bb5d38',1,'openvdb::v3_2_0::tree::ValueAccessor< TreeType, IsSafe, 3, tbb::null_mutex >::ValueAccessor(const ValueAccessor &other)']]], + ['valueaccessor_2eh',['ValueAccessor.h',['../ValueAccessor_8h.html',1,'']]], + ['valueaccessor0',['ValueAccessor0',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor0',['ValueAccessor0',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a8782c66fa07403a3e44ad67cea8feb2f',1,'openvdb::v3_2_0::tree::ValueAccessor0::ValueAccessor0(TreeType &tree)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a21f67fb1a0dac36e48ec3e44f8156c15',1,'openvdb::v3_2_0::tree::ValueAccessor0::ValueAccessor0(const ValueAccessor0 &other)']]], + ['valueaccessor0_3c_20treetype_2c_20issafe_20_3e',['ValueAccessor0< TreeType, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor1',['ValueAccessor1',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor1',['ValueAccessor1',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a3e327a85ecdd80fc7af1bcd97e30ea98',1,'openvdb::v3_2_0::tree::ValueAccessor1::ValueAccessor1(TreeType &tree)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a7b8f335eac198547a58461c60b5f098b',1,'openvdb::v3_2_0::tree::ValueAccessor1::ValueAccessor1(const ValueAccessor1 &other)']]], + ['valueaccessor1_3c_20treetype_2c_20issafe_20_3e',['ValueAccessor1< TreeType, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor2',['ValueAccessor2',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor2',['ValueAccessor2',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a9fa490a3bd89ffe85f09b5a254107018',1,'openvdb::v3_2_0::tree::ValueAccessor2::ValueAccessor2(TreeType &tree)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a53df26beeb3906c4e093770a9bace8f0',1,'openvdb::v3_2_0::tree::ValueAccessor2::ValueAccessor2(const ValueAccessor2 &other)']]], + ['valueaccessor2_3c_20treetype_2c_20issafe_20_3e',['ValueAccessor2< TreeType, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor3',['ValueAccessor3',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor3',['ValueAccessor3',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#abb84c834d627a3f75e041ce11c2a2de7',1,'openvdb::v3_2_0::tree::ValueAccessor3::ValueAccessor3(TreeType &tree)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a049125ff6087e0d923e64d41af716038',1,'openvdb::v3_2_0::tree::ValueAccessor3::ValueAccessor3(const ValueAccessor3 &other)']]], + ['valueaccessor3_3c_20treetype_2c_20issafe_20_3e',['ValueAccessor3< TreeType, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20booltreetype_20_3e',['ValueAccessor< BoolTreeType >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20const_20booltreet_20_3e',['ValueAccessor< const BoolTreeT >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20const_20inputtreetype_20_3e',['ValueAccessor< const InputTreeType >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20const_20int16treet_20_3e',['ValueAccessor< const Int16TreeT >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20const_20inttreet_20_3e',['ValueAccessor< const IntTreeT >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20const_20treet_20_3e',['ValueAccessor< const TreeT >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20const_20treet_2c_20false_20_3e',['ValueAccessor< const TreeT, false >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20const_20treetype_20_3e',['ValueAccessor< const TreeType >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20const_20treetype_2c_20issafe_20_3e',['ValueAccessor< const TreeType, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20int16treet_20_3e',['ValueAccessor< Int16TreeT >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20int32treetype_20_3e',['ValueAccessor< Int32TreeType >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20inttreet_20_3e',['ValueAccessor< IntTreeT >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20treet_20_3e',['ValueAccessor< TreeT >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20treetype_20_3e',['ValueAccessor< TreeType >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20treetype_2c_20issafe_2c_200_2c_20tbb_3a_3anull_5fmutex_20_3e',['ValueAccessor< TreeType, IsSafe, 0, tbb::null_mutex >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_010_00_01tbb_1_1null__mutex_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20treetype_2c_20issafe_2c_201_2c_20tbb_3a_3anull_5fmutex_20_3e',['ValueAccessor< TreeType, IsSafe, 1, tbb::null_mutex >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_011_00_01tbb_1_1null__mutex_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20treetype_2c_20issafe_2c_202_2c_20tbb_3a_3anull_5fmutex_20_3e',['ValueAccessor< TreeType, IsSafe, 2, tbb::null_mutex >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_012_00_01tbb_1_1null__mutex_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20treetype_2c_20issafe_2c_203_2c_20tbb_3a_3anull_5fmutex_20_3e',['ValueAccessor< TreeType, IsSafe, 3, tbb::null_mutex >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_013_00_01tbb_1_1null__mutex_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20treetype_2c_20issafe_2c_20treetype_3a_3adepth_2d1_2c_20tbb_3a_3aspin_5fmutex_20_3e',['ValueAccessor< TreeType, IsSafe, TreeType::DEPTH-1, tbb::spin_mutex >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20uchartreetype_20_3e',['ValueAccessor< UCharTreeType >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase',['ValueAccessorBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase',['ValueAccessorBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html#a6b76e06e2b45f60501ab02c1ad771df0',1,'openvdb::v3_2_0::tree::ValueAccessorBase::ValueAccessorBase(TreeType &tree)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html#a356f19169f7ac91f39136cfa11f21dcb',1,'openvdb::v3_2_0::tree::ValueAccessorBase::ValueAccessorBase(const ValueAccessorBase &other)']]], + ['valueaccessorbase_3c_20_5ftreetype_2c_20issafe_20_3e',['ValueAccessorBase< _TreeType, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20booltreetype_2c_20true_20_3e',['ValueAccessorBase< BoolTreeType, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20const_20booltreet_2c_20true_20_3e',['ValueAccessorBase< const BoolTreeT, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20const_20inputtreetype_2c_20true_20_3e',['ValueAccessorBase< const InputTreeType, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20const_20int16treet_2c_20true_20_3e',['ValueAccessorBase< const Int16TreeT, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20const_20inttreet_2c_20true_20_3e',['ValueAccessorBase< const IntTreeT, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20const_20treet_2c_20issafe_20_3e',['ValueAccessorBase< const TreeT, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20const_20treet_2c_20true_20_3e',['ValueAccessorBase< const TreeT, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20const_20treetype_2c_20issafe_20_3e',['ValueAccessorBase< const TreeType, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20const_20treetype_2c_20true_20_3e',['ValueAccessorBase< const TreeType, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20int16treet_2c_20true_20_3e',['ValueAccessorBase< Int16TreeT, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20int32treetype_2c_20true_20_3e',['ValueAccessorBase< Int32TreeType, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20inttreet_2c_20true_20_3e',['ValueAccessorBase< IntTreeT, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20treet_2c_20true_20_3e',['ValueAccessorBase< TreeT, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20treetype_2c_20true_20_3e',['ValueAccessorBase< TreeType, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20uchartreetype_2c_20true_20_3e',['ValueAccessorBase< UCharTreeType, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorrw',['ValueAccessorRW',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorRW.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorrw',['ValueAccessorRW',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorRW.html#af48337af913df417075b5ed0bb363bba',1,'openvdb::v3_2_0::tree::ValueAccessorRW']]], + ['valueall',['ValueAll',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueAll.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['valueall',['ValueAll',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ValueAll.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['valueall',['ValueAll',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a1a3035d659c23eeef5dfc6f292494092',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['valueallciter',['ValueAllCIter',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a3a22cbf2e0fe6e1aac15cb543ec5861a',1,'openvdb::v3_2_0::Grid::ValueAllCIter()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#aa930cf76a10403ec7d29d255df3f18fe',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ValueAllCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a6dac9485b31ee5a376bb0d93400f76b5',1,'openvdb::v3_2_0::tree::InternalNode::ValueAllCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a197f0603cecd47cb739e02f404ba4233',1,'openvdb::v3_2_0::tree::LeafNode::ValueAllCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a24d322eccc7dbfd07d2afaa03fcb7e7b',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueAllCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a24d322eccc7dbfd07d2afaa03fcb7e7b',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueAllCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ad2bd1bc2dfbeb43c37726f8d54cb9030',1,'openvdb::v3_2_0::tree::RootNode::ValueAllCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#afe596029b18684d42d21c42dff113ca9',1,'openvdb::v3_2_0::tree::Tree::ValueAllCIter()']]], + ['valuealliter',['ValueAllIter',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a7881ea5e6b8538a65a17ef8d0abc3d78',1,'openvdb::v3_2_0::Grid::ValueAllIter()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#abeb5b7e57c5e5db6bdb7a6a2c735cc44',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ValueAllIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a8e6040589f2734f53a8f3bd1634612fb',1,'openvdb::v3_2_0::tree::InternalNode::ValueAllIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a01b73276836d0b1a675d5b134babfbb6',1,'openvdb::v3_2_0::tree::LeafNode::ValueAllIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a3da6c03d2c047f4d977eef25041deeb9',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueAllIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a3da6c03d2c047f4d977eef25041deeb9',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueAllIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#adbfc1fbd1786a5ee06d7e9609353947e',1,'openvdb::v3_2_0::tree::RootNode::ValueAllIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a3679e9e0ab166205346c3aee0f853108',1,'openvdb::v3_2_0::tree::Tree::ValueAllIter()']]], + ['valuebuffer',['ValueBuffer',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ValueBuffer.html',1,'openvdb::v3_2_0::util::PagedArray']]], + ['valuebuffer',['ValueBuffer',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#afc867e0705ff7ee57a5a4be9bb466aa8',1,'openvdb::v3_2_0::util::PagedArray::ValueBuffer()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ValueBuffer.html#ae5445065c4024c92b6447a58fd1924c7',1,'openvdb::v3_2_0::util::PagedArray::ValueBuffer::ValueBuffer(PagedArray &parent)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ValueBuffer.html#abde8e2defcb4060f05fe66fdfdcbf5a4',1,'openvdb::v3_2_0::util::PagedArray::ValueBuffer::ValueBuffer(const ValueBuffer &other)']]], + ['valueconverter',['ValueConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree_1_1ValueConverter.html',1,'openvdb::v3_2_0::tree::Tree']]], + ['valueconverter',['ValueConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueConverter.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['valueconverter',['ValueConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ValueConverter.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['valueconverter',['ValueConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ValueConverter.html',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >']]], + ['valueconverter',['ValueConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ValueConverter.html',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >']]], + ['valueconverter',['ValueConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1RootNode_1_1ValueConverter.html',1,'openvdb::v3_2_0::tree::RootNode']]], + ['valueconverter',['ValueConverter',['../structopenvdb_1_1v3__2__0_1_1Grid_1_1ValueConverter.html',1,'openvdb::v3_2_0::Grid']]], + ['valueconverter_3c_20int32_20_3e',['ValueConverter< Int32 >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree_1_1ValueConverter.html',1,'openvdb::v3_2_0::tree::Tree']]], + ['valuecount',['valueCount',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#ad77d26da96fa8952ea726f1c3ec45f75',1,'openvdb::v3_2_0::tools::Dense::valueCount()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Diagnose.html#ad77d26da96fa8952ea726f1c3ec45f75',1,'openvdb::v3_2_0::tools::Diagnose::valueCount()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#ad77d26da96fa8952ea726f1c3ec45f75',1,'openvdb::v3_2_0::tools::CheckLevelSet::valueCount()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#ad77d26da96fa8952ea726f1c3ec45f75',1,'openvdb::v3_2_0::tools::CheckFogVolume::valueCount()']]], + ['valueerror',['ValueError',['../classopenvdb_1_1v3__2__0_1_1ValueError.html#ad73901f9e28f03f78223924c6db23e92',1,'openvdb::v3_2_0::ValueError::ValueError()'],['../classopenvdb_1_1v3__2__0_1_1ValueError.html#a4b55707136361d9fb6ae120801285b26',1,'openvdb::v3_2_0::ValueError::ValueError(const std::string &msg)']]], + ['valueerror',['ValueError',['../classopenvdb_1_1v3__2__0_1_1ValueError.html',1,'openvdb::v3_2_0']]], + ['valueiter',['ValueIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueIter.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['valueiter',['ValueIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ValueIter.html#ac32fdb47bf9c1af4d331ac790261bf18',1,'openvdb::v3_2_0::tree::InternalNode::ValueIter::ValueIter()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ValueIter.html#a7615241b824041990e563ff99340db71',1,'openvdb::v3_2_0::tree::InternalNode::ValueIter::ValueIter(const MaskIterT &iter, NodeT *parent)'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueIter.html#ac32fdb47bf9c1af4d331ac790261bf18',1,'openvdb::v3_2_0::tree::LeafNode::ValueIter::ValueIter()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueIter.html#a7615241b824041990e563ff99340db71',1,'openvdb::v3_2_0::tree::LeafNode::ValueIter::ValueIter(const MaskIterT &iter, NodeT *parent)'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ValueIter.html#ac32fdb47bf9c1af4d331ac790261bf18',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter::ValueIter()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ValueIter.html#a7615241b824041990e563ff99340db71',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter::ValueIter(const MaskIterT &iter, NodeT *parent)'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ValueIter.html#ac32fdb47bf9c1af4d331ac790261bf18',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter::ValueIter()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ValueIter.html#a7615241b824041990e563ff99340db71',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter::ValueIter(const MaskIterT &iter, NodeT *parent)']]], + ['valueiter',['ValueIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ValueIter.html',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >']]], + ['valueiter',['ValueIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ValueIter.html',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >']]], + ['valueiter',['ValueIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ValueIter.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['valueiter_3c_20maskdenseiter_2c_20const_20leafnode_2c_20bool_20_3e',['ValueIter< MaskDenseIter, const LeafNode, bool >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#abeedbac6cafa33bd7112a35970c29769',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter< MaskDenseIter, const LeafNode, bool >()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#abeedbac6cafa33bd7112a35970c29769',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter< MaskDenseIter, const LeafNode, bool >()']]], + ['valueiter_3c_20maskdenseiter_2c_20leafnode_2c_20bool_20_3e',['ValueIter< MaskDenseIter, LeafNode, bool >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a24c54047ff064fab82a33f2c5452ee06',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter< MaskDenseIter, LeafNode, bool >()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a24c54047ff064fab82a33f2c5452ee06',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter< MaskDenseIter, LeafNode, bool >()']]], + ['valueiter_3c_20maskdenseiterator_2c_20const_20leafnode_2c_20valuetype_2c_20valueall_20_3e',['ValueIter< MaskDenseIterator, const LeafNode, ValueType, ValueAll >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ac89fb3a89a9e294a52ab9b7feb8dae50',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['valueiter_3c_20maskdenseiterator_2c_20leafnode_2c_20valuetype_2c_20valueall_20_3e',['ValueIter< MaskDenseIterator, LeafNode, ValueType, ValueAll >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a3675046a1176b83ebe4ebb111da91165',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['valueiter_3c_20maskoffiter_2c_20const_20leafnode_2c_20bool_20_3e',['ValueIter< MaskOffIter, const LeafNode, bool >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aab86b327edf42ea2bcda6a47778dccbd',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter< MaskOffIter, const LeafNode, bool >()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aab86b327edf42ea2bcda6a47778dccbd',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter< MaskOffIter, const LeafNode, bool >()']]], + ['valueiter_3c_20maskoffiter_2c_20leafnode_2c_20bool_20_3e',['ValueIter< MaskOffIter, LeafNode, bool >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a65235074ade0fc7aee1ef3b78f8b77ca',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter< MaskOffIter, LeafNode, bool >()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a65235074ade0fc7aee1ef3b78f8b77ca',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter< MaskOffIter, LeafNode, bool >()']]], + ['valueiter_3c_20maskoffiterator_2c_20const_20leafnode_2c_20valuetype_2c_20valueoff_20_3e',['ValueIter< MaskOffIterator, const LeafNode, ValueType, ValueOff >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aa2bab862e1ff531c17ef5fa66abc576c',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['valueiter_3c_20maskoffiterator_2c_20leafnode_2c_20valuetype_2c_20valueoff_20_3e',['ValueIter< MaskOffIterator, LeafNode, ValueType, ValueOff >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a694162e77b842f678df1a4de52d02734',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['valueiter_3c_20maskoniter_2c_20const_20leafnode_2c_20bool_20_3e',['ValueIter< MaskOnIter, const LeafNode, bool >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a97abb4c6d4b44b83678bffcb390bf9d7',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter< MaskOnIter, const LeafNode, bool >()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a97abb4c6d4b44b83678bffcb390bf9d7',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter< MaskOnIter, const LeafNode, bool >()']]], + ['valueiter_3c_20maskoniter_2c_20leafnode_2c_20bool_20_3e',['ValueIter< MaskOnIter, LeafNode, bool >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a2ae17205785ce515d39186f1d5199010',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter< MaskOnIter, LeafNode, bool >()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a2ae17205785ce515d39186f1d5199010',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter< MaskOnIter, LeafNode, bool >()']]], + ['valueiter_3c_20maskoniterator_2c_20const_20leafnode_2c_20valuetype_2c_20valueon_20_3e',['ValueIter< MaskOnIterator, const LeafNode, ValueType, ValueOn >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#afc19468f513d1a479b479321dff894f0',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['valueiter_3c_20maskoniterator_2c_20leafnode_2c_20valuetype_2c_20valueon_20_3e',['ValueIter< MaskOnIterator, LeafNode, ValueType, ValueOn >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ab26b5b4bba83d15af89c00d61fff384f',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['valueitert',['ValueIterT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a00ff291e80d0936f783a186595fedb98',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase']]], + ['valuemask',['ValueMask',['../classopenvdb_1_1v3__2__0_1_1ValueMask.html',1,'openvdb::v3_2_0']]], + ['valuemask',['valueMask',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a7f0ba50e7615b08b2238d9f94b7cd721',1,'openvdb::v3_2_0::tree::LeafNode::valueMask()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a7f0ba50e7615b08b2238d9f94b7cd721',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::valueMask()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a7f0ba50e7615b08b2238d9f94b7cd721',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::valueMask()']]], + ['valueoff',['ValueOff',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueOff.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['valueoff',['ValueOff',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ValueOff.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['valueoff',['ValueOff',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a2f93046fbb557896a03650d2bb92bccb',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['valueoffciter',['ValueOffCIter',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a40701e2eb5580bf0d33d647fed69bb9d',1,'openvdb::v3_2_0::Grid::ValueOffCIter()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ac84455be93367d898f23e04242bd9f87',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ValueOffCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a04521fbe98279d68f903d390ab43f791',1,'openvdb::v3_2_0::tree::InternalNode::ValueOffCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a6bf11b46ff23b7a56b02874518030f65',1,'openvdb::v3_2_0::tree::LeafNode::ValueOffCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a49dde1dd5ab68b8a10cf377f6b1d9207',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueOffCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a49dde1dd5ab68b8a10cf377f6b1d9207',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueOffCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a64f8fae8bedbde7096fd6cf44bab2912',1,'openvdb::v3_2_0::tree::RootNode::ValueOffCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a54d53e169bfd6750a72f58010ce3a1f3',1,'openvdb::v3_2_0::tree::Tree::ValueOffCIter()']]], + ['valueoffiter',['ValueOffIter',['../classopenvdb_1_1v3__2__0_1_1Grid.html#aa3bfddcea0ca11dc312deb2d9b008111',1,'openvdb::v3_2_0::Grid::ValueOffIter()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a3c7d03a6a73269e3ecb112d9d29cb66c',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ValueOffIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#add0b730188f16f2a2bb136021fb9fa83',1,'openvdb::v3_2_0::tree::InternalNode::ValueOffIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a74ce6f148e56b87669aae7020d44c628',1,'openvdb::v3_2_0::tree::LeafNode::ValueOffIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ac42f064bad772fd05ffaad3896dd2460',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueOffIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ac42f064bad772fd05ffaad3896dd2460',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueOffIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ae801b56a803db51bf352c0e4037cb3b8',1,'openvdb::v3_2_0::tree::RootNode::ValueOffIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a327373295f10d7d43867f8f0107e5b7a',1,'openvdb::v3_2_0::tree::Tree::ValueOffIter()']]], + ['valueon',['ValueOn',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ValueOn.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['valueon',['ValueOn',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueOn.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['valueon',['ValueOn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a1266bc26608220282bcaad99c9964219',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['valueonciter',['ValueOnCIter',['../classopenvdb_1_1v3__2__0_1_1Grid.html#af73f7039c425b2517eb1772881d83ad4',1,'openvdb::v3_2_0::Grid::ValueOnCIter()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a3f64aa587bf9877f513726f2e253864e',1,'openvdb::v3_2_0::tools::MultiResGrid::ValueOnCIter()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a5feb26b7e51126fd9ac9351dc1555ecf',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ValueOnCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aa43c2083ef97b5e3f5044d6775a219fd',1,'openvdb::v3_2_0::tree::InternalNode::ValueOnCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a9a340941968357f08a190704f55ea38a',1,'openvdb::v3_2_0::tree::LeafNode::ValueOnCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#af6dc0739fa46d8e16116a698acdad6f5',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueOnCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#af6dc0739fa46d8e16116a698acdad6f5',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueOnCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#abfe6ed07bf810c06dfd8d15a9fc98e0a',1,'openvdb::v3_2_0::tree::RootNode::ValueOnCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a867ccecd35cba81c357f2a2b19710d3c',1,'openvdb::v3_2_0::tree::Tree::ValueOnCIter()']]], + ['valueoniter',['ValueOnIter',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a489aa6fa35d5ee2842072babf80c7f0c',1,'openvdb::v3_2_0::Grid::ValueOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a4504541b6669543b453079e5e9a30a8e',1,'openvdb::v3_2_0::tools::MultiResGrid::ValueOnIter()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a45e33d71316ed355765214c726cd2bd1',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ValueOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a896c235dcf22ae2dc1380c5fcf83610e',1,'openvdb::v3_2_0::tree::InternalNode::ValueOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#abc30a210cae685c0eab30eccf68ca8fe',1,'openvdb::v3_2_0::tree::LeafNode::ValueOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#abf84d9a2067a5234c332f70425c1430e',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#abf84d9a2067a5234c332f70425c1430e',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a77220d34c323bf6823b0dfb344b3b929',1,'openvdb::v3_2_0::tree::RootNode::ValueOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a2bc8a326316be76b916b32302506f427',1,'openvdb::v3_2_0::tree::Tree::ValueOnIter()']]], + ['valuet',['ValueT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeBackgroundOp.html#a86c9921e32bad03c7072d67d87576ed2',1,'openvdb::v3_2_0::tools::ChangeBackgroundOp::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeLevelSetBackgroundOp.html#a86c9921e32bad03c7072d67d87576ed2',1,'openvdb::v3_2_0::tools::ChangeLevelSetBackgroundOp::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1MaskInteriorVoxels.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::clip_internal::MaskInteriorVoxels::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CsgVisitorBase.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::CsgVisitorBase::ValueT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgUnionVisitor.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::CsgUnionVisitor::ValueT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgIntersectVisitor.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::CsgIntersectVisitor::ValueT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgDiffVisitor.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::CsgDiffVisitor::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyToDense.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::CopyToDense::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyFromDense.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::CopyFromDense::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseTransformer.html#a7a7651c713cdafbbfff498b2368058d5',1,'openvdb::v3_2_0::tools::DenseTransformer::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TileSampler.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::internal::TileSampler::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetSphere.html#ad71604ad8f1601cf353e9802c729c620',1,'openvdb::v3_2_0::tools::LevelSetSphere::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1activation_1_1ActivationOp.html#aafbf33dd701a39e4d364970973de358f',1,'openvdb::v3_2_0::tools::activation::ActivationOp::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid.html#ad71604ad8f1601cf353e9802c729c620',1,'openvdb::v3_2_0::tools::PointMaskGrid::ValueT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1ISLaplacianOp.html#a7094bb06e8d868718178ef88654a7ddb',1,'openvdb::v3_2_0::tools::poisson::internal::ISLaplacianOp::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1InactivePruneOp.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::InactivePruneOp::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1TolerancePruneOp.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::TolerancePruneOp::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetPruneOp.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::LevelSetPruneOp::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#ad71604ad8f1601cf353e9802c729c620',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#ad71604ad8f1601cf353e9802c729c620',1,'openvdb::v3_2_0::tools::LinearSearchImpl::ValueT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#a61b6c8d2f9f6079011d098b1506a4dc0',1,'openvdb::v3_2_0::tools::Film::RGBA::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SignedFloodFillOp.html#a86c9921e32bad03c7072d67d87576ed2',1,'openvdb::v3_2_0::tools::SignedFloodFillOp::ValueT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1GetVal.html#a96d6195383e4f5c37b9e543154b757d6',1,'openvdb::v3_2_0::tools::stats_internal::GetVal::ValueT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1MathOp.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::stats_internal::MathOp::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::internal::SignData::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTileMask.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::internal::GenTileMask::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#ab7f035a548f0da8691e2980969090e49',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::ValueT()']]], + ['valuetransformer_2eh',['ValueTransformer.h',['../ValueTransformer_8h.html',1,'']]], + ['valuetype',['ValueType',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a419a5559efe3c2c66addff643dfb4aa7',1,'openvdb::v3_2_0::Grid::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::TreeAdapter::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#ace14d133cbf9aa4792a3b82aa6ba6295',1,'openvdb::v3_2_0::math::BBox::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a215e2850ed819f54851fa725fdc8842c',1,'openvdb::v3_2_0::math::pcg::Vector::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a2bf6f4ff7ad07785ab4a1a2764f3dd34',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Preconditioner.html#a215e2850ed819f54851fa725fdc8842c',1,'openvdb::v3_2_0::math::pcg::Preconditioner::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1JacobiPreconditioner.html#abdf2f0abdf31f81ccc64246c16fbe79e',1,'openvdb::v3_2_0::math::pcg::JacobiPreconditioner::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#abdf2f0abdf31f81ccc64246c16fbe79e',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a4d2295cf7165a5b398ac6522b4bbe059',1,'openvdb::v3_2_0::math::Coord::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a15d8c3c12c49d057ea4385ce935d9427',1,'openvdb::v3_2_0::math::CoordBBox::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#a215e2850ed819f54851fa725fdc8842c',1,'openvdb::v3_2_0::math::Mat::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a215e2850ed819f54851fa725fdc8842c',1,'openvdb::v3_2_0::math::Mat3::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a215e2850ed819f54851fa725fdc8842c',1,'openvdb::v3_2_0::math::Mat4::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Rand01.html#a566d154ee322e052476004d84e8a4e3c',1,'openvdb::v3_2_0::math::Rand01::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1ReturnValue.html#a375ca53bc5425c4c5ebf2855b22d0c1e',1,'openvdb::v3_2_0::math::internal::ReturnValue::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a736336446db9fff9182de2a0232a662e',1,'openvdb::v3_2_0::math::BaseStencil::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SevenPointStencil.html#a736336446db9fff9182de2a0232a662e',1,'openvdb::v3_2_0::math::SevenPointStencil::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BoxStencil.html#a736336446db9fff9182de2a0232a662e',1,'openvdb::v3_2_0::math::BoxStencil::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SecondOrderDenseStencil.html#ab5388e403c00c365cf358a85af632fe5',1,'openvdb::v3_2_0::math::SecondOrderDenseStencil::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ThirteenPointStencil.html#ab5388e403c00c365cf358a85af632fe5',1,'openvdb::v3_2_0::math::ThirteenPointStencil::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1FourthOrderDenseStencil.html#ab5388e403c00c365cf358a85af632fe5',1,'openvdb::v3_2_0::math::FourthOrderDenseStencil::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NineteenPointStencil.html#ab5388e403c00c365cf358a85af632fe5',1,'openvdb::v3_2_0::math::NineteenPointStencil::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SixthOrderDenseStencil.html#ab5388e403c00c365cf358a85af632fe5',1,'openvdb::v3_2_0::math::SixthOrderDenseStencil::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#ab5388e403c00c365cf358a85af632fe5',1,'openvdb::v3_2_0::math::GradStencil::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html#ab5388e403c00c365cf358a85af632fe5',1,'openvdb::v3_2_0::math::WenoStencil::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CurvatureStencil.html#a736336446db9fff9182de2a0232a662e',1,'openvdb::v3_2_0::math::CurvatureStencil::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DenseStencil.html#ab5388e403c00c365cf358a85af632fe5',1,'openvdb::v3_2_0::math::DenseStencil::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#a215e2850ed819f54851fa725fdc8842c',1,'openvdb::v3_2_0::math::Tuple::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a215e2850ed819f54851fa725fdc8842c',1,'openvdb::v3_2_0::math::Vec2::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a215e2850ed819f54851fa725fdc8842c',1,'openvdb::v3_2_0::math::Vec3::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a215e2850ed819f54851fa725fdc8842c',1,'openvdb::v3_2_0::math::Vec4::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildPrimarySegment.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::composite::BuildPrimarySegment::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildSecondarySegment.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::composite::BuildSecondarySegment::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a10b843fba2f32761b707fafe0d9ce802',1,'openvdb::v3_2_0::tools::Dense::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1DSConverter.html#a4bde5a01ad278ac06936f18c27505407',1,'openvdb::v3_2_0::tools::DSConverter::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#a736336446db9fff9182de2a0232a662e',1,'openvdb::v3_2_0::tools::CheckNormGrad::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#a736336446db9fff9182de2a0232a662e',1,'openvdb::v3_2_0::tools::CheckEikonal::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#a736336446db9fff9182de2a0232a662e',1,'openvdb::v3_2_0::tools::CheckDivergence::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#ab5388e403c00c365cf358a85af632fe5',1,'openvdb::v3_2_0::tools::CheckLevelSet::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#ab5388e403c00c365cf358a85af632fe5',1,'openvdb::v3_2_0::tools::CheckFogVolume::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveVoxelValues.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveVoxelValues::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveTileValues.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveTileValues::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#ab5388e403c00c365cf358a85af632fe5',1,'openvdb::v3_2_0::tools::Filter::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#aa83b1b27d0de51e22462ccba9c414bb1',1,'openvdb::v3_2_0::tools::GridSampler::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html#a4e42b16f0b1f0cb9e95ef7201950956a',1,'openvdb::v3_2_0::tools::GridSampler< tree::ValueAccessor< TreeT >, SamplerType >::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler.html#a27802638e9fcaed29c7b31e83de6c4f5',1,'openvdb::v3_2_0::tools::DualGridSampler::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerT_01_4.html#a4e42b16f0b1f0cb9e95ef7201950956a',1,'openvdb::v3_2_0::tools::DualGridSampler< tree::ValueAccessor< TreeT >, SamplerT >::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#ac14b451d2da8b7fbf1e74c9645a489d9',1,'openvdb::v3_2_0::tools::LevelSetAdvection::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::LevelSetFilter::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__fracture__internal_1_1FindMinMaxVoxelValue.html#aa2a1b49e8c2a648bd403da8c5ba203a5',1,'openvdb::v3_2_0::tools::level_set_fracture_internal::FindMinMaxVoxelValue::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::LevelSetMeasure::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#ac14b451d2da8b7fbf1e74c9645a489d9',1,'openvdb::v3_2_0::tools::LevelSetMorphing::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::LevelSetTracker::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorVoxels.html#aa2a1b49e8c2a648bd403da8c5ba203a5',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorVoxels::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorTiles.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorTiles::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1PopulateTree.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::level_set_util_internal::PopulateTree::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1LabelBoundaryVoxels.html#aa2a1b49e8c2a648bd403da8c5ba203a5',1,'openvdb::v3_2_0::tools::level_set_util_internal::LabelBoundaryVoxels::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FlipRegionSign.html#aa2a1b49e8c2a648bd403da8c5ba203a5',1,'openvdb::v3_2_0::tools::level_set_util_internal::FlipRegionSign::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinVoxelValue.html#aa2a1b49e8c2a648bd403da8c5ba203a5',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinVoxelValue::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinTileValue.html#a501769e212c99c82d4c5e6b70c9c08b9',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinTileValue::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SDFVoxelsToFogVolume.html#aa2a1b49e8c2a648bd403da8c5ba203a5',1,'openvdb::v3_2_0::tools::level_set_util_internal::SDFVoxelsToFogVolume::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillMaskBoundary.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillMaskBoundary::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandLeafNodeRegion.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandLeafNodeRegion::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillLeafNodeVoxels.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillLeafNodeVoxels::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FloodFillSign.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::level_set_util_internal::FloodFillSign::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskedCopy.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskedCopy::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SweepExteriorSign.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SweepExteriorSign::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedFillExteriorSign.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedFillExteriorSign::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SyncVoxelMask.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SyncVoxelMask::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedPoints::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeIntersectingVoxelSign.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ComputeIntersectingVoxelSign::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ValidateIntersectingVoxels.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ValidateIntersectingVoxels::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RemoveSelfIntersectingSurface.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RemoveSelfIntersectingSurface::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1TransformValues.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::TransformValues::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1InactivateValues.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::InactivateValues::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1OffsetValues.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::OffsetValues::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1Renormalize.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::Renormalize::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1MinCombine.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::MinCombine::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::MultiResGrid::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::PointIndexIterator::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a215e2850ed819f54851fa725fdc8842c',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#ab5388e403c00c365cf358a85af632fe5',1,'openvdb::v3_2_0::tools::VolumeRender::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1IterTraits.html#a48fb29fd6c1a4372689b48b1859c62b0',1,'openvdb::v3_2_0::tools::stats_internal::IterTraits::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1IterTraits_3_01tree_1_1TreeValueIteratod0548f7bac16dff837855a3f29cfb162.html#af635c9d7fd08be6810f5e7fa306553dd',1,'openvdb::v3_2_0::tools::stats_internal::IterTraits< tree::TreeValueIteratorBase< TreeT, ValueIterT > >::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ttls__internal_1_1OffsetAndMinComp.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::ttls_internal::OffsetAndMinComp::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiscreteField.html#af1855eabba36af0df54613388dbd8ed2',1,'openvdb::v3_2_0::tools::DiscreteField::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1EnrightField.html#a9d76559dd01e51fca531fd88b0d5d059',1,'openvdb::v3_2_0::tools::EnrightField::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocitySampler.html#a736336446db9fff9182de2a0232a662e',1,'openvdb::v3_2_0::tools::VelocitySampler::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a63819828647f2e275fc72efd5f55e98c',1,'openvdb::v3_2_0::tree::InternalNode::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#a1d8a07008737fd50334d43dbf7a3068b',1,'openvdb::v3_2_0::tree::SparseIteratorBase::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a27a13f2b229fbfb5f53cdbb3445afefd',1,'openvdb::v3_2_0::tree::DenseIteratorBase::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a4e42b16f0b1f0cb9e95ef7201950956a',1,'openvdb::v3_2_0::tree::LeafManager::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a215e2850ed819f54851fa725fdc8842c',1,'openvdb::v3_2_0::tree::LeafNode::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#afeb45cf59c16bacc3d571844deeb903d',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#afeb45cf59c16bacc3d571844deeb903d',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#acafc83e4fc3a640a706a65d66513a9bc',1,'openvdb::v3_2_0::tree::RootNode::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#aae63ab459d30a49fbf775e55b20cd1df',1,'openvdb::v3_2_0::tree::Tree::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a4eff730ce1981799d1e9e809b30b1485',1,'openvdb::v3_2_0::tree::ValueAccessor::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a2c26d58dfd651265b44c5e946ad97f59',1,'openvdb::v3_2_0::tree::CacheItem::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#aae63ab459d30a49fbf775e55b20cd1df',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tree::ValueAccessor0::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tree::ValueAccessor1::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tree::ValueAccessor2::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tree::ValueAccessor3::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a10b843fba2f32761b707fafe0d9ce802',1,'openvdb::v3_2_0::util::PagedArray::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a01a396e41a8f7deb454d75523d7deea5',1,'openvdb::v3_2_0::GridBase::valueType()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a10c2f063ec40c9930da48d8d00bf9f9f',1,'openvdb::v3_2_0::Grid::valueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a01a396e41a8f7deb454d75523d7deea5',1,'openvdb::v3_2_0::tree::TreeBase::valueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a10c2f063ec40c9930da48d8d00bf9f9f',1,'openvdb::v3_2_0::tree::Tree::valueType()']]], + ['var',['var',['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#aa00da7f3d525461f6a1e6992f60c71f8',1,'openvdb::v3_2_0::math::Stats']]], + ['variance',['variance',['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#a8ca2b77cf0a83e10d4dab0f029c8e526',1,'openvdb::v3_2_0::math::Stats']]], + ['vec2',['Vec2',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html',1,'openvdb::v3_2_0::math']]], + ['vec2',['Vec2',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a1ab54d75ff36ed23a47e9229039c825d',1,'openvdb::v3_2_0::math::Vec2::Vec2()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a6d5f200d93b519fdac0ce6071e26bd68',1,'openvdb::v3_2_0::math::Vec2::Vec2(T val)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a154f25722c69f6247edf36c094f7890b',1,'openvdb::v3_2_0::math::Vec2::Vec2(T x, T y)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a59caa1ec77ca9cd3be1ac1c67876d304',1,'openvdb::v3_2_0::math::Vec2::Vec2(Source *a)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ab6a86d1cf954bf78d4c0ce869a8f3840',1,'openvdb::v3_2_0::math::Vec2::Vec2(const Tuple< 2, Source > &t)']]], + ['vec2_2eh',['Vec2.h',['../Vec2_8h.html',1,'']]], + ['vec2d',['Vec2d',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a5d9960b44dec6cd115402d1266d8d946',1,'openvdb::v3_2_0::math']]], + ['vec2dmetadata',['Vec2DMetadata',['../namespaceopenvdb_1_1v3__2__0.html#a11efa2ab39658e465e84f977eded6ea7',1,'openvdb::v3_2_0']]], + ['vec2dtree',['Vec2DTree',['../namespaceopenvdb_1_1v3__2__0.html#a2b79a6c06e50c1d80085bb0ba93b8e6a',1,'openvdb::v3_2_0']]], + ['vec2f',['Vec2f',['../namespaceopenvdb_1_1v3__2__0.html#af42e020ae7ee1371841001dd980c4e9a',1,'openvdb::v3_2_0']]], + ['vec2h',['Vec2H',['../namespaceopenvdb_1_1v3__2__0.html#ae84abad4e0016deb1c3c921fcd5f9a39',1,'openvdb::v3_2_0']]], + ['vec2i',['Vec2i',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a03c7152664e1a976cd47ca4e68580d16',1,'openvdb::v3_2_0::math::Vec2i()'],['../namespaceopenvdb_1_1v3__2__0.html#a28689d0dd1b72588ff47cda1a567f911',1,'openvdb::v3_2_0::Vec2I()']]], + ['vec2imetadata',['Vec2IMetadata',['../namespaceopenvdb_1_1v3__2__0.html#add67b3aefaf9463b5644a9740418ee8d',1,'openvdb::v3_2_0']]], + ['vec2itree',['Vec2ITree',['../namespaceopenvdb_1_1v3__2__0.html#ad7b4baeff66c84f52c9e3ccad22ea273',1,'openvdb::v3_2_0']]], + ['vec2r',['Vec2R',['../namespaceopenvdb_1_1v3__2__0.html#acfa6f350314f32ce9e0b3d4955d6fa7c',1,'openvdb::v3_2_0']]], + ['vec2s',['Vec2s',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1aeafc7471280f67e7ed9134457c5115',1,'openvdb::v3_2_0::math']]], + ['vec2smetadata',['Vec2SMetadata',['../namespaceopenvdb_1_1v3__2__0.html#a220540457f67db992a306685e688c750',1,'openvdb::v3_2_0']]], + ['vec2stree',['Vec2STree',['../namespaceopenvdb_1_1v3__2__0.html#a62be112de385eb05bec2b3aa9fb61028',1,'openvdb::v3_2_0']]], + ['vec2ui',['Vec2ui',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a36c1f8158ea27698935b0ebf48c6ef22',1,'openvdb::v3_2_0::math']]], + ['vec3',['Vec3',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a9776ee60566203dbcdc410d8a28edfce',1,'openvdb::v3_2_0::math::Vec3::Vec3()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a624bfb8d71ad4fda4d4c1ed2aa0f96ac',1,'openvdb::v3_2_0::math::Vec3::Vec3(T val)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a4c6dc0fa5f7ec53cb8aa76c2ffd43b81',1,'openvdb::v3_2_0::math::Vec3::Vec3(T x, T y, T z)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a32029d0dd4c438649f80d3373c1d2043',1,'openvdb::v3_2_0::math::Vec3::Vec3(Source *a)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ab0c4f48ebe1eff45eb504eed2dfd5a2a',1,'openvdb::v3_2_0::math::Vec3::Vec3(const Tuple< 3, Source > &v)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a8ddb7a8578160df492f1360ec41503c7',1,'openvdb::v3_2_0::math::Vec3::Vec3(const Vec3< Other > &v)']]], + ['vec3',['Vec3',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html',1,'openvdb::v3_2_0::math']]], + ['vec3_2eh',['Vec3.h',['../Vec3_8h.html',1,'']]], + ['vec3_3c_20double_20_3e',['Vec3< double >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html',1,'openvdb::v3_2_0::math']]], + ['vec3_3c_20real_20_3e',['Vec3< Real >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html',1,'openvdb::v3_2_0::math']]], + ['vec3d',['Vec3d',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ac7030f700e7e312e526c66765cc26f2c',1,'openvdb::v3_2_0::math']]], + ['vec3dgrid',['Vec3DGrid',['../namespaceopenvdb_1_1v3__2__0.html#af449dc9c5efdffe692293d251e6e7ddd',1,'openvdb::v3_2_0::Vec3DGrid()'],['../namespaceopenvdb_1_1v3__2__0.html#ab733fef37fc9a5d33dcf3845b2c7183b',1,'openvdb::v3_2_0::Vec3dGrid()']]], + ['vec3dmetadata',['Vec3DMetadata',['../namespaceopenvdb_1_1v3__2__0.html#ae69d6a9270c81822ff73bdc863559d0f',1,'openvdb::v3_2_0']]], + ['vec3dtree',['Vec3DTree',['../namespaceopenvdb_1_1v3__2__0.html#acf6372e214a8b1d1896f6af48e645455',1,'openvdb::v3_2_0::Vec3DTree()'],['../namespaceopenvdb_1_1v3__2__0.html#ad1c1ea0603e4d7273cf36b893945db6a',1,'openvdb::v3_2_0::Vec3dTree()']]], + ['vec3f',['Vec3f',['../namespaceopenvdb_1_1v3__2__0.html#aad16c11fc989660440b62fc2853a8f9a',1,'openvdb::v3_2_0']]], + ['vec3fgrid',['Vec3fGrid',['../namespaceopenvdb_1_1v3__2__0.html#a8e538947664ee679b9e2990f5ec6f9d1',1,'openvdb::v3_2_0']]], + ['vec3ftree',['Vec3fTree',['../namespaceopenvdb_1_1v3__2__0.html#a6f5555a82cc71bcc837b31cbc6bf9eb8',1,'openvdb::v3_2_0']]], + ['vec3h',['Vec3H',['../namespaceopenvdb_1_1v3__2__0.html#a5a31140f4350f09d91d06e9f624286e6',1,'openvdb::v3_2_0']]], + ['vec3i',['Vec3I',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#acaaa98402a816151d4074ca0ca650317',1,'openvdb::v3_2_0::math::Coord::Vec3I()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a98424217402ef3bba79463a8cc03d467',1,'openvdb::v3_2_0::math::Coord::Vec3i()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4a70e1ddeccbb56c2112ec48ae13bc8e',1,'openvdb::v3_2_0::math::Vec3i()'],['../namespaceopenvdb_1_1v3__2__0.html#a7422e0d02b8ea28dae96423cf4f72442',1,'openvdb::v3_2_0::Vec3I()']]], + ['vec3igrid',['Vec3IGrid',['../namespaceopenvdb_1_1v3__2__0.html#a87115ca5c0e6d1e8537d61e771276a35',1,'openvdb::v3_2_0']]], + ['vec3imetadata',['Vec3IMetadata',['../namespaceopenvdb_1_1v3__2__0.html#af40c95425ea01965c564b5a291cd755d',1,'openvdb::v3_2_0']]], + ['vec3itree',['Vec3ITree',['../namespaceopenvdb_1_1v3__2__0.html#a88ecacd4c6e2ce475f717b70518242f1',1,'openvdb::v3_2_0']]], + ['vec3r',['Vec3R',['../namespaceopenvdb_1_1v3__2__0.html#a766fe5be658c1eff35ecf426f7164ae6',1,'openvdb::v3_2_0']]], + ['vec3s',['Vec3s',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a0b5c02d92c75ba7328e47e7eaee80449',1,'openvdb::v3_2_0::math']]], + ['vec3sgrid',['Vec3SGrid',['../namespaceopenvdb_1_1v3__2__0.html#ac7dfc125a2d71449a20ade7827b32f77',1,'openvdb::v3_2_0']]], + ['vec3slist',['Vec3sList',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFracture.html#acc0166f4275a7fcd7e042295e469c03e',1,'openvdb::v3_2_0::tools::LevelSetFracture']]], + ['vec3smetadata',['Vec3SMetadata',['../namespaceopenvdb_1_1v3__2__0.html#a461a6b8d81b40d012d7d0906dfe34847',1,'openvdb::v3_2_0']]], + ['vec3stree',['Vec3STree',['../namespaceopenvdb_1_1v3__2__0.html#a0779faf3cecbd886788868f717d85835',1,'openvdb::v3_2_0']]], + ['vec3t',['Vec3T',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#af6a59adc01c697f14ba0fe60b6edcf60',1,'openvdb::v3_2_0::math::DDA::Vec3T()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#af6a59adc01c697f14ba0fe60b6edcf60',1,'openvdb::v3_2_0::math::Ray::Vec3T()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetSphere.html#aa0c7050ac36e7940e1766f9e8ed6e823',1,'openvdb::v3_2_0::tools::LevelSetSphere::Vec3T()']]], + ['vec3type',['Vec3Type',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#aa512d9a5228da259f36b241659b63406',1,'openvdb::v3_2_0::math::BBox::Vec3Type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#aa28405382ff1844b8d64debfc23ba25f',1,'openvdb::v3_2_0::math::DDA::Vec3Type()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1ReturnValue.html#ab076879beed7dfa4264d3ca09c210c1b',1,'openvdb::v3_2_0::math::internal::ReturnValue::Vec3Type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#aaca5029869fc187ceb64cf2e5a2575d7',1,'openvdb::v3_2_0::math::Ray::Vec3Type()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#ab1c38494e1946ec14e6a816fcbfb0580',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::Vec3Type()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#a473b3eedadcc193cbd7326745abe9ffc',1,'openvdb::v3_2_0::tools::LevelSetRayTracer::Vec3Type()']]], + ['vec3ui',['Vec3ui',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a20681751d86f0abe7835b2db6b6900d4',1,'openvdb::v3_2_0::math']]], + ['vec4',['Vec4',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html',1,'openvdb::v3_2_0::math']]], + ['vec4',['Vec4',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#af1ab5af804d206e7bf9bcd28a8348d07',1,'openvdb::v3_2_0::math::Vec4::Vec4()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#aeaf3fd22aabebaaade719289d96c3d35',1,'openvdb::v3_2_0::math::Vec4::Vec4(T val)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a3f8da0a2d62ec25029e9d7e67a8a3aa1',1,'openvdb::v3_2_0::math::Vec4::Vec4(T x, T y, T z, T w)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a10148ec570f617b748e083a9306c4cc4',1,'openvdb::v3_2_0::math::Vec4::Vec4(Source *a)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a000f4154a86d863526d5a792190aae60',1,'openvdb::v3_2_0::math::Vec4::Vec4(const Tuple< 4, Source > &v)']]], + ['vec4_2eh',['Vec4.h',['../Vec4_8h.html',1,'']]], + ['vec4d',['Vec4d',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a3fc75b57541cf0d3c6220e003489b9d2',1,'openvdb::v3_2_0::math']]], + ['vec4f',['Vec4f',['../namespaceopenvdb_1_1v3__2__0.html#acfea3906dd15f3f77f6d0b2f5e9753f8',1,'openvdb::v3_2_0']]], + ['vec4h',['Vec4H',['../namespaceopenvdb_1_1v3__2__0.html#a11bc6b0fed40ea5aa8a888e0e4e9b509',1,'openvdb::v3_2_0']]], + ['vec4i',['Vec4I',['../namespaceopenvdb_1_1v3__2__0.html#aa3003b934842c073260924e61793d158',1,'openvdb::v3_2_0::Vec4I()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#abdf164c737bdbaa31c28cfcfc6f55141',1,'openvdb::v3_2_0::math::Vec4i()']]], + ['vec4r',['Vec4R',['../namespaceopenvdb_1_1v3__2__0.html#a3f85a6f8254c048433fe38114f0cc40b',1,'openvdb::v3_2_0']]], + ['vec4s',['Vec4s',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ace4ffad84c7d8244b8551f1bb5c476b1',1,'openvdb::v3_2_0::math']]], + ['vec4ui',['Vec4ui',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a5d47e933d3a6206ae129a73b07fb5e82',1,'openvdb::v3_2_0::math']]], + ['vec_5fcontravariant_5fabsolute',['VEC_CONTRAVARIANT_ABSOLUTE',['../namespaceopenvdb_1_1v3__2__0.html#ae93f92d10730a52ed3b207d5811f6a6ea04e1b634fcd3b7c2e7034176792a5478',1,'openvdb::v3_2_0']]], + ['vec_5fcontravariant_5frelative',['VEC_CONTRAVARIANT_RELATIVE',['../namespaceopenvdb_1_1v3__2__0.html#ae93f92d10730a52ed3b207d5811f6a6ea0e7e7aa53b065235993b027a7dc2d49f',1,'openvdb::v3_2_0']]], + ['vec_5fcovariant',['VEC_COVARIANT',['../namespaceopenvdb_1_1v3__2__0.html#ae93f92d10730a52ed3b207d5811f6a6ea1fb13276c1e442e8682f27c216c32364',1,'openvdb::v3_2_0']]], + ['vec_5fcovariant_5fnormalize',['VEC_COVARIANT_NORMALIZE',['../namespaceopenvdb_1_1v3__2__0.html#ae93f92d10730a52ed3b207d5811f6a6eab65daaeb8abf83f0997fe73cb575df65',1,'openvdb::v3_2_0']]], + ['vec_5finvariant',['VEC_INVARIANT',['../namespaceopenvdb_1_1v3__2__0.html#ae93f92d10730a52ed3b207d5811f6a6eae293a86a2c0fcf0596cd261654e870e2',1,'openvdb::v3_2_0']]], + ['veccomponentvaluet',['VecComponentValueT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1VectorToScalarConverter.html#abcc6c999ffb28ca82a4ce89a3bbfbcb2',1,'openvdb::v3_2_0::tools::VectorToScalarConverter']]], + ['vect',['VecT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid_1_1ReducePool.html#a6369b9ef742832903e38c461bbcea052',1,'openvdb::v3_2_0::tools::PointMaskGrid::ReducePool']]], + ['vector',['vector',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyToVecOp.html#a907a80a97d2e386b5fb2eca2fa073340',1,'openvdb::v3_2_0::tools::poisson::internal::CopyToVecOp::vector()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyFromVecOp.html#a1815c69bebb68acdfcad1909149ec203',1,'openvdb::v3_2_0::tools::poisson::internal::CopyFromVecOp::vector()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a4df026156780bc0ca651c342b7d6daa4',1,'openvdb::v3_2_0::math::pcg::Vector::Vector()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#acf25366c019369e7c99ffba5200d9702',1,'openvdb::v3_2_0::math::pcg::Vector::Vector(SizeType n)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a777eb104319990ff13354c1fc61e1b80',1,'openvdb::v3_2_0::math::pcg::Vector::Vector(SizeType n, const ValueType &val)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a7b597e37362cee724912b3402bbea4ba',1,'openvdb::v3_2_0::math::pcg::Vector::Vector(const Vector &)']]], + ['vector',['Vector',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html',1,'openvdb::v3_2_0::math::pcg']]], + ['vector_3c_20valuetype_20_3e',['Vector< ValueType >',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html',1,'openvdb::v3_2_0::math::pcg']]], + ['vectord',['VectorD',['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg.html#a8adc738dc34c81963442957755622330',1,'openvdb::v3_2_0::math::pcg']]], + ['vectorgrid',['VectorGrid',['../namespaceopenvdb_1_1v3__2__0.html#af48f213e5824d0c84d3bab0bde27b9f3',1,'openvdb::v3_2_0']]], + ['vectormultiply',['vectorMultiply',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a6d24a8051e2a72354e008f24164a95d8',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::vectorMultiply(const Vector< VecValueType > &inVec, Vector< VecValueType > &resultVec) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#ae14fb3f40f158bf5ede8e73de003119a',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::vectorMultiply(const VecValueType *inVec, VecValueType *resultVec) const ']]], + ['vectors',['VectorS',['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg.html#a887ad7f4f617aaa2136dd8007fc1aa6f',1,'openvdb::v3_2_0::math::pcg']]], + ['vectort',['VectorT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyToVecOp.html#acdc7862828391d406d8c5ce6ec480fee',1,'openvdb::v3_2_0::tools::poisson::internal::CopyToVecOp::VectorT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyFromVecOp.html#acdc7862828391d406d8c5ce6ec480fee',1,'openvdb::v3_2_0::tools::poisson::internal::CopyFromVecOp::VectorT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1ISLaplacianOp.html#a3a1f7ff468b65d5b9676447fde6bb42b',1,'openvdb::v3_2_0::tools::poisson::internal::ISLaplacianOp::VectorT()']]], + ['vectortoscalarconverter',['VectorToScalarConverter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1VectorToScalarConverter.html',1,'openvdb::v3_2_0::tools']]], + ['vectortransformer_2eh',['VectorTransformer.h',['../VectorTransformer_8h.html',1,'']]], + ['vectortree',['VectorTree',['../namespaceopenvdb_1_1v3__2__0.html#a5374297655c6118cf8d4c8eea37b9eb0',1,'openvdb::v3_2_0']]], + ['vectortype',['VectorType',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#aae39324d94f38451bfd841e1cb1443a8',1,'openvdb::v3_2_0::math::BBox::VectorType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#aad1102bc73e5d508622c1c9348ee1f89',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::VectorType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1JacobiPreconditioner.html#aad1102bc73e5d508622c1c9348ee1f89',1,'openvdb::v3_2_0::math::pcg::JacobiPreconditioner::VectorType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#aad1102bc73e5d508622c1c9348ee1f89',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner::VectorType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#a9175a0c17157bc107ca1ff6fea96e02f',1,'openvdb::v3_2_0::tools::LevelSetAdvection::VectorType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiscreteField.html#a115c4db4b7f46bbab2797ef32523c310',1,'openvdb::v3_2_0::tools::DiscreteField::VectorType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1EnrightField.html#a3ebc2314239cf73059205c46aa9e9746',1,'openvdb::v3_2_0::tools::EnrightField::VectorType()']]], + ['vectorvaluet',['VectorValueT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ScalarToVectorConverter.html#a668c584a12a44bc68eb6d37b2b491d54',1,'openvdb::v3_2_0::tools::ScalarToVectorConverter']]], + ['vectraits',['VecTraits',['../structopenvdb_1_1v3__2__0_1_1VecTraits.html',1,'openvdb::v3_2_0']]], + ['vectraits_3c_20math_3a_3avec2_3c_20t_20_3e_20_3e',['VecTraits< math::Vec2< T > >',['../structopenvdb_1_1v3__2__0_1_1VecTraits_3_01math_1_1Vec2_3_01T_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['vectraits_3c_20math_3a_3avec3_3c_20t_20_3e_20_3e',['VecTraits< math::Vec3< T > >',['../structopenvdb_1_1v3__2__0_1_1VecTraits_3_01math_1_1Vec3_3_01T_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['vectraits_3c_20math_3a_3avec4_3c_20t_20_3e_20_3e',['VecTraits< math::Vec4< T > >',['../structopenvdb_1_1v3__2__0_1_1VecTraits_3_01math_1_1Vec4_3_01T_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['vectype',['VecType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocityIntegrator.html#af4ceb35ad7b35bf31f19616fed9b5ea7',1,'openvdb::v3_2_0::tools::VelocityIntegrator::VecType()'],['../namespaceopenvdb_1_1v3__2__0.html#ae93f92d10730a52ed3b207d5811f6a6e',1,'openvdb::v3_2_0::VecType()']]], + ['vectypedescription',['vecTypeDescription',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a2df84a78e49bd372fc62b509b7e74977',1,'openvdb::v3_2_0::GridBase']]], + ['vectypeexamples',['vecTypeExamples',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a7baa8b9c39c23acbdeb652d27d0ffabe',1,'openvdb::v3_2_0::GridBase']]], + ['vectypetostring',['vecTypeToString',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a48b75f7af594fa903f27535ca00c0ee6',1,'openvdb::v3_2_0::GridBase']]], + ['velocityfieldintegrator',['VelocityFieldIntegrator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#af4408f4c877874605a2d9c42cbc2848e',1,'openvdb::v3_2_0::tools::PointAdvect']]], + ['velocityfields_2eh',['VelocityFields.h',['../VelocityFields_8h.html',1,'']]], + ['velocityintegrator',['VelocityIntegrator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocityIntegrator.html#a7518ad552ac6f3b1874f65462d2ded1b',1,'openvdb::v3_2_0::tools::VelocityIntegrator']]], + ['velocityintegrator',['VelocityIntegrator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocityIntegrator.html',1,'openvdb::v3_2_0::tools']]], + ['velocityintegratortype',['VelocityIntegratorType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#ac26c84ffbe7c2c26b7cb1d1513f32218',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect']]], + ['velocitysampler',['VelocitySampler',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocitySampler.html',1,'openvdb::v3_2_0::tools']]], + ['velocitysampler',['VelocitySampler',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocitySampler.html#a8a94b489b62182f3d7aec612a81cfa62',1,'openvdb::v3_2_0::tools::VelocitySampler::VelocitySampler(const GridT &grid)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocitySampler.html#ae3babf2322c2c430e7fff87a2c3c1fd1',1,'openvdb::v3_2_0::tools::VelocitySampler::VelocitySampler(const VelocitySampler &other)']]], + ['velocitysampler_3c_20gridt_2c_20staggered_2c_20sampleorder_20_3e',['VelocitySampler< GridT, Staggered, SampleOrder >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocitySampler.html',1,'openvdb::v3_2_0::tools']]], + ['version',['version',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a74fde2dcc73016d9f02eba2a83ca5e9b',1,'openvdb::v3_2_0::io::Archive']]], + ['version_2eh',['version.h',['../version_8h.html',1,'']]], + ['versionid',['VersionId',['../structopenvdb_1_1v3__2__0_1_1VersionId.html#aa01fd800dfc9a6d15bf18cb5cc6351e4',1,'openvdb::v3_2_0::VersionId::VersionId()'],['../structopenvdb_1_1v3__2__0_1_1VersionId.html#aac21fae8e04dceb4d0a606e0933e4cfe',1,'openvdb::v3_2_0::VersionId::VersionId(uint32_t major, uint32_t minor)']]], + ['versionid',['VersionId',['../structopenvdb_1_1v3__2__0_1_1VersionId.html',1,'openvdb::v3_2_0']]], + ['vertexcount',['vertexCount',['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadAndTriangleDataAdapter.html#a4e4b6c1e7d2917357d6ad1ee5e776789',1,'openvdb::v3_2_0::tools::QuadAndTriangleDataAdapter']]], + ['vidxleaft',['VIdxLeafT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyToVecOp.html#aafd541ca0327e9b6cda4aca57a5a4270',1,'openvdb::v3_2_0::tools::poisson::internal::CopyToVecOp::VIdxLeafT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyFromVecOp.html#a55025f5a74ea7286ac36e9bb41436207',1,'openvdb::v3_2_0::tools::poisson::internal::CopyFromVecOp::VIdxLeafT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1ISLaplacianOp.html#aafd541ca0327e9b6cda4aca57a5a4270',1,'openvdb::v3_2_0::tools::poisson::internal::ISLaplacianOp::VIdxLeafT()']]], + ['vidxtreet',['VIdxTreeT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyToVecOp.html#a35e6561d91404001af79317fc52c3b32',1,'openvdb::v3_2_0::tools::poisson::internal::CopyToVecOp::VIdxTreeT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1ISLaplacianOp.html#aeef4702154e422c6e570bd6f1b29dcea',1,'openvdb::v3_2_0::tools::poisson::internal::ISLaplacianOp::VIdxTreeT()']]], + ['vindex',['VIndex',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#a81b5632db740d867fc3ac3dc898a61c2',1,'openvdb::v3_2_0::tools::poisson']]], + ['visit',['visit',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a028a58e937882a91e9c1470fb6e73b42',1,'openvdb::v3_2_0::tree::InternalNode::visit(VisitorOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ac6e62589958cedae5c2cd4b356f6ba7a',1,'openvdb::v3_2_0::tree::InternalNode::visit(VisitorOp &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a028a58e937882a91e9c1470fb6e73b42',1,'openvdb::v3_2_0::tree::LeafNode::visit(VisitorOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ac6e62589958cedae5c2cd4b356f6ba7a',1,'openvdb::v3_2_0::tree::LeafNode::visit(VisitorOp &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a028a58e937882a91e9c1470fb6e73b42',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::visit(VisitorOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ac6e62589958cedae5c2cd4b356f6ba7a',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::visit(VisitorOp &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a028a58e937882a91e9c1470fb6e73b42',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::visit(VisitorOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ac6e62589958cedae5c2cd4b356f6ba7a',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::visit(VisitorOp &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a028a58e937882a91e9c1470fb6e73b42',1,'openvdb::v3_2_0::tree::RootNode::visit(VisitorOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ac6e62589958cedae5c2cd4b356f6ba7a',1,'openvdb::v3_2_0::tree::RootNode::visit(VisitorOp &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a92fa8714e1d4021da4f150b5e24385a0',1,'openvdb::v3_2_0::tree::Tree::visit(VisitorOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ab5edcc00e9c808a70cf54f70d1c6cf1c',1,'openvdb::v3_2_0::tree::Tree::visit(const VisitorOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ae3bfd775ca5152411cc28fa5f6d95ea3',1,'openvdb::v3_2_0::tree::Tree::visit(VisitorOp &op) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a085768d7b5762ac5be343ba82fe666a6',1,'openvdb::v3_2_0::tree::Tree::visit(const VisitorOp &op) const ']]], + ['visit2',['visit2',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a3595aa225add4df3db17545b9250cd6d',1,'openvdb::v3_2_0::tree::InternalNode::visit2(IterT &otherIter, VisitorOp &, bool otherIsLHS=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a7de0cadde4e5ded9ae2fff73126718d7',1,'openvdb::v3_2_0::tree::InternalNode::visit2(IterT &otherIter, VisitorOp &, bool otherIsLHS=false) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a3595aa225add4df3db17545b9250cd6d',1,'openvdb::v3_2_0::tree::LeafNode::visit2(IterT &otherIter, VisitorOp &, bool otherIsLHS=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a7de0cadde4e5ded9ae2fff73126718d7',1,'openvdb::v3_2_0::tree::LeafNode::visit2(IterT &otherIter, VisitorOp &, bool otherIsLHS=false) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a3595aa225add4df3db17545b9250cd6d',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::visit2(IterT &otherIter, VisitorOp &, bool otherIsLHS=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a7de0cadde4e5ded9ae2fff73126718d7',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::visit2(IterT &otherIter, VisitorOp &, bool otherIsLHS=false) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a3595aa225add4df3db17545b9250cd6d',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::visit2(IterT &otherIter, VisitorOp &, bool otherIsLHS=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a7de0cadde4e5ded9ae2fff73126718d7',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::visit2(IterT &otherIter, VisitorOp &, bool otherIsLHS=false) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a7c5dff97dd17f56a711d483615450d73',1,'openvdb::v3_2_0::tree::RootNode::visit2(OtherRootNodeType &other, VisitorOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a1d81485014bea7517cbbf9e22a31d57e',1,'openvdb::v3_2_0::tree::RootNode::visit2(OtherRootNodeType &other, VisitorOp &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a3a669237d39f3536882fd6c16fb32fde',1,'openvdb::v3_2_0::tree::Tree::visit2(OtherTreeType &other, VisitorOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ada17792f9a96a8fd4f9dd881840a036b',1,'openvdb::v3_2_0::tree::Tree::visit2(OtherTreeType &other, const VisitorOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a0746c8bcd8bbb9b38e4296eb5a61acf0',1,'openvdb::v3_2_0::tree::Tree::visit2(OtherTreeType &other, VisitorOp &op) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a741d508246ebbff1b95bea8134b49304',1,'openvdb::v3_2_0::tree::Tree::visit2(OtherTreeType &other, const VisitorOp &op) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a950584ca06c9d4c5d5b6fede669ccd90',1,'openvdb::v3_2_0::tree::InternalNode::visit2(OtherChildAllIterType &otherIter, VisitorOp &op, bool otherIsLHS)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a65d1c12fd73ec28ff666e8878ebace5c',1,'openvdb::v3_2_0::tree::InternalNode::visit2(OtherChildAllIterType &otherIter, VisitorOp &op, bool otherIsLHS) const ']]], + ['visit2node',['visit2Node',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#afa68756dbd8a216cdc248d4e828927ee',1,'openvdb::v3_2_0::tree::InternalNode::visit2Node(OtherNodeType &other, VisitorOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a2891ea5e9fa708cc8c72bfeddb24eaf4',1,'openvdb::v3_2_0::tree::InternalNode::visit2Node(OtherNodeType &other, VisitorOp &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#afebf069af81c222a7df5312eac33f8e3',1,'openvdb::v3_2_0::tree::LeafNode::visit2Node(OtherLeafNodeType &other, VisitorOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a70f885c0c49227a5269466d121eb85ec',1,'openvdb::v3_2_0::tree::LeafNode::visit2Node(OtherLeafNodeType &other, VisitorOp &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#afebf069af81c222a7df5312eac33f8e3',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::visit2Node(OtherLeafNodeType &other, VisitorOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a70f885c0c49227a5269466d121eb85ec',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::visit2Node(OtherLeafNodeType &other, VisitorOp &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#afebf069af81c222a7df5312eac33f8e3',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::visit2Node(OtherLeafNodeType &other, VisitorOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a70f885c0c49227a5269466d121eb85ec',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::visit2Node(OtherLeafNodeType &other, VisitorOp &) const ']]], + ['visitactivebbox',['visitActiveBBox',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a973ced84fe7b684d6be0acb5cef74c33',1,'openvdb::v3_2_0::tree::InternalNode::visitActiveBBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a973ced84fe7b684d6be0acb5cef74c33',1,'openvdb::v3_2_0::tree::LeafNode::visitActiveBBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a973ced84fe7b684d6be0acb5cef74c33',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::visitActiveBBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a973ced84fe7b684d6be0acb5cef74c33',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::visitActiveBBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a973ced84fe7b684d6be0acb5cef74c33',1,'openvdb::v3_2_0::tree::RootNode::visitActiveBBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#afd30b68bce6aa6ec6de2441d995a5f56',1,'openvdb::v3_2_0::tree::Tree::visitActiveBBox()']]], + ['visited',['visited',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1NodeMaskSegment.html#a1df99df902f5f6e81ec3e21e9c07360e',1,'openvdb::v3_2_0::tools::level_set_util_internal::NodeMaskSegment']]], + ['vmask_5f',['VMASK_',['../PointIndexGrid_8h.html#acc9b8d1e7cf8440093509526152fb82a',1,'PointIndexGrid.h']]], + ['volume',['volume',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#aff8b0a9c33439141616416dd5b1bd2a0',1,'openvdb::v3_2_0::math::BBox::volume()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a5226e1e3ee32005e374d1e8f31a659f4',1,'openvdb::v3_2_0::math::CoordBBox::volume()']]], + ['volumeadvect_2eh',['VolumeAdvect.h',['../VolumeAdvect_8h.html',1,'']]], + ['volumeadvection',['VolumeAdvection',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html',1,'openvdb::v3_2_0::tools']]], + ['volumeadvection',['VolumeAdvection',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#ae346a7a7e4b3633a3ead6cd63d9a5ee6',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['volumehdda',['VolumeHDDA',['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA.html#a58bf62c59fa34bebd98138762ad16ef7',1,'openvdb::v3_2_0::math::VolumeHDDA::VolumeHDDA()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA_3_01TreeT_00_01RayT_00_010_01_4.html#a58bf62c59fa34bebd98138762ad16ef7',1,'openvdb::v3_2_0::math::VolumeHDDA< TreeT, RayT, 0 >::VolumeHDDA()']]], + ['volumehdda',['VolumeHDDA',['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA.html',1,'openvdb::v3_2_0::math']]], + ['volumehdda_3c_20openvdb_3a_3av3_5f2_5f0_3a_3atree_3a_3atree_2c_20raytype_2c_20nodelevel_20_3e',['VolumeHDDA< openvdb::v3_2_0::tree::Tree, RayType, NodeLevel >',['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA.html',1,'openvdb::v3_2_0::math']]], + ['volumehdda_3c_20treet_2c_20rayt_2c_200_20_3e',['VolumeHDDA< TreeT, RayT, 0 >',['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA_3_01TreeT_00_01RayT_00_010_01_4.html',1,'openvdb::v3_2_0::math']]], + ['volumehdda_3c_20treet_2c_20rayt_2c_201_20_3e',['VolumeHDDA< TreeT, RayT, 1 >',['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA_3_01TreeT_00_01RayT_00_010_01_4.html#a02cfe000fd80e389096ff8a613c9edd1',1,'openvdb::v3_2_0::math::VolumeHDDA< TreeT, RayT, 0 >']]], + ['volumehdda_3c_20treet_2c_20rayt_2c_20childnodelevel_2b1_20_3e',['VolumeHDDA< TreeT, RayT, ChildNodeLevel+1 >',['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA.html#a18baa920f5d88c00f55a344eeb414a58',1,'openvdb::v3_2_0::math::VolumeHDDA']]], + ['volumerayintersector',['VolumeRayIntersector',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#acc2eb737e1348af8e047b664342d8d3c',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::VolumeRayIntersector(const GridT &grid, int dilationCount=0)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a364ed92c181c4ff4a63e1ff1a25a69dc',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::VolumeRayIntersector(const GridT &grid, const math::CoordBBox &bbox)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a29e1f089dca8c274ca7edb56c7c1b710',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::VolumeRayIntersector(const VolumeRayIntersector &other)']]], + ['volumerayintersector',['VolumeRayIntersector',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html',1,'openvdb::v3_2_0::tools']]], + ['volumerender',['VolumeRender',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html',1,'openvdb::v3_2_0::tools']]], + ['volumerender',['VolumeRender',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#af722913dc6cf750d9cc6d9d0bc846850',1,'openvdb::v3_2_0::tools::VolumeRender::VolumeRender(const IntersectorT &inter, BaseCamera &camera)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#ac0c412db63ca55b976ebeb5bd697eb5b',1,'openvdb::v3_2_0::tools::VolumeRender::VolumeRender(const VolumeRender &other)']]], + ['volumetomesh',['VolumeToMesh',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html',1,'openvdb::v3_2_0::tools']]], + ['volumetomesh',['VolumeToMesh',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#a3495f7d8bf339cf90328eeb164ef1f0d',1,'openvdb::v3_2_0::tools::VolumeToMesh::VolumeToMesh()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a2641c8c08ca3ed3bf4cea4d9b52434b5',1,'openvdb::v3_2_0::tools::volumeToMesh(const GridType &grid, std::vector< Vec3s > &points, std::vector< Vec4I > &quads, double isovalue=0.0)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#afdc87629a329fe18c363c7fdd307e44e',1,'openvdb::v3_2_0::tools::volumeToMesh(const GridType &grid, std::vector< Vec3s > &points, std::vector< Vec3I > &triangles, std::vector< Vec4I > &quads, double isovalue=0.0, double adaptivity=0.0)']]], + ['volumetomesh_2eh',['VolumeToMesh.h',['../VolumeToMesh_8h.html',1,'']]], + ['volumetospheres_2eh',['VolumeToSpheres.h',['../VolumeToSpheres_8h.html',1,'']]], + ['voxel',['voxel',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#a0626bd36394e7f97a5a0aa3b1f80e142',1,'openvdb::v3_2_0::math::DDA']]], + ['voxelitert',['VoxelIterT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNan.html#a3e2c5b62f63adcb6d683b3cd67760e92',1,'openvdb::v3_2_0::tools::CheckNan::VoxelIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckInf.html#a3e2c5b62f63adcb6d683b3cd67760e92',1,'openvdb::v3_2_0::tools::CheckInf::VoxelIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckFinite.html#a3e2c5b62f63adcb6d683b3cd67760e92',1,'openvdb::v3_2_0::tools::CheckFinite::VoxelIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMagnitude.html#a3e2c5b62f63adcb6d683b3cd67760e92',1,'openvdb::v3_2_0::tools::CheckMagnitude::VoxelIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckRange.html#a3e2c5b62f63adcb6d683b3cd67760e92',1,'openvdb::v3_2_0::tools::CheckRange::VoxelIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMin.html#a3e2c5b62f63adcb6d683b3cd67760e92',1,'openvdb::v3_2_0::tools::CheckMin::VoxelIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMax.html#a3e2c5b62f63adcb6d683b3cd67760e92',1,'openvdb::v3_2_0::tools::CheckMax::VoxelIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#a3e2c5b62f63adcb6d683b3cd67760e92',1,'openvdb::v3_2_0::tools::CheckNormGrad::VoxelIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#a3e2c5b62f63adcb6d683b3cd67760e92',1,'openvdb::v3_2_0::tools::CheckEikonal::VoxelIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#a3e2c5b62f63adcb6d683b3cd67760e92',1,'openvdb::v3_2_0::tools::CheckDivergence::VoxelIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1MaskOp.html#a46f0164de3c43aa310f68bc4739f9cf1',1,'openvdb::v3_2_0::tools::MultiResGrid::MaskOp::VoxelIterT()']]], + ['voxelizationdata',['VoxelizationData',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['voxelizationdata',['VoxelizationData',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#a51c19a4f6e83f7647436834fb69d781d',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData']]], + ['voxelizationdatatype',['VoxelizationDataType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizePolygons.html#a7fc8d78545ef551256f192024133cb13',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizePolygons']]], + ['voxelizeactivetiles',['VoxelizeActiveTiles',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1VoxelizeActiveTiles.html#aeac204607214183a116bec32bc29f81b',1,'openvdb::v3_2_0::tree::InternalNode::VoxelizeActiveTiles::VoxelizeActiveTiles()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a39a2211a02fb606e611d3ff5bbd6f50c',1,'openvdb::v3_2_0::tree::InternalNode::voxelizeActiveTiles()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#af001699d1941bcdab67bad29b93496bf',1,'openvdb::v3_2_0::tree::LeafNode::voxelizeActiveTiles()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#af001699d1941bcdab67bad29b93496bf',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::voxelizeActiveTiles()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#af001699d1941bcdab67bad29b93496bf',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::voxelizeActiveTiles()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a39a2211a02fb606e611d3ff5bbd6f50c',1,'openvdb::v3_2_0::tree::RootNode::voxelizeActiveTiles()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a39a2211a02fb606e611d3ff5bbd6f50c',1,'openvdb::v3_2_0::tree::Tree::voxelizeActiveTiles()']]], + ['voxelizeactivetiles',['VoxelizeActiveTiles',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1VoxelizeActiveTiles.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['voxelizepolygons',['VoxelizePolygons',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizePolygons.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['voxelizepolygons',['VoxelizePolygons',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizePolygons.html#a833a34c76d996c286b0d04aacfa223e4',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizePolygons']]], + ['voxeloffsetarray',['VoxelOffsetArray',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#aed4d7bd6cde92b0dbd4c65c0bb46084b',1,'openvdb::v3_2_0::tools::PointPartitioner::VoxelOffsetArray()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1VoxelOrderOp.html#aed4d7bd6cde92b0dbd4c65c0bb46084b',1,'openvdb::v3_2_0::tools::point_partitioner_internal::VoxelOrderOp::VoxelOffsetArray()']]], + ['voxeloffsets',['voxelOffsets',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#aac60aec6c28e6d5e5c8f64335f970343',1,'openvdb::v3_2_0::tools::PointPartitioner']]], + ['voxeloffsettype',['VoxelOffsetType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#a3fe6597b21a5811e12b0cda92b024895',1,'openvdb::v3_2_0::tools::PointPartitioner::VoxelOffsetType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1VoxelOrderOp.html#a3fe6597b21a5811e12b0cda92b024895',1,'openvdb::v3_2_0::tools::point_partitioner_internal::VoxelOrderOp::VoxelOffsetType()']]], + ['voxelorderop',['VoxelOrderOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1VoxelOrderOp.html',1,'openvdb::v3_2_0::tools::point_partitioner_internal']]], + ['voxelorderop',['VoxelOrderOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1VoxelOrderOp.html#ad90d0635e7b39d0c6814ca06d3bb9a3c',1,'openvdb::v3_2_0::tools::point_partitioner_internal::VoxelOrderOp']]], + ['voxelsize',['voxelSize',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#abe11d7ce015c713f29f88fb376e22d0f',1,'openvdb::v3_2_0::GridBase::voxelSize() const '],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#aceaf3414d03c7d2cc6e7189511610308',1,'openvdb::v3_2_0::GridBase::voxelSize(const Vec3d &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a00d3f1aebcb50601369ae330a40daec4',1,'openvdb::v3_2_0::math::MapBase::voxelSize() const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a870b52d53e00b4b503438d2c45de9476',1,'openvdb::v3_2_0::math::MapBase::voxelSize(const Vec3d &) const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#abe11d7ce015c713f29f88fb376e22d0f',1,'openvdb::v3_2_0::math::AffineMap::voxelSize() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a2e8c2b03b96bad45d81b47615b79b158',1,'openvdb::v3_2_0::math::AffineMap::voxelSize(const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#abe11d7ce015c713f29f88fb376e22d0f',1,'openvdb::v3_2_0::math::ScaleMap::voxelSize() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a2e8c2b03b96bad45d81b47615b79b158',1,'openvdb::v3_2_0::math::ScaleMap::voxelSize(const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#abe11d7ce015c713f29f88fb376e22d0f',1,'openvdb::v3_2_0::math::TranslationMap::voxelSize() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a2e8c2b03b96bad45d81b47615b79b158',1,'openvdb::v3_2_0::math::TranslationMap::voxelSize(const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#abe11d7ce015c713f29f88fb376e22d0f',1,'openvdb::v3_2_0::math::ScaleTranslateMap::voxelSize() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a2e8c2b03b96bad45d81b47615b79b158',1,'openvdb::v3_2_0::math::ScaleTranslateMap::voxelSize(const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#abe11d7ce015c713f29f88fb376e22d0f',1,'openvdb::v3_2_0::math::UnitaryMap::voxelSize() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a2e8c2b03b96bad45d81b47615b79b158',1,'openvdb::v3_2_0::math::UnitaryMap::voxelSize(const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#abe11d7ce015c713f29f88fb376e22d0f',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::voxelSize() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a6b472132b2d3c32af617f13f3c27d3cb',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::voxelSize(const Vec3d &loc) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#abe11d7ce015c713f29f88fb376e22d0f',1,'openvdb::v3_2_0::math::GenericMap::voxelSize() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#ab2e80629c6fe6615587296b0bb368fe5',1,'openvdb::v3_2_0::math::GenericMap::voxelSize(const Vec3d &v) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#abe11d7ce015c713f29f88fb376e22d0f',1,'openvdb::v3_2_0::math::Transform::voxelSize() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#aceaf3414d03c7d2cc6e7189511610308',1,'openvdb::v3_2_0::math::Transform::voxelSize(const Vec3d &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a885c6fd118cf0cb17b092c895c632809',1,'openvdb::v3_2_0::tools::LevelSetTracker::voxelSize()']]], + ['voxelvolume',['voxelVolume',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a23d36bbeb278f0e9ff86bc45dbeb1338',1,'openvdb::v3_2_0::math::Transform::voxelVolume() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#ac1238f5ae3f452c0c7bf8a44829ffd3f',1,'openvdb::v3_2_0::math::Transform::voxelVolume(const Vec3d &xyz) const ']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_18.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_18.html new file mode 100644 index 00000000..b2f7468b --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_18.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_18.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_18.js new file mode 100644 index 00000000..79f6f8d1 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_18.js @@ -0,0 +1,36 @@ +var searchData= +[ + ['w',['w',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a8e15a41679997ff2315ea91ef1c22eb6',1,'openvdb::v3_2_0::math::Quat::w()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#aff0ce626b476406d185e4b7f9ee8817a',1,'openvdb::v3_2_0::math::Quat::w() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a8e15a41679997ff2315ea91ef1c22eb6',1,'openvdb::v3_2_0::math::Vec4::w()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#aff0ce626b476406d185e4b7f9ee8817a',1,'openvdb::v3_2_0::math::Vec4::w() const '],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyUnion.html#aab5a023ede703505077ae89b351f6a7e',1,'openvdb::v3_2_0::tree::InternalNode::TopologyUnion::W()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyIntersection.html#aab5a023ede703505077ae89b351f6a7e',1,'openvdb::v3_2_0::tree::InternalNode::TopologyIntersection::W()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyDifference.html#aab5a023ede703505077ae89b351f6a7e',1,'openvdb::v3_2_0::tree::InternalNode::TopologyDifference::W()']]], + ['wasinterrupted',['wasInterrupted',['../structopenvdb_1_1v3__2__0_1_1util_1_1NullInterrupter.html#aa48f7d2cdbf6265fdac605a80f0ffa83',1,'openvdb::v3_2_0::util::NullInterrupter::wasInterrupted()'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a05177861de8e8e230e9d3c7449d0f028',1,'openvdb::v3_2_0::util::wasInterrupted()']]], + ['wasinterrupted_3c_20util_3a_3anullinterrupter_20_3e',['wasInterrupted< util::NullInterrupter >',['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a2c55f07e21f1fe44ab8df7529709b5dc',1,'openvdb::v3_2_0::util']]], + ['weno5',['WENO5',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aa6f903a7353a1e44aa02cc7ec727ddf7',1,'openvdb::v3_2_0::math']]], + ['weno5_5fbias',['WENO5_BIAS',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9b59f0a0c54e6e3759f1418d40585656a5ded6cffcebae303db0b13b531a3d06d',1,'openvdb::v3_2_0::math']]], + ['wenostencil',['WenoStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html',1,'openvdb::v3_2_0::math']]], + ['wenostencil',['WenoStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html#a5cc079b43ba291da26f743067ba5c41e',1,'openvdb::v3_2_0::math::WenoStencil::WenoStencil(const GridType &grid)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html#a1f75871793f4ad24f15d2a32fb5570f6',1,'openvdb::v3_2_0::math::WenoStencil::WenoStencil(const GridType &grid, Real dx)']]], + ['what',['what',['../classopenvdb_1_1v3__2__0_1_1Exception.html#aff06f49065b54a8a86e02e9a2441a8ba',1,'openvdb::v3_2_0::Exception']]], + ['width',['width',['../structopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter_1_1Filter_1_1Avg.html#aead35c445a85f61ef3de500997ed4f68',1,'openvdb::v3_2_0::tools::LevelSetFilter::Filter::Avg::width()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Film.html#a20646dd69e82674924c6e5eb1458eefa',1,'openvdb::v3_2_0::tools::Film::width()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#a20646dd69e82674924c6e5eb1458eefa',1,'openvdb::v3_2_0::tools::BaseCamera::width()']]], + ['word',['Word',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a665434b7fb1f18b54432cf0197a4896a',1,'openvdb::v3_2_0::tools::Morphology::Word()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a5c5531d9a3e8ebc394d4b0d94b794c2d',1,'openvdb::v3_2_0::util::NodeMask::Word()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a53c9b118148a2a92d6ed6debc4ef0bbd',1,'openvdb::v3_2_0::util::NodeMask< 1 >::Word()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a5c5531d9a3e8ebc394d4b0d94b794c2d',1,'openvdb::v3_2_0::util::NodeMask< 2 >::Word()']]], + ['word_5fcount',['WORD_COUNT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#a26a37533c0026ba68db9b8698868fce0',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::WORD_COUNT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#a26a37533c0026ba68db9b8698868fce0',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::WORD_COUNT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#a26a37533c0026ba68db9b8698868fce0',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::WORD_COUNT()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a53a566358b65c3373774eed86a7619be',1,'openvdb::v3_2_0::util::NodeMask::WORD_COUNT()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a53a566358b65c3373774eed86a7619be',1,'openvdb::v3_2_0::util::NodeMask< 1 >::WORD_COUNT()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a53a566358b65c3373774eed86a7619be',1,'openvdb::v3_2_0::util::NodeMask< 2 >::WORD_COUNT()']]], + ['wordtype',['WordType',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#a6167f63ff9602c0f5e4e17ae366dc237',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::WordType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#a791615639ccd6cb2398978165440288a',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::WordType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#a791615639ccd6cb2398978165440288a',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::WordType()']]], + ['worldspacesearchandupdate',['worldSpaceSearchAndUpdate',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#af4ceacdb99fbbadd151faa7905fa3e13',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::worldSpaceSearchAndUpdate(const Vec3d &center, double radius, const ParticleArrayType &particles)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#a04e454a1ef7f95171b62ae7f06c2c8eb',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::worldSpaceSearchAndUpdate(const BBoxd &bbox, const ParticleArrayType &particles)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a1c06356526489c1f4b02349b6520b1e4',1,'openvdb::v3_2_0::tools::PointIndexIterator::worldSpaceSearchAndUpdate(const BBoxd &bbox, ConstAccessor &acc, const PointArray &points, const math::Transform &xform)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a19e152cc5aad7904c65846fde346aae1',1,'openvdb::v3_2_0::tools::PointIndexIterator::worldSpaceSearchAndUpdate(const Vec3d &center, double radius, ConstAccessor &acc, const PointArray &points, const math::Transform &xform, bool subvoxelAccuracy=true)']]], + ['worldtoindex',['worldToIndex',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a917d728a21347bc8528cfdcd0cbada38',1,'openvdb::v3_2_0::GridBase::worldToIndex()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a5247ed99a7e4c0540376a85e9c5a10e2',1,'openvdb::v3_2_0::math::Ray::worldToIndex()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a917d728a21347bc8528cfdcd0cbada38',1,'openvdb::v3_2_0::math::Transform::worldToIndex(const Vec3d &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a47df44101e2ffa381199e1cfe34b0512',1,'openvdb::v3_2_0::math::Transform::worldToIndex(const BBoxd &) const ']]], + ['worldtoindexcellcentered',['worldToIndexCellCentered',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a63423207db89c360676357577e25175d',1,'openvdb::v3_2_0::math::Transform::worldToIndexCellCentered(const Vec3d &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a1c9811c714720a6f49e5ba8ed2935c0c',1,'openvdb::v3_2_0::math::Transform::worldToIndexCellCentered(const BBoxd &) const ']]], + ['worldtoindexnodecentered',['worldToIndexNodeCentered',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a759679e3b97bdef29cd3f6941f78372b',1,'openvdb::v3_2_0::math::Transform::worldToIndexNodeCentered(const Vec3d &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#aa23f71d68fc7dfc0cb1bc5c915c3499b',1,'openvdb::v3_2_0::math::Transform::worldToIndexNodeCentered(const BBoxd &) const ']]], + ['write',['write',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#aed0ba80963ef465a7ad3f6a5325ef1ba',1,'openvdb::v3_2_0::io::Archive::write(const GridCPtrVec &, const MetaMap &=MetaMap()) const '],['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a77f2baa6c6933e6f928234cad7ead387',1,'openvdb::v3_2_0::io::Archive::write(std::ostream &, const GridPtrVec &, bool seekable, const MetaMap &=MetaMap()) const '],['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#ab173a2a2b5c3fe7c34c441e6a7fa0aed',1,'openvdb::v3_2_0::io::Archive::write(std::ostream &, const GridCPtrVec &, bool seekable, const MetaMap &=MetaMap()) const '],['../structopenvdb_1_1v3__2__0_1_1io_1_1HalfWriter_3_01false_00_01T_01_4.html#a42264d1aef975ac32de3b8385f7e2871',1,'openvdb::v3_2_0::io::HalfWriter< false, T >::write()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1HalfWriter_3_01true_00_01T_01_4.html#a42264d1aef975ac32de3b8385f7e2871',1,'openvdb::v3_2_0::io::HalfWriter< true, T >::write()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a916750caa82c74d8ffdf5586392ecf18',1,'openvdb::v3_2_0::io::File::write(const GridCPtrVec &, const MetaMap &=MetaMap()) const '],['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#ae24e8652049cfc92878f422febc14923',1,'openvdb::v3_2_0::io::File::write(const GridPtrContainerT &, const MetaMap &=MetaMap()) const '],['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#ab640eece07bc104eecdadb44dadc6e0d',1,'openvdb::v3_2_0::io::Queue::write()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Stream.html#aed0ba80963ef465a7ad3f6a5325ef1ba',1,'openvdb::v3_2_0::io::Stream::write(const GridCPtrVec &, const MetaMap &=MetaMap()) const '],['../classopenvdb_1_1v3__2__0_1_1io_1_1Stream.html#ae24e8652049cfc92878f422febc14923',1,'openvdb::v3_2_0::io::Stream::write(const GridPtrContainerT &, const MetaMap &=MetaMap()) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::BBox::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::Coord::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::CoordBBox::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#ad89260eca3080673fb0b32cbdf2e2e94',1,'openvdb::v3_2_0::math::MapBase::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::AffineMap::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::ScaleMap::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::TranslationMap::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::ScaleTranslateMap::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::UnitaryMap::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::CompoundMap::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::Mat::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::Quat::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a117702c3c46e7e4c3d57266a83b1676b',1,'openvdb::v3_2_0::math::Transform::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::Tuple::write()'],['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a117702c3c46e7e4c3d57266a83b1676b',1,'openvdb::v3_2_0::Metadata::write()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#ad92cb71fb1f4e60d547d1fa1581e73d0',1,'openvdb::v3_2_0::tools::MultiResGrid::write()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a5cb204a06bcda3cdf7a8e1b4cbb2ebc7',1,'openvdb::v3_2_0::io::Queue::write()']]], + ['writebuffers',['writeBuffers',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a232614030046d0a1ce5fc1c3492d06fa',1,'openvdb::v3_2_0::GridBase::writeBuffers()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#aac321e01e966ee2820f7dc6000e368e8',1,'openvdb::v3_2_0::Grid::writeBuffers()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a5fdd39cad592a2719ff782632d923c8d',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::writeBuffers()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a1517c3788b6d11d5e07a577dd38d7c43',1,'openvdb::v3_2_0::tree::InternalNode::writeBuffers()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a5fdd39cad592a2719ff782632d923c8d',1,'openvdb::v3_2_0::tree::LeafNode::writeBuffers()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a1517c3788b6d11d5e07a577dd38d7c43',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::writeBuffers()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a1517c3788b6d11d5e07a577dd38d7c43',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::writeBuffers()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a1517c3788b6d11d5e07a577dd38d7c43',1,'openvdb::v3_2_0::tree::RootNode::writeBuffers()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a4aad71ea53ca3126b0c8f05919e56f7b',1,'openvdb::v3_2_0::tree::TreeBase::writeBuffers()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a8f5393069d4ad644df349f406e722e21',1,'openvdb::v3_2_0::tree::Tree::writeBuffers()']]], + ['writecompressedvalues',['writeCompressedValues',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#acea3ebe161d44af2971c3f9e08ee4e86',1,'openvdb::v3_2_0::io']]], + ['writedata',['writeData',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#ab19408babd2b5dbf83e78d153387fbcc',1,'openvdb::v3_2_0::io']]], + ['writedata_3c_20std_3a_3astring_20_3e',['writeData< std::string >',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#ab4fde24581f070e621bc3cccbe99ffdc',1,'openvdb::v3_2_0::io']]], + ['writegrid',['writeGrid',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a7fa1196219d0b31c839008b6da6b0ba9',1,'openvdb::v3_2_0::io::Archive::writeGrid()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a195e1b783881591e8d00918ccd411593',1,'openvdb::v3_2_0::io::Queue::writeGrid()']]], + ['writegridinstance',['writeGridInstance',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#aa17615bdbdff452ea2fc0b287d3bc506',1,'openvdb::v3_2_0::io::Archive']]], + ['writegridstats',['writeGridStats',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a32d0d8abef8e7b4e3a4c639696f3b194',1,'openvdb::v3_2_0::io::StreamMetadata']]], + ['writeheader',['writeHeader',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a004d22e5fa15e5bbaba11e45ad91eb3e',1,'openvdb::v3_2_0::io::Archive::writeHeader()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a29ebc75a2df80f959126208468796ae7',1,'openvdb::v3_2_0::io::GridDescriptor::writeHeader()']]], + ['writemeta',['writeMeta',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a2ed4f76c42d56ab14a107d1a9f416e11',1,'openvdb::v3_2_0::MetaMap']]], + ['writesize',['writeSize',['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a291a1aac455104c18181903e210670de',1,'openvdb::v3_2_0::Metadata']]], + ['writestreampos',['writeStreamPos',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a98075b82bfd6798c0f81ddcca8eda1d4',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['writestring',['writeString',['../namespaceopenvdb_1_1v3__2__0.html#aaeee21e30b933c7ec9b88fe878613953',1,'openvdb::v3_2_0']]], + ['writetopology',['writeTopology',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a655b98dcf0c818def7e03c71547709ee',1,'openvdb::v3_2_0::GridBase::writeTopology()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a81b4a203cd871e4a5c20ffa1ce9ffa74',1,'openvdb::v3_2_0::Grid::writeTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a72d547afeb73396804509f85ec7043e7',1,'openvdb::v3_2_0::tree::InternalNode::writeTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#acbf55cf38b8c0e0efb2d3b37e2ce5da7',1,'openvdb::v3_2_0::tree::LeafNode::writeTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a72d547afeb73396804509f85ec7043e7',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::writeTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a72d547afeb73396804509f85ec7043e7',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::writeTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a06f55fa18912a20bc669cc8ac4c31ec1',1,'openvdb::v3_2_0::tree::RootNode::writeTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#ac92c39ad78296431214e6261846cebee',1,'openvdb::v3_2_0::tree::TreeBase::writeTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ac92c39ad78296431214e6261846cebee',1,'openvdb::v3_2_0::tree::Tree::writeTopology()']]], + ['writetransform',['writeTransform',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ab205ec138e048f84198f5e6dc1b9a74d',1,'openvdb::v3_2_0::GridBase']]], + ['writevalue',['writeValue',['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a5dc2537ba398d0f29d73870705353c34',1,'openvdb::v3_2_0::Metadata::writeValue()'],['../classopenvdb_1_1v3__2__0_1_1UnknownMetadata.html#a7e6fe3a832a785321c7c3b4320244e3c',1,'openvdb::v3_2_0::UnknownMetadata::writeValue()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a860a61f24d20e4270f8672aed316d1e0',1,'openvdb::v3_2_0::TypedMetadata::writeValue()']]], + ['wssample',['wsSample',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#aa1658d1eed2cb276fc3a8c829ee7df81',1,'openvdb::v3_2_0::tools::GridSampler::wsSample()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html#aa1658d1eed2cb276fc3a8c829ee7df81',1,'openvdb::v3_2_0::tools::GridSampler< tree::ValueAccessor< TreeT >, SamplerType >::wsSample()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_19.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_19.html new file mode 100644 index 00000000..341c85ed --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_19.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_19.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_19.js new file mode 100644 index 00000000..1622100e --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_19.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['x',['x',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1LinearOp.html#ab9f2b95fd91746a7f5b8d8ad736e0d16',1,'openvdb::v3_2_0::math::pcg::internal::LinearOp::x()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband_1_1Fragment.html#a73795e333468c9f6a9699b7d4a0a36f1',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::Fragment::x()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#ac44bfe62bd5c7e83ba2cf8c5e32dcdf3',1,'openvdb::v3_2_0::math::Coord::x() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#ab7d7264e282b5226e850b95335da509c',1,'openvdb::v3_2_0::math::Coord::x()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#af59136c0fb2c6ccc665bbc1c1f19a751',1,'openvdb::v3_2_0::math::Quat::x()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#afb5cd37bb08f1029691590372e6330f0',1,'openvdb::v3_2_0::math::Quat::x() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#af59136c0fb2c6ccc665bbc1c1f19a751',1,'openvdb::v3_2_0::math::Vec2::x()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#afb5cd37bb08f1029691590372e6330f0',1,'openvdb::v3_2_0::math::Vec2::x() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#af59136c0fb2c6ccc665bbc1c1f19a751',1,'openvdb::v3_2_0::math::Vec3::x()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#afb5cd37bb08f1029691590372e6330f0',1,'openvdb::v3_2_0::math::Vec3::x() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#af59136c0fb2c6ccc665bbc1c1f19a751',1,'openvdb::v3_2_0::math::Vec4::x()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#afb5cd37bb08f1029691590372e6330f0',1,'openvdb::v3_2_0::math::Vec4::x() const ']]], + ['x_5faxis',['X_AXIS',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SweepExteriorSign.html#ae3996976d8ffb3e58d88f58227473f8ea93ed1386222f87948b972889ad82cd33',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SweepExteriorSign::X_AXIS()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae3996976d8ffb3e58d88f58227473f8ea93ed1386222f87948b972889ad82cd33',1,'openvdb::v3_2_0::math::X_AXIS()']]], + ['xedge',['XEDGE',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a0341d081395407fd92061819ba76eb96af72c109e6eab4311581c088211f39127',1,'openvdb::v3_2_0::tools::internal']]], + ['xstride',['xStride',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutZYX_01_4.html#a53d1f076272a373de5790b5be1d98935',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutZYX >::xStride()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutXYZ_01_4.html#ab6b9332a8fa6cc4215313655101a9c69',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutXYZ >::xStride()']]], + ['xyz',['xyz',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#aea931b33d24203984c9afb166d9077ce',1,'openvdb::v3_2_0::tools::MultiResGrid::xyz(const Coord &in_ijk, size_t in_level, size_t out_level)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#aadec32d96253c5bb18d5a04a63a5913a',1,'openvdb::v3_2_0::tools::MultiResGrid::xyz(const Vec3R &in_xyz, size_t in_level, size_t out_level)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a40f02852584cdd5b87f1e02f648646d9',1,'openvdb::v3_2_0::tools::MultiResGrid::xyz(const Vec3R &in_xyz, double in_level, double out_level)']]], + ['xyz_5frotation',['XYZ_ROTATION',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af3d74c777e523f2725cdf87c15a4b5bca7f81155656307a44e79263603809ef36',1,'openvdb::v3_2_0::math']]], + ['xzx_5frotation',['XZX_ROTATION',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af3d74c777e523f2725cdf87c15a4b5bca717ae584f16837c35a3a783354641b98',1,'openvdb::v3_2_0::math']]], + ['xzy_5frotation',['XZY_ROTATION',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af3d74c777e523f2725cdf87c15a4b5bcadb575a82763a65e7b9ab5d4a9ec0b448',1,'openvdb::v3_2_0::math']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_1a.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_1a.html new file mode 100644 index 00000000..e21dac5e --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_1a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_1a.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_1a.js new file mode 100644 index 00000000..3de9126e --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_1a.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['y',['y',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1LinearOp.html#a7f08e2f399bb9a8d9888eaed97d8e218',1,'openvdb::v3_2_0::math::pcg::internal::LinearOp::y()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband_1_1Fragment.html#a240bd7293d6bf140375a9d7d2567938c',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::Fragment::y()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#aa13f1458e75fbfe9f6d72d918cb83ea6',1,'openvdb::v3_2_0::math::Coord::y() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a2ed6c95e8ae6c0fd7580be42ddd68ff4',1,'openvdb::v3_2_0::math::Coord::y()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a67e4fec98374cd34f20fd6896c8760d0',1,'openvdb::v3_2_0::math::Quat::y()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a691c9cb93365c2e33f3429de43244098',1,'openvdb::v3_2_0::math::Quat::y() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a67e4fec98374cd34f20fd6896c8760d0',1,'openvdb::v3_2_0::math::Vec2::y()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a691c9cb93365c2e33f3429de43244098',1,'openvdb::v3_2_0::math::Vec2::y() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a67e4fec98374cd34f20fd6896c8760d0',1,'openvdb::v3_2_0::math::Vec3::y()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a691c9cb93365c2e33f3429de43244098',1,'openvdb::v3_2_0::math::Vec3::y() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a67e4fec98374cd34f20fd6896c8760d0',1,'openvdb::v3_2_0::math::Vec4::y()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a691c9cb93365c2e33f3429de43244098',1,'openvdb::v3_2_0::math::Vec4::y() const ']]], + ['y_5faxis',['Y_AXIS',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SweepExteriorSign.html#ae3996976d8ffb3e58d88f58227473f8eaa1ec9649c0a631b27ad7280af3522dd0',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SweepExteriorSign::Y_AXIS()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae3996976d8ffb3e58d88f58227473f8eaa1ec9649c0a631b27ad7280af3522dd0',1,'openvdb::v3_2_0::math::Y_AXIS()']]], + ['yedge',['YEDGE',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a0341d081395407fd92061819ba76eb96a50370dd4dfe5c0e13eae205ca2b744d3',1,'openvdb::v3_2_0::tools::internal']]], + ['ystride',['yStride',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutZYX_01_4.html#a86f5e0090a3ec6034ff6135fe18cdbcc',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutZYX >::yStride()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutXYZ_01_4.html#a86f5e0090a3ec6034ff6135fe18cdbcc',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutXYZ >::yStride()']]], + ['yxz_5frotation',['YXZ_ROTATION',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af3d74c777e523f2725cdf87c15a4b5bca0eaea09ecf09f49d00685dc12c8b83ff',1,'openvdb::v3_2_0::math']]], + ['yzx_5frotation',['YZX_ROTATION',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af3d74c777e523f2725cdf87c15a4b5bca25e4d01b60a0c3f527a48dda888c50ad',1,'openvdb::v3_2_0::math']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_1b.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_1b.html new file mode 100644 index 00000000..234dc1f1 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_1b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_1b.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_1b.js new file mode 100644 index 00000000..26385d6e --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_1b.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['z',['z',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband_1_1Fragment.html#a236b43e6ea858cfc3256afdebf1f6d31',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::Fragment::z()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a4cac3137ded0d843799eaf8146504379',1,'openvdb::v3_2_0::math::Coord::z() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a50ad079c561c57401f04c49a97e24568',1,'openvdb::v3_2_0::math::Coord::z()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ae2a77ff292fe571f83c83b3eb2561fa6',1,'openvdb::v3_2_0::math::Quat::z()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a336121cb63ed79fa0a072eed03d694ac',1,'openvdb::v3_2_0::math::Quat::z() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ae2a77ff292fe571f83c83b3eb2561fa6',1,'openvdb::v3_2_0::math::Vec3::z()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a336121cb63ed79fa0a072eed03d694ac',1,'openvdb::v3_2_0::math::Vec3::z() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#ae2a77ff292fe571f83c83b3eb2561fa6',1,'openvdb::v3_2_0::math::Vec4::z()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a336121cb63ed79fa0a072eed03d694ac',1,'openvdb::v3_2_0::math::Vec4::z() const ']]], + ['z_5faxis',['Z_AXIS',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SweepExteriorSign.html#ae3996976d8ffb3e58d88f58227473f8ea4b8a53bafca6b43388660925049d734f',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SweepExteriorSign::Z_AXIS()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae3996976d8ffb3e58d88f58227473f8ea4b8a53bafca6b43388660925049d734f',1,'openvdb::v3_2_0::math::Z_AXIS()']]], + ['zedge',['ZEDGE',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a0341d081395407fd92061819ba76eb96a4d83a8d3c1f5ec743de364a5dfc7bff1',1,'openvdb::v3_2_0::tools::internal']]], + ['zero',['zero',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a4be7ea5f6bddc580907b586df9b5c550',1,'openvdb::v3_2_0::math::Mat3::zero()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a860a0abbff4a4a673c9c708f6fd2b49d',1,'openvdb::v3_2_0::math::Mat4::zero()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#af27a503fcdc1b13ced14334239e80604',1,'openvdb::v3_2_0::math::Quat::zero()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ae0ff2e10596aca8cd240ab4790bd445f',1,'openvdb::v3_2_0::math::Vec2::zero()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a1a4eed83d1eca7e9dfccab6d32e5a17d',1,'openvdb::v3_2_0::math::Vec3::zero()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a3f7515e113f138d07d6339bf24298cf1',1,'openvdb::v3_2_0::math::Vec4::zero()']]], + ['zerocrossing',['zeroCrossing',['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#a0280818ad82666d1a61e4d1eb97909f5',1,'openvdb::v3_2_0::math::GradStencil::zeroCrossing()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html#a0280818ad82666d1a61e4d1eb97909f5',1,'openvdb::v3_2_0::math::WenoStencil::zeroCrossing()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ad36ba1c65fdfa8296ef6a4bc2529e786',1,'openvdb::v3_2_0::math::ZeroCrossing()']]], + ['zeroval',['zeroVal',['../namespaceopenvdb_1_1v3__2__0.html#a0abd143fcf96e54df6e7cc16d46e6685',1,'openvdb::v3_2_0']]], + ['zeroval_3c_20bool_20_3e',['zeroVal< bool >',['../namespaceopenvdb_1_1v3__2__0.html#ae4715877ace39f491921d2412457b3e0',1,'openvdb::v3_2_0']]], + ['zeroval_3c_20math_3a_3amat4d_20_3e',['zeroVal< math::Mat4d >',['../namespaceopenvdb_1_1v3__2__0.html#ab75dacd22e55a4b781bfbdeafdb7d541',1,'openvdb::v3_2_0']]], + ['zeroval_3c_20math_3a_3amat4s_20_3e',['zeroVal< math::Mat4s >',['../namespaceopenvdb_1_1v3__2__0.html#a77a8435189ef23bc884739e47caa5d1a',1,'openvdb::v3_2_0']]], + ['zeroval_3c_20std_3a_3astring_20_3e',['zeroVal< std::string >',['../namespaceopenvdb_1_1v3__2__0.html#a5200b545e2e50a9ba3d2a5253ce7fc7b',1,'openvdb::v3_2_0']]], + ['ziptostream',['zipToStream',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a6a0e63b4ca2ad9c1bf154b645cfff3f5',1,'openvdb::v3_2_0::io']]], + ['zstride',['zStride',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutZYX_01_4.html#a9ea37fee356b1ab8767b2cccb3d7ed7b',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutZYX >::zStride()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutXYZ_01_4.html#aa78a2ed40c1175d2ef8697edb1a886ae',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutXYZ >::zStride()']]], + ['zxy_5frotation',['ZXY_ROTATION',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af3d74c777e523f2725cdf87c15a4b5bca11062dd0c396c0e74304df2c4d5ea00d',1,'openvdb::v3_2_0::math']]], + ['zxz_5frotation',['ZXZ_ROTATION',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af3d74c777e523f2725cdf87c15a4b5bca67a853e89509c1e7084abb4962b18c19',1,'openvdb::v3_2_0::math']]], + ['zyx_5frotation',['ZYX_ROTATION',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af3d74c777e523f2725cdf87c15a4b5bcacac30c3482d3daccfc781831f47e9271',1,'openvdb::v3_2_0::math']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_1c.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_1c.html new file mode 100644 index 00000000..394b48b3 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_1c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_1c.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_1c.js new file mode 100644 index 00000000..b358b81c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_1c.js @@ -0,0 +1,84 @@ +var searchData= +[ + ['_7eaffinemap',['~AffineMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#aa89492a16ea8e282b9955cf1a1a38b3c',1,'openvdb::v3_2_0::math::AffineMap']]], + ['_7earchive',['~Archive',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#afa55d55a880c160fe67b8a81f4ca7c9d',1,'openvdb::v3_2_0::io::Archive']]], + ['_7ebasecamera',['~BaseCamera',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#a4460cc166f3b10ddfb1bc558469f5b6b',1,'openvdb::v3_2_0::tools::BaseCamera']]], + ['_7ebaseshader',['~BaseShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseShader.html#ab8f63136d12f7c4f01d8621897418456',1,'openvdb::v3_2_0::tools::BaseShader']]], + ['_7ebuffer',['~Buffer',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#ac72b418d40e29411ac044a49a20be750',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::~Buffer()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#ac72b418d40e29411ac044a49a20be750',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::~Buffer()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#ac72b418d40e29411ac044a49a20be750',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::~Buffer()']]], + ['_7econstrainedpointadvect',['~ConstrainedPointAdvect',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#afbee7a97e5ed49fbbac0ff1c0ce729b3',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect']]], + ['_7ecopyableoptransformer',['~CopyableOpTransformer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpTransformer.html#a47135062b0d7ba3b10f80c4e668238dc',1,'openvdb::v3_2_0::tools::valxform::CopyableOpTransformer']]], + ['_7ediffuseshader',['~DiffuseShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiffuseShader.html#a6735c82d3211c49da880c688e026d0f2',1,'openvdb::v3_2_0::tools::DiffuseShader::~DiffuseShader()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiffuseShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#a6735c82d3211c49da880c688e026d0f2',1,'openvdb::v3_2_0::tools::DiffuseShader< Film::RGBA, SamplerType >::~DiffuseShader()']]], + ['_7eexception',['~Exception',['../classopenvdb_1_1v3__2__0_1_1Exception.html#ae55b5e05d3195ae27204e3a2395e54e7',1,'openvdb::v3_2_0::Exception']]], + ['_7efile',['~File',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a5fa8852e1112fd17b8c6b9992a5fc374',1,'openvdb::v3_2_0::io::File']]], + ['_7egenericmap',['~GenericMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#ac0232c9d6541ed0120d60b7082021a30',1,'openvdb::v3_2_0::math::GenericMap']]], + ['_7egrid',['~Grid',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a302cf0f47984f1e8b3e9d7e2ec87db44',1,'openvdb::v3_2_0::Grid']]], + ['_7egridbase',['~GridBase',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ac3c3b386c234baee4536141adac5c992',1,'openvdb::v3_2_0::GridBase']]], + ['_7egriddescriptor',['~GridDescriptor',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a53fa15f916836cac825ab909458d3d1e',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['_7egridoperator',['~GridOperator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html#a0fb1483171c9df33bd3e6fc5babb8414',1,'openvdb::v3_2_0::tools::gridop::GridOperator']]], + ['_7egridresampler',['~GridResampler',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html#ad6e697e3576464049ce6fe9650560e11',1,'openvdb::v3_2_0::tools::GridResampler']]], + ['_7egridtransformer',['~GridTransformer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer.html#a13aae9eae5f34daa56b1a3e13ad203c1',1,'openvdb::v3_2_0::tools::GridTransformer']]], + ['_7eincompletecholeskypreconditioner',['~IncompleteCholeskyPreconditioner',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#ae659e30035614a2e536afb7e7efce56b',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner']]], + ['_7einternalnode',['~InternalNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a3ebfad50db33120e5f5827022c035166',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['_7ejacobipreconditioner',['~JacobiPreconditioner',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1JacobiPreconditioner.html#a0611b7e7846b5aff0e65e69d77f3910d',1,'openvdb::v3_2_0::math::pcg::JacobiPreconditioner']]], + ['_7eleafcache',['~LeafCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#a9f83055f2e0c777f93c806598a4aae08',1,'openvdb::v3_2_0::tools::Morphology::LeafCache']]], + ['_7eleafmanager',['~LeafManager',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#ab6cf0834071b7e72d380c44105839ca7',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['_7eleafnode',['~LeafNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a4497864cfd7a697b34d2261d9d799a54',1,'openvdb::v3_2_0::tree::LeafNode::~LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a4497864cfd7a697b34d2261d9d799a54',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::~LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a4497864cfd7a697b34d2261d9d799a54',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::~LeafNode()']]], + ['_7elegacyfrustum',['~LegacyFrustum',['../classopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1LegacyFrustum.html#aadb4fea5da469654c1d6efc53f415781',1,'openvdb::v3_2_0::math::internal::LegacyFrustum']]], + ['_7elevelsetadvection',['~LevelSetAdvection',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#ac994c7f13ab5b3013ecd61fc41f5c8d7',1,'openvdb::v3_2_0::tools::LevelSetAdvection']]], + ['_7elevelsetfilter',['~LevelSetFilter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a295dc79bd568e7fd1113bd9b9c0bca4b',1,'openvdb::v3_2_0::tools::LevelSetFilter']]], + ['_7elevelsetmeasure',['~LevelSetMeasure',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#a155052b533640590ff95924125ce5ad8',1,'openvdb::v3_2_0::tools::LevelSetMeasure']]], + ['_7elevelsetmorphing',['~LevelSetMorphing',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#af74c98d91db3566c6cd51eaa3b1e1d8a',1,'openvdb::v3_2_0::tools::LevelSetMorphing']]], + ['_7elevelsetraytracer',['~LevelSetRayTracer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#ad386975df3471b39b76ee6d7c94cb50d',1,'openvdb::v3_2_0::tools::LevelSetRayTracer']]], + ['_7elevelsettracker',['~LevelSetTracker',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#af58f63bd92ee8e19e3ba4d86cc287085',1,'openvdb::v3_2_0::tools::LevelSetTracker']]], + ['_7emapbase',['~MapBase',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a15b349f5e3c9ac96c70e35278319dc1e',1,'openvdb::v3_2_0::math::MapBase']]], + ['_7emappedfile',['~MappedFile',['../classopenvdb_1_1v3__2__0_1_1io_1_1MappedFile.html#a4b4387b4fbeafcbed9817f839c573738',1,'openvdb::v3_2_0::io::MappedFile']]], + ['_7ematteshader',['~MatteShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MatteShader.html#a5173fba6f95d3f768b0d1099de1546b4',1,'openvdb::v3_2_0::tools::MatteShader::~MatteShader()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MatteShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#a5173fba6f95d3f768b0d1099de1546b4',1,'openvdb::v3_2_0::tools::MatteShader< Film::RGBA, SamplerType >::~MatteShader()']]], + ['_7emetadata',['~Metadata',['../classopenvdb_1_1v3__2__0_1_1Metadata.html#af61a7c8a3ec6abd3ce30fabcec90dade',1,'openvdb::v3_2_0::Metadata']]], + ['_7emetamap',['~MetaMap',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#ae9600bcc7b8da8bd4051358f611c6195',1,'openvdb::v3_2_0::MetaMap']]], + ['_7emorphology',['~Morphology',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#aaa04eab6b75ce397b27956de7df39e28',1,'openvdb::v3_2_0::tools::Morphology']]], + ['_7enameiterator',['~NameIterator',['../classopenvdb_1_1v3__2__0_1_1io_1_1File_1_1NameIterator.html#a307860012d52e2ea5b66c24b4de73215',1,'openvdb::v3_2_0::io::File::NameIterator']]], + ['_7enodemanager',['~NodeManager',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#acb9562d2c86ca3eab311dc8735331b63',1,'openvdb::v3_2_0::tree::NodeManager::~NodeManager()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#acb9562d2c86ca3eab311dc8735331b63',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::~NodeManager()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#acb9562d2c86ca3eab311dc8735331b63',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::~NodeManager()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#acb9562d2c86ca3eab311dc8735331b63',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::~NodeManager()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#acb9562d2c86ca3eab311dc8735331b63',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::~NodeManager()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#acb9562d2c86ca3eab311dc8735331b63',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::~NodeManager()']]], + ['_7enodemanagerlink',['~NodeManagerLink',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#a2e1d0d15fe4a58850a324a766fb1a204',1,'openvdb::v3_2_0::tree::NodeManagerLink::~NodeManagerLink()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#a2e1d0d15fe4a58850a324a766fb1a204',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::~NodeManagerLink()']]], + ['_7enodemask',['~NodeMask',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#af38fe93ab1c08a06a37eadd3b385644c',1,'openvdb::v3_2_0::util::NodeMask::~NodeMask()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#af38fe93ab1c08a06a37eadd3b385644c',1,'openvdb::v3_2_0::util::NodeMask< 1 >::~NodeMask()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#af38fe93ab1c08a06a37eadd3b385644c',1,'openvdb::v3_2_0::util::NodeMask< 2 >::~NodeMask()']]], + ['_7enodeunionimpl',['~NodeUnionImpl',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01true_00_01ValueT_00_01ChildT_01_4.html#ad0ef0dbe73512c09919e84dabb6eedc6',1,'openvdb::v3_2_0::tree::NodeUnionImpl< true, ValueT, ChildT >']]], + ['_7enonlinearfrustummap',['~NonlinearFrustumMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#ae17ba0e52e8cc3c10f4904a3b927a750',1,'openvdb::v3_2_0::math::NonlinearFrustumMap']]], + ['_7enormalshader',['~NormalShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1NormalShader.html#a6e5a21f259189b4d27383024f70ec83c',1,'openvdb::v3_2_0::tools::NormalShader::~NormalShader()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1NormalShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#a6e5a21f259189b4d27383024f70ec83c',1,'openvdb::v3_2_0::tools::NormalShader< Film::RGBA, SamplerType >::~NormalShader()']]], + ['_7eopaccumulator',['~OpAccumulator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1OpAccumulator.html#a90447b3d23c2697ce13b521fcddf30f2',1,'openvdb::v3_2_0::tools::valxform::OpAccumulator']]], + ['_7eorthographiccamera',['~OrthographicCamera',['../classopenvdb_1_1v3__2__0_1_1tools_1_1OrthographicCamera.html#a4a344fc67010fa82b4ef3e6f5a77dbc7',1,'openvdb::v3_2_0::tools::OrthographicCamera']]], + ['_7epage',['~Page',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html#a4bcfc94c1fd67c937b605ab3abd7d399',1,'openvdb::v3_2_0::util::PagedArray::Page']]], + ['_7epagedarray',['~PagedArray',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#aa6d53e13fd82dcd47d234226100469da',1,'openvdb::v3_2_0::util::PagedArray']]], + ['_7eparticlestolevelset',['~ParticlesToLevelSet',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a3a568687e02aacd5edd36c278300e3c5',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['_7eperspectivecamera',['~PerspectiveCamera',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PerspectiveCamera.html#a975e2662bfa77e0279d98903330dab37',1,'openvdb::v3_2_0::tools::PerspectiveCamera']]], + ['_7epointadvect',['~PointAdvect',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#a465034bca491f578baa9ad57ca2c6e02',1,'openvdb::v3_2_0::tools::PointAdvect']]], + ['_7epositionshader',['~PositionShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PositionShader.html#a7b941af3b5cdbd40fa23ebf520466df8',1,'openvdb::v3_2_0::tools::PositionShader::~PositionShader()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PositionShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#a7b941af3b5cdbd40fa23ebf520466df8',1,'openvdb::v3_2_0::tools::PositionShader< Film::RGBA, SamplerType >::~PositionShader()']]], + ['_7epreconditioner',['~Preconditioner',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Preconditioner.html#a8c92b9c736af03390d379e4490c1edac',1,'openvdb::v3_2_0::math::pcg::Preconditioner']]], + ['_7equeue',['~Queue',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a240bdcfcc136e53aeaac3aa454cc26bf',1,'openvdb::v3_2_0::io::Queue']]], + ['_7ereducepool',['~ReducePool',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid_1_1ReducePool.html#a24be0f7fa46edb932e9f40b291636bc7',1,'openvdb::v3_2_0::tools::PointMaskGrid::ReducePool']]], + ['_7erootnode',['~RootNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#aaf38ff0107dcb0e50c0f4e5783146459',1,'openvdb::v3_2_0::tree::RootNode']]], + ['_7erootnodemask',['~RootNodeMask',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a03ef8207639f557340c752f161d607bd',1,'openvdb::v3_2_0::util::RootNodeMask']]], + ['_7escalemap',['~ScaleMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#adaf0658fac757a472ddf189fc226c309',1,'openvdb::v3_2_0::math::ScaleMap']]], + ['_7escaletranslatemap',['~ScaleTranslateMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a762d14391f182d80b2f4fc00668c30c4',1,'openvdb::v3_2_0::math::ScaleTranslateMap']]], + ['_7esharedoptransformer',['~SharedOpTransformer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpTransformer.html#a91779fbb2fa43ea9d50a98ef57e915cf',1,'openvdb::v3_2_0::tools::valxform::SharedOpTransformer']]], + ['_7estream',['~Stream',['../classopenvdb_1_1v3__2__0_1_1io_1_1Stream.html#a15237b41305f4268e1576c81766cd6d9',1,'openvdb::v3_2_0::io::Stream']]], + ['_7estreammetadata',['~StreamMetadata',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a3fa3737897f294215d28b107691f22e3',1,'openvdb::v3_2_0::io::StreamMetadata']]], + ['_7etempfile',['~TempFile',['../classopenvdb_1_1v3__2__0_1_1io_1_1TempFile.html#a6539eb6d4bd819220c79aa5c4e88feba',1,'openvdb::v3_2_0::io::TempFile']]], + ['_7etransform',['~Transform',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a8e627263611a76aad02c9e0b89287c68',1,'openvdb::v3_2_0::math::Transform']]], + ['_7etranslationmap',['~TranslationMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a5ff87bc5f2f4ba645cd18309232585da',1,'openvdb::v3_2_0::math::TranslationMap']]], + ['_7etree',['~Tree',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a77309a39ab4a963544624a7582801767',1,'openvdb::v3_2_0::tree::Tree']]], + ['_7etreebase',['~TreeBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a39a3581bca8623f5876a45638314ef95',1,'openvdb::v3_2_0::tree::TreeBase']]], + ['_7etypedmetadata',['~TypedMetadata',['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a35ef73f18df1419f16de3b79996ae10c',1,'openvdb::v3_2_0::TypedMetadata']]], + ['_7euniformscalemap',['~UniformScaleMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#af0c8d18bd4d8d1800c249176b8cf08b5',1,'openvdb::v3_2_0::math::UniformScaleMap']]], + ['_7euniformscaletranslatemap',['~UniformScaleTranslateMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#aee6f4e9945ac8c920767740566d1a0ae',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap']]], + ['_7eunitarymap',['~UnitaryMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a4a6c3ecb2aa14cc284b124576d5c3738',1,'openvdb::v3_2_0::math::UnitaryMap']]], + ['_7eunknownmetadata',['~UnknownMetadata',['../classopenvdb_1_1v3__2__0_1_1UnknownMetadata.html#a3d029c5dacb595e58f84c04811d82060',1,'openvdb::v3_2_0::UnknownMetadata']]], + ['_7evalueaccessor',['~ValueAccessor',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a664e90759224eb0ac1b3591dc97283fe',1,'openvdb::v3_2_0::tree::ValueAccessor::~ValueAccessor()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_010_00_01tbb_1_1null__mutex_01_4.html#a664e90759224eb0ac1b3591dc97283fe',1,'openvdb::v3_2_0::tree::ValueAccessor< TreeType, IsSafe, 0, tbb::null_mutex >::~ValueAccessor()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_011_00_01tbb_1_1null__mutex_01_4.html#a664e90759224eb0ac1b3591dc97283fe',1,'openvdb::v3_2_0::tree::ValueAccessor< TreeType, IsSafe, 1, tbb::null_mutex >::~ValueAccessor()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_012_00_01tbb_1_1null__mutex_01_4.html#a664e90759224eb0ac1b3591dc97283fe',1,'openvdb::v3_2_0::tree::ValueAccessor< TreeType, IsSafe, 2, tbb::null_mutex >::~ValueAccessor()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_013_00_01tbb_1_1null__mutex_01_4.html#a664e90759224eb0ac1b3591dc97283fe',1,'openvdb::v3_2_0::tree::ValueAccessor< TreeType, IsSafe, 3, tbb::null_mutex >::~ValueAccessor()']]], + ['_7evalueaccessor0',['~ValueAccessor0',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a39795988fd2f2509801aea774b48cb16',1,'openvdb::v3_2_0::tree::ValueAccessor0']]], + ['_7evalueaccessor1',['~ValueAccessor1',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a0936df9a4345cb57468c66238543139e',1,'openvdb::v3_2_0::tree::ValueAccessor1']]], + ['_7evalueaccessor2',['~ValueAccessor2',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a2c35d6e5cffacab11fed4e2ee8198796',1,'openvdb::v3_2_0::tree::ValueAccessor2']]], + ['_7evalueaccessor3',['~ValueAccessor3',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a9a4f87435b1060d8842df5773e2b90f4',1,'openvdb::v3_2_0::tree::ValueAccessor3']]], + ['_7evalueaccessorbase',['~ValueAccessorBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html#a53dd0929b984e8ffe91f68cd064904ff',1,'openvdb::v3_2_0::tree::ValueAccessorBase']]], + ['_7evaluebuffer',['~ValueBuffer',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ValueBuffer.html#a562788b9e5a081682503d6316ab02a5d',1,'openvdb::v3_2_0::util::PagedArray::ValueBuffer']]], + ['_7evector',['~Vector',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#aaa9fccd0cb7734271f7a15e5d9dc0d27',1,'openvdb::v3_2_0::math::pcg::Vector']]], + ['_7evolumeadvection',['~VolumeAdvection',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#a05625a48b1c8ab4a3216dfed956662b8',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['_7evolumerayintersector',['~VolumeRayIntersector',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a174268e7ab5ce98b0a22def0367bd1b6',1,'openvdb::v3_2_0::tools::VolumeRayIntersector']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_2.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_2.html new file mode 100644 index 00000000..2c23ed46 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_2.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_2.js new file mode 100644 index 00000000..dee56ec4 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_2.js @@ -0,0 +1,102 @@ +var searchData= +[ + ['a',['A',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyDifference_1_1A.html',1,'openvdb::v3_2_0::tree::InternalNode::TopologyDifference']]], + ['a',['A',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyUnion_1_1A.html',1,'openvdb::v3_2_0::tree::InternalNode::TopologyUnion']]], + ['a',['a',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1LinearOp.html#ae85d3e47bd936aeb234df3aa289ced21',1,'openvdb::v3_2_0::math::pcg::internal::LinearOp::a()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1DeterministicDotProductOp.html#a6f537013471eb17409fa5b460d94314a',1,'openvdb::v3_2_0::math::pcg::Vector::DeterministicDotProductOp::a()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#a3171b3ba3c059121ba36d93808b227ef',1,'openvdb::v3_2_0::tools::Film::RGBA::a()'],['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#aaabacc3fc82b651038d593e5bcf97102',1,'openvdb::v3_2_0::CombineArgs::a()']]], + ['a',['A',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyIntersection_1_1A.html',1,'openvdb::v3_2_0::tree::InternalNode::TopologyIntersection']]], + ['abs',['Abs',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#add0a8870b21e4d76dc131ba518963a6c',1,'openvdb::v3_2_0::math::Abs(int32_t i)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aaceb949c461d51293392b33a33e743bd',1,'openvdb::v3_2_0::math::Abs(int64_t i)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ad9d14bd55823c95f6ec3fb1b471c266f',1,'openvdb::v3_2_0::math::Abs(float x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a956d5c21788792ee5a4248e602608fc3',1,'openvdb::v3_2_0::math::Abs(double x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a80969730072f008b1a73062e1165990f',1,'openvdb::v3_2_0::math::Abs(long double x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a46212ee543d6065ea6b347e21753ae50',1,'openvdb::v3_2_0::math::Abs(uint32_t i)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a6543714c6cb7aa94ef152954e8d2784c',1,'openvdb::v3_2_0::math::Abs(uint64_t i)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a92dff11a9a021cd722581a910a9bb6de',1,'openvdb::v3_2_0::math::Abs(bool b)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a376f86da345cf45095b60a03436d5e9d',1,'openvdb::v3_2_0::math::Abs(const Tuple< SIZE, T > &t)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a176a6cdb7f6fac4a134003cfcc7ce61c',1,'openvdb::v3_2_0::math::Abs(const Vec2< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a329a8aa45d424d285103280abfd2a355',1,'openvdb::v3_2_0::math::Abs(const Vec3< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ac7b7fcbd8677d80eb09d1f692762a77c',1,'openvdb::v3_2_0::math::Abs(const Vec4< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a3b47b11a85883783af42640ac8cde30d',1,'openvdb::v3_2_0::tools::Abs()']]], + ['absoluteerror',['absoluteError',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1State.html#a07606f9b03cabe60801fc2684ce897b8',1,'openvdb::v3_2_0::math::pcg::State']]], + ['absval',['absVal',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMagnitude.html#a0cef15facea8711b1d27396a09f202d3',1,'openvdb::v3_2_0::tools::CheckMagnitude']]], + ['abtransform',['ABTransform',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ABTransform.html',1,'openvdb::v3_2_0::tools']]], + ['abtransform',['ABTransform',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ABTransform.html#a263530b0df156dd0ceb411ad791f9133',1,'openvdb::v3_2_0::tools::ABTransform']]], + ['acc',['acc',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#a1ef2162c81dc225a01574be904c7c7b1',1,'openvdb::v3_2_0::tools::CheckNormGrad::acc()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#a1ef2162c81dc225a01574be904c7c7b1',1,'openvdb::v3_2_0::tools::CheckDivergence::acc()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter_1_1Filter_1_1Avg.html#a63ed1e6d36ddd8529aea18eb6e31dd4e',1,'openvdb::v3_2_0::tools::LevelSetFilter::Filter::Avg::acc()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#a3326e011578fd3070c7a33635e21ea6f',1,'openvdb::v3_2_0::tools::Morphology::LeafCache::acc()']]], + ['accessor',['Accessor',['../classopenvdb_1_1v3__2__0_1_1Grid.html#afb00204092e1421d7df4f2c9e811be45',1,'openvdb::v3_2_0::Grid::Accessor()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData.html#a13920213a898b6cbba09a28d456fe93a',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::Accessor()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a494447ba52ccbd63f7ae51c9a229f384',1,'openvdb::v3_2_0::math::BaseStencil::accessor()']]], + ['accessorregistry',['AccessorRegistry',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a7d72c24105ed661d000bcead8c855fb9',1,'openvdb::v3_2_0::tree::Tree']]], + ['accessort',['AccessorT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyFromDense.html#af0ff2ef806ba601bc777cb4df5c9c744',1,'openvdb::v3_2_0::tools::CopyFromDense::AccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html#ad02a69ae957d31b24a4777cb29c955fe',1,'openvdb::v3_2_0::tools::gridop::GridOperator::AccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#ad3fe55e73c82f301017d7517bf8c4e06',1,'openvdb::v3_2_0::tools::LinearSearchImpl::AccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#a893d40d378311def8014d93caff818c7',1,'openvdb::v3_2_0::tools::internal::SignData::AccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPoints.html#a893d40d378311def8014d93caff818c7',1,'openvdb::v3_2_0::tools::internal::GenPoints::AccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SeamWeights.html#a893d40d378311def8014d93caff818c7',1,'openvdb::v3_2_0::tools::internal::SeamWeights::AccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#a893d40d378311def8014d93caff818c7',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions::AccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TagSeamEdges.html#a893d40d378311def8014d93caff818c7',1,'openvdb::v3_2_0::tools::internal::TagSeamEdges::AccessorT()']]], + ['accessortype',['AccessorType',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a1d0440c25c46f78ae6182fdf60b67c20',1,'openvdb::v3_2_0::TreeAdapter::AccessorType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a1d0440c25c46f78ae6182fdf60b67c20',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::AccessorType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a1d0440c25c46f78ae6182fdf60b67c20',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::AccessorType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#abe280da7072440c8fb03d73741169995',1,'openvdb::v3_2_0::math::BaseStencil::AccessorType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#a9a7828e73f5f1d8e60a97e29464c4026',1,'openvdb::v3_2_0::tools::GridSampler::AccessorType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html#ab2a81953bec5ec02e6cc62c8ec9e4050',1,'openvdb::v3_2_0::tools::GridSampler< tree::ValueAccessor< TreeT >, SamplerType >::AccessorType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler.html#a940f86ae6fe4c2e8976f80c73c1f78a9',1,'openvdb::v3_2_0::tools::DualGridSampler::AccessorType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerT_01_4.html#ab2a81953bec5ec02e6cc62c8ec9e4050',1,'openvdb::v3_2_0::tools::DualGridSampler< tree::ValueAccessor< TreeT >, SamplerT >::AccessorType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1DiffLeafNodeMask.html#a1d0440c25c46f78ae6182fdf60b67c20',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::DiffLeafNodeMask::AccessorType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a1d0440c25c46f78ae6182fdf60b67c20',1,'openvdb::v3_2_0::tools::Morphology::AccessorType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#a2094bb397f41971860d952e8c98c886c',1,'openvdb::v3_2_0::tools::VolumeRender::AccessorType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocitySampler.html#a8009bd70a6c63777fb8cf4327a6e0a10',1,'openvdb::v3_2_0::tools::VelocitySampler::AccessorType()']]], + ['acct',['AccT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#a160632bafe32f88e8294bd1ec5d82cec',1,'openvdb::v3_2_0::tools::CheckNormGrad::AccT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#a160632bafe32f88e8294bd1ec5d82cec',1,'openvdb::v3_2_0::tools::CheckDivergence::AccT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#aea0b545e85347bf1f6e5be07f1d53361',1,'openvdb::v3_2_0::tools::AlphaMask::AccT()']]], + ['accum',['accum',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1filter__internal.html#af123b35c1342eb5b7e4d80cfcd223a70',1,'openvdb::v3_2_0::tools::filter_internal::accum(T &sum, T addend)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1filter__internal.html#aca39d9fc1bce4e519a725b3a78af6a1b',1,'openvdb::v3_2_0::tools::filter_internal::accum(bool &sum, bool addend)']]], + ['accumpostrotation',['accumPostRotation',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a44e2cf764e7e4076006f211d7cdc98ea',1,'openvdb::v3_2_0::math::AffineMap']]], + ['accumpostscale',['accumPostScale',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#aec270b68a15e59873e14ac35eaee7e9f',1,'openvdb::v3_2_0::math::AffineMap']]], + ['accumpostshear',['accumPostShear',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a171fd3c31c0e600cfdcad94508617bdd',1,'openvdb::v3_2_0::math::AffineMap']]], + ['accumposttranslation',['accumPostTranslation',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#af865952a46662fda4e7863e4070f0391',1,'openvdb::v3_2_0::math::AffineMap']]], + ['accumprerotation',['accumPreRotation',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#acd3f815d849076d661dfda027f4d3950',1,'openvdb::v3_2_0::math::AffineMap']]], + ['accumprescale',['accumPreScale',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#ad9008cf9834852bd5f4911965c72c110',1,'openvdb::v3_2_0::math::AffineMap']]], + ['accumpreshear',['accumPreShear',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a4999140a2ce96cb8c0a2cac5fc17970d',1,'openvdb::v3_2_0::math::AffineMap']]], + ['accumpretranslation',['accumPreTranslation',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#adce40f719509fd5637d417e6ca0411d6',1,'openvdb::v3_2_0::math::AffineMap']]], + ['accumulate',['accumulate',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8e31fdabdae973490731a7be4f31d9ad',1,'openvdb::v3_2_0::tools']]], + ['activate',['activate',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a9fa99ba23890494cdfe09a6d6abdd380',1,'openvdb::v3_2_0::tools']]], + ['activationop',['ActivationOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1activation_1_1ActivationOp.html#a5905c03c6e7f7dfaa0ded0e9aa54d659',1,'openvdb::v3_2_0::tools::activation::ActivationOp']]], + ['activationop',['ActivationOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1activation_1_1ActivationOp.html',1,'openvdb::v3_2_0::tools::activation']]], + ['activeleafvoxelcount',['activeLeafVoxelCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a2e0656e740d6bd176225e3643e1b0907',1,'openvdb::v3_2_0::tree::TreeBase::activeLeafVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ab3a0857d01927ab17bd6bcd74710ef03',1,'openvdb::v3_2_0::tree::Tree::activeLeafVoxelCount()']]], + ['activetilecount',['activeTileCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#ad03bad9124b134c1e8ed50181d6d987d',1,'openvdb::v3_2_0::tree::TreeBase::activeTileCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ac88047fd749080fc90e6b431a55710e9',1,'openvdb::v3_2_0::tree::Tree::activeTileCount()']]], + ['activevoxelcount',['activeVoxelCount',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a8786a38826997396e721f4afc8d3110d',1,'openvdb::v3_2_0::GridBase::activeVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a5a6a7cd039e1524a3b0a91c8e489970d',1,'openvdb::v3_2_0::Grid::activeVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a8786a38826997396e721f4afc8d3110d',1,'openvdb::v3_2_0::tree::TreeBase::activeVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a5a6a7cd039e1524a3b0a91c8e489970d',1,'openvdb::v3_2_0::tree::Tree::activeVoxelCount()']]], + ['adaptiveprimbuilder',['AdaptivePrimBuilder',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1AdaptivePrimBuilder.html#ad62f5319cbe96e9f1a63b7afeb077d78',1,'openvdb::v3_2_0::tools::internal::AdaptivePrimBuilder']]], + ['adaptiveprimbuilder',['AdaptivePrimBuilder',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1AdaptivePrimBuilder.html',1,'openvdb::v3_2_0::tools::internal']]], + ['add',['add',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#af0da97f62fdb2bbb0c39ce14393f037b',1,'openvdb::v3_2_0::math::Quat::add()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MinMax.html#abcf2fd1d24b62ec3767ef51dc5568e44',1,'openvdb::v3_2_0::math::MinMax::add(const ValueType &val, const Less &less=Less())'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MinMax.html#af01eec79a9540badc3894be7060711bc',1,'openvdb::v3_2_0::math::MinMax::add(const MinMax &other, const Less &less=Less())'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#a1c762a4059fc92d21d53c05f268227b1',1,'openvdb::v3_2_0::math::Extrema::add(double val)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#a98ebcbdaa826802091e13f76df470d6c',1,'openvdb::v3_2_0::math::Extrema::add(double val, uint64_t n)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#a28912fb48486d6c279da35bdb4a8b232',1,'openvdb::v3_2_0::math::Extrema::add(const Extrema &other)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#a1c762a4059fc92d21d53c05f268227b1',1,'openvdb::v3_2_0::math::Stats::add(double val)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#a98ebcbdaa826802091e13f76df470d6c',1,'openvdb::v3_2_0::math::Stats::add(double val, uint64_t n)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#a4cc00948fe5c85df221f139ddff9b0ed',1,'openvdb::v3_2_0::math::Stats::add(const Stats &other)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html#a6026b9d887438b5e38ff4e21ac76ca4f',1,'openvdb::v3_2_0::math::Histogram::add(double val, uint64_t n=1)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html#ad0cc72c553cdf6f0c23c4ec293b1265d',1,'openvdb::v3_2_0::math::Histogram::add(const Histogram &other)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a6e470148b197194b92caee59e8576db9',1,'openvdb::v3_2_0::math::Vec2::add()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a60b932a09c739a9a585a8fc990811a4a',1,'openvdb::v3_2_0::math::Vec3::add()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a5dc9ee7517ba680c9c24e1ddd998b267',1,'openvdb::v3_2_0::math::Vec4::add()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PointAccessor.html#aab13def078b829ca071f0d0dd60026b0',1,'openvdb::v3_2_0::tools::internal::PointAccessor::add()']]], + ['addleaf',['addLeaf',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a2e6314d00f2f73157eff39f96cd80622',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a6c20c22e9a994a30c9640cbe1ec982bc',1,'openvdb::v3_2_0::tree::InternalNode::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a771997d8700872c8fc2886886ade76c6',1,'openvdb::v3_2_0::tree::LeafNode::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a771997d8700872c8fc2886886ade76c6',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a771997d8700872c8fc2886886ade76c6',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a6c20c22e9a994a30c9640cbe1ec982bc',1,'openvdb::v3_2_0::tree::RootNode::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a2472aeb0b603a8798850208d147579d9',1,'openvdb::v3_2_0::tree::Tree::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a3506cd540968d3fd0ae16e5b1affde48',1,'openvdb::v3_2_0::tree::ValueAccessor::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a6c20c22e9a994a30c9640cbe1ec982bc',1,'openvdb::v3_2_0::tree::CacheItem::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a6c20c22e9a994a30c9640cbe1ec982bc',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a3506cd540968d3fd0ae16e5b1affde48',1,'openvdb::v3_2_0::tree::ValueAccessor0::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a3506cd540968d3fd0ae16e5b1affde48',1,'openvdb::v3_2_0::tree::ValueAccessor1::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a3506cd540968d3fd0ae16e5b1affde48',1,'openvdb::v3_2_0::tree::ValueAccessor2::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a3506cd540968d3fd0ae16e5b1affde48',1,'openvdb::v3_2_0::tree::ValueAccessor3::addLeaf()']]], + ['addleafandcache',['addLeafAndCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a5a10e2db0297eb563890666df649e2c4',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::addLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a23d57da960fd963ab7a02836ebf005b5',1,'openvdb::v3_2_0::tree::InternalNode::addLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ae07c8f1c226898790e697735169633db',1,'openvdb::v3_2_0::tree::LeafNode::addLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ae07c8f1c226898790e697735169633db',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::addLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ae07c8f1c226898790e697735169633db',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::addLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a23d57da960fd963ab7a02836ebf005b5',1,'openvdb::v3_2_0::tree::RootNode::addLeafAndCache()']]], + ['addnodes',['AddNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1AddNodes.html#a0e91b3635a6077a61f80b63f0b2c04af',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::AddNodes']]], + ['addnodes',['AddNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1AddNodes.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['addnotifier',['addNotifier',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a6109cbaee51de58b461324dca0b3485a',1,'openvdb::v3_2_0::io::Queue']]], + ['addpoint',['addPoint',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#a035668ca43898744b20d3ce296bb72ca',1,'openvdb::v3_2_0::tools::BasePointScatter::addPoint(const GridT &grid, const Vec3R &dmin)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#a11a8626da965f66cafc6f016c2fc444b',1,'openvdb::v3_2_0::tools::BasePointScatter::addPoint(const GridT &grid, const Vec3R &dmin, const Coord &size)']]], + ['addpoints',['addPoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid.html#a70b349ab6b29506de4ad576cdc601c2f',1,'openvdb::v3_2_0::tools::PointMaskGrid']]], + ['addprim',['addPrim',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UniformPrimBuilder.html#a788d75e72cbacc36cecef799b1264a44',1,'openvdb::v3_2_0::tools::internal::UniformPrimBuilder::addPrim()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1AdaptivePrimBuilder.html#a788d75e72cbacc36cecef799b1264a44',1,'openvdb::v3_2_0::tools::internal::AdaptivePrimBuilder::addPrim()']]], + ['addstatsmetadata',['addStatsMetadata',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a6f6011abaee35f0718424ba281220706',1,'openvdb::v3_2_0::GridBase']]], + ['addsuffix',['addSuffix',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#aea546a4ba51e3b0b14cf094901fc6fa8',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['addtile',['addTile',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a58ab61f904112334f418ea8a1235cdad',1,'openvdb::v3_2_0::tree::InternalNode::addTile(Index level, const Coord &xyz, const ValueType &value, bool state)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#af8dffc25e9449d959c5db02dc17715ee',1,'openvdb::v3_2_0::tree::InternalNode::addTile(Index offset, const ValueType &value, bool state)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a568b9575dfcb86feff1f8380ca957d04',1,'openvdb::v3_2_0::tree::LeafNode::addTile(Index level, const Coord &, const ValueType &, bool)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a05951fc38afd4cc77a9ae662ee1bdff4',1,'openvdb::v3_2_0::tree::LeafNode::addTile(Index offset, const ValueType &, bool)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#adcef824335c6038436e4bff45c70a403',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::addTile(Index level, const Coord &, bool val, bool active)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a1750bee9ad433f067ef215ad23a2a78d',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::addTile(Index offset, bool val, bool active)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#adcef824335c6038436e4bff45c70a403',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::addTile(Index level, const Coord &, bool val, bool active)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a1750bee9ad433f067ef215ad23a2a78d',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::addTile(Index offset, bool val, bool active)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a6fd27c86bf273fa436a0e8c9d41b28af',1,'openvdb::v3_2_0::tree::RootNode::addTile(const Coord &xyz, const ValueType &value, bool state)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a58ab61f904112334f418ea8a1235cdad',1,'openvdb::v3_2_0::tree::RootNode::addTile(Index level, const Coord &xyz, const ValueType &value, bool state)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a75454b135a1e19473aa702a90fd00802',1,'openvdb::v3_2_0::tree::Tree::addTile()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a58ab61f904112334f418ea8a1235cdad',1,'openvdb::v3_2_0::tree::ValueAccessor::addTile()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a58ab61f904112334f418ea8a1235cdad',1,'openvdb::v3_2_0::tree::CacheItem::addTile()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a58ab61f904112334f418ea8a1235cdad',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::addTile()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a58ab61f904112334f418ea8a1235cdad',1,'openvdb::v3_2_0::tree::ValueAccessor0::addTile()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a58ab61f904112334f418ea8a1235cdad',1,'openvdb::v3_2_0::tree::ValueAccessor1::addTile()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a58ab61f904112334f418ea8a1235cdad',1,'openvdb::v3_2_0::tree::ValueAccessor2::addTile()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a58ab61f904112334f418ea8a1235cdad',1,'openvdb::v3_2_0::tree::ValueAccessor3::addTile()']]], + ['addtileandcache',['addTileAndCache',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a88baa1b1d12b360589dbe49a344be2b6',1,'openvdb::v3_2_0::tree::InternalNode::addTileAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#adf106dbda7b0cc7ac3453cc9b2b9c7b1',1,'openvdb::v3_2_0::tree::LeafNode::addTileAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ac5a61e520404d551d13af19503f4a3e3',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::addTileAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ac5a61e520404d551d13af19503f4a3e3',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::addTileAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a88baa1b1d12b360589dbe49a344be2b6',1,'openvdb::v3_2_0::tree::RootNode::addTileAndCache()']]], + ['adjoint',['adjoint',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a4a6be925a632e8d18666d0a8f3b01150',1,'openvdb::v3_2_0::math::Mat3']]], + ['advect',['advect',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#ad2c087029e66039b3f3b68bafa2fcbf3',1,'openvdb::v3_2_0::tools::LevelSetAdvection::advect()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#ad2c087029e66039b3f3b68bafa2fcbf3',1,'openvdb::v3_2_0::tools::LevelSetMorphing::advect()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#a8d48267e784d608ad30c1403b9f3d2cf',1,'openvdb::v3_2_0::tools::PointAdvect::advect()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#a8d48267e784d608ad30c1403b9f3d2cf',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect::advect()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#a66a5f4e4782975b012fb6dfe14b50e21',1,'openvdb::v3_2_0::tools::VolumeAdvection::advect(const VolumeGridT &inGrid, double timeStep)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#a7a855c0e36ea106a6f9c503d7be283f1',1,'openvdb::v3_2_0::tools::VolumeAdvection::advect(const VolumeGridT &inGrid, const MaskGridT &mask, double timeStep)']]], + ['affinemap',['AffineMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html',1,'openvdb::v3_2_0::math']]], + ['affinemap',['AffineMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a1f6ef2508f13f9ba76d2666345a571cf',1,'openvdb::v3_2_0::math::AffineMap::AffineMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a2296b6f94ac26179ebb2629648c0822c',1,'openvdb::v3_2_0::math::AffineMap::AffineMap(const Mat3d &m)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#afc99c8fda28727da3e86030a0880e244',1,'openvdb::v3_2_0::math::AffineMap::AffineMap(const Mat4d &m)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a9e69e468e6c8cb47e1ffe3da912be370',1,'openvdb::v3_2_0::math::AffineMap::AffineMap(const AffineMap &other)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a4e13e216258842f1e648646b7b9bba9e',1,'openvdb::v3_2_0::math::AffineMap::AffineMap(const AffineMap &first, const AffineMap &second)']]], + ['aim',['aim',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae79db325c9ba9fbc8e3fa955c36ad7c8',1,'openvdb::v3_2_0::math']]], + ['aisactive',['aIsActive',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#afc4589c1427598269e5caa6e02f848d9',1,'openvdb::v3_2_0::CombineArgs']]], + ['allocate',['allocate',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#add23d9f5bbc918076d240287a9b3664f',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::allocate()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#add23d9f5bbc918076d240287a9b3664f',1,'openvdb::v3_2_0::tree::LeafNode::allocate()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#add23d9f5bbc918076d240287a9b3664f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::allocate()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#add23d9f5bbc918076d240287a9b3664f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::allocate()']]], + ['alphamask',['AlphaMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html',1,'openvdb::v3_2_0::tools']]], + ['alphamask',['AlphaMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#a586c2e8122ee2128d2f5ec9f992c40cf',1,'openvdb::v3_2_0::tools::AlphaMask']]], + ['alphatype',['AlphaType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a1ed0ae6885cc52e5c1a0369437fabddc',1,'openvdb::v3_2_0::tools::Filter::AlphaType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a1ed0ae6885cc52e5c1a0369437fabddc',1,'openvdb::v3_2_0::tools::LevelSetFilter::AlphaType()']]], + ['angle',['angle',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ad4170baade6bdab1de42f6d36ee3d184',1,'openvdb::v3_2_0::math::Quat::angle()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ac8192fa2a8292c58dfdf996e58bd49e9',1,'openvdb::v3_2_0::math::angle(const Vec2< T > &v1, const Vec2< T > &v2)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a5576d6e7edad799d942635355a47a8a9',1,'openvdb::v3_2_0::math::angle(const Vec3< T > &v1, const Vec3< T > &v2)']]], + ['api_5f0_5f98_5f0_2etxt',['api_0_98_0.txt',['../api__0__98__0_8txt.html',1,'']]], + ['apply',['apply',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Preconditioner.html#a8bb673dfdf6de817dc322b0e31d02d55',1,'openvdb::v3_2_0::math::pcg::Preconditioner::apply()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1JacobiPreconditioner.html#a64330c6d68a028f9f6501263d3652e75',1,'openvdb::v3_2_0::math::pcg::JacobiPreconditioner::apply()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#a02213eb61bff7cb5f5b825ee303346af',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner::apply()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseTransformer.html#a3a674851dbfbbb8bcffcead25a27aa73',1,'openvdb::v3_2_0::tools::DenseTransformer::apply()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1OpOver.html#abcdede0430006e465d104e052bdc49bb',1,'openvdb::v3_2_0::tools::ds::OpOver::apply()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1OpAdd.html#affe43988f9dd9526a1918f396647cd3d',1,'openvdb::v3_2_0::tools::ds::OpAdd::apply()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1OpSub.html#affe43988f9dd9526a1918f396647cd3d',1,'openvdb::v3_2_0::tools::ds::OpSub::apply()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1OpMin.html#ad734cec763ab070811039d7c460ad580',1,'openvdb::v3_2_0::tools::ds::OpMin::apply()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1OpMax.html#ad734cec763ab070811039d7c460ad580',1,'openvdb::v3_2_0::tools::ds::OpMax::apply()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1OpMult.html#a6412131c460d8888f87cd009b98cdc10',1,'openvdb::v3_2_0::tools::ds::OpMult::apply()']]], + ['applyijc',['applyIJC',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a5c30b5dc96dadab4a1ab585086e8ba97',1,'openvdb::v3_2_0::math::MapBase::applyIJC(const Mat3d &m) const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a6b357c610882cfd43d8e3c133d4bfda0',1,'openvdb::v3_2_0::math::MapBase::applyIJC(const Mat3d &m, const Vec3d &v, const Vec3d &domainPos) const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a64939ba9f99c514e132758a9ee567e2c',1,'openvdb::v3_2_0::math::AffineMap::applyIJC(const Mat3d &m) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a4ec5c4c8f4c200c072f2310f62e94a4f',1,'openvdb::v3_2_0::math::AffineMap::applyIJC(const Mat3d &in, const Vec3d &, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a679e559de175914a2938d8cb51c4646d',1,'openvdb::v3_2_0::math::ScaleMap::applyIJC(const Mat3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a4ec5c4c8f4c200c072f2310f62e94a4f',1,'openvdb::v3_2_0::math::ScaleMap::applyIJC(const Mat3d &in, const Vec3d &, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a2338aa41568d718853c50e9fc3a7fab1',1,'openvdb::v3_2_0::math::TranslationMap::applyIJC(const Mat3d &mat) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#ae6dbd44e6ff35f9b65a6696fbcbad8de',1,'openvdb::v3_2_0::math::TranslationMap::applyIJC(const Mat3d &mat, const Vec3d &, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a679e559de175914a2938d8cb51c4646d',1,'openvdb::v3_2_0::math::ScaleTranslateMap::applyIJC(const Mat3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a4ec5c4c8f4c200c072f2310f62e94a4f',1,'openvdb::v3_2_0::math::ScaleTranslateMap::applyIJC(const Mat3d &in, const Vec3d &, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a679e559de175914a2938d8cb51c4646d',1,'openvdb::v3_2_0::math::UnitaryMap::applyIJC(const Mat3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a4ec5c4c8f4c200c072f2310f62e94a4f',1,'openvdb::v3_2_0::math::UnitaryMap::applyIJC(const Mat3d &in, const Vec3d &, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a679e559de175914a2938d8cb51c4646d',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::applyIJC(const Mat3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a483c30fea02daaf66811b7dd2a4332fe',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::applyIJC(const Mat3d &d2_is, const Vec3d &d1_is, const Vec3d &ijk) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#a64939ba9f99c514e132758a9ee567e2c',1,'openvdb::v3_2_0::math::GenericMap::applyIJC(const Mat3d &m) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#a59c248e75fa51a7163966ee72adc2764',1,'openvdb::v3_2_0::math::GenericMap::applyIJC(const Mat3d &m, const Vec3d &v, const Vec3d &pos) const ']]], + ['applyijt',['applyIJT',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#aa93666c79953fb1472390aa4a98e00c9',1,'openvdb::v3_2_0::math::MapBase::applyIJT(const Vec3d &in) const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#ab661067fc2ab9e01b4ccde795cc6fd87',1,'openvdb::v3_2_0::math::MapBase::applyIJT(const Vec3d &in, const Vec3d &domainPos) const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a1e99c8bf3794ac815f87d2dc714c2c74',1,'openvdb::v3_2_0::math::AffineMap::applyIJT(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a3a5a097eb61b2d326ab1dc4c53d9eae2',1,'openvdb::v3_2_0::math::AffineMap::applyIJT(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a1e99c8bf3794ac815f87d2dc714c2c74',1,'openvdb::v3_2_0::math::ScaleMap::applyIJT(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a3a5a097eb61b2d326ab1dc4c53d9eae2',1,'openvdb::v3_2_0::math::ScaleMap::applyIJT(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a1e99c8bf3794ac815f87d2dc714c2c74',1,'openvdb::v3_2_0::math::TranslationMap::applyIJT(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a3a5a097eb61b2d326ab1dc4c53d9eae2',1,'openvdb::v3_2_0::math::TranslationMap::applyIJT(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a1e99c8bf3794ac815f87d2dc714c2c74',1,'openvdb::v3_2_0::math::ScaleTranslateMap::applyIJT(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a3a5a097eb61b2d326ab1dc4c53d9eae2',1,'openvdb::v3_2_0::math::ScaleTranslateMap::applyIJT(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a1e99c8bf3794ac815f87d2dc714c2c74',1,'openvdb::v3_2_0::math::UnitaryMap::applyIJT(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a3a5a097eb61b2d326ab1dc4c53d9eae2',1,'openvdb::v3_2_0::math::UnitaryMap::applyIJT(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a3a5a097eb61b2d326ab1dc4c53d9eae2',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::applyIJT(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a983230cc99688bef22ea26b8a3fe3189',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::applyIJT(const Vec3d &d1_is, const Vec3d &ijk) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#a3a5a097eb61b2d326ab1dc4c53d9eae2',1,'openvdb::v3_2_0::math::GenericMap::applyIJT(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#ac64bd82ffbdadc7d2fe4901c8ff7633e',1,'openvdb::v3_2_0::math::GenericMap::applyIJT(const Vec3d &in, const Vec3d &pos) const ']]], + ['applyinversejacobian',['applyInverseJacobian',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#aa49536687f716f67ec6976ec9bc67720',1,'openvdb::v3_2_0::math::MapBase::applyInverseJacobian(const Vec3d &in) const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#acd647457bd97e0da7fc9c05cbd11db7c',1,'openvdb::v3_2_0::math::MapBase::applyInverseJacobian(const Vec3d &in, const Vec3d &domainPos) const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#abae0a0d98a82ecb23a279a625034c500',1,'openvdb::v3_2_0::math::AffineMap::applyInverseJacobian(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#ac826e6dfa38472c4a02cf5fb8ae96d39',1,'openvdb::v3_2_0::math::AffineMap::applyInverseJacobian(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#abae0a0d98a82ecb23a279a625034c500',1,'openvdb::v3_2_0::math::ScaleMap::applyInverseJacobian(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#ac826e6dfa38472c4a02cf5fb8ae96d39',1,'openvdb::v3_2_0::math::ScaleMap::applyInverseJacobian(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#abae0a0d98a82ecb23a279a625034c500',1,'openvdb::v3_2_0::math::TranslationMap::applyInverseJacobian(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#ac826e6dfa38472c4a02cf5fb8ae96d39',1,'openvdb::v3_2_0::math::TranslationMap::applyInverseJacobian(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#abae0a0d98a82ecb23a279a625034c500',1,'openvdb::v3_2_0::math::ScaleTranslateMap::applyInverseJacobian(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#ac826e6dfa38472c4a02cf5fb8ae96d39',1,'openvdb::v3_2_0::math::ScaleTranslateMap::applyInverseJacobian(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#abae0a0d98a82ecb23a279a625034c500',1,'openvdb::v3_2_0::math::UnitaryMap::applyInverseJacobian(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#ac826e6dfa38472c4a02cf5fb8ae96d39',1,'openvdb::v3_2_0::math::UnitaryMap::applyInverseJacobian(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#ac826e6dfa38472c4a02cf5fb8ae96d39',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::applyInverseJacobian(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a2a62efcf654b8d286c9170126f4df697',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::applyInverseJacobian(const Vec3d &in, const Vec3d &isloc) const ']]], + ['applyinversemap',['applyInverseMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#ad5cea98d8cd7acf355acc91b76f906c0',1,'openvdb::v3_2_0::math::BBox::applyInverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a047af417cb22eb286a02bf3d51148eb3',1,'openvdb::v3_2_0::math::MapBase::applyInverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#acebfd86fd6533114cb89773864d53c1d',1,'openvdb::v3_2_0::math::AffineMap::applyInverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#acebfd86fd6533114cb89773864d53c1d',1,'openvdb::v3_2_0::math::ScaleMap::applyInverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#acebfd86fd6533114cb89773864d53c1d',1,'openvdb::v3_2_0::math::TranslationMap::applyInverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#acebfd86fd6533114cb89773864d53c1d',1,'openvdb::v3_2_0::math::ScaleTranslateMap::applyInverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#acebfd86fd6533114cb89773864d53c1d',1,'openvdb::v3_2_0::math::UnitaryMap::applyInverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#acebfd86fd6533114cb89773864d53c1d',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::applyInverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#acebfd86fd6533114cb89773864d53c1d',1,'openvdb::v3_2_0::math::GenericMap::applyInverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a1405b0e3ebc0aacd820157a3a59d84ed',1,'openvdb::v3_2_0::math::Ray::applyInverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a1837b7e565290a653349095f3e98a68b',1,'openvdb::v3_2_0::math::BBox::applyInverseMap()']]], + ['applyjacobian',['applyJacobian',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#adbf10811051ce79fdd5cf5d69c9e7ba9',1,'openvdb::v3_2_0::math::MapBase::applyJacobian(const Vec3d &in) const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#aef7d43483204fd2df6fdb083d3364c02',1,'openvdb::v3_2_0::math::MapBase::applyJacobian(const Vec3d &in, const Vec3d &domainPos) const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a36ffb72e452116b67c6052de5e8937f9',1,'openvdb::v3_2_0::math::AffineMap::applyJacobian(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a2964937c468adedaa0a963ca20938f34',1,'openvdb::v3_2_0::math::AffineMap::applyJacobian(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a36ffb72e452116b67c6052de5e8937f9',1,'openvdb::v3_2_0::math::ScaleMap::applyJacobian(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a2964937c468adedaa0a963ca20938f34',1,'openvdb::v3_2_0::math::ScaleMap::applyJacobian(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a36ffb72e452116b67c6052de5e8937f9',1,'openvdb::v3_2_0::math::TranslationMap::applyJacobian(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a2964937c468adedaa0a963ca20938f34',1,'openvdb::v3_2_0::math::TranslationMap::applyJacobian(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a36ffb72e452116b67c6052de5e8937f9',1,'openvdb::v3_2_0::math::ScaleTranslateMap::applyJacobian(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a2964937c468adedaa0a963ca20938f34',1,'openvdb::v3_2_0::math::ScaleTranslateMap::applyJacobian(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a36ffb72e452116b67c6052de5e8937f9',1,'openvdb::v3_2_0::math::UnitaryMap::applyJacobian(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a2964937c468adedaa0a963ca20938f34',1,'openvdb::v3_2_0::math::UnitaryMap::applyJacobian(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a2964937c468adedaa0a963ca20938f34',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::applyJacobian(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a47d412772777151db5c2c36ceaec2f0c',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::applyJacobian(const Vec3d &in, const Vec3d &isloc) const ']]], + ['applyjt',['applyJT',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a5f11d33257da628b37706331d488abe3',1,'openvdb::v3_2_0::math::MapBase::applyJT(const Vec3d &in) const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a6cfd2a54c15d65cdc159016d4a00898f',1,'openvdb::v3_2_0::math::MapBase::applyJT(const Vec3d &in, const Vec3d &domainPos) const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a0759d9dc1bcea46f673070fd9bf4bed3',1,'openvdb::v3_2_0::math::AffineMap::applyJT(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a87b54b8b88bf0247a42609b08d987c35',1,'openvdb::v3_2_0::math::AffineMap::applyJT(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a0759d9dc1bcea46f673070fd9bf4bed3',1,'openvdb::v3_2_0::math::ScaleMap::applyJT(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a87b54b8b88bf0247a42609b08d987c35',1,'openvdb::v3_2_0::math::ScaleMap::applyJT(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a0759d9dc1bcea46f673070fd9bf4bed3',1,'openvdb::v3_2_0::math::TranslationMap::applyJT(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a87b54b8b88bf0247a42609b08d987c35',1,'openvdb::v3_2_0::math::TranslationMap::applyJT(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a0759d9dc1bcea46f673070fd9bf4bed3',1,'openvdb::v3_2_0::math::ScaleTranslateMap::applyJT(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a87b54b8b88bf0247a42609b08d987c35',1,'openvdb::v3_2_0::math::ScaleTranslateMap::applyJT(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a0759d9dc1bcea46f673070fd9bf4bed3',1,'openvdb::v3_2_0::math::UnitaryMap::applyJT(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a87b54b8b88bf0247a42609b08d987c35',1,'openvdb::v3_2_0::math::UnitaryMap::applyJT(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#acd4fd8824fd1624055f92ee3bee9a7d1',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::applyJT(const Vec3d &in, const Vec3d &isloc) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a87b54b8b88bf0247a42609b08d987c35',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::applyJT(const Vec3d &in) const ']]], + ['applymap',['applyMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a82bf71bb2a279fbf778c0927bba67ea2',1,'openvdb::v3_2_0::math::BBox::applyMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a25df8ee7780261985003d37baf6f014d',1,'openvdb::v3_2_0::math::MapBase::applyMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#aaf2ddbdfa824130840e787c15bdd50cf',1,'openvdb::v3_2_0::math::AffineMap::applyMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#aaf2ddbdfa824130840e787c15bdd50cf',1,'openvdb::v3_2_0::math::ScaleMap::applyMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#aaf2ddbdfa824130840e787c15bdd50cf',1,'openvdb::v3_2_0::math::TranslationMap::applyMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#aaf2ddbdfa824130840e787c15bdd50cf',1,'openvdb::v3_2_0::math::ScaleTranslateMap::applyMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#aaf2ddbdfa824130840e787c15bdd50cf',1,'openvdb::v3_2_0::math::UnitaryMap::applyMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#aaf2ddbdfa824130840e787c15bdd50cf',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::applyMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#aaf2ddbdfa824130840e787c15bdd50cf',1,'openvdb::v3_2_0::math::GenericMap::applyMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a91a3d6fbb505f29fac20c5d34a5d8758',1,'openvdb::v3_2_0::math::Ray::applyMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a74f5cd9135e16864be60203d9b15b751',1,'openvdb::v3_2_0::math::BBox::applyMap()']]], + ['applytransform',['applyTransform',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html#a434be6d9b4f21ce1b2c454b0fd7ba574',1,'openvdb::v3_2_0::tools::GridResampler']]], + ['approxinverse',['approxInverse',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9e71c84383e13441c989ee8ee0c5f1f3',1,'openvdb::v3_2_0::math']]], + ['archive',['Archive',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#ab09888a4638e5b80e36d3dbd60b3cf09',1,'openvdb::v3_2_0::io::Archive']]], + ['archive',['Archive',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html',1,'openvdb::v3_2_0::io']]], + ['archive_2eh',['Archive.h',['../Archive_8h.html',1,'']]], + ['arithmeticerror',['ArithmeticError',['../classopenvdb_1_1v3__2__0_1_1ArithmeticError.html#a2b985e9fce2019c944f995739be1e56f',1,'openvdb::v3_2_0::ArithmeticError::ArithmeticError()'],['../classopenvdb_1_1v3__2__0_1_1ArithmeticError.html#a2f1120342fa72569cf50a90e2d1f7248',1,'openvdb::v3_2_0::ArithmeticError::ArithmeticError(const std::string &msg)']]], + ['arithmeticerror',['ArithmeticError',['../classopenvdb_1_1v3__2__0_1_1ArithmeticError.html',1,'openvdb::v3_2_0']]], + ['array',['Array',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1Array.html#aab8e76e6f21030c8d8580c83861690b9',1,'openvdb::v3_2_0::tools::point_partitioner_internal::Array']]], + ['array',['Array',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1Array.html',1,'openvdb::v3_2_0::tools::point_partitioner_internal']]], + ['arraysize',['arraySize',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1DeterministicDotProductOp.html#a9130d627fc1e0525a206dfb291859f68',1,'openvdb::v3_2_0::math::pcg::Vector::DeterministicDotProductOp']]], + ['asbool',['asBool',['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a1b651b9e1aa4e9edf77d2f0bf1ec77c2',1,'openvdb::v3_2_0::Metadata::asBool()'],['../classopenvdb_1_1v3__2__0_1_1UnknownMetadata.html#a052c8409034c434c1e87cb1fc6d3c11f',1,'openvdb::v3_2_0::UnknownMetadata::asBool()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#addba4304454416a12b045b32c31a74f9',1,'openvdb::v3_2_0::TypedMetadata::asBool()']]], + ['aspointer',['asPointer',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a8c21c8b9e2a202a352ffc0a04114a699',1,'openvdb::v3_2_0::math::Coord::asPointer() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a623084622b6268a5bcdb1b2c005ebec1',1,'openvdb::v3_2_0::math::Coord::asPointer()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a330fa9e5b377239abe4c99688d478700',1,'openvdb::v3_2_0::math::Mat3::asPointer()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#ae96e251b2c06c69241410c7d384ea11e',1,'openvdb::v3_2_0::math::Mat3::asPointer() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a330fa9e5b377239abe4c99688d478700',1,'openvdb::v3_2_0::math::Mat4::asPointer()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#ae96e251b2c06c69241410c7d384ea11e',1,'openvdb::v3_2_0::math::Mat4::asPointer() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a330fa9e5b377239abe4c99688d478700',1,'openvdb::v3_2_0::math::Vec2::asPointer()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ae96e251b2c06c69241410c7d384ea11e',1,'openvdb::v3_2_0::math::Vec2::asPointer() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a330fa9e5b377239abe4c99688d478700',1,'openvdb::v3_2_0::math::Vec3::asPointer()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ae96e251b2c06c69241410c7d384ea11e',1,'openvdb::v3_2_0::math::Vec3::asPointer() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a330fa9e5b377239abe4c99688d478700',1,'openvdb::v3_2_0::math::Vec4::asPointer()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#ae96e251b2c06c69241410c7d384ea11e',1,'openvdb::v3_2_0::math::Vec4::asPointer() const ']]], + ['assertnonmodifiable',['assertNonmodifiable',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#aa3740f7b3bf9900ebff77ec3689bb03f',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['asv',['asV',['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#acf2d1859cac4fc6a539d843cc26a30a6',1,'openvdb::v3_2_0::math::Tuple::asV()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#a2b8722d3c718f455444937088467c837',1,'openvdb::v3_2_0::math::Tuple::asV() const ']]], + ['asvec3d',['asVec3d',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#ae412a030a66b3c20ba6673f4cffed409',1,'openvdb::v3_2_0::math::Coord']]], + ['asvec3i',['asVec3i',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#ac0c65ed6108a571816d21c471d027dc8',1,'openvdb::v3_2_0::math::Coord::asVec3i() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a72a58ab2c9320d4ea03a0a819d4592f5',1,'openvdb::v3_2_0::math::Coord::asVec3I() const ']]], + ['asvec3s',['asVec3s',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a9bff6644dff424121371c23f935bed02',1,'openvdb::v3_2_0::math::Coord']]], + ['asxyz',['asXYZ',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#acad920b98231aa11abf9e12c46c0f2d7',1,'openvdb::v3_2_0::math::Coord']]], + ['at',['at',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#ad850312ce583faa1f6c6bb0b6c4a43d0',1,'openvdb::v3_2_0::math::pcg::Vector::at(SizeType i)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a0486203a0967f32e411d1ddd1f8f7d71',1,'openvdb::v3_2_0::math::pcg::Vector::at(SizeType i) const ']]], + ['atree',['aTree',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CompReplaceOp.html#a42ba40f44264250becb19facf58e5408',1,'openvdb::v3_2_0::tools::CompReplaceOp']]], + ['attachaccessor',['attachAccessor',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a54209682f761f12fbdc532c82afc1f72',1,'openvdb::v3_2_0::tree::Tree::attachAccessor(ValueAccessorBase< Tree, true > &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ac3f5f9b6a54a747ff43f49272f835b2b',1,'openvdb::v3_2_0::tree::Tree::attachAccessor(ValueAccessorBase< const Tree, true > &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#aab8e1b129609b1458aaf1f8cc0650a53',1,'openvdb::v3_2_0::tree::Tree::attachAccessor(ValueAccessorBase< Tree, false > &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ac98428f4dd96b395ce9a76abd4c8230d',1,'openvdb::v3_2_0::tree::Tree::attachAccessor(ValueAccessorBase< const Tree, false > &) const ']]], + ['attgridtype',['AttGridType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a74324941bba923890bb5a91a241d8230',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['attributegrid',['attributeGrid',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a7d2aa4965f01599a3d0d85f82068c072',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['atttype',['AttType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#aadbf8ea855e973869b15815a104bf798',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['auxbuffercount',['auxBufferCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a96ee4d892d3cebd2319506ce4069d1ab',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['auxbuffersperleaf',['auxBuffersPerLeaf',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a331fa25148c35653896b22a29903cc46',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['auxdata',['auxData',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a26ef75e876507467c371751f1ff7b0de',1,'openvdb::v3_2_0::io::StreamMetadata::auxData()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#aa8f48a94abb11425db28e9cc593ebcb5',1,'openvdb::v3_2_0::io::StreamMetadata::auxData() const ']]], + ['auxdatamap',['AuxDataMap',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#aac6a6165a8a07ea595b828e2a248d98c',1,'openvdb::v3_2_0::io::StreamMetadata']]], + ['avaluet',['AValueT',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#aa682bf85167ca3d4d0ab8b4344479ecb',1,'openvdb::v3_2_0::CombineArgs']]], + ['avg',['Avg',['../structopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter_1_1Filter_1_1Avg.html',1,'openvdb::v3_2_0::tools::LevelSetFilter::Filter']]], + ['avg',['Avg',['../structopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter_1_1Filter_1_1Avg.html#ad7e8889a2da4cf6c6eafda3e78327da3',1,'openvdb::v3_2_0::tools::LevelSetFilter::Filter::Avg::Avg()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#a875438343584e6e93744c8f7decba046',1,'openvdb::v3_2_0::math::Stats::avg()']]], + ['axis',['Axis',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SweepExteriorSign.html#ae3996976d8ffb3e58d88f58227473f8e',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SweepExteriorSign::Axis()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#aa9d431524278c1dec6c4a9bea41b1d23',1,'openvdb::v3_2_0::math::Quat::axis()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae3996976d8ffb3e58d88f58227473f8e',1,'openvdb::v3_2_0::math::Axis()']]], + ['axpy',['axpy',['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal.html#a78b9965b316ccbc823af34688aaeb348',1,'openvdb::v3_2_0::math::pcg::internal::axpy(const T &a, const T *xVec, const T *yVec, T *resultVec, SizeType size)'],['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal.html#a1fa9264d1d92d6dc9c3117524758de70',1,'openvdb::v3_2_0::math::pcg::internal::axpy(const T &a, const Vector< T > &xVec, const Vector< T > &yVec, Vector< T > &result)']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_3.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_3.html new file mode 100644 index 00000000..7ddb0cfb --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_3.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_3.js new file mode 100644 index 00000000..26516dd1 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_3.js @@ -0,0 +1,123 @@ +var searchData= +[ + ['b',['B',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyDifference_1_1B.html',1,'openvdb::v3_2_0::tree::InternalNode::TopologyDifference']]], + ['b',['b',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1DeterministicDotProductOp.html#afc7b41e1e036f8d36d760b48809fe851',1,'openvdb::v3_2_0::math::pcg::Vector::DeterministicDotProductOp::b()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#ad3329878fc8080399ff8dafd492d3731',1,'openvdb::v3_2_0::tools::Film::RGBA::b()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy1.html#ab37e76e21ecce8fc4bda5b39d88701ec',1,'openvdb::v3_2_0::tree::InternalNode::TopologyCopy1::b()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyIntersection.html#ab37e76e21ecce8fc4bda5b39d88701ec',1,'openvdb::v3_2_0::tree::InternalNode::TopologyIntersection::b()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyDifference.html#ab37e76e21ecce8fc4bda5b39d88701ec',1,'openvdb::v3_2_0::tree::InternalNode::TopologyDifference::b()'],['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a203ad73d76bdfc16f767a4922c727a3b',1,'openvdb::v3_2_0::CombineArgs::b()']]], + ['b2',['B2',['../NodeMasks_8h.html#a99c79fef7ec21b3aec91b2fcfd3c7600',1,'NodeMasks.h']]], + ['b4',['B4',['../NodeMasks_8h.html#a1fa8d14e04eeb78343cb5b06b85ba27f',1,'NodeMasks.h']]], + ['b6',['B6',['../NodeMasks_8h.html#a757fbce644cd370a23a77e26805bef6b',1,'NodeMasks.h']]], + ['background',['background',['../classopenvdb_1_1v3__2__0_1_1Grid.html#acccdab5ee066678e77d16f516d527d33',1,'openvdb::v3_2_0::Grid::background()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#acccdab5ee066678e77d16f516d527d33',1,'openvdb::v3_2_0::tree::RootNode::background()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#acccdab5ee066678e77d16f516d527d33',1,'openvdb::v3_2_0::tree::Tree::background()']]], + ['backgroundptr',['backgroundPtr',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a954dce7b6108dcbbe88f7500addf1487',1,'openvdb::v3_2_0::io::StreamMetadata']]], + ['basecamera',['BaseCamera',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html',1,'openvdb::v3_2_0::tools']]], + ['basecamera',['BaseCamera',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#ab5a946e4ace14a607f3d69daf46ccb92',1,'openvdb::v3_2_0::tools::BaseCamera']]], + ['baseiterator',['BaseIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#a9be4690183bfdb2f5529a12583524eb5',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::BaseIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#a80d00fe591b7fbff1be179fb4e3fe62c',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::BaseIterator(Index32 pos, const RootNodeMask *parent)']]], + ['baseiterator',['BaseIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html',1,'openvdb::v3_2_0::util::RootNodeMask']]], + ['baseleaf',['BaseLeaf',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a4a8b9dd08ea23f4e3d6b5ee7a8ad4b67',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['basemap',['baseMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a30f761676e53a989ac8c461add502660',1,'openvdb::v3_2_0::math::Transform::baseMap() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a5bdbacaec32f832ebe05d2ee975c8f12',1,'openvdb::v3_2_0::math::Transform::baseMap()']]], + ['basemaskiterator',['BaseMaskIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html',1,'openvdb::v3_2_0::util']]], + ['basemaskiterator',['BaseMaskIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html#a9754681bd199f23298389b0fee6bcd14',1,'openvdb::v3_2_0::util::BaseMaskIterator::BaseMaskIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html#ac41b7fee3306f233301c0ce4621f3629',1,'openvdb::v3_2_0::util::BaseMaskIterator::BaseMaskIterator(Index32 pos, const NodeMask *parent)']]], + ['basepointscatter',['BasePointScatter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html',1,'openvdb::v3_2_0::tools']]], + ['basepointscatter',['BasePointScatter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#ad6df65b3093bfbb426616f256844d972',1,'openvdb::v3_2_0::tools::BasePointScatter']]], + ['baseshader',['BaseShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseShader.html',1,'openvdb::v3_2_0::tools']]], + ['baseshader',['BaseShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseShader.html#a1a56c057e85640fee4bf366951a45d77',1,'openvdb::v3_2_0::tools::BaseShader']]], + ['basestencil',['BaseStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1SevenPointStencil.html#ab7bb49e181c1ccad52de629de038e762',1,'openvdb::v3_2_0::math::SevenPointStencil::BaseStencil()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BoxStencil.html#ab7bb49e181c1ccad52de629de038e762',1,'openvdb::v3_2_0::math::BoxStencil::BaseStencil()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SecondOrderDenseStencil.html#ab7bb49e181c1ccad52de629de038e762',1,'openvdb::v3_2_0::math::SecondOrderDenseStencil::BaseStencil()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ThirteenPointStencil.html#ab7bb49e181c1ccad52de629de038e762',1,'openvdb::v3_2_0::math::ThirteenPointStencil::BaseStencil()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1FourthOrderDenseStencil.html#ab7bb49e181c1ccad52de629de038e762',1,'openvdb::v3_2_0::math::FourthOrderDenseStencil::BaseStencil()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NineteenPointStencil.html#ab7bb49e181c1ccad52de629de038e762',1,'openvdb::v3_2_0::math::NineteenPointStencil::BaseStencil()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SixthOrderDenseStencil.html#ab7bb49e181c1ccad52de629de038e762',1,'openvdb::v3_2_0::math::SixthOrderDenseStencil::BaseStencil()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#ab7bb49e181c1ccad52de629de038e762',1,'openvdb::v3_2_0::math::GradStencil::BaseStencil()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html#ab7bb49e181c1ccad52de629de038e762',1,'openvdb::v3_2_0::math::WenoStencil::BaseStencil()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CurvatureStencil.html#ab7bb49e181c1ccad52de629de038e762',1,'openvdb::v3_2_0::math::CurvatureStencil::BaseStencil()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DenseStencil.html#ab7bb49e181c1ccad52de629de038e762',1,'openvdb::v3_2_0::math::DenseStencil::BaseStencil()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a6c26586e6f92eae4c4e060885a315fa2',1,'openvdb::v3_2_0::math::BaseStencil::BaseStencil()']]], + ['basestencil',['BaseStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['basestencil_3c_20boxstencil_3c_20gridt_2c_20issafe_20_3e_2c_20gridt_2c_20issafe_20_3e',['BaseStencil< BoxStencil< GridT, IsSafe >, GridT, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['basestencil_3c_20boxstencil_3c_20gridt_2c_20true_20_3e_2c_20gridt_2c_20true_20_3e',['BaseStencil< BoxStencil< GridT, true >, GridT, true >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['basestencil_3c_20curvaturestencil_3c_20gridt_2c_20issafe_20_3e_2c_20gridt_2c_20issafe_20_3e',['BaseStencil< CurvatureStencil< GridT, IsSafe >, GridT, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['basestencil_3c_20densestencil_3c_20gridt_2c_20issafe_20_3e_2c_20gridt_2c_20issafe_20_3e',['BaseStencil< DenseStencil< GridT, IsSafe >, GridT, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['basestencil_3c_20fourthorderdensestencil_3c_20gridt_2c_20issafe_20_3e_2c_20gridt_2c_20issafe_20_3e',['BaseStencil< FourthOrderDenseStencil< GridT, IsSafe >, GridT, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['basestencil_3c_20gradstencil_3c_20gridt_2c_20issafe_20_3e_2c_20gridt_2c_20issafe_20_3e',['BaseStencil< GradStencil< GridT, IsSafe >, GridT, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['basestencil_3c_20nineteenpointstencil_3c_20gridt_2c_20issafe_20_3e_2c_20gridt_2c_20issafe_20_3e',['BaseStencil< NineteenPointStencil< GridT, IsSafe >, GridT, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['basestencil_3c_20secondorderdensestencil_3c_20gridt_2c_20issafe_20_3e_2c_20gridt_2c_20issafe_20_3e',['BaseStencil< SecondOrderDenseStencil< GridT, IsSafe >, GridT, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['basestencil_3c_20sevenpointstencil_3c_20gridt_2c_20issafe_20_3e_2c_20gridt_2c_20issafe_20_3e',['BaseStencil< SevenPointStencil< GridT, IsSafe >, GridT, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['basestencil_3c_20sixthorderdensestencil_3c_20gridt_2c_20issafe_20_3e_2c_20gridt_2c_20issafe_20_3e',['BaseStencil< SixthOrderDenseStencil< GridT, IsSafe >, GridT, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['basestencil_3c_20thirteenpointstencil_3c_20gridt_2c_20issafe_20_3e_2c_20gridt_2c_20issafe_20_3e',['BaseStencil< ThirteenPointStencil< GridT, IsSafe >, GridT, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['basestencil_3c_20wenostencil_3c_20gridt_2c_20issafe_20_3e_2c_20gridt_2c_20issafe_20_3e',['BaseStencil< WenoStencil< GridT, IsSafe >, GridT, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['baset',['BaseT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#ac497b9aad06e332bbef089bcd0126092',1,'openvdb::v3_2_0::tools::Dense::BaseT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1UniformPointScatter.html#afd39e37dfd028144a9e65090dfa0380e',1,'openvdb::v3_2_0::tools::UniformPointScatter::BaseT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseUniformPointScatter.html#afd39e37dfd028144a9e65090dfa0380e',1,'openvdb::v3_2_0::tools::DenseUniformPointScatter::BaseT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1NonUniformPointScatter.html#afd39e37dfd028144a9e65090dfa0380e',1,'openvdb::v3_2_0::tools::NonUniformPointScatter::BaseT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DenseIter.html#ae30bf4db08524cd2e2d1b69ef1818b9d',1,'openvdb::v3_2_0::tree::InternalNode::DenseIter::BaseT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueIter.html#a56aba411c8ee975aa69a6ae6131a380a',1,'openvdb::v3_2_0::tree::LeafNode::ValueIter::BaseT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1DenseIter.html#a7b72971dc25c9d9f0ffa65c1b6bf7c3e',1,'openvdb::v3_2_0::tree::LeafNode::DenseIter::BaseT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ValueIter.html#a56aba411c8ee975aa69a6ae6131a380a',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter::BaseT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1DenseIter.html#a4a886a84294bda984eaa402ae967d368',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::DenseIter::BaseT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ValueIter.html#a56aba411c8ee975aa69a6ae6131a380a',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter::BaseT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1DenseIter.html#a4a886a84294bda984eaa402ae967d368',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::DenseIter::BaseT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a8102ea8851ceecff90578deeaeb0dd00',1,'openvdb::v3_2_0::tree::ValueAccessor::BaseT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a8102ea8851ceecff90578deeaeb0dd00',1,'openvdb::v3_2_0::tree::ValueAccessor0::BaseT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a8102ea8851ceecff90578deeaeb0dd00',1,'openvdb::v3_2_0::tree::ValueAccessor1::BaseT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a8102ea8851ceecff90578deeaeb0dd00',1,'openvdb::v3_2_0::tree::ValueAccessor2::BaseT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a8102ea8851ceecff90578deeaeb0dd00',1,'openvdb::v3_2_0::tree::ValueAccessor3::BaseT()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#a1f2a5b14139b66bed2b762b91b571bc2',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::BaseT()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a1f2a5b14139b66bed2b762b91b571bc2',1,'openvdb::v3_2_0::util::PagedArray::Iterator::BaseT()']]], + ['basetree',['baseTree',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a9d3dc27234695a0f72bb30b9ed9fb426',1,'openvdb::v3_2_0::GridBase::baseTree()'],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ae346849ecfcb892d0cb5f5772b25f5bc',1,'openvdb::v3_2_0::GridBase::baseTree() const ']]], + ['basetreeptr',['baseTreePtr',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ade901fd5fd57d7fd89e6f5e5e2625105',1,'openvdb::v3_2_0::GridBase::baseTreePtr()'],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ac4cd2eb9c11cf5938b2a38f330984d4c',1,'openvdb::v3_2_0::GridBase::baseTreePtr() const ']]], + ['basetype',['BaseType',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1JacobiPreconditioner.html#a227787171295d456e96ee712e44e8a1e',1,'openvdb::v3_2_0::math::pcg::JacobiPreconditioner::BaseType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#a227787171295d456e96ee712e44e8a1e',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner::BaseType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a557dcbcc11c8893b3197d0b0bcb5a4ba',1,'openvdb::v3_2_0::tools::LevelSetFilter::BaseType()']]], + ['bbox',['BBox',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html',1,'openvdb::v3_2_0::math']]], + ['bbox',['BBox',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a2205847ebd03bb83b357d0f312c6f073',1,'openvdb::v3_2_0::math::BBox::BBox()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a11c7db21881fcd6537c70fbcc6656a21',1,'openvdb::v3_2_0::math::BBox::BBox(const Vec3T &xyzMin, const Vec3T &xyzMax)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a60ef3d0a5cb6f7f72d731941465ff4dc',1,'openvdb::v3_2_0::math::BBox::BBox(const Vec3T &xyzMin, const Vec3T &xyzMax, bool sorted)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a0237abc4ac078cea4eaccf67024fb46a',1,'openvdb::v3_2_0::math::BBox::BBox(const Vec3T &xyzMin, const ElementType &length)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#abdb97c5595f3f5876ac647257a4f555b',1,'openvdb::v3_2_0::math::BBox::BBox(const ElementType *xyz, bool sorted=true)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a6cefd653a0940a08eb23836fc5bb0f24',1,'openvdb::v3_2_0::math::BBox::BBox(const BBox &other)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#ae6a5a389a1ca3be8b512c441f28a23cd',1,'openvdb::v3_2_0::tools::Dense::bbox()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a862a383e13b320cf77fc902b86590dc0',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::bbox()']]], + ['bbox_2eh',['BBox.h',['../BBox_8h.html',1,'']]], + ['bbox_3c_20postype_20_3e',['BBox< PosType >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html',1,'openvdb::v3_2_0::math']]], + ['bbox_3c_20vec3d_20_3e',['BBox< Vec3d >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html',1,'openvdb::v3_2_0::math']]], + ['bboxd',['BBoxd',['../namespaceopenvdb_1_1v3__2__0.html#ad81bed4f9fa737381a1ee43b08968ba8',1,'openvdb::v3_2_0']]], + ['bboxfilter',['BBoxFilter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1BBoxFilter.html',1,'openvdb::v3_2_0::tools::particle_atlas_internal']]], + ['bboxfilter',['BBoxFilter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1BBoxFilter.html',1,'openvdb::v3_2_0::tools::point_index_grid_internal']]], + ['bboxfilter',['BBoxFilter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1BBoxFilter.html#a1df6f7e6ca92bf41a71b63f3cc8d920e',1,'openvdb::v3_2_0::tools::particle_atlas_internal::BBoxFilter::BBoxFilter()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1BBoxFilter.html#a9ae648db1efaefc78d2d5f075fbe93ce',1,'openvdb::v3_2_0::tools::point_index_grid_internal::BBoxFilter::BBoxFilter()']]], + ['bd',['BD',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME.html#aa3a728f53e154e2df1ed5057809c1e7e',1,'openvdb::v3_2_0::math::BIAS_SCHEME::BD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01FIRST__BIAS_01_4.html#aa3a728f53e154e2df1ed5057809c1e7e',1,'openvdb::v3_2_0::math::BIAS_SCHEME< FIRST_BIAS >::BD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01SECOND__BIAS_01_4.html#aa3a728f53e154e2df1ed5057809c1e7e',1,'openvdb::v3_2_0::math::BIAS_SCHEME< SECOND_BIAS >::BD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01THIRD__BIAS_01_4.html#aa3a728f53e154e2df1ed5057809c1e7e',1,'openvdb::v3_2_0::math::BIAS_SCHEME< THIRD_BIAS >::BD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01WENO5__BIAS_01_4.html#aa3a728f53e154e2df1ed5057809c1e7e',1,'openvdb::v3_2_0::math::BIAS_SCHEME< WENO5_BIAS >::BD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01HJWENO5__BIAS_01_4.html#aa3a728f53e154e2df1ed5057809c1e7e',1,'openvdb::v3_2_0::math::BIAS_SCHEME< HJWENO5_BIAS >::BD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradientBiased.html#aa3a728f53e154e2df1ed5057809c1e7e',1,'openvdb::v3_2_0::math::ISGradientBiased::BD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradientNormSqrd.html#aa3a728f53e154e2df1ed5057809c1e7e',1,'openvdb::v3_2_0::math::ISGradientNormSqrd::BD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientNormSqrd.html#aa3a728f53e154e2df1ed5057809c1e7e',1,'openvdb::v3_2_0::math::GradientNormSqrd::BD()']]], + ['bd_5f1st',['BD_1ST',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57af7174bf850cffe8f12a8e830bd193b21',1,'openvdb::v3_2_0::math']]], + ['bd_5f2nd',['BD_2ND',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57ab8abde9d1fc2731ed91c7c0112496b3d',1,'openvdb::v3_2_0::math']]], + ['bd_5f3rd',['BD_3RD',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57a0ba114d6bd7ab1482d27ff35c92486e8',1,'openvdb::v3_2_0::math']]], + ['bd_5fhjweno5',['BD_HJWENO5',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57adbe351f8bcee0cc8e086d69a6a4106af',1,'openvdb::v3_2_0::math']]], + ['bd_5fweno5',['BD_WENO5',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57ae8e7c68e82dbcbf0bc44abab60b93fe6',1,'openvdb::v3_2_0::math']]], + ['begin',['begin',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange.html#a83c9fd7252c97810a9aaf392e10a00d7',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::begin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange.html#a83c9fd7252c97810a9aaf392e10a00d7',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::begin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a2362da85404e6072c0e3f39006f4bbd0',1,'openvdb::v3_2_0::tree::Tree::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1RootNodeType_1_1ChildOnIter_01_4.html#a1cb15056cdef95858bb108fac299f345',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::RootNodeType::ChildOnIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1RootNodeType_1_1ChildOnCIter_01_4.html#a09b2ff15483a59d063a0f62614551d8b',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::RootNodeType::ChildOnCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1RootNodeType_1_1ChildOffIter_01_4.html#a6ead17af564a6817e3d518c1843cfea5',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::RootNodeType::ChildOffIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1RootNodeType_1_1ChildOffCIter_01_4.html#a4522636ee3852b2e39032d4ff057af26',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::RootNodeType::ChildOffCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1RootNodeType_1_1ChildAllIter_01_4.html#aecd731f67439a2b634fdaa41ab619444',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::RootNodeType::ChildAllIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1RootNodeType_1_1ChildAllCIter_01_4.html#aa282b41ec1b8c7cee4f3e9e6638d6746',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::RootNodeType::ChildAllCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1NodeIter_01_4.html#ae6bd6d0e8f4b0c78f717d1c37cc49113',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::NodeIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1NodeCIter_01_4.html#a26420992cf2049c259f6dad965d73c13',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::NodeCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1LeafIter_01_4.html#ac0aa083865b32bc290152af80566bacf',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::LeafIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1LeafCIter_01_4.html#a490ac5f5ced828ac74f56d174f059cc9',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::LeafCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1ValueOnIter_01_4.html#a796b4488b100b19cd0bb37fe088565b8',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::ValueOnIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1ValueOnCIter_01_4.html#ac03cbb43507a3729b7d3d241a51b40a2',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::ValueOnCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1ValueOffIter_01_4.html#a9ace465e3619bbc8a1b105ee2b454ce7',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::ValueOffIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1ValueOffCIter_01_4.html#a51462bfe21548e2b7d9f8dad08ef04c4',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::ValueOffCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1ValueAllIter_01_4.html#a6e977a1368cb34ec4ff9dec3fc1da6a4',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::ValueAllIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1ValueAllCIter_01_4.html#a9b6d2bb993fa83dbf5ed0c1432393a33',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::ValueAllCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOnIter_01_4.html#a2dc0d2dc75352f2e7bce6a4b1961dd54',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOnIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOnCIter_01_4.html#a0ea80557794991e8ba42f60490df2b34',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOnCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOffIter_01_4.html#a2dc0d2dc75352f2e7bce6a4b1961dd54',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOffIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOffCIter_01_4.html#a0ea80557794991e8ba42f60490df2b34',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOffCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildAllIter_01_4.html#a2dc0d2dc75352f2e7bce6a4b1961dd54',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildAllIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildAllCIter_01_4.html#a0ea80557794991e8ba42f60490df2b34',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildAllCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOnIter_01_4.html#a2dc0d2dc75352f2e7bce6a4b1961dd54',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOnIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOnCIter_01_4.html#a0ea80557794991e8ba42f60490df2b34',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOnCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOffIter_01_4.html#a2dc0d2dc75352f2e7bce6a4b1961dd54',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOffIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOffCIter_01_4.html#a0ea80557794991e8ba42f60490df2b34',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOffCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueAllIter_01_4.html#a2dc0d2dc75352f2e7bce6a4b1961dd54',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueAllIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueAllCIter_01_4.html#a0ea80557794991e8ba42f60490df2b34',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueAllCIter >::begin()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a2387033802383edbdc95f9bbb12a707e',1,'openvdb::v3_2_0::util::PagedArray::begin()']]], + ['beginchildall',['beginChildAll',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a599e840b09098cf3437a3c4bd366ee79',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::beginChildAll() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a7000148c6f1dc8bfbb0139a3606e188e',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::beginChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a599e840b09098cf3437a3c4bd366ee79',1,'openvdb::v3_2_0::tree::InternalNode::beginChildAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a7000148c6f1dc8bfbb0139a3606e188e',1,'openvdb::v3_2_0::tree::InternalNode::beginChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a599e840b09098cf3437a3c4bd366ee79',1,'openvdb::v3_2_0::tree::LeafNode::beginChildAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a7000148c6f1dc8bfbb0139a3606e188e',1,'openvdb::v3_2_0::tree::LeafNode::beginChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a599e840b09098cf3437a3c4bd366ee79',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::beginChildAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a7000148c6f1dc8bfbb0139a3606e188e',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::beginChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a599e840b09098cf3437a3c4bd366ee79',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::beginChildAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a7000148c6f1dc8bfbb0139a3606e188e',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::beginChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a599e840b09098cf3437a3c4bd366ee79',1,'openvdb::v3_2_0::tree::RootNode::beginChildAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a7000148c6f1dc8bfbb0139a3606e188e',1,'openvdb::v3_2_0::tree::RootNode::beginChildAll()']]], + ['beginchildoff',['beginChildOff',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a8438e994f130eacf9f40014a97514bcd',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::beginChildOff() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a845985fcf5013cc3fe15865b05b3abd5',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::beginChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a8438e994f130eacf9f40014a97514bcd',1,'openvdb::v3_2_0::tree::InternalNode::beginChildOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a845985fcf5013cc3fe15865b05b3abd5',1,'openvdb::v3_2_0::tree::InternalNode::beginChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a8438e994f130eacf9f40014a97514bcd',1,'openvdb::v3_2_0::tree::LeafNode::beginChildOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a845985fcf5013cc3fe15865b05b3abd5',1,'openvdb::v3_2_0::tree::LeafNode::beginChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8438e994f130eacf9f40014a97514bcd',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::beginChildOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a845985fcf5013cc3fe15865b05b3abd5',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::beginChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8438e994f130eacf9f40014a97514bcd',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::beginChildOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a845985fcf5013cc3fe15865b05b3abd5',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::beginChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a8438e994f130eacf9f40014a97514bcd',1,'openvdb::v3_2_0::tree::RootNode::beginChildOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a845985fcf5013cc3fe15865b05b3abd5',1,'openvdb::v3_2_0::tree::RootNode::beginChildOff()']]], + ['beginchildon',['beginChildOn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a31c7157dee0e08c357e6a3ed6415a00e',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::beginChildOn() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a0f712beff77da092dd726a59e1104cf0',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::beginChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a31c7157dee0e08c357e6a3ed6415a00e',1,'openvdb::v3_2_0::tree::InternalNode::beginChildOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a0f712beff77da092dd726a59e1104cf0',1,'openvdb::v3_2_0::tree::InternalNode::beginChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a31c7157dee0e08c357e6a3ed6415a00e',1,'openvdb::v3_2_0::tree::LeafNode::beginChildOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a0f712beff77da092dd726a59e1104cf0',1,'openvdb::v3_2_0::tree::LeafNode::beginChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a31c7157dee0e08c357e6a3ed6415a00e',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::beginChildOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a0f712beff77da092dd726a59e1104cf0',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::beginChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a31c7157dee0e08c357e6a3ed6415a00e',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::beginChildOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a0f712beff77da092dd726a59e1104cf0',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::beginChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a31c7157dee0e08c357e6a3ed6415a00e',1,'openvdb::v3_2_0::tree::RootNode::beginChildOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a0f712beff77da092dd726a59e1104cf0',1,'openvdb::v3_2_0::tree::RootNode::beginChildOn()']]], + ['begindense',['beginDense',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a07b8f6971749d038dfb0c264a456a0c0',1,'openvdb::v3_2_0::util::NodeMask::beginDense()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a07b8f6971749d038dfb0c264a456a0c0',1,'openvdb::v3_2_0::util::NodeMask< 1 >::beginDense()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a07b8f6971749d038dfb0c264a456a0c0',1,'openvdb::v3_2_0::util::NodeMask< 2 >::beginDense()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a07b8f6971749d038dfb0c264a456a0c0',1,'openvdb::v3_2_0::util::RootNodeMask::beginDense()']]], + ['beginleaf',['beginLeaf',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ad71e0011e4f27f225c923b8e0b404dca',1,'openvdb::v3_2_0::tree::Tree::beginLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ad282de2508cffe340925fcbb42d17f9b',1,'openvdb::v3_2_0::tree::Tree::beginLeaf() const ']]], + ['beginmeta',['beginMeta',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#aaffd4267064b4952be89781e5d077568',1,'openvdb::v3_2_0::MetaMap::beginMeta()'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a2362e26905b25466647458eabb21ab18',1,'openvdb::v3_2_0::MetaMap::beginMeta() const ']]], + ['beginname',['beginName',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a2754a3953dde14e81677a67f335230ad',1,'openvdb::v3_2_0::io::File']]], + ['beginnode',['beginNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#af6a7c7dea5e04a9572a5ca396269f303',1,'openvdb::v3_2_0::tree::Tree::beginNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a0f89ac3be99d8e2f4122048dfdd8c014',1,'openvdb::v3_2_0::tree::Tree::beginNode() const ']]], + ['beginoff',['beginOff',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a78214e355b1da718a6cde1836c39e958',1,'openvdb::v3_2_0::util::NodeMask::beginOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a78214e355b1da718a6cde1836c39e958',1,'openvdb::v3_2_0::util::NodeMask< 1 >::beginOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a78214e355b1da718a6cde1836c39e958',1,'openvdb::v3_2_0::util::NodeMask< 2 >::beginOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a78214e355b1da718a6cde1836c39e958',1,'openvdb::v3_2_0::util::RootNodeMask::beginOff()']]], + ['beginon',['beginOn',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a7bc82ea0ec957e4305fc7351e9f5a689',1,'openvdb::v3_2_0::util::NodeMask::beginOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a7bc82ea0ec957e4305fc7351e9f5a689',1,'openvdb::v3_2_0::util::NodeMask< 1 >::beginOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a7bc82ea0ec957e4305fc7351e9f5a689',1,'openvdb::v3_2_0::util::NodeMask< 2 >::beginOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a7bc82ea0ec957e4305fc7351e9f5a689',1,'openvdb::v3_2_0::util::RootNodeMask::beginOn()']]], + ['beginrootchildren',['beginRootChildren',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a1249d2b212338d97bc848a54d2fa8fd4',1,'openvdb::v3_2_0::tree::Tree::beginRootChildren() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a4c83c14d8f83d5253045dd94d4951d25',1,'openvdb::v3_2_0::tree::Tree::beginRootChildren()']]], + ['beginrootdense',['beginRootDense',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a43f2ff83152d1d11a528bc0012f5debd',1,'openvdb::v3_2_0::tree::Tree::beginRootDense() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a2d6659f4ecac5a96ff225ade7f4f4186',1,'openvdb::v3_2_0::tree::Tree::beginRootDense()']]], + ['beginroottiles',['beginRootTiles',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a60f62d7136d9d069f64092b6451538e1',1,'openvdb::v3_2_0::tree::Tree::beginRootTiles() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a339dea8047a951d8ae190efb80a269cd',1,'openvdb::v3_2_0::tree::Tree::beginRootTiles()']]], + ['beginvalueall',['beginValueAll',['../classopenvdb_1_1v3__2__0_1_1Grid.html#afdf6fa279da1f6839a3ca381828220df',1,'openvdb::v3_2_0::Grid::beginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a18ec03c783bc71e824837c826dd6531c',1,'openvdb::v3_2_0::Grid::beginValueAll() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a18ec03c783bc71e824837c826dd6531c',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::beginValueAll() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#afdf6fa279da1f6839a3ca381828220df',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::beginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a18ec03c783bc71e824837c826dd6531c',1,'openvdb::v3_2_0::tree::InternalNode::beginValueAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#afdf6fa279da1f6839a3ca381828220df',1,'openvdb::v3_2_0::tree::InternalNode::beginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a18ec03c783bc71e824837c826dd6531c',1,'openvdb::v3_2_0::tree::LeafNode::beginValueAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#afdf6fa279da1f6839a3ca381828220df',1,'openvdb::v3_2_0::tree::LeafNode::beginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a18ec03c783bc71e824837c826dd6531c',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::beginValueAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#afdf6fa279da1f6839a3ca381828220df',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::beginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a18ec03c783bc71e824837c826dd6531c',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::beginValueAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#afdf6fa279da1f6839a3ca381828220df',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::beginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a18ec03c783bc71e824837c826dd6531c',1,'openvdb::v3_2_0::tree::RootNode::beginValueAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#afdf6fa279da1f6839a3ca381828220df',1,'openvdb::v3_2_0::tree::RootNode::beginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#afdf6fa279da1f6839a3ca381828220df',1,'openvdb::v3_2_0::tree::Tree::beginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a18ec03c783bc71e824837c826dd6531c',1,'openvdb::v3_2_0::tree::Tree::beginValueAll() const ']]], + ['beginvalueoff',['beginValueOff',['../classopenvdb_1_1v3__2__0_1_1Grid.html#ad555f92c70739496805fb480c3b38f85',1,'openvdb::v3_2_0::Grid::beginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a17282c62bdf7cdd25be3b773b39907b0',1,'openvdb::v3_2_0::Grid::beginValueOff() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a17282c62bdf7cdd25be3b773b39907b0',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::beginValueOff() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ad555f92c70739496805fb480c3b38f85',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::beginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a17282c62bdf7cdd25be3b773b39907b0',1,'openvdb::v3_2_0::tree::InternalNode::beginValueOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ad555f92c70739496805fb480c3b38f85',1,'openvdb::v3_2_0::tree::InternalNode::beginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a17282c62bdf7cdd25be3b773b39907b0',1,'openvdb::v3_2_0::tree::LeafNode::beginValueOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ad555f92c70739496805fb480c3b38f85',1,'openvdb::v3_2_0::tree::LeafNode::beginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a17282c62bdf7cdd25be3b773b39907b0',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::beginValueOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ad555f92c70739496805fb480c3b38f85',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::beginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a17282c62bdf7cdd25be3b773b39907b0',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::beginValueOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ad555f92c70739496805fb480c3b38f85',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::beginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a17282c62bdf7cdd25be3b773b39907b0',1,'openvdb::v3_2_0::tree::RootNode::beginValueOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ad555f92c70739496805fb480c3b38f85',1,'openvdb::v3_2_0::tree::RootNode::beginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ad555f92c70739496805fb480c3b38f85',1,'openvdb::v3_2_0::tree::Tree::beginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a17282c62bdf7cdd25be3b773b39907b0',1,'openvdb::v3_2_0::tree::Tree::beginValueOff() const ']]], + ['beginvalueon',['beginValueOn',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a7b8568cb11eacfedf042fa1eda680a45',1,'openvdb::v3_2_0::Grid::beginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a0f82a16370621f762a097f27122e51db',1,'openvdb::v3_2_0::Grid::beginValueOn() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a0f82a16370621f762a097f27122e51db',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::beginValueOn() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a7b8568cb11eacfedf042fa1eda680a45',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::beginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a0f82a16370621f762a097f27122e51db',1,'openvdb::v3_2_0::tree::InternalNode::beginValueOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a7b8568cb11eacfedf042fa1eda680a45',1,'openvdb::v3_2_0::tree::InternalNode::beginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a0f82a16370621f762a097f27122e51db',1,'openvdb::v3_2_0::tree::LeafNode::beginValueOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a7b8568cb11eacfedf042fa1eda680a45',1,'openvdb::v3_2_0::tree::LeafNode::beginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a0f82a16370621f762a097f27122e51db',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::beginValueOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a7b8568cb11eacfedf042fa1eda680a45',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::beginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a0f82a16370621f762a097f27122e51db',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::beginValueOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a7b8568cb11eacfedf042fa1eda680a45',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::beginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a0f82a16370621f762a097f27122e51db',1,'openvdb::v3_2_0::tree::RootNode::beginValueOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a7b8568cb11eacfedf042fa1eda680a45',1,'openvdb::v3_2_0::tree::RootNode::beginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a7b8568cb11eacfedf042fa1eda680a45',1,'openvdb::v3_2_0::tree::Tree::beginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a0f82a16370621f762a097f27122e51db',1,'openvdb::v3_2_0::tree::Tree::beginValueOn() const ']]], + ['bezlerp',['bezLerp',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a0eb3c817b579873a7a66cc2df1e78a24',1,'openvdb::v3_2_0::math']]], + ['bfecc',['BFECC',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1Scheme.html#a4010e0b09fbf6a975c479833d3001f42abe1f8538e8f5da855c0ec4c01b584099',1,'openvdb::v3_2_0::tools::Scheme']]], + ['bias_5fscheme',['BIAS_SCHEME',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME.html',1,'openvdb::v3_2_0::math']]], + ['bias_5fscheme_3c_20first_5fbias_20_3e',['BIAS_SCHEME< FIRST_BIAS >',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01FIRST__BIAS_01_4.html',1,'openvdb::v3_2_0::math']]], + ['bias_5fscheme_3c_20hjweno5_5fbias_20_3e',['BIAS_SCHEME< HJWENO5_BIAS >',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01HJWENO5__BIAS_01_4.html',1,'openvdb::v3_2_0::math']]], + ['bias_5fscheme_3c_20second_5fbias_20_3e',['BIAS_SCHEME< SECOND_BIAS >',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01SECOND__BIAS_01_4.html',1,'openvdb::v3_2_0::math']]], + ['bias_5fscheme_3c_20third_5fbias_20_3e',['BIAS_SCHEME< THIRD_BIAS >',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01THIRD__BIAS_01_4.html',1,'openvdb::v3_2_0::math']]], + ['bias_5fscheme_3c_20weno5_5fbias_20_3e',['BIAS_SCHEME< WENO5_BIAS >',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01WENO5__BIAS_01_4.html',1,'openvdb::v3_2_0::math']]], + ['biasedgradientscheme',['BiasedGradientScheme',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9b59f0a0c54e6e3759f1418d40585656',1,'openvdb::v3_2_0::math']]], + ['biasedgradientschemetomenuname',['biasedGradientSchemeToMenuName',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9ab7b70b89a3b6277be33be8421c7252',1,'openvdb::v3_2_0::math']]], + ['biasedgradientschemetostring',['biasedGradientSchemeToString',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a98410fd1804a4869c7ba4f464b2e7d12',1,'openvdb::v3_2_0::math']]], + ['binandsegment',['binAndSegment',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal.html#a027439a66c7b059eee5caff4a7f80167',1,'openvdb::v3_2_0::tools::point_partitioner_internal']]], + ['bincount',['binCount',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1DeterministicDotProductOp.html#a68c108b36c21ab6e67ee0838cdc15e5c',1,'openvdb::v3_2_0::math::pcg::Vector::DeterministicDotProductOp']]], + ['binpointindicesop',['BinPointIndicesOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#a6a165a4518ec7021907f57622e75409a',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp']]], + ['binpointindicesop',['BinPointIndicesOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html',1,'openvdb::v3_2_0::tools::point_partitioner_internal']]], + ['bisactive',['bIsActive',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a6f9fc22ae06ed1821e56c4a3081ef050',1,'openvdb::v3_2_0::CombineArgs']]], + ['bloscfromstream',['bloscFromStream',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a2955c42a1413446476884549d2bb0dcf',1,'openvdb::v3_2_0::io']]], + ['blosctostream',['bloscToStream',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a88c13bbd1d0d84bdc8bc39174e9a350c',1,'openvdb::v3_2_0::io']]], + ['boolaccessort',['BoolAccessorT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartGen.html#a5e181a574205c60e4abfdb61ab1bf1e2',1,'openvdb::v3_2_0::tools::internal::PartGen::BoolAccessorT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MaskEdges.html#acd986c9457aa0ac24dcf709fc74b0cac',1,'openvdb::v3_2_0::tools::internal::MaskEdges::BoolAccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTopologyMask.html#a5e181a574205c60e4abfdb61ab1bf1e2',1,'openvdb::v3_2_0::tools::internal::GenTopologyMask::BoolAccessorT()']]], + ['boolgrid',['BoolGrid',['../namespaceopenvdb_1_1v3__2__0.html#a4e3a4422409e5bda845d0fb678105e61',1,'openvdb::v3_2_0']]], + ['boolgridptrtype',['BoolGridPtrType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#ab9d2959ca5ca3c7369ce09f73382f293',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor< Grid< TreeType > >']]], + ['boolgridt',['BoolGridT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTopologyMask.html#a26ce31414f8e20eb887043f13a8787c5',1,'openvdb::v3_2_0::tools::internal::GenTopologyMask']]], + ['boolgridtype',['BoolGridType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#af4ef2b11a63553965f7cc3589c576bd7',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor< Grid< TreeType > >']]], + ['boolleafnodetype',['BoolLeafNodeType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorVoxels.html#ac4944a53ae47b3001cf2581422203655',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorVoxels::BoolLeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillMaskBoundary.html#a3b2a0f1c9b315529905e4c19623d4d14',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillMaskBoundary::BoolLeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskIsovalueCrossingVoxels.html#a3b2a0f1c9b315529905e4c19623d4d14',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskIsovalueCrossingVoxels::BoolLeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandLeafNodeRegion.html#a3b2a0f1c9b315529905e4c19623d4d14',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandLeafNodeRegion::BoolLeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillLeafNodeVoxels.html#ac4944a53ae47b3001cf2581422203655',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillLeafNodeVoxels::BoolLeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandNarrowbandMask.html#a3b2a0f1c9b315529905e4c19623d4d14',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandNarrowbandMask::BoolLeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskedCopy.html#a3b2a0f1c9b315529905e4c19623d4d14',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskedCopy::BoolLeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1DiffLeafNodeMask.html#a3b2a0f1c9b315529905e4c19623d4d14',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::DiffLeafNodeMask::BoolLeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ConstructVoxelMask.html#a3b2a0f1c9b315529905e4c19623d4d14',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ConstructVoxelMask::BoolLeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#a3b2a0f1c9b315529905e4c19623d4d14',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::BoolLeafNodeType()']]], + ['boolmetadata',['BoolMetadata',['../namespaceopenvdb_1_1v3__2__0.html#ac83331aa013b2c477fe5ba07baca16f6',1,'openvdb::v3_2_0']]], + ['boolsampler',['BoolSampler',['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1BoolSampler.html',1,'openvdb::v3_2_0::tools::clip_internal']]], + ['booltree',['BoolTree',['../namespaceopenvdb_1_1v3__2__0.html#a155dad3305a25615b4eb7640dff865e3',1,'openvdb::v3_2_0']]], + ['booltreeptrtype',['BoolTreePtrType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor.html#aad350786cf5b3f5921daa30dfc613ad6',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor::BoolTreePtrType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#a39965a6ef35b347379b9d066cd766323',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor< Grid< TreeType > >::BoolTreePtrType()']]], + ['booltreet',['BoolTreeT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#ac26d717797387f231f7b82d4577e865a',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions::BoolTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartGen.html#af8f12062fdbb0fd7de6d3d62cb7f051d',1,'openvdb::v3_2_0::tools::internal::PartGen::BoolTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenSeamMask.html#ac26d717797387f231f7b82d4577e865a',1,'openvdb::v3_2_0::tools::internal::GenSeamMask::BoolTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTopologyMask.html#af8f12062fdbb0fd7de6d3d62cb7f051d',1,'openvdb::v3_2_0::tools::internal::GenTopologyMask::BoolTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenBoundaryMask.html#af8f12062fdbb0fd7de6d3d62cb7f051d',1,'openvdb::v3_2_0::tools::internal::GenBoundaryMask::BoolTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTileMask.html#ac26d717797387f231f7b82d4577e865a',1,'openvdb::v3_2_0::tools::internal::GenTileMask::BoolTreeT()']]], + ['booltreetype',['BoolTreeType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillMaskBoundary.html#af3b76973abe2aa843173c5aa0c17b091',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillMaskBoundary::BoolTreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskIsovalueCrossingVoxels.html#a9d0fe98335b111dd49fce14a3809d427',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskIsovalueCrossingVoxels::BoolTreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandLeafNodeRegion.html#af3b76973abe2aa843173c5aa0c17b091',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandLeafNodeRegion::BoolTreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandNarrowbandMask.html#af3b76973abe2aa843173c5aa0c17b091',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandNarrowbandMask::BoolTreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskedCopy.html#af3b76973abe2aa843173c5aa0c17b091',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskedCopy::BoolTreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#af3b76973abe2aa843173c5aa0c17b091',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor< Grid< TreeType > >::BoolTreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1DiffLeafNodeMask.html#af3b76973abe2aa843173c5aa0c17b091',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::DiffLeafNodeMask::BoolTreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ConstructVoxelMask.html#af3b76973abe2aa843173c5aa0c17b091',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ConstructVoxelMask::BoolTreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#af3b76973abe2aa843173c5aa0c17b091',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::BoolTreeType()']]], + ['booltreetypeptr',['BoolTreeTypePtr',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandNarrowbandMask.html#ae990502c3b30cf3b943ee2be8caaf11a',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandNarrowbandMask::BoolTreeTypePtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskedCopy.html#ae990502c3b30cf3b943ee2be8caaf11a',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskedCopy::BoolTreeTypePtr()']]], + ['boost_5fstatic_5fassert',['BOOST_STATIC_ASSERT',['../structopenvdb_1_1v3__2__0_1_1PointIndex.html#ac53dc840311c44b6fa1499dd579e2c18',1,'openvdb::v3_2_0::PointIndex::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#ad497d785d5327457e39f95d3b4046878',1,'openvdb::v3_2_0::math::Ray::BOOST_STATIC_ASSERT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#a7d29d1f0905218e8af6d642f0c63b150',1,'openvdb::v3_2_0::tools::CheckNormGrad::BOOST_STATIC_ASSERT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#a7d29d1f0905218e8af6d642f0c63b150',1,'openvdb::v3_2_0::tools::CheckEikonal::BOOST_STATIC_ASSERT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#a58376072b7f57654be23153c9d42e86d',1,'openvdb::v3_2_0::tools::CheckDivergence::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#ab1bf31f8ca727a167c5e34eb1c5100a3',1,'openvdb::v3_2_0::tools::Filter::BOOST_STATIC_ASSERT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler.html#a1cb7710f6a4f87a2e7dafa22a996914b',1,'openvdb::v3_2_0::tools::Sampler::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#ab382567dccbe74d583cd79f40666eee0',1,'openvdb::v3_2_0::tools::AlphaMask::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#ab1bf31f8ca727a167c5e34eb1c5100a3',1,'openvdb::v3_2_0::tools::LevelSetFilter::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#a7d29d1f0905218e8af6d642f0c63b150',1,'openvdb::v3_2_0::tools::LevelSetMeasure::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetSphere.html#a22fe0cf82dc7fa686c4cad35fbfc4dfa',1,'openvdb::v3_2_0::tools::LevelSetSphere::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a7d29d1f0905218e8af6d642f0c63b150',1,'openvdb::v3_2_0::tools::LevelSetTracker::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a2a0d54fcbbfef466127512d9936bc980',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1InactivePruneOp.html#a1497d30ff71145314b12d264803ede5f',1,'openvdb::v3_2_0::tools::InactivePruneOp::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1TolerancePruneOp.html#a1497d30ff71145314b12d264803ede5f',1,'openvdb::v3_2_0::tools::TolerancePruneOp::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetPruneOp.html#a1497d30ff71145314b12d264803ede5f',1,'openvdb::v3_2_0::tools::LevelSetPruneOp::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#a5136ae30521289725464e4c4615e0e1b',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::BOOST_STATIC_ASSERT(NodeLevel >=-1 &&NodeLevel< int(TreeT::DEPTH)-1)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#a22fe0cf82dc7fa686c4cad35fbfc4dfa',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::BOOST_STATIC_ASSERT(boost::is_floating_point< ValueT >::value)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a1cb36a9103d12de83f0ede0bf468d64b',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#a7d29d1f0905218e8af6d642f0c63b150',1,'openvdb::v3_2_0::tools::VolumeRender::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SignedFloodFillOp.html#a93bbe4e1b9eee738cc3a074304f9e576',1,'openvdb::v3_2_0::tools::SignedFloodFillOp::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiscreteField.html#a7d29d1f0905218e8af6d642f0c63b150',1,'openvdb::v3_2_0::tools::DiscreteField::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1EnrightField.html#af73725fadda3e7c72a86c5c3b92cfd4d',1,'openvdb::v3_2_0::tools::EnrightField::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#ab67407460a559de06d73365ac29e53c7',1,'openvdb::v3_2_0::tree::NodeManager::BOOST_STATIC_ASSERT(LEVELS > 0)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#ab3e575c1c88d2143e768651d2165a85e',1,'openvdb::v3_2_0::tree::NodeManager::BOOST_STATIC_ASSERT(RootNodeType::LEVEL >=LEVELS)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a1ba6784a6079c6796aec6f7c70f9e921',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a9aae4e0926eda7958f1ee9d048849063',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a969ccaa3170e0a25e52782a526cdd651',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a7eb25447bb5bc9e6ff99e68cb3f59e38',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a12a96d8c2c42dbfc2d1748c237eeb661',1,'openvdb::v3_2_0::tree::RootNode::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a9e9ddade663422ab183a2b53f3eb736e',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a1880f46a3ee75eb595fdebb6f9e7f2f2',1,'openvdb::v3_2_0::tree::ValueAccessor::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#aa495fbc8682cd3f52ebe2de7a5965d01',1,'openvdb::v3_2_0::tree::ValueAccessor1::BOOST_STATIC_ASSERT(_TreeType::DEPTH >=2)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#ada747a91a50661870cd83e2441c958c4',1,'openvdb::v3_2_0::tree::ValueAccessor1::BOOST_STATIC_ASSERT(L0< _TreeType::RootNodeType::LEVEL)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#aa5c28fa6ab325c0720319e0811ec25fd',1,'openvdb::v3_2_0::tree::ValueAccessor2::BOOST_STATIC_ASSERT(_TreeType::DEPTH >=3)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#ac045fd0d509189c5ee90f4f64c53d053',1,'openvdb::v3_2_0::tree::ValueAccessor2::BOOST_STATIC_ASSERT(L0< L1 &&L1< _TreeType::RootNodeType::LEVEL)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a489c95d20136fe9832ba1ad9481ce894',1,'openvdb::v3_2_0::tree::ValueAccessor3::BOOST_STATIC_ASSERT(_TreeType::DEPTH >=4)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a4e2457d1e1dea87fc27c1d8c7df3c2e4',1,'openvdb::v3_2_0::tree::ValueAccessor3::BOOST_STATIC_ASSERT(L0< L1 &&L1< L2 &&L2< _TreeType::RootNodeType::LEVEL)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a5823334cf15b0da22954c5eeaf525ebd',1,'openvdb::v3_2_0::util::NodeMask::BOOST_STATIC_ASSERT()']]], + ['boundaryop',['boundaryOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1ISLaplacianOp.html#ac3c060e5a38b2898fcad772bf67934b6',1,'openvdb::v3_2_0::tools::poisson::internal::ISLaplacianOp']]], + ['boxsampler',['BoxSampler',['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html',1,'openvdb::v3_2_0::tools']]], + ['boxstencil',['BoxStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1BoxStencil.html#a5b9edb8cfcb9232c8c680a5a8fd08b42',1,'openvdb::v3_2_0::math::BoxStencil']]], + ['boxstencil',['BoxStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1BoxStencil.html',1,'openvdb::v3_2_0::math']]], + ['boxstencil_3c_20gridt_20_3e',['BoxStencil< GridT >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BoxStencil.html',1,'openvdb::v3_2_0::math']]], + ['buffer',['Buffer',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >']]], + ['buffer',['buffer',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#a9691ba98b84d19d3c60367a1667123c4',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::buffer()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a6c82ec5c88f6f31c16fb3e3d728ecae8',1,'openvdb::v3_2_0::tree::LeafNode::buffer() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a6e4d32cef58578c6471ad6c3dd0db7d3',1,'openvdb::v3_2_0::tree::LeafNode::buffer()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a6c82ec5c88f6f31c16fb3e3d728ecae8',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::buffer() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a6e4d32cef58578c6471ad6c3dd0db7d3',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::buffer()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a6c82ec5c88f6f31c16fb3e3d728ecae8',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::buffer() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a6e4d32cef58578c6471ad6c3dd0db7d3',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::buffer()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#a47587d18a394fb4b9508c61e3d5f0260',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::Buffer()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#abb55e03e20a28918e79767f19930f104',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::Buffer(const ValueType &val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#a44966c75218c6fe8b2a801144610a247',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::Buffer(const Buffer &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#ad50f0108c95c6c163dc4412a7110c9cb',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::Buffer(PartialCreate, const ValueType &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#a47587d18a394fb4b9508c61e3d5f0260',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::Buffer()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#ae7df51e3608ab80eeb5f3232147b1f40',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::Buffer(bool on)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#a18ea50af76d7a6d972e2eb6d7e1d6873',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::Buffer(const NodeMaskType &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#a44966c75218c6fe8b2a801144610a247',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::Buffer(const Buffer &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#a47587d18a394fb4b9508c61e3d5f0260',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::Buffer()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#ae7df51e3608ab80eeb5f3232147b1f40',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::Buffer(bool on)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#a18ea50af76d7a6d972e2eb6d7e1d6873',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::Buffer(const NodeMaskType &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#a44966c75218c6fe8b2a801144610a247',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::Buffer(const Buffer &other)']]], + ['buffer',['Buffer',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >']]], + ['buffer',['Buffer',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['buffertype',['BufferType',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#af04c83d3598f1d70089dbd305c16752c',1,'openvdb::v3_2_0::math::BaseStencil::BufferType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#ab937f2bc78c00ac61ab4778c46d30022',1,'openvdb::v3_2_0::tools::Filter::BufferType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#a4d3407f83d1cf99e0fd1ef9bf7bfba60',1,'openvdb::v3_2_0::tools::LevelSetAdvection::BufferType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a4d3407f83d1cf99e0fd1ef9bf7bfba60',1,'openvdb::v3_2_0::tools::LevelSetMorphing::BufferType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#ab937f2bc78c00ac61ab4778c46d30022',1,'openvdb::v3_2_0::tools::LevelSetTracker::BufferType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#af6c00e7118213372abaa3723ec2cbe7f',1,'openvdb::v3_2_0::tree::LeafManager::BufferType()']]], + ['bufpos',['bufpos',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1FileInfo.html#a4b14a68968aec230d7d4287a5b4b8b69',1,'openvdb::v3_2_0::tree::LeafNode::FileInfo']]], + ['buft',['BufT',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafManagerImpl.html#a9b7639b7a5be74c0af2e21ef6ac0e03b',1,'openvdb::v3_2_0::tree::LeafManagerImpl::BufT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafManagerImpl_3_01LeafManager_3_01const_01TreeT_01_4_01_4.html#a9b7639b7a5be74c0af2e21ef6ac0e03b',1,'openvdb::v3_2_0::tree::LeafManagerImpl< LeafManager< const TreeT > >::BufT()']]], + ['buildprimarysegment',['BuildPrimarySegment',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildPrimarySegment.html#a588703de74622d1165a3d3df1bb280d3',1,'openvdb::v3_2_0::tools::composite::BuildPrimarySegment']]], + ['buildprimarysegment',['BuildPrimarySegment',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildPrimarySegment.html',1,'openvdb::v3_2_0::tools::composite']]], + ['buildsecondarysegment',['BuildSecondarySegment',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildSecondarySegment.html#a9bbab5cfde8740145a0472572ad2c981',1,'openvdb::v3_2_0::tools::composite::BuildSecondarySegment']]], + ['buildsecondarysegment',['BuildSecondarySegment',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildSecondarySegment.html',1,'openvdb::v3_2_0::tools::composite']]], + ['buildtype',['BuildType',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a765793818cec1ab26e406bc61358781a',1,'openvdb::v3_2_0::Grid::BuildType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a76215159f704cb790ce5758354f69829',1,'openvdb::v3_2_0::tree::InternalNode::BuildType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a97b26b7067dae9fb321da27d51901f1e',1,'openvdb::v3_2_0::tree::LeafNode::BuildType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a9281e794577882ff398455d4feb28045',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::BuildType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a69bc5cdb711491f6a699018350bcbdfc',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::BuildType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#abb603e01760bdae19f51b004f6115912',1,'openvdb::v3_2_0::tree::RootNode::BuildType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a9ea5644705e0f1c8b486662415d192c9',1,'openvdb::v3_2_0::tree::Tree::BuildType()']]], + ['bvaluet',['BValueT',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a11094dca5cd4ba450b8c8d3b7ab934e8',1,'openvdb::v3_2_0::CombineArgs']]], + ['byte',['Byte',['../namespaceopenvdb_1_1v3__2__0.html#ae3a497195d617519e5353ea7b417940f',1,'openvdb::v3_2_0']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_4.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_4.html new file mode 100644 index 00000000..eab9eb1b --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_4.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_4.js new file mode 100644 index 00000000..5ce0a425 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_4.js @@ -0,0 +1,384 @@ +var searchData= +[ + ['cacheitem',['CacheItem',['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html',1,'openvdb::v3_2_0::tree']]], + ['cacheitem',['CacheItem',['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a8d83a54b601816d9bf8ab605ae57cf44',1,'openvdb::v3_2_0::tree::CacheItem::CacheItem(TreeCacheT &parent)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a266ff84d57779fb67da7b0d84bb605ef',1,'openvdb::v3_2_0::tree::CacheItem::CacheItem(TreeCacheT &parent, const CacheItem &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a8d83a54b601816d9bf8ab605ae57cf44',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::CacheItem(TreeCacheT &parent)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a266ff84d57779fb67da7b0d84bb605ef',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::CacheItem(TreeCacheT &parent, const CacheItem &other)']]], + ['cacheitem_3c_20treecachet_2c_20nodevect_2c_20true_20_3e',['CacheItem< TreeCacheT, NodeVecT, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['cacheitem_3c_20valueaccessor_2c_20subtreet_2c_20boost_3a_3ampl_3a_3asize_3c_20subtreet_20_3e_3a_3avalue_3d_3d1_20_3e',['CacheItem< ValueAccessor, SubtreeT, boost::mpl::size< SubtreeT >::value==1 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html',1,'openvdb::v3_2_0::tree']]], + ['calculatebounds',['calculateBounds',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1e47ea736d99890969ff15e1a26a11aa',1,'openvdb::v3_2_0::math::calculateBounds()'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a9c9b4b77b92264946ca4866b59db1d90',1,'openvdb::v3_2_0::util::calculateBounds(const MapType &map, const BBoxd &in, BBoxd &out)'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#ad5d6cc933ba56d768e16a6d47777dbcc',1,'openvdb::v3_2_0::util::calculateBounds(const MapType &map, const Vec3d &center, const Real radius, BBoxd &out)']]], + ['calculatebounds_3c_20math_3a_3anonlinearfrustummap_20_3e',['calculateBounds< math::NonlinearFrustumMap >',['../namespaceopenvdb_1_1v3__2__0_1_1util.html#aad5cb360f1bbc85b74c93744521a1b9e',1,'openvdb::v3_2_0::util']]], + ['canconverttype',['CanConvertType',['../structopenvdb_1_1v3__2__0_1_1CanConvertType.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20math_3a_3avec2_3c_20t_20_3e_2c_20math_3a_3avec2_3c_20t_20_3e_20_3e',['CanConvertType< math::Vec2< T >, math::Vec2< T > >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01math_1_1Vec2_3_01T_01_4_00_01math_1_1Vec2_3_01T_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20math_3a_3avec3_3c_20t_20_3e_2c_20math_3a_3avec3_3c_20t_20_3e_20_3e',['CanConvertType< math::Vec3< T >, math::Vec3< T > >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01math_1_1Vec3_3_01T_01_4_00_01math_1_1Vec3_3_01T_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20math_3a_3avec4_3c_20t_20_3e_2c_20math_3a_3avec4_3c_20t_20_3e_20_3e',['CanConvertType< math::Vec4< T >, math::Vec4< T > >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01math_1_1Vec4_3_01T_01_4_00_01math_1_1Vec4_3_01T_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20pointdataindex32_2c_20pointindex32_20_3e',['CanConvertType< PointDataIndex32, PointIndex32 >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01PointDataIndex32_00_01PointIndex32_01_4.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20pointindex32_2c_20pointdataindex32_20_3e',['CanConvertType< PointIndex32, PointDataIndex32 >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01PointIndex32_00_01PointDataIndex32_01_4.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20t_2c_20math_3a_3avec2_3c_20t_20_3e_20_3e',['CanConvertType< T, math::Vec2< T > >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T_00_01math_1_1Vec2_3_01T_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20t_2c_20math_3a_3avec3_3c_20t_20_3e_20_3e',['CanConvertType< T, math::Vec3< T > >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T_00_01math_1_1Vec3_3_01T_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20t_2c_20math_3a_3avec4_3c_20t_20_3e_20_3e',['CanConvertType< T, math::Vec4< T > >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T_00_01math_1_1Vec4_3_01T_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20t_2c_20valuemask_20_3e',['CanConvertType< T, ValueMask >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T_00_01ValueMask_01_4.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20t0_2c_20math_3a_3avec2_3c_20t1_20_3e_20_3e',['CanConvertType< T0, math::Vec2< T1 > >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T0_00_01math_1_1Vec2_3_01T1_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20t0_2c_20math_3a_3avec3_3c_20t1_20_3e_20_3e',['CanConvertType< T0, math::Vec3< T1 > >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T0_00_01math_1_1Vec3_3_01T1_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20t0_2c_20math_3a_3avec4_3c_20t1_20_3e_20_3e',['CanConvertType< T0, math::Vec4< T1 > >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T0_00_01math_1_1Vec4_3_01T1_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20valuemask_2c_20t_20_3e',['CanConvertType< ValueMask, T >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01ValueMask_00_01T_01_4.html',1,'openvdb::v3_2_0']]], + ['capacity',['capacity',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a5baddc5324ced350cdada48c943aae20',1,'openvdb::v3_2_0::io::Queue::capacity()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#ae3b0b3ce67788bf2e4e209f65eb99297',1,'openvdb::v3_2_0::util::PagedArray::capacity()']]], + ['cbegin',['cbegin',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a9adcdec7f9095df3498cdacca808ed08',1,'openvdb::v3_2_0::tree::Tree::cbegin()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#ae04e6b542ee42ff7809fceb1e11c471f',1,'openvdb::v3_2_0::util::PagedArray::cbegin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a0370633d2aeedebedba3842994777fc5',1,'openvdb::v3_2_0::tree::Tree::cbegin()']]], + ['cbeginchildall',['cbeginChildAll',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ae5c7824607dbdc3c1165e0b0daea8bcd',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::cbeginChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ae5c7824607dbdc3c1165e0b0daea8bcd',1,'openvdb::v3_2_0::tree::InternalNode::cbeginChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ae5c7824607dbdc3c1165e0b0daea8bcd',1,'openvdb::v3_2_0::tree::LeafNode::cbeginChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ae5c7824607dbdc3c1165e0b0daea8bcd',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::cbeginChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ae5c7824607dbdc3c1165e0b0daea8bcd',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::cbeginChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ae5c7824607dbdc3c1165e0b0daea8bcd',1,'openvdb::v3_2_0::tree::RootNode::cbeginChildAll()']]], + ['cbeginchildoff',['cbeginChildOff',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a8169dc13d3aad941b6490f27a4bbb839',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::cbeginChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a8169dc13d3aad941b6490f27a4bbb839',1,'openvdb::v3_2_0::tree::InternalNode::cbeginChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a8169dc13d3aad941b6490f27a4bbb839',1,'openvdb::v3_2_0::tree::LeafNode::cbeginChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8169dc13d3aad941b6490f27a4bbb839',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::cbeginChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8169dc13d3aad941b6490f27a4bbb839',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::cbeginChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a8169dc13d3aad941b6490f27a4bbb839',1,'openvdb::v3_2_0::tree::RootNode::cbeginChildOff()']]], + ['cbeginchildon',['cbeginChildOn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a63e9bf1256874f802e2dbbc7db56f8ee',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::cbeginChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a63e9bf1256874f802e2dbbc7db56f8ee',1,'openvdb::v3_2_0::tree::InternalNode::cbeginChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a63e9bf1256874f802e2dbbc7db56f8ee',1,'openvdb::v3_2_0::tree::LeafNode::cbeginChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a63e9bf1256874f802e2dbbc7db56f8ee',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::cbeginChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a63e9bf1256874f802e2dbbc7db56f8ee',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::cbeginChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a63e9bf1256874f802e2dbbc7db56f8ee',1,'openvdb::v3_2_0::tree::RootNode::cbeginChildOn()']]], + ['cbeginleaf',['cbeginLeaf',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#aa87ff4f7acdfe6f833b3db2431afd088',1,'openvdb::v3_2_0::tree::Tree']]], + ['cbeginnode',['cbeginNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a4bcf073387908382f7ae872adb97087f',1,'openvdb::v3_2_0::tree::Tree']]], + ['cbeginrootchildren',['cbeginRootChildren',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a731418dbc4530e198213306aab0a475c',1,'openvdb::v3_2_0::tree::Tree']]], + ['cbeginrootdense',['cbeginRootDense',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#abdd255b280df688e816d4a324eac2846',1,'openvdb::v3_2_0::tree::Tree']]], + ['cbeginroottiles',['cbeginRootTiles',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a4092f276f081a9d0d61e901a314f1e3f',1,'openvdb::v3_2_0::tree::Tree']]], + ['cbeginvalueall',['cbeginValueAll',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a8b296755b1634e77e5fff9c4c48ea3c8',1,'openvdb::v3_2_0::Grid::cbeginValueAll()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a8b296755b1634e77e5fff9c4c48ea3c8',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::cbeginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a8b296755b1634e77e5fff9c4c48ea3c8',1,'openvdb::v3_2_0::tree::InternalNode::cbeginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a8b296755b1634e77e5fff9c4c48ea3c8',1,'openvdb::v3_2_0::tree::LeafNode::cbeginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8b296755b1634e77e5fff9c4c48ea3c8',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::cbeginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8b296755b1634e77e5fff9c4c48ea3c8',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::cbeginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a8b296755b1634e77e5fff9c4c48ea3c8',1,'openvdb::v3_2_0::tree::RootNode::cbeginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a8b296755b1634e77e5fff9c4c48ea3c8',1,'openvdb::v3_2_0::tree::Tree::cbeginValueAll()']]], + ['cbeginvalueoff',['cbeginValueOff',['../classopenvdb_1_1v3__2__0_1_1Grid.html#ae16c1191cb1a539a7cc0cdee5803d860',1,'openvdb::v3_2_0::Grid::cbeginValueOff()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ae16c1191cb1a539a7cc0cdee5803d860',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::cbeginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ae16c1191cb1a539a7cc0cdee5803d860',1,'openvdb::v3_2_0::tree::InternalNode::cbeginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ae16c1191cb1a539a7cc0cdee5803d860',1,'openvdb::v3_2_0::tree::LeafNode::cbeginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ae16c1191cb1a539a7cc0cdee5803d860',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::cbeginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ae16c1191cb1a539a7cc0cdee5803d860',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::cbeginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ae16c1191cb1a539a7cc0cdee5803d860',1,'openvdb::v3_2_0::tree::RootNode::cbeginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ae16c1191cb1a539a7cc0cdee5803d860',1,'openvdb::v3_2_0::tree::Tree::cbeginValueOff()']]], + ['cbeginvalueon',['cbeginValueOn',['../classopenvdb_1_1v3__2__0_1_1Grid.html#ad554801c644ee82931281a11f801bf5c',1,'openvdb::v3_2_0::Grid::cbeginValueOn()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ad554801c644ee82931281a11f801bf5c',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::cbeginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ad554801c644ee82931281a11f801bf5c',1,'openvdb::v3_2_0::tree::InternalNode::cbeginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ad554801c644ee82931281a11f801bf5c',1,'openvdb::v3_2_0::tree::LeafNode::cbeginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ad554801c644ee82931281a11f801bf5c',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::cbeginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ad554801c644ee82931281a11f801bf5c',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::cbeginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ad554801c644ee82931281a11f801bf5c',1,'openvdb::v3_2_0::tree::RootNode::cbeginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ad554801c644ee82931281a11f801bf5c',1,'openvdb::v3_2_0::tree::Tree::cbeginValueOn()']]], + ['cbrt',['Cbrt',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae883922f38f7f30e978d40706312434f',1,'openvdb::v3_2_0::math::Cbrt(float x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4d1cd9afac6c01d715efa4508755830b',1,'openvdb::v3_2_0::math::Cbrt(double x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a2f764f570a2ec04ecb42626254950ca2',1,'openvdb::v3_2_0::math::Cbrt(long double x)']]], + ['cd_5f2nd',['CD_2ND',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57ae625e4531fa6805b500faf9c607d229e',1,'openvdb::v3_2_0::math']]], + ['cd_5f2ndt',['CD_2NDT',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57a72b1785f3467652d957c69510d93afc3',1,'openvdb::v3_2_0::math']]], + ['cd_5f4th',['CD_4TH',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57affcae9e170df0a75e85faf5093a230fe',1,'openvdb::v3_2_0::math']]], + ['cd_5f6th',['CD_6TH',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57a56aaacd64724a1eab342cd0d95e8dda6',1,'openvdb::v3_2_0::math']]], + ['cd_5ffourth',['CD_FOURTH',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4994cfdf23949af8ea6889b3ec5c9e20a80e3ecb11ff1b8e48c7eb7d9476ecb2a',1,'openvdb::v3_2_0::math']]], + ['cd_5fsecond',['CD_SECOND',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4994cfdf23949af8ea6889b3ec5c9e20af6b79ac4e7a6a219e4d03c3356cc738a',1,'openvdb::v3_2_0::math']]], + ['cd_5fsixth',['CD_SIXTH',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4994cfdf23949af8ea6889b3ec5c9e20a01878dc93a83c1a619611c4c90346b28',1,'openvdb::v3_2_0::math']]], + ['ceil',['ceil',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a1fb8c36c21492d4046e6db3c4fcdfe47',1,'openvdb::v3_2_0::math::Coord::ceil()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a560f58b8cb449880e24be8a4f092eb44',1,'openvdb::v3_2_0::math::Ceil(float x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af7d7ce4d5cf009045016aa547d30b549',1,'openvdb::v3_2_0::math::Ceil(double x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a796615ada351ddfebcb1095ac4834ceb',1,'openvdb::v3_2_0::math::Ceil(long double x)']]], + ['ceilvec3',['ceilVec3',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1local__util.html#aa68de92d94e125389b8ebdcd93ad5cfe',1,'openvdb::v3_2_0::tools::local_util']]], + ['cend',['cend',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#ae6d634a0c1bb2c2d1522bd581d89ba34',1,'openvdb::v3_2_0::util::PagedArray']]], + ['cendchildall',['cendChildAll',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a247bd2c5f4dc62da9f5c5c767d45644d',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::cendChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a247bd2c5f4dc62da9f5c5c767d45644d',1,'openvdb::v3_2_0::tree::LeafNode::cendChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a247bd2c5f4dc62da9f5c5c767d45644d',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::cendChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a247bd2c5f4dc62da9f5c5c767d45644d',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::cendChildAll()']]], + ['cendchildoff',['cendChildOff',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a1191134a87bc47cd04b0043323a80492',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::cendChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a1191134a87bc47cd04b0043323a80492',1,'openvdb::v3_2_0::tree::LeafNode::cendChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a1191134a87bc47cd04b0043323a80492',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::cendChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a1191134a87bc47cd04b0043323a80492',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::cendChildOff()']]], + ['cendchildon',['cendChildOn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a53f2d73cca3ccdcaadc8a2978ae0f1d2',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::cendChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a53f2d73cca3ccdcaadc8a2978ae0f1d2',1,'openvdb::v3_2_0::tree::LeafNode::cendChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a53f2d73cca3ccdcaadc8a2978ae0f1d2',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::cendChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a53f2d73cca3ccdcaadc8a2978ae0f1d2',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::cendChildOn()']]], + ['cendvalueall',['cendValueAll',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a60c2e5ff1f794fa63efe164d93360abf',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::cendValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a60c2e5ff1f794fa63efe164d93360abf',1,'openvdb::v3_2_0::tree::LeafNode::cendValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a60c2e5ff1f794fa63efe164d93360abf',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::cendValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a60c2e5ff1f794fa63efe164d93360abf',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::cendValueAll()']]], + ['cendvalueoff',['cendValueOff',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#aea3e9e0c9c570396843341ae2caee3e3',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::cendValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aea3e9e0c9c570396843341ae2caee3e3',1,'openvdb::v3_2_0::tree::LeafNode::cendValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aea3e9e0c9c570396843341ae2caee3e3',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::cendValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aea3e9e0c9c570396843341ae2caee3e3',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::cendValueOff()']]], + ['cendvalueon',['cendValueOn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#abf8670164bdd9e853f8991c94e10b880',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::cendValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#abf8670164bdd9e853f8991c94e10b880',1,'openvdb::v3_2_0::tree::LeafNode::cendValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#abf8670164bdd9e853f8991c94e10b880',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::cendValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#abf8670164bdd9e853f8991c94e10b880',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::cendValueOn()']]], + ['chaint',['ChainT',['../structopenvdb_1_1v3__2__0_1_1math_1_1LevelSetHDDA.html#a2c79d774d4a2e3f522ae5718a02b61fb',1,'openvdb::v3_2_0::math::LevelSetHDDA::ChainT()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA.html#a2c79d774d4a2e3f522ae5718a02b61fb',1,'openvdb::v3_2_0::math::VolumeHDDA::ChainT()']]], + ['changeasymmetriclevelsetbackground',['changeAsymmetricLevelSetBackground',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a7573006df5786ba9cd6c564e4bd589ac',1,'openvdb::v3_2_0::tools']]], + ['changebackground',['changeBackground',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ad795f2f3910144753a5e03d12f4703de',1,'openvdb::v3_2_0::tools']]], + ['changebackground_2eh',['ChangeBackground.h',['../ChangeBackground_8h.html',1,'']]], + ['changebackgroundop',['ChangeBackgroundOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeBackgroundOp.html#a28dd0f5a6ad6ceaf387a1b2cf744be73',1,'openvdb::v3_2_0::tools::ChangeBackgroundOp']]], + ['changebackgroundop',['ChangeBackgroundOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeBackgroundOp.html',1,'openvdb::v3_2_0::tools']]], + ['changelevelsetbackground',['changeLevelSetBackground',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ae9b9e9c02f534160f2571613f2d67ef5',1,'openvdb::v3_2_0::tools']]], + ['changelevelsetbackgroundop',['ChangeLevelSetBackgroundOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeLevelSetBackgroundOp.html#aad6a412d71e021a32dab578877303b7e',1,'openvdb::v3_2_0::tools::ChangeLevelSetBackgroundOp']]], + ['changelevelsetbackgroundop',['ChangeLevelSetBackgroundOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeLevelSetBackgroundOp.html',1,'openvdb::v3_2_0::tools']]], + ['changes_2etxt',['changes.txt',['../changes_8txt.html',1,'']]], + ['charleafnodetype',['CharLeafNodeType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1LabelBoundaryVoxels.html#a07a7a0392b416d6706755bf5adb4e60d',1,'openvdb::v3_2_0::tools::level_set_util_internal::LabelBoundaryVoxels']]], + ['check',['check',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Diagnose.html#a177323339f52aac0669cb558f3f68605',1,'openvdb::v3_2_0::tools::Diagnose::check()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#a09755336ff29947926252e6c0b4b667c',1,'openvdb::v3_2_0::tools::CheckLevelSet::check()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#a66846fa078581b8f5c1d59c9fa9f1b58',1,'openvdb::v3_2_0::tools::CheckFogVolume::check()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ValidateIntersectingVoxels_1_1IsNegative.html#a4d06ba82acc4203fbed9ee6d726e93dd',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ValidateIntersectingVoxels::IsNegative::check()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RemoveSelfIntersectingSurface_1_1Comp.html#a4d06ba82acc4203fbed9ee6d726e93dd',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RemoveSelfIntersectingSurface::Comp::check()']]], + ['checkbackground',['checkBackground',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#aad6b28cf0790b57a5a14dc43b97646fd',1,'openvdb::v3_2_0::tools::CheckLevelSet::checkBackground()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#a5bf9e0386212f92d3cb28a26bb78cbfd',1,'openvdb::v3_2_0::tools::CheckFogVolume::checkBackground()']]], + ['checkclasstype',['checkClassType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#aee1ca640b617e83cf360e494ce7ebea2',1,'openvdb::v3_2_0::tools::CheckLevelSet::checkClassType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#aee1ca640b617e83cf360e494ce7ebea2',1,'openvdb::v3_2_0::tools::CheckFogVolume::checkClassType()']]], + ['checkdivergence',['CheckDivergence',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#aac8c968c4c15fd7fb33f34712d7add58',1,'openvdb::v3_2_0::tools::CheckDivergence']]], + ['checkdivergence',['CheckDivergence',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html',1,'openvdb::v3_2_0::tools']]], + ['checkeikonal',['CheckEikonal',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#a9fedbb3997d12b6a5dd13e18e2524235',1,'openvdb::v3_2_0::tools::CheckEikonal::CheckEikonal(const GridT &grid, const ValueType &_min, const ValueType &_max)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#aa98b68032c78c43ce45e74953d902afd',1,'openvdb::v3_2_0::tools::CheckEikonal::CheckEikonal(const CheckEikonal &other)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#a67b66d5518e6bbf3ababd7a45fe3bd85',1,'openvdb::v3_2_0::tools::CheckLevelSet::checkEikonal()']]], + ['checkeikonal',['CheckEikonal',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html',1,'openvdb::v3_2_0::tools']]], + ['checkerboard',['checkerboard',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Film.html#a861f70d1d74712c42f56c15383f1c7be',1,'openvdb::v3_2_0::tools::Film']]], + ['checkfinite',['CheckFinite',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckFinite.html#a513d7c3c24bdc6548e7b70561b8d6249',1,'openvdb::v3_2_0::tools::CheckFinite::CheckFinite()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#af9c06f017e98f47be7bdebf9d3855ddc',1,'openvdb::v3_2_0::tools::CheckLevelSet::checkFinite()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#af9c06f017e98f47be7bdebf9d3855ddc',1,'openvdb::v3_2_0::tools::CheckFogVolume::checkFinite()']]], + ['checkfinite',['CheckFinite',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckFinite.html',1,'openvdb::v3_2_0::tools']]], + ['checkfogvolume',['CheckFogVolume',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#adf81362678fa31b9ce9eecbae327b1b9',1,'openvdb::v3_2_0::tools::CheckFogVolume::CheckFogVolume()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ab03bd92afef729f144e63f37f417c96d',1,'openvdb::v3_2_0::tools::checkFogVolume()']]], + ['checkfogvolume',['CheckFogVolume',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html',1,'openvdb::v3_2_0::tools']]], + ['checkinactivevalues',['checkInactiveValues',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#ad4111e76aa0c69ffc879adf7c8df3d8e',1,'openvdb::v3_2_0::tools::CheckLevelSet::checkInactiveValues()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#ad4111e76aa0c69ffc879adf7c8df3d8e',1,'openvdb::v3_2_0::tools::CheckFogVolume::checkInactiveValues()']]], + ['checkinf',['CheckInf',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckInf.html#a0bb2aa64a1e0e02d43389a09df7bff15',1,'openvdb::v3_2_0::tools::CheckInf']]], + ['checkinf',['CheckInf',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckInf.html',1,'openvdb::v3_2_0::tools']]], + ['checkinterrupter',['checkInterrupter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a0bdbe0c728d23a37dc60bb82a56653a5',1,'openvdb::v3_2_0::tools::LevelSetTracker']]], + ['checklevelset',['CheckLevelSet',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#a725b706f4ebc5bf48c7d4b6d238b5e2a',1,'openvdb::v3_2_0::tools::CheckLevelSet::CheckLevelSet()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ae07091e4e6f1cfb869111d233da6d9b9',1,'openvdb::v3_2_0::tools::checkLevelSet()']]], + ['checklevelset',['CheckLevelSet',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html',1,'openvdb::v3_2_0::tools']]], + ['checkmagnitude',['CheckMagnitude',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMagnitude.html#ad6eec2e85a2c5e01ba56ce6410df5e1b',1,'openvdb::v3_2_0::tools::CheckMagnitude']]], + ['checkmagnitude',['CheckMagnitude',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMagnitude.html',1,'openvdb::v3_2_0::tools']]], + ['checkmax',['CheckMax',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMax.html#aec8126495a6d7af277a19efd05fd3638',1,'openvdb::v3_2_0::tools::CheckMax']]], + ['checkmax',['CheckMax',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMax.html',1,'openvdb::v3_2_0::tools']]], + ['checkmin',['CheckMin',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMin.html#a545e064995ca65e3ee4fa70de752bb5c',1,'openvdb::v3_2_0::tools::CheckMin']]], + ['checkmin',['CheckMin',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMin.html',1,'openvdb::v3_2_0::tools']]], + ['checknan',['CheckNan',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNan.html#a75d0f9e3e69bbf86a2dd9212e1dbfbca',1,'openvdb::v3_2_0::tools::CheckNan']]], + ['checknan',['CheckNan',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNan.html',1,'openvdb::v3_2_0::tools']]], + ['checkneighbours',['checkNeighbours',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal.html#ad57b6d1ef25c23ea9090da3a6b1505ca',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::checkNeighbours(const Index pos, const typename LeafNodeType::ValueType *data, bool(&mask)[26])'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal.html#a4c492b525cf8af63ff3280dcb4ccb9e9',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::checkNeighbours(const Coord &ijk, AccessorType &acc, bool(&mask)[26])']]], + ['checknormgrad',['CheckNormGrad',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#a99a8614e5d78cf30cf659dda3f1b07d2',1,'openvdb::v3_2_0::tools::CheckNormGrad::CheckNormGrad(const GridT &grid, const ValueType &_min, const ValueType &_max)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#ac4e4d77d68099c3d142a93403972d542',1,'openvdb::v3_2_0::tools::CheckNormGrad::CheckNormGrad(const CheckNormGrad &other)']]], + ['checknormgrad',['CheckNormGrad',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html',1,'openvdb::v3_2_0::tools']]], + ['checkrange',['CheckRange',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckRange.html#a0746656b977b7876c68bd49b63174716',1,'openvdb::v3_2_0::tools::CheckRange::CheckRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#adb763eb487bb70bdc7fb3196bff283b5',1,'openvdb::v3_2_0::tools::CheckLevelSet::checkRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#adb763eb487bb70bdc7fb3196bff283b5',1,'openvdb::v3_2_0::tools::CheckFogVolume::checkRange()']]], + ['checkrange',['CheckRange',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckRange.html',1,'openvdb::v3_2_0::tools']]], + ['checktiles',['checkTiles',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#aace6a0b2a9b8cc1d8d4644dc32203624',1,'openvdb::v3_2_0::tools::CheckLevelSet']]], + ['checktransform',['checkTransform',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#a3d224a6e8f2cabdfac3c7a0d9769d5d3',1,'openvdb::v3_2_0::tools::CheckLevelSet']]], + ['checkvaluetype',['checkValueType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#a1b604cf33dc658941e7be48cda9a6f78',1,'openvdb::v3_2_0::tools::CheckLevelSet::checkValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#a1b604cf33dc658941e7be48cda9a6f78',1,'openvdb::v3_2_0::tools::CheckFogVolume::checkValueType()']]], + ['child',['child',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01false_00_01ValueT_00_01ChildT_01_4.html#a929f8b62da5b9d241a3a9661b6ce7768',1,'openvdb::v3_2_0::tree::NodeUnionImpl< false, ValueT, ChildT >::child()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01true_00_01ValueT_00_01ChildT_01_4.html#a929f8b62da5b9d241a3a9661b6ce7768',1,'openvdb::v3_2_0::tree::NodeUnionImpl< true, ValueT, ChildT >::child()']]], + ['childall',['ChildAll',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ChildAll.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['childall',['ChildAll',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ChildAll.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['childall',['ChildAll',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a4eaf633cc26bf43d0937eaea095427a9',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['childallciter',['ChildAllCIter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a7ab4a48f20c4fe38104d3a71801d65aa',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ChildAllCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a565353f9d0dca60c20f0ce1840fb2733',1,'openvdb::v3_2_0::tree::InternalNode::ChildAllCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a14f3a4397381364921a21f6f8994c9e0',1,'openvdb::v3_2_0::tree::LeafNode::ChildAllCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a77041c54eb75a0113bb6743ddf6cd6a4',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ChildAllCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a77041c54eb75a0113bb6743ddf6cd6a4',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ChildAllCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a5c461535e88fbfbfc15b7e61fff84983',1,'openvdb::v3_2_0::tree::RootNode::ChildAllCIter()']]], + ['childalliter',['ChildAllIter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#adb126aa251a21bf7558649e89a93a523',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ChildAllIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a8e0a205ac14a3e97e798a1d64909d860',1,'openvdb::v3_2_0::tree::InternalNode::ChildAllIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#adda674a4902e81b3c818861a09dbb7bd',1,'openvdb::v3_2_0::tree::LeafNode::ChildAllIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a77c08cf78e8db1ab4fb56fdc582bfe73',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ChildAllIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a77c08cf78e8db1ab4fb56fdc582bfe73',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ChildAllIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#adcd9bb29a11e8141a078145b43328802',1,'openvdb::v3_2_0::tree::RootNode::ChildAllIter()']]], + ['childiter',['ChildIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ChildIter.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['childiter',['ChildIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ChildIter.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['childiter',['ChildIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ChildIter.html',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >']]], + ['childiter',['ChildIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ChildIter.html',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >']]], + ['childiter',['ChildIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ChildIter.html#a9bddc790a5fa22be7abbad3f075adae2',1,'openvdb::v3_2_0::tree::InternalNode::ChildIter::ChildIter()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ChildIter.html#a653a046afd70c8b513404c5e82fa0aa7',1,'openvdb::v3_2_0::tree::InternalNode::ChildIter::ChildIter(const MaskIterT &iter, NodeT *parent)'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ChildIter.html#a9bddc790a5fa22be7abbad3f075adae2',1,'openvdb::v3_2_0::tree::LeafNode::ChildIter::ChildIter()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ChildIter.html#a653a046afd70c8b513404c5e82fa0aa7',1,'openvdb::v3_2_0::tree::LeafNode::ChildIter::ChildIter(const MaskIterT &iter, NodeT *parent)'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ChildIter.html#a9bddc790a5fa22be7abbad3f075adae2',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ChildIter::ChildIter()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ChildIter.html#a653a046afd70c8b513404c5e82fa0aa7',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ChildIter::ChildIter(const MaskIterT &iter, NodeT *parent)'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ChildIter.html#a9bddc790a5fa22be7abbad3f075adae2',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ChildIter::ChildIter()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ChildIter.html#a653a046afd70c8b513404c5e82fa0aa7',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ChildIter::ChildIter(const MaskIterT &iter, NodeT *parent)']]], + ['childitert',['ChildIterT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CsgVisitorBase.html#af32b9db747e3ab21ad2970f77bcc9bb3',1,'openvdb::v3_2_0::tools::CsgVisitorBase::ChildIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgUnionVisitor.html#af32b9db747e3ab21ad2970f77bcc9bb3',1,'openvdb::v3_2_0::tools::CsgUnionVisitor::ChildIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgIntersectVisitor.html#af32b9db747e3ab21ad2970f77bcc9bb3',1,'openvdb::v3_2_0::tools::CsgIntersectVisitor::ChildIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgDiffVisitor.html#af32b9db747e3ab21ad2970f77bcc9bb3',1,'openvdb::v3_2_0::tools::CsgDiffVisitor::ChildIterT()']]], + ['childnodetype',['ChildNodeType',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ab19550973f323999fb152aec7d5a7ad9',1,'openvdb::v3_2_0::tree::InternalNode::ChildNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#ad83f79a19cd0d8139fa36b64970243ce',1,'openvdb::v3_2_0::tree::DenseIteratorBase::ChildNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a2ecf727e32e2b6c3f8a9d5beffee11fe',1,'openvdb::v3_2_0::tree::RootNode::ChildNodeType()']]], + ['childoff',['ChildOff',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ChildOff.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['childoff',['ChildOff',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ChildOff.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['childoff',['ChildOff',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a544e8c97a6ab7f2a22a5bb35a86b08f7',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['childoffciter',['ChildOffCIter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a73437df4c3acd3bb0d60e15e62d63829',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ChildOffCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a4e598ebff5609a38e9fb716881c390af',1,'openvdb::v3_2_0::tree::InternalNode::ChildOffCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a1bea186ed4bbb116894853b34776eddb',1,'openvdb::v3_2_0::tree::LeafNode::ChildOffCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ab81e9441398d5d7ebd3251394b6936dd',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ChildOffCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ab81e9441398d5d7ebd3251394b6936dd',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ChildOffCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a9f494cfe68f77d9631d2f128ae0f23c0',1,'openvdb::v3_2_0::tree::RootNode::ChildOffCIter()']]], + ['childoffiter',['ChildOffIter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a652942d991cae3a33ece173893031e38',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ChildOffIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a6b3909a5ddc0a449d43f2e9e8fb336f6',1,'openvdb::v3_2_0::tree::InternalNode::ChildOffIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a4271855c8d737a1f653ce7429ef6c429',1,'openvdb::v3_2_0::tree::LeafNode::ChildOffIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a54fb1a14891083e010331e60ccf142f2',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ChildOffIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a54fb1a14891083e010331e60ccf142f2',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ChildOffIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a5d719774baffb6e2c58be81eb1239ccc',1,'openvdb::v3_2_0::tree::RootNode::ChildOffIter()']]], + ['childon',['ChildOn',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ChildOn.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['childon',['ChildOn',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ChildOn.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['childon',['ChildOn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#adeee6036e73f9c170119734cd24fad39',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['childonciter',['ChildOnCIter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ad68ec4694089cd26384293677e05b926',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ChildOnCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aa52a09abfc4a3d259a4dc97abcaa4a34',1,'openvdb::v3_2_0::tree::InternalNode::ChildOnCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a856fcbdcacc39bf9ca513899cf3e39e6',1,'openvdb::v3_2_0::tree::LeafNode::ChildOnCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a386533b2bcc1382b515d1981a863f9ee',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ChildOnCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a386533b2bcc1382b515d1981a863f9ee',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ChildOnCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a294c74833e2fcc71e6fee12b3ef9ffe9',1,'openvdb::v3_2_0::tree::RootNode::ChildOnCIter()']]], + ['childoniter',['ChildOnIter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a0d504d02dfabd78a417f8efab7785288',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ChildOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#afebcee7d85b715991e09f2c18c148b0e',1,'openvdb::v3_2_0::tree::InternalNode::ChildOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a4ba8ffa476a1b827d459eb9b7aeb543b',1,'openvdb::v3_2_0::tree::LeafNode::ChildOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a39ecedbe76c6da041ba9755a3077b735',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ChildOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a39ecedbe76c6da041ba9755a3077b735',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ChildOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#af278268a92236d9bd09bb723d1bac4a8',1,'openvdb::v3_2_0::tree::RootNode::ChildOnIter()']]], + ['childonitert',['ChildOnIterT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#aa4031b31c9766a09a5993e1c5b69d1e5',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase']]], + ['childt',['ChildT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#ae501b61e32c8527fd88c403320b6bc30',1,'openvdb::v3_2_0::tree::IterListItem::ChildT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#ae501b61e32c8527fd88c403320b6bc30',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::ChildT()']]], + ['chop',['Chop',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a2387bae5f5bad9174b92ed5040e98001',1,'openvdb::v3_2_0::math']]], + ['clamp',['CLAMP',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1Scheme.html#a28fd66b0310514194a2fb1d2473e3e29a44cabaec5bbbef7d3e4b7e9a259283f1',1,'openvdb::v3_2_0::tools::Scheme::CLAMP()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a5a0417db0cd8013d4558028024935ddc',1,'openvdb::v3_2_0::math::Clamp()']]], + ['clamp01',['Clamp01',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#afbec5b4dc838e68b0a19588b4f5974ab',1,'openvdb::v3_2_0::math']]], + ['clamptest01',['ClampTest01',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a8f920296f677c1599d4d3b28e96bf5d2',1,'openvdb::v3_2_0::math']]], + ['clear',['clear',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a5eeb94d22b8366d1b68d0614384802fe',1,'openvdb::v3_2_0::GridBase::clear()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#aae048282c7011eedc2e0492f6421ea73',1,'openvdb::v3_2_0::Grid::clear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1RowEditor.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::RowEditor::clear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapRegistry.html#a14dabca7589b28dc6adca2c5367546e1',1,'openvdb::v3_2_0::math::MapRegistry::clear()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Diagnose.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tools::Diagnose::clear()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tools::CheckLevelSet::clear()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tools::CheckFogVolume::clear()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFracture.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tools::LevelSetFracture::clear()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1Neighbor.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tools::Morphology::Neighbor::clear()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tools::Morphology::LeafCache::clear()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tools::PointPartitioner::clear()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1Array.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tools::point_partitioner_internal::Array::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::NodeList::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::NodeManagerLink::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::NodeManager::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::RootNode::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::Tree::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html#a5eeb94d22b8366d1b68d0614384802fe',1,'openvdb::v3_2_0::tree::ValueAccessorBase::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#aae048282c7011eedc2e0492f6421ea73',1,'openvdb::v3_2_0::tree::ValueAccessor::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::CacheItem::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#aae048282c7011eedc2e0492f6421ea73',1,'openvdb::v3_2_0::tree::ValueAccessor0::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#aae048282c7011eedc2e0492f6421ea73',1,'openvdb::v3_2_0::tree::ValueAccessor1::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#aae048282c7011eedc2e0492f6421ea73',1,'openvdb::v3_2_0::tree::ValueAccessor2::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#aae048282c7011eedc2e0492f6421ea73',1,'openvdb::v3_2_0::tree::ValueAccessor3::clear()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::util::PagedArray::clear()']]], + ['clearallaccessors',['clearAllAccessors',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a24a9fa1c5dbac50f2d5f406f8842e368',1,'openvdb::v3_2_0::tree::Tree']]], + ['cleargridclass',['clearGridClass',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a3c534325b373e839986bc3ceec2c419e',1,'openvdb::v3_2_0::GridBase::clearGridClass()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a3c534325b373e839986bc3ceec2c419e',1,'openvdb::v3_2_0::tools::MultiResGrid::clearGridClass()']]], + ['clearmetadata',['clearMetadata',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a9f1cb46fac5d18387f6f33691b582244',1,'openvdb::v3_2_0::MetaMap']]], + ['clearnotifier',['clearNotifier',['../classopenvdb_1_1v3__2__0_1_1io_1_1MappedFile.html#adfeda8bbb07e15aaf191a702c0901cf7',1,'openvdb::v3_2_0::io::MappedFile']]], + ['clearnotifiers',['clearNotifiers',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a214735f6a6f189ed694f94b94aac6df2',1,'openvdb::v3_2_0::io::Queue']]], + ['clearquads',['clearQuads',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#a3fe0b148e78c1ea8da416f46e7e860c1',1,'openvdb::v3_2_0::tools::PolygonPool']]], + ['clearregistry',['clearRegistry',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#acf71679f2c3fee401465b443a08a77c0',1,'openvdb::v3_2_0::GridBase::clearRegistry()'],['../classopenvdb_1_1v3__2__0_1_1Metadata.html#acf71679f2c3fee401465b443a08a77c0',1,'openvdb::v3_2_0::Metadata::clearRegistry()']]], + ['clearstreammetadataptr',['clearStreamMetadataPtr',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#ae323d29d4dd862453ae5cf4cd2c9d252',1,'openvdb::v3_2_0::io']]], + ['cleartriangles',['clearTriangles',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#a4874d6c19a352271a6cd6249aebdb294',1,'openvdb::v3_2_0::tools::PolygonPool']]], + ['clearvectortype',['clearVectorType',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a736ac0fd0cc046077fa9cafac30ce5a9',1,'openvdb::v3_2_0::GridBase']]], + ['clip',['clip',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ac7e311a9da3fe887bc96ec532efce480',1,'openvdb::v3_2_0::GridBase::clip()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a409633b422404c1c7df4e0ffdd02eac1',1,'openvdb::v3_2_0::Grid::clip()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a9803a84f61d03f9c466b5fe533904d5f',1,'openvdb::v3_2_0::math::Ray::clip(const Vec3T &center, RealT radius)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a26fc5e2e54e857c95a7327db1a1a8698',1,'openvdb::v3_2_0::math::Ray::clip(const BBoxT &bbox)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ad73237cff1ce2ebd9c629a0da397e55f',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::clip()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a6f3646d9977051fa33eb17095e736e84',1,'openvdb::v3_2_0::tree::InternalNode::clip()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a6f3646d9977051fa33eb17095e736e84',1,'openvdb::v3_2_0::tree::LeafNode::clip()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#af9d5b5818c4771ed5cb5067c011326f8',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::clip()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#af9d5b5818c4771ed5cb5067c011326f8',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::clip()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a409633b422404c1c7df4e0ffdd02eac1',1,'openvdb::v3_2_0::tree::RootNode::clip()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a409633b422404c1c7df4e0ffdd02eac1',1,'openvdb::v3_2_0::tree::Tree::clip()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#abeb8f36fff220dff65eb5eaae1931897',1,'openvdb::v3_2_0::tools::clip(const GridType &grid, const BBoxd &)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a0b62dae45e343e32fde3db49031916b1',1,'openvdb::v3_2_0::tools::clip(const GridType &grid, const Grid< MaskTreeType > &mask)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aaecf7e4503f11468cc5fdc2ee37592eb',1,'openvdb::v3_2_0::tools::clip(const GridType1 &grid1, const Grid< TreeType2 > &grid2)']]], + ['clip_2eh',['Clip.h',['../Clip_8h.html',1,'']]], + ['clipgrid',['clipGrid',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a7d9768f753c671503d2ee5e2320117d7',1,'openvdb::v3_2_0::GridBase']]], + ['clipunallocatednodes',['clipUnallocatedNodes',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#aa1c2581d705ae9b68906690051cb3898',1,'openvdb::v3_2_0::tree::TreeBase::clipUnallocatedNodes()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a736e8b7a839343fb5f7c02e2e61308a8',1,'openvdb::v3_2_0::tree::Tree::clipUnallocatedNodes()']]], + ['close',['close',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a5ae591df94fc66ccb85cbb6565368bca',1,'openvdb::v3_2_0::io::File::close()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1TempFile.html#a5ae591df94fc66ccb85cbb6565368bca',1,'openvdb::v3_2_0::io::TempFile::close()']]], + ['closestpointdist',['ClosestPointDist',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1ClosestPointDist.html',1,'openvdb::v3_2_0::tools::internal']]], + ['closestpointdist',['ClosestPointDist',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1ClosestPointDist.html#ac17ffcc1d95497105fe71f7b1a576f4c',1,'openvdb::v3_2_0::tools::internal::ClosestPointDist']]], + ['closestpointonsegmenttopoint',['closestPointOnSegmentToPoint',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a614bc75aa3ae09ff873b6d135dc4cb60',1,'openvdb::v3_2_0::math']]], + ['closestpointontriangletopoint',['closestPointOnTriangleToPoint',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a24eb4d50e7a633d920bffb959560ac42',1,'openvdb::v3_2_0::math']]], + ['closestpointprojector',['ClosestPointProjector',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestPointProjector.html',1,'openvdb::v3_2_0::tools']]], + ['closestpointprojector',['ClosestPointProjector',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestPointProjector.html#a80ee61ec938eaca7be182b50b3a1f65d',1,'openvdb::v3_2_0::tools::ClosestPointProjector::ClosestPointProjector()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestPointProjector.html#ae8f5f20d5238c7320c2ef884be22f4fd',1,'openvdb::v3_2_0::tools::ClosestPointProjector::ClosestPointProjector(const CptGridType &cptGrid, int n)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestPointProjector.html#a20cc9db932a51e508d56efa1b2d7f5e2',1,'openvdb::v3_2_0::tools::ClosestPointProjector::ClosestPointProjector(const ClosestPointProjector &other)']]], + ['closestpointprojectortype',['ClosestPointProjectorType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#ab5aaf0b446daddd92db57e5db960d5c0',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect']]], + ['closestsurfacepoint',['ClosestSurfacePoint',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestSurfacePoint.html',1,'openvdb::v3_2_0::tools']]], + ['closestsurfacepoint',['ClosestSurfacePoint',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestSurfacePoint.html#a02316f5d76399e04dd83db8c2d0ae2fb',1,'openvdb::v3_2_0::tools::ClosestSurfacePoint']]], + ['coarsestconsttree',['coarsestConstTree',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a7eb92b553fe3c0d5e1ea70cc9e0d6907',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['coarsestconsttreeptr',['coarsestConstTreePtr',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a8b86efc13bae612a705992902acdd735',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['coarsestlevel',['coarsestLevel',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a36765a628ea15b4aaa1f8258fec271a8',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['coarsesttree',['coarsestTree',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#ae0382a4ead702acf618777db703d1117',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['coarsesttreeptr',['coarsestTreePtr',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#aed36d867943d8dca1053b7c2bd665fd7',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['coding_20style',['Coding Style',['../codingStyle.html',1,'index']]], + ['codingstyle_2etxt',['codingstyle.txt',['../codingstyle_8txt.html',1,'']]], + ['cofactor',['cofactor',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a3046a801fcc8bf2908e593b1d4f32477',1,'openvdb::v3_2_0::math::Mat3']]], + ['col',['col',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a0be7ef8d3fb41427f942546f4745e5ac',1,'openvdb::v3_2_0::math::Mat3::col()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a7f3f03ad0e44c62ba30750d445b4b1e9',1,'openvdb::v3_2_0::math::Mat4::col()']]], + ['collectcornervalues',['collectCornerValues',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a244219e22fda9ce03e6c9ab10297f3c2',1,'openvdb::v3_2_0::tools::internal::collectCornerValues(const LeafT &leaf, const Index offset, std::vector< double > &values)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a12e6c9936094e129b2725557a11e59ba',1,'openvdb::v3_2_0::tools::internal::collectCornerValues(const AccessorT &acc, const Coord &ijk, std::vector< double > &values)']]], + ['column',['column',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1ConstValueIter.html#a199de0c151fc2d728c7075b455e92fbc',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::ConstValueIter']]], + ['combine',['combine',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ae2ee6db19642244188d2fa4db7df1225',1,'openvdb::v3_2_0::tree::InternalNode::combine(InternalNode &other, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aff253b22319635ebad8bfcca2719003a',1,'openvdb::v3_2_0::tree::InternalNode::combine(const ValueType &value, bool valueIsActive, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a949b19d7cd86ab3945a8eb5e0f68e546',1,'openvdb::v3_2_0::tree::LeafNode::combine(const LeafNode &other, CombineOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#af91591f5f0da41c8662c7cc1ece29e06',1,'openvdb::v3_2_0::tree::LeafNode::combine(const ValueType &value, bool valueIsActive, CombineOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a949b19d7cd86ab3945a8eb5e0f68e546',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::combine(const LeafNode &other, CombineOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#af0da65877695f5ad134210d98f4d3c3b',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::combine(bool, bool valueIsActive, CombineOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a949b19d7cd86ab3945a8eb5e0f68e546',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::combine(const LeafNode &other, CombineOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#af0da65877695f5ad134210d98f4d3c3b',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::combine(bool, bool valueIsActive, CombineOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a2d0f6f48c7b53111118bf1a14a8dff03',1,'openvdb::v3_2_0::tree::RootNode::combine()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a11ca864d49b3df73bd482307bd800577',1,'openvdb::v3_2_0::tree::Tree::combine(Tree &other, CombineOp &op, bool prune=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a3d84c2c10bb99b93dd6be52bf153b43b',1,'openvdb::v3_2_0::tree::Tree::combine(Tree &other, const CombineOp &op, bool prune=false)']]], + ['combine2',['combine2',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a5d4331edaf20f7ae003e5cbf79349bd1',1,'openvdb::v3_2_0::tree::InternalNode::combine2(const InternalNode &other0, const OtherNodeType &other1, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a58de46634dd65d1fe2e2086accaa9b2d',1,'openvdb::v3_2_0::tree::InternalNode::combine2(const ValueType &value, const OtherNodeType &other, bool valIsActive, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a551c0e1b0cbb5ae00eee28bacc8f485a',1,'openvdb::v3_2_0::tree::InternalNode::combine2(const InternalNode &other, const OtherValueType &, bool valIsActive, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aa4357e9061a929862d8624e16d6a53bd',1,'openvdb::v3_2_0::tree::LeafNode::combine2(const LeafNode &other, const OtherType &, bool valueIsActive, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a71b82ba9fc3928aada4d493dec89be7d',1,'openvdb::v3_2_0::tree::LeafNode::combine2(const ValueType &, const OtherNodeT &other, bool valueIsActive, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#acfffe9e1e78fc6de78b890a2c2adaa44',1,'openvdb::v3_2_0::tree::LeafNode::combine2(const LeafNode &b0, const OtherNodeT &b1, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aa4357e9061a929862d8624e16d6a53bd',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::combine2(const LeafNode &other, const OtherType &, bool valueIsActive, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a24f1729c8fd269ad50d3aad78f98add4',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::combine2(bool, const OtherNodeT &other, bool valueIsActive, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#acfffe9e1e78fc6de78b890a2c2adaa44',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::combine2(const LeafNode &b0, const OtherNodeT &b1, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aa4357e9061a929862d8624e16d6a53bd',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::combine2(const LeafNode &other, const OtherType &, bool valueIsActive, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a24f1729c8fd269ad50d3aad78f98add4',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::combine2(bool, const OtherNodeT &other, bool valueIsActive, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#acfffe9e1e78fc6de78b890a2c2adaa44',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::combine2(const LeafNode &b0, const OtherNodeT &b1, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a59d05166d77d6604823a6e669f3b53f7',1,'openvdb::v3_2_0::tree::RootNode::combine2()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1RootNodeCombineHelper.html#a5ef2d44c98d26e65a4358489ca8c5488',1,'openvdb::v3_2_0::tree::RootNodeCombineHelper::combine2()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1RootNodeCombineHelper_3_01CombineOp_00_01RootT_00_01OtherRootT_00_01true_01_4.html#a5c3917fa037d57120324df9ea6d47db4',1,'openvdb::v3_2_0::tree::RootNodeCombineHelper< CombineOp, RootT, OtherRootT, true >::combine2()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#af1cbd79b5ac7b0898386849c5d93e4cc',1,'openvdb::v3_2_0::tree::Tree::combine2(const Tree &a, const OtherTreeType &b, CombineOp &op, bool prune=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#aa5795706d9693640529f8a55ac1001fc',1,'openvdb::v3_2_0::tree::Tree::combine2(const Tree &a, const OtherTreeType &b, const CombineOp &op, bool prune=false)']]], + ['combine2extended',['combine2Extended',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a878302f18a7f23adac7da7a9fc5f7441',1,'openvdb::v3_2_0::tree::Tree::combine2Extended(const Tree &a, const OtherTreeType &b, ExtendedCombineOp &op, bool prune=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a606623b3e96a1a62594583f54fdb30e0',1,'openvdb::v3_2_0::tree::Tree::combine2Extended(const Tree &a, const OtherTreeType &b, const ExtendedCombineOp &, bool prune=false)']]], + ['combineargs',['CombineArgs',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html',1,'openvdb::v3_2_0']]], + ['combineargs',['CombineArgs',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#ae69037e15d18f052688bbe751eac6199',1,'openvdb::v3_2_0::CombineArgs::CombineArgs()'],['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a3492cac0054304429935ada65f0fe782',1,'openvdb::v3_2_0::CombineArgs::CombineArgs(const AValueType &a, const BValueType &b, AValueType &result, bool aOn=false, bool bOn=false)'],['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a8e3a802901da29f19d424e6bfd4fa417',1,'openvdb::v3_2_0::CombineArgs::CombineArgs(const AValueType &a, const BValueType &b, bool aOn=false, bool bOn=false)']]], + ['combinedata',['combineData',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal.html#a8bae52770c226e8c22e527eb053d4827',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['combineextended',['combineExtended',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a71140d5e67f0fce2c7fe0ae119db9711',1,'openvdb::v3_2_0::tree::Tree::combineExtended(Tree &other, ExtendedCombineOp &op, bool prune=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#aa1557fead163be5539d36caffdbf0fb2',1,'openvdb::v3_2_0::tree::Tree::combineExtended(Tree &other, const ExtendedCombineOp &op, bool prune=false)']]], + ['combineleafnodes',['CombineLeafNodes',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1CombineLeafNodes.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['combineleafnodes',['CombineLeafNodes',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1CombineLeafNodes.html#a69ecd22b280193f9773d3f8565ffcdcf',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::CombineLeafNodes']]], + ['combineopadapter',['CombineOpAdapter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1CombineOpAdapter.html',1,'openvdb::v3_2_0::tree']]], + ['combineopadapter',['CombineOpAdapter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1CombineOpAdapter.html#ad2d224316703cd37051d2a2cecc67bb9',1,'openvdb::v3_2_0::tree::CombineOpAdapter']]], + ['comp',['Comp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RemoveSelfIntersectingSurface_1_1Comp.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RemoveSelfIntersectingSurface']]], + ['compdiv',['compDiv',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a2565bf7102af40b08386e7333ff96a6a',1,'openvdb::v3_2_0::tools']]], + ['compmax',['compMax',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#acf57bff918cf1f0be98f38a9fa18cce6',1,'openvdb::v3_2_0::tools']]], + ['compmin',['compMin',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a6e06fdbb69917492f3706fd07ead8adb',1,'openvdb::v3_2_0::tools']]], + ['compmul',['compMul',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a731304db65a743a015a7591eebf1c835',1,'openvdb::v3_2_0::tools']]], + ['component',['component',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a8f484f26fa31f4bbe63d6d7c71796e13',1,'openvdb::v3_2_0::math::Vec2::component()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ae99eb03cef2ece27e175199807ae4f8a',1,'openvdb::v3_2_0::math::Vec3::component()']]], + ['composite_2eh',['Composite.h',['../Composite_8h.html',1,'']]], + ['compositefromleaf',['compositeFromLeaf',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#afe32bb9a992beefce5dfd17319297268',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor']]], + ['compositefromtile',['compositeFromTile',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#a5c4aad82434eab4352a71cc44b6e1536',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor']]], + ['compositefunctortranslator',['CompositeFunctorTranslator',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator.html',1,'openvdb::v3_2_0::tools::ds']]], + ['compositefunctortranslator_3c_20ds_5fadd_2c_20valuet_20_3e',['CompositeFunctorTranslator< DS_ADD, ValueT >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator_3_01DS__ADD_00_01ValueT_01_4.html',1,'openvdb::v3_2_0::tools::ds']]], + ['compositefunctortranslator_3c_20ds_5fmax_2c_20valuet_20_3e',['CompositeFunctorTranslator< DS_MAX, ValueT >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator_3_01DS__MAX_00_01ValueT_01_4.html',1,'openvdb::v3_2_0::tools::ds']]], + ['compositefunctortranslator_3c_20ds_5fmin_2c_20valuet_20_3e',['CompositeFunctorTranslator< DS_MIN, ValueT >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator_3_01DS__MIN_00_01ValueT_01_4.html',1,'openvdb::v3_2_0::tools::ds']]], + ['compositefunctortranslator_3c_20ds_5fmult_2c_20valuet_20_3e',['CompositeFunctorTranslator< DS_MULT, ValueT >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator_3_01DS__MULT_00_01ValueT_01_4.html',1,'openvdb::v3_2_0::tools::ds']]], + ['compositefunctortranslator_3c_20ds_5fover_2c_20valuet_20_3e',['CompositeFunctorTranslator< DS_OVER, ValueT >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator_3_01DS__OVER_00_01ValueT_01_4.html',1,'openvdb::v3_2_0::tools::ds']]], + ['compositefunctortranslator_3c_20ds_5fsub_2c_20valuet_20_3e',['CompositeFunctorTranslator< DS_SUB, ValueT >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator_3_01DS__SUB_00_01ValueT_01_4.html',1,'openvdb::v3_2_0::tools::ds']]], + ['compositetodense',['compositeToDense',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac53b377981f3baf29cef347335e3588b',1,'openvdb::v3_2_0::tools']]], + ['compoundmap',['CompoundMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#a6bf39fb0d71eca30d681fe1adb2d1fc6',1,'openvdb::v3_2_0::math::CompoundMap::CompoundMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#aa42ac81a06ca34e3457863521a694470',1,'openvdb::v3_2_0::math::CompoundMap::CompoundMap(const FirstMapType &f, const SecondMapType &s)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#af5594229299e69497ad32ee5c49e6102',1,'openvdb::v3_2_0::math::CompoundMap::CompoundMap(const MyType &other)']]], + ['compoundmap',['CompoundMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html',1,'openvdb::v3_2_0::math']]], + ['compreplace',['compReplace',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ae407286d51064dc0f07b441dab49798e',1,'openvdb::v3_2_0::tools']]], + ['compreplaceop',['CompReplaceOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CompReplaceOp.html#ad4225763b16eab017459c58462a397d1',1,'openvdb::v3_2_0::tools::CompReplaceOp']]], + ['compreplaceop',['CompReplaceOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CompReplaceOp.html',1,'openvdb::v3_2_0::tools']]], + ['compress_5factive_5fmask',['COMPRESS_ACTIVE_MASK',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a80155586fa275b28773c9b203f52cabaaab5404cf6e4f3efed496cc038df1668a',1,'openvdb::v3_2_0::io']]], + ['compress_5fblosc',['COMPRESS_BLOSC',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a80155586fa275b28773c9b203f52cabaa7d16c31c4175c842dcb0c691db256054',1,'openvdb::v3_2_0::io']]], + ['compress_5fnone',['COMPRESS_NONE',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a80155586fa275b28773c9b203f52cabaa8169e186323cc23f0f8f305f45109da2',1,'openvdb::v3_2_0::io']]], + ['compress_5fzip',['COMPRESS_ZIP',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a80155586fa275b28773c9b203f52cabaab3a501c0f9978fdec6f0b2b95aea9f43',1,'openvdb::v3_2_0::io']]], + ['compression',['compression',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#ac7b909b151a02c8cd69cbe56e5eea689',1,'openvdb::v3_2_0::io::Archive::compression()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#ac7b909b151a02c8cd69cbe56e5eea689',1,'openvdb::v3_2_0::io::StreamMetadata::compression()']]], + ['compression_2eh',['Compression.h',['../Compression_8h.html',1,'']]], + ['compressiontostring',['compressionToString',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a1d85a5811e062e2bcb0ce3bbb825a44a',1,'openvdb::v3_2_0::io']]], + ['compsum',['compSum',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aa6cbb5a769e8b017110c4a24fa84d248',1,'openvdb::v3_2_0::tools']]], + ['compute',['compute',['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature.html#a67cf36b3021e8e2ddae065739efcf2c0',1,'openvdb::v3_2_0::math::MeanCurvature::compute(const MapType &map, const Accessor &grid, const Coord &ijk, double &alpha, double &beta)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature.html#aa55c14648382ad9f282cbc79dacd944a',1,'openvdb::v3_2_0::math::MeanCurvature::compute(const MapType &map, const StencilT &stencil, double &alpha, double &beta)']]], + ['computeactivevoxelcount',['ComputeActiveVoxelCount',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ComputeActiveVoxelCount.html#acd61eda39095065ec1f52bd64cf3665d',1,'openvdb::v3_2_0::tools::level_set_util_internal::ComputeActiveVoxelCount']]], + ['computeactivevoxelcount',['ComputeActiveVoxelCount',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ComputeActiveVoxelCount.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['computecellpoints',['computeCellPoints',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#ab81e591f2d6826b625a2ff3b49bf8920',1,'openvdb::v3_2_0::tools::internal::computeCellPoints(std::vector< Vec3d > &points, const std::vector< double > &values, unsigned char signs, double iso)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a66b081717743ee3701ad4f3e1448358a',1,'openvdb::v3_2_0::tools::internal::computeCellPoints(std::vector< Vec3d > &points, std::vector< bool > &weightedPointMask, const std::vector< double > &lhsValues, const std::vector< double > &rhsValues, unsigned char lhsSigns, unsigned char rhsSigns, double iso, size_t pointIdx, const boost::scoped_array< uint32_t > &seamPoints)']]], + ['computeenclosedregionmask',['computeEnclosedRegionMask',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal.html#ace4216536f72ce036b48eb5389069f4a',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['computeextremas',['ComputeExtremas',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1ComputeExtremas.html#ac97c90a4b5f81ba55350ae87ae6cb54e',1,'openvdb::v3_2_0::tools::particle_atlas_internal::ComputeExtremas::ComputeExtremas(const ParticleArrayT &particles)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1ComputeExtremas.html#aacdbc9cfd4494dde598c20e3b5003b46',1,'openvdb::v3_2_0::tools::particle_atlas_internal::ComputeExtremas::ComputeExtremas(ComputeExtremas &rhs, tbb::split)']]], + ['computeextremas',['ComputeExtremas',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1ComputeExtremas.html',1,'openvdb::v3_2_0::tools::particle_atlas_internal']]], + ['computeinteriormask',['computeInteriorMask',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal.html#a1fd7f60b1405ad39aaca76bf85b7abbd',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['computeintersectingvoxelsign',['ComputeIntersectingVoxelSign',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeIntersectingVoxelSign.html#abb321cc567591c970c99453414160124',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ComputeIntersectingVoxelSign']]], + ['computeintersectingvoxelsign',['ComputeIntersectingVoxelSign',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeIntersectingVoxelSign.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['computemaskedpoint',['computeMaskedPoint',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a088902175ab3304cdd2df518fd97a9f5',1,'openvdb::v3_2_0::tools::internal']]], + ['computenodeconnectivity',['ComputeNodeConnectivity',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeNodeConnectivity.html#a27c7bcab0d87c070987d3cde5be716d8',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ComputeNodeConnectivity']]], + ['computenodeconnectivity',['ComputeNodeConnectivity',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeNodeConnectivity.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['computepoint',['computePoint',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#abbef057f73b9386e4530baa75274efe8',1,'openvdb::v3_2_0::tools::internal']]], + ['computepointorderop',['ComputePointOrderOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1ComputePointOrderOp.html#a185800b427a1483bb6e4693ec1b704e8',1,'openvdb::v3_2_0::tools::point_partitioner_internal::ComputePointOrderOp']]], + ['computepointorderop',['ComputePointOrderOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1ComputePointOrderOp.html',1,'openvdb::v3_2_0::tools::point_partitioner_internal']]], + ['computeresidual',['computeResidual',['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal.html#a6880ef2d78157d066210bd882bba8bb3',1,'openvdb::v3_2_0::math::pcg::internal::computeResidual(const MatrixOperator &A, const VecValueType *x, const VecValueType *b, VecValueType *r)'],['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal.html#af1da82da87990bbcbb95d9eb85232b74',1,'openvdb::v3_2_0::math::pcg::internal::computeResidual(const MatrixOperator &A, const Vector< T > &x, const Vector< T > &b, Vector< T > &r)']]], + ['computeweightedpoint',['computeWeightedPoint',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a34cc93ab751c57cee7fc2af0885a46d2',1,'openvdb::v3_2_0::tools::internal']]], + ['conjgradient_2eh',['ConjGradient.h',['../ConjGradient_8h.html',1,'']]], + ['conjugate',['conjugate',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a8bca90cfe6ad95fbfad606a1148b9217',1,'openvdb::v3_2_0::math::Quat']]], + ['connectinstance',['connectInstance',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#ad5ada41f415dfcf074ca7f54e476b36d',1,'openvdb::v3_2_0::io::Archive']]], + ['connections',['connections',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1NodeMaskSegment.html#ac9926163402c881a0cbc5da7ea953a0b',1,'openvdb::v3_2_0::tools::level_set_util_internal::NodeMaskSegment']]], + ['connectivitytable',['ConnectivityTable',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SweepExteriorSign.html#acf8771bce7b214f0b5ae363a19da684c',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SweepExteriorSign::ConnectivityTable()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html#acf8771bce7b214f0b5ae363a19da684c',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedPoints::ConnectivityTable()']]], + ['connectnodemasksegments',['ConnectNodeMaskSegments',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ConnectNodeMaskSegments.html#a16c40eba00de0e84f637b57d4525f051',1,'openvdb::v3_2_0::tools::level_set_util_internal::ConnectNodeMaskSegments']]], + ['connectnodemasksegments',['ConnectNodeMaskSegments',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ConnectNodeMaskSegments.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['consistent',['consistent',['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1BoolSampler.html#afd3da75b32679d899a56532f92469c8f',1,'openvdb::v3_2_0::tools::clip_internal::BoolSampler::consistent()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler.html#afd3da75b32679d899a56532f92469c8f',1,'openvdb::v3_2_0::tools::Sampler::consistent()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointSampler.html#afd3da75b32679d899a56532f92469c8f',1,'openvdb::v3_2_0::tools::PointSampler::consistent()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html#afd3da75b32679d899a56532f92469c8f',1,'openvdb::v3_2_0::tools::BoxSampler::consistent()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadraticSampler.html#afd3da75b32679d899a56532f92469c8f',1,'openvdb::v3_2_0::tools::QuadraticSampler::consistent()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredPointSampler.html#afd3da75b32679d899a56532f92469c8f',1,'openvdb::v3_2_0::tools::StaggeredPointSampler::consistent()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredBoxSampler.html#afd3da75b32679d899a56532f92469c8f',1,'openvdb::v3_2_0::tools::StaggeredBoxSampler::consistent()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredQuadraticSampler.html#afd3da75b32679d899a56532f92469c8f',1,'openvdb::v3_2_0::tools::StaggeredQuadraticSampler::consistent()']]], + ['constaccessor',['ConstAccessor',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a63160186ea049fb0c37fd03113d50703',1,'openvdb::v3_2_0::Grid::ConstAccessor()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#ac9aec2a9eab747bd39b44184936880f3',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::ConstAccessor()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#ac9aec2a9eab747bd39b44184936880f3',1,'openvdb::v3_2_0::tools::PointIndexIterator::ConstAccessor()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexFilter.html#ac9aec2a9eab747bd39b44184936880f3',1,'openvdb::v3_2_0::tools::PointIndexFilter::ConstAccessor()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1MathOp.html#a6aef5ce0b49982c348b5598f159b76c2',1,'openvdb::v3_2_0::tools::stats_internal::MathOp::ConstAccessor()']]], + ['constaccessorptr',['ConstAccessorPtr',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#a7ef6d0d383fa9e4b6f214e19a483be73',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator']]], + ['constaccessorregistry',['ConstAccessorRegistry',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a5a699bff88287893dfa370e7bd2a74a8',1,'openvdb::v3_2_0::tree::Tree']]], + ['constaccessortype',['ConstAccessorType',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#ab8df5589cedd771f0cb45e2a3c1f732c',1,'openvdb::v3_2_0::TreeAdapter::ConstAccessorType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#ab8df5589cedd771f0cb45e2a3c1f732c',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::ConstAccessorType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#ab8df5589cedd771f0cb45e2a3c1f732c',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::ConstAccessorType()']]], + ['constbasetree',['constBaseTree',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a291ddcfbaaa8cf12d4cb5fdc46673760',1,'openvdb::v3_2_0::GridBase']]], + ['constbasetreeptr',['constBaseTreePtr',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a7a60fbf0e04a1ef3d6aeaa06a6623caf',1,'openvdb::v3_2_0::GridBase::constBaseTreePtr()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#abd214a6b93c28bd9f49f9dd563e5c1eb',1,'openvdb::v3_2_0::Grid::constBaseTreePtr()']]], + ['constdata',['constData',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a4341d2f827b5e261162a4fa79f728271',1,'openvdb::v3_2_0::math::pcg::Vector']]], + ['constgrid',['constGrid',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a97a38625f14bb07028b2d421212f7d4b',1,'openvdb::v3_2_0::GridBase::constGrid(const GridBase::Ptr &)'],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a5bb25c5b41aff4990486300e23563c31',1,'openvdb::v3_2_0::GridBase::constGrid(const GridBase::ConstPtr &)']]], + ['constgridptr',['ConstGridPtr',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#ae6b98147dc7919cbe8aee11ffe8ee144',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['constgridptrtype',['ConstGridPtrType',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a2042bc64ffb70334636efe734febd248',1,'openvdb::v3_2_0::TreeAdapter::ConstGridPtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a2042bc64ffb70334636efe734febd248',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::ConstGridPtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a2042bc64ffb70334636efe734febd248',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::ConstGridPtrType()']]], + ['constiterator',['ConstIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html',1,'openvdb::v3_2_0::util::PagedArray']]], + ['constiterator',['ConstIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#aef44228e669dcefd36cced5bb991720c',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::ConstIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#ad87f97141d24bc3a4712a1f4aec2409d',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::ConstIterator(const PagedArray &parent, size_t pos=0)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#afb044f645b46fc5e7a195284d1a6270a',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::ConstIterator(const ConstIterator &other)']]], + ['constmap',['constMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#adf65608a7a7b5261379f64d36ed35b04',1,'openvdb::v3_2_0::math::Transform']]], + ['constmetaiterator',['ConstMetaIterator',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#abc2f9ab90bfac4bc7c34efa219692ccc',1,'openvdb::v3_2_0::MetaMap']]], + ['constptr',['ConstPtr',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a29fd2cd32a8b8c750878068594f534c8',1,'openvdb::v3_2_0::GridBase::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#ab83a67bd13dbb481297e5d34545a6163',1,'openvdb::v3_2_0::Grid::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a539fdfc77b5ec41bc8400ac8b7b69894',1,'openvdb::v3_2_0::io::Archive::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a786cb12ab0e248391a6a854c1b7ef3bc',1,'openvdb::v3_2_0::io::StreamMetadata::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a22fefff9ab05359f4f4d43e2fed1c2e5',1,'openvdb::v3_2_0::math::MapBase::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a018455f9ef5d8614e70164c4fb0e8f79',1,'openvdb::v3_2_0::math::AffineMap::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#aa03a55fbeaaf5c4d5de0399548c1540c',1,'openvdb::v3_2_0::math::ScaleMap::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#a8f74838f452198f309e119ff5e493f15',1,'openvdb::v3_2_0::math::UniformScaleMap::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a4bc63877e606f7ee20ea3e6f2e42d2a8',1,'openvdb::v3_2_0::math::TranslationMap::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a4b6261ceffb213cb1f5ec19f49ced675',1,'openvdb::v3_2_0::math::ScaleTranslateMap::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#a2eae821d2fcf75b9d1aa9f8f0a42c409',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a28bc01b3673a03002254fa3a63975010',1,'openvdb::v3_2_0::math::UnitaryMap::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a84cf0dcb9c8ec2e2f6ad794ffd2956c2',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#a3c6ed4d44f5b73fb2af4244a824cca9b',1,'openvdb::v3_2_0::math::CompoundMap::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#ad7aec5ce004d480fedb9bee89077da98',1,'openvdb::v3_2_0::math::Transform::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a7d71520dfe249352beefdf23db3d6625',1,'openvdb::v3_2_0::Metadata::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a036328fbb49ee736b6af9e7be1e80f5a',1,'openvdb::v3_2_0::TypedMetadata::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a4c9a011888b4785b16a4c166b4101f57',1,'openvdb::v3_2_0::MetaMap::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#ab8bab402bb508f8c74b009d08f8dbc67',1,'openvdb::v3_2_0::tools::Dense::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a6eb525cf234392a6a9c0c98e845df078',1,'openvdb::v3_2_0::tools::MultiResGrid::ConstPtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#a8766c50c3caee094a4691ddf241149be',1,'openvdb::v3_2_0::tools::ParticleAtlas::ConstPtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#af73735c3aa19c4afade49dce78e62c56',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#abc7cdd18eef2903f83c703a5836de3a2',1,'openvdb::v3_2_0::tools::PointPartitioner::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a456011c95cb6204edd0bd82102e95b0d',1,'openvdb::v3_2_0::tree::TreeBase::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a57dc1f8dc23484b7b3031fec2783ee8a',1,'openvdb::v3_2_0::tree::Tree::ConstPtr()']]], + ['constrainedpointadvect',['ConstrainedPointAdvect',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html',1,'openvdb::v3_2_0::tools']]], + ['constrainedpointadvect',['ConstrainedPointAdvect',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#a2adaa467710807dd6b1a16d12f6f554b',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect::ConstrainedPointAdvect(const GridType &velGrid, const GridType &cptGrid, int cptn, InterrupterType *interrupter=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#a199763dfb5e9da6710d22fbd8071d73a',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect::ConstrainedPointAdvect(const ConstrainedPointAdvect &other)']]], + ['constrow',['ConstRow',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1ConstRow.html',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix']]], + ['constrow',['ConstRow',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1ConstRow.html#a87dd10299c4ec745b0b2b6ebc50e08a5',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::ConstRow']]], + ['construct',['construct',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1GridOrTreeConstructor.html#a32385a69852237b41ca51ed81152ace4',1,'openvdb::v3_2_0::tools::composite::GridOrTreeConstructor::construct()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#a414ae952ae02c8e7e734cac711d4b7af',1,'openvdb::v3_2_0::tools::composite::GridOrTreeConstructor< Grid< TreeType > >::construct()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor.html#a32385a69852237b41ca51ed81152ace4',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor::construct()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#ace39da32f5a5d11e83419fb0db76fd30',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor< Grid< TreeType > >::construct()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#aeb2a850b58fe47895209998302a9dcef',1,'openvdb::v3_2_0::tools::ParticleAtlas::construct()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#aa0af19d1f0287f82b24cff5f77b7ad52',1,'openvdb::v3_2_0::tools::PointPartitioner::construct()']]], + ['constructexclusiveregions',['constructExclusiveRegions',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal.html#a8197248b4ff4ad4504f15101c7ffc196',1,'openvdb::v3_2_0::tools::point_index_grid_internal']]], + ['constructmask',['constructMask',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor.html#a21cadb00ae9974e9f5fb7cae1d6e0940',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor::constructMask()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#aa8f4033b4e63587a3e22d7f0b40cfeb7',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor< Grid< TreeType > >::constructMask()']]], + ['constructpointtree',['constructPointTree',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal.html#ad2e777aafd3c12122a47d2b2cf7a3454',1,'openvdb::v3_2_0::tools::point_index_grid_internal']]], + ['constructpolygons',['constructPolygons',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#ad5c70d17de6d7fc516428fb91add245c',1,'openvdb::v3_2_0::tools::internal']]], + ['constructvoxelmask',['ConstructVoxelMask',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ConstructVoxelMask.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['constructvoxelmask',['ConstructVoxelMask',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ConstructVoxelMask.html#a8798198bd8facbb90362112e15d34ba8',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ConstructVoxelMask::ConstructVoxelMask(BoolTreeType &maskTree, const TreeType &tree, std::vector< LeafNodeType * > &nodes)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ConstructVoxelMask.html#a01178080897eaaf243be290324e86ae8',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ConstructVoxelMask::ConstructVoxelMask(ConstructVoxelMask &rhs, tbb::split)']]], + ['consttransform',['constTransform',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#abda6646a601c7ebe10ec13f0efae5073',1,'openvdb::v3_2_0::GridBase::constTransform()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#abda6646a601c7ebe10ec13f0efae5073',1,'openvdb::v3_2_0::tools::MultiResGrid::constTransform()']]], + ['consttransformptr',['constTransformPtr',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ad92c00bbd03b82fda2681e89c34650c4',1,'openvdb::v3_2_0::GridBase']]], + ['consttree',['constTree',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a6ef70dcd62995211874cac6487f00ec2',1,'openvdb::v3_2_0::Grid::constTree()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#afcc7c846254fe9a20e3d523163ad65d0',1,'openvdb::v3_2_0::TreeAdapter::constTree(TreeType &t)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a5fd80c2061e3cc23a0250981ccb9012d',1,'openvdb::v3_2_0::TreeAdapter::constTree(GridType &g)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#abeeac2c32b404986c2e67a21d69ef92e',1,'openvdb::v3_2_0::TreeAdapter::constTree(const TreeType &t)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a8c7bc6188b87c9446c83694fb535b519',1,'openvdb::v3_2_0::TreeAdapter::constTree(const GridType &g)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#afcc7c846254fe9a20e3d523163ad65d0',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::constTree(TreeType &t)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a5fd80c2061e3cc23a0250981ccb9012d',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::constTree(GridType &g)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#abeeac2c32b404986c2e67a21d69ef92e',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::constTree(const TreeType &t)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a8c7bc6188b87c9446c83694fb535b519',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::constTree(const GridType &g)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#afcc7c846254fe9a20e3d523163ad65d0',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::constTree(TreeType &t)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a5fd80c2061e3cc23a0250981ccb9012d',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::constTree(GridType &g)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#abeeac2c32b404986c2e67a21d69ef92e',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::constTree(const TreeType &t)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a8c7bc6188b87c9446c83694fb535b519',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::constTree(const GridType &g)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a76f756441f36eb19b1c3b534e8f2ab1c',1,'openvdb::v3_2_0::tools::MultiResGrid::constTree()']]], + ['consttreeptr',['constTreePtr',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a5adb92c0475520d0e20112a00efb17e8',1,'openvdb::v3_2_0::Grid::constTreePtr()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#aa69c6a1cb8c6b23e9778e51dad631c49',1,'openvdb::v3_2_0::tools::MultiResGrid::constTreePtr(size_t level) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a5cb91efeeb9dd7372ff35141e96f3bb3',1,'openvdb::v3_2_0::tools::MultiResGrid::ConstTreePtr()']]], + ['consttreeptrtype',['ConstTreePtrType',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a89b6df4c3b0d652c2ee92c9cd9f71169',1,'openvdb::v3_2_0::Grid::ConstTreePtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a6d5f599b95c41271456bf837ebbb1269',1,'openvdb::v3_2_0::TreeAdapter::ConstTreePtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a6d5f599b95c41271456bf837ebbb1269',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::ConstTreePtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a6d5f599b95c41271456bf837ebbb1269',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::ConstTreePtrType()']]], + ['constunsafeaccessor',['ConstUnsafeAccessor',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a62c236b87d52b19a3f2c07cbd1e5f1e6',1,'openvdb::v3_2_0::Grid']]], + ['constvalueiter',['ConstValueIter',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1ConstValueIter.html',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix']]], + ['contiguousop',['ContiguousOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ContiguousOp.html',1,'openvdb::v3_2_0::tools']]], + ['contiguousop',['ContiguousOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ContiguousOp.html#ae62c6c2322722ed99b1f37482e350596',1,'openvdb::v3_2_0::tools::ContiguousOp']]], + ['convert',['convert',['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf.html#ae5e2d01dca398b87d263c199efa15515',1,'openvdb::v3_2_0::io::RealToHalf::convert()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01float_01_4.html#a195124f1a57dc28503594ed64a2956f7',1,'openvdb::v3_2_0::io::RealToHalf< float >::convert()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01double_01_4.html#ad362f7042c9968ca9dd7d04d09199079',1,'openvdb::v3_2_0::io::RealToHalf< double >::convert()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec2s_01_4.html#afd54e53db0169e437d5ec3cd34bece4a',1,'openvdb::v3_2_0::io::RealToHalf< Vec2s >::convert()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec2d_01_4.html#ac415ca3946738cf86b424d9b45394c29',1,'openvdb::v3_2_0::io::RealToHalf< Vec2d >::convert()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec3s_01_4.html#aa4207204400e55cf36d8e612f9fbd8f5',1,'openvdb::v3_2_0::io::RealToHalf< Vec3s >::convert()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec3d_01_4.html#aca37ec91d45a2473a4852fc70b4951dc',1,'openvdb::v3_2_0::io::RealToHalf< Vec3d >::convert()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData.html#a897572e3a54bcf6d9d048542441d2174',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::convert()']]], + ['convertgrid',['ConvertGrid',['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1ConvertGrid.html',1,'openvdb::v3_2_0::tools::clip_internal']]], + ['convertgrid_3c_20gridt_2c_20gridt_20_3e',['ConvertGrid< GridT, GridT >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1ConvertGrid_3_01GridT_00_01GridT_01_4.html',1,'openvdb::v3_2_0::tools::clip_internal']]], + ['converttomaskgrid',['convertToMaskGrid',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal.html#a00ca079c4000eb9a701f044d83ddacb4',1,'openvdb::v3_2_0::tools::clip_internal::convertToMaskGrid(const GridT &grid)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal.html#a5e656ae00795b6be4847f0feecf3e97d',1,'openvdb::v3_2_0::tools::clip_internal::convertToMaskGrid(const GridT &grid)']]], + ['coord',['Coord',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html',1,'openvdb::v3_2_0::math']]], + ['coord',['Coord',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a61cc7373f7d082a02ab2ff17bc52fc50',1,'openvdb::v3_2_0::math::Coord::Coord()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#ac3e58cec10e45a2132aa620c98499835',1,'openvdb::v3_2_0::math::Coord::Coord(Int32 xyz)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#add02d9a9ff61a8784c4adf04b6b5c25e',1,'openvdb::v3_2_0::math::Coord::Coord(Int32 x, Int32 y, Int32 z)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#add699d5e6cb22311a82d18531cbf1c0a',1,'openvdb::v3_2_0::math::Coord::Coord(const Vec3i &v)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a24d08c7657e06395274b4ccf9428b46a',1,'openvdb::v3_2_0::math::Coord::Coord(const Vec3I &v)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a778d20067306ad3dc6d0942f03d4b75c',1,'openvdb::v3_2_0::math::Coord::Coord(const Int32 *v)']]], + ['coord_2eh',['Coord.h',['../Coord_8h.html',1,'']]], + ['coord_5foffsets',['COORD_OFFSETS',['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a04f6be1271dd40cd85a3b5a4d845c340',1,'openvdb::v3_2_0::util']]], + ['coordarray',['CoordArray',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1LeafNodeOriginOp.html#a4a5bbd63b006a19f9020d7dfbf3aed7e',1,'openvdb::v3_2_0::tools::point_partitioner_internal::LeafNodeOriginOp']]], + ['coordbbox',['CoordBBox',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html',1,'openvdb::v3_2_0::math']]], + ['coordbbox',['CoordBBox',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a087daebb2c26d91ccca592bf091a11cf',1,'openvdb::v3_2_0::math::CoordBBox::CoordBBox()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a9b9d212ec0f25605ed1d53fc8909fc43',1,'openvdb::v3_2_0::math::CoordBBox::CoordBBox(const Coord &min, const Coord &max)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a5e98f0657bc54009b13540a2799395a1',1,'openvdb::v3_2_0::math::CoordBBox::CoordBBox(CoordBBox &other, const tbb::split &)']]], + ['coordlimits',['CoordLimits',['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#ade9904d2a0e27d9d303ba07a207674bb',1,'openvdb::v3_2_0::tree::CacheItem']]], + ['coordtooffset',['coordToOffset',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutZYX_01_4.html#a237e07243c62f1a07cfa38c145915b1b',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutZYX >::coordToOffset()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutXYZ_01_4.html#a237e07243c62f1a07cfa38c145915b1b',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutXYZ >::coordToOffset()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a8a700a34b5d869f5ec48e19415e36e2f',1,'openvdb::v3_2_0::tools::Dense::coordToOffset()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a87e51328d0a2a73ad0bea8ba1a8c4b55',1,'openvdb::v3_2_0::tree::InternalNode::coordToOffset()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a87e51328d0a2a73ad0bea8ba1a8c4b55',1,'openvdb::v3_2_0::tree::LeafNode::coordToOffset()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a87e51328d0a2a73ad0bea8ba1a8c4b55',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::coordToOffset()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a87e51328d0a2a73ad0bea8ba1a8c4b55',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::coordToOffset()']]], + ['copy',['copy',['../classopenvdb_1_1v3__2__0_1_1Grid.html#ac7aa3f019c8503b7b4641477adf0a546',1,'openvdb::v3_2_0::Grid::copy()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#afd85d693c81c430035aa6d886314adf9',1,'openvdb::v3_2_0::io::Archive::copy()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#aa9e40f611bcaf723814c3ec2d311f5f9',1,'openvdb::v3_2_0::io::File::copy()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Stream.html#adf9fac9401913aa279e1a4074c2c6d18',1,'openvdb::v3_2_0::io::Stream::copy()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a7792fb776cf85d6ee1c1da9b4c30470c',1,'openvdb::v3_2_0::math::MapBase::copy()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a1010d36ae5bc5792a2ab818e0a38c9b6',1,'openvdb::v3_2_0::math::AffineMap::copy()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a1010d36ae5bc5792a2ab818e0a38c9b6',1,'openvdb::v3_2_0::math::ScaleMap::copy()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#a1010d36ae5bc5792a2ab818e0a38c9b6',1,'openvdb::v3_2_0::math::UniformScaleMap::copy()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a1010d36ae5bc5792a2ab818e0a38c9b6',1,'openvdb::v3_2_0::math::TranslationMap::copy()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a1010d36ae5bc5792a2ab818e0a38c9b6',1,'openvdb::v3_2_0::math::ScaleTranslateMap::copy()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#a1010d36ae5bc5792a2ab818e0a38c9b6',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::copy()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a1010d36ae5bc5792a2ab818e0a38c9b6',1,'openvdb::v3_2_0::math::UnitaryMap::copy()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a1010d36ae5bc5792a2ab818e0a38c9b6',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::copy()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a824dcd754978ef462688e40b7a3faa84',1,'openvdb::v3_2_0::math::Transform::copy()'],['../classopenvdb_1_1v3__2__0_1_1Metadata.html#abebb3028a711fc3ad393a4c4136e4618',1,'openvdb::v3_2_0::Metadata::copy() const =0'],['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a13ed7c55edb270ac19929dc5954c8a4f',1,'openvdb::v3_2_0::Metadata::copy(const Metadata &other)=0'],['../classopenvdb_1_1v3__2__0_1_1UnknownMetadata.html#a1511d00a5ccd1a48ebcd36479e9501e9',1,'openvdb::v3_2_0::UnknownMetadata::copy() const '],['../classopenvdb_1_1v3__2__0_1_1UnknownMetadata.html#a4cc2f2f7be82f06fadb95a978c76b306',1,'openvdb::v3_2_0::UnknownMetadata::copy(const Metadata &)'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#abf95b87f4d55bdf59fbddeb282e2724d',1,'openvdb::v3_2_0::TypedMetadata::copy() const '],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a785924fbf4ddedf4cd05e519b9e52101',1,'openvdb::v3_2_0::TypedMetadata::copy(const Metadata &other)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyToDense.html#a81a9220fe133875436f3666dc43651cf',1,'openvdb::v3_2_0::tools::CopyToDense::copy()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyFromDense.html#a2a447bd7467a4b067a5a8a6899937612',1,'openvdb::v3_2_0::tools::CopyFromDense::copy()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1CopyMasks.html#aaa6c087511a52e64fc9ad92820c7c0a8',1,'openvdb::v3_2_0::tools::Morphology::CopyMasks::copy()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseShader.html#a20b85a5baa2a50d1740253995437f094',1,'openvdb::v3_2_0::tools::BaseShader::copy()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MatteShader.html#aeec0b695b61af8f6d1ed95c556a2a738',1,'openvdb::v3_2_0::tools::MatteShader::copy()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MatteShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#aeec0b695b61af8f6d1ed95c556a2a738',1,'openvdb::v3_2_0::tools::MatteShader< Film::RGBA, SamplerType >::copy()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1NormalShader.html#aeec0b695b61af8f6d1ed95c556a2a738',1,'openvdb::v3_2_0::tools::NormalShader::copy()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1NormalShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#aeec0b695b61af8f6d1ed95c556a2a738',1,'openvdb::v3_2_0::tools::NormalShader< Film::RGBA, SamplerType >::copy()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PositionShader.html#aeec0b695b61af8f6d1ed95c556a2a738',1,'openvdb::v3_2_0::tools::PositionShader::copy()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PositionShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#aeec0b695b61af8f6d1ed95c556a2a738',1,'openvdb::v3_2_0::tools::PositionShader< Film::RGBA, SamplerType >::copy()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiffuseShader.html#aeec0b695b61af8f6d1ed95c556a2a738',1,'openvdb::v3_2_0::tools::DiffuseShader::copy()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiffuseShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#aeec0b695b61af8f6d1ed95c556a2a738',1,'openvdb::v3_2_0::tools::DiffuseShader< Film::RGBA, SamplerType >::copy()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#a12526a1a21d2d4f3294a19e99dd49586',1,'openvdb::v3_2_0::tools::PolygonPool::copy()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#ab232ff56a020051ec076f1eff64a87ed',1,'openvdb::v3_2_0::tree::TreeBase::copy()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a53d7ff7d6f0f9edd74040edebb377e61',1,'openvdb::v3_2_0::tree::Tree::copy()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#aa699f7fbdd98f5fed8400dabee3b9ea5',1,'openvdb::v3_2_0::tree::CacheItem::copy()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#aa699f7fbdd98f5fed8400dabee3b9ea5',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::copy()']]], + ['copyableopapplier',['CopyableOpApplier',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpApplier.html#a725a8a69e1ba845367f7035427f7dbee',1,'openvdb::v3_2_0::tools::valxform::CopyableOpApplier::CopyableOpApplier(const IterT &iter, const OpT &op)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpApplier.html#a3c778cda08ce514799d4a19f90ae5900',1,'openvdb::v3_2_0::tools::valxform::CopyableOpApplier::CopyableOpApplier(const CopyableOpApplier &other)']]], + ['copyableopapplier',['CopyableOpApplier',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpApplier.html',1,'openvdb::v3_2_0::tools::valxform']]], + ['copyableoptransformer',['CopyableOpTransformer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpTransformer.html',1,'openvdb::v3_2_0::tools::valxform']]], + ['copyableoptransformer',['CopyableOpTransformer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpTransformer.html#aa9bfe6cc529d5668b02eed0017d86e55',1,'openvdb::v3_2_0::tools::valxform::CopyableOpTransformer::CopyableOpTransformer(const InIterT &inIter, OutTreeT &outTree, const OpT &op, MergePolicy merge)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpTransformer.html#a3edd72961eeff9d7c48c713e37044e8f',1,'openvdb::v3_2_0::tools::valxform::CopyableOpTransformer::CopyableOpTransformer(CopyableOpTransformer &other, tbb::split)']]], + ['copyconstness',['CopyConstness',['../structopenvdb_1_1v3__2__0_1_1tree_1_1CopyConstness.html',1,'openvdb::v3_2_0::tree']]], + ['copyconstness_3c_20const_20fromtype_2c_20totype_20_3e',['CopyConstness< const FromType, ToType >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1CopyConstness_3_01const_01FromType_00_01ToType_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['copyfromdense',['CopyFromDense',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyFromDense.html#a2504284ad5974d1746c22654a2425505',1,'openvdb::v3_2_0::tools::CopyFromDense::CopyFromDense(const DenseT &dense, TreeT &tree, const ValueT &tolerance)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyFromDense.html#a96971f216af17ceb27668695bb05f986',1,'openvdb::v3_2_0::tools::CopyFromDense::CopyFromDense(const CopyFromDense &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a289e54ea2a89b08bede71bf99da746e0',1,'openvdb::v3_2_0::tree::LeafNode::copyFromDense()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a9c324f013ba5c6e0785e8513af13f80b',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::copyFromDense()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a9c324f013ba5c6e0785e8513af13f80b',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::copyFromDense()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a718fc3e33310680728f4fbf04db240c0',1,'openvdb::v3_2_0::tools::copyFromDense()']]], + ['copyfromdense',['CopyFromDense',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyFromDense.html',1,'openvdb::v3_2_0::tools']]], + ['copyfromvecop',['CopyFromVecOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyFromVecOp.html#a4e7884877271cec0793d0b294bb5e778',1,'openvdb::v3_2_0::tools::poisson::internal::CopyFromVecOp']]], + ['copyfromvecop',['CopyFromVecOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyFromVecOp.html',1,'openvdb::v3_2_0::tools::poisson::internal']]], + ['copygrid',['copyGrid',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ae10e2122c71d4714e4aa046acf3732ab',1,'openvdb::v3_2_0::GridBase::copyGrid()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#af1a536fc02800fec973a31d86de389dd',1,'openvdb::v3_2_0::Grid::copyGrid()']]], + ['copyleafnodes',['CopyLeafNodes',['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1CopyLeafNodes.html#aff204ca66625690fe94e1961fd7962f6',1,'openvdb::v3_2_0::tools::clip_internal::CopyLeafNodes::CopyLeafNodes(const TreeT &tree, const MaskLeafManagerT &leafNodes)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1CopyLeafNodes.html#abd2c955959a25a29209a50e840eb3a72',1,'openvdb::v3_2_0::tools::clip_internal::CopyLeafNodes::CopyLeafNodes(CopyLeafNodes &, tbb::split)']]], + ['copyleafnodes',['CopyLeafNodes',['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1CopyLeafNodes.html',1,'openvdb::v3_2_0::tools::clip_internal']]], + ['copymasks',['CopyMasks',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1CopyMasks.html#aac50368a0b3ee18632381d5f5eb3b40b',1,'openvdb::v3_2_0::tools::Morphology::CopyMasks::CopyMasks()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a93bbf460ee68e7d9220ff66b3575f3ff',1,'openvdb::v3_2_0::tools::Morphology::copyMasks()']]], + ['copymasks',['CopyMasks',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1CopyMasks.html',1,'openvdb::v3_2_0::tools::Morphology']]], + ['copymaxbytes',['copyMaxBytes',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a64fc28d8b0f757f486a48f842cd1c097',1,'openvdb::v3_2_0::io::File']]], + ['copymeta',['copyMeta',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a917bd2bd66ecb9f8ab71fa75cda8ced5',1,'openvdb::v3_2_0::MetaMap']]], + ['copyop',['CopyOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1CopyOp.html',1,'openvdb::v3_2_0::math::pcg::internal']]], + ['copyop',['CopyOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1CopyOp.html#a2090a9d0023bd9444a2aa50a406e212c',1,'openvdb::v3_2_0::math::pcg::internal::CopyOp']]], + ['copypolicy',['CopyPolicy',['../namespaceopenvdb_1_1v3__2__0.html#a51a9760605ac8e44f3479429f911dad5',1,'openvdb::v3_2_0']]], + ['copytodense',['CopyToDense',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyToDense.html',1,'openvdb::v3_2_0::tools']]], + ['copytodense',['CopyToDense',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyToDense.html#a43fed35aba8de7a61dda0be758c33e35',1,'openvdb::v3_2_0::tools::CopyToDense::CopyToDense()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#addb6357bae687189b953c677911834ea',1,'openvdb::v3_2_0::tree::InternalNode::copyToDense()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#addb6357bae687189b953c677911834ea',1,'openvdb::v3_2_0::tree::LeafNode::copyToDense()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#addb6357bae687189b953c677911834ea',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::copyToDense()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#addb6357bae687189b953c677911834ea',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::copyToDense()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#addb6357bae687189b953c677911834ea',1,'openvdb::v3_2_0::tree::RootNode::copyToDense()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#acbd41a08ed8ea7c1a7d33146b8d17ce1',1,'openvdb::v3_2_0::tools::copyToDense()']]], + ['copytovecop',['CopyToVecOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyToVecOp.html',1,'openvdb::v3_2_0::tools::poisson::internal']]], + ['copytovecop',['CopyToVecOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyToVecOp.html#a6a1f9701b2a12d390b3cc453d8d3fca1',1,'openvdb::v3_2_0::tools::poisson::internal::CopyToVecOp']]], + ['copywithvalueconversion',['copyWithValueConversion',['../structopenvdb_1_1v3__2__0_1_1tree_1_1RootNodeCopyHelper.html#a93b8d7180a98f1b1b8e0986163e4aae3',1,'openvdb::v3_2_0::tree::RootNodeCopyHelper::copyWithValueConversion()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1RootNodeCopyHelper_3_01RootT_00_01OtherRootT_00_01true_01_4.html#a93b8d7180a98f1b1b8e0986163e4aae3',1,'openvdb::v3_2_0::tree::RootNodeCopyHelper< RootT, OtherRootT, true >::copyWithValueConversion()']]], + ['correctcellsigns',['correctCellSigns',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a43218d1598cab0f49231609a8948d183',1,'openvdb::v3_2_0::tools::internal']]], + ['count',['count',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1LeafCountOp.html#a39aed3647004507f1b8240a8a7c731dc',1,'openvdb::v3_2_0::tools::poisson::internal::LeafCountOp::count()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1LeafIndexOp.html#abcaf6868c0c14f0804605749fca6978a',1,'openvdb::v3_2_0::tools::poisson::internal::LeafIndexOp::count()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html#a62bdeeb76a6d430f526217f87befafc9',1,'openvdb::v3_2_0::math::Histogram::count()']]], + ['countoff',['countOff',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a5f6cd7e807b3cd887c60051470c448cb',1,'openvdb::v3_2_0::util::NodeMask::countOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a5f6cd7e807b3cd887c60051470c448cb',1,'openvdb::v3_2_0::util::NodeMask< 1 >::countOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a5f6cd7e807b3cd887c60051470c448cb',1,'openvdb::v3_2_0::util::NodeMask< 2 >::countOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a5f6cd7e807b3cd887c60051470c448cb',1,'openvdb::v3_2_0::util::RootNodeMask::countOff()'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#aab84c305a75f3d05f633407106a9a5a8',1,'openvdb::v3_2_0::util::CountOff(Byte v)'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a09978d0038dea46cd77b10648d1e568b',1,'openvdb::v3_2_0::util::CountOff(Index32 v)'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a34e3ebbf197ad5357998b69b8db9da23',1,'openvdb::v3_2_0::util::CountOff(Index64 v)']]], + ['counton',['countOn',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ad1202e4cc590890141fda37573fc73f4',1,'openvdb::v3_2_0::util::NodeMask::countOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ad1202e4cc590890141fda37573fc73f4',1,'openvdb::v3_2_0::util::NodeMask< 1 >::countOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ad1202e4cc590890141fda37573fc73f4',1,'openvdb::v3_2_0::util::NodeMask< 2 >::countOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#ad1202e4cc590890141fda37573fc73f4',1,'openvdb::v3_2_0::util::RootNodeMask::countOn()'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a7a7908d2c22e8ff2168a9e1cb3efb218',1,'openvdb::v3_2_0::util::CountOn(Byte v)'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a223df068851e6dd567f95d3c32e20637',1,'openvdb::v3_2_0::util::CountOn(Index32 v)'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a34d5b4fee017cb29e944cc09a1a6269e',1,'openvdb::v3_2_0::util::CountOn(Index64 v)']]], + ['countpoints',['CountPoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1CountPoints.html',1,'openvdb::v3_2_0::tools::internal']]], + ['countpoints',['CountPoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1CountPoints.html#a85c6d8ef7db8837d3fda510501b1be2c',1,'openvdb::v3_2_0::tools::internal::CountPoints']]], + ['countregions',['CountRegions',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1CountRegions.html',1,'openvdb::v3_2_0::tools::internal']]], + ['countregions',['CountRegions',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1CountRegions.html#a0dcc0e73a924e35bdf00465693f05fd6',1,'openvdb::v3_2_0::tools::internal::CountRegions']]], + ['cp_5fcopy',['CP_COPY',['../namespaceopenvdb_1_1v3__2__0.html#a51a9760605ac8e44f3479429f911dad5a63385c8db3583380803edb1d4c836398',1,'openvdb::v3_2_0']]], + ['cp_5fnew',['CP_NEW',['../namespaceopenvdb_1_1v3__2__0.html#a51a9760605ac8e44f3479429f911dad5aa65365a2374e75cd45999d7a549920ce',1,'openvdb::v3_2_0']]], + ['cp_5fshare',['CP_SHARE',['../namespaceopenvdb_1_1v3__2__0.html#a51a9760605ac8e44f3479429f911dad5a9dd41f90e4135b4bcf85e09c80543fc4',1,'openvdb::v3_2_0']]], + ['cpt',['Cpt',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Cpt.html#a5c6b7dc880f1eb2fa6ee1d8330cd697f',1,'openvdb::v3_2_0::tools::Cpt::Cpt(const InGridType &grid, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Cpt.html#ad9d049907f8ef68e5b0b4b8a465ef3e0',1,'openvdb::v3_2_0::tools::Cpt::Cpt(const InGridType &grid, const MaskGridType &mask, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#a75809572157e6a29470d5944da63b1a2',1,'openvdb::v3_2_0::math::GradStencil::cpt()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aea23457a3376d6fb611bd3f46fdffd61',1,'openvdb::v3_2_0::tools::cpt(const GridType &grid, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a0a4a7dc00308e20a77a2dfd6cb598fb4',1,'openvdb::v3_2_0::tools::cpt(const GridType &grid, const MaskT &mask, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aeba6cd930ed4bc249a65c00062fc4207',1,'openvdb::v3_2_0::tools::cpt(const GridType &grid, bool threaded=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8adfac1b1bf2c301b2f05c61b164d676',1,'openvdb::v3_2_0::tools::cpt(const GridType &grid, const MaskT &mask, bool threaded=true)']]], + ['cpt',['CPT',['../structopenvdb_1_1v3__2__0_1_1math_1_1CPT.html',1,'openvdb::v3_2_0::math']]], + ['cpt',['Cpt',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Cpt.html',1,'openvdb::v3_2_0::tools']]], + ['cpt_5frange',['CPT_RANGE',['../structopenvdb_1_1v3__2__0_1_1math_1_1CPT__RANGE.html',1,'openvdb::v3_2_0::math']]], + ['cptaccessor',['CptAccessor',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestPointProjector.html#a9cacbe98a698cf87ede535ac64c4a695',1,'openvdb::v3_2_0::tools::ClosestPointProjector']]], + ['cptgridtype',['CptGridType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestPointProjector.html#a8f69d34e6183146f0cda14f09fa8de8f',1,'openvdb::v3_2_0::tools::ClosestPointProjector']]], + ['cptvaluetype',['CptValueType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestPointProjector.html#a524d154923db2c64adb56cc994642d36',1,'openvdb::v3_2_0::tools::ClosestPointProjector']]], + ['cputimer',['CpuTimer',['../classopenvdb_1_1v3__2__0_1_1util_1_1CpuTimer.html#a115479c65160f4641ecb264a54d046db',1,'openvdb::v3_2_0::util::CpuTimer::CpuTimer()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1CpuTimer.html#a17e33ec46dd8786c119093579e04b2fa',1,'openvdb::v3_2_0::util::CpuTimer::CpuTimer(const std::string &msg)']]], + ['cputimer',['CpuTimer',['../classopenvdb_1_1v3__2__0_1_1util_1_1CpuTimer.html',1,'openvdb::v3_2_0::util']]], + ['cputimer_2eh',['CpuTimer.h',['../CpuTimer_8h.html',1,'']]], + ['create',['create',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a39267dfda5946944127d4c07660a6aca',1,'openvdb::v3_2_0::Grid::create(const ValueType &background)'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#afed9748b2280ee9155aa1033cc583bc7',1,'openvdb::v3_2_0::Grid::create()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#af72d392d1045aace3bfd5fa6fd89c990',1,'openvdb::v3_2_0::Grid::create(TreePtrType)'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a422f199a2a36cb9c8071848bf88dd1b4',1,'openvdb::v3_2_0::Grid::create(const GridBase &other)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#ae134aba64f8edaf48c048ca2691d32fc',1,'openvdb::v3_2_0::math::AffineMap::create()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#ae134aba64f8edaf48c048ca2691d32fc',1,'openvdb::v3_2_0::math::ScaleMap::create()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#ae134aba64f8edaf48c048ca2691d32fc',1,'openvdb::v3_2_0::math::UniformScaleMap::create()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#ae134aba64f8edaf48c048ca2691d32fc',1,'openvdb::v3_2_0::math::TranslationMap::create()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#ae134aba64f8edaf48c048ca2691d32fc',1,'openvdb::v3_2_0::math::ScaleTranslateMap::create()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#ae134aba64f8edaf48c048ca2691d32fc',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::create()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#ae134aba64f8edaf48c048ca2691d32fc',1,'openvdb::v3_2_0::math::UnitaryMap::create()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#ae134aba64f8edaf48c048ca2691d32fc',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::create()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#a0bd97b1267c16e7a155de6bd749d55a1',1,'openvdb::v3_2_0::tools::ParticleAtlas::create()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#a8e02056d88f6e435e41c995e8a76347c',1,'openvdb::v3_2_0::tools::PointPartitioner::create()']]], + ['createbuffer',['createBuffer',['../classopenvdb_1_1v3__2__0_1_1io_1_1MappedFile.html#a3e1688b7f10934174e8933e674d63397',1,'openvdb::v3_2_0::io::MappedFile']]], + ['createcube',['createCube',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#af3efaad6be387908a12ac3d4a100a54c',1,'openvdb::v3_2_0::math::CoordBBox']]], + ['createdecomposedmap',['createDecomposedMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a82d29693bd9670e4272047cf470e680b',1,'openvdb::v3_2_0::math::AffineMap']]], + ['createfrustumtransform',['createFrustumTransform',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#af8ef59b26c980aeacc0ab6add4588fb4',1,'openvdb::v3_2_0::math::Transform']]], + ['createfullydecomposedmap',['createFullyDecomposedMap',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab44f023057c07b70c16abe5383b0fcd3',1,'openvdb::v3_2_0::math']]], + ['creategrid',['createGrid',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ad6d401b513d472cbc27ee4a4c106dde2',1,'openvdb::v3_2_0::GridBase::createGrid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#aff6a86cdd0ee702b166f6eb0200b06fb',1,'openvdb::v3_2_0::tools::MultiResGrid::createGrid(float level, size_t grainSize=1) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a00901fbcb171803dff168f7b89b6e3b1',1,'openvdb::v3_2_0::tools::MultiResGrid::createGrid(float level, size_t grainSize) const '],['../namespaceopenvdb_1_1v3__2__0.html#ac43068080f663736cfc10a62c6a0827f',1,'openvdb::v3_2_0::createGrid(const typename GridType::ValueType &background)'],['../namespaceopenvdb_1_1v3__2__0.html#afff9e378bd451ec1c5501aa0d88bbdaf',1,'openvdb::v3_2_0::createGrid()'],['../namespaceopenvdb_1_1v3__2__0.html#ae7abc829f5ce06ff3c78633d4d566a76',1,'openvdb::v3_2_0::createGrid(TreePtrType)']]], + ['createindextree',['createIndexTree',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#a84c81c332ed27260f4cefebebe118786',1,'openvdb::v3_2_0::tools::poisson']]], + ['createislaplacian',['createISLaplacian',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#ada80868d7035f164b6a0aa873ad74f3b',1,'openvdb::v3_2_0::tools::poisson']]], + ['createislaplacianwithboundaryconditions',['createISLaplacianWithBoundaryConditions',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#a32e29d8e019b250a9a3474d5d9bbb7d5',1,'openvdb::v3_2_0::tools::poisson']]], + ['createlevelset',['createLevelSet',['../namespaceopenvdb_1_1v3__2__0.html#ab5fa070ff38ad858c9b4b61fca2a4a76',1,'openvdb::v3_2_0']]], + ['createlevelsetbox',['createLevelSetBox',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a9a314c42b9d506bd60c1acdd6f41aac7',1,'openvdb::v3_2_0::tools']]], + ['createlevelsetcube',['createLevelSetCube',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a42058c9b02754dedba9ff02abf780b32',1,'openvdb::v3_2_0::tools::createLevelSetCube(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH), InterruptT *interrupt=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8f38b22629d0d358e1c59492b756a238',1,'openvdb::v3_2_0::tools::createLevelSetCube(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH))']]], + ['createlevelsetdodecahedron',['createLevelSetDodecahedron',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#af615687f0b6d3075b3096088db195a62',1,'openvdb::v3_2_0::tools::createLevelSetDodecahedron(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH), InterruptT *interrupt=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8cc4fdecd7d9a22ed2be0573f8d8013b',1,'openvdb::v3_2_0::tools::createLevelSetDodecahedron(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH))']]], + ['createlevelseticosahedron',['createLevelSetIcosahedron',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#afef26721d8235b87a802ddef9874bba8',1,'openvdb::v3_2_0::tools::createLevelSetIcosahedron(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH), InterruptT *interrupt=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a6aaf267ab0fbf64fceeadb29214235ff',1,'openvdb::v3_2_0::tools::createLevelSetIcosahedron(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH))']]], + ['createlevelsetoctahedron',['createLevelSetOctahedron',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a2cd1973d300aca22cb7efa8cc667e7f5',1,'openvdb::v3_2_0::tools::createLevelSetOctahedron(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH), InterruptT *interrupt=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ada248c256046dd7df10fe72dca9f19a9',1,'openvdb::v3_2_0::tools::createLevelSetOctahedron(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH))']]], + ['createlevelsetplatonic',['createLevelSetPlatonic',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a484af5e13319b4537ed4bd4a44eaaffa',1,'openvdb::v3_2_0::tools::createLevelSetPlatonic(int faceCount, float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH), InterruptT *interrupt=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a3c3aa73be3827a009a86249c28afbba0',1,'openvdb::v3_2_0::tools::createLevelSetPlatonic(int faceCount, float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH))']]], + ['createlevelsetsphere',['createLevelSetSphere',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a3a2625fb8ecc82eeb5f5e9b0a32eea6f',1,'openvdb::v3_2_0::tools::createLevelSetSphere(float radius, const openvdb::Vec3f &center, float voxelSize, float halfWidth=float(LEVEL_SET_HALF_WIDTH), InterruptT *interrupt=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ae5debd785e0e6e25b999fc34b5f64dd0',1,'openvdb::v3_2_0::tools::createLevelSetSphere(float radius, const openvdb::Vec3f &center, float voxelSize, float halfWidth=float(LEVEL_SET_HALF_WIDTH))']]], + ['createlevelsettetrahedron',['createLevelSetTetrahedron',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a1121012745c5a6f8a842457fb37f494a',1,'openvdb::v3_2_0::tools::createLevelSetTetrahedron(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH), InterruptT *interrupt=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a5ad3e3b59f8580c4feccb195e75262ff',1,'openvdb::v3_2_0::tools::createLevelSetTetrahedron(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH))']]], + ['createlineartransform',['createLinearTransform',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#ae35abe5d5592d24a97725f90eb3ce3f1',1,'openvdb::v3_2_0::math::Transform::createLinearTransform(double voxelSize=1.0)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#aafb14b2a556645b1b026860a98ec8783',1,'openvdb::v3_2_0::math::Transform::createLinearTransform(const Mat4R &)']]], + ['createmap',['createMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapRegistry.html#a081f9ac95d12bf8808eb379793fb5a14',1,'openvdb::v3_2_0::math::MapRegistry']]], + ['createmetadata',['createMetadata',['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a53362877f5b2a7b70a2445dee3db7150',1,'openvdb::v3_2_0::Metadata::createMetadata()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a9a0b39ccd9cb2771e4ccb5a69ea71a17',1,'openvdb::v3_2_0::TypedMetadata::createMetadata()']]], + ['createorderedpointindexarrayop',['CreateOrderedPointIndexArrayOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1CreateOrderedPointIndexArrayOp.html',1,'openvdb::v3_2_0::tools::point_partitioner_internal']]], + ['createorderedpointindexarrayop',['CreateOrderedPointIndexArrayOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1CreateOrderedPointIndexArrayOp.html#a64c0eeeec3e4cf21d4cce3dd1cc1299e',1,'openvdb::v3_2_0::tools::point_partitioner_internal::CreateOrderedPointIndexArrayOp']]], + ['createpointindexgrid',['createPointIndexGrid',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aec6960746cc5165cf6ac1252ad7bc5d4',1,'openvdb::v3_2_0::tools::createPointIndexGrid(const PointArrayT &points, double voxelSize)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a271fec55592c87ddf1f04a02207cfb34',1,'openvdb::v3_2_0::tools::createPointIndexGrid(const PointArrayT &points, const math::Transform &xform)']]], + ['createpointmaskgrid',['createPointMaskGrid',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a1cc5fc0a68de45f80418d99f1cc63a16',1,'openvdb::v3_2_0::tools']]], + ['createpolardecomposedmap',['createPolarDecomposedMap',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aad22536049a55adae65e78705bbd7689',1,'openvdb::v3_2_0::math']]], + ['createsymmetricmap',['createSymmetricMap',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7e9dbd39ac419c3dddff1960c2cddfb4',1,'openvdb::v3_2_0::math']]], + ['createtreefromvector',['createTreeFromVector',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#ad247afd9be5bc45c0ef563dfdcf9f521',1,'openvdb::v3_2_0::tools::poisson']]], + ['createvectorfromtree',['createVectorFromTree',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#aaafc8a2a26f1f3f386afd16268b8c19b',1,'openvdb::v3_2_0::tools::poisson']]], + ['cross',['cross',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a99037ba5899ae267ba45585e133738e9',1,'openvdb::v3_2_0::math::Vec3::cross(const Vec3< T > &v) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a2e28b8fd05221497f5ad5620b875c683',1,'openvdb::v3_2_0::math::Vec3::cross(const Vec3< T > &v1, const Vec3< T > &v2)']]], + ['crossdifference',['crossdifference',['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#a7d789635d205e3a3ab8b3f12bc45d5b7',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::crossdifference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#a1745a78b657ed1912d5741907ae544f5',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::crossdifference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#a2c82adf63f86ccbac0686fd8552b8943',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::crossdifference()']]], + ['csg_5fdifference',['CSG_DIFFERENCE',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html#a7fa595becbbe84c7cfbb4417a626029ca77fbcc466df7541014c11fb771f99544',1,'openvdb::v3_2_0::tools::composite']]], + ['csg_5fintersection',['CSG_INTERSECTION',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html#a7fa595becbbe84c7cfbb4417a626029cad05ec992438b543b367f312b6bbf8f38',1,'openvdb::v3_2_0::tools::composite']]], + ['csg_5funion',['CSG_UNION',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html#a7fa595becbbe84c7cfbb4417a626029cac9ae7ac7304d79020e991c57c6f9c8be',1,'openvdb::v3_2_0::tools::composite']]], + ['csgdifference',['csgDifference',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a28a450f27165e0dbfa59e79652ae8ec4',1,'openvdb::v3_2_0::tools']]], + ['csgdifferencecopy',['csgDifferenceCopy',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a51b0c8963cdd9ec4c9078a0853718c51',1,'openvdb::v3_2_0::tools']]], + ['csgdiffvisitor',['CsgDiffVisitor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgDiffVisitor.html#af92186848ef25d6765e51c772a537e02',1,'openvdb::v3_2_0::tools::CsgDiffVisitor']]], + ['csgdiffvisitor',['CsgDiffVisitor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgDiffVisitor.html',1,'openvdb::v3_2_0::tools']]], + ['csgintersection',['csgIntersection',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac6851d766bae22bdff30bbc8f9167ab9',1,'openvdb::v3_2_0::tools']]], + ['csgintersectioncopy',['csgIntersectionCopy',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#af7e07475d9dc9f2daa3685e76ecd3127',1,'openvdb::v3_2_0::tools']]], + ['csgintersectvisitor',['CsgIntersectVisitor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgIntersectVisitor.html#aa950b2e32c8bc2c9f396eb7bc809f2fb',1,'openvdb::v3_2_0::tools::CsgIntersectVisitor']]], + ['csgintersectvisitor',['CsgIntersectVisitor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgIntersectVisitor.html',1,'openvdb::v3_2_0::tools']]], + ['csgoperation',['CSGOperation',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html#a7fa595becbbe84c7cfbb4417a626029c',1,'openvdb::v3_2_0::tools::composite']]], + ['csgunion',['csgUnion',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a63ca059a52fa4df11baa7f641a1e3611',1,'openvdb::v3_2_0::tools']]], + ['csgunioncopy',['csgUnionCopy',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#afa1ebc9f997633bf7fe7ec74dfb27b8e',1,'openvdb::v3_2_0::tools']]], + ['csgunionvisitor',['CsgUnionVisitor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgUnionVisitor.html',1,'openvdb::v3_2_0::tools']]], + ['csgunionvisitor',['CsgUnionVisitor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgUnionVisitor.html#ac3ba7f54e88395fe7c0a1139fd0a8d7c',1,'openvdb::v3_2_0::tools::CsgUnionVisitor']]], + ['csgvisitorbase',['CsgVisitorBase',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CsgVisitorBase.html',1,'openvdb::v3_2_0::tools']]], + ['csgvisitorbase',['CsgVisitorBase',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CsgVisitorBase.html#a236eb3bc96cf0522b009c7ecfa108de4',1,'openvdb::v3_2_0::tools::CsgVisitorBase']]], + ['curl',['Curl',['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl.html',1,'openvdb::v3_2_0::math']]], + ['curl',['Curl',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Curl.html',1,'openvdb::v3_2_0::tools']]], + ['curl',['Curl',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Curl.html#a04ccba9cd0cd462c37a164144e15acb8',1,'openvdb::v3_2_0::tools::Curl::Curl(const GridT &grid, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Curl.html#a7413e0e76f305f91e94b8f5e4ff6a516',1,'openvdb::v3_2_0::tools::Curl::Curl(const GridT &grid, const MaskGridType &mask, InterruptT *interrupt=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a1d7270767850c4f3241bce09b730d84a',1,'openvdb::v3_2_0::tools::curl(const GridType &grid, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8b2279de4cd703914497d7733aefbb6e',1,'openvdb::v3_2_0::tools::curl(const GridType &grid, const MaskT &mask, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#afea8f4fb12aabdfbb04f8b6835ff3670',1,'openvdb::v3_2_0::tools::curl(const GridType &grid, bool threaded=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac687a3b1d4c6532f1a379c2406ef38d9',1,'openvdb::v3_2_0::tools::curl(const GridType &grid, const MaskT &mask, bool threaded=true)']]], + ['curl_3c_20uniformscalemap_2c_20cd_5f2nd_20_3e',['Curl< UniformScaleMap, CD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl_3_01UniformScaleMap_00_01CD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['curl_3c_20uniformscalemap_2c_20diffscheme_20_3e',['Curl< UniformScaleMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl_3_01UniformScaleMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['curl_3c_20uniformscaletranslatemap_2c_20cd_5f2nd_20_3e',['Curl< UniformScaleTranslateMap, CD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl_3_01UniformScaleTranslateMap_00_01CD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['curl_3c_20uniformscaletranslatemap_2c_20diffscheme_20_3e',['Curl< UniformScaleTranslateMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl_3_01UniformScaleTranslateMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['curvaturestencil',['CurvatureStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1CurvatureStencil.html',1,'openvdb::v3_2_0::math']]], + ['curvaturestencil',['CurvatureStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1CurvatureStencil.html#a1b6f1d2e813854435dac4fb869d077ba',1,'openvdb::v3_2_0::math::CurvatureStencil::CurvatureStencil(const GridType &grid)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CurvatureStencil.html#a195ec8e03fe742578019bc7c3953b16a',1,'openvdb::v3_2_0::math::CurvatureStencil::CurvatureStencil(const GridType &grid, Real dx)']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_5.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_5.html new file mode 100644 index 00000000..4dfd1d50 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_5.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_5.js new file mode 100644 index 00000000..97c269b6 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_5.js @@ -0,0 +1,186 @@ +var searchData= +[ + ['d',['d',['../structopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Fill.html#a1366435d7d5a045ddaa682effe7ac374',1,'openvdb::v3_2_0::util::PagedArray::Fill']]], + ['d1',['D1',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20bd_5f1st_20_3e',['D1< BD_1ST >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__1ST_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20bd_5f2nd_20_3e',['D1< BD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20bd_5f3rd_20_3e',['D1< BD_3RD >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__3RD_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20bd_5fhjweno5_20_3e',['D1< BD_HJWENO5 >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__HJWENO5_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20bd_5fweno5_20_3e',['D1< BD_WENO5 >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__WENO5_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20cd_5f2nd_20_3e',['D1< CD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20cd_5f2ndt_20_3e',['D1< CD_2NDT >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2NDT_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20cd_5f4th_20_3e',['D1< CD_4TH >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__4TH_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20cd_5f6th_20_3e',['D1< CD_6TH >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__6TH_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20fd_5f1st_20_3e',['D1< FD_1ST >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__1ST_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20fd_5f2nd_20_3e',['D1< FD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20fd_5f3rd_20_3e',['D1< FD_3RD >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__3RD_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20fd_5fhjweno5_20_3e',['D1< FD_HJWENO5 >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__HJWENO5_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20fd_5fweno5_20_3e',['D1< FD_WENO5 >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__WENO5_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1vec',['D1Vec',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec.html',1,'openvdb::v3_2_0::math']]], + ['d1vec_3c_20cd_5f2nd_20_3e',['D1Vec< CD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1vec_3c_20cd_5f2ndt_20_3e',['D1Vec< CD_2NDT >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2NDT_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1vec_3c_20cd_5f4th_20_3e',['D1Vec< CD_4TH >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__4TH_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1vec_3c_20cd_5f6th_20_3e',['D1Vec< CD_6TH >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__6TH_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d2',['D2',['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html',1,'openvdb::v3_2_0::math']]], + ['d2_3c_20cd_5ffourth_20_3e',['D2< CD_FOURTH >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d2_3c_20cd_5fsecond_20_3e',['D2< CD_SECOND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d2_3c_20cd_5fsixth_20_3e',['D2< CD_SIXTH >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html',1,'openvdb::v3_2_0::math']]], + ['data',['data',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1FillOp.html#ac88dceffbecaed1137b0e27783adbcc5',1,'openvdb::v3_2_0::math::pcg::internal::FillOp::data()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1InfNormOp.html#a13924c1d5f2db40d873e0a808bb89b68',1,'openvdb::v3_2_0::math::pcg::Vector::InfNormOp::data()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1IsFiniteOp.html#a13924c1d5f2db40d873e0a808bb89b68',1,'openvdb::v3_2_0::math::pcg::Vector::IsFiniteOp::data()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a1699472936b80a88d3fc8096975d21b2',1,'openvdb::v3_2_0::math::pcg::Vector::data()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a92597b6ad54c8cebd6a987b7762eecfc',1,'openvdb::v3_2_0::math::pcg::Vector::data() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#afbaa77fc55aea2424364dad79af5b0fe',1,'openvdb::v3_2_0::math::Coord::data() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a1241bc81ce8071fb5bbb0f123eb4344b',1,'openvdb::v3_2_0::math::Coord::data()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a903161492cf665721519d65b502020b2',1,'openvdb::v3_2_0::tools::Dense::data()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a2fd3db6ca9f5e112fa00e1e54d608ca9',1,'openvdb::v3_2_0::tools::Dense::data() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1Array.html#a1699472936b80a88d3fc8096975d21b2',1,'openvdb::v3_2_0::tools::point_partitioner_internal::Array::data()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1Array.html#a92597b6ad54c8cebd6a987b7762eecfc',1,'openvdb::v3_2_0::tools::point_partitioner_internal::Array::data() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#a949a7e3a6833e71310b6f6291cfce7b1',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::data() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#a4bc7909bad8fff8e807921ee90421611',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::data()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#a56ee983527d60d1695f791bd41e0df66',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::data()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#a1e8a0fe67b38cb23b7cbdfbf2b0680d8',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::data() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#a56ee983527d60d1695f791bd41e0df66',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::data()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#a1e8a0fe67b38cb23b7cbdfbf2b0680d8',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::data() const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html#a903161492cf665721519d65b502020b2',1,'openvdb::v3_2_0::util::PagedArray::Page::data()']]], + ['datatable',['DataTable',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizePolygons.html#ab36a9882c54da6831fd0ca027f0c1b44',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizePolygons']]], + ['dda',['DDA',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#aa312de6e2d684d6546758c4c78bed032',1,'openvdb::v3_2_0::math::DDA::DDA()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#a50df510511ad8df53a97651994e4b49f',1,'openvdb::v3_2_0::math::DDA::DDA(const RayT &ray)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#a56e4ca108e902dc2df3dc9b935a6e319',1,'openvdb::v3_2_0::math::DDA::DDA(const RayT &ray, RealT startTime)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#a620f34730ddecf00371b6b6cfe0de15c',1,'openvdb::v3_2_0::math::DDA::DDA(const RayT &ray, RealT startTime, RealT maxTime)']]], + ['dda',['DDA',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html',1,'openvdb::v3_2_0::math']]], + ['dda_2eh',['DDA.h',['../DDA_8h.html',1,'']]], + ['dda_3c_20rayt_2c_20leaft_3a_3atotal_20_3e',['DDA< RayT, LeafT::TOTAL >',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html',1,'openvdb::v3_2_0::math']]], + ['dda_3c_20rayt_2c_20nodet_3a_3atotal_20_3e',['DDA< RayT, NodeT::TOTAL >',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html',1,'openvdb::v3_2_0::math']]], + ['dda_3c_20raytype_2c_20nodet_3a_3atotal_20_3e',['DDA< RayType, NodeT::TOTAL >',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html',1,'openvdb::v3_2_0::math']]], + ['ddscheme',['DDScheme',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4994cfdf23949af8ea6889b3ec5c9e20',1,'openvdb::v3_2_0::math']]], + ['deactivate',['deactivate',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#abc78330c21bf8fc7b0840d7ab6f0675d',1,'openvdb::v3_2_0::tools']]], + ['deallocateleafnodes',['DeallocateLeafNodes',['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree_1_1DeallocateLeafNodes.html#a2661e13a4ca1300f34d41240fa410530',1,'openvdb::v3_2_0::tree::Tree::DeallocateLeafNodes']]], + ['deallocateleafnodes',['DeallocateLeafNodes',['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree_1_1DeallocateLeafNodes.html',1,'openvdb::v3_2_0::tree::Tree']]], + ['decompose',['decompose',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1local__util.html#ae22987036217b9910f630a74b87adf14',1,'openvdb::v3_2_0::tools::local_util']]], + ['deepcopy',['DeepCopy',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DeepCopy.html#a808198ca123e401dbdd7d3b2323168c8',1,'openvdb::v3_2_0::tree::InternalNode::DeepCopy::DeepCopy()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a5b45322d0be54737e8481836fc8800e0',1,'openvdb::v3_2_0::Grid::deepCopy()']]], + ['deepcopy',['DeepCopy',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DeepCopy.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['deepcopygrid',['deepCopyGrid',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ae8a120f6dc33b84a9809c86b26fea949',1,'openvdb::v3_2_0::GridBase::deepCopyGrid()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a57549f1d2e3317403a5f057b8ca6308e',1,'openvdb::v3_2_0::Grid::deepCopyGrid()']]], + ['deepcopymeta',['deepCopyMeta',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a91e0bdd50e2420935f2da5abe6f6c2c6',1,'openvdb::v3_2_0::MetaMap']]], + ['deepcopytypedgrid',['deepCopyTypedGrid',['../namespaceopenvdb_1_1v3__2__0.html#a0bc462a7d672bd71592a3b819177b778',1,'openvdb::v3_2_0::deepCopyTypedGrid(const GridBase::ConstPtr &grid)'],['../namespaceopenvdb_1_1v3__2__0.html#a422e9a34e7a911149de20ccd1b32d85c',1,'openvdb::v3_2_0::deepCopyTypedGrid(const GridBase &grid)']]], + ['default_5fcapacity',['DEFAULT_CAPACITY',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a016e92e197533d47412d07329bd24ec7',1,'openvdb::v3_2_0::io::Queue']]], + ['default_5fcompression_5fflags',['DEFAULT_COMPRESSION_FLAGS',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a2aaced0ac95e38fb1b8efa0211d67532',1,'openvdb::v3_2_0::io::Archive']]], + ['default_5ftimeout',['DEFAULT_TIMEOUT',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a9da65584b3e3b8f4fb79b1ceb99cb901',1,'openvdb::v3_2_0::io::Queue']]], + ['delta',['delta',['../classopenvdb_1_1v3__2__0_1_1util_1_1CpuTimer.html#abbefaf15cc532f26ad86bf9a2d9a413d',1,'openvdb::v3_2_0::util::CpuTimer']]], + ['delta',['Delta',['../structopenvdb_1_1v3__2__0_1_1math_1_1Delta.html',1,'openvdb::v3_2_0::math']]], + ['delta_3c_20double_20_3e',['Delta< double >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Delta_3_01double_01_4.html',1,'openvdb::v3_2_0::math']]], + ['delta_3c_20float_20_3e',['Delta< float >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Delta_3_01float_01_4.html',1,'openvdb::v3_2_0::math']]], + ['dense',['Dense',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html',1,'openvdb::v3_2_0::tools']]], + ['dense',['Dense',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a5f5739420a709fa9476cedc15bc851a8',1,'openvdb::v3_2_0::tools::Dense::Dense(const CoordBBox &bbox)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a3b42c43a90b29068b8f52aea1c382f6d',1,'openvdb::v3_2_0::tools::Dense::Dense(const CoordBBox &bbox, const ValueT &value)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a6a104ab11937b8dd63e33064173c4b4b',1,'openvdb::v3_2_0::tools::Dense::Dense(const CoordBBox &bbox, ValueT *data)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a0801a73ddce1537d47ae1a15d8cba87d',1,'openvdb::v3_2_0::tools::Dense::Dense(const Coord &dim, const Coord &min=Coord(0))']]], + ['dense_2eh',['Dense.h',['../Dense_8h.html',1,'']]], + ['densebase',['DenseBase',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase.html',1,'openvdb::v3_2_0::tools']]], + ['densebase',['DenseBase',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutZYX_01_4.html#a4e4d4dead046c455993d35a2a05020aa',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutZYX >::DenseBase()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutXYZ_01_4.html#a4e4d4dead046c455993d35a2a05020aa',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutXYZ >::DenseBase()']]], + ['densebase_3c_20valuet_2c_20layoutxyz_20_3e',['DenseBase< ValueT, LayoutXYZ >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutXYZ_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['densebase_3c_20valuet_2c_20layoutzyx_20_3e',['DenseBase< ValueT, LayoutZYX >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutZYX_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['densecomposite',['denseComposite',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#af637deaa212600f808b571ef5f9b0e98',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor']]], + ['denseiter',['DenseIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DenseIter.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['denseiter',['DenseIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1DenseIter.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['denseiter',['DenseIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1DenseIter.html',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >']]], + ['denseiter',['DenseIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1DenseIter.html',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >']]], + ['denseiter',['DenseIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DenseIter.html#a9a2e38ab99cfe7d07a01aefec1046205',1,'openvdb::v3_2_0::tree::InternalNode::DenseIter::DenseIter()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DenseIter.html#a3df54e96a2404c0bc06a875ee363880b',1,'openvdb::v3_2_0::tree::InternalNode::DenseIter::DenseIter(const MaskDenseIterator &iter, NodeT *parent)'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1DenseIter.html#a9a2e38ab99cfe7d07a01aefec1046205',1,'openvdb::v3_2_0::tree::LeafNode::DenseIter::DenseIter()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1DenseIter.html#a3df54e96a2404c0bc06a875ee363880b',1,'openvdb::v3_2_0::tree::LeafNode::DenseIter::DenseIter(const MaskDenseIterator &iter, NodeT *parent)'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1DenseIter.html#a9a2e38ab99cfe7d07a01aefec1046205',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::DenseIter::DenseIter()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1DenseIter.html#a9dacef68980747270285e00bf55435b2',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::DenseIter::DenseIter(const MaskDenseIter &iter, NodeT *parent)'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1DenseIter.html#a9a2e38ab99cfe7d07a01aefec1046205',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::DenseIter::DenseIter()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1DenseIter.html#a9dacef68980747270285e00bf55435b2',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::DenseIter::DenseIter(const MaskDenseIter &iter, NodeT *parent)']]], + ['denseiterator',['DenseIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1DenseIterator.html',1,'openvdb::v3_2_0::util::RootNodeMask']]], + ['denseiterator',['DenseIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ab35fb59a7b6dc73937e7c8307fd2e8df',1,'openvdb::v3_2_0::util::NodeMask::DenseIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ab35fb59a7b6dc73937e7c8307fd2e8df',1,'openvdb::v3_2_0::util::NodeMask< 1 >::DenseIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ab35fb59a7b6dc73937e7c8307fd2e8df',1,'openvdb::v3_2_0::util::NodeMask< 2 >::DenseIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1DenseIterator.html#a13934667d577a0f2e41a63b00d272b8f',1,'openvdb::v3_2_0::util::RootNodeMask::DenseIterator::DenseIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1DenseIterator.html#a28e4d4f809a6802a5802c78040aa6d49',1,'openvdb::v3_2_0::util::RootNodeMask::DenseIterator::DenseIterator(Index32 pos, const RootNodeMask *parent)']]], + ['denseiteratorbase',['DenseIteratorBase',['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['denseiteratorbase',['DenseIteratorBase',['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a0367a3dacc4199a0c231a69df628a64c',1,'openvdb::v3_2_0::tree::DenseIteratorBase::DenseIteratorBase()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a62a4f8ec100dd56d3d8799cc51cbf2d0',1,'openvdb::v3_2_0::tree::DenseIteratorBase::DenseIteratorBase(const MaskIterT &iter, NodeT *parent)']]], + ['denseiteratorbase_3c_20maskdenseiter_2c_20denseiter_3c_20nodet_2c_20valuet_20_3e_2c_20nodet_2c_20void_2c_20valuet_20_3e',['DenseIteratorBase< MaskDenseIter, DenseIter< NodeT, ValueT >, NodeT, void, ValueT >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['denseiteratorbase_3c_20maskdenseiterator_2c_20denseiter_3c_20nodet_2c_20childt_2c_20valuet_2c_20tagt_20_3e_2c_20nodet_2c_20childt_2c_20valuet_20_3e',['DenseIteratorBase< MaskDenseIterator, DenseIter< NodeT, ChildT, ValueT, TagT >, NodeT, ChildT, ValueT >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['denseiteratorbase_3c_20maskdenseiterator_2c_20denseiter_3c_20nodet_2c_20valuet_2c_20tagt_20_3e_2c_20nodet_2c_20void_2c_20valuet_20_3e',['DenseIteratorBase< MaskDenseIterator, DenseIter< NodeT, ValueT, TagT >, NodeT, void, ValueT >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['densemaskiterator',['DenseMaskIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1DenseMaskIterator.html',1,'openvdb::v3_2_0::util']]], + ['densemaskiterator',['DenseMaskIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1DenseMaskIterator.html#a35ac790e47e703ec7176089b66ed66b2',1,'openvdb::v3_2_0::util::DenseMaskIterator::DenseMaskIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1DenseMaskIterator.html#a6a13dd771a1f8289c3bba6d2fe318d66',1,'openvdb::v3_2_0::util::DenseMaskIterator::DenseMaskIterator(Index32 pos, const NodeMask *parent)']]], + ['densesparsetools_2eh',['DenseSparseTools.h',['../DenseSparseTools_8h.html',1,'']]], + ['densestencil',['DenseStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1DenseStencil.html',1,'openvdb::v3_2_0::math']]], + ['densestencil',['DenseStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1DenseStencil.html#ab3eada6ac10139133097790087a02799',1,'openvdb::v3_2_0::math::DenseStencil']]], + ['denset',['DenseT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyToDense.html#a36b7848bc9f0c7af80bee275a127062c',1,'openvdb::v3_2_0::tools::CopyToDense::DenseT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyFromDense.html#a36b7848bc9f0c7af80bee275a127062c',1,'openvdb::v3_2_0::tools::CopyFromDense::DenseT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseTransformer.html#a1f6d54128c1968b15710930698a77e71',1,'openvdb::v3_2_0::tools::DenseTransformer::DenseT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ContiguousOp.html#a1f6d54128c1968b15710930698a77e71',1,'openvdb::v3_2_0::tools::ContiguousOp::DenseT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#a1f6d54128c1968b15710930698a77e71',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor::DenseT()']]], + ['densetransformer',['DenseTransformer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseTransformer.html',1,'openvdb::v3_2_0::tools']]], + ['densetransformer',['DenseTransformer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseTransformer.html#a36c777705a3f82ce26495095e0cce6d1',1,'openvdb::v3_2_0::tools::DenseTransformer::DenseTransformer(DenseT &dense, const openvdb::math::CoordBBox &bbox, const OpType &functor)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseTransformer.html#a3b3fdba06ec99a246fe99db494bc0119',1,'openvdb::v3_2_0::tools::DenseTransformer::DenseTransformer(const DenseTransformer &other)']]], + ['denseuniformpointscatter',['DenseUniformPointScatter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseUniformPointScatter.html',1,'openvdb::v3_2_0::tools']]], + ['denseuniformpointscatter',['DenseUniformPointScatter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseUniformPointScatter.html#ab268e039e28fb342bd30d1079ca1136f',1,'openvdb::v3_2_0::tools::DenseUniformPointScatter']]], + ['densevaluetype',['DenseValueType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#a2bb0b32f06f08871e824965dec59bcab',1,'openvdb::v3_2_0::tools::SparseExtractor::DenseValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#a1896c39e7a6259e67bcef9a8f9692485',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor::DenseValueType()']]], + ['depth',['DEPTH',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a33812eef2746f526e18a7d13ad9d0eb3',1,'openvdb::v3_2_0::tree::LeafManager::DEPTH()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a33812eef2746f526e18a7d13ad9d0eb3',1,'openvdb::v3_2_0::tree::Tree::DEPTH()']]], + ['dequetoarray',['dequeToArray',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal.html#ae340677c8733e440f517e5721fbea5b6',1,'openvdb::v3_2_0::tools::point_index_grid_internal']]], + ['derivative',['derivative',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ab768629508bb0df31c74ff405baf4646',1,'openvdb::v3_2_0::math::Quat']]], + ['det',['det',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a67ccc6cfa482de0cf47a6ff7124a2b81',1,'openvdb::v3_2_0::math::Mat3::det()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a67ccc6cfa482de0cf47a6ff7124a2b81',1,'openvdb::v3_2_0::math::Mat4::det()']]], + ['determinant',['determinant',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a4ff529b8331f4a417b5bf11278714c91',1,'openvdb::v3_2_0::math::MapBase::determinant() const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#ab2396600b886bb5bae12e667e98c843b',1,'openvdb::v3_2_0::math::MapBase::determinant(const Vec3d &) const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a534b7de6b984015f680b9e38239b6500',1,'openvdb::v3_2_0::math::AffineMap::determinant(const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a390024ffecb7973f5de3194dc2f606f5',1,'openvdb::v3_2_0::math::AffineMap::determinant() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a534b7de6b984015f680b9e38239b6500',1,'openvdb::v3_2_0::math::ScaleMap::determinant(const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a390024ffecb7973f5de3194dc2f606f5',1,'openvdb::v3_2_0::math::ScaleMap::determinant() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a534b7de6b984015f680b9e38239b6500',1,'openvdb::v3_2_0::math::TranslationMap::determinant(const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a390024ffecb7973f5de3194dc2f606f5',1,'openvdb::v3_2_0::math::TranslationMap::determinant() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a534b7de6b984015f680b9e38239b6500',1,'openvdb::v3_2_0::math::ScaleTranslateMap::determinant(const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a390024ffecb7973f5de3194dc2f606f5',1,'openvdb::v3_2_0::math::ScaleTranslateMap::determinant() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a534b7de6b984015f680b9e38239b6500',1,'openvdb::v3_2_0::math::UnitaryMap::determinant(const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a390024ffecb7973f5de3194dc2f606f5',1,'openvdb::v3_2_0::math::UnitaryMap::determinant() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a390024ffecb7973f5de3194dc2f606f5',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::determinant() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#aa8b86a98fa61d8f3d9c8d2957d9c5b71',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::determinant(const Vec3d &loc) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#a390024ffecb7973f5de3194dc2f606f5',1,'openvdb::v3_2_0::math::GenericMap::determinant() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#aa0e5f41a045d264916896608f1ba2cc1',1,'openvdb::v3_2_0::math::GenericMap::determinant(const Vec3d &in) const ']]], + ['deterministicdotproductop',['DeterministicDotProductOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1DeterministicDotProductOp.html',1,'openvdb::v3_2_0::math::pcg::Vector']]], + ['deterministicdotproductop',['DeterministicDotProductOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1DeterministicDotProductOp.html#ab1e941092794b862ea802aa0b0d32234',1,'openvdb::v3_2_0::math::pcg::Vector::DeterministicDotProductOp']]], + ['diagnose',['Diagnose',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Diagnose.html',1,'openvdb::v3_2_0::tools']]], + ['diagnose',['Diagnose',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Diagnose.html#a3d37b74a02a72cafa6aa6b36f901802a',1,'openvdb::v3_2_0::tools::Diagnose']]], + ['diagnose_3c_20gridtype_20_3e',['Diagnose< GridType >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Diagnose.html',1,'openvdb::v3_2_0::tools']]], + ['diagnostics_2eh',['Diagnostics.h',['../Diagnostics_8h.html',1,'']]], + ['diagonalizesymmetricmatrix',['diagonalizeSymmetricMatrix',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a2ff354add79f087c57bb01c62cc60130',1,'openvdb::v3_2_0::math']]], + ['difference',['difference',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2NDT_01_4.html#a0b68e4aed2d0fe020a920448384fef12',1,'openvdb::v3_2_0::math::D1< CD_2NDT >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2ND_01_4.html#a0b68e4aed2d0fe020a920448384fef12',1,'openvdb::v3_2_0::math::D1< CD_2ND >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__4TH_01_4.html#a09b73d89b1e16c32cc9b0f186a912d99',1,'openvdb::v3_2_0::math::D1< CD_4TH >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__6TH_01_4.html#a90a19f8c6c5abb0d3910654c9fee02aa',1,'openvdb::v3_2_0::math::D1< CD_6TH >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__1ST_01_4.html#a9cf50f96aa3f913dde1c069513f43312',1,'openvdb::v3_2_0::math::D1< FD_1ST >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__2ND_01_4.html#ac54cf79c9b9cc3ced4d78112887b0d90',1,'openvdb::v3_2_0::math::D1< FD_2ND >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__3RD_01_4.html#a1b23c8596409ec35923347a87038d979',1,'openvdb::v3_2_0::math::D1< FD_3RD >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__1ST_01_4.html#a01fb15410bf8d8f6ba0a08b79c45f463',1,'openvdb::v3_2_0::math::D1< BD_1ST >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__2ND_01_4.html#a9adf5c61988c388a032e77ed160d8412',1,'openvdb::v3_2_0::math::D1< BD_2ND >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__3RD_01_4.html#abb838377b9b4a643556f43cb922f5448',1,'openvdb::v3_2_0::math::D1< BD_3RD >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__WENO5_01_4.html#a4867e5d150e7929994f983d26e5b5161',1,'openvdb::v3_2_0::math::D1< FD_WENO5 >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__HJWENO5_01_4.html#a4867e5d150e7929994f983d26e5b5161',1,'openvdb::v3_2_0::math::D1< FD_HJWENO5 >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__WENO5_01_4.html#af686cb8a6e379518ef81e380fde36d2c',1,'openvdb::v3_2_0::math::D1< BD_WENO5 >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__HJWENO5_01_4.html#af686cb8a6e379518ef81e380fde36d2c',1,'openvdb::v3_2_0::math::D1< BD_HJWENO5 >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#ada8698e6fad869ad52012b28bec3beaf',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#ad5a3587f1797892ee18710b7a52550d3',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#ac0930f09b558d827d45b89d6e0b95f35',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::difference()']]], + ['difference_5ftype',['difference_type',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#a73fa7542806f925921484e1b57764b89',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::difference_type()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a73fa7542806f925921484e1b57764b89',1,'openvdb::v3_2_0::util::PagedArray::Iterator::difference_type()']]], + ['diffleafnodemask',['DiffLeafNodeMask',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1DiffLeafNodeMask.html#a800c1d912b82c19c40e5ae6311da068a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::DiffLeafNodeMask']]], + ['diffleafnodemask',['DiffLeafNodeMask',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1DiffLeafNodeMask.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['diffuseshader',['DiffuseShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiffuseShader.html',1,'openvdb::v3_2_0::tools']]], + ['diffuseshader',['DiffuseShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiffuseShader.html#a6f731dbeb98a19908392202bde402f82',1,'openvdb::v3_2_0::tools::DiffuseShader::DiffuseShader()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiffuseShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#a1954984951f54ae672f7cbd8efade77f',1,'openvdb::v3_2_0::tools::DiffuseShader< Film::RGBA, SamplerType >::DiffuseShader()']]], + ['diffuseshader_3c_20film_3a_3argba_2c_20samplertype_20_3e',['DiffuseShader< Film::RGBA, SamplerType >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiffuseShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['dilate',['dilate',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#ad27daf87efe47196bc6d2f4df72b8f09',1,'openvdb::v3_2_0::tools::LevelSetTracker']]], + ['dilateactivevalues',['dilateActiveValues',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a39c09a72e7804426f476100267f70dc2',1,'openvdb::v3_2_0::tools::dilateActiveValues(TreeType &tree, int iterations=1, NearestNeighbors nn=NN_FACE, TilePolicy mode=PRESERVE_TILES)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aa04cca1d8b96032eacae09e5ab804853',1,'openvdb::v3_2_0::tools::dilateActiveValues(tree::LeafManager< TreeType > &manager, int iterations=1, NearestNeighbors nn=NN_FACE, TilePolicy mode=PRESERVE_TILES)']]], + ['dilatevoxels',['dilateVoxels',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a8381628238e0c71371cba47c63d30451',1,'openvdb::v3_2_0::tools::Morphology::dilateVoxels()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a322f1e4e826ec7bd4cd1ac52911c3e03',1,'openvdb::v3_2_0::tools::dilateVoxels(TreeType &tree, int iterations=1, NearestNeighbors nn=NN_FACE)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a25a80b2b5f1b77d2dc14d2c40eefb1b9',1,'openvdb::v3_2_0::tools::dilateVoxels(tree::LeafManager< TreeType > &manager, int iterations=1, NearestNeighbors nn=NN_FACE)']]], + ['dilatevoxels18',['dilateVoxels18',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#acec5e261d7fe3fa0671cf7792d47677e',1,'openvdb::v3_2_0::tools::Morphology']]], + ['dilatevoxels26',['dilateVoxels26',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a57ce6c119b0a63fd2f93516b38854c77',1,'openvdb::v3_2_0::tools::Morphology']]], + ['dilatevoxels6',['dilateVoxels6',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a36445df59ec28bba54f297790717a390',1,'openvdb::v3_2_0::tools::Morphology']]], + ['dilationop',['DilationOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DilationOp.html',1,'openvdb::v3_2_0::tools']]], + ['dilationop',['DilationOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DilationOp.html#a24212805c17d49442ac2e260803a028a',1,'openvdb::v3_2_0::tools::DilationOp']]], + ['dim',['DIM',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a785cb9180680cc5b0dcb6efac36579c7',1,'openvdb::v3_2_0::tree::InternalNode::DIM()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a785cb9180680cc5b0dcb6efac36579c7',1,'openvdb::v3_2_0::tree::LeafNode::DIM()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a785cb9180680cc5b0dcb6efac36579c7',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::DIM()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a785cb9180680cc5b0dcb6efac36579c7',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::DIM()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a8db21c605cfb673d79c36ff2884c6387',1,'openvdb::v3_2_0::util::NodeMask::DIM()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a8db21c605cfb673d79c36ff2884c6387',1,'openvdb::v3_2_0::util::NodeMask< 1 >::DIM()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a8db21c605cfb673d79c36ff2884c6387',1,'openvdb::v3_2_0::util::NodeMask< 2 >::DIM()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a8fc00b5f783b9a2cbf468848ce8ec7d3',1,'openvdb::v3_2_0::math::CoordBBox::dim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#af6a9b0f77cb5a3c5df18a9aff3c40089',1,'openvdb::v3_2_0::tree::InternalNode::dim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#af6a9b0f77cb5a3c5df18a9aff3c40089',1,'openvdb::v3_2_0::tree::LeafNode::dim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#af6a9b0f77cb5a3c5df18a9aff3c40089',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::dim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#af6a9b0f77cb5a3c5df18a9aff3c40089',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::dim()']]], + ['dimtoword',['DimToWord',['../structopenvdb_1_1v3__2__0_1_1tools_1_1DimToWord.html',1,'openvdb::v3_2_0::tools']]], + ['dimtoword_3c_203_20_3e',['DimToWord< 3 >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1DimToWord_3_013_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['dimtoword_3c_204_20_3e',['DimToWord< 4 >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1DimToWord_3_014_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['dimtoword_3c_205_20_3e',['DimToWord< 5 >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1DimToWord_3_015_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['dimtoword_3c_206_20_3e',['DimToWord< 6 >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1DimToWord_3_016_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['dimtoword_3c_20leaf_5flog2dim_20_3e',['DimToWord< LEAF_LOG2DIM >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1DimToWord.html',1,'openvdb::v3_2_0::tools']]], + ['dir',['dir',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#acded29b20cd1f1afb6baa342cc150529',1,'openvdb::v3_2_0::math::Ray']]], + ['diracdelta',['DiracDelta',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiracDelta.html',1,'openvdb::v3_2_0::tools']]], + ['diracdelta',['DiracDelta',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiracDelta.html#adabd2af27eb88bb1f0564dc908624de7',1,'openvdb::v3_2_0::tools::DiracDelta']]], + ['dirichletop',['DirichletOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1DirichletOp.html',1,'openvdb::v3_2_0::tools::poisson::internal']]], + ['disable_5fintersecting_5fvoxel_5fremoval',['DISABLE_INTERSECTING_VOXEL_REMOVAL',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a2623bf4797b966b29fbe45c87e60481ca145012afd1cbb669fe4c8c94b041abc4',1,'openvdb::v3_2_0::tools']]], + ['disable_5fnarrow_5fband_5ftrimming',['DISABLE_NARROW_BAND_TRIMMING',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a2623bf4797b966b29fbe45c87e60481ca4d48077f5cf6edf9cb34cf66d4d88505',1,'openvdb::v3_2_0::tools']]], + ['disable_5frenormalization',['DISABLE_RENORMALIZATION',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a2623bf4797b966b29fbe45c87e60481ca414a054233ec27d0ec60800ea7e73332',1,'openvdb::v3_2_0::tools']]], + ['disablet',['DisableT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a131bd8d3ac26e28522ab343e89361c4d',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['discretefield',['DiscreteField',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiscreteField.html',1,'openvdb::v3_2_0::tools']]], + ['discretefield',['DiscreteField',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiscreteField.html#a4e21d4799a54d25e516268ff5325928e',1,'openvdb::v3_2_0::tools::DiscreteField::DiscreteField(const VelGridT &vel)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiscreteField.html#a01d2d609a18d4d066fc5032c9935cdf5',1,'openvdb::v3_2_0::tools::DiscreteField::DiscreteField(const DiscreteField &other)']]], + ['dist',['dist',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband_1_1Fragment.html#aa2ebdd6fd2366762c5554ba197c40a02',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::Fragment']]], + ['distacc',['distAcc',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#a9106117996882c042c7f682ef076f0b7',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData']]], + ['disttree',['distTree',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#ac380eb87f8a6061519cd8fecedcb620e',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData']]], + ['div',['div',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#afd85c18703d7d044cb211d8515e77f4b',1,'openvdb::v3_2_0::math::Vec2::div()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a60755afb9c8823376917fae034d88e6d',1,'openvdb::v3_2_0::math::Vec3::div()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#aea4336762a5c22794c2117603a07cb48',1,'openvdb::v3_2_0::math::Vec4::div()']]], + ['divergence',['Divergence',['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence.html',1,'openvdb::v3_2_0::math']]], + ['divergence',['Divergence',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Divergence.html#ac4ec412d3b51b6995b77b6b18fd01687',1,'openvdb::v3_2_0::tools::Divergence::Divergence(const InGridT &grid, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Divergence.html#a0b64792d472ca28af2dd9ebf7abae80d',1,'openvdb::v3_2_0::tools::Divergence::Divergence(const InGridT &grid, const MaskGridType &mask, InterruptT *interrupt=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ad9d4adc505e30de4684d20efdcb66512',1,'openvdb::v3_2_0::tools::divergence(const GridType &grid, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ab4342922999466ca1d2481c6c0d083b1',1,'openvdb::v3_2_0::tools::divergence(const GridType &grid, const MaskT &mask, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a46206f57882a4efe413097cf7dbabaa9',1,'openvdb::v3_2_0::tools::divergence(const GridType &grid, bool threaded=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a175d0e81fcfad5923a6c8f6959e29e9c',1,'openvdb::v3_2_0::tools::divergence(const GridType &grid, const MaskT &mask, bool threaded=true)']]], + ['divergence',['Divergence',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Divergence.html',1,'openvdb::v3_2_0::tools']]], + ['divergence_3c_20scalemap_2c_20cd_5f2nd_20_3e',['Divergence< ScaleMap, CD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01ScaleMap_00_01CD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['divergence_3c_20scalemap_2c_20diffscheme_20_3e',['Divergence< ScaleMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01ScaleMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['divergence_3c_20scaletranslatemap_2c_20cd_5f2nd_20_3e',['Divergence< ScaleTranslateMap, CD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01ScaleTranslateMap_00_01CD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['divergence_3c_20scaletranslatemap_2c_20diffscheme_20_3e',['Divergence< ScaleTranslateMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01ScaleTranslateMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['divergence_3c_20translationmap_2c_20diffscheme_20_3e',['Divergence< TranslationMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01TranslationMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['divergence_3c_20uniformscalemap_2c_20cd_5f2nd_20_3e',['Divergence< UniformScaleMap, CD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01UniformScaleMap_00_01CD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['divergence_3c_20uniformscalemap_2c_20diffscheme_20_3e',['Divergence< UniformScaleMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01UniformScaleMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['divergence_3c_20uniformscaletranslatemap_2c_20cd_5f2nd_20_3e',['Divergence< UniformScaleTranslateMap, CD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01UniformScaleTranslateMap_00_01CD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['divergence_3c_20uniformscaletranslatemap_2c_20diffscheme_20_3e',['Divergence< UniformScaleTranslateMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01UniformScaleTranslateMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['divide',['divide',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html#a9a74ea1311b198a91302706eef1acbf1',1,'openvdb::v3_2_0::tools::composite::divide(const T &a, const T &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html#a9b5a4bc9b06832d70ecac728e85d8adf',1,'openvdb::v3_2_0::tools::composite::divide(const T &a, const T &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html#ad6b4cb2fdbe10008a7c7a5e340c51cbc',1,'openvdb::v3_2_0::tools::composite::divide(bool a, bool)']]], + ['doc_2etxt',['doc.txt',['../doc_8txt.html',1,'']]], + ['doclip',['doClip',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal.html#afd345871f958089a2ae3fd9a379695aa',1,'openvdb::v3_2_0::tools::clip_internal']]], + ['docsgcopy',['doCSGCopy',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html#aa53b04e5674ff8b6075cbfa6c05af003',1,'openvdb::v3_2_0::tools::composite']]], + ['doerosion',['doErosion',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#af672f329707f1bf43d85f1af54475708',1,'openvdb::v3_2_0::tools::Morphology']]], + ['dolevelsetarea',['doLevelSetArea',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#afac82c8051e56a2b1bee1b7c782f2a23',1,'openvdb::v3_2_0::tools::doLevelSetArea(const GridT &grid, bool useWorldSpace)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a3c1b4a51254f886787d2093a96b571ce',1,'openvdb::v3_2_0::tools::doLevelSetArea(const GridT &, bool)']]], + ['dolevelsetmeasure',['doLevelSetMeasure',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ade2a8b0f48ddf43a9b9addfb7317f427',1,'openvdb::v3_2_0::tools::doLevelSetMeasure(const GridT &grid, Real &area, Real &volume, bool useWorldSpace)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a7122050014d84a512f90fbee3b15f6a8',1,'openvdb::v3_2_0::tools::doLevelSetMeasure(const GridT &, Real &, Real &, bool)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8454e73e7e4f6693925ade7ce0559c58',1,'openvdb::v3_2_0::tools::doLevelSetMeasure(const GridT &grid, Real &area, Real &volume, Real &avgCurvature, bool useWorldSpace)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a08b66ba05affbb7d526cfdca4ba92a1e',1,'openvdb::v3_2_0::tools::doLevelSetMeasure(const GridT &, Real &, Real &, Real &, bool)']]], + ['dolevelsetrebuild',['doLevelSetRebuild',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a0be014a7a16d7b79b527bfc34d943718',1,'openvdb::v3_2_0::tools::doLevelSetRebuild(const GridType &grid, typename GridType::ValueType iso, typename GridType::ValueType exWidth, typename GridType::ValueType inWidth, const math::Transform *xform, InterruptT *interrupter)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a4deb0c966bf04fedf66bff277e819338',1,'openvdb::v3_2_0::tools::doLevelSetRebuild(const GridType &, typename GridType::ValueType, typename GridType::ValueType, typename GridType::ValueType, const math::Transform *, InterruptT *)']]], + ['dolevelsetvolume',['doLevelSetVolume',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a6672a5d1143d72d141b59b36f424295c',1,'openvdb::v3_2_0::tools::doLevelSetVolume(const GridT &grid, bool useWorldSpace)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a811dfb4eb7e807033fe008309163d5d8',1,'openvdb::v3_2_0::tools::doLevelSetVolume(const GridT &, bool)']]], + ['domeshconversion',['doMeshConversion',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ad85fb8ea9c03ba69860453695d97ac64',1,'openvdb::v3_2_0::tools::doMeshConversion(const openvdb::math::Transform &xform, const std::vector< Vec3s > &points, const std::vector< Vec3I > &triangles, const std::vector< Vec4I > &quads, float exBandWidth, float inBandWidth, bool unsignedDistanceField=false)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a339eb032b43a646293977965e47c14cb',1,'openvdb::v3_2_0::tools::doMeshConversion(const math::Transform &, const std::vector< Vec3s > &, const std::vector< Vec3I > &, const std::vector< Vec4I > &, float, float, bool=false)']]], + ['done',['done',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UniformPrimBuilder.html#ab650651e4cda2869f73100c6fd2c821a',1,'openvdb::v3_2_0::tools::internal::UniformPrimBuilder::done()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1AdaptivePrimBuilder.html#ab650651e4cda2869f73100c6fd2c821a',1,'openvdb::v3_2_0::tools::internal::AdaptivePrimBuilder::done()']]], + ['doprocesstypedmap',['doProcessTypedMap',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a3a702edf751817155ff74968cea2883e',1,'openvdb::v3_2_0::math::doProcessTypedMap(Transform &transform, OpType &op)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a2f161536654a6a558751a1bd6bcfa535',1,'openvdb::v3_2_0::math::doProcessTypedMap(const Transform &transform, OpType &op)']]], + ['doresampletomatch',['doResampleToMatch',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a5c58d2a887f4018f4051a1333bbb06be',1,'openvdb::v3_2_0::tools']]], + ['dosignedfloodfill',['doSignedFloodFill',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a7ef429594f774227e46665f49c50a325',1,'openvdb::v3_2_0::tools::doSignedFloodFill(TreeOrLeafManagerT &tree, typename TreeOrLeafManagerT::ValueType outsideValue, typename TreeOrLeafManagerT::ValueType insideValue, bool threaded, size_t grainSize, Index minLevel)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a5cb9b48192263f81a3a1cd410b39529c',1,'openvdb::v3_2_0::tools::doSignedFloodFill(TreeOrLeafManagerT &, const typename TreeOrLeafManagerT::ValueType &, const typename TreeOrLeafManagerT::ValueType &, bool, size_t, Index)']]], + ['doswapleafbuffer',['doSwapLeafBuffer',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafManagerImpl.html#a54e68dec1f273db0216801b3db50cef8',1,'openvdb::v3_2_0::tree::LeafManagerImpl::doSwapLeafBuffer()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafManagerImpl_3_01LeafManager_3_01const_01TreeT_01_4_01_4.html#ad924a2b72286de32679f315983791de5',1,'openvdb::v3_2_0::tree::LeafManagerImpl< LeafManager< const TreeT > >::doSwapLeafBuffer()']]], + ['dot',['dot',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a416c4c67397867e58dc411780405bcfa',1,'openvdb::v3_2_0::math::pcg::Vector::dot()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ad9e5f677c292e4f05bc7be9f1c784073',1,'openvdb::v3_2_0::math::Quat::dot()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ae2891677312bf6c0591d5ecc57da9055',1,'openvdb::v3_2_0::math::Vec2::dot()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a2578e437cc5c4c0cdd1b3fa7134ea323',1,'openvdb::v3_2_0::math::Vec3::dot()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a1cbd8ae53f07d4b562afd3fee2f2651f',1,'openvdb::v3_2_0::math::Vec4::dot()']]], + ['dotransformvectors',['doTransformVectors',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a9785ef8a3d3e7ca6b501d76664a16858',1,'openvdb::v3_2_0::tools::doTransformVectors(GridType &, const Mat4d &)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a61fae0ffe670b863f9a5f0d31e0513ad',1,'openvdb::v3_2_0::tools::doTransformVectors(GridType &grid, const Mat4d &mat)']]], + ['doublegrid',['DoubleGrid',['../namespaceopenvdb_1_1v3__2__0.html#a157f0ffa062b770188623e563fd128d9',1,'openvdb::v3_2_0']]], + ['doublemetadata',['DoubleMetadata',['../namespaceopenvdb_1_1v3__2__0.html#ab663ecc076d6168b44bdb1f1607361a1',1,'openvdb::v3_2_0']]], + ['doubletoint64',['doubleToInt64',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a440ce34832f29ca5bb2866233cf789ff',1,'openvdb::v3_2_0::math']]], + ['doubletree',['DoubleTree',['../namespaceopenvdb_1_1v3__2__0.html#a0f1f7b962c15962ab6c41807dbb19fa0',1,'openvdb::v3_2_0']]], + ['dovisit',['doVisit',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a44c977db48a2d200aaaa6134393af37d',1,'openvdb::v3_2_0::tree::InternalNode::doVisit()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a44c977db48a2d200aaaa6134393af37d',1,'openvdb::v3_2_0::tree::LeafNode::doVisit()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a44c977db48a2d200aaaa6134393af37d',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::doVisit()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a44c977db48a2d200aaaa6134393af37d',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::doVisit()']]], + ['dovisit2',['doVisit2',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aca7ba3f1bd8e72a6fe15f9225270b42d',1,'openvdb::v3_2_0::tree::InternalNode::doVisit2()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a0d74fca12f4f67419d4a80d5a55aa09f',1,'openvdb::v3_2_0::tree::LeafNode::doVisit2()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a0d74fca12f4f67419d4a80d5a55aa09f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::doVisit2()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a0d74fca12f4f67419d4a80d5a55aa09f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::doVisit2()']]], + ['dovisit2node',['doVisit2Node',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a5ca81ce706150daab4ad31ff65a339d3',1,'openvdb::v3_2_0::tree::InternalNode::doVisit2Node()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a5f9479166b5ff9862916d9fff22f48d0',1,'openvdb::v3_2_0::tree::LeafNode::doVisit2Node()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a5f9479166b5ff9862916d9fff22f48d0',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::doVisit2Node()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a5f9479166b5ff9862916d9fff22f48d0',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::doVisit2Node()']]], + ['dovolumetomesh',['doVolumeToMesh',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aa0b9ebff36817e05e1ba54743955ae83',1,'openvdb::v3_2_0::tools::doVolumeToMesh(const GridType &grid, std::vector< Vec3s > &points, std::vector< Vec3I > &triangles, std::vector< Vec4I > &quads, double isovalue, double adaptivity)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ad35c0839251d977edb4350196cabb692',1,'openvdb::v3_2_0::tools::doVolumeToMesh(const GridType &, std::vector< Vec3s > &, std::vector< Vec3I > &, std::vector< Vec4I > &, double, double)']]], + ['down',['down',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a21a1268aa4161d375e5c603ef507b2d7',1,'openvdb::v3_2_0::tree::IterListItem::down()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a21a1268aa4161d375e5c603ef507b2d7',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::down()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a21a1268aa4161d375e5c603ef507b2d7',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::down()']]], + ['ds_5fadd',['DS_ADD',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a4af148611e5ef140a0121ee996fb8321a8d4beb09c71b751771158b53d1cf99c3',1,'openvdb::v3_2_0::tools']]], + ['ds_5fmax',['DS_MAX',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a4af148611e5ef140a0121ee996fb8321abab98682392bb93a93278797f8db5d75',1,'openvdb::v3_2_0::tools']]], + ['ds_5fmin',['DS_MIN',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a4af148611e5ef140a0121ee996fb8321a85f583b7144fce0c85930f1a01c25a72',1,'openvdb::v3_2_0::tools']]], + ['ds_5fmult',['DS_MULT',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a4af148611e5ef140a0121ee996fb8321a697b1fa695bcb46b82bc1f22ff61855a',1,'openvdb::v3_2_0::tools']]], + ['ds_5fover',['DS_OVER',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a4af148611e5ef140a0121ee996fb8321a812485f135c6cee2586b34b814cddc6a',1,'openvdb::v3_2_0::tools']]], + ['ds_5fset',['DS_SET',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a4af148611e5ef140a0121ee996fb8321ab5356cf273f92049213e30c3444f149b',1,'openvdb::v3_2_0::tools']]], + ['ds_5fsub',['DS_SUB',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a4af148611e5ef140a0121ee996fb8321afa18e1086c47d6d467d2ca6e708f739b',1,'openvdb::v3_2_0::tools']]], + ['dscheme',['DScheme',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57',1,'openvdb::v3_2_0::math']]], + ['dscompositeop',['DSCompositeOp',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a4af148611e5ef140a0121ee996fb8321',1,'openvdb::v3_2_0::tools']]], + ['dsconverter',['DSConverter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1DSConverter.html',1,'openvdb::v3_2_0::tools']]], + ['dsschemetomenuname',['dsSchemeToMenuName',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7588846c9b098988ef71b9940b0192b7',1,'openvdb::v3_2_0::math']]], + ['dsschemetostring',['dsSchemeToString',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a855b023b380be1feebc94caabc46f74c',1,'openvdb::v3_2_0::math']]], + ['dualgridsampler',['DualGridSampler',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler.html',1,'openvdb::v3_2_0::tools']]], + ['dualgridsampler',['DualGridSampler',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler.html#a7202b469ac87676b989535272251cca4',1,'openvdb::v3_2_0::tools::DualGridSampler::DualGridSampler(const GridType &sourceGrid, const math::Transform &targetXform)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler.html#a81beae5f1d9266f1a7c99f71beb41269',1,'openvdb::v3_2_0::tools::DualGridSampler::DualGridSampler(const TreeType &sourceTree, const math::Transform &sourceXform, const math::Transform &targetXform)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerT_01_4.html#a01d4fd609289869228a5ed3341c024e5',1,'openvdb::v3_2_0::tools::DualGridSampler< tree::ValueAccessor< TreeT >, SamplerT >::DualGridSampler()']]], + ['dualgridsampler_3c_20acct_2c_20samplert_20_3e',['DualGridSampler< AccT, SamplerT >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler.html',1,'openvdb::v3_2_0::tools']]], + ['dualgridsampler_3c_20tree_3a_3avalueaccessor_3c_20treet_20_3e_2c_20samplert_20_3e',['DualGridSampler< tree::ValueAccessor< TreeT >, SamplerT >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerT_01_4.html',1,'openvdb::v3_2_0::tools']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_6.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_6.html new file mode 100644 index 00000000..b98d7310 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_6.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_6.js new file mode 100644 index 00000000..c7b94214 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_6.js @@ -0,0 +1,77 @@ +var searchData= +[ + ['earlyout',['earlyOut',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#a89f4552fb4d811502be806faa107b7db',1,'openvdb::v3_2_0::tools::PointAdvect']]], + ['edgedata',['EdgeData',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData']]], + ['edgedata',['EdgeData',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#a25b7344aeadb9a271db0da853efb3da4',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData']]], + ['edges',['EDGES',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a0341d081395407fd92061819ba76eb96aa0102c1339dd0a028ac9071a30a38c21',1,'openvdb::v3_2_0::tools::internal']]], + ['elementtype',['ElementType',['../structopenvdb_1_1v3__2__0_1_1VecTraits.html#a367f2f6dcbdbf1c2d2eacf1819163462',1,'openvdb::v3_2_0::VecTraits::ElementType()'],['../structopenvdb_1_1v3__2__0_1_1VecTraits_3_01math_1_1Vec2_3_01T_01_4_01_4.html#a367f2f6dcbdbf1c2d2eacf1819163462',1,'openvdb::v3_2_0::VecTraits< math::Vec2< T > >::ElementType()'],['../structopenvdb_1_1v3__2__0_1_1VecTraits_3_01math_1_1Vec3_3_01T_01_4_01_4.html#a367f2f6dcbdbf1c2d2eacf1819163462',1,'openvdb::v3_2_0::VecTraits< math::Vec3< T > >::ElementType()'],['../structopenvdb_1_1v3__2__0_1_1VecTraits_3_01math_1_1Vec4_3_01T_01_4_01_4.html#a367f2f6dcbdbf1c2d2eacf1819163462',1,'openvdb::v3_2_0::VecTraits< math::Vec4< T > >::ElementType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#aa11b92fa821da8f64d941c6baa08a2e2',1,'openvdb::v3_2_0::math::BBox::ElementType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNan.html#af41e18ae17c354f72b3c7e18eaa4fe71',1,'openvdb::v3_2_0::tools::CheckNan::ElementType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckInf.html#af41e18ae17c354f72b3c7e18eaa4fe71',1,'openvdb::v3_2_0::tools::CheckInf::ElementType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckFinite.html#af41e18ae17c354f72b3c7e18eaa4fe71',1,'openvdb::v3_2_0::tools::CheckFinite::ElementType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMagnitude.html#af41e18ae17c354f72b3c7e18eaa4fe71',1,'openvdb::v3_2_0::tools::CheckMagnitude::ElementType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckRange.html#af41e18ae17c354f72b3c7e18eaa4fe71',1,'openvdb::v3_2_0::tools::CheckRange::ElementType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMin.html#af41e18ae17c354f72b3c7e18eaa4fe71',1,'openvdb::v3_2_0::tools::CheckMin::ElementType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMax.html#af41e18ae17c354f72b3c7e18eaa4fe71',1,'openvdb::v3_2_0::tools::CheckMax::ElementType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#a79cf0a3895ebd23ae0d6b97ef4d3d0c2',1,'openvdb::v3_2_0::tools::CheckDivergence::ElementType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocityIntegrator.html#a1c47b7aceaefbb5182580c36adc6e570',1,'openvdb::v3_2_0::tools::VelocityIntegrator::ElementType()']]], + ['empty',['empty',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ae22f66718bb2160cb671c4355ceeb1a2',1,'openvdb::v3_2_0::GridBase::empty()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a3ed485decdbcbd8dcd8a7a376271f91c',1,'openvdb::v3_2_0::Grid::empty()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::io::Queue::empty()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::math::BBox::empty()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::math::pcg::Vector::empty()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::math::CoordBBox::empty()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::tools::ParticleAtlas::empty()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::tools::PointPartitioner::empty()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::empty()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::empty()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::empty()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::empty()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::empty()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::tree::RootNode::empty()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::tree::Tree::empty()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorRange.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::tree::IteratorRange::empty()']]], + ['enable_5ftree_5fvalue_5fdepth_5fbound_5foptimization',['ENABLE_TREE_VALUE_DEPTH_BOUND_OPTIMIZATION',['../TreeIterator_8h.html#ab03113c2f3a9272f75001ed1bf468a91',1,'TreeIterator.h']]], + ['end',['end',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a32b6b5d41be3f26335f34cb61064fdfc',1,'openvdb::v3_2_0::math::Ray::end()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#aaf81d3fdaf258088d7692fa70cece087',1,'openvdb::v3_2_0::tools::BasePointScatter::end()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange.html#a7c19587af55f61dbff765ec7e291e583',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::end()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange.html#a7c19587af55f61dbff765ec7e291e583',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::end()'],['../structopenvdb_1_1v3__2__0_1_1util_1_1NullInterrupter.html#aaf81d3fdaf258088d7692fa70cece087',1,'openvdb::v3_2_0::util::NullInterrupter::end()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#ab45dae688fc5d8983727abffa4389003',1,'openvdb::v3_2_0::util::PagedArray::end()']]], + ['endchildall',['endChildAll',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#afe0695947bdb92a37359fee9efc26f5c',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::endChildAll() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#aa962358d9463d01e2a75d862d47311d9',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::endChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#afe0695947bdb92a37359fee9efc26f5c',1,'openvdb::v3_2_0::tree::LeafNode::endChildAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aa962358d9463d01e2a75d862d47311d9',1,'openvdb::v3_2_0::tree::LeafNode::endChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#afe0695947bdb92a37359fee9efc26f5c',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::endChildAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aa962358d9463d01e2a75d862d47311d9',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::endChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#afe0695947bdb92a37359fee9efc26f5c',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::endChildAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aa962358d9463d01e2a75d862d47311d9',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::endChildAll()']]], + ['endchildoff',['endChildOff',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a04db138e8bd3cf0f89b56b127adb3958',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::endChildOff() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a6eb4aea3f6a155201f0b20e30dedfab7',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::endChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a04db138e8bd3cf0f89b56b127adb3958',1,'openvdb::v3_2_0::tree::LeafNode::endChildOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a6eb4aea3f6a155201f0b20e30dedfab7',1,'openvdb::v3_2_0::tree::LeafNode::endChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a04db138e8bd3cf0f89b56b127adb3958',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::endChildOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a6eb4aea3f6a155201f0b20e30dedfab7',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::endChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a04db138e8bd3cf0f89b56b127adb3958',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::endChildOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a6eb4aea3f6a155201f0b20e30dedfab7',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::endChildOff()']]], + ['endchildon',['endChildOn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a56c625e2c3bdf5779405658db0751f96',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::endChildOn() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a2ad15c329d47a58d6787b4c6a105b162',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::endChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a56c625e2c3bdf5779405658db0751f96',1,'openvdb::v3_2_0::tree::LeafNode::endChildOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a2ad15c329d47a58d6787b4c6a105b162',1,'openvdb::v3_2_0::tree::LeafNode::endChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a56c625e2c3bdf5779405658db0751f96',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::endChildOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a2ad15c329d47a58d6787b4c6a105b162',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::endChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a56c625e2c3bdf5779405658db0751f96',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::endChildOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a2ad15c329d47a58d6787b4c6a105b162',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::endChildOn()']]], + ['enddense',['endDense',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#af47bb96b4b1b0a806d00877487e59420',1,'openvdb::v3_2_0::util::NodeMask::endDense()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#af47bb96b4b1b0a806d00877487e59420',1,'openvdb::v3_2_0::util::NodeMask< 1 >::endDense()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#af47bb96b4b1b0a806d00877487e59420',1,'openvdb::v3_2_0::util::NodeMask< 2 >::endDense()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#af47bb96b4b1b0a806d00877487e59420',1,'openvdb::v3_2_0::util::RootNodeMask::endDense()']]], + ['endinterrupter',['endInterrupter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a6b8be9f908df557dce42701c89ad3cab',1,'openvdb::v3_2_0::tools::LevelSetTracker']]], + ['endmeta',['endMeta',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#ae3d6c7c49617306f867619dea07caa30',1,'openvdb::v3_2_0::MetaMap::endMeta()'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a780386daaa470866f540cdcefbaec1cc',1,'openvdb::v3_2_0::MetaMap::endMeta() const ']]], + ['endname',['endName',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a96f4e5f4e21f551e8c113b037d5baff1',1,'openvdb::v3_2_0::io::File']]], + ['endoff',['endOff',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#af5fda787ac186a825320cc064f448b51',1,'openvdb::v3_2_0::util::NodeMask::endOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#af5fda787ac186a825320cc064f448b51',1,'openvdb::v3_2_0::util::NodeMask< 1 >::endOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#af5fda787ac186a825320cc064f448b51',1,'openvdb::v3_2_0::util::NodeMask< 2 >::endOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#af5fda787ac186a825320cc064f448b51',1,'openvdb::v3_2_0::util::RootNodeMask::endOff()']]], + ['endon',['endOn',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ae61a8687cf2592a9c5874104b24a279a',1,'openvdb::v3_2_0::util::NodeMask::endOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ae61a8687cf2592a9c5874104b24a279a',1,'openvdb::v3_2_0::util::NodeMask< 1 >::endOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ae61a8687cf2592a9c5874104b24a279a',1,'openvdb::v3_2_0::util::NodeMask< 2 >::endOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#ae61a8687cf2592a9c5874104b24a279a',1,'openvdb::v3_2_0::util::RootNodeMask::endOn()']]], + ['endvalueall',['endValueAll',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a8e9185b3bc70bb3eb9c7e38907699dbb',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::endValueAll() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a2af1ad63542cebb51a3365541905d123',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::endValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a8e9185b3bc70bb3eb9c7e38907699dbb',1,'openvdb::v3_2_0::tree::LeafNode::endValueAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a2af1ad63542cebb51a3365541905d123',1,'openvdb::v3_2_0::tree::LeafNode::endValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8e9185b3bc70bb3eb9c7e38907699dbb',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::endValueAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a2af1ad63542cebb51a3365541905d123',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::endValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8e9185b3bc70bb3eb9c7e38907699dbb',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::endValueAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a2af1ad63542cebb51a3365541905d123',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::endValueAll()']]], + ['endvalueoff',['endValueOff',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ac5b7346e76388ecc498fdbfe95b4e3f8',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::endValueOff() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a8c2dd48e4b3c8aeb27a81811e02ddb60',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::endValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ac5b7346e76388ecc498fdbfe95b4e3f8',1,'openvdb::v3_2_0::tree::LeafNode::endValueOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a8c2dd48e4b3c8aeb27a81811e02ddb60',1,'openvdb::v3_2_0::tree::LeafNode::endValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ac5b7346e76388ecc498fdbfe95b4e3f8',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::endValueOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8c2dd48e4b3c8aeb27a81811e02ddb60',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::endValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ac5b7346e76388ecc498fdbfe95b4e3f8',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::endValueOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8c2dd48e4b3c8aeb27a81811e02ddb60',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::endValueOff()']]], + ['endvalueon',['endValueOn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a015add5b971a8bc9a46cd184fc20f4fe',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::endValueOn() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a14d3d427f4528aad1467a6dd77e661c5',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::endValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a015add5b971a8bc9a46cd184fc20f4fe',1,'openvdb::v3_2_0::tree::LeafNode::endValueOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a14d3d427f4528aad1467a6dd77e661c5',1,'openvdb::v3_2_0::tree::LeafNode::endValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a015add5b971a8bc9a46cd184fc20f4fe',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::endValueOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a14d3d427f4528aad1467a6dd77e661c5',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::endValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a015add5b971a8bc9a46cd184fc20f4fe',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::endValueOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a14d3d427f4528aad1467a6dd77e661c5',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::endValueOn()']]], + ['engine',['engine',['../classopenvdb_1_1v3__2__0_1_1math_1_1Rand01.html#a4e6a7a32457faab2ce7f7a2461234383',1,'openvdb::v3_2_0::math::Rand01::engine()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1RandInt.html#a4e6a7a32457faab2ce7f7a2461234383',1,'openvdb::v3_2_0::math::RandInt::engine()']]], + ['enrightfield',['EnrightField',['../classopenvdb_1_1v3__2__0_1_1tools_1_1EnrightField.html',1,'openvdb::v3_2_0::tools']]], + ['enrightfield',['EnrightField',['../classopenvdb_1_1v3__2__0_1_1tools_1_1EnrightField.html#a4f74aaa1a9267fd65e6975c8e75e60e8',1,'openvdb::v3_2_0::tools::EnrightField']]], + ['epsilon',['epsilon',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1Tolerance.html#aae53ee1bd6cd89ff8abd27fb133df661',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::Tolerance']]], + ['eq',['eq',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a06ef477305f34339b699acba76a2a99f',1,'openvdb::v3_2_0::math::pcg::Vector::eq()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#af69c9f272e122409fa286cb8da62db11',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::eq()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#aa5d09d65060266b3cc7111bc2bbdee27',1,'openvdb::v3_2_0::math::Mat3::eq()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a2239aaff81254932a0dcf65333f276dc',1,'openvdb::v3_2_0::math::Mat4::eq()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#aa49dfcc4006604aaea0bf88a9dc32f81',1,'openvdb::v3_2_0::math::Quat::eq()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a29c53c646f977e042428a2c57727b8b3',1,'openvdb::v3_2_0::math::Vec2::eq()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a29c10e93e61a83f01f463c291d9ebfa1',1,'openvdb::v3_2_0::math::Vec3::eq()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#ac6b66c91beca2f305c9a036d5b834e64',1,'openvdb::v3_2_0::math::Vec4::eq()']]], + ['erase',['erase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#aecbac09627cc69c4909a61f25f07a0cb',1,'openvdb::v3_2_0::tree::CacheItem::erase(const NodeType *)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a1587563957975deb774dd994451e69af',1,'openvdb::v3_2_0::tree::CacheItem::erase(const OtherNodeType *node)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a8c5d9e2fba0829352e5655de6cb50762',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::erase()']]], + ['erasebackgroundtiles',['eraseBackgroundTiles',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a48dc4a8d53d718280d347a867cd6704b',1,'openvdb::v3_2_0::tree::RootNode']]], + ['erasenode',['eraseNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a88b7a91dfb1480c194c4f0faac7bb206',1,'openvdb::v3_2_0::tree::ValueAccessor::eraseNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a88b7a91dfb1480c194c4f0faac7bb206',1,'openvdb::v3_2_0::tree::ValueAccessor0::eraseNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a88b7a91dfb1480c194c4f0faac7bb206',1,'openvdb::v3_2_0::tree::ValueAccessor1::eraseNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a88b7a91dfb1480c194c4f0faac7bb206',1,'openvdb::v3_2_0::tree::ValueAccessor2::eraseNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a88b7a91dfb1480c194c4f0faac7bb206',1,'openvdb::v3_2_0::tree::ValueAccessor3::eraseNode()']]], + ['erode',['erode',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a45b809eb78e72aae53bbddcc9c2f308a',1,'openvdb::v3_2_0::tools::LevelSetTracker']]], + ['erode18',['erode18',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1ErodeVoxelsOp.html#a8e4f4360ee14c8b4cfd0c0997d136fab',1,'openvdb::v3_2_0::tools::Morphology::ErodeVoxelsOp']]], + ['erode26',['erode26',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1ErodeVoxelsOp.html#aa8b6350d8ca599f546c4c0e37e28a7d5',1,'openvdb::v3_2_0::tools::Morphology::ErodeVoxelsOp']]], + ['erode6',['erode6',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1ErodeVoxelsOp.html#a8a8de73f8a42c73ca4aa45edf46ace5f',1,'openvdb::v3_2_0::tools::Morphology::ErodeVoxelsOp']]], + ['erodevoxels',['erodeVoxels',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#ac614a677edff3c452da662ee4700f8cd',1,'openvdb::v3_2_0::tools::Morphology::erodeVoxels()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a5e57b81f188307ce46a58464847d65bc',1,'openvdb::v3_2_0::tools::erodeVoxels(TreeType &tree, int iterations=1, NearestNeighbors nn=NN_FACE)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a1eae709a0d7b1e1de493e7b0170b556f',1,'openvdb::v3_2_0::tools::erodeVoxels(tree::LeafManager< TreeType > &manager, int iterations=1, NearestNeighbors nn=NN_FACE)']]], + ['erodevoxels18',['erodeVoxels18',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a7ba8531a1e0e718e974eab0c6ba250c1',1,'openvdb::v3_2_0::tools::Morphology']]], + ['erodevoxels26',['erodeVoxels26',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a478bfa6de5a8329dc2be8be25cf86256',1,'openvdb::v3_2_0::tools::Morphology']]], + ['erodevoxels6',['erodeVoxels6',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a06a5d986ff34d25ee656064632ba49bd',1,'openvdb::v3_2_0::tools::Morphology']]], + ['erodevoxelsop',['ErodeVoxelsOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1ErodeVoxelsOp.html#a27657c16e331d61b09486b003e163a06',1,'openvdb::v3_2_0::tools::Morphology::ErodeVoxelsOp']]], + ['erodevoxelsop',['ErodeVoxelsOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1ErodeVoxelsOp.html',1,'openvdb::v3_2_0::tools::Morphology']]], + ['euclideanremainder',['EuclideanRemainder',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a523e03511d299e898fe7f7e4b622a04a',1,'openvdb::v3_2_0::math']]], + ['eulerangles',['eulerAngles',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a5afcc099d79260c4b9a44ddd48d08941',1,'openvdb::v3_2_0::math::Quat::eulerAngles()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9f8604eb8d866caadde188df2fc1bcbe',1,'openvdb::v3_2_0::math::eulerAngles()']]], + ['evalactiveboundingbox',['evalActiveBoundingBox',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aa4f72230ae8ade2c0a5e712708c36fa6',1,'openvdb::v3_2_0::tree::InternalNode::evalActiveBoundingBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aa4f72230ae8ade2c0a5e712708c36fa6',1,'openvdb::v3_2_0::tree::LeafNode::evalActiveBoundingBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aa4f72230ae8ade2c0a5e712708c36fa6',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::evalActiveBoundingBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aa4f72230ae8ade2c0a5e712708c36fa6',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::evalActiveBoundingBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#aa4f72230ae8ade2c0a5e712708c36fa6',1,'openvdb::v3_2_0::tree::RootNode::evalActiveBoundingBox()']]], + ['evalactivevoxelboundingbox',['evalActiveVoxelBoundingBox',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a7ff87805302028f4c261b8ec857aacc7',1,'openvdb::v3_2_0::GridBase::evalActiveVoxelBoundingBox()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#ad7d68edffb50eaaa5075ee7c20934d3f',1,'openvdb::v3_2_0::Grid::evalActiveVoxelBoundingBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#acc26c182dde6fc1b8e931b657ce70db4',1,'openvdb::v3_2_0::tree::TreeBase::evalActiveVoxelBoundingBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a957fe86bcd8fb552764ce293ef416d44',1,'openvdb::v3_2_0::tree::Tree::evalActiveVoxelBoundingBox()']]], + ['evalactivevoxeldim',['evalActiveVoxelDim',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ab8b61fdd6e0bb2ef29745f12b4b743f6',1,'openvdb::v3_2_0::GridBase::evalActiveVoxelDim()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#af366fcd05c16078e107a3ffe57f78ac6',1,'openvdb::v3_2_0::Grid::evalActiveVoxelDim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#adcaf5e4a78bf63f11f82ac9eeed7e9c3',1,'openvdb::v3_2_0::tree::TreeBase::evalActiveVoxelDim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a82230f6fee251718c085e8068f8a05d5',1,'openvdb::v3_2_0::tree::Tree::evalActiveVoxelDim()']]], + ['evalcellsigns',['evalCellSigns',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#ae9af9076f9b27537fb4136c04067d201',1,'openvdb::v3_2_0::tools::internal::evalCellSigns(const AccessorT &accessor, const Coord &ijk, typename AccessorT::ValueType iso)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#acd15010f9aad3baec83273e6ce50124b',1,'openvdb::v3_2_0::tools::internal::evalCellSigns(const LeafT &leaf, const Index offset, typename LeafT::ValueType iso)']]], + ['evalleafboundingbox',['evalLeafBoundingBox',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#adfe9509e850ee9d79c14e87fe15b0914',1,'openvdb::v3_2_0::tree::TreeBase::evalLeafBoundingBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a894624c52ca504479fdc5164cb52083a',1,'openvdb::v3_2_0::tree::Tree::evalLeafBoundingBox()']]], + ['evalleafdim',['evalLeafDim',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#ab5ed0caf71396fe4bb3d910370e80243',1,'openvdb::v3_2_0::tree::TreeBase::evalLeafDim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a2de2a3cd7daea49a1462c2305eee2bea',1,'openvdb::v3_2_0::tree::Tree::evalLeafDim()']]], + ['evalminmax',['evalMinMax',['../classopenvdb_1_1v3__2__0_1_1Grid.html#afc695470860292d705a4c5a9610d69f6',1,'openvdb::v3_2_0::Grid::evalMinMax()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a480c0106e4e8d28ad9018dbe3a08c15f',1,'openvdb::v3_2_0::tree::Tree::evalMinMax()']]], + ['evalnodeorigin',['evalNodeOrigin',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a50156eb366d109c0f64662639201d8c6',1,'openvdb::v3_2_0::tree::LeafNode::evalNodeOrigin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a50156eb366d109c0f64662639201d8c6',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::evalNodeOrigin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a50156eb366d109c0f64662639201d8c6',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::evalNodeOrigin()']]], + ['evalroot',['evalRoot',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a2b81e970786199e6b853cd5c89505d4f',1,'openvdb::v3_2_0::tools::internal']]], + ['examplecode_2etxt',['examplecode.txt',['../examplecode_8txt.html',1,'']]], + ['exception',['Exception',['../classopenvdb_1_1v3__2__0_1_1Exception.html',1,'openvdb::v3_2_0']]], + ['exception',['Exception',['../classopenvdb_1_1v3__2__0_1_1Exception.html#abfbc23b99b2e78b609d50ac688611236',1,'openvdb::v3_2_0::Exception::Exception()'],['../classopenvdb_1_1v3__2__0_1_1Exception.html#a45da648610d845af1b517b0b58e7a298',1,'openvdb::v3_2_0::Exception::Exception(const char *eType, const std::string *const msg=NULL)']]], + ['exceptions_2eh',['Exceptions.h',['../Exceptions_8h.html',1,'']]], + ['exp',['exp',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a1430507e92a8e79f01ebdbd635331a4f',1,'openvdb::v3_2_0::math::Vec2::exp()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ae28cd3d83a911b1fe1d6a57cdd3c70a4',1,'openvdb::v3_2_0::math::Vec3::exp()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#adcb3bff41f819a3ceba2c0f80cbb937b',1,'openvdb::v3_2_0::math::Vec4::exp()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1c9bcf4f700b6c0d35e9348110b64715',1,'openvdb::v3_2_0::math::Exp(const Type &x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae35329af179f1deb918b821366ac0a20',1,'openvdb::v3_2_0::math::Exp(Vec2< T > v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#afaab25346eb2e5134396d814ed98166a',1,'openvdb::v3_2_0::math::Exp(Vec3< T > v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1b31c275a782ab3e72fc364603cd6647',1,'openvdb::v3_2_0::math::Exp(Vec4< T > v)']]], + ['expand',['expand',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a64b18b8b20fa3fc2b3e2e3169c54eb41',1,'openvdb::v3_2_0::math::BBox::expand(ElementType padding)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a404c4458b1a62723ca8d8b529aae5283',1,'openvdb::v3_2_0::math::BBox::expand(const Vec3T &xyz)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a7bbe0f9690633a24904158e34d751145',1,'openvdb::v3_2_0::math::BBox::expand(const BBox &)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a40e27f0d46676f37b4d42288ae6bbc91',1,'openvdb::v3_2_0::math::BBox::expand(const Vec3T &xyzMin, const ElementType &length)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a55ddc8fd46ab4b866a7ef6341680a205',1,'openvdb::v3_2_0::math::CoordBBox::expand(ValueType padding)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a5d74d64a29bb5d4e38a56cec17289c32',1,'openvdb::v3_2_0::math::CoordBBox::expand(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#aa38276f9d5beeeda075f73f84ca51d8d',1,'openvdb::v3_2_0::math::CoordBBox::expand(const CoordBBox &bbox)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a8f6b044370320b0480b8488ba56a8b5f',1,'openvdb::v3_2_0::math::CoordBBox::expand(const Coord &min, Coord::ValueType dim)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#aed5bfeb2da24cc37e6561b3cd0f5f1f3',1,'openvdb::v3_2_0::tree::RootNode::expand()']]], + ['expand_5ftiles',['EXPAND_TILES',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac7a17ca003c7f18f411cab4e8b4f6e74ab3c4d64060dcfe7f0949fb11f8ad789c',1,'openvdb::v3_2_0::tools']]], + ['expandby',['expandBy',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a0cd4f175cd000a48843a1448d297ad41',1,'openvdb::v3_2_0::math::CoordBBox']]], + ['expandleafnoderegion',['ExpandLeafNodeRegion',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandLeafNodeRegion.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['expandleafnoderegion',['ExpandLeafNodeRegion',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandLeafNodeRegion.html#ac9e842645a7f2c67ed5f6761fb81062e',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandLeafNodeRegion::ExpandLeafNodeRegion(const TreeType &distTree, BoolTreeType &maskTree, std::vector< BoolLeafNodeType * > &maskNodes)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandLeafNodeRegion.html#a01dafe1173bb2378f950ddd2e2bdf424',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandLeafNodeRegion::ExpandLeafNodeRegion(const ExpandLeafNodeRegion &rhs, tbb::split)']]], + ['expandnarrowband',['ExpandNarrowband',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#a9dc39d9fbeca16f8b3a304deec1c0d5d',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::ExpandNarrowband(std::vector< BoolLeafNodeType * > &maskNodes, BoolTreeType &maskTree, TreeType &distTree, Int32TreeType &indexTree, const MeshDataAdapter &mesh, ValueType exteriorBandWidth, ValueType interiorBandWidth, ValueType voxelSize)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#ac55ea8dd5e50f247c084f5b9256e341a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::ExpandNarrowband(const ExpandNarrowband &rhs, tbb::split)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal.html#a252732ad4e20ebc6e1b218668a4faa25',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::expandNarrowband()']]], + ['expandnarrowband',['ExpandNarrowband',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['expandnarrowbandmask',['ExpandNarrowbandMask',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandNarrowbandMask.html#a2a315aeea017dd7f3b2b847ad1be09ec',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandNarrowbandMask']]], + ['expandnarrowbandmask',['ExpandNarrowbandMask',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandNarrowbandMask.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['extents',['extents',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#afca1c6ab05a8efec8a645749e3ef2c70',1,'openvdb::v3_2_0::math::BBox::extents()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a2fcea404c1e696576733334957108ea9',1,'openvdb::v3_2_0::math::CoordBBox::extents()']]], + ['extract',['extract',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#a2269fa210733ac185f4809b62d00312b',1,'openvdb::v3_2_0::tools::SparseExtractor::extract()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#a2269fa210733ac185f4809b62d00312b',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor::extract()']]], + ['extractactivevoxelsegmentmasks',['extractActiveVoxelSegmentMasks',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a3b522dd56a467487d4b16d0f1d16c0d6',1,'openvdb::v3_2_0::tools']]], + ['extractall',['ExtractAll',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ExtractAll.html',1,'openvdb::v3_2_0::tools']]], + ['extractenclosedregion',['extractEnclosedRegion',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#addb45844a3518d417b3c5eac873337ad',1,'openvdb::v3_2_0::tools']]], + ['extractisosurfacemask',['extractIsosurfaceMask',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a39bfe53eeb50b4ffdc96c90af7e1de1b',1,'openvdb::v3_2_0::tools']]], + ['extractsparsetree',['extractSparseTree',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a586a786ed67c81b31e7bcc11c70df047',1,'openvdb::v3_2_0::tools']]], + ['extractsparsetreewithmask',['extractSparseTreeWithMask',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ae1e62f3b18a1d40b3195c83b4d76c1e5',1,'openvdb::v3_2_0::tools']]], + ['extrema',['extrema',['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html#ac0de9215eb4e792f1cc2a1e3d9d5569a',1,'openvdb::v3_2_0::tools::BoxSampler::extrema()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#a2c9caedfb7763da7eb9fef9f852d92de',1,'openvdb::v3_2_0::math::Extrema::Extrema()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac6aea86a2df380225a3b3c8553efe4e3',1,'openvdb::v3_2_0::tools::extrema(const IterT &iter, bool threaded=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aafcd95f6d9da81e339aab75465ee4e22',1,'openvdb::v3_2_0::tools::extrema(const IterT &iter, const ValueOp &op, bool threaded)']]], + ['extrema',['Extrema',['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html',1,'openvdb::v3_2_0::math']]], + ['eye',['eye',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a10a56a4622dd64aa9039698bc9c09303',1,'openvdb::v3_2_0::math::Ray']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_7.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_7.html new file mode 100644 index 00000000..ef202229 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_7.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_7.js new file mode 100644 index 00000000..65affa22 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_7.js @@ -0,0 +1,111 @@ +var searchData= +[ + ['failed',['FAILED',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a67a0db04d321a74b7e7fcfd3f1a3f70baecedb56d1405a60c6069f4a0139bdec5',1,'openvdb::v3_2_0::io::Queue']]], + ['failurecount',['failureCount',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Diagnose.html#a702f19d18c5b5dfcda5cf18ef32e4b7b',1,'openvdb::v3_2_0::tools::Diagnose::failureCount()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#a702f19d18c5b5dfcda5cf18ef32e4b7b',1,'openvdb::v3_2_0::tools::CheckLevelSet::failureCount()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#a702f19d18c5b5dfcda5cf18ef32e4b7b',1,'openvdb::v3_2_0::tools::CheckFogVolume::failureCount()']]], + ['frequently_20asked_20questions',['Frequently Asked Questions',['../faq.html',1,'index']]], + ['faq_2etxt',['faq.txt',['../faq_8txt.html',1,'']]], + ['fd',['FD',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME.html#a77eb9d5341b3d8fc4e23bf0b5947c0a7',1,'openvdb::v3_2_0::math::BIAS_SCHEME::FD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01FIRST__BIAS_01_4.html#a77eb9d5341b3d8fc4e23bf0b5947c0a7',1,'openvdb::v3_2_0::math::BIAS_SCHEME< FIRST_BIAS >::FD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01SECOND__BIAS_01_4.html#a77eb9d5341b3d8fc4e23bf0b5947c0a7',1,'openvdb::v3_2_0::math::BIAS_SCHEME< SECOND_BIAS >::FD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01THIRD__BIAS_01_4.html#a77eb9d5341b3d8fc4e23bf0b5947c0a7',1,'openvdb::v3_2_0::math::BIAS_SCHEME< THIRD_BIAS >::FD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01WENO5__BIAS_01_4.html#a77eb9d5341b3d8fc4e23bf0b5947c0a7',1,'openvdb::v3_2_0::math::BIAS_SCHEME< WENO5_BIAS >::FD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01HJWENO5__BIAS_01_4.html#a77eb9d5341b3d8fc4e23bf0b5947c0a7',1,'openvdb::v3_2_0::math::BIAS_SCHEME< HJWENO5_BIAS >::FD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradientBiased.html#a77eb9d5341b3d8fc4e23bf0b5947c0a7',1,'openvdb::v3_2_0::math::ISGradientBiased::FD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradientNormSqrd.html#a77eb9d5341b3d8fc4e23bf0b5947c0a7',1,'openvdb::v3_2_0::math::ISGradientNormSqrd::FD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientNormSqrd.html#a77eb9d5341b3d8fc4e23bf0b5947c0a7',1,'openvdb::v3_2_0::math::GradientNormSqrd::FD()']]], + ['fd_5f1st',['FD_1ST',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57acbb366788720ff17e1636a2e8ee73fb2',1,'openvdb::v3_2_0::math']]], + ['fd_5f2nd',['FD_2ND',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57a00769d7d3a56c3db32cb62490117e66d',1,'openvdb::v3_2_0::math']]], + ['fd_5f3rd',['FD_3RD',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57af91012525fafb5c2e460546b9869f1c4',1,'openvdb::v3_2_0::math']]], + ['fd_5fhjweno5',['FD_HJWENO5',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57a95e069bc8516e0e3d188953be9db93d8',1,'openvdb::v3_2_0::math']]], + ['fd_5fweno5',['FD_WENO5',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57a9f97f2b52742babe0b584f3afcc1d24d',1,'openvdb::v3_2_0::math']]], + ['fieldofviewtofocallength',['fieldOfViewToFocalLength',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PerspectiveCamera.html#a5ebf01d1dfaa1f7269a7a76e93eec3f8',1,'openvdb::v3_2_0::tools::PerspectiveCamera']]], + ['file',['File',['../classopenvdb_1_1v3__2__0_1_1io_1_1MappedFile.html#a68d15876ad188b7628261b12d0eac8aa',1,'openvdb::v3_2_0::io::MappedFile::File()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a439334f7c5135d5ee0f79718a189a4a1',1,'openvdb::v3_2_0::io::File::File(const std::string &filename)'],['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a9978a09b3f30f3a537441fde8dd4f9ca',1,'openvdb::v3_2_0::io::File::File(const File &other)']]], + ['file',['File',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html',1,'openvdb::v3_2_0::io']]], + ['file_2eh',['File.h',['../File_8h.html',1,'']]], + ['fileinfo',['FileInfo',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1FileInfo.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['fileinfo',['FileInfo',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1FileInfo.html#a1e80537eb9098ba9b28bc67f72f7f7f8',1,'openvdb::v3_2_0::tree::LeafNode::FileInfo']]], + ['filename',['filename',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#af89fbda9897f8c41faf1862e1790e3f2',1,'openvdb::v3_2_0::io::File::filename()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1MappedFile.html#a16182afd0af6163476284de586c66c9d',1,'openvdb::v3_2_0::io::MappedFile::filename()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1TempFile.html#af89fbda9897f8c41faf1862e1790e3f2',1,'openvdb::v3_2_0::io::TempFile::filename()']]], + ['fileversion',['fileVersion',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#ad7a5a9b05e297de71bfc2c92065e18c2',1,'openvdb::v3_2_0::io::Archive::fileVersion()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#ad7a5a9b05e297de71bfc2c92065e18c2',1,'openvdb::v3_2_0::io::StreamMetadata::fileVersion()']]], + ['fill',['Fill',['../structopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Fill.html#a836517b4faf0dd7a0d1f9dd0fb89d0b4',1,'openvdb::v3_2_0::util::PagedArray::Fill::Fill()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#aef116f8d74023c63e1a9fc30d851793e',1,'openvdb::v3_2_0::Grid::fill()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#ac8f8ff1a5d0997596cbedbc2162e4649',1,'openvdb::v3_2_0::math::pcg::Vector::fill()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a8f689e29e45daf72f02f10b6617434e4',1,'openvdb::v3_2_0::tools::Dense::fill()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ae899038a75c8576d0f152bbc4a9b633d',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::fill(const CoordBBox &, const ValueType &, bool)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a185d719e835da04438c6102b01915e4b',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::fill(const ValueType &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a9cacd9e1ddf41f4f09cb3bab4ef2c89d',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::fill(const ValueType &, bool)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Film.html#adabd26502d4930dbc9e2d53b0e64d246',1,'openvdb::v3_2_0::tools::Film::fill()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aa5d88c3fde0d2d51d27cf6c5e995682e',1,'openvdb::v3_2_0::tree::InternalNode::fill()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#acf0070cc1ece3ed20e845a96046d5dd2',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::fill()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aa5d88c3fde0d2d51d27cf6c5e995682e',1,'openvdb::v3_2_0::tree::LeafNode::fill(const CoordBBox &bbox, const ValueType &, bool active=true)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ac8f8ff1a5d0997596cbedbc2162e4649',1,'openvdb::v3_2_0::tree::LeafNode::fill(const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aa49df9f9766bc84234bf4fb9cb1134e9',1,'openvdb::v3_2_0::tree::LeafNode::fill(const ValueType &value, bool active)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#a9f4517b221c5b82c8e1d940ada80ce81',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::fill()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#af554087e5184199abf728f69943f6074',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::fill(const CoordBBox &bbox, bool value, bool active=true)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a3ef9dc80342b4c0bf14db2c07e62a911',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::fill(const bool &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a1ac758cffddccaa76cdde6bb8e5cdda8',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::fill(const bool &value, bool active)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#a9f4517b221c5b82c8e1d940ada80ce81',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::fill()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ab461d1f3b14897915728fcca1e6a50be',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::fill(const CoordBBox &bbox, bool value, bool dummy=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a1f061adb04fa6636e85b472a9dc8baf0',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::fill(const bool &value, bool dummy=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#aef116f8d74023c63e1a9fc30d851793e',1,'openvdb::v3_2_0::tree::RootNode::fill()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#aef116f8d74023c63e1a9fc30d851793e',1,'openvdb::v3_2_0::tree::Tree::fill()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a6adf5091670b306e0669292ecfece5b8',1,'openvdb::v3_2_0::util::PagedArray::fill()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html#ae214529e264a05536f2c7355c36024ca',1,'openvdb::v3_2_0::util::PagedArray::Page::fill()']]], + ['fill',['Fill',['../structopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Fill.html',1,'openvdb::v3_2_0::util::PagedArray']]], + ['fillarray',['FillArray',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1FillArray.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['fillarray',['FillArray',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1FillArray.html#a1b44917ddd5637d4af2167e2e7f5efa5',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::FillArray::FillArray()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal.html#ade6172a4b789e2f44ce9978f0428c9f1',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::fillArray()']]], + ['fillleafnodevoxels',['FillLeafNodeVoxels',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillLeafNodeVoxels.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['fillleafnodevoxels',['FillLeafNodeVoxels',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillLeafNodeVoxels.html#aef070c029f9b1a320f48e0ebf6161336',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillLeafNodeVoxels']]], + ['fillmaskboundary',['FillMaskBoundary',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillMaskBoundary.html#afa6900802e80ce48796b238b37d06ed6',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillMaskBoundary']]], + ['fillmaskboundary',['FillMaskBoundary',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillMaskBoundary.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['fillop',['FillOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1FillOp.html#abd862b7ef7adb847d5d8dd5f0d84fc19',1,'openvdb::v3_2_0::math::pcg::internal::FillOp']]], + ['fillop',['FillOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1FillOp.html',1,'openvdb::v3_2_0::math::pcg::internal']]], + ['fillwithspheres',['fillWithSpheres',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a4e1e540220cddd54f82776eb1c76552d',1,'openvdb::v3_2_0::tools::fillWithSpheres(const GridT &grid, std::vector< openvdb::Vec4s > &spheres, int maxSphereCount, bool overlapping=false, float minRadius=1.0, float maxRadius=std::numeric_limits< float >::max(), float isovalue=0.0, int instanceCount=10000, InterrupterT *interrupter=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a71062173b8f2ecdefb4a5ea6f1c75c8c',1,'openvdb::v3_2_0::tools::fillWithSpheres(const GridT &grid, std::vector< openvdb::Vec4s > &spheres, int maxSphereCount, bool overlapping=false, float minRadius=1.0, float maxRadius=std::numeric_limits< float >::max(), float isovalue=0.0, int instanceCount=10000)']]], + ['film',['Film',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Film.html',1,'openvdb::v3_2_0::tools']]], + ['film',['Film',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Film.html#af247a0c2d094058ea57b3aa8bba0bfac',1,'openvdb::v3_2_0::tools::Film::Film(size_t width, size_t height)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Film.html#a5c89e96ed6805d471b605d26de3d1899',1,'openvdb::v3_2_0::tools::Film::Film(size_t width, size_t height, const RGBA &bg)']]], + ['filter',['Filter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html',1,'openvdb::v3_2_0::tools']]], + ['filter',['Filter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a946bbf57bff2c4acf2b0babefdbab212',1,'openvdb::v3_2_0::tools::Filter::Filter(GridT &grid, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#aa9921d84ccf386e89a85c62cc70758d9',1,'openvdb::v3_2_0::tools::Filter::Filter(const Filter &other)']]], + ['filter_2eh',['Filter.h',['../Filter_8h.html',1,'']]], + ['filteredpointindexsearch',['filteredPointIndexSearch',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal.html#a7ec1b1444cbe653b874b1b3da1d0d6a4',1,'openvdb::v3_2_0::tools::point_index_grid_internal']]], + ['filteredpointindexsearchvoxels',['filteredPointIndexSearchVoxels',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal.html#a170b7323918d4f9355b56d63d72d3492',1,'openvdb::v3_2_0::tools::point_index_grid_internal']]], + ['filterleafnode',['filterLeafNode',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RadialRangeFilter.html#a0c1f2b3723223753ec4448b50ecd1348',1,'openvdb::v3_2_0::tools::particle_atlas_internal::RadialRangeFilter::filterLeafNode()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1BBoxFilter.html#a0c1f2b3723223753ec4448b50ecd1348',1,'openvdb::v3_2_0::tools::particle_atlas_internal::BBoxFilter::filterLeafNode()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1BBoxFilter.html#a0c1f2b3723223753ec4448b50ecd1348',1,'openvdb::v3_2_0::tools::point_index_grid_internal::BBoxFilter::filterLeafNode()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1RadialRangeFilter.html#a0c1f2b3723223753ec4448b50ecd1348',1,'openvdb::v3_2_0::tools::point_index_grid_internal::RadialRangeFilter::filterLeafNode()']]], + ['filtertype',['FilterType',['../interfaceFilterType.html',1,'']]], + ['filtervoxel',['filterVoxel',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RadialRangeFilter.html#abcbf638398abca60a83d1bb267b462da',1,'openvdb::v3_2_0::tools::particle_atlas_internal::RadialRangeFilter::filterVoxel()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1BBoxFilter.html#abcbf638398abca60a83d1bb267b462da',1,'openvdb::v3_2_0::tools::particle_atlas_internal::BBoxFilter::filterVoxel()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1BBoxFilter.html#abcbf638398abca60a83d1bb267b462da',1,'openvdb::v3_2_0::tools::point_index_grid_internal::BBoxFilter::filterVoxel()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1RadialRangeFilter.html#a287732fa15a0c881da4d82aa8c4c5a3d',1,'openvdb::v3_2_0::tools::point_index_grid_internal::RadialRangeFilter::filterVoxel()']]], + ['finalize',['finalize',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a21f88b8de20397fe505621d5f4545643',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['findfeaturepoint',['findFeaturePoint',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a9032a9804d04086b785739915957bb33',1,'openvdb::v3_2_0::tools']]], + ['findfirstoff',['findFirstOff',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a065b9f38d5bc5a7d697adb5636031ee9',1,'openvdb::v3_2_0::util::NodeMask::findFirstOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a065b9f38d5bc5a7d697adb5636031ee9',1,'openvdb::v3_2_0::util::NodeMask< 1 >::findFirstOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a065b9f38d5bc5a7d697adb5636031ee9',1,'openvdb::v3_2_0::util::NodeMask< 2 >::findFirstOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a065b9f38d5bc5a7d697adb5636031ee9',1,'openvdb::v3_2_0::util::RootNodeMask::findFirstOff()']]], + ['findfirston',['findFirstOn',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#aa6c363f9bedf6cc3b23b2e4e090e86f1',1,'openvdb::v3_2_0::util::NodeMask::findFirstOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#aa6c363f9bedf6cc3b23b2e4e090e86f1',1,'openvdb::v3_2_0::util::NodeMask< 1 >::findFirstOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#aa6c363f9bedf6cc3b23b2e4e090e86f1',1,'openvdb::v3_2_0::util::NodeMask< 2 >::findFirstOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#aa6c363f9bedf6cc3b23b2e4e090e86f1',1,'openvdb::v3_2_0::util::RootNodeMask::findFirstOn()']]], + ['findgridbyname',['findGridByName',['../namespaceopenvdb_1_1v3__2__0.html#aabfb2fb5a30c31cfaed152a041dcb894',1,'openvdb::v3_2_0::findGridByName(const GridPtrContainerT &container, const Name &name)'],['../namespaceopenvdb_1_1v3__2__0.html#ae30adf1adb62f767f0f4b33d1cfbee91',1,'openvdb::v3_2_0::findGridByName(const std::map< KeyT, GridPtrT > &container, const Name &name)']]], + ['findhigheston',['FindHighestOn',['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a8583dcbb25ac110e6569a151871008b2',1,'openvdb::v3_2_0::util']]], + ['findloweston',['FindLowestOn',['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a2638b90715584ced8cd061023c30ab8c',1,'openvdb::v3_2_0::util::FindLowestOn(Byte v)'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#ad325c9491363579f32d54567407f01f0',1,'openvdb::v3_2_0::util::FindLowestOn(Index32 v)'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a5fe6d292d29fe78cc723be36bb8dab80',1,'openvdb::v3_2_0::util::FindLowestOn(Index64 v)']]], + ['findminmaxvoxelvalue',['FindMinMaxVoxelValue',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__fracture__internal_1_1FindMinMaxVoxelValue.html',1,'openvdb::v3_2_0::tools::level_set_fracture_internal']]], + ['findminmaxvoxelvalue',['FindMinMaxVoxelValue',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__fracture__internal_1_1FindMinMaxVoxelValue.html#a534938222ec2845c8613c68c56d08734',1,'openvdb::v3_2_0::tools::level_set_fracture_internal::FindMinMaxVoxelValue::FindMinMaxVoxelValue(const std::vector< const LeafNodeType * > &nodes)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__fracture__internal_1_1FindMinMaxVoxelValue.html#a0360a1a7f46803c7695564cd985bb6b4',1,'openvdb::v3_2_0::tools::level_set_fracture_internal::FindMinMaxVoxelValue::FindMinMaxVoxelValue(FindMinMaxVoxelValue &rhs, tbb::split)']]], + ['findmintilevalue',['FindMinTileValue',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinTileValue.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['findmintilevalue',['FindMinTileValue',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinTileValue.html#ab85ca96f34b413284e465abf3ab1c640',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinTileValue::FindMinTileValue(InternalNodeType const *const *const nodes)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinTileValue.html#a30bea1df138b704ccdb7299187f76df4',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinTileValue::FindMinTileValue(FindMinTileValue &rhs, tbb::split)']]], + ['findminvoxelvalue',['FindMinVoxelValue',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinVoxelValue.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['findminvoxelvalue',['FindMinVoxelValue',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinVoxelValue.html#a817b0babed3a60c386b4f6c21db3b38b',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinVoxelValue::FindMinVoxelValue(LeafNodeType const *const *const leafnodes)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinVoxelValue.html#aaae4c36dddb267e959c8d3f03729ae54',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinVoxelValue::FindMinVoxelValue(FindMinVoxelValue &rhs, tbb::split)']]], + ['findneighbournode',['findNeighbourNode',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeNodeConnectivity.html#a8ab094cba0d5e9cf1a447f74955d2471',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ComputeNodeConnectivity']]], + ['findnextoff',['findNextOff',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a1940981839b267a82254d7c81d689c54',1,'openvdb::v3_2_0::util::NodeMask::findNextOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a1940981839b267a82254d7c81d689c54',1,'openvdb::v3_2_0::util::NodeMask< 1 >::findNextOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a1940981839b267a82254d7c81d689c54',1,'openvdb::v3_2_0::util::NodeMask< 2 >::findNextOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a1940981839b267a82254d7c81d689c54',1,'openvdb::v3_2_0::util::RootNodeMask::findNextOff()']]], + ['findnexton',['findNextOn',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#aedcd10e77e3e08d431154da15701e14a',1,'openvdb::v3_2_0::util::NodeMask::findNextOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#aedcd10e77e3e08d431154da15701e14a',1,'openvdb::v3_2_0::util::NodeMask< 1 >::findNextOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#aedcd10e77e3e08d431154da15701e14a',1,'openvdb::v3_2_0::util::NodeMask< 2 >::findNextOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#aedcd10e77e3e08d431154da15701e14a',1,'openvdb::v3_2_0::util::RootNodeMask::findNextOn()']]], + ['finestconsttree',['finestConstTree',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#aca21696a11a7b992a89c964348137683',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['finestconsttreeptr',['finestConstTreePtr',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#aafdbf6190437b1b5b271ee7779c0154f',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['finestlevel',['finestLevel',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a5d8d2a3c8ee0297b15ee2c8761ed757d',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['finesttree',['finestTree',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a34fdc85915e0f83a633516461f933890',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['finesttreeptr',['finestTreePtr',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#ac4c4a2a68bfb071a212fa5914021ca98',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['finitedifference_2eh',['FiniteDifference.h',['../FiniteDifference_8h.html',1,'']]], + ['first',['first',['../structopenvdb_1_1v3__2__0_1_1VersionId.html#a278eb73b0cdb4b6029426dbd091b643f',1,'openvdb::v3_2_0::VersionId']]], + ['first_5fbias',['FIRST_BIAS',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9b59f0a0c54e6e3759f1418d40585656a1b5937419fb463bcee3775244e294d1a',1,'openvdb::v3_2_0::math']]], + ['firstmap',['firstMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#a343cd85e6a3ec3a1cbf10b8329571f2f',1,'openvdb::v3_2_0::math::CompoundMap']]], + ['flagusedpoints',['FlagUsedPoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1FlagUsedPoints.html#a7beeb7e4e25d4014eb5c43079688d501',1,'openvdb::v3_2_0::tools::internal::FlagUsedPoints']]], + ['flagusedpoints',['FlagUsedPoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1FlagUsedPoints.html',1,'openvdb::v3_2_0::tools::internal']]], + ['flipregionsign',['FlipRegionSign',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FlipRegionSign.html#a3bd6ff4c60292afaedbd4a0add68d006',1,'openvdb::v3_2_0::tools::level_set_util_internal::FlipRegionSign']]], + ['flipregionsign',['FlipRegionSign',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FlipRegionSign.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['flipsignbits',['flipSignBits',['../classopenvdb_1_1v3__2__0_1_1math_1_1QuantizedUnitVec.html#a3e937c6d40286b0fdeed1af9808414e2',1,'openvdb::v3_2_0::math::QuantizedUnitVec']]], + ['floatgrid',['FloatGrid',['../namespaceopenvdb_1_1v3__2__0.html#a4619b58336d0a1196e19b00edd6113bc',1,'openvdb::v3_2_0']]], + ['floatgridt',['FloatGridT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#a4d639424d93026521c99853652d6374f',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions']]], + ['floatmetadata',['FloatMetadata',['../namespaceopenvdb_1_1v3__2__0.html#a8e805e484bc0873814bfa2d230149565',1,'openvdb::v3_2_0']]], + ['floattoint32',['floatToInt32',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1b33135ac7b0fc2213e89f220b1d121e',1,'openvdb::v3_2_0::math']]], + ['floattree',['FloatTree',['../namespaceopenvdb_1_1v3__2__0.html#a6b41620b1f0b01f83684d2e024728562',1,'openvdb::v3_2_0']]], + ['floattreeacc',['FloatTreeAcc',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#a47a04d9309f2d9dc0da3241dc13ea52b',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData']]], + ['floattreet',['FloatTreeT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#a5fe2e14d891e544814a35e6574cc7ef7',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions']]], + ['floattype',['FloatType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#ad440d7719441093d79f59336a2ecaf51',1,'openvdb::v3_2_0::tools::AlphaMask']]], + ['floodfillsign',['FloodFillSign',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FloodFillSign.html#a5491e8a3028fd233c89bf611841b5cfd',1,'openvdb::v3_2_0::tools::level_set_util_internal::FloodFillSign']]], + ['floodfillsign',['FloodFillSign',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FloodFillSign.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['floor',['floor',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#acea3555f9f5a2a225ed9fd9d83d60244',1,'openvdb::v3_2_0::math::Coord::floor()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7c23e48b49f39e1aa800e0e82e411fda',1,'openvdb::v3_2_0::math::Floor(float x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4c8fbcdc994b5eaf915a703dffd99264',1,'openvdb::v3_2_0::math::Floor(double x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a89b2dad28b247710e2ac3f3c07bfb024',1,'openvdb::v3_2_0::math::Floor(long double x)']]], + ['floorvec3',['floorVec3',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1local__util.html#a5edc55d91b1ca6368023d94550465044',1,'openvdb::v3_2_0::tools::local_util']]], + ['flush',['flush',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ValueBuffer.html#adac116554b543b7c4228c018a85882f5',1,'openvdb::v3_2_0::util::PagedArray::ValueBuffer']]], + ['focallengthtofieldofview',['focalLengthToFieldOfView',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PerspectiveCamera.html#a21859e94e5190e3aabc0e81c012ea0cf',1,'openvdb::v3_2_0::tools::PerspectiveCamera']]], + ['foreach',['foreach',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a449355fc31ee41387283def6d663f807',1,'openvdb::v3_2_0::tree::LeafManager::foreach()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#a04fbba495fcea53e22a1d9f4c0ad6608',1,'openvdb::v3_2_0::tree::NodeList::foreach()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#acb08bd8aa449398a7172efcd98e1128c',1,'openvdb::v3_2_0::util::NodeMask::foreach(const NodeMask &other, const WordOp &op)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a17bc8aeaca83aff7ef62f497eb2dc68a',1,'openvdb::v3_2_0::util::NodeMask::foreach(const NodeMask &other1, const NodeMask &other2, const WordOp &op)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a4ee5618462c75528f5a5bca41f4d80ed',1,'openvdb::v3_2_0::util::NodeMask::foreach(const NodeMask &other1, const NodeMask &other2, const NodeMask &other3, const WordOp &op)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#acb08bd8aa449398a7172efcd98e1128c',1,'openvdb::v3_2_0::util::NodeMask< 1 >::foreach(const NodeMask &other, const WordOp &op)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a17bc8aeaca83aff7ef62f497eb2dc68a',1,'openvdb::v3_2_0::util::NodeMask< 1 >::foreach(const NodeMask &other1, const NodeMask &other2, const WordOp &op)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a4ee5618462c75528f5a5bca41f4d80ed',1,'openvdb::v3_2_0::util::NodeMask< 1 >::foreach(const NodeMask &other1, const NodeMask &other2, const NodeMask &other3, const WordOp &op)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#acb08bd8aa449398a7172efcd98e1128c',1,'openvdb::v3_2_0::util::NodeMask< 2 >::foreach(const NodeMask &other, const WordOp &op)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a17bc8aeaca83aff7ef62f497eb2dc68a',1,'openvdb::v3_2_0::util::NodeMask< 2 >::foreach(const NodeMask &other1, const NodeMask &other2, const WordOp &op)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a4ee5618462c75528f5a5bca41f4d80ed',1,'openvdb::v3_2_0::util::NodeMask< 2 >::foreach(const NodeMask &other1, const NodeMask &other2, const NodeMask &other3, const WordOp &op)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ada1c7e219f36d148510ce22d7599171b',1,'openvdb::v3_2_0::tools::foreach(const IterT &iter, XformOp &op, bool threaded=true, bool shareOp=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aa1dd9695ed106fdc71856355b0bfc1b6',1,'openvdb::v3_2_0::tools::foreach(const IterT &iter, const XformOp &op, bool threaded=true, bool shareOp=true)']]], + ['foreachbottomup',['foreachBottomUp',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#a828498c7d55b8f10f9f9fe69d943a2eb',1,'openvdb::v3_2_0::tree::NodeManagerLink::foreachBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#a828498c7d55b8f10f9f9fe69d943a2eb',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::foreachBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#a69d893b3f9570617a265d673e414aa0a',1,'openvdb::v3_2_0::tree::NodeManager::foreachBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#ab34acfe4778036240f3af4f463d246d7',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::foreachBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a69d893b3f9570617a265d673e414aa0a',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::foreachBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a69d893b3f9570617a265d673e414aa0a',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::foreachBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a69d893b3f9570617a265d673e414aa0a',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::foreachBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a69d893b3f9570617a265d673e414aa0a',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::foreachBottomUp()']]], + ['foreachtopdown',['foreachTopDown',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#a935f69499533caaf3cdaf37c2745c326',1,'openvdb::v3_2_0::tree::NodeManagerLink::foreachTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#a935f69499533caaf3cdaf37c2745c326',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::foreachTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#a52c458c0bd031ebbf652980955c1e2a3',1,'openvdb::v3_2_0::tree::NodeManager::foreachTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#a9d7d6a1b0f7401a29a0276a6053f1cf4',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::foreachTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a52c458c0bd031ebbf652980955c1e2a3',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::foreachTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a52c458c0bd031ebbf652980955c1e2a3',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::foreachTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a52c458c0bd031ebbf652980955c1e2a3',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::foreachTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a52c458c0bd031ebbf652980955c1e2a3',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::foreachTopDown()']]], + ['formats_2eh',['Formats.h',['../Formats_8h.html',1,'']]], + ['formattedint',['FormattedInt',['../classopenvdb_1_1v3__2__0_1_1util_1_1FormattedInt.html#a0c2868e10738d9ebdf88564b55caba4e',1,'openvdb::v3_2_0::util::FormattedInt::FormattedInt()'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a52743e2f00f77de5f31f42477ad29b5f',1,'openvdb::v3_2_0::util::formattedInt()']]], + ['formattedint',['FormattedInt',['../classopenvdb_1_1v3__2__0_1_1util_1_1FormattedInt.html',1,'openvdb::v3_2_0::util']]], + ['fourthorderdensestencil',['FourthOrderDenseStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1FourthOrderDenseStencil.html#a9dad93442f877bc0282755dfa9baf7ec',1,'openvdb::v3_2_0::math::FourthOrderDenseStencil']]], + ['fourthorderdensestencil',['FourthOrderDenseStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1FourthOrderDenseStencil.html',1,'openvdb::v3_2_0::math']]], + ['frac',['frac',['../structopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter_1_1Filter_1_1Avg.html#acec7f06014438557c76e42134a4b1584',1,'openvdb::v3_2_0::tools::LevelSetFilter::Filter::Avg']]], + ['fractionalpart',['FractionalPart',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a903ffec58b71a6af5ea2e1ec3b11b925',1,'openvdb::v3_2_0::math']]], + ['fracture',['fracture',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFracture.html#a88115098dc647e0fcd061fb8495ceade',1,'openvdb::v3_2_0::tools::LevelSetFracture']]], + ['fragment',['Fragment',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband_1_1Fragment.html#a269a61d4dd2f728afff40f5e8f8c8a7a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::Fragment::Fragment()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband_1_1Fragment.html#abd0a31789d39a656dde8b96c1057430f',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::Fragment::Fragment(Int32 idx_, Int32 x_, Int32 y_, Int32 z_, ValueType dist_)']]], + ['fragment',['Fragment',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband_1_1Fragment.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband']]], + ['fragments',['fragments',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFracture.html#a48d5eeaa5dca52751ceab864916404ba',1,'openvdb::v3_2_0::tools::LevelSetFracture']]], + ['freecount',['freeCount',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a442f664efffce96d5c7acc8e02636ac2',1,'openvdb::v3_2_0::util::PagedArray']]], + ['from',['from',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1CopyOp.html#ac0b6a2034684c625672aa10f55c9ba5d',1,'openvdb::v3_2_0::math::pcg::internal::CopyOp::from()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1MatrixCopyOp.html#a632c425b08ce90158e9fd9c9ae82a236',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::MatrixCopyOp::from()']]], + ['fromgridptrt',['FromGridPtrT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1ConvertGrid.html#a03fbd5fbf90481daef284b1500084096',1,'openvdb::v3_2_0::tools::clip_internal::ConvertGrid']]], + ['fullydecomposedmap',['FullyDecomposedMap',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ad289703594d6ddfd6a34f6d6a5c2b310',1,'openvdb::v3_2_0::math']]], + ['functor',['Functor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude_1_1Functor.html',1,'openvdb::v3_2_0::tools::Magnitude']]], + ['functor',['Functor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature_1_1Functor.html',1,'openvdb::v3_2_0::tools::MeanCurvature']]], + ['functor',['Functor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Gradient_1_1Functor.html',1,'openvdb::v3_2_0::tools::Gradient']]], + ['functor',['Functor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Divergence_1_1Functor.html',1,'openvdb::v3_2_0::tools::Divergence']]], + ['functor',['Functor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Divergence_1_1Functor.html#ad7669dfeaaf70b8dc01ec4a3e22750ce',1,'openvdb::v3_2_0::tools::Divergence::Functor::Functor()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Gradient_1_1Functor.html#ad7669dfeaaf70b8dc01ec4a3e22750ce',1,'openvdb::v3_2_0::tools::Gradient::Functor::Functor()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian_1_1Functor.html#ae74093cb8c7f54cae7abcf4af6ea269c',1,'openvdb::v3_2_0::tools::Laplacian::Functor::Functor()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature_1_1Functor.html#ae74093cb8c7f54cae7abcf4af6ea269c',1,'openvdb::v3_2_0::tools::MeanCurvature::Functor::Functor()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude_1_1Functor.html#ad7669dfeaaf70b8dc01ec4a3e22750ce',1,'openvdb::v3_2_0::tools::Magnitude::Functor::Functor()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Normalize_1_1Functor.html#ae74093cb8c7f54cae7abcf4af6ea269c',1,'openvdb::v3_2_0::tools::Normalize::Functor::Functor()']]], + ['functor',['Functor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian_1_1Functor.html',1,'openvdb::v3_2_0::tools::Laplacian']]], + ['functor',['Functor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Normalize_1_1Functor.html',1,'openvdb::v3_2_0::tools::Normalize']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_8.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_8.html new file mode 100644 index 00000000..12e5aff1 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_8.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_8.js new file mode 100644 index 00000000..4c5b9992 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_8.js @@ -0,0 +1,257 @@ +var searchData= +[ + ['g',['g',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#a2f7de5360e6a7a324e6727df48028058',1,'openvdb::v3_2_0::tools::Film::RGBA']]], + ['gather',['gather',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1Neighbor.html#a04b4117c718dc0b0bb39f86c7065c169',1,'openvdb::v3_2_0::tools::Morphology::Neighbor::gather()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#ab7aeb5ce61a663edc09db6872825c44d',1,'openvdb::v3_2_0::tools::Morphology::LeafCache::gather(int n, int indx)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#acaa8c8e457b32b3f7fc27e8acce2b9a6',1,'openvdb::v3_2_0::tools::Morphology::LeafCache::gather(int n, int indx)']]], + ['gatheredgesxy',['gatherEdgesXY',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#ac283f3f7e3f18113db7a8052cd80243a',1,'openvdb::v3_2_0::tools::Morphology::LeafCache']]], + ['gatherfacesxy',['gatherFacesXY',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#a5d269d75c529211ffb8ef28cf34059fa',1,'openvdb::v3_2_0::tools::Morphology::LeafCache']]], + ['gaussian',['gaussian',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a046f5beaa2684b8d6a01df056b730e2c',1,'openvdb::v3_2_0::tools::Filter::gaussian()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a5294deea9323e8cbef5882c36f7acee8',1,'openvdb::v3_2_0::tools::LevelSetFilter::gaussian()']]], + ['genboundarymask',['GenBoundaryMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenBoundaryMask.html',1,'openvdb::v3_2_0::tools::internal']]], + ['genboundarymask',['GenBoundaryMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenBoundaryMask.html#a8e492b74d283252a8a64662e347b4491',1,'openvdb::v3_2_0::tools::internal::GenBoundaryMask::GenBoundaryMask(const LeafManagerT &leafs, const BoolTreeT &, const IntTreeT &)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenBoundaryMask.html#a6212361de7e2ed7a8d8ddaeff6728806',1,'openvdb::v3_2_0::tools::internal::GenBoundaryMask::GenBoundaryMask(GenBoundaryMask &, tbb::split)']]], + ['genedgedata',['GenEdgeData',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1GenEdgeData.html',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData']]], + ['genedgedata',['GenEdgeData',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1GenEdgeData.html#acdcf7d53149eaf58d431905c9ae0531c',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::GenEdgeData::GenEdgeData(const std::vector< Vec3s > &pointList, const std::vector< Vec4I > &polygonList)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1GenEdgeData.html#a6c73a1cb8d17cc3e82375bb8a8db192a',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::GenEdgeData::GenEdgeData(GenEdgeData &rhs, tbb::split)']]], + ['genericmap',['GenericMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html',1,'openvdb::v3_2_0::math']]], + ['genericmap',['GenericMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#a3a550c307bdf8ae48d483c95c8b8c1ef',1,'openvdb::v3_2_0::math::GenericMap::GenericMap(const GridType &g)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#a86c7972a8022ba10b1192890ae2d0c56',1,'openvdb::v3_2_0::math::GenericMap::GenericMap(const Transform &t)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#abe73776a72d3096ea628e3980c039644',1,'openvdb::v3_2_0::math::GenericMap::GenericMap(MapBase::Ptr map)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#a73860ec15bdd598637ff5e18aff32166',1,'openvdb::v3_2_0::math::GenericMap::GenericMap(MapBase::ConstPtr map)']]], + ['genpoints',['GenPoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPoints.html',1,'openvdb::v3_2_0::tools::internal']]], + ['genpoints',['GenPoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPoints.html#aec20bb4281aa45afbd444d42485674d4',1,'openvdb::v3_2_0::tools::internal::GenPoints']]], + ['genpolygons',['GenPolygons',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPolygons.html',1,'openvdb::v3_2_0::tools::internal']]], + ['genpolygons',['GenPolygons',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPolygons.html#a5bf9f17004e62a7c7fbb6b61b707f535',1,'openvdb::v3_2_0::tools::internal::GenPolygons']]], + ['genseammask',['GenSeamMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenSeamMask.html',1,'openvdb::v3_2_0::tools::internal']]], + ['genseammask',['GenSeamMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenSeamMask.html#a55dd07701fe0b837b6973d4cdcb948c5',1,'openvdb::v3_2_0::tools::internal::GenSeamMask::GenSeamMask(const LeafManagerT &leafs, const TreeT &tree)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenSeamMask.html#abf9988dd6a889e908f372effbd849fbe',1,'openvdb::v3_2_0::tools::internal::GenSeamMask::GenSeamMask(GenSeamMask &, tbb::split)']]], + ['gentilemask',['GenTileMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTileMask.html#a6210eb34fd3aeb2e8ce11b8d942c3dba',1,'openvdb::v3_2_0::tools::internal::GenTileMask::GenTileMask(const std::vector< Vec4i > &tiles, const TreeT &distTree, ValueT iso)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTileMask.html#a3f73da02e1abd89e7cd34d68468b32ac',1,'openvdb::v3_2_0::tools::internal::GenTileMask::GenTileMask(GenTileMask &, tbb::split)']]], + ['gentilemask',['GenTileMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTileMask.html',1,'openvdb::v3_2_0::tools::internal']]], + ['gentopologymask',['GenTopologyMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTopologyMask.html',1,'openvdb::v3_2_0::tools::internal']]], + ['gentopologymask',['GenTopologyMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTopologyMask.html#ade335a57a5fe0f36294c892096360d3e',1,'openvdb::v3_2_0::tools::internal::GenTopologyMask::GenTopologyMask(const BoolGridT &mask, const LeafManagerT &srcLeafs, const math::Transform &srcXForm, bool invertMask)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTopologyMask.html#a7dd52be0a92c589195f686db57e15ca2',1,'openvdb::v3_2_0::tools::internal::GenTopologyMask::GenTopologyMask(GenTopologyMask &, tbb::split)']]], + ['get',['get',['../structopenvdb_1_1v3__2__0_1_1math_1_1Ray_1_1TimeSpan.html#a7dd162ad2caa8d55689e7e81572b634b',1,'openvdb::v3_2_0::math::Ray::TimeSpan::get()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1GetValImpl_3_01T_00_01false_01_4.html#ad264a2fd37f2cc60f814b41ad6013c27',1,'openvdb::v3_2_0::tools::stats_internal::GetValImpl< T, false >::get()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1GetValImpl_3_01T_00_01true_01_4.html#ad264a2fd37f2cc60f814b41ad6013c27',1,'openvdb::v3_2_0::tools::stats_internal::GetValImpl< T, true >::get()']]], + ['geta',['getA',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ABTransform.html#a236b503ac6189ca86ca2a2f27ae0eceb',1,'openvdb::v3_2_0::tools::ABTransform']]], + ['getaccessor',['getAccessor',['../classopenvdb_1_1v3__2__0_1_1Grid.html#afd9327e5a015e2e860017765f0eb372c',1,'openvdb::v3_2_0::Grid::getAccessor()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a13a5261de783b5a670d645007204c428',1,'openvdb::v3_2_0::Grid::getAccessor() const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData.html#afd9327e5a015e2e860017765f0eb372c',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::getAccessor()']]], + ['getaffinemap',['getAffineMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#ac74696eeff38a4d9d86d5a3f3fa9b2a4',1,'openvdb::v3_2_0::math::MapBase::getAffineMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#ac3320cc1f86fcd15e22b5aec51328a2b',1,'openvdb::v3_2_0::math::AffineMap::getAffineMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#ac3320cc1f86fcd15e22b5aec51328a2b',1,'openvdb::v3_2_0::math::ScaleMap::getAffineMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#ac3320cc1f86fcd15e22b5aec51328a2b',1,'openvdb::v3_2_0::math::TranslationMap::getAffineMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#ac3320cc1f86fcd15e22b5aec51328a2b',1,'openvdb::v3_2_0::math::ScaleTranslateMap::getAffineMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#ac3320cc1f86fcd15e22b5aec51328a2b',1,'openvdb::v3_2_0::math::UnitaryMap::getAffineMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#ac3320cc1f86fcd15e22b5aec51328a2b',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::getAffineMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#ac3320cc1f86fcd15e22b5aec51328a2b',1,'openvdb::v3_2_0::math::CompoundMap::getAffineMap()']]], + ['getarbperpendicular',['getArbPerpendicular',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a83d9d54cf369f2b9f1fc2706c675bad4',1,'openvdb::v3_2_0::math::Vec2::getArbPerpendicular()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a5cccc0e854e64ddc30427950c90b27cd',1,'openvdb::v3_2_0::math::Vec3::getArbPerpendicular()']]], + ['getb',['getB',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ABTransform.html#a089a8a615c52200718d0dcdb8b3d4e50',1,'openvdb::v3_2_0::tools::ABTransform']]], + ['getbackgroundvalue',['getBackgroundValue',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a39b1b3441a930b3f2c4a915c4a00b747',1,'openvdb::v3_2_0::tree::TreeBase::getBackgroundValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a7cc646b0001dce38746ee1e3722cd86c',1,'openvdb::v3_2_0::tree::Tree::getBackgroundValue()']]], + ['getbbox',['getBBox',['../classopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1LegacyFrustum.html#ae79cac82ac02daec327464bf41b4838d',1,'openvdb::v3_2_0::math::internal::LegacyFrustum::getBBox()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a99178da9946b88aacf8dd1d1f816a1d0',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::getBBox()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#a08ed0f854710ab55f2b66077290e950c',1,'openvdb::v3_2_0::tools::PointPartitioner::getBBox()']]], + ['getbitsize',['getBitSize',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#af7177eafd43cd0e2e2717076d298aeeb',1,'openvdb::v3_2_0::util::RootNodeMask']]], + ['getblockpos',['getBlockPos',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#ab283ef02ecee60bbddb6430155dcc132',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['getboundingbox',['getBoundingBox',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a2bc45738e8f63b4d0e3f60f9126a0e7b',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::getBoundingBox(CoordBBox &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#ad8c23df12f12a5cd55073b1da4970fef',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::getBoundingBox() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a7c9266c4a6af7aece8876a5ee5777884',1,'openvdb::v3_2_0::tree::NodeIteratorBase::getBoundingBox(CoordBBox &bbox) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#ad8c23df12f12a5cd55073b1da4970fef',1,'openvdb::v3_2_0::tree::NodeIteratorBase::getBoundingBox() const ']]], + ['getbuffer',['getBuffer',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#aa54178da485b68013cea72c2ef70824e',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['getcamxform',['getCamXForm',['../classopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1LegacyFrustum.html#ae01e4987b3c4a94a6362ec54c423cdb0',1,'openvdb::v3_2_0::math::internal::LegacyFrustum']]], + ['getcenter',['getCenter',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#acc39d59e67a9bf472082b89e394051b8',1,'openvdb::v3_2_0::math::BBox::getCenter()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#acc39d59e67a9bf472082b89e394051b8',1,'openvdb::v3_2_0::math::CoordBBox::getCenter()']]], + ['getcentercoord',['getCenterCoord',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#aa80089fc587676cb3cc44ed93594695f',1,'openvdb::v3_2_0::math::BaseStencil']]], + ['getcentervalue',['getCenterValue',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a40f8d94cfaf70cd56092def745720dbc',1,'openvdb::v3_2_0::math::BaseStencil::getCenterValue()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DenseStencil.html#a40f8d94cfaf70cd56092def745720dbc',1,'openvdb::v3_2_0::math::DenseStencil::getCenterValue()']]], + ['getchild',['getChild',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01false_00_01ValueT_00_01ChildT_01_4.html#afd2a6ba165f82045959a200d161aead4',1,'openvdb::v3_2_0::tree::NodeUnionImpl< false, ValueT, ChildT >::getChild()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01true_00_01ValueT_00_01ChildT_01_4.html#afd2a6ba165f82045959a200d161aead4',1,'openvdb::v3_2_0::tree::NodeUnionImpl< true, ValueT, ChildT >::getChild()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits.html#a276c415db770bb79fd2ef093fd542aa5',1,'openvdb::v3_2_0::tree::IterTraits::getChild()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOnIter_01_4.html#ac707c3c0ee1c97bc52724af4b26ee6e9',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOnIter >::getChild()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOnCIter_01_4.html#a3fe92610454edb002bbc3ad1ba319b65',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOnCIter >::getChild()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildAllIter_01_4.html#ac707c3c0ee1c97bc52724af4b26ee6e9',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildAllIter >::getChild()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildAllCIter_01_4.html#ac707c3c0ee1c97bc52724af4b26ee6e9',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildAllCIter >::getChild()']]], + ['getchilddim',['getChildDim',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a252a41011fe13e50c8d49b5ca14a979b',1,'openvdb::v3_2_0::tree::InternalNode::getChildDim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a252a41011fe13e50c8d49b5ca14a979b',1,'openvdb::v3_2_0::tree::LeafNode::getChildDim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a252a41011fe13e50c8d49b5ca14a979b',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getChildDim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a252a41011fe13e50c8d49b5ca14a979b',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getChildDim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a252a41011fe13e50c8d49b5ca14a979b',1,'openvdb::v3_2_0::tree::RootNode::getChildDim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#aaa64e7f2270b4a41b3849e73bfe088c8',1,'openvdb::v3_2_0::tree::IterListItem::getChildDim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#aaa64e7f2270b4a41b3849e73bfe088c8',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::getChildDim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#aaa64e7f2270b4a41b3849e73bfe088c8',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::getChildDim()']]], + ['getchildmask',['getChildMask',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a34fc0b97da28f1a04b83b9eabd509596',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['getchildnode',['getChildNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ac6e48ad8fd6eed08e7bdcb7eed3ccdb8',1,'openvdb::v3_2_0::tree::InternalNode::getChildNode(Index n)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a0006c869fa4e54859a74610142f76ec8',1,'openvdb::v3_2_0::tree::InternalNode::getChildNode(Index n) const ']]], + ['getconstaccessor',['getConstAccessor',['../classopenvdb_1_1v3__2__0_1_1Grid.html#abb3a6edcb63ee7aa5b21b09f09dbb534',1,'openvdb::v3_2_0::Grid']]], + ['getconstjacobianinv',['getConstJacobianInv',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a1c51f96e7125c8bb05fbd1c7f7665c6b',1,'openvdb::v3_2_0::math::AffineMap']]], + ['getconstmat4',['getConstMat4',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a87c460ee494357d00a4679468ed1bda4',1,'openvdb::v3_2_0::math::AffineMap']]], + ['getconstrow',['getConstRow',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a7c40feddfcb7a042a5c84fe9c5e17ec0',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix']]], + ['getconstunsafeaccessor',['getConstUnsafeAccessor',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a0faf29723f9afa2cfbbf3063a17e5e7e',1,'openvdb::v3_2_0::Grid']]], + ['getcoord',['getCoord',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#a6260918b810170b120f0b56c68cc3432',1,'openvdb::v3_2_0::tree::IteratorBase::getCoord() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#ad896b5f0fe71664e674c52e796554410',1,'openvdb::v3_2_0::tree::IteratorBase::getCoord(Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a6c7a1f27012bca4be973175b5ecfcb7d',1,'openvdb::v3_2_0::tree::IterListItem::getCoord()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a6c7a1f27012bca4be973175b5ecfcb7d',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::getCoord()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a6c7a1f27012bca4be973175b5ecfcb7d',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::getCoord()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a6260918b810170b120f0b56c68cc3432',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::getCoord()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a6260918b810170b120f0b56c68cc3432',1,'openvdb::v3_2_0::tree::NodeIteratorBase::getCoord()']]], + ['getcreator',['getCreator',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a9f66e4b9d2bf18d2aa117c7544322be4',1,'openvdb::v3_2_0::GridBase']]], + ['getdatacompression',['getDataCompression',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a8887bf9b18f6fb8b5037576b665b09e6',1,'openvdb::v3_2_0::io']]], + ['getdepth',['getDepth',['../classopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1LegacyFrustum.html#a1adc74eef892f7566f7588640487a5bb',1,'openvdb::v3_2_0::math::internal::LegacyFrustum::getDepth()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a1adc74eef892f7566f7588640487a5bb',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::getDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ae9c602c12ff468865a25ce83ff7fb8c1',1,'openvdb::v3_2_0::tree::RootNode::getDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#ae9c602c12ff468865a25ce83ff7fb8c1',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::getDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#ae9c602c12ff468865a25ce83ff7fb8c1',1,'openvdb::v3_2_0::tree::NodeIteratorBase::getDepth()']]], + ['getedgedata',['getEdgeData',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData.html#afda35c8d1816ba75cc79b9267df813fc',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData']]], + ['getend',['getEnd',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#aaf4602f3087ef3ffc72652b1679c7124',1,'openvdb::v3_2_0::math::CoordBBox']]], + ['getendpos',['getEndPos',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a71865431de9b61ae21c2d8fee95eb834',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['geterrorstring',['getErrorString',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a7229a3493daddad4d1bb0c4dfbba3aef',1,'openvdb::v3_2_0::io::getErrorString(int errorNum)'],['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a6bd295fad54e3ddbb3457aa62d40ff65',1,'openvdb::v3_2_0::io::getErrorString()']]], + ['getfarplanewidth',['getFarPlaneWidth',['../classopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1LegacyFrustum.html#a25be3641be3763c32092552627061dba',1,'openvdb::v3_2_0::math::internal::LegacyFrustum']]], + ['getfirstvalue',['getFirstValue',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a5b11672e5be2e242c1748af8985e6cdd',1,'openvdb::v3_2_0::tree::InternalNode::getFirstValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a28462feb223f67c2d6af291b0d3fc00e',1,'openvdb::v3_2_0::tree::LeafNode::getFirstValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aeec903c1db32c9ce6cacfb45ba8887f2',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getFirstValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aeec903c1db32c9ce6cacfb45ba8887f2',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getFirstValue()']]], + ['getformatversion',['getFormatVersion',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a736a8fcbd88f198519c2364340781b65',1,'openvdb::v3_2_0::io']]], + ['getgamma',['getGamma',['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#ae7ef29d750b7a1d568d0a603bd04050b',1,'openvdb::v3_2_0::math::NonlinearFrustumMap']]], + ['getglobalindex',['getGlobalIndex',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#a78115e860f0059c9d448b90b48c475f7',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray']]], + ['getgrainsize',['getGrainSize',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#aafb0e291470742bdae09a1d339e65980',1,'openvdb::v3_2_0::tools::Filter::getGrainSize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#aafb0e291470742bdae09a1d339e65980',1,'openvdb::v3_2_0::tools::LevelSetAdvection::getGrainSize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#aafb0e291470742bdae09a1d339e65980',1,'openvdb::v3_2_0::tools::LevelSetMeasure::getGrainSize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#aafb0e291470742bdae09a1d339e65980',1,'openvdb::v3_2_0::tools::LevelSetMorphing::getGrainSize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#aafb0e291470742bdae09a1d339e65980',1,'openvdb::v3_2_0::tools::LevelSetTracker::getGrainSize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#aafb0e291470742bdae09a1d339e65980',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet::getGrainSize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#a60b0a96a503d6360bcdac038a60d5754',1,'openvdb::v3_2_0::tools::VolumeAdvection::getGrainSize()']]], + ['getgridbackgroundvalueptr',['getGridBackgroundValuePtr',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a4445a753401078b4e6928f6926c57d12',1,'openvdb::v3_2_0::io']]], + ['getgridclass',['getGridClass',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a944b65979b396546d9ceffdfb9f86b10',1,'openvdb::v3_2_0::GridBase::getGridClass()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a944b65979b396546d9ceffdfb9f86b10',1,'openvdb::v3_2_0::tools::MultiResGrid::getGridClass()'],['../namespaceopenvdb_1_1v3__2__0_1_1io.html#ad57bb2664a8c5a823c7ff5b5e3e9b7d1',1,'openvdb::v3_2_0::io::getGridClass()']]], + ['getgridfrompyobject',['getGridFromPyObject',['../namespacepyopenvdb.html#a0611fe056781b68e152343de6c3e87e5',1,'pyopenvdb::getGridFromPyObject(PyObject *)'],['../namespacepyopenvdb.html#ac011390142df3fa0d2136cb9166ceeb8',1,'pyopenvdb::getGridFromPyObject(const boost::python::object &)']]], + ['getgridpos',['getGridPos',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a6ce2b3f5182da07f6ba6e96db7501cb2',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['getgrids',['getGrids',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a8745aa9f5ad1bb9b669ac3d722b1e3ac',1,'openvdb::v3_2_0::io::File::getGrids()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Stream.html#a2eed71ec18e3a25660216f7e90ef59b8',1,'openvdb::v3_2_0::io::Stream::getGrids()']]], + ['gethalffloat',['getHalfFloat',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a51fe070173693bc693328f449d88f953',1,'openvdb::v3_2_0::io']]], + ['gethalfwidth',['getHalfWidth',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a188e0227a50fddcdc547100a80d76435',1,'openvdb::v3_2_0::tools::LevelSetTracker::getHalfWidth()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a1b6178bc4d6c12cb96d3752363047103',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet::getHalfWidth()']]], + ['getheight',['getHeight',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#acb8a1436aa153d08fa6e73f59f871976',1,'openvdb::v3_2_0::tree::RootNode']]], + ['getinactivevalues',['getInactiveValues',['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveVoxelValues.html#a05cc7fc66b5de7997bef363c70c13f1e',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveVoxelValues::getInactiveValues()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveTileValues.html#a05cc7fc66b5de7997bef363c70c13f1e',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveTileValues::getInactiveValues()']]], + ['getindexpos',['getIndexPos',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a88056b88146c39eff06e362f8fde6721',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::getIndexPos()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#ac6d1d1b312bc49451efbd7084b3fbe6f',1,'openvdb::v3_2_0::tools::LinearSearchImpl::getIndexPos()']]], + ['getindexrange',['getIndexRange',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a79c5c77b8e79b139e3da5e4f16ed00f6',1,'openvdb::v3_2_0::tree::RootNode::getIndexRange()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a7ebd5e0acc5a803b85bf78b642ffd425',1,'openvdb::v3_2_0::tree::TreeBase::getIndexRange()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a37897566bb9a2e4a4eb732d0fd5dec4d',1,'openvdb::v3_2_0::tree::Tree::getIndexRange()']]], + ['getindexspacepoint',['getIndexSpacePoint',['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadAndTriangleDataAdapter.html#ae5b678f15eb0ab787af2a589b016eb67',1,'openvdb::v3_2_0::tools::QuadAndTriangleDataAdapter']]], + ['getindextime',['getIndexTime',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#a09acd81d881cbcb0c2dbc85dbe8ce55d',1,'openvdb::v3_2_0::tools::LinearSearchImpl']]], + ['getindices',['getIndices',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a8c7e85ef9128fe4e6c6931476ad86eb0',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::getIndices(const Coord &ijk, const ValueType *&begin, const ValueType *&end) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a7536e20df80f97ca488b13e1991a3682',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::getIndices(Index offset, const ValueType *&begin, const ValueType *&end) const ']]], + ['getintegrator',['getIntegrator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#aadefab1c70f198a76e4127c41e035361',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['getintsize',['getIntSize',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a028bc59271e4024ed697861af862c4ad',1,'openvdb::v3_2_0::util::RootNodeMask']]], + ['getinvscale',['getInvScale',['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a816faf2566276582631f89d54d73bc24',1,'openvdb::v3_2_0::math::ScaleMap::getInvScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a816faf2566276582631f89d54d73bc24',1,'openvdb::v3_2_0::math::ScaleTranslateMap::getInvScale()']]], + ['getinvscalesqr',['getInvScaleSqr',['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#adc29d3e999815ae716fc7ac2eafd66e3',1,'openvdb::v3_2_0::math::ScaleMap::getInvScaleSqr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#adc29d3e999815ae716fc7ac2eafd66e3',1,'openvdb::v3_2_0::math::ScaleTranslateMap::getInvScaleSqr()']]], + ['getinvtwicescale',['getInvTwiceScale',['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#acdcf5ff93e948532ecc304afe3d1f899',1,'openvdb::v3_2_0::math::ScaleMap::getInvTwiceScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#acdcf5ff93e948532ecc304afe3d1f899',1,'openvdb::v3_2_0::math::ScaleTranslateMap::getInvTwiceScale()']]], + ['getisovalue',['getIsoValue',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#a1025518c5b603098723b0ba77e881d69',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::getIsoValue()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#a1025518c5b603098723b0ba77e881d69',1,'openvdb::v3_2_0::tools::LinearSearchImpl::getIsoValue()']]], + ['getitem',['getItem',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ChildIter.html#abc0bf0f763d49de86ec36bbfb85708f0',1,'openvdb::v3_2_0::tree::InternalNode::ChildIter::getItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ValueIter.html#ac30bdcd1f535aae7adf56ca3d1e1f2dd',1,'openvdb::v3_2_0::tree::InternalNode::ValueIter::getItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DenseIter.html#a9b24a29f25e734c9745e344fa11e58ec',1,'openvdb::v3_2_0::tree::InternalNode::DenseIter::getItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#ac493f902d107a9dd64608db3430b0a16',1,'openvdb::v3_2_0::tree::SparseIteratorBase::getItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a50ba7205a1e2bd04856467c55e1e4212',1,'openvdb::v3_2_0::tree::DenseIteratorBase::getItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueIter.html#a93d283406c16cf1031497547139a483d',1,'openvdb::v3_2_0::tree::LeafNode::ValueIter::getItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1DenseIter.html#a8d73b995210abce4ce9f08deeb97db9d',1,'openvdb::v3_2_0::tree::LeafNode::DenseIter::getItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ValueIter.html#a8c86fa42d449fb47b97355d59cf45ace',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter::getItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1DenseIter.html#a8d73b995210abce4ce9f08deeb97db9d',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::DenseIter::getItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ValueIter.html#a8c86fa42d449fb47b97355d59cf45ace',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter::getItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1DenseIter.html#a8d73b995210abce4ce9f08deeb97db9d',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::DenseIter::getItem()']]], + ['getlastvalue',['getLastValue',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a1278796f9dc4866a9a9f222d8f448c90',1,'openvdb::v3_2_0::tree::InternalNode::getLastValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a9602b04a7c36dcbff233af6c9989b975',1,'openvdb::v3_2_0::tree::LeafNode::getLastValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a92f2f54153fa3b597a2af51cf5a33c00',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getLastValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a92f2f54153fa3b597a2af51cf5a33c00',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getLastValue()']]], + ['getleaf',['getLeaf',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#a96a752a87a2f60f315e7beb5359937fc',1,'openvdb::v3_2_0::tree::LeafIteratorBase']]], + ['getleafdepth',['getLeafDepth',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a7bb4e750bcba611c8e936ead228d0dce',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::getLeafDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a7bb4e750bcba611c8e936ead228d0dce',1,'openvdb::v3_2_0::tree::NodeIteratorBase::getLeafDepth()']]], + ['getlevel',['getLevel',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a7364ceedc39ddbd16d4f61f89dda4883',1,'openvdb::v3_2_0::tree::InternalNode::getLevel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a7364ceedc39ddbd16d4f61f89dda4883',1,'openvdb::v3_2_0::tree::LeafNode::getLevel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a7364ceedc39ddbd16d4f61f89dda4883',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getLevel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a7364ceedc39ddbd16d4f61f89dda4883',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getLevel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a7364ceedc39ddbd16d4f61f89dda4883',1,'openvdb::v3_2_0::tree::RootNode::getLevel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#ac1e1307e3a8be7d7d889466b99cb583b',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::getLevel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#ac1e1307e3a8be7d7d889466b99cb583b',1,'openvdb::v3_2_0::tree::NodeIteratorBase::getLevel()']]], + ['getlevelset',['getLevelSet',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetSphere.html#a9c65baf7f5089325371290ea29ed2c15',1,'openvdb::v3_2_0::tools::LevelSetSphere']]], + ['getlibraryversion',['getLibraryVersion',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a1e89f7e213f2d690e0a8d48395ec6c3e',1,'openvdb::v3_2_0::io']]], + ['getlibraryversionstring',['getLibraryVersionString',['../namespaceopenvdb_1_1v3__2__0.html#aca001550d1341d8e456b09d45c93f9a6',1,'openvdb::v3_2_0']]], + ['getlimiter',['getLimiter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#a8bc4a91951ae68d819f3372cd77a49ed',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['getmappedfileptr',['getMappedFilePtr',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a7158f84a0d21e3abe7c9c8bc34b0990b',1,'openvdb::v3_2_0::io']]], + ['getmat3',['getMat3',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a4932169c6f880b6b2c3d8f48928788ab',1,'openvdb::v3_2_0::math::Mat4']]], + ['getmat4',['getMat4',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a711a21e1dd5fd8a650dac85138c664a8',1,'openvdb::v3_2_0::math::AffineMap']]], + ['getmaxcount',['getMaxCount',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a1be1b941445bb2600de8f18162a5a679',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['getmaxdepth',['getMaxDepth',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a08f628696e654018ecde8061d46a08f2',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::getMaxDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a08f628696e654018ecde8061d46a08f2',1,'openvdb::v3_2_0::tree::NodeIteratorBase::getMaxDepth()']]], + ['getmaxdistance',['getMaxDistance',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#af6c2051903a67771c5a215230c761325',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['getmaxindex',['getMaxIndex',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a2abbf438654aa1950e0c58ec7a717615',1,'openvdb::v3_2_0::tree::RootNode']]], + ['getmaxvelocity',['getMaxVelocity',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#a5c1e74edce2ce0d37b4ec2e887190478',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['getmemusage',['getMemUsage',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#acdaacda619a44722cf38fbb24b4bcc8a',1,'openvdb::v3_2_0::util::RootNodeMask']]], + ['getmetadata',['getMetadata',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a81c2e03e534467c70b36f8b82b3a8564',1,'openvdb::v3_2_0::io::File::getMetadata()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Stream.html#a81c2e03e534467c70b36f8b82b3a8564',1,'openvdb::v3_2_0::io::Stream::getMetadata()'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a6663959f50562837fb310465190c385f',1,'openvdb::v3_2_0::MetaMap::getMetadata(const Name &)'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a460afc65e46569f1d4f96a698f5e32f6',1,'openvdb::v3_2_0::MetaMap::getMetadata(const Name &) const ']]], + ['getmincount',['getMinCount',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#aabc50138f01ac5555d304758b985f2f5',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['getmindepth',['getMinDepth',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a71d7096b835c0a8f2faaac8022274799',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::getMinDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a71d7096b835c0a8f2faaac8022274799',1,'openvdb::v3_2_0::tree::NodeIteratorBase::getMinDepth()']]], + ['getminindex',['getMinIndex',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a4ad45f83af7980f8e2b181ab62a39dec',1,'openvdb::v3_2_0::tree::RootNode']]], + ['getname',['getName',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a33957ff81d96d5eb86be59fea5034afd',1,'openvdb::v3_2_0::GridBase::getName()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a33957ff81d96d5eb86be59fea5034afd',1,'openvdb::v3_2_0::tools::MultiResGrid::getName()']]], + ['getnearplanedist',['getNearPlaneDist',['../classopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1LegacyFrustum.html#ad47cb64aa32a1ad258d3f2211aa22be8',1,'openvdb::v3_2_0::math::internal::LegacyFrustum']]], + ['getnearplanewidth',['getNearPlaneWidth',['../classopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1LegacyFrustum.html#ad083f9d78d020ba018da0838e1816abe',1,'openvdb::v3_2_0::math::internal::LegacyFrustum']]], + ['getnewprimid',['getNewPrimId',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#ae38ac9ce426834f139b5385577944dc7',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData']]], + ['getnode',['getNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#acd6e95b47c7394b858c0bf2ad8ce8a7e',1,'openvdb::v3_2_0::tree::IterListItem::getNode(Index lvl, NodeT *&node) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#abd143bb9c7a5e961608fd8c62380dfc6',1,'openvdb::v3_2_0::tree::IterListItem::getNode(Index lvl, OtherNodeT *&node) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#acd6e95b47c7394b858c0bf2ad8ce8a7e',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::getNode(Index lvl, NodeT *&node) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#abd143bb9c7a5e961608fd8c62380dfc6',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::getNode(Index lvl, OtherNodeT *&node) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#acd6e95b47c7394b858c0bf2ad8ce8a7e',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::getNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a543711b4de27ee446fadafa035a9d946',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::getNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#aff6da1429c831d56cc69c9a7d7bb3b54',1,'openvdb::v3_2_0::tree::NodeIteratorBase::getNode(NodeT *&node) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#ab0e07b4520374814d522e5b8a22744f2',1,'openvdb::v3_2_0::tree::NodeIteratorBase::getNode(const NodeT *&node) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#ad3062cc77f2d07139f58aadc2de9272d',1,'openvdb::v3_2_0::tree::ValueAccessor::getNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#ab4566d531f350aef3bc194ae60d0586d',1,'openvdb::v3_2_0::tree::CacheItem::getNode(const NodeType *&node) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a8da34106cda6d2b8e115bafccfb1c71c',1,'openvdb::v3_2_0::tree::CacheItem::getNode(const NodeType *&node)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a4f837f772b3ad0800c660bc4091e0414',1,'openvdb::v3_2_0::tree::CacheItem::getNode(NodeType *&node)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#ad75765a47c3648b5b24b07f97842d41f',1,'openvdb::v3_2_0::tree::CacheItem::getNode(OtherNodeType *&node)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a74f075c790d615ec6cb3d5b60330e2b4',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::getNode(RootNodeType *&node)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a02aa420d5b7dc8fdfb7b02b2d54d9a66',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::getNode(const RootNodeType *&node) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a438b37b9a8bb6489138c12c7caa21ded',1,'openvdb::v3_2_0::tree::ValueAccessor0::getNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a438b37b9a8bb6489138c12c7caa21ded',1,'openvdb::v3_2_0::tree::ValueAccessor1::getNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a438b37b9a8bb6489138c12c7caa21ded',1,'openvdb::v3_2_0::tree::ValueAccessor2::getNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a438b37b9a8bb6489138c12c7caa21ded',1,'openvdb::v3_2_0::tree::ValueAccessor3::getNode()']]], + ['getnodeboundingbox',['getNodeBoundingBox',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a6051e4ba75b59a01e4d0e91ba9786070',1,'openvdb::v3_2_0::tree::InternalNode::getNodeBoundingBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a6051e4ba75b59a01e4d0e91ba9786070',1,'openvdb::v3_2_0::tree::LeafNode::getNodeBoundingBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a6051e4ba75b59a01e4d0e91ba9786070',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getNodeBoundingBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a6051e4ba75b59a01e4d0e91ba9786070',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getNodeBoundingBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a00265a6f2e4bb7edf268ce430744f410',1,'openvdb::v3_2_0::tree::RootNode::getNodeBoundingBox()']]], + ['getnodelog2dims',['getNodeLog2Dims',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ad3b91d6e713861046431c86630d23ae2',1,'openvdb::v3_2_0::tree::InternalNode::getNodeLog2Dims()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a95581347b62717ce005bf1f6d4e2bfae',1,'openvdb::v3_2_0::tree::LeafNode::getNodeLog2Dims()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a95581347b62717ce005bf1f6d4e2bfae',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getNodeLog2Dims()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a95581347b62717ce005bf1f6d4e2bfae',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getNodeLog2Dims()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ad3b91d6e713861046431c86630d23ae2',1,'openvdb::v3_2_0::tree::RootNode::getNodeLog2Dims()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ad3b91d6e713861046431c86630d23ae2',1,'openvdb::v3_2_0::tree::Tree::getNodeLog2Dims()']]], + ['getnodes',['getNodes',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a33a3cd99c0b9c78e1f6da3d9a36fdaff',1,'openvdb::v3_2_0::tree::InternalNode::getNodes(ArrayT &array)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ab4dda98f1a46783cb8638ef4a17462c0',1,'openvdb::v3_2_0::tree::InternalNode::getNodes(ArrayT &array) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a33a3cd99c0b9c78e1f6da3d9a36fdaff',1,'openvdb::v3_2_0::tree::LeafManager::getNodes(ArrayT &array)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#ab4dda98f1a46783cb8638ef4a17462c0',1,'openvdb::v3_2_0::tree::LeafManager::getNodes(ArrayT &array) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aee242e9e143c3bcf1492f263b243b21e',1,'openvdb::v3_2_0::tree::LeafNode::getNodes()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aee242e9e143c3bcf1492f263b243b21e',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getNodes()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aee242e9e143c3bcf1492f263b243b21e',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getNodes()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a33a3cd99c0b9c78e1f6da3d9a36fdaff',1,'openvdb::v3_2_0::tree::RootNode::getNodes(ArrayT &array)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ab4dda98f1a46783cb8638ef4a17462c0',1,'openvdb::v3_2_0::tree::RootNode::getNodes(ArrayT &array) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a33a3cd99c0b9c78e1f6da3d9a36fdaff',1,'openvdb::v3_2_0::tree::Tree::getNodes(ArrayT &array)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ab4dda98f1a46783cb8638ef4a17462c0',1,'openvdb::v3_2_0::tree::Tree::getNodes(ArrayT &array) const ']]], + ['getnormcount',['getNormCount',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#a5096d7f4d64f4c6f6ad30d743b0df19f',1,'openvdb::v3_2_0::tools::LevelSetAdvection::getNormCount()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a5096d7f4d64f4c6f6ad30d743b0df19f',1,'openvdb::v3_2_0::tools::LevelSetMorphing::getNormCount()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a5096d7f4d64f4c6f6ad30d743b0df19f',1,'openvdb::v3_2_0::tools::LevelSetTracker::getNormCount()']]], + ['getorigin',['getOrigin',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#abd5800af661d982b2581c631edd0f79b',1,'openvdb::v3_2_0::tree::LeafNode::getOrigin(Coord &origin) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a4bffbac0d66dc1f0d7f2932f8c1dc325',1,'openvdb::v3_2_0::tree::LeafNode::getOrigin(Int32 &x, Int32 &y, Int32 &z) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#abd5800af661d982b2581c631edd0f79b',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getOrigin(Coord &origin) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a4bffbac0d66dc1f0d7f2932f8c1dc325',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getOrigin(Int32 &x, Int32 &y, Int32 &z) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#abd5800af661d982b2581c631edd0f79b',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getOrigin(Coord &origin) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a4bffbac0d66dc1f0d7f2932f8c1dc325',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getOrigin(Int32 &x, Int32 &y, Int32 &z) const ']]], + ['getparentnode',['getParentNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#ac3896c3a5f58724c4f984e4489ef76fa',1,'openvdb::v3_2_0::tree::IteratorBase']]], + ['getpointcount',['getPointCount',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#a5278f3d735349b46445b8d4fd153b763',1,'openvdb::v3_2_0::tools::BasePointScatter']]], + ['getpointpervolume',['getPointPerVolume',['../classopenvdb_1_1v3__2__0_1_1tools_1_1NonUniformPointScatter.html#a940acbc8525f26d3329d67f32cdb4f6b',1,'openvdb::v3_2_0::tools::NonUniformPointScatter']]], + ['getpointspervolume',['getPointsPerVolume',['../classopenvdb_1_1v3__2__0_1_1tools_1_1UniformPointScatter.html#a7b05344bec352d128edf511b5422e047',1,'openvdb::v3_2_0::tools::UniformPointScatter']]], + ['getpointspervoxel',['getPointsPerVoxel',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseUniformPointScatter.html#ab4c56ef7477069b8b3298f08e5a90aea',1,'openvdb::v3_2_0::tools::DenseUniformPointScatter']]], + ['getpos',['getPos',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#a0c5707538b184775116ed2886c960796',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray']]], + ['getprefixsum',['getPreFixSum',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#ab7db47976e73723845361ce09ed5f268',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['getpyobjectfromgrid',['getPyObjectFromGrid',['../namespacepyopenvdb.html#ae7acf28e936f8122699258c2ca447aca',1,'pyopenvdb']]], + ['getradius',['getRadius',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#ae9f9f3172ab506047b3cbc7a29e90f8d',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray']]], + ['getrand',['getRand',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#af9fba543c2483ae7347ab024654d029d',1,'openvdb::v3_2_0::tools::BasePointScatter']]], + ['getrange',['getRange',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a382a2616845396316bfdc4e92bd9468d',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['getray',['getRay',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#a5b2610625050c4704a8021df68110948',1,'openvdb::v3_2_0::tools::BaseCamera::getRay()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PerspectiveCamera.html#a8765ea5f6fbf529dbbe7f585cbf2556c',1,'openvdb::v3_2_0::tools::PerspectiveCamera::getRay()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1OrthographicCamera.html#a8765ea5f6fbf529dbbe7f585cbf2556c',1,'openvdb::v3_2_0::tools::OrthographicCamera::getRay()']]], + ['getrmax',['getRmax',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a87b930615033fc53057d556a68383cb0',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['getrmin',['getRmin',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a1ff8f3e9678183f7024ed0a7ea00bb02',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['getroweditor',['getRowEditor',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a40a49b6e7da4381c1c08bce14737fbb9',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix']]], + ['getscale',['getScale',['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a9b0ef01b258f1949fc5c2ebf2eed34d1',1,'openvdb::v3_2_0::math::ScaleMap::getScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a9b0ef01b258f1949fc5c2ebf2eed34d1',1,'openvdb::v3_2_0::math::ScaleTranslateMap::getScale()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7bb0b9c0f7abe47f994924b5a28341e4',1,'openvdb::v3_2_0::math::getScale()']]], + ['getsize',['getSize',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#ac73aa16a11a258ce5b821c7ee1767a08',1,'openvdb::v3_2_0::io::File']]], + ['getspatialscheme',['getSpatialScheme',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#a36a2c53fd97763a9f32cf8e0133ce5c4',1,'openvdb::v3_2_0::tools::LevelSetAdvection::getSpatialScheme()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a36a2c53fd97763a9f32cf8e0133ce5c4',1,'openvdb::v3_2_0::tools::LevelSetMorphing::getSpatialScheme()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a36a2c53fd97763a9f32cf8e0133ce5c4',1,'openvdb::v3_2_0::tools::LevelSetTracker::getSpatialScheme()']]], + ['getstart',['getStart',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a75e19799bfa09d93a57a027ac0c78b10',1,'openvdb::v3_2_0::math::CoordBBox']]], + ['getstate',['getState',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a6fb17d112cc5d64d4d25721f9ddfb9ba',1,'openvdb::v3_2_0::tools::LevelSetTracker']]], + ['getstatsmetadata',['getStatsMetadata',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#aa5dcf695fe75a1b3049d264b06f1bd0a',1,'openvdb::v3_2_0::GridBase']]], + ['getstreammetadataptr',['getStreamMetadataPtr',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#ae66d09e2cc80cacb03d2b9e3a74a1558',1,'openvdb::v3_2_0::io']]], + ['getsubsteps',['getSubSteps',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#a7a9cced028d06825da35e35229a201f1',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['gettable',['getTable',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aa5a55c00aec3e358c7bb3441d575e445',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['gettablesize',['getTableSize',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a090c046211c122ce4bba72d102f578e7',1,'openvdb::v3_2_0::tree::RootNode']]], + ['gettaper',['getTaper',['../classopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1LegacyFrustum.html#a4066082b7d002cfae1d6fefc176bb321',1,'openvdb::v3_2_0::math::internal::LegacyFrustum::getTaper()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a4066082b7d002cfae1d6fefc176bb321',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::getTaper()']]], + ['gettargetpointcount',['getTargetPointCount',['../classopenvdb_1_1v3__2__0_1_1tools_1_1UniformPointScatter.html#a9d4282ccd2eaefcf7f40ff5724db024b',1,'openvdb::v3_2_0::tools::UniformPointScatter']]], + ['gettemporalscheme',['getTemporalScheme',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#acc13f45d8dd438281c6b37232ad99ad6',1,'openvdb::v3_2_0::tools::LevelSetAdvection::getTemporalScheme()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#acc13f45d8dd438281c6b37232ad99ad6',1,'openvdb::v3_2_0::tools::LevelSetMorphing::getTemporalScheme()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#acc13f45d8dd438281c6b37232ad99ad6',1,'openvdb::v3_2_0::tools::LevelSetTracker::getTemporalScheme()']]], + ['getthreaded',['getThreaded',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#ad491455f3e592d52290c59d108710e92',1,'openvdb::v3_2_0::tools::PointAdvect::getThreaded()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#ad491455f3e592d52290c59d108710e92',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect::getThreaded()']]], + ['gettrackerspatialscheme',['getTrackerSpatialScheme',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#a38fbb965847966032775c4575c22a958',1,'openvdb::v3_2_0::tools::LevelSetAdvection::getTrackerSpatialScheme()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a38fbb965847966032775c4575c22a958',1,'openvdb::v3_2_0::tools::LevelSetMorphing::getTrackerSpatialScheme()']]], + ['gettrackertemporalscheme',['getTrackerTemporalScheme',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#ad85a131b99465ed76f18ed4b4b063d97',1,'openvdb::v3_2_0::tools::LevelSetAdvection::getTrackerTemporalScheme()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#ad85a131b99465ed76f18ed4b4b063d97',1,'openvdb::v3_2_0::tools::LevelSetMorphing::getTrackerTemporalScheme()']]], + ['gettransform',['getTransform',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer.html#ad252684d388fc541ad3bce330b205c76',1,'openvdb::v3_2_0::tools::GridTransformer']]], + ['gettranslation',['getTranslation',['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a610bd6689ede522319c472d001060a1e',1,'openvdb::v3_2_0::math::TranslationMap::getTranslation()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a610bd6689ede522319c472d001060a1e',1,'openvdb::v3_2_0::math::ScaleTranslateMap::getTranslation()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#af94576a217cee27acbd0a5da6663a7db',1,'openvdb::v3_2_0::math::Mat4::getTranslation()']]], + ['gettree',['getTree',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#af80a26f37ca4b9105ef041ad19760951',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::getTree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#af80a26f37ca4b9105ef041ad19760951',1,'openvdb::v3_2_0::tree::NodeIteratorBase::getTree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#af80a26f37ca4b9105ef041ad19760951',1,'openvdb::v3_2_0::tree::LeafIteratorBase::getTree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html#a6b1734bdff67bbb51f405bb905567ea8',1,'openvdb::v3_2_0::tree::ValueAccessorBase::getTree()']]], + ['getuniquetag',['getUniqueTag',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a86fda16f86d137be89d3c7cd593557a1',1,'openvdb::v3_2_0::io::Archive']]], + ['getunsafeaccessor',['getUnsafeAccessor',['../classopenvdb_1_1v3__2__0_1_1Grid.html#ac081a7d2b59c6c0e36adbad25cc33b58',1,'openvdb::v3_2_0::Grid']]], + ['getval',['GetVal',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1GetVal.html',1,'openvdb::v3_2_0::tools::stats_internal']]], + ['getvalidpointindexgrid',['getValidPointIndexGrid',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ab2dc20cbb018eddb5d26c53bf8cf83ab',1,'openvdb::v3_2_0::tools::getValidPointIndexGrid(const PointArrayT &points, const typename GridT::ConstPtr &grid)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#afb27ad923a88ee58220750ffc3914c03',1,'openvdb::v3_2_0::tools::getValidPointIndexGrid(const PointArrayT &points, const typename GridT::Ptr &grid)']]], + ['getvalidtypedmetadata',['getValidTypedMetadata',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a0a784970481efce26bfeaaf774570179',1,'openvdb::v3_2_0::MetaMap']]], + ['getvalimpl',['GetValImpl',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1GetValImpl.html',1,'openvdb::v3_2_0::tools::stats_internal']]], + ['getvalimpl_3c_20t_2c_20false_20_3e',['GetValImpl< T, false >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1GetValImpl_3_01T_00_01false_01_4.html',1,'openvdb::v3_2_0::tools::stats_internal']]], + ['getvalimpl_3c_20t_2c_20true_20_3e',['GetValImpl< T, true >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1GetValImpl_3_01T_00_01true_01_4.html',1,'openvdb::v3_2_0::tools::stats_internal']]], + ['getvalue',['getValue',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1StatsOp.html#a9e5447b81a174353f70817eaa64e4dfd',1,'openvdb::v3_2_0::tools::stats_internal::StatsOp::getValue()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1HistOp.html#a9e5447b81a174353f70817eaa64e4dfd',1,'openvdb::v3_2_0::tools::stats_internal::HistOp::getValue()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a955d9f0d72df8f19b9e726d04f6cbde6',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::getValue()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#aec69ec0455d4c4bda1c5948b9aa77a30',1,'openvdb::v3_2_0::math::BaseStencil::getValue(unsigned int pos=0) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a87bdcdb34217606521abfd489366b8dd',1,'openvdb::v3_2_0::math::BaseStencil::getValue() const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a301e0897c55855c7c971026743ab1d8a',1,'openvdb::v3_2_0::tools::Dense::getValue(size_t offset) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#aec4a56843adb18db943302378078442d',1,'openvdb::v3_2_0::tools::Dense::getValue(size_t offset)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a14b2ae90c5a4b7b815b98880d82aebbf',1,'openvdb::v3_2_0::tools::Dense::getValue(size_t i, size_t j, size_t k) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a9d96c1dac17b42a9b6ff4f3038729f7b',1,'openvdb::v3_2_0::tools::Dense::getValue(size_t i, size_t j, size_t k)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a1a288f80713bceffbe22f1a6620005dc',1,'openvdb::v3_2_0::tools::Dense::getValue(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a9ef7d44a9fd584407a1e969f3d2a9095',1,'openvdb::v3_2_0::tools::Dense::getValue(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a8ce49c1d01fb40115f7253b65dd98a38',1,'openvdb::v3_2_0::tree::InternalNode::getValue()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#a4da7f94e166daff868d33e698dde2507',1,'openvdb::v3_2_0::tree::SparseIteratorBase::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#a8ae956e9d4ceab35d332d85a2536eee3',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::getValue()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueIter.html#a69801b36294ef986a12c7b7df259475e',1,'openvdb::v3_2_0::tree::LeafNode::ValueIter::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a5aeaf69e0840568789e7fd65f3c59052',1,'openvdb::v3_2_0::tree::LeafNode::getValue(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a525333c1fa4eb845ef57df546aaf24af',1,'openvdb::v3_2_0::tree::LeafNode::getValue(Index offset) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a21e47f18e1fed0e1d02bfe37ffcf1b2f',1,'openvdb::v3_2_0::tree::LeafNode::getValue(const Coord &xyz, bool &state, int &level, AccessorT &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#a6c222225e15cf8dbde30aefc26ce6d6c',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ae3ed6a133109387b8f84ce43e68f1f2f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getValue(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a4d506a6ce7255e5679976d0cc8810396',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getValue(Index offset) const '],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ValueIter.html#a5864ed733b82c49c55aecb6f1ddac125',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#a6c222225e15cf8dbde30aefc26ce6d6c',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ae3ed6a133109387b8f84ce43e68f1f2f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getValue(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a4d506a6ce7255e5679976d0cc8810396',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getValue(Index offset) const '],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ValueIter.html#a5864ed733b82c49c55aecb6f1ddac125',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01false_00_01ValueT_00_01ChildT_01_4.html#a80729523e387a923f51e5ddb8f4fa8e4',1,'openvdb::v3_2_0::tree::NodeUnionImpl< false, ValueT, ChildT >::getValue() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01false_00_01ValueT_00_01ChildT_01_4.html#a12195c4c236686bbb41c2e0c02046a6a',1,'openvdb::v3_2_0::tree::NodeUnionImpl< false, ValueT, ChildT >::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01true_00_01ValueT_00_01ChildT_01_4.html#a80729523e387a923f51e5ddb8f4fa8e4',1,'openvdb::v3_2_0::tree::NodeUnionImpl< true, ValueT, ChildT >::getValue() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01true_00_01ValueT_00_01ChildT_01_4.html#a12195c4c236686bbb41c2e0c02046a6a',1,'openvdb::v3_2_0::tree::NodeUnionImpl< true, ValueT, ChildT >::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a8ce49c1d01fb40115f7253b65dd98a38',1,'openvdb::v3_2_0::tree::RootNode::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ac5110ef8248d5f0510bc583de349c196',1,'openvdb::v3_2_0::tree::Tree::getValue(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a9f8e9219c54ef1cfb85cf5a61b017bdb',1,'openvdb::v3_2_0::tree::Tree::getValue(const Coord &xyz, AccessT &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#aab0a07da66dc2bce72a1e44a3f9f4d03',1,'openvdb::v3_2_0::tree::IterListItem::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#aab0a07da66dc2bce72a1e44a3f9f4d03',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#aab0a07da66dc2bce72a1e44a3f9f4d03',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a80729523e387a923f51e5ddb8f4fa8e4',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#aa0cec1da633233009e933bb56b1ec345',1,'openvdb::v3_2_0::tree::ValueAccessor::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a810a5ea5b20ddb7b0720ee23ec15c3c7',1,'openvdb::v3_2_0::tree::CacheItem::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a810a5ea5b20ddb7b0720ee23ec15c3c7',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#aa0cec1da633233009e933bb56b1ec345',1,'openvdb::v3_2_0::tree::ValueAccessor0::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#aa0cec1da633233009e933bb56b1ec345',1,'openvdb::v3_2_0::tree::ValueAccessor1::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#aa0cec1da633233009e933bb56b1ec345',1,'openvdb::v3_2_0::tree::ValueAccessor2::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#aa0cec1da633233009e933bb56b1ec345',1,'openvdb::v3_2_0::tree::ValueAccessor3::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a874ad8bd0d611f2bc80f76e3a029dd9f',1,'openvdb::v3_2_0::tree::Tree::getValue()']]], + ['getvalueandcache',['getValueAndCache',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ab54f367109416043c0ce7d175be04c21',1,'openvdb::v3_2_0::tree::InternalNode::getValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ab54f367109416043c0ce7d175be04c21',1,'openvdb::v3_2_0::tree::LeafNode::getValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#afef6999fb485a52a9ed2fb9e530a3113',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#afef6999fb485a52a9ed2fb9e530a3113',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ab54f367109416043c0ce7d175be04c21',1,'openvdb::v3_2_0::tree::RootNode::getValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a21c08c3d36ba7fe64cc4861fe4b4cae0',1,'openvdb::v3_2_0::tree::InternalNode::getValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a21c08c3d36ba7fe64cc4861fe4b4cae0',1,'openvdb::v3_2_0::tree::RootNode::getValueAndCache()']]], + ['getvaluedepth',['getValueDepth',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#adabe21e6eb918bee1d29c161c6ce03ae',1,'openvdb::v3_2_0::tree::RootNode::getValueDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#adabe21e6eb918bee1d29c161c6ce03ae',1,'openvdb::v3_2_0::tree::Tree::getValueDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#adabe21e6eb918bee1d29c161c6ce03ae',1,'openvdb::v3_2_0::tree::ValueAccessor::getValueDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a6d2c684a7324c1db0421af43e79c841e',1,'openvdb::v3_2_0::tree::CacheItem::getValueDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a6d2c684a7324c1db0421af43e79c841e',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::getValueDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#adabe21e6eb918bee1d29c161c6ce03ae',1,'openvdb::v3_2_0::tree::ValueAccessor0::getValueDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#adabe21e6eb918bee1d29c161c6ce03ae',1,'openvdb::v3_2_0::tree::ValueAccessor1::getValueDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#adabe21e6eb918bee1d29c161c6ce03ae',1,'openvdb::v3_2_0::tree::ValueAccessor2::getValueDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#adabe21e6eb918bee1d29c161c6ce03ae',1,'openvdb::v3_2_0::tree::ValueAccessor3::getValueDepth()']]], + ['getvaluedepthandcache',['getValueDepthAndCache',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a0df3d050e327bad074c288d65bf7e4d8',1,'openvdb::v3_2_0::tree::RootNode']]], + ['getvaluelevel',['getValueLevel',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a619e96c166b4b5e8528f70d03318b940',1,'openvdb::v3_2_0::tree::InternalNode::getValueLevel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a5b4a63a1f71f21814f0eb7e34aae3d32',1,'openvdb::v3_2_0::tree::LeafNode::getValueLevel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a5b4a63a1f71f21814f0eb7e34aae3d32',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getValueLevel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a5b4a63a1f71f21814f0eb7e34aae3d32',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getValueLevel()']]], + ['getvaluelevelandcache',['getValueLevelAndCache',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a7d6b11a975fc78c2ea13585256b5b720',1,'openvdb::v3_2_0::tree::InternalNode::getValueLevelAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a672670a1b80aa035e8fe6a4f430345fb',1,'openvdb::v3_2_0::tree::LeafNode::getValueLevelAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a672670a1b80aa035e8fe6a4f430345fb',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getValueLevelAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a672670a1b80aa035e8fe6a4f430345fb',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getValueLevelAndCache()']]], + ['getvaluemask',['getValueMask',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a871b0c9de5a073d114847267e9c22850',1,'openvdb::v3_2_0::tree::InternalNode::getValueMask()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a871b0c9de5a073d114847267e9c22850',1,'openvdb::v3_2_0::tree::LeafNode::getValueMask() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a787149174c0a4eac7dd3f775dece909f',1,'openvdb::v3_2_0::tree::LeafNode::getValueMask()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a871b0c9de5a073d114847267e9c22850',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getValueMask() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a787149174c0a4eac7dd3f775dece909f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getValueMask()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a871b0c9de5a073d114847267e9c22850',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getValueMask() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a787149174c0a4eac7dd3f775dece909f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getValueMask()']]], + ['getvalueoffmask',['getValueOffMask',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#af34978c95b6c2f2975f3fb4d1115001c',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['getvalues',['getValues',['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html#a1c92e48b02976ee0c3d2dc40fadd19c0',1,'openvdb::v3_2_0::tools::BoxSampler']]], + ['getvec3',['getVec3',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#acdada9207e49b97f588c95f6ef554345',1,'openvdb::v3_2_0::math::Vec4']]], + ['getvectortype',['getVectorType',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a712e19d955d5da30b0d33973957dad4e',1,'openvdb::v3_2_0::GridBase']]], + ['getversion',['getVersion',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a61a6fadd20351b5f960099023c965920',1,'openvdb::v3_2_0::io']]], + ['getvoxelcount',['getVoxelCount',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#ac1f18d5e3a62864691c77290e0c90fbe',1,'openvdb::v3_2_0::tools::BasePointScatter::getVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a9474c55e928237bcc461b0bf4bf9f837',1,'openvdb::v3_2_0::tree::IterListItem::getVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a9474c55e928237bcc461b0bf4bf9f837',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::getVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a9474c55e928237bcc461b0bf4bf9f837',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::getVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#ac1f18d5e3a62864691c77290e0c90fbe',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::getVoxelCount()']]], + ['getvoxelsize',['getVoxelSize',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a40830c3e0d340c47f13c0bc3cc3f9f79',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['getwidth',['getWidth',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ad5917a5c4d6b84e2f083a5db8c004277',1,'openvdb::v3_2_0::tree::RootNode']]], + ['getword',['getWord',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#aa92778e86ea935c802b1b01385c69135',1,'openvdb::v3_2_0::util::NodeMask::getWord(Index n) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a418cb8bf723cf33d626d35da428816ac',1,'openvdb::v3_2_0::util::NodeMask::getWord(Index n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#aa92778e86ea935c802b1b01385c69135',1,'openvdb::v3_2_0::util::NodeMask< 2 >::getWord(Index n) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a418cb8bf723cf33d626d35da428816ac',1,'openvdb::v3_2_0::util::NodeMask< 2 >::getWord(Index n)']]], + ['getworldpos',['getWorldPos',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a3392131e9d7a2bbf5e7a695e33ee2d91',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::getWorldPos()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#a9117c95627bdd35cb219e2cd972ec951',1,'openvdb::v3_2_0::tools::LinearSearchImpl::getWorldPos()']]], + ['getworldposandnml',['getWorldPosAndNml',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#aabb87a1d0fcf93a240c8469ae4204e9e',1,'openvdb::v3_2_0::tools::LinearSearchImpl']]], + ['getworldtime',['getWorldTime',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#af76bbfbdaff178376dfa4765669c41e3',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::getWorldTime()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#aa00b5a54e71010f07cdc4d015b5544aa',1,'openvdb::v3_2_0::tools::LinearSearchImpl::getWorldTime()']]], + ['getwritegridstatsmetadata',['getWriteGridStatsMetadata',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a89120b20ae3e828b3cb9d3f81e9d18c7',1,'openvdb::v3_2_0::io']]], + ['godunovsnormsqrd',['GodunovsNormSqrd',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1d1a8e9d5cc2dbbd6f89104252ec6895',1,'openvdb::v3_2_0::math::GodunovsNormSqrd(bool isOutside, Real dP_xm, Real dP_xp, Real dP_ym, Real dP_yp, Real dP_zm, Real dP_zp)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a564490213c1905b6ddfead93d9859a59',1,'openvdb::v3_2_0::math::GodunovsNormSqrd(bool isOutside, const Vec3< Real > &gradient_m, const Vec3< Real > &gradient_p)']]], + ['gradient',['Gradient',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Gradient.html#aca732c8efffe7d95e2aae8a219e4216b',1,'openvdb::v3_2_0::tools::Gradient::Gradient(const InGridT &grid, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Gradient.html#a2f222e5a5bd21c54f288bd9c68eb89eb',1,'openvdb::v3_2_0::tools::Gradient::Gradient(const InGridT &grid, const MaskGridType &mask, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BoxStencil.html#a5cc53cf415681b31da70c6b71d338f53',1,'openvdb::v3_2_0::math::BoxStencil::gradient()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#aab1aa12daff05d81deb813a4945bca7b',1,'openvdb::v3_2_0::math::GradStencil::gradient() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#ac1c46e1ba97105584232852187cabc2e',1,'openvdb::v3_2_0::math::GradStencil::gradient(const math::Vec3< ValueType > &V) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html#ac1c46e1ba97105584232852187cabc2e',1,'openvdb::v3_2_0::math::WenoStencil::gradient(const math::Vec3< ValueType > &V) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html#aab1aa12daff05d81deb813a4945bca7b',1,'openvdb::v3_2_0::math::WenoStencil::gradient() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1CurvatureStencil.html#ac9ca317cb7e25ec412adf16c051d0ab3',1,'openvdb::v3_2_0::math::CurvatureStencil::gradient()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a61d4d89cd34db1794e9a615dec11dc0f',1,'openvdb::v3_2_0::tools::gradient(const GridType &grid, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8cad07124b4f4d6a7b15021ee86b2c2f',1,'openvdb::v3_2_0::tools::gradient(const GridType &grid, const MaskT &mask, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ae44852bae3cbc2e448bc3698ddf5d3be',1,'openvdb::v3_2_0::tools::gradient(const GridType &grid, bool threaded=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aa78762a73e1d224c7e9848e91e7802cf',1,'openvdb::v3_2_0::tools::gradient(const GridType &grid, const MaskT &mask, bool threaded=true)']]], + ['gradient',['Gradient',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Gradient.html',1,'openvdb::v3_2_0::tools']]], + ['gradient',['Gradient',['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient.html',1,'openvdb::v3_2_0::math']]], + ['gradient_3c_20scalemap_2c_20cd_5f2nd_20_3e',['Gradient< ScaleMap, CD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01ScaleMap_00_01CD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['gradient_3c_20scaletranslatemap_2c_20cd_5f2nd_20_3e',['Gradient< ScaleTranslateMap, CD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01ScaleTranslateMap_00_01CD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['gradient_3c_20translationmap_2c_20diffscheme_20_3e',['Gradient< TranslationMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01TranslationMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['gradient_3c_20uniformscalemap_2c_20cd_5f2nd_20_3e',['Gradient< UniformScaleMap, CD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01UniformScaleMap_00_01CD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['gradient_3c_20uniformscaletranslatemap_2c_20cd_5f2nd_20_3e',['Gradient< UniformScaleTranslateMap, CD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01UniformScaleTranslateMap_00_01CD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['gradientbiased',['GradientBiased',['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientBiased.html',1,'openvdb::v3_2_0::math']]], + ['gradientnormsqrd',['GradientNormSqrd',['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientNormSqrd.html',1,'openvdb::v3_2_0::math']]], + ['gradientnormsqrd_3c_20uniformscalemap_2c_20gradscheme_20_3e',['GradientNormSqrd< UniformScaleMap, GradScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientNormSqrd_3_01UniformScaleMap_00_01GradScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['gradientnormsqrd_3c_20uniformscaletranslatemap_2c_20gradscheme_20_3e',['GradientNormSqrd< UniformScaleTranslateMap, GradScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientNormSqrd_3_01UniformScaleTranslateMap_00_01GradScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['gradstencil',['GradStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html',1,'openvdb::v3_2_0::math']]], + ['gradstencil',['GradStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#a1f44c9b2a5dfbaaf203f4f795c927b9c',1,'openvdb::v3_2_0::math::GradStencil::GradStencil(const GridType &grid)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#a5b2014c1a1f2909eaa7d38388199a3fc',1,'openvdb::v3_2_0::math::GradStencil::GradStencil(const GridType &grid, Real dx)']]], + ['grainsize',['grainsize',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange.html#ad205489cfd791e06529aaf6c71db2d0a',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::grainsize()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange.html#ad205489cfd791e06529aaf6c71db2d0a',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::grainsize()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker_1_1State.html#a887606cb7c0d8e19afb1a67ac7293519',1,'openvdb::v3_2_0::tools::LevelSetTracker::State::grainSize()']]], + ['greatercount',['GreaterCount',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GreaterCount.html#a1edb3ba65734c535f51577120c5bd7ed',1,'openvdb::v3_2_0::tools::level_set_util_internal::GreaterCount']]], + ['greatercount',['GreaterCount',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GreaterCount.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['grid',['Grid',['../classopenvdb_1_1v3__2__0_1_1Grid.html',1,'openvdb::v3_2_0']]], + ['grid',['grid',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a1666446787c50aed7382010f17fd13df',1,'openvdb::v3_2_0::GridBase::grid(const GridBase::Ptr &)'],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a6993ac9a172f36973252d9c307f02d3e',1,'openvdb::v3_2_0::GridBase::grid(const GridBase::ConstPtr &)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a1b2f1b64cb2d797bdf36630f3e7add6e',1,'openvdb::v3_2_0::math::BaseStencil::grid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Diagnose.html#a73ed2c1f6ada573a8cef388792bf0af3',1,'openvdb::v3_2_0::tools::Diagnose::grid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#a1b2f1b64cb2d797bdf36630f3e7add6e',1,'openvdb::v3_2_0::tools::CheckLevelSet::grid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#a1b2f1b64cb2d797bdf36630f3e7add6e',1,'openvdb::v3_2_0::tools::CheckFogVolume::grid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a1b2f1b64cb2d797bdf36630f3e7add6e',1,'openvdb::v3_2_0::tools::LevelSetTracker::grid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a3aaab5ff6af1b5281feae6a3456310bc',1,'openvdb::v3_2_0::tools::MultiResGrid::grid(size_t level)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a9dcb555d35b308baaa79305470a7a84b',1,'openvdb::v3_2_0::tools::MultiResGrid::grid(size_t level) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a73ed2c1f6ada573a8cef388792bf0af3',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::grid()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a0a335d0339fe70071fcdf4cd5b1c7b5f',1,'openvdb::v3_2_0::Grid::Grid()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a56ebe5c92d33d71db57af3388d89a735',1,'openvdb::v3_2_0::Grid::Grid(const ValueType &background)'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#ac4470288a753c565478770d36d0db78c',1,'openvdb::v3_2_0::Grid::Grid(TreePtrType)'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a29b6c8c5166cc03ca82a082d1f357c44',1,'openvdb::v3_2_0::Grid::Grid(const Grid &)'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#aff94355411f5d40e863ac37ace513d65',1,'openvdb::v3_2_0::Grid::Grid(const Grid< OtherTreeType > &)'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#aa60df5f469b02c475a29de3a573f0f05',1,'openvdb::v3_2_0::Grid::Grid(const Grid &, ShallowCopy)'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#af01f7b8cbc4a58c9cce9d51e374e93ef',1,'openvdb::v3_2_0::Grid::Grid(const GridBase &)']]], + ['grid_2eh',['Grid.h',['../Grid_8h.html',1,'']]], + ['grid_5ffog_5fvolume',['GRID_FOG_VOLUME',['../namespaceopenvdb_1_1v3__2__0.html#a511a7f5bd868162ec06bcc20b98e160ea4a2fa6a6ee2b5e2b2fcea1a6453cfce6',1,'openvdb::v3_2_0']]], + ['grid_5flevel_5fset',['GRID_LEVEL_SET',['../namespaceopenvdb_1_1v3__2__0.html#a511a7f5bd868162ec06bcc20b98e160eac12b83a53c9998ec7823ba0ac9c1521d',1,'openvdb::v3_2_0']]], + ['grid_5fstaggered',['GRID_STAGGERED',['../namespaceopenvdb_1_1v3__2__0.html#a511a7f5bd868162ec06bcc20b98e160ea95aec24941c3113a94a141564b794b0e',1,'openvdb::v3_2_0']]], + ['grid_5funknown',['GRID_UNKNOWN',['../namespaceopenvdb_1_1v3__2__0.html#a511a7f5bd868162ec06bcc20b98e160eaf30a448e257803777038162b80e87343',1,'openvdb::v3_2_0']]], + ['gridbase',['GridBase',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#aed48996d8c157228a7b40ff5f3a9da7c',1,'openvdb::v3_2_0::GridBase::GridBase()'],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#aae8eac5e78d057219029b04d05f12dbd',1,'openvdb::v3_2_0::GridBase::GridBase(const GridBase &other)'],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a2089e3e0bd581d988fc0c27fa71188f5',1,'openvdb::v3_2_0::GridBase::GridBase(const GridBase &other, ShallowCopy)']]], + ['gridbase',['GridBase',['../classopenvdb_1_1v3__2__0_1_1GridBase.html',1,'openvdb::v3_2_0']]], + ['gridclass',['gridClass',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a307d448024e0dd940a06426c10646802',1,'openvdb::v3_2_0::io::StreamMetadata::gridClass()'],['../namespaceopenvdb_1_1v3__2__0.html#a511a7f5bd868162ec06bcc20b98e160e',1,'openvdb::v3_2_0::GridClass()']]], + ['gridclasstomenuname',['gridClassToMenuName',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a235f104d43761fdf4a92425ba82c1e1d',1,'openvdb::v3_2_0::GridBase']]], + ['gridclasstostring',['gridClassToString',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ac5ba27730c606524a3f91ad68081cfcf',1,'openvdb::v3_2_0::GridBase']]], + ['gridconstptrcast',['gridConstPtrCast',['../namespaceopenvdb_1_1v3__2__0.html#a287097021b14622d7769423852a947c9',1,'openvdb::v3_2_0']]], + ['gridcptrset',['GridCPtrSet',['../namespaceopenvdb_1_1v3__2__0.html#a58e8d497e45c257c18ef5ac5e3319803',1,'openvdb::v3_2_0']]], + ['gridcptrsetciter',['GridCPtrSetCIter',['../namespaceopenvdb_1_1v3__2__0.html#a47e84bca5432ffcd6495610eefccc57c',1,'openvdb::v3_2_0']]], + ['gridcptrsetiter',['GridCPtrSetIter',['../namespaceopenvdb_1_1v3__2__0.html#a32e99c711aece059837de901a307d5ae',1,'openvdb::v3_2_0']]], + ['gridcptrsetptr',['GridCPtrSetPtr',['../namespaceopenvdb_1_1v3__2__0.html#ad24fd8265701e20e43cb2b4ab7e2c811',1,'openvdb::v3_2_0']]], + ['gridcptrvec',['GridCPtrVec',['../namespaceopenvdb_1_1v3__2__0.html#ad0216534109af5570eb86ec930177b26',1,'openvdb::v3_2_0']]], + ['gridcptrvecciter',['GridCPtrVecCIter',['../namespaceopenvdb_1_1v3__2__0.html#a1fb8555e0a11165cc329c69f2e7032da',1,'openvdb::v3_2_0']]], + ['gridcptrveciter',['GridCPtrVecIter',['../namespaceopenvdb_1_1v3__2__0.html#ac5f3554828a9c96835919964266886d3',1,'openvdb::v3_2_0']]], + ['gridcptrvecptr',['GridCPtrVecPtr',['../namespaceopenvdb_1_1v3__2__0.html#a13ea4dcb7bce9fb63d58725e2f96de6e',1,'openvdb::v3_2_0']]], + ['griddescriptor',['GridDescriptor',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html',1,'openvdb::v3_2_0::io']]], + ['griddescriptor',['GridDescriptor',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a12a9c143f6a0d4a79df394f8b4a4a821',1,'openvdb::v3_2_0::io::GridDescriptor::GridDescriptor()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#aab9576ad918d38c7fb838971d9a197a3',1,'openvdb::v3_2_0::io::GridDescriptor::GridDescriptor(const Name &name, const Name &gridType, bool saveFloatAsHalf=false)']]], + ['griddescriptor_2eh',['GridDescriptor.h',['../GridDescriptor_8h.html',1,'']]], + ['gridfactory',['GridFactory',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a4b508bf186892235547251c8b87ac477',1,'openvdb::v3_2_0::GridBase']]], + ['gridmetadata',['gridMetadata',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a511a828cb08b4c2dfade710778519afe',1,'openvdb::v3_2_0::io::StreamMetadata::gridMetadata()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a445da0d4500f7e8ca73bf8993917a90c',1,'openvdb::v3_2_0::io::StreamMetadata::gridMetadata() const ']]], + ['gridname',['gridName',['../classopenvdb_1_1v3__2__0_1_1io_1_1File_1_1NameIterator.html#a2f95bb0c721fad8fc2ebf49bf290048b',1,'openvdb::v3_2_0::io::File::NameIterator::gridName()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a04e685e8e4ed0313760abc44de6c213e',1,'openvdb::v3_2_0::io::GridDescriptor::gridName()']]], + ['gridnamepred',['GridNamePred',['../structopenvdb_1_1v3__2__0_1_1GridNamePred.html',1,'openvdb::v3_2_0']]], + ['gridnamepred',['GridNamePred',['../structopenvdb_1_1v3__2__0_1_1GridNamePred.html#a84f5f76b8fd4c8e3bc0ca6e955c2af4c',1,'openvdb::v3_2_0::GridNamePred']]], + ['gridoperator',['GridOperator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html',1,'openvdb::v3_2_0::tools::gridop']]], + ['gridoperator',['GridOperator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html#abeafb0eba65bdadba175251e18fa423c',1,'openvdb::v3_2_0::tools::gridop::GridOperator']]], + ['gridoperators_2eh',['GridOperators.h',['../GridOperators_8h.html',1,'']]], + ['gridortreeconstructor',['GridOrTreeConstructor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['gridortreeconstructor',['GridOrTreeConstructor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1GridOrTreeConstructor.html',1,'openvdb::v3_2_0::tools::composite']]], + ['gridortreeconstructor_3c_20grid_3c_20treetype_20_3e_20_3e',['GridOrTreeConstructor< Grid< TreeType > >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html',1,'openvdb::v3_2_0::tools::composite']]], + ['gridortreeconstructor_3c_20grid_3c_20treetype_20_3e_20_3e',['GridOrTreeConstructor< Grid< TreeType > >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['gridptr',['GridPtr',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a7154089a47c160aaeeeca16ef22e5c02',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['gridptrcast',['gridPtrCast',['../namespaceopenvdb_1_1v3__2__0.html#a012b32cc77cc69acf08420765238268f',1,'openvdb::v3_2_0']]], + ['gridptrlist',['GridPtrList',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFracture.html#a5d6557d0ead726d5702146c5cb5bff24',1,'openvdb::v3_2_0::tools::LevelSetFracture']]], + ['gridptrlistiter',['GridPtrListIter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFracture.html#afd5eb5a3688d2b976daee9c808b4651d',1,'openvdb::v3_2_0::tools::LevelSetFracture']]], + ['gridptrset',['GridPtrSet',['../namespaceopenvdb_1_1v3__2__0.html#ac19af022c6192db3d95418b72ea21629',1,'openvdb::v3_2_0']]], + ['gridptrsetciter',['GridPtrSetCIter',['../namespaceopenvdb_1_1v3__2__0.html#ab4f90e2386d1be1eb3143530b4c001ee',1,'openvdb::v3_2_0']]], + ['gridptrsetiter',['GridPtrSetIter',['../namespaceopenvdb_1_1v3__2__0.html#a87bb6ac69c42c572bd0f5fd0aca49735',1,'openvdb::v3_2_0']]], + ['gridptrsetptr',['GridPtrSetPtr',['../namespaceopenvdb_1_1v3__2__0.html#a9c0ab962974dbd17747f806144120a4a',1,'openvdb::v3_2_0']]], + ['gridptrt',['GridPtrT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1ConvertGrid_3_01GridT_00_01GridT_01_4.html#a13cc009d20e3a508aebbb4b83b5ce0d9',1,'openvdb::v3_2_0::tools::clip_internal::ConvertGrid< GridT, GridT >']]], + ['gridptrtype',['GridPtrType',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a53f5752b0073fe8df274d71dc9349a21',1,'openvdb::v3_2_0::TreeAdapter::GridPtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a53f5752b0073fe8df274d71dc9349a21',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::GridPtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a53f5752b0073fe8df274d71dc9349a21',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::GridPtrType()']]], + ['gridptrvec',['GridPtrVec',['../namespaceopenvdb_1_1v3__2__0.html#aa7853474b8fa140799c730775f891aca',1,'openvdb::v3_2_0']]], + ['gridptrvecciter',['GridPtrVecCIter',['../namespaceopenvdb_1_1v3__2__0.html#acf2522d80b2e4602c2ece93adc66741a',1,'openvdb::v3_2_0']]], + ['gridptrveciter',['GridPtrVecIter',['../namespaceopenvdb_1_1v3__2__0.html#a492eebbb69bb00db9ebb2bf7f2bc24ea',1,'openvdb::v3_2_0']]], + ['gridptrvecptr',['GridPtrVecPtr',['../namespaceopenvdb_1_1v3__2__0.html#aab1ee9f1c00e75f96098bbad7a368bbc',1,'openvdb::v3_2_0']]], + ['gridresampler',['GridResampler',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html#a4604cdfd00f06a224800f3e2bd81ecd3',1,'openvdb::v3_2_0::tools::GridResampler']]], + ['gridresampler',['GridResampler',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html',1,'openvdb::v3_2_0::tools']]], + ['grids',['grids',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a45ccf64b8fbd20b2ea6b50636cddb2bb',1,'openvdb::v3_2_0::tools::MultiResGrid::grids()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#ac581285b1716fe2f77c44c2ac3593817',1,'openvdb::v3_2_0::tools::MultiResGrid::grids() const ']]], + ['gridsampler',['GridSampler',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html',1,'openvdb::v3_2_0::tools']]], + ['gridsampler',['GridSampler',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#a16eef124fcd2054f4acf5454c9fdb40b',1,'openvdb::v3_2_0::tools::GridSampler::GridSampler(const GridType &grid)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#a71aa047334cded4135a83e44cda223fb',1,'openvdb::v3_2_0::tools::GridSampler::GridSampler(const TreeType &tree, const math::Transform &transform)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html#a901a6f116560fc3165cf6d5d66223e03',1,'openvdb::v3_2_0::tools::GridSampler< tree::ValueAccessor< TreeT >, SamplerType >::GridSampler()']]], + ['gridsampler_3c_20tree_3a_3avalueaccessor_3c_20treet_20_3e_2c_20samplertype_20_3e',['GridSampler< tree::ValueAccessor< TreeT >, SamplerType >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['gridtransformer',['GridTransformer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer.html#a52c4494adfd543dc3a0c42b6d899fcbf',1,'openvdb::v3_2_0::tools::GridTransformer::GridTransformer(const Mat4R &xform)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer.html#aeb07b4a35b5c4226b5f9bbfad88e69ac',1,'openvdb::v3_2_0::tools::GridTransformer::GridTransformer(const Vec3R &pivot, const Vec3R &scale, const Vec3R &rotate, const Vec3R &translate, const std::string &xformOrder="tsr", const std::string &rotationOrder="zyx")']]], + ['gridtransformer',['GridTransformer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer.html',1,'openvdb::v3_2_0::tools']]], + ['gridtransformer_2eh',['GridTransformer.h',['../GridTransformer_8h.html',1,'']]], + ['gridtype',['GridType',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#af26705de7d42ddca41212a763a14e3f2',1,'openvdb::v3_2_0::TreeAdapter::GridType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#af26705de7d42ddca41212a763a14e3f2',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::GridType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#af26705de7d42ddca41212a763a14e3f2',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::GridType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::math::BaseStencil::GridType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SevenPointStencil.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::math::SevenPointStencil::GridType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BoxStencil.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::math::BoxStencil::GridType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SecondOrderDenseStencil.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::math::SecondOrderDenseStencil::GridType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ThirteenPointStencil.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::math::ThirteenPointStencil::GridType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1FourthOrderDenseStencil.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::math::FourthOrderDenseStencil::GridType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NineteenPointStencil.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::math::NineteenPointStencil::GridType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SixthOrderDenseStencil.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::math::SixthOrderDenseStencil::GridType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::math::GradStencil::GridType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::math::WenoStencil::GridType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CurvatureStencil.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::math::CurvatureStencil::GridType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DenseStencil.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::math::DenseStencil::GridType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#af26705de7d42ddca41212a763a14e3f2',1,'openvdb::v3_2_0::tools::composite::GridOrTreeConstructor< Grid< TreeType > >::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::tools::Filter::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#ab375735b33e0ba300eb16ee7fae55f6c',1,'openvdb::v3_2_0::tools::GridSampler::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html#af26705de7d42ddca41212a763a14e3f2',1,'openvdb::v3_2_0::tools::GridSampler< tree::ValueAccessor< TreeT >, SamplerType >::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler.html#ae0dec06f780823be22ea63411b6a2c95',1,'openvdb::v3_2_0::tools::DualGridSampler::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerT_01_4.html#af26705de7d42ddca41212a763a14e3f2',1,'openvdb::v3_2_0::tools::DualGridSampler< tree::ValueAccessor< TreeT >, SamplerT >::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::tools::AlphaMask::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::tools::LevelSetAdvection::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::tools::LevelSetFilter::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::tools::LevelSetMeasure::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::tools::LevelSetMorphing::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::tools::LevelSetTracker::GridType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#af26705de7d42ddca41212a763a14e3f2',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor< Grid< TreeType > >::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::tools::PointAdvect::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::tools::LevelSetRayTracer::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#a5a64143640c29aca9fb9700ddf470641',1,'openvdb::v3_2_0::tools::VolumeRender::GridType()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a2038cd8d658443b9fa276bd926896a68',1,'openvdb::v3_2_0::Grid::gridType()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#ae08789a0144d0843ac50f4662d403c43',1,'openvdb::v3_2_0::io::GridDescriptor::gridType()']]], + ['gridtypeptr',['GridTypePtr',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#a1467afe082b516d076b320a662be6473',1,'openvdb::v3_2_0::tools::composite::GridOrTreeConstructor< Grid< TreeType > >::GridTypePtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#a1467afe082b516d076b320a662be6473',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor< Grid< TreeType > >::GridTypePtr()']]], + ['gudonovsnormsqrd',['GudonovsNormSqrd',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aa17b1a41b209410577bdd0fe3fa3ab3c',1,'openvdb::v3_2_0::math::GudonovsNormSqrd(bool isOutside, Real dP_xm, Real dP_xp, Real dP_ym, Real dP_yp, Real dP_zm, Real dP_zp)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a66b2d4b5bbea7693e6185cdf535066a7',1,'openvdb::v3_2_0::math::GudonovsNormSqrd(bool isOutside, const Vec3< Real > &gradient_m, const Vec3< Real > &gradient_p)']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_9.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_9.html new file mode 100644 index 00000000..7e100075 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_9.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_9.js new file mode 100644 index 00000000..a02fdb19 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_9.js @@ -0,0 +1,33 @@ +var searchData= +[ + ['halffloat',['halfFloat',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a96d2f3a5d24393083b81912550f90e9d',1,'openvdb::v3_2_0::io::StreamMetadata']]], + ['halfreader',['HalfReader',['../structopenvdb_1_1v3__2__0_1_1io_1_1HalfReader.html',1,'openvdb::v3_2_0::io']]], + ['halfreader_3c_20false_2c_20t_20_3e',['HalfReader< false, T >',['../structopenvdb_1_1v3__2__0_1_1io_1_1HalfReader_3_01false_00_01T_01_4.html',1,'openvdb::v3_2_0::io']]], + ['halfreader_3c_20true_2c_20t_20_3e',['HalfReader< true, T >',['../structopenvdb_1_1v3__2__0_1_1io_1_1HalfReader_3_01true_00_01T_01_4.html',1,'openvdb::v3_2_0::io']]], + ['halft',['HalfT',['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf.html#a6fdccf6e2530d06f53a17ecd38a8e24c',1,'openvdb::v3_2_0::io::RealToHalf::HalfT()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01float_01_4.html#a9355846cc3d5115dc758973144dca66f',1,'openvdb::v3_2_0::io::RealToHalf< float >::HalfT()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01double_01_4.html#a9355846cc3d5115dc758973144dca66f',1,'openvdb::v3_2_0::io::RealToHalf< double >::HalfT()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec2s_01_4.html#a2d5c491869190c3ed0e47f173c808ed3',1,'openvdb::v3_2_0::io::RealToHalf< Vec2s >::HalfT()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec2d_01_4.html#a2d5c491869190c3ed0e47f173c808ed3',1,'openvdb::v3_2_0::io::RealToHalf< Vec2d >::HalfT()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec3s_01_4.html#ad24f75fc1fb6696a4788706187f38b42',1,'openvdb::v3_2_0::io::RealToHalf< Vec3s >::HalfT()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec3d_01_4.html#ad24f75fc1fb6696a4788706187f38b42',1,'openvdb::v3_2_0::io::RealToHalf< Vec3d >::HalfT()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1HalfReader_3_01true_00_01T_01_4.html#a2547341b2f5b210a1a61c4e6c050d88c',1,'openvdb::v3_2_0::io::HalfReader< true, T >::HalfT()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1HalfWriter_3_01true_00_01T_01_4.html#a2547341b2f5b210a1a61c4e6c050d88c',1,'openvdb::v3_2_0::io::HalfWriter< true, T >::HalfT()']]], + ['halfwriter',['HalfWriter',['../structopenvdb_1_1v3__2__0_1_1io_1_1HalfWriter.html',1,'openvdb::v3_2_0::io']]], + ['halfwriter_3c_20false_2c_20t_20_3e',['HalfWriter< false, T >',['../structopenvdb_1_1v3__2__0_1_1io_1_1HalfWriter_3_01false_00_01T_01_4.html',1,'openvdb::v3_2_0::io']]], + ['halfwriter_3c_20true_2c_20t_20_3e',['HalfWriter< true, T >',['../structopenvdb_1_1v3__2__0_1_1io_1_1HalfWriter_3_01true_00_01T_01_4.html',1,'openvdb::v3_2_0::io']]], + ['hasactivetiles',['hasActiveTiles',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a1e1a133192d9d344c482d4aa83f6da33',1,'openvdb::v3_2_0::tree::InternalNode::hasActiveTiles()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a9d59c5b8e20bf9b62b5f851aaa66517e',1,'openvdb::v3_2_0::tree::LeafNode::hasActiveTiles()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a9d59c5b8e20bf9b62b5f851aaa66517e',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::hasActiveTiles()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a9d59c5b8e20bf9b62b5f851aaa66517e',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::hasActiveTiles()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a1e1a133192d9d344c482d4aa83f6da33',1,'openvdb::v3_2_0::tree::RootNode::hasActiveTiles()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a1e1a133192d9d344c482d4aa83f6da33',1,'openvdb::v3_2_0::tree::Tree::hasActiveTiles()']]], + ['hasblosccompression',['hasBloscCompression',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a29377f90d3c92efd6ce7ff3ec1c10863',1,'openvdb::v3_2_0::io::Archive']]], + ['hascompatiblevaluetype',['hasCompatibleValueType',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a44152640d1b71b1a5eaf192b9018bd53',1,'openvdb::v3_2_0::tree::RootNode']]], + ['hasgrid',['hasGrid',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a1d00183d397d9cfdb1ba97ad0949c511',1,'openvdb::v3_2_0::io::File']]], + ['hasoverlap',['hasOverlap',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a30d3863ef91de19a2a58b24783204949',1,'openvdb::v3_2_0::math::BBox::hasOverlap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a3eaee0f98a62f7e53bc29d5ea2d2a47e',1,'openvdb::v3_2_0::math::CoordBBox::hasOverlap()']]], + ['hassameconfiguration',['hasSameConfiguration',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a0332904c042d4dc9e88136294e048ed0',1,'openvdb::v3_2_0::tree::RootNode']]], + ['hassametopology',['hasSameTopology',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#aa4f3bf4aa119453a9f9189732818b00b',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::hasSameTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a6c323b840e618b6bd5a1e24bc25feeb5',1,'openvdb::v3_2_0::tree::InternalNode::hasSameTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a96f8ad18023d4f7cd56b4e4b117c1148',1,'openvdb::v3_2_0::tree::LeafNode::hasSameTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a96f8ad18023d4f7cd56b4e4b117c1148',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::hasSameTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a96f8ad18023d4f7cd56b4e4b117c1148',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::hasSameTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ad2290c7162c015d83e057eca2dd23dc1',1,'openvdb::v3_2_0::tree::RootNode::hasSameTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ae4fd665aa748fe753c256bbbb6ff31d0',1,'openvdb::v3_2_0::tree::Tree::hasSameTopology()']]], + ['hassimpleaffine',['hasSimpleAffine',['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a205d3857a36b35d4e25791ecf7ed2faa',1,'openvdb::v3_2_0::math::NonlinearFrustumMap']]], + ['hastranslation',['hasTranslation',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a69dc9d0a1827cf2cd4f916dc1579a38d',1,'openvdb::v3_2_0::math']]], + ['hasuniformscale',['hasUniformScale',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#aa2319ba637d52e7b575b29d066880035',1,'openvdb::v3_2_0::math::MapBase::hasUniformScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#ad994319a8ddc55a92eff06e8bbbd16db',1,'openvdb::v3_2_0::math::AffineMap::hasUniformScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#ad994319a8ddc55a92eff06e8bbbd16db',1,'openvdb::v3_2_0::math::ScaleMap::hasUniformScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#ad994319a8ddc55a92eff06e8bbbd16db',1,'openvdb::v3_2_0::math::TranslationMap::hasUniformScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#ad994319a8ddc55a92eff06e8bbbd16db',1,'openvdb::v3_2_0::math::ScaleTranslateMap::hasUniformScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#ad994319a8ddc55a92eff06e8bbbd16db',1,'openvdb::v3_2_0::math::UnitaryMap::hasUniformScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#ad994319a8ddc55a92eff06e8bbbd16db',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::hasUniformScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#ad994319a8ddc55a92eff06e8bbbd16db',1,'openvdb::v3_2_0::math::Transform::hasUniformScale()']]], + ['hasuniformvoxels',['hasUniformVoxels',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#acabf3f247f64b7dcef84c32c8372fc04',1,'openvdb::v3_2_0::GridBase']]], + ['hasvolume',['hasVolume',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#ae8e4d8e4d7040e27e020e09078c9d316',1,'openvdb::v3_2_0::math::BBox::hasVolume()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#ae8e4d8e4d7040e27e020e09078c9d316',1,'openvdb::v3_2_0::math::CoordBBox::hasVolume()']]], + ['height',['height',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Film.html#ac0e3c6ba1d3f8a8e50aa3e3897210a2b',1,'openvdb::v3_2_0::tools::Film::height()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#ac0e3c6ba1d3f8a8e50aa3e3897210a2b',1,'openvdb::v3_2_0::tools::BaseCamera::height()']]], + ['hist',['hist',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1HistOp.html#afdc47db672e1b0d0f2785733f3559fc1',1,'openvdb::v3_2_0::tools::stats_internal::HistOp']]], + ['histogram',['Histogram',['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html#afec707e67d72f4a84b1dd36ab0d4b6ba',1,'openvdb::v3_2_0::math::Histogram::Histogram(double min, double max, size_t numBins=10)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html#a798560d69c85e01cad8d221f8827afdf',1,'openvdb::v3_2_0::math::Histogram::Histogram(const Stats &s, size_t numBins=10)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a705b035d27c69d566009424697c36a65',1,'openvdb::v3_2_0::tools::histogram()']]], + ['histogram',['Histogram',['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html',1,'openvdb::v3_2_0::math']]], + ['histop',['HistOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1HistOp.html',1,'openvdb::v3_2_0::tools::stats_internal']]], + ['histop',['HistOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1HistOp.html#a811e1c863fd3ab8c963a5e04463d020c',1,'openvdb::v3_2_0::tools::stats_internal::HistOp']]], + ['hits',['hits',['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA.html#adeea666b1518009b8e41a157dda13f63',1,'openvdb::v3_2_0::math::VolumeHDDA::hits()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA_3_01TreeT_00_01RayT_00_010_01_4.html#adeea666b1518009b8e41a157dda13f63',1,'openvdb::v3_2_0::math::VolumeHDDA< TreeT, RayT, 0 >::hits()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a8db424ca83bc0f7a3a424bf077311ed5',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::hits()']]], + ['hjweno5_5fbias',['HJWENO5_BIAS',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9b59f0a0c54e6e3759f1418d40585656aee04498ea626951a41f04db5b967767e',1,'openvdb::v3_2_0::math']]], + ['homogeneousmatmul',['HomogeneousMatMul',['../structopenvdb_1_1v3__2__0_1_1tools_1_1HomogeneousMatMul.html',1,'openvdb::v3_2_0::tools']]], + ['homogeneousmatmul',['HomogeneousMatMul',['../structopenvdb_1_1v3__2__0_1_1tools_1_1HomogeneousMatMul.html#a01477096ffa4d99e8855bac5cce07ac4',1,'openvdb::v3_2_0::tools::HomogeneousMatMul']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_a.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_a.html new file mode 100644 index 00000000..95b4c8fc --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_a.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_a.js new file mode 100644 index 00000000..85058463 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_a.js @@ -0,0 +1,299 @@ +var searchData= +[ + ['id',['Id',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a55dd3d458c152bdb1c7c34d4597722c7',1,'openvdb::v3_2_0::io::Queue']]], + ['identity',['identity',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#aa7dd07a63fc2178c6e40b8c3bce5246e',1,'openvdb::v3_2_0::math::Mat3::identity()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a71890348d53084982694f39988f4b286',1,'openvdb::v3_2_0::math::Mat4::identity()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ab4432f85f66386028df0d56c04cecd71',1,'openvdb::v3_2_0::math::Quat::identity()']]], + ['idx',['idx',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband_1_1Fragment.html#aec10b44dd7a1095e58ccfa0929fd0da9',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::Fragment']]], + ['idxtree',['idxTree',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1ISLaplacianOp.html#ad47e4e816ddefd1db62622dbc5b7c552',1,'openvdb::v3_2_0::tools::poisson::internal::ISLaplacianOp::idxTree()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#aadadf44c0fd7a2ed3594518ff867f419',1,'openvdb::v3_2_0::tools::internal::SignData::idxTree()']]], + ['ignore_5ftiles',['IGNORE_TILES',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac7a17ca003c7f18f411cab4e8b4f6e74ab6e5cc3f7167ba290c413016ae105d99',1,'openvdb::v3_2_0::tools']]], + ['ignoredparticles',['ignoredParticles',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a064d5729ee56e07fdf5052012d0d5cdc',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['illegalvalueexception',['IllegalValueException',['../classopenvdb_1_1v3__2__0_1_1IllegalValueException.html',1,'openvdb::v3_2_0']]], + ['illegalvalueexception',['IllegalValueException',['../classopenvdb_1_1v3__2__0_1_1IllegalValueException.html#a4a5e56beb0b1257403509e785498ffbc',1,'openvdb::v3_2_0::IllegalValueException::IllegalValueException()'],['../classopenvdb_1_1v3__2__0_1_1IllegalValueException.html#a673386a184a7e79fd450ed8f141cf967',1,'openvdb::v3_2_0::IllegalValueException::IllegalValueException(const std::string &msg)']]], + ['implt',['ImplT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1GetVal.html#a3f53baa29d697259f499e0563e59841a',1,'openvdb::v3_2_0::tools::stats_internal::GetVal']]], + ['inactivatevalues',['InactivateValues',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1InactivateValues.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['inactivatevalues',['InactivateValues',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1InactivateValues.html#a7d26298806c1fe8eb081b42f3d3b37d4',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::InactivateValues']]], + ['inactiveleafvoxelcount',['inactiveLeafVoxelCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#aa682010a0d4f996171ae710d1c353d11',1,'openvdb::v3_2_0::tree::TreeBase::inactiveLeafVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a10b6f1647213252f60b1678372c2729a',1,'openvdb::v3_2_0::tree::Tree::inactiveLeafVoxelCount()']]], + ['inactivepruneop',['InactivePruneOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1InactivePruneOp.html',1,'openvdb::v3_2_0::tools']]], + ['inactivepruneop',['InactivePruneOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1InactivePruneOp.html#aa3092e4241350c2b349250dc5faaad56',1,'openvdb::v3_2_0::tools::InactivePruneOp::InactivePruneOp(TreeT &tree)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1InactivePruneOp.html#adf1d4d3a97eefbb9e55edc8afacf57bd',1,'openvdb::v3_2_0::tools::InactivePruneOp::InactivePruneOp(TreeT &tree, const ValueT &v)']]], + ['inactivetilevalues',['InactiveTileValues',['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveTileValues.html',1,'openvdb::v3_2_0::tools::diagnostics_internal']]], + ['inactivetilevalues',['InactiveTileValues',['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveTileValues.html#a27c9dc25d30e0abf157b746f5cd774ea',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveTileValues::InactiveTileValues(size_t numValues)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveTileValues.html#ae01d6ae759aae850b731cdaf28a8782d',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveTileValues::InactiveTileValues(const InactiveTileValues< TreeType > &, tbb::split)']]], + ['inactivevoxelcount',['inactiveVoxelCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a9653eb3c8d8e1a6a148e0df7bb618234',1,'openvdb::v3_2_0::tree::TreeBase::inactiveVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a9e5a3f469e2cd1831a467593cf8be357',1,'openvdb::v3_2_0::tree::Tree::inactiveVoxelCount()']]], + ['inactivevoxelvalues',['InactiveVoxelValues',['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveVoxelValues.html',1,'openvdb::v3_2_0::tools::diagnostics_internal']]], + ['inactivevoxelvalues',['InactiveVoxelValues',['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveVoxelValues.html#a23bd39b577b899ce45cd57dd4991d090',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveVoxelValues::InactiveVoxelValues(LeafArray &, size_t numValues)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveVoxelValues.html#ac2a81807ab05eb240a410f5094389852',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveVoxelValues::InactiveVoxelValues(const InactiveVoxelValues< TreeType > &, tbb::split)']]], + ['incompletecholeskypreconditioner',['IncompleteCholeskyPreconditioner',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html',1,'openvdb::v3_2_0::math::pcg']]], + ['incompletecholeskypreconditioner',['IncompleteCholeskyPreconditioner',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#a204a690a3e99cbd43395924f7bdedcf3',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner']]], + ['increment',['increment',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1ConstValueIter.html#aeb2624c7a86b765725fd80cd426e147d',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::ConstValueIter::increment()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#aeb2624c7a86b765725fd80cd426e147d',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::increment()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#aeb2624c7a86b765725fd80cd426e147d',1,'openvdb::v3_2_0::tools::PointIndexIterator::increment()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#a0d8eabe3c55a6d339f6c4c9dc3e8c437',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator::increment()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#aeb2624c7a86b765725fd80cd426e147d',1,'openvdb::v3_2_0::tree::IteratorBase::increment()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#aea94db88c016a77663346d22033050f2',1,'openvdb::v3_2_0::tree::IteratorBase::increment(Index n)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#aeb2624c7a86b765725fd80cd426e147d',1,'openvdb::v3_2_0::tree::NodeIteratorBase::increment()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#aea94db88c016a77663346d22033050f2',1,'openvdb::v3_2_0::tree::NodeIteratorBase::increment(Index n)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#aeb2624c7a86b765725fd80cd426e147d',1,'openvdb::v3_2_0::tree::LeafIteratorBase::increment()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#aea94db88c016a77663346d22033050f2',1,'openvdb::v3_2_0::tree::LeafIteratorBase::increment(Index n)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorRange.html#af4db50e522b7d0ff0d42eaf06abc3206',1,'openvdb::v3_2_0::tree::IteratorRange::increment()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1OnMaskIterator.html#aeb2624c7a86b765725fd80cd426e147d',1,'openvdb::v3_2_0::util::OnMaskIterator::increment()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1OnMaskIterator.html#aea94db88c016a77663346d22033050f2',1,'openvdb::v3_2_0::util::OnMaskIterator::increment(Index n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1OffMaskIterator.html#aeb2624c7a86b765725fd80cd426e147d',1,'openvdb::v3_2_0::util::OffMaskIterator::increment()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1OffMaskIterator.html#aea94db88c016a77663346d22033050f2',1,'openvdb::v3_2_0::util::OffMaskIterator::increment(Index n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1DenseMaskIterator.html#aeb2624c7a86b765725fd80cd426e147d',1,'openvdb::v3_2_0::util::DenseMaskIterator::increment()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1DenseMaskIterator.html#aea94db88c016a77663346d22033050f2',1,'openvdb::v3_2_0::util::DenseMaskIterator::increment(Index n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OnIterator.html#aeb2624c7a86b765725fd80cd426e147d',1,'openvdb::v3_2_0::util::RootNodeMask::OnIterator::increment()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OnIterator.html#aea94db88c016a77663346d22033050f2',1,'openvdb::v3_2_0::util::RootNodeMask::OnIterator::increment(Index n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OffIterator.html#aeb2624c7a86b765725fd80cd426e147d',1,'openvdb::v3_2_0::util::RootNodeMask::OffIterator::increment()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OffIterator.html#aea94db88c016a77663346d22033050f2',1,'openvdb::v3_2_0::util::RootNodeMask::OffIterator::increment(Index n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1DenseIterator.html#aeb2624c7a86b765725fd80cd426e147d',1,'openvdb::v3_2_0::util::RootNodeMask::DenseIterator::increment()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1DenseIterator.html#aea94db88c016a77663346d22033050f2',1,'openvdb::v3_2_0::util::RootNodeMask::DenseIterator::increment(Index n)']]], + ['index',['index',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UpdatePoints.html#ad9c88ed5e8125d66291acd55da72d73e',1,'openvdb::v3_2_0::tools::internal::UpdatePoints::index()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#aee532d4b44808a8f321ad6d4ba4f3f91',1,'openvdb::v3_2_0::tools::SparseExtractor::Index()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#aee532d4b44808a8f321ad6d4ba4f3f91',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor::Index()'],['../namespaceopenvdb_1_1v3__2__0.html#a6786cb661047b99900e3e8d3d4a031e6',1,'openvdb::v3_2_0::Index()']]], + ['index32',['Index32',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a645f179f9d65431ffd25354db30cda9f',1,'openvdb::v3_2_0::math::Coord::Index32()'],['../namespaceopenvdb_1_1v3__2__0.html#a645f179f9d65431ffd25354db30cda9f',1,'openvdb::v3_2_0::Index32()']]], + ['index64',['Index64',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a9d784ca0e99d06fae78a3c2e7e19c919',1,'openvdb::v3_2_0::math::CoordBBox::Index64()'],['../namespaceopenvdb_1_1v3__2__0.html#a9d784ca0e99d06fae78a3c2e7e19c919',1,'openvdb::v3_2_0::Index64()']]], + ['indexacc',['indexAcc',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#a24023a8a2fb6a0cff9833374ee7153cb',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData']]], + ['indexarray',['IndexArray',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a7bd5b3a884338d784438f7af54936453',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::IndexArray()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1VoxelOrderOp.html#a4058ed78158e76a54b8d4ec8c2bc2c1e',1,'openvdb::v3_2_0::tools::point_partitioner_internal::VoxelOrderOp::IndexArray()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1LeafNodeOriginOp.html#a4058ed78158e76a54b8d4ec8c2bc2c1e',1,'openvdb::v3_2_0::tools::point_partitioner_internal::LeafNodeOriginOp::IndexArray()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1OrderSegmentsOp.html#a4058ed78158e76a54b8d4ec8c2bc2c1e',1,'openvdb::v3_2_0::tools::point_partitioner_internal::OrderSegmentsOp::IndexArray()']]], + ['indexdeque',['IndexDeque',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RadialRangeFilter.html#a345449f49fbeaac5fa60793c054916fe',1,'openvdb::v3_2_0::tools::particle_atlas_internal::RadialRangeFilter::IndexDeque()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1BBoxFilter.html#a345449f49fbeaac5fa60793c054916fe',1,'openvdb::v3_2_0::tools::particle_atlas_internal::BBoxFilter::IndexDeque()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1BBoxFilter.html#a345449f49fbeaac5fa60793c054916fe',1,'openvdb::v3_2_0::tools::point_index_grid_internal::BBoxFilter::IndexDeque()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1RadialRangeFilter.html#a345449f49fbeaac5fa60793c054916fe',1,'openvdb::v3_2_0::tools::point_index_grid_internal::RadialRangeFilter::IndexDeque()']]], + ['indexerror',['IndexError',['../classopenvdb_1_1v3__2__0_1_1IndexError.html',1,'openvdb::v3_2_0']]], + ['indexerror',['IndexError',['../classopenvdb_1_1v3__2__0_1_1IndexError.html#a9bd4057affff1305bafd4d88e60d5587',1,'openvdb::v3_2_0::IndexError::IndexError()'],['../classopenvdb_1_1v3__2__0_1_1IndexError.html#a409a42f0331f040676f289b08590fe9f',1,'openvdb::v3_2_0::IndexError::IndexError(const std::string &msg)']]], + ['indexiterator',['IndexIterator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html',1,'openvdb::v3_2_0::tools::PointPartitioner']]], + ['indexiterator',['IndexIterator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#aead984c98ce825687cbaf3c150f3f551',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator']]], + ['indexpair',['IndexPair',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MergeBinsOp.html#af84b24f4c3dd2adaebfd231b0955c49f',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MergeBinsOp::IndexPair()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#af84b24f4c3dd2adaebfd231b0955c49f',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp::IndexPair()']]], + ['indexpairlist',['IndexPairList',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MergeBinsOp.html#ae5d40819a20ddb46008b8bcff11c3891',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MergeBinsOp::IndexPairList()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#ae5d40819a20ddb46008b8bcff11c3891',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp::IndexPairList()']]], + ['indexpairlistmap',['IndexPairListMap',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MergeBinsOp.html#a42ed098e6581259d041fc04ae9b72412',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MergeBinsOp::IndexPairListMap()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#a42ed098e6581259d041fc04ae9b72412',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp::IndexPairListMap()']]], + ['indexpairlistmapptr',['IndexPairListMapPtr',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MergeBinsOp.html#aca6d867b13c2896af32ebc7062415300',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MergeBinsOp::IndexPairListMapPtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#aca6d867b13c2896af32ebc7062415300',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp::IndexPairListMapPtr()']]], + ['indexpairlistptr',['IndexPairListPtr',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MergeBinsOp.html#ac302d9ccc88389ca64d06a86e2ea4857',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MergeBinsOp::IndexPairListPtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#ac302d9ccc88389ca64d06a86e2ea4857',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp::IndexPairListPtr()']]], + ['indexrange',['IndexRange',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1NodeBS.html#a81beb889f26b26840a2f75af4d99f019',1,'openvdb::v3_2_0::tools::internal::NodeBS::IndexRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1ClosestPointDist.html#a81beb889f26b26840a2f75af4d99f019',1,'openvdb::v3_2_0::tools::internal::ClosestPointDist::IndexRange()']]], + ['indext',['IndexT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1PopulateLeafNodesOp.html#ae3f3843950615ebb8a55fb55f429db0e',1,'openvdb::v3_2_0::tools::point_index_grid_internal::PopulateLeafNodesOp']]], + ['indextoworld',['indexToWorld',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a9b0e6d022b2571d4b0551704406ac4ba',1,'openvdb::v3_2_0::GridBase::indexToWorld(const Vec3d &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ac787726bec9f25b15915b34fa30f2e0c',1,'openvdb::v3_2_0::GridBase::indexToWorld(const Coord &ijk) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#aa4f6f15829e027f6153d1a7b90a59053',1,'openvdb::v3_2_0::math::Ray::indexToWorld()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a9b0e6d022b2571d4b0551704406ac4ba',1,'openvdb::v3_2_0::math::Transform::indexToWorld(const Vec3d &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#ac787726bec9f25b15915b34fa30f2e0c',1,'openvdb::v3_2_0::math::Transform::indexToWorld(const Coord &ijk) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#acc5c8b46dab7befe9bc1dcec66967107',1,'openvdb::v3_2_0::math::Transform::indexToWorld(const CoordBBox &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#ac6a391c9680282be6c16ef5c2487a676',1,'openvdb::v3_2_0::math::Transform::indexToWorld(const BBoxd &) const ']]], + ['indextree',['indexTree',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#a1ae9d3bcc7780a76cdf6c48bd0fc0419',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData::indexTree()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestSurfacePoint.html#af04ec6d0c764e6016a4ff39fbef29fd9',1,'openvdb::v3_2_0::tools::ClosestSurfacePoint::indexTree()']]], + ['indextype',['IndexType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#a79e662e22f964ab5c3ab7aca226184a2',1,'openvdb::v3_2_0::tools::ParticleAtlas::IndexType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#a153e05586229d204b574373c0ef1a6c6',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#a153e05586229d204b574373c0ef1a6c6',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator::IndexType()']]], + ['indices',['indices',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a21e9cd1e2602f69d5b1e69c187fcd13f',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::indices()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a030f8c1fd7d4fd1eecb91c5dc71e37c3',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::indices() const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#a3122c5ffc751ea766f5f3177782cc169',1,'openvdb::v3_2_0::tools::PointPartitioner::indices()']]], + ['inf',['inf',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a98d6a4d2d00258fdedbb454cbc127610',1,'openvdb::v3_2_0::math::CoordBBox']]], + ['infnorm',['infNorm',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a71b7955ed483c5375bdb093836408555',1,'openvdb::v3_2_0::math::pcg::Vector']]], + ['infnormop',['InfNormOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1InfNormOp.html#aaefd32a2c691e43c363eeed677513189',1,'openvdb::v3_2_0::math::pcg::Vector::InfNormOp']]], + ['infnormop',['InfNormOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1InfNormOp.html',1,'openvdb::v3_2_0::math::pcg::Vector']]], + ['ingridtype',['InGridType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Cpt.html#a38e1f92482c057064469f8ab41ad0cf1',1,'openvdb::v3_2_0::tools::Cpt::InGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Curl.html#a51c88f39165b9834c13df1c455690691',1,'openvdb::v3_2_0::tools::Curl::InGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Divergence.html#a38e1f92482c057064469f8ab41ad0cf1',1,'openvdb::v3_2_0::tools::Divergence::InGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Gradient.html#a38e1f92482c057064469f8ab41ad0cf1',1,'openvdb::v3_2_0::tools::Gradient::InGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian.html#a51c88f39165b9834c13df1c455690691',1,'openvdb::v3_2_0::tools::Laplacian::InGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature.html#a51c88f39165b9834c13df1c455690691',1,'openvdb::v3_2_0::tools::MeanCurvature::InGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude.html#a38e1f92482c057064469f8ab41ad0cf1',1,'openvdb::v3_2_0::tools::Magnitude::InGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Normalize.html#a51c88f39165b9834c13df1c455690691',1,'openvdb::v3_2_0::tools::Normalize::InGridType()']]], + ['init',['init',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1Neighbor.html#a50300ba6e38ec30121edcc07ebac42c6',1,'openvdb::v3_2_0::tools::Morphology::Neighbor::init()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#a985db05411e4ed8cc1bc77c44a3bbd7d',1,'openvdb::v3_2_0::math::DDA::init(const RayT &ray, RealT startTime, RealT maxTime)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#a8f912b13dd1d5e776b9c953951c4355a',1,'openvdb::v3_2_0::math::DDA::init(const RayT &ray)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#a90c17c5ccdf81085d8a114d1b5be82b1',1,'openvdb::v3_2_0::math::DDA::init(const RayT &ray, RealT startTime)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ab97faa95316af6261c921829101d6cd0',1,'openvdb::v3_2_0::math::Quat::init(T x, T y, T z, T w)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a9a057015101f34e442bc25116b82c202',1,'openvdb::v3_2_0::math::Quat::init()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ac71edc039052ed3cc5af8f172d30c7d9',1,'openvdb::v3_2_0::math::Vec2::init()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a181b8e6c1a55901162ae611857db28fc',1,'openvdb::v3_2_0::math::Vec3::init()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a7e848289494b7db5e4bd227083f82fee',1,'openvdb::v3_2_0::math::Vec4::init()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UniformPrimBuilder.html#ac05ddcf045357945ea784cce639bf8f5',1,'openvdb::v3_2_0::tools::internal::UniformPrimBuilder::init()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1AdaptivePrimBuilder.html#a709df24ccb4822d44001e9c4f98ca161',1,'openvdb::v3_2_0::tools::internal::AdaptivePrimBuilder::init()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#a1f662436a86c87021460b959a49db877',1,'openvdb::v3_2_0::tree::NodeManagerLink::init()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#a1f662436a86c87021460b959a49db877',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::init()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#aa1d136414765efbd2f6e9dc36d9b44c6',1,'openvdb::v3_2_0::util::RootNodeMask::init()']]], + ['initialize',['initialize',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestSurfacePoint.html#a192376229812e91354e4ed1021f3e43a',1,'openvdb::v3_2_0::tools::ClosestSurfacePoint::initialize(const GridT &grid, float isovalue=0.0, InterrupterT *interrupter=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestSurfacePoint.html#a3b4178cb0fe6f3512a924638ced97bf6',1,'openvdb::v3_2_0::tools::ClosestSurfacePoint::initialize(const GridT &grid, float isovalue=0.0)'],['../namespaceopenvdb_1_1v3__2__0.html#a56c93ff831b7f5add8ab2cf077328660',1,'openvdb::v3_2_0::initialize()']]], + ['initlevel',['initLevel',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a58793e15e521227168e0ec1ea491f4ab',1,'openvdb::v3_2_0::tree::IterListItem::initLevel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a58793e15e521227168e0ec1ea491f4ab',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::initLevel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a58793e15e521227168e0ec1ea491f4ab',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::initLevel()']]], + ['initray',['initRay',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#a7321269e92b0677deca4349bda1c51f8',1,'openvdb::v3_2_0::tools::BaseCamera']]], + ['inputhasgridoffsets',['inputHasGridOffsets',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#afc6beef95458d74d667b93fbb6e5629f',1,'openvdb::v3_2_0::io::Archive']]], + ['inputleafnodetype',['InputLeafNodeType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskIsovalueCrossingVoxels.html#a4bf9a049c9f5b8205749a0627c653b34',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskIsovalueCrossingVoxels']]], + ['inputvaluetype',['InputValueType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskIsovalueCrossingVoxels.html#ac766e699f8354bbe9936ec7f540a74be',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskIsovalueCrossingVoxels']]], + ['insert',['insert',['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a324224f340079ac6c6e270c7ed8cf5a4',1,'openvdb::v3_2_0::tree::CacheItem::insert(const Coord &xyz, const NodeType *node)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a68aebd20142584a5c8006435f8f59e42',1,'openvdb::v3_2_0::tree::CacheItem::insert(const Coord &xyz, const OtherNodeType *node)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a081820d535254f2712082c496f35556d',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::insert(const Coord &, const RootNodeType *root)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a957e74a95b101ada04beba9ae04ad18f',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::insert(const Coord &, const OtherNodeType *)']]], + ['insertmeta',['insertMeta',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#afe07d56e50899edf5934fd2a5c47096b',1,'openvdb::v3_2_0::MetaMap::insertMeta(const Name &, const Metadata &value)'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#ad76c5f172e8cf4f33827b147f6eeb712',1,'openvdb::v3_2_0::MetaMap::insertMeta(const MetaMap &)']]], + ['insertnode',['insertNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a67e773d64537a251d1072bc4b10682ea',1,'openvdb::v3_2_0::tree::ValueAccessor::insertNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a09d70d3f67bdb03d342582adf8e25747',1,'openvdb::v3_2_0::tree::ValueAccessor0::insertNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#ac8707d2be914f10d7906e78ffee022e0',1,'openvdb::v3_2_0::tree::ValueAccessor1::insertNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#ac8707d2be914f10d7906e78ffee022e0',1,'openvdb::v3_2_0::tree::ValueAccessor2::insertNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#ac8707d2be914f10d7906e78ffee022e0',1,'openvdb::v3_2_0::tree::ValueAccessor3::insertNode()']]], + ['inside',['INSIDE',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a0341d081395407fd92061819ba76eb96aaed7c373c0b69cb26c5adb789adb495d',1,'openvdb::v3_2_0::tools::internal']]], + ['instance',['instance',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapRegistry.html#a74c096cca30f90b2ba30811385ce8d79',1,'openvdb::v3_2_0::math::MapRegistry']]], + ['instanceparentname',['instanceParentName',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a46c25c2e9d3c71eead3126a5c34b0a2e',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['int',['Int',['../namespaceopenvdb_1_1v3__2__0.html#a5293f165e3de725398d6ebfca71903ec',1,'openvdb::v3_2_0']]], + ['int16',['Int16',['../namespaceopenvdb_1_1v3__2__0.html#a6d70d2452bc784cc9a499c567e4b5a77',1,'openvdb::v3_2_0']]], + ['int16accessort',['Int16AccessorT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#ab7b176255bb24be34f45b693592a387e',1,'openvdb::v3_2_0::tools::internal::SignData::Int16AccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MapPoints.html#a7243cbc243c1c7e07b78e883a4a93c2b',1,'openvdb::v3_2_0::tools::internal::MapPoints::Int16AccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SeamWeights.html#a7243cbc243c1c7e07b78e883a4a93c2b',1,'openvdb::v3_2_0::tools::internal::SeamWeights::Int16AccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#a7243cbc243c1c7e07b78e883a4a93c2b',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions::Int16AccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPolygons.html#a7243cbc243c1c7e07b78e883a4a93c2b',1,'openvdb::v3_2_0::tools::internal::GenPolygons::Int16AccessorT()']]], + ['int16caccessort',['Int16CAccessorT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPoints.html#a9b36e18eaa70a866b3baa74a8f9e95c7',1,'openvdb::v3_2_0::tools::internal::GenPoints']]], + ['int16treet',['Int16TreeT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#a53a0ba16e068199a8a32810357ef26f5',1,'openvdb::v3_2_0::tools::internal::SignData::Int16TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPoints.html#a53a0ba16e068199a8a32810357ef26f5',1,'openvdb::v3_2_0::tools::internal::GenPoints::Int16TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SeamWeights.html#a53a0ba16e068199a8a32810357ef26f5',1,'openvdb::v3_2_0::tools::internal::SeamWeights::Int16TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#abff12748f424029d7175ccb31bc7b81b',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions::Int16TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPolygons.html#abff12748f424029d7175ccb31bc7b81b',1,'openvdb::v3_2_0::tools::internal::GenPolygons::Int16TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestSurfacePoint.html#a53a0ba16e068199a8a32810357ef26f5',1,'openvdb::v3_2_0::tools::ClosestSurfacePoint::Int16TreeT()']]], + ['int32',['Int32',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a20b0c262d9ef5d263888e463dfa99638',1,'openvdb::v3_2_0::math::Coord::Int32()'],['../namespaceopenvdb_1_1v3__2__0.html#a20b0c262d9ef5d263888e463dfa99638',1,'openvdb::v3_2_0::Int32()']]], + ['int32grid',['Int32Grid',['../namespaceopenvdb_1_1v3__2__0.html#aaef7a3882681a620606551eff7f621c4',1,'openvdb::v3_2_0']]], + ['int32leafnodetype',['Int32LeafNodeType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1CombineLeafNodes.html#a9bfe854c940699ac002f19dd8441906f',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::CombineLeafNodes::Int32LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeIntersectingVoxelSign.html#a9bfe854c940699ac002f19dd8441906f',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ComputeIntersectingVoxelSign::Int32LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#a9bfe854c940699ac002f19dd8441906f',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::Int32LeafNodeType()']]], + ['int32metadata',['Int32Metadata',['../namespaceopenvdb_1_1v3__2__0.html#a0fe835bccd0efe020e4ea88ec6b6b7de',1,'openvdb::v3_2_0']]], + ['int32tree',['Int32Tree',['../namespaceopenvdb_1_1v3__2__0.html#a4871236c97a1615ac24f58069d55f17f',1,'openvdb::v3_2_0']]], + ['int32treeacc',['Int32TreeAcc',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#ac201ddf12b50afb5a66154a9337dc73d',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData']]], + ['int32treetype',['Int32TreeType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1CombineLeafNodes.html#a18923392e6d7835d2a96a1138339aff4',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::CombineLeafNodes::Int32TreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeIntersectingVoxelSign.html#a18923392e6d7835d2a96a1138339aff4',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ComputeIntersectingVoxelSign::Int32TreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RemoveSelfIntersectingSurface.html#a18923392e6d7835d2a96a1138339aff4',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RemoveSelfIntersectingSurface::Int32TreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#a18923392e6d7835d2a96a1138339aff4',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData::Int32TreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#a18923392e6d7835d2a96a1138339aff4',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::Int32TreeType()']]], + ['int64',['Int64',['../namespaceopenvdb_1_1v3__2__0.html#a2de3f49eadcae5078cd57134586ee25d',1,'openvdb::v3_2_0']]], + ['int64grid',['Int64Grid',['../namespaceopenvdb_1_1v3__2__0.html#a41eb0bcf26fa04f42242f1b9cfedac7b',1,'openvdb::v3_2_0']]], + ['int64metadata',['Int64Metadata',['../namespaceopenvdb_1_1v3__2__0.html#a46605b9b7bcd5c256518f26575dba98d',1,'openvdb::v3_2_0']]], + ['int64tree',['Int64Tree',['../namespaceopenvdb_1_1v3__2__0.html#a3578b768dd57513edaa806ddebed80df',1,'openvdb::v3_2_0']]], + ['intaccessort',['IntAccessorT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#a7feac3964002f7d878609501c6bcc588',1,'openvdb::v3_2_0::tools::internal::SignData::IntAccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1CountRegions.html#a7feac3964002f7d878609501c6bcc588',1,'openvdb::v3_2_0::tools::internal::CountRegions::IntAccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPoints.html#a7feac3964002f7d878609501c6bcc588',1,'openvdb::v3_2_0::tools::internal::GenPoints::IntAccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SeamWeights.html#a1bb60896d5cf4f744e43788317ce5257',1,'openvdb::v3_2_0::tools::internal::SeamWeights::IntAccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#a7feac3964002f7d878609501c6bcc588',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions::IntAccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPolygons.html#a1bb60896d5cf4f744e43788317ce5257',1,'openvdb::v3_2_0::tools::internal::GenPolygons::IntAccessorT()']]], + ['intcaccessort',['IntCAccessorT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPoints.html#a22b2e91d030ace991ccd10cf07d2fe18',1,'openvdb::v3_2_0::tools::internal::GenPoints']]], + ['integerpart',['IntegerPart',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a713d7c7d01fa50ad53daf6015d3e1f6a',1,'openvdb::v3_2_0::math']]], + ['interiormask',['interiorMask',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1ISLaplacianOp.html#a2347ac76b741224c4d5dcd211b0a473a',1,'openvdb::v3_2_0::tools::poisson::internal::ISLaplacianOp']]], + ['internalnode',['InternalNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a5fc7cbf1929731e78733e1b476142b8a',1,'openvdb::v3_2_0::tree::InternalNode::InternalNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a5fc7cbf1929731e78733e1b476142b8a',1,'openvdb::v3_2_0::tree::ValueAccessor::InternalNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a5fc7cbf1929731e78733e1b476142b8a',1,'openvdb::v3_2_0::tree::ValueAccessor1::InternalNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a5fc7cbf1929731e78733e1b476142b8a',1,'openvdb::v3_2_0::tree::ValueAccessor2::InternalNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a5fc7cbf1929731e78733e1b476142b8a',1,'openvdb::v3_2_0::tree::ValueAccessor3::InternalNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a3c7d5a1827fefa3ff6cad83cb6a04998',1,'openvdb::v3_2_0::tree::InternalNode::InternalNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ad1bc92d242649f28a8d9215cd99f968e',1,'openvdb::v3_2_0::tree::InternalNode::InternalNode(const ValueType &offValue)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a76f4c754efeeed3b7050e278286c0825',1,'openvdb::v3_2_0::tree::InternalNode::InternalNode(const Coord &, const ValueType &fillValue, bool active=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#af7c69f6e0dfc71e346694e3ef90e8708',1,'openvdb::v3_2_0::tree::InternalNode::InternalNode(PartialCreate, const Coord &, const ValueType &fillValue, bool active=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ae345664c5a28b29a81286eb7419e293b',1,'openvdb::v3_2_0::tree::InternalNode::InternalNode(const InternalNode &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a210d885537e470d3c48b4471ee3c0f50',1,'openvdb::v3_2_0::tree::InternalNode::InternalNode(const InternalNode< OtherChildNodeType, Log2Dim > &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a6ce3601644287a8bb0a1361ea4795c8c',1,'openvdb::v3_2_0::tree::InternalNode::InternalNode(const InternalNode< OtherChildNodeType, Log2Dim > &other, const ValueType &background, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a301b2a28b08db3370ed667cac46992fd',1,'openvdb::v3_2_0::tree::InternalNode::InternalNode(const InternalNode< OtherChildNodeType, Log2Dim > &other, const ValueType &offValue, const ValueType &onValue, TopologyCopy)']]], + ['internalnode',['InternalNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html',1,'openvdb::v3_2_0::tree']]], + ['internalnode_2eh',['InternalNode.h',['../InternalNode_8h.html',1,'']]], + ['internalnodetype',['InternalNodeType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildPrimarySegment.html#ab365520008399ba9ab0d62cdf4c63d74',1,'openvdb::v3_2_0::tools::composite::BuildPrimarySegment::InternalNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildSecondarySegment.html#ab365520008399ba9ab0d62cdf4c63d74',1,'openvdb::v3_2_0::tools::composite::BuildSecondarySegment::InternalNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FloodFillSign.html#ab365520008399ba9ab0d62cdf4c63d74',1,'openvdb::v3_2_0::tools::level_set_util_internal::FloodFillSign::InternalNodeType()']]], + ['interpolation',['interpolation',['../classopenvdb_1_1v3__2__0_1_1math_1_1BoxStencil.html#a5fe13169abd305acbc3bb8cc4ccd3329',1,'openvdb::v3_2_0::math::BoxStencil']]], + ['interpolation_2eh',['Interpolation.h',['../Interpolation_8h.html',1,'']]], + ['interrupt',['interrupt',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html#a8db4f5abed06068be78b00e2ed5ac11c',1,'openvdb::v3_2_0::tools::GridResampler::interrupt()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#afeb4d4325bf5c39be903e5322c144e71',1,'openvdb::v3_2_0::tools::BasePointScatter::interrupt()']]], + ['interruptertype',['InterrupterType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#ad6113a94c63d579febb5241937771f9e',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['interruptfunc',['InterruptFunc',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html#aeea8015056fedafc44e3e7d77b0dae89',1,'openvdb::v3_2_0::tools::GridResampler']]], + ['intersect',['intersect',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#ad0b32d1477b870869c2fa6a73d8c505a',1,'openvdb::v3_2_0::math::CoordBBox']]], + ['intersects',['intersects',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#ad7067b5357e57624fd3a0469311d75cf',1,'openvdb::v3_2_0::math::Ray::intersects(const Vec3T &center, RealT radius, RealT &t0, RealT &t1) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#af0237a31f0580d81ba49f422767d753e',1,'openvdb::v3_2_0::math::Ray::intersects(const Vec3T &center, RealT radius) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#acec10f3339400870d8dba2ebbbf93098',1,'openvdb::v3_2_0::math::Ray::intersects(const BBoxT &bbox, RealT &t0, RealT &t1) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a6ba82b51d7432105ecf5b43a69781887',1,'openvdb::v3_2_0::math::Ray::intersects(const BBoxT &bbox) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#ae699fca02539f8ad258786e156f3db3e',1,'openvdb::v3_2_0::math::Ray::intersects(const Vec3T &normal, RealT distance, RealT &t) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a1860a871a27ccee9744e0f381aa8c64e',1,'openvdb::v3_2_0::math::Ray::intersects(const Vec3T &normal, const Vec3T &point, RealT &t) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a4b2c9891717a31845694db27546f0d5a',1,'openvdb::v3_2_0::math::BaseStencil::intersects()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BoxStencil.html#a4b2c9891717a31845694db27546f0d5a',1,'openvdb::v3_2_0::math::BoxStencil::intersects()']]], + ['intersectsis',['intersectsIS',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#a1d9765f1e3066d46eebdad04b5f99c53',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::intersectsIS(const RayType &iRay) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#a350757779f08a7bcc81ee216767e6c95',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::intersectsIS(const RayType &iRay, RealType &iTime) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#aa79c6d574fe859340f6fec21b0be05c6',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::intersectsIS(const RayType &iRay, Vec3Type &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#ab2c3266bbe4068e02f901331ce214b81',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::intersectsIS(const RayType &iRay, Vec3Type &xyz, RealType &iTime) const ']]], + ['intersectsws',['intersectsWS',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#ab4d91351c7fe7996acdf4f9c03f35cd9',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::intersectsWS(const RayType &wRay) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#a33d2c668400b142a3bc59428efc800f4',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::intersectsWS(const RayType &wRay, RealType &wTime) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#a0cc790fd59a794a4daca4f9c261a8698',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::intersectsWS(const RayType &wRay, Vec3Type &world) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#a9b604007eeb659e84a0f33e65eb1a890',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::intersectsWS(const RayType &wRay, Vec3Type &world, RealType &wTime) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#ac74bad6889a28ef78731217572fc00a1',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::intersectsWS(const RayType &wRay, Vec3Type &world, Vec3Type &normal) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#ae6491b59531bf66411b1da73219f250b',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::intersectsWS(const RayType &wRay, Vec3Type &world, Vec3Type &normal, RealType &wTime) const ']]], + ['intleaft',['IntLeafT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1CountRegions.html#af2ff40bebdd26bb7890c9c4180da5823',1,'openvdb::v3_2_0::tools::internal::CountRegions']]], + ['intreet',['InTreeT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpTransformer.html#a0dd838be8f4902f033f95dfb9d452a86',1,'openvdb::v3_2_0::tools::valxform::SharedOpTransformer::InTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpTransformer.html#a0dd838be8f4902f033f95dfb9d452a86',1,'openvdb::v3_2_0::tools::valxform::CopyableOpTransformer::InTreeT()']]], + ['inttreet',['IntTreeT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#a287e191ca672922fb2b46d3077af5c51',1,'openvdb::v3_2_0::tools::internal::SignData::IntTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPoints.html#a287e191ca672922fb2b46d3077af5c51',1,'openvdb::v3_2_0::tools::internal::GenPoints::IntTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SeamWeights.html#a287e191ca672922fb2b46d3077af5c51',1,'openvdb::v3_2_0::tools::internal::SeamWeights::IntTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#a287e191ca672922fb2b46d3077af5c51',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions::IntTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPolygons.html#a90b04f7594ec7e7fe3472ceded571fc3',1,'openvdb::v3_2_0::tools::internal::GenPolygons::IntTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenBoundaryMask.html#a35921011e807dcca3a4db24244ffc051',1,'openvdb::v3_2_0::tools::internal::GenBoundaryMask::IntTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestSurfacePoint.html#a287e191ca672922fb2b46d3077af5c51',1,'openvdb::v3_2_0::tools::ClosestSurfacePoint::IntTreeT()']]], + ['inttype',['IntType',['../structopenvdb_1_1v3__2__0_1_1PointIndex.html#a1ac5afc307132ac962afa58465e6c1be',1,'openvdb::v3_2_0::PointIndex::IntType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseTransformer.html#a9dc9503ba94d9195ce5aa1392bb0eae7',1,'openvdb::v3_2_0::tools::DenseTransformer::IntType()']]], + ['inv',['Inv',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a2630966931b5120e72f4c8735aebc984',1,'openvdb::v3_2_0::math']]], + ['invalid_5fidx',['INVALID_IDX',['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a64406e5329e76b683c1af3b539095e35',1,'openvdb::v3_2_0::util']]], + ['invalid_5foffset',['INVALID_OFFSET',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html#aab4d131ba129f519b9e2bd349dc19e3aab88bd5eb0e12083a01cc2f1908a4db15',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::LeafNodeConnectivityTable']]], + ['invdir',['invDir',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a372fad044dedd1da424c9fc0244198a0',1,'openvdb::v3_2_0::math::Ray']]], + ['invdx',['invdx',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#aaa664a886f6602c4ef89fe57c703ccb9',1,'openvdb::v3_2_0::tools::CheckDivergence']]], + ['invdx2',['invdx2',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#adeeaa84fce7ecd05b231df73ec704a2d',1,'openvdb::v3_2_0::tools::CheckNormGrad']]], + ['inverse',['inverse',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a65dafa6f92f02253b33557a6ae279790',1,'openvdb::v3_2_0::math::AffineMap::inverse()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a1699b3962b9d1a0b951cedf4f64df5c3',1,'openvdb::v3_2_0::math::Mat3::inverse()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a26a6d7acc07d370764b895b848f846e0',1,'openvdb::v3_2_0::math::Mat4::inverse()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#aeb1ac4fb541d91b4c3abc64f5a0a9456',1,'openvdb::v3_2_0::math::Quat::inverse()']]], + ['inversemap',['inverseMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#af70314db95e0fa0df35749c79700d0e7',1,'openvdb::v3_2_0::math::MapBase::inverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#af7009d00bdfc80dfe12da8e5a4127313',1,'openvdb::v3_2_0::math::AffineMap::inverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#af7009d00bdfc80dfe12da8e5a4127313',1,'openvdb::v3_2_0::math::ScaleMap::inverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#af7009d00bdfc80dfe12da8e5a4127313',1,'openvdb::v3_2_0::math::UniformScaleMap::inverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#af7009d00bdfc80dfe12da8e5a4127313',1,'openvdb::v3_2_0::math::TranslationMap::inverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#af7009d00bdfc80dfe12da8e5a4127313',1,'openvdb::v3_2_0::math::ScaleTranslateMap::inverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#af7009d00bdfc80dfe12da8e5a4127313',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::inverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#af7009d00bdfc80dfe12da8e5a4127313',1,'openvdb::v3_2_0::math::UnitaryMap::inverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#af7009d00bdfc80dfe12da8e5a4127313',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::inverseMap()']]], + ['invertedtree',['InvertedTree',['../structopenvdb_1_1v3__2__0_1_1tree_1_1iter_1_1InvertedTree.html',1,'openvdb::v3_2_0::tree::iter']]], + ['invertedtree_3c_20headt_2c_201_20_3e',['InvertedTree< HeadT, 1 >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1iter_1_1InvertedTree_3_01HeadT_00_011_01_4.html',1,'openvdb::v3_2_0::tree::iter']]], + ['invertmask',['invertMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a7ac0dd78189660b0037a7ef03e77e735',1,'openvdb::v3_2_0::tools::Filter::invertMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a7ac0dd78189660b0037a7ef03e77e735',1,'openvdb::v3_2_0::tools::LevelSetFilter::invertMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a7ac0dd78189660b0037a7ef03e77e735',1,'openvdb::v3_2_0::tools::LevelSetMorphing::invertMask()']]], + ['invmat',['invMat',['../structopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer_1_1MatrixTransform.html#a564886cdd8f123501134b040da23824b',1,'openvdb::v3_2_0::tools::GridTransformer::MatrixTransform']]], + ['invsort',['invSort',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a562fe73ea409de2947247a52a685a5ef',1,'openvdb::v3_2_0::util::PagedArray']]], + ['invtransform',['invTransform',['../structopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer_1_1MatrixTransform.html#aac9bfe6ddcbf3c56ec54199d905c8795',1,'openvdb::v3_2_0::tools::GridTransformer::MatrixTransform::invTransform()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ABTransform.html#a7d9008b60b1759bc490ef3cac79582c8',1,'openvdb::v3_2_0::tools::ABTransform::invTransform()']]], + ['invtreet',['InvTreeT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#ac95a27af03901c3501213083682c1d30',1,'openvdb::v3_2_0::tree::NodeIteratorBase::InvTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#ac95a27af03901c3501213083682c1d30',1,'openvdb::v3_2_0::tree::LeafIteratorBase::InvTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#afc634a6a2b05e91148109419ff728661',1,'openvdb::v3_2_0::tree::ValueAccessor1::InvTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#afc634a6a2b05e91148109419ff728661',1,'openvdb::v3_2_0::tree::ValueAccessor2::InvTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#afc634a6a2b05e91148109419ff728661',1,'openvdb::v3_2_0::tree::ValueAccessor3::InvTreeT()']]], + ['inx',['inX',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2NDT_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< CD_2NDT >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2NDT_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< CD_2NDT >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2ND_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< CD_2ND >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2ND_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< CD_2ND >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__4TH_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< CD_4TH >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__4TH_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< CD_4TH >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__6TH_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< CD_6TH >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__6TH_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< CD_6TH >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__1ST_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< FD_1ST >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__1ST_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< FD_1ST >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__2ND_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< FD_2ND >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__2ND_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< FD_2ND >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__3RD_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< FD_3RD >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__3RD_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< FD_3RD >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__1ST_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< BD_1ST >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__1ST_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< BD_1ST >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__2ND_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< BD_2ND >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__2ND_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< BD_2ND >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__3RD_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< BD_3RD >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__3RD_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< BD_3RD >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__WENO5_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< FD_WENO5 >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__WENO5_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< FD_WENO5 >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__HJWENO5_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< FD_HJWENO5 >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__HJWENO5_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< FD_HJWENO5 >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__WENO5_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< BD_WENO5 >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__WENO5_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< BD_WENO5 >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__HJWENO5_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< BD_HJWENO5 >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__HJWENO5_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< BD_HJWENO5 >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec.html#aa97387e555b7ca19eb16448ef6fb472c',1,'openvdb::v3_2_0::math::D1Vec::inX(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec.html#a3dc66ac76f6d91b7159debca6fb3d0f9',1,'openvdb::v3_2_0::math::D1Vec::inX(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2NDT_01_4.html#aa97387e555b7ca19eb16448ef6fb472c',1,'openvdb::v3_2_0::math::D1Vec< CD_2NDT >::inX(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2NDT_01_4.html#a3dc66ac76f6d91b7159debca6fb3d0f9',1,'openvdb::v3_2_0::math::D1Vec< CD_2NDT >::inX(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2ND_01_4.html#aa97387e555b7ca19eb16448ef6fb472c',1,'openvdb::v3_2_0::math::D1Vec< CD_2ND >::inX(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2ND_01_4.html#a3dc66ac76f6d91b7159debca6fb3d0f9',1,'openvdb::v3_2_0::math::D1Vec< CD_2ND >::inX(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__4TH_01_4.html#aa97387e555b7ca19eb16448ef6fb472c',1,'openvdb::v3_2_0::math::D1Vec< CD_4TH >::inX(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__4TH_01_4.html#a3dc66ac76f6d91b7159debca6fb3d0f9',1,'openvdb::v3_2_0::math::D1Vec< CD_4TH >::inX(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__6TH_01_4.html#aa97387e555b7ca19eb16448ef6fb472c',1,'openvdb::v3_2_0::math::D1Vec< CD_6TH >::inX(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__6TH_01_4.html#a3dc66ac76f6d91b7159debca6fb3d0f9',1,'openvdb::v3_2_0::math::D1Vec< CD_6TH >::inX(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D2::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D2::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::inX(const Stencil &S)']]], + ['inxandy',['inXandY',['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html#ab86b33202df61b0970be5fdcc0e3361a',1,'openvdb::v3_2_0::math::D2::inXandY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html#aa42f3edcb49c4d018bc76463f521193e',1,'openvdb::v3_2_0::math::D2::inXandY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#ab86b33202df61b0970be5fdcc0e3361a',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::inXandY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#aa42f3edcb49c4d018bc76463f521193e',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::inXandY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#ab86b33202df61b0970be5fdcc0e3361a',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::inXandY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#aa42f3edcb49c4d018bc76463f521193e',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::inXandY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#ab86b33202df61b0970be5fdcc0e3361a',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::inXandY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#aa42f3edcb49c4d018bc76463f521193e',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::inXandY(const Stencil &S)']]], + ['inxandz',['inXandZ',['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html#a6fa7c0f9488d4b5f3f5dd8da48976042',1,'openvdb::v3_2_0::math::D2::inXandZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html#ac593d8b6c08618225159b1ad5b824939',1,'openvdb::v3_2_0::math::D2::inXandZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#a6fa7c0f9488d4b5f3f5dd8da48976042',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::inXandZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#ac593d8b6c08618225159b1ad5b824939',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::inXandZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#a6fa7c0f9488d4b5f3f5dd8da48976042',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::inXandZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#ac593d8b6c08618225159b1ad5b824939',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::inXandZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#a6fa7c0f9488d4b5f3f5dd8da48976042',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::inXandZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#ac593d8b6c08618225159b1ad5b824939',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::inXandZ(const Stencil &S)']]], + ['iny',['inY',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2NDT_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< CD_2NDT >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2NDT_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< CD_2NDT >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2ND_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< CD_2ND >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2ND_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< CD_2ND >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__4TH_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< CD_4TH >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__4TH_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< CD_4TH >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__6TH_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< CD_6TH >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__6TH_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< CD_6TH >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__1ST_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< FD_1ST >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__1ST_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< FD_1ST >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__2ND_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< FD_2ND >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__2ND_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< FD_2ND >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__3RD_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< FD_3RD >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__3RD_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< FD_3RD >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__1ST_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< BD_1ST >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__1ST_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< BD_1ST >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__2ND_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< BD_2ND >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__2ND_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< BD_2ND >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__3RD_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< BD_3RD >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__3RD_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< BD_3RD >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__WENO5_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< FD_WENO5 >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__WENO5_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< FD_WENO5 >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__HJWENO5_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< FD_HJWENO5 >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__HJWENO5_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< FD_HJWENO5 >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__WENO5_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< BD_WENO5 >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__WENO5_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< BD_WENO5 >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__HJWENO5_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< BD_HJWENO5 >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__HJWENO5_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< BD_HJWENO5 >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec.html#ad4ced54e50e376faafe6438f00e036f6',1,'openvdb::v3_2_0::math::D1Vec::inY(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec.html#ae99904484987db1d694920099e32d664',1,'openvdb::v3_2_0::math::D1Vec::inY(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2NDT_01_4.html#ad4ced54e50e376faafe6438f00e036f6',1,'openvdb::v3_2_0::math::D1Vec< CD_2NDT >::inY(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2NDT_01_4.html#ae99904484987db1d694920099e32d664',1,'openvdb::v3_2_0::math::D1Vec< CD_2NDT >::inY(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2ND_01_4.html#ad4ced54e50e376faafe6438f00e036f6',1,'openvdb::v3_2_0::math::D1Vec< CD_2ND >::inY(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2ND_01_4.html#ae99904484987db1d694920099e32d664',1,'openvdb::v3_2_0::math::D1Vec< CD_2ND >::inY(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__4TH_01_4.html#ad4ced54e50e376faafe6438f00e036f6',1,'openvdb::v3_2_0::math::D1Vec< CD_4TH >::inY(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__4TH_01_4.html#ae99904484987db1d694920099e32d664',1,'openvdb::v3_2_0::math::D1Vec< CD_4TH >::inY(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__6TH_01_4.html#ad4ced54e50e376faafe6438f00e036f6',1,'openvdb::v3_2_0::math::D1Vec< CD_6TH >::inY(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__6TH_01_4.html#ae99904484987db1d694920099e32d664',1,'openvdb::v3_2_0::math::D1Vec< CD_6TH >::inY(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D2::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D2::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::inY(const Stencil &S)']]], + ['inyandz',['inYandZ',['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html#a8134534fdc212f1f52208126b29f1fb9',1,'openvdb::v3_2_0::math::D2::inYandZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html#aedbf7dc82e35db34b46bc096c0d676e5',1,'openvdb::v3_2_0::math::D2::inYandZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#a8134534fdc212f1f52208126b29f1fb9',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::inYandZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#aedbf7dc82e35db34b46bc096c0d676e5',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::inYandZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#a8134534fdc212f1f52208126b29f1fb9',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::inYandZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#aedbf7dc82e35db34b46bc096c0d676e5',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::inYandZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#a8134534fdc212f1f52208126b29f1fb9',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::inYandZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#aedbf7dc82e35db34b46bc096c0d676e5',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::inYandZ(const Stencil &S)']]], + ['inz',['inZ',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2NDT_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< CD_2NDT >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2NDT_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< CD_2NDT >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2ND_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< CD_2ND >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2ND_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< CD_2ND >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__4TH_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< CD_4TH >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__4TH_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< CD_4TH >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__6TH_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< CD_6TH >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__6TH_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< CD_6TH >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__1ST_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< FD_1ST >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__1ST_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< FD_1ST >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__2ND_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< FD_2ND >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__2ND_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< FD_2ND >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__3RD_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< FD_3RD >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__3RD_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< FD_3RD >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__1ST_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< BD_1ST >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__1ST_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< BD_1ST >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__2ND_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< BD_2ND >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__2ND_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< BD_2ND >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__3RD_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< BD_3RD >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__3RD_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< BD_3RD >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__WENO5_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< FD_WENO5 >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__WENO5_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< FD_WENO5 >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__HJWENO5_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< FD_HJWENO5 >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__HJWENO5_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< FD_HJWENO5 >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__WENO5_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< BD_WENO5 >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__WENO5_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< BD_WENO5 >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__HJWENO5_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< BD_HJWENO5 >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__HJWENO5_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< BD_HJWENO5 >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec.html#a91ec462a20bec1b52259ca8eb7dc5199',1,'openvdb::v3_2_0::math::D1Vec::inZ(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec.html#a0c12b87dcc8a9a15b60f2dc170512086',1,'openvdb::v3_2_0::math::D1Vec::inZ(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2NDT_01_4.html#a91ec462a20bec1b52259ca8eb7dc5199',1,'openvdb::v3_2_0::math::D1Vec< CD_2NDT >::inZ(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2NDT_01_4.html#a0c12b87dcc8a9a15b60f2dc170512086',1,'openvdb::v3_2_0::math::D1Vec< CD_2NDT >::inZ(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2ND_01_4.html#a91ec462a20bec1b52259ca8eb7dc5199',1,'openvdb::v3_2_0::math::D1Vec< CD_2ND >::inZ(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2ND_01_4.html#a0c12b87dcc8a9a15b60f2dc170512086',1,'openvdb::v3_2_0::math::D1Vec< CD_2ND >::inZ(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__4TH_01_4.html#a91ec462a20bec1b52259ca8eb7dc5199',1,'openvdb::v3_2_0::math::D1Vec< CD_4TH >::inZ(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__4TH_01_4.html#a0c12b87dcc8a9a15b60f2dc170512086',1,'openvdb::v3_2_0::math::D1Vec< CD_4TH >::inZ(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__6TH_01_4.html#a91ec462a20bec1b52259ca8eb7dc5199',1,'openvdb::v3_2_0::math::D1Vec< CD_6TH >::inZ(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__6TH_01_4.html#a0c12b87dcc8a9a15b60f2dc170512086',1,'openvdb::v3_2_0::math::D1Vec< CD_6TH >::inZ(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D2::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D2::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::inZ(const Stencil &S)']]], + ['io_2eh',['io.h',['../io_8h.html',1,'']]], + ['ioerror',['IoError',['../classopenvdb_1_1v3__2__0_1_1IoError.html#a3a84d31327939984888ac60da4fbd530',1,'openvdb::v3_2_0::IoError::IoError()'],['../classopenvdb_1_1v3__2__0_1_1IoError.html#aa79aa349dcea754fed123559c7853fb7',1,'openvdb::v3_2_0::IoError::IoError(const std::string &msg)']]], + ['ioerror',['IoError',['../classopenvdb_1_1v3__2__0_1_1IoError.html',1,'openvdb::v3_2_0']]], + ['is_5fdiagonal_5fjacobian',['is_diagonal_jacobian',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__diagonal__jacobian.html',1,'openvdb::v3_2_0::math']]], + ['is_5fdivisible',['is_divisible',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#aec7ec8e2a0c5b3a353264e1b0f681061',1,'openvdb::v3_2_0::math::CoordBBox::is_divisible()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange.html#aec7ec8e2a0c5b3a353264e1b0f681061',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::is_divisible()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange.html#aec7ec8e2a0c5b3a353264e1b0f681061',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::is_divisible()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorRange.html#aec7ec8e2a0c5b3a353264e1b0f681061',1,'openvdb::v3_2_0::tree::IteratorRange::is_divisible()']]], + ['is_5fdouble',['is_double',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__double.html',1,'openvdb::v3_2_0::math']]], + ['is_5fdouble_3c_20double_20_3e',['is_double< double >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__double_3_01double_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5flinear',['is_linear',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear.html',1,'openvdb::v3_2_0::math']]], + ['is_5flinear_3c_20affinemap_20_3e',['is_linear< AffineMap >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01AffineMap_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5flinear_3c_20compoundmap_3c_20t1_2c_20t2_20_3e_20_3e',['is_linear< CompoundMap< T1, T2 > >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01CompoundMap_3_01T1_00_01T2_01_4_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5flinear_3c_20scalemap_20_3e',['is_linear< ScaleMap >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01ScaleMap_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5flinear_3c_20scaletranslatemap_20_3e',['is_linear< ScaleTranslateMap >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01ScaleTranslateMap_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5flinear_3c_20translationmap_20_3e',['is_linear< TranslationMap >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01TranslationMap_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5flinear_3c_20uniformscalemap_20_3e',['is_linear< UniformScaleMap >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01UniformScaleMap_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5flinear_3c_20uniformscaletranslatemap_20_3e',['is_linear< UniformScaleTranslateMap >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01UniformScaleTranslateMap_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5flinear_3c_20unitarymap_20_3e',['is_linear< UnitaryMap >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01UnitaryMap_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5fopen',['is_open',['../classopenvdb_1_1v3__2__0_1_1io_1_1TempFile.html#a6879dafb5eadff1a2880c8a255393ef9',1,'openvdb::v3_2_0::io::TempFile']]], + ['is_5fscale',['is_scale',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__scale.html',1,'openvdb::v3_2_0::math']]], + ['is_5fscale_3c_20scalemap_20_3e',['is_scale< ScaleMap >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__scale_3_01ScaleMap_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5fscale_5ftranslate',['is_scale_translate',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__scale__translate.html',1,'openvdb::v3_2_0::math']]], + ['is_5fscale_5ftranslate_3c_20scaletranslatemap_20_3e',['is_scale_translate< ScaleTranslateMap >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__scale__translate_3_01ScaleTranslateMap_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5funiform_5fdiagonal_5fjacobian',['is_uniform_diagonal_jacobian',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__uniform__diagonal__jacobian.html',1,'openvdb::v3_2_0::math']]], + ['is_5funiform_5fscale',['is_uniform_scale',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__uniform__scale.html',1,'openvdb::v3_2_0::math']]], + ['is_5funiform_5fscale_3c_20uniformscalemap_20_3e',['is_uniform_scale< UniformScaleMap >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__uniform__scale_3_01UniformScaleMap_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5funiform_5fscale_5ftranslate',['is_uniform_scale_translate',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__uniform__scale__translate.html',1,'openvdb::v3_2_0::math']]], + ['is_5funiform_5fscale_5ftranslate_3c_20translationmap_20_3e',['is_uniform_scale_translate< TranslationMap >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__uniform__scale__translate_3_01TranslationMap_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5funiform_5fscale_5ftranslate_3c_20uniformscaletranslatemap_20_3e',['is_uniform_scale_translate< UniformScaleTranslateMap >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__uniform__scale__translate_3_01UniformScaleTranslateMap_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5fvec3d',['is_vec3d',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__vec3d.html',1,'openvdb::v3_2_0::math']]], + ['is_5fvec3d_3c_20vec3d_20_3e',['is_vec3d< Vec3d >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__vec3d_3_01Vec3d_01_4.html',1,'openvdb::v3_2_0::math']]], + ['isaffine',['isAffine',['../structopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer_1_1MatrixTransform.html#a9ce6bbb194d837844498a30647002012',1,'openvdb::v3_2_0::tools::GridTransformer::MatrixTransform::isAffine()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ABTransform.html#a9ce6bbb194d837844498a30647002012',1,'openvdb::v3_2_0::tools::ABTransform::isAffine()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1eb532cb47ab827e23dc38e084a8d5dc',1,'openvdb::v3_2_0::math::isAffine()']]], + ['isaligned',['isAligned',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler.html#a5a3b20d0b5c2519079c23d8141aa4b6e',1,'openvdb::v3_2_0::tools::DualGridSampler::isAligned()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerT_01_4.html#a5a3b20d0b5c2519079c23d8141aa4b6e',1,'openvdb::v3_2_0::tools::DualGridSampler< tree::ValueAccessor< TreeT >, SamplerT >::isAligned()']]], + ['isallocated',['isAllocated',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a0bcdab3616db481dd211594529479f94',1,'openvdb::v3_2_0::tree::LeafNode::isAllocated()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a0bcdab3616db481dd211594529479f94',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isAllocated()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a0bcdab3616db481dd211594529479f94',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isAllocated()']]], + ['isapproxequal',['isApproxEqual',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a892c3dc91b2e46854e2b5df8adab52bb',1,'openvdb::v3_2_0::math::isApproxEqual(const Type &a, const Type &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a979f3cb47671e2e22e2becf89a16c374',1,'openvdb::v3_2_0::math::isApproxEqual(const Type &a, const Type &b, const Type &tolerance)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ac02a12f569755821bde55f773ee013f1',1,'openvdb::v3_2_0::math::isApproxEqual(const Vec2< T > &a, const Vec2< T > &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4c38fb4bad0d7b400c8cb9f395fa7ee0',1,'openvdb::v3_2_0::math::isApproxEqual(const Vec2< T > &a, const Vec2< T > &b, const Vec2< T > &eps)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aa1d82bf1591d6381cf536e4aa677b35d',1,'openvdb::v3_2_0::math::isApproxEqual(const Vec3< T > &a, const Vec3< T > &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a773c814761180f05c1a53d3b001fc340',1,'openvdb::v3_2_0::math::isApproxEqual(const Vec3< T > &a, const Vec3< T > &b, const Vec3< T > &eps)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1e304cf8ee2c07cfb8a4b882d83b54ad',1,'openvdb::v3_2_0::math::isApproxEqual(const Vec4< T > &a, const Vec4< T > &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ac1ec179deb729000e0c715f97c8afc57',1,'openvdb::v3_2_0::math::isApproxEqual(const Vec4< T > &a, const Vec4< T > &b, const Vec4< T > &eps)']]], + ['isapproxequal_3c_20bool_20_3e',['isApproxEqual< bool >',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a6f8fb11b1f81500a0c990923e01d2d7a',1,'openvdb::v3_2_0::math::isApproxEqual< bool >(const bool &a, const bool &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae4c20559242cab3d1117cce4fa83064c',1,'openvdb::v3_2_0::math::isApproxEqual< bool >(const bool &a, const bool &b, const bool &)']]], + ['isapproxequal_3c_20std_3a_3astring_20_3e',['isApproxEqual< std::string >',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4264e734c55e3783b23f793e4b35b08a',1,'openvdb::v3_2_0::math::isApproxEqual< std::string >(const std::string &a, const std::string &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aa4117530c45f3f65b4d1a645013ce48e',1,'openvdb::v3_2_0::math::isApproxEqual< std::string >(const std::string &a, const std::string &b, const std::string &)']]], + ['isapproxlarger',['isApproxLarger',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#adb7f3cd00288b433cfe844f52d795a30',1,'openvdb::v3_2_0::math']]], + ['isapproxzero',['isApproxZero',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a61dea9bd833e61e92726da48caaa66eb',1,'openvdb::v3_2_0::math::isApproxZero(const Type &x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a8805f6e88971e774061687fadd44fa73',1,'openvdb::v3_2_0::math::isApproxZero(const Type &x, const Type &tolerance)']]], + ['isbackgroundtile',['isBackgroundTile',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a275e55e8c343dad4159b8ada32f99cde',1,'openvdb::v3_2_0::tree::RootNode::isBackgroundTile(const Tile &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ac259caaa98b8de89120f4cdc20926ad3',1,'openvdb::v3_2_0::tree::RootNode::isBackgroundTile(const MapIter &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a13d1d88614ecad7b27e54b48e9e1b647',1,'openvdb::v3_2_0::tree::RootNode::isBackgroundTile(const MapCIter &) const ']]], + ['iscached',['isCached',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#afb6fae9fe29723d8d350936afdce6cb1',1,'openvdb::v3_2_0::tree::ValueAccessor::isCached()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#afb6fae9fe29723d8d350936afdce6cb1',1,'openvdb::v3_2_0::tree::CacheItem::isCached()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#afb6fae9fe29723d8d350936afdce6cb1',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::isCached()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#ac60a4747c2f8c4fe9b017177855ab254',1,'openvdb::v3_2_0::tree::ValueAccessor0::isCached()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#afb6fae9fe29723d8d350936afdce6cb1',1,'openvdb::v3_2_0::tree::ValueAccessor1::isCached()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#afb6fae9fe29723d8d350936afdce6cb1',1,'openvdb::v3_2_0::tree::ValueAccessor2::isCached()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#afb6fae9fe29723d8d350936afdce6cb1',1,'openvdb::v3_2_0::tree::ValueAccessor3::isCached()']]], + ['ischildmaskoff',['isChildMaskOff',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#af1e153ed2a24f3a075035f97aef2b467',1,'openvdb::v3_2_0::tree::InternalNode::isChildMaskOff(Index n) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a00e22f49aefc09392060cf5d5c65a8e4',1,'openvdb::v3_2_0::tree::InternalNode::isChildMaskOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aecf6cbb61b0969544bd264d5092dec9e',1,'openvdb::v3_2_0::tree::LeafNode::isChildMaskOff(Index) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a00e22f49aefc09392060cf5d5c65a8e4',1,'openvdb::v3_2_0::tree::LeafNode::isChildMaskOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aecf6cbb61b0969544bd264d5092dec9e',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isChildMaskOff(Index) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a00e22f49aefc09392060cf5d5c65a8e4',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isChildMaskOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aecf6cbb61b0969544bd264d5092dec9e',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isChildMaskOff(Index) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a00e22f49aefc09392060cf5d5c65a8e4',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isChildMaskOff() const ']]], + ['ischildmaskon',['isChildMaskOn',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ac78aa9f7537d52f8bb57797469119a38',1,'openvdb::v3_2_0::tree::InternalNode::isChildMaskOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ab74c57e849d3709365668acb99b98801',1,'openvdb::v3_2_0::tree::LeafNode::isChildMaskOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ab74c57e849d3709365668acb99b98801',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isChildMaskOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ab74c57e849d3709365668acb99b98801',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isChildMaskOn()']]], + ['ischildnode',['isChildNode',['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a2399f8485cecdb8b3102546d364f70fa',1,'openvdb::v3_2_0::tree::DenseIteratorBase']]], + ['isconstant',['isConstant',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a7820ed8037aa904bd744048a15bf9221',1,'openvdb::v3_2_0::tree::InternalNode::isConstant(ValueType &constValue, bool &state, const ValueType &tolerance=zeroVal< ValueType >()) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a27932bcbc2413401194bfa313a57dbf9',1,'openvdb::v3_2_0::tree::InternalNode::isConstant(ValueType &minValue, ValueType &maxValue, bool &state, const ValueType &tolerance=zeroVal< ValueType >()) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a7820ed8037aa904bd744048a15bf9221',1,'openvdb::v3_2_0::tree::LeafNode::isConstant(ValueType &constValue, bool &state, const ValueType &tolerance=zeroVal< ValueType >()) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a27932bcbc2413401194bfa313a57dbf9',1,'openvdb::v3_2_0::tree::LeafNode::isConstant(ValueType &minValue, ValueType &maxValue, bool &state, const ValueType &tolerance=zeroVal< ValueType >()) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ac7b1511431dc882e104b69306c96bc7c',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isConstant()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ac7b1511431dc882e104b69306c96bc7c',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isConstant()']]], + ['isconsttree',['isConstTree',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#ad55e9918b7eae715b762983ff43fe422',1,'openvdb::v3_2_0::tree::LeafManager::isConstTree()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1leafmgr_1_1TreeTraits.html#aed029134efd058169d0a0d3cae1c6f32',1,'openvdb::v3_2_0::tree::leafmgr::TreeTraits::IsConstTree()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1leafmgr_1_1TreeTraits_3_01const_01TreeT_01_4.html#aed029134efd058169d0a0d3cae1c6f32',1,'openvdb::v3_2_0::tree::leafmgr::TreeTraits< const TreeT >::IsConstTree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#aed029134efd058169d0a0d3cae1c6f32',1,'openvdb::v3_2_0::tree::LeafManager::IsConstTree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html#aed029134efd058169d0a0d3cae1c6f32',1,'openvdb::v3_2_0::tree::ValueAccessorBase::IsConstTree()']]], + ['iscurl',['ISCurl',['../structopenvdb_1_1v3__2__0_1_1math_1_1ISCurl.html',1,'openvdb::v3_2_0::math']]], + ['isdelayedloadingenabled',['isDelayedLoadingEnabled',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a611c63ad5759baf8fc5950e6b2ea1f7d',1,'openvdb::v3_2_0::io::Archive']]], + ['isdense',['isDense',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a8d7772a85fd10d6e72b32a311a3c68e8',1,'openvdb::v3_2_0::tree::LeafNode::isDense()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8d7772a85fd10d6e72b32a311a3c68e8',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isDense()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8d7772a85fd10d6e72b32a311a3c68e8',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isDense()']]], + ['isdenseiterator',['IsDenseIterator',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#a613fb4feec64df5531f23ca51f014a16',1,'openvdb::v3_2_0::tree::SparseIteratorBase::IsDenseIterator()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a613fb4feec64df5531f23ca51f014a16',1,'openvdb::v3_2_0::tree::DenseIteratorBase::IsDenseIterator()']]], + ['isdiagonal',['isDiagonal',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a84c5b8f35866c567185c13806e4c854c',1,'openvdb::v3_2_0::math::AffineMap::isDiagonal()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#a84c5b8f35866c567185c13806e4c854c',1,'openvdb::v3_2_0::math::CompoundMap::isDiagonal()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7ad0a7e68f58906adf7fe2fe82354f6f',1,'openvdb::v3_2_0::math::isDiagonal()']]], + ['isdivergence',['ISDivergence',['../structopenvdb_1_1v3__2__0_1_1math_1_1ISDivergence.html',1,'openvdb::v3_2_0::math']]], + ['isempty',['isEmpty',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a861d062f60f1e813338c4f30bdc433b1',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::isEmpty()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a479432127ee77145cc19d6a2d1590821',1,'openvdb::v3_2_0::tree::InternalNode::isEmpty()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a479432127ee77145cc19d6a2d1590821',1,'openvdb::v3_2_0::tree::LeafNode::isEmpty()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a479432127ee77145cc19d6a2d1590821',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isEmpty()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a479432127ee77145cc19d6a2d1590821',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isEmpty()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a479432127ee77145cc19d6a2d1590821',1,'openvdb::v3_2_0::util::PagedArray::isEmpty()']]], + ['isequal',['isEqual',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#afb6adf26bb660e00a48bec45e99f6c2d',1,'openvdb::v3_2_0::math::MapBase::isEqual()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#ac8cf8d17943cfef767441472a999a055',1,'openvdb::v3_2_0::math::AffineMap::isEqual()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#ac8cf8d17943cfef767441472a999a055',1,'openvdb::v3_2_0::math::ScaleMap::isEqual()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#ac8cf8d17943cfef767441472a999a055',1,'openvdb::v3_2_0::math::UniformScaleMap::isEqual()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#ac8cf8d17943cfef767441472a999a055',1,'openvdb::v3_2_0::math::TranslationMap::isEqual()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#ac8cf8d17943cfef767441472a999a055',1,'openvdb::v3_2_0::math::ScaleTranslateMap::isEqual()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#ac8cf8d17943cfef767441472a999a055',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::isEqual()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#ac8cf8d17943cfef767441472a999a055',1,'openvdb::v3_2_0::math::UnitaryMap::isEqual()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#ac8cf8d17943cfef767441472a999a055',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::isEqual()']]], + ['isequalbase',['isEqualBase',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a182de35ffb5ffa4ffd45e84681307fc2',1,'openvdb::v3_2_0::math::MapBase']]], + ['isexactlyequal',['isExactlyEqual',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a92113b7362b31951eb9efbab29f24af3',1,'openvdb::v3_2_0::math']]], + ['isfinite',['isFinite',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#aaa962dc12423e9f7039ac52dcb386da0',1,'openvdb::v3_2_0::math::pcg::Vector::isFinite()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#aaa962dc12423e9f7039ac52dcb386da0',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::isFinite()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1JacobiPreconditioner.html#aaa962dc12423e9f7039ac52dcb386da0',1,'openvdb::v3_2_0::math::pcg::JacobiPreconditioner::isFinite()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#aaa962dc12423e9f7039ac52dcb386da0',1,'openvdb::v3_2_0::math::Vec2::isFinite()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#aaa962dc12423e9f7039ac52dcb386da0',1,'openvdb::v3_2_0::math::Vec3::isFinite()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#aaa962dc12423e9f7039ac52dcb386da0',1,'openvdb::v3_2_0::math::Vec4::isFinite()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9fa66b7065fdd3f42f9c64d84ef3e06f',1,'openvdb::v3_2_0::math::isFinite(const Type &x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ac5b8aded39e9594dd590c2a6d88bec1a',1,'openvdb::v3_2_0::math::isFinite(const Vec2< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a6579941308f773e38db844cdbd2ee8c2',1,'openvdb::v3_2_0::math::isFinite(const Vec3< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aa4f89856b8ccc6d813f54a30db72d888',1,'openvdb::v3_2_0::math::isFinite(const Vec4< T > &v)']]], + ['isfiniteop',['IsFiniteOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1IsFiniteOp.html',1,'openvdb::v3_2_0::math::pcg::Vector']]], + ['isfiniteop',['IsFiniteOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1IsFiniteOp.html',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix']]], + ['isfiniteop',['IsFiniteOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1IsFiniteOp.html#aa5d688041f6800ee0f66881681ecdb64',1,'openvdb::v3_2_0::math::pcg::Vector::IsFiniteOp::IsFiniteOp()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1IsFiniteOp.html#a85fa9bb20ec8b770e101ec0ba66c064f',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::IsFiniteOp::IsFiniteOp()']]], + ['isgradient',['ISGradient',['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradient.html',1,'openvdb::v3_2_0::math']]], + ['isgradientbiased',['ISGradientBiased',['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradientBiased.html',1,'openvdb::v3_2_0::math']]], + ['isgradientnormsqrd',['ISGradientNormSqrd',['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradientNormSqrd.html',1,'openvdb::v3_2_0::math']]], + ['isgridstatsmetadataenabled',['isGridStatsMetadataEnabled',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a6c45a21f3fcf52a987561e20e321a610',1,'openvdb::v3_2_0::io::Archive']]], + ['isidentical',['isIdentical',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a666033d51d34fd46fda690832b1bc953',1,'openvdb::v3_2_0::io::Archive']]], + ['isidentity',['isIdentity',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a800851025d068929cc2d3f895cd6d630',1,'openvdb::v3_2_0::math::AffineMap::isIdentity()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a800851025d068929cc2d3f895cd6d630',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::isIdentity()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#a800851025d068929cc2d3f895cd6d630',1,'openvdb::v3_2_0::math::CompoundMap::isIdentity()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a800851025d068929cc2d3f895cd6d630',1,'openvdb::v3_2_0::math::Transform::isIdentity()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ABTransform.html#a800851025d068929cc2d3f895cd6d630',1,'openvdb::v3_2_0::tools::ABTransform::isIdentity()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1099c5d1cafb221aebe456853ae37ca8',1,'openvdb::v3_2_0::math::isIdentity()']]], + ['isinactive',['isInactive',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a44b7e3231fdb2ff6ee1fb822b2b921eb',1,'openvdb::v3_2_0::tree::InternalNode::isInactive()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a44b7e3231fdb2ff6ee1fb822b2b921eb',1,'openvdb::v3_2_0::tree::LeafNode::isInactive()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a44b7e3231fdb2ff6ee1fb822b2b921eb',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isInactive()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a44b7e3231fdb2ff6ee1fb822b2b921eb',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isInactive()']]], + ['isinfinite',['isInfinite',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ac16be5bc56c10702ee4c4c2499b3ade8',1,'openvdb::v3_2_0::math::Vec2::isInfinite()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ac16be5bc56c10702ee4c4c2499b3ade8',1,'openvdb::v3_2_0::math::Vec3::isInfinite()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#ac16be5bc56c10702ee4c4c2499b3ade8',1,'openvdb::v3_2_0::math::Vec4::isInfinite()']]], + ['isinside',['isInside',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a60ce8846964f11d587dcbf819c14b3f6',1,'openvdb::v3_2_0::math::BBox::isInside(const Vec3T &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#abd42d7e5bc9e5c107991bf796a16bf5d',1,'openvdb::v3_2_0::math::BBox::isInside(const BBox &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a2b9b74537d8b39782b61afc83ad9e525',1,'openvdb::v3_2_0::math::CoordBBox::isInside(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a210a285ca2913c82d5eaed5e11ad58f1',1,'openvdb::v3_2_0::math::CoordBBox::isInside(const CoordBBox &b) const ']]], + ['isinstance',['isInstance',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a6840abcf08a03edcc035bc46d5bf8c58',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['isinstancingenabled',['isInstancingEnabled',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a8007c0f8975d1b45fd2c926035879c79',1,'openvdb::v3_2_0::io::Archive']]], + ['isinvertible',['isInvertible',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a01759890821906edd36a9e108ee1cfc4',1,'openvdb::v3_2_0::math']]], + ['isinworldspace',['isInWorldSpace',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a29e160275061736e411c8a5892fcff95',1,'openvdb::v3_2_0::GridBase']]], + ['islaplacian',['ISLaplacian',['../structopenvdb_1_1v3__2__0_1_1math_1_1ISLaplacian.html',1,'openvdb::v3_2_0::math']]], + ['islaplacian_3c_20cd_5ffourth_20_3e',['ISLaplacian< CD_FOURTH >',['../structopenvdb_1_1v3__2__0_1_1math_1_1ISLaplacian_3_01CD__FOURTH_01_4.html',1,'openvdb::v3_2_0::math']]], + ['islaplacian_3c_20cd_5fsecond_20_3e',['ISLaplacian< CD_SECOND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1ISLaplacian_3_01CD__SECOND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['islaplacian_3c_20cd_5fsixth_20_3e',['ISLaplacian< CD_SIXTH >',['../structopenvdb_1_1v3__2__0_1_1math_1_1ISLaplacian_3_01CD__SIXTH_01_4.html',1,'openvdb::v3_2_0::math']]], + ['islaplacianop',['ISLaplacianOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1ISLaplacianOp.html#a13c4a6332c39facf249eca3efb0488e0',1,'openvdb::v3_2_0::tools::poisson::internal::ISLaplacianOp']]], + ['islaplacianop',['ISLaplacianOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1ISLaplacianOp.html',1,'openvdb::v3_2_0::tools::poisson::internal']]], + ['islimiteron',['isLimiterOn',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#ac9c2bcda19e3d8976221731c4fe9d3ac',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['islinear',['isLinear',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a92759be692dcbc1e4793d6fc3545481e',1,'openvdb::v3_2_0::math::MapBase::isLinear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a792fef1281c0bcc191b5bf4330f5eeb3',1,'openvdb::v3_2_0::math::AffineMap::isLinear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a792fef1281c0bcc191b5bf4330f5eeb3',1,'openvdb::v3_2_0::math::ScaleMap::isLinear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a792fef1281c0bcc191b5bf4330f5eeb3',1,'openvdb::v3_2_0::math::TranslationMap::isLinear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a792fef1281c0bcc191b5bf4330f5eeb3',1,'openvdb::v3_2_0::math::ScaleTranslateMap::isLinear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a792fef1281c0bcc191b5bf4330f5eeb3',1,'openvdb::v3_2_0::math::UnitaryMap::isLinear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a792fef1281c0bcc191b5bf4330f5eeb3',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::isLinear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a792fef1281c0bcc191b5bf4330f5eeb3',1,'openvdb::v3_2_0::math::Transform::isLinear()']]], + ['ismaskinverted',['isMaskInverted',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a65fd4cbed33f121baba4fa2228cba655',1,'openvdb::v3_2_0::tools::Filter::isMaskInverted()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a65fd4cbed33f121baba4fa2228cba655',1,'openvdb::v3_2_0::tools::LevelSetFilter::isMaskInverted()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a65fd4cbed33f121baba4fa2228cba655',1,'openvdb::v3_2_0::tools::LevelSetMorphing::isMaskInverted()']]], + ['ismeancurvature',['ISMeanCurvature',['../structopenvdb_1_1v3__2__0_1_1math_1_1ISMeanCurvature.html',1,'openvdb::v3_2_0::math']]], + ['ismergable',['isMergable',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a97e8214c312b6756f3a7e3f8bfff18a7',1,'openvdb::v3_2_0::tools::internal']]], + ['isnan',['isNan',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ac30b6cb765118673cdd5a23541507c09',1,'openvdb::v3_2_0::math::Vec2::isNan()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ac30b6cb765118673cdd5a23541507c09',1,'openvdb::v3_2_0::math::Vec3::isNan()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#ac30b6cb765118673cdd5a23541507c09',1,'openvdb::v3_2_0::math::Vec4::isNan()']]], + ['isnegative',['IsNegative',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ValidateIntersectingVoxels_1_1IsNegative.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ValidateIntersectingVoxels']]], + ['isnegative',['isNegative',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab306071e74e79d73c5fd9e86b0d264c3',1,'openvdb::v3_2_0::math']]], + ['isnegative_3c_20bool_20_3e',['isNegative< bool >',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ac4b9216c65da97ebb21cfac4ffb68404',1,'openvdb::v3_2_0::math']]], + ['isnonmanifold',['isNonManifold',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#af1adb88e5f7cc92b15651d1e7f7a1545',1,'openvdb::v3_2_0::tools::internal']]], + ['isoff',['isOff',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a9a8a6aae8eaaacf99a55ecb42d80f2cf',1,'openvdb::v3_2_0::util::NodeMask::isOff(Index32 n) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ad087dfc3726786e34d6ee1a745482c4a',1,'openvdb::v3_2_0::util::NodeMask::isOff() const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a9a8a6aae8eaaacf99a55ecb42d80f2cf',1,'openvdb::v3_2_0::util::NodeMask< 1 >::isOff(Index32 n) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ad087dfc3726786e34d6ee1a745482c4a',1,'openvdb::v3_2_0::util::NodeMask< 1 >::isOff() const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a9a8a6aae8eaaacf99a55ecb42d80f2cf',1,'openvdb::v3_2_0::util::NodeMask< 2 >::isOff(Index32 n) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ad087dfc3726786e34d6ee1a745482c4a',1,'openvdb::v3_2_0::util::NodeMask< 2 >::isOff() const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#acf084df9fa908471eafd64dd5637b823',1,'openvdb::v3_2_0::util::RootNodeMask::isOff(Index32 i) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#ad087dfc3726786e34d6ee1a745482c4a',1,'openvdb::v3_2_0::util::RootNodeMask::isOff() const ']]], + ['ison',['isOn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1Neighbor.html#ae530c5af75c42fc2bd1fb588c38aa332',1,'openvdb::v3_2_0::tools::Morphology::Neighbor::isOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a8a125384c2ac1b1ac00df0e0c0c4a6ee',1,'openvdb::v3_2_0::util::NodeMask::isOn(Index32 n) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ad640481f5aa58f0a441d079c0b0db242',1,'openvdb::v3_2_0::util::NodeMask::isOn() const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a8a125384c2ac1b1ac00df0e0c0c4a6ee',1,'openvdb::v3_2_0::util::NodeMask< 1 >::isOn(Index32 n) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ad640481f5aa58f0a441d079c0b0db242',1,'openvdb::v3_2_0::util::NodeMask< 1 >::isOn() const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a8a125384c2ac1b1ac00df0e0c0c4a6ee',1,'openvdb::v3_2_0::util::NodeMask< 2 >::isOn(Index32 n) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ad640481f5aa58f0a441d079c0b0db242',1,'openvdb::v3_2_0::util::NodeMask< 2 >::isOn() const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a536d8b61dd7136c3eb44735ade334ac6',1,'openvdb::v3_2_0::util::RootNodeMask::isOn(Index32 i) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#ad640481f5aa58f0a441d079c0b0db242',1,'openvdb::v3_2_0::util::RootNodeMask::isOn() const ']]], + ['isopen',['isOpen',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a3c7351cec1380d07f9e4b3ec96b2b1ff',1,'openvdb::v3_2_0::io::File']]], + ['isopmagnitude',['ISOpMagnitude',['../structopenvdb_1_1v3__2__0_1_1math_1_1ISOpMagnitude.html',1,'openvdb::v3_2_0::math']]], + ['isoutofcore',['isOutOfCore',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#abefaa5655732590505cca9bb58b58842',1,'openvdb::v3_2_0::tree::LeafNode::Buffer']]], + ['ispartiallyfull',['isPartiallyFull',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a080904baf0bde768ef4d5f6a97daa507',1,'openvdb::v3_2_0::util::PagedArray']]], + ['isplanarquad',['isPlanarQuad',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a149975eccdfed56994cdc459276b6e58',1,'openvdb::v3_2_0::tools::internal']]], + ['isreal',['isReal',['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf.html#af9bdc3014f3d54c426b6d2df10de4960aae204e82e802cce8f89a7876f138dbb8',1,'openvdb::v3_2_0::io::RealToHalf::isReal()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01float_01_4.html#adb49720dc49f7d4e4cf9adbf2948e409aae204e82e802cce8f89a7876f138dbb8',1,'openvdb::v3_2_0::io::RealToHalf< float >::isReal()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01double_01_4.html#aae05225933a42f81e7c4a9fb286596f9aae204e82e802cce8f89a7876f138dbb8',1,'openvdb::v3_2_0::io::RealToHalf< double >::isReal()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec2s_01_4.html#a39fca1837c5ce7715cbf571669660c13aae204e82e802cce8f89a7876f138dbb8',1,'openvdb::v3_2_0::io::RealToHalf< Vec2s >::isReal()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec2d_01_4.html#aaf8fd5f0e57d456151c951e0f3715fc4aae204e82e802cce8f89a7876f138dbb8',1,'openvdb::v3_2_0::io::RealToHalf< Vec2d >::isReal()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec3s_01_4.html#a94798fdadfbf49a7c658ace669a1d310aae204e82e802cce8f89a7876f138dbb8',1,'openvdb::v3_2_0::io::RealToHalf< Vec3s >::isReal()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec3d_01_4.html#ae4d5251432e1a9e6803c0240cc492e18aae204e82e802cce8f89a7876f138dbb8',1,'openvdb::v3_2_0::io::RealToHalf< Vec3d >::isReal()']]], + ['isregistered',['isRegistered',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a87b07a96aff6b51f81237f15c9c2f921',1,'openvdb::v3_2_0::GridBase::isRegistered()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a96d1172922578d7533775faaf26992e7',1,'openvdb::v3_2_0::Grid::isRegistered()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapRegistry.html#a429a2a674329831c558db941e742cf10',1,'openvdb::v3_2_0::math::MapRegistry::isRegistered()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a96d1172922578d7533775faaf26992e7',1,'openvdb::v3_2_0::math::AffineMap::isRegistered()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a96d1172922578d7533775faaf26992e7',1,'openvdb::v3_2_0::math::ScaleMap::isRegistered()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#a96d1172922578d7533775faaf26992e7',1,'openvdb::v3_2_0::math::UniformScaleMap::isRegistered()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a96d1172922578d7533775faaf26992e7',1,'openvdb::v3_2_0::math::TranslationMap::isRegistered()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a96d1172922578d7533775faaf26992e7',1,'openvdb::v3_2_0::math::ScaleTranslateMap::isRegistered()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#a96d1172922578d7533775faaf26992e7',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::isRegistered()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a96d1172922578d7533775faaf26992e7',1,'openvdb::v3_2_0::math::UnitaryMap::isRegistered()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a96d1172922578d7533775faaf26992e7',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::isRegistered()']]], + ['isregisteredtype',['isRegisteredType',['../classopenvdb_1_1v3__2__0_1_1Metadata.html#aa9b76271b1a77807fa6910d6bbe7c467',1,'openvdb::v3_2_0::Metadata::isRegisteredType()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a98d16165e02b990e1505f9bdc4d822a5',1,'openvdb::v3_2_0::TypedMetadata::isRegisteredType()']]], + ['isrelorapproxequal',['isRelOrApproxEqual',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aac702111dfbe1f87ef14cb592d7004bc',1,'openvdb::v3_2_0::math::isRelOrApproxEqual(const Type &a, const Type &b, const Type &absTol, const Type &relTol)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af40c1962dde6bf8d4f40710c94da48e1',1,'openvdb::v3_2_0::math::isRelOrApproxEqual(const bool &a, const bool &b, const bool &, const bool &)']]], + ['issafe',['isSafe',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html#af069e2e79372f93966b8cdaf405e7e9c',1,'openvdb::v3_2_0::tree::ValueAccessorBase']]], + ['issample',['isSample',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#aaf598a06b57acc909b76d0b0b7432abc',1,'openvdb::v3_2_0::tools::GridSampler::isSample(const Coord &ijk) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#a03ebf0d69329adf5a3bb2ec9a978538f',1,'openvdb::v3_2_0::tools::GridSampler::isSample(const Vec3d &ispoint) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html#aaf598a06b57acc909b76d0b0b7432abc',1,'openvdb::v3_2_0::tools::GridSampler< tree::ValueAccessor< TreeT >, SamplerType >::isSample(const Coord &ijk) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html#a03ebf0d69329adf5a3bb2ec9a978538f',1,'openvdb::v3_2_0::tools::GridSampler< tree::ValueAccessor< TreeT >, SamplerType >::isSample(const Vec3d &ispoint) const ']]], + ['isscale',['isScale',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a47f394d6a693e1769264460f4468593d',1,'openvdb::v3_2_0::math::AffineMap']]], + ['isscaletranslate',['isScaleTranslate',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#aeccff53220ba5d95e0a01083cae6e0b9',1,'openvdb::v3_2_0::math::AffineMap']]], + ['issorted',['isSorted',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#ada8ccbfae8ad9120b791b43000fc6dda',1,'openvdb::v3_2_0::math::BBox']]], + ['issparseiterator',['IsSparseIterator',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#a60f03f7ddff0699d38a58e1038d44b99',1,'openvdb::v3_2_0::tree::SparseIteratorBase::IsSparseIterator()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a60f03f7ddff0699d38a58e1038d44b99',1,'openvdb::v3_2_0::tree::DenseIteratorBase::IsSparseIterator()']]], + ['isstencil',['ISStencil',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01SECOND__BIAS_01_4_1_1ISStencil.html',1,'openvdb::v3_2_0::math::BIAS_SCHEME< SECOND_BIAS >']]], + ['isstencil',['ISStencil',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01WENO5__BIAS_01_4_1_1ISStencil.html',1,'openvdb::v3_2_0::math::BIAS_SCHEME< WENO5_BIAS >']]], + ['isstencil',['ISStencil',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01THIRD__BIAS_01_4_1_1ISStencil.html',1,'openvdb::v3_2_0::math::BIAS_SCHEME< THIRD_BIAS >']]], + ['isstencil',['ISStencil',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01HJWENO5__BIAS_01_4_1_1ISStencil.html',1,'openvdb::v3_2_0::math::BIAS_SCHEME< HJWENO5_BIAS >']]], + ['isstencil',['ISStencil',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01FIRST__BIAS_01_4_1_1ISStencil.html',1,'openvdb::v3_2_0::math::BIAS_SCHEME< FIRST_BIAS >']]], + ['isstencil',['ISStencil',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_1_1ISStencil.html',1,'openvdb::v3_2_0::math::BIAS_SCHEME']]], + ['issymmetric',['isSymmetric',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#abc32aef619a8ff1816e64b23d1c33144',1,'openvdb::v3_2_0::math']]], + ['istilevalue',['isTileValue',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#ac8ef1156136b48723a2a603dd67f3efc',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase']]], + ['istype',['isType',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#aa6af20b4807e0ff1021f08015a0c8779',1,'openvdb::v3_2_0::GridBase::isType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#aa6af20b4807e0ff1021f08015a0c8779',1,'openvdb::v3_2_0::math::MapBase::isType()']]], + ['isulpsequal',['isUlpsEqual',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#abab55bb6f066abbfcc41ef7c432d8d9f',1,'openvdb::v3_2_0::math::isUlpsEqual(const double aLeft, const double aRight, const int64_t aUnitsInLastPlace)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab5d7a8df78e36d7baf4f2cf35eb236ec',1,'openvdb::v3_2_0::math::isUlpsEqual(const float aLeft, const float aRight, const int32_t aUnitsInLastPlace)']]], + ['isunitary',['isUnitary',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1e567cf5c693a81ef5d5d430d0922d49',1,'openvdb::v3_2_0::math']]], + ['isvalid',['isValid',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Preconditioner.html#a2bbcf8a73ebf3b9b327b0b646e9dd053',1,'openvdb::v3_2_0::math::pcg::Preconditioner::isValid()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#a2bbcf8a73ebf3b9b327b0b646e9dd053',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner::isValid()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#aac1b70a2ed67ead038c4d3f5ac4d8a81',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::isValid()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#aac1b70a2ed67ead038c4d3f5ac4d8a81',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::isValid()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#aac1b70a2ed67ead038c4d3f5ac4d8a81',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::isValid()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#aac1b70a2ed67ead038c4d3f5ac4d8a81',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::isValid()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#aac1b70a2ed67ead038c4d3f5ac4d8a81',1,'openvdb::v3_2_0::util::PagedArray::Iterator::isValid()']]], + ['isvalidpartition',['isValidPartition',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#af2c25ce7b65fe2e22209dce0b5eae646',1,'openvdb::v3_2_0::tools']]], + ['isvaluemaskoff',['isValueMaskOff',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aa9feb5633222e4f2d32db3d74a7c7d3f',1,'openvdb::v3_2_0::tree::InternalNode::isValueMaskOff(Index n) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a0cc5de204db737b967e9e6a298ab7ef7',1,'openvdb::v3_2_0::tree::InternalNode::isValueMaskOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aa9feb5633222e4f2d32db3d74a7c7d3f',1,'openvdb::v3_2_0::tree::LeafNode::isValueMaskOff(Index n) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a0cc5de204db737b967e9e6a298ab7ef7',1,'openvdb::v3_2_0::tree::LeafNode::isValueMaskOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aa9feb5633222e4f2d32db3d74a7c7d3f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isValueMaskOff(Index n) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a0cc5de204db737b967e9e6a298ab7ef7',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isValueMaskOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aa9feb5633222e4f2d32db3d74a7c7d3f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isValueMaskOff(Index n) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a0cc5de204db737b967e9e6a298ab7ef7',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isValueMaskOff() const ']]], + ['isvaluemaskon',['isValueMaskOn',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a5f3eea16a51e9b1e79b091f3d79b2ef1',1,'openvdb::v3_2_0::tree::InternalNode::isValueMaskOn(Index n) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a5fb6db2f511bcdf54777e2402dc59dad',1,'openvdb::v3_2_0::tree::InternalNode::isValueMaskOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a5f3eea16a51e9b1e79b091f3d79b2ef1',1,'openvdb::v3_2_0::tree::LeafNode::isValueMaskOn(Index n) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a5fb6db2f511bcdf54777e2402dc59dad',1,'openvdb::v3_2_0::tree::LeafNode::isValueMaskOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a5f3eea16a51e9b1e79b091f3d79b2ef1',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isValueMaskOn(Index n) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a5fb6db2f511bcdf54777e2402dc59dad',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isValueMaskOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a5f3eea16a51e9b1e79b091f3d79b2ef1',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isValueMaskOn(Index n) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a5fb6db2f511bcdf54777e2402dc59dad',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isValueMaskOn() const ']]], + ['isvalueoff',['isValueOff',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a168febad09b98d06f2ca7df00c7f9d5a',1,'openvdb::v3_2_0::tree::Tree']]], + ['isvalueon',['isValueOn',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#afc695b4cc2c115afbdb51d4997b69747',1,'openvdb::v3_2_0::tree::InternalNode::isValueOn(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ab471165041eb1c9de3c9beb14d1ca7b7',1,'openvdb::v3_2_0::tree::InternalNode::isValueOn(Index offset) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#a8c51d47261098e99edc61d511eaddaa1',1,'openvdb::v3_2_0::tree::IteratorBase::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#afc695b4cc2c115afbdb51d4997b69747',1,'openvdb::v3_2_0::tree::LeafNode::isValueOn(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ab471165041eb1c9de3c9beb14d1ca7b7',1,'openvdb::v3_2_0::tree::LeafNode::isValueOn(Index offset) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#afc695b4cc2c115afbdb51d4997b69747',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isValueOn(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ab471165041eb1c9de3c9beb14d1ca7b7',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isValueOn(Index offset) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#afc695b4cc2c115afbdb51d4997b69747',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isValueOn(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ab471165041eb1c9de3c9beb14d1ca7b7',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isValueOn(Index offset) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#afc695b4cc2c115afbdb51d4997b69747',1,'openvdb::v3_2_0::tree::RootNode::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#afc695b4cc2c115afbdb51d4997b69747',1,'openvdb::v3_2_0::tree::Tree::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#ae39edfdc8a8f8012578234f6cd8166d8',1,'openvdb::v3_2_0::tree::IterListItem::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#ae39edfdc8a8f8012578234f6cd8166d8',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#ae39edfdc8a8f8012578234f6cd8166d8',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a8c51d47261098e99edc61d511eaddaa1',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#afc695b4cc2c115afbdb51d4997b69747',1,'openvdb::v3_2_0::tree::ValueAccessor::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#ab536a309cecef1f3940c7cffcdb17326',1,'openvdb::v3_2_0::tree::CacheItem::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#ab536a309cecef1f3940c7cffcdb17326',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#afc695b4cc2c115afbdb51d4997b69747',1,'openvdb::v3_2_0::tree::ValueAccessor0::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#afc695b4cc2c115afbdb51d4997b69747',1,'openvdb::v3_2_0::tree::ValueAccessor1::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#afc695b4cc2c115afbdb51d4997b69747',1,'openvdb::v3_2_0::tree::ValueAccessor2::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#afc695b4cc2c115afbdb51d4997b69747',1,'openvdb::v3_2_0::tree::ValueAccessor3::isValueOn()']]], + ['isvalueonandcache',['isValueOnAndCache',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a7b19bb2b11319fb6eaab50aada9bff01',1,'openvdb::v3_2_0::tree::InternalNode::isValueOnAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a7b19bb2b11319fb6eaab50aada9bff01',1,'openvdb::v3_2_0::tree::LeafNode::isValueOnAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a7b19bb2b11319fb6eaab50aada9bff01',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isValueOnAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a7b19bb2b11319fb6eaab50aada9bff01',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isValueOnAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a7b19bb2b11319fb6eaab50aada9bff01',1,'openvdb::v3_2_0::tree::RootNode::isValueOnAndCache()']]], + ['isvec',['IsVec',['../structopenvdb_1_1v3__2__0_1_1VecTraits.html#a9245bd630c2aa374c09b0e04fa6d718f',1,'openvdb::v3_2_0::VecTraits::IsVec()'],['../structopenvdb_1_1v3__2__0_1_1VecTraits_3_01math_1_1Vec2_3_01T_01_4_01_4.html#a9245bd630c2aa374c09b0e04fa6d718f',1,'openvdb::v3_2_0::VecTraits< math::Vec2< T > >::IsVec()'],['../structopenvdb_1_1v3__2__0_1_1VecTraits_3_01math_1_1Vec3_3_01T_01_4_01_4.html#a9245bd630c2aa374c09b0e04fa6d718f',1,'openvdb::v3_2_0::VecTraits< math::Vec3< T > >::IsVec()'],['../structopenvdb_1_1v3__2__0_1_1VecTraits_3_01math_1_1Vec4_3_01T_01_4_01_4.html#a9245bd630c2aa374c09b0e04fa6d718f',1,'openvdb::v3_2_0::VecTraits< math::Vec4< T > >::IsVec()']]], + ['isvoxel',['isVoxel',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#aeb46a66709addd0a7820262a83e3f7e7',1,'openvdb::v3_2_0::tree::ValueAccessor::isVoxel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#af01b2774d580fed727a71c476a8677e2',1,'openvdb::v3_2_0::tree::CacheItem::isVoxel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#af01b2774d580fed727a71c476a8677e2',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::isVoxel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#aeb46a66709addd0a7820262a83e3f7e7',1,'openvdb::v3_2_0::tree::ValueAccessor0::isVoxel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#aeb46a66709addd0a7820262a83e3f7e7',1,'openvdb::v3_2_0::tree::ValueAccessor1::isVoxel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#aeb46a66709addd0a7820262a83e3f7e7',1,'openvdb::v3_2_0::tree::ValueAccessor2::isVoxel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#aeb46a66709addd0a7820262a83e3f7e7',1,'openvdb::v3_2_0::tree::ValueAccessor3::isVoxel()']]], + ['isvoxelvalue',['isVoxelValue',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#ab9c194ebbea479df6907dda14823edee',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase']]], + ['iszero',['isZero',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a839d3b1e54b3c25346595bd7eabe72a0',1,'openvdb::v3_2_0::math::isZero(const Type &x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a6633e6a79ed15b8832c02fabca54a47f',1,'openvdb::v3_2_0::math::isZero(const Vec2< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9ae2e4b285657d57dd210bffbc3614e9',1,'openvdb::v3_2_0::math::isZero(const Vec3< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a5125aea203eb95a7cf3c0b1b8edbb706',1,'openvdb::v3_2_0::math::isZero(const Vec4< T > &v)']]], + ['iterations',['iterations',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1State.html#a1d10e252e778731e59f0f71afd7e727e',1,'openvdb::v3_2_0::math::pcg::State']]], + ['iterator',['Iterator',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html',1,'openvdb::v3_2_0::tools::ParticleAtlas']]], + ['iterator',['Iterator',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox_1_1Iterator.html',1,'openvdb::v3_2_0::math::CoordBBox']]], + ['iterator',['Iterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html',1,'openvdb::v3_2_0::util::PagedArray']]], + ['iterator',['Iterator',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html',1,'openvdb::v3_2_0::tree::NodeList::NodeRange']]], + ['iterator',['iterator',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorRange.html#a4ff2fe797a9bf5ecbd4099f6fbcd8577',1,'openvdb::v3_2_0::tree::IteratorRange::iterator()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox_1_1Iterator.html#aff5f87db967ff20c3259a7cf9e484733',1,'openvdb::v3_2_0::math::CoordBBox::Iterator::Iterator()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#af6a6a0332109d52244feb43fc41df1c9',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::Iterator()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#a6d9661a3e2f3c9a1c20578e10980e127',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::Iterator()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#aa904dffcf0d3902944b35804ee9e226e',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::Iterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a1f703720e1f5d97a0386c2dfe803c763',1,'openvdb::v3_2_0::util::PagedArray::Iterator::Iterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a32ce35312e15ceddd7c5279457cb5cc0',1,'openvdb::v3_2_0::util::PagedArray::Iterator::Iterator(PagedArray &parent, size_t pos=0)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a2b76c2e597bc9393f2b99e869e4fa8d2',1,'openvdb::v3_2_0::util::PagedArray::Iterator::Iterator(const Iterator &other)']]], + ['iterator',['Iterator',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange']]], + ['iterator_2eh',['Iterator.h',['../Iterator_8h.html',1,'']]], + ['iteratorbase',['IteratorBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['iteratorbase',['IteratorBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#aa7feb0a022677d9dcb44c5c220db40b6',1,'openvdb::v3_2_0::tree::IteratorBase::IteratorBase()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#ad27dff84071fd8169e5aede08a5f82c8',1,'openvdb::v3_2_0::tree::IteratorBase::IteratorBase(const MaskIterT &iter, NodeT *parent)']]], + ['iteratorbase_3c_20maskdenseiter_2c_20leafnode_20_3e',['IteratorBase< MaskDenseIter, LeafNode >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a4c74a0a4d53c8800ac1398729de810ba',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::IteratorBase< MaskDenseIter, LeafNode >()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a4c74a0a4d53c8800ac1398729de810ba',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::IteratorBase< MaskDenseIter, LeafNode >()']]], + ['iteratorbase_3c_20maskdenseiter_2c_20nodet_20_3e',['IteratorBase< MaskDenseIter, NodeT >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['iteratorbase_3c_20maskdenseiterator_2c_20internalnode_20_3e',['IteratorBase< MaskDenseIterator, InternalNode >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ad4f85768c6ab3bd7b0cc76eb825f5042',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['iteratorbase_3c_20maskdenseiterator_2c_20leafnode_20_3e',['IteratorBase< MaskDenseIterator, LeafNode >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ae892d82a90aca2a915c8fcaa47019559',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['iteratorbase_3c_20maskdenseiterator_2c_20nodet_20_3e',['IteratorBase< MaskDenseIterator, NodeT >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['iteratorbase_3c_20maskoffiter_2c_20leafnode_20_3e',['IteratorBase< MaskOffIter, LeafNode >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a18f0e02b416494ad1869af09e3bbb3f5',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::IteratorBase< MaskOffIter, LeafNode >()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a18f0e02b416494ad1869af09e3bbb3f5',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::IteratorBase< MaskOffIter, LeafNode >()']]], + ['iteratorbase_3c_20maskoffiterator_2c_20internalnode_20_3e',['IteratorBase< MaskOffIterator, InternalNode >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#acf55bfd617c2997e7f10c7ae61e112d4',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['iteratorbase_3c_20maskoffiterator_2c_20leafnode_20_3e',['IteratorBase< MaskOffIterator, LeafNode >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a128718657ba71c5f77cd6c01cbae6bac',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['iteratorbase_3c_20maskoniter_2c_20leafnode_20_3e',['IteratorBase< MaskOnIter, LeafNode >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a94606ef790406076be26d47be96fb4eb',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::IteratorBase< MaskOnIter, LeafNode >()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a94606ef790406076be26d47be96fb4eb',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::IteratorBase< MaskOnIter, LeafNode >()']]], + ['iteratorbase_3c_20maskoniterator_2c_20internalnode_20_3e',['IteratorBase< MaskOnIterator, InternalNode >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a3600507f55f3f4a1e38b481435756f5b',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['iteratorbase_3c_20maskoniterator_2c_20leafnode_20_3e',['IteratorBase< MaskOnIterator, LeafNode >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a1cd20542045038ece79860e343d2b651',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['iteratorrange',['IteratorRange',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorRange.html#a2e175e3f2470f07e680f4425be179a78',1,'openvdb::v3_2_0::tree::IteratorRange::IteratorRange(const IterT &iter, size_t grainSize=8)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorRange.html#aecb920bf1f1dfb371b6a4eb10df59cba',1,'openvdb::v3_2_0::tree::IteratorRange::IteratorRange(IteratorRange &other, tbb::split)']]], + ['iteratorrange',['IteratorRange',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorRange.html',1,'openvdb::v3_2_0::tree']]], + ['iterlistitem',['IterListItem',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html',1,'openvdb::v3_2_0::tree']]], + ['iterlistitem',['IterListItem',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a195b86eb2a3358a5a26900eba1d7e7fa',1,'openvdb::v3_2_0::tree::IterListItem::IterListItem(PrevItemT *prev)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#af0d4f849017fd98c28f56ea3c11a9a95',1,'openvdb::v3_2_0::tree::IterListItem::IterListItem(const IterListItem &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#ac02cb89cd65c78e4a788dd2c47ceb6b1',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::IterListItem(PrevItemT *)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#af0d4f849017fd98c28f56ea3c11a9a95',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::IterListItem(const IterListItem &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a195b86eb2a3358a5a26900eba1d7e7fa',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::IterListItem(PrevItemT *prev)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#af0d4f849017fd98c28f56ea3c11a9a95',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::IterListItem(const IterListItem &other)']]], + ['iterlistitem_3c_20iterlistitem_2c_20restt_2c_20vecsize_2d1_2c_201_20_3e',['IterListItem< IterListItem, RestT, VecSize-1, 1 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html',1,'openvdb::v3_2_0::tree']]], + ['iterlistitem_3c_20prevchilditem_2c_20invtreet_2c_20root_5flevel_2b1_2c_200_20_3e',['IterListItem< PrevChildItem, InvTreeT, ROOT_LEVEL+1, 0 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html',1,'openvdb::v3_2_0::tree']]], + ['iterlistitem_3c_20previtem_2c_20invtreet_2c_20root_5flevel_2b1_2c_20leaf_5flevel_20_3e',['IterListItem< PrevItem, InvTreeT, ROOT_LEVEL+1, LEAF_LEVEL >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html',1,'openvdb::v3_2_0::tree']]], + ['iterlistitem_3c_20previtemt_2c_20nodevect_2c_201_2c_20_5flevel_20_3e',['IterListItem< PrevItemT, NodeVecT, 1, _Level >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['iterlistitem_3c_20previtemt_2c_20nodevect_2c_20vecsize_2c_200u_20_3e',['IterListItem< PrevItemT, NodeVecT, VecSize, 0U >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['iterlistitem_3c_20prevvalueitem_2c_20invtreet_2c_20root_5flevel_2b1_2c_200_20_3e',['IterListItem< PrevValueItem, InvTreeT, ROOT_LEVEL+1, 0 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html',1,'openvdb::v3_2_0::tree']]], + ['iterrange',['IterRange',['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveTileValues.html#abe6378c864b7a38f6ca0a273ee70a87b',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveTileValues::IterRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpApplier.html#a31c29a834c73f006df3be2a3ce3f86ff',1,'openvdb::v3_2_0::tools::valxform::SharedOpApplier::IterRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpApplier.html#a31c29a834c73f006df3be2a3ce3f86ff',1,'openvdb::v3_2_0::tools::valxform::CopyableOpApplier::IterRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpTransformer.html#a169040a459a5904c589df612cc99d7bb',1,'openvdb::v3_2_0::tools::valxform::SharedOpTransformer::IterRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpTransformer.html#a169040a459a5904c589df612cc99d7bb',1,'openvdb::v3_2_0::tools::valxform::CopyableOpTransformer::IterRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1OpAccumulator.html#a31c29a834c73f006df3be2a3ce3f86ff',1,'openvdb::v3_2_0::tools::valxform::OpAccumulator::IterRange()']]], + ['itert',['IterT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid_1_1ReducePool.html#a30eb9077b2f866c5fa85235007299843',1,'openvdb::v3_2_0::tools::PointMaskGrid::ReducePool::IterT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOnIter_01_4.html#ab67825126bf3ecdbc239f9dcf1e5b88a',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOnIter >::IterT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOnCIter_01_4.html#a88d7fc4fefc28544bddcd60953ffe896',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOnCIter >::IterT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOffIter_01_4.html#acacb235300c99ce548b7d5a587b05626',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOffIter >::IterT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOffCIter_01_4.html#a263e78291b7304e9cd6af0285dd57fb3',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOffCIter >::IterT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildAllIter_01_4.html#a3f335ba26a42aca44c72ed5273711631',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildAllIter >::IterT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildAllCIter_01_4.html#a6cec0a23cb581c0205036ebbad27965e',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildAllCIter >::IterT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOnIter_01_4.html#af151ba4d7fb0fd09ac96967a8a16f556',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOnIter >::IterT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOnCIter_01_4.html#af556b5f849c5d7c6985dda1d1e634777',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOnCIter >::IterT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOffIter_01_4.html#ab7dab98e2ee075bd7db1bc830ccb8347',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOffIter >::IterT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOffCIter_01_4.html#aae4bb4891399430e5f5259c368fac62f',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOffCIter >::IterT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueAllIter_01_4.html#ac375468e72a3a4795f7f61233409643a',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueAllIter >::IterT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueAllCIter_01_4.html#ac6c19d6f0ca5f2354b67ca88336520b1',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueAllCIter >::IterT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#aa75dfab8fa497a9d989955b595896920',1,'openvdb::v3_2_0::tree::IterListItem::IterT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#aa75dfab8fa497a9d989955b595896920',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::IterT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#aa75dfab8fa497a9d989955b595896920',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::IterT()']]], + ['itertraits',['IterTraits',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits',['IterTraits',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1IterTraits.html',1,'openvdb::v3_2_0::tools::stats_internal']]], + ['itertraits_3c_20nodet_2c_20typename_20nodet_3a_3achildallciter_20_3e',['IterTraits< NodeT, typename NodeT::ChildAllCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildAllCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20nodet_2c_20typename_20nodet_3a_3achildalliter_20_3e',['IterTraits< NodeT, typename NodeT::ChildAllIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildAllIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20nodet_2c_20typename_20nodet_3a_3achildoffciter_20_3e',['IterTraits< NodeT, typename NodeT::ChildOffCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOffCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20nodet_2c_20typename_20nodet_3a_3achildoffiter_20_3e',['IterTraits< NodeT, typename NodeT::ChildOffIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOffIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20nodet_2c_20typename_20nodet_3a_3achildonciter_20_3e',['IterTraits< NodeT, typename NodeT::ChildOnCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOnCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20nodet_2c_20typename_20nodet_3a_3achildoniter_20_3e',['IterTraits< NodeT, typename NodeT::ChildOnIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOnIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20nodet_2c_20typename_20nodet_3a_3avalueallciter_20_3e',['IterTraits< NodeT, typename NodeT::ValueAllCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueAllCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20nodet_2c_20typename_20nodet_3a_3avaluealliter_20_3e',['IterTraits< NodeT, typename NodeT::ValueAllIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueAllIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20nodet_2c_20typename_20nodet_3a_3avalueoffciter_20_3e',['IterTraits< NodeT, typename NodeT::ValueOffCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOffCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20nodet_2c_20typename_20nodet_3a_3avalueoffiter_20_3e',['IterTraits< NodeT, typename NodeT::ValueOffIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOffIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20nodet_2c_20typename_20nodet_3a_3avalueonciter_20_3e',['IterTraits< NodeT, typename NodeT::ValueOnCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOnCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20nodet_2c_20typename_20nodet_3a_3avalueoniter_20_3e',['IterTraits< NodeT, typename NodeT::ValueOnIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOnIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20tree_3a_3atreevalueiteratorbase_3c_20treet_2c_20valueitert_20_3e_20_3e',['IterTraits< tree::TreeValueIteratorBase< TreeT, ValueIterT > >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1IterTraits_3_01tree_1_1TreeValueIteratod0548f7bac16dff837855a3f29cfb162.html',1,'openvdb::v3_2_0::tools::stats_internal']]], + ['itertraits_3c_20typename_20previtert_3a_3anonconstnodetype_2c_20previtert_20_3e',['IterTraits< typename PrevIterT::NonConstNodeType, PrevIterT >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits.html',1,'openvdb::v3_2_0::tree']]], + ['itertype',['IterType',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#abe5d3603dbb0f44bb3a9d23b1e127f18',1,'openvdb::v3_2_0::math::BaseStencil']]], + ['itraits',['ITraits',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a96fa5ee63f04c5089f697ee0d1237e56',1,'openvdb::v3_2_0::tree::IterListItem::ITraits()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a96fa5ee63f04c5089f697ee0d1237e56',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::ITraits()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a96fa5ee63f04c5089f697ee0d1237e56',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::ITraits()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_b.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_b.html new file mode 100644 index 00000000..1f1beb55 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_b.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_b.js new file mode 100644 index 00000000..86a42918 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['jacobipreconditioner',['JacobiPreconditioner',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1JacobiPreconditioner.html',1,'openvdb::v3_2_0::math::pcg']]], + ['jacobipreconditioner',['JacobiPreconditioner',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1JacobiPreconditioner.html#ae2a3d9ed0d1de9899a0a545134dbe193',1,'openvdb::v3_2_0::math::pcg::JacobiPreconditioner']]], + ['join',['join',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1InfNormOp.html#a52f05d1403fc389584717ea45d306bbe',1,'openvdb::v3_2_0::math::pcg::Vector::InfNormOp::join()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1IsFiniteOp.html#af65b15971c4dce065c0819384986eb6a',1,'openvdb::v3_2_0::math::pcg::Vector::IsFiniteOp::join()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1IsFiniteOp.html#af65b15971c4dce065c0819384986eb6a',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::IsFiniteOp::join()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#abe99df4d5d1eb708dccd462f8b9e5be9',1,'openvdb::v3_2_0::math::Extrema::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1CopyLeafNodes.html#a44eca6edf9fca71236baca07d5369163',1,'openvdb::v3_2_0::tools::clip_internal::CopyLeafNodes::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#aeab5734b22d66df2980d9d9d965653e4',1,'openvdb::v3_2_0::tools::SparseExtractor::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#a2d4968d46b42fdb9df79916e226039b0',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveVoxelValues.html#a40b5d9c6a665adb2d9c64beef21a9bba',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveVoxelValues::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveTileValues.html#ae410b066b7160158bb3c4b5304a79b24',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveTileValues::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__fracture__internal_1_1FindMinMaxVoxelValue.html#ac2717cf4b6fb638cb096ac0ab7623683',1,'openvdb::v3_2_0::tools::level_set_fracture_internal::FindMinMaxVoxelValue::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1PopulateTree.html#a68059aa640c85e3ac44f172afe3beb45',1,'openvdb::v3_2_0::tools::level_set_util_internal::PopulateTree::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinVoxelValue.html#a3d47cdaed2e6e0754c31593ac09239da',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinVoxelValue::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinTileValue.html#aea965f9d7ea7eca008813733b976c7c8',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinTileValue::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskIsovalueCrossingVoxels.html#a42a9c54dc73ef6e130c75cb76e27e166',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskIsovalueCrossingVoxels::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskSegmentGroup.html#a80832c70070fa284d84cdd70cb201830',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskSegmentGroup::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandLeafNodeRegion.html#a9406776de2d6c7fe031bc7e84755c911',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandLeafNodeRegion::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ConstructVoxelMask.html#ab03af36a6bcc1c2ef6c9e5caaf00346f',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ConstructVoxelMask::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#adfce595f2247dfd250e05765d2f34362',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1GenEdgeData.html#a600b3eb10cbe0366c77d6074eb286c77',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::GenEdgeData::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1ComputeExtremas.html#a926aa20fa1fe962bcd7ccfa2551f2a1b',1,'openvdb::v3_2_0::tools::particle_atlas_internal::ComputeExtremas::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid_1_1ReducePool.html#acf2ac694fbf57fa9e94b1854ea7dbc44',1,'openvdb::v3_2_0::tools::PointMaskGrid::ReducePool::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1StatsOp.html#a702bb5b14d59f48a7fb8b3be54e11311',1,'openvdb::v3_2_0::tools::stats_internal::StatsOp::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1HistOp.html#ae4a60dbe71726d3c80f3f00b27148b97',1,'openvdb::v3_2_0::tools::stats_internal::HistOp::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1MathOp.html#ae3438324d8e9f9c2608539a1317ef11b',1,'openvdb::v3_2_0::tools::stats_internal::MathOp::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpTransformer.html#aa48f481e466259efce754981f15afba0',1,'openvdb::v3_2_0::tools::valxform::SharedOpTransformer::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpTransformer.html#a5dbd630151a598de060057be94e8faac',1,'openvdb::v3_2_0::tools::valxform::CopyableOpTransformer::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1OpAccumulator.html#a6cd9c489ebbfc9f821eafd0d2243ce7b',1,'openvdb::v3_2_0::tools::valxform::OpAccumulator::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#a442e33f1adeb9dd30b07bf77a29819ae',1,'openvdb::v3_2_0::tools::internal::SignData::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartGen.html#a3c0adc25fa05ba8a5352e19a31708ef8',1,'openvdb::v3_2_0::tools::internal::PartGen::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenSeamMask.html#a94f0f50751eef7504cc80cf3009de1e4',1,'openvdb::v3_2_0::tools::internal::GenSeamMask::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTopologyMask.html#a752d8363b9d2ff4808a0cfb055bd2c3d',1,'openvdb::v3_2_0::tools::internal::GenTopologyMask::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenBoundaryMask.html#ac58f19fd1bf190cb276b750391e6744e',1,'openvdb::v3_2_0::tools::internal::GenBoundaryMask::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTileMask.html#a7879bc2668e446c73277cc7c453da3c3',1,'openvdb::v3_2_0::tools::internal::GenTileMask::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UpdatePoints.html#adfb81a510ba902cb43c549de42435ec8',1,'openvdb::v3_2_0::tools::internal::UpdatePoints::join()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_c.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_c.html new file mode 100644 index 00000000..ec9a0c84 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_c.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_c.js new file mode 100644 index 00000000..30f249a2 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_c.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['keyerror',['KeyError',['../classopenvdb_1_1v3__2__0_1_1KeyError.html',1,'openvdb::v3_2_0']]], + ['keyerror',['KeyError',['../classopenvdb_1_1v3__2__0_1_1KeyError.html#a4b7e7a659a543534d1282829390d270b',1,'openvdb::v3_2_0::KeyError::KeyError()'],['../classopenvdb_1_1v3__2__0_1_1KeyError.html#a3cf2c8b18c59d95c64103f39c07e67cb',1,'openvdb::v3_2_0::KeyError::KeyError(const std::string &msg)']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_d.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_d.html new file mode 100644 index 00000000..654d1988 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_d.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_d.js new file mode 100644 index 00000000..fd327d0e --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_d.js @@ -0,0 +1,140 @@ +var searchData= +[ + ['l2norm',['l2Norm',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#aee93a17ba455860f3ab55af4c14258bd',1,'openvdb::v3_2_0::math::pcg::Vector']]], + ['labelboundaryvoxels',['LabelBoundaryVoxels',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1LabelBoundaryVoxels.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['labelboundaryvoxels',['LabelBoundaryVoxels',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1LabelBoundaryVoxels.html#adc0b5dedb8b7bae8837a24ec75d7edf3',1,'openvdb::v3_2_0::tools::level_set_util_internal::LabelBoundaryVoxels']]], + ['laplacian',['Laplacian',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian.html',1,'openvdb::v3_2_0::tools']]], + ['laplacian',['Laplacian',['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian.html',1,'openvdb::v3_2_0::math']]], + ['laplacian',['Laplacian',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian.html#a5c40c64a051b85ea779f903509bd5f98',1,'openvdb::v3_2_0::tools::Laplacian::Laplacian(const GridT &grid, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian.html#a24007e200d7c3b056c8ebd6457b9582a',1,'openvdb::v3_2_0::tools::Laplacian::Laplacian(const GridT &grid, const MaskGridType &mask, InterruptT *interrupt=NULL)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1ISLaplacianOp.html#a5d41c45c1fe61f0531f15ae0faca8ee6',1,'openvdb::v3_2_0::tools::poisson::internal::ISLaplacianOp::laplacian()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#ae4bbbae6c115ebb610b963b01c50b03a',1,'openvdb::v3_2_0::math::GradStencil::laplacian()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html#ae4bbbae6c115ebb610b963b01c50b03a',1,'openvdb::v3_2_0::math::WenoStencil::laplacian()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CurvatureStencil.html#ae4bbbae6c115ebb610b963b01c50b03a',1,'openvdb::v3_2_0::math::CurvatureStencil::laplacian()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#ad2bb531334a573ac7447d9b8ae0987bb',1,'openvdb::v3_2_0::tools::LevelSetFilter::laplacian()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#af55f3361b55d27809c1da5bf33db393a',1,'openvdb::v3_2_0::tools::laplacian(const GridType &grid, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a2c8b10bc1b3daa909a50c4b1a68c1c79',1,'openvdb::v3_2_0::tools::laplacian(const GridType &grid, const MaskT &mask, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aea45d3e6bb340ccefaff8666b617ce1e',1,'openvdb::v3_2_0::tools::laplacian(const GridType &grid, bool threaded=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a731b2b621da3da70164a138d5b15d06c',1,'openvdb::v3_2_0::tools::laplacian(const GridType &grid, const MaskT mask, bool threaded=true)']]], + ['laplacian_3c_20scalemap_2c_20diffscheme_20_3e',['Laplacian< ScaleMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01ScaleMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['laplacian_3c_20scaletranslatemap_2c_20diffscheme_20_3e',['Laplacian< ScaleTranslateMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01ScaleTranslateMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['laplacian_3c_20translationmap_2c_20diffscheme_20_3e',['Laplacian< TranslationMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01TranslationMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['laplacian_3c_20uniformscalemap_2c_20diffscheme_20_3e',['Laplacian< UniformScaleMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01UniformScaleMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['laplacian_3c_20uniformscaletranslatemap_2c_20diffscheme_20_3e',['Laplacian< UniformScaleTranslateMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01UniformScaleTranslateMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['laplacian_3c_20unitarymap_2c_20diffscheme_20_3e',['Laplacian< UnitaryMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01UnitaryMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['laplacianmatrix',['LaplacianMatrix',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#a137cf22df6cdf12622718437e02885d0',1,'openvdb::v3_2_0::tools::poisson']]], + ['layoutxyz',['LayoutXYZ',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8206a04f26f57965d9cb369acafa33d7a696de54548c230cf353790fc1f73117f',1,'openvdb::v3_2_0::tools']]], + ['layoutzyx',['LayoutZYX',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8206a04f26f57965d9cb369acafa33d7ac4b2238a60f4ee86d9ed5a72a13fe814',1,'openvdb::v3_2_0::tools']]], + ['leaf',['leaf',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1Neighbor.html#a3d446c9884a43d26b5913e37f8acc0cc',1,'openvdb::v3_2_0::tools::Morphology::Neighbor::leaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a7a21299f2b9561affcdac1956dd9e37b',1,'openvdb::v3_2_0::tree::LeafManager::leaf()']]], + ['leaf_5fdepth',['LEAF_DEPTH',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#ad6a3a64a75bc299bc4544a701425d08d',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::LEAF_DEPTH()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#ad6a3a64a75bc299bc4544a701425d08d',1,'openvdb::v3_2_0::tree::NodeIteratorBase::LEAF_DEPTH()']]], + ['leaf_5fdim',['LEAF_DIM',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#acd3ca1285aa143fa86e20aaf73b32481',1,'openvdb::v3_2_0::tools::Morphology']]], + ['leaf_5flevel',['LEAF_LEVEL',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a3361c3abbeff052681dab2111b72e451',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::LEAF_LEVEL()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a3361c3abbeff052681dab2111b72e451',1,'openvdb::v3_2_0::tree::NodeIteratorBase::LEAF_LEVEL()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#a3361c3abbeff052681dab2111b72e451',1,'openvdb::v3_2_0::tree::LeafIteratorBase::LEAF_LEVEL()']]], + ['leaf_5flog2dim',['LEAF_LOG2DIM',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#afca1658ff1c574903574c49ff21e1628',1,'openvdb::v3_2_0::tools::Morphology']]], + ['leaf_5fparent_5flevel',['LEAF_PARENT_LEVEL',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#a13a703a994565b187e092d5a9f731b6e',1,'openvdb::v3_2_0::tree::LeafIteratorBase']]], + ['leafarray',['LeafArray',['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveVoxelValues.html#acaebf35b65a5e863f6ebd07c574b5e6f',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveVoxelValues']]], + ['leafbs',['LeafBS',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1LeafBS.html#a9d16052c15e10c367c985c9a2766e7cf',1,'openvdb::v3_2_0::tools::internal::LeafBS']]], + ['leafbs',['LeafBS',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1LeafBS.html',1,'openvdb::v3_2_0::tools::internal']]], + ['leafcache',['LeafCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#a04ec5ce13c4e24465c221b3cdc5b409b',1,'openvdb::v3_2_0::tools::Morphology::LeafCache']]], + ['leafcache',['LeafCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html',1,'openvdb::v3_2_0::tools::Morphology']]], + ['leafciter',['LeafCIter',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ab70d61f51d3e67a8b4494bb045c90c79',1,'openvdb::v3_2_0::tree::Tree']]], + ['leafcount',['leafCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a0667d468064aa044670a06a84b9c48ed',1,'openvdb::v3_2_0::tree::InternalNode::leafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a412b718c7c8ef03f8439e4882eeea860',1,'openvdb::v3_2_0::tree::LeafManager::leafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#adcd302bc7002e4c827f23306869d9158',1,'openvdb::v3_2_0::tree::LeafNode::leafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#adcd302bc7002e4c827f23306869d9158',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::leafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#adcd302bc7002e4c827f23306869d9158',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::leafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a0667d468064aa044670a06a84b9c48ed',1,'openvdb::v3_2_0::tree::RootNode::leafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a7f3ef6cf016b0fbc3473d3dee3813bf8',1,'openvdb::v3_2_0::tree::TreeBase::leafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a5471710f3f6ebe42e5fcb6e528d2d804',1,'openvdb::v3_2_0::tree::Tree::leafCount()']]], + ['leafcountop',['LeafCountOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1LeafCountOp.html#aa6d587987d3176deed475660d109f491',1,'openvdb::v3_2_0::tools::poisson::internal::LeafCountOp']]], + ['leafcountop',['LeafCountOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1LeafCountOp.html',1,'openvdb::v3_2_0::tools::poisson::internal']]], + ['leafindexop',['LeafIndexOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1LeafIndexOp.html#a30da718e67cd34848fd46e23247a0903',1,'openvdb::v3_2_0::tools::poisson::internal::LeafIndexOp']]], + ['leafindexop',['LeafIndexOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1LeafIndexOp.html',1,'openvdb::v3_2_0::tools::poisson::internal']]], + ['leafiter',['LeafIter',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#abd661fdeff6388ca9d64ee76b5dcbf8a',1,'openvdb::v3_2_0::tree::Tree']]], + ['leafiteratorbase',['LeafIteratorBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#a4bcdf5c59c44906065aa685087ea4e86',1,'openvdb::v3_2_0::tree::LeafIteratorBase::LeafIteratorBase()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#abd2fbc561143901e9f9fae2e98d008b4',1,'openvdb::v3_2_0::tree::LeafIteratorBase::LeafIteratorBase(TreeT &tree)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#a60d50dd2049b3b43f9db7d14f5a316e2',1,'openvdb::v3_2_0::tree::LeafIteratorBase::LeafIteratorBase(const LeafIteratorBase &other)']]], + ['leafiteratorbase',['LeafIteratorBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['leafitertype',['LeafIterType',['../structopenvdb_1_1v3__2__0_1_1tree_1_1leafmgr_1_1TreeTraits.html#ac5a92b4d11d1730f6224959b38cac9e5',1,'openvdb::v3_2_0::tree::leafmgr::TreeTraits::LeafIterType()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1leafmgr_1_1TreeTraits_3_01const_01TreeT_01_4.html#a8851dbc0964e3472b56bc069c2ce2096',1,'openvdb::v3_2_0::tree::leafmgr::TreeTraits< const TreeT >::LeafIterType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#ac3ab5c0d0cdce81e8959dd8a6be69ff5',1,'openvdb::v3_2_0::tree::LeafManager::LeafIterType()']]], + ['leafmanager',['LeafManager',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a6bad6c4b86a2ec52ce35cbd5519cfa45',1,'openvdb::v3_2_0::tree::LeafManager::LeafManager(TreeType &tree, size_t auxBuffersPerLeaf=0, bool serial=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a80195dcd80d3614f522176fb87464046',1,'openvdb::v3_2_0::tree::LeafManager::LeafManager(TreeType &tree, LeafType **begin, LeafType **end, size_t auxBuffersPerLeaf=0, bool serial=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a4564928988bed112c6e4a9db516ef2dd',1,'openvdb::v3_2_0::tree::LeafManager::LeafManager(const LeafManager &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange.html#a07a10fba4f01331e376881d8ba744364',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::leafManager()']]], + ['leafmanager',['LeafManager',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html',1,'openvdb::v3_2_0::tree']]], + ['leafmanager_2eh',['LeafManager.h',['../LeafManager_8h.html',1,'']]], + ['leafmanagerimpl',['LeafManagerImpl',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafManagerImpl.html',1,'openvdb::v3_2_0::tree']]], + ['leafmanagerimpl_3c_20leafmanager_3c_20const_20treet_20_3e_20_3e',['LeafManagerImpl< LeafManager< const TreeT > >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafManagerImpl_3_01LeafManager_3_01const_01TreeT_01_4_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['leafmanagert',['LeafManagerT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html#af6ae739b66d5ea985c9bc2bb8bb57a1a',1,'openvdb::v3_2_0::tools::gridop::GridOperator::LeafManagerT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartGen.html#a0f2b8b03885e2bb84f1da4bd12653fb2',1,'openvdb::v3_2_0::tools::internal::PartGen::LeafManagerT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTopologyMask.html#a0f2b8b03885e2bb84f1da4bd12653fb2',1,'openvdb::v3_2_0::tools::internal::GenTopologyMask::LeafManagerT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenBoundaryMask.html#a0f2b8b03885e2bb84f1da4bd12653fb2',1,'openvdb::v3_2_0::tools::internal::GenBoundaryMask::LeafManagerT()']]], + ['leafmanagertype',['LeafManagerType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#afa0c8fc1c88cf66e55b1610bb3b4d779',1,'openvdb::v3_2_0::tools::Filter::LeafManagerType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#afa0c8fc1c88cf66e55b1610bb3b4d779',1,'openvdb::v3_2_0::tools::LevelSetTracker::LeafManagerType()']]], + ['leafnode',['LeafNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html',1,'openvdb::v3_2_0::tree']]], + ['leafnode',['LeafNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#acc3ddf7c43384bed1ebfea497bdb4b3a',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aba19a13fc4d7d33601cb67afaea8b94f',1,'openvdb::v3_2_0::tree::LeafNode::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#acc3ddf7c43384bed1ebfea497bdb4b3a',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aba19a13fc4d7d33601cb67afaea8b94f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#acc3ddf7c43384bed1ebfea497bdb4b3a',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aba19a13fc4d7d33601cb67afaea8b94f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#aba19a13fc4d7d33601cb67afaea8b94f',1,'openvdb::v3_2_0::tree::ValueAccessor::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#aba19a13fc4d7d33601cb67afaea8b94f',1,'openvdb::v3_2_0::tree::ValueAccessor1::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#aba19a13fc4d7d33601cb67afaea8b94f',1,'openvdb::v3_2_0::tree::ValueAccessor2::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#aba19a13fc4d7d33601cb67afaea8b94f',1,'openvdb::v3_2_0::tree::ValueAccessor3::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a0f75bca74f67c041259a8a04d71ff3fd',1,'openvdb::v3_2_0::tree::LeafNode::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#af30d6bad3d4dedcd924a063b498af624',1,'openvdb::v3_2_0::tree::LeafNode::LeafNode(const Coord &coords, const ValueType &value=zeroVal< ValueType >(), bool active=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a6d0a7198255f5dd33d16679d8003098d',1,'openvdb::v3_2_0::tree::LeafNode::LeafNode(PartialCreate, const Coord &coords, const ValueType &value=zeroVal< ValueType >(), bool active=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a23a333c67622c60bbec5d08f16387c06',1,'openvdb::v3_2_0::tree::LeafNode::LeafNode(const LeafNode &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#afe89df18cceff54e3bd31e0c4003b96e',1,'openvdb::v3_2_0::tree::LeafNode::LeafNode(const LeafNode< OtherValueType, Log2Dim > &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aa610154b5e8a5f70b37b612d88919f6d',1,'openvdb::v3_2_0::tree::LeafNode::LeafNode(const LeafNode< OtherValueType, Log2Dim > &other, const ValueType &offValue, const ValueType &onValue, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#afd8db9afd141aebea06ac54ee0d072bb',1,'openvdb::v3_2_0::tree::LeafNode::LeafNode(const LeafNode< OtherValueType, Log2Dim > &other, const ValueType &background, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a0f75bca74f67c041259a8a04d71ff3fd',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ab815c7bf726b5cc537b50dd1fd0d4aeb',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode(const Coord &xyz, bool value=false, bool active=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aa796a4508fc6047a117a846b0279fcbd',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode(PartialCreate, const Coord &xyz, bool value=false, bool active=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a23a333c67622c60bbec5d08f16387c06',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode(const LeafNode &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#afe89df18cceff54e3bd31e0c4003b96e',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode(const LeafNode< OtherValueType, Log2Dim > &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#abbffb1af29b2fa62232a0ba25467e62f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode(const LeafNode< ValueType, Log2Dim > &other, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a306e14ace40f93828e91ccba4a5dcfcb',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode(const LeafNode< ValueType, Log2Dim > &other, bool offValue, bool onValue, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a88f477f966059bb18bbe808ec0d8df1b',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode(const LeafNode< ValueType, Log2Dim > &other, bool background, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a0f75bca74f67c041259a8a04d71ff3fd',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a970e806cd1bb10143f9fa0b10f16577d',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode(const Coord &xyz, bool value=false, bool dummy=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a7b16ac983038dcbe4febae6fa968a738',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode(PartialCreate, const Coord &xyz, bool value=false, bool dummy=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a23a333c67622c60bbec5d08f16387c06',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode(const LeafNode &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#afe89df18cceff54e3bd31e0c4003b96e',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode(const LeafNode< OtherValueType, Log2Dim > &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#abbffb1af29b2fa62232a0ba25467e62f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode(const LeafNode< ValueType, Log2Dim > &other, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a306e14ace40f93828e91ccba4a5dcfcb',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode(const LeafNode< ValueType, Log2Dim > &other, bool offValue, bool onValue, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a88f477f966059bb18bbe808ec0d8df1b',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode(const LeafNode< ValueType, Log2Dim > &other, bool background, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a475e3a9da2bcfdcf4479597b2280c274',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode(const LeafNode< ValueT, Log2Dim > &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a2a1c206648706e190dce1b98884f1b52',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode(const LeafNode< ValueT, Log2Dim > &other, bool background, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8da43f433f3e9d9a0a4314d0416e6a0b',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode(const LeafNode< ValueT, Log2Dim > &other, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ab4280a66b7e44f66270f2279b6e64071',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode(const LeafNode< ValueT, Log2Dim > &other, bool offValue, bool onValue, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a475e3a9da2bcfdcf4479597b2280c274',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode(const LeafNode< ValueT, Log2Dim > &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aec2668b6a857032ce0107be14449ed53',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode(const LeafNode< ValueT, Log2Dim > &other, bool, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8da43f433f3e9d9a0a4314d0416e6a0b',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode(const LeafNode< ValueT, Log2Dim > &other, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ab4280a66b7e44f66270f2279b6e64071',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode(const LeafNode< ValueT, Log2Dim > &other, bool offValue, bool onValue, TopologyCopy)']]], + ['leafnode_2eh',['LeafNode.h',['../LeafNode_8h.html',1,'']]], + ['leafnode_3c_20bool_2c_20log2dim_20_3e',['LeafNode< bool, Log2Dim >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['leafnode_3c_20valuemask_2c_20log2dim_20_3e',['LeafNode< ValueMask, Log2Dim >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['leafnodebool_2eh',['LeafNodeBool.h',['../LeafNodeBool_8h.html',1,'']]], + ['leafnodeconnectivitytable',['LeafNodeConnectivityTable',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html#a6f553e28abba571691043eb1cd291eff',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::LeafNodeConnectivityTable']]], + ['leafnodeconnectivitytable',['LeafNodeConnectivityTable',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['leafnodemask_2eh',['LeafNodeMask.h',['../LeafNodeMask_8h.html',1,'']]], + ['leafnodeoriginop',['LeafNodeOriginOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1LeafNodeOriginOp.html#a925f2b1df1e7816aa18c5159842cfdf7',1,'openvdb::v3_2_0::tools::point_partitioner_internal::LeafNodeOriginOp']]], + ['leafnodeoriginop',['LeafNodeOriginOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1LeafNodeOriginOp.html',1,'openvdb::v3_2_0::tools::point_partitioner_internal']]], + ['leafnodet',['LeafNodeT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1MaskInteriorVoxels.html#ae2f09f8e80b57849d25263270714da7b',1,'openvdb::v3_2_0::tools::clip_internal::MaskInteriorVoxels::LeafNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#abd78689c901a53d288df7978965848a6',1,'openvdb::v3_2_0::tree::LeafIteratorBase::LeafNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#aeaa590cd7291806e51ce3418a4e8b7f4',1,'openvdb::v3_2_0::tree::ValueAccessor::LeafNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#aeaa590cd7291806e51ce3418a4e8b7f4',1,'openvdb::v3_2_0::tree::ValueAccessor0::LeafNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#aeaa590cd7291806e51ce3418a4e8b7f4',1,'openvdb::v3_2_0::tree::ValueAccessor1::LeafNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#aeaa590cd7291806e51ce3418a4e8b7f4',1,'openvdb::v3_2_0::tree::ValueAccessor2::LeafNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#aeaa590cd7291806e51ce3418a4e8b7f4',1,'openvdb::v3_2_0::tree::ValueAccessor3::LeafNodeT()']]], + ['leafnodetype',['LeafNodeType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildPrimarySegment.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::composite::BuildPrimarySegment::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildSecondarySegment.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::composite::BuildSecondarySegment::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1PopulateTree.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::level_set_util_internal::PopulateTree::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillMaskBoundary.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillMaskBoundary::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskSegmentGroup.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskSegmentGroup::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandLeafNodeRegion.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandLeafNodeRegion::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillLeafNodeVoxels.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillLeafNodeVoxels::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FloodFillSign.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::level_set_util_internal::FloodFillSign::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskedCopy.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskedCopy::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1CombineLeafNodes.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::CombineLeafNodes::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1StashOriginAndStoreOffset.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::StashOriginAndStoreOffset::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RestoreOrigin.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RestoreOrigin::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeNodeConnectivity.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ComputeNodeConnectivity::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::LeafNodeConnectivityTable::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SweepExteriorSign.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SweepExteriorSign::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedFillExteriorSign.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedFillExteriorSign::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SyncVoxelMask.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SyncVoxelMask::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedPoints::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeIntersectingVoxelSign.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ComputeIntersectingVoxelSign::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ValidateIntersectingVoxels.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ValidateIntersectingVoxels::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RemoveSelfIntersectingSurface.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RemoveSelfIntersectingSurface::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1StealUniqueLeafNodes.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::StealUniqueLeafNodes::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1DiffLeafNodeMask.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::DiffLeafNodeMask::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ConstructVoxelMask.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ConstructVoxelMask::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1AddNodes.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::AddNodes::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1TransformValues.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::TransformValues::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1InactivateValues.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::InactivateValues::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1OffsetValues.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::OffsetValues::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1Renormalize.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::Renormalize::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1MinCombine.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::MinCombine::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::PointIndexIterator::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ab0f61bc46ec780acf4f4fcb78652248a',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ttls__internal_1_1OffsetAndMinComp.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::ttls_internal::OffsetAndMinComp::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a962095d534799728b2ff65025501f5d6',1,'openvdb::v3_2_0::tree::InternalNode::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a6c5991738312c890f8d05301c745e889',1,'openvdb::v3_2_0::tree::LeafManager::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ad9d7d3f2b66d577db1512f0469eee302',1,'openvdb::v3_2_0::tree::LeafNode::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ad4503b9277a0521e259e9ce235ce669d',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a07c0a99d2bef9a85e256276da435c135',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a23b3e9dd8f606477f0359c8a2539e756',1,'openvdb::v3_2_0::tree::RootNode::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a96e8cc29fdf9ac44f03095b4e22ea37e',1,'openvdb::v3_2_0::tree::Tree::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a2c231cb2b63033c2d43acd75eef0d5c8',1,'openvdb::v3_2_0::tree::CacheItem::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a96e8cc29fdf9ac44f03095b4e22ea37e',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::LeafNodeType()']]], + ['leafrange',['leafRange',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#ab53d69fe0d3e0ff147d8bbb6c63c5ebf',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::leafRange()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a9e36974eedb5516344a08fd19d6d1782',1,'openvdb::v3_2_0::tree::LeafManager::leafRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#ac48423498c752934e69def6317cc56e9',1,'openvdb::v3_2_0::tools::LevelSetAdvection::LeafRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#ac48423498c752934e69def6317cc56e9',1,'openvdb::v3_2_0::tools::LevelSetMorphing::LeafRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a4375dc8fd3edc4872e9445f1fca65d20',1,'openvdb::v3_2_0::tools::LevelSetTracker::LeafRange()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange.html#a08cbef04afd2cc6bf739c836b99d5f18',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::LeafRange(size_t begin, size_t end, const LeafManager &leafManager, size_t grainSize=1)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange.html#a6cd26f4af69c8e80a67726cd34e0a818',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::LeafRange(LeafRange &r, tbb::split)']]], + ['leafrange',['LeafRange',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange.html',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['leafs',['leafs',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#a509aae5cab71356b065df391c9f85106',1,'openvdb::v3_2_0::tools::Morphology::LeafCache::leafs()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#ab94d27ce2d49e400a41c37854b865c00',1,'openvdb::v3_2_0::tools::LevelSetTracker::leafs()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#ae00315098d8626e03706c33b6bc53e9b',1,'openvdb::v3_2_0::tools::LevelSetTracker::leafs() const ']]], + ['leaft',['LeafT',['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA_3_01TreeT_00_01RayT_00_010_01_4.html#a1f8e19b652f40cc62bcf2e9cf4ded5a8',1,'openvdb::v3_2_0::math::VolumeHDDA< TreeT, RayT, 0 >::LeafT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeBackgroundOp.html#ac3b4d95d68c958cf0b1262cd281e737b',1,'openvdb::v3_2_0::tools::ChangeBackgroundOp::LeafT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeLevelSetBackgroundOp.html#ac3b4d95d68c958cf0b1262cd281e737b',1,'openvdb::v3_2_0::tools::ChangeLevelSetBackgroundOp::LeafT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyFromDense.html#a1f8e19b652f40cc62bcf2e9cf4ded5a8',1,'openvdb::v3_2_0::tools::CopyFromDense::LeafT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#a1f8e19b652f40cc62bcf2e9cf4ded5a8',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor::LeafT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyToVecOp.html#aeae3a81d126f62d5df87269a85841e12',1,'openvdb::v3_2_0::tools::poisson::internal::CopyToVecOp::LeafT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1InactivePruneOp.html#a1f8e19b652f40cc62bcf2e9cf4ded5a8',1,'openvdb::v3_2_0::tools::InactivePruneOp::LeafT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1TolerancePruneOp.html#a1f8e19b652f40cc62bcf2e9cf4ded5a8',1,'openvdb::v3_2_0::tools::TolerancePruneOp::LeafT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetPruneOp.html#a1f8e19b652f40cc62bcf2e9cf4ded5a8',1,'openvdb::v3_2_0::tools::LevelSetPruneOp::LeafT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SignedFloodFillOp.html#ac3b4d95d68c958cf0b1262cd281e737b',1,'openvdb::v3_2_0::tools::SignedFloodFillOp::LeafT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafManagerImpl.html#a93a9b9b77bf2ec2f65c4b1585ac14325',1,'openvdb::v3_2_0::tree::LeafManagerImpl::LeafT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafManagerImpl_3_01LeafManager_3_01const_01TreeT_01_4_01_4.html#a93a9b9b77bf2ec2f65c4b1585ac14325',1,'openvdb::v3_2_0::tree::LeafManagerImpl< LeafManager< const TreeT > >::LeafT()']]], + ['leaftopologydifference',['leafTopologyDifference',['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a1057cf902b65b940bdbfb52d792a9521',1,'openvdb::v3_2_0::util']]], + ['leaftopologydiffop',['LeafTopologyDiffOp',['../classopenvdb_1_1v3__2__0_1_1util_1_1LeafTopologyDiffOp.html#a2b5d235489ff8f798fef32fc8b9817e4',1,'openvdb::v3_2_0::util::LeafTopologyDiffOp']]], + ['leaftopologydiffop',['LeafTopologyDiffOp',['../classopenvdb_1_1v3__2__0_1_1util_1_1LeafTopologyDiffOp.html',1,'openvdb::v3_2_0::util']]], + ['leaftopologyintersection',['leafTopologyIntersection',['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a07b2109a2d53b0005d0911f6c7546f0a',1,'openvdb::v3_2_0::util']]], + ['leaftopologyintop',['LeafTopologyIntOp',['../classopenvdb_1_1v3__2__0_1_1util_1_1LeafTopologyIntOp.html#adaf3195780ce2ac0dcd8e00a11f63c1f',1,'openvdb::v3_2_0::util::LeafTopologyIntOp']]], + ['leaftopologyintop',['LeafTopologyIntOp',['../classopenvdb_1_1v3__2__0_1_1util_1_1LeafTopologyIntOp.html',1,'openvdb::v3_2_0::util']]], + ['leaftype',['LeafType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#aea1fb1ab2ed122f63d3331872709a013',1,'openvdb::v3_2_0::tools::Filter::LeafType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#a8d9a4b5e1242f75c88154df7fb3ad0b9',1,'openvdb::v3_2_0::tools::LevelSetAdvection::LeafType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a8d9a4b5e1242f75c88154df7fb3ad0b9',1,'openvdb::v3_2_0::tools::LevelSetMorphing::LeafType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#aea1fb1ab2ed122f63d3331872709a013',1,'openvdb::v3_2_0::tools::LevelSetTracker::LeafType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#aea1fb1ab2ed122f63d3331872709a013',1,'openvdb::v3_2_0::tools::Morphology::LeafType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a9696afbf24b6fed72a3848088b3aff7e',1,'openvdb::v3_2_0::tree::LeafManager::LeafType()']]], + ['legacyfrustum',['LegacyFrustum',['../classopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1LegacyFrustum.html#ac3a8750b5733a01c62a535798dac39d0',1,'openvdb::v3_2_0::math::internal::LegacyFrustum']]], + ['legacyfrustum',['LegacyFrustum',['../classopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1LegacyFrustum.html',1,'openvdb::v3_2_0::math::internal']]], + ['legacyfrustum_2eh',['LegacyFrustum.h',['../LegacyFrustum_8h.html',1,'']]], + ['length',['length',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ac391672014f7b4faed37018787333e4b',1,'openvdb::v3_2_0::math::Vec2::length()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ac391672014f7b4faed37018787333e4b',1,'openvdb::v3_2_0::math::Vec3::length()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#ac391672014f7b4faed37018787333e4b',1,'openvdb::v3_2_0::math::Vec4::length()']]], + ['lengthsqr',['lengthSqr',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#af4824f2f07e9ed09affc66def9071a53',1,'openvdb::v3_2_0::math::Vec2::lengthSqr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#af4824f2f07e9ed09affc66def9071a53',1,'openvdb::v3_2_0::math::Vec3::lengthSqr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#af4824f2f07e9ed09affc66def9071a53',1,'openvdb::v3_2_0::math::Vec4::lengthSqr()']]], + ['lessthan',['lessThan',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#addad7ee328b61672dc25f78d8949c273',1,'openvdb::v3_2_0::math::Coord']]], + ['level',['LEVEL',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a7efd456219bae7db497d009ad92961a7',1,'openvdb::v3_2_0::tree::InternalNode::LEVEL()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a7efd456219bae7db497d009ad92961a7',1,'openvdb::v3_2_0::tree::LeafNode::LEVEL()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a7efd456219bae7db497d009ad92961a7',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LEVEL()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a7efd456219bae7db497d009ad92961a7',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LEVEL()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a7efd456219bae7db497d009ad92961a7',1,'openvdb::v3_2_0::tree::RootNode::LEVEL()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a5ff2bc5b629e55b486f6d711a80c39e3',1,'openvdb::v3_2_0::tree::IterListItem::Level()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a5ff2bc5b629e55b486f6d711a80c39e3',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::Level()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a5ff2bc5b629e55b486f6d711a80c39e3',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::Level()']]], + ['level_5fset_5fhalf_5fwidth',['LEVEL_SET_HALF_WIDTH',['../namespaceopenvdb_1_1v3__2__0.html#a04f60dd7b4a065a54f873613ff8df50f',1,'openvdb::v3_2_0']]], + ['levels',['levels',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#a46cd9e53fa2bd4e45f7214c6aee838a6',1,'openvdb::v3_2_0::tools::ParticleAtlas::levels()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#a46cd9e53fa2bd4e45f7214c6aee838a6',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::levels()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#a9dceb61c091a4eefa6ac859253f22ec6',1,'openvdb::v3_2_0::tree::NodeManager::LEVELS()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#a9dceb61c091a4eefa6ac859253f22ec6',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::LEVELS()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a9dceb61c091a4eefa6ac859253f22ec6',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::LEVELS()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a9dceb61c091a4eefa6ac859253f22ec6',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::LEVELS()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a9dceb61c091a4eefa6ac859253f22ec6',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::LEVELS()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a9dceb61c091a4eefa6ac859253f22ec6',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::LEVELS()']]], + ['levelsetadvect_2eh',['LevelSetAdvect.h',['../LevelSetAdvect_8h.html',1,'']]], + ['levelsetadvection',['LevelSetAdvection',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#afa6bc3ff3c017048ea2ff59b407cf6fe',1,'openvdb::v3_2_0::tools::LevelSetAdvection']]], + ['levelsetadvection',['LevelSetAdvection',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html',1,'openvdb::v3_2_0::tools']]], + ['levelsetarea',['levelSetArea',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a87eba7caae7de895111fd539b2ca1a46',1,'openvdb::v3_2_0::tools::levelSetArea(const GridType &grid, bool useWorldSpace=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac438fd72f053cbf1d92d7b9b928ed1a0',1,'openvdb::v3_2_0::tools::levelSetArea(const GridT &grid, bool useWorldSpace)']]], + ['levelsetfilter',['LevelSetFilter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a41a7796f2097e5a555c147c5caff2568',1,'openvdb::v3_2_0::tools::LevelSetFilter']]], + ['levelsetfilter',['LevelSetFilter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html',1,'openvdb::v3_2_0::tools']]], + ['levelsetfilter_2eh',['LevelSetFilter.h',['../LevelSetFilter_8h.html',1,'']]], + ['levelsetfracture',['LevelSetFracture',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFracture.html#afe3544e840b466f446f4a7a951c1dee8',1,'openvdb::v3_2_0::tools::LevelSetFracture']]], + ['levelsetfracture',['LevelSetFracture',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFracture.html',1,'openvdb::v3_2_0::tools']]], + ['levelsetfracture_2eh',['LevelSetFracture.h',['../LevelSetFracture_8h.html',1,'']]], + ['levelsethdda',['LevelSetHDDA',['../structopenvdb_1_1v3__2__0_1_1math_1_1LevelSetHDDA.html',1,'openvdb::v3_2_0::math']]], + ['levelsethdda_3c_20treet_2c_2d1_20_3e',['LevelSetHDDA< TreeT,-1 >',['../structopenvdb_1_1v3__2__0_1_1math_1_1LevelSetHDDA_3_01TreeT_00-1_01_4.html',1,'openvdb::v3_2_0::math']]], + ['levelsetmeasure',['LevelSetMeasure',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html',1,'openvdb::v3_2_0::tools']]], + ['levelsetmeasure',['LevelSetMeasure',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#a5f7a6ac9404851a3b117d9686d3ff142',1,'openvdb::v3_2_0::tools::LevelSetMeasure::LevelSetMeasure(const GridType &grid, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#af949df54493b7b40bda113d82422ee2f',1,'openvdb::v3_2_0::tools::LevelSetMeasure::LevelSetMeasure(ManagerType &leafs, Real Dx, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a47a09d95ea44d64ff1add95331e6c321',1,'openvdb::v3_2_0::tools::levelSetMeasure(const GridType &grid, Real &area, Real &volume, bool useWorldSpace=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a6fbbd9feadc4cc9b74f04a24832cf186',1,'openvdb::v3_2_0::tools::levelSetMeasure(const GridType &grid, Real &area, Real &volume, Real &avgCurvature, bool useWorldSpace=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a1432938ada025b83165332c5c8cd2fb5',1,'openvdb::v3_2_0::tools::levelSetMeasure(const GridT &grid, Real &area, Real &volume, bool useWorldSpace)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8c5d615877d59bea3bc787c6826e0be9',1,'openvdb::v3_2_0::tools::levelSetMeasure(const GridT &grid, Real &area, Real &volume, Real &avgCurvature, bool useWorldSpace)']]], + ['levelsetmeasure_2eh',['LevelSetMeasure.h',['../LevelSetMeasure_8h.html',1,'']]], + ['levelsetmorph_2eh',['LevelSetMorph.h',['../LevelSetMorph_8h.html',1,'']]], + ['levelsetmorphing',['LevelSetMorphing',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a989ff97a75fb961cc6d27d22e261ed4d',1,'openvdb::v3_2_0::tools::LevelSetMorphing']]], + ['levelsetmorphing',['LevelSetMorphing',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html',1,'openvdb::v3_2_0::tools']]], + ['levelsetplatonic_2eh',['LevelSetPlatonic.h',['../LevelSetPlatonic_8h.html',1,'']]], + ['levelsetpruneop',['LevelSetPruneOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetPruneOp.html',1,'openvdb::v3_2_0::tools']]], + ['levelsetpruneop',['LevelSetPruneOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetPruneOp.html#a48a65b15bab5ed81e3adbb45ee1e59c0',1,'openvdb::v3_2_0::tools::LevelSetPruneOp::LevelSetPruneOp(TreeT &tree)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetPruneOp.html#a291c1f13df2cecce15b4fd92d2d9b968',1,'openvdb::v3_2_0::tools::LevelSetPruneOp::LevelSetPruneOp(TreeT &tree, const ValueT &outside, const ValueT &inside)']]], + ['levelsetrayintersector',['LevelSetRayIntersector',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#a7b255eda4292b07659d37566c18c5280',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector']]], + ['levelsetrayintersector',['LevelSetRayIntersector',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html',1,'openvdb::v3_2_0::tools']]], + ['levelsetraytracer',['LevelSetRayTracer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html',1,'openvdb::v3_2_0::tools']]], + ['levelsetraytracer',['LevelSetRayTracer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#a0171885ecf7931e3db21f27c63b2749f',1,'openvdb::v3_2_0::tools::LevelSetRayTracer::LevelSetRayTracer(const GridT &grid, const BaseShader &shader, BaseCamera &camera, size_t pixelSamples=1, unsigned int seed=0)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#ac9fa1eb6f4c0d91203eede8846e916df',1,'openvdb::v3_2_0::tools::LevelSetRayTracer::LevelSetRayTracer(const IntersectorT &inter, const BaseShader &shader, BaseCamera &camera, size_t pixelSamples=1, unsigned int seed=0)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#ad1635962357ce95f7e351a7c327a4012',1,'openvdb::v3_2_0::tools::LevelSetRayTracer::LevelSetRayTracer(const LevelSetRayTracer &other)']]], + ['levelsetrebuild',['levelSetRebuild',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a42ea3c773bf61480206095e14bb62238',1,'openvdb::v3_2_0::tools::levelSetRebuild(const GridType &grid, float isovalue=0, float halfWidth=float(LEVEL_SET_HALF_WIDTH), const math::Transform *xform=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#afe0b765a192f3905ca3beaaa07ca6c57',1,'openvdb::v3_2_0::tools::levelSetRebuild(const GridType &grid, float isovalue, float exBandWidth, float inBandWidth, const math::Transform *xform=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#af3cd54de2cfa1fa33096665d9c973530',1,'openvdb::v3_2_0::tools::levelSetRebuild(const GridType &grid, float isovalue, float exBandWidth, float inBandWidth, const math::Transform *xform=NULL, InterruptT *interrupter=NULL)']]], + ['levelsetrebuild_2eh',['LevelSetRebuild.h',['../LevelSetRebuild_8h.html',1,'']]], + ['levelsetsphere',['LevelSetSphere',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetSphere.html',1,'openvdb::v3_2_0::tools']]], + ['levelsetsphere',['LevelSetSphere',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetSphere.html#a37f5b602835c76b62aec4bc5748ef8b0',1,'openvdb::v3_2_0::tools::LevelSetSphere']]], + ['levelsetsphere_2eh',['LevelSetSphere.h',['../LevelSetSphere_8h.html',1,'']]], + ['levelsettracker',['LevelSetTracker',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#aed83e8642be33d5ecc1c5cf64264308c',1,'openvdb::v3_2_0::tools::LevelSetTracker']]], + ['levelsettracker',['LevelSetTracker',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html',1,'openvdb::v3_2_0::tools']]], + ['levelsettracker_2eh',['LevelSetTracker.h',['../LevelSetTracker_8h.html',1,'']]], + ['levelsetutil_2eh',['LevelSetUtil.h',['../LevelSetUtil_8h.html',1,'']]], + ['levelsetvolume',['levelSetVolume',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aa924a0fd965c8581200e4194d77b6d34',1,'openvdb::v3_2_0::tools::levelSetVolume(const GridType &grid, bool useWorldSpace=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ab2748df502ed9dc84dce1cec55eb7aca',1,'openvdb::v3_2_0::tools::levelSetVolume(const GridT &grid, bool useWorldSpace)']]], + ['libraryversion',['libraryVersion',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a6bd641a55d72c9b50f1c27ce665f2d4f',1,'openvdb::v3_2_0::io::Archive::libraryVersion()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a6bd641a55d72c9b50f1c27ce665f2d4f',1,'openvdb::v3_2_0::io::StreamMetadata::libraryVersion()']]], + ['limiter',['Limiter',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1Scheme.html#a28fd66b0310514194a2fb1d2473e3e29',1,'openvdb::v3_2_0::tools::Scheme']]], + ['limits',['Limits',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a561cc2a15e4d23fa5cd655d1633d9716',1,'openvdb::v3_2_0::math::Coord']]], + ['linearop',['LinearOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1LinearOp.html#a63574a8677b0fb1227942cf25f7a22c8',1,'openvdb::v3_2_0::math::pcg::internal::LinearOp']]], + ['linearop',['LinearOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1LinearOp.html',1,'openvdb::v3_2_0::math::pcg::internal']]], + ['linearsearchimpl',['LinearSearchImpl',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html',1,'openvdb::v3_2_0::tools']]], + ['linearsearchimpl',['LinearSearchImpl',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#a4f5cf20a21a4e55fab67b29708b3edb2',1,'openvdb::v3_2_0::tools::LinearSearchImpl']]], + ['linfinitynorm',['lInfinityNorm',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af558ce4af158e49ae1472e29a8c77200',1,'openvdb::v3_2_0::math']]], + ['listt',['ListT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#a87c5ce931b2a70692d36f854fc1a59f0',1,'openvdb::v3_2_0::tree::NodeList']]], + ['listt0',['ListT0',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a71d932294118b298abbbf47a4124377d',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::ListT0()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a71d932294118b298abbbf47a4124377d',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::ListT0()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a71d932294118b298abbbf47a4124377d',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::ListT0()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a71d932294118b298abbbf47a4124377d',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::ListT0()']]], + ['listt1',['ListT1',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a2e820164390a1f703e825e74ad432fda',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::ListT1()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a2e820164390a1f703e825e74ad432fda',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::ListT1()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a2e820164390a1f703e825e74ad432fda',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::ListT1()']]], + ['listt2',['ListT2',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a9a4b44278d8a279dc5f6f209dad9f325',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::ListT2()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a9a4b44278d8a279dc5f6f209dad9f325',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::ListT2()']]], + ['listt3',['ListT3',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#aab3892e2d1057a21db1f4e3b419686e4',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >']]], + ['load',['load',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a92cd6b36a1276d2c9affea59253326ed',1,'openvdb::v3_2_0::util::NodeMask::load()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a92cd6b36a1276d2c9affea59253326ed',1,'openvdb::v3_2_0::util::NodeMask< 1 >::load()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a92cd6b36a1276d2c9affea59253326ed',1,'openvdb::v3_2_0::util::NodeMask< 2 >::load()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a92cd6b36a1276d2c9affea59253326ed',1,'openvdb::v3_2_0::util::RootNodeMask::load()']]], + ['localdata',['LocalData',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeIntersectingVoxelSign.html#ac46d9eabb8d5c4c00b6fd86164196b7c',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ComputeIntersectingVoxelSign']]], + ['localdatatable',['LocalDataTable',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeIntersectingVoxelSign.html#a7c46bc61562e34c9357ae67a40e5427c',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ComputeIntersectingVoxelSign']]], + ['locationtype',['LocationType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#ae37737d93dcbc518f7bf23574a15a960',1,'openvdb::v3_2_0::tools::PointAdvect::LocationType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#ae37737d93dcbc518f7bf23574a15a960',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect::LocationType()']]], + ['lockt',['LockT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#adf810148044ad3054e9419fdab5f0105',1,'openvdb::v3_2_0::tree::ValueAccessor']]], + ['log2dim',['LOG2DIM',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#a843b6364885d3a1a47722e792b0368ecab1bd42b0e4f803f4f312d809b9f49716',1,'openvdb::v3_2_0::tools::PointPartitioner::LOG2DIM()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#acbde5e0147479268c2f56863eb0c2775',1,'openvdb::v3_2_0::tree::InternalNode::LOG2DIM()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#acbde5e0147479268c2f56863eb0c2775',1,'openvdb::v3_2_0::tree::LeafNode::LOG2DIM()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#acbde5e0147479268c2f56863eb0c2775',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LOG2DIM()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#acbde5e0147479268c2f56863eb0c2775',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LOG2DIM()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ac830c7465e47c88b5577127b866612de',1,'openvdb::v3_2_0::util::NodeMask::LOG2DIM()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ac830c7465e47c88b5577127b866612de',1,'openvdb::v3_2_0::util::NodeMask< 1 >::LOG2DIM()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ac830c7465e47c88b5577127b866612de',1,'openvdb::v3_2_0::util::NodeMask< 2 >::LOG2DIM()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a93137277438fecb5b2fcd44a48628f16',1,'openvdb::v3_2_0::tree::LeafNode::log2dim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a93137277438fecb5b2fcd44a48628f16',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::log2dim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a93137277438fecb5b2fcd44a48628f16',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::log2dim()']]], + ['log2pagesize',['log2PageSize',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a20079d9af0877028f05572c5eda297a4',1,'openvdb::v3_2_0::util::PagedArray']]], + ['logging_2eh',['logging.h',['../logging_8h.html',1,'']]], + ['lonenorm',['lOneNorm',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4047d655e0a5cb7c4bb21ecc523c118e',1,'openvdb::v3_2_0::math']]], + ['lookat',['lookAt',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#a761695e2b121c7ef033d050662b8abe8',1,'openvdb::v3_2_0::tools::BaseCamera']]], + ['lookuperror',['LookupError',['../classopenvdb_1_1v3__2__0_1_1LookupError.html#ab38b56e6489cfd7e383e27d1e44224ea',1,'openvdb::v3_2_0::LookupError::LookupError()'],['../classopenvdb_1_1v3__2__0_1_1LookupError.html#a9f1ffd090ac1b57279cd24d53fe53688',1,'openvdb::v3_2_0::LookupError::LookupError(const std::string &msg)']]], + ['lookuperror',['LookupError',['../classopenvdb_1_1v3__2__0_1_1LookupError.html',1,'openvdb::v3_2_0']]], + ['lowermatrix',['lowerMatrix',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#a1956e0c9fff95ac8e0f7cd642ae9aa7d',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_e.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_e.html new file mode 100644 index 00000000..812aced8 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_e.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_e.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_e.js new file mode 100644 index 00000000..1a3797b1 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_e.js @@ -0,0 +1,344 @@ +var searchData= +[ + ['levelsethdda',['LevelSetHDDA',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#a8e7268aae3f9594f96330c390d4c6a1b',1,'openvdb::v3_2_0::tools::LinearSearchImpl']]], + ['mac',['MAC',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1Scheme.html#a4010e0b09fbf6a975c479833d3001f42a9c4ceb72dffdf771c0a249aa8d03e769',1,'openvdb::v3_2_0::tools::Scheme']]], + ['macc',['mAcc',['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html#a1a292a5ddbcfb770da1cf4957425375c',1,'openvdb::v3_2_0::tools::gridop::GridOperator::mAcc()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#ac71827fa0d54c92ffc308bdb2ad36de2',1,'openvdb::v3_2_0::tools::AlphaMask::mAcc()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#ae4dded66913cf50b19f71f9e19fc43f3',1,'openvdb::v3_2_0::tools::Morphology::mAcc()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1MathOp.html#af6a752e59fbae92fbb9ba6775344c41a',1,'openvdb::v3_2_0::tools::stats_internal::MathOp::mAcc()']]], + ['maccessorregistry',['mAccessorRegistry',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a3f395a4d4c40770f12f1ac8e08fdfbda',1,'openvdb::v3_2_0::tree::Tree']]], + ['mactive',['mActive',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TileSampler.html#ab582c8b862d2c49ab3ad21ac7b036500',1,'openvdb::v3_2_0::tools::internal::TileSampler']]], + ['magnitude',['Magnitude',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude.html',1,'openvdb::v3_2_0::tools']]], + ['magnitude',['Magnitude',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude.html#a6befb991df14acf2dd3ed9ccaa44cb82',1,'openvdb::v3_2_0::tools::Magnitude::Magnitude(const InGridType &grid, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude.html#a17e5666324959f0e9830293f55641e25',1,'openvdb::v3_2_0::tools::Magnitude::Magnitude(const InGridType &grid, const MaskGridType &mask, InterruptT *interrupt=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a9370eee6dbb6de354a68a54b9cdd1dba',1,'openvdb::v3_2_0::tools::magnitude(const GridType &grid, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a06fe38fb2a95969530d664ef92f7dcae',1,'openvdb::v3_2_0::tools::magnitude(const GridType &grid, const MaskT &mask, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a0732e019d0efcac7f0eb0df07bfc7f80',1,'openvdb::v3_2_0::tools::magnitude(const GridType &grid, bool threaded=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aa3e37698f657fdc03ad63a36bcb7470d',1,'openvdb::v3_2_0::tools::magnitude(const GridType &grid, const MaskT &mask, bool threaded=true)']]], + ['mainside',['mAInside',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CsgVisitorBase.html#a7670e7ec412be012579e7a593f058254',1,'openvdb::v3_2_0::tools::CsgVisitorBase']]], + ['maisactive',['mAIsActive',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a3d1d419081544f085c4fc0812b7ac3e8',1,'openvdb::v3_2_0::CombineArgs']]], + ['makechildnodeempty',['makeChildNodeEmpty',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ac20b5f81858f56ea4d5b86106434e8bb',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['managert',['ManagerT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1MaskOp.html#a657e2b3a0205ca7da9915258ae5a1484',1,'openvdb::v3_2_0::tools::MultiResGrid::MaskOp::ManagerT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafManagerImpl_3_01LeafManager_3_01const_01TreeT_01_4_01_4.html#a673da19b147fc4921b97f15e83702901',1,'openvdb::v3_2_0::tree::LeafManagerImpl< LeafManager< const TreeT > >::ManagerT()']]], + ['managertype',['ManagerType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#a339ead1a60ac493c14cb7600701211b6',1,'openvdb::v3_2_0::tools::LevelSetMeasure::ManagerType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a05d661b0f9037e044b2430e383dc572e',1,'openvdb::v3_2_0::tools::Morphology::ManagerType()']]], + ['maoutside',['mAOutside',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CsgVisitorBase.html#a719680952f5df1f678d932bbb022d3ad',1,'openvdb::v3_2_0::tools::CsgVisitorBase']]], + ['map',['map',['../structopenvdb_1_1v3__2__0_1_1math_1_1MapAdapter.html#a9b1a727d69fd9d9c45c0f3ab0fff6e71',1,'openvdb::v3_2_0::math::MapAdapter::map()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#accc63e204c4b118ae654260ab9c0f131',1,'openvdb::v3_2_0::math::Transform::map()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a8a4d2c36dba128229472e08dad1dd923',1,'openvdb::v3_2_0::math::Transform::map() const ']]], + ['mapadapter',['MapAdapter',['../structopenvdb_1_1v3__2__0_1_1math_1_1MapAdapter.html',1,'openvdb::v3_2_0::math']]], + ['mapadapter',['MapAdapter',['../structopenvdb_1_1v3__2__0_1_1math_1_1MapAdapter.html#adbcdd55379d41481bf431b147c91d312',1,'openvdb::v3_2_0::math::MapAdapter']]], + ['mapbase',['MapBase',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#ab6232aa508855677288726b3ce65e992',1,'openvdb::v3_2_0::math::MapBase']]], + ['mapbase',['MapBase',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html',1,'openvdb::v3_2_0::math']]], + ['mapdictionary',['MapDictionary',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapRegistry.html#a9aa51380952d6364c67eeafa0ff383d8',1,'openvdb::v3_2_0::math::MapRegistry']]], + ['mapfactory',['MapFactory',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a325faed3969e6f7f36216b67bc85aa03',1,'openvdb::v3_2_0::math::MapBase']]], + ['mappedfile',['MappedFile',['../classopenvdb_1_1v3__2__0_1_1io_1_1MappedFile.html',1,'openvdb::v3_2_0::io']]], + ['mapping',['mapping',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1FileInfo.html#a57817a76da1bb7e5e2a59566e2327cc2',1,'openvdb::v3_2_0::tree::LeafNode::FileInfo']]], + ['mappoints',['MapPoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MapPoints.html',1,'openvdb::v3_2_0::tools::internal']]], + ['mappoints',['MapPoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MapPoints.html#a9780efc4a9c5d284be3635b4401afb96',1,'openvdb::v3_2_0::tools::internal::MapPoints']]], + ['mapregistry',['MapRegistry',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapRegistry.html',1,'openvdb::v3_2_0::math']]], + ['maps_2eh',['Maps.h',['../Maps_8h.html',1,'']]], + ['mapsutil_2eh',['MapsUtil.h',['../MapsUtil_8h.html',1,'']]], + ['maptype',['mapType',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#aeeed2d8fb3fd153d0310c6094bb9df9b',1,'openvdb::v3_2_0::math::AffineMap::mapType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#aeeed2d8fb3fd153d0310c6094bb9df9b',1,'openvdb::v3_2_0::math::ScaleMap::mapType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#aeeed2d8fb3fd153d0310c6094bb9df9b',1,'openvdb::v3_2_0::math::UniformScaleMap::mapType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#aeeed2d8fb3fd153d0310c6094bb9df9b',1,'openvdb::v3_2_0::math::TranslationMap::mapType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#aeeed2d8fb3fd153d0310c6094bb9df9b',1,'openvdb::v3_2_0::math::ScaleTranslateMap::mapType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#aeeed2d8fb3fd153d0310c6094bb9df9b',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::mapType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#aeeed2d8fb3fd153d0310c6094bb9df9b',1,'openvdb::v3_2_0::math::UnitaryMap::mapType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#aeeed2d8fb3fd153d0310c6094bb9df9b',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::mapType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#aeeed2d8fb3fd153d0310c6094bb9df9b',1,'openvdb::v3_2_0::math::CompoundMap::mapType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#af6d21e5dd5380c8db96b67e6eea75b77',1,'openvdb::v3_2_0::math::Transform::mapType()']]], + ['march',['march',['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA.html#a6949cf445c4a515ab29bdf4272457630',1,'openvdb::v3_2_0::math::VolumeHDDA::march()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA_3_01TreeT_00_01RayT_00_010_01_4.html#a6949cf445c4a515ab29bdf4272457630',1,'openvdb::v3_2_0::math::VolumeHDDA< TreeT, RayT, 0 >::march()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#af4173fb25fc272ff5b3bad7bc8fe4f99',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::march()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a40855a4444963c88dc441cad2b0272fb',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::march(RealType &t0, RealType &t1)']]], + ['marray',['mArray',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1FillArray.html#a3e22c506f2c60985d7db112fa5cae72d',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::FillArray']]], + ['mask',['Mask',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html#ac22eeebbaa29b22b84aa84986293f93e',1,'openvdb::v3_2_0::util::PagedArray::Page::Mask()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1NodeMaskSegment.html#a73814dcc88ab963bcfa5be183e8e5e9a',1,'openvdb::v3_2_0::tools::level_set_util_internal::NodeMaskSegment::mask()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#aaa4dd9913464ea4acba910ae525063a3',1,'openvdb::v3_2_0::tools::Morphology::LeafCache::mask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Diagnose.html#a9e1de0351fe582d118efbab5807a9923',1,'openvdb::v3_2_0::tools::Diagnose::mask() const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Diagnose.html#ac6573c43ff7d01bf210531d30bb0455e',1,'openvdb::v3_2_0::tools::Diagnose::mask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#a9e1de0351fe582d118efbab5807a9923',1,'openvdb::v3_2_0::tools::CheckLevelSet::mask() const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#ac6573c43ff7d01bf210531d30bb0455e',1,'openvdb::v3_2_0::tools::CheckLevelSet::mask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#a9e1de0351fe582d118efbab5807a9923',1,'openvdb::v3_2_0::tools::CheckFogVolume::mask() const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#ac6573c43ff7d01bf210531d30bb0455e',1,'openvdb::v3_2_0::tools::CheckFogVolume::mask()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskSegmentGroup.html#a0b6f24e5e832c9fe0777a302933fe02a',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskSegmentGroup::mask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenSeamMask.html#af66f40e0e61b5813b5a779ead13a754b',1,'openvdb::v3_2_0::tools::internal::GenSeamMask::mask()']]], + ['mask_5fand_5fno_5finactive_5fvals',['MASK_AND_NO_INACTIVE_VALS',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a6b7b47dd702d9e331586d485013fd1eaa1539a35c40a309c6885923ae07448545',1,'openvdb::v3_2_0::io']]], + ['mask_5fand_5fone_5finactive_5fval',['MASK_AND_ONE_INACTIVE_VAL',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a6b7b47dd702d9e331586d485013fd1eaacb1e3f0557f6ed9e38a2cf37b72ca4f8',1,'openvdb::v3_2_0::io']]], + ['mask_5fand_5ftwo_5finactive_5fvals',['MASK_AND_TWO_INACTIVE_VALS',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a6b7b47dd702d9e331586d485013fd1eaa5c5f0736d1c2573d9d0dc076de38210f',1,'openvdb::v3_2_0::io']]], + ['mask_5fdirty_5fbit',['MASK_DIRTY_BIT',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a540c98815fbf3a535e5c3474823ca58caefa7166fc10125d8a84112c85f7fbd8b',1,'openvdb::v3_2_0::tools::internal']]], + ['mask_5ffirst_5f10_5fbits',['MASK_FIRST_10_BITS',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a540c98815fbf3a535e5c3474823ca58ca1ec774a34877cb4286e5fbf40191d37b',1,'openvdb::v3_2_0::tools::internal']]], + ['mask_5finvalid_5fbit',['MASK_INVALID_BIT',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a540c98815fbf3a535e5c3474823ca58cacf6696bc3fcba98cb26f4edf78d8bbcc',1,'openvdb::v3_2_0::tools::internal']]], + ['maskdenseiter',['MaskDenseIter',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a6de49a6d78541ee5698097dc641a3e86',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::MaskDenseIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a6de49a6d78541ee5698097dc641a3e86',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::MaskDenseIter()']]], + ['maskdenseiterator',['MaskDenseIterator',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a06023eaf4fbd8092ff12eb1829ea1a49',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::MaskDenseIterator()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a06023eaf4fbd8092ff12eb1829ea1a49',1,'openvdb::v3_2_0::tree::InternalNode::MaskDenseIterator()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a06023eaf4fbd8092ff12eb1829ea1a49',1,'openvdb::v3_2_0::tree::LeafNode::MaskDenseIterator()']]], + ['maskedcopy',['MaskedCopy',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskedCopy.html#a536a66d63dc4323caa71fd7fba74d776',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskedCopy']]], + ['maskedcopy',['MaskedCopy',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskedCopy.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['maskedges',['MaskEdges',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MaskEdges.html',1,'openvdb::v3_2_0::tools::internal']]], + ['maskedges',['MaskEdges',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MaskEdges.html#a818bda525da363feb32200548fd72187',1,'openvdb::v3_2_0::tools::internal::MaskEdges']]], + ['maskgrid',['MaskGrid',['../namespaceopenvdb_1_1v3__2__0.html#a4ad586079c586a506e17e3a73918e41a',1,'openvdb::v3_2_0']]], + ['maskinteriortiles',['MaskInteriorTiles',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorTiles.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['maskinteriortiles',['MaskInteriorTiles',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorTiles.html#ad33c7514f4451699b1d40f5570b59438',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorTiles']]], + ['maskinteriorvoxels',['MaskInteriorVoxels',['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1MaskInteriorVoxels.html',1,'openvdb::v3_2_0::tools::clip_internal']]], + ['maskinteriorvoxels',['MaskInteriorVoxels',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorVoxels.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['maskinteriorvoxels',['MaskInteriorVoxels',['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1MaskInteriorVoxels.html#aa1bd96df7db6a59e922cf783c9359970',1,'openvdb::v3_2_0::tools::clip_internal::MaskInteriorVoxels::MaskInteriorVoxels()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorVoxels.html#a16f22b2b2210a6404df172619fe447b8',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorVoxels::MaskInteriorVoxels()']]], + ['maskisovaluecrossingvoxels',['MaskIsovalueCrossingVoxels',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskIsovalueCrossingVoxels.html#ae061a5ae7d21db9cab48a060c007b069',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskIsovalueCrossingVoxels::MaskIsovalueCrossingVoxels(const InputTreeType &inputTree, const std::vector< const InputLeafNodeType * > &inputLeafNodes, BoolTreeType &maskTree, InputValueType iso)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskIsovalueCrossingVoxels.html#ab19802bcd76b85c91664fa892dd38359',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskIsovalueCrossingVoxels::MaskIsovalueCrossingVoxels(MaskIsovalueCrossingVoxels &rhs, tbb::split)']]], + ['maskisovaluecrossingvoxels',['MaskIsovalueCrossingVoxels',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskIsovalueCrossingVoxels.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['maskleafciter',['MaskLeafCIter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#a91921150e1636d9575cf1b4cc448c8fc',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor']]], + ['maskleafmanagert',['MaskLeafManagerT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1CopyLeafNodes.html#adff80b5bd0147623107d8dddf6ab6e12',1,'openvdb::v3_2_0::tools::clip_internal::CopyLeafNodes']]], + ['maskleaft',['MaskLeafT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#a42e9be0445eb07c4ba3c3eb5dcf4ee34',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor']]], + ['maskleafvec',['MaskLeafVec',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#af047097b93b88550e59893c545990209',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor']]], + ['maskmanager',['MaskManager',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1MaskManager.html#a042f502ffba8d73b794059ada1590361',1,'openvdb::v3_2_0::tools::Morphology::MaskManager']]], + ['maskmanager',['MaskManager',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1MaskManager.html',1,'openvdb::v3_2_0::tools::Morphology']]], + ['masknodeinternalneighbours',['maskNodeInternalNeighbours',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal.html#aa6760de6a30b8d1960df4dbecb5ada62',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['maskoffiter',['MaskOffIter',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a23f880a7c92e6150918559326270edb0',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::MaskOffIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a23f880a7c92e6150918559326270edb0',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::MaskOffIter()']]], + ['maskoffiterator',['MaskOffIterator',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ac987a793c5c17616139f71d4ef68836d',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::MaskOffIterator()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ac987a793c5c17616139f71d4ef68836d',1,'openvdb::v3_2_0::tree::InternalNode::MaskOffIterator()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ac987a793c5c17616139f71d4ef68836d',1,'openvdb::v3_2_0::tree::LeafNode::MaskOffIterator()']]], + ['maskoniter',['MaskOnIter',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a6cf1eeb573f296d8a1a70394d8ec34af',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::MaskOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a6cf1eeb573f296d8a1a70394d8ec34af',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::MaskOnIter()']]], + ['maskoniterator',['MaskOnIterator',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#aa628d48b1fb44f64a69217a3c3f5f31b',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::MaskOnIterator()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aa628d48b1fb44f64a69217a3c3f5f31b',1,'openvdb::v3_2_0::tree::InternalNode::MaskOnIterator()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aa628d48b1fb44f64a69217a3c3f5f31b',1,'openvdb::v3_2_0::tree::LeafNode::MaskOnIterator()']]], + ['maskop',['MaskOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1MaskOp.html#a338cfdcbd49056edffdbc6f6826b23a8',1,'openvdb::v3_2_0::tools::MultiResGrid::MaskOp']]], + ['maskop',['MaskOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1MaskOp.html',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['maskpos',['maskpos',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1FileInfo.html#aa0c1a143d5f7ab4615d6c4f965bda03e',1,'openvdb::v3_2_0::tree::LeafNode::FileInfo']]], + ['masksegmentgroup',['MaskSegmentGroup',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskSegmentGroup.html#ac8c5b7253cdbb9a795d3f299b622547e',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskSegmentGroup::MaskSegmentGroup(const std::vector< NodeMaskSegmentType * > &segments)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskSegmentGroup.html#af510f5955b6275c34354cc6e8e324048',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskSegmentGroup::MaskSegmentGroup(const MaskSegmentGroup &rhs, tbb::split)']]], + ['masksegmentgroup',['MaskSegmentGroup',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskSegmentGroup.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['maskt',['MaskT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1MaskOp.html#a970639a7ca66f75bf8364920ac6fcac0',1,'openvdb::v3_2_0::tools::MultiResGrid::MaskOp']]], + ['masktolevelset',['maskToLevelSet',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aaff643eb2f73725a0cae51bdafc096cc',1,'openvdb::v3_2_0::tools::maskToLevelSet(const GridT &grid, int halfWidth=3, int dilation=1, int erosion=1, InterrupterT *interrupt=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a3fc47cfad2977fb76aefaa4e27466482',1,'openvdb::v3_2_0::tools::maskToLevelSet(const GridT &grid, int halfWidth=3, int dilation=1, int erosion=1)']]], + ['masktolevelset_2eh',['MaskToLevelSet.h',['../MaskToLevelSet_8h.html',1,'']]], + ['masktree',['MaskTree',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#af2452bc9149f5d9053973ca1a88a206d',1,'openvdb::v3_2_0::tools::SparseExtractor::MaskTree()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#af2452bc9149f5d9053973ca1a88a206d',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor::MaskTree()'],['../namespaceopenvdb_1_1v3__2__0.html#a9ce184648052c93e51c62424e287c2a1',1,'openvdb::v3_2_0::MaskTree()']]], + ['masktreet',['MaskTreeT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1CopyLeafNodes.html#a91ff2674951cf9a5af3d085c506d5040',1,'openvdb::v3_2_0::tools::clip_internal::CopyLeafNodes::MaskTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#a91ff2674951cf9a5af3d085c506d5040',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor::MaskTreeT()']]], + ['masktreetype',['MaskTreeType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#ab9e8c0cbaa4b10fcd383498d9ba851f4',1,'openvdb::v3_2_0::tools::LevelSetTracker']]], + ['masktype',['MaskType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Diagnose.html#a693ca5fd5bf6ae701f4103c661a1a2e3',1,'openvdb::v3_2_0::tools::Diagnose::MaskType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#aba9226377de0ff32d20b93775559a6e7',1,'openvdb::v3_2_0::tools::CheckLevelSet::MaskType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#aba9226377de0ff32d20b93775559a6e7',1,'openvdb::v3_2_0::tools::CheckFogVolume::MaskType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a02c1464eb4bb8e2e414ba5efbbab6393',1,'openvdb::v3_2_0::tools::Filter::MaskType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#a02c1464eb4bb8e2e414ba5efbbab6393',1,'openvdb::v3_2_0::tools::AlphaMask::MaskType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a02c1464eb4bb8e2e414ba5efbbab6393',1,'openvdb::v3_2_0::tools::LevelSetFilter::MaskType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#ae205c06f54b7f212b9664493f01ff7da',1,'openvdb::v3_2_0::tools::Morphology::MaskType()']]], + ['mat',['Mat',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html',1,'openvdb::v3_2_0::math']]], + ['mat',['mat',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1IsFiniteOp.html#a430358b3f5d69a38e10a0813028701e6',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::IsFiniteOp::mat()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer_1_1MatrixTransform.html#aa8607ea054820d2ac22cd3ba6d23aabc',1,'openvdb::v3_2_0::tools::GridTransformer::MatrixTransform::mat()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1HomogeneousMatMul.html#a5c83e050fc2b2e0f06288f74cde5d715',1,'openvdb::v3_2_0::tools::HomogeneousMatMul::mat()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MatMul.html#a5c83e050fc2b2e0f06288f74cde5d715',1,'openvdb::v3_2_0::tools::MatMul::mat()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MatMulNormalize.html#a5c83e050fc2b2e0f06288f74cde5d715',1,'openvdb::v3_2_0::tools::MatMulNormalize::mat()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#a13e4639b574685e1d9162ed953e607ed',1,'openvdb::v3_2_0::math::Mat::Mat()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#acb2334fc4b0ad4732e6ff82339829aff',1,'openvdb::v3_2_0::math::Mat::Mat(Mat const &src)']]], + ['mat_2eh',['Mat.h',['../Mat_8h.html',1,'']]], + ['mat2',['Mat2',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat2.html',1,'openvdb::v3_2_0::math']]], + ['mat3',['Mat3',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html',1,'openvdb::v3_2_0::math']]], + ['mat3',['Mat3',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a0cdfb3756d0a42ef5b982d3edcba2849',1,'openvdb::v3_2_0::math::Mat3::Mat3()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a4f3c62a07134932141ca7b232cbebedf',1,'openvdb::v3_2_0::math::Mat3::Mat3(const Quat< T > &q)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a388ae0eae0c195dfa49243f8ec887380',1,'openvdb::v3_2_0::math::Mat3::Mat3(Source a, Source b, Source c, Source d, Source e, Source f, Source g, Source h, Source i)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#af5c6e52f518ee1b0a32ca326be232a45',1,'openvdb::v3_2_0::math::Mat3::Mat3(const Vec3< Source > &v1, const Vec3< Source > &v2, const Vec3< Source > &v3, bool rows=true)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a05da645433d2aa5a093b9bd83bff462c',1,'openvdb::v3_2_0::math::Mat3::Mat3(Source *a)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a4153835232b2b5ec21e6bc47f310b795',1,'openvdb::v3_2_0::math::Mat3::Mat3(const Mat< 3, T > &m)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a3f290b7cc60dc850211e9998f591a61d',1,'openvdb::v3_2_0::math::Mat3::Mat3(const Mat3< Source > &m)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a09019555d02c7e94c1c871d1b05c2ec9',1,'openvdb::v3_2_0::math::Mat3::Mat3(const Mat4< T > &m)']]], + ['mat3_2eh',['Mat3.h',['../Mat3_8h.html',1,'']]], + ['mat3_3c_20double_20_3e',['Mat3< double >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html',1,'openvdb::v3_2_0::math']]], + ['mat3d',['Mat3d',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a15b8d95db03b150f5b6b9ac7a17c744c',1,'openvdb::v3_2_0::math']]], + ['mat3f',['Mat3f',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#afade7f9f65a4be6ecaacad8f0cb705b6',1,'openvdb::v3_2_0::math']]], + ['mat3r',['Mat3R',['../namespaceopenvdb_1_1v3__2__0.html#a2511d8857bd9a6423d3c6fde5c88bde7',1,'openvdb::v3_2_0']]], + ['mat3s',['Mat3s',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aee0814e3251871e89dff147270c95f32',1,'openvdb::v3_2_0::math']]], + ['mat4',['Mat4',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html',1,'openvdb::v3_2_0::math']]], + ['mat4',['Mat4',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a582edf2e4e6ed40c4cea7d0fec9a252f',1,'openvdb::v3_2_0::math::Mat4::Mat4()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#ab225ef444ee1962bc0abfafb9b8dfb5b',1,'openvdb::v3_2_0::math::Mat4::Mat4(Source *a)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#abec46d0f9d9083cccab32bbe61e8ce2a',1,'openvdb::v3_2_0::math::Mat4::Mat4(Source a, Source b, Source c, Source d, Source e, Source f, Source g, Source h, Source i, Source j, Source k, Source l, Source m, Source n, Source o, Source p)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a84369eb1962b9b38120540353c4e309f',1,'openvdb::v3_2_0::math::Mat4::Mat4(const Vec4< Source > &v1, const Vec4< Source > &v2, const Vec4< Source > &v3, const Vec4< Source > &v4, bool rows=true)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a854635f86081effa7694c6848fdc52b7',1,'openvdb::v3_2_0::math::Mat4::Mat4(const Mat< 4, T > &m)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a28dccdc05858b244cd361cea1f57512b',1,'openvdb::v3_2_0::math::Mat4::Mat4(const Mat4< Source > &m)']]], + ['mat4_2eh',['Mat4.h',['../Mat4_8h.html',1,'']]], + ['mat4_3c_20double_20_3e',['Mat4< double >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html',1,'openvdb::v3_2_0::math']]], + ['mat4_3c_20real_20_3e',['Mat4< Real >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html',1,'openvdb::v3_2_0::math']]], + ['mat4d',['Mat4d',['../namespaceopenvdb_1_1v3__2__0.html#ab3a91c5eb62320610ea0fd6bd6fb4146',1,'openvdb::v3_2_0::Mat4d()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af33c8658fedbfc4706d6505b1fd475a8',1,'openvdb::v3_2_0::math::Mat4d()']]], + ['mat4dmetadata',['Mat4DMetadata',['../namespaceopenvdb_1_1v3__2__0.html#aa82b216527004b9571c1d0dfbb8fe9b1',1,'openvdb::v3_2_0']]], + ['mat4f',['Mat4f',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a33bfa92ce72de8bdaba601d6a3a8d377',1,'openvdb::v3_2_0::math']]], + ['mat4r',['Mat4R',['../namespaceopenvdb_1_1v3__2__0.html#ab9150b39b5c273900f5cb5fcb930096f',1,'openvdb::v3_2_0']]], + ['mat4s',['Mat4s',['../namespaceopenvdb_1_1v3__2__0.html#a414c7ee0bbf9fa7baa5c54c6b6c8f505',1,'openvdb::v3_2_0::Mat4s()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a25559485ccf91e3db302192dac6e439a',1,'openvdb::v3_2_0::math::Mat4s()']]], + ['mat4smetadata',['Mat4SMetadata',['../namespaceopenvdb_1_1v3__2__0.html#aeb18227765214253b36604920903430c',1,'openvdb::v3_2_0']]], + ['mat_3c_203_2c_20t_20_3e',['Mat< 3, T >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html',1,'openvdb::v3_2_0::math']]], + ['mat_3c_204_2c_20double_20_3e',['Mat< 4, double >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html',1,'openvdb::v3_2_0::math']]], + ['mat_3c_204_2c_20real_20_3e',['Mat< 4, Real >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html',1,'openvdb::v3_2_0::math']]], + ['mat_3c_204_2c_20t_20_3e',['Mat< 4, T >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html',1,'openvdb::v3_2_0::math']]], + ['matchedgegroup',['matchEdgeGroup',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a77524c5b4199eb058ecedc2dc1c4a7bf',1,'openvdb::v3_2_0::tools::internal']]], + ['math_2eh',['Math.h',['../Math_8h.html',1,'']]], + ['math_2etxt',['math.txt',['../math_8txt.html',1,'']]], + ['mathop',['MathOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1MathOp.html',1,'openvdb::v3_2_0::tools::stats_internal']]], + ['mathop',['MathOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1MathOp.html#a3191e23081357c1a6220d18259d392ce',1,'openvdb::v3_2_0::tools::stats_internal::MathOp']]], + ['matmul',['MatMul',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MatMul.html',1,'openvdb::v3_2_0::tools']]], + ['matmul',['MatMul',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MatMul.html#a59cf6c732ef2e69040ccffa439bc0409',1,'openvdb::v3_2_0::tools::MatMul']]], + ['matmulnormalize',['MatMulNormalize',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MatMulNormalize.html',1,'openvdb::v3_2_0::tools']]], + ['matmulnormalize',['MatMulNormalize',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MatMulNormalize.html#a1e6df66ef085affe9e09b5b12e842cb5',1,'openvdb::v3_2_0::tools::MatMulNormalize']]], + ['matrixcopyop',['MatrixCopyOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1MatrixCopyOp.html',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix']]], + ['matrixcopyop',['MatrixCopyOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1MatrixCopyOp.html#a2891ae9bfcc5a05155a6bcbd06efe237',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::MatrixCopyOp']]], + ['matrixtransform',['MatrixTransform',['../structopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer_1_1MatrixTransform.html#a4858a47c4f0da5667232226d68503836',1,'openvdb::v3_2_0::tools::GridTransformer::MatrixTransform::MatrixTransform()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer_1_1MatrixTransform.html#ae33e39598646db1e41a5bfab61afa5fc',1,'openvdb::v3_2_0::tools::GridTransformer::MatrixTransform::MatrixTransform(const Mat4R &xform)']]], + ['matrixtransform',['MatrixTransform',['../structopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer_1_1MatrixTransform.html',1,'openvdb::v3_2_0::tools::GridTransformer']]], + ['matteshader',['MatteShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MatteShader.html',1,'openvdb::v3_2_0::tools']]], + ['matteshader',['MatteShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MatteShader.html#ab545f042a19242b24003b4a3b2cf5cc0',1,'openvdb::v3_2_0::tools::MatteShader::MatteShader()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MatteShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#a683f39cdf723f28f036c43fcfb5be65e',1,'openvdb::v3_2_0::tools::MatteShader< Film::RGBA, SamplerType >::MatteShader()']]], + ['matteshader_3c_20film_3a_3argba_2c_20samplertype_20_3e',['MatteShader< Film::RGBA, SamplerType >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MatteShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['maux',['mAux',['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#ad1c8e51baddccfaff6f4be858336922c',1,'openvdb::v3_2_0::math::Stats']]], + ['mavalptr',['mAValPtr',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a582ffe7c91b905f25a55d9ca15b347f0',1,'openvdb::v3_2_0::CombineArgs']]], + ['mavg',['mAvg',['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#a1d259d725d0ba5bc05cbfd03a4dd17df',1,'openvdb::v3_2_0::math::Stats']]], + ['max',['max',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#ad4cb1df7ed158de5d3f02f7d92ca8568',1,'openvdb::v3_2_0::math::BBox::max() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a9e6cf1099dcd1b06ec3732a3ac9b39de',1,'openvdb::v3_2_0::math::BBox::max()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#ad980beb19efd25513ebe6ec3c7cbf1e1',1,'openvdb::v3_2_0::math::Coord::max()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a7d6efe25641f5d0d9d1a3a925eb0225f',1,'openvdb::v3_2_0::math::CoordBBox::max() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a9353b644936db74c010160ebd01a1d6c',1,'openvdb::v3_2_0::math::CoordBBox::max()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MinMax.html#a9ecdb03d1db38be2a4a41fbc0585da12',1,'openvdb::v3_2_0::math::MinMax::max()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#a9bfc3700bf01576b1ca49e5a64b87abe',1,'openvdb::v3_2_0::math::Extrema::max()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html#a9bfc3700bf01576b1ca49e5a64b87abe',1,'openvdb::v3_2_0::math::Histogram::max() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html#a54ce7fdd774eaed1b608ded4fa144821',1,'openvdb::v3_2_0::math::Histogram::max(int n) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#adfff52a286ad3af8678c25389e70f944',1,'openvdb::v3_2_0::math::BaseStencil::max()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html#a1c0cffbff201ac950f3dc3a14159781d',1,'openvdb::v3_2_0::tools::composite::max(const T &a, const T &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html#a412abfdfd0f015575bb78f4971a89a8d',1,'openvdb::v3_2_0::tools::composite::max(const T &a, const T &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aa019924cc631f7fa27fe3d75a9a0d2a5',1,'openvdb::v3_2_0::math::Max(const Type &a, const Type &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#adc3ff239e08f6709eff6724cfc9ea6c8',1,'openvdb::v3_2_0::math::Max(const Type &a, const Type &b, const Type &c)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1a58032a4fb68a17f654fa3c33ea2b42',1,'openvdb::v3_2_0::math::Max(const Type &a, const Type &b, const Type &c, const Type &d)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a5483ed2a0a98f38b9257f34d3be973e4',1,'openvdb::v3_2_0::math::Max(const Type &a, const Type &b, const Type &c, const Type &d, const Type &e)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a79859ed6801f6440d5771db99d9f8f68',1,'openvdb::v3_2_0::math::Max(const Type &a, const Type &b, const Type &c, const Type &d, const Type &e, const Type &f)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ac9386c1b6e7de0a87e921d919a088839',1,'openvdb::v3_2_0::math::Max(const Type &a, const Type &b, const Type &c, const Type &d, const Type &e, const Type &f, const Type &g)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a0f2bf9f2a59f93a548fc834e977135c1',1,'openvdb::v3_2_0::math::Max(const Type &a, const Type &b, const Type &c, const Type &d, const Type &e, const Type &f, const Type &g, const Type &h)']]], + ['maxcomponent',['maxComponent',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a7262dd7cf1f83a05f72f6642b0469771',1,'openvdb::v3_2_0::math::Coord::maxComponent(const Coord &other)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a6a7c8e99b11b6ebd378f59b96cb26a00',1,'openvdb::v3_2_0::math::Coord::maxComponent(const Coord &lhs, const Coord &rhs)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aa04fd7f7a60948ac5699040eb5689dfa',1,'openvdb::v3_2_0::math::maxComponent(const Vec2< T > &v1, const Vec2< T > &v2)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a401014bf1dc4a54ba61eff88cce7a7b3',1,'openvdb::v3_2_0::math::maxComponent(const Vec3< T > &v1, const Vec3< T > &v2)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9b3b5fdd4594a65b622ea384fd75421b',1,'openvdb::v3_2_0::math::maxComponent(const Vec4< T > &v1, const Vec4< T > &v2)']]], + ['maxextent',['maxExtent',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a70f8b67987ddb9a519dd84ec627ca4f7',1,'openvdb::v3_2_0::math::BBox::maxExtent()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a70f8b67987ddb9a519dd84ec627ca4f7',1,'openvdb::v3_2_0::math::CoordBBox::maxExtent()']]], + ['maxindex',['maxIndex',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a0f17216607a0bc3bc9eb3e7adaffec0c',1,'openvdb::v3_2_0::math::Coord::maxIndex()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7d936b4c8c1ce2c74325659a95a621e6',1,'openvdb::v3_2_0::math::MaxIndex()']]], + ['maxmask',['maxMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a9777c31969d25df95ca03c7b10ae6b96',1,'openvdb::v3_2_0::tools::Filter::maxMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a9777c31969d25df95ca03c7b10ae6b96',1,'openvdb::v3_2_0::tools::LevelSetFilter::maxMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#ac67a493ef6c55b2f08cbe5287e499eda',1,'openvdb::v3_2_0::tools::LevelSetMorphing::maxMask()']]], + ['maxop',['MaxOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1MaxOp.html#a0c6c190ae87ca54ab1b640ac3d5479f5',1,'openvdb::v3_2_0::tools::valxform::MaxOp']]], + ['maxop',['MaxOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1MaxOp.html',1,'openvdb::v3_2_0::tools::valxform']]], + ['maxradius',['maxRadius',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1ComputeExtremas.html#a801c0f15883bbe3e5bed85a23b0225cd',1,'openvdb::v3_2_0::tools::particle_atlas_internal::ComputeExtremas::maxRadius()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#aad4662786a91b6328e7afaeb08e7cb3b',1,'openvdb::v3_2_0::tools::ParticleAtlas::maxRadius()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#aded45bdb44a1eb66916e29741218a8f7',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray::maxRadius()']]], + ['maxtime',['maxTime',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#aece917d283f06e2a2ed5245b55edc6c5',1,'openvdb::v3_2_0::math::DDA']]], + ['maxval',['maxVal',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckRange.html#aa412993556cc23295151aa98653affff',1,'openvdb::v3_2_0::tools::CheckRange::maxVal()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMax.html#aa412993556cc23295151aa98653affff',1,'openvdb::v3_2_0::tools::CheckMax::maxVal()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#a88cc619226eda30a511d48fcb571bb53',1,'openvdb::v3_2_0::tools::CheckEikonal::maxVal()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#a88cc619226eda30a511d48fcb571bb53',1,'openvdb::v3_2_0::tools::CheckDivergence::maxVal()']]], + ['maxval2',['maxVal2',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#a7ec78e64657f41d360ed29ce991ec82f',1,'openvdb::v3_2_0::tools::CheckNormGrad']]], + ['maxvalue',['maxValue',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__fracture__internal_1_1FindMinMaxVoxelValue.html#ad3aa7702330e578d4c8045f8442329af',1,'openvdb::v3_2_0::tools::level_set_fracture_internal::FindMinMaxVoxelValue']]], + ['mbbox',['mBBox',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutZYX_01_4.html#a6104949c915033a80c0d4d19b00196b1',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutZYX >::mBBox()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutXYZ_01_4.html#a6104949c915033a80c0d4d19b00196b1',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutXYZ >::mBBox()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TileSampler.html#a8a55455c4a195847d52c35d3653f847b',1,'openvdb::v3_2_0::tools::internal::TileSampler::mBBox()']]], + ['mbinlog2dim',['mBinLog2Dim',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#ab3f8377663d15c7946dc0e17f0ce6b33',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp']]], + ['mbinside',['mBInside',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CsgVisitorBase.html#a9b2ce814dc63f3caba5fa8f36c51c79b',1,'openvdb::v3_2_0::tools::CsgVisitorBase']]], + ['mbinvolume',['mBinVolume',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1OrderSegmentsOp.html#a3bbe791d9838e148641ae59ccbabc9dd',1,'openvdb::v3_2_0::tools::point_partitioner_internal::OrderSegmentsOp']]], + ['mbisactive',['mBIsActive',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a5e19ace3e015e8b5fbd47314c679d607',1,'openvdb::v3_2_0::CombineArgs']]], + ['mbits',['mBits',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a02e3e9b56bc571ec5dceaecbc9418997',1,'openvdb::v3_2_0::util::RootNodeMask']]], + ['mbitsize',['mBitSize',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a608023362640c73576339e9e3bb7afb4',1,'openvdb::v3_2_0::util::RootNodeMask::mBitSize()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#a608023362640c73576339e9e3bb7afb4',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::mBitSize()']]], + ['mblind',['mBlind',['../ParticlesToLevelSet_8h.html#aec9cfef65559465f147bfbb5474d64a4',1,'ParticlesToLevelSet.h']]], + ['mboutside',['mBOutside',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CsgVisitorBase.html#a90d42a2c43f9439e6706009e92b02926',1,'openvdb::v3_2_0::tools::CsgVisitorBase']]], + ['mbucketcounters',['mBucketCounters',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1ComputePointOrderOp.html#ab779e5caedc8e27b8e6c76a25d9a83eb',1,'openvdb::v3_2_0::tools::point_partitioner_internal::ComputePointOrderOp']]], + ['mbucketlog2dim',['mBucketLog2Dim',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#a136eab5a30bdea28bf96e6be5d5b39d8',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp']]], + ['mbucketoffsets',['mBucketOffsets',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1ComputePointOrderOp.html#a0f62e99677d7e63ef7473512f03cd48a',1,'openvdb::v3_2_0::tools::point_partitioner_internal::ComputePointOrderOp']]], + ['mbuffer',['mBuffer',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a5d0b20ac855d21274cac7f4e614d839d',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::mBuffer()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a5d0b20ac855d21274cac7f4e614d839d',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::mBuffer()']]], + ['mbvalptr',['mBValPtr',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a7dcde5b4a8694c24daf3098a22cee2eb',1,'openvdb::v3_2_0::CombineArgs']]], + ['mcache',['mCache',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a5f858d23895d634f4d57bfee7d2dbc1f',1,'openvdb::v3_2_0::math::BaseStencil']]], + ['mcenter',['mCenter',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a8e5a2cd3040e6b36ea7e4cf2fbb4ed6e',1,'openvdb::v3_2_0::math::BaseStencil']]], + ['mchain',['mChain',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#afac226eb43df0ebcd040f11d7cf7051d',1,'openvdb::v3_2_0::tree::NodeManager']]], + ['mchangednodemask',['mChangedNodeMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedFillExteriorSign.html#a42705528b2aaf4b824e966030d1ff99a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedFillExteriorSign::mChangedNodeMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SyncVoxelMask.html#acc273cc6932d511689f186b8a92dde3b',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SyncVoxelMask::mChangedNodeMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html#a42705528b2aaf4b824e966030d1ff99a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedPoints::mChangedNodeMask()']]], + ['mchangedvoxelmask',['mChangedVoxelMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SyncVoxelMask.html#aafee84b4d68b1453eb26f8e3482fe74e',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SyncVoxelMask::mChangedVoxelMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html#aafee84b4d68b1453eb26f8e3482fe74e',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedPoints::mChangedVoxelMask()']]], + ['mchildmask',['mChildMask',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a2d63b70c1831dd29d599480c447d8015',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['mconnectivity',['mConnectivity',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html#af65e6b27417b414b0ad8c2c986538be7',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedPoints']]], + ['mconstaccessorregistry',['mConstAccessorRegistry',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a134837ab866ef110faba3311e77acd2b',1,'openvdb::v3_2_0::tree::Tree']]], + ['mcoordinates',['mCoordinates',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1StashOriginAndStoreOffset.html#a39dcbc1325a02ce04c017cda1ca5087c',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::StashOriginAndStoreOffset::mCoordinates()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RestoreOrigin.html#a2f3bc50fa50bd33209a17de2bb5b8a91',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RestoreOrigin::mCoordinates()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1LeafNodeOriginOp.html#a39dcbc1325a02ce04c017cda1ca5087c',1,'openvdb::v3_2_0::tools::point_partitioner_internal::LeafNodeOriginOp::mCoordinates()']]], + ['mcountarray',['mCountArray',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ComputeActiveVoxelCount.html#a73e717e857d75a75233cfaf4d8687e83',1,'openvdb::v3_2_0::tools::level_set_util_internal::ComputeActiveVoxelCount::mCountArray()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GreaterCount.html#a2bd9d76ae84239b7df79f2f0efdcf78c',1,'openvdb::v3_2_0::tools::level_set_util_internal::GreaterCount::mCountArray()']]], + ['mdata',['mData',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#aff418187195521a0d255ee833666d892',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp::mData()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#a50ddca5b92e4d145f0bd6f1309c10142',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::mData()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html#a5272dee6af3c9c095cd1f12f7b151201',1,'openvdb::v3_2_0::util::PagedArray::Page::mData()']]], + ['mdisttree',['mDistTree',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RemoveSelfIntersectingSurface.html#a34ee2fa9f3c11287bd1b96c4d3177606',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RemoveSelfIntersectingSurface']]], + ['mean',['mean',['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#a9921c567694a5f661302230feffb76d1',1,'openvdb::v3_2_0::math::Stats::mean()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#ac50200883bf25c19d4e530b423006f1b',1,'openvdb::v3_2_0::math::BaseStencil::mean()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#aa42f3249123b1bc7edb87ffe9c90e7c0',1,'openvdb::v3_2_0::tools::Filter::mean()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a7a30610c3e575d02232c37a32b677e61',1,'openvdb::v3_2_0::tools::LevelSetFilter::mean()']]], + ['meancurvature',['MeanCurvature',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature.html',1,'openvdb::v3_2_0::tools']]], + ['meancurvature',['MeanCurvature',['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature.html',1,'openvdb::v3_2_0::math']]], + ['meancurvature',['MeanCurvature',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature.html#a69c0351b9ae07bf51343611bc94caa27',1,'openvdb::v3_2_0::tools::MeanCurvature::MeanCurvature(const GridT &grid, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature.html#a2721a20794bff9868b0e6d17109438c7',1,'openvdb::v3_2_0::tools::MeanCurvature::MeanCurvature(const GridT &grid, const MaskGridType &mask, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CurvatureStencil.html#afbe5b2520b2297d6a754cb12fb3d1706',1,'openvdb::v3_2_0::math::CurvatureStencil::meanCurvature()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a7a5893cebb58d7a4c9d3d7707f1b38f5',1,'openvdb::v3_2_0::tools::LevelSetFilter::meanCurvature()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a5ad8501c4e8a1e0f613d880f3431d6ca',1,'openvdb::v3_2_0::tools::meanCurvature(const GridType &grid, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a85e0a1a825212802a6a672420f1be648',1,'openvdb::v3_2_0::tools::meanCurvature(const GridType &grid, const MaskT &mask, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a1122c282c3171ab20dab422669efb9f2',1,'openvdb::v3_2_0::tools::meanCurvature(const GridType &grid, bool threaded=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a08f7d8f2c3776627dccc08503f200cfd',1,'openvdb::v3_2_0::tools::meanCurvature(const GridType &grid, const MaskT &mask, bool threaded=true)']]], + ['meancurvature_3c_20translationmap_2c_20diffscheme2_2c_20diffscheme1_20_3e',['MeanCurvature< TranslationMap, DiffScheme2, DiffScheme1 >',['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01TranslationMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html',1,'openvdb::v3_2_0::math']]], + ['meancurvature_3c_20uniformscalemap_2c_20diffscheme2_2c_20diffscheme1_20_3e',['MeanCurvature< UniformScaleMap, DiffScheme2, DiffScheme1 >',['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01UniformScaleMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html',1,'openvdb::v3_2_0::math']]], + ['meancurvature_3c_20uniformscaletranslatemap_2c_20diffscheme2_2c_20diffscheme1_20_3e',['MeanCurvature< UniformScaleTranslateMap, DiffScheme2, DiffScheme1 >',['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01UniformScaleTranslateMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html',1,'openvdb::v3_2_0::math']]], + ['meancurvaturenormgrad',['meanCurvatureNormGrad',['../classopenvdb_1_1v3__2__0_1_1math_1_1CurvatureStencil.html#ad3bd283e8cdfbd6463812edbb5d850f0',1,'openvdb::v3_2_0::math::CurvatureStencil']]], + ['measure',['measure',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#ad492a5607196f162a2502ab9b126cc95',1,'openvdb::v3_2_0::tools::LevelSetMeasure::measure(Real &area, Real &volume, bool useWorldUnits=true)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#aa223d5ee09ea00e2f17635e71222a4e3',1,'openvdb::v3_2_0::tools::LevelSetMeasure::measure(Real &area, Real &volume, Real &avgMeanCurvature, bool useWorldUnits=true)']]], + ['median',['median',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#ae7da36055083f73e0dadd21471ac0edf',1,'openvdb::v3_2_0::math::BaseStencil::median()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a289cdc97474dd92e10951f348787ee31',1,'openvdb::v3_2_0::tools::Filter::median()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a3142781f74b059b159f7bf9c9bdf4451',1,'openvdb::v3_2_0::tools::LevelSetFilter::median()']]], + ['memorylayout',['memoryLayout',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#ac563a9e8934d509ecb00d9455947b368',1,'openvdb::v3_2_0::tools::Dense::memoryLayout()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8206a04f26f57965d9cb369acafa33d7',1,'openvdb::v3_2_0::tools::MemoryLayout()']]], + ['mempty',['mEmpty',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TileSampler.html#a8b31290890664f24c4a438328f21b45f',1,'openvdb::v3_2_0::tools::internal::TileSampler']]], + ['memusage',['memUsage',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a841adaa0436a1b87710d384aa22d74b1',1,'openvdb::v3_2_0::GridBase::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#aae2d9daf6809e19c51946932dacc9f06',1,'openvdb::v3_2_0::Grid::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a8443805eb98462d37d9c3f7b549ede0f',1,'openvdb::v3_2_0::tools::Dense::memUsage()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a8443805eb98462d37d9c3f7b549ede0f',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a8443805eb98462d37d9c3f7b549ede0f',1,'openvdb::v3_2_0::tree::InternalNode::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#ad70aba631622897801f7c95dc36aa1c5',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a8443805eb98462d37d9c3f7b549ede0f',1,'openvdb::v3_2_0::tree::LeafNode::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#ad70aba631622897801f7c95dc36aa1c5',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8443805eb98462d37d9c3f7b549ede0f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#ad70aba631622897801f7c95dc36aa1c5',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8443805eb98462d37d9c3f7b549ede0f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a8443805eb98462d37d9c3f7b549ede0f',1,'openvdb::v3_2_0::tree::RootNode::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#aae2d9daf6809e19c51946932dacc9f06',1,'openvdb::v3_2_0::tree::TreeBase::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#aae2d9daf6809e19c51946932dacc9f06',1,'openvdb::v3_2_0::tree::Tree::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a9ebea8c8ab198dedc6b9dc270cd0011e',1,'openvdb::v3_2_0::util::NodeMask::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a9ebea8c8ab198dedc6b9dc270cd0011e',1,'openvdb::v3_2_0::util::NodeMask< 1 >::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a9ebea8c8ab198dedc6b9dc270cd0011e',1,'openvdb::v3_2_0::util::NodeMask< 2 >::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#ad7ce9e4ed283b5ada12c2fd72701c991',1,'openvdb::v3_2_0::util::RootNodeMask::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#af5aca2ade65de662ce2bef5b16bf0152',1,'openvdb::v3_2_0::util::PagedArray::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html#a44872b3c78bf4e21b2c0c5a3ab6c75cb',1,'openvdb::v3_2_0::util::PagedArray::Page::memUsage()']]], + ['merge',['merge',['../classopenvdb_1_1v3__2__0_1_1Grid.html#adf11d9e6e826c6ce03707c950c5c4930',1,'openvdb::v3_2_0::Grid::merge()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a23b8659f79e745e474113157d6813db9',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::merge(const PointIndexLeafNode &rhs)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a4119e466f0aaba9e53ef8b8d97af8a18',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::merge(const ValueType &tileValue, bool tileActive)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a13c35d9f38248d636ac40d9ac327192f',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::merge(const PointIndexLeafNode &other, const ValueType &, const ValueType &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a0678918b353a7fa416685a3a5ba6c3fb',1,'openvdb::v3_2_0::tree::InternalNode::merge(InternalNode &other, const ValueType &background, const ValueType &otherBackground)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a4119e466f0aaba9e53ef8b8d97af8a18',1,'openvdb::v3_2_0::tree::InternalNode::merge(const ValueType &tileValue, bool tileActive)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ad10d3b3839961c3f5e8138fef390dc62',1,'openvdb::v3_2_0::tree::LeafNode::merge(const LeafNode &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a4119e466f0aaba9e53ef8b8d97af8a18',1,'openvdb::v3_2_0::tree::LeafNode::merge(const ValueType &tileValue, bool tileActive)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a9c72e2c46ffacb220cb6c1f91b4955f4',1,'openvdb::v3_2_0::tree::LeafNode::merge(const LeafNode &other, const ValueType &, const ValueType &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#acacc2ed7ee525bdcb40d54592aa3cd2e',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::merge(const LeafNode &other, bool bg=false, bool otherBG=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ac297dac860f2a8354b94a9962598e79a',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::merge(bool tileValue, bool tileActive)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#acacc2ed7ee525bdcb40d54592aa3cd2e',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::merge(const LeafNode &other, bool bg=false, bool otherBG=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aebc46e0e9072bed1fd585288da1839e1',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::merge(bool tileValue, bool tileActive=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a52a7e4a512b1082887098547c2781ed0',1,'openvdb::v3_2_0::tree::RootNode::merge()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a2ba5f332b68e4a1ebba9dbf4b95ec807',1,'openvdb::v3_2_0::tree::Tree::merge()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#ac07534f9ba83f95d11ce49c4ef4d5ce4',1,'openvdb::v3_2_0::util::PagedArray::merge()']]], + ['merge_5factive_5fstates',['MERGE_ACTIVE_STATES',['../namespaceopenvdb_1_1v3__2__0.html#ade9c95ac55c647839e6f3e9b462c0575a89c44945b26534bc1d5ede51c342400e',1,'openvdb::v3_2_0']]], + ['merge_5factive_5fstates_5fand_5fnodes',['MERGE_ACTIVE_STATES_AND_NODES',['../namespaceopenvdb_1_1v3__2__0.html#ade9c95ac55c647839e6f3e9b462c0575acf1d5ce98de6a7d0d614438c13118193',1,'openvdb::v3_2_0']]], + ['merge_5fnodes',['MERGE_NODES',['../namespaceopenvdb_1_1v3__2__0.html#ade9c95ac55c647839e6f3e9b462c0575a92e4cb6fd9e78d9095b357d8a4b26ad0',1,'openvdb::v3_2_0']]], + ['mergebinsop',['MergeBinsOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MergeBinsOp.html#ad6173d68c1bf4107c1b320e379b07d16',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MergeBinsOp']]], + ['mergebinsop',['MergeBinsOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MergeBinsOp.html',1,'openvdb::v3_2_0::tools::point_partitioner_internal']]], + ['mergepolicy',['MergePolicy',['../namespaceopenvdb_1_1v3__2__0.html#ade9c95ac55c647839e6f3e9b462c0575',1,'openvdb::v3_2_0']]], + ['mergevoxelregions',['MergeVoxelRegions',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html',1,'openvdb::v3_2_0::tools::internal']]], + ['mergevoxelregions',['MergeVoxelRegions',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#a6e6bf5047a24b35e3bf24001a8567edf',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions']]], + ['mergevoxels',['mergeVoxels',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a354c08c0d29cb5ddfa3fa084c158989f',1,'openvdb::v3_2_0::tools::internal']]], + ['meshdataadapter',['MeshDataAdapter',['../interfaceMeshDataAdapter.html',1,'']]], + ['meshtolevelset',['meshToLevelSet',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a49d6517666da8e1ec1175651ebf12f32',1,'openvdb::v3_2_0::tools::meshToLevelSet(const openvdb::math::Transform &xform, const std::vector< Vec3s > &points, const std::vector< Vec3I > &triangles, float halfWidth=float(LEVEL_SET_HALF_WIDTH))'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#afb69abc32d73ce0e3cd67b569bed65b8',1,'openvdb::v3_2_0::tools::meshToLevelSet(const openvdb::math::Transform &xform, const std::vector< Vec3s > &points, const std::vector< Vec4I > &quads, float halfWidth=float(LEVEL_SET_HALF_WIDTH))'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a88550f83eda208f6a4efd332735bb215',1,'openvdb::v3_2_0::tools::meshToLevelSet(const openvdb::math::Transform &xform, const std::vector< Vec3s > &points, const std::vector< Vec3I > &triangles, const std::vector< Vec4I > &quads, float halfWidth=float(LEVEL_SET_HALF_WIDTH))']]], + ['meshtosigneddistancefield',['meshToSignedDistanceField',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ab994dead75e3d110e11eb64dce6ca65a',1,'openvdb::v3_2_0::tools']]], + ['meshtounsigneddistancefield',['meshToUnsignedDistanceField',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a7a77a75ddf87809699a67916ea172add',1,'openvdb::v3_2_0::tools']]], + ['meshtovolume',['meshToVolume',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a92209132a587125e118307aea798ce30',1,'openvdb::v3_2_0::tools::meshToVolume(const MeshDataAdapter &mesh, const math::Transform &transform, float exteriorBandWidth=3.0f, float interiorBandWidth=3.0f, int flags=0, typename GridType::template ValueConverter< Int32 >::Type *polygonIndexGrid=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a991dc1c88fb30ef128bdd5e40c702d75',1,'openvdb::v3_2_0::tools::meshToVolume(Interrupter &interrupter, const MeshDataAdapter &mesh, const math::Transform &transform, float exteriorBandWidth=3.0f, float interiorBandWidth=3.0f, int flags=0, typename GridType::template ValueConverter< Int32 >::Type *polygonIndexGrid=NULL)']]], + ['meshtovolume_2eh',['MeshToVolume.h',['../MeshToVolume_8h.html',1,'']]], + ['meshtovolumeflags',['MeshToVolumeFlags',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a2623bf4797b966b29fbe45c87e60481c',1,'openvdb::v3_2_0::tools']]], + ['meshtovoxeledgedata',['MeshToVoxelEdgeData',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData.html#ad206018355b0b6e4f1200146955a44b3',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData']]], + ['meshtovoxeledgedata',['MeshToVoxelEdgeData',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData.html',1,'openvdb::v3_2_0::tools']]], + ['meta',['meta',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1FileInfo.html#a05da3de2d0117d8c6c94bead008b1d01',1,'openvdb::v3_2_0::tree::LeafNode::FileInfo']]], + ['meta_5ffile_5fbbox_5fmax',['META_FILE_BBOX_MAX',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a19d9339054141127b21cad1c44d09b6b',1,'openvdb::v3_2_0::GridBase']]], + ['meta_5ffile_5fbbox_5fmin',['META_FILE_BBOX_MIN',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a81c0cda67c9a3b01d566622a09544b13',1,'openvdb::v3_2_0::GridBase']]], + ['meta_5ffile_5fcompression',['META_FILE_COMPRESSION',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a75e2a4a681d51f1d0cf36a0d6ef0930d',1,'openvdb::v3_2_0::GridBase']]], + ['meta_5ffile_5fmem_5fbytes',['META_FILE_MEM_BYTES',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a0fa5dd3a2ffb3bc2dbec0c4da205b216',1,'openvdb::v3_2_0::GridBase']]], + ['meta_5ffile_5fvoxel_5fcount',['META_FILE_VOXEL_COUNT',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ae2ad899b69d395c9a0a09b160b76d0e0',1,'openvdb::v3_2_0::GridBase']]], + ['meta_5fgrid_5fclass',['META_GRID_CLASS',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#aa72485314e3ad339aec794e9009868c1',1,'openvdb::v3_2_0::GridBase']]], + ['meta_5fgrid_5fcreator',['META_GRID_CREATOR',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#aa4042cca7c41c31dbdc379ad47f1247c',1,'openvdb::v3_2_0::GridBase']]], + ['meta_5fgrid_5fname',['META_GRID_NAME',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#aa591a941dff12acf9898cf88a536129f',1,'openvdb::v3_2_0::GridBase']]], + ['meta_5fis_5flocal_5fspace',['META_IS_LOCAL_SPACE',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a4a6d8398d66bdd1c5819d55a5cccc8ad',1,'openvdb::v3_2_0::GridBase']]], + ['meta_5fsave_5fhalf_5ffloat',['META_SAVE_HALF_FLOAT',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a59d70f66efb23c69c0320d5f377f581f',1,'openvdb::v3_2_0::GridBase']]], + ['meta_5fvector_5ftype',['META_VECTOR_TYPE',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ab7e662b78a3459c4e7df594b02dc528a',1,'openvdb::v3_2_0::GridBase']]], + ['metacount',['metaCount',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a35dade13004130e3a51fd165597d6f24',1,'openvdb::v3_2_0::MetaMap']]], + ['metadata',['Metadata',['../classopenvdb_1_1v3__2__0_1_1Metadata.html',1,'openvdb::v3_2_0']]], + ['metadata',['Metadata',['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a20ed44ba04640e7899bc99dc9e06846d',1,'openvdb::v3_2_0::Metadata']]], + ['metadata_2eh',['Metadata.h',['../metadata_2Metadata_8h.html',1,'']]], + ['metadata_2eh',['Metadata.h',['../Metadata_8h.html',1,'']]], + ['metadatamap',['MetadataMap',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#ab78f30d303230ef5c7bc7dad620790b5',1,'openvdb::v3_2_0::MetaMap']]], + ['metaiterator',['MetaIterator',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a1591b2f992798e6203a78ae2de3d09dd',1,'openvdb::v3_2_0::MetaMap']]], + ['metamap',['MetaMap',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html',1,'openvdb::v3_2_0']]], + ['metamap',['MetaMap',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#af932a63d2fb9981c86b4f87c060b0d6e',1,'openvdb::v3_2_0::MetaMap::MetaMap()'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#aa472342c2ce685400f7710e6c1a771ca',1,'openvdb::v3_2_0::MetaMap::MetaMap(const MetaMap &other)']]], + ['metamap_2eh',['MetaMap.h',['../MetaMap_8h.html',1,'']]], + ['metavalue',['metaValue',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a82ecd84c09b4debc8275c79f8dca1c74',1,'openvdb::v3_2_0::MetaMap::metaValue(const Name &)'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a1a0ea028e2b978328279923a3026cfc0',1,'openvdb::v3_2_0::MetaMap::metaValue(const Name &) const ']]], + ['mfileinfo',['mFileInfo',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#a531f384cef38aded004297387fe001b7',1,'openvdb::v3_2_0::tree::LeafNode::Buffer']]], + ['mfilm',['mFilm',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#aeb3367355fd28ac35095df29c4478968',1,'openvdb::v3_2_0::tools::BaseCamera']]], + ['mgrid',['mGrid',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a8f6ccd0c84475e8606642f6fe038394a',1,'openvdb::v3_2_0::math::BaseStencil::mGrid()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid_1_1ReducePool.html#a8511f863d65db0d366a00ebc7bbee88b',1,'openvdb::v3_2_0::tools::PointMaskGrid::ReducePool::mGrid()']]], + ['mid',['mid',['../structopenvdb_1_1v3__2__0_1_1math_1_1Ray_1_1TimeSpan.html#a324d34e094a86c230f819866cbb54909',1,'openvdb::v3_2_0::math::Ray::TimeSpan::mid()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#ad8dcaae14409f024c3381e36d5dea9b7',1,'openvdb::v3_2_0::math::Ray::mid()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1Scheme.html#a4010e0b09fbf6a975c479833d3001f42a3bc56824c91d97fcda36dc99687bb236',1,'openvdb::v3_2_0::tools::Scheme::MID()']]], + ['min',['min',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a70d4d4921617e45221bcecf01c340db1',1,'openvdb::v3_2_0::math::BBox::min() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#abe5f9c24f1823e29efde292b59f5802d',1,'openvdb::v3_2_0::math::BBox::min()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#abcfa3833e73de42b7dcc1dfb82e73647',1,'openvdb::v3_2_0::math::Coord::min()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a0fa0c965de8fe40cc4a9e7383bed5b64',1,'openvdb::v3_2_0::math::CoordBBox::min() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#aff1af0cee55a5f14797072a1281e4f15',1,'openvdb::v3_2_0::math::CoordBBox::min()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MinMax.html#a8fdccc46bacba4559a2d4fcf487ab43d',1,'openvdb::v3_2_0::math::MinMax::min()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#a2316dcf397d4aaefbe79179748f2a007',1,'openvdb::v3_2_0::math::Extrema::min()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html#a2316dcf397d4aaefbe79179748f2a007',1,'openvdb::v3_2_0::math::Histogram::min() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html#ac72df3f4e8b9c9db9982bbeabe0c8d51',1,'openvdb::v3_2_0::math::Histogram::min(int n) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#ad87eba235dd24cd0850163842a5ccce4',1,'openvdb::v3_2_0::math::BaseStencil::min()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html#aa53e6939a0dded43d1a9d0a4fcb33072',1,'openvdb::v3_2_0::tools::composite::min(const T &a, const T &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html#a9c4493a29dfeca8c15da54f21ecfb52f',1,'openvdb::v3_2_0::tools::composite::min(const T &a, const T &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ac00b4e9cae5d3e5a9d17ebe95bb24337',1,'openvdb::v3_2_0::math::Min(const Type &a, const Type &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a332d119e5abfe729c72366f7888cf364',1,'openvdb::v3_2_0::math::Min(const Type &a, const Type &b, const Type &c)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab8b90e133a9d6384396083b7d0b125d1',1,'openvdb::v3_2_0::math::Min(const Type &a, const Type &b, const Type &c, const Type &d)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a3eb5788fad7f40622a74284c1f37cdc2',1,'openvdb::v3_2_0::math::Min(const Type &a, const Type &b, const Type &c, const Type &d, const Type &e)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aaba37a38f11758ca8e1829ff8a60a820',1,'openvdb::v3_2_0::math::Min(const Type &a, const Type &b, const Type &c, const Type &d, const Type &e, const Type &f)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7d68f7b0d4318dfc4587cc97853bd728',1,'openvdb::v3_2_0::math::Min(const Type &a, const Type &b, const Type &c, const Type &d, const Type &e, const Type &f, const Type &g)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aeca3ce7f6f2a73cdfe8f43b7faa5de91',1,'openvdb::v3_2_0::math::Min(const Type &a, const Type &b, const Type &c, const Type &d, const Type &e, const Type &f, const Type &g, const Type &h)']]], + ['mincombine',['MinCombine',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1MinCombine.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['mincombine',['MinCombine',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1MinCombine.html#aa38bdcaac539bad06f4602a828d6408a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::MinCombine']]], + ['mincomponent',['minComponent',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a46fce96f01a8c6fad36ee9993a21365f',1,'openvdb::v3_2_0::math::Coord::minComponent(const Coord &other)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#af084f1a31e41546a361b63485fe31844',1,'openvdb::v3_2_0::math::Coord::minComponent(const Coord &lhs, const Coord &rhs)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9769c576117b5b196ed12938c6190cb7',1,'openvdb::v3_2_0::math::minComponent(const Vec2< T > &v1, const Vec2< T > &v2)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab919184ca9cd1285c9674bab74ad9ae6',1,'openvdb::v3_2_0::math::minComponent(const Vec3< T > &v1, const Vec3< T > &v2)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#adedf4ff2433945aa84e4f237ae50c532',1,'openvdb::v3_2_0::math::minComponent(const Vec4< T > &v1, const Vec4< T > &v2)']]], + ['mindexsegments',['mIndexSegments',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1OrderSegmentsOp.html#aed5225cd8eac8d7bfa794f1ae2d46661',1,'openvdb::v3_2_0::tools::point_partitioner_internal::OrderSegmentsOp']]], + ['mindextree',['mIndexTree',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RemoveSelfIntersectingSurface.html#a2f68dbb1f89fdef0ecf47a4c37aacfec',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RemoveSelfIntersectingSurface']]], + ['mindices',['mIndices',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1CreateOrderedPointIndexArrayOp.html#a5add0cec990f91028a678d1362bf8176',1,'openvdb::v3_2_0::tools::point_partitioner_internal::CreateOrderedPointIndexArrayOp::mIndices()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1VoxelOrderOp.html#a6db45cfb5535094deab98b8b909cd61a',1,'openvdb::v3_2_0::tools::point_partitioner_internal::VoxelOrderOp::mIndices()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1LeafNodeOriginOp.html#a5add0cec990f91028a678d1362bf8176',1,'openvdb::v3_2_0::tools::point_partitioner_internal::LeafNodeOriginOp::mIndices()']]], + ['minextent',['minExtent',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#af0a30e92d1d69b59583830eb3c5173cc',1,'openvdb::v3_2_0::math::BBox::minExtent()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#af0a30e92d1d69b59583830eb3c5173cc',1,'openvdb::v3_2_0::math::CoordBBox::minExtent()']]], + ['minindex',['minIndex',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a2c97e9c1fdaf2e2d4aff72890f5a9dbd',1,'openvdb::v3_2_0::math::Coord::minIndex()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ac5d0da2d1895b43fe37005fc3b520a64',1,'openvdb::v3_2_0::math::MinIndex()']]], + ['minmask',['minMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a6c99015227b7be710f9fb0fa5fab6fa7',1,'openvdb::v3_2_0::tools::Filter::minMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a6c99015227b7be710f9fb0fa5fab6fa7',1,'openvdb::v3_2_0::tools::LevelSetFilter::minMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#abf3f69e652c633242860dc72e28cc0fb',1,'openvdb::v3_2_0::tools::LevelSetMorphing::minMask()']]], + ['minmax',['MinMax',['../classopenvdb_1_1v3__2__0_1_1math_1_1MinMax.html',1,'openvdb::v3_2_0::math']]], + ['minmax',['MinMax',['../classopenvdb_1_1v3__2__0_1_1math_1_1MinMax.html#ae06942b363abbd3216ff9b3b4a35ea7e',1,'openvdb::v3_2_0::math::MinMax']]], + ['minnarrowbandwidth',['minNarrowBandWidth',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1Tolerance.html#a5321371ab1e9bdaa628464dd6954d3ba',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::Tolerance']]], + ['minop',['MinOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1MinOp.html#a1729eed65ecabfa5feb1a07b0b53a1a1',1,'openvdb::v3_2_0::tools::valxform::MinOp']]], + ['minop',['MinOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1MinOp.html',1,'openvdb::v3_2_0::tools::valxform']]], + ['minputgrid',['mInputGrid',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Divergence_1_1Functor.html#aff33c33f42c75ae56d63a5742348a509',1,'openvdb::v3_2_0::tools::Divergence::Functor::mInputGrid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Divergence.html#aff33c33f42c75ae56d63a5742348a509',1,'openvdb::v3_2_0::tools::Divergence::mInputGrid()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Gradient_1_1Functor.html#a38e618a4d5a21b6d2fc021095ba1698f',1,'openvdb::v3_2_0::tools::Gradient::Functor::mInputGrid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Gradient.html#a38e618a4d5a21b6d2fc021095ba1698f',1,'openvdb::v3_2_0::tools::Gradient::mInputGrid()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian_1_1Functor.html#a17a99bfd693bfd71b6a8e334132f7439',1,'openvdb::v3_2_0::tools::Laplacian::Functor::mInputGrid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian.html#a17a99bfd693bfd71b6a8e334132f7439',1,'openvdb::v3_2_0::tools::Laplacian::mInputGrid()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature_1_1Functor.html#a17a99bfd693bfd71b6a8e334132f7439',1,'openvdb::v3_2_0::tools::MeanCurvature::Functor::mInputGrid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature.html#a17a99bfd693bfd71b6a8e334132f7439',1,'openvdb::v3_2_0::tools::MeanCurvature::mInputGrid()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude_1_1Functor.html#aff33c33f42c75ae56d63a5742348a509',1,'openvdb::v3_2_0::tools::Magnitude::Functor::mInputGrid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude.html#aff33c33f42c75ae56d63a5742348a509',1,'openvdb::v3_2_0::tools::Magnitude::mInputGrid()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Normalize_1_1Functor.html#a17a99bfd693bfd71b6a8e334132f7439',1,'openvdb::v3_2_0::tools::Normalize::Functor::mInputGrid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Normalize.html#a17a99bfd693bfd71b6a8e334132f7439',1,'openvdb::v3_2_0::tools::Normalize::mInputGrid()']]], + ['minradius',['minRadius',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1ComputeExtremas.html#ae1d9e37b8ab08b6569f27b1bd4ea1f1a',1,'openvdb::v3_2_0::tools::particle_atlas_internal::ComputeExtremas::minRadius()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#a4e7bc02ba47bfb57b69c92ba27aed585',1,'openvdb::v3_2_0::tools::ParticleAtlas::minRadius()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#a05794307218d50f5671e7269ac367d86',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray::minRadius()']]], + ['minterrupt',['mInterrupt',['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::gridop::GridOperator::mInterrupt()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Divergence_1_1Functor.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::Divergence::Functor::mInterrupt()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Divergence.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::Divergence::mInterrupt()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Gradient_1_1Functor.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::Gradient::Functor::mInterrupt()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Gradient.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::Gradient::mInterrupt()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian_1_1Functor.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::Laplacian::Functor::mInterrupt()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::Laplacian::mInterrupt()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature_1_1Functor.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::MeanCurvature::Functor::mInterrupt()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::MeanCurvature::mInterrupt()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude_1_1Functor.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::Magnitude::Functor::mInterrupt()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::Magnitude::mInterrupt()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Normalize_1_1Functor.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::Normalize::Functor::mInterrupt()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Normalize.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::Normalize::mInterrupt()']]], + ['minterruptcount',['mInterruptCount',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#a2a178c30fee2cd20bbe9e61d63a4e511',1,'openvdb::v3_2_0::tools::BasePointScatter']]], + ['minterrupter',['mInterrupter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#a1713d55a5b062d81cd12bbbfb78e9141',1,'openvdb::v3_2_0::tools::BasePointScatter']]], + ['mintsize',['mIntSize',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a6f9e8803d8231d5724bcee833f10f652',1,'openvdb::v3_2_0::util::RootNodeMask']]], + ['minval',['minVal',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckRange.html#a0cfb2e3aae2525b8abfd45e71318d08b',1,'openvdb::v3_2_0::tools::CheckRange::minVal()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMin.html#a0cfb2e3aae2525b8abfd45e71318d08b',1,'openvdb::v3_2_0::tools::CheckMin::minVal()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#a0a0740cf108b7fda92940f828bacfa90',1,'openvdb::v3_2_0::tools::CheckEikonal::minVal()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#a0a0740cf108b7fda92940f828bacfa90',1,'openvdb::v3_2_0::tools::CheckDivergence::minVal()']]], + ['minval2',['minVal2',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#abdb857cb336ef70112f63d4e71a9aa79',1,'openvdb::v3_2_0::tools::CheckNormGrad']]], + ['minvalue',['minValue',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__fracture__internal_1_1FindMinMaxVoxelValue.html#aab2e35030e8739187326ad38338023f1',1,'openvdb::v3_2_0::tools::level_set_fracture_internal::FindMinMaxVoxelValue::minValue()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinVoxelValue.html#aab2e35030e8739187326ad38338023f1',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinVoxelValue::minValue()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinTileValue.html#aab2e35030e8739187326ad38338023f1',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinTileValue::minValue()']]], + ['minvert',['mInvert',['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#a9eea8ea3eb0e6440afa992a3f093bb7d',1,'openvdb::v3_2_0::tools::AlphaMask']]], + ['minvnorm',['mInvNorm',['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#a922dd4f655710488fb16728c8081cfdc',1,'openvdb::v3_2_0::tools::AlphaMask']]], + ['mipmap',['mipmap',['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1BoolSampler.html#a6c9ddbbbd600c052cade13207665aa39',1,'openvdb::v3_2_0::tools::clip_internal::BoolSampler::mipmap()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler.html#a6c9ddbbbd600c052cade13207665aa39',1,'openvdb::v3_2_0::tools::Sampler::mipmap()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointSampler.html#a6c9ddbbbd600c052cade13207665aa39',1,'openvdb::v3_2_0::tools::PointSampler::mipmap()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html#a6c9ddbbbd600c052cade13207665aa39',1,'openvdb::v3_2_0::tools::BoxSampler::mipmap()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadraticSampler.html#a6c9ddbbbd600c052cade13207665aa39',1,'openvdb::v3_2_0::tools::QuadraticSampler::mipmap()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredPointSampler.html#a6c9ddbbbd600c052cade13207665aa39',1,'openvdb::v3_2_0::tools::StaggeredPointSampler::mipmap()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredBoxSampler.html#a6c9ddbbbd600c052cade13207665aa39',1,'openvdb::v3_2_0::tools::StaggeredBoxSampler::mipmap()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredQuadraticSampler.html#a6c9ddbbbd600c052cade13207665aa39',1,'openvdb::v3_2_0::tools::StaggeredQuadraticSampler::mipmap()']]], + ['misovalue',['mIsovalue',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorVoxels.html#afee4db1e4b4fc71be6874859bc591e00',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorVoxels::mIsovalue()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorTiles.html#afee4db1e4b4fc71be6874859bc591e00',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorTiles::mIsovalue()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1LabelBoundaryVoxels.html#afee4db1e4b4fc71be6874859bc591e00',1,'openvdb::v3_2_0::tools::level_set_util_internal::LabelBoundaryVoxels::mIsovalue()']]], + ['mleafnodes',['mLeafNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1PopulateLeafNodesOp.html#ab7a8071b9e54e1858d5ced24832daefb',1,'openvdb::v3_2_0::tools::point_index_grid_internal::PopulateLeafNodesOp']]], + ['mlist',['mList',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#a02ecdbe47fc81e7dfb394b68137259eb',1,'openvdb::v3_2_0::tree::NodeList::mList()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#af5bfa936fcffa3ab2045079cc4f92c1b',1,'openvdb::v3_2_0::tree::NodeManagerLink::mList()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#af5bfa936fcffa3ab2045079cc4f92c1b',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::mList()']]], + ['mlist0',['mList0',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a1adb2527f9db74658c7f2870d9c6e97f',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::mList0()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a1adb2527f9db74658c7f2870d9c6e97f',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::mList0()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a1adb2527f9db74658c7f2870d9c6e97f',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::mList0()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a1adb2527f9db74658c7f2870d9c6e97f',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::mList0()']]], + ['mlist1',['mList1',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a8a0021a530b432988f34c293497bd4c0',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::mList1()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a8a0021a530b432988f34c293497bd4c0',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::mList1()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a8a0021a530b432988f34c293497bd4c0',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::mList1()']]], + ['mlist2',['mList2',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#aeff57894453809f1b724386a78dbd1da',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::mList2()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#aeff57894453809f1b724386a78dbd1da',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::mList2()']]], + ['mlist3',['mList3',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a644f552973f508394d6edbcbd3c590b7',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >']]], + ['mlog2dim',['mLog2Dim',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1LeafNodeOriginOp.html#a036d560a6b28ba05cf2214f72fe8b659',1,'openvdb::v3_2_0::tools::point_partitioner_internal::LeafNodeOriginOp']]], + ['mm',['mm',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#a01a2f9d41532824bed65b16ace0f6c44',1,'openvdb::v3_2_0::math::Mat::mm()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ae88aad6ab980ed9ef001bbab4c1cbfbd',1,'openvdb::v3_2_0::math::Quat::mm()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#aaade5d886d4f0e0f8fcf641294df5783',1,'openvdb::v3_2_0::math::Tuple::mm()']]], + ['mmanager',['mManager',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a306b6e6840b7f3b37bc3d4057005c004',1,'openvdb::v3_2_0::tools::Morphology::mManager()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1UpdateMasks.html#a37528306f13626b70231d7230671d05f',1,'openvdb::v3_2_0::tools::Morphology::UpdateMasks::mManager()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1CopyMasks.html#aa19391ab9ce14cb9dca6e926d54b54fe',1,'openvdb::v3_2_0::tools::Morphology::CopyMasks::mManager()']]], + ['mmap',['mMap',['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html#a33be238ad5add05746396057bda24a91',1,'openvdb::v3_2_0::tools::gridop::GridOperator']]], + ['mmask',['mMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::gridop::GridOperator::mMask()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Divergence_1_1Functor.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::Divergence::Functor::mMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Divergence.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::Divergence::mMask()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Gradient_1_1Functor.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::Gradient::Functor::mMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Gradient.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::Gradient::mMask()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian_1_1Functor.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::Laplacian::Functor::mMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::Laplacian::mMask()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature_1_1Functor.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::MeanCurvature::Functor::mMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::MeanCurvature::mMask()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude_1_1Functor.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::Magnitude::Functor::mMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::Magnitude::mMask()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Normalize_1_1Functor.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::Normalize::Functor::mMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Normalize.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::Normalize::mMask()']]], + ['mmasknodes',['mMaskNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorVoxels.html#a7145ad5ed33f4a096c0fdc9696a74ed8',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorVoxels::mMaskNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorTiles.html#a57f8d145c6385353c5ab73e6cb818551',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorTiles::mMaskNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1LabelBoundaryVoxels.html#a4ccde3575ee79d22c48784ee9db7c426',1,'openvdb::v3_2_0::tools::level_set_util_internal::LabelBoundaryVoxels::mMaskNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillLeafNodeVoxels.html#a7145ad5ed33f4a096c0fdc9696a74ed8',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillLeafNodeVoxels::mMaskNodes()']]], + ['mmasks',['mMasks',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1UpdateMasks.html#aa315d291b5951d232f5b67763e5ceee8',1,'openvdb::v3_2_0::tools::Morphology::UpdateMasks::mMasks()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1CopyMasks.html#a0c939aee9376503e3d4dfecb7f423d1e',1,'openvdb::v3_2_0::tools::Morphology::CopyMasks::mMasks()']]], + ['mmax',['mMax',['../classopenvdb_1_1v3__2__0_1_1math_1_1MinMax.html#a8d3e5077335f198db2672965af156a9f',1,'openvdb::v3_2_0::math::MinMax::mMax()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#a30d9751c240144067f2c48e439f6992f',1,'openvdb::v3_2_0::math::Extrema::mMax()']]], + ['mmin',['mMin',['../classopenvdb_1_1v3__2__0_1_1math_1_1MinMax.html#a541bc5059e3b7d3608e898af0bb7d9ef',1,'openvdb::v3_2_0::math::MinMax::mMin()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#ad70ad4e69d479e6214e8807cb757360a',1,'openvdb::v3_2_0::math::Extrema::mMin()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#a0a96358fce656fc89b040775217b5ce1',1,'openvdb::v3_2_0::tools::AlphaMask::mMin()']]], + ['mnext',['mNext',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#a5040ca75b6f74480d11ec152f84b599a',1,'openvdb::v3_2_0::tree::NodeManagerLink']]], + ['mnode',['mNode',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1VoxelizeActiveTiles.html#aaee1a54f8a17c08f33e4d159f1ed0c25',1,'openvdb::v3_2_0::tree::InternalNode::VoxelizeActiveTiles']]], + ['mnodemask',['mNodeMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html#a61f94980d1d4ecd087f631e597779a1c',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedPoints']]], + ['mnodemaskarray',['mNodeMaskArray',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SegmentNodeMask.html#a12f04f5952a8c089fb911064ce12c46b',1,'openvdb::v3_2_0::tools::level_set_util_internal::SegmentNodeMask']]], + ['mnodes',['mNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__fracture__internal_1_1FindMinMaxVoxelValue.html#a7fb2792893907a51543b4bcf4fea3368',1,'openvdb::v3_2_0::tools::level_set_fracture_internal::FindMinMaxVoxelValue::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorVoxels.html#a7fb2792893907a51543b4bcf4fea3368',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorVoxels::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1LabelBoundaryVoxels.html#a7fb2792893907a51543b4bcf4fea3368',1,'openvdb::v3_2_0::tools::level_set_util_internal::LabelBoundaryVoxels::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FlipRegionSign.html#ad99aadd91c18b3ba737839c21c30fb79',1,'openvdb::v3_2_0::tools::level_set_util_internal::FlipRegionSign::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinVoxelValue.html#a7fb2792893907a51543b4bcf4fea3368',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinVoxelValue::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinTileValue.html#a18a64eae0438740ab5cc863987b6fb8a',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinTileValue::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SDFVoxelsToFogVolume.html#ad99aadd91c18b3ba737839c21c30fb79',1,'openvdb::v3_2_0::tools::level_set_util_internal::SDFVoxelsToFogVolume::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SDFTilesToFogVolume.html#a49a7a46bf3e961977d75d82d45a732ae',1,'openvdb::v3_2_0::tools::level_set_util_internal::SDFTilesToFogVolume::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SegmentNodeMask.html#a8d9bf2c672ba85b1986129e7d8936061',1,'openvdb::v3_2_0::tools::level_set_util_internal::SegmentNodeMask::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1StashOriginAndStoreOffset.html#ad99aadd91c18b3ba737839c21c30fb79',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::StashOriginAndStoreOffset::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RestoreOrigin.html#ad99aadd91c18b3ba737839c21c30fb79',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RestoreOrigin::mNodes()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedFillExteriorSign.html#ad99aadd91c18b3ba737839c21c30fb79',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedFillExteriorSign::mNodes()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SyncVoxelMask.html#ad99aadd91c18b3ba737839c21c30fb79',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SyncVoxelMask::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ValidateIntersectingVoxels.html#ad99aadd91c18b3ba737839c21c30fb79',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ValidateIntersectingVoxels::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RemoveSelfIntersectingSurface.html#ae2eaa0e3e3f0599eecceac785737d8af',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RemoveSelfIntersectingSurface::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ReleaseChildNodes.html#a41ea969c745cedc750285ecfb44274c3',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ReleaseChildNodes::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1AddNodes.html#aaea3b72e9af17b69e78f0be3a53d6e5a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::AddNodes::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RemapIndices.html#a1da09b0471a70e360d952d3fc0ab1479',1,'openvdb::v3_2_0::tools::particle_atlas_internal::RemapIndices::mNodes()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#abc5bd21eaa8b0c9fefa604d87a2487ee',1,'openvdb::v3_2_0::tree::InternalNode::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree_1_1DeallocateLeafNodes.html#ad99aadd91c18b3ba737839c21c30fb79',1,'openvdb::v3_2_0::tree::Tree::DeallocateLeafNodes::mNodes()']]], + ['mnumsegments',['mNumSegments',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#a0968239e7029f02ab4579ce922fc058f',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp']]], + ['mod',['Mod',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae6ec9dc2329f78606c19ee66cb44947a',1,'openvdb::v3_2_0::math::Mod(int x, int y)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a27d99fa25b7fdddc3c81f9cc41ba59a0',1,'openvdb::v3_2_0::math::Mod(float x, float y)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a0ff3eeea1b688e287c26934c6cb1b48a',1,'openvdb::v3_2_0::math::Mod(double x, double y)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a41dde38e08a635a024944417baee15a2',1,'openvdb::v3_2_0::math::Mod(long double x, long double y)']]], + ['modifyitem',['modifyItem',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ValueIter.html#a41e63c9557ee60d364243b8056709225',1,'openvdb::v3_2_0::tree::InternalNode::ValueIter::modifyItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueIter.html#ade5db9021ff78f2202190ffce2ea963f',1,'openvdb::v3_2_0::tree::LeafNode::ValueIter::modifyItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ValueIter.html#ade5db9021ff78f2202190ffce2ea963f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter::modifyItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ValueIter.html#ade5db9021ff78f2202190ffce2ea963f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter::modifyItem()']]], + ['modifyvalue',['modifyValue',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a3380f7ca101cd90c6b77073edecb181c',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::modifyValue(Index, const ModifyOp &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ae1d1b15ee3ea5f2e9431e84138a9a02b',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::modifyValue(const Coord &, const ModifyOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::InternalNode::modifyValue()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#a3cc3619337daed341d5243d870987bad',1,'openvdb::v3_2_0::tree::SparseIteratorBase::modifyValue()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueIter.html#a3cc3619337daed341d5243d870987bad',1,'openvdb::v3_2_0::tree::LeafNode::ValueIter::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ae2369c9fcb45b30e0494c994b0bd80fc',1,'openvdb::v3_2_0::tree::LeafNode::modifyValue(Index offset, const ModifyOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::LeafNode::modifyValue(const Coord &xyz, const ModifyOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ae2369c9fcb45b30e0494c994b0bd80fc',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::modifyValue(Index offset, const ModifyOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::modifyValue(const Coord &xyz, const ModifyOp &op)'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ValueIter.html#a3cc3619337daed341d5243d870987bad',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ae2369c9fcb45b30e0494c994b0bd80fc',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::modifyValue(Index offset, const ModifyOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::modifyValue(const Coord &xyz, const ModifyOp &op)'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ValueIter.html#a3cc3619337daed341d5243d870987bad',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::RootNode::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::Tree::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a1685a02e9a6a4f3c11b7c6b9889d0072',1,'openvdb::v3_2_0::tree::IterListItem::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a1685a02e9a6a4f3c11b7c6b9889d0072',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a1685a02e9a6a4f3c11b7c6b9889d0072',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a3cc3619337daed341d5243d870987bad',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::ValueAccessor::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::CacheItem::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::ValueAccessor0::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::ValueAccessor1::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::ValueAccessor2::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::ValueAccessor3::modifyValue()']]], + ['modifyvalueandactivestate',['modifyValueAndActiveState',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a5c8f5a38edbc0381957806c5a3977818',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::InternalNode::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::LeafNode::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::RootNode::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::Tree::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::ValueAccessor::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::CacheItem::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::ValueAccessor0::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::ValueAccessor1::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::ValueAccessor2::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::ValueAccessor3::modifyValueAndActiveState()']]], + ['modifyvalueandactivestateandcache',['modifyValueAndActiveStateAndCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a6f1495dab035bd189f9e1bfd9b6a4862',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::modifyValueAndActiveStateAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#af057648803b9073ce1703dbf061e0d1f',1,'openvdb::v3_2_0::tree::InternalNode::modifyValueAndActiveStateAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#af057648803b9073ce1703dbf061e0d1f',1,'openvdb::v3_2_0::tree::LeafNode::modifyValueAndActiveStateAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#af057648803b9073ce1703dbf061e0d1f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::modifyValueAndActiveStateAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#af057648803b9073ce1703dbf061e0d1f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::modifyValueAndActiveStateAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#af057648803b9073ce1703dbf061e0d1f',1,'openvdb::v3_2_0::tree::RootNode::modifyValueAndActiveStateAndCache()']]], + ['modifyvalueandcache',['modifyValueAndCache',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a7bed5c7c0d76cacfb514d9744f754402',1,'openvdb::v3_2_0::tree::InternalNode::modifyValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a7bed5c7c0d76cacfb514d9744f754402',1,'openvdb::v3_2_0::tree::LeafNode::modifyValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a7bed5c7c0d76cacfb514d9744f754402',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::modifyValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a7bed5c7c0d76cacfb514d9744f754402',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::modifyValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a7bed5c7c0d76cacfb514d9744f754402',1,'openvdb::v3_2_0::tree::RootNode::modifyValueAndCache()']]], + ['moffsetsegments',['mOffsetSegments',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1OrderSegmentsOp.html#af8519042dcd6869bb1524c85dda9f983',1,'openvdb::v3_2_0::tools::point_partitioner_internal::OrderSegmentsOp']]], + ['mop',['mOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ContiguousOp.html#a578862660695781eb3ee9d922714ee22',1,'openvdb::v3_2_0::tools::ContiguousOp::mOp()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1MathOp.html#a99562e6c82bf54327177afe6f5149056',1,'openvdb::v3_2_0::tools::stats_internal::MathOp::mOp()']]], + ['morderedindexarray',['mOrderedIndexArray',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1CreateOrderedPointIndexArrayOp.html#af493fb43a642f977308766ac67e53e8d',1,'openvdb::v3_2_0::tools::point_partitioner_internal::CreateOrderedPointIndexArrayOp']]], + ['morigin',['mOrigin',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#af414bde19eeac7a19348e1c7c795217b',1,'openvdb::v3_2_0::tree::InternalNode::mOrigin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#af414bde19eeac7a19348e1c7c795217b',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::mOrigin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#af414bde19eeac7a19348e1c7c795217b',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::mOrigin()']]], + ['morphology',['Morphology',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a8a91a5eb7059fe4e32beba357755aaa6',1,'openvdb::v3_2_0::tools::Morphology::Morphology(TreeType &tree)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a7a06034300a1464451a0ede3735490b6',1,'openvdb::v3_2_0::tools::Morphology::Morphology(ManagerType *mgr)']]], + ['morphology',['Morphology',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html',1,'openvdb::v3_2_0::tools']]], + ['morphology_2eh',['Morphology.h',['../Morphology_8h.html',1,'']]], + ['moutputgrid',['mOutputGrid',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Divergence_1_1Functor.html#a52d73c3917e4240a7e1530a5e043fcfa',1,'openvdb::v3_2_0::tools::Divergence::Functor::mOutputGrid()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Gradient_1_1Functor.html#a52d73c3917e4240a7e1530a5e043fcfa',1,'openvdb::v3_2_0::tools::Gradient::Functor::mOutputGrid()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian_1_1Functor.html#a28981ccc232ba941888d689389165232',1,'openvdb::v3_2_0::tools::Laplacian::Functor::mOutputGrid()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature_1_1Functor.html#a28981ccc232ba941888d689389165232',1,'openvdb::v3_2_0::tools::MeanCurvature::Functor::mOutputGrid()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude_1_1Functor.html#a52d73c3917e4240a7e1530a5e043fcfa',1,'openvdb::v3_2_0::tools::Magnitude::Functor::mOutputGrid()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Normalize_1_1Functor.html#a28981ccc232ba941888d689389165232',1,'openvdb::v3_2_0::tools::Normalize::Functor::mOutputGrid()']]], + ['movepoints',['MovePoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MovePoints.html#a6eefa0d00728e2d0a2f1ae7b46da7fa1',1,'openvdb::v3_2_0::tools::internal::MovePoints']]], + ['movepoints',['MovePoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MovePoints.html',1,'openvdb::v3_2_0::tools::internal']]], + ['movesegmentdataop',['MoveSegmentDataOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MoveSegmentDataOp.html#a272b3538f8d2afb22bd910c2e84af7a0',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MoveSegmentDataOp']]], + ['movesegmentdataop',['MoveSegmentDataOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MoveSegmentDataOp.html',1,'openvdb::v3_2_0::tools::point_partitioner_internal']]], + ['moveto',['moveTo',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a8c1795bb2a69d1596846dda8db1fa810',1,'openvdb::v3_2_0::math::BaseStencil::moveTo(const Coord &ijk)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a6786888a357f4a08d2e1e3f4ab206007',1,'openvdb::v3_2_0::math::BaseStencil::moveTo(const Coord &ijk, const ValueType &centerValue)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a283eb7116175c5c9b83f0eff6872c1df',1,'openvdb::v3_2_0::math::BaseStencil::moveTo(const IterType &iter)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#aa7ce5de66f389ecebf0eab3c9dbce076',1,'openvdb::v3_2_0::math::BaseStencil::moveTo(const Vec3R &xyz)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DenseStencil.html#a8c1795bb2a69d1596846dda8db1fa810',1,'openvdb::v3_2_0::math::DenseStencil::moveTo(const Coord &ijk)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DenseStencil.html#a283eb7116175c5c9b83f0eff6872c1df',1,'openvdb::v3_2_0::math::DenseStencil::moveTo(const IterType &iter)']]], + ['mownsgrid',['mOwnsGrid',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid_1_1ReducePool.html#a565164802f04c934f640168c4df207bd',1,'openvdb::v3_2_0::tools::PointMaskGrid::ReducePool']]], + ['mownsmanager',['mOwnsManager',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a617b6112d3cf467991f49d91b468565e',1,'openvdb::v3_2_0::tools::Morphology']]], + ['mpageoffsetarrays',['mPageOffsetArrays',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1OrderSegmentsOp.html#adb6f49bd3cad8514dfd4ecb8dfa22128',1,'openvdb::v3_2_0::tools::point_partitioner_internal::OrderSegmentsOp']]], + ['mpages',['mPages',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1VoxelOrderOp.html#aad2fc16bd790d1bc63261872c19cbefb',1,'openvdb::v3_2_0::tools::point_partitioner_internal::VoxelOrderOp::mPages()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1LeafNodeOriginOp.html#aad2fc16bd790d1bc63261872c19cbefb',1,'openvdb::v3_2_0::tools::point_partitioner_internal::LeafNodeOriginOp::mPages()']]], + ['mparent',['mParent',['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html#af7fe7e8f2d47f112d1cf0d9747fca2b5',1,'openvdb::v3_2_0::util::BaseMaskIterator::mParent()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#a2f56aaf7d07ab91ea2c6fb666b5d7f1b',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::mParent()']]], + ['mparticles',['mParticles',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RemapIndices.html#a48ff9e7adf344712bd48fb3e03063bb0',1,'openvdb::v3_2_0::tools::particle_atlas_internal::RemapIndices']]], + ['mpartitioner',['mPartitioner',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1PopulateLeafNodesOp.html#af7b1d937f25caaf115024c63f6744247',1,'openvdb::v3_2_0::tools::point_index_grid_internal::PopulateLeafNodesOp']]], + ['mpointcount',['mPointCount',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#ad61cded56c971a1e64733b4c8bd41bc7',1,'openvdb::v3_2_0::tools::BasePointScatter']]], + ['mpointorder',['mPointOrder',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1ComputePointOrderOp.html#aff6131d40e5501f49e212989d16ece60',1,'openvdb::v3_2_0::tools::point_partitioner_internal::ComputePointOrderOp::mPointOrder()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1CreateOrderedPointIndexArrayOp.html#a4df1ec0e84716a7cba9e8fca9e66efae',1,'openvdb::v3_2_0::tools::point_partitioner_internal::CreateOrderedPointIndexArrayOp::mPointOrder()']]], + ['mpoints',['mPoints',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1LeafNodeOriginOp.html#a6eeaf628f86ce17aa24c228d7c348834',1,'openvdb::v3_2_0::tools::point_partitioner_internal::LeafNodeOriginOp::mPoints()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#a6eeaf628f86ce17aa24c228d7c348834',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp::mPoints()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#a4e753786b355d9112fd7547fd85bbf86',1,'openvdb::v3_2_0::tools::BasePointScatter::mPoints()']]], + ['mpointsin',['mPointsIn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1TransformPoints.html#a3fa7754130c22853678576e3ec0f66aa',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::TransformPoints']]], + ['mpointsout',['mPointsOut',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1TransformPoints.html#aeea557a0e08be7ba4273c306555fbb27',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::TransformPoints']]], + ['mpool',['mPool',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1MaskOp.html#a69635ab801b380543d555a475a5035b3',1,'openvdb::v3_2_0::tools::MultiResGrid::MaskOp']]], + ['mpos',['mPos',['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html#ab28e5158898fe509080028cfd895ce28',1,'openvdb::v3_2_0::util::BaseMaskIterator::mPos()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#ab28e5158898fe509080028cfd895ce28',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::mPos()']]], + ['mrand01',['mRand01',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#a96e0c347190b48bf38e77b340e7ea902',1,'openvdb::v3_2_0::tools::BasePointScatter']]], + ['mray',['mRay',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#ad6ca3d15eecb3e76a051b9eeb4d05e69',1,'openvdb::v3_2_0::tools::BaseCamera']]], + ['mresultisactive',['mResultIsActive',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#ad77b601397f8182816a05b8b11c3b6b1',1,'openvdb::v3_2_0::CombineArgs']]], + ['mresultval',['mResultVal',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a5ce5828fb27887003b04ac7bc6f38f5f',1,'openvdb::v3_2_0::CombineArgs']]], + ['mresultvalptr',['mResultValPtr',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a4fa59ec48f0468d55fe1e0d77e9a67f5',1,'openvdb::v3_2_0::CombineArgs']]], + ['mroot',['mRoot',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#a0b293dd9772aad6b65a774f9952844df',1,'openvdb::v3_2_0::tree::NodeManager::mRoot()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#a0b293dd9772aad6b65a774f9952844df',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::mRoot()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a66e7ac40d8b9ef7608f4dd5bdfcf81dd',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::mRoot()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a3254ef258ed8f94627a1a3c9cfcfe7bd',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::mRoot()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a6e197e2e1e81c748d50f11f92434ad01',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::mRoot()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a74ea42eceaece758e964e0509b887a1a',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::mRoot()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a45a3cfd69ab5d6507b191bfe16ad3866',1,'openvdb::v3_2_0::tree::Tree::mRoot()']]], + ['msampler',['mSampler',['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#a224460051f7f7fc0ec34b3d6ab26a5df',1,'openvdb::v3_2_0::tools::AlphaMask']]], + ['mscaleheight',['mScaleHeight',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#a5c5bf87ef2b0409653cccfa84baa23fc',1,'openvdb::v3_2_0::tools::BaseCamera']]], + ['mscalewidth',['mScaleWidth',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#a5f144508faa9739d74b1896274f6b1f3',1,'openvdb::v3_2_0::tools::BaseCamera']]], + ['mscreentoworld',['mScreenToWorld',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#af41737a2b2f121096082457d687814b6',1,'openvdb::v3_2_0::tools::BaseCamera']]], + ['msegments',['mSegments',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandNarrowbandMask.html#a70cde43a4d2c263c86a578ece1d09bd3',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandNarrowbandMask::mSegments()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ComputeActiveVoxelCount.html#a29d061ec90a764f1376c4682f82b051d',1,'openvdb::v3_2_0::tools::level_set_util_internal::ComputeActiveVoxelCount::mSegments()']]], + ['msize',['mSize',['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#a52e13c49d14c17f5a85451f1cead46dd',1,'openvdb::v3_2_0::math::Extrema']]], + ['mstats',['mStats',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1MathOp.html#a1b9ccf6af8f3c4e0df1d0f3090ede7f9',1,'openvdb::v3_2_0::tools::stats_internal::MathOp']]], + ['mstencil',['mStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#ad341a8754b815932474f111e22771e2d',1,'openvdb::v3_2_0::math::BaseStencil']]], + ['msteps',['mSteps',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a95a5b140b9a55112881cce7b5437ec21',1,'openvdb::v3_2_0::tools::Morphology']]], + ['mthreaded',['mThreaded',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Divergence_1_1Functor.html#af7883da2bf5e3b439778e9290e7c297e',1,'openvdb::v3_2_0::tools::Divergence::Functor::mThreaded()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Gradient_1_1Functor.html#af7883da2bf5e3b439778e9290e7c297e',1,'openvdb::v3_2_0::tools::Gradient::Functor::mThreaded()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian_1_1Functor.html#af7883da2bf5e3b439778e9290e7c297e',1,'openvdb::v3_2_0::tools::Laplacian::Functor::mThreaded()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature_1_1Functor.html#af7883da2bf5e3b439778e9290e7c297e',1,'openvdb::v3_2_0::tools::MeanCurvature::Functor::mThreaded()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude_1_1Functor.html#af7883da2bf5e3b439778e9290e7c297e',1,'openvdb::v3_2_0::tools::Magnitude::Functor::mThreaded()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Normalize_1_1Functor.html#af7883da2bf5e3b439778e9290e7c297e',1,'openvdb::v3_2_0::tools::Normalize::Functor::mThreaded()']]], + ['mtree',['mTree',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorTiles.html#a4451e091324858e9887386c891eb5e52',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorTiles::mTree()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SDFTilesToFogVolume.html#a4451e091324858e9887386c891eb5e52',1,'openvdb::v3_2_0::tools::level_set_util_internal::SDFTilesToFogVolume::mTree()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillLeafNodeVoxels.html#a4451e091324858e9887386c891eb5e52',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillLeafNodeVoxels::mTree()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandNarrowbandMask.html#a4451e091324858e9887386c891eb5e52',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandNarrowbandMask::mTree()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ValidateIntersectingVoxels.html#a1cd2e8765a31f92c08e132dce77569e3',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ValidateIntersectingVoxels::mTree()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1AddNodes.html#a1cd2e8765a31f92c08e132dce77569e3',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::AddNodes::mTree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html#a3bad99f14356d386d0240b16967f678a',1,'openvdb::v3_2_0::tree::ValueAccessorBase::mTree()']]], + ['mult',['mult',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a0214d97cab290fbd487716272d92d3c7',1,'openvdb::v3_2_0::math::Quat']]], + ['multiresgrid',['MultiResGrid',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html',1,'openvdb::v3_2_0::tools']]], + ['multiresgrid',['MultiResGrid',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a45e4c07c8affb292bd58c0239ab3a9dd',1,'openvdb::v3_2_0::tools::MultiResGrid::MultiResGrid(size_t levels, ValueType background, double voxelSize=1.0)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a332c33e3c1c39fb142201962c71bf3bf',1,'openvdb::v3_2_0::tools::MultiResGrid::MultiResGrid(size_t levels, const Grid< TreeType > &grid, bool useInjection=false)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a7cf562b91683466fd3704b971c389ca0',1,'openvdb::v3_2_0::tools::MultiResGrid::MultiResGrid(size_t levels, GridPtr grid, bool useInjection=false)']]], + ['multiresgrid_2eh',['MultiResGrid.h',['../MultiResGrid_8h.html',1,'']]], + ['multop',['MultOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1MultOp.html',1,'openvdb::v3_2_0::tools::valxform']]], + ['multop',['MultOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1MultOp.html#a02199a89e05223221d75d2ef4b905bce',1,'openvdb::v3_2_0::tools::valxform::MultOp']]], + ['mval',['mVal',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TileSampler.html#a422983dc264ea7e3513cb16b214cefcb',1,'openvdb::v3_2_0::tools::internal::TileSampler']]], + ['mvalue',['mValue',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1FillArray.html#ab432bfd176d7d6a2763a4c9399657c67',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::FillArray']]], + ['mvaluemask',['mValueMask',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a3afa0e552b2ab6c5f3236e98d56b8903',1,'openvdb::v3_2_0::tree::InternalNode::mValueMask()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a3afa0e552b2ab6c5f3236e98d56b8903',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::mValueMask()']]], + ['mvisible',['mVisible',['../ParticlesToLevelSet_8h.html#afe2b4fa29c315142fa15f71cb8044d84',1,'ParticlesToLevelSet.h']]], + ['mvoxelcount',['mVoxelCount',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#a7f2324ecb0b1909536715417f5d6a423',1,'openvdb::v3_2_0::tools::BasePointScatter']]], + ['mvoxeloffsets',['mVoxelOffsets',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1VoxelOrderOp.html#ad0e74572f6ce94fd7efdb1791d25de23',1,'openvdb::v3_2_0::tools::point_partitioner_internal::VoxelOrderOp::mVoxelOffsets()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#a31b03bccc1e6e379ce720a038ee2c942',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp::mVoxelOffsets()']]], + ['mweight',['mWeight',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SDFVoxelsToFogVolume.html#ade3cad010b30dd7294114d25092e1466',1,'openvdb::v3_2_0::tools::level_set_util_internal::SDFVoxelsToFogVolume']]], + ['mx',['mX',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutZYX_01_4.html#aef2045ff3af1624ed6c3e05da71d64a6',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutZYX >']]], + ['mxdist',['mXDist',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#ab7fefe8916f444284ed2eba6a1486e2f',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData']]], + ['mxform',['mXForm',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1LeafNodeOriginOp.html#a7a20b1f60ced83195c02389d546d8088',1,'openvdb::v3_2_0::tools::point_partitioner_internal::LeafNodeOriginOp::mXForm()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#a7a20b1f60ced83195c02389d546d8088',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp::mXForm()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1TransformPoints.html#a54dc167a143860c2cc02529884a95199',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::TransformPoints::mXform()']]], + ['mxprim',['mXPrim',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#a39c9c2ddc88e7c539cfa77b869c429f8',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData']]], + ['my',['mY',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutZYX_01_4.html#ae3b293a59d64bf30ce4e44821943e9ca',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutZYX >::mY()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutXYZ_01_4.html#ae3b293a59d64bf30ce4e44821943e9ca',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutXYZ >::mY()']]], + ['mybase',['MyBase',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#ae4d4560bf0392ac23d8bd170feec4947',1,'openvdb::v3_2_0::math::Mat3::MyBase()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a4e603dfa15cc4480a4d349bf72562f64',1,'openvdb::v3_2_0::math::Mat4::MyBase()']]], + ['mydist',['mYDist',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#aaad18e74cc76aab82be5c46e833c3fc0',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData']]], + ['myprim',['mYPrim',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#ad4e5e55c703fee5e4f17e7a2ed8b2634',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData']]], + ['mytype',['MyType',['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#a8607bc8cb2ede029d0a4ae5001d6330d',1,'openvdb::v3_2_0::math::CompoundMap']]], + ['mz',['mZ',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutXYZ_01_4.html#a56fdb9022f2c442bb3473a882d2dbd18',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutXYZ >']]], + ['mzdist',['mZDist',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#a5119d34f5202e6611fe387d48db7d4da',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData']]], + ['mzprim',['mZPrim',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#acebf086d067693667a005e78ad96333b',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_f.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_f.html new file mode 100644 index 00000000..c395a474 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/all_f.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_f.js new file mode 100644 index 00000000..80565051 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/all_f.js @@ -0,0 +1,163 @@ +var searchData= +[ + ['name',['name',['../structopenvdb_1_1v3__2__0_1_1GridNamePred.html#a7082db574ba2d2d69ccafb060398b7d8',1,'openvdb::v3_2_0::GridNamePred::name()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1BoolSampler.html#aa6be32e0d1b4bd24f8745d1d3267b295',1,'openvdb::v3_2_0::tools::clip_internal::BoolSampler::name()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler.html#aa6be32e0d1b4bd24f8745d1d3267b295',1,'openvdb::v3_2_0::tools::Sampler::name()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointSampler.html#aa6be32e0d1b4bd24f8745d1d3267b295',1,'openvdb::v3_2_0::tools::PointSampler::name()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html#aa6be32e0d1b4bd24f8745d1d3267b295',1,'openvdb::v3_2_0::tools::BoxSampler::name()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadraticSampler.html#aa6be32e0d1b4bd24f8745d1d3267b295',1,'openvdb::v3_2_0::tools::QuadraticSampler::name()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredPointSampler.html#aa6be32e0d1b4bd24f8745d1d3267b295',1,'openvdb::v3_2_0::tools::StaggeredPointSampler::name()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredBoxSampler.html#aa6be32e0d1b4bd24f8745d1d3267b295',1,'openvdb::v3_2_0::tools::StaggeredBoxSampler::name()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredQuadraticSampler.html#aa6be32e0d1b4bd24f8745d1d3267b295',1,'openvdb::v3_2_0::tools::StaggeredQuadraticSampler::name()'],['../namespaceopenvdb_1_1v3__2__0.html#a019c188253c90cf2d0b1d6bf710190f4',1,'openvdb::v3_2_0::Name()']]], + ['name_2eh',['Name.h',['../Name_8h.html',1,'']]], + ['nameasstring',['nameAsString',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a379199014736f027bf11fd2c3f7c0b85',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['namedgridmap',['NamedGridMap',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a98b450a19e69b2b8996ddca8fc1fa067',1,'openvdb::v3_2_0::io::Archive']]], + ['nameiterator',['NameIterator',['../classopenvdb_1_1v3__2__0_1_1io_1_1File_1_1NameIterator.html',1,'openvdb::v3_2_0::io::File']]], + ['nameiterator',['NameIterator',['../classopenvdb_1_1v3__2__0_1_1io_1_1File_1_1NameIterator.html#ae5b24b1dd0691b2a3d187aa6e4187e6c',1,'openvdb::v3_2_0::io::File::NameIterator']]], + ['namemap',['NameMap',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a185ac871f7280e6ea525b5eb56eb4587',1,'openvdb::v3_2_0::io::File']]], + ['namemapciter',['NameMapCIter',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#aa6dbd64ba14d51185c2d409d981d267d',1,'openvdb::v3_2_0::io::File']]], + ['ncchildt',['NCChildT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a23b7ebd5bee8ab1fb729300f82bb0386',1,'openvdb::v3_2_0::tree::IterListItem::NCChildT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a23b7ebd5bee8ab1fb729300f82bb0386',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::NCChildT()']]], + ['ncleafnodet',['NCLeafNodeT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#a627378f1fa605a0b82d748dcc3a73a68',1,'openvdb::v3_2_0::tree::LeafIteratorBase']]], + ['ncnodet',['NCNodeT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a6925074a464ed498d508adbe456a309c',1,'openvdb::v3_2_0::tree::IterListItem::NCNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a6925074a464ed498d508adbe456a309c',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::NCNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a6925074a464ed498d508adbe456a309c',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::NCNodeT()']]], + ['ncrootnodet',['NCRootNodeT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a545e593438b07544d634dda5d00bdfef',1,'openvdb::v3_2_0::tree::NodeIteratorBase::NCRootNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#a545e593438b07544d634dda5d00bdfef',1,'openvdb::v3_2_0::tree::LeafIteratorBase::NCRootNodeT()']]], + ['ncvaluet',['NCValueT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a99cbebf71189866f2b001a1c66b0cdfc',1,'openvdb::v3_2_0::tree::IterListItem::NCValueT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a99cbebf71189866f2b001a1c66b0cdfc',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::NCValueT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a99cbebf71189866f2b001a1c66b0cdfc',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::NCValueT()']]], + ['nearestcoord',['nearestCoord',['../namespaceopenvdb_1_1v3__2__0_1_1util.html#ae6b18cc30bfc545a1a1d691e88f467c6',1,'openvdb::v3_2_0::util']]], + ['nearestneighbors',['NearestNeighbors',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a31d3cd59d1264144ae21e5250166cfc2',1,'openvdb::v3_2_0::tools']]], + ['needsactivevoxepadding',['needsActiveVoxePadding',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#af5ae121150b2407f088e1b3bc0c1e433',1,'openvdb::v3_2_0::tools::internal']]], + ['negate',['negate',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#abcdb1512395327f8236a4f4a4d4ff648',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::negate()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#abcdb1512395327f8236a4f4a4d4ff648',1,'openvdb::v3_2_0::tree::InternalNode::negate()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#abcdb1512395327f8236a4f4a4d4ff648',1,'openvdb::v3_2_0::tree::LeafNode::negate()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#abcdb1512395327f8236a4f4a4d4ff648',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::negate()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#abcdb1512395327f8236a4f4a4d4ff648',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::negate()']]], + ['negative',['negative',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7b353210b1a3d79dc34eb9380e50e4c0',1,'openvdb::v3_2_0::math::negative(const T &val)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a2467e202fb4c5cd1f2aabab78b82520a',1,'openvdb::v3_2_0::math::negative(const bool &val)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a41fc2fc612db63378525bdeeda90b88d',1,'openvdb::v3_2_0::math::negative(const std::string &val)']]], + ['neighbor',['Neighbor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1Neighbor.html',1,'openvdb::v3_2_0::tools::Morphology']]], + ['neighbor',['Neighbor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1Neighbor.html#a18e5bd400ed24e3fd0960943b302f88d',1,'openvdb::v3_2_0::tools::Morphology::Neighbor']]], + ['newdistnodes',['newDistNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#a68bee170e6c06685e3551aca0a967a77',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband']]], + ['newindexnodes',['newIndexNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#a7a59d49ed2e099a9a2022e18fdc3d8d7',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband']]], + ['newmasktree',['newMaskTree',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandLeafNodeRegion.html#ab944f47adf086a09fe8170437968b1a8',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandLeafNodeRegion::newMaskTree()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#ab944f47adf086a09fe8170437968b1a8',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::newMaskTree()']]], + ['newsetvalue',['newSetValue',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#ab63c145fbe586179c5afb574b69e7c98',1,'openvdb::v3_2_0::tree::ValueAccessor']]], + ['newtree',['newTree',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a742dad1af803e5c35040cc24868f2d40',1,'openvdb::v3_2_0::GridBase::newTree()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#ad39713416d1f162fbb2543ae58bba35c',1,'openvdb::v3_2_0::Grid::newTree()']]], + ['next',['next',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#abc23a9cafdc850ec4e93aa0dcac6383c',1,'openvdb::v3_2_0::math::DDA::next()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::next()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::tools::PointIndexIterator::next()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator::next()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::tree::IteratorBase::next()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a478269266193d35f2f5acb03ad06136b',1,'openvdb::v3_2_0::tree::IterListItem::next()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a478269266193d35f2f5acb03ad06136b',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::next()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a478269266193d35f2f5acb03ad06136b',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::next()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::next()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::tree::NodeIteratorBase::next()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::tree::LeafIteratorBase::next()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorRange.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::tree::IteratorRange::next()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1OnMaskIterator.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::util::OnMaskIterator::next()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1OffMaskIterator.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::util::OffMaskIterator::next()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1DenseMaskIterator.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::util::DenseMaskIterator::next()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OnIterator.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::util::RootNodeMask::OnIterator::next()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OffIterator.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::util::RootNodeMask::OffIterator::next()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1DenseIterator.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::util::RootNodeMask::DenseIterator::next()']]], + ['nineteenpointstencil',['NineteenPointStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1NineteenPointStencil.html#afc53d6a4f3807dca4f4913ae85c47a07',1,'openvdb::v3_2_0::math::NineteenPointStencil']]], + ['nineteenpointstencil',['NineteenPointStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1NineteenPointStencil.html',1,'openvdb::v3_2_0::math']]], + ['nn_5fface',['NN_FACE',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a31d3cd59d1264144ae21e5250166cfc2a8b7234ad92f6feba2725d890a38fdd59',1,'openvdb::v3_2_0::tools']]], + ['nn_5fface_5fedge',['NN_FACE_EDGE',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a31d3cd59d1264144ae21e5250166cfc2a6d84698cb77f59ae061433cbb1313bbf',1,'openvdb::v3_2_0::tools']]], + ['nn_5fface_5fedge_5fvertex',['NN_FACE_EDGE_VERTEX',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a31d3cd59d1264144ae21e5250166cfc2a2cbda8f22b738858b06cb668117278ee',1,'openvdb::v3_2_0::tools']]], + ['no_5flimiter',['NO_LIMITER',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1Scheme.html#a28fd66b0310514194a2fb1d2473e3e29a8190f53535f0dc8d9246fdf493756e93',1,'openvdb::v3_2_0::tools::Scheme']]], + ['no_5fmask_5fand_5fall_5fvals',['NO_MASK_AND_ALL_VALS',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a6b7b47dd702d9e331586d485013fd1eaad8aa5492856d5eafa86f7889ebdc85f9',1,'openvdb::v3_2_0::io']]], + ['no_5fmask_5fand_5fminus_5fbg',['NO_MASK_AND_MINUS_BG',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a6b7b47dd702d9e331586d485013fd1eaab416c229ad8ec113be713bdd13872467',1,'openvdb::v3_2_0::io']]], + ['no_5fmask_5fand_5fone_5finactive_5fval',['NO_MASK_AND_ONE_INACTIVE_VAL',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a6b7b47dd702d9e331586d485013fd1eaac359c780bb43bccf482499b3e4c33c70',1,'openvdb::v3_2_0::io']]], + ['no_5fmask_5for_5finactive_5fvals',['NO_MASK_OR_INACTIVE_VALS',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a6b7b47dd702d9e331586d485013fd1eaaee7e030c068bed829a9240eae6263f7a',1,'openvdb::v3_2_0::io']]], + ['nodebs',['NodeBS',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1NodeBS.html',1,'openvdb::v3_2_0::tools::internal']]], + ['nodebs',['NodeBS',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1NodeBS.html#adaa391b3f16165efa04b99f117c4116f',1,'openvdb::v3_2_0::tools::internal::NodeBS']]], + ['nodechain',['NodeChain',['../structopenvdb_1_1v3__2__0_1_1tree_1_1NodeChain.html',1,'openvdb::v3_2_0::tree']]], + ['nodechain_3c_20headt_2c_201_20_3e',['NodeChain< HeadT, 1 >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1NodeChain_3_01HeadT_00_011_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['nodechaintype',['NodeChainType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildPrimarySegment.html#a8b1fe8abb7e13ac7470ba9ea1e7e2d73',1,'openvdb::v3_2_0::tools::composite::BuildPrimarySegment::NodeChainType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildSecondarySegment.html#a8b1fe8abb7e13ac7470ba9ea1e7e2d73',1,'openvdb::v3_2_0::tools::composite::BuildSecondarySegment::NodeChainType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FloodFillSign.html#a8b1fe8abb7e13ac7470ba9ea1e7e2d73',1,'openvdb::v3_2_0::tools::level_set_util_internal::FloodFillSign::NodeChainType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a0982fa3467dd846d831fccca042f87b7',1,'openvdb::v3_2_0::tree::RootNode::NodeChainType()']]], + ['nodeciter',['NodeCIter',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a48fd0d2b2f429cc7b7a21b70b2844b25',1,'openvdb::v3_2_0::tree::Tree']]], + ['nodeconverter',['NodeConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOffCIter_01_4_1_1NodeConverter.html',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOffCIter >']]], + ['nodeconverter',['NodeConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildAllIter_01_4_1_1NodeConverter.html',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildAllIter >']]], + ['nodeconverter',['NodeConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOnCIter_01_4_1_1NodeConverter.html',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOnCIter >']]], + ['nodeconverter',['NodeConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildAllCIter_01_4_1_1NodeConverter.html',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildAllCIter >']]], + ['nodeconverter',['NodeConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOnIter_01_4_1_1NodeConverter.html',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOnIter >']]], + ['nodeconverter',['NodeConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOffIter_01_4_1_1NodeConverter.html',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOffIter >']]], + ['nodeconverter',['NodeConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOnIter_01_4_1_1NodeConverter.html',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOnIter >']]], + ['nodeconverter',['NodeConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOffCIter_01_4_1_1NodeConverter.html',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOffCIter >']]], + ['nodeconverter',['NodeConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueAllIter_01_4_1_1NodeConverter.html',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueAllIter >']]], + ['nodeconverter',['NodeConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOnCIter_01_4_1_1NodeConverter.html',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOnCIter >']]], + ['nodeconverter',['NodeConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOffIter_01_4_1_1NodeConverter.html',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOffIter >']]], + ['nodeconverter',['NodeConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueAllCIter_01_4_1_1NodeConverter.html',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueAllCIter >']]], + ['nodecount',['nodeCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#af2a4b92741d800e6525c0bcc7230fa8e',1,'openvdb::v3_2_0::tree::NodeList::nodeCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#af2a4b92741d800e6525c0bcc7230fa8e',1,'openvdb::v3_2_0::tree::NodeManagerLink::nodeCount() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#a02c2d85a30bc576d8351124a329cf92b',1,'openvdb::v3_2_0::tree::NodeManagerLink::nodeCount(Index i) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#af2a4b92741d800e6525c0bcc7230fa8e',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::nodeCount() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#a5a5eff974b3d3e2364177029332df611',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::nodeCount(Index) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#af2a4b92741d800e6525c0bcc7230fa8e',1,'openvdb::v3_2_0::tree::NodeManager::nodeCount() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#a02c2d85a30bc576d8351124a329cf92b',1,'openvdb::v3_2_0::tree::NodeManager::nodeCount(Index i) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#af2a4b92741d800e6525c0bcc7230fa8e',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::nodeCount() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#a5a5eff974b3d3e2364177029332df611',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::nodeCount(Index) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#af2a4b92741d800e6525c0bcc7230fa8e',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::nodeCount() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a02c2d85a30bc576d8351124a329cf92b',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::nodeCount(Index i) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#af2a4b92741d800e6525c0bcc7230fa8e',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::nodeCount() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a02c2d85a30bc576d8351124a329cf92b',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::nodeCount(Index i) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#af2a4b92741d800e6525c0bcc7230fa8e',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::nodeCount() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a02c2d85a30bc576d8351124a329cf92b',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::nodeCount(Index i) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#af2a4b92741d800e6525c0bcc7230fa8e',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::nodeCount() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a02c2d85a30bc576d8351124a329cf92b',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::nodeCount(Index i) const ']]], + ['nodeiter',['NodeIter',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ac34433f7d2e2eb2d95fddef8e0b1d523',1,'openvdb::v3_2_0::tree::Tree']]], + ['nodeiteratorbase',['NodeIteratorBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['nodeiteratorbase',['NodeIteratorBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a7169672650c84fe5d7dbda4fcab2ae04',1,'openvdb::v3_2_0::tree::NodeIteratorBase::NodeIteratorBase()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#ac34bd1fc5e0666259f303e3b2c45b5f0',1,'openvdb::v3_2_0::tree::NodeIteratorBase::NodeIteratorBase(TreeT &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#ac6057d2812404e42c2caf0aa7541f85f',1,'openvdb::v3_2_0::tree::NodeIteratorBase::NodeIteratorBase(const NodeIteratorBase &other)']]], + ['nodelist',['NodeList',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html',1,'openvdb::v3_2_0::tree']]], + ['nodelist',['nodeList',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange.html#a04d02da71da493dd822862e9a48a7bb1',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::nodeList()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#aa3a9df0253e6d4d127148724e132751e',1,'openvdb::v3_2_0::tree::NodeList::NodeList()']]], + ['nodelist_3c_20nodet0_20_3e',['NodeList< NodeT0 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html',1,'openvdb::v3_2_0::tree']]], + ['nodelist_3c_20nodet1_20_3e',['NodeList< NodeT1 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html',1,'openvdb::v3_2_0::tree']]], + ['nodelist_3c_20nodet2_20_3e',['NodeList< NodeT2 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html',1,'openvdb::v3_2_0::tree']]], + ['nodelist_3c_20nodet3_20_3e',['NodeList< NodeT3 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html',1,'openvdb::v3_2_0::tree']]], + ['nodelist_3c_20typename_20rootnodetype_3a_3achildnodetype_20_3e',['NodeList< typename RootNodeType::ChildNodeType >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html',1,'openvdb::v3_2_0::tree']]], + ['nodemanager',['NodeManager',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#ad62075f7dbaf6457e3206ea1c65e6a04',1,'openvdb::v3_2_0::tree::NodeManager::NodeManager()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#ad62075f7dbaf6457e3206ea1c65e6a04',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::NodeManager()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#ad62075f7dbaf6457e3206ea1c65e6a04',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::NodeManager()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#ad62075f7dbaf6457e3206ea1c65e6a04',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::NodeManager()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#ad62075f7dbaf6457e3206ea1c65e6a04',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::NodeManager()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#ad62075f7dbaf6457e3206ea1c65e6a04',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::NodeManager()']]], + ['nodemanager',['NodeManager',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html',1,'openvdb::v3_2_0::tree']]], + ['nodemanager_2eh',['NodeManager.h',['../NodeManager_8h.html',1,'']]], + ['nodemanager_3c_20treeorleafmanagert_2c_200_20_3e',['NodeManager< TreeOrLeafManagerT, 0 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['nodemanager_3c_20treeorleafmanagert_2c_201_20_3e',['NodeManager< TreeOrLeafManagerT, 1 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['nodemanager_3c_20treeorleafmanagert_2c_202_20_3e',['NodeManager< TreeOrLeafManagerT, 2 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['nodemanager_3c_20treeorleafmanagert_2c_203_20_3e',['NodeManager< TreeOrLeafManagerT, 3 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['nodemanager_3c_20treeorleafmanagert_2c_204_20_3e',['NodeManager< TreeOrLeafManagerT, 4 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['nodemanagerlink',['NodeManagerLink',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html',1,'openvdb::v3_2_0::tree']]], + ['nodemanagerlink',['NodeManagerLink',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#aa7efe14a099868abd1345bc4317df02c',1,'openvdb::v3_2_0::tree::NodeManagerLink::NodeManagerLink()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#aa7efe14a099868abd1345bc4317df02c',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::NodeManagerLink()']]], + ['nodemanagerlink_3c_20nodet_2c_200_20_3e',['NodeManagerLink< NodeT, 0 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['nodemanagerlink_3c_20typename_20rootnodetype_3a_3achildnodetype_2c_20levels_2d1_20_3e',['NodeManagerLink< typename RootNodeType::ChildNodeType, LEVELS-1 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html',1,'openvdb::v3_2_0::tree']]], + ['nodemask',['NodeMask',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html',1,'openvdb::v3_2_0::util']]], + ['nodemask',['NodeMask',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ac942c03f8a094afad0a9632d70a02dca',1,'openvdb::v3_2_0::util::NodeMask::NodeMask()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a6027ebba6c192d886132bd6a44b9ab4d',1,'openvdb::v3_2_0::util::NodeMask::NodeMask(bool on)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#acc7b46b8a39c2bfb491b7d752ffc39c7',1,'openvdb::v3_2_0::util::NodeMask::NodeMask(const NodeMask &other)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ac942c03f8a094afad0a9632d70a02dca',1,'openvdb::v3_2_0::util::NodeMask< 1 >::NodeMask()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a6027ebba6c192d886132bd6a44b9ab4d',1,'openvdb::v3_2_0::util::NodeMask< 1 >::NodeMask(bool on)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#acc7b46b8a39c2bfb491b7d752ffc39c7',1,'openvdb::v3_2_0::util::NodeMask< 1 >::NodeMask(const NodeMask &other)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ac942c03f8a094afad0a9632d70a02dca',1,'openvdb::v3_2_0::util::NodeMask< 2 >::NodeMask()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a6027ebba6c192d886132bd6a44b9ab4d',1,'openvdb::v3_2_0::util::NodeMask< 2 >::NodeMask(bool on)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#acc7b46b8a39c2bfb491b7d752ffc39c7',1,'openvdb::v3_2_0::util::NodeMask< 2 >::NodeMask(const NodeMask &other)']]], + ['nodemask_3c_201_20_3e',['NodeMask< 1 >',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html',1,'openvdb::v3_2_0::util']]], + ['nodemask_3c_202_20_3e',['NodeMask< 2 >',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html',1,'openvdb::v3_2_0::util']]], + ['nodemasks_2eh',['NodeMasks.h',['../NodeMasks_8h.html',1,'']]], + ['nodemasksegment',['NodeMaskSegment',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1NodeMaskSegment.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['nodemasksegment',['NodeMaskSegment',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1NodeMaskSegment.html#a5367353056782aca5ec2d08e31be7ae3',1,'openvdb::v3_2_0::tools::level_set_util_internal::NodeMaskSegment']]], + ['nodemasksegmentation',['nodeMaskSegmentation',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal.html#aa4b9363aae5ae02f30c718ad119adfc6',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['nodemasksegmenttype',['NodeMaskSegmentType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SegmentNodeMask.html#a5cd2ce8057f8bc45f6ac7bd217dd26a4',1,'openvdb::v3_2_0::tools::level_set_util_internal::SegmentNodeMask::NodeMaskSegmentType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ConnectNodeMaskSegments.html#a5cd2ce8057f8bc45f6ac7bd217dd26a4',1,'openvdb::v3_2_0::tools::level_set_util_internal::ConnectNodeMaskSegments::NodeMaskSegmentType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskSegmentGroup.html#af719360c74f407748b7e9fd3c9385da6',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskSegmentGroup::NodeMaskSegmentType()']]], + ['nodemasksegmenttypeptr',['NodeMaskSegmentTypePtr',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SegmentNodeMask.html#a759e0814f87d1e3d0e5e31a88d28ce80',1,'openvdb::v3_2_0::tools::level_set_util_internal::SegmentNodeMask::NodeMaskSegmentTypePtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ConnectNodeMaskSegments.html#a759e0814f87d1e3d0e5e31a88d28ce80',1,'openvdb::v3_2_0::tools::level_set_util_internal::ConnectNodeMaskSegments::NodeMaskSegmentTypePtr()']]], + ['nodemasksegmentvector',['NodeMaskSegmentVector',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SegmentNodeMask.html#a2b9e9014495c9e881c52b6c73d8f02ef',1,'openvdb::v3_2_0::tools::level_set_util_internal::SegmentNodeMask::NodeMaskSegmentVector()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ConnectNodeMaskSegments.html#a2b9e9014495c9e881c52b6c73d8f02ef',1,'openvdb::v3_2_0::tools::level_set_util_internal::ConnectNodeMaskSegments::NodeMaskSegmentVector()']]], + ['nodemasktype',['NodeMaskType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildPrimarySegment.html#ad926943d080d5e746033a5be01ed99ef',1,'openvdb::v3_2_0::tools::composite::BuildPrimarySegment::NodeMaskType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildSecondarySegment.html#ad926943d080d5e746033a5be01ed99ef',1,'openvdb::v3_2_0::tools::composite::BuildSecondarySegment::NodeMaskType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1NodeMaskSegment.html#a63ad0305a158b91fedb74b0ac7f57c7d',1,'openvdb::v3_2_0::tools::level_set_util_internal::NodeMaskSegment::NodeMaskType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ConnectNodeMaskSegments.html#a63ad0305a158b91fedb74b0ac7f57c7d',1,'openvdb::v3_2_0::tools::level_set_util_internal::ConnectNodeMaskSegments::NodeMaskType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandLeafNodeRegion.html#ad926943d080d5e746033a5be01ed99ef',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandLeafNodeRegion::NodeMaskType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillLeafNodeVoxels.html#ad926943d080d5e746033a5be01ed99ef',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillLeafNodeVoxels::NodeMaskType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#ad926943d080d5e746033a5be01ed99ef',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::NodeMaskType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a89539d1156e6ad8837ff948b2a2307ea',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::NodeMaskType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a89539d1156e6ad8837ff948b2a2307ea',1,'openvdb::v3_2_0::tree::InternalNode::NodeMaskType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a89539d1156e6ad8837ff948b2a2307ea',1,'openvdb::v3_2_0::tree::LeafNode::NodeMaskType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a89539d1156e6ad8837ff948b2a2307ea',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::NodeMaskType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a89539d1156e6ad8837ff948b2a2307ea',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::NodeMaskType()']]], + ['noderange',['NodeRange',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange.html',1,'openvdb::v3_2_0::tree::NodeList']]], + ['noderange',['NodeRange',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange.html#a2b692749403550984465da88a15079b1',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::NodeRange(size_t begin, size_t end, const NodeList &nodeList, size_t grainSize=1)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange.html#af3166343a38b07563455dec0b013f340',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::NodeRange(NodeRange &r, tbb::split)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#a67c120b5d229cb4165a8b7bf5fa63823',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::nodeRange()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#a46c0b20d92c0700ca45f4f3f4f9cf21e',1,'openvdb::v3_2_0::tree::NodeList::nodeRange()']]], + ['nodes',['nodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html#a9883ee9c53f52a91c8ff1e5f026f2597',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::LeafNodeConnectivityTable::nodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html#ae261b12fa1b1ba15dce9796dfe552841',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::LeafNodeConnectivityTable::nodes() const ']]], + ['nodet',['NodeT',['../structopenvdb_1_1v3__2__0_1_1math_1_1LevelSetHDDA.html#a95381de0e25829d02834b011f207905a',1,'openvdb::v3_2_0::math::LevelSetHDDA::NodeT()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA.html#acc1e3979c4ee61bfcc2deb2fc8edc4ae',1,'openvdb::v3_2_0::math::VolumeHDDA::NodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#af2e6c9b80035addb030eeaa6fb472012',1,'openvdb::v3_2_0::tree::IterListItem::NodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#af2e6c9b80035addb030eeaa6fb472012',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::NodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#af2e6c9b80035addb030eeaa6fb472012',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::NodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a7ff070f090763763e0a0fe2bff78039a',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::NodeT()']]], + ['nodet0',['NodeT0',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a8328a160872f90dc186f214d93591e9c',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::NodeT0()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a8328a160872f90dc186f214d93591e9c',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::NodeT0()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a8328a160872f90dc186f214d93591e9c',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::NodeT0()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a8328a160872f90dc186f214d93591e9c',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::NodeT0()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a39372bcfd8f6d1ac8afc2f757862f175',1,'openvdb::v3_2_0::tree::ValueAccessor1::NodeT0()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a39372bcfd8f6d1ac8afc2f757862f175',1,'openvdb::v3_2_0::tree::ValueAccessor2::NodeT0()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a39372bcfd8f6d1ac8afc2f757862f175',1,'openvdb::v3_2_0::tree::ValueAccessor3::NodeT0()']]], + ['nodet1',['NodeT1',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a14ad531eb746ccd947b7f67e4d8e9de4',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::NodeT1()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a150a8410fea91bbc898692a9dd3482ce',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::NodeT1()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a150a8410fea91bbc898692a9dd3482ce',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::NodeT1()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a150a8410fea91bbc898692a9dd3482ce',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::NodeT1()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#abecf715579e470c3c50dec0858ff1d50',1,'openvdb::v3_2_0::tree::ValueAccessor2::NodeT1()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#abecf715579e470c3c50dec0858ff1d50',1,'openvdb::v3_2_0::tree::ValueAccessor3::NodeT1()']]], + ['nodet2',['NodeT2',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a4bd87f3ad1467105e4d732d2eaff1f21',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::NodeT2()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a67729803c824a26c8dbaa5093f762a32',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::NodeT2()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a67729803c824a26c8dbaa5093f762a32',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::NodeT2()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#add7ea05ae81fa164ff7f7be093f17576',1,'openvdb::v3_2_0::tree::ValueAccessor3::NodeT2()']]], + ['nodet3',['NodeT3',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#ae78a2c0e976a5709495ab3be7bcf7e02',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::NodeT3()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a58f4360b0549e86c047b2cff82bc3952',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::NodeT3()']]], + ['nodet4',['NodeT4',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#aab185431dd6da83416887c8f9f954610',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >']]], + ['nodetype',['NodeType',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#a88fbbb3bca7df33c47be9f2b0d408955',1,'openvdb::v3_2_0::tree::SparseIteratorBase::NodeType()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a88fbbb3bca7df33c47be9f2b0d408955',1,'openvdb::v3_2_0::tree::DenseIteratorBase::NodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a53ea168ef3193928e7979c02817f735d',1,'openvdb::v3_2_0::tree::CacheItem::NodeType()']]], + ['nodeunion',['NodeUnion',['../structopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnion.html',1,'openvdb::v3_2_0::tree']]], + ['nodeunion',['NodeUnion',['../structopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnion.html#a4ae1423de7d932181d485f6c5e2b391f',1,'openvdb::v3_2_0::tree::NodeUnion']]], + ['nodeunion_2eh',['NodeUnion.h',['../NodeUnion_8h.html',1,'']]], + ['nodeunion_3c_20valuetype_2c_20childnodetype_20_3e',['NodeUnion< ValueType, ChildNodeType >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnion.html',1,'openvdb::v3_2_0::tree']]], + ['nodeunionimpl',['NodeUnionImpl',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl.html',1,'openvdb::v3_2_0::tree']]], + ['nodeunionimpl',['NodeUnionImpl',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01false_00_01ValueT_00_01ChildT_01_4.html#abdf42a3c66ee943a982af3a20614119b',1,'openvdb::v3_2_0::tree::NodeUnionImpl< false, ValueT, ChildT >::NodeUnionImpl()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01true_00_01ValueT_00_01ChildT_01_4.html#abdf42a3c66ee943a982af3a20614119b',1,'openvdb::v3_2_0::tree::NodeUnionImpl< true, ValueT, ChildT >::NodeUnionImpl()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01true_00_01ValueT_00_01ChildT_01_4.html#a125c25372cc3bae21eda28f32b96942a',1,'openvdb::v3_2_0::tree::NodeUnionImpl< true, ValueT, ChildT >::NodeUnionImpl(const NodeUnionImpl &other)']]], + ['nodeunionimpl_3c_20boost_3a_3ais_5fclass_3c_20valuet_20_3e_3a_3avalue_2c_20valuet_2c_20childt_20_3e',['NodeUnionImpl< boost::is_class< ValueT >::value, ValueT, ChildT >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl.html',1,'openvdb::v3_2_0::tree']]], + ['nodeunionimpl_3c_20boost_3a_3ais_5fclass_3c_20valuetype_20_3e_3a_3avalue_2c_20valuetype_2c_20childnodetype_20_3e',['NodeUnionImpl< boost::is_class< ValueType >::value, ValueType, ChildNodeType >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl.html',1,'openvdb::v3_2_0::tree']]], + ['nodeunionimpl_3c_20false_2c_20valuet_2c_20childt_20_3e',['NodeUnionImpl< false, ValueT, ChildT >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01false_00_01ValueT_00_01ChildT_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['nodeunionimpl_3c_20true_2c_20valuet_2c_20childt_20_3e',['NodeUnionImpl< true, ValueT, ChildT >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01true_00_01ValueT_00_01ChildT_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['nonconstaccessortype',['NonConstAccessorType',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a4c6207dadb898cd12bf254e8817d2f6d',1,'openvdb::v3_2_0::TreeAdapter::NonConstAccessorType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a4c6207dadb898cd12bf254e8817d2f6d',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::NonConstAccessorType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a4c6207dadb898cd12bf254e8817d2f6d',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::NonConstAccessorType()']]], + ['nonconstbuffertype',['NonConstBufferType',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a9539b6120b9d985d3c77fadeab6d7769',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['nonconstchildnodetype',['NonConstChildNodeType',['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#ab8cc698ecc36cc2a6bcf8c0bd4d90639',1,'openvdb::v3_2_0::tree::DenseIteratorBase']]], + ['nonconstgridptrtype',['NonConstGridPtrType',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a932fb26412a242d16d3630d4a8517225',1,'openvdb::v3_2_0::TreeAdapter::NonConstGridPtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a932fb26412a242d16d3630d4a8517225',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::NonConstGridPtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a932fb26412a242d16d3630d4a8517225',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::NonConstGridPtrType()']]], + ['nonconstgridtype',['NonConstGridType',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a227e7cceedb13897b43857a2a0107a8f',1,'openvdb::v3_2_0::TreeAdapter::NonConstGridType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a227e7cceedb13897b43857a2a0107a8f',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::NonConstGridType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a227e7cceedb13897b43857a2a0107a8f',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::NonConstGridType()']]], + ['nonconstleaftype',['NonConstLeafType',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a3aa32bb9bbf634ba2c32589db8316860',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['nonconstnodetype',['NonConstNodeType',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#a073b0571f0fccd18553fa4fcb835ff87',1,'openvdb::v3_2_0::tree::SparseIteratorBase::NonConstNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a073b0571f0fccd18553fa4fcb835ff87',1,'openvdb::v3_2_0::tree::DenseIteratorBase::NonConstNodeType()']]], + ['nonconsttreeptrtype',['NonConstTreePtrType',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#ab4ed1f25cd3194982f763e4b8e73bc8f',1,'openvdb::v3_2_0::TreeAdapter::NonConstTreePtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#ab4ed1f25cd3194982f763e4b8e73bc8f',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::NonConstTreePtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#ab4ed1f25cd3194982f763e4b8e73bc8f',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::NonConstTreePtrType()']]], + ['nonconsttreetype',['NonConstTreeType',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#ad90332e5c18721d6dbd9e7453ef0a74e',1,'openvdb::v3_2_0::TreeAdapter::NonConstTreeType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#ad90332e5c18721d6dbd9e7453ef0a74e',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::NonConstTreeType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#ad90332e5c18721d6dbd9e7453ef0a74e',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::NonConstTreeType()']]], + ['nonconstvaluet',['NonConstValueT',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DenseIter.html#ad7abce612a88828c02f160d5a0d08972',1,'openvdb::v3_2_0::tree::InternalNode::DenseIter::NonConstValueT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1DenseIter.html#ad7abce612a88828c02f160d5a0d08972',1,'openvdb::v3_2_0::tree::LeafNode::DenseIter::NonConstValueT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1DenseIter.html#ad7abce612a88828c02f160d5a0d08972',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::DenseIter::NonConstValueT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1DenseIter.html#ad7abce612a88828c02f160d5a0d08972',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::DenseIter::NonConstValueT()']]], + ['nonconstvaluetype',['NonConstValueType',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#ab617e717e5addbc62bc74c4aa878e3c2',1,'openvdb::v3_2_0::tree::SparseIteratorBase::NonConstValueType()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#af97f7780ee30cadd5687ed65e12eedf0',1,'openvdb::v3_2_0::tree::DenseIteratorBase::NonConstValueType()']]], + ['nonleafcount',['nonLeafCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ad8d22ef34f6459bcffc00f6eb8f747b9',1,'openvdb::v3_2_0::tree::InternalNode::nonLeafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a990fc39a0c24140b9c1506255bb14918',1,'openvdb::v3_2_0::tree::LeafNode::nonLeafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a990fc39a0c24140b9c1506255bb14918',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::nonLeafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a990fc39a0c24140b9c1506255bb14918',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::nonLeafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ad8d22ef34f6459bcffc00f6eb8f747b9',1,'openvdb::v3_2_0::tree::RootNode::nonLeafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a11d3e40260ba955b4a19778072e684b0',1,'openvdb::v3_2_0::tree::TreeBase::nonLeafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a007c10ac7c3106556c8b53e5bd14e6ea',1,'openvdb::v3_2_0::tree::Tree::nonLeafCount()']]], + ['nonlinearfrustummap',['NonlinearFrustumMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a034267f27dbcdade97adeba2b40b188a',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::NonlinearFrustumMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#aa398b18728e56b6c5cdebf2f5386a406',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::NonlinearFrustumMap(const BBoxd &bb, double taper, double depth)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a06277bdf28173349f9f7ff8e9cb5eea7',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::NonlinearFrustumMap(const BBoxd &bb, double taper, double depth, const MapBase::Ptr &secondMap)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#aa0e02e24cc4750f73159c562b35cc104',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::NonlinearFrustumMap(const NonlinearFrustumMap &other)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a617947ab06812ed4ccb1344297daf758',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::NonlinearFrustumMap(const Vec3d &position, const Vec3d &direction, const Vec3d &up, double aspect, double z_near, double depth, Coord::ValueType x_count, Coord::ValueType z_count)']]], + ['nonlinearfrustummap',['NonlinearFrustumMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html',1,'openvdb::v3_2_0::math']]], + ['nonuniformpointscatter',['NonUniformPointScatter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1NonUniformPointScatter.html',1,'openvdb::v3_2_0::tools']]], + ['nonuniformpointscatter',['NonUniformPointScatter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1NonUniformPointScatter.html#a146b51526e890562ada2161c571504ff',1,'openvdb::v3_2_0::tools::NonUniformPointScatter']]], + ['normalize',['Normalize',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Normalize.html#aedadf453de06c8f0ba24b6694a7246da',1,'openvdb::v3_2_0::tools::Normalize::Normalize(const GridT &grid, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Normalize.html#a491b734521db7939cf33446f21551817',1,'openvdb::v3_2_0::tools::Normalize::Normalize(const GridT &grid, const MaskGridType &mask, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ab394010939518b8d240de6cbcd97de3e',1,'openvdb::v3_2_0::math::Quat::normalize()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a2b23e3f21a0e9c4c83a07c16f3e2f132',1,'openvdb::v3_2_0::math::Vec2::normalize()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ae37fa555d3e29bc5ee4b0c813f86f18d',1,'openvdb::v3_2_0::math::Vec3::normalize()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a2b23e3f21a0e9c4c83a07c16f3e2f132',1,'openvdb::v3_2_0::math::Vec4::normalize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a6e084d9731121c25a00947bd847b3f37',1,'openvdb::v3_2_0::tools::LevelSetTracker::normalize(const MaskType *mask)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#acd0de676568888d848beb97dcc53ae47',1,'openvdb::v3_2_0::tools::LevelSetTracker::normalize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a648cae0f8b75b19c0ad0dc1fa9d50671',1,'openvdb::v3_2_0::tools::LevelSetTracker::normalize(const MaskT *mask)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#af5c0227e6c84797a06542df58c2b564d',1,'openvdb::v3_2_0::tools::normalize(const GridType &grid, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac1b083e3b964ba0f08ff56bf2d50981e',1,'openvdb::v3_2_0::tools::normalize(const GridType &grid, const MaskT &mask, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8d46a44f1c19d00286f8d0a844731863',1,'openvdb::v3_2_0::tools::normalize(const GridType &grid, bool threaded=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#acd846ae90792904770779eee713f6616',1,'openvdb::v3_2_0::tools::normalize(const GridType &grid, const MaskT &mask, bool threaded=true)']]], + ['normalize',['Normalize',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Normalize.html',1,'openvdb::v3_2_0::tools']]], + ['normalizelevelset',['normalizeLevelSet',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1ttls__internal.html#a83d6e46928df810bf0bc44e67cb810a1',1,'openvdb::v3_2_0::tools::ttls_internal']]], + ['normalshader',['NormalShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1NormalShader.html',1,'openvdb::v3_2_0::tools']]], + ['normalshader',['NormalShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1NormalShader.html#a4f6ebe79871fa4c47782b78d25ce8e3d',1,'openvdb::v3_2_0::tools::NormalShader::NormalShader()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1NormalShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#a1d7d874dc43fc51ec7cf81ff8263a9ae',1,'openvdb::v3_2_0::tools::NormalShader< Film::RGBA, SamplerType >::NormalShader()']]], + ['normalshader_3c_20film_3a_3argba_2c_20samplertype_20_3e',['NormalShader< Film::RGBA, SamplerType >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1NormalShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['normcount',['normCount',['../structopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker_1_1State.html#abd9bcaf6b4c24cdf70a5d9929d77ff23',1,'openvdb::v3_2_0::tools::LevelSetTracker::State']]], + ['normgrad',['normGrad',['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature.html#a72bb6768d5477823764281c923a06540',1,'openvdb::v3_2_0::math::MeanCurvature::normGrad(const MapType &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature.html#a5860b3e423942ad591e4f9deaeff7783',1,'openvdb::v3_2_0::math::MeanCurvature::normGrad(const MapType &map, const StencilT stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01TranslationMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html#aa47365bbc028285b2d3765c2db95db2a',1,'openvdb::v3_2_0::math::MeanCurvature< TranslationMap, DiffScheme2, DiffScheme1 >::normGrad(const TranslationMap &, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01TranslationMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html#a39b91fb5aba8de2f7103d32d1db6dd61',1,'openvdb::v3_2_0::math::MeanCurvature< TranslationMap, DiffScheme2, DiffScheme1 >::normGrad(const TranslationMap &, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01UniformScaleMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html#a14f61ab41806a698e6b9a6167d8a93b0',1,'openvdb::v3_2_0::math::MeanCurvature< UniformScaleMap, DiffScheme2, DiffScheme1 >::normGrad(const UniformScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01UniformScaleMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html#a6291a15ff594b9181baf8f7112378b5b',1,'openvdb::v3_2_0::math::MeanCurvature< UniformScaleMap, DiffScheme2, DiffScheme1 >::normGrad(const UniformScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01UniformScaleTranslateMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html#ad6671993d5e59d754def5573ce27f0c9',1,'openvdb::v3_2_0::math::MeanCurvature< UniformScaleTranslateMap, DiffScheme2, DiffScheme1 >::normGrad(const UniformScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01UniformScaleTranslateMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html#a966ba8b3e4b8604418ef5b5252f1a190',1,'openvdb::v3_2_0::math::MeanCurvature< UniformScaleTranslateMap, DiffScheme2, DiffScheme1 >::normGrad(const UniformScaleTranslateMap &map, const StencilT &stencil)']]], + ['normsqgrad',['normSqGrad',['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#ad7722eb4f94400831c99c088b826ad09',1,'openvdb::v3_2_0::math::GradStencil::normSqGrad()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html#ad7722eb4f94400831c99c088b826ad09',1,'openvdb::v3_2_0::math::WenoStencil::normSqGrad()']]], + ['notifier',['Notifier',['../classopenvdb_1_1v3__2__0_1_1io_1_1MappedFile.html#a55ab8243710575fe37d91cf80ad8fe9a',1,'openvdb::v3_2_0::io::MappedFile::Notifier()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#af6447994af80545baa1ddea91cb56823',1,'openvdb::v3_2_0::io::Queue::Notifier()']]], + ['notimplementederror',['NotImplementedError',['../classopenvdb_1_1v3__2__0_1_1NotImplementedError.html#a9fd1a9c66fa28ec3eb7a1d33007177cf',1,'openvdb::v3_2_0::NotImplementedError::NotImplementedError()'],['../classopenvdb_1_1v3__2__0_1_1NotImplementedError.html#a9564e24795595e63403b7d40b6a049c7',1,'openvdb::v3_2_0::NotImplementedError::NotImplementedError(const std::string &msg)']]], + ['notimplementederror',['NotImplementedError',['../classopenvdb_1_1v3__2__0_1_1NotImplementedError.html',1,'openvdb::v3_2_0']]], + ['nullinterrupter',['NullInterrupter',['../structopenvdb_1_1v3__2__0_1_1util_1_1NullInterrupter.html#a7a3998c44adf488f9a10905fcf493190',1,'openvdb::v3_2_0::util::NullInterrupter']]], + ['nullinterrupter',['NullInterrupter',['../structopenvdb_1_1v3__2__0_1_1util_1_1NullInterrupter.html',1,'openvdb::v3_2_0::util']]], + ['nullinterrupter_2eh',['NullInterrupter.h',['../NullInterrupter_8h.html',1,'']]], + ['num_5fbias_5fschemes',['NUM_BIAS_SCHEMES',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a5d76b81b0ad4c19007a781d4edb8181fab7849b10f470f95b35e3b90c5d7933c8',1,'openvdb::v3_2_0::math']]], + ['num_5fdd_5fschemes',['NUM_DD_SCHEMES',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aabfcbcb5ac86a1edac4035264bc7d2b8a6c33eba3c29e21d08682f0ad81386851',1,'openvdb::v3_2_0::math']]], + ['num_5fds_5fschemes',['NUM_DS_SCHEMES',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7ff5f2dff38e7639981794c43dc9167ba249c3c162cc52d061321ec40f385afb7',1,'openvdb::v3_2_0::math']]], + ['num_5fgrid_5fclasses',['NUM_GRID_CLASSES',['../namespaceopenvdb_1_1v3__2__0.html#a06fc87d81c62e9abb8790b6e5713c55bad920626883d514328c461b4d2496e3b6',1,'openvdb::v3_2_0']]], + ['num_5ftemporal_5fschemes',['NUM_TEMPORAL_SCHEMES',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aac34dfe6c6b73b43a4656c9dce041034a00c89afba185bba6c37f10edad847361',1,'openvdb::v3_2_0::math']]], + ['num_5fvalues',['NUM_VALUES',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#abb8a8fff522a3cd8472b242f22ce8cde',1,'openvdb::v3_2_0::tree::InternalNode::NUM_VALUES()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#abb8a8fff522a3cd8472b242f22ce8cde',1,'openvdb::v3_2_0::tree::LeafNode::NUM_VALUES()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#abb8a8fff522a3cd8472b242f22ce8cde',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::NUM_VALUES()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#abb8a8fff522a3cd8472b242f22ce8cde',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::NUM_VALUES()']]], + ['num_5fvec_5ftypes',['NUM_VEC_TYPES',['../namespaceopenvdb_1_1v3__2__0.html#adf764cbdea00d65edcd07bb9953ad2b7aa69b32b4e2d9a25a84186edeff99d4f0',1,'openvdb::v3_2_0']]], + ['num_5fvoxels',['NUM_VOXELS',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aea8547ecf74d52579ee34a5ac62d6c0e',1,'openvdb::v3_2_0::tree::InternalNode::NUM_VOXELS()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a6ec354438f15b62f496d794e80181373',1,'openvdb::v3_2_0::tree::LeafNode::NUM_VOXELS()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a6ec354438f15b62f496d794e80181373',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::NUM_VOXELS()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a6ec354438f15b62f496d794e80181373',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::NUM_VOXELS()']]], + ['numbackgroundtiles',['numBackgroundTiles',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#aca78cbf1bae9694422702b2f3fb81950',1,'openvdb::v3_2_0::tree::RootNode']]], + ['numbins',['numBins',['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html#a4e13276a5b9a3d97688c688ba554019f',1,'openvdb::v3_2_0::math::Histogram']]], + ['numcachelevels',['numCacheLevels',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a3c00b5ebee5269cfdeaab0c02e39231c',1,'openvdb::v3_2_0::tree::ValueAccessor::numCacheLevels()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a3c00b5ebee5269cfdeaab0c02e39231c',1,'openvdb::v3_2_0::tree::ValueAccessor0::numCacheLevels()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a3c00b5ebee5269cfdeaab0c02e39231c',1,'openvdb::v3_2_0::tree::ValueAccessor1::numCacheLevels()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a3c00b5ebee5269cfdeaab0c02e39231c',1,'openvdb::v3_2_0::tree::ValueAccessor2::numCacheLevels()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a3c00b5ebee5269cfdeaab0c02e39231c',1,'openvdb::v3_2_0::tree::ValueAccessor3::numCacheLevels()']]], + ['numcolumns',['numColumns',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#a452ca1fc00492dece72b9039dd1cac31',1,'openvdb::v3_2_0::math::Mat::numColumns()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a452ca1fc00492dece72b9039dd1cac31',1,'openvdb::v3_2_0::math::Vec2::numColumns()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a452ca1fc00492dece72b9039dd1cac31',1,'openvdb::v3_2_0::math::Vec3::numColumns()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a452ca1fc00492dece72b9039dd1cac31',1,'openvdb::v3_2_0::math::Vec4::numColumns()']]], + ['numelements',['numElements',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#ad0561ec473355048d1b49e9dc900193a',1,'openvdb::v3_2_0::math::Mat::numElements()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ad0561ec473355048d1b49e9dc900193a',1,'openvdb::v3_2_0::math::Quat::numElements()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ad0561ec473355048d1b49e9dc900193a',1,'openvdb::v3_2_0::math::Vec2::numElements()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ad0561ec473355048d1b49e9dc900193a',1,'openvdb::v3_2_0::math::Vec3::numElements()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#ad0561ec473355048d1b49e9dc900193a',1,'openvdb::v3_2_0::math::Vec4::numElements()']]], + ['numiterations',['numIterations',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestPointProjector.html#ac3e52d7cea2caf8be492c0c6f6acb696',1,'openvdb::v3_2_0::tools::ClosestPointProjector']]], + ['numlevels',['numLevels',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a005b95a9208b4877830b0fc0ab5378d5',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['numpixels',['numPixels',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Film.html#a0564952d6e13d44c783cbe20326f2c0a',1,'openvdb::v3_2_0::tools::Film']]], + ['numquads',['numQuads',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#acd2c266f1db1a93f57487795d6d9b858',1,'openvdb::v3_2_0::tools::PolygonPool']]], + ['numrows',['numRows',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a20052c0b048dd2133f34ff3b5433cdbd',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::numRows()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#a54dfa580a5678b5ce1a82c7cec8b9766',1,'openvdb::v3_2_0::math::Mat::numRows()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a54dfa580a5678b5ce1a82c7cec8b9766',1,'openvdb::v3_2_0::math::Vec2::numRows()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a54dfa580a5678b5ce1a82c7cec8b9766',1,'openvdb::v3_2_0::math::Vec3::numRows()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a54dfa580a5678b5ce1a82c7cec8b9766',1,'openvdb::v3_2_0::math::Vec4::numRows()']]], + ['numtriangles',['numTriangles',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#a4cc1fc3b35a4b56d7d09813a962aa2d3',1,'openvdb::v3_2_0::tools::PolygonPool']]], + ['numvalues',['numValues',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a6777fd128d5b36e2ddf572d11bbcf256',1,'openvdb::v3_2_0::tree::LeafNode::numValues()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a6777fd128d5b36e2ddf572d11bbcf256',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::numValues()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a6777fd128d5b36e2ddf572d11bbcf256',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::numValues()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_0.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_0.html new file mode 100644 index 00000000..8888fa80 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_0.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_0.js new file mode 100644 index 00000000..1473f806 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['a',['A',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyDifference_1_1A.html',1,'openvdb::v3_2_0::tree::InternalNode::TopologyDifference']]], + ['a',['A',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyUnion_1_1A.html',1,'openvdb::v3_2_0::tree::InternalNode::TopologyUnion']]], + ['a',['A',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyIntersection_1_1A.html',1,'openvdb::v3_2_0::tree::InternalNode::TopologyIntersection']]], + ['abtransform',['ABTransform',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ABTransform.html',1,'openvdb::v3_2_0::tools']]], + ['activationop',['ActivationOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1activation_1_1ActivationOp.html',1,'openvdb::v3_2_0::tools::activation']]], + ['adaptiveprimbuilder',['AdaptivePrimBuilder',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1AdaptivePrimBuilder.html',1,'openvdb::v3_2_0::tools::internal']]], + ['addnodes',['AddNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1AddNodes.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['affinemap',['AffineMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html',1,'openvdb::v3_2_0::math']]], + ['alphamask',['AlphaMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html',1,'openvdb::v3_2_0::tools']]], + ['archive',['Archive',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html',1,'openvdb::v3_2_0::io']]], + ['arithmeticerror',['ArithmeticError',['../classopenvdb_1_1v3__2__0_1_1ArithmeticError.html',1,'openvdb::v3_2_0']]], + ['array',['Array',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1Array.html',1,'openvdb::v3_2_0::tools::point_partitioner_internal']]], + ['avg',['Avg',['../structopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter_1_1Filter_1_1Avg.html',1,'openvdb::v3_2_0::tools::LevelSetFilter::Filter']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_1.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_1.html new file mode 100644 index 00000000..a402bbef --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_1.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_1.js new file mode 100644 index 00000000..f090c8d2 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_1.js @@ -0,0 +1,43 @@ +var searchData= +[ + ['b',['B',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyDifference_1_1B.html',1,'openvdb::v3_2_0::tree::InternalNode::TopologyDifference']]], + ['basecamera',['BaseCamera',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html',1,'openvdb::v3_2_0::tools']]], + ['baseiterator',['BaseIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html',1,'openvdb::v3_2_0::util::RootNodeMask']]], + ['basemaskiterator',['BaseMaskIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html',1,'openvdb::v3_2_0::util']]], + ['basepointscatter',['BasePointScatter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html',1,'openvdb::v3_2_0::tools']]], + ['baseshader',['BaseShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseShader.html',1,'openvdb::v3_2_0::tools']]], + ['basestencil',['BaseStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['basestencil_3c_20boxstencil_3c_20gridt_2c_20issafe_20_3e_2c_20gridt_2c_20issafe_20_3e',['BaseStencil< BoxStencil< GridT, IsSafe >, GridT, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['basestencil_3c_20boxstencil_3c_20gridt_2c_20true_20_3e_2c_20gridt_2c_20true_20_3e',['BaseStencil< BoxStencil< GridT, true >, GridT, true >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['basestencil_3c_20curvaturestencil_3c_20gridt_2c_20issafe_20_3e_2c_20gridt_2c_20issafe_20_3e',['BaseStencil< CurvatureStencil< GridT, IsSafe >, GridT, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['basestencil_3c_20densestencil_3c_20gridt_2c_20issafe_20_3e_2c_20gridt_2c_20issafe_20_3e',['BaseStencil< DenseStencil< GridT, IsSafe >, GridT, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['basestencil_3c_20fourthorderdensestencil_3c_20gridt_2c_20issafe_20_3e_2c_20gridt_2c_20issafe_20_3e',['BaseStencil< FourthOrderDenseStencil< GridT, IsSafe >, GridT, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['basestencil_3c_20gradstencil_3c_20gridt_2c_20issafe_20_3e_2c_20gridt_2c_20issafe_20_3e',['BaseStencil< GradStencil< GridT, IsSafe >, GridT, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['basestencil_3c_20nineteenpointstencil_3c_20gridt_2c_20issafe_20_3e_2c_20gridt_2c_20issafe_20_3e',['BaseStencil< NineteenPointStencil< GridT, IsSafe >, GridT, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['basestencil_3c_20secondorderdensestencil_3c_20gridt_2c_20issafe_20_3e_2c_20gridt_2c_20issafe_20_3e',['BaseStencil< SecondOrderDenseStencil< GridT, IsSafe >, GridT, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['basestencil_3c_20sevenpointstencil_3c_20gridt_2c_20issafe_20_3e_2c_20gridt_2c_20issafe_20_3e',['BaseStencil< SevenPointStencil< GridT, IsSafe >, GridT, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['basestencil_3c_20sixthorderdensestencil_3c_20gridt_2c_20issafe_20_3e_2c_20gridt_2c_20issafe_20_3e',['BaseStencil< SixthOrderDenseStencil< GridT, IsSafe >, GridT, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['basestencil_3c_20thirteenpointstencil_3c_20gridt_2c_20issafe_20_3e_2c_20gridt_2c_20issafe_20_3e',['BaseStencil< ThirteenPointStencil< GridT, IsSafe >, GridT, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['basestencil_3c_20wenostencil_3c_20gridt_2c_20issafe_20_3e_2c_20gridt_2c_20issafe_20_3e',['BaseStencil< WenoStencil< GridT, IsSafe >, GridT, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html',1,'openvdb::v3_2_0::math']]], + ['bbox',['BBox',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html',1,'openvdb::v3_2_0::math']]], + ['bbox_3c_20postype_20_3e',['BBox< PosType >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html',1,'openvdb::v3_2_0::math']]], + ['bbox_3c_20vec3d_20_3e',['BBox< Vec3d >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html',1,'openvdb::v3_2_0::math']]], + ['bboxfilter',['BBoxFilter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1BBoxFilter.html',1,'openvdb::v3_2_0::tools::particle_atlas_internal']]], + ['bboxfilter',['BBoxFilter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1BBoxFilter.html',1,'openvdb::v3_2_0::tools::point_index_grid_internal']]], + ['bias_5fscheme',['BIAS_SCHEME',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME.html',1,'openvdb::v3_2_0::math']]], + ['bias_5fscheme_3c_20first_5fbias_20_3e',['BIAS_SCHEME< FIRST_BIAS >',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01FIRST__BIAS_01_4.html',1,'openvdb::v3_2_0::math']]], + ['bias_5fscheme_3c_20hjweno5_5fbias_20_3e',['BIAS_SCHEME< HJWENO5_BIAS >',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01HJWENO5__BIAS_01_4.html',1,'openvdb::v3_2_0::math']]], + ['bias_5fscheme_3c_20second_5fbias_20_3e',['BIAS_SCHEME< SECOND_BIAS >',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01SECOND__BIAS_01_4.html',1,'openvdb::v3_2_0::math']]], + ['bias_5fscheme_3c_20third_5fbias_20_3e',['BIAS_SCHEME< THIRD_BIAS >',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01THIRD__BIAS_01_4.html',1,'openvdb::v3_2_0::math']]], + ['bias_5fscheme_3c_20weno5_5fbias_20_3e',['BIAS_SCHEME< WENO5_BIAS >',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01WENO5__BIAS_01_4.html',1,'openvdb::v3_2_0::math']]], + ['binpointindicesop',['BinPointIndicesOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html',1,'openvdb::v3_2_0::tools::point_partitioner_internal']]], + ['boolsampler',['BoolSampler',['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1BoolSampler.html',1,'openvdb::v3_2_0::tools::clip_internal']]], + ['boxsampler',['BoxSampler',['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html',1,'openvdb::v3_2_0::tools']]], + ['boxstencil',['BoxStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1BoxStencil.html',1,'openvdb::v3_2_0::math']]], + ['boxstencil_3c_20gridt_20_3e',['BoxStencil< GridT >',['../classopenvdb_1_1v3__2__0_1_1math_1_1BoxStencil.html',1,'openvdb::v3_2_0::math']]], + ['buffer',['Buffer',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['buffer',['Buffer',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >']]], + ['buffer',['Buffer',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >']]], + ['buildprimarysegment',['BuildPrimarySegment',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildPrimarySegment.html',1,'openvdb::v3_2_0::tools::composite']]], + ['buildsecondarysegment',['BuildSecondarySegment',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildSecondarySegment.html',1,'openvdb::v3_2_0::tools::composite']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_10.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_10.html new file mode 100644 index 00000000..714c4dcf --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_10.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_10.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_10.js new file mode 100644 index 00000000..8537153a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_10.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['quadandtriangledataadapter',['QuadAndTriangleDataAdapter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadAndTriangleDataAdapter.html',1,'openvdb::v3_2_0::tools']]], + ['quadraticsampler',['QuadraticSampler',['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadraticSampler.html',1,'openvdb::v3_2_0::tools']]], + ['quantizedunitvec',['QuantizedUnitVec',['../classopenvdb_1_1v3__2__0_1_1math_1_1QuantizedUnitVec.html',1,'openvdb::v3_2_0::math']]], + ['quat',['Quat',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html',1,'openvdb::v3_2_0::math']]], + ['queue',['Queue',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html',1,'openvdb::v3_2_0::io']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_11.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_11.html new file mode 100644 index 00000000..25cb3ebd --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_11.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_11.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_11.js new file mode 100644 index 00000000..a74ee5ad --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_11.js @@ -0,0 +1,36 @@ +var searchData= +[ + ['radialrangefilter',['RadialRangeFilter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RadialRangeFilter.html',1,'openvdb::v3_2_0::tools::particle_atlas_internal']]], + ['radialrangefilter',['RadialRangeFilter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1RadialRangeFilter.html',1,'openvdb::v3_2_0::tools::point_index_grid_internal']]], + ['rand01',['Rand01',['../classopenvdb_1_1v3__2__0_1_1math_1_1Rand01.html',1,'openvdb::v3_2_0::math']]], + ['rand01_3c_20double_2c_20randomgenerator_20_3e',['Rand01< double, RandomGenerator >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Rand01.html',1,'openvdb::v3_2_0::math']]], + ['randint',['RandInt',['../classopenvdb_1_1v3__2__0_1_1math_1_1RandInt.html',1,'openvdb::v3_2_0::math']]], + ['ray',['Ray',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html',1,'openvdb::v3_2_0::math']]], + ['ray_3c_20double_20_3e',['Ray< double >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html',1,'openvdb::v3_2_0::math']]], + ['realtohalf',['RealToHalf',['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf.html',1,'openvdb::v3_2_0::io']]], + ['realtohalf_3c_20double_20_3e',['RealToHalf< double >',['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01double_01_4.html',1,'openvdb::v3_2_0::io']]], + ['realtohalf_3c_20float_20_3e',['RealToHalf< float >',['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01float_01_4.html',1,'openvdb::v3_2_0::io']]], + ['realtohalf_3c_20vec2d_20_3e',['RealToHalf< Vec2d >',['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec2d_01_4.html',1,'openvdb::v3_2_0::io']]], + ['realtohalf_3c_20vec2s_20_3e',['RealToHalf< Vec2s >',['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec2s_01_4.html',1,'openvdb::v3_2_0::io']]], + ['realtohalf_3c_20vec3d_20_3e',['RealToHalf< Vec3d >',['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec3d_01_4.html',1,'openvdb::v3_2_0::io']]], + ['realtohalf_3c_20vec3s_20_3e',['RealToHalf< Vec3s >',['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec3s_01_4.html',1,'openvdb::v3_2_0::io']]], + ['reducepool',['ReducePool',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid_1_1ReducePool.html',1,'openvdb::v3_2_0::tools::PointMaskGrid']]], + ['referenceerror',['ReferenceError',['../classopenvdb_1_1v3__2__0_1_1ReferenceError.html',1,'openvdb::v3_2_0']]], + ['releasechildnodes',['ReleaseChildNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ReleaseChildNodes.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['remapindices',['RemapIndices',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1RemapIndices.html',1,'openvdb::v3_2_0::tools::internal']]], + ['remapindices',['RemapIndices',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RemapIndices.html',1,'openvdb::v3_2_0::tools::particle_atlas_internal']]], + ['removeselfintersectingsurface',['RemoveSelfIntersectingSurface',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RemoveSelfIntersectingSurface.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['renormalize',['Renormalize',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1Renormalize.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['restoreorigin',['RestoreOrigin',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RestoreOrigin.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['restrictop',['RestrictOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1RestrictOp.html',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['returnvalue',['ReturnValue',['../structopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1ReturnValue.html',1,'openvdb::v3_2_0::math::internal']]], + ['rgba',['RGBA',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html',1,'openvdb::v3_2_0::tools::Film']]], + ['rootnode',['RootNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html',1,'openvdb::v3_2_0::tree']]], + ['rootnodecombinehelper',['RootNodeCombineHelper',['../structopenvdb_1_1v3__2__0_1_1tree_1_1RootNodeCombineHelper.html',1,'openvdb::v3_2_0::tree']]], + ['rootnodecombinehelper_3c_20combineop_2c_20roott_2c_20otherroott_2c_20true_20_3e',['RootNodeCombineHelper< CombineOp, RootT, OtherRootT, true >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1RootNodeCombineHelper_3_01CombineOp_00_01RootT_00_01OtherRootT_00_01true_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['rootnodecopyhelper',['RootNodeCopyHelper',['../structopenvdb_1_1v3__2__0_1_1tree_1_1RootNodeCopyHelper.html',1,'openvdb::v3_2_0::tree']]], + ['rootnodecopyhelper_3c_20roott_2c_20otherroott_2c_20true_20_3e',['RootNodeCopyHelper< RootT, OtherRootT, true >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1RootNodeCopyHelper_3_01RootT_00_01OtherRootT_00_01true_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['rootnodemask',['RootNodeMask',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html',1,'openvdb::v3_2_0::util']]], + ['roweditor',['RowEditor',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1RowEditor.html',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix']]], + ['runtimeerror',['RuntimeError',['../classopenvdb_1_1v3__2__0_1_1RuntimeError.html',1,'openvdb::v3_2_0']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_12.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_12.html new file mode 100644 index 00000000..d6047a8d --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_12.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_12.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_12.js new file mode 100644 index 00000000..3a83f220 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_12.js @@ -0,0 +1,68 @@ +var searchData= +[ + ['sameconfiguration',['SameConfiguration',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1SameConfiguration.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['sameconfiguration',['SameConfiguration',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1SameConfiguration.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['sameconfiguration',['SameConfiguration',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1SameConfiguration.html',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >']]], + ['sameconfiguration',['SameConfiguration',['../structopenvdb_1_1v3__2__0_1_1tree_1_1RootNode_1_1SameConfiguration.html',1,'openvdb::v3_2_0::tree::RootNode']]], + ['sameconfiguration',['SameConfiguration',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1SameConfiguration.html',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >']]], + ['sameinternalconfig',['SameInternalConfig',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameInternalConfig.html',1,'openvdb::v3_2_0::tree']]], + ['sameinternalconfig_3c_20childt1_2c_20dim1_2c_20internalnode_3c_20childt2_2c_20dim1_20_3e_20_3e',['SameInternalConfig< ChildT1, Dim1, InternalNode< ChildT2, Dim1 > >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameInternalConfig_3_01ChildT1_00_01Dim1_00_01InternalNode_3_01ChildT2_00_01Dim1_01_4_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['sameleafconfig',['SameLeafConfig',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameLeafConfig.html',1,'openvdb::v3_2_0::tree']]], + ['sameleafconfig_3c_20dim1_2c_20leafnode_3c_20t2_2c_20dim1_20_3e_20_3e',['SameLeafConfig< Dim1, LeafNode< T2, Dim1 > >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameLeafConfig_3_01Dim1_00_01LeafNode_3_01T2_00_01Dim1_01_4_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['sameleafconfig_3c_20dim1_2c_20openvdb_3a_3atools_3a_3apointindexleafnode_3c_20t2_2c_20dim1_20_3e_20_3e',['SameLeafConfig< Dim1, openvdb::tools::PointIndexLeafNode< T2, Dim1 > >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameLeafConfig_3_01Dim1_00_01openvdb_1_1tools_1_1PointIndex81825ed065985d5c1a4f0ecf51aab07a.html',1,'openvdb::v3_2_0::tree']]], + ['samerootconfig',['SameRootConfig',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameRootConfig.html',1,'openvdb::v3_2_0::tree']]], + ['samerootconfig_3c_20childt1_2c_20rootnode_3c_20childt2_20_3e_20_3e',['SameRootConfig< ChildT1, RootNode< ChildT2 > >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameRootConfig_3_01ChildT1_00_01RootNode_3_01ChildT2_01_4_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['sampler',['Sampler',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler.html',1,'openvdb::v3_2_0::tools']]], + ['sampler_3c_200_2c_20false_20_3e',['Sampler< 0, false >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler_3_010_00_01false_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['sampler_3c_200_2c_20true_20_3e',['Sampler< 0, true >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler_3_010_00_01true_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['sampler_3c_201_2c_20false_20_3e',['Sampler< 1, false >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler_3_011_00_01false_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['sampler_3c_201_2c_20true_20_3e',['Sampler< 1, true >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler_3_011_00_01true_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['sampler_3c_202_2c_20false_20_3e',['Sampler< 2, false >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler_3_012_00_01false_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['sampler_3c_202_2c_20true_20_3e',['Sampler< 2, true >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler_3_012_00_01true_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['scalartovectorconverter',['ScalarToVectorConverter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ScalarToVectorConverter.html',1,'openvdb::v3_2_0::tools']]], + ['scalemap',['ScaleMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html',1,'openvdb::v3_2_0::math']]], + ['scaletranslatemap',['ScaleTranslateMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html',1,'openvdb::v3_2_0::math']]], + ['sdftilestofogvolume',['SDFTilesToFogVolume',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SDFTilesToFogVolume.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['sdfvoxelstofogvolume',['SDFVoxelsToFogVolume',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SDFVoxelsToFogVolume.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['seamweights',['SeamWeights',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SeamWeights.html',1,'openvdb::v3_2_0::tools::internal']]], + ['secondorderdensestencil',['SecondOrderDenseStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1SecondOrderDenseStencil.html',1,'openvdb::v3_2_0::math']]], + ['seedfillexteriorsign',['SeedFillExteriorSign',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedFillExteriorSign.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['seedpoints',['SeedPoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['segmentnodemask',['SegmentNodeMask',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SegmentNodeMask.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['sevenpointstencil',['SevenPointStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1SevenPointStencil.html',1,'openvdb::v3_2_0::math']]], + ['shallowcopy',['ShallowCopy',['../classopenvdb_1_1v3__2__0_1_1ShallowCopy.html',1,'openvdb::v3_2_0']]], + ['sharedopapplier',['SharedOpApplier',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpApplier.html',1,'openvdb::v3_2_0::tools::valxform']]], + ['sharedoptransformer',['SharedOpTransformer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpTransformer.html',1,'openvdb::v3_2_0::tools::valxform']]], + ['signdata',['SignData',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html',1,'openvdb::v3_2_0::tools::internal']]], + ['signedfloodfillop',['SignedFloodFillOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SignedFloodFillOp.html',1,'openvdb::v3_2_0::tools']]], + ['sixthorderdensestencil',['SixthOrderDenseStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1SixthOrderDenseStencil.html',1,'openvdb::v3_2_0::math']]], + ['sparseextractor',['SparseExtractor',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html',1,'openvdb::v3_2_0::tools']]], + ['sparseiteratorbase',['SparseIteratorBase',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['sparseiteratorbase_3c_20maskitert_2c_20childiter_3c_20maskitert_2c_20nodet_20_3e_2c_20nodet_2c_20bool_20_3e',['SparseIteratorBase< MaskIterT, ChildIter< MaskIterT, NodeT >, NodeT, bool >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['sparseiteratorbase_3c_20maskitert_2c_20childiter_3c_20maskitert_2c_20nodet_2c_20tagt_20_3e_2c_20nodet_2c_20valuetype_20_3e',['SparseIteratorBase< MaskIterT, ChildIter< MaskIterT, NodeT, TagT >, NodeT, ValueType >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['sparseiteratorbase_3c_20maskitert_2c_20childiter_3c_20nodet_2c_20childt_2c_20maskitert_2c_20tagt_20_3e_2c_20nodet_2c_20childt_20_3e',['SparseIteratorBase< MaskIterT, ChildIter< NodeT, ChildT, MaskIterT, TagT >, NodeT, ChildT >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['sparseiteratorbase_3c_20maskitert_2c_20valueiter_3c_20maskitert_2c_20nodet_2c_20valuet_20_3e_2c_20nodet_2c_20valuet_20_3e',['SparseIteratorBase< MaskIterT, ValueIter< MaskIterT, NodeT, ValueT >, NodeT, ValueT >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['sparseiteratorbase_3c_20maskitert_2c_20valueiter_3c_20maskitert_2c_20nodet_2c_20valuet_2c_20tagt_20_3e_2c_20nodet_2c_20valuet_20_3e',['SparseIteratorBase< MaskIterT, ValueIter< MaskIterT, NodeT, ValueT, TagT >, NodeT, ValueT >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['sparseiteratorbase_3c_20maskitert_2c_20valueiter_3c_20nodet_2c_20valuet_2c_20maskitert_2c_20tagt_20_3e_2c_20nodet_2c_20valuet_20_3e',['SparseIteratorBase< MaskIterT, ValueIter< NodeT, ValueT, MaskIterT, TagT >, NodeT, ValueT >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['sparsemaskedextractor',['SparseMaskedExtractor',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html',1,'openvdb::v3_2_0::tools']]], + ['sparsestencilmatrix',['SparseStencilMatrix',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html',1,'openvdb::v3_2_0::math::pcg']]], + ['sparsestencilmatrix_3c_20othervaluetype_2c_20stencil_5fsize_20_3e',['SparseStencilMatrix< OtherValueType, STENCIL_SIZE >',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html',1,'openvdb::v3_2_0::math::pcg']]], + ['sparsestencilmatrix_3c_20valuetype_2c_204_20_3e',['SparseStencilMatrix< ValueType, 4 >',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html',1,'openvdb::v3_2_0::math::pcg']]], + ['sparsetodensecompositor',['SparseToDenseCompositor',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html',1,'openvdb::v3_2_0::tools']]], + ['splittableparticlearray',['SplittableParticleArray',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html',1,'openvdb::v3_2_0::tools::particle_atlas_internal']]], + ['staggeredboxsampler',['StaggeredBoxSampler',['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredBoxSampler.html',1,'openvdb::v3_2_0::tools']]], + ['staggeredpointsampler',['StaggeredPointSampler',['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredPointSampler.html',1,'openvdb::v3_2_0::tools']]], + ['staggeredquadraticsampler',['StaggeredQuadraticSampler',['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredQuadraticSampler.html',1,'openvdb::v3_2_0::tools']]], + ['stashoriginandstoreoffset',['StashOriginAndStoreOffset',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1StashOriginAndStoreOffset.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['state',['State',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1State.html',1,'openvdb::v3_2_0::math::pcg']]], + ['state',['State',['../structopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker_1_1State.html',1,'openvdb::v3_2_0::tools::LevelSetTracker']]], + ['stats',['Stats',['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html',1,'openvdb::v3_2_0::math']]], + ['statsop',['StatsOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1StatsOp.html',1,'openvdb::v3_2_0::tools::stats_internal']]], + ['stealuniqueleafnodes',['StealUniqueLeafNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1StealUniqueLeafNodes.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['stream',['Stream',['../classopenvdb_1_1v3__2__0_1_1io_1_1Stream.html',1,'openvdb::v3_2_0::io']]], + ['streammetadata',['StreamMetadata',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html',1,'openvdb::v3_2_0::io']]], + ['sumop',['SumOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SumOp.html',1,'openvdb::v3_2_0::tools::valxform']]], + ['swappedcombineop',['SwappedCombineOp',['../structopenvdb_1_1v3__2__0_1_1SwappedCombineOp.html',1,'openvdb::v3_2_0']]], + ['sweepexteriorsign',['SweepExteriorSign',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SweepExteriorSign.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['syncvoxelmask',['SyncVoxelMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SyncVoxelMask.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_13.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_13.html new file mode 100644 index 00000000..96fdac7c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_13.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_13.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_13.js new file mode 100644 index 00000000..e5d23b22 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_13.js @@ -0,0 +1,64 @@ +var searchData= +[ + ['tagseamedges',['TagSeamEdges',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TagSeamEdges.html',1,'openvdb::v3_2_0::tools::internal']]], + ['tempfile',['TempFile',['../classopenvdb_1_1v3__2__0_1_1io_1_1TempFile.html',1,'openvdb::v3_2_0::io']]], + ['testleafio',['TestLeafIO',['../classTestLeafIO.html',1,'']]], + ['thirteenpointstencil',['ThirteenPointStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1ThirteenPointStencil.html',1,'openvdb::v3_2_0::math']]], + ['tilesampler',['TileSampler',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TileSampler.html',1,'openvdb::v3_2_0::tools::internal']]], + ['tilesampler_3c_20pointsampler_2c_20treet_20_3e',['TileSampler< PointSampler, TreeT >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TileSampler_3_01PointSampler_00_01TreeT_01_4.html',1,'openvdb::v3_2_0::tools::internal']]], + ['tilesampler_3c_20staggeredpointsampler_2c_20treet_20_3e',['TileSampler< StaggeredPointSampler, TreeT >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TileSampler_3_01StaggeredPointSampler_00_01TreeT_01_4.html',1,'openvdb::v3_2_0::tools::internal']]], + ['timespan',['TimeSpan',['../structopenvdb_1_1v3__2__0_1_1math_1_1Ray_1_1TimeSpan.html',1,'openvdb::v3_2_0::math::Ray']]], + ['tolerance',['Tolerance',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1Tolerance.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['tolerance',['Tolerance',['../structopenvdb_1_1v3__2__0_1_1math_1_1Tolerance.html',1,'openvdb::v3_2_0::math']]], + ['tolerance_3c_20double_20_3e',['Tolerance< double >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Tolerance_3_01double_01_4.html',1,'openvdb::v3_2_0::math']]], + ['tolerance_3c_20float_20_3e',['Tolerance< float >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Tolerance_3_01float_01_4.html',1,'openvdb::v3_2_0::math']]], + ['tolerancepruneop',['TolerancePruneOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1TolerancePruneOp.html',1,'openvdb::v3_2_0::tools']]], + ['tomaskgrid',['ToMaskGrid',['../structopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1ToMaskGrid.html',1,'openvdb::v3_2_0::tools::gridop']]], + ['topologycopy',['TopologyCopy',['../classopenvdb_1_1v3__2__0_1_1TopologyCopy.html',1,'openvdb::v3_2_0']]], + ['topologycopy1',['TopologyCopy1',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy1.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['topologycopy2',['TopologyCopy2',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy2.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['topologydifference',['TopologyDifference',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyDifference.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['topologyintersection',['TopologyIntersection',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyIntersection.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['topologyunion',['TopologyUnion',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyUnion.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['transform',['Transform',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html',1,'openvdb::v3_2_0::math']]], + ['transformpoints',['TransformPoints',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1TransformPoints.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['transformvalues',['TransformValues',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1TransformValues.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['translationmap',['TranslationMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html',1,'openvdb::v3_2_0::math']]], + ['tree',['Tree',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html',1,'openvdb::v3_2_0::tree']]], + ['tree3',['Tree3',['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree3.html',1,'openvdb::v3_2_0::tree']]], + ['tree4',['Tree4',['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree4.html',1,'openvdb::v3_2_0::tree']]], + ['tree4_3c_20edgedata_2c_205_2c_204_2c_203_20_3e',['Tree4< EdgeData, 5, 4, 3 >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree4.html',1,'openvdb::v3_2_0::tree']]], + ['tree5',['Tree5',['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree5.html',1,'openvdb::v3_2_0::tree']]], + ['treeadapter',['TreeAdapter',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html',1,'openvdb::v3_2_0']]], + ['treeadapter_3c_20grid_3c_20_5ftreetype_20_3e_20_3e',['TreeAdapter< Grid< _TreeType > >',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['treeadapter_3c_20tree_3a_3avalueaccessor_3c_20_5ftreetype_20_3e_20_3e',['TreeAdapter< tree::ValueAccessor< _TreeType > >',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['treebase',['TreeBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits',['TreeIterTraits',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3aleafciter_20_3e',['TreeIterTraits< TreeT, typename TreeT::LeafCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1LeafCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3aleafiter_20_3e',['TreeIterTraits< TreeT, typename TreeT::LeafIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1LeafIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3anodeciter_20_3e',['TreeIterTraits< TreeT, typename TreeT::NodeCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1NodeCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3anodeiter_20_3e',['TreeIterTraits< TreeT, typename TreeT::NodeIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1NodeIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3arootnodetype_3a_3achildallciter_20_3e',['TreeIterTraits< TreeT, typename TreeT::RootNodeType::ChildAllCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1RootNodeType_1_1ChildAllCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3arootnodetype_3a_3achildalliter_20_3e',['TreeIterTraits< TreeT, typename TreeT::RootNodeType::ChildAllIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1RootNodeType_1_1ChildAllIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3arootnodetype_3a_3achildoffciter_20_3e',['TreeIterTraits< TreeT, typename TreeT::RootNodeType::ChildOffCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1RootNodeType_1_1ChildOffCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3arootnodetype_3a_3achildoffiter_20_3e',['TreeIterTraits< TreeT, typename TreeT::RootNodeType::ChildOffIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1RootNodeType_1_1ChildOffIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3arootnodetype_3a_3achildonciter_20_3e',['TreeIterTraits< TreeT, typename TreeT::RootNodeType::ChildOnCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1RootNodeType_1_1ChildOnCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3arootnodetype_3a_3achildoniter_20_3e',['TreeIterTraits< TreeT, typename TreeT::RootNodeType::ChildOnIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1RootNodeType_1_1ChildOnIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3avalueallciter_20_3e',['TreeIterTraits< TreeT, typename TreeT::ValueAllCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1ValueAllCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3avaluealliter_20_3e',['TreeIterTraits< TreeT, typename TreeT::ValueAllIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1ValueAllIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3avalueoffciter_20_3e',['TreeIterTraits< TreeT, typename TreeT::ValueOffCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1ValueOffCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3avalueoffiter_20_3e',['TreeIterTraits< TreeT, typename TreeT::ValueOffIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1ValueOffIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3avalueonciter_20_3e',['TreeIterTraits< TreeT, typename TreeT::ValueOnCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1ValueOnCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treeitertraits_3c_20treet_2c_20typename_20treet_3a_3avalueoniter_20_3e',['TreeIterTraits< TreeT, typename TreeT::ValueOnIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1ValueOnIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['treetraits',['TreeTraits',['../structopenvdb_1_1v3__2__0_1_1tree_1_1leafmgr_1_1TreeTraits.html',1,'openvdb::v3_2_0::tree::leafmgr']]], + ['treetraits_3c_20const_20treet_20_3e',['TreeTraits< const TreeT >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1leafmgr_1_1TreeTraits_3_01const_01TreeT_01_4.html',1,'openvdb::v3_2_0::tree::leafmgr']]], + ['treevalueiteratorbase',['TreeValueIteratorBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['tuple',['Tuple',['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html',1,'openvdb::v3_2_0::math']]], + ['tuple_3c_202_2c_20t_20_3e',['Tuple< 2, T >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html',1,'openvdb::v3_2_0::math']]], + ['tuple_3c_203_2c_20double_20_3e',['Tuple< 3, double >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html',1,'openvdb::v3_2_0::math']]], + ['tuple_3c_203_2c_20real_20_3e',['Tuple< 3, Real >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html',1,'openvdb::v3_2_0::math']]], + ['tuple_3c_203_2c_20t_20_3e',['Tuple< 3, T >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html',1,'openvdb::v3_2_0::math']]], + ['tuple_3c_204_2c_20t_20_3e',['Tuple< 4, T >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html',1,'openvdb::v3_2_0::math']]], + ['typedmetadata',['TypedMetadata',['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html',1,'openvdb::v3_2_0']]], + ['typeerror',['TypeError',['../classopenvdb_1_1v3__2__0_1_1TypeError.html',1,'openvdb::v3_2_0']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_14.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_14.html new file mode 100644 index 00000000..9f2772f4 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_14.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_14.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_14.js new file mode 100644 index 00000000..69b40a78 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_14.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['uniformpointscatter',['UniformPointScatter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1UniformPointScatter.html',1,'openvdb::v3_2_0::tools']]], + ['uniformprimbuilder',['UniformPrimBuilder',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UniformPrimBuilder.html',1,'openvdb::v3_2_0::tools::internal']]], + ['uniformscalemap',['UniformScaleMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html',1,'openvdb::v3_2_0::math']]], + ['uniformscaletranslatemap',['UniformScaleTranslateMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html',1,'openvdb::v3_2_0::math']]], + ['unionvaluemasks',['UnionValueMasks',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1UnionValueMasks.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['uniqueptr',['UniquePtr',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UniquePtr.html',1,'openvdb::v3_2_0::tools::internal']]], + ['uniqueptr_3c_20openvdb_3a_3avec3s_20_3e',['UniquePtr< openvdb::Vec3s >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UniquePtr.html',1,'openvdb::v3_2_0::tools::internal']]], + ['unitarymap',['UnitaryMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html',1,'openvdb::v3_2_0::math']]], + ['unknownmetadata',['UnknownMetadata',['../classopenvdb_1_1v3__2__0_1_1UnknownMetadata.html',1,'openvdb::v3_2_0']]], + ['updatemasks',['UpdateMasks',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1UpdateMasks.html',1,'openvdb::v3_2_0::tools::Morphology']]], + ['updatepoints',['UpdatePoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UpdatePoints.html',1,'openvdb::v3_2_0::tools::internal']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_15.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_15.html new file mode 100644 index 00000000..b3cbb444 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_15.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_15.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_15.js new file mode 100644 index 00000000..9d335af8 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_15.js @@ -0,0 +1,100 @@ +var searchData= +[ + ['validateintersectingvoxels',['ValidateIntersectingVoxels',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ValidateIntersectingVoxels.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['validpartitioningop',['ValidPartitioningOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1ValidPartitioningOp.html',1,'openvdb::v3_2_0::tools::point_index_grid_internal']]], + ['valueaccessor',['ValueAccessor',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor0',['ValueAccessor0',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor0_3c_20treetype_2c_20issafe_20_3e',['ValueAccessor0< TreeType, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor1',['ValueAccessor1',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor1_3c_20treetype_2c_20issafe_20_3e',['ValueAccessor1< TreeType, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor2',['ValueAccessor2',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor2_3c_20treetype_2c_20issafe_20_3e',['ValueAccessor2< TreeType, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor3',['ValueAccessor3',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor3_3c_20treetype_2c_20issafe_20_3e',['ValueAccessor3< TreeType, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20booltreetype_20_3e',['ValueAccessor< BoolTreeType >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20const_20booltreet_20_3e',['ValueAccessor< const BoolTreeT >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20const_20inputtreetype_20_3e',['ValueAccessor< const InputTreeType >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20const_20int16treet_20_3e',['ValueAccessor< const Int16TreeT >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20const_20inttreet_20_3e',['ValueAccessor< const IntTreeT >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20const_20treet_20_3e',['ValueAccessor< const TreeT >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20const_20treet_2c_20false_20_3e',['ValueAccessor< const TreeT, false >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20const_20treetype_20_3e',['ValueAccessor< const TreeType >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20const_20treetype_2c_20issafe_20_3e',['ValueAccessor< const TreeType, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20int16treet_20_3e',['ValueAccessor< Int16TreeT >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20int32treetype_20_3e',['ValueAccessor< Int32TreeType >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20inttreet_20_3e',['ValueAccessor< IntTreeT >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20treet_20_3e',['ValueAccessor< TreeT >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20treetype_20_3e',['ValueAccessor< TreeType >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20treetype_2c_20issafe_2c_200_2c_20tbb_3a_3anull_5fmutex_20_3e',['ValueAccessor< TreeType, IsSafe, 0, tbb::null_mutex >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_010_00_01tbb_1_1null__mutex_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20treetype_2c_20issafe_2c_201_2c_20tbb_3a_3anull_5fmutex_20_3e',['ValueAccessor< TreeType, IsSafe, 1, tbb::null_mutex >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_011_00_01tbb_1_1null__mutex_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20treetype_2c_20issafe_2c_202_2c_20tbb_3a_3anull_5fmutex_20_3e',['ValueAccessor< TreeType, IsSafe, 2, tbb::null_mutex >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_012_00_01tbb_1_1null__mutex_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20treetype_2c_20issafe_2c_203_2c_20tbb_3a_3anull_5fmutex_20_3e',['ValueAccessor< TreeType, IsSafe, 3, tbb::null_mutex >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_013_00_01tbb_1_1null__mutex_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20treetype_2c_20issafe_2c_20treetype_3a_3adepth_2d1_2c_20tbb_3a_3aspin_5fmutex_20_3e',['ValueAccessor< TreeType, IsSafe, TreeType::DEPTH-1, tbb::spin_mutex >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessor_3c_20uchartreetype_20_3e',['ValueAccessor< UCharTreeType >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase',['ValueAccessorBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20_5ftreetype_2c_20issafe_20_3e',['ValueAccessorBase< _TreeType, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20booltreetype_2c_20true_20_3e',['ValueAccessorBase< BoolTreeType, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20const_20booltreet_2c_20true_20_3e',['ValueAccessorBase< const BoolTreeT, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20const_20inputtreetype_2c_20true_20_3e',['ValueAccessorBase< const InputTreeType, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20const_20int16treet_2c_20true_20_3e',['ValueAccessorBase< const Int16TreeT, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20const_20inttreet_2c_20true_20_3e',['ValueAccessorBase< const IntTreeT, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20const_20treet_2c_20issafe_20_3e',['ValueAccessorBase< const TreeT, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20const_20treet_2c_20true_20_3e',['ValueAccessorBase< const TreeT, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20const_20treetype_2c_20issafe_20_3e',['ValueAccessorBase< const TreeType, IsSafe >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20const_20treetype_2c_20true_20_3e',['ValueAccessorBase< const TreeType, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20int16treet_2c_20true_20_3e',['ValueAccessorBase< Int16TreeT, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20int32treetype_2c_20true_20_3e',['ValueAccessorBase< Int32TreeType, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20inttreet_2c_20true_20_3e',['ValueAccessorBase< IntTreeT, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20treet_2c_20true_20_3e',['ValueAccessorBase< TreeT, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20treetype_2c_20true_20_3e',['ValueAccessorBase< TreeType, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorbase_3c_20uchartreetype_2c_20true_20_3e',['ValueAccessorBase< UCharTreeType, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html',1,'openvdb::v3_2_0::tree']]], + ['valueaccessorrw',['ValueAccessorRW',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorRW.html',1,'openvdb::v3_2_0::tree']]], + ['valueall',['ValueAll',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueAll.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['valueall',['ValueAll',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ValueAll.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['valuebuffer',['ValueBuffer',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ValueBuffer.html',1,'openvdb::v3_2_0::util::PagedArray']]], + ['valueconverter',['ValueConverter',['../structopenvdb_1_1v3__2__0_1_1Grid_1_1ValueConverter.html',1,'openvdb::v3_2_0::Grid']]], + ['valueconverter',['ValueConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ValueConverter.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['valueconverter',['ValueConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree_1_1ValueConverter.html',1,'openvdb::v3_2_0::tree::Tree']]], + ['valueconverter',['ValueConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueConverter.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['valueconverter',['ValueConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ValueConverter.html',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >']]], + ['valueconverter',['ValueConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ValueConverter.html',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >']]], + ['valueconverter',['ValueConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1RootNode_1_1ValueConverter.html',1,'openvdb::v3_2_0::tree::RootNode']]], + ['valueconverter_3c_20int32_20_3e',['ValueConverter< Int32 >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree_1_1ValueConverter.html',1,'openvdb::v3_2_0::tree::Tree']]], + ['valueerror',['ValueError',['../classopenvdb_1_1v3__2__0_1_1ValueError.html',1,'openvdb::v3_2_0']]], + ['valueiter',['ValueIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueIter.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['valueiter',['ValueIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ValueIter.html',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >']]], + ['valueiter',['ValueIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ValueIter.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['valueiter',['ValueIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ValueIter.html',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >']]], + ['valuemask',['ValueMask',['../classopenvdb_1_1v3__2__0_1_1ValueMask.html',1,'openvdb::v3_2_0']]], + ['valueoff',['ValueOff',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueOff.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['valueoff',['ValueOff',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ValueOff.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['valueon',['ValueOn',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueOn.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['valueon',['ValueOn',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ValueOn.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['vec2',['Vec2',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html',1,'openvdb::v3_2_0::math']]], + ['vec3',['Vec3',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html',1,'openvdb::v3_2_0::math']]], + ['vec3_3c_20double_20_3e',['Vec3< double >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html',1,'openvdb::v3_2_0::math']]], + ['vec3_3c_20real_20_3e',['Vec3< Real >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html',1,'openvdb::v3_2_0::math']]], + ['vec4',['Vec4',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html',1,'openvdb::v3_2_0::math']]], + ['vector',['Vector',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html',1,'openvdb::v3_2_0::math::pcg']]], + ['vector_3c_20valuetype_20_3e',['Vector< ValueType >',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html',1,'openvdb::v3_2_0::math::pcg']]], + ['vectortoscalarconverter',['VectorToScalarConverter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1VectorToScalarConverter.html',1,'openvdb::v3_2_0::tools']]], + ['vectraits',['VecTraits',['../structopenvdb_1_1v3__2__0_1_1VecTraits.html',1,'openvdb::v3_2_0']]], + ['vectraits_3c_20math_3a_3avec2_3c_20t_20_3e_20_3e',['VecTraits< math::Vec2< T > >',['../structopenvdb_1_1v3__2__0_1_1VecTraits_3_01math_1_1Vec2_3_01T_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['vectraits_3c_20math_3a_3avec3_3c_20t_20_3e_20_3e',['VecTraits< math::Vec3< T > >',['../structopenvdb_1_1v3__2__0_1_1VecTraits_3_01math_1_1Vec3_3_01T_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['vectraits_3c_20math_3a_3avec4_3c_20t_20_3e_20_3e',['VecTraits< math::Vec4< T > >',['../structopenvdb_1_1v3__2__0_1_1VecTraits_3_01math_1_1Vec4_3_01T_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['velocityintegrator',['VelocityIntegrator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocityIntegrator.html',1,'openvdb::v3_2_0::tools']]], + ['velocitysampler',['VelocitySampler',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocitySampler.html',1,'openvdb::v3_2_0::tools']]], + ['velocitysampler_3c_20gridt_2c_20staggered_2c_20sampleorder_20_3e',['VelocitySampler< GridT, Staggered, SampleOrder >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocitySampler.html',1,'openvdb::v3_2_0::tools']]], + ['versionid',['VersionId',['../structopenvdb_1_1v3__2__0_1_1VersionId.html',1,'openvdb::v3_2_0']]], + ['volumeadvection',['VolumeAdvection',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html',1,'openvdb::v3_2_0::tools']]], + ['volumehdda',['VolumeHDDA',['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA.html',1,'openvdb::v3_2_0::math']]], + ['volumehdda_3c_20openvdb_3a_3av3_5f2_5f0_3a_3atree_3a_3atree_2c_20raytype_2c_20nodelevel_20_3e',['VolumeHDDA< openvdb::v3_2_0::tree::Tree, RayType, NodeLevel >',['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA.html',1,'openvdb::v3_2_0::math']]], + ['volumehdda_3c_20treet_2c_20rayt_2c_200_20_3e',['VolumeHDDA< TreeT, RayT, 0 >',['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA_3_01TreeT_00_01RayT_00_010_01_4.html',1,'openvdb::v3_2_0::math']]], + ['volumerayintersector',['VolumeRayIntersector',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html',1,'openvdb::v3_2_0::tools']]], + ['volumerender',['VolumeRender',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html',1,'openvdb::v3_2_0::tools']]], + ['volumetomesh',['VolumeToMesh',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html',1,'openvdb::v3_2_0::tools']]], + ['voxelizationdata',['VoxelizationData',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['voxelizeactivetiles',['VoxelizeActiveTiles',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1VoxelizeActiveTiles.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['voxelizepolygons',['VoxelizePolygons',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizePolygons.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['voxelorderop',['VoxelOrderOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1VoxelOrderOp.html',1,'openvdb::v3_2_0::tools::point_partitioner_internal']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_16.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_16.html new file mode 100644 index 00000000..e43392fe --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_16.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_16.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_16.js new file mode 100644 index 00000000..2db017fd --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_16.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['wenostencil',['WenoStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html',1,'openvdb::v3_2_0::math']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_2.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_2.html new file mode 100644 index 00000000..003214bb --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_2.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_2.js new file mode 100644 index 00000000..6635f47a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_2.js @@ -0,0 +1,105 @@ +var searchData= +[ + ['cacheitem',['CacheItem',['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html',1,'openvdb::v3_2_0::tree']]], + ['cacheitem_3c_20treecachet_2c_20nodevect_2c_20true_20_3e',['CacheItem< TreeCacheT, NodeVecT, true >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['cacheitem_3c_20valueaccessor_2c_20subtreet_2c_20boost_3a_3ampl_3a_3asize_3c_20subtreet_20_3e_3a_3avalue_3d_3d1_20_3e',['CacheItem< ValueAccessor, SubtreeT, boost::mpl::size< SubtreeT >::value==1 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html',1,'openvdb::v3_2_0::tree']]], + ['canconverttype',['CanConvertType',['../structopenvdb_1_1v3__2__0_1_1CanConvertType.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20math_3a_3avec2_3c_20t_20_3e_2c_20math_3a_3avec2_3c_20t_20_3e_20_3e',['CanConvertType< math::Vec2< T >, math::Vec2< T > >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01math_1_1Vec2_3_01T_01_4_00_01math_1_1Vec2_3_01T_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20math_3a_3avec3_3c_20t_20_3e_2c_20math_3a_3avec3_3c_20t_20_3e_20_3e',['CanConvertType< math::Vec3< T >, math::Vec3< T > >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01math_1_1Vec3_3_01T_01_4_00_01math_1_1Vec3_3_01T_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20math_3a_3avec4_3c_20t_20_3e_2c_20math_3a_3avec4_3c_20t_20_3e_20_3e',['CanConvertType< math::Vec4< T >, math::Vec4< T > >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01math_1_1Vec4_3_01T_01_4_00_01math_1_1Vec4_3_01T_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20pointdataindex32_2c_20pointindex32_20_3e',['CanConvertType< PointDataIndex32, PointIndex32 >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01PointDataIndex32_00_01PointIndex32_01_4.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20pointindex32_2c_20pointdataindex32_20_3e',['CanConvertType< PointIndex32, PointDataIndex32 >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01PointIndex32_00_01PointDataIndex32_01_4.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20t_2c_20math_3a_3avec2_3c_20t_20_3e_20_3e',['CanConvertType< T, math::Vec2< T > >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T_00_01math_1_1Vec2_3_01T_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20t_2c_20math_3a_3avec3_3c_20t_20_3e_20_3e',['CanConvertType< T, math::Vec3< T > >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T_00_01math_1_1Vec3_3_01T_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20t_2c_20math_3a_3avec4_3c_20t_20_3e_20_3e',['CanConvertType< T, math::Vec4< T > >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T_00_01math_1_1Vec4_3_01T_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20t_2c_20valuemask_20_3e',['CanConvertType< T, ValueMask >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T_00_01ValueMask_01_4.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20t0_2c_20math_3a_3avec2_3c_20t1_20_3e_20_3e',['CanConvertType< T0, math::Vec2< T1 > >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T0_00_01math_1_1Vec2_3_01T1_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20t0_2c_20math_3a_3avec3_3c_20t1_20_3e_20_3e',['CanConvertType< T0, math::Vec3< T1 > >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T0_00_01math_1_1Vec3_3_01T1_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20t0_2c_20math_3a_3avec4_3c_20t1_20_3e_20_3e',['CanConvertType< T0, math::Vec4< T1 > >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T0_00_01math_1_1Vec4_3_01T1_01_4_01_4.html',1,'openvdb::v3_2_0']]], + ['canconverttype_3c_20valuemask_2c_20t_20_3e',['CanConvertType< ValueMask, T >',['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01ValueMask_00_01T_01_4.html',1,'openvdb::v3_2_0']]], + ['changebackgroundop',['ChangeBackgroundOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeBackgroundOp.html',1,'openvdb::v3_2_0::tools']]], + ['changelevelsetbackgroundop',['ChangeLevelSetBackgroundOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeLevelSetBackgroundOp.html',1,'openvdb::v3_2_0::tools']]], + ['checkdivergence',['CheckDivergence',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html',1,'openvdb::v3_2_0::tools']]], + ['checkeikonal',['CheckEikonal',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html',1,'openvdb::v3_2_0::tools']]], + ['checkfinite',['CheckFinite',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckFinite.html',1,'openvdb::v3_2_0::tools']]], + ['checkfogvolume',['CheckFogVolume',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html',1,'openvdb::v3_2_0::tools']]], + ['checkinf',['CheckInf',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckInf.html',1,'openvdb::v3_2_0::tools']]], + ['checklevelset',['CheckLevelSet',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html',1,'openvdb::v3_2_0::tools']]], + ['checkmagnitude',['CheckMagnitude',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMagnitude.html',1,'openvdb::v3_2_0::tools']]], + ['checkmax',['CheckMax',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMax.html',1,'openvdb::v3_2_0::tools']]], + ['checkmin',['CheckMin',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMin.html',1,'openvdb::v3_2_0::tools']]], + ['checknan',['CheckNan',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNan.html',1,'openvdb::v3_2_0::tools']]], + ['checknormgrad',['CheckNormGrad',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html',1,'openvdb::v3_2_0::tools']]], + ['checkrange',['CheckRange',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckRange.html',1,'openvdb::v3_2_0::tools']]], + ['childall',['ChildAll',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ChildAll.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['childall',['ChildAll',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ChildAll.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['childiter',['ChildIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ChildIter.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['childiter',['ChildIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ChildIter.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['childiter',['ChildIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ChildIter.html',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >']]], + ['childiter',['ChildIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ChildIter.html',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >']]], + ['childoff',['ChildOff',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ChildOff.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['childoff',['ChildOff',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ChildOff.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['childon',['ChildOn',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ChildOn.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['childon',['ChildOn',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ChildOn.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['closestpointdist',['ClosestPointDist',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1ClosestPointDist.html',1,'openvdb::v3_2_0::tools::internal']]], + ['closestpointprojector',['ClosestPointProjector',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestPointProjector.html',1,'openvdb::v3_2_0::tools']]], + ['closestsurfacepoint',['ClosestSurfacePoint',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestSurfacePoint.html',1,'openvdb::v3_2_0::tools']]], + ['combineargs',['CombineArgs',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html',1,'openvdb::v3_2_0']]], + ['combineleafnodes',['CombineLeafNodes',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1CombineLeafNodes.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['combineopadapter',['CombineOpAdapter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1CombineOpAdapter.html',1,'openvdb::v3_2_0::tree']]], + ['comp',['Comp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RemoveSelfIntersectingSurface_1_1Comp.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RemoveSelfIntersectingSurface']]], + ['compositefunctortranslator',['CompositeFunctorTranslator',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator.html',1,'openvdb::v3_2_0::tools::ds']]], + ['compositefunctortranslator_3c_20ds_5fadd_2c_20valuet_20_3e',['CompositeFunctorTranslator< DS_ADD, ValueT >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator_3_01DS__ADD_00_01ValueT_01_4.html',1,'openvdb::v3_2_0::tools::ds']]], + ['compositefunctortranslator_3c_20ds_5fmax_2c_20valuet_20_3e',['CompositeFunctorTranslator< DS_MAX, ValueT >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator_3_01DS__MAX_00_01ValueT_01_4.html',1,'openvdb::v3_2_0::tools::ds']]], + ['compositefunctortranslator_3c_20ds_5fmin_2c_20valuet_20_3e',['CompositeFunctorTranslator< DS_MIN, ValueT >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator_3_01DS__MIN_00_01ValueT_01_4.html',1,'openvdb::v3_2_0::tools::ds']]], + ['compositefunctortranslator_3c_20ds_5fmult_2c_20valuet_20_3e',['CompositeFunctorTranslator< DS_MULT, ValueT >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator_3_01DS__MULT_00_01ValueT_01_4.html',1,'openvdb::v3_2_0::tools::ds']]], + ['compositefunctortranslator_3c_20ds_5fover_2c_20valuet_20_3e',['CompositeFunctorTranslator< DS_OVER, ValueT >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator_3_01DS__OVER_00_01ValueT_01_4.html',1,'openvdb::v3_2_0::tools::ds']]], + ['compositefunctortranslator_3c_20ds_5fsub_2c_20valuet_20_3e',['CompositeFunctorTranslator< DS_SUB, ValueT >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator_3_01DS__SUB_00_01ValueT_01_4.html',1,'openvdb::v3_2_0::tools::ds']]], + ['compoundmap',['CompoundMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html',1,'openvdb::v3_2_0::math']]], + ['compreplaceop',['CompReplaceOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CompReplaceOp.html',1,'openvdb::v3_2_0::tools']]], + ['computeactivevoxelcount',['ComputeActiveVoxelCount',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ComputeActiveVoxelCount.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['computeextremas',['ComputeExtremas',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1ComputeExtremas.html',1,'openvdb::v3_2_0::tools::particle_atlas_internal']]], + ['computeintersectingvoxelsign',['ComputeIntersectingVoxelSign',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeIntersectingVoxelSign.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['computenodeconnectivity',['ComputeNodeConnectivity',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeNodeConnectivity.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['computepointorderop',['ComputePointOrderOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1ComputePointOrderOp.html',1,'openvdb::v3_2_0::tools::point_partitioner_internal']]], + ['connectnodemasksegments',['ConnectNodeMaskSegments',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ConnectNodeMaskSegments.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['constiterator',['ConstIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html',1,'openvdb::v3_2_0::util::PagedArray']]], + ['constrainedpointadvect',['ConstrainedPointAdvect',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html',1,'openvdb::v3_2_0::tools']]], + ['constrow',['ConstRow',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1ConstRow.html',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix']]], + ['constructvoxelmask',['ConstructVoxelMask',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ConstructVoxelMask.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['constvalueiter',['ConstValueIter',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1ConstValueIter.html',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix']]], + ['contiguousop',['ContiguousOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ContiguousOp.html',1,'openvdb::v3_2_0::tools']]], + ['convertgrid',['ConvertGrid',['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1ConvertGrid.html',1,'openvdb::v3_2_0::tools::clip_internal']]], + ['convertgrid_3c_20gridt_2c_20gridt_20_3e',['ConvertGrid< GridT, GridT >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1ConvertGrid_3_01GridT_00_01GridT_01_4.html',1,'openvdb::v3_2_0::tools::clip_internal']]], + ['coord',['Coord',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html',1,'openvdb::v3_2_0::math']]], + ['coordbbox',['CoordBBox',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html',1,'openvdb::v3_2_0::math']]], + ['copyableopapplier',['CopyableOpApplier',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpApplier.html',1,'openvdb::v3_2_0::tools::valxform']]], + ['copyableoptransformer',['CopyableOpTransformer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpTransformer.html',1,'openvdb::v3_2_0::tools::valxform']]], + ['copyconstness',['CopyConstness',['../structopenvdb_1_1v3__2__0_1_1tree_1_1CopyConstness.html',1,'openvdb::v3_2_0::tree']]], + ['copyconstness_3c_20const_20fromtype_2c_20totype_20_3e',['CopyConstness< const FromType, ToType >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1CopyConstness_3_01const_01FromType_00_01ToType_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['copyfromdense',['CopyFromDense',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyFromDense.html',1,'openvdb::v3_2_0::tools']]], + ['copyfromvecop',['CopyFromVecOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyFromVecOp.html',1,'openvdb::v3_2_0::tools::poisson::internal']]], + ['copyleafnodes',['CopyLeafNodes',['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1CopyLeafNodes.html',1,'openvdb::v3_2_0::tools::clip_internal']]], + ['copymasks',['CopyMasks',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1CopyMasks.html',1,'openvdb::v3_2_0::tools::Morphology']]], + ['copyop',['CopyOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1CopyOp.html',1,'openvdb::v3_2_0::math::pcg::internal']]], + ['copytodense',['CopyToDense',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyToDense.html',1,'openvdb::v3_2_0::tools']]], + ['copytovecop',['CopyToVecOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyToVecOp.html',1,'openvdb::v3_2_0::tools::poisson::internal']]], + ['countpoints',['CountPoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1CountPoints.html',1,'openvdb::v3_2_0::tools::internal']]], + ['countregions',['CountRegions',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1CountRegions.html',1,'openvdb::v3_2_0::tools::internal']]], + ['cpt',['Cpt',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Cpt.html',1,'openvdb::v3_2_0::tools']]], + ['cpt',['CPT',['../structopenvdb_1_1v3__2__0_1_1math_1_1CPT.html',1,'openvdb::v3_2_0::math']]], + ['cpt_5frange',['CPT_RANGE',['../structopenvdb_1_1v3__2__0_1_1math_1_1CPT__RANGE.html',1,'openvdb::v3_2_0::math']]], + ['cputimer',['CpuTimer',['../classopenvdb_1_1v3__2__0_1_1util_1_1CpuTimer.html',1,'openvdb::v3_2_0::util']]], + ['createorderedpointindexarrayop',['CreateOrderedPointIndexArrayOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1CreateOrderedPointIndexArrayOp.html',1,'openvdb::v3_2_0::tools::point_partitioner_internal']]], + ['csgdiffvisitor',['CsgDiffVisitor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgDiffVisitor.html',1,'openvdb::v3_2_0::tools']]], + ['csgintersectvisitor',['CsgIntersectVisitor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgIntersectVisitor.html',1,'openvdb::v3_2_0::tools']]], + ['csgunionvisitor',['CsgUnionVisitor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgUnionVisitor.html',1,'openvdb::v3_2_0::tools']]], + ['csgvisitorbase',['CsgVisitorBase',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CsgVisitorBase.html',1,'openvdb::v3_2_0::tools']]], + ['curl',['Curl',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Curl.html',1,'openvdb::v3_2_0::tools']]], + ['curl',['Curl',['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl.html',1,'openvdb::v3_2_0::math']]], + ['curl_3c_20uniformscalemap_2c_20cd_5f2nd_20_3e',['Curl< UniformScaleMap, CD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl_3_01UniformScaleMap_00_01CD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['curl_3c_20uniformscalemap_2c_20diffscheme_20_3e',['Curl< UniformScaleMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl_3_01UniformScaleMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['curl_3c_20uniformscaletranslatemap_2c_20cd_5f2nd_20_3e',['Curl< UniformScaleTranslateMap, CD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl_3_01UniformScaleTranslateMap_00_01CD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['curl_3c_20uniformscaletranslatemap_2c_20diffscheme_20_3e',['Curl< UniformScaleTranslateMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl_3_01UniformScaleTranslateMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['curvaturestencil',['CurvatureStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1CurvatureStencil.html',1,'openvdb::v3_2_0::math']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_3.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_3.html new file mode 100644 index 00000000..fadcfc83 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_3.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_3.js new file mode 100644 index 00000000..4d72ee92 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_3.js @@ -0,0 +1,84 @@ +var searchData= +[ + ['d1',['D1',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20bd_5f1st_20_3e',['D1< BD_1ST >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__1ST_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20bd_5f2nd_20_3e',['D1< BD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20bd_5f3rd_20_3e',['D1< BD_3RD >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__3RD_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20bd_5fhjweno5_20_3e',['D1< BD_HJWENO5 >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__HJWENO5_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20bd_5fweno5_20_3e',['D1< BD_WENO5 >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__WENO5_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20cd_5f2nd_20_3e',['D1< CD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20cd_5f2ndt_20_3e',['D1< CD_2NDT >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2NDT_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20cd_5f4th_20_3e',['D1< CD_4TH >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__4TH_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20cd_5f6th_20_3e',['D1< CD_6TH >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__6TH_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20fd_5f1st_20_3e',['D1< FD_1ST >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__1ST_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20fd_5f2nd_20_3e',['D1< FD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20fd_5f3rd_20_3e',['D1< FD_3RD >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__3RD_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20fd_5fhjweno5_20_3e',['D1< FD_HJWENO5 >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__HJWENO5_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1_3c_20fd_5fweno5_20_3e',['D1< FD_WENO5 >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__WENO5_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1vec',['D1Vec',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec.html',1,'openvdb::v3_2_0::math']]], + ['d1vec_3c_20cd_5f2nd_20_3e',['D1Vec< CD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1vec_3c_20cd_5f2ndt_20_3e',['D1Vec< CD_2NDT >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2NDT_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1vec_3c_20cd_5f4th_20_3e',['D1Vec< CD_4TH >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__4TH_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d1vec_3c_20cd_5f6th_20_3e',['D1Vec< CD_6TH >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__6TH_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d2',['D2',['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html',1,'openvdb::v3_2_0::math']]], + ['d2_3c_20cd_5ffourth_20_3e',['D2< CD_FOURTH >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d2_3c_20cd_5fsecond_20_3e',['D2< CD_SECOND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['d2_3c_20cd_5fsixth_20_3e',['D2< CD_SIXTH >',['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html',1,'openvdb::v3_2_0::math']]], + ['dda',['DDA',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html',1,'openvdb::v3_2_0::math']]], + ['dda_3c_20rayt_2c_20leaft_3a_3atotal_20_3e',['DDA< RayT, LeafT::TOTAL >',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html',1,'openvdb::v3_2_0::math']]], + ['dda_3c_20rayt_2c_20nodet_3a_3atotal_20_3e',['DDA< RayT, NodeT::TOTAL >',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html',1,'openvdb::v3_2_0::math']]], + ['dda_3c_20raytype_2c_20nodet_3a_3atotal_20_3e',['DDA< RayType, NodeT::TOTAL >',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html',1,'openvdb::v3_2_0::math']]], + ['deallocateleafnodes',['DeallocateLeafNodes',['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree_1_1DeallocateLeafNodes.html',1,'openvdb::v3_2_0::tree::Tree']]], + ['deepcopy',['DeepCopy',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DeepCopy.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['delta',['Delta',['../structopenvdb_1_1v3__2__0_1_1math_1_1Delta.html',1,'openvdb::v3_2_0::math']]], + ['delta_3c_20double_20_3e',['Delta< double >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Delta_3_01double_01_4.html',1,'openvdb::v3_2_0::math']]], + ['delta_3c_20float_20_3e',['Delta< float >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Delta_3_01float_01_4.html',1,'openvdb::v3_2_0::math']]], + ['dense',['Dense',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html',1,'openvdb::v3_2_0::tools']]], + ['densebase',['DenseBase',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase.html',1,'openvdb::v3_2_0::tools']]], + ['densebase_3c_20valuet_2c_20layoutxyz_20_3e',['DenseBase< ValueT, LayoutXYZ >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutXYZ_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['densebase_3c_20valuet_2c_20layoutzyx_20_3e',['DenseBase< ValueT, LayoutZYX >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutZYX_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['denseiter',['DenseIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DenseIter.html',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['denseiter',['DenseIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1DenseIter.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['denseiter',['DenseIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1DenseIter.html',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >']]], + ['denseiter',['DenseIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1DenseIter.html',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >']]], + ['denseiterator',['DenseIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1DenseIterator.html',1,'openvdb::v3_2_0::util::RootNodeMask']]], + ['denseiteratorbase',['DenseIteratorBase',['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['denseiteratorbase_3c_20maskdenseiter_2c_20denseiter_3c_20nodet_2c_20valuet_20_3e_2c_20nodet_2c_20void_2c_20valuet_20_3e',['DenseIteratorBase< MaskDenseIter, DenseIter< NodeT, ValueT >, NodeT, void, ValueT >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['denseiteratorbase_3c_20maskdenseiterator_2c_20denseiter_3c_20nodet_2c_20childt_2c_20valuet_2c_20tagt_20_3e_2c_20nodet_2c_20childt_2c_20valuet_20_3e',['DenseIteratorBase< MaskDenseIterator, DenseIter< NodeT, ChildT, ValueT, TagT >, NodeT, ChildT, ValueT >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['denseiteratorbase_3c_20maskdenseiterator_2c_20denseiter_3c_20nodet_2c_20valuet_2c_20tagt_20_3e_2c_20nodet_2c_20void_2c_20valuet_20_3e',['DenseIteratorBase< MaskDenseIterator, DenseIter< NodeT, ValueT, TagT >, NodeT, void, ValueT >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['densemaskiterator',['DenseMaskIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1DenseMaskIterator.html',1,'openvdb::v3_2_0::util']]], + ['densestencil',['DenseStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1DenseStencil.html',1,'openvdb::v3_2_0::math']]], + ['densetransformer',['DenseTransformer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseTransformer.html',1,'openvdb::v3_2_0::tools']]], + ['denseuniformpointscatter',['DenseUniformPointScatter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseUniformPointScatter.html',1,'openvdb::v3_2_0::tools']]], + ['deterministicdotproductop',['DeterministicDotProductOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1DeterministicDotProductOp.html',1,'openvdb::v3_2_0::math::pcg::Vector']]], + ['diagnose',['Diagnose',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Diagnose.html',1,'openvdb::v3_2_0::tools']]], + ['diagnose_3c_20gridtype_20_3e',['Diagnose< GridType >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Diagnose.html',1,'openvdb::v3_2_0::tools']]], + ['diffleafnodemask',['DiffLeafNodeMask',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1DiffLeafNodeMask.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['diffuseshader',['DiffuseShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiffuseShader.html',1,'openvdb::v3_2_0::tools']]], + ['diffuseshader_3c_20film_3a_3argba_2c_20samplertype_20_3e',['DiffuseShader< Film::RGBA, SamplerType >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiffuseShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['dilationop',['DilationOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DilationOp.html',1,'openvdb::v3_2_0::tools']]], + ['dimtoword',['DimToWord',['../structopenvdb_1_1v3__2__0_1_1tools_1_1DimToWord.html',1,'openvdb::v3_2_0::tools']]], + ['dimtoword_3c_203_20_3e',['DimToWord< 3 >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1DimToWord_3_013_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['dimtoword_3c_204_20_3e',['DimToWord< 4 >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1DimToWord_3_014_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['dimtoword_3c_205_20_3e',['DimToWord< 5 >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1DimToWord_3_015_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['dimtoword_3c_206_20_3e',['DimToWord< 6 >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1DimToWord_3_016_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['dimtoword_3c_20leaf_5flog2dim_20_3e',['DimToWord< LEAF_LOG2DIM >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1DimToWord.html',1,'openvdb::v3_2_0::tools']]], + ['diracdelta',['DiracDelta',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiracDelta.html',1,'openvdb::v3_2_0::tools']]], + ['dirichletop',['DirichletOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1DirichletOp.html',1,'openvdb::v3_2_0::tools::poisson::internal']]], + ['discretefield',['DiscreteField',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiscreteField.html',1,'openvdb::v3_2_0::tools']]], + ['divergence',['Divergence',['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence.html',1,'openvdb::v3_2_0::math']]], + ['divergence',['Divergence',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Divergence.html',1,'openvdb::v3_2_0::tools']]], + ['divergence_3c_20scalemap_2c_20cd_5f2nd_20_3e',['Divergence< ScaleMap, CD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01ScaleMap_00_01CD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['divergence_3c_20scalemap_2c_20diffscheme_20_3e',['Divergence< ScaleMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01ScaleMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['divergence_3c_20scaletranslatemap_2c_20cd_5f2nd_20_3e',['Divergence< ScaleTranslateMap, CD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01ScaleTranslateMap_00_01CD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['divergence_3c_20scaletranslatemap_2c_20diffscheme_20_3e',['Divergence< ScaleTranslateMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01ScaleTranslateMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['divergence_3c_20translationmap_2c_20diffscheme_20_3e',['Divergence< TranslationMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01TranslationMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['divergence_3c_20uniformscalemap_2c_20cd_5f2nd_20_3e',['Divergence< UniformScaleMap, CD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01UniformScaleMap_00_01CD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['divergence_3c_20uniformscalemap_2c_20diffscheme_20_3e',['Divergence< UniformScaleMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01UniformScaleMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['divergence_3c_20uniformscaletranslatemap_2c_20cd_5f2nd_20_3e',['Divergence< UniformScaleTranslateMap, CD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01UniformScaleTranslateMap_00_01CD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['divergence_3c_20uniformscaletranslatemap_2c_20diffscheme_20_3e',['Divergence< UniformScaleTranslateMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01UniformScaleTranslateMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['dsconverter',['DSConverter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1DSConverter.html',1,'openvdb::v3_2_0::tools']]], + ['dualgridsampler',['DualGridSampler',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler.html',1,'openvdb::v3_2_0::tools']]], + ['dualgridsampler_3c_20acct_2c_20samplert_20_3e',['DualGridSampler< AccT, SamplerT >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler.html',1,'openvdb::v3_2_0::tools']]], + ['dualgridsampler_3c_20tree_3a_3avalueaccessor_3c_20treet_20_3e_2c_20samplert_20_3e',['DualGridSampler< tree::ValueAccessor< TreeT >, SamplerT >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerT_01_4.html',1,'openvdb::v3_2_0::tools']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_4.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_4.html new file mode 100644 index 00000000..6056b203 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_4.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_4.js new file mode 100644 index 00000000..5c8f8f8e --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_4.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['edgedata',['EdgeData',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData']]], + ['enrightfield',['EnrightField',['../classopenvdb_1_1v3__2__0_1_1tools_1_1EnrightField.html',1,'openvdb::v3_2_0::tools']]], + ['erodevoxelsop',['ErodeVoxelsOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1ErodeVoxelsOp.html',1,'openvdb::v3_2_0::tools::Morphology']]], + ['exception',['Exception',['../classopenvdb_1_1v3__2__0_1_1Exception.html',1,'openvdb::v3_2_0']]], + ['expandleafnoderegion',['ExpandLeafNodeRegion',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandLeafNodeRegion.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['expandnarrowband',['ExpandNarrowband',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['expandnarrowbandmask',['ExpandNarrowbandMask',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandNarrowbandMask.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['extractall',['ExtractAll',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ExtractAll.html',1,'openvdb::v3_2_0::tools']]], + ['extrema',['Extrema',['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html',1,'openvdb::v3_2_0::math']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_5.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_5.html new file mode 100644 index 00000000..ca7c947c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_5.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_5.js new file mode 100644 index 00000000..9852a3c5 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_5.js @@ -0,0 +1,28 @@ +var searchData= +[ + ['file',['File',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html',1,'openvdb::v3_2_0::io']]], + ['fileinfo',['FileInfo',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1FileInfo.html',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['fill',['Fill',['../structopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Fill.html',1,'openvdb::v3_2_0::util::PagedArray']]], + ['fillarray',['FillArray',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1FillArray.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['fillleafnodevoxels',['FillLeafNodeVoxels',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillLeafNodeVoxels.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['fillmaskboundary',['FillMaskBoundary',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillMaskBoundary.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['fillop',['FillOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1FillOp.html',1,'openvdb::v3_2_0::math::pcg::internal']]], + ['film',['Film',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Film.html',1,'openvdb::v3_2_0::tools']]], + ['filter',['Filter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html',1,'openvdb::v3_2_0::tools']]], + ['filtertype',['FilterType',['../interfaceFilterType.html',1,'']]], + ['findminmaxvoxelvalue',['FindMinMaxVoxelValue',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__fracture__internal_1_1FindMinMaxVoxelValue.html',1,'openvdb::v3_2_0::tools::level_set_fracture_internal']]], + ['findmintilevalue',['FindMinTileValue',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinTileValue.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['findminvoxelvalue',['FindMinVoxelValue',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinVoxelValue.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['flagusedpoints',['FlagUsedPoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1FlagUsedPoints.html',1,'openvdb::v3_2_0::tools::internal']]], + ['flipregionsign',['FlipRegionSign',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FlipRegionSign.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['floodfillsign',['FloodFillSign',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FloodFillSign.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['formattedint',['FormattedInt',['../classopenvdb_1_1v3__2__0_1_1util_1_1FormattedInt.html',1,'openvdb::v3_2_0::util']]], + ['fourthorderdensestencil',['FourthOrderDenseStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1FourthOrderDenseStencil.html',1,'openvdb::v3_2_0::math']]], + ['fragment',['Fragment',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband_1_1Fragment.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband']]], + ['functor',['Functor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Gradient_1_1Functor.html',1,'openvdb::v3_2_0::tools::Gradient']]], + ['functor',['Functor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Divergence_1_1Functor.html',1,'openvdb::v3_2_0::tools::Divergence']]], + ['functor',['Functor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian_1_1Functor.html',1,'openvdb::v3_2_0::tools::Laplacian']]], + ['functor',['Functor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature_1_1Functor.html',1,'openvdb::v3_2_0::tools::MeanCurvature']]], + ['functor',['Functor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude_1_1Functor.html',1,'openvdb::v3_2_0::tools::Magnitude']]], + ['functor',['Functor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Normalize_1_1Functor.html',1,'openvdb::v3_2_0::tools::Normalize']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_6.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_6.html new file mode 100644 index 00000000..eb8935e3 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_6.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_6.js new file mode 100644 index 00000000..1116f6b5 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_6.js @@ -0,0 +1,41 @@ +var searchData= +[ + ['genboundarymask',['GenBoundaryMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenBoundaryMask.html',1,'openvdb::v3_2_0::tools::internal']]], + ['genedgedata',['GenEdgeData',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1GenEdgeData.html',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData']]], + ['genericmap',['GenericMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html',1,'openvdb::v3_2_0::math']]], + ['genpoints',['GenPoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPoints.html',1,'openvdb::v3_2_0::tools::internal']]], + ['genpolygons',['GenPolygons',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPolygons.html',1,'openvdb::v3_2_0::tools::internal']]], + ['genseammask',['GenSeamMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenSeamMask.html',1,'openvdb::v3_2_0::tools::internal']]], + ['gentilemask',['GenTileMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTileMask.html',1,'openvdb::v3_2_0::tools::internal']]], + ['gentopologymask',['GenTopologyMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTopologyMask.html',1,'openvdb::v3_2_0::tools::internal']]], + ['getval',['GetVal',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1GetVal.html',1,'openvdb::v3_2_0::tools::stats_internal']]], + ['getvalimpl',['GetValImpl',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1GetValImpl.html',1,'openvdb::v3_2_0::tools::stats_internal']]], + ['getvalimpl_3c_20t_2c_20false_20_3e',['GetValImpl< T, false >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1GetValImpl_3_01T_00_01false_01_4.html',1,'openvdb::v3_2_0::tools::stats_internal']]], + ['getvalimpl_3c_20t_2c_20true_20_3e',['GetValImpl< T, true >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1GetValImpl_3_01T_00_01true_01_4.html',1,'openvdb::v3_2_0::tools::stats_internal']]], + ['gradient',['Gradient',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Gradient.html',1,'openvdb::v3_2_0::tools']]], + ['gradient',['Gradient',['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient.html',1,'openvdb::v3_2_0::math']]], + ['gradient_3c_20scalemap_2c_20cd_5f2nd_20_3e',['Gradient< ScaleMap, CD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01ScaleMap_00_01CD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['gradient_3c_20scaletranslatemap_2c_20cd_5f2nd_20_3e',['Gradient< ScaleTranslateMap, CD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01ScaleTranslateMap_00_01CD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['gradient_3c_20translationmap_2c_20diffscheme_20_3e',['Gradient< TranslationMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01TranslationMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['gradient_3c_20uniformscalemap_2c_20cd_5f2nd_20_3e',['Gradient< UniformScaleMap, CD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01UniformScaleMap_00_01CD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['gradient_3c_20uniformscaletranslatemap_2c_20cd_5f2nd_20_3e',['Gradient< UniformScaleTranslateMap, CD_2ND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01UniformScaleTranslateMap_00_01CD__2ND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['gradientbiased',['GradientBiased',['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientBiased.html',1,'openvdb::v3_2_0::math']]], + ['gradientnormsqrd',['GradientNormSqrd',['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientNormSqrd.html',1,'openvdb::v3_2_0::math']]], + ['gradientnormsqrd_3c_20uniformscalemap_2c_20gradscheme_20_3e',['GradientNormSqrd< UniformScaleMap, GradScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientNormSqrd_3_01UniformScaleMap_00_01GradScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['gradientnormsqrd_3c_20uniformscaletranslatemap_2c_20gradscheme_20_3e',['GradientNormSqrd< UniformScaleTranslateMap, GradScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientNormSqrd_3_01UniformScaleTranslateMap_00_01GradScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['gradstencil',['GradStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html',1,'openvdb::v3_2_0::math']]], + ['greatercount',['GreaterCount',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GreaterCount.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['grid',['Grid',['../classopenvdb_1_1v3__2__0_1_1Grid.html',1,'openvdb::v3_2_0']]], + ['gridbase',['GridBase',['../classopenvdb_1_1v3__2__0_1_1GridBase.html',1,'openvdb::v3_2_0']]], + ['griddescriptor',['GridDescriptor',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html',1,'openvdb::v3_2_0::io']]], + ['gridnamepred',['GridNamePred',['../structopenvdb_1_1v3__2__0_1_1GridNamePred.html',1,'openvdb::v3_2_0']]], + ['gridoperator',['GridOperator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html',1,'openvdb::v3_2_0::tools::gridop']]], + ['gridortreeconstructor',['GridOrTreeConstructor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['gridortreeconstructor',['GridOrTreeConstructor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1GridOrTreeConstructor.html',1,'openvdb::v3_2_0::tools::composite']]], + ['gridortreeconstructor_3c_20grid_3c_20treetype_20_3e_20_3e',['GridOrTreeConstructor< Grid< TreeType > >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['gridortreeconstructor_3c_20grid_3c_20treetype_20_3e_20_3e',['GridOrTreeConstructor< Grid< TreeType > >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html',1,'openvdb::v3_2_0::tools::composite']]], + ['gridresampler',['GridResampler',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html',1,'openvdb::v3_2_0::tools']]], + ['gridsampler',['GridSampler',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html',1,'openvdb::v3_2_0::tools']]], + ['gridsampler_3c_20tree_3a_3avalueaccessor_3c_20treet_20_3e_2c_20samplertype_20_3e',['GridSampler< tree::ValueAccessor< TreeT >, SamplerType >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['gridtransformer',['GridTransformer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer.html',1,'openvdb::v3_2_0::tools']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_7.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_7.html new file mode 100644 index 00000000..1068c77f --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_7.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_7.js new file mode 100644 index 00000000..e3cb9d2a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_7.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['halfreader',['HalfReader',['../structopenvdb_1_1v3__2__0_1_1io_1_1HalfReader.html',1,'openvdb::v3_2_0::io']]], + ['halfreader_3c_20false_2c_20t_20_3e',['HalfReader< false, T >',['../structopenvdb_1_1v3__2__0_1_1io_1_1HalfReader_3_01false_00_01T_01_4.html',1,'openvdb::v3_2_0::io']]], + ['halfreader_3c_20true_2c_20t_20_3e',['HalfReader< true, T >',['../structopenvdb_1_1v3__2__0_1_1io_1_1HalfReader_3_01true_00_01T_01_4.html',1,'openvdb::v3_2_0::io']]], + ['halfwriter',['HalfWriter',['../structopenvdb_1_1v3__2__0_1_1io_1_1HalfWriter.html',1,'openvdb::v3_2_0::io']]], + ['halfwriter_3c_20false_2c_20t_20_3e',['HalfWriter< false, T >',['../structopenvdb_1_1v3__2__0_1_1io_1_1HalfWriter_3_01false_00_01T_01_4.html',1,'openvdb::v3_2_0::io']]], + ['halfwriter_3c_20true_2c_20t_20_3e',['HalfWriter< true, T >',['../structopenvdb_1_1v3__2__0_1_1io_1_1HalfWriter_3_01true_00_01T_01_4.html',1,'openvdb::v3_2_0::io']]], + ['histogram',['Histogram',['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html',1,'openvdb::v3_2_0::math']]], + ['histop',['HistOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1HistOp.html',1,'openvdb::v3_2_0::tools::stats_internal']]], + ['homogeneousmatmul',['HomogeneousMatMul',['../structopenvdb_1_1v3__2__0_1_1tools_1_1HomogeneousMatMul.html',1,'openvdb::v3_2_0::tools']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_8.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_8.html new file mode 100644 index 00000000..9a52b63b --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_8.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_8.js new file mode 100644 index 00000000..329623c7 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_8.js @@ -0,0 +1,93 @@ +var searchData= +[ + ['illegalvalueexception',['IllegalValueException',['../classopenvdb_1_1v3__2__0_1_1IllegalValueException.html',1,'openvdb::v3_2_0']]], + ['inactivatevalues',['InactivateValues',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1InactivateValues.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['inactivepruneop',['InactivePruneOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1InactivePruneOp.html',1,'openvdb::v3_2_0::tools']]], + ['inactivetilevalues',['InactiveTileValues',['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveTileValues.html',1,'openvdb::v3_2_0::tools::diagnostics_internal']]], + ['inactivevoxelvalues',['InactiveVoxelValues',['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveVoxelValues.html',1,'openvdb::v3_2_0::tools::diagnostics_internal']]], + ['incompletecholeskypreconditioner',['IncompleteCholeskyPreconditioner',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html',1,'openvdb::v3_2_0::math::pcg']]], + ['indexerror',['IndexError',['../classopenvdb_1_1v3__2__0_1_1IndexError.html',1,'openvdb::v3_2_0']]], + ['indexiterator',['IndexIterator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html',1,'openvdb::v3_2_0::tools::PointPartitioner']]], + ['infnormop',['InfNormOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1InfNormOp.html',1,'openvdb::v3_2_0::math::pcg::Vector']]], + ['internalnode',['InternalNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html',1,'openvdb::v3_2_0::tree']]], + ['invertedtree',['InvertedTree',['../structopenvdb_1_1v3__2__0_1_1tree_1_1iter_1_1InvertedTree.html',1,'openvdb::v3_2_0::tree::iter']]], + ['invertedtree_3c_20headt_2c_201_20_3e',['InvertedTree< HeadT, 1 >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1iter_1_1InvertedTree_3_01HeadT_00_011_01_4.html',1,'openvdb::v3_2_0::tree::iter']]], + ['ioerror',['IoError',['../classopenvdb_1_1v3__2__0_1_1IoError.html',1,'openvdb::v3_2_0']]], + ['is_5fdiagonal_5fjacobian',['is_diagonal_jacobian',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__diagonal__jacobian.html',1,'openvdb::v3_2_0::math']]], + ['is_5fdouble',['is_double',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__double.html',1,'openvdb::v3_2_0::math']]], + ['is_5fdouble_3c_20double_20_3e',['is_double< double >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__double_3_01double_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5flinear',['is_linear',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear.html',1,'openvdb::v3_2_0::math']]], + ['is_5flinear_3c_20affinemap_20_3e',['is_linear< AffineMap >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01AffineMap_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5flinear_3c_20compoundmap_3c_20t1_2c_20t2_20_3e_20_3e',['is_linear< CompoundMap< T1, T2 > >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01CompoundMap_3_01T1_00_01T2_01_4_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5flinear_3c_20scalemap_20_3e',['is_linear< ScaleMap >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01ScaleMap_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5flinear_3c_20scaletranslatemap_20_3e',['is_linear< ScaleTranslateMap >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01ScaleTranslateMap_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5flinear_3c_20translationmap_20_3e',['is_linear< TranslationMap >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01TranslationMap_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5flinear_3c_20uniformscalemap_20_3e',['is_linear< UniformScaleMap >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01UniformScaleMap_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5flinear_3c_20uniformscaletranslatemap_20_3e',['is_linear< UniformScaleTranslateMap >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01UniformScaleTranslateMap_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5flinear_3c_20unitarymap_20_3e',['is_linear< UnitaryMap >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01UnitaryMap_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5fscale',['is_scale',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__scale.html',1,'openvdb::v3_2_0::math']]], + ['is_5fscale_3c_20scalemap_20_3e',['is_scale< ScaleMap >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__scale_3_01ScaleMap_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5fscale_5ftranslate',['is_scale_translate',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__scale__translate.html',1,'openvdb::v3_2_0::math']]], + ['is_5fscale_5ftranslate_3c_20scaletranslatemap_20_3e',['is_scale_translate< ScaleTranslateMap >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__scale__translate_3_01ScaleTranslateMap_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5funiform_5fdiagonal_5fjacobian',['is_uniform_diagonal_jacobian',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__uniform__diagonal__jacobian.html',1,'openvdb::v3_2_0::math']]], + ['is_5funiform_5fscale',['is_uniform_scale',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__uniform__scale.html',1,'openvdb::v3_2_0::math']]], + ['is_5funiform_5fscale_3c_20uniformscalemap_20_3e',['is_uniform_scale< UniformScaleMap >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__uniform__scale_3_01UniformScaleMap_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5funiform_5fscale_5ftranslate',['is_uniform_scale_translate',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__uniform__scale__translate.html',1,'openvdb::v3_2_0::math']]], + ['is_5funiform_5fscale_5ftranslate_3c_20translationmap_20_3e',['is_uniform_scale_translate< TranslationMap >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__uniform__scale__translate_3_01TranslationMap_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5funiform_5fscale_5ftranslate_3c_20uniformscaletranslatemap_20_3e',['is_uniform_scale_translate< UniformScaleTranslateMap >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__uniform__scale__translate_3_01UniformScaleTranslateMap_01_4.html',1,'openvdb::v3_2_0::math']]], + ['is_5fvec3d',['is_vec3d',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__vec3d.html',1,'openvdb::v3_2_0::math']]], + ['is_5fvec3d_3c_20vec3d_20_3e',['is_vec3d< Vec3d >',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__vec3d_3_01Vec3d_01_4.html',1,'openvdb::v3_2_0::math']]], + ['iscurl',['ISCurl',['../structopenvdb_1_1v3__2__0_1_1math_1_1ISCurl.html',1,'openvdb::v3_2_0::math']]], + ['isdivergence',['ISDivergence',['../structopenvdb_1_1v3__2__0_1_1math_1_1ISDivergence.html',1,'openvdb::v3_2_0::math']]], + ['isfiniteop',['IsFiniteOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1IsFiniteOp.html',1,'openvdb::v3_2_0::math::pcg::Vector']]], + ['isfiniteop',['IsFiniteOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1IsFiniteOp.html',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix']]], + ['isgradient',['ISGradient',['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradient.html',1,'openvdb::v3_2_0::math']]], + ['isgradientbiased',['ISGradientBiased',['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradientBiased.html',1,'openvdb::v3_2_0::math']]], + ['isgradientnormsqrd',['ISGradientNormSqrd',['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradientNormSqrd.html',1,'openvdb::v3_2_0::math']]], + ['islaplacian',['ISLaplacian',['../structopenvdb_1_1v3__2__0_1_1math_1_1ISLaplacian.html',1,'openvdb::v3_2_0::math']]], + ['islaplacian_3c_20cd_5ffourth_20_3e',['ISLaplacian< CD_FOURTH >',['../structopenvdb_1_1v3__2__0_1_1math_1_1ISLaplacian_3_01CD__FOURTH_01_4.html',1,'openvdb::v3_2_0::math']]], + ['islaplacian_3c_20cd_5fsecond_20_3e',['ISLaplacian< CD_SECOND >',['../structopenvdb_1_1v3__2__0_1_1math_1_1ISLaplacian_3_01CD__SECOND_01_4.html',1,'openvdb::v3_2_0::math']]], + ['islaplacian_3c_20cd_5fsixth_20_3e',['ISLaplacian< CD_SIXTH >',['../structopenvdb_1_1v3__2__0_1_1math_1_1ISLaplacian_3_01CD__SIXTH_01_4.html',1,'openvdb::v3_2_0::math']]], + ['islaplacianop',['ISLaplacianOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1ISLaplacianOp.html',1,'openvdb::v3_2_0::tools::poisson::internal']]], + ['ismeancurvature',['ISMeanCurvature',['../structopenvdb_1_1v3__2__0_1_1math_1_1ISMeanCurvature.html',1,'openvdb::v3_2_0::math']]], + ['isnegative',['IsNegative',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ValidateIntersectingVoxels_1_1IsNegative.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ValidateIntersectingVoxels']]], + ['isopmagnitude',['ISOpMagnitude',['../structopenvdb_1_1v3__2__0_1_1math_1_1ISOpMagnitude.html',1,'openvdb::v3_2_0::math']]], + ['isstencil',['ISStencil',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01SECOND__BIAS_01_4_1_1ISStencil.html',1,'openvdb::v3_2_0::math::BIAS_SCHEME< SECOND_BIAS >']]], + ['isstencil',['ISStencil',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_1_1ISStencil.html',1,'openvdb::v3_2_0::math::BIAS_SCHEME']]], + ['isstencil',['ISStencil',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01FIRST__BIAS_01_4_1_1ISStencil.html',1,'openvdb::v3_2_0::math::BIAS_SCHEME< FIRST_BIAS >']]], + ['isstencil',['ISStencil',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01THIRD__BIAS_01_4_1_1ISStencil.html',1,'openvdb::v3_2_0::math::BIAS_SCHEME< THIRD_BIAS >']]], + ['isstencil',['ISStencil',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01WENO5__BIAS_01_4_1_1ISStencil.html',1,'openvdb::v3_2_0::math::BIAS_SCHEME< WENO5_BIAS >']]], + ['isstencil',['ISStencil',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01HJWENO5__BIAS_01_4_1_1ISStencil.html',1,'openvdb::v3_2_0::math::BIAS_SCHEME< HJWENO5_BIAS >']]], + ['iterator',['Iterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html',1,'openvdb::v3_2_0::util::PagedArray']]], + ['iterator',['Iterator',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox_1_1Iterator.html',1,'openvdb::v3_2_0::math::CoordBBox']]], + ['iterator',['Iterator',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html',1,'openvdb::v3_2_0::tree::NodeList::NodeRange']]], + ['iterator',['Iterator',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html',1,'openvdb::v3_2_0::tools::ParticleAtlas']]], + ['iterator',['Iterator',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange']]], + ['iteratorbase',['IteratorBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['iteratorbase_3c_20maskdenseiter_2c_20nodet_20_3e',['IteratorBase< MaskDenseIter, NodeT >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['iteratorbase_3c_20maskdenseiterator_2c_20nodet_20_3e',['IteratorBase< MaskDenseIterator, NodeT >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['iteratorrange',['IteratorRange',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorRange.html',1,'openvdb::v3_2_0::tree']]], + ['iterlistitem',['IterListItem',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html',1,'openvdb::v3_2_0::tree']]], + ['iterlistitem_3c_20iterlistitem_2c_20restt_2c_20vecsize_2d1_2c_201_20_3e',['IterListItem< IterListItem, RestT, VecSize-1, 1 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html',1,'openvdb::v3_2_0::tree']]], + ['iterlistitem_3c_20prevchilditem_2c_20invtreet_2c_20root_5flevel_2b1_2c_200_20_3e',['IterListItem< PrevChildItem, InvTreeT, ROOT_LEVEL+1, 0 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html',1,'openvdb::v3_2_0::tree']]], + ['iterlistitem_3c_20previtem_2c_20invtreet_2c_20root_5flevel_2b1_2c_20leaf_5flevel_20_3e',['IterListItem< PrevItem, InvTreeT, ROOT_LEVEL+1, LEAF_LEVEL >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html',1,'openvdb::v3_2_0::tree']]], + ['iterlistitem_3c_20previtemt_2c_20nodevect_2c_201_2c_20_5flevel_20_3e',['IterListItem< PrevItemT, NodeVecT, 1, _Level >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['iterlistitem_3c_20previtemt_2c_20nodevect_2c_20vecsize_2c_200u_20_3e',['IterListItem< PrevItemT, NodeVecT, VecSize, 0U >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['iterlistitem_3c_20prevvalueitem_2c_20invtreet_2c_20root_5flevel_2b1_2c_200_20_3e',['IterListItem< PrevValueItem, InvTreeT, ROOT_LEVEL+1, 0 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits',['IterTraits',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1IterTraits.html',1,'openvdb::v3_2_0::tools::stats_internal']]], + ['itertraits',['IterTraits',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20nodet_2c_20typename_20nodet_3a_3achildallciter_20_3e',['IterTraits< NodeT, typename NodeT::ChildAllCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildAllCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20nodet_2c_20typename_20nodet_3a_3achildalliter_20_3e',['IterTraits< NodeT, typename NodeT::ChildAllIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildAllIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20nodet_2c_20typename_20nodet_3a_3achildoffciter_20_3e',['IterTraits< NodeT, typename NodeT::ChildOffCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOffCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20nodet_2c_20typename_20nodet_3a_3achildoffiter_20_3e',['IterTraits< NodeT, typename NodeT::ChildOffIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOffIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20nodet_2c_20typename_20nodet_3a_3achildonciter_20_3e',['IterTraits< NodeT, typename NodeT::ChildOnCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOnCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20nodet_2c_20typename_20nodet_3a_3achildoniter_20_3e',['IterTraits< NodeT, typename NodeT::ChildOnIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOnIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20nodet_2c_20typename_20nodet_3a_3avalueallciter_20_3e',['IterTraits< NodeT, typename NodeT::ValueAllCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueAllCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20nodet_2c_20typename_20nodet_3a_3avaluealliter_20_3e',['IterTraits< NodeT, typename NodeT::ValueAllIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueAllIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20nodet_2c_20typename_20nodet_3a_3avalueoffciter_20_3e',['IterTraits< NodeT, typename NodeT::ValueOffCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOffCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20nodet_2c_20typename_20nodet_3a_3avalueoffiter_20_3e',['IterTraits< NodeT, typename NodeT::ValueOffIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOffIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20nodet_2c_20typename_20nodet_3a_3avalueonciter_20_3e',['IterTraits< NodeT, typename NodeT::ValueOnCIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOnCIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20nodet_2c_20typename_20nodet_3a_3avalueoniter_20_3e',['IterTraits< NodeT, typename NodeT::ValueOnIter >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOnIter_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['itertraits_3c_20tree_3a_3atreevalueiteratorbase_3c_20treet_2c_20valueitert_20_3e_20_3e',['IterTraits< tree::TreeValueIteratorBase< TreeT, ValueIterT > >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1IterTraits_3_01tree_1_1TreeValueIteratod0548f7bac16dff837855a3f29cfb162.html',1,'openvdb::v3_2_0::tools::stats_internal']]], + ['itertraits_3c_20typename_20previtert_3a_3anonconstnodetype_2c_20previtert_20_3e',['IterTraits< typename PrevIterT::NonConstNodeType, PrevIterT >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits.html',1,'openvdb::v3_2_0::tree']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_9.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_9.html new file mode 100644 index 00000000..9a3ffd80 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_9.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_9.js new file mode 100644 index 00000000..396956a1 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['jacobipreconditioner',['JacobiPreconditioner',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1JacobiPreconditioner.html',1,'openvdb::v3_2_0::math::pcg']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_a.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_a.html new file mode 100644 index 00000000..c78181ac --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_a.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_a.js new file mode 100644 index 00000000..85b64815 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['keyerror',['KeyError',['../classopenvdb_1_1v3__2__0_1_1KeyError.html',1,'openvdb::v3_2_0']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_b.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_b.html new file mode 100644 index 00000000..b22f3963 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_b.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_b.js new file mode 100644 index 00000000..aeac33fb --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_b.js @@ -0,0 +1,44 @@ +var searchData= +[ + ['labelboundaryvoxels',['LabelBoundaryVoxels',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1LabelBoundaryVoxels.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['laplacian',['Laplacian',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian.html',1,'openvdb::v3_2_0::tools']]], + ['laplacian',['Laplacian',['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian.html',1,'openvdb::v3_2_0::math']]], + ['laplacian_3c_20scalemap_2c_20diffscheme_20_3e',['Laplacian< ScaleMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01ScaleMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['laplacian_3c_20scaletranslatemap_2c_20diffscheme_20_3e',['Laplacian< ScaleTranslateMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01ScaleTranslateMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['laplacian_3c_20translationmap_2c_20diffscheme_20_3e',['Laplacian< TranslationMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01TranslationMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['laplacian_3c_20uniformscalemap_2c_20diffscheme_20_3e',['Laplacian< UniformScaleMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01UniformScaleMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['laplacian_3c_20uniformscaletranslatemap_2c_20diffscheme_20_3e',['Laplacian< UniformScaleTranslateMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01UniformScaleTranslateMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['laplacian_3c_20unitarymap_2c_20diffscheme_20_3e',['Laplacian< UnitaryMap, DiffScheme >',['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01UnitaryMap_00_01DiffScheme_01_4.html',1,'openvdb::v3_2_0::math']]], + ['leafbs',['LeafBS',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1LeafBS.html',1,'openvdb::v3_2_0::tools::internal']]], + ['leafcache',['LeafCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html',1,'openvdb::v3_2_0::tools::Morphology']]], + ['leafcountop',['LeafCountOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1LeafCountOp.html',1,'openvdb::v3_2_0::tools::poisson::internal']]], + ['leafindexop',['LeafIndexOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1LeafIndexOp.html',1,'openvdb::v3_2_0::tools::poisson::internal']]], + ['leafiteratorbase',['LeafIteratorBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['leafmanager',['LeafManager',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html',1,'openvdb::v3_2_0::tree']]], + ['leafmanagerimpl',['LeafManagerImpl',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafManagerImpl.html',1,'openvdb::v3_2_0::tree']]], + ['leafmanagerimpl_3c_20leafmanager_3c_20const_20treet_20_3e_20_3e',['LeafManagerImpl< LeafManager< const TreeT > >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafManagerImpl_3_01LeafManager_3_01const_01TreeT_01_4_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['leafnode',['LeafNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html',1,'openvdb::v3_2_0::tree']]], + ['leafnode_3c_20bool_2c_20log2dim_20_3e',['LeafNode< bool, Log2Dim >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['leafnode_3c_20valuemask_2c_20log2dim_20_3e',['LeafNode< ValueMask, Log2Dim >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['leafnodeconnectivitytable',['LeafNodeConnectivityTable',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['leafnodeoriginop',['LeafNodeOriginOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1LeafNodeOriginOp.html',1,'openvdb::v3_2_0::tools::point_partitioner_internal']]], + ['leafrange',['LeafRange',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange.html',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['leaftopologydiffop',['LeafTopologyDiffOp',['../classopenvdb_1_1v3__2__0_1_1util_1_1LeafTopologyDiffOp.html',1,'openvdb::v3_2_0::util']]], + ['leaftopologyintop',['LeafTopologyIntOp',['../classopenvdb_1_1v3__2__0_1_1util_1_1LeafTopologyIntOp.html',1,'openvdb::v3_2_0::util']]], + ['legacyfrustum',['LegacyFrustum',['../classopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1LegacyFrustum.html',1,'openvdb::v3_2_0::math::internal']]], + ['levelsetadvection',['LevelSetAdvection',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html',1,'openvdb::v3_2_0::tools']]], + ['levelsetfilter',['LevelSetFilter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html',1,'openvdb::v3_2_0::tools']]], + ['levelsetfracture',['LevelSetFracture',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFracture.html',1,'openvdb::v3_2_0::tools']]], + ['levelsethdda',['LevelSetHDDA',['../structopenvdb_1_1v3__2__0_1_1math_1_1LevelSetHDDA.html',1,'openvdb::v3_2_0::math']]], + ['levelsethdda_3c_20treet_2c_2d1_20_3e',['LevelSetHDDA< TreeT,-1 >',['../structopenvdb_1_1v3__2__0_1_1math_1_1LevelSetHDDA_3_01TreeT_00-1_01_4.html',1,'openvdb::v3_2_0::math']]], + ['levelsetmeasure',['LevelSetMeasure',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html',1,'openvdb::v3_2_0::tools']]], + ['levelsetmorphing',['LevelSetMorphing',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html',1,'openvdb::v3_2_0::tools']]], + ['levelsetpruneop',['LevelSetPruneOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetPruneOp.html',1,'openvdb::v3_2_0::tools']]], + ['levelsetrayintersector',['LevelSetRayIntersector',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html',1,'openvdb::v3_2_0::tools']]], + ['levelsetraytracer',['LevelSetRayTracer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html',1,'openvdb::v3_2_0::tools']]], + ['levelsetsphere',['LevelSetSphere',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetSphere.html',1,'openvdb::v3_2_0::tools']]], + ['levelsettracker',['LevelSetTracker',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html',1,'openvdb::v3_2_0::tools']]], + ['linearop',['LinearOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1LinearOp.html',1,'openvdb::v3_2_0::math::pcg::internal']]], + ['linearsearchimpl',['LinearSearchImpl',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html',1,'openvdb::v3_2_0::tools']]], + ['lookuperror',['LookupError',['../classopenvdb_1_1v3__2__0_1_1LookupError.html',1,'openvdb::v3_2_0']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_c.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_c.html new file mode 100644 index 00000000..e71035e5 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_c.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_c.js new file mode 100644 index 00000000..3cd5fa67 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_c.js @@ -0,0 +1,56 @@ +var searchData= +[ + ['magnitude',['Magnitude',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude.html',1,'openvdb::v3_2_0::tools']]], + ['mapadapter',['MapAdapter',['../structopenvdb_1_1v3__2__0_1_1math_1_1MapAdapter.html',1,'openvdb::v3_2_0::math']]], + ['mapbase',['MapBase',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html',1,'openvdb::v3_2_0::math']]], + ['mappedfile',['MappedFile',['../classopenvdb_1_1v3__2__0_1_1io_1_1MappedFile.html',1,'openvdb::v3_2_0::io']]], + ['mappoints',['MapPoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MapPoints.html',1,'openvdb::v3_2_0::tools::internal']]], + ['mapregistry',['MapRegistry',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapRegistry.html',1,'openvdb::v3_2_0::math']]], + ['maskedcopy',['MaskedCopy',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskedCopy.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['maskedges',['MaskEdges',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MaskEdges.html',1,'openvdb::v3_2_0::tools::internal']]], + ['maskinteriortiles',['MaskInteriorTiles',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorTiles.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['maskinteriorvoxels',['MaskInteriorVoxels',['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1MaskInteriorVoxels.html',1,'openvdb::v3_2_0::tools::clip_internal']]], + ['maskinteriorvoxels',['MaskInteriorVoxels',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorVoxels.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['maskisovaluecrossingvoxels',['MaskIsovalueCrossingVoxels',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskIsovalueCrossingVoxels.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['maskmanager',['MaskManager',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1MaskManager.html',1,'openvdb::v3_2_0::tools::Morphology']]], + ['maskop',['MaskOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1MaskOp.html',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['masksegmentgroup',['MaskSegmentGroup',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskSegmentGroup.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['mat',['Mat',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html',1,'openvdb::v3_2_0::math']]], + ['mat2',['Mat2',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat2.html',1,'openvdb::v3_2_0::math']]], + ['mat3',['Mat3',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html',1,'openvdb::v3_2_0::math']]], + ['mat3_3c_20double_20_3e',['Mat3< double >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html',1,'openvdb::v3_2_0::math']]], + ['mat4',['Mat4',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html',1,'openvdb::v3_2_0::math']]], + ['mat4_3c_20double_20_3e',['Mat4< double >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html',1,'openvdb::v3_2_0::math']]], + ['mat4_3c_20real_20_3e',['Mat4< Real >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html',1,'openvdb::v3_2_0::math']]], + ['mat_3c_203_2c_20t_20_3e',['Mat< 3, T >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html',1,'openvdb::v3_2_0::math']]], + ['mat_3c_204_2c_20double_20_3e',['Mat< 4, double >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html',1,'openvdb::v3_2_0::math']]], + ['mat_3c_204_2c_20real_20_3e',['Mat< 4, Real >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html',1,'openvdb::v3_2_0::math']]], + ['mat_3c_204_2c_20t_20_3e',['Mat< 4, T >',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html',1,'openvdb::v3_2_0::math']]], + ['mathop',['MathOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1MathOp.html',1,'openvdb::v3_2_0::tools::stats_internal']]], + ['matmul',['MatMul',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MatMul.html',1,'openvdb::v3_2_0::tools']]], + ['matmulnormalize',['MatMulNormalize',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MatMulNormalize.html',1,'openvdb::v3_2_0::tools']]], + ['matrixcopyop',['MatrixCopyOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1MatrixCopyOp.html',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix']]], + ['matrixtransform',['MatrixTransform',['../structopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer_1_1MatrixTransform.html',1,'openvdb::v3_2_0::tools::GridTransformer']]], + ['matteshader',['MatteShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MatteShader.html',1,'openvdb::v3_2_0::tools']]], + ['matteshader_3c_20film_3a_3argba_2c_20samplertype_20_3e',['MatteShader< Film::RGBA, SamplerType >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MatteShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['maxop',['MaxOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1MaxOp.html',1,'openvdb::v3_2_0::tools::valxform']]], + ['meancurvature',['MeanCurvature',['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature.html',1,'openvdb::v3_2_0::math']]], + ['meancurvature',['MeanCurvature',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature.html',1,'openvdb::v3_2_0::tools']]], + ['meancurvature_3c_20translationmap_2c_20diffscheme2_2c_20diffscheme1_20_3e',['MeanCurvature< TranslationMap, DiffScheme2, DiffScheme1 >',['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01TranslationMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html',1,'openvdb::v3_2_0::math']]], + ['meancurvature_3c_20uniformscalemap_2c_20diffscheme2_2c_20diffscheme1_20_3e',['MeanCurvature< UniformScaleMap, DiffScheme2, DiffScheme1 >',['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01UniformScaleMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html',1,'openvdb::v3_2_0::math']]], + ['meancurvature_3c_20uniformscaletranslatemap_2c_20diffscheme2_2c_20diffscheme1_20_3e',['MeanCurvature< UniformScaleTranslateMap, DiffScheme2, DiffScheme1 >',['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01UniformScaleTranslateMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html',1,'openvdb::v3_2_0::math']]], + ['mergebinsop',['MergeBinsOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MergeBinsOp.html',1,'openvdb::v3_2_0::tools::point_partitioner_internal']]], + ['mergevoxelregions',['MergeVoxelRegions',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html',1,'openvdb::v3_2_0::tools::internal']]], + ['meshdataadapter',['MeshDataAdapter',['../interfaceMeshDataAdapter.html',1,'']]], + ['meshtovoxeledgedata',['MeshToVoxelEdgeData',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData.html',1,'openvdb::v3_2_0::tools']]], + ['metadata',['Metadata',['../classopenvdb_1_1v3__2__0_1_1Metadata.html',1,'openvdb::v3_2_0']]], + ['metamap',['MetaMap',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html',1,'openvdb::v3_2_0']]], + ['mincombine',['MinCombine',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1MinCombine.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['minmax',['MinMax',['../classopenvdb_1_1v3__2__0_1_1math_1_1MinMax.html',1,'openvdb::v3_2_0::math']]], + ['minop',['MinOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1MinOp.html',1,'openvdb::v3_2_0::tools::valxform']]], + ['morphology',['Morphology',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html',1,'openvdb::v3_2_0::tools']]], + ['movepoints',['MovePoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MovePoints.html',1,'openvdb::v3_2_0::tools::internal']]], + ['movesegmentdataop',['MoveSegmentDataOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MoveSegmentDataOp.html',1,'openvdb::v3_2_0::tools::point_partitioner_internal']]], + ['multiresgrid',['MultiResGrid',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html',1,'openvdb::v3_2_0::tools']]], + ['multop',['MultOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1MultOp.html',1,'openvdb::v3_2_0::tools::valxform']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_d.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_d.html new file mode 100644 index 00000000..1f0b1897 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_d.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_d.js new file mode 100644 index 00000000..e02bdd5a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_d.js @@ -0,0 +1,56 @@ +var searchData= +[ + ['nameiterator',['NameIterator',['../classopenvdb_1_1v3__2__0_1_1io_1_1File_1_1NameIterator.html',1,'openvdb::v3_2_0::io::File']]], + ['neighbor',['Neighbor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1Neighbor.html',1,'openvdb::v3_2_0::tools::Morphology']]], + ['nineteenpointstencil',['NineteenPointStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1NineteenPointStencil.html',1,'openvdb::v3_2_0::math']]], + ['nodebs',['NodeBS',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1NodeBS.html',1,'openvdb::v3_2_0::tools::internal']]], + ['nodechain',['NodeChain',['../structopenvdb_1_1v3__2__0_1_1tree_1_1NodeChain.html',1,'openvdb::v3_2_0::tree']]], + ['nodechain_3c_20headt_2c_201_20_3e',['NodeChain< HeadT, 1 >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1NodeChain_3_01HeadT_00_011_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['nodeconverter',['NodeConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOffCIter_01_4_1_1NodeConverter.html',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOffCIter >']]], + ['nodeconverter',['NodeConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildAllIter_01_4_1_1NodeConverter.html',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildAllIter >']]], + ['nodeconverter',['NodeConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOnCIter_01_4_1_1NodeConverter.html',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOnCIter >']]], + ['nodeconverter',['NodeConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildAllCIter_01_4_1_1NodeConverter.html',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildAllCIter >']]], + ['nodeconverter',['NodeConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOnIter_01_4_1_1NodeConverter.html',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOnIter >']]], + ['nodeconverter',['NodeConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOffIter_01_4_1_1NodeConverter.html',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOffIter >']]], + ['nodeconverter',['NodeConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOnIter_01_4_1_1NodeConverter.html',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOnIter >']]], + ['nodeconverter',['NodeConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOffCIter_01_4_1_1NodeConverter.html',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOffCIter >']]], + ['nodeconverter',['NodeConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueAllIter_01_4_1_1NodeConverter.html',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueAllIter >']]], + ['nodeconverter',['NodeConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOnCIter_01_4_1_1NodeConverter.html',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOnCIter >']]], + ['nodeconverter',['NodeConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOffIter_01_4_1_1NodeConverter.html',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOffIter >']]], + ['nodeconverter',['NodeConverter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueAllCIter_01_4_1_1NodeConverter.html',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueAllCIter >']]], + ['nodeiteratorbase',['NodeIteratorBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html',1,'openvdb::v3_2_0::tree']]], + ['nodelist',['NodeList',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html',1,'openvdb::v3_2_0::tree']]], + ['nodelist_3c_20nodet0_20_3e',['NodeList< NodeT0 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html',1,'openvdb::v3_2_0::tree']]], + ['nodelist_3c_20nodet1_20_3e',['NodeList< NodeT1 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html',1,'openvdb::v3_2_0::tree']]], + ['nodelist_3c_20nodet2_20_3e',['NodeList< NodeT2 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html',1,'openvdb::v3_2_0::tree']]], + ['nodelist_3c_20nodet3_20_3e',['NodeList< NodeT3 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html',1,'openvdb::v3_2_0::tree']]], + ['nodelist_3c_20typename_20rootnodetype_3a_3achildnodetype_20_3e',['NodeList< typename RootNodeType::ChildNodeType >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html',1,'openvdb::v3_2_0::tree']]], + ['nodemanager',['NodeManager',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html',1,'openvdb::v3_2_0::tree']]], + ['nodemanager_3c_20treeorleafmanagert_2c_200_20_3e',['NodeManager< TreeOrLeafManagerT, 0 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['nodemanager_3c_20treeorleafmanagert_2c_201_20_3e',['NodeManager< TreeOrLeafManagerT, 1 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['nodemanager_3c_20treeorleafmanagert_2c_202_20_3e',['NodeManager< TreeOrLeafManagerT, 2 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['nodemanager_3c_20treeorleafmanagert_2c_203_20_3e',['NodeManager< TreeOrLeafManagerT, 3 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['nodemanager_3c_20treeorleafmanagert_2c_204_20_3e',['NodeManager< TreeOrLeafManagerT, 4 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['nodemanagerlink',['NodeManagerLink',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html',1,'openvdb::v3_2_0::tree']]], + ['nodemanagerlink_3c_20nodet_2c_200_20_3e',['NodeManagerLink< NodeT, 0 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['nodemanagerlink_3c_20typename_20rootnodetype_3a_3achildnodetype_2c_20levels_2d1_20_3e',['NodeManagerLink< typename RootNodeType::ChildNodeType, LEVELS-1 >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html',1,'openvdb::v3_2_0::tree']]], + ['nodemask',['NodeMask',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html',1,'openvdb::v3_2_0::util']]], + ['nodemask_3c_201_20_3e',['NodeMask< 1 >',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html',1,'openvdb::v3_2_0::util']]], + ['nodemask_3c_202_20_3e',['NodeMask< 2 >',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html',1,'openvdb::v3_2_0::util']]], + ['nodemasksegment',['NodeMaskSegment',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1NodeMaskSegment.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['noderange',['NodeRange',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange.html',1,'openvdb::v3_2_0::tree::NodeList']]], + ['nodeunion',['NodeUnion',['../structopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnion.html',1,'openvdb::v3_2_0::tree']]], + ['nodeunion_3c_20valuetype_2c_20childnodetype_20_3e',['NodeUnion< ValueType, ChildNodeType >',['../structopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnion.html',1,'openvdb::v3_2_0::tree']]], + ['nodeunionimpl',['NodeUnionImpl',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl.html',1,'openvdb::v3_2_0::tree']]], + ['nodeunionimpl_3c_20boost_3a_3ais_5fclass_3c_20valuet_20_3e_3a_3avalue_2c_20valuet_2c_20childt_20_3e',['NodeUnionImpl< boost::is_class< ValueT >::value, ValueT, ChildT >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl.html',1,'openvdb::v3_2_0::tree']]], + ['nodeunionimpl_3c_20boost_3a_3ais_5fclass_3c_20valuetype_20_3e_3a_3avalue_2c_20valuetype_2c_20childnodetype_20_3e',['NodeUnionImpl< boost::is_class< ValueType >::value, ValueType, ChildNodeType >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl.html',1,'openvdb::v3_2_0::tree']]], + ['nodeunionimpl_3c_20false_2c_20valuet_2c_20childt_20_3e',['NodeUnionImpl< false, ValueT, ChildT >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01false_00_01ValueT_00_01ChildT_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['nodeunionimpl_3c_20true_2c_20valuet_2c_20childt_20_3e',['NodeUnionImpl< true, ValueT, ChildT >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01true_00_01ValueT_00_01ChildT_01_4.html',1,'openvdb::v3_2_0::tree']]], + ['nonlinearfrustummap',['NonlinearFrustumMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html',1,'openvdb::v3_2_0::math']]], + ['nonuniformpointscatter',['NonUniformPointScatter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1NonUniformPointScatter.html',1,'openvdb::v3_2_0::tools']]], + ['normalize',['Normalize',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Normalize.html',1,'openvdb::v3_2_0::tools']]], + ['normalshader',['NormalShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1NormalShader.html',1,'openvdb::v3_2_0::tools']]], + ['normalshader_3c_20film_3a_3argba_2c_20samplertype_20_3e',['NormalShader< Film::RGBA, SamplerType >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1NormalShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['notimplementederror',['NotImplementedError',['../classopenvdb_1_1v3__2__0_1_1NotImplementedError.html',1,'openvdb::v3_2_0']]], + ['nullinterrupter',['NullInterrupter',['../structopenvdb_1_1v3__2__0_1_1util_1_1NullInterrupter.html',1,'openvdb::v3_2_0::util']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_e.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_e.html new file mode 100644 index 00000000..c743f0d4 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_e.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_e.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_e.js new file mode 100644 index 00000000..6a3b4f7c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_e.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['offiterator',['OffIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OffIterator.html',1,'openvdb::v3_2_0::util::RootNodeMask']]], + ['offmaskiterator',['OffMaskIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1OffMaskIterator.html',1,'openvdb::v3_2_0::util']]], + ['offsetandmincomp',['OffsetAndMinComp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ttls__internal_1_1OffsetAndMinComp.html',1,'openvdb::v3_2_0::tools::ttls_internal']]], + ['offsetvalues',['OffsetValues',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1OffsetValues.html',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['oniterator',['OnIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OnIterator.html',1,'openvdb::v3_2_0::util::RootNodeMask']]], + ['onmaskiterator',['OnMaskIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1OnMaskIterator.html',1,'openvdb::v3_2_0::util']]], + ['opaccumulator',['OpAccumulator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1OpAccumulator.html',1,'openvdb::v3_2_0::tools::valxform']]], + ['opadd',['OpAdd',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1OpAdd.html',1,'openvdb::v3_2_0::tools::ds']]], + ['opmagnitude',['OpMagnitude',['../structopenvdb_1_1v3__2__0_1_1math_1_1OpMagnitude.html',1,'openvdb::v3_2_0::math']]], + ['opmax',['OpMax',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1OpMax.html',1,'openvdb::v3_2_0::tools::ds']]], + ['opmin',['OpMin',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1OpMin.html',1,'openvdb::v3_2_0::tools::ds']]], + ['opmult',['OpMult',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1OpMult.html',1,'openvdb::v3_2_0::tools::ds']]], + ['opover',['OpOver',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1OpOver.html',1,'openvdb::v3_2_0::tools::ds']]], + ['opsub',['OpSub',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1OpSub.html',1,'openvdb::v3_2_0::tools::ds']]], + ['opt',['OpT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude_1_1OpT.html',1,'openvdb::v3_2_0::tools::Magnitude']]], + ['opt',['OpT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Normalize_1_1OpT.html',1,'openvdb::v3_2_0::tools::Normalize']]], + ['ordersegmentsop',['OrderSegmentsOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1OrderSegmentsOp.html',1,'openvdb::v3_2_0::tools::point_partitioner_internal']]], + ['orthographiccamera',['OrthographicCamera',['../classopenvdb_1_1v3__2__0_1_1tools_1_1OrthographicCamera.html',1,'openvdb::v3_2_0::tools']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_f.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_f.html new file mode 100644 index 00000000..27496250 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_f.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_f.js new file mode 100644 index 00000000..227e6dff --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/classes_f.js @@ -0,0 +1,34 @@ +var searchData= +[ + ['page',['Page',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html',1,'openvdb::v3_2_0::util::PagedArray']]], + ['pagedarray',['PagedArray',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html',1,'openvdb::v3_2_0::util']]], + ['partgen',['PartGen',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartGen.html',1,'openvdb::v3_2_0::tools::internal']]], + ['partialcreate',['PartialCreate',['../classopenvdb_1_1v3__2__0_1_1PartialCreate.html',1,'openvdb::v3_2_0']]], + ['particlearray',['ParticleArray',['../interfaceParticleArray.html',1,'']]], + ['particleatlas',['ParticleAtlas',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html',1,'openvdb::v3_2_0::tools']]], + ['particlestolevelset',['ParticlesToLevelSet',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html',1,'openvdb::v3_2_0::tools']]], + ['partop',['PartOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartOp.html',1,'openvdb::v3_2_0::tools::internal']]], + ['perspectivecamera',['PerspectiveCamera',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PerspectiveCamera.html',1,'openvdb::v3_2_0::tools']]], + ['pointaccessor',['PointAccessor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PointAccessor.html',1,'openvdb::v3_2_0::tools::internal']]], + ['pointadvect',['PointAdvect',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html',1,'openvdb::v3_2_0::tools']]], + ['pointarray',['PointArray',['../interfacePointArray.html',1,'PointArray'],['../interfacePointArray.html',1,'PointArray']]], + ['pointindex',['PointIndex',['../structopenvdb_1_1v3__2__0_1_1PointIndex.html',1,'openvdb::v3_2_0']]], + ['pointindexfilter',['PointIndexFilter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexFilter.html',1,'openvdb::v3_2_0::tools']]], + ['pointindexiterator',['PointIndexIterator',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html',1,'openvdb::v3_2_0::tools']]], + ['pointindexleafnode',['PointIndexLeafNode',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html',1,'openvdb::v3_2_0::tools']]], + ['pointlistcopy',['PointListCopy',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PointListCopy.html',1,'openvdb::v3_2_0::tools::internal']]], + ['pointlisttransform',['PointListTransform',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PointListTransform.html',1,'openvdb::v3_2_0::tools::internal']]], + ['pointmaskgrid',['PointMaskGrid',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid.html',1,'openvdb::v3_2_0::tools']]], + ['pointpartitioner',['PointPartitioner',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html',1,'openvdb::v3_2_0::tools']]], + ['pointsampler',['PointSampler',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointSampler.html',1,'openvdb::v3_2_0::tools']]], + ['polygonpool',['PolygonPool',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html',1,'openvdb::v3_2_0::tools']]], + ['populateleafnodesop',['PopulateLeafNodesOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1PopulateLeafNodesOp.html',1,'openvdb::v3_2_0::tools::point_index_grid_internal']]], + ['populatetree',['PopulateTree',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1PopulateTree.html',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['positionshader',['PositionShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PositionShader.html',1,'openvdb::v3_2_0::tools']]], + ['positionshader_3c_20film_3a_3argba_2c_20samplertype_20_3e',['PositionShader< Film::RGBA, SamplerType >',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PositionShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html',1,'openvdb::v3_2_0::tools']]], + ['preconditioner',['Preconditioner',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Preconditioner.html',1,'openvdb::v3_2_0::math::pcg']]], + ['preconditioner_3c_20matrixtype_3a_3avaluetype_20_3e',['Preconditioner< MatrixType::ValueType >',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Preconditioner.html',1,'openvdb::v3_2_0::math::pcg']]], + ['primcpy',['PrimCpy',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PrimCpy.html',1,'openvdb::v3_2_0::tools::internal']]], + ['prolongateop',['ProlongateOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1ProlongateOp.html',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['promote',['promote',['../structopenvdb_1_1v3__2__0_1_1math_1_1promote.html',1,'openvdb::v3_2_0::math']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/close.png b/nuparu/include/openvdb/share/doc/openvdb/html/search/close.png new file mode 100644 index 00000000..9342d3df Binary files /dev/null and b/nuparu/include/openvdb/share/doc/openvdb/html/search/close.png differ diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_0.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_0.html new file mode 100644 index 00000000..27eaf8cb --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_0.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_0.js new file mode 100644 index 00000000..57452e80 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['_5fuse_5fmath_5fdefines',['_USE_MATH_DEFINES',['../Platform_8h.html#a525335710b53cb064ca56b936120431e',1,'Platform.h']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_1.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_1.html new file mode 100644 index 00000000..b0d10dd5 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_1.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_1.js new file mode 100644 index 00000000..110d2303 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['b2',['B2',['../NodeMasks_8h.html#a99c79fef7ec21b3aec91b2fcfd3c7600',1,'NodeMasks.h']]], + ['b4',['B4',['../NodeMasks_8h.html#a1fa8d14e04eeb78343cb5b06b85ba27f',1,'NodeMasks.h']]], + ['b6',['B6',['../NodeMasks_8h.html#a757fbce644cd370a23a77e26805bef6b',1,'NodeMasks.h']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_2.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_2.html new file mode 100644 index 00000000..89e59562 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_2.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_2.js new file mode 100644 index 00000000..b5ac3489 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['enable_5ftree_5fvalue_5fdepth_5fbound_5foptimization',['ENABLE_TREE_VALUE_DEPTH_BOUND_OPTIMIZATION',['../TreeIterator_8h.html#ab03113c2f3a9272f75001ed1bf468a91',1,'TreeIterator.h']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_3.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_3.html new file mode 100644 index 00000000..0d686ae6 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_3.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_3.js new file mode 100644 index 00000000..e0cb2334 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_3.js @@ -0,0 +1,43 @@ +var searchData= +[ + ['openvdb_5fapi',['OPENVDB_API',['../Platform_8h.html#a78ead02913edfee18be9d5982b788611',1,'Platform.h']]], + ['openvdb_5fcheck_5fgcc',['OPENVDB_CHECK_GCC',['../Platform_8h.html#a0059a19e8b0edca86629ef0f74e5b41a',1,'Platform.h']]], + ['openvdb_5fdeprecated',['OPENVDB_DEPRECATED',['../Platform_8h.html#acad6915d4aac81665b540218e8b1e06c',1,'Platform.h']]], + ['openvdb_5fexact_5fis_5fapprox_5fequal',['OPENVDB_EXACT_IS_APPROX_EQUAL',['../Math_8h.html#a6b253af5feb78da3c382919eb161e94f',1,'Math.h']]], + ['openvdb_5fexception',['OPENVDB_EXCEPTION',['../Exceptions_8h.html#a82231e85176ee365b2fe7ec5dae79830',1,'Exceptions.h']]], + ['openvdb_5ffinish_5fnon_5fthreadsafe_5fstatic_5faddress',['OPENVDB_FINISH_NON_THREADSAFE_STATIC_ADDRESS',['../Types_8h.html#a04a587fd9ae1911115d6c9ea3d7b2ecd',1,'Types.h']]], + ['openvdb_5ffinish_5fnon_5fthreadsafe_5fstatic_5freference',['OPENVDB_FINISH_NON_THREADSAFE_STATIC_REFERENCE',['../Types_8h.html#a4c25fe5ebce981d186bc0d5b7094ec34',1,'Types.h']]], + ['openvdb_5ffinish_5fnon_5fthreadsafe_5fstatic_5fwrite',['OPENVDB_FINISH_NON_THREADSAFE_STATIC_WRITE',['../Types_8h.html#a9154d689727e60526e308351485a8187',1,'Types.h']]], + ['openvdb_5ffinish_5fthreadsafe_5fstatic_5faddress',['OPENVDB_FINISH_THREADSAFE_STATIC_ADDRESS',['../Types_8h.html#ae8027565fe483ff8ce9956b0c04de75c',1,'Types.h']]], + ['openvdb_5ffinish_5fthreadsafe_5fstatic_5freference',['OPENVDB_FINISH_THREADSAFE_STATIC_REFERENCE',['../Types_8h.html#ac68bc3e353838aee46b122d1035467e8',1,'Types.h']]], + ['openvdb_5ffinish_5fthreadsafe_5fstatic_5fwrite',['OPENVDB_FINISH_THREADSAFE_STATIC_WRITE',['../Types_8h.html#ac1bb06f94f61bbd95e69522ec6d184dd',1,'Types.h']]], + ['openvdb_5fhoudini_5fapi',['OPENVDB_HOUDINI_API',['../Platform_8h.html#a88b26daa45bbdd69d6bb12f9c7bfa3b2',1,'Platform.h']]], + ['openvdb_5flibrary_5fmajor_5fversion_5fnumber',['OPENVDB_LIBRARY_MAJOR_VERSION_NUMBER',['../version_8h.html#ab04cca0a808617a2145460fc13d77534',1,'version.h']]], + ['openvdb_5flibrary_5fminor_5fversion_5fnumber',['OPENVDB_LIBRARY_MINOR_VERSION_NUMBER',['../version_8h.html#a998b52f43bf6f90248e86ce19814a22e',1,'version.h']]], + ['openvdb_5flibrary_5fpatch_5fversion_5fnumber',['OPENVDB_LIBRARY_PATCH_VERSION_NUMBER',['../version_8h.html#ac0c88b27e16ed63fa759b577f290e7e8',1,'version.h']]], + ['openvdb_5flibrary_5fversion_5fnumber',['OPENVDB_LIBRARY_VERSION_NUMBER',['../version_8h.html#a42d8e4a1da2a0d797b1382579095055a',1,'version.h']]], + ['openvdb_5flibrary_5fversion_5fstring',['OPENVDB_LIBRARY_VERSION_STRING',['../version_8h.html#a473ea1fceaac55f6e7766789543e2259',1,'version.h']]], + ['openvdb_5flog_5fdebug',['OPENVDB_LOG_DEBUG',['../logging_8h.html#abc3f222c3f229a5447085e6ee867af13',1,'logging.h']]], + ['openvdb_5flog_5fdebug_5fruntime',['OPENVDB_LOG_DEBUG_RUNTIME',['../logging_8h.html#abdcf8b979065a205aaa7492d3aec79e6',1,'logging.h']]], + ['openvdb_5flog_5ferror',['OPENVDB_LOG_ERROR',['../logging_8h.html#a46b2f70df6eb9ea3f1313bdaa610693a',1,'logging.h']]], + ['openvdb_5flog_5ffatal',['OPENVDB_LOG_FATAL',['../logging_8h.html#a743e36b29932fefe6fd87519d85fdce2',1,'logging.h']]], + ['openvdb_5flog_5finfo',['OPENVDB_LOG_INFO',['../logging_8h.html#a613aa93b2e98f1b56e66f731bf6928ec',1,'logging.h']]], + ['openvdb_5flog_5fwarn',['OPENVDB_LOG_WARN',['../logging_8h.html#a5a55a6912fba67df50a02fd549bea63f',1,'logging.h']]], + ['openvdb_5fno_5ffp_5fequality_5fwarning_5fbegin',['OPENVDB_NO_FP_EQUALITY_WARNING_BEGIN',['../Math_8h.html#aa07e40c3d7f010bcb5c1369f6a78c8b0',1,'Math.h']]], + ['openvdb_5fno_5ffp_5fequality_5fwarning_5fend',['OPENVDB_NO_FP_EQUALITY_WARNING_END',['../Math_8h.html#a97049404e8b5906163c092580a6d394a',1,'Math.h']]], + ['openvdb_5fno_5funreachable_5fcode_5fwarning_5fbegin',['OPENVDB_NO_UNREACHABLE_CODE_WARNING_BEGIN',['../Platform_8h.html#ac8dadf7b858eb1987194e570f80bff79',1,'Platform.h']]], + ['openvdb_5fno_5funreachable_5fcode_5fwarning_5fend',['OPENVDB_NO_UNREACHABLE_CODE_WARNING_END',['../Platform_8h.html#aa4a2916120921a779c15e6182c8d8118',1,'Platform.h']]], + ['openvdb_5fstart_5fnon_5fthreadsafe_5fstatic_5faddress',['OPENVDB_START_NON_THREADSAFE_STATIC_ADDRESS',['../Types_8h.html#a7576930a67c5438495f5b4eca806a209',1,'Types.h']]], + ['openvdb_5fstart_5fnon_5fthreadsafe_5fstatic_5freference',['OPENVDB_START_NON_THREADSAFE_STATIC_REFERENCE',['../Types_8h.html#a1de5e38ab3511d8aa63ff49be1703a3c',1,'Types.h']]], + ['openvdb_5fstart_5fnon_5fthreadsafe_5fstatic_5fwrite',['OPENVDB_START_NON_THREADSAFE_STATIC_WRITE',['../Types_8h.html#ac303d44a9c746b4fc7882bb57ef4c0e2',1,'Types.h']]], + ['openvdb_5fstart_5fthreadsafe_5fstatic_5faddress',['OPENVDB_START_THREADSAFE_STATIC_ADDRESS',['../Types_8h.html#aba3a523e76beaaf0d8cc51e8bbdbe8ae',1,'Types.h']]], + ['openvdb_5fstart_5fthreadsafe_5fstatic_5freference',['OPENVDB_START_THREADSAFE_STATIC_REFERENCE',['../Types_8h.html#a116c03460d08a7c8124d77f0025aa5d6',1,'Types.h']]], + ['openvdb_5fstart_5fthreadsafe_5fstatic_5fwrite',['OPENVDB_START_THREADSAFE_STATIC_WRITE',['../Types_8h.html#a7b933d956cd2f602c346ec80f34d7efa',1,'Types.h']]], + ['openvdb_5fstatic_5fspecialization',['OPENVDB_STATIC_SPECIALIZATION',['../Platform_8h.html#a137393cc1430a98b19104b48694bb764',1,'Platform.h']]], + ['openvdb_5fthreadsafe_5fstatic_5faddress',['OPENVDB_THREADSAFE_STATIC_ADDRESS',['../Types_8h.html#a4221a82a55c24552c9b9812961654b94',1,'Types.h']]], + ['openvdb_5fthreadsafe_5fstatic_5freference',['OPENVDB_THREADSAFE_STATIC_REFERENCE',['../Types_8h.html#af45bfee6bdac4fd25ebba777d6ae8609',1,'Types.h']]], + ['openvdb_5fthreadsafe_5fstatic_5fwrite',['OPENVDB_THREADSAFE_STATIC_WRITE',['../Types_8h.html#a74544cfe36b32ed0637ff78e5b26e19e',1,'Types.h']]], + ['openvdb_5fthrow',['OPENVDB_THROW',['../Exceptions_8h.html#a3eec2ef3138c64fc5844490187c1b8d1',1,'Exceptions.h']]], + ['openvdb_5fuse_5fversion_5fnamespace',['OPENVDB_USE_VERSION_NAMESPACE',['../version_8h.html#a2dde157791cd7558cdf886489256ba14',1,'version.h']]], + ['openvdb_5fversion_5fname',['OPENVDB_VERSION_NAME',['../version_8h.html#a00be3835cb8ad1ded8abd821fad20fc0',1,'version.h']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_4.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_4.html new file mode 100644 index 00000000..ee960c9b --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_4.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_4.js new file mode 100644 index 00000000..89e4cb36 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['pragma',['PRAGMA',['../Platform_8h.html#a0878c1f32c35d22b03416a8e53a1d78a',1,'PRAGMA(): Platform.h'],['../Math_8h.html#a0878c1f32c35d22b03416a8e53a1d78a',1,'PRAGMA(): Math.h']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_5.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_5.html new file mode 100644 index 00000000..69f944e9 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_5.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_5.js new file mode 100644 index 00000000..24d011d1 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['use_5fhits',['USE_HITS',['../RayTracer_8h.html#afdd8a9f63fc84bda1998204d8bb3b3ea',1,'RayTracer.h']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_6.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_6.html new file mode 100644 index 00000000..26f6099e --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_6.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_6.js new file mode 100644 index 00000000..77f29b29 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/defines_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['vmask_5f',['VMASK_',['../PointIndexGrid_8h.html#acc9b8d1e7cf8440093509526152fb82a',1,'PointIndexGrid.h']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_0.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_0.html new file mode 100644 index 00000000..f0d2272a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_0.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_0.js new file mode 100644 index 00000000..5f69d64c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['axis',['Axis',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SweepExteriorSign.html#ae3996976d8ffb3e58d88f58227473f8e',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SweepExteriorSign::Axis()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae3996976d8ffb3e58d88f58227473f8e',1,'openvdb::v3_2_0::math::Axis()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_1.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_1.html new file mode 100644 index 00000000..9e3b4fbb --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_1.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_1.js new file mode 100644 index 00000000..ca21088c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['biasedgradientscheme',['BiasedGradientScheme',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9b59f0a0c54e6e3759f1418d40585656',1,'openvdb::v3_2_0::math']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_2.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_2.html new file mode 100644 index 00000000..bff4b298 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_2.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_2.js new file mode 100644 index 00000000..04e1533e --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['copypolicy',['CopyPolicy',['../namespaceopenvdb_1_1v3__2__0.html#a51a9760605ac8e44f3479429f911dad5',1,'openvdb::v3_2_0']]], + ['csgoperation',['CSGOperation',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html#a7fa595becbbe84c7cfbb4417a626029c',1,'openvdb::v3_2_0::tools::composite']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_3.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_3.html new file mode 100644 index 00000000..e2cdb292 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_3.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_3.js new file mode 100644 index 00000000..1da3e107 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_3.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['ddscheme',['DDScheme',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4994cfdf23949af8ea6889b3ec5c9e20',1,'openvdb::v3_2_0::math']]], + ['dscheme',['DScheme',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57',1,'openvdb::v3_2_0::math']]], + ['dscompositeop',['DSCompositeOp',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a4af148611e5ef140a0121ee996fb8321',1,'openvdb::v3_2_0::tools']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_4.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_4.html new file mode 100644 index 00000000..6a9acceb --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_4.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_4.js new file mode 100644 index 00000000..66aa0a56 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['gridclass',['GridClass',['../namespaceopenvdb_1_1v3__2__0.html#a511a7f5bd868162ec06bcc20b98e160e',1,'openvdb::v3_2_0']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_5.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_5.html new file mode 100644 index 00000000..65bbb274 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_5.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_5.js new file mode 100644 index 00000000..4d93dd9f --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['limiter',['Limiter',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1Scheme.html#a28fd66b0310514194a2fb1d2473e3e29',1,'openvdb::v3_2_0::tools::Scheme']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_6.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_6.html new file mode 100644 index 00000000..b89a63c8 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_6.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_6.js new file mode 100644 index 00000000..e52a0047 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['memorylayout',['MemoryLayout',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8206a04f26f57965d9cb369acafa33d7',1,'openvdb::v3_2_0::tools']]], + ['mergepolicy',['MergePolicy',['../namespaceopenvdb_1_1v3__2__0.html#ade9c95ac55c647839e6f3e9b462c0575',1,'openvdb::v3_2_0']]], + ['meshtovolumeflags',['MeshToVolumeFlags',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a2623bf4797b966b29fbe45c87e60481c',1,'openvdb::v3_2_0::tools']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_7.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_7.html new file mode 100644 index 00000000..29bc33f4 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_7.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_7.js new file mode 100644 index 00000000..a443182d --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['nearestneighbors',['NearestNeighbors',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a31d3cd59d1264144ae21e5250166cfc2',1,'openvdb::v3_2_0::tools']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_8.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_8.html new file mode 100644 index 00000000..c613d51f --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_8.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_8.js new file mode 100644 index 00000000..0abe7148 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['rotationorder',['RotationOrder',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af3d74c777e523f2725cdf87c15a4b5bc',1,'openvdb::v3_2_0::math']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_9.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_9.html new file mode 100644 index 00000000..8af22bc4 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_9.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_9.js new file mode 100644 index 00000000..6fbcf45a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_9.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['semilagrangian',['SemiLagrangian',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1Scheme.html#a4010e0b09fbf6a975c479833d3001f42',1,'openvdb::v3_2_0::tools::Scheme']]], + ['size_5f',['SIZE_',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#acc53f18d7e15681bf742b1efa1be0060',1,'openvdb::v3_2_0::math::Mat']]], + ['status',['Status',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a67a0db04d321a74b7e7fcfd3f1a3f70b',1,'openvdb::v3_2_0::io::Queue']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_a.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_a.html new file mode 100644 index 00000000..b7179a26 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_a.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_a.js new file mode 100644 index 00000000..655b93c9 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['temporalintegrationscheme',['TemporalIntegrationScheme',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a03c27a767120b8c3ed1ac0be2f82c7fd',1,'openvdb::v3_2_0::math']]], + ['tilepolicy',['TilePolicy',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac7a17ca003c7f18f411cab4e8b4f6e74',1,'openvdb::v3_2_0::tools']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_b.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_b.html new file mode 100644 index 00000000..cde41511 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_b.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_b.js new file mode 100644 index 00000000..fab7e24c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enums_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['vectype',['VecType',['../namespaceopenvdb_1_1v3__2__0.html#ae93f92d10730a52ed3b207d5811f6a6e',1,'openvdb::v3_2_0']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_0.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_0.html new file mode 100644 index 00000000..a1556a64 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_0.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_0.js new file mode 100644 index 00000000..31efe98c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['bd_5f1st',['BD_1ST',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57af7174bf850cffe8f12a8e830bd193b21',1,'openvdb::v3_2_0::math']]], + ['bd_5f2nd',['BD_2ND',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57ab8abde9d1fc2731ed91c7c0112496b3d',1,'openvdb::v3_2_0::math']]], + ['bd_5f3rd',['BD_3RD',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57a0ba114d6bd7ab1482d27ff35c92486e8',1,'openvdb::v3_2_0::math']]], + ['bd_5fhjweno5',['BD_HJWENO5',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57adbe351f8bcee0cc8e086d69a6a4106af',1,'openvdb::v3_2_0::math']]], + ['bd_5fweno5',['BD_WENO5',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57ae8e7c68e82dbcbf0bc44abab60b93fe6',1,'openvdb::v3_2_0::math']]], + ['bfecc',['BFECC',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1Scheme.html#a4010e0b09fbf6a975c479833d3001f42abe1f8538e8f5da855c0ec4c01b584099',1,'openvdb::v3_2_0::tools::Scheme']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_1.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_1.html new file mode 100644 index 00000000..76abc457 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_1.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_1.js new file mode 100644 index 00000000..169dd7c2 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_1.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['cd_5f2nd',['CD_2ND',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57ae625e4531fa6805b500faf9c607d229e',1,'openvdb::v3_2_0::math']]], + ['cd_5f2ndt',['CD_2NDT',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57a72b1785f3467652d957c69510d93afc3',1,'openvdb::v3_2_0::math']]], + ['cd_5f4th',['CD_4TH',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57affcae9e170df0a75e85faf5093a230fe',1,'openvdb::v3_2_0::math']]], + ['cd_5f6th',['CD_6TH',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57a56aaacd64724a1eab342cd0d95e8dda6',1,'openvdb::v3_2_0::math']]], + ['cd_5ffourth',['CD_FOURTH',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4994cfdf23949af8ea6889b3ec5c9e20a80e3ecb11ff1b8e48c7eb7d9476ecb2a',1,'openvdb::v3_2_0::math']]], + ['cd_5fsecond',['CD_SECOND',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4994cfdf23949af8ea6889b3ec5c9e20af6b79ac4e7a6a219e4d03c3356cc738a',1,'openvdb::v3_2_0::math']]], + ['cd_5fsixth',['CD_SIXTH',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4994cfdf23949af8ea6889b3ec5c9e20a01878dc93a83c1a619611c4c90346b28',1,'openvdb::v3_2_0::math']]], + ['clamp',['CLAMP',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1Scheme.html#a28fd66b0310514194a2fb1d2473e3e29a44cabaec5bbbef7d3e4b7e9a259283f1',1,'openvdb::v3_2_0::tools::Scheme']]], + ['compress_5factive_5fmask',['COMPRESS_ACTIVE_MASK',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a80155586fa275b28773c9b203f52cabaaab5404cf6e4f3efed496cc038df1668a',1,'openvdb::v3_2_0::io']]], + ['compress_5fblosc',['COMPRESS_BLOSC',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a80155586fa275b28773c9b203f52cabaa7d16c31c4175c842dcb0c691db256054',1,'openvdb::v3_2_0::io']]], + ['compress_5fnone',['COMPRESS_NONE',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a80155586fa275b28773c9b203f52cabaa8169e186323cc23f0f8f305f45109da2',1,'openvdb::v3_2_0::io']]], + ['compress_5fzip',['COMPRESS_ZIP',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a80155586fa275b28773c9b203f52cabaab3a501c0f9978fdec6f0b2b95aea9f43',1,'openvdb::v3_2_0::io']]], + ['cp_5fcopy',['CP_COPY',['../namespaceopenvdb_1_1v3__2__0.html#a51a9760605ac8e44f3479429f911dad5a63385c8db3583380803edb1d4c836398',1,'openvdb::v3_2_0']]], + ['cp_5fnew',['CP_NEW',['../namespaceopenvdb_1_1v3__2__0.html#a51a9760605ac8e44f3479429f911dad5aa65365a2374e75cd45999d7a549920ce',1,'openvdb::v3_2_0']]], + ['cp_5fshare',['CP_SHARE',['../namespaceopenvdb_1_1v3__2__0.html#a51a9760605ac8e44f3479429f911dad5a9dd41f90e4135b4bcf85e09c80543fc4',1,'openvdb::v3_2_0']]], + ['csg_5fdifference',['CSG_DIFFERENCE',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html#a7fa595becbbe84c7cfbb4417a626029ca77fbcc466df7541014c11fb771f99544',1,'openvdb::v3_2_0::tools::composite']]], + ['csg_5fintersection',['CSG_INTERSECTION',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html#a7fa595becbbe84c7cfbb4417a626029cad05ec992438b543b367f312b6bbf8f38',1,'openvdb::v3_2_0::tools::composite']]], + ['csg_5funion',['CSG_UNION',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html#a7fa595becbbe84c7cfbb4417a626029cac9ae7ac7304d79020e991c57c6f9c8be',1,'openvdb::v3_2_0::tools::composite']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_10.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_10.html new file mode 100644 index 00000000..66f43dbd --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_10.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_10.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_10.js new file mode 100644 index 00000000..9fd791c0 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_10.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['unknown',['UNKNOWN',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba6ce26a62afab55d7606ad4e92428b30c',1,'openvdb::v3_2_0::io::Queue']]], + ['unknown_5fbias',['UNKNOWN_BIAS',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9b59f0a0c54e6e3759f1418d40585656aaebd87e037a6230fff604d38747e040e',1,'openvdb::v3_2_0::math']]], + ['unknown_5fdd',['UNKNOWN_DD',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4994cfdf23949af8ea6889b3ec5c9e20a00457211044a17e1b9f5c4560cd25341',1,'openvdb::v3_2_0::math']]], + ['unknown_5fds',['UNKNOWN_DS',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57a256e16c1db4302e0fe17ffba4dbf8a7e',1,'openvdb::v3_2_0::math']]], + ['unknown_5ftis',['UNKNOWN_TIS',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a03c27a767120b8c3ed1ac0be2f82c7fda4c9ae606192e7d1f4e2dea35ab9d3142',1,'openvdb::v3_2_0::math']]], + ['unsigned_5fdistance_5ffield',['UNSIGNED_DISTANCE_FIELD',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a2623bf4797b966b29fbe45c87e60481ca99d80e217668e63e75cbd0591f034f70',1,'openvdb::v3_2_0::tools']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_11.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_11.html new file mode 100644 index 00000000..e8cac961 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_11.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_11.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_11.js new file mode 100644 index 00000000..9454aa97 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_11.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['value',['value',['../structopenvdb_1_1v3__2__0_1_1CanConvertType.html#a99fb83031ce9923c84392b4e92f956b5a97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T_00_01math_1_1Vec2_3_01T_01_4_01_4.html#abc6126af1d45847bc59afa0aa3216b04a97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< T, math::Vec2< T > >::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T_00_01math_1_1Vec3_3_01T_01_4_01_4.html#adc29c2ff13d900c2f185ee95427fb06ca97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< T, math::Vec3< T > >::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T_00_01math_1_1Vec4_3_01T_01_4_01_4.html#a61dadd085c1777f559549e05962b2c9ea97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< T, math::Vec4< T > >::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01math_1_1Vec2_3_01T_01_4_00_01math_1_1Vec2_3_01T_01_4_01_4.html#a726ca809ffd3d67ab4b8476646f26635a97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< math::Vec2< T >, math::Vec2< T > >::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01math_1_1Vec3_3_01T_01_4_00_01math_1_1Vec3_3_01T_01_4_01_4.html#a0411cd49bb5b71852cecd93bcbf0ca2da97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< math::Vec3< T >, math::Vec3< T > >::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01math_1_1Vec4_3_01T_01_4_00_01math_1_1Vec4_3_01T_01_4_01_4.html#abed82baf7f470b522273a3e37c24c600a97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< math::Vec4< T >, math::Vec4< T > >::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T0_00_01math_1_1Vec2_3_01T1_01_4_01_4.html#ab04a0655cd1e3bcac5e8f48c18df1a57a97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< T0, math::Vec2< T1 > >::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T0_00_01math_1_1Vec3_3_01T1_01_4_01_4.html#a385c44f6fb256e5716a2302a5b940388a97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< T0, math::Vec3< T1 > >::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T0_00_01math_1_1Vec4_3_01T1_01_4_01_4.html#abc5c98fcc1211af2b80116dd6e0a035da97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< T0, math::Vec4< T1 > >::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01PointIndex32_00_01PointDataIndex32_01_4.html#ac36f475ca5b446f4fde4c9b90bec77c8a97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< PointIndex32, PointDataIndex32 >::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01PointDataIndex32_00_01PointIndex32_01_4.html#a05589fbab0657f08285ebdfe93f5ec9ea97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< PointDataIndex32, PointIndex32 >::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01T_00_01ValueMask_01_4.html#a16af7b253440dadd46a80a4b9fddba4da97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< T, ValueMask >::value()'],['../structopenvdb_1_1v3__2__0_1_1CanConvertType_3_01ValueMask_00_01T_01_4.html#aba01db17f4a2bfbc3db60dc172972a25a97de9ab6885342a574053b8f64a563a9',1,'openvdb::v3_2_0::CanConvertType< ValueMask, T >::value()']]], + ['vec_5fcontravariant_5fabsolute',['VEC_CONTRAVARIANT_ABSOLUTE',['../namespaceopenvdb_1_1v3__2__0.html#ae93f92d10730a52ed3b207d5811f6a6ea04e1b634fcd3b7c2e7034176792a5478',1,'openvdb::v3_2_0']]], + ['vec_5fcontravariant_5frelative',['VEC_CONTRAVARIANT_RELATIVE',['../namespaceopenvdb_1_1v3__2__0.html#ae93f92d10730a52ed3b207d5811f6a6ea0e7e7aa53b065235993b027a7dc2d49f',1,'openvdb::v3_2_0']]], + ['vec_5fcovariant',['VEC_COVARIANT',['../namespaceopenvdb_1_1v3__2__0.html#ae93f92d10730a52ed3b207d5811f6a6ea1fb13276c1e442e8682f27c216c32364',1,'openvdb::v3_2_0']]], + ['vec_5fcovariant_5fnormalize',['VEC_COVARIANT_NORMALIZE',['../namespaceopenvdb_1_1v3__2__0.html#ae93f92d10730a52ed3b207d5811f6a6eab65daaeb8abf83f0997fe73cb575df65',1,'openvdb::v3_2_0']]], + ['vec_5finvariant',['VEC_INVARIANT',['../namespaceopenvdb_1_1v3__2__0.html#ae93f92d10730a52ed3b207d5811f6a6eae293a86a2c0fcf0596cd261654e870e2',1,'openvdb::v3_2_0']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_12.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_12.html new file mode 100644 index 00000000..2c5131bf --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_12.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_12.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_12.js new file mode 100644 index 00000000..1d2b848c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_12.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['weno5_5fbias',['WENO5_BIAS',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9b59f0a0c54e6e3759f1418d40585656a5ded6cffcebae303db0b13b531a3d06d',1,'openvdb::v3_2_0::math']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_13.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_13.html new file mode 100644 index 00000000..a093d310 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_13.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_13.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_13.js new file mode 100644 index 00000000..27769e66 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_13.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['x_5faxis',['X_AXIS',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SweepExteriorSign.html#ae3996976d8ffb3e58d88f58227473f8ea93ed1386222f87948b972889ad82cd33',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SweepExteriorSign::X_AXIS()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae3996976d8ffb3e58d88f58227473f8ea93ed1386222f87948b972889ad82cd33',1,'openvdb::v3_2_0::math::X_AXIS()']]], + ['xedge',['XEDGE',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a0341d081395407fd92061819ba76eb96af72c109e6eab4311581c088211f39127',1,'openvdb::v3_2_0::tools::internal']]], + ['xyz_5frotation',['XYZ_ROTATION',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af3d74c777e523f2725cdf87c15a4b5bca7f81155656307a44e79263603809ef36',1,'openvdb::v3_2_0::math']]], + ['xzx_5frotation',['XZX_ROTATION',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af3d74c777e523f2725cdf87c15a4b5bca717ae584f16837c35a3a783354641b98',1,'openvdb::v3_2_0::math']]], + ['xzy_5frotation',['XZY_ROTATION',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af3d74c777e523f2725cdf87c15a4b5bcadb575a82763a65e7b9ab5d4a9ec0b448',1,'openvdb::v3_2_0::math']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_14.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_14.html new file mode 100644 index 00000000..600932e6 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_14.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_14.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_14.js new file mode 100644 index 00000000..bef76f8a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_14.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['y_5faxis',['Y_AXIS',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SweepExteriorSign.html#ae3996976d8ffb3e58d88f58227473f8eaa1ec9649c0a631b27ad7280af3522dd0',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SweepExteriorSign::Y_AXIS()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae3996976d8ffb3e58d88f58227473f8eaa1ec9649c0a631b27ad7280af3522dd0',1,'openvdb::v3_2_0::math::Y_AXIS()']]], + ['yedge',['YEDGE',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a0341d081395407fd92061819ba76eb96a50370dd4dfe5c0e13eae205ca2b744d3',1,'openvdb::v3_2_0::tools::internal']]], + ['yxz_5frotation',['YXZ_ROTATION',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af3d74c777e523f2725cdf87c15a4b5bca0eaea09ecf09f49d00685dc12c8b83ff',1,'openvdb::v3_2_0::math']]], + ['yzx_5frotation',['YZX_ROTATION',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af3d74c777e523f2725cdf87c15a4b5bca25e4d01b60a0c3f527a48dda888c50ad',1,'openvdb::v3_2_0::math']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_15.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_15.html new file mode 100644 index 00000000..a139a393 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_15.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_15.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_15.js new file mode 100644 index 00000000..54ffca73 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_15.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['z_5faxis',['Z_AXIS',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SweepExteriorSign.html#ae3996976d8ffb3e58d88f58227473f8ea4b8a53bafca6b43388660925049d734f',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SweepExteriorSign::Z_AXIS()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae3996976d8ffb3e58d88f58227473f8ea4b8a53bafca6b43388660925049d734f',1,'openvdb::v3_2_0::math::Z_AXIS()']]], + ['zedge',['ZEDGE',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a0341d081395407fd92061819ba76eb96a4d83a8d3c1f5ec743de364a5dfc7bff1',1,'openvdb::v3_2_0::tools::internal']]], + ['zxy_5frotation',['ZXY_ROTATION',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af3d74c777e523f2725cdf87c15a4b5bca11062dd0c396c0e74304df2c4d5ea00d',1,'openvdb::v3_2_0::math']]], + ['zxz_5frotation',['ZXZ_ROTATION',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af3d74c777e523f2725cdf87c15a4b5bca67a853e89509c1e7084abb4962b18c19',1,'openvdb::v3_2_0::math']]], + ['zyx_5frotation',['ZYX_ROTATION',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af3d74c777e523f2725cdf87c15a4b5bcacac30c3482d3daccfc781831f47e9271',1,'openvdb::v3_2_0::math']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_2.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_2.html new file mode 100644 index 00000000..c0bcb1ff --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_2.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_2.js new file mode 100644 index 00000000..5526d1d4 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_2.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['disable_5fintersecting_5fvoxel_5fremoval',['DISABLE_INTERSECTING_VOXEL_REMOVAL',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a2623bf4797b966b29fbe45c87e60481ca145012afd1cbb669fe4c8c94b041abc4',1,'openvdb::v3_2_0::tools']]], + ['disable_5fnarrow_5fband_5ftrimming',['DISABLE_NARROW_BAND_TRIMMING',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a2623bf4797b966b29fbe45c87e60481ca4d48077f5cf6edf9cb34cf66d4d88505',1,'openvdb::v3_2_0::tools']]], + ['disable_5frenormalization',['DISABLE_RENORMALIZATION',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a2623bf4797b966b29fbe45c87e60481ca414a054233ec27d0ec60800ea7e73332',1,'openvdb::v3_2_0::tools']]], + ['ds_5fadd',['DS_ADD',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a4af148611e5ef140a0121ee996fb8321a8d4beb09c71b751771158b53d1cf99c3',1,'openvdb::v3_2_0::tools']]], + ['ds_5fmax',['DS_MAX',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a4af148611e5ef140a0121ee996fb8321abab98682392bb93a93278797f8db5d75',1,'openvdb::v3_2_0::tools']]], + ['ds_5fmin',['DS_MIN',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a4af148611e5ef140a0121ee996fb8321a85f583b7144fce0c85930f1a01c25a72',1,'openvdb::v3_2_0::tools']]], + ['ds_5fmult',['DS_MULT',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a4af148611e5ef140a0121ee996fb8321a697b1fa695bcb46b82bc1f22ff61855a',1,'openvdb::v3_2_0::tools']]], + ['ds_5fover',['DS_OVER',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a4af148611e5ef140a0121ee996fb8321a812485f135c6cee2586b34b814cddc6a',1,'openvdb::v3_2_0::tools']]], + ['ds_5fset',['DS_SET',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a4af148611e5ef140a0121ee996fb8321ab5356cf273f92049213e30c3444f149b',1,'openvdb::v3_2_0::tools']]], + ['ds_5fsub',['DS_SUB',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a4af148611e5ef140a0121ee996fb8321afa18e1086c47d6d467d2ca6e708f739b',1,'openvdb::v3_2_0::tools']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_3.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_3.html new file mode 100644 index 00000000..19220e88 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_3.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_3.js new file mode 100644 index 00000000..9f287ff0 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['edges',['EDGES',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a0341d081395407fd92061819ba76eb96aa0102c1339dd0a028ac9071a30a38c21',1,'openvdb::v3_2_0::tools::internal']]], + ['expand_5ftiles',['EXPAND_TILES',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac7a17ca003c7f18f411cab4e8b4f6e74ab3c4d64060dcfe7f0949fb11f8ad789c',1,'openvdb::v3_2_0::tools']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_4.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_4.html new file mode 100644 index 00000000..500fe96a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_4.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_4.js new file mode 100644 index 00000000..cd6be56c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_4.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['failed',['FAILED',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a67a0db04d321a74b7e7fcfd3f1a3f70baecedb56d1405a60c6069f4a0139bdec5',1,'openvdb::v3_2_0::io::Queue']]], + ['fd_5f1st',['FD_1ST',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57acbb366788720ff17e1636a2e8ee73fb2',1,'openvdb::v3_2_0::math']]], + ['fd_5f2nd',['FD_2ND',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57a00769d7d3a56c3db32cb62490117e66d',1,'openvdb::v3_2_0::math']]], + ['fd_5f3rd',['FD_3RD',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57af91012525fafb5c2e460546b9869f1c4',1,'openvdb::v3_2_0::math']]], + ['fd_5fhjweno5',['FD_HJWENO5',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57a95e069bc8516e0e3d188953be9db93d8',1,'openvdb::v3_2_0::math']]], + ['fd_5fweno5',['FD_WENO5',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a42c5d132ec24ea2d95f519975ecc4e57a9f97f2b52742babe0b584f3afcc1d24d',1,'openvdb::v3_2_0::math']]], + ['first_5fbias',['FIRST_BIAS',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9b59f0a0c54e6e3759f1418d40585656a1b5937419fb463bcee3775244e294d1a',1,'openvdb::v3_2_0::math']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_5.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_5.html new file mode 100644 index 00000000..f5133a71 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_5.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_5.js new file mode 100644 index 00000000..f23e806d --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_5.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['grid_5ffog_5fvolume',['GRID_FOG_VOLUME',['../namespaceopenvdb_1_1v3__2__0.html#a511a7f5bd868162ec06bcc20b98e160ea4a2fa6a6ee2b5e2b2fcea1a6453cfce6',1,'openvdb::v3_2_0']]], + ['grid_5flevel_5fset',['GRID_LEVEL_SET',['../namespaceopenvdb_1_1v3__2__0.html#a511a7f5bd868162ec06bcc20b98e160eac12b83a53c9998ec7823ba0ac9c1521d',1,'openvdb::v3_2_0']]], + ['grid_5fstaggered',['GRID_STAGGERED',['../namespaceopenvdb_1_1v3__2__0.html#a511a7f5bd868162ec06bcc20b98e160ea95aec24941c3113a94a141564b794b0e',1,'openvdb::v3_2_0']]], + ['grid_5funknown',['GRID_UNKNOWN',['../namespaceopenvdb_1_1v3__2__0.html#a511a7f5bd868162ec06bcc20b98e160eaf30a448e257803777038162b80e87343',1,'openvdb::v3_2_0']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_6.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_6.html new file mode 100644 index 00000000..0c382c74 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_6.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_6.js new file mode 100644 index 00000000..f725aa28 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['hjweno5_5fbias',['HJWENO5_BIAS',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9b59f0a0c54e6e3759f1418d40585656aee04498ea626951a41f04db5b967767e',1,'openvdb::v3_2_0::math']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_7.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_7.html new file mode 100644 index 00000000..2dcb922b --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_7.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_7.js new file mode 100644 index 00000000..20c865f9 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_7.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['ignore_5ftiles',['IGNORE_TILES',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac7a17ca003c7f18f411cab4e8b4f6e74ab6e5cc3f7167ba290c413016ae105d99',1,'openvdb::v3_2_0::tools']]], + ['inside',['INSIDE',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a0341d081395407fd92061819ba76eb96aaed7c373c0b69cb26c5adb789adb495d',1,'openvdb::v3_2_0::tools::internal']]], + ['invalid_5foffset',['INVALID_OFFSET',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html#aab4d131ba129f519b9e2bd349dc19e3aab88bd5eb0e12083a01cc2f1908a4db15',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::LeafNodeConnectivityTable']]], + ['isreal',['isReal',['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf.html#af9bdc3014f3d54c426b6d2df10de4960aae204e82e802cce8f89a7876f138dbb8',1,'openvdb::v3_2_0::io::RealToHalf::isReal()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01float_01_4.html#adb49720dc49f7d4e4cf9adbf2948e409aae204e82e802cce8f89a7876f138dbb8',1,'openvdb::v3_2_0::io::RealToHalf< float >::isReal()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01double_01_4.html#aae05225933a42f81e7c4a9fb286596f9aae204e82e802cce8f89a7876f138dbb8',1,'openvdb::v3_2_0::io::RealToHalf< double >::isReal()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec2s_01_4.html#a39fca1837c5ce7715cbf571669660c13aae204e82e802cce8f89a7876f138dbb8',1,'openvdb::v3_2_0::io::RealToHalf< Vec2s >::isReal()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec2d_01_4.html#aaf8fd5f0e57d456151c951e0f3715fc4aae204e82e802cce8f89a7876f138dbb8',1,'openvdb::v3_2_0::io::RealToHalf< Vec2d >::isReal()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec3s_01_4.html#a94798fdadfbf49a7c658ace669a1d310aae204e82e802cce8f89a7876f138dbb8',1,'openvdb::v3_2_0::io::RealToHalf< Vec3s >::isReal()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec3d_01_4.html#ae4d5251432e1a9e6803c0240cc492e18aae204e82e802cce8f89a7876f138dbb8',1,'openvdb::v3_2_0::io::RealToHalf< Vec3d >::isReal()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_8.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_8.html new file mode 100644 index 00000000..cd3a3b6e --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_8.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_8.js new file mode 100644 index 00000000..540ec4c1 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_8.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['layoutxyz',['LayoutXYZ',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8206a04f26f57965d9cb369acafa33d7a696de54548c230cf353790fc1f73117f',1,'openvdb::v3_2_0::tools']]], + ['layoutzyx',['LayoutZYX',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8206a04f26f57965d9cb369acafa33d7ac4b2238a60f4ee86d9ed5a72a13fe814',1,'openvdb::v3_2_0::tools']]], + ['log2dim',['LOG2DIM',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#a843b6364885d3a1a47722e792b0368ecab1bd42b0e4f803f4f312d809b9f49716',1,'openvdb::v3_2_0::tools::PointPartitioner']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_9.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_9.html new file mode 100644 index 00000000..8b7a11ee --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_9.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_9.js new file mode 100644 index 00000000..20df7f7c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_9.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['mac',['MAC',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1Scheme.html#a4010e0b09fbf6a975c479833d3001f42a9c4ceb72dffdf771c0a249aa8d03e769',1,'openvdb::v3_2_0::tools::Scheme']]], + ['mask_5fand_5fno_5finactive_5fvals',['MASK_AND_NO_INACTIVE_VALS',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a6b7b47dd702d9e331586d485013fd1eaa1539a35c40a309c6885923ae07448545',1,'openvdb::v3_2_0::io']]], + ['mask_5fand_5fone_5finactive_5fval',['MASK_AND_ONE_INACTIVE_VAL',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a6b7b47dd702d9e331586d485013fd1eaacb1e3f0557f6ed9e38a2cf37b72ca4f8',1,'openvdb::v3_2_0::io']]], + ['mask_5fand_5ftwo_5finactive_5fvals',['MASK_AND_TWO_INACTIVE_VALS',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a6b7b47dd702d9e331586d485013fd1eaa5c5f0736d1c2573d9d0dc076de38210f',1,'openvdb::v3_2_0::io']]], + ['mask_5fdirty_5fbit',['MASK_DIRTY_BIT',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a540c98815fbf3a535e5c3474823ca58caefa7166fc10125d8a84112c85f7fbd8b',1,'openvdb::v3_2_0::tools::internal']]], + ['mask_5ffirst_5f10_5fbits',['MASK_FIRST_10_BITS',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a540c98815fbf3a535e5c3474823ca58ca1ec774a34877cb4286e5fbf40191d37b',1,'openvdb::v3_2_0::tools::internal']]], + ['mask_5finvalid_5fbit',['MASK_INVALID_BIT',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a540c98815fbf3a535e5c3474823ca58cacf6696bc3fcba98cb26f4edf78d8bbcc',1,'openvdb::v3_2_0::tools::internal']]], + ['merge_5factive_5fstates',['MERGE_ACTIVE_STATES',['../namespaceopenvdb_1_1v3__2__0.html#ade9c95ac55c647839e6f3e9b462c0575a89c44945b26534bc1d5ede51c342400e',1,'openvdb::v3_2_0']]], + ['merge_5factive_5fstates_5fand_5fnodes',['MERGE_ACTIVE_STATES_AND_NODES',['../namespaceopenvdb_1_1v3__2__0.html#ade9c95ac55c647839e6f3e9b462c0575acf1d5ce98de6a7d0d614438c13118193',1,'openvdb::v3_2_0']]], + ['merge_5fnodes',['MERGE_NODES',['../namespaceopenvdb_1_1v3__2__0.html#ade9c95ac55c647839e6f3e9b462c0575a92e4cb6fd9e78d9095b357d8a4b26ad0',1,'openvdb::v3_2_0']]], + ['mid',['MID',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1Scheme.html#a4010e0b09fbf6a975c479833d3001f42a3bc56824c91d97fcda36dc99687bb236',1,'openvdb::v3_2_0::tools::Scheme']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_a.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_a.html new file mode 100644 index 00000000..d4a6e00f --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_a.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_a.js new file mode 100644 index 00000000..82850f88 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_a.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['nn_5fface',['NN_FACE',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a31d3cd59d1264144ae21e5250166cfc2a8b7234ad92f6feba2725d890a38fdd59',1,'openvdb::v3_2_0::tools']]], + ['nn_5fface_5fedge',['NN_FACE_EDGE',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a31d3cd59d1264144ae21e5250166cfc2a6d84698cb77f59ae061433cbb1313bbf',1,'openvdb::v3_2_0::tools']]], + ['nn_5fface_5fedge_5fvertex',['NN_FACE_EDGE_VERTEX',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a31d3cd59d1264144ae21e5250166cfc2a2cbda8f22b738858b06cb668117278ee',1,'openvdb::v3_2_0::tools']]], + ['no_5flimiter',['NO_LIMITER',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1Scheme.html#a28fd66b0310514194a2fb1d2473e3e29a8190f53535f0dc8d9246fdf493756e93',1,'openvdb::v3_2_0::tools::Scheme']]], + ['no_5fmask_5fand_5fall_5fvals',['NO_MASK_AND_ALL_VALS',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a6b7b47dd702d9e331586d485013fd1eaad8aa5492856d5eafa86f7889ebdc85f9',1,'openvdb::v3_2_0::io']]], + ['no_5fmask_5fand_5fminus_5fbg',['NO_MASK_AND_MINUS_BG',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a6b7b47dd702d9e331586d485013fd1eaab416c229ad8ec113be713bdd13872467',1,'openvdb::v3_2_0::io']]], + ['no_5fmask_5fand_5fone_5finactive_5fval',['NO_MASK_AND_ONE_INACTIVE_VAL',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a6b7b47dd702d9e331586d485013fd1eaac359c780bb43bccf482499b3e4c33c70',1,'openvdb::v3_2_0::io']]], + ['no_5fmask_5for_5finactive_5fvals',['NO_MASK_OR_INACTIVE_VALS',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a6b7b47dd702d9e331586d485013fd1eaaee7e030c068bed829a9240eae6263f7a',1,'openvdb::v3_2_0::io']]], + ['num_5fbias_5fschemes',['NUM_BIAS_SCHEMES',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a5d76b81b0ad4c19007a781d4edb8181fab7849b10f470f95b35e3b90c5d7933c8',1,'openvdb::v3_2_0::math']]], + ['num_5fdd_5fschemes',['NUM_DD_SCHEMES',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aabfcbcb5ac86a1edac4035264bc7d2b8a6c33eba3c29e21d08682f0ad81386851',1,'openvdb::v3_2_0::math']]], + ['num_5fds_5fschemes',['NUM_DS_SCHEMES',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7ff5f2dff38e7639981794c43dc9167ba249c3c162cc52d061321ec40f385afb7',1,'openvdb::v3_2_0::math']]], + ['num_5fgrid_5fclasses',['NUM_GRID_CLASSES',['../namespaceopenvdb_1_1v3__2__0.html#a06fc87d81c62e9abb8790b6e5713c55bad920626883d514328c461b4d2496e3b6',1,'openvdb::v3_2_0']]], + ['num_5ftemporal_5fschemes',['NUM_TEMPORAL_SCHEMES',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aac34dfe6c6b73b43a4656c9dce041034a00c89afba185bba6c37f10edad847361',1,'openvdb::v3_2_0::math']]], + ['num_5fvec_5ftypes',['NUM_VEC_TYPES',['../namespaceopenvdb_1_1v3__2__0.html#adf764cbdea00d65edcd07bb9953ad2b7aa69b32b4e2d9a25a84186edeff99d4f0',1,'openvdb::v3_2_0']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_b.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_b.html new file mode 100644 index 00000000..520f7148 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_b.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_b.js new file mode 100644 index 00000000..b5b2091d --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_b.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['openvdb_5ffile_5fversion_5fblosc_5fcompression',['OPENVDB_FILE_VERSION_BLOSC_COMPRESSION',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fcea734c8591d73ade4e36928409a6c8781f',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5fbool_5fleaf_5foptimization',['OPENVDB_FILE_VERSION_BOOL_LEAF_OPTIMIZATION',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fcea39944ff09038abccb66cb4734bb04b76',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5fboost_5fuuid',['OPENVDB_FILE_VERSION_BOOST_UUID',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fcea92530ad33f099f8f49b3db20fcd63d0c',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5ffloat_5ffrustum_5fbbox',['OPENVDB_FILE_VERSION_FLOAT_FRUSTUM_BBOX',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fcea9f0a34f01c923448692ebab6fc8157ea',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5fgrid_5finstancing',['OPENVDB_FILE_VERSION_GRID_INSTANCING',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fcea5b1955bdc7bfb97200c01693499d86ed',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5finternalnode_5fcompression',['OPENVDB_FILE_VERSION_INTERNALNODE_COMPRESSION',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fceaa0ba864e79bace97c0ff5d303c85e062',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5fnew_5ftransform',['OPENVDB_FILE_VERSION_NEW_TRANSFORM',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fceacf27fdeb27c14dd0fa37afaa9e860943',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5fno_5fgridmap',['OPENVDB_FILE_VERSION_NO_GRIDMAP',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fceabe6c412205fd80009e7e0c9612de53dd',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5fnode_5fmask_5fcompression',['OPENVDB_FILE_VERSION_NODE_MASK_COMPRESSION',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fcea71883b4156db5731c39d342a04e79e5a',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5fpoint_5findex_5fgrid',['OPENVDB_FILE_VERSION_POINT_INDEX_GRID',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fceaeef748e6dd4df219116923abd299dffa',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5frootnode_5fmap',['OPENVDB_FILE_VERSION_ROOTNODE_MAP',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fceaba32c7339fc3df797f72fbfe2a0cc136',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5fselective_5fcompression',['OPENVDB_FILE_VERSION_SELECTIVE_COMPRESSION',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fcea4f68b777de5275a442ac62582cec2754',1,'openvdb::v3_2_0']]], + ['openvdb_5ffile_5fversion_5fsimplified_5fgrid_5ftypename',['OPENVDB_FILE_VERSION_SIMPLIFIED_GRID_TYPENAME',['../namespaceopenvdb_1_1v3__2__0.html#aaf105ae5beaca1dee30ae54530691fceab9c004ca1c701249a07a6ea2e0f7943c',1,'openvdb::v3_2_0']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_c.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_c.html new file mode 100644 index 00000000..c9085250 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_c.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_c.js new file mode 100644 index 00000000..2b31225e --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_c.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['pending',['PENDING',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba1869818fd53ff519eb8e429301bdff73',1,'openvdb::v3_2_0::io::Queue']]], + ['polyflag_5fexterior',['POLYFLAG_EXTERIOR',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a85d881cb3816f77e92c1c8f721b54fc4aa911a2c909b228a84da11c9e7ec8d6f4',1,'openvdb::v3_2_0::tools']]], + ['polyflag_5ffracture_5fseam',['POLYFLAG_FRACTURE_SEAM',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a85d881cb3816f77e92c1c8f721b54fc4a6162751648b85f251927667c2b51ca67',1,'openvdb::v3_2_0::tools']]], + ['polyflag_5fsubdivided',['POLYFLAG_SUBDIVIDED',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a85d881cb3816f77e92c1c8f721b54fc4acbee21124fa14157f6c0c992c4728c7b',1,'openvdb::v3_2_0::tools']]], + ['preserve_5ftiles',['PRESERVE_TILES',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac7a17ca003c7f18f411cab4e8b4f6e74ab963e977b12771992aceaf779527c26f',1,'openvdb::v3_2_0::tools']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_d.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_d.html new file mode 100644 index 00000000..2eb9b28f --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_d.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_d.js new file mode 100644 index 00000000..10b34dab --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_d.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['revert',['REVERT',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1Scheme.html#a28fd66b0310514194a2fb1d2473e3e29a0ad105830a21e547b8f07c8d466b77bf',1,'openvdb::v3_2_0::tools::Scheme']]], + ['rk3',['RK3',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1Scheme.html#a4010e0b09fbf6a975c479833d3001f42a9775c41ec65add712b9d4ada46e38672',1,'openvdb::v3_2_0::tools::Scheme']]], + ['rk4',['RK4',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1Scheme.html#a4010e0b09fbf6a975c479833d3001f42a5df275d4d2ef6e60437567adc263d488',1,'openvdb::v3_2_0::tools::Scheme']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_e.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_e.html new file mode 100644 index 00000000..90b40781 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_e.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_e.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_e.js new file mode 100644 index 00000000..4035c37d --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['seam',['SEAM',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a0341d081395407fd92061819ba76eb96a3ebbdf66b2d24cb8ec979e6315240971',1,'openvdb::v3_2_0::tools::internal']]], + ['second_5fbias',['SECOND_BIAS',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9b59f0a0c54e6e3759f1418d40585656aafff1de1b18c68533db6495e2e750557',1,'openvdb::v3_2_0::math']]], + ['semi',['SEMI',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1Scheme.html#a4010e0b09fbf6a975c479833d3001f42a68cf729acfb0cf4857abec621022e0df',1,'openvdb::v3_2_0::tools::Scheme']]], + ['signs',['SIGNS',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a0341d081395407fd92061819ba76eb96a4a285aeafad96018c303430889836f2b',1,'openvdb::v3_2_0::tools::internal']]], + ['size',['size',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#acc53f18d7e15681bf742b1efa1be0060a052a2b4924452fb4a73f2cb52b6e9d41',1,'openvdb::v3_2_0::math::Mat']]], + ['stop',['STOP',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CsgVisitorBase.html#ae91638596a8955da23581d7ad008e295a679ee5320d66c8322e310daeb2ee99b8',1,'openvdb::v3_2_0::tools::CsgVisitorBase::STOP()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgUnionVisitor.html#a0b59433d0ab361c389e51d79061c070ca679ee5320d66c8322e310daeb2ee99b8',1,'openvdb::v3_2_0::tools::CsgUnionVisitor::STOP()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgIntersectVisitor.html#a85f0f418e1a739554f3f904a501179dca679ee5320d66c8322e310daeb2ee99b8',1,'openvdb::v3_2_0::tools::CsgIntersectVisitor::STOP()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgDiffVisitor.html#a6813be44df52c18b08debbebca7d09a8a679ee5320d66c8322e310daeb2ee99b8',1,'openvdb::v3_2_0::tools::CsgDiffVisitor::STOP()']]], + ['succeeded',['SUCCEEDED',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a67a0db04d321a74b7e7fcfd3f1a3f70bac416a0ceff582d19692ee0238278f307',1,'openvdb::v3_2_0::io::Queue']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_f.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_f.html new file mode 100644 index 00000000..b641daf9 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_f.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_f.js new file mode 100644 index 00000000..6bbab576 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/enumvalues_f.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['third_5fbias',['THIRD_BIAS',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9b59f0a0c54e6e3759f1418d40585656a2f69723aeacbe98b0a99fb4e0eb2a799',1,'openvdb::v3_2_0::math']]], + ['tvd_5frk1',['TVD_RK1',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a03c27a767120b8c3ed1ac0be2f82c7fda1c82568ca6ec9bbdcb7ba1dd20272e53',1,'openvdb::v3_2_0::math']]], + ['tvd_5frk2',['TVD_RK2',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a03c27a767120b8c3ed1ac0be2f82c7fdaade4c5f3d0823a2767f2ba8eedfec5fc',1,'openvdb::v3_2_0::math']]], + ['tvd_5frk3',['TVD_RK3',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a03c27a767120b8c3ed1ac0be2f82c7fdabb3714a3d71ccea2f448ec40f5b8a28a',1,'openvdb::v3_2_0::math']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_0.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_0.html new file mode 100644 index 00000000..04578537 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_0.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_0.js new file mode 100644 index 00000000..afb75b0a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['api_5f0_5f98_5f0_2etxt',['api_0_98_0.txt',['../api__0__98__0_8txt.html',1,'']]], + ['archive_2eh',['Archive.h',['../Archive_8h.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_1.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_1.html new file mode 100644 index 00000000..ce0a3a7a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_1.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_1.js new file mode 100644 index 00000000..e7a98bdd --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['bbox_2eh',['BBox.h',['../BBox_8h.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_10.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_10.html new file mode 100644 index 00000000..4b4378cb --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_10.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_10.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_10.js new file mode 100644 index 00000000..e6f3f00c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_10.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['tempfile_2eh',['TempFile.h',['../TempFile_8h.html',1,'']]], + ['topologytolevelset_2eh',['TopologyToLevelSet.h',['../TopologyToLevelSet_8h.html',1,'']]], + ['transform_2eh',['Transform.h',['../Transform_8h.html',1,'']]], + ['tree_2eh',['Tree.h',['../Tree_8h.html',1,'']]], + ['treeiterator_2eh',['TreeIterator.h',['../TreeIterator_8h.html',1,'']]], + ['tuple_2eh',['Tuple.h',['../Tuple_8h.html',1,'']]], + ['types_2eh',['Types.h',['../Types_8h.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_11.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_11.html new file mode 100644 index 00000000..aa2696c4 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_11.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_11.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_11.js new file mode 100644 index 00000000..5c649f89 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_11.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['util_2eh',['Util.h',['../Util_8h.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_12.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_12.html new file mode 100644 index 00000000..ef8bb1d4 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_12.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_12.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_12.js new file mode 100644 index 00000000..051a6cf2 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_12.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['valueaccessor_2eh',['ValueAccessor.h',['../ValueAccessor_8h.html',1,'']]], + ['valuetransformer_2eh',['ValueTransformer.h',['../ValueTransformer_8h.html',1,'']]], + ['vec2_2eh',['Vec2.h',['../Vec2_8h.html',1,'']]], + ['vec3_2eh',['Vec3.h',['../Vec3_8h.html',1,'']]], + ['vec4_2eh',['Vec4.h',['../Vec4_8h.html',1,'']]], + ['vectortransformer_2eh',['VectorTransformer.h',['../VectorTransformer_8h.html',1,'']]], + ['velocityfields_2eh',['VelocityFields.h',['../VelocityFields_8h.html',1,'']]], + ['version_2eh',['version.h',['../version_8h.html',1,'']]], + ['volumeadvect_2eh',['VolumeAdvect.h',['../VolumeAdvect_8h.html',1,'']]], + ['volumetomesh_2eh',['VolumeToMesh.h',['../VolumeToMesh_8h.html',1,'']]], + ['volumetospheres_2eh',['VolumeToSpheres.h',['../VolumeToSpheres_8h.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_2.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_2.html new file mode 100644 index 00000000..d188d98a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_2.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_2.js new file mode 100644 index 00000000..b25c27f3 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['changebackground_2eh',['ChangeBackground.h',['../ChangeBackground_8h.html',1,'']]], + ['changes_2etxt',['changes.txt',['../changes_8txt.html',1,'']]], + ['clip_2eh',['Clip.h',['../Clip_8h.html',1,'']]], + ['codingstyle_2etxt',['codingstyle.txt',['../codingstyle_8txt.html',1,'']]], + ['composite_2eh',['Composite.h',['../Composite_8h.html',1,'']]], + ['compression_2eh',['Compression.h',['../Compression_8h.html',1,'']]], + ['conjgradient_2eh',['ConjGradient.h',['../ConjGradient_8h.html',1,'']]], + ['coord_2eh',['Coord.h',['../Coord_8h.html',1,'']]], + ['cputimer_2eh',['CpuTimer.h',['../CpuTimer_8h.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_3.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_3.html new file mode 100644 index 00000000..7fa556e8 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_3.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_3.js new file mode 100644 index 00000000..efcd7dad --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_3.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['dda_2eh',['DDA.h',['../DDA_8h.html',1,'']]], + ['dense_2eh',['Dense.h',['../Dense_8h.html',1,'']]], + ['densesparsetools_2eh',['DenseSparseTools.h',['../DenseSparseTools_8h.html',1,'']]], + ['diagnostics_2eh',['Diagnostics.h',['../Diagnostics_8h.html',1,'']]], + ['doc_2etxt',['doc.txt',['../doc_8txt.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_4.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_4.html new file mode 100644 index 00000000..192383bb --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_4.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_4.js new file mode 100644 index 00000000..1058e3d5 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['examplecode_2etxt',['examplecode.txt',['../examplecode_8txt.html',1,'']]], + ['exceptions_2eh',['Exceptions.h',['../Exceptions_8h.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_5.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_5.html new file mode 100644 index 00000000..af3aaba5 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_5.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_5.js new file mode 100644 index 00000000..6a03b2a9 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_5.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['faq_2etxt',['faq.txt',['../faq_8txt.html',1,'']]], + ['file_2eh',['File.h',['../File_8h.html',1,'']]], + ['filter_2eh',['Filter.h',['../Filter_8h.html',1,'']]], + ['finitedifference_2eh',['FiniteDifference.h',['../FiniteDifference_8h.html',1,'']]], + ['formats_2eh',['Formats.h',['../Formats_8h.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_6.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_6.html new file mode 100644 index 00000000..4f7e395a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_6.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_6.js new file mode 100644 index 00000000..1f5de5c0 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_6.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['grid_2eh',['Grid.h',['../Grid_8h.html',1,'']]], + ['griddescriptor_2eh',['GridDescriptor.h',['../GridDescriptor_8h.html',1,'']]], + ['gridoperators_2eh',['GridOperators.h',['../GridOperators_8h.html',1,'']]], + ['gridtransformer_2eh',['GridTransformer.h',['../GridTransformer_8h.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_7.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_7.html new file mode 100644 index 00000000..65578c2f --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_7.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_7.js new file mode 100644 index 00000000..57005968 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_7.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['internalnode_2eh',['InternalNode.h',['../InternalNode_8h.html',1,'']]], + ['interpolation_2eh',['Interpolation.h',['../Interpolation_8h.html',1,'']]], + ['io_2eh',['io.h',['../io_8h.html',1,'']]], + ['iterator_2eh',['Iterator.h',['../Iterator_8h.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_8.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_8.html new file mode 100644 index 00000000..105d31de --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_8.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_8.js new file mode 100644 index 00000000..2dfdbaf7 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_8.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['leafmanager_2eh',['LeafManager.h',['../LeafManager_8h.html',1,'']]], + ['leafnode_2eh',['LeafNode.h',['../LeafNode_8h.html',1,'']]], + ['leafnodebool_2eh',['LeafNodeBool.h',['../LeafNodeBool_8h.html',1,'']]], + ['leafnodemask_2eh',['LeafNodeMask.h',['../LeafNodeMask_8h.html',1,'']]], + ['legacyfrustum_2eh',['LegacyFrustum.h',['../LegacyFrustum_8h.html',1,'']]], + ['levelsetadvect_2eh',['LevelSetAdvect.h',['../LevelSetAdvect_8h.html',1,'']]], + ['levelsetfilter_2eh',['LevelSetFilter.h',['../LevelSetFilter_8h.html',1,'']]], + ['levelsetfracture_2eh',['LevelSetFracture.h',['../LevelSetFracture_8h.html',1,'']]], + ['levelsetmeasure_2eh',['LevelSetMeasure.h',['../LevelSetMeasure_8h.html',1,'']]], + ['levelsetmorph_2eh',['LevelSetMorph.h',['../LevelSetMorph_8h.html',1,'']]], + ['levelsetplatonic_2eh',['LevelSetPlatonic.h',['../LevelSetPlatonic_8h.html',1,'']]], + ['levelsetrebuild_2eh',['LevelSetRebuild.h',['../LevelSetRebuild_8h.html',1,'']]], + ['levelsetsphere_2eh',['LevelSetSphere.h',['../LevelSetSphere_8h.html',1,'']]], + ['levelsettracker_2eh',['LevelSetTracker.h',['../LevelSetTracker_8h.html',1,'']]], + ['levelsetutil_2eh',['LevelSetUtil.h',['../LevelSetUtil_8h.html',1,'']]], + ['logging_2eh',['logging.h',['../logging_8h.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_9.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_9.html new file mode 100644 index 00000000..4233bc4b --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_9.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_9.js new file mode 100644 index 00000000..384eea6e --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_9.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['maps_2eh',['Maps.h',['../Maps_8h.html',1,'']]], + ['mapsutil_2eh',['MapsUtil.h',['../MapsUtil_8h.html',1,'']]], + ['masktolevelset_2eh',['MaskToLevelSet.h',['../MaskToLevelSet_8h.html',1,'']]], + ['mat_2eh',['Mat.h',['../Mat_8h.html',1,'']]], + ['mat3_2eh',['Mat3.h',['../Mat3_8h.html',1,'']]], + ['mat4_2eh',['Mat4.h',['../Mat4_8h.html',1,'']]], + ['math_2eh',['Math.h',['../Math_8h.html',1,'']]], + ['math_2etxt',['math.txt',['../math_8txt.html',1,'']]], + ['meshtovolume_2eh',['MeshToVolume.h',['../MeshToVolume_8h.html',1,'']]], + ['metadata_2eh',['Metadata.h',['../Metadata_8h.html',1,'']]], + ['metadata_2eh',['Metadata.h',['../metadata_2Metadata_8h.html',1,'']]], + ['metamap_2eh',['MetaMap.h',['../MetaMap_8h.html',1,'']]], + ['morphology_2eh',['Morphology.h',['../Morphology_8h.html',1,'']]], + ['multiresgrid_2eh',['MultiResGrid.h',['../MultiResGrid_8h.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_a.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_a.html new file mode 100644 index 00000000..7af4acc0 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_a.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_a.js new file mode 100644 index 00000000..e839bc76 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_a.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['name_2eh',['Name.h',['../Name_8h.html',1,'']]], + ['nodemanager_2eh',['NodeManager.h',['../NodeManager_8h.html',1,'']]], + ['nodemasks_2eh',['NodeMasks.h',['../NodeMasks_8h.html',1,'']]], + ['nodeunion_2eh',['NodeUnion.h',['../NodeUnion_8h.html',1,'']]], + ['nullinterrupter_2eh',['NullInterrupter.h',['../NullInterrupter_8h.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_b.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_b.html new file mode 100644 index 00000000..135f8205 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_b.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_b.js new file mode 100644 index 00000000..6126a848 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_b.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['openvdb_2eh',['openvdb.h',['../openvdb_8h.html',1,'']]], + ['operators_2eh',['Operators.h',['../Operators_8h.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_c.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_c.html new file mode 100644 index 00000000..09a02288 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_c.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_c.js new file mode 100644 index 00000000..fa64aad9 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_c.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['pagedarray_2eh',['PagedArray.h',['../PagedArray_8h.html',1,'']]], + ['particleatlas_2eh',['ParticleAtlas.h',['../ParticleAtlas_8h.html',1,'']]], + ['particlestolevelset_2eh',['ParticlesToLevelSet.h',['../ParticlesToLevelSet_8h.html',1,'']]], + ['platform_2eh',['Platform.h',['../Platform_8h.html',1,'']]], + ['platformconfig_2eh',['PlatformConfig.h',['../PlatformConfig_8h.html',1,'']]], + ['pointadvect_2eh',['PointAdvect.h',['../PointAdvect_8h.html',1,'']]], + ['pointindexgrid_2eh',['PointIndexGrid.h',['../PointIndexGrid_8h.html',1,'']]], + ['pointmaskgrid_2eh',['PointMaskGrid.h',['../PointMaskGrid_8h.html',1,'']]], + ['pointpartitioner_2eh',['PointPartitioner.h',['../PointPartitioner_8h.html',1,'']]], + ['pointscatter_2eh',['PointScatter.h',['../PointScatter_8h.html',1,'']]], + ['poissonsolver_2eh',['PoissonSolver.h',['../PoissonSolver_8h.html',1,'']]], + ['proximity_2eh',['Proximity.h',['../Proximity_8h.html',1,'']]], + ['prune_2eh',['Prune.h',['../Prune_8h.html',1,'']]], + ['pyopenvdb_2eh',['pyopenvdb.h',['../pyopenvdb_8h.html',1,'']]], + ['python_2etxt',['python.txt',['../python_8txt.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_d.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_d.html new file mode 100644 index 00000000..e544043b --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_d.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_d.js new file mode 100644 index 00000000..e3cb1084 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_d.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['quantizedunitvec_2eh',['QuantizedUnitVec.h',['../QuantizedUnitVec_8h.html',1,'']]], + ['quat_2eh',['Quat.h',['../Quat_8h.html',1,'']]], + ['queue_2eh',['Queue.h',['../Queue_8h.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_e.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_e.html new file mode 100644 index 00000000..d5625faa --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_e.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_e.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_e.js new file mode 100644 index 00000000..e45ead4b --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_e.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['ray_2eh',['Ray.h',['../Ray_8h.html',1,'']]], + ['rayintersector_2eh',['RayIntersector.h',['../RayIntersector_8h.html',1,'']]], + ['raytracer_2eh',['RayTracer.h',['../RayTracer_8h.html',1,'']]], + ['rootnode_2eh',['RootNode.h',['../RootNode_8h.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_f.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_f.html new file mode 100644 index 00000000..6d87503b --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/files_f.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_f.js new file mode 100644 index 00000000..c52cc872 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/files_f.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['signedfloodfill_2eh',['SignedFloodFill.h',['../SignedFloodFill_8h.html',1,'']]], + ['statistics_2eh',['Statistics.h',['../Statistics_8h.html',1,'']]], + ['stats_2eh',['Stats.h',['../Stats_8h.html',1,'']]], + ['stencils_2eh',['Stencils.h',['../Stencils_8h.html',1,'']]], + ['stream_2eh',['Stream.h',['../Stream_8h.html',1,'']]], + ['stringmetadata_2eh',['StringMetadata.h',['../StringMetadata_8h.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_0.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_0.html new file mode 100644 index 00000000..88c8a268 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_0.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_0.js new file mode 100644 index 00000000..db410c1b --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_0.js @@ -0,0 +1,73 @@ +var searchData= +[ + ['a',['a',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#aaabacc3fc82b651038d593e5bcf97102',1,'openvdb::v3_2_0::CombineArgs']]], + ['abs',['Abs',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#add0a8870b21e4d76dc131ba518963a6c',1,'openvdb::v3_2_0::math::Abs(int32_t i)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aaceb949c461d51293392b33a33e743bd',1,'openvdb::v3_2_0::math::Abs(int64_t i)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ad9d14bd55823c95f6ec3fb1b471c266f',1,'openvdb::v3_2_0::math::Abs(float x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a956d5c21788792ee5a4248e602608fc3',1,'openvdb::v3_2_0::math::Abs(double x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a80969730072f008b1a73062e1165990f',1,'openvdb::v3_2_0::math::Abs(long double x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a46212ee543d6065ea6b347e21753ae50',1,'openvdb::v3_2_0::math::Abs(uint32_t i)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a6543714c6cb7aa94ef152954e8d2784c',1,'openvdb::v3_2_0::math::Abs(uint64_t i)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a92dff11a9a021cd722581a910a9bb6de',1,'openvdb::v3_2_0::math::Abs(bool b)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a376f86da345cf45095b60a03436d5e9d',1,'openvdb::v3_2_0::math::Abs(const Tuple< SIZE, T > &t)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a176a6cdb7f6fac4a134003cfcc7ce61c',1,'openvdb::v3_2_0::math::Abs(const Vec2< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a329a8aa45d424d285103280abfd2a355',1,'openvdb::v3_2_0::math::Abs(const Vec3< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ac7b7fcbd8677d80eb09d1f692762a77c',1,'openvdb::v3_2_0::math::Abs(const Vec4< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a3b47b11a85883783af42640ac8cde30d',1,'openvdb::v3_2_0::tools::Abs()']]], + ['abtransform',['ABTransform',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ABTransform.html#a263530b0df156dd0ceb411ad791f9133',1,'openvdb::v3_2_0::tools::ABTransform']]], + ['accessor',['accessor',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a494447ba52ccbd63f7ae51c9a229f384',1,'openvdb::v3_2_0::math::BaseStencil']]], + ['accum',['accum',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1filter__internal.html#af123b35c1342eb5b7e4d80cfcd223a70',1,'openvdb::v3_2_0::tools::filter_internal::accum(T &sum, T addend)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1filter__internal.html#aca39d9fc1bce4e519a725b3a78af6a1b',1,'openvdb::v3_2_0::tools::filter_internal::accum(bool &sum, bool addend)']]], + ['accumpostrotation',['accumPostRotation',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a44e2cf764e7e4076006f211d7cdc98ea',1,'openvdb::v3_2_0::math::AffineMap']]], + ['accumpostscale',['accumPostScale',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#aec270b68a15e59873e14ac35eaee7e9f',1,'openvdb::v3_2_0::math::AffineMap']]], + ['accumpostshear',['accumPostShear',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a171fd3c31c0e600cfdcad94508617bdd',1,'openvdb::v3_2_0::math::AffineMap']]], + ['accumposttranslation',['accumPostTranslation',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#af865952a46662fda4e7863e4070f0391',1,'openvdb::v3_2_0::math::AffineMap']]], + ['accumprerotation',['accumPreRotation',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#acd3f815d849076d661dfda027f4d3950',1,'openvdb::v3_2_0::math::AffineMap']]], + ['accumprescale',['accumPreScale',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#ad9008cf9834852bd5f4911965c72c110',1,'openvdb::v3_2_0::math::AffineMap']]], + ['accumpreshear',['accumPreShear',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a4999140a2ce96cb8c0a2cac5fc17970d',1,'openvdb::v3_2_0::math::AffineMap']]], + ['accumpretranslation',['accumPreTranslation',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#adce40f719509fd5637d417e6ca0411d6',1,'openvdb::v3_2_0::math::AffineMap']]], + ['accumulate',['accumulate',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8e31fdabdae973490731a7be4f31d9ad',1,'openvdb::v3_2_0::tools']]], + ['activate',['activate',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a9fa99ba23890494cdfe09a6d6abdd380',1,'openvdb::v3_2_0::tools']]], + ['activationop',['ActivationOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1activation_1_1ActivationOp.html#a5905c03c6e7f7dfaa0ded0e9aa54d659',1,'openvdb::v3_2_0::tools::activation::ActivationOp']]], + ['activeleafvoxelcount',['activeLeafVoxelCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a2e0656e740d6bd176225e3643e1b0907',1,'openvdb::v3_2_0::tree::TreeBase::activeLeafVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ab3a0857d01927ab17bd6bcd74710ef03',1,'openvdb::v3_2_0::tree::Tree::activeLeafVoxelCount()']]], + ['activetilecount',['activeTileCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#ad03bad9124b134c1e8ed50181d6d987d',1,'openvdb::v3_2_0::tree::TreeBase::activeTileCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ac88047fd749080fc90e6b431a55710e9',1,'openvdb::v3_2_0::tree::Tree::activeTileCount()']]], + ['activevoxelcount',['activeVoxelCount',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a8786a38826997396e721f4afc8d3110d',1,'openvdb::v3_2_0::GridBase::activeVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a5a6a7cd039e1524a3b0a91c8e489970d',1,'openvdb::v3_2_0::Grid::activeVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a8786a38826997396e721f4afc8d3110d',1,'openvdb::v3_2_0::tree::TreeBase::activeVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a5a6a7cd039e1524a3b0a91c8e489970d',1,'openvdb::v3_2_0::tree::Tree::activeVoxelCount()']]], + ['adaptiveprimbuilder',['AdaptivePrimBuilder',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1AdaptivePrimBuilder.html#ad62f5319cbe96e9f1a63b7afeb077d78',1,'openvdb::v3_2_0::tools::internal::AdaptivePrimBuilder']]], + ['add',['add',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#af0da97f62fdb2bbb0c39ce14393f037b',1,'openvdb::v3_2_0::math::Quat::add()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MinMax.html#abcf2fd1d24b62ec3767ef51dc5568e44',1,'openvdb::v3_2_0::math::MinMax::add(const ValueType &val, const Less &less=Less())'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MinMax.html#af01eec79a9540badc3894be7060711bc',1,'openvdb::v3_2_0::math::MinMax::add(const MinMax &other, const Less &less=Less())'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#a1c762a4059fc92d21d53c05f268227b1',1,'openvdb::v3_2_0::math::Extrema::add(double val)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#a98ebcbdaa826802091e13f76df470d6c',1,'openvdb::v3_2_0::math::Extrema::add(double val, uint64_t n)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#a28912fb48486d6c279da35bdb4a8b232',1,'openvdb::v3_2_0::math::Extrema::add(const Extrema &other)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#a1c762a4059fc92d21d53c05f268227b1',1,'openvdb::v3_2_0::math::Stats::add(double val)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#a98ebcbdaa826802091e13f76df470d6c',1,'openvdb::v3_2_0::math::Stats::add(double val, uint64_t n)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#a4cc00948fe5c85df221f139ddff9b0ed',1,'openvdb::v3_2_0::math::Stats::add(const Stats &other)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html#a6026b9d887438b5e38ff4e21ac76ca4f',1,'openvdb::v3_2_0::math::Histogram::add(double val, uint64_t n=1)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html#ad0cc72c553cdf6f0c23c4ec293b1265d',1,'openvdb::v3_2_0::math::Histogram::add(const Histogram &other)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a6e470148b197194b92caee59e8576db9',1,'openvdb::v3_2_0::math::Vec2::add()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a60b932a09c739a9a585a8fc990811a4a',1,'openvdb::v3_2_0::math::Vec3::add()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a5dc9ee7517ba680c9c24e1ddd998b267',1,'openvdb::v3_2_0::math::Vec4::add()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PointAccessor.html#aab13def078b829ca071f0d0dd60026b0',1,'openvdb::v3_2_0::tools::internal::PointAccessor::add()']]], + ['addleaf',['addLeaf',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a2e6314d00f2f73157eff39f96cd80622',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a6c20c22e9a994a30c9640cbe1ec982bc',1,'openvdb::v3_2_0::tree::InternalNode::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a771997d8700872c8fc2886886ade76c6',1,'openvdb::v3_2_0::tree::LeafNode::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a771997d8700872c8fc2886886ade76c6',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a771997d8700872c8fc2886886ade76c6',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a6c20c22e9a994a30c9640cbe1ec982bc',1,'openvdb::v3_2_0::tree::RootNode::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a2472aeb0b603a8798850208d147579d9',1,'openvdb::v3_2_0::tree::Tree::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a3506cd540968d3fd0ae16e5b1affde48',1,'openvdb::v3_2_0::tree::ValueAccessor::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a6c20c22e9a994a30c9640cbe1ec982bc',1,'openvdb::v3_2_0::tree::CacheItem::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a6c20c22e9a994a30c9640cbe1ec982bc',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a3506cd540968d3fd0ae16e5b1affde48',1,'openvdb::v3_2_0::tree::ValueAccessor0::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a3506cd540968d3fd0ae16e5b1affde48',1,'openvdb::v3_2_0::tree::ValueAccessor1::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a3506cd540968d3fd0ae16e5b1affde48',1,'openvdb::v3_2_0::tree::ValueAccessor2::addLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a3506cd540968d3fd0ae16e5b1affde48',1,'openvdb::v3_2_0::tree::ValueAccessor3::addLeaf()']]], + ['addleafandcache',['addLeafAndCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a5a10e2db0297eb563890666df649e2c4',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::addLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a23d57da960fd963ab7a02836ebf005b5',1,'openvdb::v3_2_0::tree::InternalNode::addLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ae07c8f1c226898790e697735169633db',1,'openvdb::v3_2_0::tree::LeafNode::addLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ae07c8f1c226898790e697735169633db',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::addLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ae07c8f1c226898790e697735169633db',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::addLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a23d57da960fd963ab7a02836ebf005b5',1,'openvdb::v3_2_0::tree::RootNode::addLeafAndCache()']]], + ['addnodes',['AddNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1AddNodes.html#a0e91b3635a6077a61f80b63f0b2c04af',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::AddNodes']]], + ['addnotifier',['addNotifier',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a6109cbaee51de58b461324dca0b3485a',1,'openvdb::v3_2_0::io::Queue']]], + ['addpoint',['addPoint',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#a035668ca43898744b20d3ce296bb72ca',1,'openvdb::v3_2_0::tools::BasePointScatter::addPoint(const GridT &grid, const Vec3R &dmin)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#a11a8626da965f66cafc6f016c2fc444b',1,'openvdb::v3_2_0::tools::BasePointScatter::addPoint(const GridT &grid, const Vec3R &dmin, const Coord &size)']]], + ['addpoints',['addPoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid.html#a70b349ab6b29506de4ad576cdc601c2f',1,'openvdb::v3_2_0::tools::PointMaskGrid']]], + ['addprim',['addPrim',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UniformPrimBuilder.html#a788d75e72cbacc36cecef799b1264a44',1,'openvdb::v3_2_0::tools::internal::UniformPrimBuilder::addPrim()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1AdaptivePrimBuilder.html#a788d75e72cbacc36cecef799b1264a44',1,'openvdb::v3_2_0::tools::internal::AdaptivePrimBuilder::addPrim()']]], + ['addstatsmetadata',['addStatsMetadata',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a6f6011abaee35f0718424ba281220706',1,'openvdb::v3_2_0::GridBase']]], + ['addsuffix',['addSuffix',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#aea546a4ba51e3b0b14cf094901fc6fa8',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['addtile',['addTile',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a58ab61f904112334f418ea8a1235cdad',1,'openvdb::v3_2_0::tree::InternalNode::addTile(Index level, const Coord &xyz, const ValueType &value, bool state)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#af8dffc25e9449d959c5db02dc17715ee',1,'openvdb::v3_2_0::tree::InternalNode::addTile(Index offset, const ValueType &value, bool state)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a568b9575dfcb86feff1f8380ca957d04',1,'openvdb::v3_2_0::tree::LeafNode::addTile(Index level, const Coord &, const ValueType &, bool)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a05951fc38afd4cc77a9ae662ee1bdff4',1,'openvdb::v3_2_0::tree::LeafNode::addTile(Index offset, const ValueType &, bool)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#adcef824335c6038436e4bff45c70a403',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::addTile(Index level, const Coord &, bool val, bool active)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a1750bee9ad433f067ef215ad23a2a78d',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::addTile(Index offset, bool val, bool active)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#adcef824335c6038436e4bff45c70a403',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::addTile(Index level, const Coord &, bool val, bool active)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a1750bee9ad433f067ef215ad23a2a78d',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::addTile(Index offset, bool val, bool active)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a6fd27c86bf273fa436a0e8c9d41b28af',1,'openvdb::v3_2_0::tree::RootNode::addTile(const Coord &xyz, const ValueType &value, bool state)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a58ab61f904112334f418ea8a1235cdad',1,'openvdb::v3_2_0::tree::RootNode::addTile(Index level, const Coord &xyz, const ValueType &value, bool state)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a75454b135a1e19473aa702a90fd00802',1,'openvdb::v3_2_0::tree::Tree::addTile()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a58ab61f904112334f418ea8a1235cdad',1,'openvdb::v3_2_0::tree::ValueAccessor::addTile()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a58ab61f904112334f418ea8a1235cdad',1,'openvdb::v3_2_0::tree::CacheItem::addTile()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a58ab61f904112334f418ea8a1235cdad',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::addTile()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a58ab61f904112334f418ea8a1235cdad',1,'openvdb::v3_2_0::tree::ValueAccessor0::addTile()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a58ab61f904112334f418ea8a1235cdad',1,'openvdb::v3_2_0::tree::ValueAccessor1::addTile()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a58ab61f904112334f418ea8a1235cdad',1,'openvdb::v3_2_0::tree::ValueAccessor2::addTile()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a58ab61f904112334f418ea8a1235cdad',1,'openvdb::v3_2_0::tree::ValueAccessor3::addTile()']]], + ['addtileandcache',['addTileAndCache',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a88baa1b1d12b360589dbe49a344be2b6',1,'openvdb::v3_2_0::tree::InternalNode::addTileAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#adf106dbda7b0cc7ac3453cc9b2b9c7b1',1,'openvdb::v3_2_0::tree::LeafNode::addTileAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ac5a61e520404d551d13af19503f4a3e3',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::addTileAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ac5a61e520404d551d13af19503f4a3e3',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::addTileAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a88baa1b1d12b360589dbe49a344be2b6',1,'openvdb::v3_2_0::tree::RootNode::addTileAndCache()']]], + ['adjoint',['adjoint',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a4a6be925a632e8d18666d0a8f3b01150',1,'openvdb::v3_2_0::math::Mat3']]], + ['advect',['advect',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#ad2c087029e66039b3f3b68bafa2fcbf3',1,'openvdb::v3_2_0::tools::LevelSetAdvection::advect()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#ad2c087029e66039b3f3b68bafa2fcbf3',1,'openvdb::v3_2_0::tools::LevelSetMorphing::advect()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#a8d48267e784d608ad30c1403b9f3d2cf',1,'openvdb::v3_2_0::tools::PointAdvect::advect()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#a8d48267e784d608ad30c1403b9f3d2cf',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect::advect()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#a66a5f4e4782975b012fb6dfe14b50e21',1,'openvdb::v3_2_0::tools::VolumeAdvection::advect(const VolumeGridT &inGrid, double timeStep)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#a7a855c0e36ea106a6f9c503d7be283f1',1,'openvdb::v3_2_0::tools::VolumeAdvection::advect(const VolumeGridT &inGrid, const MaskGridT &mask, double timeStep)']]], + ['affinemap',['AffineMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a1f6ef2508f13f9ba76d2666345a571cf',1,'openvdb::v3_2_0::math::AffineMap::AffineMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a2296b6f94ac26179ebb2629648c0822c',1,'openvdb::v3_2_0::math::AffineMap::AffineMap(const Mat3d &m)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#afc99c8fda28727da3e86030a0880e244',1,'openvdb::v3_2_0::math::AffineMap::AffineMap(const Mat4d &m)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a9e69e468e6c8cb47e1ffe3da912be370',1,'openvdb::v3_2_0::math::AffineMap::AffineMap(const AffineMap &other)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a4e13e216258842f1e648646b7b9bba9e',1,'openvdb::v3_2_0::math::AffineMap::AffineMap(const AffineMap &first, const AffineMap &second)']]], + ['aim',['aim',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae79db325c9ba9fbc8e3fa955c36ad7c8',1,'openvdb::v3_2_0::math']]], + ['aisactive',['aIsActive',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#afc4589c1427598269e5caa6e02f848d9',1,'openvdb::v3_2_0::CombineArgs']]], + ['allocate',['allocate',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#add23d9f5bbc918076d240287a9b3664f',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::allocate()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#add23d9f5bbc918076d240287a9b3664f',1,'openvdb::v3_2_0::tree::LeafNode::allocate()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#add23d9f5bbc918076d240287a9b3664f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::allocate()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#add23d9f5bbc918076d240287a9b3664f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::allocate()']]], + ['alphamask',['AlphaMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#a586c2e8122ee2128d2f5ec9f992c40cf',1,'openvdb::v3_2_0::tools::AlphaMask']]], + ['angle',['angle',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ad4170baade6bdab1de42f6d36ee3d184',1,'openvdb::v3_2_0::math::Quat::angle()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ac8192fa2a8292c58dfdf996e58bd49e9',1,'openvdb::v3_2_0::math::angle(const Vec2< T > &v1, const Vec2< T > &v2)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a5576d6e7edad799d942635355a47a8a9',1,'openvdb::v3_2_0::math::angle(const Vec3< T > &v1, const Vec3< T > &v2)']]], + ['apply',['apply',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Preconditioner.html#a8bb673dfdf6de817dc322b0e31d02d55',1,'openvdb::v3_2_0::math::pcg::Preconditioner::apply()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1JacobiPreconditioner.html#a64330c6d68a028f9f6501263d3652e75',1,'openvdb::v3_2_0::math::pcg::JacobiPreconditioner::apply()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#a02213eb61bff7cb5f5b825ee303346af',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner::apply()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseTransformer.html#a3a674851dbfbbb8bcffcead25a27aa73',1,'openvdb::v3_2_0::tools::DenseTransformer::apply()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1OpOver.html#abcdede0430006e465d104e052bdc49bb',1,'openvdb::v3_2_0::tools::ds::OpOver::apply()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1OpAdd.html#affe43988f9dd9526a1918f396647cd3d',1,'openvdb::v3_2_0::tools::ds::OpAdd::apply()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1OpSub.html#affe43988f9dd9526a1918f396647cd3d',1,'openvdb::v3_2_0::tools::ds::OpSub::apply()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1OpMin.html#ad734cec763ab070811039d7c460ad580',1,'openvdb::v3_2_0::tools::ds::OpMin::apply()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1OpMax.html#ad734cec763ab070811039d7c460ad580',1,'openvdb::v3_2_0::tools::ds::OpMax::apply()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1OpMult.html#a6412131c460d8888f87cd009b98cdc10',1,'openvdb::v3_2_0::tools::ds::OpMult::apply()']]], + ['applyijc',['applyIJC',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a5c30b5dc96dadab4a1ab585086e8ba97',1,'openvdb::v3_2_0::math::MapBase::applyIJC(const Mat3d &m) const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a6b357c610882cfd43d8e3c133d4bfda0',1,'openvdb::v3_2_0::math::MapBase::applyIJC(const Mat3d &m, const Vec3d &v, const Vec3d &domainPos) const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a64939ba9f99c514e132758a9ee567e2c',1,'openvdb::v3_2_0::math::AffineMap::applyIJC(const Mat3d &m) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a4ec5c4c8f4c200c072f2310f62e94a4f',1,'openvdb::v3_2_0::math::AffineMap::applyIJC(const Mat3d &in, const Vec3d &, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a679e559de175914a2938d8cb51c4646d',1,'openvdb::v3_2_0::math::ScaleMap::applyIJC(const Mat3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a4ec5c4c8f4c200c072f2310f62e94a4f',1,'openvdb::v3_2_0::math::ScaleMap::applyIJC(const Mat3d &in, const Vec3d &, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a2338aa41568d718853c50e9fc3a7fab1',1,'openvdb::v3_2_0::math::TranslationMap::applyIJC(const Mat3d &mat) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#ae6dbd44e6ff35f9b65a6696fbcbad8de',1,'openvdb::v3_2_0::math::TranslationMap::applyIJC(const Mat3d &mat, const Vec3d &, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a679e559de175914a2938d8cb51c4646d',1,'openvdb::v3_2_0::math::ScaleTranslateMap::applyIJC(const Mat3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a4ec5c4c8f4c200c072f2310f62e94a4f',1,'openvdb::v3_2_0::math::ScaleTranslateMap::applyIJC(const Mat3d &in, const Vec3d &, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a679e559de175914a2938d8cb51c4646d',1,'openvdb::v3_2_0::math::UnitaryMap::applyIJC(const Mat3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a4ec5c4c8f4c200c072f2310f62e94a4f',1,'openvdb::v3_2_0::math::UnitaryMap::applyIJC(const Mat3d &in, const Vec3d &, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a679e559de175914a2938d8cb51c4646d',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::applyIJC(const Mat3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a483c30fea02daaf66811b7dd2a4332fe',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::applyIJC(const Mat3d &d2_is, const Vec3d &d1_is, const Vec3d &ijk) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#a64939ba9f99c514e132758a9ee567e2c',1,'openvdb::v3_2_0::math::GenericMap::applyIJC(const Mat3d &m) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#a59c248e75fa51a7163966ee72adc2764',1,'openvdb::v3_2_0::math::GenericMap::applyIJC(const Mat3d &m, const Vec3d &v, const Vec3d &pos) const ']]], + ['applyijt',['applyIJT',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#aa93666c79953fb1472390aa4a98e00c9',1,'openvdb::v3_2_0::math::MapBase::applyIJT(const Vec3d &in) const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#ab661067fc2ab9e01b4ccde795cc6fd87',1,'openvdb::v3_2_0::math::MapBase::applyIJT(const Vec3d &in, const Vec3d &domainPos) const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a1e99c8bf3794ac815f87d2dc714c2c74',1,'openvdb::v3_2_0::math::AffineMap::applyIJT(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a3a5a097eb61b2d326ab1dc4c53d9eae2',1,'openvdb::v3_2_0::math::AffineMap::applyIJT(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a1e99c8bf3794ac815f87d2dc714c2c74',1,'openvdb::v3_2_0::math::ScaleMap::applyIJT(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a3a5a097eb61b2d326ab1dc4c53d9eae2',1,'openvdb::v3_2_0::math::ScaleMap::applyIJT(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a1e99c8bf3794ac815f87d2dc714c2c74',1,'openvdb::v3_2_0::math::TranslationMap::applyIJT(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a3a5a097eb61b2d326ab1dc4c53d9eae2',1,'openvdb::v3_2_0::math::TranslationMap::applyIJT(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a1e99c8bf3794ac815f87d2dc714c2c74',1,'openvdb::v3_2_0::math::ScaleTranslateMap::applyIJT(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a3a5a097eb61b2d326ab1dc4c53d9eae2',1,'openvdb::v3_2_0::math::ScaleTranslateMap::applyIJT(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a1e99c8bf3794ac815f87d2dc714c2c74',1,'openvdb::v3_2_0::math::UnitaryMap::applyIJT(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a3a5a097eb61b2d326ab1dc4c53d9eae2',1,'openvdb::v3_2_0::math::UnitaryMap::applyIJT(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a3a5a097eb61b2d326ab1dc4c53d9eae2',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::applyIJT(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a983230cc99688bef22ea26b8a3fe3189',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::applyIJT(const Vec3d &d1_is, const Vec3d &ijk) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#a3a5a097eb61b2d326ab1dc4c53d9eae2',1,'openvdb::v3_2_0::math::GenericMap::applyIJT(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#ac64bd82ffbdadc7d2fe4901c8ff7633e',1,'openvdb::v3_2_0::math::GenericMap::applyIJT(const Vec3d &in, const Vec3d &pos) const ']]], + ['applyinversejacobian',['applyInverseJacobian',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#aa49536687f716f67ec6976ec9bc67720',1,'openvdb::v3_2_0::math::MapBase::applyInverseJacobian(const Vec3d &in) const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#acd647457bd97e0da7fc9c05cbd11db7c',1,'openvdb::v3_2_0::math::MapBase::applyInverseJacobian(const Vec3d &in, const Vec3d &domainPos) const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#abae0a0d98a82ecb23a279a625034c500',1,'openvdb::v3_2_0::math::AffineMap::applyInverseJacobian(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#ac826e6dfa38472c4a02cf5fb8ae96d39',1,'openvdb::v3_2_0::math::AffineMap::applyInverseJacobian(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#abae0a0d98a82ecb23a279a625034c500',1,'openvdb::v3_2_0::math::ScaleMap::applyInverseJacobian(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#ac826e6dfa38472c4a02cf5fb8ae96d39',1,'openvdb::v3_2_0::math::ScaleMap::applyInverseJacobian(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#abae0a0d98a82ecb23a279a625034c500',1,'openvdb::v3_2_0::math::TranslationMap::applyInverseJacobian(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#ac826e6dfa38472c4a02cf5fb8ae96d39',1,'openvdb::v3_2_0::math::TranslationMap::applyInverseJacobian(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#abae0a0d98a82ecb23a279a625034c500',1,'openvdb::v3_2_0::math::ScaleTranslateMap::applyInverseJacobian(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#ac826e6dfa38472c4a02cf5fb8ae96d39',1,'openvdb::v3_2_0::math::ScaleTranslateMap::applyInverseJacobian(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#abae0a0d98a82ecb23a279a625034c500',1,'openvdb::v3_2_0::math::UnitaryMap::applyInverseJacobian(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#ac826e6dfa38472c4a02cf5fb8ae96d39',1,'openvdb::v3_2_0::math::UnitaryMap::applyInverseJacobian(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#ac826e6dfa38472c4a02cf5fb8ae96d39',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::applyInverseJacobian(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a2a62efcf654b8d286c9170126f4df697',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::applyInverseJacobian(const Vec3d &in, const Vec3d &isloc) const ']]], + ['applyinversemap',['applyInverseMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#ad5cea98d8cd7acf355acc91b76f906c0',1,'openvdb::v3_2_0::math::BBox::applyInverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a047af417cb22eb286a02bf3d51148eb3',1,'openvdb::v3_2_0::math::MapBase::applyInverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#acebfd86fd6533114cb89773864d53c1d',1,'openvdb::v3_2_0::math::AffineMap::applyInverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#acebfd86fd6533114cb89773864d53c1d',1,'openvdb::v3_2_0::math::ScaleMap::applyInverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#acebfd86fd6533114cb89773864d53c1d',1,'openvdb::v3_2_0::math::TranslationMap::applyInverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#acebfd86fd6533114cb89773864d53c1d',1,'openvdb::v3_2_0::math::ScaleTranslateMap::applyInverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#acebfd86fd6533114cb89773864d53c1d',1,'openvdb::v3_2_0::math::UnitaryMap::applyInverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#acebfd86fd6533114cb89773864d53c1d',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::applyInverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#acebfd86fd6533114cb89773864d53c1d',1,'openvdb::v3_2_0::math::GenericMap::applyInverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a1405b0e3ebc0aacd820157a3a59d84ed',1,'openvdb::v3_2_0::math::Ray::applyInverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a1837b7e565290a653349095f3e98a68b',1,'openvdb::v3_2_0::math::BBox::applyInverseMap()']]], + ['applyjacobian',['applyJacobian',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#adbf10811051ce79fdd5cf5d69c9e7ba9',1,'openvdb::v3_2_0::math::MapBase::applyJacobian(const Vec3d &in) const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#aef7d43483204fd2df6fdb083d3364c02',1,'openvdb::v3_2_0::math::MapBase::applyJacobian(const Vec3d &in, const Vec3d &domainPos) const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a36ffb72e452116b67c6052de5e8937f9',1,'openvdb::v3_2_0::math::AffineMap::applyJacobian(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a2964937c468adedaa0a963ca20938f34',1,'openvdb::v3_2_0::math::AffineMap::applyJacobian(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a36ffb72e452116b67c6052de5e8937f9',1,'openvdb::v3_2_0::math::ScaleMap::applyJacobian(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a2964937c468adedaa0a963ca20938f34',1,'openvdb::v3_2_0::math::ScaleMap::applyJacobian(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a36ffb72e452116b67c6052de5e8937f9',1,'openvdb::v3_2_0::math::TranslationMap::applyJacobian(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a2964937c468adedaa0a963ca20938f34',1,'openvdb::v3_2_0::math::TranslationMap::applyJacobian(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a36ffb72e452116b67c6052de5e8937f9',1,'openvdb::v3_2_0::math::ScaleTranslateMap::applyJacobian(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a2964937c468adedaa0a963ca20938f34',1,'openvdb::v3_2_0::math::ScaleTranslateMap::applyJacobian(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a36ffb72e452116b67c6052de5e8937f9',1,'openvdb::v3_2_0::math::UnitaryMap::applyJacobian(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a2964937c468adedaa0a963ca20938f34',1,'openvdb::v3_2_0::math::UnitaryMap::applyJacobian(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a2964937c468adedaa0a963ca20938f34',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::applyJacobian(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a47d412772777151db5c2c36ceaec2f0c',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::applyJacobian(const Vec3d &in, const Vec3d &isloc) const ']]], + ['applyjt',['applyJT',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a5f11d33257da628b37706331d488abe3',1,'openvdb::v3_2_0::math::MapBase::applyJT(const Vec3d &in) const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a6cfd2a54c15d65cdc159016d4a00898f',1,'openvdb::v3_2_0::math::MapBase::applyJT(const Vec3d &in, const Vec3d &domainPos) const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a0759d9dc1bcea46f673070fd9bf4bed3',1,'openvdb::v3_2_0::math::AffineMap::applyJT(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a87b54b8b88bf0247a42609b08d987c35',1,'openvdb::v3_2_0::math::AffineMap::applyJT(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a0759d9dc1bcea46f673070fd9bf4bed3',1,'openvdb::v3_2_0::math::ScaleMap::applyJT(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a87b54b8b88bf0247a42609b08d987c35',1,'openvdb::v3_2_0::math::ScaleMap::applyJT(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a0759d9dc1bcea46f673070fd9bf4bed3',1,'openvdb::v3_2_0::math::TranslationMap::applyJT(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a87b54b8b88bf0247a42609b08d987c35',1,'openvdb::v3_2_0::math::TranslationMap::applyJT(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a0759d9dc1bcea46f673070fd9bf4bed3',1,'openvdb::v3_2_0::math::ScaleTranslateMap::applyJT(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a87b54b8b88bf0247a42609b08d987c35',1,'openvdb::v3_2_0::math::ScaleTranslateMap::applyJT(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a0759d9dc1bcea46f673070fd9bf4bed3',1,'openvdb::v3_2_0::math::UnitaryMap::applyJT(const Vec3d &in, const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a87b54b8b88bf0247a42609b08d987c35',1,'openvdb::v3_2_0::math::UnitaryMap::applyJT(const Vec3d &in) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#acd4fd8824fd1624055f92ee3bee9a7d1',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::applyJT(const Vec3d &in, const Vec3d &isloc) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a87b54b8b88bf0247a42609b08d987c35',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::applyJT(const Vec3d &in) const ']]], + ['applymap',['applyMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a82bf71bb2a279fbf778c0927bba67ea2',1,'openvdb::v3_2_0::math::BBox::applyMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a25df8ee7780261985003d37baf6f014d',1,'openvdb::v3_2_0::math::MapBase::applyMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#aaf2ddbdfa824130840e787c15bdd50cf',1,'openvdb::v3_2_0::math::AffineMap::applyMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#aaf2ddbdfa824130840e787c15bdd50cf',1,'openvdb::v3_2_0::math::ScaleMap::applyMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#aaf2ddbdfa824130840e787c15bdd50cf',1,'openvdb::v3_2_0::math::TranslationMap::applyMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#aaf2ddbdfa824130840e787c15bdd50cf',1,'openvdb::v3_2_0::math::ScaleTranslateMap::applyMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#aaf2ddbdfa824130840e787c15bdd50cf',1,'openvdb::v3_2_0::math::UnitaryMap::applyMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#aaf2ddbdfa824130840e787c15bdd50cf',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::applyMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#aaf2ddbdfa824130840e787c15bdd50cf',1,'openvdb::v3_2_0::math::GenericMap::applyMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a91a3d6fbb505f29fac20c5d34a5d8758',1,'openvdb::v3_2_0::math::Ray::applyMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a74f5cd9135e16864be60203d9b15b751',1,'openvdb::v3_2_0::math::BBox::applyMap()']]], + ['applytransform',['applyTransform',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html#a434be6d9b4f21ce1b2c454b0fd7ba574',1,'openvdb::v3_2_0::tools::GridResampler']]], + ['approxinverse',['approxInverse',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9e71c84383e13441c989ee8ee0c5f1f3',1,'openvdb::v3_2_0::math']]], + ['archive',['Archive',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#ab09888a4638e5b80e36d3dbd60b3cf09',1,'openvdb::v3_2_0::io::Archive']]], + ['arithmeticerror',['ArithmeticError',['../classopenvdb_1_1v3__2__0_1_1ArithmeticError.html#a2b985e9fce2019c944f995739be1e56f',1,'openvdb::v3_2_0::ArithmeticError::ArithmeticError()'],['../classopenvdb_1_1v3__2__0_1_1ArithmeticError.html#a2f1120342fa72569cf50a90e2d1f7248',1,'openvdb::v3_2_0::ArithmeticError::ArithmeticError(const std::string &msg)']]], + ['array',['Array',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1Array.html#aab8e76e6f21030c8d8580c83861690b9',1,'openvdb::v3_2_0::tools::point_partitioner_internal::Array']]], + ['asbool',['asBool',['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a1b651b9e1aa4e9edf77d2f0bf1ec77c2',1,'openvdb::v3_2_0::Metadata::asBool()'],['../classopenvdb_1_1v3__2__0_1_1UnknownMetadata.html#a052c8409034c434c1e87cb1fc6d3c11f',1,'openvdb::v3_2_0::UnknownMetadata::asBool()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#addba4304454416a12b045b32c31a74f9',1,'openvdb::v3_2_0::TypedMetadata::asBool()']]], + ['aspointer',['asPointer',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a8c21c8b9e2a202a352ffc0a04114a699',1,'openvdb::v3_2_0::math::Coord::asPointer() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a623084622b6268a5bcdb1b2c005ebec1',1,'openvdb::v3_2_0::math::Coord::asPointer()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a330fa9e5b377239abe4c99688d478700',1,'openvdb::v3_2_0::math::Mat3::asPointer()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#ae96e251b2c06c69241410c7d384ea11e',1,'openvdb::v3_2_0::math::Mat3::asPointer() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a330fa9e5b377239abe4c99688d478700',1,'openvdb::v3_2_0::math::Mat4::asPointer()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#ae96e251b2c06c69241410c7d384ea11e',1,'openvdb::v3_2_0::math::Mat4::asPointer() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a330fa9e5b377239abe4c99688d478700',1,'openvdb::v3_2_0::math::Vec2::asPointer()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ae96e251b2c06c69241410c7d384ea11e',1,'openvdb::v3_2_0::math::Vec2::asPointer() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a330fa9e5b377239abe4c99688d478700',1,'openvdb::v3_2_0::math::Vec3::asPointer()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ae96e251b2c06c69241410c7d384ea11e',1,'openvdb::v3_2_0::math::Vec3::asPointer() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a330fa9e5b377239abe4c99688d478700',1,'openvdb::v3_2_0::math::Vec4::asPointer()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#ae96e251b2c06c69241410c7d384ea11e',1,'openvdb::v3_2_0::math::Vec4::asPointer() const ']]], + ['assertnonmodifiable',['assertNonmodifiable',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#aa3740f7b3bf9900ebff77ec3689bb03f',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['asv',['asV',['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#acf2d1859cac4fc6a539d843cc26a30a6',1,'openvdb::v3_2_0::math::Tuple::asV()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#a2b8722d3c718f455444937088467c837',1,'openvdb::v3_2_0::math::Tuple::asV() const ']]], + ['asvec3d',['asVec3d',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#ae412a030a66b3c20ba6673f4cffed409',1,'openvdb::v3_2_0::math::Coord']]], + ['asvec3i',['asVec3i',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#ac0c65ed6108a571816d21c471d027dc8',1,'openvdb::v3_2_0::math::Coord::asVec3i() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a72a58ab2c9320d4ea03a0a819d4592f5',1,'openvdb::v3_2_0::math::Coord::asVec3I() const ']]], + ['asvec3s',['asVec3s',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a9bff6644dff424121371c23f935bed02',1,'openvdb::v3_2_0::math::Coord']]], + ['asxyz',['asXYZ',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#acad920b98231aa11abf9e12c46c0f2d7',1,'openvdb::v3_2_0::math::Coord']]], + ['at',['at',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#ad850312ce583faa1f6c6bb0b6c4a43d0',1,'openvdb::v3_2_0::math::pcg::Vector::at(SizeType i)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a0486203a0967f32e411d1ddd1f8f7d71',1,'openvdb::v3_2_0::math::pcg::Vector::at(SizeType i) const ']]], + ['attachaccessor',['attachAccessor',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a54209682f761f12fbdc532c82afc1f72',1,'openvdb::v3_2_0::tree::Tree::attachAccessor(ValueAccessorBase< Tree, true > &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ac3f5f9b6a54a747ff43f49272f835b2b',1,'openvdb::v3_2_0::tree::Tree::attachAccessor(ValueAccessorBase< const Tree, true > &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#aab8e1b129609b1458aaf1f8cc0650a53',1,'openvdb::v3_2_0::tree::Tree::attachAccessor(ValueAccessorBase< Tree, false > &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ac98428f4dd96b395ce9a76abd4c8230d',1,'openvdb::v3_2_0::tree::Tree::attachAccessor(ValueAccessorBase< const Tree, false > &) const ']]], + ['attributegrid',['attributeGrid',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a7d2aa4965f01599a3d0d85f82068c072',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['auxbuffercount',['auxBufferCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a96ee4d892d3cebd2319506ce4069d1ab',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['auxbuffersperleaf',['auxBuffersPerLeaf',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a331fa25148c35653896b22a29903cc46',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['auxdata',['auxData',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a26ef75e876507467c371751f1ff7b0de',1,'openvdb::v3_2_0::io::StreamMetadata::auxData()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#aa8f48a94abb11425db28e9cc593ebcb5',1,'openvdb::v3_2_0::io::StreamMetadata::auxData() const ']]], + ['avg',['Avg',['../structopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter_1_1Filter_1_1Avg.html#ad7e8889a2da4cf6c6eafda3e78327da3',1,'openvdb::v3_2_0::tools::LevelSetFilter::Filter::Avg::Avg()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#a875438343584e6e93744c8f7decba046',1,'openvdb::v3_2_0::math::Stats::avg()']]], + ['axis',['axis',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#aa9d431524278c1dec6c4a9bea41b1d23',1,'openvdb::v3_2_0::math::Quat']]], + ['axpy',['axpy',['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal.html#a78b9965b316ccbc823af34688aaeb348',1,'openvdb::v3_2_0::math::pcg::internal::axpy(const T &a, const T *xVec, const T *yVec, T *resultVec, SizeType size)'],['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal.html#a1fa9264d1d92d6dc9c3117524758de70',1,'openvdb::v3_2_0::math::pcg::internal::axpy(const T &a, const Vector< T > &xVec, const Vector< T > &yVec, Vector< T > &result)']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_1.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_1.html new file mode 100644 index 00000000..215c1bf6 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_1.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_1.js new file mode 100644 index 00000000..83536376 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_1.js @@ -0,0 +1,47 @@ +var searchData= +[ + ['b',['b',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a203ad73d76bdfc16f767a4922c727a3b',1,'openvdb::v3_2_0::CombineArgs']]], + ['background',['background',['../classopenvdb_1_1v3__2__0_1_1Grid.html#acccdab5ee066678e77d16f516d527d33',1,'openvdb::v3_2_0::Grid::background()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#acccdab5ee066678e77d16f516d527d33',1,'openvdb::v3_2_0::tree::RootNode::background()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#acccdab5ee066678e77d16f516d527d33',1,'openvdb::v3_2_0::tree::Tree::background()']]], + ['backgroundptr',['backgroundPtr',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a954dce7b6108dcbbe88f7500addf1487',1,'openvdb::v3_2_0::io::StreamMetadata']]], + ['basecamera',['BaseCamera',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#ab5a946e4ace14a607f3d69daf46ccb92',1,'openvdb::v3_2_0::tools::BaseCamera']]], + ['baseiterator',['BaseIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#a9be4690183bfdb2f5529a12583524eb5',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::BaseIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#a80d00fe591b7fbff1be179fb4e3fe62c',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::BaseIterator(Index32 pos, const RootNodeMask *parent)']]], + ['basemap',['baseMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a30f761676e53a989ac8c461add502660',1,'openvdb::v3_2_0::math::Transform::baseMap() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a5bdbacaec32f832ebe05d2ee975c8f12',1,'openvdb::v3_2_0::math::Transform::baseMap()']]], + ['basemaskiterator',['BaseMaskIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html#a9754681bd199f23298389b0fee6bcd14',1,'openvdb::v3_2_0::util::BaseMaskIterator::BaseMaskIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html#ac41b7fee3306f233301c0ce4621f3629',1,'openvdb::v3_2_0::util::BaseMaskIterator::BaseMaskIterator(Index32 pos, const NodeMask *parent)']]], + ['basepointscatter',['BasePointScatter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#ad6df65b3093bfbb426616f256844d972',1,'openvdb::v3_2_0::tools::BasePointScatter']]], + ['baseshader',['BaseShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseShader.html#a1a56c057e85640fee4bf366951a45d77',1,'openvdb::v3_2_0::tools::BaseShader']]], + ['basestencil',['BaseStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a6c26586e6f92eae4c4e060885a315fa2',1,'openvdb::v3_2_0::math::BaseStencil']]], + ['basetree',['baseTree',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a9d3dc27234695a0f72bb30b9ed9fb426',1,'openvdb::v3_2_0::GridBase::baseTree()'],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ae346849ecfcb892d0cb5f5772b25f5bc',1,'openvdb::v3_2_0::GridBase::baseTree() const ']]], + ['basetreeptr',['baseTreePtr',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ade901fd5fd57d7fd89e6f5e5e2625105',1,'openvdb::v3_2_0::GridBase::baseTreePtr()'],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ac4cd2eb9c11cf5938b2a38f330984d4c',1,'openvdb::v3_2_0::GridBase::baseTreePtr() const ']]], + ['bbox',['BBox',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a2205847ebd03bb83b357d0f312c6f073',1,'openvdb::v3_2_0::math::BBox::BBox()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a11c7db21881fcd6537c70fbcc6656a21',1,'openvdb::v3_2_0::math::BBox::BBox(const Vec3T &xyzMin, const Vec3T &xyzMax)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a60ef3d0a5cb6f7f72d731941465ff4dc',1,'openvdb::v3_2_0::math::BBox::BBox(const Vec3T &xyzMin, const Vec3T &xyzMax, bool sorted)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a0237abc4ac078cea4eaccf67024fb46a',1,'openvdb::v3_2_0::math::BBox::BBox(const Vec3T &xyzMin, const ElementType &length)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#abdb97c5595f3f5876ac647257a4f555b',1,'openvdb::v3_2_0::math::BBox::BBox(const ElementType *xyz, bool sorted=true)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a6cefd653a0940a08eb23836fc5bb0f24',1,'openvdb::v3_2_0::math::BBox::BBox(const BBox &other)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#ae6a5a389a1ca3be8b512c441f28a23cd',1,'openvdb::v3_2_0::tools::Dense::bbox()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a862a383e13b320cf77fc902b86590dc0',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::bbox()']]], + ['bboxfilter',['BBoxFilter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1BBoxFilter.html#a1df6f7e6ca92bf41a71b63f3cc8d920e',1,'openvdb::v3_2_0::tools::particle_atlas_internal::BBoxFilter::BBoxFilter()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1BBoxFilter.html#a9ae648db1efaefc78d2d5f075fbe93ce',1,'openvdb::v3_2_0::tools::point_index_grid_internal::BBoxFilter::BBoxFilter()']]], + ['begin',['begin',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange.html#a83c9fd7252c97810a9aaf392e10a00d7',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::begin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange.html#a83c9fd7252c97810a9aaf392e10a00d7',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::begin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a2362da85404e6072c0e3f39006f4bbd0',1,'openvdb::v3_2_0::tree::Tree::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1RootNodeType_1_1ChildOnIter_01_4.html#a1cb15056cdef95858bb108fac299f345',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::RootNodeType::ChildOnIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1RootNodeType_1_1ChildOnCIter_01_4.html#a09b2ff15483a59d063a0f62614551d8b',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::RootNodeType::ChildOnCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1RootNodeType_1_1ChildOffIter_01_4.html#a6ead17af564a6817e3d518c1843cfea5',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::RootNodeType::ChildOffIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1RootNodeType_1_1ChildOffCIter_01_4.html#a4522636ee3852b2e39032d4ff057af26',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::RootNodeType::ChildOffCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1RootNodeType_1_1ChildAllIter_01_4.html#aecd731f67439a2b634fdaa41ab619444',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::RootNodeType::ChildAllIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1RootNodeType_1_1ChildAllCIter_01_4.html#aa282b41ec1b8c7cee4f3e9e6638d6746',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::RootNodeType::ChildAllCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1NodeIter_01_4.html#ae6bd6d0e8f4b0c78f717d1c37cc49113',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::NodeIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1NodeCIter_01_4.html#a26420992cf2049c259f6dad965d73c13',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::NodeCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1LeafIter_01_4.html#ac0aa083865b32bc290152af80566bacf',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::LeafIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1LeafCIter_01_4.html#a490ac5f5ced828ac74f56d174f059cc9',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::LeafCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1ValueOnIter_01_4.html#a796b4488b100b19cd0bb37fe088565b8',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::ValueOnIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1ValueOnCIter_01_4.html#ac03cbb43507a3729b7d3d241a51b40a2',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::ValueOnCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1ValueOffIter_01_4.html#a9ace465e3619bbc8a1b105ee2b454ce7',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::ValueOffIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1ValueOffCIter_01_4.html#a51462bfe21548e2b7d9f8dad08ef04c4',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::ValueOffCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1ValueAllIter_01_4.html#a6e977a1368cb34ec4ff9dec3fc1da6a4',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::ValueAllIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1TreeIterTraits_3_01TreeT_00_01typename_01TreeT_1_1ValueAllCIter_01_4.html#a9b6d2bb993fa83dbf5ed0c1432393a33',1,'openvdb::v3_2_0::tree::TreeIterTraits< TreeT, typename TreeT::ValueAllCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOnIter_01_4.html#a2dc0d2dc75352f2e7bce6a4b1961dd54',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOnIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOnCIter_01_4.html#a0ea80557794991e8ba42f60490df2b34',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOnCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOffIter_01_4.html#a2dc0d2dc75352f2e7bce6a4b1961dd54',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOffIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOffCIter_01_4.html#a0ea80557794991e8ba42f60490df2b34',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOffCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildAllIter_01_4.html#a2dc0d2dc75352f2e7bce6a4b1961dd54',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildAllIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildAllCIter_01_4.html#a0ea80557794991e8ba42f60490df2b34',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildAllCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOnIter_01_4.html#a2dc0d2dc75352f2e7bce6a4b1961dd54',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOnIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOnCIter_01_4.html#a0ea80557794991e8ba42f60490df2b34',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOnCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOffIter_01_4.html#a2dc0d2dc75352f2e7bce6a4b1961dd54',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOffIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOffCIter_01_4.html#a0ea80557794991e8ba42f60490df2b34',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOffCIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueAllIter_01_4.html#a2dc0d2dc75352f2e7bce6a4b1961dd54',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueAllIter >::begin()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueAllCIter_01_4.html#a0ea80557794991e8ba42f60490df2b34',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueAllCIter >::begin()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a2387033802383edbdc95f9bbb12a707e',1,'openvdb::v3_2_0::util::PagedArray::begin()']]], + ['beginchildall',['beginChildAll',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a599e840b09098cf3437a3c4bd366ee79',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::beginChildAll() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a7000148c6f1dc8bfbb0139a3606e188e',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::beginChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a599e840b09098cf3437a3c4bd366ee79',1,'openvdb::v3_2_0::tree::InternalNode::beginChildAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a7000148c6f1dc8bfbb0139a3606e188e',1,'openvdb::v3_2_0::tree::InternalNode::beginChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a599e840b09098cf3437a3c4bd366ee79',1,'openvdb::v3_2_0::tree::LeafNode::beginChildAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a7000148c6f1dc8bfbb0139a3606e188e',1,'openvdb::v3_2_0::tree::LeafNode::beginChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a599e840b09098cf3437a3c4bd366ee79',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::beginChildAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a7000148c6f1dc8bfbb0139a3606e188e',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::beginChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a599e840b09098cf3437a3c4bd366ee79',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::beginChildAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a7000148c6f1dc8bfbb0139a3606e188e',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::beginChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a599e840b09098cf3437a3c4bd366ee79',1,'openvdb::v3_2_0::tree::RootNode::beginChildAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a7000148c6f1dc8bfbb0139a3606e188e',1,'openvdb::v3_2_0::tree::RootNode::beginChildAll()']]], + ['beginchildoff',['beginChildOff',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a8438e994f130eacf9f40014a97514bcd',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::beginChildOff() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a845985fcf5013cc3fe15865b05b3abd5',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::beginChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a8438e994f130eacf9f40014a97514bcd',1,'openvdb::v3_2_0::tree::InternalNode::beginChildOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a845985fcf5013cc3fe15865b05b3abd5',1,'openvdb::v3_2_0::tree::InternalNode::beginChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a8438e994f130eacf9f40014a97514bcd',1,'openvdb::v3_2_0::tree::LeafNode::beginChildOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a845985fcf5013cc3fe15865b05b3abd5',1,'openvdb::v3_2_0::tree::LeafNode::beginChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8438e994f130eacf9f40014a97514bcd',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::beginChildOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a845985fcf5013cc3fe15865b05b3abd5',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::beginChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8438e994f130eacf9f40014a97514bcd',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::beginChildOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a845985fcf5013cc3fe15865b05b3abd5',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::beginChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a8438e994f130eacf9f40014a97514bcd',1,'openvdb::v3_2_0::tree::RootNode::beginChildOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a845985fcf5013cc3fe15865b05b3abd5',1,'openvdb::v3_2_0::tree::RootNode::beginChildOff()']]], + ['beginchildon',['beginChildOn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a31c7157dee0e08c357e6a3ed6415a00e',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::beginChildOn() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a0f712beff77da092dd726a59e1104cf0',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::beginChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a31c7157dee0e08c357e6a3ed6415a00e',1,'openvdb::v3_2_0::tree::InternalNode::beginChildOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a0f712beff77da092dd726a59e1104cf0',1,'openvdb::v3_2_0::tree::InternalNode::beginChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a31c7157dee0e08c357e6a3ed6415a00e',1,'openvdb::v3_2_0::tree::LeafNode::beginChildOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a0f712beff77da092dd726a59e1104cf0',1,'openvdb::v3_2_0::tree::LeafNode::beginChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a31c7157dee0e08c357e6a3ed6415a00e',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::beginChildOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a0f712beff77da092dd726a59e1104cf0',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::beginChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a31c7157dee0e08c357e6a3ed6415a00e',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::beginChildOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a0f712beff77da092dd726a59e1104cf0',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::beginChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a31c7157dee0e08c357e6a3ed6415a00e',1,'openvdb::v3_2_0::tree::RootNode::beginChildOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a0f712beff77da092dd726a59e1104cf0',1,'openvdb::v3_2_0::tree::RootNode::beginChildOn()']]], + ['begindense',['beginDense',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a07b8f6971749d038dfb0c264a456a0c0',1,'openvdb::v3_2_0::util::NodeMask::beginDense()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a07b8f6971749d038dfb0c264a456a0c0',1,'openvdb::v3_2_0::util::NodeMask< 1 >::beginDense()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a07b8f6971749d038dfb0c264a456a0c0',1,'openvdb::v3_2_0::util::NodeMask< 2 >::beginDense()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a07b8f6971749d038dfb0c264a456a0c0',1,'openvdb::v3_2_0::util::RootNodeMask::beginDense()']]], + ['beginleaf',['beginLeaf',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ad71e0011e4f27f225c923b8e0b404dca',1,'openvdb::v3_2_0::tree::Tree::beginLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ad282de2508cffe340925fcbb42d17f9b',1,'openvdb::v3_2_0::tree::Tree::beginLeaf() const ']]], + ['beginmeta',['beginMeta',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#aaffd4267064b4952be89781e5d077568',1,'openvdb::v3_2_0::MetaMap::beginMeta()'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a2362e26905b25466647458eabb21ab18',1,'openvdb::v3_2_0::MetaMap::beginMeta() const ']]], + ['beginname',['beginName',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a2754a3953dde14e81677a67f335230ad',1,'openvdb::v3_2_0::io::File']]], + ['beginnode',['beginNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#af6a7c7dea5e04a9572a5ca396269f303',1,'openvdb::v3_2_0::tree::Tree::beginNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a0f89ac3be99d8e2f4122048dfdd8c014',1,'openvdb::v3_2_0::tree::Tree::beginNode() const ']]], + ['beginoff',['beginOff',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a78214e355b1da718a6cde1836c39e958',1,'openvdb::v3_2_0::util::NodeMask::beginOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a78214e355b1da718a6cde1836c39e958',1,'openvdb::v3_2_0::util::NodeMask< 1 >::beginOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a78214e355b1da718a6cde1836c39e958',1,'openvdb::v3_2_0::util::NodeMask< 2 >::beginOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a78214e355b1da718a6cde1836c39e958',1,'openvdb::v3_2_0::util::RootNodeMask::beginOff()']]], + ['beginon',['beginOn',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a7bc82ea0ec957e4305fc7351e9f5a689',1,'openvdb::v3_2_0::util::NodeMask::beginOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a7bc82ea0ec957e4305fc7351e9f5a689',1,'openvdb::v3_2_0::util::NodeMask< 1 >::beginOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a7bc82ea0ec957e4305fc7351e9f5a689',1,'openvdb::v3_2_0::util::NodeMask< 2 >::beginOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a7bc82ea0ec957e4305fc7351e9f5a689',1,'openvdb::v3_2_0::util::RootNodeMask::beginOn()']]], + ['beginrootchildren',['beginRootChildren',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a1249d2b212338d97bc848a54d2fa8fd4',1,'openvdb::v3_2_0::tree::Tree::beginRootChildren() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a4c83c14d8f83d5253045dd94d4951d25',1,'openvdb::v3_2_0::tree::Tree::beginRootChildren()']]], + ['beginrootdense',['beginRootDense',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a43f2ff83152d1d11a528bc0012f5debd',1,'openvdb::v3_2_0::tree::Tree::beginRootDense() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a2d6659f4ecac5a96ff225ade7f4f4186',1,'openvdb::v3_2_0::tree::Tree::beginRootDense()']]], + ['beginroottiles',['beginRootTiles',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a60f62d7136d9d069f64092b6451538e1',1,'openvdb::v3_2_0::tree::Tree::beginRootTiles() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a339dea8047a951d8ae190efb80a269cd',1,'openvdb::v3_2_0::tree::Tree::beginRootTiles()']]], + ['beginvalueall',['beginValueAll',['../classopenvdb_1_1v3__2__0_1_1Grid.html#afdf6fa279da1f6839a3ca381828220df',1,'openvdb::v3_2_0::Grid::beginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a18ec03c783bc71e824837c826dd6531c',1,'openvdb::v3_2_0::Grid::beginValueAll() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a18ec03c783bc71e824837c826dd6531c',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::beginValueAll() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#afdf6fa279da1f6839a3ca381828220df',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::beginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a18ec03c783bc71e824837c826dd6531c',1,'openvdb::v3_2_0::tree::InternalNode::beginValueAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#afdf6fa279da1f6839a3ca381828220df',1,'openvdb::v3_2_0::tree::InternalNode::beginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a18ec03c783bc71e824837c826dd6531c',1,'openvdb::v3_2_0::tree::LeafNode::beginValueAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#afdf6fa279da1f6839a3ca381828220df',1,'openvdb::v3_2_0::tree::LeafNode::beginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a18ec03c783bc71e824837c826dd6531c',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::beginValueAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#afdf6fa279da1f6839a3ca381828220df',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::beginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a18ec03c783bc71e824837c826dd6531c',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::beginValueAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#afdf6fa279da1f6839a3ca381828220df',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::beginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a18ec03c783bc71e824837c826dd6531c',1,'openvdb::v3_2_0::tree::RootNode::beginValueAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#afdf6fa279da1f6839a3ca381828220df',1,'openvdb::v3_2_0::tree::RootNode::beginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#afdf6fa279da1f6839a3ca381828220df',1,'openvdb::v3_2_0::tree::Tree::beginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a18ec03c783bc71e824837c826dd6531c',1,'openvdb::v3_2_0::tree::Tree::beginValueAll() const ']]], + ['beginvalueoff',['beginValueOff',['../classopenvdb_1_1v3__2__0_1_1Grid.html#ad555f92c70739496805fb480c3b38f85',1,'openvdb::v3_2_0::Grid::beginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a17282c62bdf7cdd25be3b773b39907b0',1,'openvdb::v3_2_0::Grid::beginValueOff() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a17282c62bdf7cdd25be3b773b39907b0',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::beginValueOff() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ad555f92c70739496805fb480c3b38f85',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::beginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a17282c62bdf7cdd25be3b773b39907b0',1,'openvdb::v3_2_0::tree::InternalNode::beginValueOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ad555f92c70739496805fb480c3b38f85',1,'openvdb::v3_2_0::tree::InternalNode::beginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a17282c62bdf7cdd25be3b773b39907b0',1,'openvdb::v3_2_0::tree::LeafNode::beginValueOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ad555f92c70739496805fb480c3b38f85',1,'openvdb::v3_2_0::tree::LeafNode::beginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a17282c62bdf7cdd25be3b773b39907b0',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::beginValueOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ad555f92c70739496805fb480c3b38f85',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::beginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a17282c62bdf7cdd25be3b773b39907b0',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::beginValueOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ad555f92c70739496805fb480c3b38f85',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::beginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a17282c62bdf7cdd25be3b773b39907b0',1,'openvdb::v3_2_0::tree::RootNode::beginValueOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ad555f92c70739496805fb480c3b38f85',1,'openvdb::v3_2_0::tree::RootNode::beginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ad555f92c70739496805fb480c3b38f85',1,'openvdb::v3_2_0::tree::Tree::beginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a17282c62bdf7cdd25be3b773b39907b0',1,'openvdb::v3_2_0::tree::Tree::beginValueOff() const ']]], + ['beginvalueon',['beginValueOn',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a7b8568cb11eacfedf042fa1eda680a45',1,'openvdb::v3_2_0::Grid::beginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a0f82a16370621f762a097f27122e51db',1,'openvdb::v3_2_0::Grid::beginValueOn() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a0f82a16370621f762a097f27122e51db',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::beginValueOn() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a7b8568cb11eacfedf042fa1eda680a45',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::beginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a0f82a16370621f762a097f27122e51db',1,'openvdb::v3_2_0::tree::InternalNode::beginValueOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a7b8568cb11eacfedf042fa1eda680a45',1,'openvdb::v3_2_0::tree::InternalNode::beginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a0f82a16370621f762a097f27122e51db',1,'openvdb::v3_2_0::tree::LeafNode::beginValueOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a7b8568cb11eacfedf042fa1eda680a45',1,'openvdb::v3_2_0::tree::LeafNode::beginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a0f82a16370621f762a097f27122e51db',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::beginValueOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a7b8568cb11eacfedf042fa1eda680a45',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::beginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a0f82a16370621f762a097f27122e51db',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::beginValueOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a7b8568cb11eacfedf042fa1eda680a45',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::beginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a0f82a16370621f762a097f27122e51db',1,'openvdb::v3_2_0::tree::RootNode::beginValueOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a7b8568cb11eacfedf042fa1eda680a45',1,'openvdb::v3_2_0::tree::RootNode::beginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a7b8568cb11eacfedf042fa1eda680a45',1,'openvdb::v3_2_0::tree::Tree::beginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a0f82a16370621f762a097f27122e51db',1,'openvdb::v3_2_0::tree::Tree::beginValueOn() const ']]], + ['bezlerp',['bezLerp',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a0eb3c817b579873a7a66cc2df1e78a24',1,'openvdb::v3_2_0::math']]], + ['biasedgradientschemetomenuname',['biasedGradientSchemeToMenuName',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9ab7b70b89a3b6277be33be8421c7252',1,'openvdb::v3_2_0::math']]], + ['biasedgradientschemetostring',['biasedGradientSchemeToString',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a98410fd1804a4869c7ba4f464b2e7d12',1,'openvdb::v3_2_0::math']]], + ['binandsegment',['binAndSegment',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal.html#a027439a66c7b059eee5caff4a7f80167',1,'openvdb::v3_2_0::tools::point_partitioner_internal']]], + ['binpointindicesop',['BinPointIndicesOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#a6a165a4518ec7021907f57622e75409a',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp']]], + ['bisactive',['bIsActive',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a6f9fc22ae06ed1821e56c4a3081ef050',1,'openvdb::v3_2_0::CombineArgs']]], + ['bloscfromstream',['bloscFromStream',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a2955c42a1413446476884549d2bb0dcf',1,'openvdb::v3_2_0::io']]], + ['blosctostream',['bloscToStream',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a88c13bbd1d0d84bdc8bc39174e9a350c',1,'openvdb::v3_2_0::io']]], + ['boost_5fstatic_5fassert',['BOOST_STATIC_ASSERT',['../structopenvdb_1_1v3__2__0_1_1PointIndex.html#ac53dc840311c44b6fa1499dd579e2c18',1,'openvdb::v3_2_0::PointIndex::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#ad497d785d5327457e39f95d3b4046878',1,'openvdb::v3_2_0::math::Ray::BOOST_STATIC_ASSERT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#a7d29d1f0905218e8af6d642f0c63b150',1,'openvdb::v3_2_0::tools::CheckNormGrad::BOOST_STATIC_ASSERT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#a7d29d1f0905218e8af6d642f0c63b150',1,'openvdb::v3_2_0::tools::CheckEikonal::BOOST_STATIC_ASSERT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#a58376072b7f57654be23153c9d42e86d',1,'openvdb::v3_2_0::tools::CheckDivergence::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#ab1bf31f8ca727a167c5e34eb1c5100a3',1,'openvdb::v3_2_0::tools::Filter::BOOST_STATIC_ASSERT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler.html#a1cb7710f6a4f87a2e7dafa22a996914b',1,'openvdb::v3_2_0::tools::Sampler::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#ab382567dccbe74d583cd79f40666eee0',1,'openvdb::v3_2_0::tools::AlphaMask::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#ab1bf31f8ca727a167c5e34eb1c5100a3',1,'openvdb::v3_2_0::tools::LevelSetFilter::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#a7d29d1f0905218e8af6d642f0c63b150',1,'openvdb::v3_2_0::tools::LevelSetMeasure::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetSphere.html#a22fe0cf82dc7fa686c4cad35fbfc4dfa',1,'openvdb::v3_2_0::tools::LevelSetSphere::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a7d29d1f0905218e8af6d642f0c63b150',1,'openvdb::v3_2_0::tools::LevelSetTracker::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a2a0d54fcbbfef466127512d9936bc980',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1InactivePruneOp.html#a1497d30ff71145314b12d264803ede5f',1,'openvdb::v3_2_0::tools::InactivePruneOp::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1TolerancePruneOp.html#a1497d30ff71145314b12d264803ede5f',1,'openvdb::v3_2_0::tools::TolerancePruneOp::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetPruneOp.html#a1497d30ff71145314b12d264803ede5f',1,'openvdb::v3_2_0::tools::LevelSetPruneOp::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#a5136ae30521289725464e4c4615e0e1b',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::BOOST_STATIC_ASSERT(NodeLevel >=-1 &&NodeLevel< int(TreeT::DEPTH)-1)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#a22fe0cf82dc7fa686c4cad35fbfc4dfa',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::BOOST_STATIC_ASSERT(boost::is_floating_point< ValueT >::value)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a1cb36a9103d12de83f0ede0bf468d64b',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#a7d29d1f0905218e8af6d642f0c63b150',1,'openvdb::v3_2_0::tools::VolumeRender::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SignedFloodFillOp.html#a93bbe4e1b9eee738cc3a074304f9e576',1,'openvdb::v3_2_0::tools::SignedFloodFillOp::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiscreteField.html#a7d29d1f0905218e8af6d642f0c63b150',1,'openvdb::v3_2_0::tools::DiscreteField::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1EnrightField.html#af73725fadda3e7c72a86c5c3b92cfd4d',1,'openvdb::v3_2_0::tools::EnrightField::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#ab67407460a559de06d73365ac29e53c7',1,'openvdb::v3_2_0::tree::NodeManager::BOOST_STATIC_ASSERT(LEVELS > 0)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#ab3e575c1c88d2143e768651d2165a85e',1,'openvdb::v3_2_0::tree::NodeManager::BOOST_STATIC_ASSERT(RootNodeType::LEVEL >=LEVELS)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a1ba6784a6079c6796aec6f7c70f9e921',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a9aae4e0926eda7958f1ee9d048849063',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a969ccaa3170e0a25e52782a526cdd651',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a7eb25447bb5bc9e6ff99e68cb3f59e38',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a12a96d8c2c42dbfc2d1748c237eeb661',1,'openvdb::v3_2_0::tree::RootNode::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a9e9ddade663422ab183a2b53f3eb736e',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a1880f46a3ee75eb595fdebb6f9e7f2f2',1,'openvdb::v3_2_0::tree::ValueAccessor::BOOST_STATIC_ASSERT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#aa495fbc8682cd3f52ebe2de7a5965d01',1,'openvdb::v3_2_0::tree::ValueAccessor1::BOOST_STATIC_ASSERT(_TreeType::DEPTH >=2)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#ada747a91a50661870cd83e2441c958c4',1,'openvdb::v3_2_0::tree::ValueAccessor1::BOOST_STATIC_ASSERT(L0< _TreeType::RootNodeType::LEVEL)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#aa5c28fa6ab325c0720319e0811ec25fd',1,'openvdb::v3_2_0::tree::ValueAccessor2::BOOST_STATIC_ASSERT(_TreeType::DEPTH >=3)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#ac045fd0d509189c5ee90f4f64c53d053',1,'openvdb::v3_2_0::tree::ValueAccessor2::BOOST_STATIC_ASSERT(L0< L1 &&L1< _TreeType::RootNodeType::LEVEL)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a489c95d20136fe9832ba1ad9481ce894',1,'openvdb::v3_2_0::tree::ValueAccessor3::BOOST_STATIC_ASSERT(_TreeType::DEPTH >=4)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a4e2457d1e1dea87fc27c1d8c7df3c2e4',1,'openvdb::v3_2_0::tree::ValueAccessor3::BOOST_STATIC_ASSERT(L0< L1 &&L1< L2 &&L2< _TreeType::RootNodeType::LEVEL)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a5823334cf15b0da22954c5eeaf525ebd',1,'openvdb::v3_2_0::util::NodeMask::BOOST_STATIC_ASSERT()']]], + ['boxstencil',['BoxStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1BoxStencil.html#a5b9edb8cfcb9232c8c680a5a8fd08b42',1,'openvdb::v3_2_0::math::BoxStencil']]], + ['buffer',['buffer',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#a9691ba98b84d19d3c60367a1667123c4',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::buffer()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a6c82ec5c88f6f31c16fb3e3d728ecae8',1,'openvdb::v3_2_0::tree::LeafNode::buffer() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a6e4d32cef58578c6471ad6c3dd0db7d3',1,'openvdb::v3_2_0::tree::LeafNode::buffer()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a6c82ec5c88f6f31c16fb3e3d728ecae8',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::buffer() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a6e4d32cef58578c6471ad6c3dd0db7d3',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::buffer()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a6c82ec5c88f6f31c16fb3e3d728ecae8',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::buffer() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a6e4d32cef58578c6471ad6c3dd0db7d3',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::buffer()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#a47587d18a394fb4b9508c61e3d5f0260',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::Buffer()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#abb55e03e20a28918e79767f19930f104',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::Buffer(const ValueType &val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#a44966c75218c6fe8b2a801144610a247',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::Buffer(const Buffer &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#ad50f0108c95c6c163dc4412a7110c9cb',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::Buffer(PartialCreate, const ValueType &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#a47587d18a394fb4b9508c61e3d5f0260',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::Buffer()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#ae7df51e3608ab80eeb5f3232147b1f40',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::Buffer(bool on)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#a18ea50af76d7a6d972e2eb6d7e1d6873',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::Buffer(const NodeMaskType &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#a44966c75218c6fe8b2a801144610a247',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::Buffer(const Buffer &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#a47587d18a394fb4b9508c61e3d5f0260',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::Buffer()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#ae7df51e3608ab80eeb5f3232147b1f40',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::Buffer(bool on)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#a18ea50af76d7a6d972e2eb6d7e1d6873',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::Buffer(const NodeMaskType &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#a44966c75218c6fe8b2a801144610a247',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::Buffer(const Buffer &other)']]], + ['buildprimarysegment',['BuildPrimarySegment',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildPrimarySegment.html#a588703de74622d1165a3d3df1bb280d3',1,'openvdb::v3_2_0::tools::composite::BuildPrimarySegment']]], + ['buildsecondarysegment',['BuildSecondarySegment',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildSecondarySegment.html#a9bbab5cfde8740145a0472572ad2c981',1,'openvdb::v3_2_0::tools::composite::BuildSecondarySegment']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_10.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_10.html new file mode 100644 index 00000000..504411db --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_10.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_10.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_10.js new file mode 100644 index 00000000..be0695df --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_10.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['quad',['quad',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#a46b98c7e8bddaf88d1e1d80cbd2ea3bb',1,'openvdb::v3_2_0::tools::PolygonPool::quad(size_t n)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#a23551b27204457100b9025e49a1db28d',1,'openvdb::v3_2_0::tools::PolygonPool::quad(size_t n) const ']]], + ['quadandtriangledataadapter',['QuadAndTriangleDataAdapter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadAndTriangleDataAdapter.html#a77132b44ec7d41809377d4bd855ba459',1,'openvdb::v3_2_0::tools::QuadAndTriangleDataAdapter::QuadAndTriangleDataAdapter(const std::vector< PointType > &points, const std::vector< PolygonType > &polygons)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadAndTriangleDataAdapter.html#abed5272d67f448d98ffb5530a78c8040',1,'openvdb::v3_2_0::tools::QuadAndTriangleDataAdapter::QuadAndTriangleDataAdapter(const PointType *pointArray, size_t pointArraySize, const PolygonType *polygonArray, size_t polygonArraySize)']]], + ['quadflags',['quadFlags',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#ace83320b1a904f7fc283ae27bf1cee18',1,'openvdb::v3_2_0::tools::PolygonPool::quadFlags(size_t n)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#a7ac088c07dbb87912e1eed398c6cfcec',1,'openvdb::v3_2_0::tools::PolygonPool::quadFlags(size_t n) const ']]], + ['quat',['Quat',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#af22f1a8ea4be4e26bdb9417698c59bf7',1,'openvdb::v3_2_0::math::Quat::Quat()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#aa2de4bf209b4613bb9a148cd10d17e56',1,'openvdb::v3_2_0::math::Quat::Quat(T x, T y, T z, T w)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a55f983267a298932049687603f73e19e',1,'openvdb::v3_2_0::math::Quat::Quat(T *a)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a644f03043ec359f8149f2a590ed19ff4',1,'openvdb::v3_2_0::math::Quat::Quat(const Vec3< T > &axis, T angle)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a5ba702efec452553e1de05edfaae411d',1,'openvdb::v3_2_0::math::Quat::Quat(math::Axis axis, T angle)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a87e9a26f7bb5e7579fbee0453a2c2c42',1,'openvdb::v3_2_0::math::Quat::Quat(const Mat3< T1 > &rot)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a83df9837eed3738891de792843bff015',1,'openvdb::v3_2_0::math::Quat::Quat(const Quat &q)']]], + ['queue',['Queue',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#ad9627bf962cb5c9e2d3e9b50e29f7f90',1,'openvdb::v3_2_0::io::Queue']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_11.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_11.html new file mode 100644 index 00000000..2626a849 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_11.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_11.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_11.js new file mode 100644 index 00000000..9a54f844 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_11.js @@ -0,0 +1,90 @@ +var searchData= +[ + ['radialrangefilter',['RadialRangeFilter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RadialRangeFilter.html#a2823eecca5739187391cd091af34f599',1,'openvdb::v3_2_0::tools::particle_atlas_internal::RadialRangeFilter::RadialRangeFilter()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1RadialRangeFilter.html#a4f4cabaf6ae8111941666a80086fb78d',1,'openvdb::v3_2_0::tools::point_index_grid_internal::RadialRangeFilter::RadialRangeFilter()']]], + ['radius',['radius',['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1BoolSampler.html#a4836a8d316f4fbaaf3064e0b1acd10ec',1,'openvdb::v3_2_0::tools::clip_internal::BoolSampler::radius()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler.html#a4836a8d316f4fbaaf3064e0b1acd10ec',1,'openvdb::v3_2_0::tools::Sampler::radius()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointSampler.html#a4836a8d316f4fbaaf3064e0b1acd10ec',1,'openvdb::v3_2_0::tools::PointSampler::radius()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html#a4836a8d316f4fbaaf3064e0b1acd10ec',1,'openvdb::v3_2_0::tools::BoxSampler::radius()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadraticSampler.html#a4836a8d316f4fbaaf3064e0b1acd10ec',1,'openvdb::v3_2_0::tools::QuadraticSampler::radius()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredPointSampler.html#a4836a8d316f4fbaaf3064e0b1acd10ec',1,'openvdb::v3_2_0::tools::StaggeredPointSampler::radius()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredBoxSampler.html#a4836a8d316f4fbaaf3064e0b1acd10ec',1,'openvdb::v3_2_0::tools::StaggeredBoxSampler::radius()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredQuadraticSampler.html#a4836a8d316f4fbaaf3064e0b1acd10ec',1,'openvdb::v3_2_0::tools::StaggeredQuadraticSampler::radius()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UpdatePoints.html#afe45306f1c8ce176fcf6c80359b2f136',1,'openvdb::v3_2_0::tools::internal::UpdatePoints::radius()']]], + ['rand01',['Rand01',['../classopenvdb_1_1v3__2__0_1_1math_1_1Rand01.html#a503080d0706177fb9605c77e0b20bb42',1,'openvdb::v3_2_0::math::Rand01::Rand01(const EngineType &engine)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Rand01.html#aac98d221805cbaf767b06d81e44d6b79',1,'openvdb::v3_2_0::math::Rand01::Rand01(unsigned int seed)']]], + ['randint',['RandInt',['../classopenvdb_1_1v3__2__0_1_1math_1_1RandInt.html#aaa7702417c351f612b7f109a89836eb7',1,'openvdb::v3_2_0::math::RandInt::RandInt(const EngineType &engine, IntType imin, IntType imax)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1RandInt.html#a27279fdddf927e62083a36b34a359143',1,'openvdb::v3_2_0::math::RandInt::RandInt(unsigned int seed, IntType imin, IntType imax)']]], + ['range',['range',['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#a2c0001a9b45f59a550856e5127a49eda',1,'openvdb::v3_2_0::math::Extrema']]], + ['rasterizemask',['rasterizeMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a0dd5ff2b2920001e8fbedb75c4d8d0b5',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet::rasterizeMask(const GridT &grid, const int dilationInVoxels=1, const int erosionInVoxels=1)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a2c076d91f14a195eba7069b088857964',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet::rasterizeMask(const MaskGrid &maskGrid, int dilation, int erosion)']]], + ['rasterizepoints',['rasterizePoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a9f42651ade15ca68bbb165b38c665a5c',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['rasterizespheres',['rasterizeSpheres',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a6d05bbe98be845e930fb730ac3e33a4d',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet::rasterizeSpheres(const ParticleListT &pa)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a235ecfaac6a666140892d1775d2041b7',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet::rasterizeSpheres(const ParticleListT &pa, Real radius)']]], + ['rasterizetrails',['rasterizeTrails',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a0d7ecf476625b0834d172d48b5614972',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['rastertoscreen',['rasterToScreen',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#ace5b6dcb7b3a6a8ad135c02850f09a8b',1,'openvdb::v3_2_0::tools::BaseCamera']]], + ['ray',['Ray',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a0b46663f5486c8d7b09318504523fdbc',1,'openvdb::v3_2_0::math::Ray']]], + ['raytrace',['rayTrace',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8642ecf09da68f9d3d16f606be7ae301',1,'openvdb::v3_2_0::tools::rayTrace(const GridT &, const BaseShader &, BaseCamera &, size_t pixelSamples=1, unsigned int seed=0, bool threaded=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a02be13fa85c9edfa183b39d1255ff6c4',1,'openvdb::v3_2_0::tools::rayTrace(const GridT &, const IntersectorT &, const BaseShader &, BaseCamera &, size_t pixelSamples=1, unsigned int seed=0, bool threaded=true)']]], + ['read',['read',['../structopenvdb_1_1v3__2__0_1_1io_1_1HalfReader_3_01false_00_01T_01_4.html#aae92eae700f11f358af61334586184e5',1,'openvdb::v3_2_0::io::HalfReader< false, T >::read()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1HalfReader_3_01true_00_01T_01_4.html#aae92eae700f11f358af61334586184e5',1,'openvdb::v3_2_0::io::HalfReader< true, T >::read()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a625a8ac4631f76c21608537f437cd5aa',1,'openvdb::v3_2_0::io::GridDescriptor::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::BBox::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::Coord::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::CoordBBox::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a7b173acf2f1c9d71e6dc43bb2501dddb',1,'openvdb::v3_2_0::math::MapBase::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::AffineMap::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::ScaleMap::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::TranslationMap::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::ScaleTranslateMap::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::UnitaryMap::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::CompoundMap::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::Mat::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::Quat::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a8a43053947abc08a85ad9f53558ce19f',1,'openvdb::v3_2_0::math::Transform::read()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#afe26ae4fc0786b8b0ff04bc08b90ae91',1,'openvdb::v3_2_0::math::Tuple::read()'],['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a8a43053947abc08a85ad9f53558ce19f',1,'openvdb::v3_2_0::Metadata::read()']]], + ['readallgridmetadata',['readAllGridMetadata',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#abf37aaa82022716eede54e8d58b94c20',1,'openvdb::v3_2_0::io::File']]], + ['readbuffers',['readBuffers',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a21616adb77e7d3fe436d342dbbc3f904',1,'openvdb::v3_2_0::GridBase::readBuffers(std::istream &)=0'],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#acbd2ddfaf3713feab2393a4e213a1ed6',1,'openvdb::v3_2_0::GridBase::readBuffers(std::istream &, const CoordBBox &)=0'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#aad15895857af5d3c39f9c2e91cfcf83a',1,'openvdb::v3_2_0::Grid::readBuffers(std::istream &)'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a0ed063ecc9bfce28275877aa96361539',1,'openvdb::v3_2_0::Grid::readBuffers(std::istream &, const CoordBBox &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ab4336a6e7f4195e943a76cd50fe0320e',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::readBuffers(std::istream &is, bool fromHalf=false)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#af94901d629d53f0ecab6bf1eb806fcee',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::readBuffers(std::istream &is, const CoordBBox &, bool fromHalf=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aef270a4e4900e5e0bd24e6664d6a8a82',1,'openvdb::v3_2_0::tree::InternalNode::readBuffers(std::istream &, bool fromHalf=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a9d516efdbb242e00e7c77ae85cc426b6',1,'openvdb::v3_2_0::tree::InternalNode::readBuffers(std::istream &, const CoordBBox &, bool fromHalf=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ab4336a6e7f4195e943a76cd50fe0320e',1,'openvdb::v3_2_0::tree::LeafNode::readBuffers(std::istream &is, bool fromHalf=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a859ff8bcfb4872c015b7a813c737eb7e',1,'openvdb::v3_2_0::tree::LeafNode::readBuffers(std::istream &is, const CoordBBox &bbox, bool fromHalf=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aef270a4e4900e5e0bd24e6664d6a8a82',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::readBuffers(std::istream &, bool fromHalf=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#af94901d629d53f0ecab6bf1eb806fcee',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::readBuffers(std::istream &is, const CoordBBox &, bool fromHalf=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aef270a4e4900e5e0bd24e6664d6a8a82',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::readBuffers(std::istream &, bool fromHalf=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#af94901d629d53f0ecab6bf1eb806fcee',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::readBuffers(std::istream &is, const CoordBBox &, bool fromHalf=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#aef270a4e4900e5e0bd24e6664d6a8a82',1,'openvdb::v3_2_0::tree::RootNode::readBuffers(std::istream &, bool fromHalf=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a9d516efdbb242e00e7c77ae85cc426b6',1,'openvdb::v3_2_0::tree::RootNode::readBuffers(std::istream &, const CoordBBox &, bool fromHalf=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a355f88e882ef5bab882472098c912ab1',1,'openvdb::v3_2_0::tree::TreeBase::readBuffers(std::istream &, bool saveFloatAsHalf=false)=0'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a6e32458712135f1dee4d084c88c9b23d',1,'openvdb::v3_2_0::tree::TreeBase::readBuffers(std::istream &, const CoordBBox &, bool saveFloatAsHalf=false)=0'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#abd7e6993b3e10e49eb17f6387ced71fb',1,'openvdb::v3_2_0::tree::Tree::readBuffers(std::istream &, bool saveFloatAsHalf=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#afbbcc1814fccd5c8ff5378c444441e39',1,'openvdb::v3_2_0::tree::Tree::readBuffers(std::istream &, const CoordBBox &, bool saveFloatAsHalf=false)']]], + ['readcompressedvalues',['readCompressedValues',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a1441af9c1d465be4b5012dcb1e479bd2',1,'openvdb::v3_2_0::io']]], + ['readdata',['readData',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#acb5ef6ae7798a46698c16fd2319b5c99',1,'openvdb::v3_2_0::io']]], + ['readdata_3c_20std_3a_3astring_20_3e',['readData< std::string >',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#adfe4d8c0b8287b2da5022fa65fd31d01',1,'openvdb::v3_2_0::io']]], + ['readgrid',['readGrid',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a1feee91a690bf00206d9e3aeebc7b5e2',1,'openvdb::v3_2_0::io::Archive::readGrid(GridBase::Ptr, const GridDescriptor &, std::istream &)'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a5d363638cdc74d9f5a762151079f1322',1,'openvdb::v3_2_0::io::Archive::readGrid(GridBase::Ptr, const GridDescriptor &, std::istream &, const BBoxd &)'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a90d53022b607480bbe36928056fec04e',1,'openvdb::v3_2_0::io::Archive::readGrid(GridBase::Ptr, const GridDescriptor &, std::istream &, const CoordBBox &)'],['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a91480f9c9b8612508353e01a47cbe176',1,'openvdb::v3_2_0::io::File::readGrid(const Name &)'],['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a4849f1481df698ce43518cb1924b0792',1,'openvdb::v3_2_0::io::File::readGrid(const Name &, const BBoxd &)']]], + ['readgridcompression',['readGridCompression',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a9bc6f0770123e65be73ffcaab35e6183',1,'openvdb::v3_2_0::io::Archive']]], + ['readgridcount',['readGridCount',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a81e623ab8158d4660b191a98ab6ba0a7',1,'openvdb::v3_2_0::io::Archive']]], + ['readgridmetadata',['readGridMetadata',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#ab12472377bbdbcab1d0bc3258c76f289',1,'openvdb::v3_2_0::io::File']]], + ['readgridpartial',['readGridPartial',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a069f364ed7ff5c9c7bd2a33bb62c9a09',1,'openvdb::v3_2_0::io::File']]], + ['readheader',['readHeader',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#ad758493a96282d6cf90a13772a685067',1,'openvdb::v3_2_0::io::Archive']]], + ['readmeta',['readMeta',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a89e8cec0af5988342e305537d910f4e5',1,'openvdb::v3_2_0::MetaMap']]], + ['readnonresidentbuffers',['readNonresidentBuffers',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#aa3282e612fc0505e919401f5c538c89b',1,'openvdb::v3_2_0::GridBase::readNonresidentBuffers()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a9407f1e13762f682d04c19e8dc8817c8',1,'openvdb::v3_2_0::Grid::readNonresidentBuffers()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#aa3282e612fc0505e919401f5c538c89b',1,'openvdb::v3_2_0::tree::TreeBase::readNonresidentBuffers()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a9407f1e13762f682d04c19e8dc8817c8',1,'openvdb::v3_2_0::tree::Tree::readNonresidentBuffers()']]], + ['readsize',['readSize',['../classopenvdb_1_1v3__2__0_1_1Metadata.html#ac3c5726797c8f93c8879e537fad05ff3',1,'openvdb::v3_2_0::Metadata']]], + ['readstring',['readString',['../namespaceopenvdb_1_1v3__2__0.html#af644b3e1a7055ff49275cf2a0f0635b0',1,'openvdb::v3_2_0']]], + ['readtopology',['readTopology',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#acb845830da0a693644475c847a236c51',1,'openvdb::v3_2_0::GridBase::readTopology()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#aeb32c070fe5c10d4a8c6539127549d35',1,'openvdb::v3_2_0::Grid::readTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#abcdf345c3364a34a9b0e3ba2883960e2',1,'openvdb::v3_2_0::tree::InternalNode::readTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a486b1ba5030fb24700ee3a2876ee40c9',1,'openvdb::v3_2_0::tree::LeafNode::readTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#abcdf345c3364a34a9b0e3ba2883960e2',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::readTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#abcdf345c3364a34a9b0e3ba2883960e2',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::readTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#af5537d3d93b7137d3f03007b31077921',1,'openvdb::v3_2_0::tree::RootNode::readTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#afc88b0cf680670594c72aa4ddba1336e',1,'openvdb::v3_2_0::tree::TreeBase::readTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#afc88b0cf680670594c72aa4ddba1336e',1,'openvdb::v3_2_0::tree::Tree::readTopology()']]], + ['readtransform',['readTransform',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#aa536912672363ecae4f88a9f19470123',1,'openvdb::v3_2_0::GridBase']]], + ['readvalue',['readValue',['../classopenvdb_1_1v3__2__0_1_1Metadata.html#af57de5c4cdb7f85f093737fab881f2e5',1,'openvdb::v3_2_0::Metadata::readValue()'],['../classopenvdb_1_1v3__2__0_1_1UnknownMetadata.html#af6bec02e761ce8818f57aeb7713a7556',1,'openvdb::v3_2_0::UnknownMetadata::readValue()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#ae0e6a2e59b031a221d980ed57c37dbeb',1,'openvdb::v3_2_0::TypedMetadata::readValue()']]], + ['rebuild',['rebuild',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a27df2921c5308dcf3b8814d90d9ab5e1',1,'openvdb::v3_2_0::tree::LeafManager::rebuild(bool serial=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#abc9678b87fd0a3c643c20b733989bfa7',1,'openvdb::v3_2_0::tree::LeafManager::rebuild(size_t auxBuffersPerLeaf, bool serial=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a2512a475143e9bf424983e31b14b6d90',1,'openvdb::v3_2_0::tree::LeafManager::rebuild(TreeType &tree, bool serial=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a96b9faebed83c665e89d7dcd1ea73c5c',1,'openvdb::v3_2_0::tree::LeafManager::rebuild(TreeType &tree, size_t auxBuffersPerLeaf, bool serial=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#a4e478087e86d0dde36a39d33f473570f',1,'openvdb::v3_2_0::tree::NodeManagerLink::rebuild()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#a4e478087e86d0dde36a39d33f473570f',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::rebuild()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#a518e874f19ef2f2a390f96f3f63e2706',1,'openvdb::v3_2_0::tree::NodeManager::rebuild()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#a518e874f19ef2f2a390f96f3f63e2706',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::rebuild()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a518e874f19ef2f2a390f96f3f63e2706',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::rebuild()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a518e874f19ef2f2a390f96f3f63e2706',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::rebuild()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a518e874f19ef2f2a390f96f3f63e2706',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::rebuild()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a518e874f19ef2f2a390f96f3f63e2706',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::rebuild()']]], + ['rebuildauxbuffers',['rebuildAuxBuffers',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#aa8b77a7173180a24da3a10a28c0fe987',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['rebuildleafarray',['rebuildLeafArray',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a614ef559f7a068e087b7ffa1265c2480',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['reduce',['reduce',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a564f198735d281f486addac56f65751d',1,'openvdb::v3_2_0::tree::LeafManager::reduce()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#a05dcc849f802910606ab512e43485cc4',1,'openvdb::v3_2_0::tree::NodeList::reduce()']]], + ['reducebottomup',['reduceBottomUp',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#a561f91b367768813aa77853a081d3910',1,'openvdb::v3_2_0::tree::NodeManagerLink::reduceBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#a561f91b367768813aa77853a081d3910',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::reduceBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#a8daf022aab0ee45763e38b627c640138',1,'openvdb::v3_2_0::tree::NodeManager::reduceBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#aa99f7d9f3d01e6ea2505d179d35351d3',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::reduceBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a8daf022aab0ee45763e38b627c640138',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::reduceBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a8daf022aab0ee45763e38b627c640138',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::reduceBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a8daf022aab0ee45763e38b627c640138',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::reduceBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a8daf022aab0ee45763e38b627c640138',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::reduceBottomUp()']]], + ['reducepool',['ReducePool',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid_1_1ReducePool.html#ad998627a8994d91b05d0267933ce2fc5',1,'openvdb::v3_2_0::tools::PointMaskGrid::ReducePool::ReducePool(PoolType &pool, GridT *grid, size_t grainSize=1)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid_1_1ReducePool.html#acc67b229217cb166b1f152e6e2fbeae2',1,'openvdb::v3_2_0::tools::PointMaskGrid::ReducePool::ReducePool(const ReducePool &, tbb::split)']]], + ['reducetopdown',['reduceTopDown',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#a27cbac686031ec4282751447586c5d5a',1,'openvdb::v3_2_0::tree::NodeManagerLink::reduceTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#a27cbac686031ec4282751447586c5d5a',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::reduceTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#a078df3d081981ddb2fa5766331e17479',1,'openvdb::v3_2_0::tree::NodeManager::reduceTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#a5d6ef012eefafaf21a21a96c2d34e04f',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::reduceTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a078df3d081981ddb2fa5766331e17479',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::reduceTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a078df3d081981ddb2fa5766331e17479',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::reduceTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a078df3d081981ddb2fa5766331e17479',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::reduceTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a078df3d081981ddb2fa5766331e17479',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::reduceTopDown()']]], + ['referenceerror',['ReferenceError',['../classopenvdb_1_1v3__2__0_1_1ReferenceError.html#a183d7d1f8b0b07068ec5a15bf9c44a42',1,'openvdb::v3_2_0::ReferenceError::ReferenceError()'],['../classopenvdb_1_1v3__2__0_1_1ReferenceError.html#ac4aea34dabfc2f3eb473b243d57a989d',1,'openvdb::v3_2_0::ReferenceError::ReferenceError(const std::string &msg)']]], + ['registergrid',['registerGrid',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#adbb97b380f21ed7e812f226385e5267e',1,'openvdb::v3_2_0::GridBase::registerGrid()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a8f3236ca1bbc1955d20cc561466838b1',1,'openvdb::v3_2_0::Grid::registerGrid()']]], + ['registermap',['registerMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapRegistry.html#afe2a28e2edf2e24cc1afa84305b00a27',1,'openvdb::v3_2_0::math::MapRegistry::registerMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a190c94b20fda48ae6342b573ba99ee25',1,'openvdb::v3_2_0::math::AffineMap::registerMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a190c94b20fda48ae6342b573ba99ee25',1,'openvdb::v3_2_0::math::ScaleMap::registerMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#a190c94b20fda48ae6342b573ba99ee25',1,'openvdb::v3_2_0::math::UniformScaleMap::registerMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a190c94b20fda48ae6342b573ba99ee25',1,'openvdb::v3_2_0::math::TranslationMap::registerMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a190c94b20fda48ae6342b573ba99ee25',1,'openvdb::v3_2_0::math::ScaleTranslateMap::registerMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#a190c94b20fda48ae6342b573ba99ee25',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::registerMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a190c94b20fda48ae6342b573ba99ee25',1,'openvdb::v3_2_0::math::UnitaryMap::registerMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a190c94b20fda48ae6342b573ba99ee25',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::registerMap()']]], + ['registertype',['registerType',['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a6e8722817dee3ec246918f5c239b39ed',1,'openvdb::v3_2_0::Metadata::registerType()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a861c2309bc118e7ddd54790980d258e0',1,'openvdb::v3_2_0::TypedMetadata::registerType()']]], + ['reinit',['reinit',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#af12fc201bcb051935b7c3730d8cc6e5e',1,'openvdb::v3_2_0::tools::LevelSetMeasure::reinit(const GridType &grid)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#abd21aa438981f3bd69b8a3d02b316490',1,'openvdb::v3_2_0::tools::LevelSetMeasure::reinit(ManagerType &leafs, Real dx)']]], + ['release',['release',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html#af8a84115de3507728d5e19e804529052',1,'openvdb::v3_2_0::tree::ValueAccessorBase']]], + ['releaseaccessor',['releaseAccessor',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a962de7abe940ae19a2264253541e1b2f',1,'openvdb::v3_2_0::tree::Tree::releaseAccessor(ValueAccessorBase< Tree, true > &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a2449241b6e68fb4841220dca09575db7',1,'openvdb::v3_2_0::tree::Tree::releaseAccessor(ValueAccessorBase< const Tree, true > &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ab9eceec9b71042f1e896fe989d90e369',1,'openvdb::v3_2_0::tree::Tree::releaseAccessor(ValueAccessorBase< Tree, false > &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a13ef2b1e74b6e3ae8c0a4bfee21ccfb1',1,'openvdb::v3_2_0::tree::Tree::releaseAccessor(ValueAccessorBase< const Tree, false > &) const ']]], + ['releaseallaccessors',['releaseAllAccessors',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a7cb55df5cf1166cdd2873baa6259658f',1,'openvdb::v3_2_0::tree::Tree']]], + ['releasechildnodes',['ReleaseChildNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ReleaseChildNodes.html#a4cc1b5faed099462b440b0be12fe78a9',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ReleaseChildNodes']]], + ['releaseleafnodes',['releaseLeafNodes',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal.html#a432a6580aab85fd4d25ef8ec1a750fb7',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['remainder',['Remainder',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aa1c3790086a8a0bb12c2ecd38e91b0f8',1,'openvdb::v3_2_0::math']]], + ['remapindices',['RemapIndices',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RemapIndices.html#a3b89676643795a192e838c12a972c563',1,'openvdb::v3_2_0::tools::particle_atlas_internal::RemapIndices::RemapIndices()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1RemapIndices.html#a25d62c0dcc062941fc3e990805d57242',1,'openvdb::v3_2_0::tools::internal::RemapIndices::RemapIndices()']]], + ['removeauxbuffers',['removeAuxBuffers',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#affa2e44cef7e0e027e7fcc5a404ad58a',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['removemeta',['removeMeta',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#abdae196275a55f43c1219169c5a2ed59',1,'openvdb::v3_2_0::MetaMap']]], + ['removenotifier',['removeNotifier',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a56e276747aa750f43c878f92d1cfa6c2',1,'openvdb::v3_2_0::io::Queue']]], + ['removeselfintersectingsurface',['RemoveSelfIntersectingSurface',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RemoveSelfIntersectingSurface.html#a563a58efdb054f789a449bfedfa9ba36',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RemoveSelfIntersectingSurface']]], + ['render',['render',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#a82c7363c515e6543e5a499bed1c99e5c',1,'openvdb::v3_2_0::tools::LevelSetRayTracer::render()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#a82c7363c515e6543e5a499bed1c99e5c',1,'openvdb::v3_2_0::tools::VolumeRender::render()']]], + ['renormalize',['Renormalize',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1Renormalize.html#a72d41b9385a64ee548463af3d904fdb5',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::Renormalize']]], + ['resampletomatch',['resampleToMatch',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ae190c2befe2b252b8d930bd632964ab7',1,'openvdb::v3_2_0::tools::resampleToMatch(const GridType &inGrid, GridType &outGrid, Interrupter &interrupter)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#af4c63aac5d546c4e73dd5f2e8bf734ca',1,'openvdb::v3_2_0::tools::resampleToMatch(const GridType &inGrid, GridType &outGrid)']]], + ['reset',['reset',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1ConstValueIter.html#ad20897c5c8bd47f5d4005989bead0e55',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::ConstValueIter::reset()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a122d66fbfd8cbd1a5d5e19211c8e5743',1,'openvdb::v3_2_0::math::Coord::reset(Int32 x, Int32 y, Int32 z)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a7c317c367ed6796104f368965985e02f',1,'openvdb::v3_2_0::math::Coord::reset(Int32 xyz)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#ad20897c5c8bd47f5d4005989bead0e55',1,'openvdb::v3_2_0::math::CoordBBox::reset()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#afc0bb35ad267c11c23b1f0e165c9af4b',1,'openvdb::v3_2_0::math::CoordBBox::reset(const Coord &min, const Coord &max)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#ab467ddd29bd1cfe0428228846c93216f',1,'openvdb::v3_2_0::math::Ray::reset()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#ad20897c5c8bd47f5d4005989bead0e55',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::reset()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#ad20897c5c8bd47f5d4005989bead0e55',1,'openvdb::v3_2_0::tools::PointIndexIterator::reset()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#ad20897c5c8bd47f5d4005989bead0e55',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator::reset()']]], + ['resetbackground',['resetBackground',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a2c47731038af98ea9445a6a40e47ba8c',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::resetBackground()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a588b2f18ac756153e26c68159c29ca01',1,'openvdb::v3_2_0::tree::InternalNode::resetBackground()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a588b2f18ac756153e26c68159c29ca01',1,'openvdb::v3_2_0::tree::LeafNode::resetBackground()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a4e7ab7ba66ffd76e0d04f73f28beace0',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::resetBackground()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a9548e9dab53d64460533da9b72045748',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::resetBackground()']]], + ['resetchildnode',['resetChildNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a9bb78998d4df933b8c845657ce5ab06e',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['resetquads',['resetQuads',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#a356a63ccc464d244426972ab61203e46',1,'openvdb::v3_2_0::tools::PolygonPool']]], + ['resettocube',['resetToCube',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a833c8f64bc350edb2b756b7b63279ed8',1,'openvdb::v3_2_0::math::CoordBBox']]], + ['resettriangles',['resetTriangles',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#ab4c6f1494bd4b21017329e53e84e52ba',1,'openvdb::v3_2_0::tools::PolygonPool']]], + ['resize',['resize',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a57c0b68de906f5f26118578b1ebfe0c6',1,'openvdb::v3_2_0::math::pcg::Vector::resize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#ab79c0aeb489968c37fc4e85125712293',1,'openvdb::v3_2_0::tools::LevelSetTracker::resize()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#a57b2556ee8993b06958b9c14511fd4ba',1,'openvdb::v3_2_0::tree::NodeList::resize()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a514affe27cc623fc5dccf1bf4648eb2a',1,'openvdb::v3_2_0::util::PagedArray::resize(size_t size)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a9027f383daa2bb7bc9078f5f98858d47',1,'openvdb::v3_2_0::util::PagedArray::resize(size_t size, const ValueType &v)']]], + ['restart',['restart',['../classopenvdb_1_1v3__2__0_1_1util_1_1CpuTimer.html#ab976f9009bf7b1f87ccb98ff657d1175',1,'openvdb::v3_2_0::util::CpuTimer']]], + ['restoreorigin',['RestoreOrigin',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RestoreOrigin.html#adffb605da1f0725c74ea61f1ecbcb942',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RestoreOrigin']]], + ['restrict',['restrict',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#aed9bad87df04dfd707e0ed6b6f36e582',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['restrictactivevoxels',['restrictActiveVoxels',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#abf7b3e3d759b72f937fcbca1f23066ba',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['result',['result',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#adc1a533086ff2bead7eb17d58760629e',1,'openvdb::v3_2_0::CombineArgs::result() const '],['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#ac3011f4253a5b8511c7b54508dda0025',1,'openvdb::v3_2_0::CombineArgs::result()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MapAdapter.html#a7740ca0acfffae985a6bdf16a2ed8391',1,'openvdb::v3_2_0::math::MapAdapter::result(const AccessorType &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MapAdapter.html#a24cfb551302712103e01aa5f0e8ad909',1,'openvdb::v3_2_0::math::MapAdapter::result(const StencilType &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISOpMagnitude.html#a02b4f6161b90e3dd16fc6731ee468333',1,'openvdb::v3_2_0::math::ISOpMagnitude::result(const AccessorType &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISOpMagnitude.html#ab332f34f9f7f48fc63f5254b937087b9',1,'openvdb::v3_2_0::math::ISOpMagnitude::result(const StencilType &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1OpMagnitude.html#a5c6e5d8cf331653fdd1b3ef1a9f4e54a',1,'openvdb::v3_2_0::math::OpMagnitude::result(const MapT &map, const AccessorType &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1OpMagnitude.html#a0a9c81ebf6e5c530ff33c449daf47f72',1,'openvdb::v3_2_0::math::OpMagnitude::result(const MapT &map, const StencilType &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradient.html#a783e5f03c307a8fd9565a7602dbd1a80',1,'openvdb::v3_2_0::math::ISGradient::result(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradient.html#a4a5f6fd4efc79f7171b1180d84b45577',1,'openvdb::v3_2_0::math::ISGradient::result(const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradientBiased.html#a42bcaf50e38110c3ba5a2e5aa9d980fe',1,'openvdb::v3_2_0::math::ISGradientBiased::result(const Accessor &grid, const Coord &ijk, const Vec3Bias &V)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradientBiased.html#ad22a470cae1bb4727c9ff02a8b261b42',1,'openvdb::v3_2_0::math::ISGradientBiased::result(const StencilT &stencil, const Vec3Bias &V)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradientNormSqrd.html#a9ccc1179041e072d4862847b472ded98',1,'openvdb::v3_2_0::math::ISGradientNormSqrd::result(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradientNormSqrd.html#a7787aa8d95a2f8d7bfb6ad0d1ea31e75',1,'openvdb::v3_2_0::math::ISGradientNormSqrd::result(const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISLaplacian.html#a9ccc1179041e072d4862847b472ded98',1,'openvdb::v3_2_0::math::ISLaplacian::result(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISLaplacian.html#a7787aa8d95a2f8d7bfb6ad0d1ea31e75',1,'openvdb::v3_2_0::math::ISLaplacian::result(const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISLaplacian_3_01CD__SECOND_01_4.html#a9ccc1179041e072d4862847b472ded98',1,'openvdb::v3_2_0::math::ISLaplacian< CD_SECOND >::result(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISLaplacian_3_01CD__SECOND_01_4.html#a7787aa8d95a2f8d7bfb6ad0d1ea31e75',1,'openvdb::v3_2_0::math::ISLaplacian< CD_SECOND >::result(const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISLaplacian_3_01CD__FOURTH_01_4.html#a9ccc1179041e072d4862847b472ded98',1,'openvdb::v3_2_0::math::ISLaplacian< CD_FOURTH >::result(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISLaplacian_3_01CD__FOURTH_01_4.html#a7787aa8d95a2f8d7bfb6ad0d1ea31e75',1,'openvdb::v3_2_0::math::ISLaplacian< CD_FOURTH >::result(const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISLaplacian_3_01CD__SIXTH_01_4.html#a9ccc1179041e072d4862847b472ded98',1,'openvdb::v3_2_0::math::ISLaplacian< CD_SIXTH >::result(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISLaplacian_3_01CD__SIXTH_01_4.html#a7787aa8d95a2f8d7bfb6ad0d1ea31e75',1,'openvdb::v3_2_0::math::ISLaplacian< CD_SIXTH >::result(const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISDivergence.html#a5cbdb59edc5b2cea9415cf12cd32ea90',1,'openvdb::v3_2_0::math::ISDivergence::result(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISDivergence.html#afd2d09f8ae79e450afa4e9113e1ec2ba',1,'openvdb::v3_2_0::math::ISDivergence::result(const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISCurl.html#a9ccc1179041e072d4862847b472ded98',1,'openvdb::v3_2_0::math::ISCurl::result(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISCurl.html#a7787aa8d95a2f8d7bfb6ad0d1ea31e75',1,'openvdb::v3_2_0::math::ISCurl::result(const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISMeanCurvature.html#a3b26445bac50253b78cac12389b94f47',1,'openvdb::v3_2_0::math::ISMeanCurvature::result(const Accessor &grid, const Coord &ijk, typename Accessor::ValueType &alpha, typename Accessor::ValueType &beta)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISMeanCurvature.html#a963e5529fd72739ec7c2fdacf3770690',1,'openvdb::v3_2_0::math::ISMeanCurvature::result(const StencilT &stencil, typename StencilT::ValueType &alpha, typename StencilT::ValueType &beta)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient.html#ab43bf568ce463eed7cfb5ae2da1dde49',1,'openvdb::v3_2_0::math::Gradient::result(const MapType &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient.html#a7e1f69a88d274e83fd14873f7f0d79e8',1,'openvdb::v3_2_0::math::Gradient::result(const MapType &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01TranslationMap_00_01DiffScheme_01_4.html#a722aba433017a1c6474b8bbec0434c7e',1,'openvdb::v3_2_0::math::Gradient< TranslationMap, DiffScheme >::result(const TranslationMap &, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01TranslationMap_00_01DiffScheme_01_4.html#a923aa2b2359b3d85bf4e90e7ae9521f9',1,'openvdb::v3_2_0::math::Gradient< TranslationMap, DiffScheme >::result(const TranslationMap &, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01UniformScaleMap_00_01CD__2ND_01_4.html#a5cbe14edc0560a6cbdffd8e72c0d3e2d',1,'openvdb::v3_2_0::math::Gradient< UniformScaleMap, CD_2ND >::result(const UniformScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01UniformScaleMap_00_01CD__2ND_01_4.html#ab0ae2b235417cec2852fdb22701e4752',1,'openvdb::v3_2_0::math::Gradient< UniformScaleMap, CD_2ND >::result(const UniformScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01UniformScaleTranslateMap_00_01CD__2ND_01_4.html#afbdcd6bc0859849f711c88b5ab12ad8a',1,'openvdb::v3_2_0::math::Gradient< UniformScaleTranslateMap, CD_2ND >::result(const UniformScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01UniformScaleTranslateMap_00_01CD__2ND_01_4.html#a2ba0337eeedf957d9c231d88467c7363',1,'openvdb::v3_2_0::math::Gradient< UniformScaleTranslateMap, CD_2ND >::result(const UniformScaleTranslateMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01ScaleMap_00_01CD__2ND_01_4.html#afeb6abdb71890ece61aeb95973458c18',1,'openvdb::v3_2_0::math::Gradient< ScaleMap, CD_2ND >::result(const ScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01ScaleMap_00_01CD__2ND_01_4.html#acf980180661034304dd900550a42c8a3',1,'openvdb::v3_2_0::math::Gradient< ScaleMap, CD_2ND >::result(const ScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01ScaleTranslateMap_00_01CD__2ND_01_4.html#af4495016c6dbaff80f069f3864db8dca',1,'openvdb::v3_2_0::math::Gradient< ScaleTranslateMap, CD_2ND >::result(const ScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Gradient_3_01ScaleTranslateMap_00_01CD__2ND_01_4.html#a6c6a77d7e9cc74da8143395fa7fb2d98',1,'openvdb::v3_2_0::math::Gradient< ScaleTranslateMap, CD_2ND >::result(const ScaleTranslateMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientBiased.html#a37e574f779ebfc096f16f7cef3a1efbf',1,'openvdb::v3_2_0::math::GradientBiased::result(const MapType &map, const Accessor &grid, const Coord &ijk, const Vec3< typename Accessor::ValueType > &V)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientBiased.html#ae69860e3cf82e0979240d83f8114d20b',1,'openvdb::v3_2_0::math::GradientBiased::result(const MapType &map, const StencilT &stencil, const Vec3< typename StencilT::ValueType > &V)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientNormSqrd.html#ad5ceea56eaf182996fb545565aa38052',1,'openvdb::v3_2_0::math::GradientNormSqrd::result(const MapType &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientNormSqrd.html#a85a5736e845c269f4b3e29b0517e79ac',1,'openvdb::v3_2_0::math::GradientNormSqrd::result(const MapType &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientNormSqrd_3_01UniformScaleMap_00_01GradScheme_01_4.html#af85554c6e06ec49eacf9b91a068e3760',1,'openvdb::v3_2_0::math::GradientNormSqrd< UniformScaleMap, GradScheme >::result(const UniformScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientNormSqrd_3_01UniformScaleMap_00_01GradScheme_01_4.html#aef9e3d9814ac317c9c8884ba9830a05b',1,'openvdb::v3_2_0::math::GradientNormSqrd< UniformScaleMap, GradScheme >::result(const UniformScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientNormSqrd_3_01UniformScaleTranslateMap_00_01GradScheme_01_4.html#a49f223335fc56375010a37441784aceb',1,'openvdb::v3_2_0::math::GradientNormSqrd< UniformScaleTranslateMap, GradScheme >::result(const UniformScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientNormSqrd_3_01UniformScaleTranslateMap_00_01GradScheme_01_4.html#a1a91a7680bcee954b64a01da30f092fa',1,'openvdb::v3_2_0::math::GradientNormSqrd< UniformScaleTranslateMap, GradScheme >::result(const UniformScaleTranslateMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence.html#a49f7b4a913dac8dac7ad0989ed363af9',1,'openvdb::v3_2_0::math::Divergence::result(const MapType &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence.html#a7e8bf7c1a18b13e72d81e2567fdcf85f',1,'openvdb::v3_2_0::math::Divergence::result(const MapType &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01TranslationMap_00_01DiffScheme_01_4.html#ab4d587fc575b14a96dca4dceac013a63',1,'openvdb::v3_2_0::math::Divergence< TranslationMap, DiffScheme >::result(const TranslationMap &, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01TranslationMap_00_01DiffScheme_01_4.html#a2bb33f7d727c239627af67069a1851dd',1,'openvdb::v3_2_0::math::Divergence< TranslationMap, DiffScheme >::result(const TranslationMap &, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01UniformScaleMap_00_01DiffScheme_01_4.html#a38600dbfb8695ddf9a7200adb1c17ea1',1,'openvdb::v3_2_0::math::Divergence< UniformScaleMap, DiffScheme >::result(const UniformScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01UniformScaleMap_00_01DiffScheme_01_4.html#ab70c8585f338c68592234661074f7621',1,'openvdb::v3_2_0::math::Divergence< UniformScaleMap, DiffScheme >::result(const UniformScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01UniformScaleTranslateMap_00_01DiffScheme_01_4.html#a8947d42fa099e098d5e92703093da883',1,'openvdb::v3_2_0::math::Divergence< UniformScaleTranslateMap, DiffScheme >::result(const UniformScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01UniformScaleTranslateMap_00_01DiffScheme_01_4.html#a585eef8cf3d4afeb366824e860ef9617',1,'openvdb::v3_2_0::math::Divergence< UniformScaleTranslateMap, DiffScheme >::result(const UniformScaleTranslateMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01UniformScaleMap_00_01CD__2ND_01_4.html#a38600dbfb8695ddf9a7200adb1c17ea1',1,'openvdb::v3_2_0::math::Divergence< UniformScaleMap, CD_2ND >::result(const UniformScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01UniformScaleMap_00_01CD__2ND_01_4.html#ab70c8585f338c68592234661074f7621',1,'openvdb::v3_2_0::math::Divergence< UniformScaleMap, CD_2ND >::result(const UniformScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01UniformScaleTranslateMap_00_01CD__2ND_01_4.html#a8947d42fa099e098d5e92703093da883',1,'openvdb::v3_2_0::math::Divergence< UniformScaleTranslateMap, CD_2ND >::result(const UniformScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01UniformScaleTranslateMap_00_01CD__2ND_01_4.html#a585eef8cf3d4afeb366824e860ef9617',1,'openvdb::v3_2_0::math::Divergence< UniformScaleTranslateMap, CD_2ND >::result(const UniformScaleTranslateMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01ScaleMap_00_01DiffScheme_01_4.html#aa75c6592282d0a683a5b14d734e96ca0',1,'openvdb::v3_2_0::math::Divergence< ScaleMap, DiffScheme >::result(const ScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01ScaleMap_00_01DiffScheme_01_4.html#acc226e9ff5203e3d45bfef13159f561d',1,'openvdb::v3_2_0::math::Divergence< ScaleMap, DiffScheme >::result(const ScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01ScaleTranslateMap_00_01DiffScheme_01_4.html#adbef10750e930b5576ff690a6281101e',1,'openvdb::v3_2_0::math::Divergence< ScaleTranslateMap, DiffScheme >::result(const ScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01ScaleTranslateMap_00_01DiffScheme_01_4.html#a28de0945f63d0193598321b1e72c5ef6',1,'openvdb::v3_2_0::math::Divergence< ScaleTranslateMap, DiffScheme >::result(const ScaleTranslateMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01ScaleMap_00_01CD__2ND_01_4.html#aa75c6592282d0a683a5b14d734e96ca0',1,'openvdb::v3_2_0::math::Divergence< ScaleMap, CD_2ND >::result(const ScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01ScaleMap_00_01CD__2ND_01_4.html#acc226e9ff5203e3d45bfef13159f561d',1,'openvdb::v3_2_0::math::Divergence< ScaleMap, CD_2ND >::result(const ScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01ScaleTranslateMap_00_01CD__2ND_01_4.html#adbef10750e930b5576ff690a6281101e',1,'openvdb::v3_2_0::math::Divergence< ScaleTranslateMap, CD_2ND >::result(const ScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Divergence_3_01ScaleTranslateMap_00_01CD__2ND_01_4.html#a28de0945f63d0193598321b1e72c5ef6',1,'openvdb::v3_2_0::math::Divergence< ScaleTranslateMap, CD_2ND >::result(const ScaleTranslateMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl.html#ad5ceea56eaf182996fb545565aa38052',1,'openvdb::v3_2_0::math::Curl::result(const MapType &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl.html#a85a5736e845c269f4b3e29b0517e79ac',1,'openvdb::v3_2_0::math::Curl::result(const MapType &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl_3_01UniformScaleMap_00_01DiffScheme_01_4.html#af85554c6e06ec49eacf9b91a068e3760',1,'openvdb::v3_2_0::math::Curl< UniformScaleMap, DiffScheme >::result(const UniformScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl_3_01UniformScaleMap_00_01DiffScheme_01_4.html#aef9e3d9814ac317c9c8884ba9830a05b',1,'openvdb::v3_2_0::math::Curl< UniformScaleMap, DiffScheme >::result(const UniformScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl_3_01UniformScaleTranslateMap_00_01DiffScheme_01_4.html#a49f223335fc56375010a37441784aceb',1,'openvdb::v3_2_0::math::Curl< UniformScaleTranslateMap, DiffScheme >::result(const UniformScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl_3_01UniformScaleTranslateMap_00_01DiffScheme_01_4.html#a1a91a7680bcee954b64a01da30f092fa',1,'openvdb::v3_2_0::math::Curl< UniformScaleTranslateMap, DiffScheme >::result(const UniformScaleTranslateMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl_3_01UniformScaleMap_00_01CD__2ND_01_4.html#af85554c6e06ec49eacf9b91a068e3760',1,'openvdb::v3_2_0::math::Curl< UniformScaleMap, CD_2ND >::result(const UniformScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl_3_01UniformScaleMap_00_01CD__2ND_01_4.html#aef9e3d9814ac317c9c8884ba9830a05b',1,'openvdb::v3_2_0::math::Curl< UniformScaleMap, CD_2ND >::result(const UniformScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl_3_01UniformScaleTranslateMap_00_01CD__2ND_01_4.html#a49f223335fc56375010a37441784aceb',1,'openvdb::v3_2_0::math::Curl< UniformScaleTranslateMap, CD_2ND >::result(const UniformScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Curl_3_01UniformScaleTranslateMap_00_01CD__2ND_01_4.html#a1a91a7680bcee954b64a01da30f092fa',1,'openvdb::v3_2_0::math::Curl< UniformScaleTranslateMap, CD_2ND >::result(const UniformScaleTranslateMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian.html#ad5ceea56eaf182996fb545565aa38052',1,'openvdb::v3_2_0::math::Laplacian::result(const MapType &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian.html#a85a5736e845c269f4b3e29b0517e79ac',1,'openvdb::v3_2_0::math::Laplacian::result(const MapType &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01TranslationMap_00_01DiffScheme_01_4.html#a0cf64dfbabd4d9ddd676febeff60dfd2',1,'openvdb::v3_2_0::math::Laplacian< TranslationMap, DiffScheme >::result(const TranslationMap &, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01TranslationMap_00_01DiffScheme_01_4.html#a20a722726ef7560fb862dea6cc76496e',1,'openvdb::v3_2_0::math::Laplacian< TranslationMap, DiffScheme >::result(const TranslationMap &, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01UnitaryMap_00_01DiffScheme_01_4.html#a02c3b2bd712d3b2d2d5503aa5aca0f85',1,'openvdb::v3_2_0::math::Laplacian< UnitaryMap, DiffScheme >::result(const UnitaryMap &, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01UnitaryMap_00_01DiffScheme_01_4.html#af6e460af37f14055c71b6eab1edc1a8b',1,'openvdb::v3_2_0::math::Laplacian< UnitaryMap, DiffScheme >::result(const UnitaryMap &, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01UniformScaleMap_00_01DiffScheme_01_4.html#af85554c6e06ec49eacf9b91a068e3760',1,'openvdb::v3_2_0::math::Laplacian< UniformScaleMap, DiffScheme >::result(const UniformScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01UniformScaleMap_00_01DiffScheme_01_4.html#aef9e3d9814ac317c9c8884ba9830a05b',1,'openvdb::v3_2_0::math::Laplacian< UniformScaleMap, DiffScheme >::result(const UniformScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01UniformScaleTranslateMap_00_01DiffScheme_01_4.html#a49f223335fc56375010a37441784aceb',1,'openvdb::v3_2_0::math::Laplacian< UniformScaleTranslateMap, DiffScheme >::result(const UniformScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01UniformScaleTranslateMap_00_01DiffScheme_01_4.html#a1a91a7680bcee954b64a01da30f092fa',1,'openvdb::v3_2_0::math::Laplacian< UniformScaleTranslateMap, DiffScheme >::result(const UniformScaleTranslateMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01ScaleMap_00_01DiffScheme_01_4.html#a4eaa194e3c6fce81f458acb095a0b293',1,'openvdb::v3_2_0::math::Laplacian< ScaleMap, DiffScheme >::result(const ScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01ScaleMap_00_01DiffScheme_01_4.html#af6eb84e600df27459485219f2c7d08ed',1,'openvdb::v3_2_0::math::Laplacian< ScaleMap, DiffScheme >::result(const ScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01ScaleTranslateMap_00_01DiffScheme_01_4.html#a50c93fae991fa3fd7b9afb840543de38',1,'openvdb::v3_2_0::math::Laplacian< ScaleTranslateMap, DiffScheme >::result(const ScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Laplacian_3_01ScaleTranslateMap_00_01DiffScheme_01_4.html#a8faea6f3599c6be18783eb2b0192f8af',1,'openvdb::v3_2_0::math::Laplacian< ScaleTranslateMap, DiffScheme >::result(const ScaleTranslateMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1CPT.html#add4739a17a98839933fa52784ef5b179',1,'openvdb::v3_2_0::math::CPT::result(const MapType &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1CPT.html#a81f0b212ff17cdd88bf1ebfcdb076df9',1,'openvdb::v3_2_0::math::CPT::result(const MapType &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1CPT__RANGE.html#a23af0077968e9d5243cd8483b770b99f',1,'openvdb::v3_2_0::math::CPT_RANGE::result(const MapType &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1CPT__RANGE.html#ad691151eb0a45aa841174cadf385daa7',1,'openvdb::v3_2_0::math::CPT_RANGE::result(const MapType &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature.html#ad5ceea56eaf182996fb545565aa38052',1,'openvdb::v3_2_0::math::MeanCurvature::result(const MapType &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature.html#ab7d6d633c013798c798865828298e403',1,'openvdb::v3_2_0::math::MeanCurvature::result(const MapType &map, const StencilT stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01TranslationMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html#a0cf64dfbabd4d9ddd676febeff60dfd2',1,'openvdb::v3_2_0::math::MeanCurvature< TranslationMap, DiffScheme2, DiffScheme1 >::result(const TranslationMap &, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01TranslationMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html#a20a722726ef7560fb862dea6cc76496e',1,'openvdb::v3_2_0::math::MeanCurvature< TranslationMap, DiffScheme2, DiffScheme1 >::result(const TranslationMap &, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01UniformScaleMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html#af85554c6e06ec49eacf9b91a068e3760',1,'openvdb::v3_2_0::math::MeanCurvature< UniformScaleMap, DiffScheme2, DiffScheme1 >::result(const UniformScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01UniformScaleMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html#aef9e3d9814ac317c9c8884ba9830a05b',1,'openvdb::v3_2_0::math::MeanCurvature< UniformScaleMap, DiffScheme2, DiffScheme1 >::result(const UniformScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01UniformScaleTranslateMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html#a49f223335fc56375010a37441784aceb',1,'openvdb::v3_2_0::math::MeanCurvature< UniformScaleTranslateMap, DiffScheme2, DiffScheme1 >::result(const UniformScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01UniformScaleTranslateMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html#a1a91a7680bcee954b64a01da30f092fa',1,'openvdb::v3_2_0::math::MeanCurvature< UniformScaleTranslateMap, DiffScheme2, DiffScheme1 >::result(const UniformScaleTranslateMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude_1_1OpT.html#ad7955cc729c44f5c3619c988026abd3c',1,'openvdb::v3_2_0::tools::Magnitude::OpT::result()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Normalize_1_1OpT.html#ad7955cc729c44f5c3619c988026abd3c',1,'openvdb::v3_2_0::tools::Normalize::OpT::result()']]], + ['resultisactive',['resultIsActive',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a20ace609a15f11637a83c98956a456a5',1,'openvdb::v3_2_0::CombineArgs']]], + ['rgba',['RGBA',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#af0f862e20c8d59b3ae245c662f137f61',1,'openvdb::v3_2_0::tools::Film::RGBA::RGBA()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#a5a24ee9e3becfba8b30b5c3cb5cc0ae2',1,'openvdb::v3_2_0::tools::Film::RGBA::RGBA(ValueT intensity)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#aa1d9b368af297fd7f40e0ebbedbd2675',1,'openvdb::v3_2_0::tools::Film::RGBA::RGBA(ValueT _r, ValueT _g, ValueT _b, ValueT _a=static_cast< ValueT >(1.0))']]], + ['root',['root',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a6dcdb35119698a5e8ce0059ae57fa887',1,'openvdb::v3_2_0::tree::LeafManager::root() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a1969dd5ae7c1715c8abcfcd82aeeff85',1,'openvdb::v3_2_0::tree::LeafManager::root()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#a6dcdb35119698a5e8ce0059ae57fa887',1,'openvdb::v3_2_0::tree::NodeManager::root()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#a6dcdb35119698a5e8ce0059ae57fa887',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::root()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a6dcdb35119698a5e8ce0059ae57fa887',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::root()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a6dcdb35119698a5e8ce0059ae57fa887',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::root()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a6dcdb35119698a5e8ce0059ae57fa887',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::root()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a6dcdb35119698a5e8ce0059ae57fa887',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::root()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a1969dd5ae7c1715c8abcfcd82aeeff85',1,'openvdb::v3_2_0::tree::Tree::root()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a6dcdb35119698a5e8ce0059ae57fa887',1,'openvdb::v3_2_0::tree::Tree::root() const ']]], + ['rootnode',['RootNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#aa5dbd319ba70f5491e4326ec341273d8',1,'openvdb::v3_2_0::tree::RootNode::RootNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a962d5c3401f8c0a8f60d71b141e7fb3b',1,'openvdb::v3_2_0::tree::RootNode::RootNode(const ValueType &background)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a08562b54850ff29ef167b7a1d1cfadd4',1,'openvdb::v3_2_0::tree::RootNode::RootNode(const RootNode &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ad4048d463e26625beb9e08adbd50528e',1,'openvdb::v3_2_0::tree::RootNode::RootNode(const RootNode< OtherChildType > &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ab6e523d80a6b90c3b63ef1c40939c7d5',1,'openvdb::v3_2_0::tree::RootNode::RootNode(const RootNode< OtherChildType > &other, const ValueType &background, const ValueType &foreground, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a1376f67d16d5de9a4d152a45f863f0cf',1,'openvdb::v3_2_0::tree::RootNode::RootNode(const RootNode< OtherChildType > &other, const ValueType &background, TopologyCopy)']]], + ['rootnodemask',['RootNodeMask',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a130a9c45de181af1ccd5488ffd5e561f',1,'openvdb::v3_2_0::util::RootNodeMask::RootNodeMask()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#adcc7dbcd1b00dbd2db878a7748e6dce1',1,'openvdb::v3_2_0::util::RootNodeMask::RootNodeMask(Index32 bit_size)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a5de94a612f982b0a91e9861aae7607d3',1,'openvdb::v3_2_0::util::RootNodeMask::RootNodeMask(const RootNodeMask &B)']]], + ['rotatevector',['rotateVector',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#abaccd7726fb18ede19ef59cfef81cd95',1,'openvdb::v3_2_0::math::Quat']]], + ['rotation',['rotation',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aa47fd79773191e610a90ba1843ba0bef',1,'openvdb::v3_2_0::math::rotation(const Quat< typename MatType::value_type > &q, typename MatType::value_type eps=static_cast< typename MatType::value_type >(1.0e-8))'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a750c956a3703a57758da3b798eabdf20',1,'openvdb::v3_2_0::math::rotation(Axis axis, typename MatType::value_type angle)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ad3579880e5cce1c8e6a61c3facbcf2c6',1,'openvdb::v3_2_0::math::rotation(const Vec3< typename MatType::value_type > &_axis, typename MatType::value_type angle)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a902dae5c6ec2625a383892f96185892f',1,'openvdb::v3_2_0::math::rotation(const Vec3< typename MatType::value_type > &_v1, const Vec3< typename MatType::value_type > &_v2, typename MatType::value_type eps=1.0e-8)']]], + ['round',['round',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a1649d8d4ce055207126587a34e16e812',1,'openvdb::v3_2_0::math::Coord::round()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1a3a42183a43640ec614ad1160b29865',1,'openvdb::v3_2_0::math::Round(float x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab3ec95b1ae65e00aba931501bb73a59a',1,'openvdb::v3_2_0::math::Round(double x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aebb424202d89bd7e39996d488cfaa744',1,'openvdb::v3_2_0::math::Round(long double x)']]], + ['rounddown',['RoundDown',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a372b8cc1d385407dda78f951faa0cdb4',1,'openvdb::v3_2_0::math::RoundDown(float x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a12cf2899837ca0e2fe7c0a2cecc87aa2',1,'openvdb::v3_2_0::math::RoundDown(double x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#abc519eefa680417f68f92c8285c07475',1,'openvdb::v3_2_0::math::RoundDown(long double x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aeb192c8b870a72cd4abf36755a0f033b',1,'openvdb::v3_2_0::math::RoundDown(Type x, Type base)']]], + ['roundup',['RoundUp',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4d78a8a9578c4016ea22cec6ec0c0061',1,'openvdb::v3_2_0::math::RoundUp(float x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aca5b1f4166bdd5e42942366b471a451b',1,'openvdb::v3_2_0::math::RoundUp(double x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ad4279490a8d34f1712e6020dc2974e66',1,'openvdb::v3_2_0::math::RoundUp(long double x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aba2b9503b52d7ada2bdda920c2829768',1,'openvdb::v3_2_0::math::RoundUp(Type x, Type base)']]], + ['roundvec3',['roundVec3',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1local__util.html#ad7b06ff18ff833d6a561371e791732f2',1,'openvdb::v3_2_0::tools::local_util']]], + ['row',['row',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a719c56136db619c38bc1bd057b0c5266',1,'openvdb::v3_2_0::math::Mat3::row()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a6918ef84a51ab39533d827f31203c756',1,'openvdb::v3_2_0::math::Mat4::row()']]], + ['roweditor',['RowEditor',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1RowEditor.html#aef1041dcc1f00817f2cc52a88322ede1',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::RowEditor']]], + ['run',['run',['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1CopyLeafNodes.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::clip_internal::CopyLeafNodes::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1GenEdgeData.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::GenEdgeData::run()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1RestrictOp.html#a9079a05d84c3360905c861af9ad33755',1,'openvdb::v3_2_0::tools::MultiResGrid::RestrictOp::run()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1ProlongateOp.html#af6f8cf5a9ad5eb3dc1f03bda59797b1d',1,'openvdb::v3_2_0::tools::MultiResGrid::ProlongateOp::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::SignData::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPoints.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::GenPoints::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPolygons.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::GenPolygons::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartGen.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::PartGen::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenSeamMask.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::GenSeamMask::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1FlagUsedPoints.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::FlagUsedPoints::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1RemapIndices.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::RemapIndices::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MovePoints.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::MovePoints::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTopologyMask.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::GenTopologyMask::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenBoundaryMask.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::GenBoundaryMask::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTileMask.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::GenTileMask::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1LeafBS.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::LeafBS::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1NodeBS.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::NodeBS::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1ClosestPointDist.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::ClosestPointDist::run()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UpdatePoints.html#a5b76e597777edbf500e32a0c2a8cf318',1,'openvdb::v3_2_0::tools::internal::UpdatePoints::run()']]], + ['rungekutta',['rungeKutta',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocityIntegrator.html#a1a38079a6673a1f008c9831c411cfeb7',1,'openvdb::v3_2_0::tools::VelocityIntegrator']]], + ['runparallel',['runParallel',['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveVoxelValues.html#a63ad06a0041cb535df105cf2f445a73c',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveVoxelValues::runParallel()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveTileValues.html#a8b104a8638dd272e083cfecc2e25ec55',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveTileValues::runParallel()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PointListTransform.html#a63ad06a0041cb535df105cf2f445a73c',1,'openvdb::v3_2_0::tools::internal::PointListTransform::runParallel()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PrimCpy.html#a63ad06a0041cb535df105cf2f445a73c',1,'openvdb::v3_2_0::tools::internal::PrimCpy::runParallel()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1ErodeVoxelsOp.html#a26fd0c672c9ba2dfb45daea148ff7fde',1,'openvdb::v3_2_0::tools::Morphology::ErodeVoxelsOp::runParallel()']]], + ['runserial',['runSerial',['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveVoxelValues.html#a1a38dc33eda2e5e7caa8e23ef4c69130',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveVoxelValues::runSerial()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveTileValues.html#ac48517e0a669066817d2075c5549c6a2',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveTileValues::runSerial()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PointListTransform.html#a1a38dc33eda2e5e7caa8e23ef4c69130',1,'openvdb::v3_2_0::tools::internal::PointListTransform::runSerial()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PrimCpy.html#a1a38dc33eda2e5e7caa8e23ef4c69130',1,'openvdb::v3_2_0::tools::internal::PrimCpy::runSerial()']]], + ['runtimeerror',['RuntimeError',['../classopenvdb_1_1v3__2__0_1_1RuntimeError.html#ab8c4e21e64d3bc7c983f82c7ed2717ef',1,'openvdb::v3_2_0::RuntimeError::RuntimeError()'],['../classopenvdb_1_1v3__2__0_1_1RuntimeError.html#a806ac2d117d18c7d18ee03d55ce8eb70',1,'openvdb::v3_2_0::RuntimeError::RuntimeError(const std::string &msg)']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_12.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_12.html new file mode 100644 index 00000000..9ddb3cc4 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_12.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_12.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_12.js new file mode 100644 index 00000000..b9acd573 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_12.js @@ -0,0 +1,263 @@ +var searchData= +[ + ['sample',['sample',['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1BoolSampler.html#ac6dc80e2a1753b4c79771e7d4ed37940',1,'openvdb::v3_2_0::tools::clip_internal::BoolSampler::sample()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TileSampler.html#a29134d4a118770355ca0ead2917356d9',1,'openvdb::v3_2_0::tools::internal::TileSampler::sample()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler.html#ac6dc80e2a1753b4c79771e7d4ed37940',1,'openvdb::v3_2_0::tools::Sampler::sample(const TreeT &inTree, const Vec3R &inCoord, typename TreeT::ValueType &result)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler.html#af016e16ec50405c877a06287d54e7c3e',1,'openvdb::v3_2_0::tools::Sampler::sample(const TreeT &inTree, const Vec3R &inCoord)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointSampler.html#aaa22ae89fd0aec39956caad811f550b8',1,'openvdb::v3_2_0::tools::PointSampler::sample(const TreeT &inTree, const Vec3R &inCoord, typename TreeT::ValueType &result)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointSampler.html#aa8ab47901cc813773d65645dfff1eb2e',1,'openvdb::v3_2_0::tools::PointSampler::sample(const TreeT &inTree, const Vec3R &inCoord)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html#aaa22ae89fd0aec39956caad811f550b8',1,'openvdb::v3_2_0::tools::BoxSampler::sample(const TreeT &inTree, const Vec3R &inCoord, typename TreeT::ValueType &result)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html#aa8ab47901cc813773d65645dfff1eb2e',1,'openvdb::v3_2_0::tools::BoxSampler::sample(const TreeT &inTree, const Vec3R &inCoord)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadraticSampler.html#aaa22ae89fd0aec39956caad811f550b8',1,'openvdb::v3_2_0::tools::QuadraticSampler::sample(const TreeT &inTree, const Vec3R &inCoord, typename TreeT::ValueType &result)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadraticSampler.html#aa8ab47901cc813773d65645dfff1eb2e',1,'openvdb::v3_2_0::tools::QuadraticSampler::sample(const TreeT &inTree, const Vec3R &inCoord)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredPointSampler.html#aaa22ae89fd0aec39956caad811f550b8',1,'openvdb::v3_2_0::tools::StaggeredPointSampler::sample(const TreeT &inTree, const Vec3R &inCoord, typename TreeT::ValueType &result)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredPointSampler.html#aa8ab47901cc813773d65645dfff1eb2e',1,'openvdb::v3_2_0::tools::StaggeredPointSampler::sample(const TreeT &inTree, const Vec3R &inCoord)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredBoxSampler.html#aaa22ae89fd0aec39956caad811f550b8',1,'openvdb::v3_2_0::tools::StaggeredBoxSampler::sample(const TreeT &inTree, const Vec3R &inCoord, typename TreeT::ValueType &result)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredBoxSampler.html#aa8ab47901cc813773d65645dfff1eb2e',1,'openvdb::v3_2_0::tools::StaggeredBoxSampler::sample(const TreeT &inTree, const Vec3R &inCoord)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredQuadraticSampler.html#aaa22ae89fd0aec39956caad811f550b8',1,'openvdb::v3_2_0::tools::StaggeredQuadraticSampler::sample(const TreeT &inTree, const Vec3R &inCoord, typename TreeT::ValueType &result)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredQuadraticSampler.html#aa8ab47901cc813773d65645dfff1eb2e',1,'openvdb::v3_2_0::tools::StaggeredQuadraticSampler::sample(const TreeT &inTree, const Vec3R &inCoord)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocitySampler.html#a1666010d10bc6565efbb0aa4242c72a0',1,'openvdb::v3_2_0::tools::VelocitySampler::sample(const LocationType &world, ValueType &result) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocitySampler.html#a6ca45331a9285cb2f4177811a7587019',1,'openvdb::v3_2_0::tools::VelocitySampler::sample(const LocationType &world) const ']]], + ['samplevalue',['sampleValue',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a43741686757b250d7b2483a103a45ab1',1,'openvdb::v3_2_0::tools::MultiResGrid::sampleValue(const Coord &in_ijk, size_t in_level, size_t out_level) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a751a78f7ffe1c603c357427687e76239',1,'openvdb::v3_2_0::tools::MultiResGrid::sampleValue(const Vec3R &in_ijk, size_t in_level, size_t out_level) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a3fa015f68f37d30d19629c4da779e747',1,'openvdb::v3_2_0::tools::MultiResGrid::sampleValue(const Coord &ijk, double level) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#ac702b49ec58ff2b75732f2122bd9ef68',1,'openvdb::v3_2_0::tools::MultiResGrid::sampleValue(const Vec3R &xyz, double level) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a24120de2a87f55b70a57e12f37ca97e7',1,'openvdb::v3_2_0::tools::MultiResGrid::sampleValue(const Coord &in_ijk, size_t in_level, size_t out_level) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#aea5a0fbafb960d511e9301486564ea5c',1,'openvdb::v3_2_0::tools::MultiResGrid::sampleValue(const Vec3R &in_xyz, size_t in_level, size_t out_level) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#adc1f84110e18934d7b0697622302a9a1',1,'openvdb::v3_2_0::tools::MultiResGrid::sampleValue(const Coord &ijk, double level) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#ac6c1c9ab834961e1dba209b9dbf71d7c',1,'openvdb::v3_2_0::tools::MultiResGrid::sampleValue(const Vec3R &xyz, double level) const ']]], + ['samplevoxel',['sampleVoxel',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#aefd15060203095771ce5a2eec2ad8cbd',1,'openvdb::v3_2_0::tools::GridSampler::sampleVoxel(const RealType &x, const RealType &y, const RealType &z) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#a46852f464b4624918d69f9d0bc935944',1,'openvdb::v3_2_0::tools::GridSampler::sampleVoxel(typename Coord::ValueType i, typename Coord::ValueType j, typename Coord::ValueType k) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html#aefd15060203095771ce5a2eec2ad8cbd',1,'openvdb::v3_2_0::tools::GridSampler< tree::ValueAccessor< TreeT >, SamplerType >::sampleVoxel(const RealType &x, const RealType &y, const RealType &z) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html#a46852f464b4624918d69f9d0bc935944',1,'openvdb::v3_2_0::tools::GridSampler< tree::ValueAccessor< TreeT >, SamplerType >::sampleVoxel(typename Coord::ValueType i, typename Coord::ValueType j, typename Coord::ValueType k) const ']]], + ['save',['save',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1MaskManager.html#aae2c382151ef7c9aa913361172b30db6',1,'openvdb::v3_2_0::tools::Morphology::MaskManager::save()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ada8db18b530657224fcba57b4faeb825',1,'openvdb::v3_2_0::util::NodeMask::save()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ada8db18b530657224fcba57b4faeb825',1,'openvdb::v3_2_0::util::NodeMask< 1 >::save()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ada8db18b530657224fcba57b4faeb825',1,'openvdb::v3_2_0::util::NodeMask< 2 >::save()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#ada8db18b530657224fcba57b4faeb825',1,'openvdb::v3_2_0::util::RootNodeMask::save()']]], + ['savefloatashalf',['saveFloatAsHalf',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ac838a0e531771a0328984635524dcaf6',1,'openvdb::v3_2_0::GridBase::saveFloatAsHalf()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#ac838a0e531771a0328984635524dcaf6',1,'openvdb::v3_2_0::io::GridDescriptor::saveFloatAsHalf()']]], + ['saveppm',['savePPM',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Film.html#a6b8eba669ee5b71c819b93bc2412ba05',1,'openvdb::v3_2_0::tools::Film']]], + ['scale',['scale',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a7e70596f522e9d65e04a382c8f5cd348',1,'openvdb::v3_2_0::math::pcg::Vector::scale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a7e70596f522e9d65e04a382c8f5cd348',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::scale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1RowEditor.html#a7703ea9cba48e807b83414cbcafcd63f',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::RowEditor::scale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a2034b0136d7cb4e2d3bde521aab5fd00',1,'openvdb::v3_2_0::math::Quat::scale()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Ray_1_1TimeSpan.html#a4b062f7d1e17db9946e629bdc2df5062',1,'openvdb::v3_2_0::math::Ray::TimeSpan::scale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a8283e35ce9005e3b94e3d99c8b0e8247',1,'openvdb::v3_2_0::math::Vec2::scale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a81e3ab50fad13ed6c5ab8cf17174b857',1,'openvdb::v3_2_0::math::Vec3::scale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a69777ba70a2b8be3751efc48958e72b5',1,'openvdb::v3_2_0::math::Vec4::scale()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a233527deef2b7f93c5d0cf888254deaf',1,'openvdb::v3_2_0::math::scale()']]], + ['scalemap',['ScaleMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#aa7430778b140b9a67c6e32383677315b',1,'openvdb::v3_2_0::math::ScaleMap::ScaleMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a40c3088b3653c722b1c58fa3cc9fca74',1,'openvdb::v3_2_0::math::ScaleMap::ScaleMap(const Vec3d &scale)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#ab307fbabd19da3570e04ac8d98c40c61',1,'openvdb::v3_2_0::math::ScaleMap::ScaleMap(const ScaleMap &other)']]], + ['scaletimes',['scaleTimes',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a6f3a72d885b1e6ab1c6955ad00456635',1,'openvdb::v3_2_0::math::Ray']]], + ['scaletranslatemap',['ScaleTranslateMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#ac540089c84b4ddb7b5e62ce9bf5e4b76',1,'openvdb::v3_2_0::math::ScaleTranslateMap::ScaleTranslateMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a7ad72e448c273feece7354126f6a2855',1,'openvdb::v3_2_0::math::ScaleTranslateMap::ScaleTranslateMap(const Vec3d &scale, const Vec3d &translate)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#ab13953a2148cfc8388c41965362ce713',1,'openvdb::v3_2_0::math::ScaleTranslateMap::ScaleTranslateMap(const ScaleMap &scale, const TranslationMap &translate)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a13a5faa8c799dc12d79ca5f23ed29c59',1,'openvdb::v3_2_0::math::ScaleTranslateMap::ScaleTranslateMap(const ScaleTranslateMap &other)']]], + ['scanfill',['scanFill',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal.html#a7b860c0d9cb36e93e965e1fb705c21c3',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['scatter',['scatter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1Neighbor.html#aa31e0712c841997181fbba24bbbe3624',1,'openvdb::v3_2_0::tools::Morphology::Neighbor::scatter()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#a3124924570807364a28163005d0758b2',1,'openvdb::v3_2_0::tools::Morphology::LeafCache::scatter(int n, int indx)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#a10135979b82b169aada52b4c521dfcc3',1,'openvdb::v3_2_0::tools::Morphology::LeafCache::scatter(int n, int indx)']]], + ['scatteredgesxy',['scatterEdgesXY',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#a9ab5fdbd69937c32a6d839566515da0b',1,'openvdb::v3_2_0::tools::Morphology::LeafCache']]], + ['scatterfacesxy',['scatterFacesXY',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#acae59452d5ee025fed9281bdc1f56353',1,'openvdb::v3_2_0::tools::Morphology::LeafCache']]], + ['sdfinteriormask',['sdfInteriorMask',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a59b83096927350f3324cba935be37717',1,'openvdb::v3_2_0::tools']]], + ['sdftilestofogvolume',['SDFTilesToFogVolume',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SDFTilesToFogVolume.html#a77f9d1913ab06a162424f0a87ac31703',1,'openvdb::v3_2_0::tools::level_set_util_internal::SDFTilesToFogVolume']]], + ['sdftofogvolume',['sdfToFogVolume',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aad82d1b0039598209bc21cd9aa4511a0',1,'openvdb::v3_2_0::tools']]], + ['sdfvoxelstofogvolume',['SDFVoxelsToFogVolume',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SDFVoxelsToFogVolume.html#a4d5e7bbc2ca56453650322d28dc07ae9',1,'openvdb::v3_2_0::tools::level_set_util_internal::SDFVoxelsToFogVolume']]], + ['seamweights',['SeamWeights',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SeamWeights.html#ad24b90fa071b7280eb8b12fa27d6f261',1,'openvdb::v3_2_0::tools::internal::SeamWeights']]], + ['search',['search',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestSurfacePoint.html#a133abf20ded86e2e779ffbb89911e38f',1,'openvdb::v3_2_0::tools::ClosestSurfacePoint']]], + ['searchandapply',['searchAndApply',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexFilter.html#ad843178ba73e14db18a793ecc2378fdf',1,'openvdb::v3_2_0::tools::PointIndexFilter']]], + ['searchandreplace',['searchAndReplace',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestSurfacePoint.html#a6f52a83dc359cd1cabcddc56d8350ff3',1,'openvdb::v3_2_0::tools::ClosestSurfacePoint']]], + ['searchandupdate',['searchAndUpdate',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#add08dfc840f3c5064dc2e9eadc86cec1',1,'openvdb::v3_2_0::tools::PointIndexIterator::searchAndUpdate(const Coord &ijk, ConstAccessor &acc)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a7d5171b94aa5b11090c605f6dff4206d',1,'openvdb::v3_2_0::tools::PointIndexIterator::searchAndUpdate(const CoordBBox &bbox, ConstAccessor &acc)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a5bad5086a83606c21c539bcc921cf2ed',1,'openvdb::v3_2_0::tools::PointIndexIterator::searchAndUpdate(const BBoxd &bbox, ConstAccessor &acc, const PointArray &points, const math::Transform &xform)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a6b12fc822fc129ddebcffc9bf5f10c8f',1,'openvdb::v3_2_0::tools::PointIndexIterator::searchAndUpdate(const Vec3d &center, double radius, ConstAccessor &acc, const PointArray &points, const math::Transform &xform, bool subvoxelAccuracy=true)']]], + ['secondmap',['secondMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a16d5152ce40705e72e65d3b4e1469652',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::secondMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#aeb62a0e3afa539e3dc98ba965d6a9b77',1,'openvdb::v3_2_0::math::CompoundMap::secondMap()']]], + ['secondorderdensestencil',['SecondOrderDenseStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1SecondOrderDenseStencil.html#a74fa49b7b0d792318e7c1a7f263c2f93',1,'openvdb::v3_2_0::math::SecondOrderDenseStencil']]], + ['seedfill',['seedFill',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal.html#af7467cf4d156427e4c5885779ee5f1ad',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['seedfillexteriorsign',['SeedFillExteriorSign',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedFillExteriorSign.html#aa6d93480817644073eee40bbc684fc16',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedFillExteriorSign']]], + ['seedpoints',['SeedPoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html#ac656ee81f2d3c9f3409092603a619f84',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedPoints']]], + ['seektoblocks',['seekToBlocks',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a386c4afa0d8738328be0eeae4260f98a',1,'openvdb::v3_2_0::io::GridDescriptor::seekToBlocks(std::istream &) const '],['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a6ace5f2149dbf3e17a137bfe6b083699',1,'openvdb::v3_2_0::io::GridDescriptor::seekToBlocks(std::ostream &) const ']]], + ['seektoend',['seekToEnd',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#adb8cb673d5b7dba7759eaf4956b391c5',1,'openvdb::v3_2_0::io::GridDescriptor::seekToEnd(std::istream &) const '],['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#ac4deab7dd16c1380cc986a4a607a2471',1,'openvdb::v3_2_0::io::GridDescriptor::seekToEnd(std::ostream &) const ']]], + ['seektogrid',['seekToGrid',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#abbb685505ae84808444d1613ac9e0876',1,'openvdb::v3_2_0::io::GridDescriptor::seekToGrid(std::istream &) const '],['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a148f31b72a874fc877a143823fb0c192',1,'openvdb::v3_2_0::io::GridDescriptor::seekToGrid(std::ostream &) const ']]], + ['segment',['segment',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildPrimarySegment.html#ab2ca9d867640a6da9080942f50cd0455',1,'openvdb::v3_2_0::tools::composite::BuildPrimarySegment::segment()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildSecondarySegment.html#ab2ca9d867640a6da9080942f50cd0455',1,'openvdb::v3_2_0::tools::composite::BuildSecondarySegment::segment()']]], + ['segmentactivevoxels',['segmentActiveVoxels',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a1cc2d4f60d561afd2fb248e386ca67d8',1,'openvdb::v3_2_0::tools']]], + ['segmentnodemask',['SegmentNodeMask',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SegmentNodeMask.html#a6c654db53ab9ed1b09d34159cafc148b',1,'openvdb::v3_2_0::tools::level_set_util_internal::SegmentNodeMask']]], + ['segmentsdf',['segmentSDF',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac9f4df82ed92eb746d439ce4721ea8a5',1,'openvdb::v3_2_0::tools']]], + ['sep',['sep',['../classopenvdb_1_1v3__2__0_1_1util_1_1FormattedInt.html#a87555d9d1278c7f80b70dacabcaa7469',1,'openvdb::v3_2_0::util::FormattedInt']]], + ['set',['set',['../structopenvdb_1_1v3__2__0_1_1math_1_1Ray_1_1TimeSpan.html#ac91ae5b3a1a3537059fbb423a0c03a9c',1,'openvdb::v3_2_0::math::Ray::TimeSpan::set()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a4a0427f99be883dd54a9573e20870215',1,'openvdb::v3_2_0::util::NodeMask::set(Index32 n, bool On)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a86dfbad4f0db4e9a37b5e7544440a12e',1,'openvdb::v3_2_0::util::NodeMask::set(bool on)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a4a0427f99be883dd54a9573e20870215',1,'openvdb::v3_2_0::util::NodeMask< 1 >::set(Index32 n, bool On)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a86dfbad4f0db4e9a37b5e7544440a12e',1,'openvdb::v3_2_0::util::NodeMask< 1 >::set(bool on)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a4a0427f99be883dd54a9573e20870215',1,'openvdb::v3_2_0::util::NodeMask< 2 >::set(Index32 n, bool On)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a86dfbad4f0db4e9a37b5e7544440a12e',1,'openvdb::v3_2_0::util::NodeMask< 2 >::set(bool on)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a2ed7935a22760e8b1b79b60c7b02e3b4',1,'openvdb::v3_2_0::util::RootNodeMask::set()']]], + ['setabsorption',['setAbsorption',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#a503cbe745097f6dd16a953e977a493ed',1,'openvdb::v3_2_0::tools::VolumeRender']]], + ['setactivestate',['setActiveState',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#af37ceaf280f447def1bf5dc71e8ad41d',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setActiveState(const Coord &, bool)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a5c190f79c849e6a347d43da3d4380604',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setActiveState(Index, bool)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a7b3e82eb582914ac6f31f32fea77292f',1,'openvdb::v3_2_0::tree::InternalNode::setActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a7b3e82eb582914ac6f31f32fea77292f',1,'openvdb::v3_2_0::tree::LeafNode::setActiveState(const Coord &xyz, bool on)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ad92d76f17632c84c6eebe8b6c872a6fc',1,'openvdb::v3_2_0::tree::LeafNode::setActiveState(Index offset, bool on)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a7b3e82eb582914ac6f31f32fea77292f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setActiveState(const Coord &xyz, bool on)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ad92d76f17632c84c6eebe8b6c872a6fc',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setActiveState(Index offset, bool on)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a7b3e82eb582914ac6f31f32fea77292f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setActiveState(const Coord &xyz, bool on)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ad92d76f17632c84c6eebe8b6c872a6fc',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setActiveState(Index offset, bool on)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a7b3e82eb582914ac6f31f32fea77292f',1,'openvdb::v3_2_0::tree::RootNode::setActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a7b3e82eb582914ac6f31f32fea77292f',1,'openvdb::v3_2_0::tree::Tree::setActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a10c9560d1832cadc5ec67c49be2c6380',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::setActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a151020c757d73e8bf2545656110f7bd2',1,'openvdb::v3_2_0::tree::ValueAccessor::setActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a7b3e82eb582914ac6f31f32fea77292f',1,'openvdb::v3_2_0::tree::CacheItem::setActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a7b3e82eb582914ac6f31f32fea77292f',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::setActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a151020c757d73e8bf2545656110f7bd2',1,'openvdb::v3_2_0::tree::ValueAccessor0::setActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a151020c757d73e8bf2545656110f7bd2',1,'openvdb::v3_2_0::tree::ValueAccessor1::setActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a151020c757d73e8bf2545656110f7bd2',1,'openvdb::v3_2_0::tree::ValueAccessor2::setActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a151020c757d73e8bf2545656110f7bd2',1,'openvdb::v3_2_0::tree::ValueAccessor3::setActiveState()']]], + ['setactivestateandcache',['setActiveStateAndCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a60f6c5ca715dae26176276384e5b6b8b',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setActiveStateAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ac04db06362bfb5ec0ed6212469eb4ff3',1,'openvdb::v3_2_0::tree::InternalNode::setActiveStateAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ac04db06362bfb5ec0ed6212469eb4ff3',1,'openvdb::v3_2_0::tree::LeafNode::setActiveStateAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ac04db06362bfb5ec0ed6212469eb4ff3',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setActiveStateAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ac04db06362bfb5ec0ed6212469eb4ff3',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setActiveStateAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ac04db06362bfb5ec0ed6212469eb4ff3',1,'openvdb::v3_2_0::tree::RootNode::setActiveStateAndCache()']]], + ['setadaptivitymask',['setAdaptivityMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#ab66fc6c0bbf727d922e4067875635a4d',1,'openvdb::v3_2_0::tools::VolumeToMesh::setAdaptivityMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#a94f2c6853087f193524ffaaec891ff2f',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions::setAdaptivityMask()']]], + ['setaisactive',['setAIsActive',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#aa88acf4c6a0e5050e4518d948b690555',1,'openvdb::v3_2_0::CombineArgs']]], + ['setalphamask',['setAlphaMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#ad1fc9438cf4d0e664433c0098708488e',1,'openvdb::v3_2_0::tools::LevelSetMorphing']]], + ['setaref',['setARef',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a900c9ae9b589ed9887ee757faa6fe3a8',1,'openvdb::v3_2_0::CombineArgs']]], + ['setaxisangle',['setAxisAngle',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a0ea5cd538c513c29ac37288105de9d4b',1,'openvdb::v3_2_0::math::Quat']]], + ['setbackground',['setBackground',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ab9a9be183fae028c2479dd20163a52ee',1,'openvdb::v3_2_0::tree::RootNode']]], + ['setbackgroundptr',['setBackgroundPtr',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#ab1dc968f973ef0391a71a8d72f401094',1,'openvdb::v3_2_0::io::StreamMetadata']]], + ['setbasis',['setBasis',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a2e6981964dca01f637894e81df5fbe10',1,'openvdb::v3_2_0::math::Mat3::setBasis()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#af2a1d44293d2e171de8a0c34a54a5cbf',1,'openvdb::v3_2_0::math::Mat4::setBasis()']]], + ['setbisactive',['setBIsActive',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a7ad8c55591073255c5a83eff256f190b',1,'openvdb::v3_2_0::CombineArgs']]], + ['setblockpos',['setBlockPos',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a79c673cd02c7688efe0d5e4a8badc03f',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['setbref',['setBRef',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#ad560fb4a2f8a5ce1fea42695291a2091',1,'openvdb::v3_2_0::CombineArgs']]], + ['setcamera',['setCamera',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#a93b1e550b09dce77eeaf1acea10e4dfc',1,'openvdb::v3_2_0::tools::LevelSetRayTracer::setCamera()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#a93b1e550b09dce77eeaf1acea10e4dfc',1,'openvdb::v3_2_0::tools::VolumeRender::setCamera()']]], + ['setcapacity',['setCapacity',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#acbb37749d06eb94f56f9a742d66acf16',1,'openvdb::v3_2_0::io::Queue']]], + ['setchild',['setChild',['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a6e8d27e46c9047a417513978cc5a1312',1,'openvdb::v3_2_0::tree::DenseIteratorBase::setChild()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01false_00_01ValueT_00_01ChildT_01_4.html#a043790fd9cad19569d830db6077581f9',1,'openvdb::v3_2_0::tree::NodeUnionImpl< false, ValueT, ChildT >::setChild()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01true_00_01ValueT_00_01ChildT_01_4.html#a043790fd9cad19569d830db6077581f9',1,'openvdb::v3_2_0::tree::NodeUnionImpl< true, ValueT, ChildT >::setChild()']]], + ['setchildnode',['setChildNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a19c8be044c364a09575e4c25e8c269ab',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['setcol',['setCol',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a7f0d7198dacce6ce93401586263c4bbf',1,'openvdb::v3_2_0::math::Mat3::setCol()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a68c3859392fa67a8dbb7bda68fd7813f',1,'openvdb::v3_2_0::math::Mat4::setCol()']]], + ['setcolumns',['setColumns',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#af08e6152df053fe8980d55e7ccf607fd',1,'openvdb::v3_2_0::math::Mat3::setColumns()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a792bba2fb77c5beb92721efe95332585',1,'openvdb::v3_2_0::math::Mat4::setColumns()']]], + ['setcompression',['setCompression',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#aaac46d62e6470ece11e3c97d4c93dd6e',1,'openvdb::v3_2_0::io::Archive::setCompression()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a19824f6dee825d3576516adaa74a48ad',1,'openvdb::v3_2_0::io::StreamMetadata::setCompression()']]], + ['setconstraintiterations',['setConstraintIterations',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestPointProjector.html#ad9aca547788ac1c34d03b52702deb397',1,'openvdb::v3_2_0::tools::ClosestPointProjector::setConstraintIterations()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#ad60be188b98e1ab6a985d5cf6f979e7c',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect::setConstraintIterations()']]], + ['setcopymaxbytes',['setCopyMaxBytes',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a149180fbea28c88ffbb77739a21354cb',1,'openvdb::v3_2_0::io::File']]], + ['setcreator',['setCreator',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ab8ca1d751197a95b14a8b1f9cadbe81e',1,'openvdb::v3_2_0::GridBase']]], + ['setcurrentversion',['setCurrentVersion',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a802dfeaf3d089ecfe30a21e6d729723b',1,'openvdb::v3_2_0::io']]], + ['setcutoff',['setCutOff',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#afc9e4083cdcbb215111a8a0f20effb16',1,'openvdb::v3_2_0::tools::VolumeRender']]], + ['setdatacompression',['setDataCompression',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a2efc8dc6da3250694e391d11b71c5114',1,'openvdb::v3_2_0::io::Archive::setDataCompression()'],['../namespaceopenvdb_1_1v3__2__0_1_1io.html#aeb2a9d30a81b8e8f7f351837668c62b6',1,'openvdb::v3_2_0::io::setDataCompression()']]], + ['setdepth',['setDepth',['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#ae5912b944b946bb35a65bc080e0e529d',1,'openvdb::v3_2_0::math::NonlinearFrustumMap']]], + ['setdir',['setDir',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a5a59a1633e568f5466a2ce4d147426f7',1,'openvdb::v3_2_0::math::Ray']]], + ['setendpos',['setEndPos',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a2f4f761ce2afe2f52c0e2929488b2306',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['seteye',['setEye',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a293a80debe8291d87cd443ef3707d80a',1,'openvdb::v3_2_0::math::Ray']]], + ['setfileversion',['setFileVersion',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#abe6d1bd7d8e5771a2328d344f7bfd5f5',1,'openvdb::v3_2_0::io::StreamMetadata']]], + ['setfirstmap',['setFirstMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#a36cd56f3046fe8bdf8dfb9794624e355',1,'openvdb::v3_2_0::math::CompoundMap']]], + ['setfirstoff',['setFirstOff',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a75235dbdcf921410c7a02c6a9f7e2313',1,'openvdb::v3_2_0::util::NodeMask::setFirstOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a75235dbdcf921410c7a02c6a9f7e2313',1,'openvdb::v3_2_0::util::NodeMask< 1 >::setFirstOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a75235dbdcf921410c7a02c6a9f7e2313',1,'openvdb::v3_2_0::util::NodeMask< 2 >::setFirstOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a75235dbdcf921410c7a02c6a9f7e2313',1,'openvdb::v3_2_0::util::RootNodeMask::setFirstOff()']]], + ['setfirston',['setFirstOn',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a8d1574a0bde45311e7e79c3cb77455df',1,'openvdb::v3_2_0::util::NodeMask::setFirstOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a8d1574a0bde45311e7e79c3cb77455df',1,'openvdb::v3_2_0::util::NodeMask< 1 >::setFirstOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a8d1574a0bde45311e7e79c3cb77455df',1,'openvdb::v3_2_0::util::NodeMask< 2 >::setFirstOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a8d1574a0bde45311e7e79c3cb77455df',1,'openvdb::v3_2_0::util::RootNodeMask::setFirstOn()']]], + ['setformatversion',['setFormatVersion',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a0591fc7e869e0f74a6f9c8c54f09ec75',1,'openvdb::v3_2_0::io::Archive']]], + ['setgrainsize',['setGrainSize',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a74013cfeac75bec3a6ff587552cce836',1,'openvdb::v3_2_0::tools::Filter::setGrainSize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#a74013cfeac75bec3a6ff587552cce836',1,'openvdb::v3_2_0::tools::LevelSetAdvection::setGrainSize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#a74013cfeac75bec3a6ff587552cce836',1,'openvdb::v3_2_0::tools::LevelSetMeasure::setGrainSize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a74013cfeac75bec3a6ff587552cce836',1,'openvdb::v3_2_0::tools::LevelSetMorphing::setGrainSize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a74013cfeac75bec3a6ff587552cce836',1,'openvdb::v3_2_0::tools::LevelSetTracker::setGrainSize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a2abcbeae6971afd80df6d20223347704',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet::setGrainSize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#afaf3b04c07bc3e8e009a091fef3df197',1,'openvdb::v3_2_0::tools::VolumeAdvection::setGrainSize()']]], + ['setgrid',['setGrid',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#a540157e2ed2200bc3ce93b24dae2b5a8',1,'openvdb::v3_2_0::tools::LevelSetRayTracer']]], + ['setgridbackgroundvalueptr',['setGridBackgroundValuePtr',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#abfe2e9bf82a1272993a4aaa21af3b814',1,'openvdb::v3_2_0::io']]], + ['setgridclass',['setGridClass',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a60f870194239aba95a3a0a01597d391a',1,'openvdb::v3_2_0::GridBase::setGridClass()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a0d365bb95256e33f722d343699ccf8c1',1,'openvdb::v3_2_0::io::StreamMetadata::setGridClass()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a0494d4a7eba077606931479b8480e614',1,'openvdb::v3_2_0::tools::MultiResGrid::setGridClass()'],['../namespaceopenvdb_1_1v3__2__0_1_1io.html#ab46d00a93c47f2ff95d159e22b28b2cf',1,'openvdb::v3_2_0::io::setGridClass()']]], + ['setgridcompression',['setGridCompression',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a0dcca8f2fc0d2f1e88406fada3a32924',1,'openvdb::v3_2_0::io::Archive']]], + ['setgridpos',['setGridPos',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a3ee3288c1dba761230c76ac785456192',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['setgridstatsmetadataenabled',['setGridStatsMetadataEnabled',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#af08f61661d1d69b8e906340d4e610fcf',1,'openvdb::v3_2_0::io::Archive']]], + ['sethalffloat',['setHalfFloat',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a495e7f8479be3957eaefd00b33e56bf2',1,'openvdb::v3_2_0::io::StreamMetadata::setHalfFloat()'],['../namespaceopenvdb_1_1v3__2__0_1_1io.html#ace55a0ed6d5bd43fb9b6ca4519f91927',1,'openvdb::v3_2_0::io::setHalfFloat()']]], + ['setidentity',['setIdentity',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a382e6ad7e6721b121e510959e1011be3',1,'openvdb::v3_2_0::math::Mat3::setIdentity()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a382e6ad7e6721b121e510959e1011be3',1,'openvdb::v3_2_0::math::Mat4::setIdentity()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a03cfd2529447ab8bed5afbe5230e9a00',1,'openvdb::v3_2_0::math::Quat::setIdentity()']]], + ['setindexray',['setIndexRay',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a037f71f8178f967ca49b50e926c24cef',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::setIndexRay()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#a037f71f8178f967ca49b50e926c24cef',1,'openvdb::v3_2_0::tools::LinearSearchImpl::setIndexRay()']]], + ['setinputhasgridoffsets',['setInputHasGridOffsets',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#aff363fd722294a598094133a915f7a8d',1,'openvdb::v3_2_0::io::Archive']]], + ['setinstanceparentname',['setInstanceParentName',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#ab8c5f72ed3a07920389791decffbc5c4',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['setinstancingenabled',['setInstancingEnabled',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a930a90feb9d127ca695fb73eb75f8187',1,'openvdb::v3_2_0::io::Archive']]], + ['setintegrationorder',['setIntegrationOrder',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#a75c62d321d6fa2162639348017c483ef',1,'openvdb::v3_2_0::tools::PointAdvect::setIntegrationOrder()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#a75c62d321d6fa2162639348017c483ef',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect::setIntegrationOrder()']]], + ['setintegrator',['setIntegrator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#ae3e18e2dbd7b6499cea6b349ac0688dc',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['setinterrupter',['setInterrupter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html#a4696e5cc39df7c33478f29dd888f19d7',1,'openvdb::v3_2_0::tools::GridResampler']]], + ['setintersector',['setIntersector',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#a57d7fb7e072663fcbaa0d065ccf22214',1,'openvdb::v3_2_0::tools::LevelSetRayTracer::setIntersector()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#a57d7fb7e072663fcbaa0d065ccf22214',1,'openvdb::v3_2_0::tools::VolumeRender::setIntersector()']]], + ['setisinworldspace',['setIsInWorldSpace',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#af7d08f61e709400a7ecf2c8da101f52f',1,'openvdb::v3_2_0::GridBase']]], + ['setitem',['setItem',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ChildIter.html#a3acfab6b9e79ea9af8b8d2b74f6ed87f',1,'openvdb::v3_2_0::tree::InternalNode::ChildIter::setItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ValueIter.html#a15b7f3f846c57265f288db248c72e4f5',1,'openvdb::v3_2_0::tree::InternalNode::ValueIter::setItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DenseIter.html#a6e1f266528fc58aff13aa94b120e483c',1,'openvdb::v3_2_0::tree::InternalNode::DenseIter::setItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#ac5480a6ca2259acdff0bd72f869eb551',1,'openvdb::v3_2_0::tree::SparseIteratorBase::setItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a2a90fe02eea5e7257922f3f6b90bf826',1,'openvdb::v3_2_0::tree::DenseIteratorBase::setItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueIter.html#a03e38f1681b274cfa5f5219dc3c2b09a',1,'openvdb::v3_2_0::tree::LeafNode::ValueIter::setItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ValueIter.html#a7cb2781a108afee1323df5aa7a1236cd',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter::setItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ValueIter.html#a7cb2781a108afee1323df5aa7a1236cd',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter::setItem()']]], + ['setiter',['setIter',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#aa7e08a34cacae3b73125454d4f3de9c9',1,'openvdb::v3_2_0::tree::IterListItem::setIter(const IterT &iter)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a3ac6bb34c0d6347693e7cd490b3f1b61',1,'openvdb::v3_2_0::tree::IterListItem::setIter(const OtherIterT &iter)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#aa7e08a34cacae3b73125454d4f3de9c9',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::setIter(const IterT &iter)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a3ac6bb34c0d6347693e7cd490b3f1b61',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::setIter(const OtherIterT &iter)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#aa7e08a34cacae3b73125454d4f3de9c9',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::setIter()']]], + ['setlastoff',['setLastOff',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a5b5fea2f8c74c88c485d8ff1ca762acd',1,'openvdb::v3_2_0::util::NodeMask::setLastOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a5b5fea2f8c74c88c485d8ff1ca762acd',1,'openvdb::v3_2_0::util::NodeMask< 1 >::setLastOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a5b5fea2f8c74c88c485d8ff1ca762acd',1,'openvdb::v3_2_0::util::NodeMask< 2 >::setLastOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a5b5fea2f8c74c88c485d8ff1ca762acd',1,'openvdb::v3_2_0::util::RootNodeMask::setLastOff()']]], + ['setlaston',['setLastOn',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#af37125f5bb7fb22769790279ad0fd170',1,'openvdb::v3_2_0::util::NodeMask::setLastOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#af37125f5bb7fb22769790279ad0fd170',1,'openvdb::v3_2_0::util::NodeMask< 1 >::setLastOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#af37125f5bb7fb22769790279ad0fd170',1,'openvdb::v3_2_0::util::NodeMask< 2 >::setLastOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#af37125f5bb7fb22769790279ad0fd170',1,'openvdb::v3_2_0::util::RootNodeMask::setLastOn()']]], + ['setlibraryversion',['setLibraryVersion',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a10993f276cceeb4f23b4908813fc5e42',1,'openvdb::v3_2_0::io::Archive::setLibraryVersion()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#adeabd2c03ab7a98d4e27ed0809e62281',1,'openvdb::v3_2_0::io::StreamMetadata::setLibraryVersion()']]], + ['setlightcolor',['setLightColor',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#abb8bf1793b1a69aa29363f02ed2a7575',1,'openvdb::v3_2_0::tools::VolumeRender']]], + ['setlightdir',['setLightDir',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#a68cb82f6b355888ac15fbb663b6b4595',1,'openvdb::v3_2_0::tools::VolumeRender']]], + ['setlightgain',['setLightGain',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#afab49cc9d27769b21800377ed90eb5b2',1,'openvdb::v3_2_0::tools::VolumeRender']]], + ['setlimiter',['setLimiter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#a633de11f90d17e1afaff9fc6a09838b0',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['setmappedfileptr',['setMappedFilePtr',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a00a549e5ef97c9eaac2cd62a5a4c51f6',1,'openvdb::v3_2_0::io']]], + ['setmaskrange',['setMaskRange',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a84b5de0dab82e78703de694a347a166c',1,'openvdb::v3_2_0::tools::Filter::setMaskRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a84b5de0dab82e78703de694a347a166c',1,'openvdb::v3_2_0::tools::LevelSetFilter::setMaskRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a503a0921a543e2b52689aaabca665b09',1,'openvdb::v3_2_0::tools::LevelSetMorphing::setMaskRange()']]], + ['setmat3',['setMat3',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#adad43709ee54eb7b3dc9c1f283ce7a91',1,'openvdb::v3_2_0::math::Mat4']]], + ['setmaxdepth',['setMaxDepth',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#abb35acc58a2730ea34826a8f1f9d3f7a',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::setMaxDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#abb35acc58a2730ea34826a8f1f9d3f7a',1,'openvdb::v3_2_0::tree::NodeIteratorBase::setMaxDepth()']]], + ['setmaxtime',['setMaxTime',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a9440339d1ea197d90f0a382898f80406',1,'openvdb::v3_2_0::math::Ray']]], + ['setmindepth',['setMinDepth',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a957c4c84291f62d6f4175a7f09ac88c4',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::setMinDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a957c4c84291f62d6f4175a7f09ac88c4',1,'openvdb::v3_2_0::tree::NodeIteratorBase::setMinDepth()']]], + ['setmintime',['setMinTime',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#af860292fdf305f03570c001ef74b80c9',1,'openvdb::v3_2_0::math::Ray']]], + ['setname',['setName',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a36c59a26f0317be12cea01f8dea24ec7',1,'openvdb::v3_2_0::GridBase::setName()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a9d3a2685df23b5e7cbf59c19c4a1f9b5',1,'openvdb::v3_2_0::tools::MultiResGrid::setName()']]], + ['setnormcount',['setNormCount',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#a7fef851f02250854c863da6e0c8e7775',1,'openvdb::v3_2_0::tools::LevelSetAdvection::setNormCount()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a7fef851f02250854c863da6e0c8e7775',1,'openvdb::v3_2_0::tools::LevelSetMorphing::setNormCount()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a7fef851f02250854c863da6e0c8e7775',1,'openvdb::v3_2_0::tools::LevelSetTracker::setNormCount()']]], + ['setnotifier',['setNotifier',['../classopenvdb_1_1v3__2__0_1_1io_1_1MappedFile.html#ae03b6175ee1fbbf77d8613ef5cecdab0',1,'openvdb::v3_2_0::io::MappedFile']]], + ['setoff',['setOff',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#aa68c2d78bd0e575586d58b0462f8b408',1,'openvdb::v3_2_0::util::NodeMask::setOff(Index32 n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#aa1aeb8ff27de4c8cdc9a2168038c62aa',1,'openvdb::v3_2_0::util::NodeMask::setOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#aa68c2d78bd0e575586d58b0462f8b408',1,'openvdb::v3_2_0::util::NodeMask< 1 >::setOff(Index32 n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#aa1aeb8ff27de4c8cdc9a2168038c62aa',1,'openvdb::v3_2_0::util::NodeMask< 1 >::setOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#aa68c2d78bd0e575586d58b0462f8b408',1,'openvdb::v3_2_0::util::NodeMask< 2 >::setOff(Index32 n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#aa1aeb8ff27de4c8cdc9a2168038c62aa',1,'openvdb::v3_2_0::util::NodeMask< 2 >::setOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a667959a57d19bd2f1ec16bf1aded42e4',1,'openvdb::v3_2_0::util::RootNodeMask::setOff(Index32 i)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#aa1aeb8ff27de4c8cdc9a2168038c62aa',1,'openvdb::v3_2_0::util::RootNodeMask::setOff()']]], + ['setoffseton',['setOffsetOn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a913b5cc4cfdeaf5bd27474e060f2df4d',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['setoffsetonly',['setOffsetOnly',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a64f28428a2c721c25ae79d95a29b482e',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['seton',['setOn',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#aa75829d294f5c5aa5e388588d29bcd8e',1,'openvdb::v3_2_0::util::NodeMask::setOn(Index32 n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a4a08bd62f6d96a28aefa66c60cd095e8',1,'openvdb::v3_2_0::util::NodeMask::setOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#aa75829d294f5c5aa5e388588d29bcd8e',1,'openvdb::v3_2_0::util::NodeMask< 1 >::setOn(Index32 n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a4a08bd62f6d96a28aefa66c60cd095e8',1,'openvdb::v3_2_0::util::NodeMask< 1 >::setOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#aa75829d294f5c5aa5e388588d29bcd8e',1,'openvdb::v3_2_0::util::NodeMask< 2 >::setOn(Index32 n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a4a08bd62f6d96a28aefa66c60cd095e8',1,'openvdb::v3_2_0::util::NodeMask< 2 >::setOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a6b9f1c988262b633ae6a39f71b8574aa',1,'openvdb::v3_2_0::util::RootNodeMask::setOn(Index32 i)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a4a08bd62f6d96a28aefa66c60cd095e8',1,'openvdb::v3_2_0::util::RootNodeMask::setOn()']]], + ['setorigin',['setOrigin',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#ae88e4bb5275c11a053076c34d349d3c5',1,'openvdb::v3_2_0::tools::Morphology::LeafCache::setOrigin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a594b25da67e57a3b0f252ce8417bb5e1',1,'openvdb::v3_2_0::tree::InternalNode::setOrigin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a594b25da67e57a3b0f252ce8417bb5e1',1,'openvdb::v3_2_0::tree::LeafNode::setOrigin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a594b25da67e57a3b0f252ce8417bb5e1',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setOrigin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a594b25da67e57a3b0f252ce8417bb5e1',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setOrigin()']]], + ['setpixelsamples',['setPixelSamples',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#aec145a2bcd0682b7bd4d96e31a5722f8',1,'openvdb::v3_2_0::tools::LevelSetRayTracer']]], + ['setprimarystep',['setPrimaryStep',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#ab1247c2656d38e2144fec234c1601d85',1,'openvdb::v3_2_0::tools::VolumeRender']]], + ['setrange',['setRange',['../classopenvdb_1_1v3__2__0_1_1math_1_1RandInt.html#a45836924d088ae055f6a66cf1ab8d19e',1,'openvdb::v3_2_0::math::RandInt']]], + ['setrefdata',['setRefData',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPoints.html#a0e73850e20690f73ccad494d9ffd54b2',1,'openvdb::v3_2_0::tools::internal::GenPoints::setRefData()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#aa679f78ca65b434a1509b782d5d8564b',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions::setRefData()']]], + ['setrefgrid',['setRefGrid',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#a1f09765480f969c7883f7190c1d15b75',1,'openvdb::v3_2_0::tools::VolumeToMesh']]], + ['setrefsigntree',['setRefSignTree',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPolygons.html#a7682ac0718ee4919eb1688db14ab5059',1,'openvdb::v3_2_0::tools::internal::GenPolygons']]], + ['setresult',['setResult',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a0429b53fb51750f92b0d901ee429e4ed',1,'openvdb::v3_2_0::CombineArgs']]], + ['setresultisactive',['setResultIsActive',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#afc6a5268cc684406ceba1822d8285362',1,'openvdb::v3_2_0::CombineArgs']]], + ['setresultref',['setResultRef',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a7347090d3e7aceee571fee4dc6c2fa81',1,'openvdb::v3_2_0::CombineArgs']]], + ['setrmax',['setRmax',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a0dd9f3fd98a7eee8f8eaf91398fc49c6',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['setrmin',['setRmin',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#ad8dea37d3a808fef39a4e4db4d297b41',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['setrow',['setRow',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#ae2faf0b4df99037081173dda24e399a0',1,'openvdb::v3_2_0::math::Mat3::setRow()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#ab9ccd8d858c93f78abce438c9abad1be',1,'openvdb::v3_2_0::math::Mat4::setRow()']]], + ['setrows',['setRows',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a13403d9598581818322cb6a686a2370c',1,'openvdb::v3_2_0::math::Mat3::setRows()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a454011d03dc14216a6b68d03e5798cf1',1,'openvdb::v3_2_0::math::Mat4::setRows()']]], + ['setsavefloatashalf',['setSaveFloatAsHalf',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a2718ae098c784d28d4c13868e0aab0da',1,'openvdb::v3_2_0::GridBase']]], + ['setscattering',['setScattering',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#ac2e7631fdbd1842d6534de80e91ea7bd',1,'openvdb::v3_2_0::tools::VolumeRender']]], + ['setsecondmap',['setSecondMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#a1f61a3b80137a0eacdfb38a836e6d4e7',1,'openvdb::v3_2_0::math::CompoundMap']]], + ['setseed',['setSeed',['../classopenvdb_1_1v3__2__0_1_1math_1_1Rand01.html#a14b118cee58ff47c6b8f048524e5234e',1,'openvdb::v3_2_0::math::Rand01::setSeed()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1RandInt.html#a14b118cee58ff47c6b8f048524e5234e',1,'openvdb::v3_2_0::math::RandInt::setSeed()']]], + ['setshader',['setShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#ad5a29f4bcba7c7c912e1cb2acd486d26',1,'openvdb::v3_2_0::tools::LevelSetRayTracer']]], + ['setshadowstep',['setShadowStep',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#a0fdc89d0a66b65cc33703dbc306dd890',1,'openvdb::v3_2_0::tools::VolumeRender']]], + ['setskew',['setSkew',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a85e90281d3263d7d4fdc32ea86a4b954',1,'openvdb::v3_2_0::math::Mat3']]], + ['setspatialadaptivity',['setSpatialAdaptivity',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#a8d3ea4435cd57ee0673ed6f82bdace7d',1,'openvdb::v3_2_0::tools::VolumeToMesh::setSpatialAdaptivity()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#a78190ae7140c636921fc1378a06d1d58',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions::setSpatialAdaptivity()']]], + ['setspatialscheme',['setSpatialScheme',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#a6527431f85ca2f424ccffcc16890679c',1,'openvdb::v3_2_0::tools::LevelSetAdvection::setSpatialScheme()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a6527431f85ca2f424ccffcc16890679c',1,'openvdb::v3_2_0::tools::LevelSetMorphing::setSpatialScheme()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a6527431f85ca2f424ccffcc16890679c',1,'openvdb::v3_2_0::tools::LevelSetTracker::setSpatialScheme()']]], + ['setstate',['setState',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a48b4be579118c7039299e32066603204',1,'openvdb::v3_2_0::tools::LevelSetTracker']]], + ['setstreammetadataptr',['setStreamMetadataPtr',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a6b4cd4dddaaa42646767fc481fbdaa68',1,'openvdb::v3_2_0::io']]], + ['setsubsteps',['setSubSteps',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#a276266b548c72990768736d2dd49dd39',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['setsurfacemask',['setSurfaceMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#aad8409de3285ed2eca9535f24ce03b7e',1,'openvdb::v3_2_0::tools::VolumeToMesh']]], + ['setsymmetric',['setSymmetric',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#afad3fd94f0ab86957f4e52bb06a6f889',1,'openvdb::v3_2_0::math::Mat3']]], + ['settaper',['setTaper',['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a15089c08a25ccc50d986d1591c0c7914',1,'openvdb::v3_2_0::math::NonlinearFrustumMap']]], + ['settarget',['setTarget',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#adf5321c3abad8ac9a358baa05c94b2a2',1,'openvdb::v3_2_0::tools::LevelSetMorphing']]], + ['settemporalscheme',['setTemporalScheme',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#a573bb25036eaa55ba38a08fa71dcf90e',1,'openvdb::v3_2_0::tools::LevelSetAdvection::setTemporalScheme()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a573bb25036eaa55ba38a08fa71dcf90e',1,'openvdb::v3_2_0::tools::LevelSetMorphing::setTemporalScheme()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a573bb25036eaa55ba38a08fa71dcf90e',1,'openvdb::v3_2_0::tools::LevelSetTracker::setTemporalScheme()']]], + ['setthreaded',['setThreaded',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html#ac3fa2c9a94b6643ed5244fca102e11a8',1,'openvdb::v3_2_0::tools::GridResampler::setThreaded()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#a86283b3695c213b3b99845f7b5a142bf',1,'openvdb::v3_2_0::tools::PointAdvect::setThreaded()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#a86283b3695c213b3b99845f7b5a142bf',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect::setThreaded()']]], + ['settimeout',['setTimeout',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a527251f96d3fde97ae6fc2ce59404fa9',1,'openvdb::v3_2_0::io::Queue']]], + ['settimes',['setTimes',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a7bd88c13b8025a3c21d2564a8d9d6e09',1,'openvdb::v3_2_0::math::Ray']]], + ['settorotation',['setToRotation',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a65f688c9c1e21facca23a0d79fec4763',1,'openvdb::v3_2_0::math::Mat3::setToRotation(const Quat< T > &q)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a45287dd453383615dcb732a3e54df92a',1,'openvdb::v3_2_0::math::Mat3::setToRotation(const Vec3< T > &axis, T angle)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a685d4df4285b296c70bc8dbd8a46484a',1,'openvdb::v3_2_0::math::Mat4::setToRotation(Axis axis, T angle)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a45287dd453383615dcb732a3e54df92a',1,'openvdb::v3_2_0::math::Mat4::setToRotation(const Vec3< T > &axis, T angle)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a8e67c2d44a8b038838fb6e49d8a37ef3',1,'openvdb::v3_2_0::math::Mat4::setToRotation(const Vec3< T > &v1, const Vec3< T > &v2)']]], + ['settoscale',['setToScale',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a48787960db8612ebca270560134278f4',1,'openvdb::v3_2_0::math::Mat4']]], + ['settoshear',['setToShear',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a5b663434a1d79dac075e03314a139136',1,'openvdb::v3_2_0::math::Mat4']]], + ['settotranslation',['setToTranslation',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a8f656f58c602f9bda786a57c448920d4',1,'openvdb::v3_2_0::math::Mat4']]], + ['settrackerspatialscheme',['setTrackerSpatialScheme',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#a33c5bfbb6c55928e0220518950736182',1,'openvdb::v3_2_0::tools::LevelSetAdvection::setTrackerSpatialScheme()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a33c5bfbb6c55928e0220518950736182',1,'openvdb::v3_2_0::tools::LevelSetMorphing::setTrackerSpatialScheme()']]], + ['settrackertemporalscheme',['setTrackerTemporalScheme',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#a4470ca870c2cfbe5c608c8e38c8eaa01',1,'openvdb::v3_2_0::tools::LevelSetAdvection::setTrackerTemporalScheme()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a4470ca870c2cfbe5c608c8e38c8eaa01',1,'openvdb::v3_2_0::tools::LevelSetMorphing::setTrackerTemporalScheme()']]], + ['settransform',['setTransform',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a91cf0c9e3940765cb7282c58306cd6dc',1,'openvdb::v3_2_0::GridBase']]], + ['settransformtiles',['setTransformTiles',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html#a7b52c3107568cafcdd49c2251f0e55ca',1,'openvdb::v3_2_0::tools::GridResampler']]], + ['settranslation',['setTranslation',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a88fe526682c68a40911ab19cf6deb625',1,'openvdb::v3_2_0::math::Mat4']]], + ['settree',['setTree',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ae693ab309659d2332be7b5f28689f80d',1,'openvdb::v3_2_0::GridBase::setTree()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a74b29f374ee4fc6d366948bdf0017315',1,'openvdb::v3_2_0::Grid::setTree()']]], + ['setvalue',['setValue',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a1b5bae192c8a192dfc2b922d3a7579f9',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::setValue()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1RowEditor.html#a15e9d298c2303f14e160920f0b0e0841',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::RowEditor::setValue()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a64a77be68e3bd48960dad1e02318c6ae',1,'openvdb::v3_2_0::math::BaseStencil::setValue()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#ae3243d45e1b81863c339d4425aa7e5d1',1,'openvdb::v3_2_0::TypedMetadata::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a9b5df8b04f08faa7f2fa8a0b59195ba9',1,'openvdb::v3_2_0::tools::Dense::setValue(size_t offset, const ValueT &value)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#acef2f82b3e7e93c3d972f0c69037f9c9',1,'openvdb::v3_2_0::tools::Dense::setValue(size_t i, size_t j, size_t k, const ValueT &value)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a9cd15985c829cc671ce2b1a5b9abe3be',1,'openvdb::v3_2_0::tools::Dense::setValue(const Coord &xyz, const ValueT &value)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ab4a2386db00a844f4b25ef6c7cf91d47',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValue()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#a09c705b71880000fc851bf81b70628da',1,'openvdb::v3_2_0::tree::SparseIteratorBase::setValue()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a2c35bb3eb36168a4f33fd154b31845ac',1,'openvdb::v3_2_0::tree::DenseIteratorBase::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#a8ef005580e83f81e7eb0949baa5552b3',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::setValue()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueIter.html#ad32372deef8e50240267dc6c5e1be847',1,'openvdb::v3_2_0::tree::LeafNode::ValueIter::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a22f28ac746a165fb620a537f6af4f72b',1,'openvdb::v3_2_0::tree::LeafNode::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#afbaa829b05e2d5493eb14a2891b9ac27',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aed32e79c8692008209229a4ab80c72b2',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValue()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ValueIter.html#aeee8e4631a9e126a794fb4597117056c',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#afbaa829b05e2d5493eb14a2891b9ac27',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aed32e79c8692008209229a4ab80c72b2',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValue()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ValueIter.html#aeee8e4631a9e126a794fb4597117056c',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01false_00_01ValueT_00_01ChildT_01_4.html#a8141c87bb6668fe943167b5c9ccaaa1e',1,'openvdb::v3_2_0::tree::NodeUnionImpl< false, ValueT, ChildT >::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01true_00_01ValueT_00_01ChildT_01_4.html#a8141c87bb6668fe943167b5c9ccaaa1e',1,'openvdb::v3_2_0::tree::NodeUnionImpl< true, ValueT, ChildT >::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a83302a39df403b0b10ffcadac5856916',1,'openvdb::v3_2_0::tree::Tree::setValue(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#acbf7e55fdc58f2c5d03395bffe10410e',1,'openvdb::v3_2_0::tree::Tree::setValue(const Coord &xyz, const ValueType &value, AccessT &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a1d997a9de3287e7bec50bdbedbed444a',1,'openvdb::v3_2_0::tree::IterListItem::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a1d997a9de3287e7bec50bdbedbed444a',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a1d997a9de3287e7bec50bdbedbed444a',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a5d8687af03914b4c31a60def13d03158',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a83302a39df403b0b10ffcadac5856916',1,'openvdb::v3_2_0::tree::ValueAccessor::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a83302a39df403b0b10ffcadac5856916',1,'openvdb::v3_2_0::tree::CacheItem::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a83302a39df403b0b10ffcadac5856916',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a83302a39df403b0b10ffcadac5856916',1,'openvdb::v3_2_0::tree::ValueAccessor0::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a83302a39df403b0b10ffcadac5856916',1,'openvdb::v3_2_0::tree::ValueAccessor1::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a83302a39df403b0b10ffcadac5856916',1,'openvdb::v3_2_0::tree::ValueAccessor2::setValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a83302a39df403b0b10ffcadac5856916',1,'openvdb::v3_2_0::tree::ValueAccessor3::setValue()']]], + ['setvalueandcache',['setValueAndCache',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a01b75fc2aa129aa05ae677971dc1972e',1,'openvdb::v3_2_0::tree::InternalNode::setValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ae8ee72e6614f6ddc47ce05dcce1c9092',1,'openvdb::v3_2_0::tree::LeafNode::setValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ad1a716fa360b4fa06e5b931c14bffd73',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ad1a716fa360b4fa06e5b931c14bffd73',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a01b75fc2aa129aa05ae677971dc1972e',1,'openvdb::v3_2_0::tree::RootNode::setValueAndCache()']]], + ['setvaluemask',['setValueMask',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aac35a428ae112efe59a8f01d22056dcd',1,'openvdb::v3_2_0::tree::InternalNode::setValueMask()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a2951db6e10e3678b2af46f34982105a6',1,'openvdb::v3_2_0::tree::LeafNode::setValueMask(const NodeMaskType &mask)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aac35a428ae112efe59a8f01d22056dcd',1,'openvdb::v3_2_0::tree::LeafNode::setValueMask(Index n, bool on)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a2951db6e10e3678b2af46f34982105a6',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueMask(const NodeMaskType &mask)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aac35a428ae112efe59a8f01d22056dcd',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueMask(Index n, bool on)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a2951db6e10e3678b2af46f34982105a6',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueMask(const NodeMaskType &mask)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aac35a428ae112efe59a8f01d22056dcd',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueMask(Index n, bool on)']]], + ['setvaluemaskoff',['setValueMaskOff',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ae66c20c79af561b6bdf17cf3684dbcca',1,'openvdb::v3_2_0::tree::LeafNode::setValueMaskOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ae66c20c79af561b6bdf17cf3684dbcca',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueMaskOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ae66c20c79af561b6bdf17cf3684dbcca',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueMaskOff()']]], + ['setvaluemaskon',['setValueMaskOn',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a518b60edb92644e31806f5f8739afe07',1,'openvdb::v3_2_0::tree::LeafNode::setValueMaskOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a518b60edb92644e31806f5f8739afe07',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueMaskOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a518b60edb92644e31806f5f8739afe07',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueMaskOn()']]], + ['setvalueoff',['setValueOff',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a157acd52b5f423788579b691ec2b7e5d',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValueOff(const Coord &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a2662286679457e483ce4517a5e578856',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValueOff(Index)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a0d6ce7f9a237c1ea782a67e71894de43',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValueOff(const Coord &, const ValueType &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a422a33cd95ddd34f7c30c1570f63d837',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValueOff(Index, const ValueType &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a8a91d631df8f64f84a0aad7436cb11f3',1,'openvdb::v3_2_0::tree::InternalNode::setValueOff(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a73a6e7c85d37e7d677eddc3cce8aa11b',1,'openvdb::v3_2_0::tree::InternalNode::setValueOff(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#ac26d085986c07a363f7c5140858c0251',1,'openvdb::v3_2_0::tree::IteratorBase::setValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a8a91d631df8f64f84a0aad7436cb11f3',1,'openvdb::v3_2_0::tree::LeafNode::setValueOff(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a8cb1b188e8df2cb271dd3d2f50f41681',1,'openvdb::v3_2_0::tree::LeafNode::setValueOff(Index offset)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ab3688aa6f3ccd5cb20a3d8481d21d1e2',1,'openvdb::v3_2_0::tree::LeafNode::setValueOff(const Coord &xyz, const ValueType &val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a018fd2e0c199bb392d5eb5da3cdf62af',1,'openvdb::v3_2_0::tree::LeafNode::setValueOff(Index offset, const ValueType &val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8a91d631df8f64f84a0aad7436cb11f3',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueOff(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8cb1b188e8df2cb271dd3d2f50f41681',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueOff(Index offset)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8b17b9a15004fe221018c648099084f5',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueOff(const Coord &xyz, bool val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aa346d06a35c22d1d18f8da66dfd9f22d',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueOff(Index offset, bool val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8a91d631df8f64f84a0aad7436cb11f3',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueOff(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8cb1b188e8df2cb271dd3d2f50f41681',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueOff(Index offset)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8b17b9a15004fe221018c648099084f5',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueOff(const Coord &xyz, bool val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aa346d06a35c22d1d18f8da66dfd9f22d',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueOff(Index offset, bool val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a8a91d631df8f64f84a0aad7436cb11f3',1,'openvdb::v3_2_0::tree::RootNode::setValueOff(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a73a6e7c85d37e7d677eddc3cce8aa11b',1,'openvdb::v3_2_0::tree::RootNode::setValueOff(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a8a91d631df8f64f84a0aad7436cb11f3',1,'openvdb::v3_2_0::tree::Tree::setValueOff(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a73a6e7c85d37e7d677eddc3cce8aa11b',1,'openvdb::v3_2_0::tree::Tree::setValueOff(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#ad5be67d92ab97c5f5e5a9ff654b113a7',1,'openvdb::v3_2_0::tree::IterListItem::setValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#ad5be67d92ab97c5f5e5a9ff654b113a7',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::setValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#ad5be67d92ab97c5f5e5a9ff654b113a7',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::setValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#ac26d085986c07a363f7c5140858c0251',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::setValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a73a6e7c85d37e7d677eddc3cce8aa11b',1,'openvdb::v3_2_0::tree::ValueAccessor::setValueOff(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a8a91d631df8f64f84a0aad7436cb11f3',1,'openvdb::v3_2_0::tree::ValueAccessor::setValueOff(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a73a6e7c85d37e7d677eddc3cce8aa11b',1,'openvdb::v3_2_0::tree::CacheItem::setValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a73a6e7c85d37e7d677eddc3cce8aa11b',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::setValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a73a6e7c85d37e7d677eddc3cce8aa11b',1,'openvdb::v3_2_0::tree::ValueAccessor0::setValueOff(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a8a91d631df8f64f84a0aad7436cb11f3',1,'openvdb::v3_2_0::tree::ValueAccessor0::setValueOff(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a73a6e7c85d37e7d677eddc3cce8aa11b',1,'openvdb::v3_2_0::tree::ValueAccessor1::setValueOff(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a8a91d631df8f64f84a0aad7436cb11f3',1,'openvdb::v3_2_0::tree::ValueAccessor1::setValueOff(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a73a6e7c85d37e7d677eddc3cce8aa11b',1,'openvdb::v3_2_0::tree::ValueAccessor2::setValueOff(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a8a91d631df8f64f84a0aad7436cb11f3',1,'openvdb::v3_2_0::tree::ValueAccessor2::setValueOff(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a73a6e7c85d37e7d677eddc3cce8aa11b',1,'openvdb::v3_2_0::tree::ValueAccessor3::setValueOff(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a8a91d631df8f64f84a0aad7436cb11f3',1,'openvdb::v3_2_0::tree::ValueAccessor3::setValueOff(const Coord &xyz)']]], + ['setvalueoffandcache',['setValueOffAndCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#aa82f36fe9e6eeac9909952ed298af1b5',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValueOffAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a6c0c65991a0b3c81933cd944d8fc4267',1,'openvdb::v3_2_0::tree::InternalNode::setValueOffAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a6c0c65991a0b3c81933cd944d8fc4267',1,'openvdb::v3_2_0::tree::LeafNode::setValueOffAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a7dde8d936e742fde1718afa992e22464',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueOffAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a7dde8d936e742fde1718afa992e22464',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueOffAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a6c0c65991a0b3c81933cd944d8fc4267',1,'openvdb::v3_2_0::tree::RootNode::setValueOffAndCache()']]], + ['setvalueon',['setValueOn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ab7cbae071a9630574d285db352835a88',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValueOn(const Coord &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#abbc6b8f7bdd2f938a93daeea15f813e8',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValueOn(Index)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#afcf6e153d2643353e8295779462ef2f0',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValueOn(const Coord &, const ValueType &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a36f21a6d64bc316e96c89f54be5846cd',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValueOn(Index, const ValueType &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ad6cf12f28a771762327ba1578bc48e9c',1,'openvdb::v3_2_0::tree::InternalNode::setValueOn(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ae95653046c85afb743075f139a26df9d',1,'openvdb::v3_2_0::tree::InternalNode::setValueOn(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#af36e33ae54f981b0ef0c83d98f41ecc0',1,'openvdb::v3_2_0::tree::IteratorBase::setValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ad6cf12f28a771762327ba1578bc48e9c',1,'openvdb::v3_2_0::tree::LeafNode::setValueOn(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a0aed89e8ab2030604c9a7c471a456b7e',1,'openvdb::v3_2_0::tree::LeafNode::setValueOn(Index offset)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a3defa14b3fc5475f0dc86c70ec99a8f1',1,'openvdb::v3_2_0::tree::LeafNode::setValueOn(const Coord &xyz, const ValueType &val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a70286c78f2711d3e9a1e5b6a3caa27f4',1,'openvdb::v3_2_0::tree::LeafNode::setValueOn(Index offset, const ValueType &val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ad6cf12f28a771762327ba1578bc48e9c',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueOn(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a0aed89e8ab2030604c9a7c471a456b7e',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueOn(Index offset)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ad1a39a4b798e478aec4e23cbee484d5e',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueOn(const Coord &xyz, bool val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a96b8213558b242a41aad2c6bf850b885',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueOn(Index offset, bool val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ad6cf12f28a771762327ba1578bc48e9c',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueOn(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a0aed89e8ab2030604c9a7c471a456b7e',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueOn(Index offset)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ad1a39a4b798e478aec4e23cbee484d5e',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueOn(const Coord &xyz, bool val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a96b8213558b242a41aad2c6bf850b885',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueOn(Index offset, bool val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ae95653046c85afb743075f139a26df9d',1,'openvdb::v3_2_0::tree::RootNode::setValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ad6cf12f28a771762327ba1578bc48e9c',1,'openvdb::v3_2_0::tree::Tree::setValueOn(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ae95653046c85afb743075f139a26df9d',1,'openvdb::v3_2_0::tree::Tree::setValueOn(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#aae50a0550c4bb40ff60dac5e329acfe6',1,'openvdb::v3_2_0::tree::IterListItem::setValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#aae50a0550c4bb40ff60dac5e329acfe6',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::setValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#aae50a0550c4bb40ff60dac5e329acfe6',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::setValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#ae95653046c85afb743075f139a26df9d',1,'openvdb::v3_2_0::tree::ValueAccessor::setValueOn(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#ad6cf12f28a771762327ba1578bc48e9c',1,'openvdb::v3_2_0::tree::ValueAccessor::setValueOn(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#ae95653046c85afb743075f139a26df9d',1,'openvdb::v3_2_0::tree::CacheItem::setValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#ae95653046c85afb743075f139a26df9d',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::setValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#ae95653046c85afb743075f139a26df9d',1,'openvdb::v3_2_0::tree::ValueAccessor0::setValueOn(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#ad6cf12f28a771762327ba1578bc48e9c',1,'openvdb::v3_2_0::tree::ValueAccessor0::setValueOn(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#ae95653046c85afb743075f139a26df9d',1,'openvdb::v3_2_0::tree::ValueAccessor1::setValueOn(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#ad6cf12f28a771762327ba1578bc48e9c',1,'openvdb::v3_2_0::tree::ValueAccessor1::setValueOn(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#ae95653046c85afb743075f139a26df9d',1,'openvdb::v3_2_0::tree::ValueAccessor2::setValueOn(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#ad6cf12f28a771762327ba1578bc48e9c',1,'openvdb::v3_2_0::tree::ValueAccessor2::setValueOn(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#ae95653046c85afb743075f139a26df9d',1,'openvdb::v3_2_0::tree::ValueAccessor3::setValueOn(const Coord &xyz, const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#ad6cf12f28a771762327ba1578bc48e9c',1,'openvdb::v3_2_0::tree::ValueAccessor3::setValueOn(const Coord &xyz)']]], + ['setvalueonly',['setValueOnly',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a6f7e35635a5321cbf5a099560e461404',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValueOnly(const Coord &, const ValueType &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a49bfd89cfc59f0931ee27afa69b68352',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValueOnly(Index, const ValueType &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a63ff695beda11ed9ef625a28ce8a5faf',1,'openvdb::v3_2_0::tree::InternalNode::setValueOnly()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a2d72eba31e9c004daae5ebf141f981a0',1,'openvdb::v3_2_0::tree::LeafNode::setValueOnly(const Coord &xyz, const ValueType &val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ad8a9dc060855330127a4ce4e7bc868b3',1,'openvdb::v3_2_0::tree::LeafNode::setValueOnly(Index offset, const ValueType &val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8d424e19979700c977f9f450338dcf78',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueOnly(const Coord &xyz, bool val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a40305a11083d41832ad0eb65285bee66',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueOnly(Index offset, bool val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8d424e19979700c977f9f450338dcf78',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueOnly(const Coord &xyz, bool val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a40305a11083d41832ad0eb65285bee66',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueOnly(Index offset, bool val)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a63ff695beda11ed9ef625a28ce8a5faf',1,'openvdb::v3_2_0::tree::RootNode::setValueOnly()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a63ff695beda11ed9ef625a28ce8a5faf',1,'openvdb::v3_2_0::tree::Tree::setValueOnly()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a63ff695beda11ed9ef625a28ce8a5faf',1,'openvdb::v3_2_0::tree::ValueAccessor::setValueOnly()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a63ff695beda11ed9ef625a28ce8a5faf',1,'openvdb::v3_2_0::tree::CacheItem::setValueOnly()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a63ff695beda11ed9ef625a28ce8a5faf',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::setValueOnly()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a63ff695beda11ed9ef625a28ce8a5faf',1,'openvdb::v3_2_0::tree::ValueAccessor0::setValueOnly()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a63ff695beda11ed9ef625a28ce8a5faf',1,'openvdb::v3_2_0::tree::ValueAccessor1::setValueOnly()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a63ff695beda11ed9ef625a28ce8a5faf',1,'openvdb::v3_2_0::tree::ValueAccessor2::setValueOnly()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a63ff695beda11ed9ef625a28ce8a5faf',1,'openvdb::v3_2_0::tree::ValueAccessor3::setValueOnly()']]], + ['setvalueonlyandcache',['setValueOnlyAndCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ac783868175708b77734e0aecde5e9fc8',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValueOnlyAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a5cefbe46cc3180e5394a2f4fc775bfe8',1,'openvdb::v3_2_0::tree::InternalNode::setValueOnlyAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ad7e47aea51f5577ab6e9f265ebd90784',1,'openvdb::v3_2_0::tree::LeafNode::setValueOnlyAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aa1b17f54c66de3d1179ffc993e0402df',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValueOnlyAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aa1b17f54c66de3d1179ffc993e0402df',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValueOnlyAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a5cefbe46cc3180e5394a2f4fc775bfe8',1,'openvdb::v3_2_0::tree::RootNode::setValueOnlyAndCache()']]], + ['setvalueonmax',['setValueOnMax',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a7c76dc587d3f1735c0113f04ace2f257',1,'openvdb::v3_2_0::tools']]], + ['setvalueonmin',['setValueOnMin',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#adbdcf782cb40fcb514524737e2f8e070',1,'openvdb::v3_2_0::tools']]], + ['setvalueonmult',['setValueOnMult',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a2fa019501d9dddd1891421935c31efba',1,'openvdb::v3_2_0::tools']]], + ['setvalueonsum',['setValueOnSum',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a92d1e43e1896e1a7fa9548c4fd4a2988',1,'openvdb::v3_2_0::tools']]], + ['setvaluesoff',['setValuesOff',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a3b57193b785bb1e6d88d8402613516fe',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValuesOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a3b57193b785bb1e6d88d8402613516fe',1,'openvdb::v3_2_0::tree::LeafNode::setValuesOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a3b57193b785bb1e6d88d8402613516fe',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValuesOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a3b57193b785bb1e6d88d8402613516fe',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValuesOff()']]], + ['setvalueson',['setValuesOn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ac155d78b56e45b4d18aad6b18d957d5a',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::setValuesOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ac155d78b56e45b4d18aad6b18d957d5a',1,'openvdb::v3_2_0::tree::InternalNode::setValuesOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ac155d78b56e45b4d18aad6b18d957d5a',1,'openvdb::v3_2_0::tree::LeafNode::setValuesOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ac155d78b56e45b4d18aad6b18d957d5a',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::setValuesOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ac155d78b56e45b4d18aad6b18d957d5a',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::setValuesOn()']]], + ['setvectortype',['setVectorType',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a84dcd39f42e4f0558516c040e576fe03',1,'openvdb::v3_2_0::GridBase']]], + ['setversion',['setVersion',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#aea8253e2780539b584149342000dde7f',1,'openvdb::v3_2_0::io']]], + ['setworldray',['setWorldRay',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#ad4334e396bf96feeb6e90634f63f907e',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::setWorldRay()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#ad4334e396bf96feeb6e90634f63f907e',1,'openvdb::v3_2_0::tools::LinearSearchImpl::setWorldRay()']]], + ['setwritegridstats',['setWriteGridStats',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#afef9484575d167652b8c68c694fb5684',1,'openvdb::v3_2_0::io::StreamMetadata']]], + ['setwritegridstatsmetadata',['setWriteGridStatsMetadata',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a2a87af919ccdeaad2d8284328c3dc43d',1,'openvdb::v3_2_0::io']]], + ['setx',['setX',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a076220dc99eeee3d14fa4a6d14e1afe2',1,'openvdb::v3_2_0::math::Coord']]], + ['sety',['setY',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a566e12e5b1da60fc46190aa3ed2becdc',1,'openvdb::v3_2_0::math::Coord']]], + ['setz',['setZ',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#ae76ceb6d7bb75bdfab3c397662f3acf1',1,'openvdb::v3_2_0::math::Coord']]], + ['setzero',['setZero',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a47affd1a10b589811fc4828c1a2e0c6d',1,'openvdb::v3_2_0::math::Mat3::setZero()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a47affd1a10b589811fc4828c1a2e0c6d',1,'openvdb::v3_2_0::math::Mat4::setZero()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a096c7b12001a1682c9a0deeaa836c962',1,'openvdb::v3_2_0::math::Quat::setZero()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a0adc29f49caf8f7f8581881b3a9a98aa',1,'openvdb::v3_2_0::math::Vec2::setZero()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a3efb51740d8cafa348fdeca7c7257398',1,'openvdb::v3_2_0::math::Vec3::setZero()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a7d6f1f79d33e75a1e14968a821f477b6',1,'openvdb::v3_2_0::math::Vec4::setZero()']]], + ['sevenpointstencil',['SevenPointStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1SevenPointStencil.html#a4f35d9e1276e7bde47ba3e3383681721',1,'openvdb::v3_2_0::math::SevenPointStencil']]], + ['sharedopapplier',['SharedOpApplier',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpApplier.html#a74c2a486c2ec7b3cd80d9b3c21e6e556',1,'openvdb::v3_2_0::tools::valxform::SharedOpApplier']]], + ['sharedoptransformer',['SharedOpTransformer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpTransformer.html#a1f4ab4f7b3e751b36c0e35a0d65061bb',1,'openvdb::v3_2_0::tools::valxform::SharedOpTransformer::SharedOpTransformer(const InIterT &inIter, OutTreeT &outTree, OpT &op, MergePolicy merge)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpTransformer.html#a0b947f799501fdbb31f7317a8d68d0a5',1,'openvdb::v3_2_0::tools::valxform::SharedOpTransformer::SharedOpTransformer(SharedOpTransformer &other, tbb::split)']]], + ['shear',['shear',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a5efd58688e403badf8d1a3e3b0297063',1,'openvdb::v3_2_0::math']]], + ['shrink_5fto_5ffit',['shrink_to_fit',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a5f16304f80b6fb253c7b0ead3e16dd18',1,'openvdb::v3_2_0::util::PagedArray']]], + ['sign',['Sign',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4be789062070fa143eebdb4b14ff5221',1,'openvdb::v3_2_0::math']]], + ['signchange',['SignChange',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a0848094540c0f952759c78b8a185874a',1,'openvdb::v3_2_0::math']]], + ['signdata',['SignData',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#a25dbd5ebf42368e19641eabf1ff93db7',1,'openvdb::v3_2_0::tools::internal::SignData::SignData(const TreeT &distTree, const LeafManagerT &leafs, ValueT iso)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#a5c0cd54e0c28a74a9563b8a3fe618d14',1,'openvdb::v3_2_0::tools::internal::SignData::SignData(SignData &, tbb::split)']]], + ['signedfloodfill',['signedFloodFill',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ad2be2e532f18c739ca1abe49bbab4a16',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::signedFloodFill(const ValueType &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a59b8e25d1d3fd49ece8c4a467a974617',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::signedFloodFill(const ValueType &, const ValueType &)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ab8c1921d688e3c65c71aac5405f155a9',1,'openvdb::v3_2_0::tools::signedFloodFill()']]], + ['signedfloodfillop',['SignedFloodFillOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SignedFloodFillOp.html#a149227b266169122fd3ca89e221fec8a',1,'openvdb::v3_2_0::tools::SignedFloodFillOp::SignedFloodFillOp(const TreeOrLeafManagerT &tree, Index minLevel=0)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SignedFloodFillOp.html#ab1b776b97b600f71b08275f60d6883c7',1,'openvdb::v3_2_0::tools::SignedFloodFillOp::SignedFloodFillOp(ValueT outsideValue, ValueT insideValue, Index minLevel=0)']]], + ['signedfloodfillwithvalues',['signedFloodFillWithValues',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a059130a68dd01092e7db04afa0f2580e',1,'openvdb::v3_2_0::tools']]], + ['signtree',['signTree',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#aed8f10efa418d1d1f09f1a7c822424a6',1,'openvdb::v3_2_0::tools::internal::SignData::signTree()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestSurfacePoint.html#a9179894dd802618d4d5840c9695cd4f2',1,'openvdb::v3_2_0::tools::ClosestSurfacePoint::signTree()']]], + ['simplify',['simplify',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9e71156c62c4944ae9fa8683d5e48657',1,'openvdb::v3_2_0::math']]], + ['sixthorderdensestencil',['SixthOrderDenseStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1SixthOrderDenseStencil.html#a3f8fa3beed4cdfe2c460987989b68703',1,'openvdb::v3_2_0::math::SixthOrderDenseStencil']]], + ['size',['size',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a149c924fd6068764bbce066e145b8c10',1,'openvdb::v3_2_0::io::Queue::size()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#af7dc069d46f652992610686c1cb4f781',1,'openvdb::v3_2_0::math::pcg::Vector::size()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#af7dc069d46f652992610686c1cb4f781',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::size()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#a0b6868dbef44fc07f11d050eb59e5f7e',1,'openvdb::v3_2_0::math::Extrema::size()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html#a0b6868dbef44fc07f11d050eb59e5f7e',1,'openvdb::v3_2_0::math::Histogram::size()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#af4b57d21919c42d55af03391f91a1c08',1,'openvdb::v3_2_0::math::BaseStencil::size()'],['../classopenvdb_1_1v3__2__0_1_1Metadata.html#add186f7d6005e31d34be264d7c62adb8',1,'openvdb::v3_2_0::Metadata::size()'],['../classopenvdb_1_1v3__2__0_1_1UnknownMetadata.html#a258a0a1d9b8dfba5d4a2ac2e33a3df56',1,'openvdb::v3_2_0::UnknownMetadata::size()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a149c924fd6068764bbce066e145b8c10',1,'openvdb::v3_2_0::TypedMetadata::size()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html#aac782da1f912bceb5d8ad00c8dc892ac',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::LeafNodeConnectivityTable::size()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#aac782da1f912bceb5d8ad00c8dc892ac',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::size()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#aac782da1f912bceb5d8ad00c8dc892ac',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray::size()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#aac782da1f912bceb5d8ad00c8dc892ac',1,'openvdb::v3_2_0::tools::PointIndexIterator::size()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#aac782da1f912bceb5d8ad00c8dc892ac',1,'openvdb::v3_2_0::tools::PointPartitioner::size()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#aac782da1f912bceb5d8ad00c8dc892ac',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator::size()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1Array.html#aac782da1f912bceb5d8ad00c8dc892ac',1,'openvdb::v3_2_0::tools::point_partitioner_internal::Array::size()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange.html#aac782da1f912bceb5d8ad00c8dc892ac',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::size()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#ac4afa5b077a3b036102da5ceef8c7b51',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::size()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ac4afa5b077a3b036102da5ceef8c7b51',1,'openvdb::v3_2_0::tree::LeafNode::size()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#ac4afa5b077a3b036102da5ceef8c7b51',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::size()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ac4afa5b077a3b036102da5ceef8c7b51',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::size()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#ac4afa5b077a3b036102da5ceef8c7b51',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::size()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ac4afa5b077a3b036102da5ceef8c7b51',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::size()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange.html#aac782da1f912bceb5d8ad00c8dc892ac',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::size()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#aac782da1f912bceb5d8ad00c8dc892ac',1,'openvdb::v3_2_0::util::PagedArray::size()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ValueBuffer.html#aac782da1f912bceb5d8ad00c8dc892ac',1,'openvdb::v3_2_0::util::PagedArray::ValueBuffer::size()']]], + ['skew',['skew',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af3812855c2b35358e1cbe31445fd5e31',1,'openvdb::v3_2_0::math']]], + ['slerp',['slerp',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7997743b8ee33d2266278c9262e49768',1,'openvdb::v3_2_0::math::slerp(const Quat< T > &q1, const Quat< T > &q2, T t, T tolerance=0.00001)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a6f49cb641c4f0b73ab8a43179f1547f9',1,'openvdb::v3_2_0::math::slerp(const Mat3< T0 > &m1, const Mat3< T0 > &m2, T t)']]], + ['smoothlevelset',['smoothLevelSet',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1ttls__internal.html#a84b0b613fb2bd5af8aee0238dbbcc9d6',1,'openvdb::v3_2_0::tools::ttls_internal']]], + ['smoothunitstep',['SmoothUnitStep',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a6691afc8dd49ef476c2eef71f8e19d70',1,'openvdb::v3_2_0::math::SmoothUnitStep(Type x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a815bc68966e8fa82e1705edfd3392125',1,'openvdb::v3_2_0::math::SmoothUnitStep(Type x, Type min, Type max)']]], + ['snapbasis',['snapBasis',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a9529d44f4f5fa0a22b015b9a9f6f6730',1,'openvdb::v3_2_0::math::Mat3']]], + ['snapmatbasis',['snapMatBasis',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#abe8e9e9f721c2be033a93d15406f6d06',1,'openvdb::v3_2_0::math']]], + ['solve',['solve',['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg.html#abbf96ede759d64b2980bf2c9937fca8c',1,'openvdb::v3_2_0::math::pcg::solve(const PositiveDefMatrix &A, const Vector< typename PositiveDefMatrix::ValueType > &b, Vector< typename PositiveDefMatrix::ValueType > &x, Preconditioner< typename PositiveDefMatrix::ValueType > &preconditioner, const State &termination=terminationDefaults< typename PositiveDefMatrix::ValueType >())'],['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg.html#afb7c294cd591e6386c55b058398c98a1',1,'openvdb::v3_2_0::math::pcg::solve(const PositiveDefMatrix &A, const Vector< typename PositiveDefMatrix::ValueType > &b, Vector< typename PositiveDefMatrix::ValueType > &x, Preconditioner< typename PositiveDefMatrix::ValueType > &preconditioner, Interrupter &interrupter, const State &termination=terminationDefaults< typename PositiveDefMatrix::ValueType >())'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#a69eb7890056f6122acf09df794124307',1,'openvdb::v3_2_0::tools::poisson::solve(const TreeType &, math::pcg::State &)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#a6f2481b66207c7861c99da7c46201d13',1,'openvdb::v3_2_0::tools::poisson::solve(const TreeType &, math::pcg::State &, Interrupter &)']]], + ['solvewithboundaryconditions',['solveWithBoundaryConditions',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#aa7373f5baf9c844b4754a66f7659b25f',1,'openvdb::v3_2_0::tools::poisson']]], + ['solvewithboundaryconditionsandpreconditioner',['solveWithBoundaryConditionsAndPreconditioner',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#a8d7fbe4766c1a5d3248f4cbf38e74db3',1,'openvdb::v3_2_0::tools::poisson::solveWithBoundaryConditionsAndPreconditioner(const TreeType &, const BoundaryOp &, math::pcg::State &, Interrupter &)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#ac38e26bad110260e8dd67106631d6f83',1,'openvdb::v3_2_0::tools::poisson::solveWithBoundaryConditionsAndPreconditioner(const TreeType &, const DomainTreeType &, const BoundaryOp &, math::pcg::State &, Interrupter &)']]], + ['sort',['sort',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a47fdc9eea42b6975cdc835bb2e08810e',1,'openvdb::v3_2_0::math::BBox::sort()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a47fdc9eea42b6975cdc835bb2e08810e',1,'openvdb::v3_2_0::util::PagedArray::sort()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#ad66b8f5aada32437d501b5a7fe7ff5e1',1,'openvdb::v3_2_0::util::PagedArray::sort()']]], + ['sparsecomposite',['sparseComposite',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#a0d659e104915fecad70b4468799fa12b',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor']]], + ['sparseextractor',['SparseExtractor',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#afd2b371105b208b51695cc289c89681b',1,'openvdb::v3_2_0::tools::SparseExtractor::SparseExtractor(const DenseType &dense, const OpType &functor, const ResultValueType background)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#aff353c9b743e8f5295894a01ed7849a8',1,'openvdb::v3_2_0::tools::SparseExtractor::SparseExtractor(const DenseType &dense, const openvdb::math::CoordBBox &bbox, const OpType &functor, const ResultValueType background)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#af50d9021dfff27d07c273086b9f6b7e4',1,'openvdb::v3_2_0::tools::SparseExtractor::SparseExtractor(SparseExtractor &other, tbb::split)']]], + ['sparseiteratorbase',['SparseIteratorBase',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#a54985f7119d03653ec307d1046e5ae71',1,'openvdb::v3_2_0::tree::SparseIteratorBase::SparseIteratorBase()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#a4a9bb35b5a0262a993e0220b9f29a229',1,'openvdb::v3_2_0::tree::SparseIteratorBase::SparseIteratorBase(const MaskIterT &iter, NodeT *parent)']]], + ['sparsemaskedextractor',['SparseMaskedExtractor',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#a0caba8d020dc2c14173f888b7f209ecd',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor::SparseMaskedExtractor(const DenseType &dense, const ResultValueType &background, const MaskLeafVec &leafVec)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#a7331b36791b4451b7ded6db5814a7f46',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor::SparseMaskedExtractor(const SparseMaskedExtractor &other, tbb::split)']]], + ['sparsestencilmatrix',['SparseStencilMatrix',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a27d2e12a292928a0ef4a05acbc321e94',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::SparseStencilMatrix(SizeType n)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a115a7055360393d51f45f6c4952c26a8',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::SparseStencilMatrix(const SparseStencilMatrix &)']]], + ['sparsetodensecompositor',['SparseToDenseCompositor',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#a41e44f3b65c733e3a20427ca4b9ffb78',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor::SparseToDenseCompositor(DenseT &dense, const TreeT &source, const TreeT &alpha, const ValueT beta, const ValueT strength)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#a179a692f7470197d0c80f5b59c7f227b',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor::SparseToDenseCompositor(const SparseToDenseCompositor &other)']]], + ['spatialorder',['spatialOrder',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#a6a20cb9b519b684c63368b913c786f44',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['split',['split',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#a945ffc4851bbab1f16a8bf06473df6d3',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray']]], + ['splittableparticlearray',['SplittableParticleArray',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#a08db3d9bd58cc270503488a28841d4c2',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray::SplittableParticleArray(const ParticleArrayT &particles)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#a49b4b8da052e777d523ec17f6afd66a9',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray::SplittableParticleArray(const ParticleArrayT &particles, double minR, double maxR)']]], + ['sqrt',['Sqrt',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#afa819ca6a765dbb62eb2dc60e30a9a70',1,'openvdb::v3_2_0::math::Sqrt(float x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a894d34abe674ec96217f2c7c9a7f150f',1,'openvdb::v3_2_0::math::Sqrt(double x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab79897ec7f47a358386bf125afea13b5',1,'openvdb::v3_2_0::math::Sqrt(long double x)']]], + ['sqrtsolve',['sqrtSolve',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a75a72751b024e6cba7d1946cff749a9b',1,'openvdb::v3_2_0::math']]], + ['staggered',['staggered',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler.html#a0050bc9dc3e95de2ca035e98149763ed',1,'openvdb::v3_2_0::tools::Sampler::staggered()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointSampler.html#a0050bc9dc3e95de2ca035e98149763ed',1,'openvdb::v3_2_0::tools::PointSampler::staggered()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html#a0050bc9dc3e95de2ca035e98149763ed',1,'openvdb::v3_2_0::tools::BoxSampler::staggered()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadraticSampler.html#a0050bc9dc3e95de2ca035e98149763ed',1,'openvdb::v3_2_0::tools::QuadraticSampler::staggered()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredPointSampler.html#a0050bc9dc3e95de2ca035e98149763ed',1,'openvdb::v3_2_0::tools::StaggeredPointSampler::staggered()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredBoxSampler.html#a0050bc9dc3e95de2ca035e98149763ed',1,'openvdb::v3_2_0::tools::StaggeredBoxSampler::staggered()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredQuadraticSampler.html#a0050bc9dc3e95de2ca035e98149763ed',1,'openvdb::v3_2_0::tools::StaggeredQuadraticSampler::staggered()']]], + ['start',['start',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a26d38cbd13b87b6b332f393f2acc6fd2',1,'openvdb::v3_2_0::math::Ray::start()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#a3c039ac791f9242cc3c4dd6e57c5e551',1,'openvdb::v3_2_0::tools::BasePointScatter::start()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1CpuTimer.html#a60de64d75454385b23995437f1d72669',1,'openvdb::v3_2_0::util::CpuTimer::start()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1CpuTimer.html#a7d46aed22350e5e5430354ded9eb7dd0',1,'openvdb::v3_2_0::util::CpuTimer::start(const std::string &msg)'],['../structopenvdb_1_1v3__2__0_1_1util_1_1NullInterrupter.html#a7e779eeb0f935b24a2d4b87b973fa1e5',1,'openvdb::v3_2_0::util::NullInterrupter::start()']]], + ['startinterrupter',['startInterrupter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a94802a98ed1ced10e014d8bf08c9ca51',1,'openvdb::v3_2_0::tools::LevelSetTracker']]], + ['stashoriginandstoreoffset',['StashOriginAndStoreOffset',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1StashOriginAndStoreOffset.html#a46336cb01f4cee15282eee9e402c322e',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::StashOriginAndStoreOffset']]], + ['state',['State',['../structopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker_1_1State.html#ac1974630bc9011a261bd9f517663317b',1,'openvdb::v3_2_0::tools::LevelSetTracker::State']]], + ['statictypename',['staticTypeName',['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#acf959bd7e94562323ed426e09721a789',1,'openvdb::v3_2_0::TypedMetadata']]], + ['statistics',['statistics',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a0298e9e5b5b3a443d321bd24825f1d5a',1,'openvdb::v3_2_0::tools::statistics(const IterT &iter, bool threaded=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ada341f0cb3d7e02cb30f563ae58d77b8',1,'openvdb::v3_2_0::tools::statistics(const IterT &iter, const ValueOp &op, bool threaded)']]], + ['stats',['Stats',['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#af861e682893a3245e96223ef38f01c54',1,'openvdb::v3_2_0::math::Stats']]], + ['statsop',['StatsOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1StatsOp.html#a8084db4f07e59ae63530b34f1299785a',1,'openvdb::v3_2_0::tools::stats_internal::StatsOp']]], + ['status',['status',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#aa59c25a0c77c76484c16f0e58228c030',1,'openvdb::v3_2_0::io::Queue']]], + ['std',['std',['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#ad71e9170006001e093f5a5180c1216e5',1,'openvdb::v3_2_0::math::Stats']]], + ['stddev',['stdDev',['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#a125dc4e35d8b7cad320d92dee516e9bf',1,'openvdb::v3_2_0::math::Stats']]], + ['stealnode',['stealNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a37a91bb3ba79b24928bc0f68e950c837',1,'openvdb::v3_2_0::tree::InternalNode::stealNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a417e6fc02852696f66c7f1d6520fda86',1,'openvdb::v3_2_0::tree::LeafNode::stealNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a417e6fc02852696f66c7f1d6520fda86',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::stealNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a417e6fc02852696f66c7f1d6520fda86',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::stealNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a37a91bb3ba79b24928bc0f68e950c837',1,'openvdb::v3_2_0::tree::RootNode::stealNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a0f336548f0b7d3e0debadf68d43602b6',1,'openvdb::v3_2_0::tree::Tree::stealNode()']]], + ['stealnodes',['stealNodes',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ac4a8fd1479bd7b61a23884680d5d49e0',1,'openvdb::v3_2_0::tree::InternalNode::stealNodes()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a01345873904fa0f3b5b2dce6c52dca1e',1,'openvdb::v3_2_0::tree::LeafNode::stealNodes()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a01345873904fa0f3b5b2dce6c52dca1e',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::stealNodes()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a01345873904fa0f3b5b2dce6c52dca1e',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::stealNodes()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ac4a8fd1479bd7b61a23884680d5d49e0',1,'openvdb::v3_2_0::tree::RootNode::stealNodes(ArrayT &array, const ValueType &value, bool state)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ae9865f5a8eabf75fc2ad06581e22edcd',1,'openvdb::v3_2_0::tree::RootNode::stealNodes(ArrayT &array)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ae9865f5a8eabf75fc2ad06581e22edcd',1,'openvdb::v3_2_0::tree::Tree::stealNodes(ArrayT &array)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ac4a8fd1479bd7b61a23884680d5d49e0',1,'openvdb::v3_2_0::tree::Tree::stealNodes(ArrayT &array, const ValueType &value, bool state)']]], + ['stealuniqueleafnodes',['StealUniqueLeafNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1StealUniqueLeafNodes.html#abacf350768e7d6d9b2e1c64690a90a8e',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::StealUniqueLeafNodes']]], + ['step',['step',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#a0994dbbddbde8ffa85002f974979952f',1,'openvdb::v3_2_0::math::DDA']]], + ['stop',['stop',['../classopenvdb_1_1v3__2__0_1_1util_1_1CpuTimer.html#a9672fa7a05c257fd6b4ad4c096d20ece',1,'openvdb::v3_2_0::util::CpuTimer']]], + ['str',['str',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::io::StreamMetadata::str()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::math::pcg::Vector::str()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::str()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a6522bc65bd97a6b1ef6cdfe78462a919',1,'openvdb::v3_2_0::math::MapBase::str()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::math::AffineMap::str()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::math::ScaleMap::str()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::math::TranslationMap::str()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::math::ScaleTranslateMap::str()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::math::UnitaryMap::str()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::str()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#a2a015c7bd325be6d8b44c34838d03ceb',1,'openvdb::v3_2_0::math::Mat::str()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::math::Quat::str()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::math::Tuple::str()'],['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a6522bc65bd97a6b1ef6cdfe78462a919',1,'openvdb::v3_2_0::Metadata::str()'],['../classopenvdb_1_1v3__2__0_1_1UnknownMetadata.html#a308c84d72eb5a3eb26bfbc41a0c6d0e7',1,'openvdb::v3_2_0::UnknownMetadata::str()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::TypedMetadata::str()'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a4311ad44c06b65c4bc66c7adb8c6fd49',1,'openvdb::v3_2_0::MetaMap::str()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNan.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tools::CheckNan::str()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckInf.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tools::CheckInf::str()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckFinite.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tools::CheckFinite::str()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMagnitude.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tools::CheckMagnitude::str()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckRange.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tools::CheckRange::str()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMin.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tools::CheckMin::str()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMax.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tools::CheckMax::str()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tools::CheckNormGrad::str()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tools::CheckEikonal::str()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tools::CheckDivergence::str()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tree::LeafNode::str()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::str()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a1b9b8885b0880fc4ddf9a2c7d1ca3dc4',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::str()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#ae1e7b05645704653045e2b25b168f868',1,'openvdb::v3_2_0::TypedMetadata::str()']]], + ['stream',['Stream',['../classopenvdb_1_1v3__2__0_1_1io_1_1Stream.html#afe860111b19809d05b84085ee31ef2a9',1,'openvdb::v3_2_0::io::Stream::Stream(std::istream &, bool delayLoad=true)'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Stream.html#a7411b49ed5fda5181dd182d64984906e',1,'openvdb::v3_2_0::io::Stream::Stream()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Stream.html#ab75946a88778ed7bb80b9dedab7327e4',1,'openvdb::v3_2_0::io::Stream::Stream(std::ostream &)'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Stream.html#a0b64003a4aa6dde92dff71c7d66aa138',1,'openvdb::v3_2_0::io::Stream::Stream(const Stream &)']]], + ['streamingsize',['streamingSize',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a44b383f3ad8530f6639bed48a1c587e7',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['streammetadata',['StreamMetadata',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a5ec028ae419e6247b78fa9b60f757430',1,'openvdb::v3_2_0::io::StreamMetadata::StreamMetadata()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#ae0696ac14ff930ec47b690583da6dd26',1,'openvdb::v3_2_0::io::StreamMetadata::StreamMetadata(const StreamMetadata &)'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a7379ee807207363f5186a10251241647',1,'openvdb::v3_2_0::io::StreamMetadata::StreamMetadata(std::ios_base &)']]], + ['stringasuniquename',['stringAsUniqueName',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#ac1474ab318c18009fbd28bd9b528bf9b',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['stringtobiasedgradientscheme',['stringToBiasedGradientScheme',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a90802a965597ce5a90476f34e899842b',1,'openvdb::v3_2_0::math']]], + ['stringtodscheme',['stringToDScheme',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a0191741b0daa54077add4ccb8c3a89e3',1,'openvdb::v3_2_0::math']]], + ['stringtogridclass',['stringToGridClass',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ab8a07627e9f39abca410b5cfe22698f3',1,'openvdb::v3_2_0::GridBase']]], + ['stringtotemporalintegrationscheme',['stringToTemporalIntegrationScheme',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae7ec4f29510c45a5dc82f9482e39054a',1,'openvdb::v3_2_0::math']]], + ['stringtovectype',['stringToVecType',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a9bd5802eea4b807fd33e6ea2507fe344',1,'openvdb::v3_2_0::GridBase']]], + ['stripsuffix',['stripSuffix',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#aa05e83c427df9ff1893cf0c4c3c7f30e',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['sub',['sub',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ac6c69fcfe79709594433bcac59bed34b',1,'openvdb::v3_2_0::math::Quat::sub()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a41fa11ad7f3c0d7a0b2fa63aeb12d43a',1,'openvdb::v3_2_0::math::Vec2::sub()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#affe463a6cd94dd93c5e2341c7c2bfe93',1,'openvdb::v3_2_0::math::Vec3::sub()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a991ac01de97c37426fc7ee8e9aa8942e',1,'openvdb::v3_2_0::math::Vec4::sub()']]], + ['sum',['sum',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a6099c71b51b35c00ac10686eb4557566',1,'openvdb::v3_2_0::math::Vec2::sum()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a6099c71b51b35c00ac10686eb4557566',1,'openvdb::v3_2_0::math::Vec3::sum()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a6099c71b51b35c00ac10686eb4557566',1,'openvdb::v3_2_0::math::Vec4::sum()']]], + ['summary',['summary',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a6fd5786597a0ae83ba243395ddf8f7ad',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::summary()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a6fd5786597a0ae83ba243395ddf8f7ad',1,'openvdb::v3_2_0::tree::NodeIteratorBase::summary()']]], + ['sumop',['SumOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SumOp.html#af462f646ea569148ee1dc2b3023555af',1,'openvdb::v3_2_0::tools::valxform::SumOp']]], + ['swap',['swap',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a195ee4f1876e8f106d99c8df73f121ef',1,'openvdb::v3_2_0::math::pcg::Vector::swap()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#ae70107dafa8a4fc4751d9683ca23d59c',1,'openvdb::v3_2_0::tools::PointPartitioner::swap()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#ab3ec926460bc5d1a80ce411498ea04ef',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::swap()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ab3ec926460bc5d1a80ce411498ea04ef',1,'openvdb::v3_2_0::tree::LeafNode::swap()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#ab3ec926460bc5d1a80ce411498ea04ef',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::swap()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ab3ec926460bc5d1a80ce411498ea04ef',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::swap()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#ab3ec926460bc5d1a80ce411498ea04ef',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::swap()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ab3ec926460bc5d1a80ce411498ea04ef',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::swap()']]], + ['swapbuffer',['swapBuffer',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a288a8c0c3e8c6132e6284ab66cc591cd',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['swapleafbuffer',['swapLeafBuffer',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a22ac33d0549b786059b9c691f0a534f7',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['swappedcombineop',['SwappedCombineOp',['../structopenvdb_1_1v3__2__0_1_1SwappedCombineOp.html#a2abc52640eb88bd38a2cfeee4e4a5457',1,'openvdb::v3_2_0::SwappedCombineOp']]], + ['sweepexteriorsign',['SweepExteriorSign',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SweepExteriorSign.html#aeebc3336a52f45e23511e56290e54a7c',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SweepExteriorSign']]], + ['symmetric',['symmetric',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#aba857b385008e1b1222d1dc6654473c4',1,'openvdb::v3_2_0::math::Mat3']]], + ['syncallbuffers',['syncAllBuffers',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a3bad152cbc97be4c39b46f852cf523b4',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['syncauxbuffer',['syncAuxBuffer',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a2f5bb8c75cfd73036df566fba4dd693e',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['syncvoxelmask',['SyncVoxelMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SyncVoxelMask.html#a48e6e05a359c1f7d0c9517865b0322c6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SyncVoxelMask']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_13.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_13.html new file mode 100644 index 00000000..81a66b19 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_13.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_13.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_13.js new file mode 100644 index 00000000..fc8fad80 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_13.js @@ -0,0 +1,92 @@ +var searchData= +[ + ['t0',['t0',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a7f26a2b8eaf2ef80a4f16ab3836d262c',1,'openvdb::v3_2_0::math::Ray']]], + ['t1',['t1',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a49df3e0a4f95e18eabfe8e222ac38c4b',1,'openvdb::v3_2_0::math::Ray']]], + ['tagseamedges',['TagSeamEdges',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TagSeamEdges.html#a61a2fd3fd13fec852cc50e5c3dcee121',1,'openvdb::v3_2_0::tools::internal::TagSeamEdges']]], + ['tempfile',['TempFile',['../classopenvdb_1_1v3__2__0_1_1io_1_1TempFile.html#a7888caff7974ef29ad45cf81d93ce9ca',1,'openvdb::v3_2_0::io::TempFile']]], + ['temporalintegrationschemetomenuname',['temporalIntegrationSchemeToMenuName',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9b7e2292b5fd33be821cf4900f0f15f8',1,'openvdb::v3_2_0::math']]], + ['temporalintegrationschemetostring',['temporalIntegrationSchemeToString',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a89282fad0cbf04e703077c554d14b3d9',1,'openvdb::v3_2_0::math']]], + ['temporalorder',['temporalOrder',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#aa0c9a59627d5406f067e1808aaa2115e',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['terminationdefaults',['terminationDefaults',['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg.html#a72ae92f25b96214ce1465691435eadb2',1,'openvdb::v3_2_0::math::pcg']]], + ['test',['test',['../structopenvdb_1_1v3__2__0_1_1math_1_1LevelSetHDDA.html#a74d6a62e70d129db0329a4d6db757fc3',1,'openvdb::v3_2_0::math::LevelSetHDDA::test()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1LevelSetHDDA_3_01TreeT_00-1_01_4.html#a74d6a62e70d129db0329a4d6db757fc3',1,'openvdb::v3_2_0::math::LevelSetHDDA< TreeT,-1 >::test()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Ray_1_1TimeSpan.html#ae171513e6711b69a9e20fb12eddee5c3',1,'openvdb::v3_2_0::math::Ray::TimeSpan::test()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#abb31a297cc45aed1239349fedf34f0c2',1,'openvdb::v3_2_0::math::Ray::test() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#aaf71dafe5885504c1c55158c65e8ddb8',1,'openvdb::v3_2_0::math::Ray::test(RealT time) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#a3dae0444f1af776a3ca20eed3e132c16',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::test()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a3dae0444f1af776a3ca20eed3e132c16',1,'openvdb::v3_2_0::tools::PointIndexIterator::test()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#a3dae0444f1af776a3ca20eed3e132c16',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator::test()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#a3dae0444f1af776a3ca20eed3e132c16',1,'openvdb::v3_2_0::tree::IteratorBase::test()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#a3dae0444f1af776a3ca20eed3e132c16',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::test()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#a3dae0444f1af776a3ca20eed3e132c16',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::test()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#abb988e26b6fdc84928668e8cfc4314f9',1,'openvdb::v3_2_0::tree::IterListItem::test()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#abb988e26b6fdc84928668e8cfc4314f9',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::test()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#abb988e26b6fdc84928668e8cfc4314f9',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::test()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a3dae0444f1af776a3ca20eed3e132c16',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::test()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a3dae0444f1af776a3ca20eed3e132c16',1,'openvdb::v3_2_0::tree::NodeIteratorBase::test()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#a3dae0444f1af776a3ca20eed3e132c16',1,'openvdb::v3_2_0::tree::LeafIteratorBase::test()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorRange.html#a3dae0444f1af776a3ca20eed3e132c16',1,'openvdb::v3_2_0::tree::IteratorRange::test()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html#a3dae0444f1af776a3ca20eed3e132c16',1,'openvdb::v3_2_0::util::BaseMaskIterator::test()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#a3dae0444f1af776a3ca20eed3e132c16',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::test()']]], + ['thirteenpointstencil',['ThirteenPointStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1ThirteenPointStencil.html#a61d39aa280cb2bf9ce729e7ee99717e1',1,'openvdb::v3_2_0::math::ThirteenPointStencil']]], + ['threaded',['threaded',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html#a842968a1ac820ec8a5b28cf08af5e9b7',1,'openvdb::v3_2_0::tools::GridResampler']]], + ['throw_5fif_5fnull',['THROW_IF_NULL',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1MathOp.html#ad5f52ed4b4c883f10cd8483a3aee6209',1,'openvdb::v3_2_0::tools::stats_internal::MathOp']]], + ['tiledata',['tileData',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a960349c63621174a7e878720130cf0c0',1,'openvdb::v3_2_0::tools::internal']]], + ['tilesampler',['TileSampler',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TileSampler.html#ac2c41b61386bcb7dd537335decfdfd45',1,'openvdb::v3_2_0::tools::internal::TileSampler::TileSampler()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TileSampler_3_01PointSampler_00_01TreeT_01_4.html#a6843ead06315a58962e6639e4cc82731',1,'openvdb::v3_2_0::tools::internal::TileSampler< PointSampler, TreeT >::TileSampler()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TileSampler_3_01StaggeredPointSampler_00_01TreeT_01_4.html#a6843ead06315a58962e6639e4cc82731',1,'openvdb::v3_2_0::tools::internal::TileSampler< StaggeredPointSampler, TreeT >::TileSampler()']]], + ['time',['time',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#ac0bd5fd4c8579b0eb6b94e76946b7f41',1,'openvdb::v3_2_0::math::DDA']]], + ['timeout',['timeout',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#ac21cdac881dc20d1c9cfb8c068555ca2',1,'openvdb::v3_2_0::io::Queue']]], + ['timesdiagonal',['timesDiagonal',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a68d27f0742cab464c4d895064f857d5b',1,'openvdb::v3_2_0::math::Mat3']]], + ['timespan',['TimeSpan',['../structopenvdb_1_1v3__2__0_1_1math_1_1Ray_1_1TimeSpan.html#a31c188f9e7756382a182bd3c2b75a6c6',1,'openvdb::v3_2_0::math::Ray::TimeSpan::TimeSpan()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Ray_1_1TimeSpan.html#a0285ee4fd348743376585fc136f77df9',1,'openvdb::v3_2_0::math::Ray::TimeSpan::TimeSpan(RealT _t0, RealT _t1)']]], + ['toggle',['toggle',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a5a0ca7e5e0f7344bf558f752b439b287',1,'openvdb::v3_2_0::util::NodeMask::toggle(Index32 n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ad277193b2dca0bab1e0ad24d45407dc3',1,'openvdb::v3_2_0::util::NodeMask::toggle()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a5a0ca7e5e0f7344bf558f752b439b287',1,'openvdb::v3_2_0::util::NodeMask< 1 >::toggle(Index32 n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ad277193b2dca0bab1e0ad24d45407dc3',1,'openvdb::v3_2_0::util::NodeMask< 1 >::toggle()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a5a0ca7e5e0f7344bf558f752b439b287',1,'openvdb::v3_2_0::util::NodeMask< 2 >::toggle(Index32 n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ad277193b2dca0bab1e0ad24d45407dc3',1,'openvdb::v3_2_0::util::NodeMask< 2 >::toggle()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#ac1a73e3e23193c8312eaafba244e009d',1,'openvdb::v3_2_0::util::RootNodeMask::toggle(Index32 i)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#ad277193b2dca0bab1e0ad24d45407dc3',1,'openvdb::v3_2_0::util::RootNodeMask::toggle()']]], + ['tolerancepruneop',['TolerancePruneOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1TolerancePruneOp.html#a4b3f3b4a8a4e83168c4867f8c783123f',1,'openvdb::v3_2_0::tools::TolerancePruneOp']]], + ['topologycopy1',['TopologyCopy1',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy1.html#a0b181ce3addbeb38a5d8b0e7b800709f',1,'openvdb::v3_2_0::tree::InternalNode::TopologyCopy1']]], + ['topologycopy2',['TopologyCopy2',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy2.html#a6b91f6a4a3e353a9cabf69fb53f877cd',1,'openvdb::v3_2_0::tree::InternalNode::TopologyCopy2']]], + ['topologydifference',['topologyDifference',['../classopenvdb_1_1v3__2__0_1_1Grid.html#ac1438276e00ba2c0de099acf62e33331',1,'openvdb::v3_2_0::Grid::topologyDifference()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a77c47237feeecc609582460c08dbb242',1,'openvdb::v3_2_0::tree::InternalNode::topologyDifference()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a360f3f39eb6d02f55b36697c5b5c2d14',1,'openvdb::v3_2_0::tree::LeafNode::topologyDifference()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ab806ba12c5a214ace1c3637e8e1d78e2',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::topologyDifference()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ab806ba12c5a214ace1c3637e8e1d78e2',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::topologyDifference()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a4bfa9bd46c8206d75f01c69c05425b5d',1,'openvdb::v3_2_0::tree::RootNode::topologyDifference()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a7c6ad1abf61c3b13d7ad7408f4634226',1,'openvdb::v3_2_0::tree::Tree::topologyDifference()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a1a557187cdfa2028657e046b6b57ff45',1,'openvdb::v3_2_0::tree::InternalNode::topologyDifference()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyDifference.html#a68e41cc69d9b91e023e7c438d899f5cf',1,'openvdb::v3_2_0::tree::InternalNode::TopologyDifference::TopologyDifference()']]], + ['topologyintersection',['topologyIntersection',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a19eef208eb58eeb2009d67519e1c291c',1,'openvdb::v3_2_0::Grid::topologyIntersection()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a2973e4d0d6266e3e42f1457262164347',1,'openvdb::v3_2_0::tree::InternalNode::topologyIntersection()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a6ea86b45ea34339f6c78389c7e61d10d',1,'openvdb::v3_2_0::tree::LeafNode::topologyIntersection()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#afd489fd5603909c27a0366ad1ee3c754',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::topologyIntersection()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#afd489fd5603909c27a0366ad1ee3c754',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::topologyIntersection()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ac29f98775a4d88dc3163abc979db6060',1,'openvdb::v3_2_0::tree::RootNode::topologyIntersection()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a4a4089e30211443f0d6431cff8bef3cc',1,'openvdb::v3_2_0::tree::Tree::topologyIntersection()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a6a3d6186a60c1234b213848bd2405ad9',1,'openvdb::v3_2_0::tree::InternalNode::topologyIntersection()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyIntersection.html#a214fdb2a58d4ae8293a76e9c955fe216',1,'openvdb::v3_2_0::tree::InternalNode::TopologyIntersection::TopologyIntersection()']]], + ['topologytolevelset',['topologyToLevelSet',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ae5a54d059eea613345a1708ea47ee08a',1,'openvdb::v3_2_0::tools::topologyToLevelSet(const GridType &grid, int halfBandWidth=3, int closingWidth=1, int dilation=0, int smoothingSteps=0)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a48655b6855e5ea9179ebd5e0f1b8ec93',1,'openvdb::v3_2_0::tools::topologyToLevelSet(const GridType &grid, int halfBandWidth=3, int closingWidth=1, int dilation=0, int smoothingSteps=0, InterrupterType *interrupt=NULL)']]], + ['topologyunion',['topologyUnion',['../classopenvdb_1_1v3__2__0_1_1Grid.html#afb09afd9d023da4b1dae7a140af6848a',1,'openvdb::v3_2_0::Grid::topologyUnion()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a089eb4c09e2e46b478de9235b91fd24d',1,'openvdb::v3_2_0::tree::InternalNode::topologyUnion()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a896e240bd3b8fd07d24b5e253fdc50cc',1,'openvdb::v3_2_0::tree::LeafNode::topologyUnion()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a896e240bd3b8fd07d24b5e253fdc50cc',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::topologyUnion()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a896e240bd3b8fd07d24b5e253fdc50cc',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::topologyUnion()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a522ff4d2548c10c1dbc5f3569fa5f449',1,'openvdb::v3_2_0::tree::RootNode::topologyUnion()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ac32b595dbcad270a15ed20df549c946f',1,'openvdb::v3_2_0::tree::Tree::topologyUnion()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a71f0146ca262b3ffd49b722c687b697b',1,'openvdb::v3_2_0::tree::InternalNode::topologyUnion()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyUnion.html#ab6e395318c127224cf8fddcf4d12ecd1',1,'openvdb::v3_2_0::tree::InternalNode::TopologyUnion::TopologyUnion()']]], + ['touchleaf',['touchLeaf',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a7082c10cbb6529b4dcff9c7ea26d85f8',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ab67464c0a432fdd5591c830b5589ce42',1,'openvdb::v3_2_0::tree::InternalNode::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a92f3cf8a5cca66e226b52470f2afc68a',1,'openvdb::v3_2_0::tree::LeafNode::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a92f3cf8a5cca66e226b52470f2afc68a',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a92f3cf8a5cca66e226b52470f2afc68a',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ab67464c0a432fdd5591c830b5589ce42',1,'openvdb::v3_2_0::tree::RootNode::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a4b094186577cde9b7ad1f326389c815f',1,'openvdb::v3_2_0::tree::Tree::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a0d19cd16b0f5919fd95ce5ab20984a2b',1,'openvdb::v3_2_0::tree::ValueAccessor::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a70f1f2b22dd748450dfcf20791c085cb',1,'openvdb::v3_2_0::tree::CacheItem::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a70f1f2b22dd748450dfcf20791c085cb',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a0d19cd16b0f5919fd95ce5ab20984a2b',1,'openvdb::v3_2_0::tree::ValueAccessor0::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a0d19cd16b0f5919fd95ce5ab20984a2b',1,'openvdb::v3_2_0::tree::ValueAccessor1::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a0d19cd16b0f5919fd95ce5ab20984a2b',1,'openvdb::v3_2_0::tree::ValueAccessor2::touchLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a0d19cd16b0f5919fd95ce5ab20984a2b',1,'openvdb::v3_2_0::tree::ValueAccessor3::touchLeaf()']]], + ['touchleafandcache',['touchLeafAndCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a89cdcafaee102ca1fb80390b3fc0b9fc',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::touchLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a9234b49b656ddd73fb2d5368e6088c06',1,'openvdb::v3_2_0::tree::InternalNode::touchLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a659c012dad460d849383b82dc32d7c23',1,'openvdb::v3_2_0::tree::LeafNode::touchLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a659c012dad460d849383b82dc32d7c23',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::touchLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a659c012dad460d849383b82dc32d7c23',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::touchLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a87111eb89261bcfaba2d9863f81c92d6',1,'openvdb::v3_2_0::tree::RootNode::touchLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a1b529733f0b52eb639833f197ca747ed',1,'openvdb::v3_2_0::tree::InternalNode::touchLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a1b529733f0b52eb639833f197ca747ed',1,'openvdb::v3_2_0::tree::RootNode::touchLeafAndCache()']]], + ['tov',['toV',['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#a415373fb8c9e4f2d3d53e29284587444',1,'openvdb::v3_2_0::math::Tuple']]], + ['trace',['trace',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a1d9030d1459f91027741424a262d31fd',1,'openvdb::v3_2_0::math::Mat3']]], + ['traceexteriorboundaries',['traceExteriorBoundaries',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a5c971c289dca66c2e8500e01aac41bdf',1,'openvdb::v3_2_0::tools']]], + ['tracevoxelline',['traceVoxelLine',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SweepExteriorSign.html#abc166ef13b191da0cb4a9e7d9cf28003',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SweepExteriorSign']]], + ['track',['track',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#af613bc7d3737c75db5f01a663a149614',1,'openvdb::v3_2_0::tools::LevelSetTracker']]], + ['transferto',['transferTo',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a594c68f2fc06fa8171f22820e576faee',1,'openvdb::v3_2_0::io::StreamMetadata']]], + ['transform',['Transform',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a9de68ec1c9b7809129814a3233ae4655',1,'openvdb::v3_2_0::math::Transform::Transform()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a8774c215ee4561048483333197e21d8e',1,'openvdb::v3_2_0::math::Transform::Transform(const MapBase::Ptr &)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a2f56f8c86798eb7420f8cfdc6cfc9316',1,'openvdb::v3_2_0::math::Transform::Transform(const Transform &)'],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a29489066f0a6b234e780dad3322f4040',1,'openvdb::v3_2_0::GridBase::transform()'],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a34320243b0a179d5089b9e67fcc00eb3',1,'openvdb::v3_2_0::GridBase::transform() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a66c7c913e921933b40c68c12c71626f9',1,'openvdb::v3_2_0::math::Mat3::transform()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#aa98b5754979a7c680da6bbab8b8e8d85',1,'openvdb::v3_2_0::math::Mat4::transform(const Vec4< T0 > &v) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a66c7c913e921933b40c68c12c71626f9',1,'openvdb::v3_2_0::math::Mat4::transform(const Vec3< T0 > &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ContiguousOp.html#aec12730063000c9af1e559dd776bde20',1,'openvdb::v3_2_0::tools::ContiguousOp::transform()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer_1_1MatrixTransform.html#a3bdde3e6789f1a251ef22b89c8444ced',1,'openvdb::v3_2_0::tools::GridTransformer::MatrixTransform::transform()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ABTransform.html#a273dcce2c3a35b295964de4702f943da',1,'openvdb::v3_2_0::tools::ABTransform::transform()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#a34320243b0a179d5089b9e67fcc00eb3',1,'openvdb::v3_2_0::tools::GridSampler::transform()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html#a34320243b0a179d5089b9e67fcc00eb3',1,'openvdb::v3_2_0::tools::GridSampler< tree::ValueAccessor< TreeT >, SamplerType >::transform()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a29489066f0a6b234e780dad3322f4040',1,'openvdb::v3_2_0::tools::MultiResGrid::transform()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a34320243b0a179d5089b9e67fcc00eb3',1,'openvdb::v3_2_0::tools::MultiResGrid::transform() const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiscreteField.html#a34320243b0a179d5089b9e67fcc00eb3',1,'openvdb::v3_2_0::tools::DiscreteField::transform()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1EnrightField.html#a1c5ab5215152d32cb6c472fdfebd7329',1,'openvdb::v3_2_0::tools::EnrightField::transform()']]], + ['transform3x3',['transform3x3',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#ad7ddb61aa28cebf719bdf59719c875bc',1,'openvdb::v3_2_0::math::Mat4']]], + ['transformdense',['transformDense',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aa53e1d4c0388a0325321061b565de688',1,'openvdb::v3_2_0::tools::transformDense(Dense< ValueT, openvdb::tools::LayoutZYX > &dense, const openvdb::CoordBBox &bbox, const OpType &op, bool parallel=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a298d2d95314acb02ec1cae132adbf49f',1,'openvdb::v3_2_0::tools::transformDense(Dense< ValueT, openvdb::tools::LayoutZYX > &dense, const openvdb::CoordBBox &bbox, const PointwiseOpT &functor, bool parallel)']]], + ['transformgrid',['transformGrid',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html#ad188eff3e1fb20d0f12e238a9d31d934',1,'openvdb::v3_2_0::tools::GridResampler::transformGrid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer.html#ac3b75824ebfd0591a034f86262715848',1,'openvdb::v3_2_0::tools::GridTransformer::transformGrid()']]], + ['transformh',['transformH',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a0a00e0cee96464deef181d12adb43c5d',1,'openvdb::v3_2_0::math::Mat4']]], + ['transformnormal',['transformNormal',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab5058d0329059c62556272839307aca5',1,'openvdb::v3_2_0::math']]], + ['transformpoints',['TransformPoints',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1TransformPoints.html#a148efab8908bddb9ec25c408a91b4e35',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::TransformPoints']]], + ['transformptr',['transformPtr',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#aaeef9292b7aa4fd419dcdf4c83ede12c',1,'openvdb::v3_2_0::GridBase::transformPtr()'],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a1579bcd59be862f9db76338f2561255b',1,'openvdb::v3_2_0::GridBase::transformPtr() const ']]], + ['transformtiles',['transformTiles',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html#a02045a43a7175ee80da871c55d282c54',1,'openvdb::v3_2_0::tools::GridResampler']]], + ['transformvalues',['TransformValues',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1TransformValues.html#a915dd347f3411405d58668845097b35e',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::TransformValues::TransformValues()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ae870e81ce652b9c057d92dbe4b4b9811',1,'openvdb::v3_2_0::tools::transformValues(const InIterT &inIter, OutGridT &outGrid, XformOp &op, bool threaded=true, bool shareOp=true, MergePolicy merge=MERGE_ACTIVE_STATES)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a21a43dc2e67d32098ee0f0b77e6b4aca',1,'openvdb::v3_2_0::tools::transformValues(const InIterT &inIter, OutGridT &outGrid, const XformOp &op, bool threaded=true, bool shareOp=true, MergePolicy merge=MERGE_ACTIVE_STATES)']]], + ['transformvectors',['transformVectors',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a642190ccc3febe94d8b07ac37f892349',1,'openvdb::v3_2_0::tools']]], + ['translate',['translate',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a6b0b6b0cb3c738817e6cb73bcc324d33',1,'openvdb::v3_2_0::math::BBox::translate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a4be57e34cf9ad284ece51c8a46c6ddc1',1,'openvdb::v3_2_0::math::CoordBBox::translate()']]], + ['translation',['translation',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a54bfdafb84268d331ea8dd5abecd9579',1,'openvdb::v3_2_0::math::Mat4']]], + ['translationmap',['TranslationMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a68882ae92b983d700571e658b49f8dbe',1,'openvdb::v3_2_0::math::TranslationMap::TranslationMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a7aca669b9b0859bf74f55336a51ae44c',1,'openvdb::v3_2_0::math::TranslationMap::TranslationMap(const Vec3d &t)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a103f002dc741e175386a85e173e25746',1,'openvdb::v3_2_0::math::TranslationMap::TranslationMap(const TranslationMap &other)']]], + ['transpose',['transpose',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a4e8eabb325cbbf971fc8a03a7ad23d92',1,'openvdb::v3_2_0::math::Mat3::transpose()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a8109d997fd3a616f735ff95df91e37e1',1,'openvdb::v3_2_0::math::Mat4::transpose()']]], + ['tree',['tree',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a9041f381eeb1287165c1287603de9663',1,'openvdb::v3_2_0::Grid::tree()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a932dc28aa53e3961b2c4f8b3ff4c7242',1,'openvdb::v3_2_0::Grid::tree() const '],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a7fdbb97a777cbe597cdfa59410683bd9',1,'openvdb::v3_2_0::TreeAdapter::tree(TreeType &t)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#abab5ba35948b41bb831467273c979e49',1,'openvdb::v3_2_0::TreeAdapter::tree(GridType &g)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a2a045d738694275310c2820eca1eff95',1,'openvdb::v3_2_0::TreeAdapter::tree(const TreeType &t)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a5bf1ea8bbc254b6e9b4f395bb37d002b',1,'openvdb::v3_2_0::TreeAdapter::tree(const GridType &g)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a7fdbb97a777cbe597cdfa59410683bd9',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::tree(TreeType &t)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#abab5ba35948b41bb831467273c979e49',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::tree(GridType &g)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a2a045d738694275310c2820eca1eff95',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::tree(const TreeType &t)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a5bf1ea8bbc254b6e9b4f395bb37d002b',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::tree(const GridType &g)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a7fdbb97a777cbe597cdfa59410683bd9',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::tree(TreeType &t)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#abab5ba35948b41bb831467273c979e49',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::tree(GridType &g)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#afc35379e069a045c3d6e2ec80d375a55',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::tree(AccessorType &a)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a2a045d738694275310c2820eca1eff95',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::tree(const TreeType &t)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a5bf1ea8bbc254b6e9b4f395bb37d002b',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::tree(const GridType &g)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a33f02177c3365baa674abdac1c736110',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::tree(const AccessorType &a)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1CopyLeafNodes.html#aa4fbc4847cf2a90c4252120911106a14',1,'openvdb::v3_2_0::tools::clip_internal::CopyLeafNodes::tree()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1GenEdgeData.html#a9041f381eeb1287165c1287603de9663',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::GenEdgeData::tree()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a3eaefa9bfc7e8d743999ceaba0c8f9b1',1,'openvdb::v3_2_0::tools::MultiResGrid::tree()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a86621db4d1f486e9590128ff8c87c5ed',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::tree()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartGen.html#aa4bcecec8c047ca5aa744fe8b796759e',1,'openvdb::v3_2_0::tools::internal::PartGen::tree()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTopologyMask.html#aa4bcecec8c047ca5aa744fe8b796759e',1,'openvdb::v3_2_0::tools::internal::GenTopologyMask::tree()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenBoundaryMask.html#aa4bcecec8c047ca5aa744fe8b796759e',1,'openvdb::v3_2_0::tools::internal::GenBoundaryMask::tree()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTileMask.html#aa4bcecec8c047ca5aa744fe8b796759e',1,'openvdb::v3_2_0::tools::internal::GenTileMask::tree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a932dc28aa53e3961b2c4f8b3ff4c7242',1,'openvdb::v3_2_0::tree::LeafManager::tree() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a9041f381eeb1287165c1287603de9663',1,'openvdb::v3_2_0::tree::LeafManager::tree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html#a51e807b7c7a3ef45dbe459d62a3b715b',1,'openvdb::v3_2_0::tree::ValueAccessorBase::tree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a3dee5770ede29888f2c0136bbd7f5a95',1,'openvdb::v3_2_0::tree::Tree::Tree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a176bf2364d34c17e2e02eb44a21c520d',1,'openvdb::v3_2_0::tree::Tree::Tree(const Tree &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a213c0ce777bcd4328500431d3231a446',1,'openvdb::v3_2_0::tree::Tree::Tree(const Tree< OtherRootType > &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#adae3bd6c1599f80a0f3b518945195b9e',1,'openvdb::v3_2_0::tree::Tree::Tree(const OtherTreeType &other, const ValueType &inactiveValue, const ValueType &activeValue, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ab198c466f09f12bcd4d14367068450c6',1,'openvdb::v3_2_0::tree::Tree::Tree(const OtherTreeType &other, const ValueType &background, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ae65bce1b639b04c7f8004f54571e1453',1,'openvdb::v3_2_0::tree::Tree::Tree(const ValueType &background)']]], + ['treebase',['TreeBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a58f77a4e769811a4aea802b2e38b81b1',1,'openvdb::v3_2_0::tree::TreeBase']]], + ['treedepth',['treeDepth',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#ace18fe0a4642b592421789ed2f371a63',1,'openvdb::v3_2_0::tree::TreeBase::treeDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a914c980a4a12a76117400e549bde8872',1,'openvdb::v3_2_0::tree::Tree::treeDepth()']]], + ['treeptr',['treePtr',['../classopenvdb_1_1v3__2__0_1_1Grid.html#adc47070164ba764f5afe561998f88f17',1,'openvdb::v3_2_0::Grid::treePtr()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a2cc188500b338b27709910bf7d1a555a',1,'openvdb::v3_2_0::Grid::treePtr() const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#ad87d517cc6b96dfe176fccc2e3723162',1,'openvdb::v3_2_0::tools::MultiResGrid::treePtr()']]], + ['treetype',['treeType',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a34b9eb7da4505530a4199fa0a55ccf20',1,'openvdb::v3_2_0::tree::Tree']]], + ['treevalueiteratorbase',['TreeValueIteratorBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#acabc2a875dca68c4bca2359fc5f6d292',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::TreeValueIteratorBase(TreeT &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#affd4cd4fa6bbd396d6c7e19ef603b862',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::TreeValueIteratorBase(const TreeValueIteratorBase &other)']]], + ['triangle',['triangle',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#af09d9958a945f4b408df79091bdfead5',1,'openvdb::v3_2_0::tools::PolygonPool::triangle(size_t n)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#aea80f976e64558aef63fa5c7ab319130',1,'openvdb::v3_2_0::tools::PolygonPool::triangle(size_t n) const ']]], + ['triangleflags',['triangleFlags',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#a128bd1db3cb090bb4f7e0a6e54055ac7',1,'openvdb::v3_2_0::tools::PolygonPool::triangleFlags(size_t n)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#a5faa1c91247e0f29049ac508975e0c9f',1,'openvdb::v3_2_0::tools::PolygonPool::triangleFlags(size_t n) const ']]], + ['trilinearinterpolation',['trilinearInterpolation',['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html#a8cb99ca3a192bf933bc987a484894734',1,'openvdb::v3_2_0::tools::BoxSampler']]], + ['trimquads',['trimQuads',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#aff35a526ee23e9b98b8df46190b7af52',1,'openvdb::v3_2_0::tools::PolygonPool']]], + ['trimtrinagles',['trimTrinagles',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#a971b981830a3f0d5bea2d6281a9eb62b',1,'openvdb::v3_2_0::tools::PolygonPool']]], + ['triquadraticinterpolation',['triquadraticInterpolation',['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadraticSampler.html#a0861fd17ac9c8cb119b1a4de4617bf83',1,'openvdb::v3_2_0::tools::QuadraticSampler']]], + ['truncate',['Truncate',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a639d56dfede9f213b89b6325ddb89f7b',1,'openvdb::v3_2_0::math']]], + ['truncaterealtohalf',['truncateRealToHalf',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a27727fecb80234d26033a910aef4bb1e',1,'openvdb::v3_2_0::io']]], + ['tuple',['Tuple',['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#a4766c7b239a3a6c3980f7e84d5439377',1,'openvdb::v3_2_0::math::Tuple::Tuple()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#a36646643727b34842e2c9f2aa1b3fd75',1,'openvdb::v3_2_0::math::Tuple::Tuple(Tuple const &src)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#acd1c8953121142aed4cca66cd5500920',1,'openvdb::v3_2_0::math::Tuple::Tuple(Tuple< src_size, src_valtype > const &src)']]], + ['type',['type',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ac84caf0458432553a758020564afd5b6',1,'openvdb::v3_2_0::GridBase::type()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a79fd411a77e6a2508e292d37512a2bab',1,'openvdb::v3_2_0::Grid::type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#ac84caf0458432553a758020564afd5b6',1,'openvdb::v3_2_0::math::MapBase::type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#ab402d4b033527d1a1fc000633f270494',1,'openvdb::v3_2_0::math::AffineMap::type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#ab402d4b033527d1a1fc000633f270494',1,'openvdb::v3_2_0::math::ScaleMap::type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#ab402d4b033527d1a1fc000633f270494',1,'openvdb::v3_2_0::math::UniformScaleMap::type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#ab402d4b033527d1a1fc000633f270494',1,'openvdb::v3_2_0::math::TranslationMap::type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#ab402d4b033527d1a1fc000633f270494',1,'openvdb::v3_2_0::math::ScaleTranslateMap::type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#ab402d4b033527d1a1fc000633f270494',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#ab402d4b033527d1a1fc000633f270494',1,'openvdb::v3_2_0::math::UnitaryMap::type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#ab402d4b033527d1a1fc000633f270494',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#ab402d4b033527d1a1fc000633f270494',1,'openvdb::v3_2_0::math::CompoundMap::type()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a5b3a00bb536b37d30bf04307b3fa15ec',1,'openvdb::v3_2_0::tree::TreeBase::type()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a8436ea82104526405e9cf8b816ddd55c',1,'openvdb::v3_2_0::tree::Tree::type()']]], + ['typedmetadata',['TypedMetadata',['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a9e3ff5782592bf736509fce62509fe27',1,'openvdb::v3_2_0::TypedMetadata::TypedMetadata()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a0ca3a3d3d3c653db95d4d528328becc0',1,'openvdb::v3_2_0::TypedMetadata::TypedMetadata(const T &value)'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a8ba831ad4fc5d68c3a53b52c63688626',1,'openvdb::v3_2_0::TypedMetadata::TypedMetadata(const TypedMetadata< T > &other)']]], + ['typeerror',['TypeError',['../classopenvdb_1_1v3__2__0_1_1TypeError.html#a3d1f1e0e0c2d6935842a02c9ddfb0970',1,'openvdb::v3_2_0::TypeError::TypeError()'],['../classopenvdb_1_1v3__2__0_1_1TypeError.html#a1ce940b25998c3a78afab2566dae2b24',1,'openvdb::v3_2_0::TypeError::TypeError(const std::string &msg)']]], + ['typename',['typeName',['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a1b837ccf3ad9d9a585147e34194ab79f',1,'openvdb::v3_2_0::Metadata::typeName()'],['../classopenvdb_1_1v3__2__0_1_1UnknownMetadata.html#accdcf705ac8026130d5093a3a0d08203',1,'openvdb::v3_2_0::UnknownMetadata::typeName()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a0669e7e9e0854e4d6611b6a3f9f5387a',1,'openvdb::v3_2_0::TypedMetadata::typeName()']]], + ['typenameasstring',['typeNameAsString',['../namespaceopenvdb_1_1v3__2__0.html#a14e91546664c2686e256e850339064b6',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20bool_20_3e',['typeNameAsString< bool >',['../namespaceopenvdb_1_1v3__2__0.html#a4890e01190bc7c2f64e7237bf866b515',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20double_20_3e',['typeNameAsString< double >',['../namespaceopenvdb_1_1v3__2__0.html#a2438c22565639a140915d9855f58ecec',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20float_20_3e',['typeNameAsString< float >',['../namespaceopenvdb_1_1v3__2__0.html#af7970747248d59c6faa7e8c72230eb47',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20int32_5ft_20_3e',['typeNameAsString< int32_t >',['../namespaceopenvdb_1_1v3__2__0.html#a06f4ce6dc57d22ca7d613eacb5758772',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20int64_5ft_20_3e',['typeNameAsString< int64_t >',['../namespaceopenvdb_1_1v3__2__0.html#a30e4418303428d8a0971dab9b5a4345a',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20mat4d_20_3e',['typeNameAsString< Mat4d >',['../namespaceopenvdb_1_1v3__2__0.html#ac1a21f46fa3d478106675e91dba2a824',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20mat4s_20_3e',['typeNameAsString< Mat4s >',['../namespaceopenvdb_1_1v3__2__0.html#aabb320a0e5eae9f83f6bb9365789a41d',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20pointdataindex32_20_3e',['typeNameAsString< PointDataIndex32 >',['../namespaceopenvdb_1_1v3__2__0.html#a8bf8316a84b65e8df3384e6a6f320b9b',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20pointdataindex64_20_3e',['typeNameAsString< PointDataIndex64 >',['../namespaceopenvdb_1_1v3__2__0.html#a3c55b55c7f77c03274b1756c786134cb',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20pointindex32_20_3e',['typeNameAsString< PointIndex32 >',['../namespaceopenvdb_1_1v3__2__0.html#ada78f602692d995da873ed16214f606b',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20pointindex64_20_3e',['typeNameAsString< PointIndex64 >',['../namespaceopenvdb_1_1v3__2__0.html#ad780726e7c28b22829a8bf55ecf304ae',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20std_3a_3astring_20_3e',['typeNameAsString< std::string >',['../namespaceopenvdb_1_1v3__2__0.html#ae2bb60144ddd4b23e9ba4c1687e35a3d',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20uint32_5ft_20_3e',['typeNameAsString< uint32_t >',['../namespaceopenvdb_1_1v3__2__0.html#ab71b229545264ca59764777a6effa4fd',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20valuemask_20_3e',['typeNameAsString< ValueMask >',['../namespaceopenvdb_1_1v3__2__0.html#af71b8a0133b2572fce5cdb7c7ccf51d8',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20vec2d_20_3e',['typeNameAsString< Vec2d >',['../namespaceopenvdb_1_1v3__2__0.html#a7bb826b82553cfad26532f01f2bd520e',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20vec2i_20_3e',['typeNameAsString< Vec2i >',['../namespaceopenvdb_1_1v3__2__0.html#a35a82fb0e73264e7f286e248814fad78',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20vec2s_20_3e',['typeNameAsString< Vec2s >',['../namespaceopenvdb_1_1v3__2__0.html#a8b75cda4d422629032c35f1e17b393d6',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20vec3d_20_3e',['typeNameAsString< Vec3d >',['../namespaceopenvdb_1_1v3__2__0.html#a6a0699eaf1151409ec66ffdadcf70477',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20vec3f_20_3e',['typeNameAsString< Vec3f >',['../namespaceopenvdb_1_1v3__2__0.html#aaadb54933419379883d9df002239baef',1,'openvdb::v3_2_0']]], + ['typenameasstring_3c_20vec3i_20_3e',['typeNameAsString< Vec3i >',['../namespaceopenvdb_1_1v3__2__0.html#a64ab4af10f11df00c1a0b2d0aab94eb5',1,'openvdb::v3_2_0']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_14.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_14.html new file mode 100644 index 00000000..1fa66805 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_14.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_14.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_14.js new file mode 100644 index 00000000..f6e59ecd --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_14.js @@ -0,0 +1,32 @@ +var searchData= +[ + ['uniformpointscatter',['UniformPointScatter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1UniformPointScatter.html#a72730b4f15d24f8fbf00c41636fb24b3',1,'openvdb::v3_2_0::tools::UniformPointScatter::UniformPointScatter(PointAccessorType &points, Index64 pointCount, RandomGenerator &randGen, InterruptType *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1UniformPointScatter.html#a4f3203350c74367e36aad40e1a305a2f',1,'openvdb::v3_2_0::tools::UniformPointScatter::UniformPointScatter(PointAccessorType &points, float pointsPerVolume, RandomGenerator &randGen, InterruptType *interrupt=NULL)']]], + ['uniformprimbuilder',['UniformPrimBuilder',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UniformPrimBuilder.html#a984fb4caa38f43010c993da6d0b61055',1,'openvdb::v3_2_0::tools::internal::UniformPrimBuilder']]], + ['uniformscalemap',['UniformScaleMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#a7bcdd97a9b4d189dd3a179a844db60e0',1,'openvdb::v3_2_0::math::UniformScaleMap::UniformScaleMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#a3528d6f4efb25f7eab4d5969991607b3',1,'openvdb::v3_2_0::math::UniformScaleMap::UniformScaleMap(double scale)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#ae97706e4dc9c99adbfcc8817d359c37a',1,'openvdb::v3_2_0::math::UniformScaleMap::UniformScaleMap(const UniformScaleMap &other)']]], + ['uniformscaletranslatemap',['UniformScaleTranslateMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#aedb9214b218332921bc3aeadb3040055',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::UniformScaleTranslateMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#a8629e7653eff3ed73d6c926d36915c64',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::UniformScaleTranslateMap(double scale, const Vec3d &translate)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#aa4219d4701a6d8cb3352ab46d19548c9',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::UniformScaleTranslateMap(const UniformScaleMap &scale, const TranslationMap &translate)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#a3dc4bf2db1a818113f4b99dd062221c0',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::UniformScaleTranslateMap(const UniformScaleTranslateMap &other)']]], + ['uninitialize',['uninitialize',['../namespaceopenvdb_1_1v3__2__0.html#a2146c402763d2083437538279eba3e7c',1,'openvdb::v3_2_0']]], + ['unionvaluemasks',['UnionValueMasks',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1UnionValueMasks.html#ab2a5556f36415d1d97b27470b304387c',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::UnionValueMasks']]], + ['uniqueinactivevalues',['uniqueInactiveValues',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a136006bbdda1e616071dba827c34be79',1,'openvdb::v3_2_0::tools']]], + ['uniquename',['uniqueName',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a042c13a7b052c1c78e3b975b31aa59e3',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['unit',['unit',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a734342d43def849fdb0c7d73a1589fd4',1,'openvdb::v3_2_0::math::Quat::unit()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a266e8e802c38dad978f002776d565832',1,'openvdb::v3_2_0::math::Vec2::unit(T eps=0) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a4a3b6f7b1801c039c67b45b267015cf2',1,'openvdb::v3_2_0::math::Vec2::unit(T eps, T &len) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a6db66d00a325585eca99aef9951993bd',1,'openvdb::v3_2_0::math::Vec3::unit(T eps=0) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a3d3ef3ff0a90d9802d2e9767e034656e',1,'openvdb::v3_2_0::math::Vec3::unit(T eps, T &len) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#abd394719639cabb1263d512be286f81c',1,'openvdb::v3_2_0::math::Vec4::unit(T eps=0) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a00e9c9c1e2aa02e82c5c5f29744e7805',1,'openvdb::v3_2_0::math::Vec4::unit(T eps, T &len) const '],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a92e53d06b9ea9075d9b33a2b600720d0',1,'openvdb::v3_2_0::math::unit(const MatType &mat, typename MatType::value_type eps=1.0e-8)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab475125149e2de674468751f9da7c3f1',1,'openvdb::v3_2_0::math::unit(const MatType &in, typename MatType::value_type eps, Vec3< typename MatType::value_type > &scaling)']]], + ['unitarymap',['UnitaryMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#ac64cc0340e36e70e0de20c0b58fed0d8',1,'openvdb::v3_2_0::math::UnitaryMap::UnitaryMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a882bbdb43bc2154565c3694b070fdb13',1,'openvdb::v3_2_0::math::UnitaryMap::UnitaryMap(const Vec3d &axis, double radians)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a9b514134b8b2cc386e60c6954a8949be',1,'openvdb::v3_2_0::math::UnitaryMap::UnitaryMap(Axis axis, double radians)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#aef71dc5f448f8d742082c109b24ee51d',1,'openvdb::v3_2_0::math::UnitaryMap::UnitaryMap(const Mat3d &m)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a3f1c3ad7407a9fed2b0360429a76a7f2',1,'openvdb::v3_2_0::math::UnitaryMap::UnitaryMap(const Mat4d &m)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#abeebf3f9938f7294debee94e46b53079',1,'openvdb::v3_2_0::math::UnitaryMap::UnitaryMap(const UnitaryMap &other)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#af07b4cb7b5d5afea6d5f69a05e404472',1,'openvdb::v3_2_0::math::UnitaryMap::UnitaryMap(const UnitaryMap &first, const UnitaryMap &second)']]], + ['unittoworld',['unitToWorld',['../classopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1LegacyFrustum.html#a8d133d36ae7600a429fcee4c6d161cd1',1,'openvdb::v3_2_0::math::internal::LegacyFrustum']]], + ['unknownmetadata',['UnknownMetadata',['../classopenvdb_1_1v3__2__0_1_1UnknownMetadata.html#a207888c54dec727ec87339385193be54',1,'openvdb::v3_2_0::UnknownMetadata']]], + ['unpack',['unpack',['../classopenvdb_1_1v3__2__0_1_1math_1_1QuantizedUnitVec.html#a380d7f4c5f08c980f560bdd3584f70d5',1,'openvdb::v3_2_0::math::QuantizedUnitVec']]], + ['unpackpoint',['unpackPoint',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#acab56c45850f15a1ddd6950bd798fbcf',1,'openvdb::v3_2_0::tools::internal']]], + ['unregistergrid',['unregisterGrid',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#aa275e35634a4e443a0804acb5f2cb0ac',1,'openvdb::v3_2_0::GridBase::unregisterGrid()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#adf3063b7ed272d322fdf4758fa3a70a7',1,'openvdb::v3_2_0::Grid::unregisterGrid()']]], + ['unregistermap',['unregisterMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapRegistry.html#a2271767b937f9bfdb1fbf3f7d0596af7',1,'openvdb::v3_2_0::math::MapRegistry']]], + ['unregistertype',['unregisterType',['../classopenvdb_1_1v3__2__0_1_1Metadata.html#ac36e5e8693aa2d6456d00c2bc68fd077',1,'openvdb::v3_2_0::Metadata::unregisterType()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a885f39d1666cf6461877ffc11949cb50',1,'openvdb::v3_2_0::TypedMetadata::unregisterType()']]], + ['unsetchildnode',['unsetChildNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aec7c1f8ba3b65cdaeb6030d5c8b5011f',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['unsetitem',['unsetItem',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DenseIter.html#a7984d3fc11284442b2e47343d93072d1',1,'openvdb::v3_2_0::tree::InternalNode::DenseIter::unsetItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#af754cdfbc3961357dbf7c4280a18cc7a',1,'openvdb::v3_2_0::tree::DenseIteratorBase::unsetItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1DenseIter.html#a7984d3fc11284442b2e47343d93072d1',1,'openvdb::v3_2_0::tree::LeafNode::DenseIter::unsetItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1DenseIter.html#a23194ff4a01a3982dc536c1670e84452',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::DenseIter::unsetItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1DenseIter.html#a23194ff4a01a3982dc536c1670e84452',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::DenseIter::unsetItem()']]], + ['unzipfromstream',['unzipFromStream',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#abe3d337b2ef858b0bc4769e5973962dc',1,'openvdb::v3_2_0::io']]], + ['update',['update',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1MaskManager.html#ac5c54df7ed3b930268c8d7752c101725',1,'openvdb::v3_2_0::tools::Morphology::MaskManager::update()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1UpdateMasks.html#ac5c54df7ed3b930268c8d7752c101725',1,'openvdb::v3_2_0::tools::Morphology::UpdateMasks::update()']]], + ['updatebackpointers',['updateBackPointers',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a7ea63781e021eb8be8c9c7d1ac7be5bd',1,'openvdb::v3_2_0::tree::IterListItem::updateBackPointers()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a8dd4e90b61aa818e76d563826a85f43e',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::updateBackPointers()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a7ea63781e021eb8be8c9c7d1ac7be5bd',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::updateBackPointers()']]], + ['updateddistnodes',['updatedDistNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#ae735db2955c8bef664d98dcf661eaf55',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband']]], + ['updatedindexnodes',['updatedIndexNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#a3c3a03a17e4dd0c077ff0155068126af',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband']]], + ['updatefromlevel',['updateFromLevel',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#a11dc96378f417203ae0791a5022005f0',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator']]], + ['updatemasks',['UpdateMasks',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1UpdateMasks.html#a95b7fefaff0e6c43af6b82651b66659d',1,'openvdb::v3_2_0::tools::Morphology::UpdateMasks']]], + ['updatepoints',['UpdatePoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UpdatePoints.html#a91397e1b9f6dbf06c8560925b7d2b555',1,'openvdb::v3_2_0::tools::internal::UpdatePoints::UpdatePoints(const Vec4s &sphere, const std::vector< Vec3R > &points, std::vector< float > &distances, std::vector< unsigned char > &mask, bool overlapping)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UpdatePoints.html#aa75f69cc58926c0df1f0d1d856cab345',1,'openvdb::v3_2_0::tools::internal::UpdatePoints::UpdatePoints(UpdatePoints &, tbb::split)']]], + ['updateresultactive',['updateResultActive',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a56ca9dc74d2f8df6b96a32a9ac4ed728',1,'openvdb::v3_2_0::CombineArgs']]], + ['uppermatrix',['upperMatrix',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#a9305d5b31c30ce2f43df9c64aab93c6f',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_15.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_15.html new file mode 100644 index 00000000..db42d806 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_15.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_15.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_15.js new file mode 100644 index 00000000..ac80bb9c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_15.js @@ -0,0 +1,53 @@ +var searchData= +[ + ['valid',['valid',['../structopenvdb_1_1v3__2__0_1_1math_1_1Ray_1_1TimeSpan.html#a7f7c402461c78df06683bba5f4f4f35d',1,'openvdb::v3_2_0::math::Ray::TimeSpan::valid()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a163e52144c2d51801e3b2999d4f13296',1,'openvdb::v3_2_0::math::Ray::valid()']]], + ['validateintersectingvoxels',['ValidateIntersectingVoxels',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ValidateIntersectingVoxels.html#a85415620a7fda315ef3455c76b19fd25',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ValidateIntersectingVoxels']]], + ['validpartitioningop',['ValidPartitioningOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1ValidPartitioningOp.html#a1cea3bf73865d3dbb06ee95441686546',1,'openvdb::v3_2_0::tools::point_index_grid_internal::ValidPartitioningOp']]], + ['value',['value',['../structopenvdb_1_1v3__2__0_1_1math_1_1Tolerance.html#a0d4a3589a46d330e57d90da61dcf2510',1,'openvdb::v3_2_0::math::Tolerance::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Tolerance_3_01float_01_4.html#ad01a58509108920977f839f36046aa79',1,'openvdb::v3_2_0::math::Tolerance< float >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Tolerance_3_01double_01_4.html#a2054729453134a4eb594b51a6d9bb7ba',1,'openvdb::v3_2_0::math::Tolerance< double >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Delta.html#a0d4a3589a46d330e57d90da61dcf2510',1,'openvdb::v3_2_0::math::Delta::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Delta_3_01float_01_4.html#ad01a58509108920977f839f36046aa79',1,'openvdb::v3_2_0::math::Delta< float >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1Delta_3_01double_01_4.html#a2054729453134a4eb594b51a6d9bb7ba',1,'openvdb::v3_2_0::math::Delta< double >::value()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#ab49416ba38b750a3ac3a320185f5224f',1,'openvdb::v3_2_0::TypedMetadata::value()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a20f4a96fd8932e0b4d89c65f95991bc9',1,'openvdb::v3_2_0::TypedMetadata::value() const ']]], + ['valueaccessor',['ValueAccessor',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a116ce48fb2f8350d31950944c3ff6ead',1,'openvdb::v3_2_0::tree::ValueAccessor::ValueAccessor(TreeType &tree)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#aebc7997cdda9421399e1075894bb5d38',1,'openvdb::v3_2_0::tree::ValueAccessor::ValueAccessor(const ValueAccessor &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_010_00_01tbb_1_1null__mutex_01_4.html#a116ce48fb2f8350d31950944c3ff6ead',1,'openvdb::v3_2_0::tree::ValueAccessor< TreeType, IsSafe, 0, tbb::null_mutex >::ValueAccessor(TreeType &tree)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_010_00_01tbb_1_1null__mutex_01_4.html#aebc7997cdda9421399e1075894bb5d38',1,'openvdb::v3_2_0::tree::ValueAccessor< TreeType, IsSafe, 0, tbb::null_mutex >::ValueAccessor(const ValueAccessor &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_011_00_01tbb_1_1null__mutex_01_4.html#a116ce48fb2f8350d31950944c3ff6ead',1,'openvdb::v3_2_0::tree::ValueAccessor< TreeType, IsSafe, 1, tbb::null_mutex >::ValueAccessor(TreeType &tree)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_011_00_01tbb_1_1null__mutex_01_4.html#aebc7997cdda9421399e1075894bb5d38',1,'openvdb::v3_2_0::tree::ValueAccessor< TreeType, IsSafe, 1, tbb::null_mutex >::ValueAccessor(const ValueAccessor &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_012_00_01tbb_1_1null__mutex_01_4.html#a116ce48fb2f8350d31950944c3ff6ead',1,'openvdb::v3_2_0::tree::ValueAccessor< TreeType, IsSafe, 2, tbb::null_mutex >::ValueAccessor(TreeType &tree)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_012_00_01tbb_1_1null__mutex_01_4.html#aebc7997cdda9421399e1075894bb5d38',1,'openvdb::v3_2_0::tree::ValueAccessor< TreeType, IsSafe, 2, tbb::null_mutex >::ValueAccessor(const ValueAccessor &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_013_00_01tbb_1_1null__mutex_01_4.html#a116ce48fb2f8350d31950944c3ff6ead',1,'openvdb::v3_2_0::tree::ValueAccessor< TreeType, IsSafe, 3, tbb::null_mutex >::ValueAccessor(TreeType &tree)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_013_00_01tbb_1_1null__mutex_01_4.html#aebc7997cdda9421399e1075894bb5d38',1,'openvdb::v3_2_0::tree::ValueAccessor< TreeType, IsSafe, 3, tbb::null_mutex >::ValueAccessor(const ValueAccessor &other)']]], + ['valueaccessor0',['ValueAccessor0',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a8782c66fa07403a3e44ad67cea8feb2f',1,'openvdb::v3_2_0::tree::ValueAccessor0::ValueAccessor0(TreeType &tree)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a21f67fb1a0dac36e48ec3e44f8156c15',1,'openvdb::v3_2_0::tree::ValueAccessor0::ValueAccessor0(const ValueAccessor0 &other)']]], + ['valueaccessor1',['ValueAccessor1',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a3e327a85ecdd80fc7af1bcd97e30ea98',1,'openvdb::v3_2_0::tree::ValueAccessor1::ValueAccessor1(TreeType &tree)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a7b8f335eac198547a58461c60b5f098b',1,'openvdb::v3_2_0::tree::ValueAccessor1::ValueAccessor1(const ValueAccessor1 &other)']]], + ['valueaccessor2',['ValueAccessor2',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a9fa490a3bd89ffe85f09b5a254107018',1,'openvdb::v3_2_0::tree::ValueAccessor2::ValueAccessor2(TreeType &tree)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a53df26beeb3906c4e093770a9bace8f0',1,'openvdb::v3_2_0::tree::ValueAccessor2::ValueAccessor2(const ValueAccessor2 &other)']]], + ['valueaccessor3',['ValueAccessor3',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#abb84c834d627a3f75e041ce11c2a2de7',1,'openvdb::v3_2_0::tree::ValueAccessor3::ValueAccessor3(TreeType &tree)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a049125ff6087e0d923e64d41af716038',1,'openvdb::v3_2_0::tree::ValueAccessor3::ValueAccessor3(const ValueAccessor3 &other)']]], + ['valueaccessorbase',['ValueAccessorBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html#a6b76e06e2b45f60501ab02c1ad771df0',1,'openvdb::v3_2_0::tree::ValueAccessorBase::ValueAccessorBase(TreeType &tree)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html#a356f19169f7ac91f39136cfa11f21dcb',1,'openvdb::v3_2_0::tree::ValueAccessorBase::ValueAccessorBase(const ValueAccessorBase &other)']]], + ['valueaccessorrw',['ValueAccessorRW',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorRW.html#af48337af913df417075b5ed0bb363bba',1,'openvdb::v3_2_0::tree::ValueAccessorRW']]], + ['valuebuffer',['ValueBuffer',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ValueBuffer.html#ae5445065c4024c92b6447a58fd1924c7',1,'openvdb::v3_2_0::util::PagedArray::ValueBuffer::ValueBuffer(PagedArray &parent)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ValueBuffer.html#abde8e2defcb4060f05fe66fdfdcbf5a4',1,'openvdb::v3_2_0::util::PagedArray::ValueBuffer::ValueBuffer(const ValueBuffer &other)']]], + ['valuecount',['valueCount',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#ad77d26da96fa8952ea726f1c3ec45f75',1,'openvdb::v3_2_0::tools::Dense::valueCount()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Diagnose.html#ad77d26da96fa8952ea726f1c3ec45f75',1,'openvdb::v3_2_0::tools::Diagnose::valueCount()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#ad77d26da96fa8952ea726f1c3ec45f75',1,'openvdb::v3_2_0::tools::CheckLevelSet::valueCount()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#ad77d26da96fa8952ea726f1c3ec45f75',1,'openvdb::v3_2_0::tools::CheckFogVolume::valueCount()']]], + ['valueerror',['ValueError',['../classopenvdb_1_1v3__2__0_1_1ValueError.html#ad73901f9e28f03f78223924c6db23e92',1,'openvdb::v3_2_0::ValueError::ValueError()'],['../classopenvdb_1_1v3__2__0_1_1ValueError.html#a4b55707136361d9fb6ae120801285b26',1,'openvdb::v3_2_0::ValueError::ValueError(const std::string &msg)']]], + ['valueiter',['ValueIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ValueIter.html#ac32fdb47bf9c1af4d331ac790261bf18',1,'openvdb::v3_2_0::tree::InternalNode::ValueIter::ValueIter()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ValueIter.html#a7615241b824041990e563ff99340db71',1,'openvdb::v3_2_0::tree::InternalNode::ValueIter::ValueIter(const MaskIterT &iter, NodeT *parent)'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueIter.html#ac32fdb47bf9c1af4d331ac790261bf18',1,'openvdb::v3_2_0::tree::LeafNode::ValueIter::ValueIter()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueIter.html#a7615241b824041990e563ff99340db71',1,'openvdb::v3_2_0::tree::LeafNode::ValueIter::ValueIter(const MaskIterT &iter, NodeT *parent)'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ValueIter.html#ac32fdb47bf9c1af4d331ac790261bf18',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter::ValueIter()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ValueIter.html#a7615241b824041990e563ff99340db71',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter::ValueIter(const MaskIterT &iter, NodeT *parent)'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ValueIter.html#ac32fdb47bf9c1af4d331ac790261bf18',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter::ValueIter()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ValueIter.html#a7615241b824041990e563ff99340db71',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter::ValueIter(const MaskIterT &iter, NodeT *parent)']]], + ['valuemask',['valueMask',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a7f0ba50e7615b08b2238d9f94b7cd721',1,'openvdb::v3_2_0::tree::LeafNode::valueMask()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a7f0ba50e7615b08b2238d9f94b7cd721',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::valueMask()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a7f0ba50e7615b08b2238d9f94b7cd721',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::valueMask()']]], + ['valuetype',['valueType',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a01a396e41a8f7deb454d75523d7deea5',1,'openvdb::v3_2_0::GridBase::valueType()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a10c2f063ec40c9930da48d8d00bf9f9f',1,'openvdb::v3_2_0::Grid::valueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a01a396e41a8f7deb454d75523d7deea5',1,'openvdb::v3_2_0::tree::TreeBase::valueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a10c2f063ec40c9930da48d8d00bf9f9f',1,'openvdb::v3_2_0::tree::Tree::valueType()']]], + ['var',['var',['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#aa00da7f3d525461f6a1e6992f60c71f8',1,'openvdb::v3_2_0::math::Stats']]], + ['variance',['variance',['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#a8ca2b77cf0a83e10d4dab0f029c8e526',1,'openvdb::v3_2_0::math::Stats']]], + ['vec2',['Vec2',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a1ab54d75ff36ed23a47e9229039c825d',1,'openvdb::v3_2_0::math::Vec2::Vec2()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a6d5f200d93b519fdac0ce6071e26bd68',1,'openvdb::v3_2_0::math::Vec2::Vec2(T val)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a154f25722c69f6247edf36c094f7890b',1,'openvdb::v3_2_0::math::Vec2::Vec2(T x, T y)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a59caa1ec77ca9cd3be1ac1c67876d304',1,'openvdb::v3_2_0::math::Vec2::Vec2(Source *a)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ab6a86d1cf954bf78d4c0ce869a8f3840',1,'openvdb::v3_2_0::math::Vec2::Vec2(const Tuple< 2, Source > &t)']]], + ['vec3',['Vec3',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a9776ee60566203dbcdc410d8a28edfce',1,'openvdb::v3_2_0::math::Vec3::Vec3()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a624bfb8d71ad4fda4d4c1ed2aa0f96ac',1,'openvdb::v3_2_0::math::Vec3::Vec3(T val)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a4c6dc0fa5f7ec53cb8aa76c2ffd43b81',1,'openvdb::v3_2_0::math::Vec3::Vec3(T x, T y, T z)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a32029d0dd4c438649f80d3373c1d2043',1,'openvdb::v3_2_0::math::Vec3::Vec3(Source *a)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ab0c4f48ebe1eff45eb504eed2dfd5a2a',1,'openvdb::v3_2_0::math::Vec3::Vec3(const Tuple< 3, Source > &v)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a8ddb7a8578160df492f1360ec41503c7',1,'openvdb::v3_2_0::math::Vec3::Vec3(const Vec3< Other > &v)']]], + ['vec4',['Vec4',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#af1ab5af804d206e7bf9bcd28a8348d07',1,'openvdb::v3_2_0::math::Vec4::Vec4()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#aeaf3fd22aabebaaade719289d96c3d35',1,'openvdb::v3_2_0::math::Vec4::Vec4(T val)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a3f8da0a2d62ec25029e9d7e67a8a3aa1',1,'openvdb::v3_2_0::math::Vec4::Vec4(T x, T y, T z, T w)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a10148ec570f617b748e083a9306c4cc4',1,'openvdb::v3_2_0::math::Vec4::Vec4(Source *a)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a000f4154a86d863526d5a792190aae60',1,'openvdb::v3_2_0::math::Vec4::Vec4(const Tuple< 4, Source > &v)']]], + ['vector',['Vector',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a4df026156780bc0ca651c342b7d6daa4',1,'openvdb::v3_2_0::math::pcg::Vector::Vector()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#acf25366c019369e7c99ffba5200d9702',1,'openvdb::v3_2_0::math::pcg::Vector::Vector(SizeType n)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a777eb104319990ff13354c1fc61e1b80',1,'openvdb::v3_2_0::math::pcg::Vector::Vector(SizeType n, const ValueType &val)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a7b597e37362cee724912b3402bbea4ba',1,'openvdb::v3_2_0::math::pcg::Vector::Vector(const Vector &)']]], + ['vectormultiply',['vectorMultiply',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a6d24a8051e2a72354e008f24164a95d8',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::vectorMultiply(const Vector< VecValueType > &inVec, Vector< VecValueType > &resultVec) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#ae14fb3f40f158bf5ede8e73de003119a',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::vectorMultiply(const VecValueType *inVec, VecValueType *resultVec) const ']]], + ['vectypedescription',['vecTypeDescription',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a2df84a78e49bd372fc62b509b7e74977',1,'openvdb::v3_2_0::GridBase']]], + ['vectypeexamples',['vecTypeExamples',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a7baa8b9c39c23acbdeb652d27d0ffabe',1,'openvdb::v3_2_0::GridBase']]], + ['vectypetostring',['vecTypeToString',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a48b75f7af594fa903f27535ca00c0ee6',1,'openvdb::v3_2_0::GridBase']]], + ['velocityintegrator',['VelocityIntegrator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocityIntegrator.html#a7518ad552ac6f3b1874f65462d2ded1b',1,'openvdb::v3_2_0::tools::VelocityIntegrator']]], + ['velocitysampler',['VelocitySampler',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocitySampler.html#a8a94b489b62182f3d7aec612a81cfa62',1,'openvdb::v3_2_0::tools::VelocitySampler::VelocitySampler(const GridT &grid)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocitySampler.html#ae3babf2322c2c430e7fff87a2c3c1fd1',1,'openvdb::v3_2_0::tools::VelocitySampler::VelocitySampler(const VelocitySampler &other)']]], + ['version',['version',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a74fde2dcc73016d9f02eba2a83ca5e9b',1,'openvdb::v3_2_0::io::Archive']]], + ['versionid',['VersionId',['../structopenvdb_1_1v3__2__0_1_1VersionId.html#aa01fd800dfc9a6d15bf18cb5cc6351e4',1,'openvdb::v3_2_0::VersionId::VersionId()'],['../structopenvdb_1_1v3__2__0_1_1VersionId.html#aac21fae8e04dceb4d0a606e0933e4cfe',1,'openvdb::v3_2_0::VersionId::VersionId(uint32_t major, uint32_t minor)']]], + ['vertexcount',['vertexCount',['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadAndTriangleDataAdapter.html#a4e4b6c1e7d2917357d6ad1ee5e776789',1,'openvdb::v3_2_0::tools::QuadAndTriangleDataAdapter']]], + ['visit',['visit',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a028a58e937882a91e9c1470fb6e73b42',1,'openvdb::v3_2_0::tree::InternalNode::visit(VisitorOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ac6e62589958cedae5c2cd4b356f6ba7a',1,'openvdb::v3_2_0::tree::InternalNode::visit(VisitorOp &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a028a58e937882a91e9c1470fb6e73b42',1,'openvdb::v3_2_0::tree::LeafNode::visit(VisitorOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ac6e62589958cedae5c2cd4b356f6ba7a',1,'openvdb::v3_2_0::tree::LeafNode::visit(VisitorOp &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a028a58e937882a91e9c1470fb6e73b42',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::visit(VisitorOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ac6e62589958cedae5c2cd4b356f6ba7a',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::visit(VisitorOp &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a028a58e937882a91e9c1470fb6e73b42',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::visit(VisitorOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ac6e62589958cedae5c2cd4b356f6ba7a',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::visit(VisitorOp &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a028a58e937882a91e9c1470fb6e73b42',1,'openvdb::v3_2_0::tree::RootNode::visit(VisitorOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ac6e62589958cedae5c2cd4b356f6ba7a',1,'openvdb::v3_2_0::tree::RootNode::visit(VisitorOp &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a92fa8714e1d4021da4f150b5e24385a0',1,'openvdb::v3_2_0::tree::Tree::visit(VisitorOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ab5edcc00e9c808a70cf54f70d1c6cf1c',1,'openvdb::v3_2_0::tree::Tree::visit(const VisitorOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ae3bfd775ca5152411cc28fa5f6d95ea3',1,'openvdb::v3_2_0::tree::Tree::visit(VisitorOp &op) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a085768d7b5762ac5be343ba82fe666a6',1,'openvdb::v3_2_0::tree::Tree::visit(const VisitorOp &op) const ']]], + ['visit2',['visit2',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a3595aa225add4df3db17545b9250cd6d',1,'openvdb::v3_2_0::tree::InternalNode::visit2(IterT &otherIter, VisitorOp &, bool otherIsLHS=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a7de0cadde4e5ded9ae2fff73126718d7',1,'openvdb::v3_2_0::tree::InternalNode::visit2(IterT &otherIter, VisitorOp &, bool otherIsLHS=false) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a3595aa225add4df3db17545b9250cd6d',1,'openvdb::v3_2_0::tree::LeafNode::visit2(IterT &otherIter, VisitorOp &, bool otherIsLHS=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a7de0cadde4e5ded9ae2fff73126718d7',1,'openvdb::v3_2_0::tree::LeafNode::visit2(IterT &otherIter, VisitorOp &, bool otherIsLHS=false) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a3595aa225add4df3db17545b9250cd6d',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::visit2(IterT &otherIter, VisitorOp &, bool otherIsLHS=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a7de0cadde4e5ded9ae2fff73126718d7',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::visit2(IterT &otherIter, VisitorOp &, bool otherIsLHS=false) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a3595aa225add4df3db17545b9250cd6d',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::visit2(IterT &otherIter, VisitorOp &, bool otherIsLHS=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a7de0cadde4e5ded9ae2fff73126718d7',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::visit2(IterT &otherIter, VisitorOp &, bool otherIsLHS=false) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a7c5dff97dd17f56a711d483615450d73',1,'openvdb::v3_2_0::tree::RootNode::visit2(OtherRootNodeType &other, VisitorOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a1d81485014bea7517cbbf9e22a31d57e',1,'openvdb::v3_2_0::tree::RootNode::visit2(OtherRootNodeType &other, VisitorOp &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a3a669237d39f3536882fd6c16fb32fde',1,'openvdb::v3_2_0::tree::Tree::visit2(OtherTreeType &other, VisitorOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ada17792f9a96a8fd4f9dd881840a036b',1,'openvdb::v3_2_0::tree::Tree::visit2(OtherTreeType &other, const VisitorOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a0746c8bcd8bbb9b38e4296eb5a61acf0',1,'openvdb::v3_2_0::tree::Tree::visit2(OtherTreeType &other, VisitorOp &op) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a741d508246ebbff1b95bea8134b49304',1,'openvdb::v3_2_0::tree::Tree::visit2(OtherTreeType &other, const VisitorOp &op) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a950584ca06c9d4c5d5b6fede669ccd90',1,'openvdb::v3_2_0::tree::InternalNode::visit2(OtherChildAllIterType &otherIter, VisitorOp &op, bool otherIsLHS)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a65d1c12fd73ec28ff666e8878ebace5c',1,'openvdb::v3_2_0::tree::InternalNode::visit2(OtherChildAllIterType &otherIter, VisitorOp &op, bool otherIsLHS) const ']]], + ['visit2node',['visit2Node',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#afa68756dbd8a216cdc248d4e828927ee',1,'openvdb::v3_2_0::tree::InternalNode::visit2Node(OtherNodeType &other, VisitorOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a2891ea5e9fa708cc8c72bfeddb24eaf4',1,'openvdb::v3_2_0::tree::InternalNode::visit2Node(OtherNodeType &other, VisitorOp &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#afebf069af81c222a7df5312eac33f8e3',1,'openvdb::v3_2_0::tree::LeafNode::visit2Node(OtherLeafNodeType &other, VisitorOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a70f885c0c49227a5269466d121eb85ec',1,'openvdb::v3_2_0::tree::LeafNode::visit2Node(OtherLeafNodeType &other, VisitorOp &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#afebf069af81c222a7df5312eac33f8e3',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::visit2Node(OtherLeafNodeType &other, VisitorOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a70f885c0c49227a5269466d121eb85ec',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::visit2Node(OtherLeafNodeType &other, VisitorOp &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#afebf069af81c222a7df5312eac33f8e3',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::visit2Node(OtherLeafNodeType &other, VisitorOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a70f885c0c49227a5269466d121eb85ec',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::visit2Node(OtherLeafNodeType &other, VisitorOp &) const ']]], + ['visitactivebbox',['visitActiveBBox',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a973ced84fe7b684d6be0acb5cef74c33',1,'openvdb::v3_2_0::tree::InternalNode::visitActiveBBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a973ced84fe7b684d6be0acb5cef74c33',1,'openvdb::v3_2_0::tree::LeafNode::visitActiveBBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a973ced84fe7b684d6be0acb5cef74c33',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::visitActiveBBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a973ced84fe7b684d6be0acb5cef74c33',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::visitActiveBBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a973ced84fe7b684d6be0acb5cef74c33',1,'openvdb::v3_2_0::tree::RootNode::visitActiveBBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#afd30b68bce6aa6ec6de2441d995a5f56',1,'openvdb::v3_2_0::tree::Tree::visitActiveBBox()']]], + ['volume',['volume',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#aff8b0a9c33439141616416dd5b1bd2a0',1,'openvdb::v3_2_0::math::BBox::volume()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a5226e1e3ee32005e374d1e8f31a659f4',1,'openvdb::v3_2_0::math::CoordBBox::volume()']]], + ['volumeadvection',['VolumeAdvection',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#ae346a7a7e4b3633a3ead6cd63d9a5ee6',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['volumehdda',['VolumeHDDA',['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA.html#a58bf62c59fa34bebd98138762ad16ef7',1,'openvdb::v3_2_0::math::VolumeHDDA::VolumeHDDA()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA_3_01TreeT_00_01RayT_00_010_01_4.html#a58bf62c59fa34bebd98138762ad16ef7',1,'openvdb::v3_2_0::math::VolumeHDDA< TreeT, RayT, 0 >::VolumeHDDA()']]], + ['volumerayintersector',['VolumeRayIntersector',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#acc2eb737e1348af8e047b664342d8d3c',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::VolumeRayIntersector(const GridT &grid, int dilationCount=0)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a364ed92c181c4ff4a63e1ff1a25a69dc',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::VolumeRayIntersector(const GridT &grid, const math::CoordBBox &bbox)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a29e1f089dca8c274ca7edb56c7c1b710',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::VolumeRayIntersector(const VolumeRayIntersector &other)']]], + ['volumerender',['VolumeRender',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#af722913dc6cf750d9cc6d9d0bc846850',1,'openvdb::v3_2_0::tools::VolumeRender::VolumeRender(const IntersectorT &inter, BaseCamera &camera)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#ac0c412db63ca55b976ebeb5bd697eb5b',1,'openvdb::v3_2_0::tools::VolumeRender::VolumeRender(const VolumeRender &other)']]], + ['volumetomesh',['VolumeToMesh',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#a3495f7d8bf339cf90328eeb164ef1f0d',1,'openvdb::v3_2_0::tools::VolumeToMesh::VolumeToMesh()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a2641c8c08ca3ed3bf4cea4d9b52434b5',1,'openvdb::v3_2_0::tools::volumeToMesh(const GridType &grid, std::vector< Vec3s > &points, std::vector< Vec4I > &quads, double isovalue=0.0)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#afdc87629a329fe18c363c7fdd307e44e',1,'openvdb::v3_2_0::tools::volumeToMesh(const GridType &grid, std::vector< Vec3s > &points, std::vector< Vec3I > &triangles, std::vector< Vec4I > &quads, double isovalue=0.0, double adaptivity=0.0)']]], + ['voxel',['voxel',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#a0626bd36394e7f97a5a0aa3b1f80e142',1,'openvdb::v3_2_0::math::DDA']]], + ['voxelizationdata',['VoxelizationData',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#a51c19a4f6e83f7647436834fb69d781d',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData']]], + ['voxelizeactivetiles',['VoxelizeActiveTiles',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1VoxelizeActiveTiles.html#aeac204607214183a116bec32bc29f81b',1,'openvdb::v3_2_0::tree::InternalNode::VoxelizeActiveTiles::VoxelizeActiveTiles()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a39a2211a02fb606e611d3ff5bbd6f50c',1,'openvdb::v3_2_0::tree::InternalNode::voxelizeActiveTiles()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#af001699d1941bcdab67bad29b93496bf',1,'openvdb::v3_2_0::tree::LeafNode::voxelizeActiveTiles()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#af001699d1941bcdab67bad29b93496bf',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::voxelizeActiveTiles()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#af001699d1941bcdab67bad29b93496bf',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::voxelizeActiveTiles()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a39a2211a02fb606e611d3ff5bbd6f50c',1,'openvdb::v3_2_0::tree::RootNode::voxelizeActiveTiles()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a39a2211a02fb606e611d3ff5bbd6f50c',1,'openvdb::v3_2_0::tree::Tree::voxelizeActiveTiles()']]], + ['voxelizepolygons',['VoxelizePolygons',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizePolygons.html#a833a34c76d996c286b0d04aacfa223e4',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizePolygons']]], + ['voxeloffsets',['voxelOffsets',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#aac60aec6c28e6d5e5c8f64335f970343',1,'openvdb::v3_2_0::tools::PointPartitioner']]], + ['voxelorderop',['VoxelOrderOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1VoxelOrderOp.html#ad90d0635e7b39d0c6814ca06d3bb9a3c',1,'openvdb::v3_2_0::tools::point_partitioner_internal::VoxelOrderOp']]], + ['voxelsize',['voxelSize',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#abe11d7ce015c713f29f88fb376e22d0f',1,'openvdb::v3_2_0::GridBase::voxelSize() const '],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#aceaf3414d03c7d2cc6e7189511610308',1,'openvdb::v3_2_0::GridBase::voxelSize(const Vec3d &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a00d3f1aebcb50601369ae330a40daec4',1,'openvdb::v3_2_0::math::MapBase::voxelSize() const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a870b52d53e00b4b503438d2c45de9476',1,'openvdb::v3_2_0::math::MapBase::voxelSize(const Vec3d &) const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#abe11d7ce015c713f29f88fb376e22d0f',1,'openvdb::v3_2_0::math::AffineMap::voxelSize() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a2e8c2b03b96bad45d81b47615b79b158',1,'openvdb::v3_2_0::math::AffineMap::voxelSize(const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#abe11d7ce015c713f29f88fb376e22d0f',1,'openvdb::v3_2_0::math::ScaleMap::voxelSize() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a2e8c2b03b96bad45d81b47615b79b158',1,'openvdb::v3_2_0::math::ScaleMap::voxelSize(const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#abe11d7ce015c713f29f88fb376e22d0f',1,'openvdb::v3_2_0::math::TranslationMap::voxelSize() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a2e8c2b03b96bad45d81b47615b79b158',1,'openvdb::v3_2_0::math::TranslationMap::voxelSize(const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#abe11d7ce015c713f29f88fb376e22d0f',1,'openvdb::v3_2_0::math::ScaleTranslateMap::voxelSize() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a2e8c2b03b96bad45d81b47615b79b158',1,'openvdb::v3_2_0::math::ScaleTranslateMap::voxelSize(const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#abe11d7ce015c713f29f88fb376e22d0f',1,'openvdb::v3_2_0::math::UnitaryMap::voxelSize() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a2e8c2b03b96bad45d81b47615b79b158',1,'openvdb::v3_2_0::math::UnitaryMap::voxelSize(const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#abe11d7ce015c713f29f88fb376e22d0f',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::voxelSize() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a6b472132b2d3c32af617f13f3c27d3cb',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::voxelSize(const Vec3d &loc) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#abe11d7ce015c713f29f88fb376e22d0f',1,'openvdb::v3_2_0::math::GenericMap::voxelSize() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#ab2e80629c6fe6615587296b0bb368fe5',1,'openvdb::v3_2_0::math::GenericMap::voxelSize(const Vec3d &v) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#abe11d7ce015c713f29f88fb376e22d0f',1,'openvdb::v3_2_0::math::Transform::voxelSize() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#aceaf3414d03c7d2cc6e7189511610308',1,'openvdb::v3_2_0::math::Transform::voxelSize(const Vec3d &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a885c6fd118cf0cb17b092c895c632809',1,'openvdb::v3_2_0::tools::LevelSetTracker::voxelSize()']]], + ['voxelvolume',['voxelVolume',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a23d36bbeb278f0e9ff86bc45dbeb1338',1,'openvdb::v3_2_0::math::Transform::voxelVolume() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#ac1238f5ae3f452c0c7bf8a44829ffd3f',1,'openvdb::v3_2_0::math::Transform::voxelVolume(const Vec3d &xyz) const ']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_16.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_16.html new file mode 100644 index 00000000..6004eda9 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_16.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_16.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_16.js new file mode 100644 index 00000000..9a0a1e0a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_16.js @@ -0,0 +1,31 @@ +var searchData= +[ + ['w',['w',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a8e15a41679997ff2315ea91ef1c22eb6',1,'openvdb::v3_2_0::math::Quat::w()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#aff0ce626b476406d185e4b7f9ee8817a',1,'openvdb::v3_2_0::math::Quat::w() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a8e15a41679997ff2315ea91ef1c22eb6',1,'openvdb::v3_2_0::math::Vec4::w()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#aff0ce626b476406d185e4b7f9ee8817a',1,'openvdb::v3_2_0::math::Vec4::w() const ']]], + ['wasinterrupted',['wasInterrupted',['../structopenvdb_1_1v3__2__0_1_1util_1_1NullInterrupter.html#aa48f7d2cdbf6265fdac605a80f0ffa83',1,'openvdb::v3_2_0::util::NullInterrupter::wasInterrupted()'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a05177861de8e8e230e9d3c7449d0f028',1,'openvdb::v3_2_0::util::wasInterrupted()']]], + ['wasinterrupted_3c_20util_3a_3anullinterrupter_20_3e',['wasInterrupted< util::NullInterrupter >',['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a2c55f07e21f1fe44ab8df7529709b5dc',1,'openvdb::v3_2_0::util']]], + ['weno5',['WENO5',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aa6f903a7353a1e44aa02cc7ec727ddf7',1,'openvdb::v3_2_0::math']]], + ['wenostencil',['WenoStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html#a5cc079b43ba291da26f743067ba5c41e',1,'openvdb::v3_2_0::math::WenoStencil::WenoStencil(const GridType &grid)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html#a1f75871793f4ad24f15d2a32fb5570f6',1,'openvdb::v3_2_0::math::WenoStencil::WenoStencil(const GridType &grid, Real dx)']]], + ['what',['what',['../classopenvdb_1_1v3__2__0_1_1Exception.html#aff06f49065b54a8a86e02e9a2441a8ba',1,'openvdb::v3_2_0::Exception']]], + ['width',['width',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Film.html#a20646dd69e82674924c6e5eb1458eefa',1,'openvdb::v3_2_0::tools::Film::width()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#a20646dd69e82674924c6e5eb1458eefa',1,'openvdb::v3_2_0::tools::BaseCamera::width()']]], + ['worldspacesearchandupdate',['worldSpaceSearchAndUpdate',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#af4ceacdb99fbbadd151faa7905fa3e13',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::worldSpaceSearchAndUpdate(const Vec3d &center, double radius, const ParticleArrayType &particles)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#a04e454a1ef7f95171b62ae7f06c2c8eb',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::worldSpaceSearchAndUpdate(const BBoxd &bbox, const ParticleArrayType &particles)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a1c06356526489c1f4b02349b6520b1e4',1,'openvdb::v3_2_0::tools::PointIndexIterator::worldSpaceSearchAndUpdate(const BBoxd &bbox, ConstAccessor &acc, const PointArray &points, const math::Transform &xform)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a19e152cc5aad7904c65846fde346aae1',1,'openvdb::v3_2_0::tools::PointIndexIterator::worldSpaceSearchAndUpdate(const Vec3d &center, double radius, ConstAccessor &acc, const PointArray &points, const math::Transform &xform, bool subvoxelAccuracy=true)']]], + ['worldtoindex',['worldToIndex',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a917d728a21347bc8528cfdcd0cbada38',1,'openvdb::v3_2_0::GridBase::worldToIndex()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a5247ed99a7e4c0540376a85e9c5a10e2',1,'openvdb::v3_2_0::math::Ray::worldToIndex()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a917d728a21347bc8528cfdcd0cbada38',1,'openvdb::v3_2_0::math::Transform::worldToIndex(const Vec3d &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a47df44101e2ffa381199e1cfe34b0512',1,'openvdb::v3_2_0::math::Transform::worldToIndex(const BBoxd &) const ']]], + ['worldtoindexcellcentered',['worldToIndexCellCentered',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a63423207db89c360676357577e25175d',1,'openvdb::v3_2_0::math::Transform::worldToIndexCellCentered(const Vec3d &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a1c9811c714720a6f49e5ba8ed2935c0c',1,'openvdb::v3_2_0::math::Transform::worldToIndexCellCentered(const BBoxd &) const ']]], + ['worldtoindexnodecentered',['worldToIndexNodeCentered',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a759679e3b97bdef29cd3f6941f78372b',1,'openvdb::v3_2_0::math::Transform::worldToIndexNodeCentered(const Vec3d &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#aa23f71d68fc7dfc0cb1bc5c915c3499b',1,'openvdb::v3_2_0::math::Transform::worldToIndexNodeCentered(const BBoxd &) const ']]], + ['write',['write',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#aed0ba80963ef465a7ad3f6a5325ef1ba',1,'openvdb::v3_2_0::io::Archive::write(const GridCPtrVec &, const MetaMap &=MetaMap()) const '],['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a77f2baa6c6933e6f928234cad7ead387',1,'openvdb::v3_2_0::io::Archive::write(std::ostream &, const GridPtrVec &, bool seekable, const MetaMap &=MetaMap()) const '],['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#ab173a2a2b5c3fe7c34c441e6a7fa0aed',1,'openvdb::v3_2_0::io::Archive::write(std::ostream &, const GridCPtrVec &, bool seekable, const MetaMap &=MetaMap()) const '],['../structopenvdb_1_1v3__2__0_1_1io_1_1HalfWriter_3_01false_00_01T_01_4.html#a42264d1aef975ac32de3b8385f7e2871',1,'openvdb::v3_2_0::io::HalfWriter< false, T >::write()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1HalfWriter_3_01true_00_01T_01_4.html#a42264d1aef975ac32de3b8385f7e2871',1,'openvdb::v3_2_0::io::HalfWriter< true, T >::write()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a916750caa82c74d8ffdf5586392ecf18',1,'openvdb::v3_2_0::io::File::write(const GridCPtrVec &, const MetaMap &=MetaMap()) const '],['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#ae24e8652049cfc92878f422febc14923',1,'openvdb::v3_2_0::io::File::write(const GridPtrContainerT &, const MetaMap &=MetaMap()) const '],['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#ab640eece07bc104eecdadb44dadc6e0d',1,'openvdb::v3_2_0::io::Queue::write()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Stream.html#aed0ba80963ef465a7ad3f6a5325ef1ba',1,'openvdb::v3_2_0::io::Stream::write(const GridCPtrVec &, const MetaMap &=MetaMap()) const '],['../classopenvdb_1_1v3__2__0_1_1io_1_1Stream.html#ae24e8652049cfc92878f422febc14923',1,'openvdb::v3_2_0::io::Stream::write(const GridPtrContainerT &, const MetaMap &=MetaMap()) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::BBox::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::Coord::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::CoordBBox::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#ad89260eca3080673fb0b32cbdf2e2e94',1,'openvdb::v3_2_0::math::MapBase::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::AffineMap::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::ScaleMap::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::TranslationMap::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::ScaleTranslateMap::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::UnitaryMap::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::CompoundMap::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::Mat::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::Quat::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a117702c3c46e7e4c3d57266a83b1676b',1,'openvdb::v3_2_0::math::Transform::write()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#a47bfbba234eeeea53f5291f5ba50960c',1,'openvdb::v3_2_0::math::Tuple::write()'],['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a117702c3c46e7e4c3d57266a83b1676b',1,'openvdb::v3_2_0::Metadata::write()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#ad92cb71fb1f4e60d547d1fa1581e73d0',1,'openvdb::v3_2_0::tools::MultiResGrid::write()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a5cb204a06bcda3cdf7a8e1b4cbb2ebc7',1,'openvdb::v3_2_0::io::Queue::write()']]], + ['writebuffers',['writeBuffers',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a232614030046d0a1ce5fc1c3492d06fa',1,'openvdb::v3_2_0::GridBase::writeBuffers()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#aac321e01e966ee2820f7dc6000e368e8',1,'openvdb::v3_2_0::Grid::writeBuffers()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a5fdd39cad592a2719ff782632d923c8d',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::writeBuffers()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a1517c3788b6d11d5e07a577dd38d7c43',1,'openvdb::v3_2_0::tree::InternalNode::writeBuffers()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a5fdd39cad592a2719ff782632d923c8d',1,'openvdb::v3_2_0::tree::LeafNode::writeBuffers()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a1517c3788b6d11d5e07a577dd38d7c43',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::writeBuffers()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a1517c3788b6d11d5e07a577dd38d7c43',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::writeBuffers()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a1517c3788b6d11d5e07a577dd38d7c43',1,'openvdb::v3_2_0::tree::RootNode::writeBuffers()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a4aad71ea53ca3126b0c8f05919e56f7b',1,'openvdb::v3_2_0::tree::TreeBase::writeBuffers()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a8f5393069d4ad644df349f406e722e21',1,'openvdb::v3_2_0::tree::Tree::writeBuffers()']]], + ['writecompressedvalues',['writeCompressedValues',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#acea3ebe161d44af2971c3f9e08ee4e86',1,'openvdb::v3_2_0::io']]], + ['writedata',['writeData',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#ab19408babd2b5dbf83e78d153387fbcc',1,'openvdb::v3_2_0::io']]], + ['writedata_3c_20std_3a_3astring_20_3e',['writeData< std::string >',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#ab4fde24581f070e621bc3cccbe99ffdc',1,'openvdb::v3_2_0::io']]], + ['writegrid',['writeGrid',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a7fa1196219d0b31c839008b6da6b0ba9',1,'openvdb::v3_2_0::io::Archive::writeGrid()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a195e1b783881591e8d00918ccd411593',1,'openvdb::v3_2_0::io::Queue::writeGrid()']]], + ['writegridinstance',['writeGridInstance',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#aa17615bdbdff452ea2fc0b287d3bc506',1,'openvdb::v3_2_0::io::Archive']]], + ['writegridstats',['writeGridStats',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a32d0d8abef8e7b4e3a4c639696f3b194',1,'openvdb::v3_2_0::io::StreamMetadata']]], + ['writeheader',['writeHeader',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a004d22e5fa15e5bbaba11e45ad91eb3e',1,'openvdb::v3_2_0::io::Archive::writeHeader()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a29ebc75a2df80f959126208468796ae7',1,'openvdb::v3_2_0::io::GridDescriptor::writeHeader()']]], + ['writemeta',['writeMeta',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a2ed4f76c42d56ab14a107d1a9f416e11',1,'openvdb::v3_2_0::MetaMap']]], + ['writesize',['writeSize',['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a291a1aac455104c18181903e210670de',1,'openvdb::v3_2_0::Metadata']]], + ['writestreampos',['writeStreamPos',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a98075b82bfd6798c0f81ddcca8eda1d4',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['writestring',['writeString',['../namespaceopenvdb_1_1v3__2__0.html#aaeee21e30b933c7ec9b88fe878613953',1,'openvdb::v3_2_0']]], + ['writetopology',['writeTopology',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a655b98dcf0c818def7e03c71547709ee',1,'openvdb::v3_2_0::GridBase::writeTopology()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a81b4a203cd871e4a5c20ffa1ce9ffa74',1,'openvdb::v3_2_0::Grid::writeTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a72d547afeb73396804509f85ec7043e7',1,'openvdb::v3_2_0::tree::InternalNode::writeTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#acbf55cf38b8c0e0efb2d3b37e2ce5da7',1,'openvdb::v3_2_0::tree::LeafNode::writeTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a72d547afeb73396804509f85ec7043e7',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::writeTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a72d547afeb73396804509f85ec7043e7',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::writeTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a06f55fa18912a20bc669cc8ac4c31ec1',1,'openvdb::v3_2_0::tree::RootNode::writeTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#ac92c39ad78296431214e6261846cebee',1,'openvdb::v3_2_0::tree::TreeBase::writeTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ac92c39ad78296431214e6261846cebee',1,'openvdb::v3_2_0::tree::Tree::writeTopology()']]], + ['writetransform',['writeTransform',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ab205ec138e048f84198f5e6dc1b9a74d',1,'openvdb::v3_2_0::GridBase']]], + ['writevalue',['writeValue',['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a5dc2537ba398d0f29d73870705353c34',1,'openvdb::v3_2_0::Metadata::writeValue()'],['../classopenvdb_1_1v3__2__0_1_1UnknownMetadata.html#a7e6fe3a832a785321c7c3b4320244e3c',1,'openvdb::v3_2_0::UnknownMetadata::writeValue()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a860a61f24d20e4270f8672aed316d1e0',1,'openvdb::v3_2_0::TypedMetadata::writeValue()']]], + ['wssample',['wsSample',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#aa1658d1eed2cb276fc3a8c829ee7df81',1,'openvdb::v3_2_0::tools::GridSampler::wsSample()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html#aa1658d1eed2cb276fc3a8c829ee7df81',1,'openvdb::v3_2_0::tools::GridSampler< tree::ValueAccessor< TreeT >, SamplerType >::wsSample()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_17.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_17.html new file mode 100644 index 00000000..25163060 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_17.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_17.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_17.js new file mode 100644 index 00000000..3e246d07 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_17.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['x',['x',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#ac44bfe62bd5c7e83ba2cf8c5e32dcdf3',1,'openvdb::v3_2_0::math::Coord::x() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#ab7d7264e282b5226e850b95335da509c',1,'openvdb::v3_2_0::math::Coord::x()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#af59136c0fb2c6ccc665bbc1c1f19a751',1,'openvdb::v3_2_0::math::Quat::x()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#afb5cd37bb08f1029691590372e6330f0',1,'openvdb::v3_2_0::math::Quat::x() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#af59136c0fb2c6ccc665bbc1c1f19a751',1,'openvdb::v3_2_0::math::Vec2::x()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#afb5cd37bb08f1029691590372e6330f0',1,'openvdb::v3_2_0::math::Vec2::x() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#af59136c0fb2c6ccc665bbc1c1f19a751',1,'openvdb::v3_2_0::math::Vec3::x()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#afb5cd37bb08f1029691590372e6330f0',1,'openvdb::v3_2_0::math::Vec3::x() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#af59136c0fb2c6ccc665bbc1c1f19a751',1,'openvdb::v3_2_0::math::Vec4::x()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#afb5cd37bb08f1029691590372e6330f0',1,'openvdb::v3_2_0::math::Vec4::x() const ']]], + ['xstride',['xStride',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutZYX_01_4.html#a53d1f076272a373de5790b5be1d98935',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutZYX >::xStride()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutXYZ_01_4.html#ab6b9332a8fa6cc4215313655101a9c69',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutXYZ >::xStride()']]], + ['xyz',['xyz',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#aea931b33d24203984c9afb166d9077ce',1,'openvdb::v3_2_0::tools::MultiResGrid::xyz(const Coord &in_ijk, size_t in_level, size_t out_level)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#aadec32d96253c5bb18d5a04a63a5913a',1,'openvdb::v3_2_0::tools::MultiResGrid::xyz(const Vec3R &in_xyz, size_t in_level, size_t out_level)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a40f02852584cdd5b87f1e02f648646d9',1,'openvdb::v3_2_0::tools::MultiResGrid::xyz(const Vec3R &in_xyz, double in_level, double out_level)']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_18.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_18.html new file mode 100644 index 00000000..6244983c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_18.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_18.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_18.js new file mode 100644 index 00000000..d3c84769 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_18.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['y',['y',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#aa13f1458e75fbfe9f6d72d918cb83ea6',1,'openvdb::v3_2_0::math::Coord::y() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a2ed6c95e8ae6c0fd7580be42ddd68ff4',1,'openvdb::v3_2_0::math::Coord::y()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a67e4fec98374cd34f20fd6896c8760d0',1,'openvdb::v3_2_0::math::Quat::y()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a691c9cb93365c2e33f3429de43244098',1,'openvdb::v3_2_0::math::Quat::y() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a67e4fec98374cd34f20fd6896c8760d0',1,'openvdb::v3_2_0::math::Vec2::y()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a691c9cb93365c2e33f3429de43244098',1,'openvdb::v3_2_0::math::Vec2::y() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a67e4fec98374cd34f20fd6896c8760d0',1,'openvdb::v3_2_0::math::Vec3::y()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a691c9cb93365c2e33f3429de43244098',1,'openvdb::v3_2_0::math::Vec3::y() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a67e4fec98374cd34f20fd6896c8760d0',1,'openvdb::v3_2_0::math::Vec4::y()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a691c9cb93365c2e33f3429de43244098',1,'openvdb::v3_2_0::math::Vec4::y() const ']]], + ['ystride',['yStride',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutZYX_01_4.html#a86f5e0090a3ec6034ff6135fe18cdbcc',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutZYX >::yStride()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutXYZ_01_4.html#a86f5e0090a3ec6034ff6135fe18cdbcc',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutXYZ >::yStride()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_19.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_19.html new file mode 100644 index 00000000..bee3e42f --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_19.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_19.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_19.js new file mode 100644 index 00000000..bb099528 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_19.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['z',['z',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a4cac3137ded0d843799eaf8146504379',1,'openvdb::v3_2_0::math::Coord::z() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a50ad079c561c57401f04c49a97e24568',1,'openvdb::v3_2_0::math::Coord::z()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ae2a77ff292fe571f83c83b3eb2561fa6',1,'openvdb::v3_2_0::math::Quat::z()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a336121cb63ed79fa0a072eed03d694ac',1,'openvdb::v3_2_0::math::Quat::z() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ae2a77ff292fe571f83c83b3eb2561fa6',1,'openvdb::v3_2_0::math::Vec3::z()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a336121cb63ed79fa0a072eed03d694ac',1,'openvdb::v3_2_0::math::Vec3::z() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#ae2a77ff292fe571f83c83b3eb2561fa6',1,'openvdb::v3_2_0::math::Vec4::z()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a336121cb63ed79fa0a072eed03d694ac',1,'openvdb::v3_2_0::math::Vec4::z() const ']]], + ['zero',['zero',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a4be7ea5f6bddc580907b586df9b5c550',1,'openvdb::v3_2_0::math::Mat3::zero()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a860a0abbff4a4a673c9c708f6fd2b49d',1,'openvdb::v3_2_0::math::Mat4::zero()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#af27a503fcdc1b13ced14334239e80604',1,'openvdb::v3_2_0::math::Quat::zero()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ae0ff2e10596aca8cd240ab4790bd445f',1,'openvdb::v3_2_0::math::Vec2::zero()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a1a4eed83d1eca7e9dfccab6d32e5a17d',1,'openvdb::v3_2_0::math::Vec3::zero()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a3f7515e113f138d07d6339bf24298cf1',1,'openvdb::v3_2_0::math::Vec4::zero()']]], + ['zerocrossing',['zeroCrossing',['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#a0280818ad82666d1a61e4d1eb97909f5',1,'openvdb::v3_2_0::math::GradStencil::zeroCrossing()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html#a0280818ad82666d1a61e4d1eb97909f5',1,'openvdb::v3_2_0::math::WenoStencil::zeroCrossing()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ad36ba1c65fdfa8296ef6a4bc2529e786',1,'openvdb::v3_2_0::math::ZeroCrossing()']]], + ['zeroval',['zeroVal',['../namespaceopenvdb_1_1v3__2__0.html#a0abd143fcf96e54df6e7cc16d46e6685',1,'openvdb::v3_2_0']]], + ['zeroval_3c_20bool_20_3e',['zeroVal< bool >',['../namespaceopenvdb_1_1v3__2__0.html#ae4715877ace39f491921d2412457b3e0',1,'openvdb::v3_2_0']]], + ['zeroval_3c_20math_3a_3amat4d_20_3e',['zeroVal< math::Mat4d >',['../namespaceopenvdb_1_1v3__2__0.html#ab75dacd22e55a4b781bfbdeafdb7d541',1,'openvdb::v3_2_0']]], + ['zeroval_3c_20math_3a_3amat4s_20_3e',['zeroVal< math::Mat4s >',['../namespaceopenvdb_1_1v3__2__0.html#a77a8435189ef23bc884739e47caa5d1a',1,'openvdb::v3_2_0']]], + ['zeroval_3c_20std_3a_3astring_20_3e',['zeroVal< std::string >',['../namespaceopenvdb_1_1v3__2__0.html#a5200b545e2e50a9ba3d2a5253ce7fc7b',1,'openvdb::v3_2_0']]], + ['ziptostream',['zipToStream',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a6a0e63b4ca2ad9c1bf154b645cfff3f5',1,'openvdb::v3_2_0::io']]], + ['zstride',['zStride',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutZYX_01_4.html#a9ea37fee356b1ab8767b2cccb3d7ed7b',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutZYX >::zStride()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutXYZ_01_4.html#aa78a2ed40c1175d2ef8697edb1a886ae',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutXYZ >::zStride()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_1a.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_1a.html new file mode 100644 index 00000000..4512536d --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_1a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_1a.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_1a.js new file mode 100644 index 00000000..b358b81c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_1a.js @@ -0,0 +1,84 @@ +var searchData= +[ + ['_7eaffinemap',['~AffineMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#aa89492a16ea8e282b9955cf1a1a38b3c',1,'openvdb::v3_2_0::math::AffineMap']]], + ['_7earchive',['~Archive',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#afa55d55a880c160fe67b8a81f4ca7c9d',1,'openvdb::v3_2_0::io::Archive']]], + ['_7ebasecamera',['~BaseCamera',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#a4460cc166f3b10ddfb1bc558469f5b6b',1,'openvdb::v3_2_0::tools::BaseCamera']]], + ['_7ebaseshader',['~BaseShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseShader.html#ab8f63136d12f7c4f01d8621897418456',1,'openvdb::v3_2_0::tools::BaseShader']]], + ['_7ebuffer',['~Buffer',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#ac72b418d40e29411ac044a49a20be750',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::~Buffer()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#ac72b418d40e29411ac044a49a20be750',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::~Buffer()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#ac72b418d40e29411ac044a49a20be750',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::~Buffer()']]], + ['_7econstrainedpointadvect',['~ConstrainedPointAdvect',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#afbee7a97e5ed49fbbac0ff1c0ce729b3',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect']]], + ['_7ecopyableoptransformer',['~CopyableOpTransformer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpTransformer.html#a47135062b0d7ba3b10f80c4e668238dc',1,'openvdb::v3_2_0::tools::valxform::CopyableOpTransformer']]], + ['_7ediffuseshader',['~DiffuseShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiffuseShader.html#a6735c82d3211c49da880c688e026d0f2',1,'openvdb::v3_2_0::tools::DiffuseShader::~DiffuseShader()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiffuseShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#a6735c82d3211c49da880c688e026d0f2',1,'openvdb::v3_2_0::tools::DiffuseShader< Film::RGBA, SamplerType >::~DiffuseShader()']]], + ['_7eexception',['~Exception',['../classopenvdb_1_1v3__2__0_1_1Exception.html#ae55b5e05d3195ae27204e3a2395e54e7',1,'openvdb::v3_2_0::Exception']]], + ['_7efile',['~File',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a5fa8852e1112fd17b8c6b9992a5fc374',1,'openvdb::v3_2_0::io::File']]], + ['_7egenericmap',['~GenericMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#ac0232c9d6541ed0120d60b7082021a30',1,'openvdb::v3_2_0::math::GenericMap']]], + ['_7egrid',['~Grid',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a302cf0f47984f1e8b3e9d7e2ec87db44',1,'openvdb::v3_2_0::Grid']]], + ['_7egridbase',['~GridBase',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ac3c3b386c234baee4536141adac5c992',1,'openvdb::v3_2_0::GridBase']]], + ['_7egriddescriptor',['~GridDescriptor',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a53fa15f916836cac825ab909458d3d1e',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['_7egridoperator',['~GridOperator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html#a0fb1483171c9df33bd3e6fc5babb8414',1,'openvdb::v3_2_0::tools::gridop::GridOperator']]], + ['_7egridresampler',['~GridResampler',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html#ad6e697e3576464049ce6fe9650560e11',1,'openvdb::v3_2_0::tools::GridResampler']]], + ['_7egridtransformer',['~GridTransformer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer.html#a13aae9eae5f34daa56b1a3e13ad203c1',1,'openvdb::v3_2_0::tools::GridTransformer']]], + ['_7eincompletecholeskypreconditioner',['~IncompleteCholeskyPreconditioner',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#ae659e30035614a2e536afb7e7efce56b',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner']]], + ['_7einternalnode',['~InternalNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a3ebfad50db33120e5f5827022c035166',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['_7ejacobipreconditioner',['~JacobiPreconditioner',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1JacobiPreconditioner.html#a0611b7e7846b5aff0e65e69d77f3910d',1,'openvdb::v3_2_0::math::pcg::JacobiPreconditioner']]], + ['_7eleafcache',['~LeafCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#a9f83055f2e0c777f93c806598a4aae08',1,'openvdb::v3_2_0::tools::Morphology::LeafCache']]], + ['_7eleafmanager',['~LeafManager',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#ab6cf0834071b7e72d380c44105839ca7',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['_7eleafnode',['~LeafNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a4497864cfd7a697b34d2261d9d799a54',1,'openvdb::v3_2_0::tree::LeafNode::~LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a4497864cfd7a697b34d2261d9d799a54',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::~LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a4497864cfd7a697b34d2261d9d799a54',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::~LeafNode()']]], + ['_7elegacyfrustum',['~LegacyFrustum',['../classopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1LegacyFrustum.html#aadb4fea5da469654c1d6efc53f415781',1,'openvdb::v3_2_0::math::internal::LegacyFrustum']]], + ['_7elevelsetadvection',['~LevelSetAdvection',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#ac994c7f13ab5b3013ecd61fc41f5c8d7',1,'openvdb::v3_2_0::tools::LevelSetAdvection']]], + ['_7elevelsetfilter',['~LevelSetFilter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a295dc79bd568e7fd1113bd9b9c0bca4b',1,'openvdb::v3_2_0::tools::LevelSetFilter']]], + ['_7elevelsetmeasure',['~LevelSetMeasure',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#a155052b533640590ff95924125ce5ad8',1,'openvdb::v3_2_0::tools::LevelSetMeasure']]], + ['_7elevelsetmorphing',['~LevelSetMorphing',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#af74c98d91db3566c6cd51eaa3b1e1d8a',1,'openvdb::v3_2_0::tools::LevelSetMorphing']]], + ['_7elevelsetraytracer',['~LevelSetRayTracer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#ad386975df3471b39b76ee6d7c94cb50d',1,'openvdb::v3_2_0::tools::LevelSetRayTracer']]], + ['_7elevelsettracker',['~LevelSetTracker',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#af58f63bd92ee8e19e3ba4d86cc287085',1,'openvdb::v3_2_0::tools::LevelSetTracker']]], + ['_7emapbase',['~MapBase',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a15b349f5e3c9ac96c70e35278319dc1e',1,'openvdb::v3_2_0::math::MapBase']]], + ['_7emappedfile',['~MappedFile',['../classopenvdb_1_1v3__2__0_1_1io_1_1MappedFile.html#a4b4387b4fbeafcbed9817f839c573738',1,'openvdb::v3_2_0::io::MappedFile']]], + ['_7ematteshader',['~MatteShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MatteShader.html#a5173fba6f95d3f768b0d1099de1546b4',1,'openvdb::v3_2_0::tools::MatteShader::~MatteShader()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MatteShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#a5173fba6f95d3f768b0d1099de1546b4',1,'openvdb::v3_2_0::tools::MatteShader< Film::RGBA, SamplerType >::~MatteShader()']]], + ['_7emetadata',['~Metadata',['../classopenvdb_1_1v3__2__0_1_1Metadata.html#af61a7c8a3ec6abd3ce30fabcec90dade',1,'openvdb::v3_2_0::Metadata']]], + ['_7emetamap',['~MetaMap',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#ae9600bcc7b8da8bd4051358f611c6195',1,'openvdb::v3_2_0::MetaMap']]], + ['_7emorphology',['~Morphology',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#aaa04eab6b75ce397b27956de7df39e28',1,'openvdb::v3_2_0::tools::Morphology']]], + ['_7enameiterator',['~NameIterator',['../classopenvdb_1_1v3__2__0_1_1io_1_1File_1_1NameIterator.html#a307860012d52e2ea5b66c24b4de73215',1,'openvdb::v3_2_0::io::File::NameIterator']]], + ['_7enodemanager',['~NodeManager',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#acb9562d2c86ca3eab311dc8735331b63',1,'openvdb::v3_2_0::tree::NodeManager::~NodeManager()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#acb9562d2c86ca3eab311dc8735331b63',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::~NodeManager()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#acb9562d2c86ca3eab311dc8735331b63',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::~NodeManager()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#acb9562d2c86ca3eab311dc8735331b63',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::~NodeManager()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#acb9562d2c86ca3eab311dc8735331b63',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::~NodeManager()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#acb9562d2c86ca3eab311dc8735331b63',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::~NodeManager()']]], + ['_7enodemanagerlink',['~NodeManagerLink',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#a2e1d0d15fe4a58850a324a766fb1a204',1,'openvdb::v3_2_0::tree::NodeManagerLink::~NodeManagerLink()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#a2e1d0d15fe4a58850a324a766fb1a204',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::~NodeManagerLink()']]], + ['_7enodemask',['~NodeMask',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#af38fe93ab1c08a06a37eadd3b385644c',1,'openvdb::v3_2_0::util::NodeMask::~NodeMask()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#af38fe93ab1c08a06a37eadd3b385644c',1,'openvdb::v3_2_0::util::NodeMask< 1 >::~NodeMask()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#af38fe93ab1c08a06a37eadd3b385644c',1,'openvdb::v3_2_0::util::NodeMask< 2 >::~NodeMask()']]], + ['_7enodeunionimpl',['~NodeUnionImpl',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01true_00_01ValueT_00_01ChildT_01_4.html#ad0ef0dbe73512c09919e84dabb6eedc6',1,'openvdb::v3_2_0::tree::NodeUnionImpl< true, ValueT, ChildT >']]], + ['_7enonlinearfrustummap',['~NonlinearFrustumMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#ae17ba0e52e8cc3c10f4904a3b927a750',1,'openvdb::v3_2_0::math::NonlinearFrustumMap']]], + ['_7enormalshader',['~NormalShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1NormalShader.html#a6e5a21f259189b4d27383024f70ec83c',1,'openvdb::v3_2_0::tools::NormalShader::~NormalShader()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1NormalShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#a6e5a21f259189b4d27383024f70ec83c',1,'openvdb::v3_2_0::tools::NormalShader< Film::RGBA, SamplerType >::~NormalShader()']]], + ['_7eopaccumulator',['~OpAccumulator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1OpAccumulator.html#a90447b3d23c2697ce13b521fcddf30f2',1,'openvdb::v3_2_0::tools::valxform::OpAccumulator']]], + ['_7eorthographiccamera',['~OrthographicCamera',['../classopenvdb_1_1v3__2__0_1_1tools_1_1OrthographicCamera.html#a4a344fc67010fa82b4ef3e6f5a77dbc7',1,'openvdb::v3_2_0::tools::OrthographicCamera']]], + ['_7epage',['~Page',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html#a4bcfc94c1fd67c937b605ab3abd7d399',1,'openvdb::v3_2_0::util::PagedArray::Page']]], + ['_7epagedarray',['~PagedArray',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#aa6d53e13fd82dcd47d234226100469da',1,'openvdb::v3_2_0::util::PagedArray']]], + ['_7eparticlestolevelset',['~ParticlesToLevelSet',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a3a568687e02aacd5edd36c278300e3c5',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['_7eperspectivecamera',['~PerspectiveCamera',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PerspectiveCamera.html#a975e2662bfa77e0279d98903330dab37',1,'openvdb::v3_2_0::tools::PerspectiveCamera']]], + ['_7epointadvect',['~PointAdvect',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#a465034bca491f578baa9ad57ca2c6e02',1,'openvdb::v3_2_0::tools::PointAdvect']]], + ['_7epositionshader',['~PositionShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PositionShader.html#a7b941af3b5cdbd40fa23ebf520466df8',1,'openvdb::v3_2_0::tools::PositionShader::~PositionShader()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PositionShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#a7b941af3b5cdbd40fa23ebf520466df8',1,'openvdb::v3_2_0::tools::PositionShader< Film::RGBA, SamplerType >::~PositionShader()']]], + ['_7epreconditioner',['~Preconditioner',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Preconditioner.html#a8c92b9c736af03390d379e4490c1edac',1,'openvdb::v3_2_0::math::pcg::Preconditioner']]], + ['_7equeue',['~Queue',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a240bdcfcc136e53aeaac3aa454cc26bf',1,'openvdb::v3_2_0::io::Queue']]], + ['_7ereducepool',['~ReducePool',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid_1_1ReducePool.html#a24be0f7fa46edb932e9f40b291636bc7',1,'openvdb::v3_2_0::tools::PointMaskGrid::ReducePool']]], + ['_7erootnode',['~RootNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#aaf38ff0107dcb0e50c0f4e5783146459',1,'openvdb::v3_2_0::tree::RootNode']]], + ['_7erootnodemask',['~RootNodeMask',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a03ef8207639f557340c752f161d607bd',1,'openvdb::v3_2_0::util::RootNodeMask']]], + ['_7escalemap',['~ScaleMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#adaf0658fac757a472ddf189fc226c309',1,'openvdb::v3_2_0::math::ScaleMap']]], + ['_7escaletranslatemap',['~ScaleTranslateMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a762d14391f182d80b2f4fc00668c30c4',1,'openvdb::v3_2_0::math::ScaleTranslateMap']]], + ['_7esharedoptransformer',['~SharedOpTransformer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpTransformer.html#a91779fbb2fa43ea9d50a98ef57e915cf',1,'openvdb::v3_2_0::tools::valxform::SharedOpTransformer']]], + ['_7estream',['~Stream',['../classopenvdb_1_1v3__2__0_1_1io_1_1Stream.html#a15237b41305f4268e1576c81766cd6d9',1,'openvdb::v3_2_0::io::Stream']]], + ['_7estreammetadata',['~StreamMetadata',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a3fa3737897f294215d28b107691f22e3',1,'openvdb::v3_2_0::io::StreamMetadata']]], + ['_7etempfile',['~TempFile',['../classopenvdb_1_1v3__2__0_1_1io_1_1TempFile.html#a6539eb6d4bd819220c79aa5c4e88feba',1,'openvdb::v3_2_0::io::TempFile']]], + ['_7etransform',['~Transform',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a8e627263611a76aad02c9e0b89287c68',1,'openvdb::v3_2_0::math::Transform']]], + ['_7etranslationmap',['~TranslationMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a5ff87bc5f2f4ba645cd18309232585da',1,'openvdb::v3_2_0::math::TranslationMap']]], + ['_7etree',['~Tree',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a77309a39ab4a963544624a7582801767',1,'openvdb::v3_2_0::tree::Tree']]], + ['_7etreebase',['~TreeBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a39a3581bca8623f5876a45638314ef95',1,'openvdb::v3_2_0::tree::TreeBase']]], + ['_7etypedmetadata',['~TypedMetadata',['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a35ef73f18df1419f16de3b79996ae10c',1,'openvdb::v3_2_0::TypedMetadata']]], + ['_7euniformscalemap',['~UniformScaleMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#af0c8d18bd4d8d1800c249176b8cf08b5',1,'openvdb::v3_2_0::math::UniformScaleMap']]], + ['_7euniformscaletranslatemap',['~UniformScaleTranslateMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#aee6f4e9945ac8c920767740566d1a0ae',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap']]], + ['_7eunitarymap',['~UnitaryMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a4a6c3ecb2aa14cc284b124576d5c3738',1,'openvdb::v3_2_0::math::UnitaryMap']]], + ['_7eunknownmetadata',['~UnknownMetadata',['../classopenvdb_1_1v3__2__0_1_1UnknownMetadata.html#a3d029c5dacb595e58f84c04811d82060',1,'openvdb::v3_2_0::UnknownMetadata']]], + ['_7evalueaccessor',['~ValueAccessor',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a664e90759224eb0ac1b3591dc97283fe',1,'openvdb::v3_2_0::tree::ValueAccessor::~ValueAccessor()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_010_00_01tbb_1_1null__mutex_01_4.html#a664e90759224eb0ac1b3591dc97283fe',1,'openvdb::v3_2_0::tree::ValueAccessor< TreeType, IsSafe, 0, tbb::null_mutex >::~ValueAccessor()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_011_00_01tbb_1_1null__mutex_01_4.html#a664e90759224eb0ac1b3591dc97283fe',1,'openvdb::v3_2_0::tree::ValueAccessor< TreeType, IsSafe, 1, tbb::null_mutex >::~ValueAccessor()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_012_00_01tbb_1_1null__mutex_01_4.html#a664e90759224eb0ac1b3591dc97283fe',1,'openvdb::v3_2_0::tree::ValueAccessor< TreeType, IsSafe, 2, tbb::null_mutex >::~ValueAccessor()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor_3_01TreeType_00_01IsSafe_00_013_00_01tbb_1_1null__mutex_01_4.html#a664e90759224eb0ac1b3591dc97283fe',1,'openvdb::v3_2_0::tree::ValueAccessor< TreeType, IsSafe, 3, tbb::null_mutex >::~ValueAccessor()']]], + ['_7evalueaccessor0',['~ValueAccessor0',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a39795988fd2f2509801aea774b48cb16',1,'openvdb::v3_2_0::tree::ValueAccessor0']]], + ['_7evalueaccessor1',['~ValueAccessor1',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a0936df9a4345cb57468c66238543139e',1,'openvdb::v3_2_0::tree::ValueAccessor1']]], + ['_7evalueaccessor2',['~ValueAccessor2',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a2c35d6e5cffacab11fed4e2ee8198796',1,'openvdb::v3_2_0::tree::ValueAccessor2']]], + ['_7evalueaccessor3',['~ValueAccessor3',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a9a4f87435b1060d8842df5773e2b90f4',1,'openvdb::v3_2_0::tree::ValueAccessor3']]], + ['_7evalueaccessorbase',['~ValueAccessorBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html#a53dd0929b984e8ffe91f68cd064904ff',1,'openvdb::v3_2_0::tree::ValueAccessorBase']]], + ['_7evaluebuffer',['~ValueBuffer',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ValueBuffer.html#a562788b9e5a081682503d6316ab02a5d',1,'openvdb::v3_2_0::util::PagedArray::ValueBuffer']]], + ['_7evector',['~Vector',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#aaa9fccd0cb7734271f7a15e5d9dc0d27',1,'openvdb::v3_2_0::math::pcg::Vector']]], + ['_7evolumeadvection',['~VolumeAdvection',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#a05625a48b1c8ab4a3216dfed956662b8',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['_7evolumerayintersector',['~VolumeRayIntersector',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a174268e7ab5ce98b0a22def0367bd1b6',1,'openvdb::v3_2_0::tools::VolumeRayIntersector']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_2.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_2.html new file mode 100644 index 00000000..f17abffc --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_2.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_2.js new file mode 100644 index 00000000..2f182412 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_2.js @@ -0,0 +1,218 @@ +var searchData= +[ + ['cacheitem',['CacheItem',['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a8d83a54b601816d9bf8ab605ae57cf44',1,'openvdb::v3_2_0::tree::CacheItem::CacheItem(TreeCacheT &parent)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a266ff84d57779fb67da7b0d84bb605ef',1,'openvdb::v3_2_0::tree::CacheItem::CacheItem(TreeCacheT &parent, const CacheItem &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a8d83a54b601816d9bf8ab605ae57cf44',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::CacheItem(TreeCacheT &parent)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a266ff84d57779fb67da7b0d84bb605ef',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::CacheItem(TreeCacheT &parent, const CacheItem &other)']]], + ['calculatebounds',['calculateBounds',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1e47ea736d99890969ff15e1a26a11aa',1,'openvdb::v3_2_0::math::calculateBounds()'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a9c9b4b77b92264946ca4866b59db1d90',1,'openvdb::v3_2_0::util::calculateBounds(const MapType &map, const BBoxd &in, BBoxd &out)'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#ad5d6cc933ba56d768e16a6d47777dbcc',1,'openvdb::v3_2_0::util::calculateBounds(const MapType &map, const Vec3d &center, const Real radius, BBoxd &out)']]], + ['calculatebounds_3c_20math_3a_3anonlinearfrustummap_20_3e',['calculateBounds< math::NonlinearFrustumMap >',['../namespaceopenvdb_1_1v3__2__0_1_1util.html#aad5cb360f1bbc85b74c93744521a1b9e',1,'openvdb::v3_2_0::util']]], + ['capacity',['capacity',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a5baddc5324ced350cdada48c943aae20',1,'openvdb::v3_2_0::io::Queue::capacity()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#ae3b0b3ce67788bf2e4e209f65eb99297',1,'openvdb::v3_2_0::util::PagedArray::capacity()']]], + ['cbegin',['cbegin',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a9adcdec7f9095df3498cdacca808ed08',1,'openvdb::v3_2_0::tree::Tree::cbegin()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#ae04e6b542ee42ff7809fceb1e11c471f',1,'openvdb::v3_2_0::util::PagedArray::cbegin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a0370633d2aeedebedba3842994777fc5',1,'openvdb::v3_2_0::tree::Tree::cbegin()']]], + ['cbeginchildall',['cbeginChildAll',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ae5c7824607dbdc3c1165e0b0daea8bcd',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::cbeginChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ae5c7824607dbdc3c1165e0b0daea8bcd',1,'openvdb::v3_2_0::tree::InternalNode::cbeginChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ae5c7824607dbdc3c1165e0b0daea8bcd',1,'openvdb::v3_2_0::tree::LeafNode::cbeginChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ae5c7824607dbdc3c1165e0b0daea8bcd',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::cbeginChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ae5c7824607dbdc3c1165e0b0daea8bcd',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::cbeginChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ae5c7824607dbdc3c1165e0b0daea8bcd',1,'openvdb::v3_2_0::tree::RootNode::cbeginChildAll()']]], + ['cbeginchildoff',['cbeginChildOff',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a8169dc13d3aad941b6490f27a4bbb839',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::cbeginChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a8169dc13d3aad941b6490f27a4bbb839',1,'openvdb::v3_2_0::tree::InternalNode::cbeginChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a8169dc13d3aad941b6490f27a4bbb839',1,'openvdb::v3_2_0::tree::LeafNode::cbeginChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8169dc13d3aad941b6490f27a4bbb839',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::cbeginChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8169dc13d3aad941b6490f27a4bbb839',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::cbeginChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a8169dc13d3aad941b6490f27a4bbb839',1,'openvdb::v3_2_0::tree::RootNode::cbeginChildOff()']]], + ['cbeginchildon',['cbeginChildOn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a63e9bf1256874f802e2dbbc7db56f8ee',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::cbeginChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a63e9bf1256874f802e2dbbc7db56f8ee',1,'openvdb::v3_2_0::tree::InternalNode::cbeginChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a63e9bf1256874f802e2dbbc7db56f8ee',1,'openvdb::v3_2_0::tree::LeafNode::cbeginChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a63e9bf1256874f802e2dbbc7db56f8ee',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::cbeginChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a63e9bf1256874f802e2dbbc7db56f8ee',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::cbeginChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a63e9bf1256874f802e2dbbc7db56f8ee',1,'openvdb::v3_2_0::tree::RootNode::cbeginChildOn()']]], + ['cbeginleaf',['cbeginLeaf',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#aa87ff4f7acdfe6f833b3db2431afd088',1,'openvdb::v3_2_0::tree::Tree']]], + ['cbeginnode',['cbeginNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a4bcf073387908382f7ae872adb97087f',1,'openvdb::v3_2_0::tree::Tree']]], + ['cbeginrootchildren',['cbeginRootChildren',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a731418dbc4530e198213306aab0a475c',1,'openvdb::v3_2_0::tree::Tree']]], + ['cbeginrootdense',['cbeginRootDense',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#abdd255b280df688e816d4a324eac2846',1,'openvdb::v3_2_0::tree::Tree']]], + ['cbeginroottiles',['cbeginRootTiles',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a4092f276f081a9d0d61e901a314f1e3f',1,'openvdb::v3_2_0::tree::Tree']]], + ['cbeginvalueall',['cbeginValueAll',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a8b296755b1634e77e5fff9c4c48ea3c8',1,'openvdb::v3_2_0::Grid::cbeginValueAll()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a8b296755b1634e77e5fff9c4c48ea3c8',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::cbeginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a8b296755b1634e77e5fff9c4c48ea3c8',1,'openvdb::v3_2_0::tree::InternalNode::cbeginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a8b296755b1634e77e5fff9c4c48ea3c8',1,'openvdb::v3_2_0::tree::LeafNode::cbeginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8b296755b1634e77e5fff9c4c48ea3c8',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::cbeginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8b296755b1634e77e5fff9c4c48ea3c8',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::cbeginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a8b296755b1634e77e5fff9c4c48ea3c8',1,'openvdb::v3_2_0::tree::RootNode::cbeginValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a8b296755b1634e77e5fff9c4c48ea3c8',1,'openvdb::v3_2_0::tree::Tree::cbeginValueAll()']]], + ['cbeginvalueoff',['cbeginValueOff',['../classopenvdb_1_1v3__2__0_1_1Grid.html#ae16c1191cb1a539a7cc0cdee5803d860',1,'openvdb::v3_2_0::Grid::cbeginValueOff()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ae16c1191cb1a539a7cc0cdee5803d860',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::cbeginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ae16c1191cb1a539a7cc0cdee5803d860',1,'openvdb::v3_2_0::tree::InternalNode::cbeginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ae16c1191cb1a539a7cc0cdee5803d860',1,'openvdb::v3_2_0::tree::LeafNode::cbeginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ae16c1191cb1a539a7cc0cdee5803d860',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::cbeginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ae16c1191cb1a539a7cc0cdee5803d860',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::cbeginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ae16c1191cb1a539a7cc0cdee5803d860',1,'openvdb::v3_2_0::tree::RootNode::cbeginValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ae16c1191cb1a539a7cc0cdee5803d860',1,'openvdb::v3_2_0::tree::Tree::cbeginValueOff()']]], + ['cbeginvalueon',['cbeginValueOn',['../classopenvdb_1_1v3__2__0_1_1Grid.html#ad554801c644ee82931281a11f801bf5c',1,'openvdb::v3_2_0::Grid::cbeginValueOn()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ad554801c644ee82931281a11f801bf5c',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::cbeginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ad554801c644ee82931281a11f801bf5c',1,'openvdb::v3_2_0::tree::InternalNode::cbeginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ad554801c644ee82931281a11f801bf5c',1,'openvdb::v3_2_0::tree::LeafNode::cbeginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ad554801c644ee82931281a11f801bf5c',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::cbeginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ad554801c644ee82931281a11f801bf5c',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::cbeginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ad554801c644ee82931281a11f801bf5c',1,'openvdb::v3_2_0::tree::RootNode::cbeginValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ad554801c644ee82931281a11f801bf5c',1,'openvdb::v3_2_0::tree::Tree::cbeginValueOn()']]], + ['cbrt',['Cbrt',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae883922f38f7f30e978d40706312434f',1,'openvdb::v3_2_0::math::Cbrt(float x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4d1cd9afac6c01d715efa4508755830b',1,'openvdb::v3_2_0::math::Cbrt(double x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a2f764f570a2ec04ecb42626254950ca2',1,'openvdb::v3_2_0::math::Cbrt(long double x)']]], + ['ceil',['ceil',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a1fb8c36c21492d4046e6db3c4fcdfe47',1,'openvdb::v3_2_0::math::Coord::ceil()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a560f58b8cb449880e24be8a4f092eb44',1,'openvdb::v3_2_0::math::Ceil(float x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af7d7ce4d5cf009045016aa547d30b549',1,'openvdb::v3_2_0::math::Ceil(double x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a796615ada351ddfebcb1095ac4834ceb',1,'openvdb::v3_2_0::math::Ceil(long double x)']]], + ['ceilvec3',['ceilVec3',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1local__util.html#aa68de92d94e125389b8ebdcd93ad5cfe',1,'openvdb::v3_2_0::tools::local_util']]], + ['cend',['cend',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#ae6d634a0c1bb2c2d1522bd581d89ba34',1,'openvdb::v3_2_0::util::PagedArray']]], + ['cendchildall',['cendChildAll',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a247bd2c5f4dc62da9f5c5c767d45644d',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::cendChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a247bd2c5f4dc62da9f5c5c767d45644d',1,'openvdb::v3_2_0::tree::LeafNode::cendChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a247bd2c5f4dc62da9f5c5c767d45644d',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::cendChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a247bd2c5f4dc62da9f5c5c767d45644d',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::cendChildAll()']]], + ['cendchildoff',['cendChildOff',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a1191134a87bc47cd04b0043323a80492',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::cendChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a1191134a87bc47cd04b0043323a80492',1,'openvdb::v3_2_0::tree::LeafNode::cendChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a1191134a87bc47cd04b0043323a80492',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::cendChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a1191134a87bc47cd04b0043323a80492',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::cendChildOff()']]], + ['cendchildon',['cendChildOn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a53f2d73cca3ccdcaadc8a2978ae0f1d2',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::cendChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a53f2d73cca3ccdcaadc8a2978ae0f1d2',1,'openvdb::v3_2_0::tree::LeafNode::cendChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a53f2d73cca3ccdcaadc8a2978ae0f1d2',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::cendChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a53f2d73cca3ccdcaadc8a2978ae0f1d2',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::cendChildOn()']]], + ['cendvalueall',['cendValueAll',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a60c2e5ff1f794fa63efe164d93360abf',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::cendValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a60c2e5ff1f794fa63efe164d93360abf',1,'openvdb::v3_2_0::tree::LeafNode::cendValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a60c2e5ff1f794fa63efe164d93360abf',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::cendValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a60c2e5ff1f794fa63efe164d93360abf',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::cendValueAll()']]], + ['cendvalueoff',['cendValueOff',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#aea3e9e0c9c570396843341ae2caee3e3',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::cendValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aea3e9e0c9c570396843341ae2caee3e3',1,'openvdb::v3_2_0::tree::LeafNode::cendValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aea3e9e0c9c570396843341ae2caee3e3',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::cendValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aea3e9e0c9c570396843341ae2caee3e3',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::cendValueOff()']]], + ['cendvalueon',['cendValueOn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#abf8670164bdd9e853f8991c94e10b880',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::cendValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#abf8670164bdd9e853f8991c94e10b880',1,'openvdb::v3_2_0::tree::LeafNode::cendValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#abf8670164bdd9e853f8991c94e10b880',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::cendValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#abf8670164bdd9e853f8991c94e10b880',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::cendValueOn()']]], + ['changeasymmetriclevelsetbackground',['changeAsymmetricLevelSetBackground',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a7573006df5786ba9cd6c564e4bd589ac',1,'openvdb::v3_2_0::tools']]], + ['changebackground',['changeBackground',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ad795f2f3910144753a5e03d12f4703de',1,'openvdb::v3_2_0::tools']]], + ['changebackgroundop',['ChangeBackgroundOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeBackgroundOp.html#a28dd0f5a6ad6ceaf387a1b2cf744be73',1,'openvdb::v3_2_0::tools::ChangeBackgroundOp']]], + ['changelevelsetbackground',['changeLevelSetBackground',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ae9b9e9c02f534160f2571613f2d67ef5',1,'openvdb::v3_2_0::tools']]], + ['changelevelsetbackgroundop',['ChangeLevelSetBackgroundOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeLevelSetBackgroundOp.html#aad6a412d71e021a32dab578877303b7e',1,'openvdb::v3_2_0::tools::ChangeLevelSetBackgroundOp']]], + ['check',['check',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Diagnose.html#a177323339f52aac0669cb558f3f68605',1,'openvdb::v3_2_0::tools::Diagnose::check()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#a09755336ff29947926252e6c0b4b667c',1,'openvdb::v3_2_0::tools::CheckLevelSet::check()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#a66846fa078581b8f5c1d59c9fa9f1b58',1,'openvdb::v3_2_0::tools::CheckFogVolume::check()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ValidateIntersectingVoxels_1_1IsNegative.html#a4d06ba82acc4203fbed9ee6d726e93dd',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ValidateIntersectingVoxels::IsNegative::check()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RemoveSelfIntersectingSurface_1_1Comp.html#a4d06ba82acc4203fbed9ee6d726e93dd',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RemoveSelfIntersectingSurface::Comp::check()']]], + ['checkbackground',['checkBackground',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#aad6b28cf0790b57a5a14dc43b97646fd',1,'openvdb::v3_2_0::tools::CheckLevelSet::checkBackground()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#a5bf9e0386212f92d3cb28a26bb78cbfd',1,'openvdb::v3_2_0::tools::CheckFogVolume::checkBackground()']]], + ['checkclasstype',['checkClassType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#aee1ca640b617e83cf360e494ce7ebea2',1,'openvdb::v3_2_0::tools::CheckLevelSet::checkClassType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#aee1ca640b617e83cf360e494ce7ebea2',1,'openvdb::v3_2_0::tools::CheckFogVolume::checkClassType()']]], + ['checkdivergence',['CheckDivergence',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#aac8c968c4c15fd7fb33f34712d7add58',1,'openvdb::v3_2_0::tools::CheckDivergence']]], + ['checkeikonal',['CheckEikonal',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#a9fedbb3997d12b6a5dd13e18e2524235',1,'openvdb::v3_2_0::tools::CheckEikonal::CheckEikonal(const GridT &grid, const ValueType &_min, const ValueType &_max)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#aa98b68032c78c43ce45e74953d902afd',1,'openvdb::v3_2_0::tools::CheckEikonal::CheckEikonal(const CheckEikonal &other)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#a67b66d5518e6bbf3ababd7a45fe3bd85',1,'openvdb::v3_2_0::tools::CheckLevelSet::checkEikonal()']]], + ['checkerboard',['checkerboard',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Film.html#a861f70d1d74712c42f56c15383f1c7be',1,'openvdb::v3_2_0::tools::Film']]], + ['checkfinite',['CheckFinite',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckFinite.html#a513d7c3c24bdc6548e7b70561b8d6249',1,'openvdb::v3_2_0::tools::CheckFinite::CheckFinite()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#af9c06f017e98f47be7bdebf9d3855ddc',1,'openvdb::v3_2_0::tools::CheckLevelSet::checkFinite()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#af9c06f017e98f47be7bdebf9d3855ddc',1,'openvdb::v3_2_0::tools::CheckFogVolume::checkFinite()']]], + ['checkfogvolume',['CheckFogVolume',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#adf81362678fa31b9ce9eecbae327b1b9',1,'openvdb::v3_2_0::tools::CheckFogVolume::CheckFogVolume()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ab03bd92afef729f144e63f37f417c96d',1,'openvdb::v3_2_0::tools::checkFogVolume()']]], + ['checkinactivevalues',['checkInactiveValues',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#ad4111e76aa0c69ffc879adf7c8df3d8e',1,'openvdb::v3_2_0::tools::CheckLevelSet::checkInactiveValues()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#ad4111e76aa0c69ffc879adf7c8df3d8e',1,'openvdb::v3_2_0::tools::CheckFogVolume::checkInactiveValues()']]], + ['checkinf',['CheckInf',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckInf.html#a0bb2aa64a1e0e02d43389a09df7bff15',1,'openvdb::v3_2_0::tools::CheckInf']]], + ['checkinterrupter',['checkInterrupter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a0bdbe0c728d23a37dc60bb82a56653a5',1,'openvdb::v3_2_0::tools::LevelSetTracker']]], + ['checklevelset',['CheckLevelSet',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#a725b706f4ebc5bf48c7d4b6d238b5e2a',1,'openvdb::v3_2_0::tools::CheckLevelSet::CheckLevelSet()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ae07091e4e6f1cfb869111d233da6d9b9',1,'openvdb::v3_2_0::tools::checkLevelSet()']]], + ['checkmagnitude',['CheckMagnitude',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMagnitude.html#ad6eec2e85a2c5e01ba56ce6410df5e1b',1,'openvdb::v3_2_0::tools::CheckMagnitude']]], + ['checkmax',['CheckMax',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMax.html#aec8126495a6d7af277a19efd05fd3638',1,'openvdb::v3_2_0::tools::CheckMax']]], + ['checkmin',['CheckMin',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMin.html#a545e064995ca65e3ee4fa70de752bb5c',1,'openvdb::v3_2_0::tools::CheckMin']]], + ['checknan',['CheckNan',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNan.html#a75d0f9e3e69bbf86a2dd9212e1dbfbca',1,'openvdb::v3_2_0::tools::CheckNan']]], + ['checkneighbours',['checkNeighbours',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal.html#ad57b6d1ef25c23ea9090da3a6b1505ca',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::checkNeighbours(const Index pos, const typename LeafNodeType::ValueType *data, bool(&mask)[26])'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal.html#a4c492b525cf8af63ff3280dcb4ccb9e9',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::checkNeighbours(const Coord &ijk, AccessorType &acc, bool(&mask)[26])']]], + ['checknormgrad',['CheckNormGrad',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#a99a8614e5d78cf30cf659dda3f1b07d2',1,'openvdb::v3_2_0::tools::CheckNormGrad::CheckNormGrad(const GridT &grid, const ValueType &_min, const ValueType &_max)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#ac4e4d77d68099c3d142a93403972d542',1,'openvdb::v3_2_0::tools::CheckNormGrad::CheckNormGrad(const CheckNormGrad &other)']]], + ['checkrange',['CheckRange',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckRange.html#a0746656b977b7876c68bd49b63174716',1,'openvdb::v3_2_0::tools::CheckRange::CheckRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#adb763eb487bb70bdc7fb3196bff283b5',1,'openvdb::v3_2_0::tools::CheckLevelSet::checkRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#adb763eb487bb70bdc7fb3196bff283b5',1,'openvdb::v3_2_0::tools::CheckFogVolume::checkRange()']]], + ['checktiles',['checkTiles',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#aace6a0b2a9b8cc1d8d4644dc32203624',1,'openvdb::v3_2_0::tools::CheckLevelSet']]], + ['checktransform',['checkTransform',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#a3d224a6e8f2cabdfac3c7a0d9769d5d3',1,'openvdb::v3_2_0::tools::CheckLevelSet']]], + ['checkvaluetype',['checkValueType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#a1b604cf33dc658941e7be48cda9a6f78',1,'openvdb::v3_2_0::tools::CheckLevelSet::checkValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#a1b604cf33dc658941e7be48cda9a6f78',1,'openvdb::v3_2_0::tools::CheckFogVolume::checkValueType()']]], + ['childiter',['ChildIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ChildIter.html#a9bddc790a5fa22be7abbad3f075adae2',1,'openvdb::v3_2_0::tree::InternalNode::ChildIter::ChildIter()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ChildIter.html#a653a046afd70c8b513404c5e82fa0aa7',1,'openvdb::v3_2_0::tree::InternalNode::ChildIter::ChildIter(const MaskIterT &iter, NodeT *parent)'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ChildIter.html#a9bddc790a5fa22be7abbad3f075adae2',1,'openvdb::v3_2_0::tree::LeafNode::ChildIter::ChildIter()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ChildIter.html#a653a046afd70c8b513404c5e82fa0aa7',1,'openvdb::v3_2_0::tree::LeafNode::ChildIter::ChildIter(const MaskIterT &iter, NodeT *parent)'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ChildIter.html#a9bddc790a5fa22be7abbad3f075adae2',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ChildIter::ChildIter()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ChildIter.html#a653a046afd70c8b513404c5e82fa0aa7',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ChildIter::ChildIter(const MaskIterT &iter, NodeT *parent)'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ChildIter.html#a9bddc790a5fa22be7abbad3f075adae2',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ChildIter::ChildIter()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ChildIter.html#a653a046afd70c8b513404c5e82fa0aa7',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ChildIter::ChildIter(const MaskIterT &iter, NodeT *parent)']]], + ['chop',['Chop',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a2387bae5f5bad9174b92ed5040e98001',1,'openvdb::v3_2_0::math']]], + ['clamp',['Clamp',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a5a0417db0cd8013d4558028024935ddc',1,'openvdb::v3_2_0::math']]], + ['clamp01',['Clamp01',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#afbec5b4dc838e68b0a19588b4f5974ab',1,'openvdb::v3_2_0::math']]], + ['clamptest01',['ClampTest01',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a8f920296f677c1599d4d3b28e96bf5d2',1,'openvdb::v3_2_0::math']]], + ['clear',['clear',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a5eeb94d22b8366d1b68d0614384802fe',1,'openvdb::v3_2_0::GridBase::clear()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#aae048282c7011eedc2e0492f6421ea73',1,'openvdb::v3_2_0::Grid::clear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1RowEditor.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::RowEditor::clear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapRegistry.html#a14dabca7589b28dc6adca2c5367546e1',1,'openvdb::v3_2_0::math::MapRegistry::clear()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Diagnose.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tools::Diagnose::clear()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tools::CheckLevelSet::clear()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tools::CheckFogVolume::clear()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFracture.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tools::LevelSetFracture::clear()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1Neighbor.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tools::Morphology::Neighbor::clear()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tools::Morphology::LeafCache::clear()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tools::PointPartitioner::clear()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1Array.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tools::point_partitioner_internal::Array::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::NodeList::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::NodeManagerLink::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::NodeManager::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::RootNode::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::Tree::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html#a5eeb94d22b8366d1b68d0614384802fe',1,'openvdb::v3_2_0::tree::ValueAccessorBase::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#aae048282c7011eedc2e0492f6421ea73',1,'openvdb::v3_2_0::tree::ValueAccessor::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::CacheItem::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#aae048282c7011eedc2e0492f6421ea73',1,'openvdb::v3_2_0::tree::ValueAccessor0::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#aae048282c7011eedc2e0492f6421ea73',1,'openvdb::v3_2_0::tree::ValueAccessor1::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#aae048282c7011eedc2e0492f6421ea73',1,'openvdb::v3_2_0::tree::ValueAccessor2::clear()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#aae048282c7011eedc2e0492f6421ea73',1,'openvdb::v3_2_0::tree::ValueAccessor3::clear()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#ac8bb3912a3ce86b15842e79d0b421204',1,'openvdb::v3_2_0::util::PagedArray::clear()']]], + ['clearallaccessors',['clearAllAccessors',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a24a9fa1c5dbac50f2d5f406f8842e368',1,'openvdb::v3_2_0::tree::Tree']]], + ['cleargridclass',['clearGridClass',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a3c534325b373e839986bc3ceec2c419e',1,'openvdb::v3_2_0::GridBase::clearGridClass()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a3c534325b373e839986bc3ceec2c419e',1,'openvdb::v3_2_0::tools::MultiResGrid::clearGridClass()']]], + ['clearmetadata',['clearMetadata',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a9f1cb46fac5d18387f6f33691b582244',1,'openvdb::v3_2_0::MetaMap']]], + ['clearnotifier',['clearNotifier',['../classopenvdb_1_1v3__2__0_1_1io_1_1MappedFile.html#adfeda8bbb07e15aaf191a702c0901cf7',1,'openvdb::v3_2_0::io::MappedFile']]], + ['clearnotifiers',['clearNotifiers',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a214735f6a6f189ed694f94b94aac6df2',1,'openvdb::v3_2_0::io::Queue']]], + ['clearquads',['clearQuads',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#a3fe0b148e78c1ea8da416f46e7e860c1',1,'openvdb::v3_2_0::tools::PolygonPool']]], + ['clearregistry',['clearRegistry',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#acf71679f2c3fee401465b443a08a77c0',1,'openvdb::v3_2_0::GridBase::clearRegistry()'],['../classopenvdb_1_1v3__2__0_1_1Metadata.html#acf71679f2c3fee401465b443a08a77c0',1,'openvdb::v3_2_0::Metadata::clearRegistry()']]], + ['clearstreammetadataptr',['clearStreamMetadataPtr',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#ae323d29d4dd862453ae5cf4cd2c9d252',1,'openvdb::v3_2_0::io']]], + ['cleartriangles',['clearTriangles',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#a4874d6c19a352271a6cd6249aebdb294',1,'openvdb::v3_2_0::tools::PolygonPool']]], + ['clearvectortype',['clearVectorType',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a736ac0fd0cc046077fa9cafac30ce5a9',1,'openvdb::v3_2_0::GridBase']]], + ['clip',['clip',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ac7e311a9da3fe887bc96ec532efce480',1,'openvdb::v3_2_0::GridBase::clip()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a409633b422404c1c7df4e0ffdd02eac1',1,'openvdb::v3_2_0::Grid::clip()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a9803a84f61d03f9c466b5fe533904d5f',1,'openvdb::v3_2_0::math::Ray::clip(const Vec3T &center, RealT radius)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a26fc5e2e54e857c95a7327db1a1a8698',1,'openvdb::v3_2_0::math::Ray::clip(const BBoxT &bbox)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ad73237cff1ce2ebd9c629a0da397e55f',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::clip()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a6f3646d9977051fa33eb17095e736e84',1,'openvdb::v3_2_0::tree::InternalNode::clip()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a6f3646d9977051fa33eb17095e736e84',1,'openvdb::v3_2_0::tree::LeafNode::clip()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#af9d5b5818c4771ed5cb5067c011326f8',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::clip()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#af9d5b5818c4771ed5cb5067c011326f8',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::clip()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a409633b422404c1c7df4e0ffdd02eac1',1,'openvdb::v3_2_0::tree::RootNode::clip()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a409633b422404c1c7df4e0ffdd02eac1',1,'openvdb::v3_2_0::tree::Tree::clip()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#abeb8f36fff220dff65eb5eaae1931897',1,'openvdb::v3_2_0::tools::clip(const GridType &grid, const BBoxd &)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a0b62dae45e343e32fde3db49031916b1',1,'openvdb::v3_2_0::tools::clip(const GridType &grid, const Grid< MaskTreeType > &mask)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aaecf7e4503f11468cc5fdc2ee37592eb',1,'openvdb::v3_2_0::tools::clip(const GridType1 &grid1, const Grid< TreeType2 > &grid2)']]], + ['clipgrid',['clipGrid',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a7d9768f753c671503d2ee5e2320117d7',1,'openvdb::v3_2_0::GridBase']]], + ['clipunallocatednodes',['clipUnallocatedNodes',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#aa1c2581d705ae9b68906690051cb3898',1,'openvdb::v3_2_0::tree::TreeBase::clipUnallocatedNodes()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a736e8b7a839343fb5f7c02e2e61308a8',1,'openvdb::v3_2_0::tree::Tree::clipUnallocatedNodes()']]], + ['close',['close',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a5ae591df94fc66ccb85cbb6565368bca',1,'openvdb::v3_2_0::io::File::close()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1TempFile.html#a5ae591df94fc66ccb85cbb6565368bca',1,'openvdb::v3_2_0::io::TempFile::close()']]], + ['closestpointdist',['ClosestPointDist',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1ClosestPointDist.html#ac17ffcc1d95497105fe71f7b1a576f4c',1,'openvdb::v3_2_0::tools::internal::ClosestPointDist']]], + ['closestpointonsegmenttopoint',['closestPointOnSegmentToPoint',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a614bc75aa3ae09ff873b6d135dc4cb60',1,'openvdb::v3_2_0::math']]], + ['closestpointontriangletopoint',['closestPointOnTriangleToPoint',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a24eb4d50e7a633d920bffb959560ac42',1,'openvdb::v3_2_0::math']]], + ['closestpointprojector',['ClosestPointProjector',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestPointProjector.html#a80ee61ec938eaca7be182b50b3a1f65d',1,'openvdb::v3_2_0::tools::ClosestPointProjector::ClosestPointProjector()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestPointProjector.html#ae8f5f20d5238c7320c2ef884be22f4fd',1,'openvdb::v3_2_0::tools::ClosestPointProjector::ClosestPointProjector(const CptGridType &cptGrid, int n)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestPointProjector.html#a20cc9db932a51e508d56efa1b2d7f5e2',1,'openvdb::v3_2_0::tools::ClosestPointProjector::ClosestPointProjector(const ClosestPointProjector &other)']]], + ['closestsurfacepoint',['ClosestSurfacePoint',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestSurfacePoint.html#a02316f5d76399e04dd83db8c2d0ae2fb',1,'openvdb::v3_2_0::tools::ClosestSurfacePoint']]], + ['coarsestconsttree',['coarsestConstTree',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a7eb92b553fe3c0d5e1ea70cc9e0d6907',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['coarsestconsttreeptr',['coarsestConstTreePtr',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a8b86efc13bae612a705992902acdd735',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['coarsestlevel',['coarsestLevel',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a36765a628ea15b4aaa1f8258fec271a8',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['coarsesttree',['coarsestTree',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#ae0382a4ead702acf618777db703d1117',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['coarsesttreeptr',['coarsestTreePtr',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#aed36d867943d8dca1053b7c2bd665fd7',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['cofactor',['cofactor',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a3046a801fcc8bf2908e593b1d4f32477',1,'openvdb::v3_2_0::math::Mat3']]], + ['col',['col',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a0be7ef8d3fb41427f942546f4745e5ac',1,'openvdb::v3_2_0::math::Mat3::col()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a7f3f03ad0e44c62ba30750d445b4b1e9',1,'openvdb::v3_2_0::math::Mat4::col()']]], + ['collectcornervalues',['collectCornerValues',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a244219e22fda9ce03e6c9ab10297f3c2',1,'openvdb::v3_2_0::tools::internal::collectCornerValues(const LeafT &leaf, const Index offset, std::vector< double > &values)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a12e6c9936094e129b2725557a11e59ba',1,'openvdb::v3_2_0::tools::internal::collectCornerValues(const AccessorT &acc, const Coord &ijk, std::vector< double > &values)']]], + ['column',['column',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1ConstValueIter.html#a199de0c151fc2d728c7075b455e92fbc',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::ConstValueIter']]], + ['combine',['combine',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ae2ee6db19642244188d2fa4db7df1225',1,'openvdb::v3_2_0::tree::InternalNode::combine(InternalNode &other, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aff253b22319635ebad8bfcca2719003a',1,'openvdb::v3_2_0::tree::InternalNode::combine(const ValueType &value, bool valueIsActive, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a949b19d7cd86ab3945a8eb5e0f68e546',1,'openvdb::v3_2_0::tree::LeafNode::combine(const LeafNode &other, CombineOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#af91591f5f0da41c8662c7cc1ece29e06',1,'openvdb::v3_2_0::tree::LeafNode::combine(const ValueType &value, bool valueIsActive, CombineOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a949b19d7cd86ab3945a8eb5e0f68e546',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::combine(const LeafNode &other, CombineOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#af0da65877695f5ad134210d98f4d3c3b',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::combine(bool, bool valueIsActive, CombineOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a949b19d7cd86ab3945a8eb5e0f68e546',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::combine(const LeafNode &other, CombineOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#af0da65877695f5ad134210d98f4d3c3b',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::combine(bool, bool valueIsActive, CombineOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a2d0f6f48c7b53111118bf1a14a8dff03',1,'openvdb::v3_2_0::tree::RootNode::combine()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a11ca864d49b3df73bd482307bd800577',1,'openvdb::v3_2_0::tree::Tree::combine(Tree &other, CombineOp &op, bool prune=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a3d84c2c10bb99b93dd6be52bf153b43b',1,'openvdb::v3_2_0::tree::Tree::combine(Tree &other, const CombineOp &op, bool prune=false)']]], + ['combine2',['combine2',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a5d4331edaf20f7ae003e5cbf79349bd1',1,'openvdb::v3_2_0::tree::InternalNode::combine2(const InternalNode &other0, const OtherNodeType &other1, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a58de46634dd65d1fe2e2086accaa9b2d',1,'openvdb::v3_2_0::tree::InternalNode::combine2(const ValueType &value, const OtherNodeType &other, bool valIsActive, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a551c0e1b0cbb5ae00eee28bacc8f485a',1,'openvdb::v3_2_0::tree::InternalNode::combine2(const InternalNode &other, const OtherValueType &, bool valIsActive, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aa4357e9061a929862d8624e16d6a53bd',1,'openvdb::v3_2_0::tree::LeafNode::combine2(const LeafNode &other, const OtherType &, bool valueIsActive, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a71b82ba9fc3928aada4d493dec89be7d',1,'openvdb::v3_2_0::tree::LeafNode::combine2(const ValueType &, const OtherNodeT &other, bool valueIsActive, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#acfffe9e1e78fc6de78b890a2c2adaa44',1,'openvdb::v3_2_0::tree::LeafNode::combine2(const LeafNode &b0, const OtherNodeT &b1, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aa4357e9061a929862d8624e16d6a53bd',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::combine2(const LeafNode &other, const OtherType &, bool valueIsActive, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a24f1729c8fd269ad50d3aad78f98add4',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::combine2(bool, const OtherNodeT &other, bool valueIsActive, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#acfffe9e1e78fc6de78b890a2c2adaa44',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::combine2(const LeafNode &b0, const OtherNodeT &b1, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aa4357e9061a929862d8624e16d6a53bd',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::combine2(const LeafNode &other, const OtherType &, bool valueIsActive, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a24f1729c8fd269ad50d3aad78f98add4',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::combine2(bool, const OtherNodeT &other, bool valueIsActive, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#acfffe9e1e78fc6de78b890a2c2adaa44',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::combine2(const LeafNode &b0, const OtherNodeT &b1, CombineOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a59d05166d77d6604823a6e669f3b53f7',1,'openvdb::v3_2_0::tree::RootNode::combine2()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1RootNodeCombineHelper.html#a5ef2d44c98d26e65a4358489ca8c5488',1,'openvdb::v3_2_0::tree::RootNodeCombineHelper::combine2()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1RootNodeCombineHelper_3_01CombineOp_00_01RootT_00_01OtherRootT_00_01true_01_4.html#a5c3917fa037d57120324df9ea6d47db4',1,'openvdb::v3_2_0::tree::RootNodeCombineHelper< CombineOp, RootT, OtherRootT, true >::combine2()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#af1cbd79b5ac7b0898386849c5d93e4cc',1,'openvdb::v3_2_0::tree::Tree::combine2(const Tree &a, const OtherTreeType &b, CombineOp &op, bool prune=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#aa5795706d9693640529f8a55ac1001fc',1,'openvdb::v3_2_0::tree::Tree::combine2(const Tree &a, const OtherTreeType &b, const CombineOp &op, bool prune=false)']]], + ['combine2extended',['combine2Extended',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a878302f18a7f23adac7da7a9fc5f7441',1,'openvdb::v3_2_0::tree::Tree::combine2Extended(const Tree &a, const OtherTreeType &b, ExtendedCombineOp &op, bool prune=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a606623b3e96a1a62594583f54fdb30e0',1,'openvdb::v3_2_0::tree::Tree::combine2Extended(const Tree &a, const OtherTreeType &b, const ExtendedCombineOp &, bool prune=false)']]], + ['combineargs',['CombineArgs',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#ae69037e15d18f052688bbe751eac6199',1,'openvdb::v3_2_0::CombineArgs::CombineArgs()'],['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a3492cac0054304429935ada65f0fe782',1,'openvdb::v3_2_0::CombineArgs::CombineArgs(const AValueType &a, const BValueType &b, AValueType &result, bool aOn=false, bool bOn=false)'],['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a8e3a802901da29f19d424e6bfd4fa417',1,'openvdb::v3_2_0::CombineArgs::CombineArgs(const AValueType &a, const BValueType &b, bool aOn=false, bool bOn=false)']]], + ['combinedata',['combineData',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal.html#a8bae52770c226e8c22e527eb053d4827',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['combineextended',['combineExtended',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a71140d5e67f0fce2c7fe0ae119db9711',1,'openvdb::v3_2_0::tree::Tree::combineExtended(Tree &other, ExtendedCombineOp &op, bool prune=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#aa1557fead163be5539d36caffdbf0fb2',1,'openvdb::v3_2_0::tree::Tree::combineExtended(Tree &other, const ExtendedCombineOp &op, bool prune=false)']]], + ['combineleafnodes',['CombineLeafNodes',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1CombineLeafNodes.html#a69ecd22b280193f9773d3f8565ffcdcf',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::CombineLeafNodes']]], + ['combineopadapter',['CombineOpAdapter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1CombineOpAdapter.html#ad2d224316703cd37051d2a2cecc67bb9',1,'openvdb::v3_2_0::tree::CombineOpAdapter']]], + ['compdiv',['compDiv',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a2565bf7102af40b08386e7333ff96a6a',1,'openvdb::v3_2_0::tools']]], + ['compmax',['compMax',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#acf57bff918cf1f0be98f38a9fa18cce6',1,'openvdb::v3_2_0::tools']]], + ['compmin',['compMin',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a6e06fdbb69917492f3706fd07ead8adb',1,'openvdb::v3_2_0::tools']]], + ['compmul',['compMul',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a731304db65a743a015a7591eebf1c835',1,'openvdb::v3_2_0::tools']]], + ['component',['component',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a8f484f26fa31f4bbe63d6d7c71796e13',1,'openvdb::v3_2_0::math::Vec2::component()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ae99eb03cef2ece27e175199807ae4f8a',1,'openvdb::v3_2_0::math::Vec3::component()']]], + ['compositefromleaf',['compositeFromLeaf',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#afe32bb9a992beefce5dfd17319297268',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor']]], + ['compositefromtile',['compositeFromTile',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#a5c4aad82434eab4352a71cc44b6e1536',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor']]], + ['compositetodense',['compositeToDense',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac53b377981f3baf29cef347335e3588b',1,'openvdb::v3_2_0::tools']]], + ['compoundmap',['CompoundMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#a6bf39fb0d71eca30d681fe1adb2d1fc6',1,'openvdb::v3_2_0::math::CompoundMap::CompoundMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#aa42ac81a06ca34e3457863521a694470',1,'openvdb::v3_2_0::math::CompoundMap::CompoundMap(const FirstMapType &f, const SecondMapType &s)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#af5594229299e69497ad32ee5c49e6102',1,'openvdb::v3_2_0::math::CompoundMap::CompoundMap(const MyType &other)']]], + ['compreplace',['compReplace',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ae407286d51064dc0f07b441dab49798e',1,'openvdb::v3_2_0::tools']]], + ['compreplaceop',['CompReplaceOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CompReplaceOp.html#ad4225763b16eab017459c58462a397d1',1,'openvdb::v3_2_0::tools::CompReplaceOp']]], + ['compression',['compression',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#ac7b909b151a02c8cd69cbe56e5eea689',1,'openvdb::v3_2_0::io::Archive::compression()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#ac7b909b151a02c8cd69cbe56e5eea689',1,'openvdb::v3_2_0::io::StreamMetadata::compression()']]], + ['compressiontostring',['compressionToString',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a1d85a5811e062e2bcb0ce3bbb825a44a',1,'openvdb::v3_2_0::io']]], + ['compsum',['compSum',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aa6cbb5a769e8b017110c4a24fa84d248',1,'openvdb::v3_2_0::tools']]], + ['compute',['compute',['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature.html#a67cf36b3021e8e2ddae065739efcf2c0',1,'openvdb::v3_2_0::math::MeanCurvature::compute(const MapType &map, const Accessor &grid, const Coord &ijk, double &alpha, double &beta)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature.html#aa55c14648382ad9f282cbc79dacd944a',1,'openvdb::v3_2_0::math::MeanCurvature::compute(const MapType &map, const StencilT &stencil, double &alpha, double &beta)']]], + ['computeactivevoxelcount',['ComputeActiveVoxelCount',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ComputeActiveVoxelCount.html#acd61eda39095065ec1f52bd64cf3665d',1,'openvdb::v3_2_0::tools::level_set_util_internal::ComputeActiveVoxelCount']]], + ['computecellpoints',['computeCellPoints',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#ab81e591f2d6826b625a2ff3b49bf8920',1,'openvdb::v3_2_0::tools::internal::computeCellPoints(std::vector< Vec3d > &points, const std::vector< double > &values, unsigned char signs, double iso)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a66b081717743ee3701ad4f3e1448358a',1,'openvdb::v3_2_0::tools::internal::computeCellPoints(std::vector< Vec3d > &points, std::vector< bool > &weightedPointMask, const std::vector< double > &lhsValues, const std::vector< double > &rhsValues, unsigned char lhsSigns, unsigned char rhsSigns, double iso, size_t pointIdx, const boost::scoped_array< uint32_t > &seamPoints)']]], + ['computeenclosedregionmask',['computeEnclosedRegionMask',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal.html#ace4216536f72ce036b48eb5389069f4a',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['computeextremas',['ComputeExtremas',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1ComputeExtremas.html#ac97c90a4b5f81ba55350ae87ae6cb54e',1,'openvdb::v3_2_0::tools::particle_atlas_internal::ComputeExtremas::ComputeExtremas(const ParticleArrayT &particles)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1ComputeExtremas.html#aacdbc9cfd4494dde598c20e3b5003b46',1,'openvdb::v3_2_0::tools::particle_atlas_internal::ComputeExtremas::ComputeExtremas(ComputeExtremas &rhs, tbb::split)']]], + ['computeinteriormask',['computeInteriorMask',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal.html#a1fd7f60b1405ad39aaca76bf85b7abbd',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['computeintersectingvoxelsign',['ComputeIntersectingVoxelSign',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeIntersectingVoxelSign.html#abb321cc567591c970c99453414160124',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ComputeIntersectingVoxelSign']]], + ['computemaskedpoint',['computeMaskedPoint',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a088902175ab3304cdd2df518fd97a9f5',1,'openvdb::v3_2_0::tools::internal']]], + ['computenodeconnectivity',['ComputeNodeConnectivity',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeNodeConnectivity.html#a27c7bcab0d87c070987d3cde5be716d8',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ComputeNodeConnectivity']]], + ['computepoint',['computePoint',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#abbef057f73b9386e4530baa75274efe8',1,'openvdb::v3_2_0::tools::internal']]], + ['computepointorderop',['ComputePointOrderOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1ComputePointOrderOp.html#a185800b427a1483bb6e4693ec1b704e8',1,'openvdb::v3_2_0::tools::point_partitioner_internal::ComputePointOrderOp']]], + ['computeresidual',['computeResidual',['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal.html#a6880ef2d78157d066210bd882bba8bb3',1,'openvdb::v3_2_0::math::pcg::internal::computeResidual(const MatrixOperator &A, const VecValueType *x, const VecValueType *b, VecValueType *r)'],['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal.html#af1da82da87990bbcbb95d9eb85232b74',1,'openvdb::v3_2_0::math::pcg::internal::computeResidual(const MatrixOperator &A, const Vector< T > &x, const Vector< T > &b, Vector< T > &r)']]], + ['computeweightedpoint',['computeWeightedPoint',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a34cc93ab751c57cee7fc2af0885a46d2',1,'openvdb::v3_2_0::tools::internal']]], + ['conjugate',['conjugate',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a8bca90cfe6ad95fbfad606a1148b9217',1,'openvdb::v3_2_0::math::Quat']]], + ['connectinstance',['connectInstance',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#ad5ada41f415dfcf074ca7f54e476b36d',1,'openvdb::v3_2_0::io::Archive']]], + ['connectnodemasksegments',['ConnectNodeMaskSegments',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ConnectNodeMaskSegments.html#a16c40eba00de0e84f637b57d4525f051',1,'openvdb::v3_2_0::tools::level_set_util_internal::ConnectNodeMaskSegments']]], + ['consistent',['consistent',['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1BoolSampler.html#afd3da75b32679d899a56532f92469c8f',1,'openvdb::v3_2_0::tools::clip_internal::BoolSampler::consistent()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler.html#afd3da75b32679d899a56532f92469c8f',1,'openvdb::v3_2_0::tools::Sampler::consistent()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointSampler.html#afd3da75b32679d899a56532f92469c8f',1,'openvdb::v3_2_0::tools::PointSampler::consistent()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html#afd3da75b32679d899a56532f92469c8f',1,'openvdb::v3_2_0::tools::BoxSampler::consistent()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadraticSampler.html#afd3da75b32679d899a56532f92469c8f',1,'openvdb::v3_2_0::tools::QuadraticSampler::consistent()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredPointSampler.html#afd3da75b32679d899a56532f92469c8f',1,'openvdb::v3_2_0::tools::StaggeredPointSampler::consistent()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredBoxSampler.html#afd3da75b32679d899a56532f92469c8f',1,'openvdb::v3_2_0::tools::StaggeredBoxSampler::consistent()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredQuadraticSampler.html#afd3da75b32679d899a56532f92469c8f',1,'openvdb::v3_2_0::tools::StaggeredQuadraticSampler::consistent()']]], + ['constbasetree',['constBaseTree',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a291ddcfbaaa8cf12d4cb5fdc46673760',1,'openvdb::v3_2_0::GridBase']]], + ['constbasetreeptr',['constBaseTreePtr',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a7a60fbf0e04a1ef3d6aeaa06a6623caf',1,'openvdb::v3_2_0::GridBase::constBaseTreePtr()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#abd214a6b93c28bd9f49f9dd563e5c1eb',1,'openvdb::v3_2_0::Grid::constBaseTreePtr()']]], + ['constdata',['constData',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a4341d2f827b5e261162a4fa79f728271',1,'openvdb::v3_2_0::math::pcg::Vector']]], + ['constgrid',['constGrid',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a97a38625f14bb07028b2d421212f7d4b',1,'openvdb::v3_2_0::GridBase::constGrid(const GridBase::Ptr &)'],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a5bb25c5b41aff4990486300e23563c31',1,'openvdb::v3_2_0::GridBase::constGrid(const GridBase::ConstPtr &)']]], + ['constiterator',['ConstIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#aef44228e669dcefd36cced5bb991720c',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::ConstIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#ad87f97141d24bc3a4712a1f4aec2409d',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::ConstIterator(const PagedArray &parent, size_t pos=0)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#afb044f645b46fc5e7a195284d1a6270a',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::ConstIterator(const ConstIterator &other)']]], + ['constmap',['constMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#adf65608a7a7b5261379f64d36ed35b04',1,'openvdb::v3_2_0::math::Transform']]], + ['constrainedpointadvect',['ConstrainedPointAdvect',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#a2adaa467710807dd6b1a16d12f6f554b',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect::ConstrainedPointAdvect(const GridType &velGrid, const GridType &cptGrid, int cptn, InterrupterType *interrupter=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#a199763dfb5e9da6710d22fbd8071d73a',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect::ConstrainedPointAdvect(const ConstrainedPointAdvect &other)']]], + ['constrow',['ConstRow',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1ConstRow.html#a87dd10299c4ec745b0b2b6ebc50e08a5',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::ConstRow']]], + ['construct',['construct',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1GridOrTreeConstructor.html#a32385a69852237b41ca51ed81152ace4',1,'openvdb::v3_2_0::tools::composite::GridOrTreeConstructor::construct()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#a414ae952ae02c8e7e734cac711d4b7af',1,'openvdb::v3_2_0::tools::composite::GridOrTreeConstructor< Grid< TreeType > >::construct()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor.html#a32385a69852237b41ca51ed81152ace4',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor::construct()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#ace39da32f5a5d11e83419fb0db76fd30',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor< Grid< TreeType > >::construct()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#aeb2a850b58fe47895209998302a9dcef',1,'openvdb::v3_2_0::tools::ParticleAtlas::construct()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#aa0af19d1f0287f82b24cff5f77b7ad52',1,'openvdb::v3_2_0::tools::PointPartitioner::construct()']]], + ['constructexclusiveregions',['constructExclusiveRegions',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal.html#a8197248b4ff4ad4504f15101c7ffc196',1,'openvdb::v3_2_0::tools::point_index_grid_internal']]], + ['constructmask',['constructMask',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor.html#a21cadb00ae9974e9f5fb7cae1d6e0940',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor::constructMask()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#aa8f4033b4e63587a3e22d7f0b40cfeb7',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor< Grid< TreeType > >::constructMask()']]], + ['constructpointtree',['constructPointTree',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal.html#ad2e777aafd3c12122a47d2b2cf7a3454',1,'openvdb::v3_2_0::tools::point_index_grid_internal']]], + ['constructpolygons',['constructPolygons',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#ad5c70d17de6d7fc516428fb91add245c',1,'openvdb::v3_2_0::tools::internal']]], + ['constructvoxelmask',['ConstructVoxelMask',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ConstructVoxelMask.html#a8798198bd8facbb90362112e15d34ba8',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ConstructVoxelMask::ConstructVoxelMask(BoolTreeType &maskTree, const TreeType &tree, std::vector< LeafNodeType * > &nodes)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ConstructVoxelMask.html#a01178080897eaaf243be290324e86ae8',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ConstructVoxelMask::ConstructVoxelMask(ConstructVoxelMask &rhs, tbb::split)']]], + ['consttransform',['constTransform',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#abda6646a601c7ebe10ec13f0efae5073',1,'openvdb::v3_2_0::GridBase::constTransform()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#abda6646a601c7ebe10ec13f0efae5073',1,'openvdb::v3_2_0::tools::MultiResGrid::constTransform()']]], + ['consttransformptr',['constTransformPtr',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ad92c00bbd03b82fda2681e89c34650c4',1,'openvdb::v3_2_0::GridBase']]], + ['consttree',['constTree',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a6ef70dcd62995211874cac6487f00ec2',1,'openvdb::v3_2_0::Grid::constTree()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#afcc7c846254fe9a20e3d523163ad65d0',1,'openvdb::v3_2_0::TreeAdapter::constTree(TreeType &t)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a5fd80c2061e3cc23a0250981ccb9012d',1,'openvdb::v3_2_0::TreeAdapter::constTree(GridType &g)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#abeeac2c32b404986c2e67a21d69ef92e',1,'openvdb::v3_2_0::TreeAdapter::constTree(const TreeType &t)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a8c7bc6188b87c9446c83694fb535b519',1,'openvdb::v3_2_0::TreeAdapter::constTree(const GridType &g)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#afcc7c846254fe9a20e3d523163ad65d0',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::constTree(TreeType &t)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a5fd80c2061e3cc23a0250981ccb9012d',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::constTree(GridType &g)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#abeeac2c32b404986c2e67a21d69ef92e',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::constTree(const TreeType &t)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a8c7bc6188b87c9446c83694fb535b519',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::constTree(const GridType &g)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#afcc7c846254fe9a20e3d523163ad65d0',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::constTree(TreeType &t)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a5fd80c2061e3cc23a0250981ccb9012d',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::constTree(GridType &g)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#abeeac2c32b404986c2e67a21d69ef92e',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::constTree(const TreeType &t)'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a8c7bc6188b87c9446c83694fb535b519',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::constTree(const GridType &g)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a76f756441f36eb19b1c3b534e8f2ab1c',1,'openvdb::v3_2_0::tools::MultiResGrid::constTree()']]], + ['consttreeptr',['constTreePtr',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a5adb92c0475520d0e20112a00efb17e8',1,'openvdb::v3_2_0::Grid::constTreePtr()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#aa69c6a1cb8c6b23e9778e51dad631c49',1,'openvdb::v3_2_0::tools::MultiResGrid::constTreePtr()']]], + ['contiguousop',['ContiguousOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ContiguousOp.html#ae62c6c2322722ed99b1f37482e350596',1,'openvdb::v3_2_0::tools::ContiguousOp']]], + ['convert',['convert',['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf.html#ae5e2d01dca398b87d263c199efa15515',1,'openvdb::v3_2_0::io::RealToHalf::convert()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01float_01_4.html#a195124f1a57dc28503594ed64a2956f7',1,'openvdb::v3_2_0::io::RealToHalf< float >::convert()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01double_01_4.html#ad362f7042c9968ca9dd7d04d09199079',1,'openvdb::v3_2_0::io::RealToHalf< double >::convert()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec2s_01_4.html#afd54e53db0169e437d5ec3cd34bece4a',1,'openvdb::v3_2_0::io::RealToHalf< Vec2s >::convert()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec2d_01_4.html#ac415ca3946738cf86b424d9b45394c29',1,'openvdb::v3_2_0::io::RealToHalf< Vec2d >::convert()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec3s_01_4.html#aa4207204400e55cf36d8e612f9fbd8f5',1,'openvdb::v3_2_0::io::RealToHalf< Vec3s >::convert()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec3d_01_4.html#aca37ec91d45a2473a4852fc70b4951dc',1,'openvdb::v3_2_0::io::RealToHalf< Vec3d >::convert()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData.html#a897572e3a54bcf6d9d048542441d2174',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::convert()']]], + ['converttomaskgrid',['convertToMaskGrid',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal.html#a00ca079c4000eb9a701f044d83ddacb4',1,'openvdb::v3_2_0::tools::clip_internal::convertToMaskGrid(const GridT &grid)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal.html#a5e656ae00795b6be4847f0feecf3e97d',1,'openvdb::v3_2_0::tools::clip_internal::convertToMaskGrid(const GridT &grid)']]], + ['coord',['Coord',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a61cc7373f7d082a02ab2ff17bc52fc50',1,'openvdb::v3_2_0::math::Coord::Coord()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#ac3e58cec10e45a2132aa620c98499835',1,'openvdb::v3_2_0::math::Coord::Coord(Int32 xyz)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#add02d9a9ff61a8784c4adf04b6b5c25e',1,'openvdb::v3_2_0::math::Coord::Coord(Int32 x, Int32 y, Int32 z)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#add699d5e6cb22311a82d18531cbf1c0a',1,'openvdb::v3_2_0::math::Coord::Coord(const Vec3i &v)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a24d08c7657e06395274b4ccf9428b46a',1,'openvdb::v3_2_0::math::Coord::Coord(const Vec3I &v)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a778d20067306ad3dc6d0942f03d4b75c',1,'openvdb::v3_2_0::math::Coord::Coord(const Int32 *v)']]], + ['coordbbox',['CoordBBox',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a087daebb2c26d91ccca592bf091a11cf',1,'openvdb::v3_2_0::math::CoordBBox::CoordBBox()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a9b9d212ec0f25605ed1d53fc8909fc43',1,'openvdb::v3_2_0::math::CoordBBox::CoordBBox(const Coord &min, const Coord &max)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a5e98f0657bc54009b13540a2799395a1',1,'openvdb::v3_2_0::math::CoordBBox::CoordBBox(CoordBBox &other, const tbb::split &)']]], + ['coordtooffset',['coordToOffset',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutZYX_01_4.html#a237e07243c62f1a07cfa38c145915b1b',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutZYX >::coordToOffset()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutXYZ_01_4.html#a237e07243c62f1a07cfa38c145915b1b',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutXYZ >::coordToOffset()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a8a700a34b5d869f5ec48e19415e36e2f',1,'openvdb::v3_2_0::tools::Dense::coordToOffset()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a87e51328d0a2a73ad0bea8ba1a8c4b55',1,'openvdb::v3_2_0::tree::InternalNode::coordToOffset()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a87e51328d0a2a73ad0bea8ba1a8c4b55',1,'openvdb::v3_2_0::tree::LeafNode::coordToOffset()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a87e51328d0a2a73ad0bea8ba1a8c4b55',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::coordToOffset()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a87e51328d0a2a73ad0bea8ba1a8c4b55',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::coordToOffset()']]], + ['copy',['copy',['../classopenvdb_1_1v3__2__0_1_1Grid.html#ac7aa3f019c8503b7b4641477adf0a546',1,'openvdb::v3_2_0::Grid::copy()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#afd85d693c81c430035aa6d886314adf9',1,'openvdb::v3_2_0::io::Archive::copy()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#aa9e40f611bcaf723814c3ec2d311f5f9',1,'openvdb::v3_2_0::io::File::copy()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Stream.html#adf9fac9401913aa279e1a4074c2c6d18',1,'openvdb::v3_2_0::io::Stream::copy()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a7792fb776cf85d6ee1c1da9b4c30470c',1,'openvdb::v3_2_0::math::MapBase::copy()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a1010d36ae5bc5792a2ab818e0a38c9b6',1,'openvdb::v3_2_0::math::AffineMap::copy()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a1010d36ae5bc5792a2ab818e0a38c9b6',1,'openvdb::v3_2_0::math::ScaleMap::copy()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#a1010d36ae5bc5792a2ab818e0a38c9b6',1,'openvdb::v3_2_0::math::UniformScaleMap::copy()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a1010d36ae5bc5792a2ab818e0a38c9b6',1,'openvdb::v3_2_0::math::TranslationMap::copy()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a1010d36ae5bc5792a2ab818e0a38c9b6',1,'openvdb::v3_2_0::math::ScaleTranslateMap::copy()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#a1010d36ae5bc5792a2ab818e0a38c9b6',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::copy()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a1010d36ae5bc5792a2ab818e0a38c9b6',1,'openvdb::v3_2_0::math::UnitaryMap::copy()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a1010d36ae5bc5792a2ab818e0a38c9b6',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::copy()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a824dcd754978ef462688e40b7a3faa84',1,'openvdb::v3_2_0::math::Transform::copy()'],['../classopenvdb_1_1v3__2__0_1_1Metadata.html#abebb3028a711fc3ad393a4c4136e4618',1,'openvdb::v3_2_0::Metadata::copy() const =0'],['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a13ed7c55edb270ac19929dc5954c8a4f',1,'openvdb::v3_2_0::Metadata::copy(const Metadata &other)=0'],['../classopenvdb_1_1v3__2__0_1_1UnknownMetadata.html#a1511d00a5ccd1a48ebcd36479e9501e9',1,'openvdb::v3_2_0::UnknownMetadata::copy() const '],['../classopenvdb_1_1v3__2__0_1_1UnknownMetadata.html#a4cc2f2f7be82f06fadb95a978c76b306',1,'openvdb::v3_2_0::UnknownMetadata::copy(const Metadata &)'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#abf95b87f4d55bdf59fbddeb282e2724d',1,'openvdb::v3_2_0::TypedMetadata::copy() const '],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a785924fbf4ddedf4cd05e519b9e52101',1,'openvdb::v3_2_0::TypedMetadata::copy(const Metadata &other)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyToDense.html#a81a9220fe133875436f3666dc43651cf',1,'openvdb::v3_2_0::tools::CopyToDense::copy()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyFromDense.html#a2a447bd7467a4b067a5a8a6899937612',1,'openvdb::v3_2_0::tools::CopyFromDense::copy()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1CopyMasks.html#aaa6c087511a52e64fc9ad92820c7c0a8',1,'openvdb::v3_2_0::tools::Morphology::CopyMasks::copy()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseShader.html#a20b85a5baa2a50d1740253995437f094',1,'openvdb::v3_2_0::tools::BaseShader::copy()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MatteShader.html#aeec0b695b61af8f6d1ed95c556a2a738',1,'openvdb::v3_2_0::tools::MatteShader::copy()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MatteShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#aeec0b695b61af8f6d1ed95c556a2a738',1,'openvdb::v3_2_0::tools::MatteShader< Film::RGBA, SamplerType >::copy()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1NormalShader.html#aeec0b695b61af8f6d1ed95c556a2a738',1,'openvdb::v3_2_0::tools::NormalShader::copy()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1NormalShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#aeec0b695b61af8f6d1ed95c556a2a738',1,'openvdb::v3_2_0::tools::NormalShader< Film::RGBA, SamplerType >::copy()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PositionShader.html#aeec0b695b61af8f6d1ed95c556a2a738',1,'openvdb::v3_2_0::tools::PositionShader::copy()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PositionShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#aeec0b695b61af8f6d1ed95c556a2a738',1,'openvdb::v3_2_0::tools::PositionShader< Film::RGBA, SamplerType >::copy()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiffuseShader.html#aeec0b695b61af8f6d1ed95c556a2a738',1,'openvdb::v3_2_0::tools::DiffuseShader::copy()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiffuseShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#aeec0b695b61af8f6d1ed95c556a2a738',1,'openvdb::v3_2_0::tools::DiffuseShader< Film::RGBA, SamplerType >::copy()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#a12526a1a21d2d4f3294a19e99dd49586',1,'openvdb::v3_2_0::tools::PolygonPool::copy()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#ab232ff56a020051ec076f1eff64a87ed',1,'openvdb::v3_2_0::tree::TreeBase::copy()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a53d7ff7d6f0f9edd74040edebb377e61',1,'openvdb::v3_2_0::tree::Tree::copy()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#aa699f7fbdd98f5fed8400dabee3b9ea5',1,'openvdb::v3_2_0::tree::CacheItem::copy()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#aa699f7fbdd98f5fed8400dabee3b9ea5',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::copy()']]], + ['copyableopapplier',['CopyableOpApplier',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpApplier.html#a725a8a69e1ba845367f7035427f7dbee',1,'openvdb::v3_2_0::tools::valxform::CopyableOpApplier::CopyableOpApplier(const IterT &iter, const OpT &op)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpApplier.html#a3c778cda08ce514799d4a19f90ae5900',1,'openvdb::v3_2_0::tools::valxform::CopyableOpApplier::CopyableOpApplier(const CopyableOpApplier &other)']]], + ['copyableoptransformer',['CopyableOpTransformer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpTransformer.html#aa9bfe6cc529d5668b02eed0017d86e55',1,'openvdb::v3_2_0::tools::valxform::CopyableOpTransformer::CopyableOpTransformer(const InIterT &inIter, OutTreeT &outTree, const OpT &op, MergePolicy merge)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpTransformer.html#a3edd72961eeff9d7c48c713e37044e8f',1,'openvdb::v3_2_0::tools::valxform::CopyableOpTransformer::CopyableOpTransformer(CopyableOpTransformer &other, tbb::split)']]], + ['copyfromdense',['CopyFromDense',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyFromDense.html#a2504284ad5974d1746c22654a2425505',1,'openvdb::v3_2_0::tools::CopyFromDense::CopyFromDense(const DenseT &dense, TreeT &tree, const ValueT &tolerance)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyFromDense.html#a96971f216af17ceb27668695bb05f986',1,'openvdb::v3_2_0::tools::CopyFromDense::CopyFromDense(const CopyFromDense &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a289e54ea2a89b08bede71bf99da746e0',1,'openvdb::v3_2_0::tree::LeafNode::copyFromDense()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a9c324f013ba5c6e0785e8513af13f80b',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::copyFromDense()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a9c324f013ba5c6e0785e8513af13f80b',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::copyFromDense()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a718fc3e33310680728f4fbf04db240c0',1,'openvdb::v3_2_0::tools::copyFromDense()']]], + ['copyfromvecop',['CopyFromVecOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyFromVecOp.html#a4e7884877271cec0793d0b294bb5e778',1,'openvdb::v3_2_0::tools::poisson::internal::CopyFromVecOp']]], + ['copygrid',['copyGrid',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ae10e2122c71d4714e4aa046acf3732ab',1,'openvdb::v3_2_0::GridBase::copyGrid()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#af1a536fc02800fec973a31d86de389dd',1,'openvdb::v3_2_0::Grid::copyGrid()']]], + ['copyleafnodes',['CopyLeafNodes',['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1CopyLeafNodes.html#aff204ca66625690fe94e1961fd7962f6',1,'openvdb::v3_2_0::tools::clip_internal::CopyLeafNodes::CopyLeafNodes(const TreeT &tree, const MaskLeafManagerT &leafNodes)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1CopyLeafNodes.html#abd2c955959a25a29209a50e840eb3a72',1,'openvdb::v3_2_0::tools::clip_internal::CopyLeafNodes::CopyLeafNodes(CopyLeafNodes &, tbb::split)']]], + ['copymasks',['CopyMasks',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1CopyMasks.html#aac50368a0b3ee18632381d5f5eb3b40b',1,'openvdb::v3_2_0::tools::Morphology::CopyMasks::CopyMasks()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a93bbf460ee68e7d9220ff66b3575f3ff',1,'openvdb::v3_2_0::tools::Morphology::copyMasks()']]], + ['copymaxbytes',['copyMaxBytes',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a64fc28d8b0f757f486a48f842cd1c097',1,'openvdb::v3_2_0::io::File']]], + ['copymeta',['copyMeta',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a917bd2bd66ecb9f8ab71fa75cda8ced5',1,'openvdb::v3_2_0::MetaMap']]], + ['copyop',['CopyOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1CopyOp.html#a2090a9d0023bd9444a2aa50a406e212c',1,'openvdb::v3_2_0::math::pcg::internal::CopyOp']]], + ['copytodense',['CopyToDense',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyToDense.html#a43fed35aba8de7a61dda0be758c33e35',1,'openvdb::v3_2_0::tools::CopyToDense::CopyToDense()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#addb6357bae687189b953c677911834ea',1,'openvdb::v3_2_0::tree::InternalNode::copyToDense()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#addb6357bae687189b953c677911834ea',1,'openvdb::v3_2_0::tree::LeafNode::copyToDense()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#addb6357bae687189b953c677911834ea',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::copyToDense()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#addb6357bae687189b953c677911834ea',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::copyToDense()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#addb6357bae687189b953c677911834ea',1,'openvdb::v3_2_0::tree::RootNode::copyToDense()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#acbd41a08ed8ea7c1a7d33146b8d17ce1',1,'openvdb::v3_2_0::tools::copyToDense()']]], + ['copytovecop',['CopyToVecOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyToVecOp.html#a6a1f9701b2a12d390b3cc453d8d3fca1',1,'openvdb::v3_2_0::tools::poisson::internal::CopyToVecOp']]], + ['copywithvalueconversion',['copyWithValueConversion',['../structopenvdb_1_1v3__2__0_1_1tree_1_1RootNodeCopyHelper.html#a93b8d7180a98f1b1b8e0986163e4aae3',1,'openvdb::v3_2_0::tree::RootNodeCopyHelper::copyWithValueConversion()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1RootNodeCopyHelper_3_01RootT_00_01OtherRootT_00_01true_01_4.html#a93b8d7180a98f1b1b8e0986163e4aae3',1,'openvdb::v3_2_0::tree::RootNodeCopyHelper< RootT, OtherRootT, true >::copyWithValueConversion()']]], + ['correctcellsigns',['correctCellSigns',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a43218d1598cab0f49231609a8948d183',1,'openvdb::v3_2_0::tools::internal']]], + ['count',['count',['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html#a62bdeeb76a6d430f526217f87befafc9',1,'openvdb::v3_2_0::math::Histogram']]], + ['countoff',['countOff',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a5f6cd7e807b3cd887c60051470c448cb',1,'openvdb::v3_2_0::util::NodeMask::countOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a5f6cd7e807b3cd887c60051470c448cb',1,'openvdb::v3_2_0::util::NodeMask< 1 >::countOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a5f6cd7e807b3cd887c60051470c448cb',1,'openvdb::v3_2_0::util::NodeMask< 2 >::countOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a5f6cd7e807b3cd887c60051470c448cb',1,'openvdb::v3_2_0::util::RootNodeMask::countOff()'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#aab84c305a75f3d05f633407106a9a5a8',1,'openvdb::v3_2_0::util::CountOff(Byte v)'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a09978d0038dea46cd77b10648d1e568b',1,'openvdb::v3_2_0::util::CountOff(Index32 v)'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a34e3ebbf197ad5357998b69b8db9da23',1,'openvdb::v3_2_0::util::CountOff(Index64 v)']]], + ['counton',['countOn',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ad1202e4cc590890141fda37573fc73f4',1,'openvdb::v3_2_0::util::NodeMask::countOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ad1202e4cc590890141fda37573fc73f4',1,'openvdb::v3_2_0::util::NodeMask< 1 >::countOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ad1202e4cc590890141fda37573fc73f4',1,'openvdb::v3_2_0::util::NodeMask< 2 >::countOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#ad1202e4cc590890141fda37573fc73f4',1,'openvdb::v3_2_0::util::RootNodeMask::countOn()'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a7a7908d2c22e8ff2168a9e1cb3efb218',1,'openvdb::v3_2_0::util::CountOn(Byte v)'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a223df068851e6dd567f95d3c32e20637',1,'openvdb::v3_2_0::util::CountOn(Index32 v)'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a34d5b4fee017cb29e944cc09a1a6269e',1,'openvdb::v3_2_0::util::CountOn(Index64 v)']]], + ['countpoints',['CountPoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1CountPoints.html#a85c6d8ef7db8837d3fda510501b1be2c',1,'openvdb::v3_2_0::tools::internal::CountPoints']]], + ['countregions',['CountRegions',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1CountRegions.html#a0dcc0e73a924e35bdf00465693f05fd6',1,'openvdb::v3_2_0::tools::internal::CountRegions']]], + ['cpt',['Cpt',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Cpt.html#a5c6b7dc880f1eb2fa6ee1d8330cd697f',1,'openvdb::v3_2_0::tools::Cpt::Cpt(const InGridType &grid, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Cpt.html#ad9d049907f8ef68e5b0b4b8a465ef3e0',1,'openvdb::v3_2_0::tools::Cpt::Cpt(const InGridType &grid, const MaskGridType &mask, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#a75809572157e6a29470d5944da63b1a2',1,'openvdb::v3_2_0::math::GradStencil::cpt()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aea23457a3376d6fb611bd3f46fdffd61',1,'openvdb::v3_2_0::tools::cpt(const GridType &grid, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a0a4a7dc00308e20a77a2dfd6cb598fb4',1,'openvdb::v3_2_0::tools::cpt(const GridType &grid, const MaskT &mask, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aeba6cd930ed4bc249a65c00062fc4207',1,'openvdb::v3_2_0::tools::cpt(const GridType &grid, bool threaded=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8adfac1b1bf2c301b2f05c61b164d676',1,'openvdb::v3_2_0::tools::cpt(const GridType &grid, const MaskT &mask, bool threaded=true)']]], + ['cputimer',['CpuTimer',['../classopenvdb_1_1v3__2__0_1_1util_1_1CpuTimer.html#a115479c65160f4641ecb264a54d046db',1,'openvdb::v3_2_0::util::CpuTimer::CpuTimer()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1CpuTimer.html#a17e33ec46dd8786c119093579e04b2fa',1,'openvdb::v3_2_0::util::CpuTimer::CpuTimer(const std::string &msg)']]], + ['create',['create',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a39267dfda5946944127d4c07660a6aca',1,'openvdb::v3_2_0::Grid::create(const ValueType &background)'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#afed9748b2280ee9155aa1033cc583bc7',1,'openvdb::v3_2_0::Grid::create()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#af72d392d1045aace3bfd5fa6fd89c990',1,'openvdb::v3_2_0::Grid::create(TreePtrType)'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a422f199a2a36cb9c8071848bf88dd1b4',1,'openvdb::v3_2_0::Grid::create(const GridBase &other)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#ae134aba64f8edaf48c048ca2691d32fc',1,'openvdb::v3_2_0::math::AffineMap::create()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#ae134aba64f8edaf48c048ca2691d32fc',1,'openvdb::v3_2_0::math::ScaleMap::create()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#ae134aba64f8edaf48c048ca2691d32fc',1,'openvdb::v3_2_0::math::UniformScaleMap::create()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#ae134aba64f8edaf48c048ca2691d32fc',1,'openvdb::v3_2_0::math::TranslationMap::create()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#ae134aba64f8edaf48c048ca2691d32fc',1,'openvdb::v3_2_0::math::ScaleTranslateMap::create()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#ae134aba64f8edaf48c048ca2691d32fc',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::create()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#ae134aba64f8edaf48c048ca2691d32fc',1,'openvdb::v3_2_0::math::UnitaryMap::create()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#ae134aba64f8edaf48c048ca2691d32fc',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::create()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#a0bd97b1267c16e7a155de6bd749d55a1',1,'openvdb::v3_2_0::tools::ParticleAtlas::create()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#a8e02056d88f6e435e41c995e8a76347c',1,'openvdb::v3_2_0::tools::PointPartitioner::create()']]], + ['createbuffer',['createBuffer',['../classopenvdb_1_1v3__2__0_1_1io_1_1MappedFile.html#a3e1688b7f10934174e8933e674d63397',1,'openvdb::v3_2_0::io::MappedFile']]], + ['createcube',['createCube',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#af3efaad6be387908a12ac3d4a100a54c',1,'openvdb::v3_2_0::math::CoordBBox']]], + ['createdecomposedmap',['createDecomposedMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a82d29693bd9670e4272047cf470e680b',1,'openvdb::v3_2_0::math::AffineMap']]], + ['createfrustumtransform',['createFrustumTransform',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#af8ef59b26c980aeacc0ab6add4588fb4',1,'openvdb::v3_2_0::math::Transform']]], + ['createfullydecomposedmap',['createFullyDecomposedMap',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab44f023057c07b70c16abe5383b0fcd3',1,'openvdb::v3_2_0::math']]], + ['creategrid',['createGrid',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ad6d401b513d472cbc27ee4a4c106dde2',1,'openvdb::v3_2_0::GridBase::createGrid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#aff6a86cdd0ee702b166f6eb0200b06fb',1,'openvdb::v3_2_0::tools::MultiResGrid::createGrid(float level, size_t grainSize=1) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a00901fbcb171803dff168f7b89b6e3b1',1,'openvdb::v3_2_0::tools::MultiResGrid::createGrid(float level, size_t grainSize) const '],['../namespaceopenvdb_1_1v3__2__0.html#ac43068080f663736cfc10a62c6a0827f',1,'openvdb::v3_2_0::createGrid(const typename GridType::ValueType &background)'],['../namespaceopenvdb_1_1v3__2__0.html#afff9e378bd451ec1c5501aa0d88bbdaf',1,'openvdb::v3_2_0::createGrid()'],['../namespaceopenvdb_1_1v3__2__0.html#ae7abc829f5ce06ff3c78633d4d566a76',1,'openvdb::v3_2_0::createGrid(TreePtrType)']]], + ['createindextree',['createIndexTree',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#a84c81c332ed27260f4cefebebe118786',1,'openvdb::v3_2_0::tools::poisson']]], + ['createislaplacian',['createISLaplacian',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#ada80868d7035f164b6a0aa873ad74f3b',1,'openvdb::v3_2_0::tools::poisson']]], + ['createislaplacianwithboundaryconditions',['createISLaplacianWithBoundaryConditions',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#a32e29d8e019b250a9a3474d5d9bbb7d5',1,'openvdb::v3_2_0::tools::poisson']]], + ['createlevelset',['createLevelSet',['../namespaceopenvdb_1_1v3__2__0.html#ab5fa070ff38ad858c9b4b61fca2a4a76',1,'openvdb::v3_2_0']]], + ['createlevelsetbox',['createLevelSetBox',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a9a314c42b9d506bd60c1acdd6f41aac7',1,'openvdb::v3_2_0::tools']]], + ['createlevelsetcube',['createLevelSetCube',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a42058c9b02754dedba9ff02abf780b32',1,'openvdb::v3_2_0::tools::createLevelSetCube(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH), InterruptT *interrupt=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8f38b22629d0d358e1c59492b756a238',1,'openvdb::v3_2_0::tools::createLevelSetCube(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH))']]], + ['createlevelsetdodecahedron',['createLevelSetDodecahedron',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#af615687f0b6d3075b3096088db195a62',1,'openvdb::v3_2_0::tools::createLevelSetDodecahedron(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH), InterruptT *interrupt=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8cc4fdecd7d9a22ed2be0573f8d8013b',1,'openvdb::v3_2_0::tools::createLevelSetDodecahedron(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH))']]], + ['createlevelseticosahedron',['createLevelSetIcosahedron',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#afef26721d8235b87a802ddef9874bba8',1,'openvdb::v3_2_0::tools::createLevelSetIcosahedron(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH), InterruptT *interrupt=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a6aaf267ab0fbf64fceeadb29214235ff',1,'openvdb::v3_2_0::tools::createLevelSetIcosahedron(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH))']]], + ['createlevelsetoctahedron',['createLevelSetOctahedron',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a2cd1973d300aca22cb7efa8cc667e7f5',1,'openvdb::v3_2_0::tools::createLevelSetOctahedron(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH), InterruptT *interrupt=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ada248c256046dd7df10fe72dca9f19a9',1,'openvdb::v3_2_0::tools::createLevelSetOctahedron(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH))']]], + ['createlevelsetplatonic',['createLevelSetPlatonic',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a484af5e13319b4537ed4bd4a44eaaffa',1,'openvdb::v3_2_0::tools::createLevelSetPlatonic(int faceCount, float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH), InterruptT *interrupt=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a3c3aa73be3827a009a86249c28afbba0',1,'openvdb::v3_2_0::tools::createLevelSetPlatonic(int faceCount, float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH))']]], + ['createlevelsetsphere',['createLevelSetSphere',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a3a2625fb8ecc82eeb5f5e9b0a32eea6f',1,'openvdb::v3_2_0::tools::createLevelSetSphere(float radius, const openvdb::Vec3f &center, float voxelSize, float halfWidth=float(LEVEL_SET_HALF_WIDTH), InterruptT *interrupt=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ae5debd785e0e6e25b999fc34b5f64dd0',1,'openvdb::v3_2_0::tools::createLevelSetSphere(float radius, const openvdb::Vec3f &center, float voxelSize, float halfWidth=float(LEVEL_SET_HALF_WIDTH))']]], + ['createlevelsettetrahedron',['createLevelSetTetrahedron',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a1121012745c5a6f8a842457fb37f494a',1,'openvdb::v3_2_0::tools::createLevelSetTetrahedron(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH), InterruptT *interrupt=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a5ad3e3b59f8580c4feccb195e75262ff',1,'openvdb::v3_2_0::tools::createLevelSetTetrahedron(float scale=1.0f, const Vec3f &center=Vec3f(0.0f), float voxelSize=0.1f, float halfWidth=float(LEVEL_SET_HALF_WIDTH))']]], + ['createlineartransform',['createLinearTransform',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#ae35abe5d5592d24a97725f90eb3ce3f1',1,'openvdb::v3_2_0::math::Transform::createLinearTransform(double voxelSize=1.0)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#aafb14b2a556645b1b026860a98ec8783',1,'openvdb::v3_2_0::math::Transform::createLinearTransform(const Mat4R &)']]], + ['createmap',['createMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapRegistry.html#a081f9ac95d12bf8808eb379793fb5a14',1,'openvdb::v3_2_0::math::MapRegistry']]], + ['createmetadata',['createMetadata',['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a53362877f5b2a7b70a2445dee3db7150',1,'openvdb::v3_2_0::Metadata::createMetadata()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a9a0b39ccd9cb2771e4ccb5a69ea71a17',1,'openvdb::v3_2_0::TypedMetadata::createMetadata()']]], + ['createorderedpointindexarrayop',['CreateOrderedPointIndexArrayOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1CreateOrderedPointIndexArrayOp.html#a64c0eeeec3e4cf21d4cce3dd1cc1299e',1,'openvdb::v3_2_0::tools::point_partitioner_internal::CreateOrderedPointIndexArrayOp']]], + ['createpointindexgrid',['createPointIndexGrid',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aec6960746cc5165cf6ac1252ad7bc5d4',1,'openvdb::v3_2_0::tools::createPointIndexGrid(const PointArrayT &points, double voxelSize)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a271fec55592c87ddf1f04a02207cfb34',1,'openvdb::v3_2_0::tools::createPointIndexGrid(const PointArrayT &points, const math::Transform &xform)']]], + ['createpointmaskgrid',['createPointMaskGrid',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a1cc5fc0a68de45f80418d99f1cc63a16',1,'openvdb::v3_2_0::tools']]], + ['createpolardecomposedmap',['createPolarDecomposedMap',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aad22536049a55adae65e78705bbd7689',1,'openvdb::v3_2_0::math']]], + ['createsymmetricmap',['createSymmetricMap',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7e9dbd39ac419c3dddff1960c2cddfb4',1,'openvdb::v3_2_0::math']]], + ['createtreefromvector',['createTreeFromVector',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#ad247afd9be5bc45c0ef563dfdcf9f521',1,'openvdb::v3_2_0::tools::poisson']]], + ['createvectorfromtree',['createVectorFromTree',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#aaafc8a2a26f1f3f386afd16268b8c19b',1,'openvdb::v3_2_0::tools::poisson']]], + ['cross',['cross',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a99037ba5899ae267ba45585e133738e9',1,'openvdb::v3_2_0::math::Vec3::cross(const Vec3< T > &v) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a2e28b8fd05221497f5ad5620b875c683',1,'openvdb::v3_2_0::math::Vec3::cross(const Vec3< T > &v1, const Vec3< T > &v2)']]], + ['crossdifference',['crossdifference',['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#a7d789635d205e3a3ab8b3f12bc45d5b7',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::crossdifference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#a1745a78b657ed1912d5741907ae544f5',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::crossdifference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#a2c82adf63f86ccbac0686fd8552b8943',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::crossdifference()']]], + ['csgdifference',['csgDifference',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a28a450f27165e0dbfa59e79652ae8ec4',1,'openvdb::v3_2_0::tools']]], + ['csgdifferencecopy',['csgDifferenceCopy',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a51b0c8963cdd9ec4c9078a0853718c51',1,'openvdb::v3_2_0::tools']]], + ['csgdiffvisitor',['CsgDiffVisitor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgDiffVisitor.html#af92186848ef25d6765e51c772a537e02',1,'openvdb::v3_2_0::tools::CsgDiffVisitor']]], + ['csgintersection',['csgIntersection',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac6851d766bae22bdff30bbc8f9167ab9',1,'openvdb::v3_2_0::tools']]], + ['csgintersectioncopy',['csgIntersectionCopy',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#af7e07475d9dc9f2daa3685e76ecd3127',1,'openvdb::v3_2_0::tools']]], + ['csgintersectvisitor',['CsgIntersectVisitor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgIntersectVisitor.html#aa950b2e32c8bc2c9f396eb7bc809f2fb',1,'openvdb::v3_2_0::tools::CsgIntersectVisitor']]], + ['csgunion',['csgUnion',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a63ca059a52fa4df11baa7f641a1e3611',1,'openvdb::v3_2_0::tools']]], + ['csgunioncopy',['csgUnionCopy',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#afa1ebc9f997633bf7fe7ec74dfb27b8e',1,'openvdb::v3_2_0::tools']]], + ['csgunionvisitor',['CsgUnionVisitor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgUnionVisitor.html#ac3ba7f54e88395fe7c0a1139fd0a8d7c',1,'openvdb::v3_2_0::tools::CsgUnionVisitor']]], + ['csgvisitorbase',['CsgVisitorBase',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CsgVisitorBase.html#a236eb3bc96cf0522b009c7ecfa108de4',1,'openvdb::v3_2_0::tools::CsgVisitorBase']]], + ['curl',['Curl',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Curl.html#a04ccba9cd0cd462c37a164144e15acb8',1,'openvdb::v3_2_0::tools::Curl::Curl(const GridT &grid, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Curl.html#a7413e0e76f305f91e94b8f5e4ff6a516',1,'openvdb::v3_2_0::tools::Curl::Curl(const GridT &grid, const MaskGridType &mask, InterruptT *interrupt=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a1d7270767850c4f3241bce09b730d84a',1,'openvdb::v3_2_0::tools::curl(const GridType &grid, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8b2279de4cd703914497d7733aefbb6e',1,'openvdb::v3_2_0::tools::curl(const GridType &grid, const MaskT &mask, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#afea8f4fb12aabdfbb04f8b6835ff3670',1,'openvdb::v3_2_0::tools::curl(const GridType &grid, bool threaded=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac687a3b1d4c6532f1a379c2406ef38d9',1,'openvdb::v3_2_0::tools::curl(const GridType &grid, const MaskT &mask, bool threaded=true)']]], + ['curvaturestencil',['CurvatureStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1CurvatureStencil.html#a1b6f1d2e813854435dac4fb869d077ba',1,'openvdb::v3_2_0::math::CurvatureStencil::CurvatureStencil(const GridType &grid)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CurvatureStencil.html#a195ec8e03fe742578019bc7c3953b16a',1,'openvdb::v3_2_0::math::CurvatureStencil::CurvatureStencil(const GridType &grid, Real dx)']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_3.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_3.html new file mode 100644 index 00000000..8a4bbe14 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_3.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_3.js new file mode 100644 index 00000000..846d8c51 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_3.js @@ -0,0 +1,71 @@ +var searchData= +[ + ['data',['data',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a1699472936b80a88d3fc8096975d21b2',1,'openvdb::v3_2_0::math::pcg::Vector::data()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a92597b6ad54c8cebd6a987b7762eecfc',1,'openvdb::v3_2_0::math::pcg::Vector::data() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#afbaa77fc55aea2424364dad79af5b0fe',1,'openvdb::v3_2_0::math::Coord::data() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a1241bc81ce8071fb5bbb0f123eb4344b',1,'openvdb::v3_2_0::math::Coord::data()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a903161492cf665721519d65b502020b2',1,'openvdb::v3_2_0::tools::Dense::data()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a2fd3db6ca9f5e112fa00e1e54d608ca9',1,'openvdb::v3_2_0::tools::Dense::data() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1Array.html#a1699472936b80a88d3fc8096975d21b2',1,'openvdb::v3_2_0::tools::point_partitioner_internal::Array::data()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1Array.html#a92597b6ad54c8cebd6a987b7762eecfc',1,'openvdb::v3_2_0::tools::point_partitioner_internal::Array::data() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#a949a7e3a6833e71310b6f6291cfce7b1',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::data() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#a4bc7909bad8fff8e807921ee90421611',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::data()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#a56ee983527d60d1695f791bd41e0df66',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::data()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#a1e8a0fe67b38cb23b7cbdfbf2b0680d8',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::data() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#a56ee983527d60d1695f791bd41e0df66',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::data()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#a1e8a0fe67b38cb23b7cbdfbf2b0680d8',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::data() const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html#a903161492cf665721519d65b502020b2',1,'openvdb::v3_2_0::util::PagedArray::Page::data()']]], + ['dda',['DDA',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#aa312de6e2d684d6546758c4c78bed032',1,'openvdb::v3_2_0::math::DDA::DDA()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#a50df510511ad8df53a97651994e4b49f',1,'openvdb::v3_2_0::math::DDA::DDA(const RayT &ray)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#a56e4ca108e902dc2df3dc9b935a6e319',1,'openvdb::v3_2_0::math::DDA::DDA(const RayT &ray, RealT startTime)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#a620f34730ddecf00371b6b6cfe0de15c',1,'openvdb::v3_2_0::math::DDA::DDA(const RayT &ray, RealT startTime, RealT maxTime)']]], + ['deactivate',['deactivate',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#abc78330c21bf8fc7b0840d7ab6f0675d',1,'openvdb::v3_2_0::tools']]], + ['deallocateleafnodes',['DeallocateLeafNodes',['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree_1_1DeallocateLeafNodes.html#a2661e13a4ca1300f34d41240fa410530',1,'openvdb::v3_2_0::tree::Tree::DeallocateLeafNodes']]], + ['decompose',['decompose',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1local__util.html#ae22987036217b9910f630a74b87adf14',1,'openvdb::v3_2_0::tools::local_util']]], + ['deepcopy',['DeepCopy',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DeepCopy.html#a808198ca123e401dbdd7d3b2323168c8',1,'openvdb::v3_2_0::tree::InternalNode::DeepCopy::DeepCopy()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a5b45322d0be54737e8481836fc8800e0',1,'openvdb::v3_2_0::Grid::deepCopy()']]], + ['deepcopygrid',['deepCopyGrid',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ae8a120f6dc33b84a9809c86b26fea949',1,'openvdb::v3_2_0::GridBase::deepCopyGrid()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a57549f1d2e3317403a5f057b8ca6308e',1,'openvdb::v3_2_0::Grid::deepCopyGrid()']]], + ['deepcopymeta',['deepCopyMeta',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a91e0bdd50e2420935f2da5abe6f6c2c6',1,'openvdb::v3_2_0::MetaMap']]], + ['deepcopytypedgrid',['deepCopyTypedGrid',['../namespaceopenvdb_1_1v3__2__0.html#a0bc462a7d672bd71592a3b819177b778',1,'openvdb::v3_2_0::deepCopyTypedGrid(const GridBase::ConstPtr &grid)'],['../namespaceopenvdb_1_1v3__2__0.html#a422e9a34e7a911149de20ccd1b32d85c',1,'openvdb::v3_2_0::deepCopyTypedGrid(const GridBase &grid)']]], + ['delta',['delta',['../classopenvdb_1_1v3__2__0_1_1util_1_1CpuTimer.html#abbefaf15cc532f26ad86bf9a2d9a413d',1,'openvdb::v3_2_0::util::CpuTimer']]], + ['dense',['Dense',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a5f5739420a709fa9476cedc15bc851a8',1,'openvdb::v3_2_0::tools::Dense::Dense(const CoordBBox &bbox)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a3b42c43a90b29068b8f52aea1c382f6d',1,'openvdb::v3_2_0::tools::Dense::Dense(const CoordBBox &bbox, const ValueT &value)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a6a104ab11937b8dd63e33064173c4b4b',1,'openvdb::v3_2_0::tools::Dense::Dense(const CoordBBox &bbox, ValueT *data)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a0801a73ddce1537d47ae1a15d8cba87d',1,'openvdb::v3_2_0::tools::Dense::Dense(const Coord &dim, const Coord &min=Coord(0))']]], + ['densebase',['DenseBase',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutZYX_01_4.html#a4e4d4dead046c455993d35a2a05020aa',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutZYX >::DenseBase()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutXYZ_01_4.html#a4e4d4dead046c455993d35a2a05020aa',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutXYZ >::DenseBase()']]], + ['densecomposite',['denseComposite',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#af637deaa212600f808b571ef5f9b0e98',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor']]], + ['denseiter',['DenseIter',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DenseIter.html#a9a2e38ab99cfe7d07a01aefec1046205',1,'openvdb::v3_2_0::tree::InternalNode::DenseIter::DenseIter()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DenseIter.html#a3df54e96a2404c0bc06a875ee363880b',1,'openvdb::v3_2_0::tree::InternalNode::DenseIter::DenseIter(const MaskDenseIterator &iter, NodeT *parent)'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1DenseIter.html#a9a2e38ab99cfe7d07a01aefec1046205',1,'openvdb::v3_2_0::tree::LeafNode::DenseIter::DenseIter()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1DenseIter.html#a3df54e96a2404c0bc06a875ee363880b',1,'openvdb::v3_2_0::tree::LeafNode::DenseIter::DenseIter(const MaskDenseIterator &iter, NodeT *parent)'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1DenseIter.html#a9a2e38ab99cfe7d07a01aefec1046205',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::DenseIter::DenseIter()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1DenseIter.html#a9dacef68980747270285e00bf55435b2',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::DenseIter::DenseIter(const MaskDenseIter &iter, NodeT *parent)'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1DenseIter.html#a9a2e38ab99cfe7d07a01aefec1046205',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::DenseIter::DenseIter()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1DenseIter.html#a9dacef68980747270285e00bf55435b2',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::DenseIter::DenseIter(const MaskDenseIter &iter, NodeT *parent)']]], + ['denseiterator',['DenseIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1DenseIterator.html#a13934667d577a0f2e41a63b00d272b8f',1,'openvdb::v3_2_0::util::RootNodeMask::DenseIterator::DenseIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1DenseIterator.html#a28e4d4f809a6802a5802c78040aa6d49',1,'openvdb::v3_2_0::util::RootNodeMask::DenseIterator::DenseIterator(Index32 pos, const RootNodeMask *parent)']]], + ['denseiteratorbase',['DenseIteratorBase',['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a0367a3dacc4199a0c231a69df628a64c',1,'openvdb::v3_2_0::tree::DenseIteratorBase::DenseIteratorBase()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a62a4f8ec100dd56d3d8799cc51cbf2d0',1,'openvdb::v3_2_0::tree::DenseIteratorBase::DenseIteratorBase(const MaskIterT &iter, NodeT *parent)']]], + ['densemaskiterator',['DenseMaskIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1DenseMaskIterator.html#a35ac790e47e703ec7176089b66ed66b2',1,'openvdb::v3_2_0::util::DenseMaskIterator::DenseMaskIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1DenseMaskIterator.html#a6a13dd771a1f8289c3bba6d2fe318d66',1,'openvdb::v3_2_0::util::DenseMaskIterator::DenseMaskIterator(Index32 pos, const NodeMask *parent)']]], + ['densestencil',['DenseStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1DenseStencil.html#ab3eada6ac10139133097790087a02799',1,'openvdb::v3_2_0::math::DenseStencil']]], + ['densetransformer',['DenseTransformer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseTransformer.html#a36c777705a3f82ce26495095e0cce6d1',1,'openvdb::v3_2_0::tools::DenseTransformer::DenseTransformer(DenseT &dense, const openvdb::math::CoordBBox &bbox, const OpType &functor)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseTransformer.html#a3b3fdba06ec99a246fe99db494bc0119',1,'openvdb::v3_2_0::tools::DenseTransformer::DenseTransformer(const DenseTransformer &other)']]], + ['denseuniformpointscatter',['DenseUniformPointScatter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseUniformPointScatter.html#ab268e039e28fb342bd30d1079ca1136f',1,'openvdb::v3_2_0::tools::DenseUniformPointScatter']]], + ['dequetoarray',['dequeToArray',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal.html#ae340677c8733e440f517e5721fbea5b6',1,'openvdb::v3_2_0::tools::point_index_grid_internal']]], + ['derivative',['derivative',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ab768629508bb0df31c74ff405baf4646',1,'openvdb::v3_2_0::math::Quat']]], + ['det',['det',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a67ccc6cfa482de0cf47a6ff7124a2b81',1,'openvdb::v3_2_0::math::Mat3::det()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a67ccc6cfa482de0cf47a6ff7124a2b81',1,'openvdb::v3_2_0::math::Mat4::det()']]], + ['determinant',['determinant',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a4ff529b8331f4a417b5bf11278714c91',1,'openvdb::v3_2_0::math::MapBase::determinant() const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#ab2396600b886bb5bae12e667e98c843b',1,'openvdb::v3_2_0::math::MapBase::determinant(const Vec3d &) const =0'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a534b7de6b984015f680b9e38239b6500',1,'openvdb::v3_2_0::math::AffineMap::determinant(const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a390024ffecb7973f5de3194dc2f606f5',1,'openvdb::v3_2_0::math::AffineMap::determinant() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a534b7de6b984015f680b9e38239b6500',1,'openvdb::v3_2_0::math::ScaleMap::determinant(const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a390024ffecb7973f5de3194dc2f606f5',1,'openvdb::v3_2_0::math::ScaleMap::determinant() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a534b7de6b984015f680b9e38239b6500',1,'openvdb::v3_2_0::math::TranslationMap::determinant(const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a390024ffecb7973f5de3194dc2f606f5',1,'openvdb::v3_2_0::math::TranslationMap::determinant() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a534b7de6b984015f680b9e38239b6500',1,'openvdb::v3_2_0::math::ScaleTranslateMap::determinant(const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a390024ffecb7973f5de3194dc2f606f5',1,'openvdb::v3_2_0::math::ScaleTranslateMap::determinant() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a534b7de6b984015f680b9e38239b6500',1,'openvdb::v3_2_0::math::UnitaryMap::determinant(const Vec3d &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a390024ffecb7973f5de3194dc2f606f5',1,'openvdb::v3_2_0::math::UnitaryMap::determinant() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a390024ffecb7973f5de3194dc2f606f5',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::determinant() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#aa8b86a98fa61d8f3d9c8d2957d9c5b71',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::determinant(const Vec3d &loc) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#a390024ffecb7973f5de3194dc2f606f5',1,'openvdb::v3_2_0::math::GenericMap::determinant() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#aa0e5f41a045d264916896608f1ba2cc1',1,'openvdb::v3_2_0::math::GenericMap::determinant(const Vec3d &in) const ']]], + ['deterministicdotproductop',['DeterministicDotProductOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1DeterministicDotProductOp.html#ab1e941092794b862ea802aa0b0d32234',1,'openvdb::v3_2_0::math::pcg::Vector::DeterministicDotProductOp']]], + ['diagnose',['Diagnose',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Diagnose.html#a3d37b74a02a72cafa6aa6b36f901802a',1,'openvdb::v3_2_0::tools::Diagnose']]], + ['diagonalizesymmetricmatrix',['diagonalizeSymmetricMatrix',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a2ff354add79f087c57bb01c62cc60130',1,'openvdb::v3_2_0::math']]], + ['difference',['difference',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2NDT_01_4.html#a0b68e4aed2d0fe020a920448384fef12',1,'openvdb::v3_2_0::math::D1< CD_2NDT >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2ND_01_4.html#a0b68e4aed2d0fe020a920448384fef12',1,'openvdb::v3_2_0::math::D1< CD_2ND >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__4TH_01_4.html#a09b73d89b1e16c32cc9b0f186a912d99',1,'openvdb::v3_2_0::math::D1< CD_4TH >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__6TH_01_4.html#a90a19f8c6c5abb0d3910654c9fee02aa',1,'openvdb::v3_2_0::math::D1< CD_6TH >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__1ST_01_4.html#a9cf50f96aa3f913dde1c069513f43312',1,'openvdb::v3_2_0::math::D1< FD_1ST >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__2ND_01_4.html#ac54cf79c9b9cc3ced4d78112887b0d90',1,'openvdb::v3_2_0::math::D1< FD_2ND >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__3RD_01_4.html#a1b23c8596409ec35923347a87038d979',1,'openvdb::v3_2_0::math::D1< FD_3RD >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__1ST_01_4.html#a01fb15410bf8d8f6ba0a08b79c45f463',1,'openvdb::v3_2_0::math::D1< BD_1ST >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__2ND_01_4.html#a9adf5c61988c388a032e77ed160d8412',1,'openvdb::v3_2_0::math::D1< BD_2ND >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__3RD_01_4.html#abb838377b9b4a643556f43cb922f5448',1,'openvdb::v3_2_0::math::D1< BD_3RD >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__WENO5_01_4.html#a4867e5d150e7929994f983d26e5b5161',1,'openvdb::v3_2_0::math::D1< FD_WENO5 >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__HJWENO5_01_4.html#a4867e5d150e7929994f983d26e5b5161',1,'openvdb::v3_2_0::math::D1< FD_HJWENO5 >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__WENO5_01_4.html#af686cb8a6e379518ef81e380fde36d2c',1,'openvdb::v3_2_0::math::D1< BD_WENO5 >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__HJWENO5_01_4.html#af686cb8a6e379518ef81e380fde36d2c',1,'openvdb::v3_2_0::math::D1< BD_HJWENO5 >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#ada8698e6fad869ad52012b28bec3beaf',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#ad5a3587f1797892ee18710b7a52550d3',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::difference()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#ac0930f09b558d827d45b89d6e0b95f35',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::difference()']]], + ['diffleafnodemask',['DiffLeafNodeMask',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1DiffLeafNodeMask.html#a800c1d912b82c19c40e5ae6311da068a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::DiffLeafNodeMask']]], + ['diffuseshader',['DiffuseShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiffuseShader.html#a6f731dbeb98a19908392202bde402f82',1,'openvdb::v3_2_0::tools::DiffuseShader::DiffuseShader()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiffuseShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#a1954984951f54ae672f7cbd8efade77f',1,'openvdb::v3_2_0::tools::DiffuseShader< Film::RGBA, SamplerType >::DiffuseShader()']]], + ['dilate',['dilate',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#ad27daf87efe47196bc6d2f4df72b8f09',1,'openvdb::v3_2_0::tools::LevelSetTracker']]], + ['dilateactivevalues',['dilateActiveValues',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a39c09a72e7804426f476100267f70dc2',1,'openvdb::v3_2_0::tools::dilateActiveValues(TreeType &tree, int iterations=1, NearestNeighbors nn=NN_FACE, TilePolicy mode=PRESERVE_TILES)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aa04cca1d8b96032eacae09e5ab804853',1,'openvdb::v3_2_0::tools::dilateActiveValues(tree::LeafManager< TreeType > &manager, int iterations=1, NearestNeighbors nn=NN_FACE, TilePolicy mode=PRESERVE_TILES)']]], + ['dilatevoxels',['dilateVoxels',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a8381628238e0c71371cba47c63d30451',1,'openvdb::v3_2_0::tools::Morphology::dilateVoxels()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a322f1e4e826ec7bd4cd1ac52911c3e03',1,'openvdb::v3_2_0::tools::dilateVoxels(TreeType &tree, int iterations=1, NearestNeighbors nn=NN_FACE)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a25a80b2b5f1b77d2dc14d2c40eefb1b9',1,'openvdb::v3_2_0::tools::dilateVoxels(tree::LeafManager< TreeType > &manager, int iterations=1, NearestNeighbors nn=NN_FACE)']]], + ['dilatevoxels18',['dilateVoxels18',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#acec5e261d7fe3fa0671cf7792d47677e',1,'openvdb::v3_2_0::tools::Morphology']]], + ['dilatevoxels26',['dilateVoxels26',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a57ce6c119b0a63fd2f93516b38854c77',1,'openvdb::v3_2_0::tools::Morphology']]], + ['dilatevoxels6',['dilateVoxels6',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a36445df59ec28bba54f297790717a390',1,'openvdb::v3_2_0::tools::Morphology']]], + ['dilationop',['DilationOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DilationOp.html#a24212805c17d49442ac2e260803a028a',1,'openvdb::v3_2_0::tools::DilationOp']]], + ['dim',['dim',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a8fc00b5f783b9a2cbf468848ce8ec7d3',1,'openvdb::v3_2_0::math::CoordBBox::dim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#af6a9b0f77cb5a3c5df18a9aff3c40089',1,'openvdb::v3_2_0::tree::InternalNode::dim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#af6a9b0f77cb5a3c5df18a9aff3c40089',1,'openvdb::v3_2_0::tree::LeafNode::dim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#af6a9b0f77cb5a3c5df18a9aff3c40089',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::dim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#af6a9b0f77cb5a3c5df18a9aff3c40089',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::dim()']]], + ['dir',['dir',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#acded29b20cd1f1afb6baa342cc150529',1,'openvdb::v3_2_0::math::Ray']]], + ['diracdelta',['DiracDelta',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiracDelta.html#adabd2af27eb88bb1f0564dc908624de7',1,'openvdb::v3_2_0::tools::DiracDelta']]], + ['discretefield',['DiscreteField',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiscreteField.html#a4e21d4799a54d25e516268ff5325928e',1,'openvdb::v3_2_0::tools::DiscreteField::DiscreteField(const VelGridT &vel)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiscreteField.html#a01d2d609a18d4d066fc5032c9935cdf5',1,'openvdb::v3_2_0::tools::DiscreteField::DiscreteField(const DiscreteField &other)']]], + ['div',['div',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#afd85c18703d7d044cb211d8515e77f4b',1,'openvdb::v3_2_0::math::Vec2::div()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a60755afb9c8823376917fae034d88e6d',1,'openvdb::v3_2_0::math::Vec3::div()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#aea4336762a5c22794c2117603a07cb48',1,'openvdb::v3_2_0::math::Vec4::div()']]], + ['divergence',['Divergence',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Divergence.html#ac4ec412d3b51b6995b77b6b18fd01687',1,'openvdb::v3_2_0::tools::Divergence::Divergence(const InGridT &grid, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Divergence.html#a0b64792d472ca28af2dd9ebf7abae80d',1,'openvdb::v3_2_0::tools::Divergence::Divergence(const InGridT &grid, const MaskGridType &mask, InterruptT *interrupt=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ad9d4adc505e30de4684d20efdcb66512',1,'openvdb::v3_2_0::tools::divergence(const GridType &grid, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ab4342922999466ca1d2481c6c0d083b1',1,'openvdb::v3_2_0::tools::divergence(const GridType &grid, const MaskT &mask, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a46206f57882a4efe413097cf7dbabaa9',1,'openvdb::v3_2_0::tools::divergence(const GridType &grid, bool threaded=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a175d0e81fcfad5923a6c8f6959e29e9c',1,'openvdb::v3_2_0::tools::divergence(const GridType &grid, const MaskT &mask, bool threaded=true)']]], + ['divide',['divide',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html#a9a74ea1311b198a91302706eef1acbf1',1,'openvdb::v3_2_0::tools::composite::divide(const T &a, const T &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html#a9b5a4bc9b06832d70ecac728e85d8adf',1,'openvdb::v3_2_0::tools::composite::divide(const T &a, const T &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html#ad6b4cb2fdbe10008a7c7a5e340c51cbc',1,'openvdb::v3_2_0::tools::composite::divide(bool a, bool)']]], + ['doclip',['doClip',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal.html#afd345871f958089a2ae3fd9a379695aa',1,'openvdb::v3_2_0::tools::clip_internal']]], + ['docsgcopy',['doCSGCopy',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html#aa53b04e5674ff8b6075cbfa6c05af003',1,'openvdb::v3_2_0::tools::composite']]], + ['doerosion',['doErosion',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#af672f329707f1bf43d85f1af54475708',1,'openvdb::v3_2_0::tools::Morphology']]], + ['dolevelsetarea',['doLevelSetArea',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#afac82c8051e56a2b1bee1b7c782f2a23',1,'openvdb::v3_2_0::tools::doLevelSetArea(const GridT &grid, bool useWorldSpace)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a3c1b4a51254f886787d2093a96b571ce',1,'openvdb::v3_2_0::tools::doLevelSetArea(const GridT &, bool)']]], + ['dolevelsetmeasure',['doLevelSetMeasure',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ade2a8b0f48ddf43a9b9addfb7317f427',1,'openvdb::v3_2_0::tools::doLevelSetMeasure(const GridT &grid, Real &area, Real &volume, bool useWorldSpace)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a7122050014d84a512f90fbee3b15f6a8',1,'openvdb::v3_2_0::tools::doLevelSetMeasure(const GridT &, Real &, Real &, bool)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8454e73e7e4f6693925ade7ce0559c58',1,'openvdb::v3_2_0::tools::doLevelSetMeasure(const GridT &grid, Real &area, Real &volume, Real &avgCurvature, bool useWorldSpace)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a08b66ba05affbb7d526cfdca4ba92a1e',1,'openvdb::v3_2_0::tools::doLevelSetMeasure(const GridT &, Real &, Real &, Real &, bool)']]], + ['dolevelsetrebuild',['doLevelSetRebuild',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a0be014a7a16d7b79b527bfc34d943718',1,'openvdb::v3_2_0::tools::doLevelSetRebuild(const GridType &grid, typename GridType::ValueType iso, typename GridType::ValueType exWidth, typename GridType::ValueType inWidth, const math::Transform *xform, InterruptT *interrupter)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a4deb0c966bf04fedf66bff277e819338',1,'openvdb::v3_2_0::tools::doLevelSetRebuild(const GridType &, typename GridType::ValueType, typename GridType::ValueType, typename GridType::ValueType, const math::Transform *, InterruptT *)']]], + ['dolevelsetvolume',['doLevelSetVolume',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a6672a5d1143d72d141b59b36f424295c',1,'openvdb::v3_2_0::tools::doLevelSetVolume(const GridT &grid, bool useWorldSpace)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a811dfb4eb7e807033fe008309163d5d8',1,'openvdb::v3_2_0::tools::doLevelSetVolume(const GridT &, bool)']]], + ['domeshconversion',['doMeshConversion',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ad85fb8ea9c03ba69860453695d97ac64',1,'openvdb::v3_2_0::tools::doMeshConversion(const openvdb::math::Transform &xform, const std::vector< Vec3s > &points, const std::vector< Vec3I > &triangles, const std::vector< Vec4I > &quads, float exBandWidth, float inBandWidth, bool unsignedDistanceField=false)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a339eb032b43a646293977965e47c14cb',1,'openvdb::v3_2_0::tools::doMeshConversion(const math::Transform &, const std::vector< Vec3s > &, const std::vector< Vec3I > &, const std::vector< Vec4I > &, float, float, bool=false)']]], + ['done',['done',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UniformPrimBuilder.html#ab650651e4cda2869f73100c6fd2c821a',1,'openvdb::v3_2_0::tools::internal::UniformPrimBuilder::done()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1AdaptivePrimBuilder.html#ab650651e4cda2869f73100c6fd2c821a',1,'openvdb::v3_2_0::tools::internal::AdaptivePrimBuilder::done()']]], + ['doprocesstypedmap',['doProcessTypedMap',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a3a702edf751817155ff74968cea2883e',1,'openvdb::v3_2_0::math::doProcessTypedMap(Transform &transform, OpType &op)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a2f161536654a6a558751a1bd6bcfa535',1,'openvdb::v3_2_0::math::doProcessTypedMap(const Transform &transform, OpType &op)']]], + ['doresampletomatch',['doResampleToMatch',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a5c58d2a887f4018f4051a1333bbb06be',1,'openvdb::v3_2_0::tools']]], + ['dosignedfloodfill',['doSignedFloodFill',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a7ef429594f774227e46665f49c50a325',1,'openvdb::v3_2_0::tools::doSignedFloodFill(TreeOrLeafManagerT &tree, typename TreeOrLeafManagerT::ValueType outsideValue, typename TreeOrLeafManagerT::ValueType insideValue, bool threaded, size_t grainSize, Index minLevel)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a5cb9b48192263f81a3a1cd410b39529c',1,'openvdb::v3_2_0::tools::doSignedFloodFill(TreeOrLeafManagerT &, const typename TreeOrLeafManagerT::ValueType &, const typename TreeOrLeafManagerT::ValueType &, bool, size_t, Index)']]], + ['doswapleafbuffer',['doSwapLeafBuffer',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafManagerImpl.html#a54e68dec1f273db0216801b3db50cef8',1,'openvdb::v3_2_0::tree::LeafManagerImpl::doSwapLeafBuffer()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafManagerImpl_3_01LeafManager_3_01const_01TreeT_01_4_01_4.html#ad924a2b72286de32679f315983791de5',1,'openvdb::v3_2_0::tree::LeafManagerImpl< LeafManager< const TreeT > >::doSwapLeafBuffer()']]], + ['dot',['dot',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a416c4c67397867e58dc411780405bcfa',1,'openvdb::v3_2_0::math::pcg::Vector::dot()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ad9e5f677c292e4f05bc7be9f1c784073',1,'openvdb::v3_2_0::math::Quat::dot()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ae2891677312bf6c0591d5ecc57da9055',1,'openvdb::v3_2_0::math::Vec2::dot()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a2578e437cc5c4c0cdd1b3fa7134ea323',1,'openvdb::v3_2_0::math::Vec3::dot()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a1cbd8ae53f07d4b562afd3fee2f2651f',1,'openvdb::v3_2_0::math::Vec4::dot()']]], + ['dotransformvectors',['doTransformVectors',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a9785ef8a3d3e7ca6b501d76664a16858',1,'openvdb::v3_2_0::tools::doTransformVectors(GridType &, const Mat4d &)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a61fae0ffe670b863f9a5f0d31e0513ad',1,'openvdb::v3_2_0::tools::doTransformVectors(GridType &grid, const Mat4d &mat)']]], + ['doubletoint64',['doubleToInt64',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a440ce34832f29ca5bb2866233cf789ff',1,'openvdb::v3_2_0::math']]], + ['dovisit',['doVisit',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a44c977db48a2d200aaaa6134393af37d',1,'openvdb::v3_2_0::tree::InternalNode::doVisit()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a44c977db48a2d200aaaa6134393af37d',1,'openvdb::v3_2_0::tree::LeafNode::doVisit()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a44c977db48a2d200aaaa6134393af37d',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::doVisit()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a44c977db48a2d200aaaa6134393af37d',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::doVisit()']]], + ['dovisit2',['doVisit2',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aca7ba3f1bd8e72a6fe15f9225270b42d',1,'openvdb::v3_2_0::tree::InternalNode::doVisit2()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a0d74fca12f4f67419d4a80d5a55aa09f',1,'openvdb::v3_2_0::tree::LeafNode::doVisit2()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a0d74fca12f4f67419d4a80d5a55aa09f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::doVisit2()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a0d74fca12f4f67419d4a80d5a55aa09f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::doVisit2()']]], + ['dovisit2node',['doVisit2Node',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a5ca81ce706150daab4ad31ff65a339d3',1,'openvdb::v3_2_0::tree::InternalNode::doVisit2Node()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a5f9479166b5ff9862916d9fff22f48d0',1,'openvdb::v3_2_0::tree::LeafNode::doVisit2Node()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a5f9479166b5ff9862916d9fff22f48d0',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::doVisit2Node()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a5f9479166b5ff9862916d9fff22f48d0',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::doVisit2Node()']]], + ['dovolumetomesh',['doVolumeToMesh',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aa0b9ebff36817e05e1ba54743955ae83',1,'openvdb::v3_2_0::tools::doVolumeToMesh(const GridType &grid, std::vector< Vec3s > &points, std::vector< Vec3I > &triangles, std::vector< Vec4I > &quads, double isovalue, double adaptivity)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ad35c0839251d977edb4350196cabb692',1,'openvdb::v3_2_0::tools::doVolumeToMesh(const GridType &, std::vector< Vec3s > &, std::vector< Vec3I > &, std::vector< Vec4I > &, double, double)']]], + ['down',['down',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a21a1268aa4161d375e5c603ef507b2d7',1,'openvdb::v3_2_0::tree::IterListItem::down()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a21a1268aa4161d375e5c603ef507b2d7',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::down()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a21a1268aa4161d375e5c603ef507b2d7',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::down()']]], + ['dsschemetomenuname',['dsSchemeToMenuName',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7588846c9b098988ef71b9940b0192b7',1,'openvdb::v3_2_0::math']]], + ['dsschemetostring',['dsSchemeToString',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a855b023b380be1feebc94caabc46f74c',1,'openvdb::v3_2_0::math']]], + ['dualgridsampler',['DualGridSampler',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler.html#a7202b469ac87676b989535272251cca4',1,'openvdb::v3_2_0::tools::DualGridSampler::DualGridSampler(const GridType &sourceGrid, const math::Transform &targetXform)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler.html#a81beae5f1d9266f1a7c99f71beb41269',1,'openvdb::v3_2_0::tools::DualGridSampler::DualGridSampler(const TreeType &sourceTree, const math::Transform &sourceXform, const math::Transform &targetXform)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerT_01_4.html#a01d4fd609289869228a5ed3341c024e5',1,'openvdb::v3_2_0::tools::DualGridSampler< tree::ValueAccessor< TreeT >, SamplerT >::DualGridSampler()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_4.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_4.html new file mode 100644 index 00000000..cce7ce90 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_4.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_4.js new file mode 100644 index 00000000..375187aa --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_4.js @@ -0,0 +1,62 @@ +var searchData= +[ + ['earlyout',['earlyOut',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#a89f4552fb4d811502be806faa107b7db',1,'openvdb::v3_2_0::tools::PointAdvect']]], + ['edgedata',['EdgeData',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#a25b7344aeadb9a271db0da853efb3da4',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData']]], + ['empty',['empty',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ae22f66718bb2160cb671c4355ceeb1a2',1,'openvdb::v3_2_0::GridBase::empty()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a3ed485decdbcbd8dcd8a7a376271f91c',1,'openvdb::v3_2_0::Grid::empty()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::io::Queue::empty()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::math::BBox::empty()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::math::pcg::Vector::empty()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::math::CoordBBox::empty()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::tools::ParticleAtlas::empty()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::tools::PointPartitioner::empty()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::empty()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::empty()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::empty()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::empty()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::empty()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::tree::RootNode::empty()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::tree::Tree::empty()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorRange.html#ac6e61de369e994009e36f344f99c15ad',1,'openvdb::v3_2_0::tree::IteratorRange::empty()']]], + ['end',['end',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a32b6b5d41be3f26335f34cb61064fdfc',1,'openvdb::v3_2_0::math::Ray::end()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#aaf81d3fdaf258088d7692fa70cece087',1,'openvdb::v3_2_0::tools::BasePointScatter::end()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange.html#a7c19587af55f61dbff765ec7e291e583',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::end()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange.html#a7c19587af55f61dbff765ec7e291e583',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::end()'],['../structopenvdb_1_1v3__2__0_1_1util_1_1NullInterrupter.html#aaf81d3fdaf258088d7692fa70cece087',1,'openvdb::v3_2_0::util::NullInterrupter::end()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#ab45dae688fc5d8983727abffa4389003',1,'openvdb::v3_2_0::util::PagedArray::end()']]], + ['endchildall',['endChildAll',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#afe0695947bdb92a37359fee9efc26f5c',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::endChildAll() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#aa962358d9463d01e2a75d862d47311d9',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::endChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#afe0695947bdb92a37359fee9efc26f5c',1,'openvdb::v3_2_0::tree::LeafNode::endChildAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aa962358d9463d01e2a75d862d47311d9',1,'openvdb::v3_2_0::tree::LeafNode::endChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#afe0695947bdb92a37359fee9efc26f5c',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::endChildAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aa962358d9463d01e2a75d862d47311d9',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::endChildAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#afe0695947bdb92a37359fee9efc26f5c',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::endChildAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aa962358d9463d01e2a75d862d47311d9',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::endChildAll()']]], + ['endchildoff',['endChildOff',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a04db138e8bd3cf0f89b56b127adb3958',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::endChildOff() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a6eb4aea3f6a155201f0b20e30dedfab7',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::endChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a04db138e8bd3cf0f89b56b127adb3958',1,'openvdb::v3_2_0::tree::LeafNode::endChildOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a6eb4aea3f6a155201f0b20e30dedfab7',1,'openvdb::v3_2_0::tree::LeafNode::endChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a04db138e8bd3cf0f89b56b127adb3958',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::endChildOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a6eb4aea3f6a155201f0b20e30dedfab7',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::endChildOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a04db138e8bd3cf0f89b56b127adb3958',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::endChildOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a6eb4aea3f6a155201f0b20e30dedfab7',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::endChildOff()']]], + ['endchildon',['endChildOn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a56c625e2c3bdf5779405658db0751f96',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::endChildOn() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a2ad15c329d47a58d6787b4c6a105b162',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::endChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a56c625e2c3bdf5779405658db0751f96',1,'openvdb::v3_2_0::tree::LeafNode::endChildOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a2ad15c329d47a58d6787b4c6a105b162',1,'openvdb::v3_2_0::tree::LeafNode::endChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a56c625e2c3bdf5779405658db0751f96',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::endChildOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a2ad15c329d47a58d6787b4c6a105b162',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::endChildOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a56c625e2c3bdf5779405658db0751f96',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::endChildOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a2ad15c329d47a58d6787b4c6a105b162',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::endChildOn()']]], + ['enddense',['endDense',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#af47bb96b4b1b0a806d00877487e59420',1,'openvdb::v3_2_0::util::NodeMask::endDense()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#af47bb96b4b1b0a806d00877487e59420',1,'openvdb::v3_2_0::util::NodeMask< 1 >::endDense()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#af47bb96b4b1b0a806d00877487e59420',1,'openvdb::v3_2_0::util::NodeMask< 2 >::endDense()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#af47bb96b4b1b0a806d00877487e59420',1,'openvdb::v3_2_0::util::RootNodeMask::endDense()']]], + ['endinterrupter',['endInterrupter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a6b8be9f908df557dce42701c89ad3cab',1,'openvdb::v3_2_0::tools::LevelSetTracker']]], + ['endmeta',['endMeta',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#ae3d6c7c49617306f867619dea07caa30',1,'openvdb::v3_2_0::MetaMap::endMeta()'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a780386daaa470866f540cdcefbaec1cc',1,'openvdb::v3_2_0::MetaMap::endMeta() const ']]], + ['endname',['endName',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a96f4e5f4e21f551e8c113b037d5baff1',1,'openvdb::v3_2_0::io::File']]], + ['endoff',['endOff',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#af5fda787ac186a825320cc064f448b51',1,'openvdb::v3_2_0::util::NodeMask::endOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#af5fda787ac186a825320cc064f448b51',1,'openvdb::v3_2_0::util::NodeMask< 1 >::endOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#af5fda787ac186a825320cc064f448b51',1,'openvdb::v3_2_0::util::NodeMask< 2 >::endOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#af5fda787ac186a825320cc064f448b51',1,'openvdb::v3_2_0::util::RootNodeMask::endOff()']]], + ['endon',['endOn',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ae61a8687cf2592a9c5874104b24a279a',1,'openvdb::v3_2_0::util::NodeMask::endOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ae61a8687cf2592a9c5874104b24a279a',1,'openvdb::v3_2_0::util::NodeMask< 1 >::endOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ae61a8687cf2592a9c5874104b24a279a',1,'openvdb::v3_2_0::util::NodeMask< 2 >::endOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#ae61a8687cf2592a9c5874104b24a279a',1,'openvdb::v3_2_0::util::RootNodeMask::endOn()']]], + ['endvalueall',['endValueAll',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a8e9185b3bc70bb3eb9c7e38907699dbb',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::endValueAll() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a2af1ad63542cebb51a3365541905d123',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::endValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a8e9185b3bc70bb3eb9c7e38907699dbb',1,'openvdb::v3_2_0::tree::LeafNode::endValueAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a2af1ad63542cebb51a3365541905d123',1,'openvdb::v3_2_0::tree::LeafNode::endValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8e9185b3bc70bb3eb9c7e38907699dbb',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::endValueAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a2af1ad63542cebb51a3365541905d123',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::endValueAll()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8e9185b3bc70bb3eb9c7e38907699dbb',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::endValueAll() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a2af1ad63542cebb51a3365541905d123',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::endValueAll()']]], + ['endvalueoff',['endValueOff',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ac5b7346e76388ecc498fdbfe95b4e3f8',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::endValueOff() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a8c2dd48e4b3c8aeb27a81811e02ddb60',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::endValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ac5b7346e76388ecc498fdbfe95b4e3f8',1,'openvdb::v3_2_0::tree::LeafNode::endValueOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a8c2dd48e4b3c8aeb27a81811e02ddb60',1,'openvdb::v3_2_0::tree::LeafNode::endValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ac5b7346e76388ecc498fdbfe95b4e3f8',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::endValueOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8c2dd48e4b3c8aeb27a81811e02ddb60',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::endValueOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ac5b7346e76388ecc498fdbfe95b4e3f8',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::endValueOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8c2dd48e4b3c8aeb27a81811e02ddb60',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::endValueOff()']]], + ['endvalueon',['endValueOn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a015add5b971a8bc9a46cd184fc20f4fe',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::endValueOn() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a14d3d427f4528aad1467a6dd77e661c5',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::endValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a015add5b971a8bc9a46cd184fc20f4fe',1,'openvdb::v3_2_0::tree::LeafNode::endValueOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a14d3d427f4528aad1467a6dd77e661c5',1,'openvdb::v3_2_0::tree::LeafNode::endValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a015add5b971a8bc9a46cd184fc20f4fe',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::endValueOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a14d3d427f4528aad1467a6dd77e661c5',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::endValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a015add5b971a8bc9a46cd184fc20f4fe',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::endValueOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a14d3d427f4528aad1467a6dd77e661c5',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::endValueOn()']]], + ['engine',['engine',['../classopenvdb_1_1v3__2__0_1_1math_1_1Rand01.html#a4e6a7a32457faab2ce7f7a2461234383',1,'openvdb::v3_2_0::math::Rand01::engine()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1RandInt.html#a4e6a7a32457faab2ce7f7a2461234383',1,'openvdb::v3_2_0::math::RandInt::engine()']]], + ['enrightfield',['EnrightField',['../classopenvdb_1_1v3__2__0_1_1tools_1_1EnrightField.html#a4f74aaa1a9267fd65e6975c8e75e60e8',1,'openvdb::v3_2_0::tools::EnrightField']]], + ['epsilon',['epsilon',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1Tolerance.html#aae53ee1bd6cd89ff8abd27fb133df661',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::Tolerance']]], + ['eq',['eq',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a06ef477305f34339b699acba76a2a99f',1,'openvdb::v3_2_0::math::pcg::Vector::eq()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#af69c9f272e122409fa286cb8da62db11',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::eq()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#aa5d09d65060266b3cc7111bc2bbdee27',1,'openvdb::v3_2_0::math::Mat3::eq()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a2239aaff81254932a0dcf65333f276dc',1,'openvdb::v3_2_0::math::Mat4::eq()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#aa49dfcc4006604aaea0bf88a9dc32f81',1,'openvdb::v3_2_0::math::Quat::eq()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a29c53c646f977e042428a2c57727b8b3',1,'openvdb::v3_2_0::math::Vec2::eq()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a29c10e93e61a83f01f463c291d9ebfa1',1,'openvdb::v3_2_0::math::Vec3::eq()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#ac6b66c91beca2f305c9a036d5b834e64',1,'openvdb::v3_2_0::math::Vec4::eq()']]], + ['erase',['erase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#aecbac09627cc69c4909a61f25f07a0cb',1,'openvdb::v3_2_0::tree::CacheItem::erase(const NodeType *)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a1587563957975deb774dd994451e69af',1,'openvdb::v3_2_0::tree::CacheItem::erase(const OtherNodeType *node)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a8c5d9e2fba0829352e5655de6cb50762',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::erase()']]], + ['erasebackgroundtiles',['eraseBackgroundTiles',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a48dc4a8d53d718280d347a867cd6704b',1,'openvdb::v3_2_0::tree::RootNode']]], + ['erasenode',['eraseNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a88b7a91dfb1480c194c4f0faac7bb206',1,'openvdb::v3_2_0::tree::ValueAccessor::eraseNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a88b7a91dfb1480c194c4f0faac7bb206',1,'openvdb::v3_2_0::tree::ValueAccessor0::eraseNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a88b7a91dfb1480c194c4f0faac7bb206',1,'openvdb::v3_2_0::tree::ValueAccessor1::eraseNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a88b7a91dfb1480c194c4f0faac7bb206',1,'openvdb::v3_2_0::tree::ValueAccessor2::eraseNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a88b7a91dfb1480c194c4f0faac7bb206',1,'openvdb::v3_2_0::tree::ValueAccessor3::eraseNode()']]], + ['erode',['erode',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a45b809eb78e72aae53bbddcc9c2f308a',1,'openvdb::v3_2_0::tools::LevelSetTracker']]], + ['erode18',['erode18',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1ErodeVoxelsOp.html#a8e4f4360ee14c8b4cfd0c0997d136fab',1,'openvdb::v3_2_0::tools::Morphology::ErodeVoxelsOp']]], + ['erode26',['erode26',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1ErodeVoxelsOp.html#aa8b6350d8ca599f546c4c0e37e28a7d5',1,'openvdb::v3_2_0::tools::Morphology::ErodeVoxelsOp']]], + ['erode6',['erode6',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1ErodeVoxelsOp.html#a8a8de73f8a42c73ca4aa45edf46ace5f',1,'openvdb::v3_2_0::tools::Morphology::ErodeVoxelsOp']]], + ['erodevoxels',['erodeVoxels',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#ac614a677edff3c452da662ee4700f8cd',1,'openvdb::v3_2_0::tools::Morphology::erodeVoxels()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a5e57b81f188307ce46a58464847d65bc',1,'openvdb::v3_2_0::tools::erodeVoxels(TreeType &tree, int iterations=1, NearestNeighbors nn=NN_FACE)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a1eae709a0d7b1e1de493e7b0170b556f',1,'openvdb::v3_2_0::tools::erodeVoxels(tree::LeafManager< TreeType > &manager, int iterations=1, NearestNeighbors nn=NN_FACE)']]], + ['erodevoxels18',['erodeVoxels18',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a7ba8531a1e0e718e974eab0c6ba250c1',1,'openvdb::v3_2_0::tools::Morphology']]], + ['erodevoxels26',['erodeVoxels26',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a478bfa6de5a8329dc2be8be25cf86256',1,'openvdb::v3_2_0::tools::Morphology']]], + ['erodevoxels6',['erodeVoxels6',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a06a5d986ff34d25ee656064632ba49bd',1,'openvdb::v3_2_0::tools::Morphology']]], + ['erodevoxelsop',['ErodeVoxelsOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1ErodeVoxelsOp.html#a27657c16e331d61b09486b003e163a06',1,'openvdb::v3_2_0::tools::Morphology::ErodeVoxelsOp']]], + ['euclideanremainder',['EuclideanRemainder',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a523e03511d299e898fe7f7e4b622a04a',1,'openvdb::v3_2_0::math']]], + ['eulerangles',['eulerAngles',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a5afcc099d79260c4b9a44ddd48d08941',1,'openvdb::v3_2_0::math::Quat::eulerAngles()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9f8604eb8d866caadde188df2fc1bcbe',1,'openvdb::v3_2_0::math::eulerAngles()']]], + ['evalactiveboundingbox',['evalActiveBoundingBox',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aa4f72230ae8ade2c0a5e712708c36fa6',1,'openvdb::v3_2_0::tree::InternalNode::evalActiveBoundingBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aa4f72230ae8ade2c0a5e712708c36fa6',1,'openvdb::v3_2_0::tree::LeafNode::evalActiveBoundingBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aa4f72230ae8ade2c0a5e712708c36fa6',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::evalActiveBoundingBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aa4f72230ae8ade2c0a5e712708c36fa6',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::evalActiveBoundingBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#aa4f72230ae8ade2c0a5e712708c36fa6',1,'openvdb::v3_2_0::tree::RootNode::evalActiveBoundingBox()']]], + ['evalactivevoxelboundingbox',['evalActiveVoxelBoundingBox',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a7ff87805302028f4c261b8ec857aacc7',1,'openvdb::v3_2_0::GridBase::evalActiveVoxelBoundingBox()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#ad7d68edffb50eaaa5075ee7c20934d3f',1,'openvdb::v3_2_0::Grid::evalActiveVoxelBoundingBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#acc26c182dde6fc1b8e931b657ce70db4',1,'openvdb::v3_2_0::tree::TreeBase::evalActiveVoxelBoundingBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a957fe86bcd8fb552764ce293ef416d44',1,'openvdb::v3_2_0::tree::Tree::evalActiveVoxelBoundingBox()']]], + ['evalactivevoxeldim',['evalActiveVoxelDim',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ab8b61fdd6e0bb2ef29745f12b4b743f6',1,'openvdb::v3_2_0::GridBase::evalActiveVoxelDim()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#af366fcd05c16078e107a3ffe57f78ac6',1,'openvdb::v3_2_0::Grid::evalActiveVoxelDim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#adcaf5e4a78bf63f11f82ac9eeed7e9c3',1,'openvdb::v3_2_0::tree::TreeBase::evalActiveVoxelDim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a82230f6fee251718c085e8068f8a05d5',1,'openvdb::v3_2_0::tree::Tree::evalActiveVoxelDim()']]], + ['evalcellsigns',['evalCellSigns',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#ae9af9076f9b27537fb4136c04067d201',1,'openvdb::v3_2_0::tools::internal::evalCellSigns(const AccessorT &accessor, const Coord &ijk, typename AccessorT::ValueType iso)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#acd15010f9aad3baec83273e6ce50124b',1,'openvdb::v3_2_0::tools::internal::evalCellSigns(const LeafT &leaf, const Index offset, typename LeafT::ValueType iso)']]], + ['evalleafboundingbox',['evalLeafBoundingBox',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#adfe9509e850ee9d79c14e87fe15b0914',1,'openvdb::v3_2_0::tree::TreeBase::evalLeafBoundingBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a894624c52ca504479fdc5164cb52083a',1,'openvdb::v3_2_0::tree::Tree::evalLeafBoundingBox()']]], + ['evalleafdim',['evalLeafDim',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#ab5ed0caf71396fe4bb3d910370e80243',1,'openvdb::v3_2_0::tree::TreeBase::evalLeafDim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a2de2a3cd7daea49a1462c2305eee2bea',1,'openvdb::v3_2_0::tree::Tree::evalLeafDim()']]], + ['evalminmax',['evalMinMax',['../classopenvdb_1_1v3__2__0_1_1Grid.html#afc695470860292d705a4c5a9610d69f6',1,'openvdb::v3_2_0::Grid::evalMinMax()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a480c0106e4e8d28ad9018dbe3a08c15f',1,'openvdb::v3_2_0::tree::Tree::evalMinMax()']]], + ['evalnodeorigin',['evalNodeOrigin',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a50156eb366d109c0f64662639201d8c6',1,'openvdb::v3_2_0::tree::LeafNode::evalNodeOrigin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a50156eb366d109c0f64662639201d8c6',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::evalNodeOrigin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a50156eb366d109c0f64662639201d8c6',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::evalNodeOrigin()']]], + ['evalroot',['evalRoot',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a2b81e970786199e6b853cd5c89505d4f',1,'openvdb::v3_2_0::tools::internal']]], + ['exception',['Exception',['../classopenvdb_1_1v3__2__0_1_1Exception.html#abfbc23b99b2e78b609d50ac688611236',1,'openvdb::v3_2_0::Exception::Exception()'],['../classopenvdb_1_1v3__2__0_1_1Exception.html#a45da648610d845af1b517b0b58e7a298',1,'openvdb::v3_2_0::Exception::Exception(const char *eType, const std::string *const msg=NULL)']]], + ['exp',['exp',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a1430507e92a8e79f01ebdbd635331a4f',1,'openvdb::v3_2_0::math::Vec2::exp()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ae28cd3d83a911b1fe1d6a57cdd3c70a4',1,'openvdb::v3_2_0::math::Vec3::exp()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#adcb3bff41f819a3ceba2c0f80cbb937b',1,'openvdb::v3_2_0::math::Vec4::exp()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1c9bcf4f700b6c0d35e9348110b64715',1,'openvdb::v3_2_0::math::Exp(const Type &x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae35329af179f1deb918b821366ac0a20',1,'openvdb::v3_2_0::math::Exp(Vec2< T > v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#afaab25346eb2e5134396d814ed98166a',1,'openvdb::v3_2_0::math::Exp(Vec3< T > v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1b31c275a782ab3e72fc364603cd6647',1,'openvdb::v3_2_0::math::Exp(Vec4< T > v)']]], + ['expand',['expand',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a64b18b8b20fa3fc2b3e2e3169c54eb41',1,'openvdb::v3_2_0::math::BBox::expand(ElementType padding)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a404c4458b1a62723ca8d8b529aae5283',1,'openvdb::v3_2_0::math::BBox::expand(const Vec3T &xyz)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a7bbe0f9690633a24904158e34d751145',1,'openvdb::v3_2_0::math::BBox::expand(const BBox &)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a40e27f0d46676f37b4d42288ae6bbc91',1,'openvdb::v3_2_0::math::BBox::expand(const Vec3T &xyzMin, const ElementType &length)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a55ddc8fd46ab4b866a7ef6341680a205',1,'openvdb::v3_2_0::math::CoordBBox::expand(ValueType padding)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a5d74d64a29bb5d4e38a56cec17289c32',1,'openvdb::v3_2_0::math::CoordBBox::expand(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#aa38276f9d5beeeda075f73f84ca51d8d',1,'openvdb::v3_2_0::math::CoordBBox::expand(const CoordBBox &bbox)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a8f6b044370320b0480b8488ba56a8b5f',1,'openvdb::v3_2_0::math::CoordBBox::expand(const Coord &min, Coord::ValueType dim)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#aed5bfeb2da24cc37e6561b3cd0f5f1f3',1,'openvdb::v3_2_0::tree::RootNode::expand()']]], + ['expandby',['expandBy',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a0cd4f175cd000a48843a1448d297ad41',1,'openvdb::v3_2_0::math::CoordBBox']]], + ['expandleafnoderegion',['ExpandLeafNodeRegion',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandLeafNodeRegion.html#ac9e842645a7f2c67ed5f6761fb81062e',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandLeafNodeRegion::ExpandLeafNodeRegion(const TreeType &distTree, BoolTreeType &maskTree, std::vector< BoolLeafNodeType * > &maskNodes)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandLeafNodeRegion.html#a01dafe1173bb2378f950ddd2e2bdf424',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandLeafNodeRegion::ExpandLeafNodeRegion(const ExpandLeafNodeRegion &rhs, tbb::split)']]], + ['expandnarrowband',['ExpandNarrowband',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#a9dc39d9fbeca16f8b3a304deec1c0d5d',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::ExpandNarrowband(std::vector< BoolLeafNodeType * > &maskNodes, BoolTreeType &maskTree, TreeType &distTree, Int32TreeType &indexTree, const MeshDataAdapter &mesh, ValueType exteriorBandWidth, ValueType interiorBandWidth, ValueType voxelSize)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#ac55ea8dd5e50f247c084f5b9256e341a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::ExpandNarrowband(const ExpandNarrowband &rhs, tbb::split)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal.html#a252732ad4e20ebc6e1b218668a4faa25',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::expandNarrowband()']]], + ['expandnarrowbandmask',['ExpandNarrowbandMask',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandNarrowbandMask.html#a2a315aeea017dd7f3b2b847ad1be09ec',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandNarrowbandMask']]], + ['extents',['extents',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#afca1c6ab05a8efec8a645749e3ef2c70',1,'openvdb::v3_2_0::math::BBox::extents()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a2fcea404c1e696576733334957108ea9',1,'openvdb::v3_2_0::math::CoordBBox::extents()']]], + ['extract',['extract',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#a2269fa210733ac185f4809b62d00312b',1,'openvdb::v3_2_0::tools::SparseExtractor::extract()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#a2269fa210733ac185f4809b62d00312b',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor::extract()']]], + ['extractactivevoxelsegmentmasks',['extractActiveVoxelSegmentMasks',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a3b522dd56a467487d4b16d0f1d16c0d6',1,'openvdb::v3_2_0::tools']]], + ['extractenclosedregion',['extractEnclosedRegion',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#addb45844a3518d417b3c5eac873337ad',1,'openvdb::v3_2_0::tools']]], + ['extractisosurfacemask',['extractIsosurfaceMask',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a39bfe53eeb50b4ffdc96c90af7e1de1b',1,'openvdb::v3_2_0::tools']]], + ['extractsparsetree',['extractSparseTree',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a586a786ed67c81b31e7bcc11c70df047',1,'openvdb::v3_2_0::tools']]], + ['extractsparsetreewithmask',['extractSparseTreeWithMask',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ae1e62f3b18a1d40b3195c83b4d76c1e5',1,'openvdb::v3_2_0::tools']]], + ['extrema',['extrema',['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html#ac0de9215eb4e792f1cc2a1e3d9d5569a',1,'openvdb::v3_2_0::tools::BoxSampler::extrema()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#a2c9caedfb7763da7eb9fef9f852d92de',1,'openvdb::v3_2_0::math::Extrema::Extrema()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac6aea86a2df380225a3b3c8553efe4e3',1,'openvdb::v3_2_0::tools::extrema(const IterT &iter, bool threaded=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aafcd95f6d9da81e339aab75465ee4e22',1,'openvdb::v3_2_0::tools::extrema(const IterT &iter, const ValueOp &op, bool threaded)']]], + ['eye',['eye',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a10a56a4622dd64aa9039698bc9c09303',1,'openvdb::v3_2_0::math::Ray']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_5.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_5.html new file mode 100644 index 00000000..e2f6e313 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_5.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_5.js new file mode 100644 index 00000000..f94409e5 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_5.js @@ -0,0 +1,60 @@ +var searchData= +[ + ['failurecount',['failureCount',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Diagnose.html#a702f19d18c5b5dfcda5cf18ef32e4b7b',1,'openvdb::v3_2_0::tools::Diagnose::failureCount()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#a702f19d18c5b5dfcda5cf18ef32e4b7b',1,'openvdb::v3_2_0::tools::CheckLevelSet::failureCount()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#a702f19d18c5b5dfcda5cf18ef32e4b7b',1,'openvdb::v3_2_0::tools::CheckFogVolume::failureCount()']]], + ['fieldofviewtofocallength',['fieldOfViewToFocalLength',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PerspectiveCamera.html#a5ebf01d1dfaa1f7269a7a76e93eec3f8',1,'openvdb::v3_2_0::tools::PerspectiveCamera']]], + ['file',['File',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a439334f7c5135d5ee0f79718a189a4a1',1,'openvdb::v3_2_0::io::File::File(const std::string &filename)'],['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a9978a09b3f30f3a537441fde8dd4f9ca',1,'openvdb::v3_2_0::io::File::File(const File &other)']]], + ['fileinfo',['FileInfo',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1FileInfo.html#a1e80537eb9098ba9b28bc67f72f7f7f8',1,'openvdb::v3_2_0::tree::LeafNode::FileInfo']]], + ['filename',['filename',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#af89fbda9897f8c41faf1862e1790e3f2',1,'openvdb::v3_2_0::io::File::filename()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1MappedFile.html#a16182afd0af6163476284de586c66c9d',1,'openvdb::v3_2_0::io::MappedFile::filename()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1TempFile.html#af89fbda9897f8c41faf1862e1790e3f2',1,'openvdb::v3_2_0::io::TempFile::filename()']]], + ['fileversion',['fileVersion',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#ad7a5a9b05e297de71bfc2c92065e18c2',1,'openvdb::v3_2_0::io::Archive::fileVersion()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#ad7a5a9b05e297de71bfc2c92065e18c2',1,'openvdb::v3_2_0::io::StreamMetadata::fileVersion()']]], + ['fill',['Fill',['../structopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Fill.html#a836517b4faf0dd7a0d1f9dd0fb89d0b4',1,'openvdb::v3_2_0::util::PagedArray::Fill::Fill()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#aef116f8d74023c63e1a9fc30d851793e',1,'openvdb::v3_2_0::Grid::fill()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#ac8f8ff1a5d0997596cbedbc2162e4649',1,'openvdb::v3_2_0::math::pcg::Vector::fill()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a8f689e29e45daf72f02f10b6617434e4',1,'openvdb::v3_2_0::tools::Dense::fill()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ae899038a75c8576d0f152bbc4a9b633d',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::fill(const CoordBBox &, const ValueType &, bool)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a185d719e835da04438c6102b01915e4b',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::fill(const ValueType &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a9cacd9e1ddf41f4f09cb3bab4ef2c89d',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::fill(const ValueType &, bool)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Film.html#adabd26502d4930dbc9e2d53b0e64d246',1,'openvdb::v3_2_0::tools::Film::fill()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aa5d88c3fde0d2d51d27cf6c5e995682e',1,'openvdb::v3_2_0::tree::InternalNode::fill()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#acf0070cc1ece3ed20e845a96046d5dd2',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::fill()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aa5d88c3fde0d2d51d27cf6c5e995682e',1,'openvdb::v3_2_0::tree::LeafNode::fill(const CoordBBox &bbox, const ValueType &, bool active=true)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ac8f8ff1a5d0997596cbedbc2162e4649',1,'openvdb::v3_2_0::tree::LeafNode::fill(const ValueType &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aa49df9f9766bc84234bf4fb9cb1134e9',1,'openvdb::v3_2_0::tree::LeafNode::fill(const ValueType &value, bool active)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#a9f4517b221c5b82c8e1d940ada80ce81',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::fill()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#af554087e5184199abf728f69943f6074',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::fill(const CoordBBox &bbox, bool value, bool active=true)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a3ef9dc80342b4c0bf14db2c07e62a911',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::fill(const bool &value)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a1ac758cffddccaa76cdde6bb8e5cdda8',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::fill(const bool &value, bool active)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#a9f4517b221c5b82c8e1d940ada80ce81',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::fill()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ab461d1f3b14897915728fcca1e6a50be',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::fill(const CoordBBox &bbox, bool value, bool dummy=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a1f061adb04fa6636e85b472a9dc8baf0',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::fill(const bool &value, bool dummy=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#aef116f8d74023c63e1a9fc30d851793e',1,'openvdb::v3_2_0::tree::RootNode::fill()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#aef116f8d74023c63e1a9fc30d851793e',1,'openvdb::v3_2_0::tree::Tree::fill()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a6adf5091670b306e0669292ecfece5b8',1,'openvdb::v3_2_0::util::PagedArray::fill()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html#ae214529e264a05536f2c7355c36024ca',1,'openvdb::v3_2_0::util::PagedArray::Page::fill()']]], + ['fillarray',['FillArray',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1FillArray.html#a1b44917ddd5637d4af2167e2e7f5efa5',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::FillArray::FillArray()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal.html#ade6172a4b789e2f44ce9978f0428c9f1',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::fillArray()']]], + ['fillleafnodevoxels',['FillLeafNodeVoxels',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillLeafNodeVoxels.html#aef070c029f9b1a320f48e0ebf6161336',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillLeafNodeVoxels']]], + ['fillmaskboundary',['FillMaskBoundary',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillMaskBoundary.html#afa6900802e80ce48796b238b37d06ed6',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillMaskBoundary']]], + ['fillop',['FillOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1FillOp.html#abd862b7ef7adb847d5d8dd5f0d84fc19',1,'openvdb::v3_2_0::math::pcg::internal::FillOp']]], + ['fillwithspheres',['fillWithSpheres',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a4e1e540220cddd54f82776eb1c76552d',1,'openvdb::v3_2_0::tools::fillWithSpheres(const GridT &grid, std::vector< openvdb::Vec4s > &spheres, int maxSphereCount, bool overlapping=false, float minRadius=1.0, float maxRadius=std::numeric_limits< float >::max(), float isovalue=0.0, int instanceCount=10000, InterrupterT *interrupter=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a71062173b8f2ecdefb4a5ea6f1c75c8c',1,'openvdb::v3_2_0::tools::fillWithSpheres(const GridT &grid, std::vector< openvdb::Vec4s > &spheres, int maxSphereCount, bool overlapping=false, float minRadius=1.0, float maxRadius=std::numeric_limits< float >::max(), float isovalue=0.0, int instanceCount=10000)']]], + ['film',['Film',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Film.html#af247a0c2d094058ea57b3aa8bba0bfac',1,'openvdb::v3_2_0::tools::Film::Film(size_t width, size_t height)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Film.html#a5c89e96ed6805d471b605d26de3d1899',1,'openvdb::v3_2_0::tools::Film::Film(size_t width, size_t height, const RGBA &bg)']]], + ['filter',['Filter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a946bbf57bff2c4acf2b0babefdbab212',1,'openvdb::v3_2_0::tools::Filter::Filter(GridT &grid, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#aa9921d84ccf386e89a85c62cc70758d9',1,'openvdb::v3_2_0::tools::Filter::Filter(const Filter &other)']]], + ['filteredpointindexsearch',['filteredPointIndexSearch',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal.html#a7ec1b1444cbe653b874b1b3da1d0d6a4',1,'openvdb::v3_2_0::tools::point_index_grid_internal']]], + ['filteredpointindexsearchvoxels',['filteredPointIndexSearchVoxels',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal.html#a170b7323918d4f9355b56d63d72d3492',1,'openvdb::v3_2_0::tools::point_index_grid_internal']]], + ['filterleafnode',['filterLeafNode',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RadialRangeFilter.html#a0c1f2b3723223753ec4448b50ecd1348',1,'openvdb::v3_2_0::tools::particle_atlas_internal::RadialRangeFilter::filterLeafNode()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1BBoxFilter.html#a0c1f2b3723223753ec4448b50ecd1348',1,'openvdb::v3_2_0::tools::particle_atlas_internal::BBoxFilter::filterLeafNode()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1BBoxFilter.html#a0c1f2b3723223753ec4448b50ecd1348',1,'openvdb::v3_2_0::tools::point_index_grid_internal::BBoxFilter::filterLeafNode()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1RadialRangeFilter.html#a0c1f2b3723223753ec4448b50ecd1348',1,'openvdb::v3_2_0::tools::point_index_grid_internal::RadialRangeFilter::filterLeafNode()']]], + ['filtervoxel',['filterVoxel',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RadialRangeFilter.html#abcbf638398abca60a83d1bb267b462da',1,'openvdb::v3_2_0::tools::particle_atlas_internal::RadialRangeFilter::filterVoxel()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1BBoxFilter.html#abcbf638398abca60a83d1bb267b462da',1,'openvdb::v3_2_0::tools::particle_atlas_internal::BBoxFilter::filterVoxel()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1BBoxFilter.html#abcbf638398abca60a83d1bb267b462da',1,'openvdb::v3_2_0::tools::point_index_grid_internal::BBoxFilter::filterVoxel()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1RadialRangeFilter.html#a287732fa15a0c881da4d82aa8c4c5a3d',1,'openvdb::v3_2_0::tools::point_index_grid_internal::RadialRangeFilter::filterVoxel()']]], + ['finalize',['finalize',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a21f88b8de20397fe505621d5f4545643',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['findfeaturepoint',['findFeaturePoint',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a9032a9804d04086b785739915957bb33',1,'openvdb::v3_2_0::tools']]], + ['findfirstoff',['findFirstOff',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a065b9f38d5bc5a7d697adb5636031ee9',1,'openvdb::v3_2_0::util::NodeMask::findFirstOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a065b9f38d5bc5a7d697adb5636031ee9',1,'openvdb::v3_2_0::util::NodeMask< 1 >::findFirstOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a065b9f38d5bc5a7d697adb5636031ee9',1,'openvdb::v3_2_0::util::NodeMask< 2 >::findFirstOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a065b9f38d5bc5a7d697adb5636031ee9',1,'openvdb::v3_2_0::util::RootNodeMask::findFirstOff()']]], + ['findfirston',['findFirstOn',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#aa6c363f9bedf6cc3b23b2e4e090e86f1',1,'openvdb::v3_2_0::util::NodeMask::findFirstOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#aa6c363f9bedf6cc3b23b2e4e090e86f1',1,'openvdb::v3_2_0::util::NodeMask< 1 >::findFirstOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#aa6c363f9bedf6cc3b23b2e4e090e86f1',1,'openvdb::v3_2_0::util::NodeMask< 2 >::findFirstOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#aa6c363f9bedf6cc3b23b2e4e090e86f1',1,'openvdb::v3_2_0::util::RootNodeMask::findFirstOn()']]], + ['findgridbyname',['findGridByName',['../namespaceopenvdb_1_1v3__2__0.html#aabfb2fb5a30c31cfaed152a041dcb894',1,'openvdb::v3_2_0::findGridByName(const GridPtrContainerT &container, const Name &name)'],['../namespaceopenvdb_1_1v3__2__0.html#ae30adf1adb62f767f0f4b33d1cfbee91',1,'openvdb::v3_2_0::findGridByName(const std::map< KeyT, GridPtrT > &container, const Name &name)']]], + ['findhigheston',['FindHighestOn',['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a8583dcbb25ac110e6569a151871008b2',1,'openvdb::v3_2_0::util']]], + ['findloweston',['FindLowestOn',['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a2638b90715584ced8cd061023c30ab8c',1,'openvdb::v3_2_0::util::FindLowestOn(Byte v)'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#ad325c9491363579f32d54567407f01f0',1,'openvdb::v3_2_0::util::FindLowestOn(Index32 v)'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a5fe6d292d29fe78cc723be36bb8dab80',1,'openvdb::v3_2_0::util::FindLowestOn(Index64 v)']]], + ['findminmaxvoxelvalue',['FindMinMaxVoxelValue',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__fracture__internal_1_1FindMinMaxVoxelValue.html#a534938222ec2845c8613c68c56d08734',1,'openvdb::v3_2_0::tools::level_set_fracture_internal::FindMinMaxVoxelValue::FindMinMaxVoxelValue(const std::vector< const LeafNodeType * > &nodes)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__fracture__internal_1_1FindMinMaxVoxelValue.html#a0360a1a7f46803c7695564cd985bb6b4',1,'openvdb::v3_2_0::tools::level_set_fracture_internal::FindMinMaxVoxelValue::FindMinMaxVoxelValue(FindMinMaxVoxelValue &rhs, tbb::split)']]], + ['findmintilevalue',['FindMinTileValue',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinTileValue.html#ab85ca96f34b413284e465abf3ab1c640',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinTileValue::FindMinTileValue(InternalNodeType const *const *const nodes)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinTileValue.html#a30bea1df138b704ccdb7299187f76df4',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinTileValue::FindMinTileValue(FindMinTileValue &rhs, tbb::split)']]], + ['findminvoxelvalue',['FindMinVoxelValue',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinVoxelValue.html#a817b0babed3a60c386b4f6c21db3b38b',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinVoxelValue::FindMinVoxelValue(LeafNodeType const *const *const leafnodes)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinVoxelValue.html#aaae4c36dddb267e959c8d3f03729ae54',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinVoxelValue::FindMinVoxelValue(FindMinVoxelValue &rhs, tbb::split)']]], + ['findneighbournode',['findNeighbourNode',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeNodeConnectivity.html#a8ab094cba0d5e9cf1a447f74955d2471',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ComputeNodeConnectivity']]], + ['findnextoff',['findNextOff',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a1940981839b267a82254d7c81d689c54',1,'openvdb::v3_2_0::util::NodeMask::findNextOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a1940981839b267a82254d7c81d689c54',1,'openvdb::v3_2_0::util::NodeMask< 1 >::findNextOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a1940981839b267a82254d7c81d689c54',1,'openvdb::v3_2_0::util::NodeMask< 2 >::findNextOff()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a1940981839b267a82254d7c81d689c54',1,'openvdb::v3_2_0::util::RootNodeMask::findNextOff()']]], + ['findnexton',['findNextOn',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#aedcd10e77e3e08d431154da15701e14a',1,'openvdb::v3_2_0::util::NodeMask::findNextOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#aedcd10e77e3e08d431154da15701e14a',1,'openvdb::v3_2_0::util::NodeMask< 1 >::findNextOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#aedcd10e77e3e08d431154da15701e14a',1,'openvdb::v3_2_0::util::NodeMask< 2 >::findNextOn()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#aedcd10e77e3e08d431154da15701e14a',1,'openvdb::v3_2_0::util::RootNodeMask::findNextOn()']]], + ['finestconsttree',['finestConstTree',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#aca21696a11a7b992a89c964348137683',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['finestconsttreeptr',['finestConstTreePtr',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#aafdbf6190437b1b5b271ee7779c0154f',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['finestlevel',['finestLevel',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a5d8d2a3c8ee0297b15ee2c8761ed757d',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['finesttree',['finestTree',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a34fdc85915e0f83a633516461f933890',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['finesttreeptr',['finestTreePtr',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#ac4c4a2a68bfb071a212fa5914021ca98',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['firstmap',['firstMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#a343cd85e6a3ec3a1cbf10b8329571f2f',1,'openvdb::v3_2_0::math::CompoundMap']]], + ['flagusedpoints',['FlagUsedPoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1FlagUsedPoints.html#a7beeb7e4e25d4014eb5c43079688d501',1,'openvdb::v3_2_0::tools::internal::FlagUsedPoints']]], + ['flipregionsign',['FlipRegionSign',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FlipRegionSign.html#a3bd6ff4c60292afaedbd4a0add68d006',1,'openvdb::v3_2_0::tools::level_set_util_internal::FlipRegionSign']]], + ['flipsignbits',['flipSignBits',['../classopenvdb_1_1v3__2__0_1_1math_1_1QuantizedUnitVec.html#a3e937c6d40286b0fdeed1af9808414e2',1,'openvdb::v3_2_0::math::QuantizedUnitVec']]], + ['floattoint32',['floatToInt32',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1b33135ac7b0fc2213e89f220b1d121e',1,'openvdb::v3_2_0::math']]], + ['floodfillsign',['FloodFillSign',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FloodFillSign.html#a5491e8a3028fd233c89bf611841b5cfd',1,'openvdb::v3_2_0::tools::level_set_util_internal::FloodFillSign']]], + ['floor',['floor',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#acea3555f9f5a2a225ed9fd9d83d60244',1,'openvdb::v3_2_0::math::Coord::floor()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7c23e48b49f39e1aa800e0e82e411fda',1,'openvdb::v3_2_0::math::Floor(float x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4c8fbcdc994b5eaf915a703dffd99264',1,'openvdb::v3_2_0::math::Floor(double x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a89b2dad28b247710e2ac3f3c07bfb024',1,'openvdb::v3_2_0::math::Floor(long double x)']]], + ['floorvec3',['floorVec3',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1local__util.html#a5edc55d91b1ca6368023d94550465044',1,'openvdb::v3_2_0::tools::local_util']]], + ['flush',['flush',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ValueBuffer.html#adac116554b543b7c4228c018a85882f5',1,'openvdb::v3_2_0::util::PagedArray::ValueBuffer']]], + ['focallengthtofieldofview',['focalLengthToFieldOfView',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PerspectiveCamera.html#a21859e94e5190e3aabc0e81c012ea0cf',1,'openvdb::v3_2_0::tools::PerspectiveCamera']]], + ['foreach',['foreach',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a449355fc31ee41387283def6d663f807',1,'openvdb::v3_2_0::tree::LeafManager::foreach()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#a04fbba495fcea53e22a1d9f4c0ad6608',1,'openvdb::v3_2_0::tree::NodeList::foreach()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#acb08bd8aa449398a7172efcd98e1128c',1,'openvdb::v3_2_0::util::NodeMask::foreach(const NodeMask &other, const WordOp &op)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a17bc8aeaca83aff7ef62f497eb2dc68a',1,'openvdb::v3_2_0::util::NodeMask::foreach(const NodeMask &other1, const NodeMask &other2, const WordOp &op)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a4ee5618462c75528f5a5bca41f4d80ed',1,'openvdb::v3_2_0::util::NodeMask::foreach(const NodeMask &other1, const NodeMask &other2, const NodeMask &other3, const WordOp &op)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#acb08bd8aa449398a7172efcd98e1128c',1,'openvdb::v3_2_0::util::NodeMask< 1 >::foreach(const NodeMask &other, const WordOp &op)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a17bc8aeaca83aff7ef62f497eb2dc68a',1,'openvdb::v3_2_0::util::NodeMask< 1 >::foreach(const NodeMask &other1, const NodeMask &other2, const WordOp &op)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a4ee5618462c75528f5a5bca41f4d80ed',1,'openvdb::v3_2_0::util::NodeMask< 1 >::foreach(const NodeMask &other1, const NodeMask &other2, const NodeMask &other3, const WordOp &op)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#acb08bd8aa449398a7172efcd98e1128c',1,'openvdb::v3_2_0::util::NodeMask< 2 >::foreach(const NodeMask &other, const WordOp &op)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a17bc8aeaca83aff7ef62f497eb2dc68a',1,'openvdb::v3_2_0::util::NodeMask< 2 >::foreach(const NodeMask &other1, const NodeMask &other2, const WordOp &op)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a4ee5618462c75528f5a5bca41f4d80ed',1,'openvdb::v3_2_0::util::NodeMask< 2 >::foreach(const NodeMask &other1, const NodeMask &other2, const NodeMask &other3, const WordOp &op)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ada1c7e219f36d148510ce22d7599171b',1,'openvdb::v3_2_0::tools::foreach(const IterT &iter, XformOp &op, bool threaded=true, bool shareOp=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aa1dd9695ed106fdc71856355b0bfc1b6',1,'openvdb::v3_2_0::tools::foreach(const IterT &iter, const XformOp &op, bool threaded=true, bool shareOp=true)']]], + ['foreachbottomup',['foreachBottomUp',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#a828498c7d55b8f10f9f9fe69d943a2eb',1,'openvdb::v3_2_0::tree::NodeManagerLink::foreachBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#a828498c7d55b8f10f9f9fe69d943a2eb',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::foreachBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#a69d893b3f9570617a265d673e414aa0a',1,'openvdb::v3_2_0::tree::NodeManager::foreachBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#ab34acfe4778036240f3af4f463d246d7',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::foreachBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a69d893b3f9570617a265d673e414aa0a',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::foreachBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a69d893b3f9570617a265d673e414aa0a',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::foreachBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a69d893b3f9570617a265d673e414aa0a',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::foreachBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a69d893b3f9570617a265d673e414aa0a',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::foreachBottomUp()']]], + ['foreachtopdown',['foreachTopDown',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#a935f69499533caaf3cdaf37c2745c326',1,'openvdb::v3_2_0::tree::NodeManagerLink::foreachTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#a935f69499533caaf3cdaf37c2745c326',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::foreachTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#a52c458c0bd031ebbf652980955c1e2a3',1,'openvdb::v3_2_0::tree::NodeManager::foreachTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#a9d7d6a1b0f7401a29a0276a6053f1cf4',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::foreachTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a52c458c0bd031ebbf652980955c1e2a3',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::foreachTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a52c458c0bd031ebbf652980955c1e2a3',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::foreachTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a52c458c0bd031ebbf652980955c1e2a3',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::foreachTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a52c458c0bd031ebbf652980955c1e2a3',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::foreachTopDown()']]], + ['formattedint',['FormattedInt',['../classopenvdb_1_1v3__2__0_1_1util_1_1FormattedInt.html#a0c2868e10738d9ebdf88564b55caba4e',1,'openvdb::v3_2_0::util::FormattedInt::FormattedInt()'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a52743e2f00f77de5f31f42477ad29b5f',1,'openvdb::v3_2_0::util::formattedInt()']]], + ['fourthorderdensestencil',['FourthOrderDenseStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1FourthOrderDenseStencil.html#a9dad93442f877bc0282755dfa9baf7ec',1,'openvdb::v3_2_0::math::FourthOrderDenseStencil']]], + ['fractionalpart',['FractionalPart',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a903ffec58b71a6af5ea2e1ec3b11b925',1,'openvdb::v3_2_0::math']]], + ['fracture',['fracture',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFracture.html#a88115098dc647e0fcd061fb8495ceade',1,'openvdb::v3_2_0::tools::LevelSetFracture']]], + ['fragment',['Fragment',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband_1_1Fragment.html#a269a61d4dd2f728afff40f5e8f8c8a7a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::Fragment::Fragment()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband_1_1Fragment.html#abd0a31789d39a656dde8b96c1057430f',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::Fragment::Fragment(Int32 idx_, Int32 x_, Int32 y_, Int32 z_, ValueType dist_)']]], + ['fragments',['fragments',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFracture.html#a48d5eeaa5dca52751ceab864916404ba',1,'openvdb::v3_2_0::tools::LevelSetFracture']]], + ['freecount',['freeCount',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a442f664efffce96d5c7acc8e02636ac2',1,'openvdb::v3_2_0::util::PagedArray']]], + ['functor',['Functor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Divergence_1_1Functor.html#ad7669dfeaaf70b8dc01ec4a3e22750ce',1,'openvdb::v3_2_0::tools::Divergence::Functor::Functor()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Gradient_1_1Functor.html#ad7669dfeaaf70b8dc01ec4a3e22750ce',1,'openvdb::v3_2_0::tools::Gradient::Functor::Functor()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian_1_1Functor.html#ae74093cb8c7f54cae7abcf4af6ea269c',1,'openvdb::v3_2_0::tools::Laplacian::Functor::Functor()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature_1_1Functor.html#ae74093cb8c7f54cae7abcf4af6ea269c',1,'openvdb::v3_2_0::tools::MeanCurvature::Functor::Functor()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude_1_1Functor.html#ad7669dfeaaf70b8dc01ec4a3e22750ce',1,'openvdb::v3_2_0::tools::Magnitude::Functor::Functor()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Normalize_1_1Functor.html#ae74093cb8c7f54cae7abcf4af6ea269c',1,'openvdb::v3_2_0::tools::Normalize::Functor::Functor()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_6.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_6.html new file mode 100644 index 00000000..342a0762 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_6.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_6.js new file mode 100644 index 00000000..1ae9494f --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_6.js @@ -0,0 +1,187 @@ +var searchData= +[ + ['gather',['gather',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1Neighbor.html#a04b4117c718dc0b0bb39f86c7065c169',1,'openvdb::v3_2_0::tools::Morphology::Neighbor::gather()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#ab7aeb5ce61a663edc09db6872825c44d',1,'openvdb::v3_2_0::tools::Morphology::LeafCache::gather(int n, int indx)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#acaa8c8e457b32b3f7fc27e8acce2b9a6',1,'openvdb::v3_2_0::tools::Morphology::LeafCache::gather(int n, int indx)']]], + ['gatheredgesxy',['gatherEdgesXY',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#ac283f3f7e3f18113db7a8052cd80243a',1,'openvdb::v3_2_0::tools::Morphology::LeafCache']]], + ['gatherfacesxy',['gatherFacesXY',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#a5d269d75c529211ffb8ef28cf34059fa',1,'openvdb::v3_2_0::tools::Morphology::LeafCache']]], + ['gaussian',['gaussian',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a046f5beaa2684b8d6a01df056b730e2c',1,'openvdb::v3_2_0::tools::Filter::gaussian()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a5294deea9323e8cbef5882c36f7acee8',1,'openvdb::v3_2_0::tools::LevelSetFilter::gaussian()']]], + ['genboundarymask',['GenBoundaryMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenBoundaryMask.html#a8e492b74d283252a8a64662e347b4491',1,'openvdb::v3_2_0::tools::internal::GenBoundaryMask::GenBoundaryMask(const LeafManagerT &leafs, const BoolTreeT &, const IntTreeT &)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenBoundaryMask.html#a6212361de7e2ed7a8d8ddaeff6728806',1,'openvdb::v3_2_0::tools::internal::GenBoundaryMask::GenBoundaryMask(GenBoundaryMask &, tbb::split)']]], + ['genedgedata',['GenEdgeData',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1GenEdgeData.html#acdcf7d53149eaf58d431905c9ae0531c',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::GenEdgeData::GenEdgeData(const std::vector< Vec3s > &pointList, const std::vector< Vec4I > &polygonList)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1GenEdgeData.html#a6c73a1cb8d17cc3e82375bb8a8db192a',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::GenEdgeData::GenEdgeData(GenEdgeData &rhs, tbb::split)']]], + ['genericmap',['GenericMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#a3a550c307bdf8ae48d483c95c8b8c1ef',1,'openvdb::v3_2_0::math::GenericMap::GenericMap(const GridType &g)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#a86c7972a8022ba10b1192890ae2d0c56',1,'openvdb::v3_2_0::math::GenericMap::GenericMap(const Transform &t)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#abe73776a72d3096ea628e3980c039644',1,'openvdb::v3_2_0::math::GenericMap::GenericMap(MapBase::Ptr map)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GenericMap.html#a73860ec15bdd598637ff5e18aff32166',1,'openvdb::v3_2_0::math::GenericMap::GenericMap(MapBase::ConstPtr map)']]], + ['genpoints',['GenPoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPoints.html#aec20bb4281aa45afbd444d42485674d4',1,'openvdb::v3_2_0::tools::internal::GenPoints']]], + ['genpolygons',['GenPolygons',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPolygons.html#a5bf9f17004e62a7c7fbb6b61b707f535',1,'openvdb::v3_2_0::tools::internal::GenPolygons']]], + ['genseammask',['GenSeamMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenSeamMask.html#a55dd07701fe0b837b6973d4cdcb948c5',1,'openvdb::v3_2_0::tools::internal::GenSeamMask::GenSeamMask(const LeafManagerT &leafs, const TreeT &tree)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenSeamMask.html#abf9988dd6a889e908f372effbd849fbe',1,'openvdb::v3_2_0::tools::internal::GenSeamMask::GenSeamMask(GenSeamMask &, tbb::split)']]], + ['gentilemask',['GenTileMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTileMask.html#a6210eb34fd3aeb2e8ce11b8d942c3dba',1,'openvdb::v3_2_0::tools::internal::GenTileMask::GenTileMask(const std::vector< Vec4i > &tiles, const TreeT &distTree, ValueT iso)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTileMask.html#a3f73da02e1abd89e7cd34d68468b32ac',1,'openvdb::v3_2_0::tools::internal::GenTileMask::GenTileMask(GenTileMask &, tbb::split)']]], + ['gentopologymask',['GenTopologyMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTopologyMask.html#ade335a57a5fe0f36294c892096360d3e',1,'openvdb::v3_2_0::tools::internal::GenTopologyMask::GenTopologyMask(const BoolGridT &mask, const LeafManagerT &srcLeafs, const math::Transform &srcXForm, bool invertMask)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTopologyMask.html#a7dd52be0a92c589195f686db57e15ca2',1,'openvdb::v3_2_0::tools::internal::GenTopologyMask::GenTopologyMask(GenTopologyMask &, tbb::split)']]], + ['get',['get',['../structopenvdb_1_1v3__2__0_1_1math_1_1Ray_1_1TimeSpan.html#a7dd162ad2caa8d55689e7e81572b634b',1,'openvdb::v3_2_0::math::Ray::TimeSpan::get()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1GetValImpl_3_01T_00_01false_01_4.html#ad264a2fd37f2cc60f814b41ad6013c27',1,'openvdb::v3_2_0::tools::stats_internal::GetValImpl< T, false >::get()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1GetValImpl_3_01T_00_01true_01_4.html#ad264a2fd37f2cc60f814b41ad6013c27',1,'openvdb::v3_2_0::tools::stats_internal::GetValImpl< T, true >::get()']]], + ['geta',['getA',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ABTransform.html#a236b503ac6189ca86ca2a2f27ae0eceb',1,'openvdb::v3_2_0::tools::ABTransform']]], + ['getaccessor',['getAccessor',['../classopenvdb_1_1v3__2__0_1_1Grid.html#afd9327e5a015e2e860017765f0eb372c',1,'openvdb::v3_2_0::Grid::getAccessor()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a13a5261de783b5a670d645007204c428',1,'openvdb::v3_2_0::Grid::getAccessor() const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData.html#afd9327e5a015e2e860017765f0eb372c',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::getAccessor()']]], + ['getaffinemap',['getAffineMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#ac74696eeff38a4d9d86d5a3f3fa9b2a4',1,'openvdb::v3_2_0::math::MapBase::getAffineMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#ac3320cc1f86fcd15e22b5aec51328a2b',1,'openvdb::v3_2_0::math::AffineMap::getAffineMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#ac3320cc1f86fcd15e22b5aec51328a2b',1,'openvdb::v3_2_0::math::ScaleMap::getAffineMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#ac3320cc1f86fcd15e22b5aec51328a2b',1,'openvdb::v3_2_0::math::TranslationMap::getAffineMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#ac3320cc1f86fcd15e22b5aec51328a2b',1,'openvdb::v3_2_0::math::ScaleTranslateMap::getAffineMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#ac3320cc1f86fcd15e22b5aec51328a2b',1,'openvdb::v3_2_0::math::UnitaryMap::getAffineMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#ac3320cc1f86fcd15e22b5aec51328a2b',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::getAffineMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#ac3320cc1f86fcd15e22b5aec51328a2b',1,'openvdb::v3_2_0::math::CompoundMap::getAffineMap()']]], + ['getarbperpendicular',['getArbPerpendicular',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a83d9d54cf369f2b9f1fc2706c675bad4',1,'openvdb::v3_2_0::math::Vec2::getArbPerpendicular()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a5cccc0e854e64ddc30427950c90b27cd',1,'openvdb::v3_2_0::math::Vec3::getArbPerpendicular()']]], + ['getb',['getB',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ABTransform.html#a089a8a615c52200718d0dcdb8b3d4e50',1,'openvdb::v3_2_0::tools::ABTransform']]], + ['getbackgroundvalue',['getBackgroundValue',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a39b1b3441a930b3f2c4a915c4a00b747',1,'openvdb::v3_2_0::tree::TreeBase::getBackgroundValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a7cc646b0001dce38746ee1e3722cd86c',1,'openvdb::v3_2_0::tree::Tree::getBackgroundValue()']]], + ['getbbox',['getBBox',['../classopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1LegacyFrustum.html#ae79cac82ac02daec327464bf41b4838d',1,'openvdb::v3_2_0::math::internal::LegacyFrustum::getBBox()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a99178da9946b88aacf8dd1d1f816a1d0',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::getBBox()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#a08ed0f854710ab55f2b66077290e950c',1,'openvdb::v3_2_0::tools::PointPartitioner::getBBox()']]], + ['getbitsize',['getBitSize',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#af7177eafd43cd0e2e2717076d298aeeb',1,'openvdb::v3_2_0::util::RootNodeMask']]], + ['getblockpos',['getBlockPos',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#ab283ef02ecee60bbddb6430155dcc132',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['getboundingbox',['getBoundingBox',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a2bc45738e8f63b4d0e3f60f9126a0e7b',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::getBoundingBox(CoordBBox &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#ad8c23df12f12a5cd55073b1da4970fef',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::getBoundingBox() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a7c9266c4a6af7aece8876a5ee5777884',1,'openvdb::v3_2_0::tree::NodeIteratorBase::getBoundingBox(CoordBBox &bbox) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#ad8c23df12f12a5cd55073b1da4970fef',1,'openvdb::v3_2_0::tree::NodeIteratorBase::getBoundingBox() const ']]], + ['getbuffer',['getBuffer',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#aa54178da485b68013cea72c2ef70824e',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['getcamxform',['getCamXForm',['../classopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1LegacyFrustum.html#ae01e4987b3c4a94a6362ec54c423cdb0',1,'openvdb::v3_2_0::math::internal::LegacyFrustum']]], + ['getcenter',['getCenter',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#acc39d59e67a9bf472082b89e394051b8',1,'openvdb::v3_2_0::math::BBox::getCenter()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#acc39d59e67a9bf472082b89e394051b8',1,'openvdb::v3_2_0::math::CoordBBox::getCenter()']]], + ['getcentercoord',['getCenterCoord',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#aa80089fc587676cb3cc44ed93594695f',1,'openvdb::v3_2_0::math::BaseStencil']]], + ['getcentervalue',['getCenterValue',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a40f8d94cfaf70cd56092def745720dbc',1,'openvdb::v3_2_0::math::BaseStencil::getCenterValue()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DenseStencil.html#a40f8d94cfaf70cd56092def745720dbc',1,'openvdb::v3_2_0::math::DenseStencil::getCenterValue()']]], + ['getchild',['getChild',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01false_00_01ValueT_00_01ChildT_01_4.html#afd2a6ba165f82045959a200d161aead4',1,'openvdb::v3_2_0::tree::NodeUnionImpl< false, ValueT, ChildT >::getChild()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01true_00_01ValueT_00_01ChildT_01_4.html#afd2a6ba165f82045959a200d161aead4',1,'openvdb::v3_2_0::tree::NodeUnionImpl< true, ValueT, ChildT >::getChild()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits.html#a276c415db770bb79fd2ef093fd542aa5',1,'openvdb::v3_2_0::tree::IterTraits::getChild()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOnIter_01_4.html#ac707c3c0ee1c97bc52724af4b26ee6e9',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOnIter >::getChild()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOnCIter_01_4.html#a3fe92610454edb002bbc3ad1ba319b65',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOnCIter >::getChild()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildAllIter_01_4.html#ac707c3c0ee1c97bc52724af4b26ee6e9',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildAllIter >::getChild()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildAllCIter_01_4.html#ac707c3c0ee1c97bc52724af4b26ee6e9',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildAllCIter >::getChild()']]], + ['getchilddim',['getChildDim',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a252a41011fe13e50c8d49b5ca14a979b',1,'openvdb::v3_2_0::tree::InternalNode::getChildDim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a252a41011fe13e50c8d49b5ca14a979b',1,'openvdb::v3_2_0::tree::LeafNode::getChildDim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a252a41011fe13e50c8d49b5ca14a979b',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getChildDim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a252a41011fe13e50c8d49b5ca14a979b',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getChildDim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a252a41011fe13e50c8d49b5ca14a979b',1,'openvdb::v3_2_0::tree::RootNode::getChildDim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#aaa64e7f2270b4a41b3849e73bfe088c8',1,'openvdb::v3_2_0::tree::IterListItem::getChildDim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#aaa64e7f2270b4a41b3849e73bfe088c8',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::getChildDim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#aaa64e7f2270b4a41b3849e73bfe088c8',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::getChildDim()']]], + ['getchildmask',['getChildMask',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a34fc0b97da28f1a04b83b9eabd509596',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['getchildnode',['getChildNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ac6e48ad8fd6eed08e7bdcb7eed3ccdb8',1,'openvdb::v3_2_0::tree::InternalNode::getChildNode(Index n)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a0006c869fa4e54859a74610142f76ec8',1,'openvdb::v3_2_0::tree::InternalNode::getChildNode(Index n) const ']]], + ['getconstaccessor',['getConstAccessor',['../classopenvdb_1_1v3__2__0_1_1Grid.html#abb3a6edcb63ee7aa5b21b09f09dbb534',1,'openvdb::v3_2_0::Grid']]], + ['getconstjacobianinv',['getConstJacobianInv',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a1c51f96e7125c8bb05fbd1c7f7665c6b',1,'openvdb::v3_2_0::math::AffineMap']]], + ['getconstmat4',['getConstMat4',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a87c460ee494357d00a4679468ed1bda4',1,'openvdb::v3_2_0::math::AffineMap']]], + ['getconstrow',['getConstRow',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a7c40feddfcb7a042a5c84fe9c5e17ec0',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix']]], + ['getconstunsafeaccessor',['getConstUnsafeAccessor',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a0faf29723f9afa2cfbbf3063a17e5e7e',1,'openvdb::v3_2_0::Grid']]], + ['getcoord',['getCoord',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#a6260918b810170b120f0b56c68cc3432',1,'openvdb::v3_2_0::tree::IteratorBase::getCoord() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#ad896b5f0fe71664e674c52e796554410',1,'openvdb::v3_2_0::tree::IteratorBase::getCoord(Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a6c7a1f27012bca4be973175b5ecfcb7d',1,'openvdb::v3_2_0::tree::IterListItem::getCoord()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a6c7a1f27012bca4be973175b5ecfcb7d',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::getCoord()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a6c7a1f27012bca4be973175b5ecfcb7d',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::getCoord()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a6260918b810170b120f0b56c68cc3432',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::getCoord()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a6260918b810170b120f0b56c68cc3432',1,'openvdb::v3_2_0::tree::NodeIteratorBase::getCoord()']]], + ['getcreator',['getCreator',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a9f66e4b9d2bf18d2aa117c7544322be4',1,'openvdb::v3_2_0::GridBase']]], + ['getdatacompression',['getDataCompression',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a8887bf9b18f6fb8b5037576b665b09e6',1,'openvdb::v3_2_0::io']]], + ['getdepth',['getDepth',['../classopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1LegacyFrustum.html#a1adc74eef892f7566f7588640487a5bb',1,'openvdb::v3_2_0::math::internal::LegacyFrustum::getDepth()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a1adc74eef892f7566f7588640487a5bb',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::getDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ae9c602c12ff468865a25ce83ff7fb8c1',1,'openvdb::v3_2_0::tree::RootNode::getDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#ae9c602c12ff468865a25ce83ff7fb8c1',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::getDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#ae9c602c12ff468865a25ce83ff7fb8c1',1,'openvdb::v3_2_0::tree::NodeIteratorBase::getDepth()']]], + ['getedgedata',['getEdgeData',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData.html#afda35c8d1816ba75cc79b9267df813fc',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData']]], + ['getend',['getEnd',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#aaf4602f3087ef3ffc72652b1679c7124',1,'openvdb::v3_2_0::math::CoordBBox']]], + ['getendpos',['getEndPos',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a71865431de9b61ae21c2d8fee95eb834',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['geterrorstring',['getErrorString',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a7229a3493daddad4d1bb0c4dfbba3aef',1,'openvdb::v3_2_0::io::getErrorString(int errorNum)'],['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a6bd295fad54e3ddbb3457aa62d40ff65',1,'openvdb::v3_2_0::io::getErrorString()']]], + ['getfarplanewidth',['getFarPlaneWidth',['../classopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1LegacyFrustum.html#a25be3641be3763c32092552627061dba',1,'openvdb::v3_2_0::math::internal::LegacyFrustum']]], + ['getfirstvalue',['getFirstValue',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a5b11672e5be2e242c1748af8985e6cdd',1,'openvdb::v3_2_0::tree::InternalNode::getFirstValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a28462feb223f67c2d6af291b0d3fc00e',1,'openvdb::v3_2_0::tree::LeafNode::getFirstValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aeec903c1db32c9ce6cacfb45ba8887f2',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getFirstValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aeec903c1db32c9ce6cacfb45ba8887f2',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getFirstValue()']]], + ['getformatversion',['getFormatVersion',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a736a8fcbd88f198519c2364340781b65',1,'openvdb::v3_2_0::io']]], + ['getgamma',['getGamma',['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#ae7ef29d750b7a1d568d0a603bd04050b',1,'openvdb::v3_2_0::math::NonlinearFrustumMap']]], + ['getglobalindex',['getGlobalIndex',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#a78115e860f0059c9d448b90b48c475f7',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray']]], + ['getgrainsize',['getGrainSize',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#aafb0e291470742bdae09a1d339e65980',1,'openvdb::v3_2_0::tools::Filter::getGrainSize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#aafb0e291470742bdae09a1d339e65980',1,'openvdb::v3_2_0::tools::LevelSetAdvection::getGrainSize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#aafb0e291470742bdae09a1d339e65980',1,'openvdb::v3_2_0::tools::LevelSetMeasure::getGrainSize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#aafb0e291470742bdae09a1d339e65980',1,'openvdb::v3_2_0::tools::LevelSetMorphing::getGrainSize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#aafb0e291470742bdae09a1d339e65980',1,'openvdb::v3_2_0::tools::LevelSetTracker::getGrainSize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#aafb0e291470742bdae09a1d339e65980',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet::getGrainSize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#a60b0a96a503d6360bcdac038a60d5754',1,'openvdb::v3_2_0::tools::VolumeAdvection::getGrainSize()']]], + ['getgridbackgroundvalueptr',['getGridBackgroundValuePtr',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a4445a753401078b4e6928f6926c57d12',1,'openvdb::v3_2_0::io']]], + ['getgridclass',['getGridClass',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a944b65979b396546d9ceffdfb9f86b10',1,'openvdb::v3_2_0::GridBase::getGridClass()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a944b65979b396546d9ceffdfb9f86b10',1,'openvdb::v3_2_0::tools::MultiResGrid::getGridClass()'],['../namespaceopenvdb_1_1v3__2__0_1_1io.html#ad57bb2664a8c5a823c7ff5b5e3e9b7d1',1,'openvdb::v3_2_0::io::getGridClass()']]], + ['getgridfrompyobject',['getGridFromPyObject',['../namespacepyopenvdb.html#a0611fe056781b68e152343de6c3e87e5',1,'pyopenvdb::getGridFromPyObject(PyObject *)'],['../namespacepyopenvdb.html#ac011390142df3fa0d2136cb9166ceeb8',1,'pyopenvdb::getGridFromPyObject(const boost::python::object &)']]], + ['getgridpos',['getGridPos',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a6ce2b3f5182da07f6ba6e96db7501cb2',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['getgrids',['getGrids',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a8745aa9f5ad1bb9b669ac3d722b1e3ac',1,'openvdb::v3_2_0::io::File::getGrids()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Stream.html#a2eed71ec18e3a25660216f7e90ef59b8',1,'openvdb::v3_2_0::io::Stream::getGrids()']]], + ['gethalffloat',['getHalfFloat',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a51fe070173693bc693328f449d88f953',1,'openvdb::v3_2_0::io']]], + ['gethalfwidth',['getHalfWidth',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a188e0227a50fddcdc547100a80d76435',1,'openvdb::v3_2_0::tools::LevelSetTracker::getHalfWidth()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a1b6178bc4d6c12cb96d3752363047103',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet::getHalfWidth()']]], + ['getheight',['getHeight',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#acb8a1436aa153d08fa6e73f59f871976',1,'openvdb::v3_2_0::tree::RootNode']]], + ['getinactivevalues',['getInactiveValues',['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveVoxelValues.html#a05cc7fc66b5de7997bef363c70c13f1e',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveVoxelValues::getInactiveValues()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveTileValues.html#a05cc7fc66b5de7997bef363c70c13f1e',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveTileValues::getInactiveValues()']]], + ['getindexpos',['getIndexPos',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a88056b88146c39eff06e362f8fde6721',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::getIndexPos()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#ac6d1d1b312bc49451efbd7084b3fbe6f',1,'openvdb::v3_2_0::tools::LinearSearchImpl::getIndexPos()']]], + ['getindexrange',['getIndexRange',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a79c5c77b8e79b139e3da5e4f16ed00f6',1,'openvdb::v3_2_0::tree::RootNode::getIndexRange()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a7ebd5e0acc5a803b85bf78b642ffd425',1,'openvdb::v3_2_0::tree::TreeBase::getIndexRange()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a37897566bb9a2e4a4eb732d0fd5dec4d',1,'openvdb::v3_2_0::tree::Tree::getIndexRange()']]], + ['getindexspacepoint',['getIndexSpacePoint',['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadAndTriangleDataAdapter.html#ae5b678f15eb0ab787af2a589b016eb67',1,'openvdb::v3_2_0::tools::QuadAndTriangleDataAdapter']]], + ['getindextime',['getIndexTime',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#a09acd81d881cbcb0c2dbc85dbe8ce55d',1,'openvdb::v3_2_0::tools::LinearSearchImpl']]], + ['getindices',['getIndices',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a8c7e85ef9128fe4e6c6931476ad86eb0',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::getIndices(const Coord &ijk, const ValueType *&begin, const ValueType *&end) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a7536e20df80f97ca488b13e1991a3682',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::getIndices(Index offset, const ValueType *&begin, const ValueType *&end) const ']]], + ['getintegrator',['getIntegrator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#aadefab1c70f198a76e4127c41e035361',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['getintsize',['getIntSize',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a028bc59271e4024ed697861af862c4ad',1,'openvdb::v3_2_0::util::RootNodeMask']]], + ['getinvscale',['getInvScale',['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a816faf2566276582631f89d54d73bc24',1,'openvdb::v3_2_0::math::ScaleMap::getInvScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a816faf2566276582631f89d54d73bc24',1,'openvdb::v3_2_0::math::ScaleTranslateMap::getInvScale()']]], + ['getinvscalesqr',['getInvScaleSqr',['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#adc29d3e999815ae716fc7ac2eafd66e3',1,'openvdb::v3_2_0::math::ScaleMap::getInvScaleSqr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#adc29d3e999815ae716fc7ac2eafd66e3',1,'openvdb::v3_2_0::math::ScaleTranslateMap::getInvScaleSqr()']]], + ['getinvtwicescale',['getInvTwiceScale',['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#acdcf5ff93e948532ecc304afe3d1f899',1,'openvdb::v3_2_0::math::ScaleMap::getInvTwiceScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#acdcf5ff93e948532ecc304afe3d1f899',1,'openvdb::v3_2_0::math::ScaleTranslateMap::getInvTwiceScale()']]], + ['getisovalue',['getIsoValue',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#a1025518c5b603098723b0ba77e881d69',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::getIsoValue()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#a1025518c5b603098723b0ba77e881d69',1,'openvdb::v3_2_0::tools::LinearSearchImpl::getIsoValue()']]], + ['getitem',['getItem',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ChildIter.html#abc0bf0f763d49de86ec36bbfb85708f0',1,'openvdb::v3_2_0::tree::InternalNode::ChildIter::getItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ValueIter.html#ac30bdcd1f535aae7adf56ca3d1e1f2dd',1,'openvdb::v3_2_0::tree::InternalNode::ValueIter::getItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DenseIter.html#a9b24a29f25e734c9745e344fa11e58ec',1,'openvdb::v3_2_0::tree::InternalNode::DenseIter::getItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#ac493f902d107a9dd64608db3430b0a16',1,'openvdb::v3_2_0::tree::SparseIteratorBase::getItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a50ba7205a1e2bd04856467c55e1e4212',1,'openvdb::v3_2_0::tree::DenseIteratorBase::getItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueIter.html#a93d283406c16cf1031497547139a483d',1,'openvdb::v3_2_0::tree::LeafNode::ValueIter::getItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1DenseIter.html#a8d73b995210abce4ce9f08deeb97db9d',1,'openvdb::v3_2_0::tree::LeafNode::DenseIter::getItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ValueIter.html#a8c86fa42d449fb47b97355d59cf45ace',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter::getItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1DenseIter.html#a8d73b995210abce4ce9f08deeb97db9d',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::DenseIter::getItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ValueIter.html#a8c86fa42d449fb47b97355d59cf45ace',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter::getItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1DenseIter.html#a8d73b995210abce4ce9f08deeb97db9d',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::DenseIter::getItem()']]], + ['getlastvalue',['getLastValue',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a1278796f9dc4866a9a9f222d8f448c90',1,'openvdb::v3_2_0::tree::InternalNode::getLastValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a9602b04a7c36dcbff233af6c9989b975',1,'openvdb::v3_2_0::tree::LeafNode::getLastValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a92f2f54153fa3b597a2af51cf5a33c00',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getLastValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a92f2f54153fa3b597a2af51cf5a33c00',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getLastValue()']]], + ['getleaf',['getLeaf',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#a96a752a87a2f60f315e7beb5359937fc',1,'openvdb::v3_2_0::tree::LeafIteratorBase']]], + ['getleafdepth',['getLeafDepth',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a7bb4e750bcba611c8e936ead228d0dce',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::getLeafDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a7bb4e750bcba611c8e936ead228d0dce',1,'openvdb::v3_2_0::tree::NodeIteratorBase::getLeafDepth()']]], + ['getlevel',['getLevel',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a7364ceedc39ddbd16d4f61f89dda4883',1,'openvdb::v3_2_0::tree::InternalNode::getLevel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a7364ceedc39ddbd16d4f61f89dda4883',1,'openvdb::v3_2_0::tree::LeafNode::getLevel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a7364ceedc39ddbd16d4f61f89dda4883',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getLevel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a7364ceedc39ddbd16d4f61f89dda4883',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getLevel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a7364ceedc39ddbd16d4f61f89dda4883',1,'openvdb::v3_2_0::tree::RootNode::getLevel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#ac1e1307e3a8be7d7d889466b99cb583b',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::getLevel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#ac1e1307e3a8be7d7d889466b99cb583b',1,'openvdb::v3_2_0::tree::NodeIteratorBase::getLevel()']]], + ['getlevelset',['getLevelSet',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetSphere.html#a9c65baf7f5089325371290ea29ed2c15',1,'openvdb::v3_2_0::tools::LevelSetSphere']]], + ['getlibraryversion',['getLibraryVersion',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a1e89f7e213f2d690e0a8d48395ec6c3e',1,'openvdb::v3_2_0::io']]], + ['getlibraryversionstring',['getLibraryVersionString',['../namespaceopenvdb_1_1v3__2__0.html#aca001550d1341d8e456b09d45c93f9a6',1,'openvdb::v3_2_0']]], + ['getlimiter',['getLimiter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#a8bc4a91951ae68d819f3372cd77a49ed',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['getmappedfileptr',['getMappedFilePtr',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a7158f84a0d21e3abe7c9c8bc34b0990b',1,'openvdb::v3_2_0::io']]], + ['getmat3',['getMat3',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a4932169c6f880b6b2c3d8f48928788ab',1,'openvdb::v3_2_0::math::Mat4']]], + ['getmat4',['getMat4',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a711a21e1dd5fd8a650dac85138c664a8',1,'openvdb::v3_2_0::math::AffineMap']]], + ['getmaxcount',['getMaxCount',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a1be1b941445bb2600de8f18162a5a679',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['getmaxdepth',['getMaxDepth',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a08f628696e654018ecde8061d46a08f2',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::getMaxDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a08f628696e654018ecde8061d46a08f2',1,'openvdb::v3_2_0::tree::NodeIteratorBase::getMaxDepth()']]], + ['getmaxdistance',['getMaxDistance',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#af6c2051903a67771c5a215230c761325',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['getmaxindex',['getMaxIndex',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a2abbf438654aa1950e0c58ec7a717615',1,'openvdb::v3_2_0::tree::RootNode']]], + ['getmaxvelocity',['getMaxVelocity',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#a5c1e74edce2ce0d37b4ec2e887190478',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['getmemusage',['getMemUsage',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#acdaacda619a44722cf38fbb24b4bcc8a',1,'openvdb::v3_2_0::util::RootNodeMask']]], + ['getmetadata',['getMetadata',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a81c2e03e534467c70b36f8b82b3a8564',1,'openvdb::v3_2_0::io::File::getMetadata()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Stream.html#a81c2e03e534467c70b36f8b82b3a8564',1,'openvdb::v3_2_0::io::Stream::getMetadata()'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a6663959f50562837fb310465190c385f',1,'openvdb::v3_2_0::MetaMap::getMetadata(const Name &)'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a460afc65e46569f1d4f96a698f5e32f6',1,'openvdb::v3_2_0::MetaMap::getMetadata(const Name &) const ']]], + ['getmincount',['getMinCount',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#aabc50138f01ac5555d304758b985f2f5',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['getmindepth',['getMinDepth',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a71d7096b835c0a8f2faaac8022274799',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::getMinDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a71d7096b835c0a8f2faaac8022274799',1,'openvdb::v3_2_0::tree::NodeIteratorBase::getMinDepth()']]], + ['getminindex',['getMinIndex',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a4ad45f83af7980f8e2b181ab62a39dec',1,'openvdb::v3_2_0::tree::RootNode']]], + ['getname',['getName',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a33957ff81d96d5eb86be59fea5034afd',1,'openvdb::v3_2_0::GridBase::getName()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a33957ff81d96d5eb86be59fea5034afd',1,'openvdb::v3_2_0::tools::MultiResGrid::getName()']]], + ['getnearplanedist',['getNearPlaneDist',['../classopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1LegacyFrustum.html#ad47cb64aa32a1ad258d3f2211aa22be8',1,'openvdb::v3_2_0::math::internal::LegacyFrustum']]], + ['getnearplanewidth',['getNearPlaneWidth',['../classopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1LegacyFrustum.html#ad083f9d78d020ba018da0838e1816abe',1,'openvdb::v3_2_0::math::internal::LegacyFrustum']]], + ['getnewprimid',['getNewPrimId',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#ae38ac9ce426834f139b5385577944dc7',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData']]], + ['getnode',['getNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#acd6e95b47c7394b858c0bf2ad8ce8a7e',1,'openvdb::v3_2_0::tree::IterListItem::getNode(Index lvl, NodeT *&node) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#abd143bb9c7a5e961608fd8c62380dfc6',1,'openvdb::v3_2_0::tree::IterListItem::getNode(Index lvl, OtherNodeT *&node) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#acd6e95b47c7394b858c0bf2ad8ce8a7e',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::getNode(Index lvl, NodeT *&node) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#abd143bb9c7a5e961608fd8c62380dfc6',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::getNode(Index lvl, OtherNodeT *&node) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#acd6e95b47c7394b858c0bf2ad8ce8a7e',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::getNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a543711b4de27ee446fadafa035a9d946',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::getNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#aff6da1429c831d56cc69c9a7d7bb3b54',1,'openvdb::v3_2_0::tree::NodeIteratorBase::getNode(NodeT *&node) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#ab0e07b4520374814d522e5b8a22744f2',1,'openvdb::v3_2_0::tree::NodeIteratorBase::getNode(const NodeT *&node) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#ad3062cc77f2d07139f58aadc2de9272d',1,'openvdb::v3_2_0::tree::ValueAccessor::getNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#ab4566d531f350aef3bc194ae60d0586d',1,'openvdb::v3_2_0::tree::CacheItem::getNode(const NodeType *&node) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a8da34106cda6d2b8e115bafccfb1c71c',1,'openvdb::v3_2_0::tree::CacheItem::getNode(const NodeType *&node)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a4f837f772b3ad0800c660bc4091e0414',1,'openvdb::v3_2_0::tree::CacheItem::getNode(NodeType *&node)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#ad75765a47c3648b5b24b07f97842d41f',1,'openvdb::v3_2_0::tree::CacheItem::getNode(OtherNodeType *&node)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a74f075c790d615ec6cb3d5b60330e2b4',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::getNode(RootNodeType *&node)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a02aa420d5b7dc8fdfb7b02b2d54d9a66',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::getNode(const RootNodeType *&node) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a438b37b9a8bb6489138c12c7caa21ded',1,'openvdb::v3_2_0::tree::ValueAccessor0::getNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a438b37b9a8bb6489138c12c7caa21ded',1,'openvdb::v3_2_0::tree::ValueAccessor1::getNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a438b37b9a8bb6489138c12c7caa21ded',1,'openvdb::v3_2_0::tree::ValueAccessor2::getNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a438b37b9a8bb6489138c12c7caa21ded',1,'openvdb::v3_2_0::tree::ValueAccessor3::getNode()']]], + ['getnodeboundingbox',['getNodeBoundingBox',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a6051e4ba75b59a01e4d0e91ba9786070',1,'openvdb::v3_2_0::tree::InternalNode::getNodeBoundingBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a6051e4ba75b59a01e4d0e91ba9786070',1,'openvdb::v3_2_0::tree::LeafNode::getNodeBoundingBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a6051e4ba75b59a01e4d0e91ba9786070',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getNodeBoundingBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a6051e4ba75b59a01e4d0e91ba9786070',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getNodeBoundingBox()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a00265a6f2e4bb7edf268ce430744f410',1,'openvdb::v3_2_0::tree::RootNode::getNodeBoundingBox()']]], + ['getnodelog2dims',['getNodeLog2Dims',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ad3b91d6e713861046431c86630d23ae2',1,'openvdb::v3_2_0::tree::InternalNode::getNodeLog2Dims()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a95581347b62717ce005bf1f6d4e2bfae',1,'openvdb::v3_2_0::tree::LeafNode::getNodeLog2Dims()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a95581347b62717ce005bf1f6d4e2bfae',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getNodeLog2Dims()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a95581347b62717ce005bf1f6d4e2bfae',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getNodeLog2Dims()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ad3b91d6e713861046431c86630d23ae2',1,'openvdb::v3_2_0::tree::RootNode::getNodeLog2Dims()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ad3b91d6e713861046431c86630d23ae2',1,'openvdb::v3_2_0::tree::Tree::getNodeLog2Dims()']]], + ['getnodes',['getNodes',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a33a3cd99c0b9c78e1f6da3d9a36fdaff',1,'openvdb::v3_2_0::tree::InternalNode::getNodes(ArrayT &array)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ab4dda98f1a46783cb8638ef4a17462c0',1,'openvdb::v3_2_0::tree::InternalNode::getNodes(ArrayT &array) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a33a3cd99c0b9c78e1f6da3d9a36fdaff',1,'openvdb::v3_2_0::tree::LeafManager::getNodes(ArrayT &array)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#ab4dda98f1a46783cb8638ef4a17462c0',1,'openvdb::v3_2_0::tree::LeafManager::getNodes(ArrayT &array) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aee242e9e143c3bcf1492f263b243b21e',1,'openvdb::v3_2_0::tree::LeafNode::getNodes()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aee242e9e143c3bcf1492f263b243b21e',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getNodes()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aee242e9e143c3bcf1492f263b243b21e',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getNodes()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a33a3cd99c0b9c78e1f6da3d9a36fdaff',1,'openvdb::v3_2_0::tree::RootNode::getNodes(ArrayT &array)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ab4dda98f1a46783cb8638ef4a17462c0',1,'openvdb::v3_2_0::tree::RootNode::getNodes(ArrayT &array) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a33a3cd99c0b9c78e1f6da3d9a36fdaff',1,'openvdb::v3_2_0::tree::Tree::getNodes(ArrayT &array)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ab4dda98f1a46783cb8638ef4a17462c0',1,'openvdb::v3_2_0::tree::Tree::getNodes(ArrayT &array) const ']]], + ['getnormcount',['getNormCount',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#a5096d7f4d64f4c6f6ad30d743b0df19f',1,'openvdb::v3_2_0::tools::LevelSetAdvection::getNormCount()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a5096d7f4d64f4c6f6ad30d743b0df19f',1,'openvdb::v3_2_0::tools::LevelSetMorphing::getNormCount()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a5096d7f4d64f4c6f6ad30d743b0df19f',1,'openvdb::v3_2_0::tools::LevelSetTracker::getNormCount()']]], + ['getorigin',['getOrigin',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#abd5800af661d982b2581c631edd0f79b',1,'openvdb::v3_2_0::tree::LeafNode::getOrigin(Coord &origin) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a4bffbac0d66dc1f0d7f2932f8c1dc325',1,'openvdb::v3_2_0::tree::LeafNode::getOrigin(Int32 &x, Int32 &y, Int32 &z) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#abd5800af661d982b2581c631edd0f79b',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getOrigin(Coord &origin) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a4bffbac0d66dc1f0d7f2932f8c1dc325',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getOrigin(Int32 &x, Int32 &y, Int32 &z) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#abd5800af661d982b2581c631edd0f79b',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getOrigin(Coord &origin) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a4bffbac0d66dc1f0d7f2932f8c1dc325',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getOrigin(Int32 &x, Int32 &y, Int32 &z) const ']]], + ['getparentnode',['getParentNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#ac3896c3a5f58724c4f984e4489ef76fa',1,'openvdb::v3_2_0::tree::IteratorBase']]], + ['getpointcount',['getPointCount',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#a5278f3d735349b46445b8d4fd153b763',1,'openvdb::v3_2_0::tools::BasePointScatter']]], + ['getpointpervolume',['getPointPerVolume',['../classopenvdb_1_1v3__2__0_1_1tools_1_1NonUniformPointScatter.html#a940acbc8525f26d3329d67f32cdb4f6b',1,'openvdb::v3_2_0::tools::NonUniformPointScatter']]], + ['getpointspervolume',['getPointsPerVolume',['../classopenvdb_1_1v3__2__0_1_1tools_1_1UniformPointScatter.html#a7b05344bec352d128edf511b5422e047',1,'openvdb::v3_2_0::tools::UniformPointScatter']]], + ['getpointspervoxel',['getPointsPerVoxel',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseUniformPointScatter.html#ab4c56ef7477069b8b3298f08e5a90aea',1,'openvdb::v3_2_0::tools::DenseUniformPointScatter']]], + ['getpos',['getPos',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#a0c5707538b184775116ed2886c960796',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray']]], + ['getprefixsum',['getPreFixSum',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#ab7db47976e73723845361ce09ed5f268',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['getpyobjectfromgrid',['getPyObjectFromGrid',['../namespacepyopenvdb.html#ae7acf28e936f8122699258c2ca447aca',1,'pyopenvdb']]], + ['getradius',['getRadius',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#ae9f9f3172ab506047b3cbc7a29e90f8d',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray']]], + ['getrand',['getRand',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#af9fba543c2483ae7347ab024654d029d',1,'openvdb::v3_2_0::tools::BasePointScatter']]], + ['getrange',['getRange',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a382a2616845396316bfdc4e92bd9468d',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['getray',['getRay',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#a5b2610625050c4704a8021df68110948',1,'openvdb::v3_2_0::tools::BaseCamera::getRay()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PerspectiveCamera.html#a8765ea5f6fbf529dbbe7f585cbf2556c',1,'openvdb::v3_2_0::tools::PerspectiveCamera::getRay()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1OrthographicCamera.html#a8765ea5f6fbf529dbbe7f585cbf2556c',1,'openvdb::v3_2_0::tools::OrthographicCamera::getRay()']]], + ['getrmax',['getRmax',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a87b930615033fc53057d556a68383cb0',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['getrmin',['getRmin',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a1ff8f3e9678183f7024ed0a7ea00bb02',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['getroweditor',['getRowEditor',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a40a49b6e7da4381c1c08bce14737fbb9',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix']]], + ['getscale',['getScale',['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a9b0ef01b258f1949fc5c2ebf2eed34d1',1,'openvdb::v3_2_0::math::ScaleMap::getScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a9b0ef01b258f1949fc5c2ebf2eed34d1',1,'openvdb::v3_2_0::math::ScaleTranslateMap::getScale()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7bb0b9c0f7abe47f994924b5a28341e4',1,'openvdb::v3_2_0::math::getScale()']]], + ['getsize',['getSize',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#ac73aa16a11a258ce5b821c7ee1767a08',1,'openvdb::v3_2_0::io::File']]], + ['getspatialscheme',['getSpatialScheme',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#a36a2c53fd97763a9f32cf8e0133ce5c4',1,'openvdb::v3_2_0::tools::LevelSetAdvection::getSpatialScheme()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a36a2c53fd97763a9f32cf8e0133ce5c4',1,'openvdb::v3_2_0::tools::LevelSetMorphing::getSpatialScheme()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a36a2c53fd97763a9f32cf8e0133ce5c4',1,'openvdb::v3_2_0::tools::LevelSetTracker::getSpatialScheme()']]], + ['getstart',['getStart',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a75e19799bfa09d93a57a027ac0c78b10',1,'openvdb::v3_2_0::math::CoordBBox']]], + ['getstate',['getState',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a6fb17d112cc5d64d4d25721f9ddfb9ba',1,'openvdb::v3_2_0::tools::LevelSetTracker']]], + ['getstatsmetadata',['getStatsMetadata',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#aa5dcf695fe75a1b3049d264b06f1bd0a',1,'openvdb::v3_2_0::GridBase']]], + ['getstreammetadataptr',['getStreamMetadataPtr',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#ae66d09e2cc80cacb03d2b9e3a74a1558',1,'openvdb::v3_2_0::io']]], + ['getsubsteps',['getSubSteps',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#a7a9cced028d06825da35e35229a201f1',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['gettable',['getTable',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aa5a55c00aec3e358c7bb3441d575e445',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['gettablesize',['getTableSize',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a090c046211c122ce4bba72d102f578e7',1,'openvdb::v3_2_0::tree::RootNode']]], + ['gettaper',['getTaper',['../classopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1LegacyFrustum.html#a4066082b7d002cfae1d6fefc176bb321',1,'openvdb::v3_2_0::math::internal::LegacyFrustum::getTaper()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a4066082b7d002cfae1d6fefc176bb321',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::getTaper()']]], + ['gettargetpointcount',['getTargetPointCount',['../classopenvdb_1_1v3__2__0_1_1tools_1_1UniformPointScatter.html#a9d4282ccd2eaefcf7f40ff5724db024b',1,'openvdb::v3_2_0::tools::UniformPointScatter']]], + ['gettemporalscheme',['getTemporalScheme',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#acc13f45d8dd438281c6b37232ad99ad6',1,'openvdb::v3_2_0::tools::LevelSetAdvection::getTemporalScheme()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#acc13f45d8dd438281c6b37232ad99ad6',1,'openvdb::v3_2_0::tools::LevelSetMorphing::getTemporalScheme()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#acc13f45d8dd438281c6b37232ad99ad6',1,'openvdb::v3_2_0::tools::LevelSetTracker::getTemporalScheme()']]], + ['getthreaded',['getThreaded',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#ad491455f3e592d52290c59d108710e92',1,'openvdb::v3_2_0::tools::PointAdvect::getThreaded()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#ad491455f3e592d52290c59d108710e92',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect::getThreaded()']]], + ['gettrackerspatialscheme',['getTrackerSpatialScheme',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#a38fbb965847966032775c4575c22a958',1,'openvdb::v3_2_0::tools::LevelSetAdvection::getTrackerSpatialScheme()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a38fbb965847966032775c4575c22a958',1,'openvdb::v3_2_0::tools::LevelSetMorphing::getTrackerSpatialScheme()']]], + ['gettrackertemporalscheme',['getTrackerTemporalScheme',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#ad85a131b99465ed76f18ed4b4b063d97',1,'openvdb::v3_2_0::tools::LevelSetAdvection::getTrackerTemporalScheme()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#ad85a131b99465ed76f18ed4b4b063d97',1,'openvdb::v3_2_0::tools::LevelSetMorphing::getTrackerTemporalScheme()']]], + ['gettransform',['getTransform',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer.html#ad252684d388fc541ad3bce330b205c76',1,'openvdb::v3_2_0::tools::GridTransformer']]], + ['gettranslation',['getTranslation',['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a610bd6689ede522319c472d001060a1e',1,'openvdb::v3_2_0::math::TranslationMap::getTranslation()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a610bd6689ede522319c472d001060a1e',1,'openvdb::v3_2_0::math::ScaleTranslateMap::getTranslation()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#af94576a217cee27acbd0a5da6663a7db',1,'openvdb::v3_2_0::math::Mat4::getTranslation()']]], + ['gettree',['getTree',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#af80a26f37ca4b9105ef041ad19760951',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::getTree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#af80a26f37ca4b9105ef041ad19760951',1,'openvdb::v3_2_0::tree::NodeIteratorBase::getTree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#af80a26f37ca4b9105ef041ad19760951',1,'openvdb::v3_2_0::tree::LeafIteratorBase::getTree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html#a6b1734bdff67bbb51f405bb905567ea8',1,'openvdb::v3_2_0::tree::ValueAccessorBase::getTree()']]], + ['getuniquetag',['getUniqueTag',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a86fda16f86d137be89d3c7cd593557a1',1,'openvdb::v3_2_0::io::Archive']]], + ['getunsafeaccessor',['getUnsafeAccessor',['../classopenvdb_1_1v3__2__0_1_1Grid.html#ac081a7d2b59c6c0e36adbad25cc33b58',1,'openvdb::v3_2_0::Grid']]], + ['getvalidpointindexgrid',['getValidPointIndexGrid',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ab2dc20cbb018eddb5d26c53bf8cf83ab',1,'openvdb::v3_2_0::tools::getValidPointIndexGrid(const PointArrayT &points, const typename GridT::ConstPtr &grid)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#afb27ad923a88ee58220750ffc3914c03',1,'openvdb::v3_2_0::tools::getValidPointIndexGrid(const PointArrayT &points, const typename GridT::Ptr &grid)']]], + ['getvalidtypedmetadata',['getValidTypedMetadata',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a0a784970481efce26bfeaaf774570179',1,'openvdb::v3_2_0::MetaMap']]], + ['getvalue',['getValue',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a955d9f0d72df8f19b9e726d04f6cbde6',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::getValue()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#aec69ec0455d4c4bda1c5948b9aa77a30',1,'openvdb::v3_2_0::math::BaseStencil::getValue(unsigned int pos=0) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a87bdcdb34217606521abfd489366b8dd',1,'openvdb::v3_2_0::math::BaseStencil::getValue() const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a301e0897c55855c7c971026743ab1d8a',1,'openvdb::v3_2_0::tools::Dense::getValue(size_t offset) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#aec4a56843adb18db943302378078442d',1,'openvdb::v3_2_0::tools::Dense::getValue(size_t offset)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a14b2ae90c5a4b7b815b98880d82aebbf',1,'openvdb::v3_2_0::tools::Dense::getValue(size_t i, size_t j, size_t k) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a9d96c1dac17b42a9b6ff4f3038729f7b',1,'openvdb::v3_2_0::tools::Dense::getValue(size_t i, size_t j, size_t k)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a1a288f80713bceffbe22f1a6620005dc',1,'openvdb::v3_2_0::tools::Dense::getValue(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a9ef7d44a9fd584407a1e969f3d2a9095',1,'openvdb::v3_2_0::tools::Dense::getValue(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a8ce49c1d01fb40115f7253b65dd98a38',1,'openvdb::v3_2_0::tree::InternalNode::getValue()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#a4da7f94e166daff868d33e698dde2507',1,'openvdb::v3_2_0::tree::SparseIteratorBase::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#a8ae956e9d4ceab35d332d85a2536eee3',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::getValue()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueIter.html#a69801b36294ef986a12c7b7df259475e',1,'openvdb::v3_2_0::tree::LeafNode::ValueIter::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a5aeaf69e0840568789e7fd65f3c59052',1,'openvdb::v3_2_0::tree::LeafNode::getValue(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a525333c1fa4eb845ef57df546aaf24af',1,'openvdb::v3_2_0::tree::LeafNode::getValue(Index offset) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a21e47f18e1fed0e1d02bfe37ffcf1b2f',1,'openvdb::v3_2_0::tree::LeafNode::getValue(const Coord &xyz, bool &state, int &level, AccessorT &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#a6c222225e15cf8dbde30aefc26ce6d6c',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ae3ed6a133109387b8f84ce43e68f1f2f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getValue(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a4d506a6ce7255e5679976d0cc8810396',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getValue(Index offset) const '],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ValueIter.html#a5864ed733b82c49c55aecb6f1ddac125',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#a6c222225e15cf8dbde30aefc26ce6d6c',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ae3ed6a133109387b8f84ce43e68f1f2f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getValue(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a4d506a6ce7255e5679976d0cc8810396',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getValue(Index offset) const '],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ValueIter.html#a5864ed733b82c49c55aecb6f1ddac125',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01false_00_01ValueT_00_01ChildT_01_4.html#a80729523e387a923f51e5ddb8f4fa8e4',1,'openvdb::v3_2_0::tree::NodeUnionImpl< false, ValueT, ChildT >::getValue() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01false_00_01ValueT_00_01ChildT_01_4.html#a12195c4c236686bbb41c2e0c02046a6a',1,'openvdb::v3_2_0::tree::NodeUnionImpl< false, ValueT, ChildT >::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01true_00_01ValueT_00_01ChildT_01_4.html#a80729523e387a923f51e5ddb8f4fa8e4',1,'openvdb::v3_2_0::tree::NodeUnionImpl< true, ValueT, ChildT >::getValue() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01true_00_01ValueT_00_01ChildT_01_4.html#a12195c4c236686bbb41c2e0c02046a6a',1,'openvdb::v3_2_0::tree::NodeUnionImpl< true, ValueT, ChildT >::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a8ce49c1d01fb40115f7253b65dd98a38',1,'openvdb::v3_2_0::tree::RootNode::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ac5110ef8248d5f0510bc583de349c196',1,'openvdb::v3_2_0::tree::Tree::getValue(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a9f8e9219c54ef1cfb85cf5a61b017bdb',1,'openvdb::v3_2_0::tree::Tree::getValue(const Coord &xyz, AccessT &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#aab0a07da66dc2bce72a1e44a3f9f4d03',1,'openvdb::v3_2_0::tree::IterListItem::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#aab0a07da66dc2bce72a1e44a3f9f4d03',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#aab0a07da66dc2bce72a1e44a3f9f4d03',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a80729523e387a923f51e5ddb8f4fa8e4',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#aa0cec1da633233009e933bb56b1ec345',1,'openvdb::v3_2_0::tree::ValueAccessor::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a810a5ea5b20ddb7b0720ee23ec15c3c7',1,'openvdb::v3_2_0::tree::CacheItem::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a810a5ea5b20ddb7b0720ee23ec15c3c7',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#aa0cec1da633233009e933bb56b1ec345',1,'openvdb::v3_2_0::tree::ValueAccessor0::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#aa0cec1da633233009e933bb56b1ec345',1,'openvdb::v3_2_0::tree::ValueAccessor1::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#aa0cec1da633233009e933bb56b1ec345',1,'openvdb::v3_2_0::tree::ValueAccessor2::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#aa0cec1da633233009e933bb56b1ec345',1,'openvdb::v3_2_0::tree::ValueAccessor3::getValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a874ad8bd0d611f2bc80f76e3a029dd9f',1,'openvdb::v3_2_0::tree::Tree::getValue()']]], + ['getvalueandcache',['getValueAndCache',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ab54f367109416043c0ce7d175be04c21',1,'openvdb::v3_2_0::tree::InternalNode::getValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ab54f367109416043c0ce7d175be04c21',1,'openvdb::v3_2_0::tree::LeafNode::getValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#afef6999fb485a52a9ed2fb9e530a3113',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#afef6999fb485a52a9ed2fb9e530a3113',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ab54f367109416043c0ce7d175be04c21',1,'openvdb::v3_2_0::tree::RootNode::getValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a21c08c3d36ba7fe64cc4861fe4b4cae0',1,'openvdb::v3_2_0::tree::InternalNode::getValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a21c08c3d36ba7fe64cc4861fe4b4cae0',1,'openvdb::v3_2_0::tree::RootNode::getValueAndCache()']]], + ['getvaluedepth',['getValueDepth',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#adabe21e6eb918bee1d29c161c6ce03ae',1,'openvdb::v3_2_0::tree::RootNode::getValueDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#adabe21e6eb918bee1d29c161c6ce03ae',1,'openvdb::v3_2_0::tree::Tree::getValueDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#adabe21e6eb918bee1d29c161c6ce03ae',1,'openvdb::v3_2_0::tree::ValueAccessor::getValueDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a6d2c684a7324c1db0421af43e79c841e',1,'openvdb::v3_2_0::tree::CacheItem::getValueDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a6d2c684a7324c1db0421af43e79c841e',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::getValueDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#adabe21e6eb918bee1d29c161c6ce03ae',1,'openvdb::v3_2_0::tree::ValueAccessor0::getValueDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#adabe21e6eb918bee1d29c161c6ce03ae',1,'openvdb::v3_2_0::tree::ValueAccessor1::getValueDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#adabe21e6eb918bee1d29c161c6ce03ae',1,'openvdb::v3_2_0::tree::ValueAccessor2::getValueDepth()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#adabe21e6eb918bee1d29c161c6ce03ae',1,'openvdb::v3_2_0::tree::ValueAccessor3::getValueDepth()']]], + ['getvaluedepthandcache',['getValueDepthAndCache',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a0df3d050e327bad074c288d65bf7e4d8',1,'openvdb::v3_2_0::tree::RootNode']]], + ['getvaluelevel',['getValueLevel',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a619e96c166b4b5e8528f70d03318b940',1,'openvdb::v3_2_0::tree::InternalNode::getValueLevel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a5b4a63a1f71f21814f0eb7e34aae3d32',1,'openvdb::v3_2_0::tree::LeafNode::getValueLevel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a5b4a63a1f71f21814f0eb7e34aae3d32',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getValueLevel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a5b4a63a1f71f21814f0eb7e34aae3d32',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getValueLevel()']]], + ['getvaluelevelandcache',['getValueLevelAndCache',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a7d6b11a975fc78c2ea13585256b5b720',1,'openvdb::v3_2_0::tree::InternalNode::getValueLevelAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a672670a1b80aa035e8fe6a4f430345fb',1,'openvdb::v3_2_0::tree::LeafNode::getValueLevelAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a672670a1b80aa035e8fe6a4f430345fb',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getValueLevelAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a672670a1b80aa035e8fe6a4f430345fb',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getValueLevelAndCache()']]], + ['getvaluemask',['getValueMask',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a871b0c9de5a073d114847267e9c22850',1,'openvdb::v3_2_0::tree::InternalNode::getValueMask()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a871b0c9de5a073d114847267e9c22850',1,'openvdb::v3_2_0::tree::LeafNode::getValueMask() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a787149174c0a4eac7dd3f775dece909f',1,'openvdb::v3_2_0::tree::LeafNode::getValueMask()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a871b0c9de5a073d114847267e9c22850',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getValueMask() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a787149174c0a4eac7dd3f775dece909f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::getValueMask()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a871b0c9de5a073d114847267e9c22850',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getValueMask() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a787149174c0a4eac7dd3f775dece909f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::getValueMask()']]], + ['getvalueoffmask',['getValueOffMask',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#af34978c95b6c2f2975f3fb4d1115001c',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['getvalues',['getValues',['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html#a1c92e48b02976ee0c3d2dc40fadd19c0',1,'openvdb::v3_2_0::tools::BoxSampler']]], + ['getvec3',['getVec3',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#acdada9207e49b97f588c95f6ef554345',1,'openvdb::v3_2_0::math::Vec4']]], + ['getvectortype',['getVectorType',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a712e19d955d5da30b0d33973957dad4e',1,'openvdb::v3_2_0::GridBase']]], + ['getversion',['getVersion',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a61a6fadd20351b5f960099023c965920',1,'openvdb::v3_2_0::io']]], + ['getvoxelcount',['getVoxelCount',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#ac1f18d5e3a62864691c77290e0c90fbe',1,'openvdb::v3_2_0::tools::BasePointScatter::getVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a9474c55e928237bcc461b0bf4bf9f837',1,'openvdb::v3_2_0::tree::IterListItem::getVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a9474c55e928237bcc461b0bf4bf9f837',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::getVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a9474c55e928237bcc461b0bf4bf9f837',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::getVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#ac1f18d5e3a62864691c77290e0c90fbe',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::getVoxelCount()']]], + ['getvoxelsize',['getVoxelSize',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a40830c3e0d340c47f13c0bc3cc3f9f79',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['getwidth',['getWidth',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ad5917a5c4d6b84e2f083a5db8c004277',1,'openvdb::v3_2_0::tree::RootNode']]], + ['getword',['getWord',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#aa92778e86ea935c802b1b01385c69135',1,'openvdb::v3_2_0::util::NodeMask::getWord(Index n) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a418cb8bf723cf33d626d35da428816ac',1,'openvdb::v3_2_0::util::NodeMask::getWord(Index n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#aa92778e86ea935c802b1b01385c69135',1,'openvdb::v3_2_0::util::NodeMask< 2 >::getWord(Index n) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a418cb8bf723cf33d626d35da428816ac',1,'openvdb::v3_2_0::util::NodeMask< 2 >::getWord(Index n)']]], + ['getworldpos',['getWorldPos',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a3392131e9d7a2bbf5e7a695e33ee2d91',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::getWorldPos()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#a9117c95627bdd35cb219e2cd972ec951',1,'openvdb::v3_2_0::tools::LinearSearchImpl::getWorldPos()']]], + ['getworldposandnml',['getWorldPosAndNml',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#aabb87a1d0fcf93a240c8469ae4204e9e',1,'openvdb::v3_2_0::tools::LinearSearchImpl']]], + ['getworldtime',['getWorldTime',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#af76bbfbdaff178376dfa4765669c41e3',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::getWorldTime()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#aa00b5a54e71010f07cdc4d015b5544aa',1,'openvdb::v3_2_0::tools::LinearSearchImpl::getWorldTime()']]], + ['getwritegridstatsmetadata',['getWriteGridStatsMetadata',['../namespaceopenvdb_1_1v3__2__0_1_1io.html#a89120b20ae3e828b3cb9d3f81e9d18c7',1,'openvdb::v3_2_0::io']]], + ['godunovsnormsqrd',['GodunovsNormSqrd',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1d1a8e9d5cc2dbbd6f89104252ec6895',1,'openvdb::v3_2_0::math::GodunovsNormSqrd(bool isOutside, Real dP_xm, Real dP_xp, Real dP_ym, Real dP_yp, Real dP_zm, Real dP_zp)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a564490213c1905b6ddfead93d9859a59',1,'openvdb::v3_2_0::math::GodunovsNormSqrd(bool isOutside, const Vec3< Real > &gradient_m, const Vec3< Real > &gradient_p)']]], + ['gradient',['Gradient',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Gradient.html#aca732c8efffe7d95e2aae8a219e4216b',1,'openvdb::v3_2_0::tools::Gradient::Gradient(const InGridT &grid, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Gradient.html#a2f222e5a5bd21c54f288bd9c68eb89eb',1,'openvdb::v3_2_0::tools::Gradient::Gradient(const InGridT &grid, const MaskGridType &mask, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BoxStencil.html#a5cc53cf415681b31da70c6b71d338f53',1,'openvdb::v3_2_0::math::BoxStencil::gradient()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#aab1aa12daff05d81deb813a4945bca7b',1,'openvdb::v3_2_0::math::GradStencil::gradient() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#ac1c46e1ba97105584232852187cabc2e',1,'openvdb::v3_2_0::math::GradStencil::gradient(const math::Vec3< ValueType > &V) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html#ac1c46e1ba97105584232852187cabc2e',1,'openvdb::v3_2_0::math::WenoStencil::gradient(const math::Vec3< ValueType > &V) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html#aab1aa12daff05d81deb813a4945bca7b',1,'openvdb::v3_2_0::math::WenoStencil::gradient() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1CurvatureStencil.html#ac9ca317cb7e25ec412adf16c051d0ab3',1,'openvdb::v3_2_0::math::CurvatureStencil::gradient()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a61d4d89cd34db1794e9a615dec11dc0f',1,'openvdb::v3_2_0::tools::gradient(const GridType &grid, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8cad07124b4f4d6a7b15021ee86b2c2f',1,'openvdb::v3_2_0::tools::gradient(const GridType &grid, const MaskT &mask, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ae44852bae3cbc2e448bc3698ddf5d3be',1,'openvdb::v3_2_0::tools::gradient(const GridType &grid, bool threaded=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aa78762a73e1d224c7e9848e91e7802cf',1,'openvdb::v3_2_0::tools::gradient(const GridType &grid, const MaskT &mask, bool threaded=true)']]], + ['gradstencil',['GradStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#a1f44c9b2a5dfbaaf203f4f795c927b9c',1,'openvdb::v3_2_0::math::GradStencil::GradStencil(const GridType &grid)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#a5b2014c1a1f2909eaa7d38388199a3fc',1,'openvdb::v3_2_0::math::GradStencil::GradStencil(const GridType &grid, Real dx)']]], + ['grainsize',['grainsize',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange.html#ad205489cfd791e06529aaf6c71db2d0a',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::grainsize()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange.html#ad205489cfd791e06529aaf6c71db2d0a',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::grainsize()']]], + ['greatercount',['GreaterCount',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GreaterCount.html#a1edb3ba65734c535f51577120c5bd7ed',1,'openvdb::v3_2_0::tools::level_set_util_internal::GreaterCount']]], + ['grid',['grid',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a1666446787c50aed7382010f17fd13df',1,'openvdb::v3_2_0::GridBase::grid(const GridBase::Ptr &)'],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a6993ac9a172f36973252d9c307f02d3e',1,'openvdb::v3_2_0::GridBase::grid(const GridBase::ConstPtr &)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a1b2f1b64cb2d797bdf36630f3e7add6e',1,'openvdb::v3_2_0::math::BaseStencil::grid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Diagnose.html#a73ed2c1f6ada573a8cef388792bf0af3',1,'openvdb::v3_2_0::tools::Diagnose::grid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#a1b2f1b64cb2d797bdf36630f3e7add6e',1,'openvdb::v3_2_0::tools::CheckLevelSet::grid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#a1b2f1b64cb2d797bdf36630f3e7add6e',1,'openvdb::v3_2_0::tools::CheckFogVolume::grid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a1b2f1b64cb2d797bdf36630f3e7add6e',1,'openvdb::v3_2_0::tools::LevelSetTracker::grid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a3aaab5ff6af1b5281feae6a3456310bc',1,'openvdb::v3_2_0::tools::MultiResGrid::grid(size_t level)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a9dcb555d35b308baaa79305470a7a84b',1,'openvdb::v3_2_0::tools::MultiResGrid::grid(size_t level) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a73ed2c1f6ada573a8cef388792bf0af3',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::grid()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a0a335d0339fe70071fcdf4cd5b1c7b5f',1,'openvdb::v3_2_0::Grid::Grid()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a56ebe5c92d33d71db57af3388d89a735',1,'openvdb::v3_2_0::Grid::Grid(const ValueType &background)'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#ac4470288a753c565478770d36d0db78c',1,'openvdb::v3_2_0::Grid::Grid(TreePtrType)'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a29b6c8c5166cc03ca82a082d1f357c44',1,'openvdb::v3_2_0::Grid::Grid(const Grid &)'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#aff94355411f5d40e863ac37ace513d65',1,'openvdb::v3_2_0::Grid::Grid(const Grid< OtherTreeType > &)'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#aa60df5f469b02c475a29de3a573f0f05',1,'openvdb::v3_2_0::Grid::Grid(const Grid &, ShallowCopy)'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#af01f7b8cbc4a58c9cce9d51e374e93ef',1,'openvdb::v3_2_0::Grid::Grid(const GridBase &)']]], + ['gridbase',['GridBase',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#aed48996d8c157228a7b40ff5f3a9da7c',1,'openvdb::v3_2_0::GridBase::GridBase()'],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#aae8eac5e78d057219029b04d05f12dbd',1,'openvdb::v3_2_0::GridBase::GridBase(const GridBase &other)'],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a2089e3e0bd581d988fc0c27fa71188f5',1,'openvdb::v3_2_0::GridBase::GridBase(const GridBase &other, ShallowCopy)']]], + ['gridclass',['gridClass',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a307d448024e0dd940a06426c10646802',1,'openvdb::v3_2_0::io::StreamMetadata']]], + ['gridclasstomenuname',['gridClassToMenuName',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a235f104d43761fdf4a92425ba82c1e1d',1,'openvdb::v3_2_0::GridBase']]], + ['gridclasstostring',['gridClassToString',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ac5ba27730c606524a3f91ad68081cfcf',1,'openvdb::v3_2_0::GridBase']]], + ['gridconstptrcast',['gridConstPtrCast',['../namespaceopenvdb_1_1v3__2__0.html#a287097021b14622d7769423852a947c9',1,'openvdb::v3_2_0']]], + ['griddescriptor',['GridDescriptor',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a12a9c143f6a0d4a79df394f8b4a4a821',1,'openvdb::v3_2_0::io::GridDescriptor::GridDescriptor()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#aab9576ad918d38c7fb838971d9a197a3',1,'openvdb::v3_2_0::io::GridDescriptor::GridDescriptor(const Name &name, const Name &gridType, bool saveFloatAsHalf=false)']]], + ['gridmetadata',['gridMetadata',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a511a828cb08b4c2dfade710778519afe',1,'openvdb::v3_2_0::io::StreamMetadata::gridMetadata()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a445da0d4500f7e8ca73bf8993917a90c',1,'openvdb::v3_2_0::io::StreamMetadata::gridMetadata() const ']]], + ['gridname',['gridName',['../classopenvdb_1_1v3__2__0_1_1io_1_1File_1_1NameIterator.html#a2f95bb0c721fad8fc2ebf49bf290048b',1,'openvdb::v3_2_0::io::File::NameIterator::gridName()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a04e685e8e4ed0313760abc44de6c213e',1,'openvdb::v3_2_0::io::GridDescriptor::gridName()']]], + ['gridnamepred',['GridNamePred',['../structopenvdb_1_1v3__2__0_1_1GridNamePred.html#a84f5f76b8fd4c8e3bc0ca6e955c2af4c',1,'openvdb::v3_2_0::GridNamePred']]], + ['gridoperator',['GridOperator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html#abeafb0eba65bdadba175251e18fa423c',1,'openvdb::v3_2_0::tools::gridop::GridOperator']]], + ['gridptrcast',['gridPtrCast',['../namespaceopenvdb_1_1v3__2__0.html#a012b32cc77cc69acf08420765238268f',1,'openvdb::v3_2_0']]], + ['gridresampler',['GridResampler',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html#a4604cdfd00f06a224800f3e2bd81ecd3',1,'openvdb::v3_2_0::tools::GridResampler']]], + ['grids',['grids',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a45ccf64b8fbd20b2ea6b50636cddb2bb',1,'openvdb::v3_2_0::tools::MultiResGrid::grids()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#ac581285b1716fe2f77c44c2ac3593817',1,'openvdb::v3_2_0::tools::MultiResGrid::grids() const ']]], + ['gridsampler',['GridSampler',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#a16eef124fcd2054f4acf5454c9fdb40b',1,'openvdb::v3_2_0::tools::GridSampler::GridSampler(const GridType &grid)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#a71aa047334cded4135a83e44cda223fb',1,'openvdb::v3_2_0::tools::GridSampler::GridSampler(const TreeType &tree, const math::Transform &transform)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html#a901a6f116560fc3165cf6d5d66223e03',1,'openvdb::v3_2_0::tools::GridSampler< tree::ValueAccessor< TreeT >, SamplerType >::GridSampler()']]], + ['gridtransformer',['GridTransformer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer.html#a52c4494adfd543dc3a0c42b6d899fcbf',1,'openvdb::v3_2_0::tools::GridTransformer::GridTransformer(const Mat4R &xform)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer.html#aeb07b4a35b5c4226b5f9bbfad88e69ac',1,'openvdb::v3_2_0::tools::GridTransformer::GridTransformer(const Vec3R &pivot, const Vec3R &scale, const Vec3R &rotate, const Vec3R &translate, const std::string &xformOrder="tsr", const std::string &rotationOrder="zyx")']]], + ['gridtype',['gridType',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a2038cd8d658443b9fa276bd926896a68',1,'openvdb::v3_2_0::Grid::gridType()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#ae08789a0144d0843ac50f4662d403c43',1,'openvdb::v3_2_0::io::GridDescriptor::gridType()']]], + ['gudonovsnormsqrd',['GudonovsNormSqrd',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aa17b1a41b209410577bdd0fe3fa3ab3c',1,'openvdb::v3_2_0::math::GudonovsNormSqrd(bool isOutside, Real dP_xm, Real dP_xp, Real dP_ym, Real dP_yp, Real dP_zm, Real dP_zp)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a66b2d4b5bbea7693e6185cdf535066a7',1,'openvdb::v3_2_0::math::GudonovsNormSqrd(bool isOutside, const Vec3< Real > &gradient_m, const Vec3< Real > &gradient_p)']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_7.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_7.html new file mode 100644 index 00000000..04db8a64 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_7.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_7.js new file mode 100644 index 00000000..2cb85d20 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_7.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['halffloat',['halfFloat',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a96d2f3a5d24393083b81912550f90e9d',1,'openvdb::v3_2_0::io::StreamMetadata']]], + ['hasactivetiles',['hasActiveTiles',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a1e1a133192d9d344c482d4aa83f6da33',1,'openvdb::v3_2_0::tree::InternalNode::hasActiveTiles()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a9d59c5b8e20bf9b62b5f851aaa66517e',1,'openvdb::v3_2_0::tree::LeafNode::hasActiveTiles()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a9d59c5b8e20bf9b62b5f851aaa66517e',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::hasActiveTiles()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a9d59c5b8e20bf9b62b5f851aaa66517e',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::hasActiveTiles()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a1e1a133192d9d344c482d4aa83f6da33',1,'openvdb::v3_2_0::tree::RootNode::hasActiveTiles()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a1e1a133192d9d344c482d4aa83f6da33',1,'openvdb::v3_2_0::tree::Tree::hasActiveTiles()']]], + ['hasblosccompression',['hasBloscCompression',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a29377f90d3c92efd6ce7ff3ec1c10863',1,'openvdb::v3_2_0::io::Archive']]], + ['hascompatiblevaluetype',['hasCompatibleValueType',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a44152640d1b71b1a5eaf192b9018bd53',1,'openvdb::v3_2_0::tree::RootNode']]], + ['hasgrid',['hasGrid',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a1d00183d397d9cfdb1ba97ad0949c511',1,'openvdb::v3_2_0::io::File']]], + ['hasoverlap',['hasOverlap',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a30d3863ef91de19a2a58b24783204949',1,'openvdb::v3_2_0::math::BBox::hasOverlap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a3eaee0f98a62f7e53bc29d5ea2d2a47e',1,'openvdb::v3_2_0::math::CoordBBox::hasOverlap()']]], + ['hassameconfiguration',['hasSameConfiguration',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a0332904c042d4dc9e88136294e048ed0',1,'openvdb::v3_2_0::tree::RootNode']]], + ['hassametopology',['hasSameTopology',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#aa4f3bf4aa119453a9f9189732818b00b',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::hasSameTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a6c323b840e618b6bd5a1e24bc25feeb5',1,'openvdb::v3_2_0::tree::InternalNode::hasSameTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a96f8ad18023d4f7cd56b4e4b117c1148',1,'openvdb::v3_2_0::tree::LeafNode::hasSameTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a96f8ad18023d4f7cd56b4e4b117c1148',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::hasSameTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a96f8ad18023d4f7cd56b4e4b117c1148',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::hasSameTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ad2290c7162c015d83e057eca2dd23dc1',1,'openvdb::v3_2_0::tree::RootNode::hasSameTopology()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ae4fd665aa748fe753c256bbbb6ff31d0',1,'openvdb::v3_2_0::tree::Tree::hasSameTopology()']]], + ['hassimpleaffine',['hasSimpleAffine',['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a205d3857a36b35d4e25791ecf7ed2faa',1,'openvdb::v3_2_0::math::NonlinearFrustumMap']]], + ['hastranslation',['hasTranslation',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a69dc9d0a1827cf2cd4f916dc1579a38d',1,'openvdb::v3_2_0::math']]], + ['hasuniformscale',['hasUniformScale',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#aa2319ba637d52e7b575b29d066880035',1,'openvdb::v3_2_0::math::MapBase::hasUniformScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#ad994319a8ddc55a92eff06e8bbbd16db',1,'openvdb::v3_2_0::math::AffineMap::hasUniformScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#ad994319a8ddc55a92eff06e8bbbd16db',1,'openvdb::v3_2_0::math::ScaleMap::hasUniformScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#ad994319a8ddc55a92eff06e8bbbd16db',1,'openvdb::v3_2_0::math::TranslationMap::hasUniformScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#ad994319a8ddc55a92eff06e8bbbd16db',1,'openvdb::v3_2_0::math::ScaleTranslateMap::hasUniformScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#ad994319a8ddc55a92eff06e8bbbd16db',1,'openvdb::v3_2_0::math::UnitaryMap::hasUniformScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#ad994319a8ddc55a92eff06e8bbbd16db',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::hasUniformScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#ad994319a8ddc55a92eff06e8bbbd16db',1,'openvdb::v3_2_0::math::Transform::hasUniformScale()']]], + ['hasuniformvoxels',['hasUniformVoxels',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#acabf3f247f64b7dcef84c32c8372fc04',1,'openvdb::v3_2_0::GridBase']]], + ['hasvolume',['hasVolume',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#ae8e4d8e4d7040e27e020e09078c9d316',1,'openvdb::v3_2_0::math::BBox::hasVolume()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#ae8e4d8e4d7040e27e020e09078c9d316',1,'openvdb::v3_2_0::math::CoordBBox::hasVolume()']]], + ['height',['height',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Film.html#ac0e3c6ba1d3f8a8e50aa3e3897210a2b',1,'openvdb::v3_2_0::tools::Film::height()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#ac0e3c6ba1d3f8a8e50aa3e3897210a2b',1,'openvdb::v3_2_0::tools::BaseCamera::height()']]], + ['histogram',['Histogram',['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html#afec707e67d72f4a84b1dd36ab0d4b6ba',1,'openvdb::v3_2_0::math::Histogram::Histogram(double min, double max, size_t numBins=10)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html#a798560d69c85e01cad8d221f8827afdf',1,'openvdb::v3_2_0::math::Histogram::Histogram(const Stats &s, size_t numBins=10)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a705b035d27c69d566009424697c36a65',1,'openvdb::v3_2_0::tools::histogram()']]], + ['histop',['HistOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1HistOp.html#a811e1c863fd3ab8c963a5e04463d020c',1,'openvdb::v3_2_0::tools::stats_internal::HistOp']]], + ['hits',['hits',['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA.html#adeea666b1518009b8e41a157dda13f63',1,'openvdb::v3_2_0::math::VolumeHDDA::hits()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA_3_01TreeT_00_01RayT_00_010_01_4.html#adeea666b1518009b8e41a157dda13f63',1,'openvdb::v3_2_0::math::VolumeHDDA< TreeT, RayT, 0 >::hits()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a8db424ca83bc0f7a3a424bf077311ed5',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::hits()']]], + ['homogeneousmatmul',['HomogeneousMatMul',['../structopenvdb_1_1v3__2__0_1_1tools_1_1HomogeneousMatMul.html#a01477096ffa4d99e8855bac5cce07ac4',1,'openvdb::v3_2_0::tools::HomogeneousMatMul']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_8.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_8.html new file mode 100644 index 00000000..6bab2c81 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_8.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_8.js new file mode 100644 index 00000000..bba057d7 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_8.js @@ -0,0 +1,134 @@ +var searchData= +[ + ['identity',['identity',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#aa7dd07a63fc2178c6e40b8c3bce5246e',1,'openvdb::v3_2_0::math::Mat3::identity()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a71890348d53084982694f39988f4b286',1,'openvdb::v3_2_0::math::Mat4::identity()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ab4432f85f66386028df0d56c04cecd71',1,'openvdb::v3_2_0::math::Quat::identity()']]], + ['idxtree',['idxTree',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#aadadf44c0fd7a2ed3594518ff867f419',1,'openvdb::v3_2_0::tools::internal::SignData']]], + ['ignoredparticles',['ignoredParticles',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a064d5729ee56e07fdf5052012d0d5cdc',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['illegalvalueexception',['IllegalValueException',['../classopenvdb_1_1v3__2__0_1_1IllegalValueException.html#a4a5e56beb0b1257403509e785498ffbc',1,'openvdb::v3_2_0::IllegalValueException::IllegalValueException()'],['../classopenvdb_1_1v3__2__0_1_1IllegalValueException.html#a673386a184a7e79fd450ed8f141cf967',1,'openvdb::v3_2_0::IllegalValueException::IllegalValueException(const std::string &msg)']]], + ['inactivatevalues',['InactivateValues',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1InactivateValues.html#a7d26298806c1fe8eb081b42f3d3b37d4',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::InactivateValues']]], + ['inactiveleafvoxelcount',['inactiveLeafVoxelCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#aa682010a0d4f996171ae710d1c353d11',1,'openvdb::v3_2_0::tree::TreeBase::inactiveLeafVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a10b6f1647213252f60b1678372c2729a',1,'openvdb::v3_2_0::tree::Tree::inactiveLeafVoxelCount()']]], + ['inactivepruneop',['InactivePruneOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1InactivePruneOp.html#aa3092e4241350c2b349250dc5faaad56',1,'openvdb::v3_2_0::tools::InactivePruneOp::InactivePruneOp(TreeT &tree)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1InactivePruneOp.html#adf1d4d3a97eefbb9e55edc8afacf57bd',1,'openvdb::v3_2_0::tools::InactivePruneOp::InactivePruneOp(TreeT &tree, const ValueT &v)']]], + ['inactivetilevalues',['InactiveTileValues',['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveTileValues.html#a27c9dc25d30e0abf157b746f5cd774ea',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveTileValues::InactiveTileValues(size_t numValues)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveTileValues.html#ae01d6ae759aae850b731cdaf28a8782d',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveTileValues::InactiveTileValues(const InactiveTileValues< TreeType > &, tbb::split)']]], + ['inactivevoxelcount',['inactiveVoxelCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a9653eb3c8d8e1a6a148e0df7bb618234',1,'openvdb::v3_2_0::tree::TreeBase::inactiveVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a9e5a3f469e2cd1831a467593cf8be357',1,'openvdb::v3_2_0::tree::Tree::inactiveVoxelCount()']]], + ['inactivevoxelvalues',['InactiveVoxelValues',['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveVoxelValues.html#a23bd39b577b899ce45cd57dd4991d090',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveVoxelValues::InactiveVoxelValues(LeafArray &, size_t numValues)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveVoxelValues.html#ac2a81807ab05eb240a410f5094389852',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveVoxelValues::InactiveVoxelValues(const InactiveVoxelValues< TreeType > &, tbb::split)']]], + ['incompletecholeskypreconditioner',['IncompleteCholeskyPreconditioner',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#a204a690a3e99cbd43395924f7bdedcf3',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner']]], + ['increment',['increment',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1ConstValueIter.html#aeb2624c7a86b765725fd80cd426e147d',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::ConstValueIter::increment()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#aeb2624c7a86b765725fd80cd426e147d',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::increment()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#aeb2624c7a86b765725fd80cd426e147d',1,'openvdb::v3_2_0::tools::PointIndexIterator::increment()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#a0d8eabe3c55a6d339f6c4c9dc3e8c437',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator::increment()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#aeb2624c7a86b765725fd80cd426e147d',1,'openvdb::v3_2_0::tree::IteratorBase::increment()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#aea94db88c016a77663346d22033050f2',1,'openvdb::v3_2_0::tree::IteratorBase::increment(Index n)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#aeb2624c7a86b765725fd80cd426e147d',1,'openvdb::v3_2_0::tree::NodeIteratorBase::increment()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#aea94db88c016a77663346d22033050f2',1,'openvdb::v3_2_0::tree::NodeIteratorBase::increment(Index n)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#aeb2624c7a86b765725fd80cd426e147d',1,'openvdb::v3_2_0::tree::LeafIteratorBase::increment()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#aea94db88c016a77663346d22033050f2',1,'openvdb::v3_2_0::tree::LeafIteratorBase::increment(Index n)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorRange.html#af4db50e522b7d0ff0d42eaf06abc3206',1,'openvdb::v3_2_0::tree::IteratorRange::increment()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1OnMaskIterator.html#aeb2624c7a86b765725fd80cd426e147d',1,'openvdb::v3_2_0::util::OnMaskIterator::increment()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1OnMaskIterator.html#aea94db88c016a77663346d22033050f2',1,'openvdb::v3_2_0::util::OnMaskIterator::increment(Index n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1OffMaskIterator.html#aeb2624c7a86b765725fd80cd426e147d',1,'openvdb::v3_2_0::util::OffMaskIterator::increment()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1OffMaskIterator.html#aea94db88c016a77663346d22033050f2',1,'openvdb::v3_2_0::util::OffMaskIterator::increment(Index n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1DenseMaskIterator.html#aeb2624c7a86b765725fd80cd426e147d',1,'openvdb::v3_2_0::util::DenseMaskIterator::increment()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1DenseMaskIterator.html#aea94db88c016a77663346d22033050f2',1,'openvdb::v3_2_0::util::DenseMaskIterator::increment(Index n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OnIterator.html#aeb2624c7a86b765725fd80cd426e147d',1,'openvdb::v3_2_0::util::RootNodeMask::OnIterator::increment()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OnIterator.html#aea94db88c016a77663346d22033050f2',1,'openvdb::v3_2_0::util::RootNodeMask::OnIterator::increment(Index n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OffIterator.html#aeb2624c7a86b765725fd80cd426e147d',1,'openvdb::v3_2_0::util::RootNodeMask::OffIterator::increment()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OffIterator.html#aea94db88c016a77663346d22033050f2',1,'openvdb::v3_2_0::util::RootNodeMask::OffIterator::increment(Index n)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1DenseIterator.html#aeb2624c7a86b765725fd80cd426e147d',1,'openvdb::v3_2_0::util::RootNodeMask::DenseIterator::increment()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1DenseIterator.html#aea94db88c016a77663346d22033050f2',1,'openvdb::v3_2_0::util::RootNodeMask::DenseIterator::increment(Index n)']]], + ['index',['index',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UpdatePoints.html#ad9c88ed5e8125d66291acd55da72d73e',1,'openvdb::v3_2_0::tools::internal::UpdatePoints']]], + ['indexerror',['IndexError',['../classopenvdb_1_1v3__2__0_1_1IndexError.html#a9bd4057affff1305bafd4d88e60d5587',1,'openvdb::v3_2_0::IndexError::IndexError()'],['../classopenvdb_1_1v3__2__0_1_1IndexError.html#a409a42f0331f040676f289b08590fe9f',1,'openvdb::v3_2_0::IndexError::IndexError(const std::string &msg)']]], + ['indexiterator',['IndexIterator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#aead984c98ce825687cbaf3c150f3f551',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator']]], + ['indextoworld',['indexToWorld',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a9b0e6d022b2571d4b0551704406ac4ba',1,'openvdb::v3_2_0::GridBase::indexToWorld(const Vec3d &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ac787726bec9f25b15915b34fa30f2e0c',1,'openvdb::v3_2_0::GridBase::indexToWorld(const Coord &ijk) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#aa4f6f15829e027f6153d1a7b90a59053',1,'openvdb::v3_2_0::math::Ray::indexToWorld()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a9b0e6d022b2571d4b0551704406ac4ba',1,'openvdb::v3_2_0::math::Transform::indexToWorld(const Vec3d &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#ac787726bec9f25b15915b34fa30f2e0c',1,'openvdb::v3_2_0::math::Transform::indexToWorld(const Coord &ijk) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#acc5c8b46dab7befe9bc1dcec66967107',1,'openvdb::v3_2_0::math::Transform::indexToWorld(const CoordBBox &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#ac6a391c9680282be6c16ef5c2487a676',1,'openvdb::v3_2_0::math::Transform::indexToWorld(const BBoxd &) const ']]], + ['indextree',['indexTree',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestSurfacePoint.html#af04ec6d0c764e6016a4ff39fbef29fd9',1,'openvdb::v3_2_0::tools::ClosestSurfacePoint']]], + ['indices',['indices',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a21e9cd1e2602f69d5b1e69c187fcd13f',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::indices()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a030f8c1fd7d4fd1eecb91c5dc71e37c3',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::indices() const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#a3122c5ffc751ea766f5f3177782cc169',1,'openvdb::v3_2_0::tools::PointPartitioner::indices()']]], + ['inf',['inf',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a98d6a4d2d00258fdedbb454cbc127610',1,'openvdb::v3_2_0::math::CoordBBox']]], + ['infnorm',['infNorm',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a71b7955ed483c5375bdb093836408555',1,'openvdb::v3_2_0::math::pcg::Vector']]], + ['infnormop',['InfNormOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1InfNormOp.html#aaefd32a2c691e43c363eeed677513189',1,'openvdb::v3_2_0::math::pcg::Vector::InfNormOp']]], + ['init',['init',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#a985db05411e4ed8cc1bc77c44a3bbd7d',1,'openvdb::v3_2_0::math::DDA::init(const RayT &ray, RealT startTime, RealT maxTime)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#a8f912b13dd1d5e776b9c953951c4355a',1,'openvdb::v3_2_0::math::DDA::init(const RayT &ray)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#a90c17c5ccdf81085d8a114d1b5be82b1',1,'openvdb::v3_2_0::math::DDA::init(const RayT &ray, RealT startTime)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ab97faa95316af6261c921829101d6cd0',1,'openvdb::v3_2_0::math::Quat::init(T x, T y, T z, T w)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a9a057015101f34e442bc25116b82c202',1,'openvdb::v3_2_0::math::Quat::init()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ac71edc039052ed3cc5af8f172d30c7d9',1,'openvdb::v3_2_0::math::Vec2::init()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a181b8e6c1a55901162ae611857db28fc',1,'openvdb::v3_2_0::math::Vec3::init()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a7e848289494b7db5e4bd227083f82fee',1,'openvdb::v3_2_0::math::Vec4::init()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UniformPrimBuilder.html#ac05ddcf045357945ea784cce639bf8f5',1,'openvdb::v3_2_0::tools::internal::UniformPrimBuilder::init()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1AdaptivePrimBuilder.html#a709df24ccb4822d44001e9c4f98ca161',1,'openvdb::v3_2_0::tools::internal::AdaptivePrimBuilder::init()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#a1f662436a86c87021460b959a49db877',1,'openvdb::v3_2_0::tree::NodeManagerLink::init()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#a1f662436a86c87021460b959a49db877',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::init()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#aa1d136414765efbd2f6e9dc36d9b44c6',1,'openvdb::v3_2_0::util::RootNodeMask::init()']]], + ['initialize',['initialize',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestSurfacePoint.html#a192376229812e91354e4ed1021f3e43a',1,'openvdb::v3_2_0::tools::ClosestSurfacePoint::initialize(const GridT &grid, float isovalue=0.0, InterrupterT *interrupter=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestSurfacePoint.html#a3b4178cb0fe6f3512a924638ced97bf6',1,'openvdb::v3_2_0::tools::ClosestSurfacePoint::initialize(const GridT &grid, float isovalue=0.0)'],['../namespaceopenvdb_1_1v3__2__0.html#a56c93ff831b7f5add8ab2cf077328660',1,'openvdb::v3_2_0::initialize()']]], + ['initlevel',['initLevel',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a58793e15e521227168e0ec1ea491f4ab',1,'openvdb::v3_2_0::tree::IterListItem::initLevel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a58793e15e521227168e0ec1ea491f4ab',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::initLevel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a58793e15e521227168e0ec1ea491f4ab',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::initLevel()']]], + ['initray',['initRay',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#a7321269e92b0677deca4349bda1c51f8',1,'openvdb::v3_2_0::tools::BaseCamera']]], + ['inputhasgridoffsets',['inputHasGridOffsets',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#afc6beef95458d74d667b93fbb6e5629f',1,'openvdb::v3_2_0::io::Archive']]], + ['insert',['insert',['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a324224f340079ac6c6e270c7ed8cf5a4',1,'openvdb::v3_2_0::tree::CacheItem::insert(const Coord &xyz, const NodeType *node)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a68aebd20142584a5c8006435f8f59e42',1,'openvdb::v3_2_0::tree::CacheItem::insert(const Coord &xyz, const OtherNodeType *node)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a081820d535254f2712082c496f35556d',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::insert(const Coord &, const RootNodeType *root)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a957e74a95b101ada04beba9ae04ad18f',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::insert(const Coord &, const OtherNodeType *)']]], + ['insertmeta',['insertMeta',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#afe07d56e50899edf5934fd2a5c47096b',1,'openvdb::v3_2_0::MetaMap::insertMeta(const Name &, const Metadata &value)'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#ad76c5f172e8cf4f33827b147f6eeb712',1,'openvdb::v3_2_0::MetaMap::insertMeta(const MetaMap &)']]], + ['insertnode',['insertNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a67e773d64537a251d1072bc4b10682ea',1,'openvdb::v3_2_0::tree::ValueAccessor::insertNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a09d70d3f67bdb03d342582adf8e25747',1,'openvdb::v3_2_0::tree::ValueAccessor0::insertNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#ac8707d2be914f10d7906e78ffee022e0',1,'openvdb::v3_2_0::tree::ValueAccessor1::insertNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#ac8707d2be914f10d7906e78ffee022e0',1,'openvdb::v3_2_0::tree::ValueAccessor2::insertNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#ac8707d2be914f10d7906e78ffee022e0',1,'openvdb::v3_2_0::tree::ValueAccessor3::insertNode()']]], + ['instance',['instance',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapRegistry.html#a74c096cca30f90b2ba30811385ce8d79',1,'openvdb::v3_2_0::math::MapRegistry']]], + ['instanceparentname',['instanceParentName',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a46c25c2e9d3c71eead3126a5c34b0a2e',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['integerpart',['IntegerPart',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a713d7c7d01fa50ad53daf6015d3e1f6a',1,'openvdb::v3_2_0::math']]], + ['internalnode',['InternalNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a3c7d5a1827fefa3ff6cad83cb6a04998',1,'openvdb::v3_2_0::tree::InternalNode::InternalNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ad1bc92d242649f28a8d9215cd99f968e',1,'openvdb::v3_2_0::tree::InternalNode::InternalNode(const ValueType &offValue)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a76f4c754efeeed3b7050e278286c0825',1,'openvdb::v3_2_0::tree::InternalNode::InternalNode(const Coord &, const ValueType &fillValue, bool active=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#af7c69f6e0dfc71e346694e3ef90e8708',1,'openvdb::v3_2_0::tree::InternalNode::InternalNode(PartialCreate, const Coord &, const ValueType &fillValue, bool active=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ae345664c5a28b29a81286eb7419e293b',1,'openvdb::v3_2_0::tree::InternalNode::InternalNode(const InternalNode &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a210d885537e470d3c48b4471ee3c0f50',1,'openvdb::v3_2_0::tree::InternalNode::InternalNode(const InternalNode< OtherChildNodeType, Log2Dim > &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a6ce3601644287a8bb0a1361ea4795c8c',1,'openvdb::v3_2_0::tree::InternalNode::InternalNode(const InternalNode< OtherChildNodeType, Log2Dim > &other, const ValueType &background, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a301b2a28b08db3370ed667cac46992fd',1,'openvdb::v3_2_0::tree::InternalNode::InternalNode(const InternalNode< OtherChildNodeType, Log2Dim > &other, const ValueType &offValue, const ValueType &onValue, TopologyCopy)']]], + ['interpolation',['interpolation',['../classopenvdb_1_1v3__2__0_1_1math_1_1BoxStencil.html#a5fe13169abd305acbc3bb8cc4ccd3329',1,'openvdb::v3_2_0::math::BoxStencil']]], + ['interrupt',['interrupt',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html#a8db4f5abed06068be78b00e2ed5ac11c',1,'openvdb::v3_2_0::tools::GridResampler::interrupt()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#afeb4d4325bf5c39be903e5322c144e71',1,'openvdb::v3_2_0::tools::BasePointScatter::interrupt()']]], + ['intersect',['intersect',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#ad0b32d1477b870869c2fa6a73d8c505a',1,'openvdb::v3_2_0::math::CoordBBox']]], + ['intersects',['intersects',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#ad7067b5357e57624fd3a0469311d75cf',1,'openvdb::v3_2_0::math::Ray::intersects(const Vec3T &center, RealT radius, RealT &t0, RealT &t1) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#af0237a31f0580d81ba49f422767d753e',1,'openvdb::v3_2_0::math::Ray::intersects(const Vec3T &center, RealT radius) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#acec10f3339400870d8dba2ebbbf93098',1,'openvdb::v3_2_0::math::Ray::intersects(const BBoxT &bbox, RealT &t0, RealT &t1) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a6ba82b51d7432105ecf5b43a69781887',1,'openvdb::v3_2_0::math::Ray::intersects(const BBoxT &bbox) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#ae699fca02539f8ad258786e156f3db3e',1,'openvdb::v3_2_0::math::Ray::intersects(const Vec3T &normal, RealT distance, RealT &t) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a1860a871a27ccee9744e0f381aa8c64e',1,'openvdb::v3_2_0::math::Ray::intersects(const Vec3T &normal, const Vec3T &point, RealT &t) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a4b2c9891717a31845694db27546f0d5a',1,'openvdb::v3_2_0::math::BaseStencil::intersects()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BoxStencil.html#a4b2c9891717a31845694db27546f0d5a',1,'openvdb::v3_2_0::math::BoxStencil::intersects()']]], + ['intersectsis',['intersectsIS',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#a1d9765f1e3066d46eebdad04b5f99c53',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::intersectsIS(const RayType &iRay) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#a350757779f08a7bcc81ee216767e6c95',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::intersectsIS(const RayType &iRay, RealType &iTime) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#aa79c6d574fe859340f6fec21b0be05c6',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::intersectsIS(const RayType &iRay, Vec3Type &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#ab2c3266bbe4068e02f901331ce214b81',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::intersectsIS(const RayType &iRay, Vec3Type &xyz, RealType &iTime) const ']]], + ['intersectsws',['intersectsWS',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#ab4d91351c7fe7996acdf4f9c03f35cd9',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::intersectsWS(const RayType &wRay) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#a33d2c668400b142a3bc59428efc800f4',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::intersectsWS(const RayType &wRay, RealType &wTime) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#a0cc790fd59a794a4daca4f9c261a8698',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::intersectsWS(const RayType &wRay, Vec3Type &world) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#a9b604007eeb659e84a0f33e65eb1a890',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::intersectsWS(const RayType &wRay, Vec3Type &world, RealType &wTime) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#ac74bad6889a28ef78731217572fc00a1',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::intersectsWS(const RayType &wRay, Vec3Type &world, Vec3Type &normal) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#ae6491b59531bf66411b1da73219f250b',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::intersectsWS(const RayType &wRay, Vec3Type &world, Vec3Type &normal, RealType &wTime) const ']]], + ['inv',['Inv',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a2630966931b5120e72f4c8735aebc984',1,'openvdb::v3_2_0::math']]], + ['invdir',['invDir',['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a372fad044dedd1da424c9fc0244198a0',1,'openvdb::v3_2_0::math::Ray']]], + ['inverse',['inverse',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a65dafa6f92f02253b33557a6ae279790',1,'openvdb::v3_2_0::math::AffineMap::inverse()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a1699b3962b9d1a0b951cedf4f64df5c3',1,'openvdb::v3_2_0::math::Mat3::inverse()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a26a6d7acc07d370764b895b848f846e0',1,'openvdb::v3_2_0::math::Mat4::inverse()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#aeb1ac4fb541d91b4c3abc64f5a0a9456',1,'openvdb::v3_2_0::math::Quat::inverse()']]], + ['inversemap',['inverseMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#af70314db95e0fa0df35749c79700d0e7',1,'openvdb::v3_2_0::math::MapBase::inverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#af7009d00bdfc80dfe12da8e5a4127313',1,'openvdb::v3_2_0::math::AffineMap::inverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#af7009d00bdfc80dfe12da8e5a4127313',1,'openvdb::v3_2_0::math::ScaleMap::inverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#af7009d00bdfc80dfe12da8e5a4127313',1,'openvdb::v3_2_0::math::UniformScaleMap::inverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#af7009d00bdfc80dfe12da8e5a4127313',1,'openvdb::v3_2_0::math::TranslationMap::inverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#af7009d00bdfc80dfe12da8e5a4127313',1,'openvdb::v3_2_0::math::ScaleTranslateMap::inverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#af7009d00bdfc80dfe12da8e5a4127313',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::inverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#af7009d00bdfc80dfe12da8e5a4127313',1,'openvdb::v3_2_0::math::UnitaryMap::inverseMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#af7009d00bdfc80dfe12da8e5a4127313',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::inverseMap()']]], + ['invertmask',['invertMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a7ac0dd78189660b0037a7ef03e77e735',1,'openvdb::v3_2_0::tools::Filter::invertMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a7ac0dd78189660b0037a7ef03e77e735',1,'openvdb::v3_2_0::tools::LevelSetFilter::invertMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a7ac0dd78189660b0037a7ef03e77e735',1,'openvdb::v3_2_0::tools::LevelSetMorphing::invertMask()']]], + ['invsort',['invSort',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a562fe73ea409de2947247a52a685a5ef',1,'openvdb::v3_2_0::util::PagedArray']]], + ['invtransform',['invTransform',['../structopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer_1_1MatrixTransform.html#aac9bfe6ddcbf3c56ec54199d905c8795',1,'openvdb::v3_2_0::tools::GridTransformer::MatrixTransform::invTransform()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ABTransform.html#a7d9008b60b1759bc490ef3cac79582c8',1,'openvdb::v3_2_0::tools::ABTransform::invTransform()']]], + ['inx',['inX',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2NDT_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< CD_2NDT >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2NDT_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< CD_2NDT >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2ND_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< CD_2ND >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2ND_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< CD_2ND >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__4TH_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< CD_4TH >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__4TH_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< CD_4TH >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__6TH_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< CD_6TH >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__6TH_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< CD_6TH >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__1ST_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< FD_1ST >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__1ST_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< FD_1ST >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__2ND_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< FD_2ND >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__2ND_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< FD_2ND >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__3RD_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< FD_3RD >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__3RD_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< FD_3RD >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__1ST_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< BD_1ST >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__1ST_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< BD_1ST >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__2ND_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< BD_2ND >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__2ND_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< BD_2ND >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__3RD_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< BD_3RD >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__3RD_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< BD_3RD >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__WENO5_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< FD_WENO5 >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__WENO5_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< FD_WENO5 >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__HJWENO5_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< FD_HJWENO5 >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__HJWENO5_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< FD_HJWENO5 >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__WENO5_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< BD_WENO5 >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__WENO5_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< BD_WENO5 >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__HJWENO5_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D1< BD_HJWENO5 >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__HJWENO5_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D1< BD_HJWENO5 >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec.html#aa97387e555b7ca19eb16448ef6fb472c',1,'openvdb::v3_2_0::math::D1Vec::inX(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec.html#a3dc66ac76f6d91b7159debca6fb3d0f9',1,'openvdb::v3_2_0::math::D1Vec::inX(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2NDT_01_4.html#aa97387e555b7ca19eb16448ef6fb472c',1,'openvdb::v3_2_0::math::D1Vec< CD_2NDT >::inX(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2NDT_01_4.html#a3dc66ac76f6d91b7159debca6fb3d0f9',1,'openvdb::v3_2_0::math::D1Vec< CD_2NDT >::inX(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2ND_01_4.html#aa97387e555b7ca19eb16448ef6fb472c',1,'openvdb::v3_2_0::math::D1Vec< CD_2ND >::inX(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2ND_01_4.html#a3dc66ac76f6d91b7159debca6fb3d0f9',1,'openvdb::v3_2_0::math::D1Vec< CD_2ND >::inX(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__4TH_01_4.html#aa97387e555b7ca19eb16448ef6fb472c',1,'openvdb::v3_2_0::math::D1Vec< CD_4TH >::inX(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__4TH_01_4.html#a3dc66ac76f6d91b7159debca6fb3d0f9',1,'openvdb::v3_2_0::math::D1Vec< CD_4TH >::inX(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__6TH_01_4.html#aa97387e555b7ca19eb16448ef6fb472c',1,'openvdb::v3_2_0::math::D1Vec< CD_6TH >::inX(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__6TH_01_4.html#a3dc66ac76f6d91b7159debca6fb3d0f9',1,'openvdb::v3_2_0::math::D1Vec< CD_6TH >::inX(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D2::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D2::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::inX(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#a05c813896b3b75bc2c89f83de6ec9391',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::inX(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#af627e930d2d10d237514f853197f9a21',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::inX(const Stencil &S)']]], + ['inxandy',['inXandY',['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html#ab86b33202df61b0970be5fdcc0e3361a',1,'openvdb::v3_2_0::math::D2::inXandY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html#aa42f3edcb49c4d018bc76463f521193e',1,'openvdb::v3_2_0::math::D2::inXandY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#ab86b33202df61b0970be5fdcc0e3361a',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::inXandY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#aa42f3edcb49c4d018bc76463f521193e',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::inXandY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#ab86b33202df61b0970be5fdcc0e3361a',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::inXandY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#aa42f3edcb49c4d018bc76463f521193e',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::inXandY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#ab86b33202df61b0970be5fdcc0e3361a',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::inXandY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#aa42f3edcb49c4d018bc76463f521193e',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::inXandY(const Stencil &S)']]], + ['inxandz',['inXandZ',['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html#a6fa7c0f9488d4b5f3f5dd8da48976042',1,'openvdb::v3_2_0::math::D2::inXandZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html#ac593d8b6c08618225159b1ad5b824939',1,'openvdb::v3_2_0::math::D2::inXandZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#a6fa7c0f9488d4b5f3f5dd8da48976042',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::inXandZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#ac593d8b6c08618225159b1ad5b824939',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::inXandZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#a6fa7c0f9488d4b5f3f5dd8da48976042',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::inXandZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#ac593d8b6c08618225159b1ad5b824939',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::inXandZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#a6fa7c0f9488d4b5f3f5dd8da48976042',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::inXandZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#ac593d8b6c08618225159b1ad5b824939',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::inXandZ(const Stencil &S)']]], + ['iny',['inY',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2NDT_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< CD_2NDT >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2NDT_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< CD_2NDT >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2ND_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< CD_2ND >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2ND_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< CD_2ND >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__4TH_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< CD_4TH >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__4TH_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< CD_4TH >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__6TH_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< CD_6TH >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__6TH_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< CD_6TH >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__1ST_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< FD_1ST >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__1ST_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< FD_1ST >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__2ND_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< FD_2ND >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__2ND_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< FD_2ND >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__3RD_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< FD_3RD >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__3RD_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< FD_3RD >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__1ST_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< BD_1ST >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__1ST_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< BD_1ST >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__2ND_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< BD_2ND >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__2ND_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< BD_2ND >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__3RD_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< BD_3RD >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__3RD_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< BD_3RD >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__WENO5_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< FD_WENO5 >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__WENO5_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< FD_WENO5 >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__HJWENO5_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< FD_HJWENO5 >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__HJWENO5_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< FD_HJWENO5 >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__WENO5_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< BD_WENO5 >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__WENO5_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< BD_WENO5 >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__HJWENO5_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D1< BD_HJWENO5 >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__HJWENO5_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D1< BD_HJWENO5 >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec.html#ad4ced54e50e376faafe6438f00e036f6',1,'openvdb::v3_2_0::math::D1Vec::inY(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec.html#ae99904484987db1d694920099e32d664',1,'openvdb::v3_2_0::math::D1Vec::inY(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2NDT_01_4.html#ad4ced54e50e376faafe6438f00e036f6',1,'openvdb::v3_2_0::math::D1Vec< CD_2NDT >::inY(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2NDT_01_4.html#ae99904484987db1d694920099e32d664',1,'openvdb::v3_2_0::math::D1Vec< CD_2NDT >::inY(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2ND_01_4.html#ad4ced54e50e376faafe6438f00e036f6',1,'openvdb::v3_2_0::math::D1Vec< CD_2ND >::inY(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2ND_01_4.html#ae99904484987db1d694920099e32d664',1,'openvdb::v3_2_0::math::D1Vec< CD_2ND >::inY(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__4TH_01_4.html#ad4ced54e50e376faafe6438f00e036f6',1,'openvdb::v3_2_0::math::D1Vec< CD_4TH >::inY(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__4TH_01_4.html#ae99904484987db1d694920099e32d664',1,'openvdb::v3_2_0::math::D1Vec< CD_4TH >::inY(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__6TH_01_4.html#ad4ced54e50e376faafe6438f00e036f6',1,'openvdb::v3_2_0::math::D1Vec< CD_6TH >::inY(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__6TH_01_4.html#ae99904484987db1d694920099e32d664',1,'openvdb::v3_2_0::math::D1Vec< CD_6TH >::inY(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D2::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D2::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::inY(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#af2c846e0825bbd2971c956de22e24c7a',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::inY(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#af36b80eb26ba5763b21037034593e717',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::inY(const Stencil &S)']]], + ['inyandz',['inYandZ',['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html#a8134534fdc212f1f52208126b29f1fb9',1,'openvdb::v3_2_0::math::D2::inYandZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html#aedbf7dc82e35db34b46bc096c0d676e5',1,'openvdb::v3_2_0::math::D2::inYandZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#a8134534fdc212f1f52208126b29f1fb9',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::inYandZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#aedbf7dc82e35db34b46bc096c0d676e5',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::inYandZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#a8134534fdc212f1f52208126b29f1fb9',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::inYandZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#aedbf7dc82e35db34b46bc096c0d676e5',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::inYandZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#a8134534fdc212f1f52208126b29f1fb9',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::inYandZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#aedbf7dc82e35db34b46bc096c0d676e5',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::inYandZ(const Stencil &S)']]], + ['inz',['inZ',['../structopenvdb_1_1v3__2__0_1_1math_1_1D1.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2NDT_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< CD_2NDT >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2NDT_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< CD_2NDT >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2ND_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< CD_2ND >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__2ND_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< CD_2ND >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__4TH_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< CD_4TH >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__4TH_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< CD_4TH >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__6TH_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< CD_6TH >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01CD__6TH_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< CD_6TH >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__1ST_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< FD_1ST >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__1ST_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< FD_1ST >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__2ND_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< FD_2ND >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__2ND_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< FD_2ND >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__3RD_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< FD_3RD >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__3RD_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< FD_3RD >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__1ST_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< BD_1ST >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__1ST_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< BD_1ST >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__2ND_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< BD_2ND >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__2ND_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< BD_2ND >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__3RD_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< BD_3RD >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__3RD_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< BD_3RD >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__WENO5_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< FD_WENO5 >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__WENO5_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< FD_WENO5 >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__HJWENO5_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< FD_HJWENO5 >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01FD__HJWENO5_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< FD_HJWENO5 >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__WENO5_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< BD_WENO5 >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__WENO5_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< BD_WENO5 >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__HJWENO5_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D1< BD_HJWENO5 >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1_3_01BD__HJWENO5_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D1< BD_HJWENO5 >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec.html#a91ec462a20bec1b52259ca8eb7dc5199',1,'openvdb::v3_2_0::math::D1Vec::inZ(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec.html#a0c12b87dcc8a9a15b60f2dc170512086',1,'openvdb::v3_2_0::math::D1Vec::inZ(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2NDT_01_4.html#a91ec462a20bec1b52259ca8eb7dc5199',1,'openvdb::v3_2_0::math::D1Vec< CD_2NDT >::inZ(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2NDT_01_4.html#a0c12b87dcc8a9a15b60f2dc170512086',1,'openvdb::v3_2_0::math::D1Vec< CD_2NDT >::inZ(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2ND_01_4.html#a91ec462a20bec1b52259ca8eb7dc5199',1,'openvdb::v3_2_0::math::D1Vec< CD_2ND >::inZ(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__2ND_01_4.html#a0c12b87dcc8a9a15b60f2dc170512086',1,'openvdb::v3_2_0::math::D1Vec< CD_2ND >::inZ(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__4TH_01_4.html#a91ec462a20bec1b52259ca8eb7dc5199',1,'openvdb::v3_2_0::math::D1Vec< CD_4TH >::inZ(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__4TH_01_4.html#a0c12b87dcc8a9a15b60f2dc170512086',1,'openvdb::v3_2_0::math::D1Vec< CD_4TH >::inZ(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__6TH_01_4.html#a91ec462a20bec1b52259ca8eb7dc5199',1,'openvdb::v3_2_0::math::D1Vec< CD_6TH >::inZ(const Accessor &grid, const Coord &ijk, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D1Vec_3_01CD__6TH_01_4.html#a0c12b87dcc8a9a15b60f2dc170512086',1,'openvdb::v3_2_0::math::D1Vec< CD_6TH >::inZ(const Stencil &S, int n)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D2::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D2::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SECOND_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D2< CD_SECOND >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__FOURTH_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D2< CD_FOURTH >::inZ(const Stencil &S)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#a0e9025b0ddd15a70920a86b7e09f5810',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::inZ(const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1D2_3_01CD__SIXTH_01_4.html#a3e58e8b09af3fb64ec9f97b0677e4c64',1,'openvdb::v3_2_0::math::D2< CD_SIXTH >::inZ(const Stencil &S)']]], + ['ioerror',['IoError',['../classopenvdb_1_1v3__2__0_1_1IoError.html#a3a84d31327939984888ac60da4fbd530',1,'openvdb::v3_2_0::IoError::IoError()'],['../classopenvdb_1_1v3__2__0_1_1IoError.html#aa79aa349dcea754fed123559c7853fb7',1,'openvdb::v3_2_0::IoError::IoError(const std::string &msg)']]], + ['is_5fdivisible',['is_divisible',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#aec7ec8e2a0c5b3a353264e1b0f681061',1,'openvdb::v3_2_0::math::CoordBBox::is_divisible()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange.html#aec7ec8e2a0c5b3a353264e1b0f681061',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::is_divisible()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange.html#aec7ec8e2a0c5b3a353264e1b0f681061',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::is_divisible()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorRange.html#aec7ec8e2a0c5b3a353264e1b0f681061',1,'openvdb::v3_2_0::tree::IteratorRange::is_divisible()']]], + ['is_5fopen',['is_open',['../classopenvdb_1_1v3__2__0_1_1io_1_1TempFile.html#a6879dafb5eadff1a2880c8a255393ef9',1,'openvdb::v3_2_0::io::TempFile']]], + ['isaffine',['isAffine',['../structopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer_1_1MatrixTransform.html#a9ce6bbb194d837844498a30647002012',1,'openvdb::v3_2_0::tools::GridTransformer::MatrixTransform::isAffine()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ABTransform.html#a9ce6bbb194d837844498a30647002012',1,'openvdb::v3_2_0::tools::ABTransform::isAffine()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1eb532cb47ab827e23dc38e084a8d5dc',1,'openvdb::v3_2_0::math::isAffine()']]], + ['isaligned',['isAligned',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler.html#a5a3b20d0b5c2519079c23d8141aa4b6e',1,'openvdb::v3_2_0::tools::DualGridSampler::isAligned()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerT_01_4.html#a5a3b20d0b5c2519079c23d8141aa4b6e',1,'openvdb::v3_2_0::tools::DualGridSampler< tree::ValueAccessor< TreeT >, SamplerT >::isAligned()']]], + ['isallocated',['isAllocated',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a0bcdab3616db481dd211594529479f94',1,'openvdb::v3_2_0::tree::LeafNode::isAllocated()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a0bcdab3616db481dd211594529479f94',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isAllocated()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a0bcdab3616db481dd211594529479f94',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isAllocated()']]], + ['isapproxequal',['isApproxEqual',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a892c3dc91b2e46854e2b5df8adab52bb',1,'openvdb::v3_2_0::math::isApproxEqual(const Type &a, const Type &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a979f3cb47671e2e22e2becf89a16c374',1,'openvdb::v3_2_0::math::isApproxEqual(const Type &a, const Type &b, const Type &tolerance)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ac02a12f569755821bde55f773ee013f1',1,'openvdb::v3_2_0::math::isApproxEqual(const Vec2< T > &a, const Vec2< T > &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4c38fb4bad0d7b400c8cb9f395fa7ee0',1,'openvdb::v3_2_0::math::isApproxEqual(const Vec2< T > &a, const Vec2< T > &b, const Vec2< T > &eps)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aa1d82bf1591d6381cf536e4aa677b35d',1,'openvdb::v3_2_0::math::isApproxEqual(const Vec3< T > &a, const Vec3< T > &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a773c814761180f05c1a53d3b001fc340',1,'openvdb::v3_2_0::math::isApproxEqual(const Vec3< T > &a, const Vec3< T > &b, const Vec3< T > &eps)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1e304cf8ee2c07cfb8a4b882d83b54ad',1,'openvdb::v3_2_0::math::isApproxEqual(const Vec4< T > &a, const Vec4< T > &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ac1ec179deb729000e0c715f97c8afc57',1,'openvdb::v3_2_0::math::isApproxEqual(const Vec4< T > &a, const Vec4< T > &b, const Vec4< T > &eps)']]], + ['isapproxequal_3c_20bool_20_3e',['isApproxEqual< bool >',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a6f8fb11b1f81500a0c990923e01d2d7a',1,'openvdb::v3_2_0::math::isApproxEqual< bool >(const bool &a, const bool &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae4c20559242cab3d1117cce4fa83064c',1,'openvdb::v3_2_0::math::isApproxEqual< bool >(const bool &a, const bool &b, const bool &)']]], + ['isapproxequal_3c_20std_3a_3astring_20_3e',['isApproxEqual< std::string >',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4264e734c55e3783b23f793e4b35b08a',1,'openvdb::v3_2_0::math::isApproxEqual< std::string >(const std::string &a, const std::string &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aa4117530c45f3f65b4d1a645013ce48e',1,'openvdb::v3_2_0::math::isApproxEqual< std::string >(const std::string &a, const std::string &b, const std::string &)']]], + ['isapproxlarger',['isApproxLarger',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#adb7f3cd00288b433cfe844f52d795a30',1,'openvdb::v3_2_0::math']]], + ['isapproxzero',['isApproxZero',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a61dea9bd833e61e92726da48caaa66eb',1,'openvdb::v3_2_0::math::isApproxZero(const Type &x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a8805f6e88971e774061687fadd44fa73',1,'openvdb::v3_2_0::math::isApproxZero(const Type &x, const Type &tolerance)']]], + ['isbackgroundtile',['isBackgroundTile',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a275e55e8c343dad4159b8ada32f99cde',1,'openvdb::v3_2_0::tree::RootNode::isBackgroundTile(const Tile &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ac259caaa98b8de89120f4cdc20926ad3',1,'openvdb::v3_2_0::tree::RootNode::isBackgroundTile(const MapIter &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a13d1d88614ecad7b27e54b48e9e1b647',1,'openvdb::v3_2_0::tree::RootNode::isBackgroundTile(const MapCIter &) const ']]], + ['iscached',['isCached',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#afb6fae9fe29723d8d350936afdce6cb1',1,'openvdb::v3_2_0::tree::ValueAccessor::isCached()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#afb6fae9fe29723d8d350936afdce6cb1',1,'openvdb::v3_2_0::tree::CacheItem::isCached()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#afb6fae9fe29723d8d350936afdce6cb1',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::isCached()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#ac60a4747c2f8c4fe9b017177855ab254',1,'openvdb::v3_2_0::tree::ValueAccessor0::isCached()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#afb6fae9fe29723d8d350936afdce6cb1',1,'openvdb::v3_2_0::tree::ValueAccessor1::isCached()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#afb6fae9fe29723d8d350936afdce6cb1',1,'openvdb::v3_2_0::tree::ValueAccessor2::isCached()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#afb6fae9fe29723d8d350936afdce6cb1',1,'openvdb::v3_2_0::tree::ValueAccessor3::isCached()']]], + ['ischildmaskoff',['isChildMaskOff',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#af1e153ed2a24f3a075035f97aef2b467',1,'openvdb::v3_2_0::tree::InternalNode::isChildMaskOff(Index n) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a00e22f49aefc09392060cf5d5c65a8e4',1,'openvdb::v3_2_0::tree::InternalNode::isChildMaskOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aecf6cbb61b0969544bd264d5092dec9e',1,'openvdb::v3_2_0::tree::LeafNode::isChildMaskOff(Index) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a00e22f49aefc09392060cf5d5c65a8e4',1,'openvdb::v3_2_0::tree::LeafNode::isChildMaskOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aecf6cbb61b0969544bd264d5092dec9e',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isChildMaskOff(Index) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a00e22f49aefc09392060cf5d5c65a8e4',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isChildMaskOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aecf6cbb61b0969544bd264d5092dec9e',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isChildMaskOff(Index) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a00e22f49aefc09392060cf5d5c65a8e4',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isChildMaskOff() const ']]], + ['ischildmaskon',['isChildMaskOn',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ac78aa9f7537d52f8bb57797469119a38',1,'openvdb::v3_2_0::tree::InternalNode::isChildMaskOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ab74c57e849d3709365668acb99b98801',1,'openvdb::v3_2_0::tree::LeafNode::isChildMaskOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ab74c57e849d3709365668acb99b98801',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isChildMaskOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ab74c57e849d3709365668acb99b98801',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isChildMaskOn()']]], + ['ischildnode',['isChildNode',['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a2399f8485cecdb8b3102546d364f70fa',1,'openvdb::v3_2_0::tree::DenseIteratorBase']]], + ['isconstant',['isConstant',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a7820ed8037aa904bd744048a15bf9221',1,'openvdb::v3_2_0::tree::InternalNode::isConstant(ValueType &constValue, bool &state, const ValueType &tolerance=zeroVal< ValueType >()) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a27932bcbc2413401194bfa313a57dbf9',1,'openvdb::v3_2_0::tree::InternalNode::isConstant(ValueType &minValue, ValueType &maxValue, bool &state, const ValueType &tolerance=zeroVal< ValueType >()) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a7820ed8037aa904bd744048a15bf9221',1,'openvdb::v3_2_0::tree::LeafNode::isConstant(ValueType &constValue, bool &state, const ValueType &tolerance=zeroVal< ValueType >()) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a27932bcbc2413401194bfa313a57dbf9',1,'openvdb::v3_2_0::tree::LeafNode::isConstant(ValueType &minValue, ValueType &maxValue, bool &state, const ValueType &tolerance=zeroVal< ValueType >()) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ac7b1511431dc882e104b69306c96bc7c',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isConstant()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ac7b1511431dc882e104b69306c96bc7c',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isConstant()']]], + ['isconsttree',['isConstTree',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#ad55e9918b7eae715b762983ff43fe422',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['isdelayedloadingenabled',['isDelayedLoadingEnabled',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a611c63ad5759baf8fc5950e6b2ea1f7d',1,'openvdb::v3_2_0::io::Archive']]], + ['isdense',['isDense',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a8d7772a85fd10d6e72b32a311a3c68e8',1,'openvdb::v3_2_0::tree::LeafNode::isDense()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8d7772a85fd10d6e72b32a311a3c68e8',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isDense()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8d7772a85fd10d6e72b32a311a3c68e8',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isDense()']]], + ['isdiagonal',['isDiagonal',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a84c5b8f35866c567185c13806e4c854c',1,'openvdb::v3_2_0::math::AffineMap::isDiagonal()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#a84c5b8f35866c567185c13806e4c854c',1,'openvdb::v3_2_0::math::CompoundMap::isDiagonal()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7ad0a7e68f58906adf7fe2fe82354f6f',1,'openvdb::v3_2_0::math::isDiagonal()']]], + ['isempty',['isEmpty',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a861d062f60f1e813338c4f30bdc433b1',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::isEmpty()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a479432127ee77145cc19d6a2d1590821',1,'openvdb::v3_2_0::tree::InternalNode::isEmpty()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a479432127ee77145cc19d6a2d1590821',1,'openvdb::v3_2_0::tree::LeafNode::isEmpty()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a479432127ee77145cc19d6a2d1590821',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isEmpty()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a479432127ee77145cc19d6a2d1590821',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isEmpty()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a479432127ee77145cc19d6a2d1590821',1,'openvdb::v3_2_0::util::PagedArray::isEmpty()']]], + ['isequal',['isEqual',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#afb6adf26bb660e00a48bec45e99f6c2d',1,'openvdb::v3_2_0::math::MapBase::isEqual()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#ac8cf8d17943cfef767441472a999a055',1,'openvdb::v3_2_0::math::AffineMap::isEqual()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#ac8cf8d17943cfef767441472a999a055',1,'openvdb::v3_2_0::math::ScaleMap::isEqual()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#ac8cf8d17943cfef767441472a999a055',1,'openvdb::v3_2_0::math::UniformScaleMap::isEqual()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#ac8cf8d17943cfef767441472a999a055',1,'openvdb::v3_2_0::math::TranslationMap::isEqual()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#ac8cf8d17943cfef767441472a999a055',1,'openvdb::v3_2_0::math::ScaleTranslateMap::isEqual()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#ac8cf8d17943cfef767441472a999a055',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::isEqual()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#ac8cf8d17943cfef767441472a999a055',1,'openvdb::v3_2_0::math::UnitaryMap::isEqual()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#ac8cf8d17943cfef767441472a999a055',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::isEqual()']]], + ['isequalbase',['isEqualBase',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a182de35ffb5ffa4ffd45e84681307fc2',1,'openvdb::v3_2_0::math::MapBase']]], + ['isexactlyequal',['isExactlyEqual',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a92113b7362b31951eb9efbab29f24af3',1,'openvdb::v3_2_0::math']]], + ['isfinite',['isFinite',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#aaa962dc12423e9f7039ac52dcb386da0',1,'openvdb::v3_2_0::math::pcg::Vector::isFinite()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#aaa962dc12423e9f7039ac52dcb386da0',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::isFinite()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1JacobiPreconditioner.html#aaa962dc12423e9f7039ac52dcb386da0',1,'openvdb::v3_2_0::math::pcg::JacobiPreconditioner::isFinite()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#aaa962dc12423e9f7039ac52dcb386da0',1,'openvdb::v3_2_0::math::Vec2::isFinite()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#aaa962dc12423e9f7039ac52dcb386da0',1,'openvdb::v3_2_0::math::Vec3::isFinite()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#aaa962dc12423e9f7039ac52dcb386da0',1,'openvdb::v3_2_0::math::Vec4::isFinite()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9fa66b7065fdd3f42f9c64d84ef3e06f',1,'openvdb::v3_2_0::math::isFinite(const Type &x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ac5b8aded39e9594dd590c2a6d88bec1a',1,'openvdb::v3_2_0::math::isFinite(const Vec2< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a6579941308f773e38db844cdbd2ee8c2',1,'openvdb::v3_2_0::math::isFinite(const Vec3< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aa4f89856b8ccc6d813f54a30db72d888',1,'openvdb::v3_2_0::math::isFinite(const Vec4< T > &v)']]], + ['isfiniteop',['IsFiniteOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1IsFiniteOp.html#aa5d688041f6800ee0f66881681ecdb64',1,'openvdb::v3_2_0::math::pcg::Vector::IsFiniteOp::IsFiniteOp()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1IsFiniteOp.html#a85fa9bb20ec8b770e101ec0ba66c064f',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::IsFiniteOp::IsFiniteOp()']]], + ['isgridstatsmetadataenabled',['isGridStatsMetadataEnabled',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a6c45a21f3fcf52a987561e20e321a610',1,'openvdb::v3_2_0::io::Archive']]], + ['isidentical',['isIdentical',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a666033d51d34fd46fda690832b1bc953',1,'openvdb::v3_2_0::io::Archive']]], + ['isidentity',['isIdentity',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a800851025d068929cc2d3f895cd6d630',1,'openvdb::v3_2_0::math::AffineMap::isIdentity()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a800851025d068929cc2d3f895cd6d630',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::isIdentity()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#a800851025d068929cc2d3f895cd6d630',1,'openvdb::v3_2_0::math::CompoundMap::isIdentity()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a800851025d068929cc2d3f895cd6d630',1,'openvdb::v3_2_0::math::Transform::isIdentity()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ABTransform.html#a800851025d068929cc2d3f895cd6d630',1,'openvdb::v3_2_0::tools::ABTransform::isIdentity()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1099c5d1cafb221aebe456853ae37ca8',1,'openvdb::v3_2_0::math::isIdentity()']]], + ['isinactive',['isInactive',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a44b7e3231fdb2ff6ee1fb822b2b921eb',1,'openvdb::v3_2_0::tree::InternalNode::isInactive()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a44b7e3231fdb2ff6ee1fb822b2b921eb',1,'openvdb::v3_2_0::tree::LeafNode::isInactive()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a44b7e3231fdb2ff6ee1fb822b2b921eb',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isInactive()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a44b7e3231fdb2ff6ee1fb822b2b921eb',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isInactive()']]], + ['isinfinite',['isInfinite',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ac16be5bc56c10702ee4c4c2499b3ade8',1,'openvdb::v3_2_0::math::Vec2::isInfinite()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ac16be5bc56c10702ee4c4c2499b3ade8',1,'openvdb::v3_2_0::math::Vec3::isInfinite()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#ac16be5bc56c10702ee4c4c2499b3ade8',1,'openvdb::v3_2_0::math::Vec4::isInfinite()']]], + ['isinside',['isInside',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a60ce8846964f11d587dcbf819c14b3f6',1,'openvdb::v3_2_0::math::BBox::isInside(const Vec3T &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#abd42d7e5bc9e5c107991bf796a16bf5d',1,'openvdb::v3_2_0::math::BBox::isInside(const BBox &) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a2b9b74537d8b39782b61afc83ad9e525',1,'openvdb::v3_2_0::math::CoordBBox::isInside(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a210a285ca2913c82d5eaed5e11ad58f1',1,'openvdb::v3_2_0::math::CoordBBox::isInside(const CoordBBox &b) const ']]], + ['isinstance',['isInstance',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a6840abcf08a03edcc035bc46d5bf8c58',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['isinstancingenabled',['isInstancingEnabled',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a8007c0f8975d1b45fd2c926035879c79',1,'openvdb::v3_2_0::io::Archive']]], + ['isinvertible',['isInvertible',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a01759890821906edd36a9e108ee1cfc4',1,'openvdb::v3_2_0::math']]], + ['isinworldspace',['isInWorldSpace',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a29e160275061736e411c8a5892fcff95',1,'openvdb::v3_2_0::GridBase']]], + ['islaplacianop',['ISLaplacianOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1ISLaplacianOp.html#a13c4a6332c39facf249eca3efb0488e0',1,'openvdb::v3_2_0::tools::poisson::internal::ISLaplacianOp']]], + ['islimiteron',['isLimiterOn',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeAdvection.html#ac9c2bcda19e3d8976221731c4fe9d3ac',1,'openvdb::v3_2_0::tools::VolumeAdvection']]], + ['islinear',['isLinear',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a92759be692dcbc1e4793d6fc3545481e',1,'openvdb::v3_2_0::math::MapBase::isLinear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a792fef1281c0bcc191b5bf4330f5eeb3',1,'openvdb::v3_2_0::math::AffineMap::isLinear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a792fef1281c0bcc191b5bf4330f5eeb3',1,'openvdb::v3_2_0::math::ScaleMap::isLinear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a792fef1281c0bcc191b5bf4330f5eeb3',1,'openvdb::v3_2_0::math::TranslationMap::isLinear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a792fef1281c0bcc191b5bf4330f5eeb3',1,'openvdb::v3_2_0::math::ScaleTranslateMap::isLinear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a792fef1281c0bcc191b5bf4330f5eeb3',1,'openvdb::v3_2_0::math::UnitaryMap::isLinear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a792fef1281c0bcc191b5bf4330f5eeb3',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::isLinear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a792fef1281c0bcc191b5bf4330f5eeb3',1,'openvdb::v3_2_0::math::Transform::isLinear()']]], + ['ismaskinverted',['isMaskInverted',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a65fd4cbed33f121baba4fa2228cba655',1,'openvdb::v3_2_0::tools::Filter::isMaskInverted()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a65fd4cbed33f121baba4fa2228cba655',1,'openvdb::v3_2_0::tools::LevelSetFilter::isMaskInverted()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a65fd4cbed33f121baba4fa2228cba655',1,'openvdb::v3_2_0::tools::LevelSetMorphing::isMaskInverted()']]], + ['ismergable',['isMergable',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a97e8214c312b6756f3a7e3f8bfff18a7',1,'openvdb::v3_2_0::tools::internal']]], + ['isnan',['isNan',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ac30b6cb765118673cdd5a23541507c09',1,'openvdb::v3_2_0::math::Vec2::isNan()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ac30b6cb765118673cdd5a23541507c09',1,'openvdb::v3_2_0::math::Vec3::isNan()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#ac30b6cb765118673cdd5a23541507c09',1,'openvdb::v3_2_0::math::Vec4::isNan()']]], + ['isnegative',['isNegative',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab306071e74e79d73c5fd9e86b0d264c3',1,'openvdb::v3_2_0::math']]], + ['isnegative_3c_20bool_20_3e',['isNegative< bool >',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ac4b9216c65da97ebb21cfac4ffb68404',1,'openvdb::v3_2_0::math']]], + ['isnonmanifold',['isNonManifold',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#af1adb88e5f7cc92b15651d1e7f7a1545',1,'openvdb::v3_2_0::tools::internal']]], + ['isoff',['isOff',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a9a8a6aae8eaaacf99a55ecb42d80f2cf',1,'openvdb::v3_2_0::util::NodeMask::isOff(Index32 n) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ad087dfc3726786e34d6ee1a745482c4a',1,'openvdb::v3_2_0::util::NodeMask::isOff() const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a9a8a6aae8eaaacf99a55ecb42d80f2cf',1,'openvdb::v3_2_0::util::NodeMask< 1 >::isOff(Index32 n) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ad087dfc3726786e34d6ee1a745482c4a',1,'openvdb::v3_2_0::util::NodeMask< 1 >::isOff() const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a9a8a6aae8eaaacf99a55ecb42d80f2cf',1,'openvdb::v3_2_0::util::NodeMask< 2 >::isOff(Index32 n) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ad087dfc3726786e34d6ee1a745482c4a',1,'openvdb::v3_2_0::util::NodeMask< 2 >::isOff() const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#acf084df9fa908471eafd64dd5637b823',1,'openvdb::v3_2_0::util::RootNodeMask::isOff(Index32 i) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#ad087dfc3726786e34d6ee1a745482c4a',1,'openvdb::v3_2_0::util::RootNodeMask::isOff() const ']]], + ['ison',['isOn',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a8a125384c2ac1b1ac00df0e0c0c4a6ee',1,'openvdb::v3_2_0::util::NodeMask::isOn(Index32 n) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ad640481f5aa58f0a441d079c0b0db242',1,'openvdb::v3_2_0::util::NodeMask::isOn() const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a8a125384c2ac1b1ac00df0e0c0c4a6ee',1,'openvdb::v3_2_0::util::NodeMask< 1 >::isOn(Index32 n) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ad640481f5aa58f0a441d079c0b0db242',1,'openvdb::v3_2_0::util::NodeMask< 1 >::isOn() const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a8a125384c2ac1b1ac00df0e0c0c4a6ee',1,'openvdb::v3_2_0::util::NodeMask< 2 >::isOn(Index32 n) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ad640481f5aa58f0a441d079c0b0db242',1,'openvdb::v3_2_0::util::NodeMask< 2 >::isOn() const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a536d8b61dd7136c3eb44735ade334ac6',1,'openvdb::v3_2_0::util::RootNodeMask::isOn(Index32 i) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#ad640481f5aa58f0a441d079c0b0db242',1,'openvdb::v3_2_0::util::RootNodeMask::isOn() const ']]], + ['isopen',['isOpen',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a3c7351cec1380d07f9e4b3ec96b2b1ff',1,'openvdb::v3_2_0::io::File']]], + ['isoutofcore',['isOutOfCore',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#abefaa5655732590505cca9bb58b58842',1,'openvdb::v3_2_0::tree::LeafNode::Buffer']]], + ['ispartiallyfull',['isPartiallyFull',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a080904baf0bde768ef4d5f6a97daa507',1,'openvdb::v3_2_0::util::PagedArray']]], + ['isplanarquad',['isPlanarQuad',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a149975eccdfed56994cdc459276b6e58',1,'openvdb::v3_2_0::tools::internal']]], + ['isregistered',['isRegistered',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a87b07a96aff6b51f81237f15c9c2f921',1,'openvdb::v3_2_0::GridBase::isRegistered()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a96d1172922578d7533775faaf26992e7',1,'openvdb::v3_2_0::Grid::isRegistered()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapRegistry.html#a429a2a674329831c558db941e742cf10',1,'openvdb::v3_2_0::math::MapRegistry::isRegistered()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a96d1172922578d7533775faaf26992e7',1,'openvdb::v3_2_0::math::AffineMap::isRegistered()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a96d1172922578d7533775faaf26992e7',1,'openvdb::v3_2_0::math::ScaleMap::isRegistered()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#a96d1172922578d7533775faaf26992e7',1,'openvdb::v3_2_0::math::UniformScaleMap::isRegistered()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a96d1172922578d7533775faaf26992e7',1,'openvdb::v3_2_0::math::TranslationMap::isRegistered()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a96d1172922578d7533775faaf26992e7',1,'openvdb::v3_2_0::math::ScaleTranslateMap::isRegistered()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#a96d1172922578d7533775faaf26992e7',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::isRegistered()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a96d1172922578d7533775faaf26992e7',1,'openvdb::v3_2_0::math::UnitaryMap::isRegistered()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a96d1172922578d7533775faaf26992e7',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::isRegistered()']]], + ['isregisteredtype',['isRegisteredType',['../classopenvdb_1_1v3__2__0_1_1Metadata.html#aa9b76271b1a77807fa6910d6bbe7c467',1,'openvdb::v3_2_0::Metadata::isRegisteredType()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a98d16165e02b990e1505f9bdc4d822a5',1,'openvdb::v3_2_0::TypedMetadata::isRegisteredType()']]], + ['isrelorapproxequal',['isRelOrApproxEqual',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aac702111dfbe1f87ef14cb592d7004bc',1,'openvdb::v3_2_0::math::isRelOrApproxEqual(const Type &a, const Type &b, const Type &absTol, const Type &relTol)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af40c1962dde6bf8d4f40710c94da48e1',1,'openvdb::v3_2_0::math::isRelOrApproxEqual(const bool &a, const bool &b, const bool &, const bool &)']]], + ['issafe',['isSafe',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html#af069e2e79372f93966b8cdaf405e7e9c',1,'openvdb::v3_2_0::tree::ValueAccessorBase']]], + ['issample',['isSample',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#aaf598a06b57acc909b76d0b0b7432abc',1,'openvdb::v3_2_0::tools::GridSampler::isSample(const Coord &ijk) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#a03ebf0d69329adf5a3bb2ec9a978538f',1,'openvdb::v3_2_0::tools::GridSampler::isSample(const Vec3d &ispoint) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html#aaf598a06b57acc909b76d0b0b7432abc',1,'openvdb::v3_2_0::tools::GridSampler< tree::ValueAccessor< TreeT >, SamplerType >::isSample(const Coord &ijk) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html#a03ebf0d69329adf5a3bb2ec9a978538f',1,'openvdb::v3_2_0::tools::GridSampler< tree::ValueAccessor< TreeT >, SamplerType >::isSample(const Vec3d &ispoint) const ']]], + ['isscale',['isScale',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a47f394d6a693e1769264460f4468593d',1,'openvdb::v3_2_0::math::AffineMap']]], + ['isscaletranslate',['isScaleTranslate',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#aeccff53220ba5d95e0a01083cae6e0b9',1,'openvdb::v3_2_0::math::AffineMap']]], + ['issorted',['isSorted',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#ada8ccbfae8ad9120b791b43000fc6dda',1,'openvdb::v3_2_0::math::BBox']]], + ['issymmetric',['isSymmetric',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#abc32aef619a8ff1816e64b23d1c33144',1,'openvdb::v3_2_0::math']]], + ['istilevalue',['isTileValue',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#ac8ef1156136b48723a2a603dd67f3efc',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase']]], + ['istype',['isType',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#aa6af20b4807e0ff1021f08015a0c8779',1,'openvdb::v3_2_0::GridBase::isType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#aa6af20b4807e0ff1021f08015a0c8779',1,'openvdb::v3_2_0::math::MapBase::isType()']]], + ['isulpsequal',['isUlpsEqual',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#abab55bb6f066abbfcc41ef7c432d8d9f',1,'openvdb::v3_2_0::math::isUlpsEqual(const double aLeft, const double aRight, const int64_t aUnitsInLastPlace)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab5d7a8df78e36d7baf4f2cf35eb236ec',1,'openvdb::v3_2_0::math::isUlpsEqual(const float aLeft, const float aRight, const int32_t aUnitsInLastPlace)']]], + ['isunitary',['isUnitary',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1e567cf5c693a81ef5d5d430d0922d49',1,'openvdb::v3_2_0::math']]], + ['isvalid',['isValid',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Preconditioner.html#a2bbcf8a73ebf3b9b327b0b646e9dd053',1,'openvdb::v3_2_0::math::pcg::Preconditioner::isValid()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#a2bbcf8a73ebf3b9b327b0b646e9dd053',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner::isValid()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#aac1b70a2ed67ead038c4d3f5ac4d8a81',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::isValid()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#aac1b70a2ed67ead038c4d3f5ac4d8a81',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::isValid()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#aac1b70a2ed67ead038c4d3f5ac4d8a81',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::isValid()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#aac1b70a2ed67ead038c4d3f5ac4d8a81',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::isValid()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#aac1b70a2ed67ead038c4d3f5ac4d8a81',1,'openvdb::v3_2_0::util::PagedArray::Iterator::isValid()']]], + ['isvalidpartition',['isValidPartition',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#af2c25ce7b65fe2e22209dce0b5eae646',1,'openvdb::v3_2_0::tools']]], + ['isvaluemaskoff',['isValueMaskOff',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aa9feb5633222e4f2d32db3d74a7c7d3f',1,'openvdb::v3_2_0::tree::InternalNode::isValueMaskOff(Index n) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a0cc5de204db737b967e9e6a298ab7ef7',1,'openvdb::v3_2_0::tree::InternalNode::isValueMaskOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aa9feb5633222e4f2d32db3d74a7c7d3f',1,'openvdb::v3_2_0::tree::LeafNode::isValueMaskOff(Index n) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a0cc5de204db737b967e9e6a298ab7ef7',1,'openvdb::v3_2_0::tree::LeafNode::isValueMaskOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aa9feb5633222e4f2d32db3d74a7c7d3f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isValueMaskOff(Index n) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a0cc5de204db737b967e9e6a298ab7ef7',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isValueMaskOff() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aa9feb5633222e4f2d32db3d74a7c7d3f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isValueMaskOff(Index n) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a0cc5de204db737b967e9e6a298ab7ef7',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isValueMaskOff() const ']]], + ['isvaluemaskon',['isValueMaskOn',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a5f3eea16a51e9b1e79b091f3d79b2ef1',1,'openvdb::v3_2_0::tree::InternalNode::isValueMaskOn(Index n) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a5fb6db2f511bcdf54777e2402dc59dad',1,'openvdb::v3_2_0::tree::InternalNode::isValueMaskOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a5f3eea16a51e9b1e79b091f3d79b2ef1',1,'openvdb::v3_2_0::tree::LeafNode::isValueMaskOn(Index n) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a5fb6db2f511bcdf54777e2402dc59dad',1,'openvdb::v3_2_0::tree::LeafNode::isValueMaskOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a5f3eea16a51e9b1e79b091f3d79b2ef1',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isValueMaskOn(Index n) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a5fb6db2f511bcdf54777e2402dc59dad',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isValueMaskOn() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a5f3eea16a51e9b1e79b091f3d79b2ef1',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isValueMaskOn(Index n) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a5fb6db2f511bcdf54777e2402dc59dad',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isValueMaskOn() const ']]], + ['isvalueoff',['isValueOff',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a168febad09b98d06f2ca7df00c7f9d5a',1,'openvdb::v3_2_0::tree::Tree']]], + ['isvalueon',['isValueOn',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#afc695b4cc2c115afbdb51d4997b69747',1,'openvdb::v3_2_0::tree::InternalNode::isValueOn(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ab471165041eb1c9de3c9beb14d1ca7b7',1,'openvdb::v3_2_0::tree::InternalNode::isValueOn(Index offset) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#a8c51d47261098e99edc61d511eaddaa1',1,'openvdb::v3_2_0::tree::IteratorBase::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#afc695b4cc2c115afbdb51d4997b69747',1,'openvdb::v3_2_0::tree::LeafNode::isValueOn(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ab471165041eb1c9de3c9beb14d1ca7b7',1,'openvdb::v3_2_0::tree::LeafNode::isValueOn(Index offset) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#afc695b4cc2c115afbdb51d4997b69747',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isValueOn(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ab471165041eb1c9de3c9beb14d1ca7b7',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isValueOn(Index offset) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#afc695b4cc2c115afbdb51d4997b69747',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isValueOn(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ab471165041eb1c9de3c9beb14d1ca7b7',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isValueOn(Index offset) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#afc695b4cc2c115afbdb51d4997b69747',1,'openvdb::v3_2_0::tree::RootNode::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#afc695b4cc2c115afbdb51d4997b69747',1,'openvdb::v3_2_0::tree::Tree::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#ae39edfdc8a8f8012578234f6cd8166d8',1,'openvdb::v3_2_0::tree::IterListItem::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#ae39edfdc8a8f8012578234f6cd8166d8',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#ae39edfdc8a8f8012578234f6cd8166d8',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a8c51d47261098e99edc61d511eaddaa1',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#afc695b4cc2c115afbdb51d4997b69747',1,'openvdb::v3_2_0::tree::ValueAccessor::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#ab536a309cecef1f3940c7cffcdb17326',1,'openvdb::v3_2_0::tree::CacheItem::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#ab536a309cecef1f3940c7cffcdb17326',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#afc695b4cc2c115afbdb51d4997b69747',1,'openvdb::v3_2_0::tree::ValueAccessor0::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#afc695b4cc2c115afbdb51d4997b69747',1,'openvdb::v3_2_0::tree::ValueAccessor1::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#afc695b4cc2c115afbdb51d4997b69747',1,'openvdb::v3_2_0::tree::ValueAccessor2::isValueOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#afc695b4cc2c115afbdb51d4997b69747',1,'openvdb::v3_2_0::tree::ValueAccessor3::isValueOn()']]], + ['isvalueonandcache',['isValueOnAndCache',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a7b19bb2b11319fb6eaab50aada9bff01',1,'openvdb::v3_2_0::tree::InternalNode::isValueOnAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a7b19bb2b11319fb6eaab50aada9bff01',1,'openvdb::v3_2_0::tree::LeafNode::isValueOnAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a7b19bb2b11319fb6eaab50aada9bff01',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::isValueOnAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a7b19bb2b11319fb6eaab50aada9bff01',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::isValueOnAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a7b19bb2b11319fb6eaab50aada9bff01',1,'openvdb::v3_2_0::tree::RootNode::isValueOnAndCache()']]], + ['isvoxel',['isVoxel',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#aeb46a66709addd0a7820262a83e3f7e7',1,'openvdb::v3_2_0::tree::ValueAccessor::isVoxel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#af01b2774d580fed727a71c476a8677e2',1,'openvdb::v3_2_0::tree::CacheItem::isVoxel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#af01b2774d580fed727a71c476a8677e2',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::isVoxel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#aeb46a66709addd0a7820262a83e3f7e7',1,'openvdb::v3_2_0::tree::ValueAccessor0::isVoxel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#aeb46a66709addd0a7820262a83e3f7e7',1,'openvdb::v3_2_0::tree::ValueAccessor1::isVoxel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#aeb46a66709addd0a7820262a83e3f7e7',1,'openvdb::v3_2_0::tree::ValueAccessor2::isVoxel()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#aeb46a66709addd0a7820262a83e3f7e7',1,'openvdb::v3_2_0::tree::ValueAccessor3::isVoxel()']]], + ['isvoxelvalue',['isVoxelValue',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#ab9c194ebbea479df6907dda14823edee',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase']]], + ['iszero',['isZero',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a839d3b1e54b3c25346595bd7eabe72a0',1,'openvdb::v3_2_0::math::isZero(const Type &x)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a6633e6a79ed15b8832c02fabca54a47f',1,'openvdb::v3_2_0::math::isZero(const Vec2< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9ae2e4b285657d57dd210bffbc3614e9',1,'openvdb::v3_2_0::math::isZero(const Vec3< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a5125aea203eb95a7cf3c0b1b8edbb706',1,'openvdb::v3_2_0::math::isZero(const Vec4< T > &v)']]], + ['iterator',['iterator',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorRange.html#a4ff2fe797a9bf5ecbd4099f6fbcd8577',1,'openvdb::v3_2_0::tree::IteratorRange::iterator()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox_1_1Iterator.html#aff5f87db967ff20c3259a7cf9e484733',1,'openvdb::v3_2_0::math::CoordBBox::Iterator::Iterator()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#af6a6a0332109d52244feb43fc41df1c9',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::Iterator()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#a6d9661a3e2f3c9a1c20578e10980e127',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::Iterator()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#aa904dffcf0d3902944b35804ee9e226e',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::Iterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a1f703720e1f5d97a0386c2dfe803c763',1,'openvdb::v3_2_0::util::PagedArray::Iterator::Iterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a32ce35312e15ceddd7c5279457cb5cc0',1,'openvdb::v3_2_0::util::PagedArray::Iterator::Iterator(PagedArray &parent, size_t pos=0)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a2b76c2e597bc9393f2b99e869e4fa8d2',1,'openvdb::v3_2_0::util::PagedArray::Iterator::Iterator(const Iterator &other)']]], + ['iteratorbase',['IteratorBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#aa7feb0a022677d9dcb44c5c220db40b6',1,'openvdb::v3_2_0::tree::IteratorBase::IteratorBase()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#ad27dff84071fd8169e5aede08a5f82c8',1,'openvdb::v3_2_0::tree::IteratorBase::IteratorBase(const MaskIterT &iter, NodeT *parent)']]], + ['iteratorrange',['IteratorRange',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorRange.html#a2e175e3f2470f07e680f4425be179a78',1,'openvdb::v3_2_0::tree::IteratorRange::IteratorRange(const IterT &iter, size_t grainSize=8)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorRange.html#aecb920bf1f1dfb371b6a4eb10df59cba',1,'openvdb::v3_2_0::tree::IteratorRange::IteratorRange(IteratorRange &other, tbb::split)']]], + ['iterlistitem',['IterListItem',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a195b86eb2a3358a5a26900eba1d7e7fa',1,'openvdb::v3_2_0::tree::IterListItem::IterListItem(PrevItemT *prev)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#af0d4f849017fd98c28f56ea3c11a9a95',1,'openvdb::v3_2_0::tree::IterListItem::IterListItem(const IterListItem &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#ac02cb89cd65c78e4a788dd2c47ceb6b1',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::IterListItem(PrevItemT *)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#af0d4f849017fd98c28f56ea3c11a9a95',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::IterListItem(const IterListItem &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a195b86eb2a3358a5a26900eba1d7e7fa',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::IterListItem(PrevItemT *prev)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#af0d4f849017fd98c28f56ea3c11a9a95',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::IterListItem(const IterListItem &other)']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_9.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_9.html new file mode 100644 index 00000000..e32df637 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_9.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_9.js new file mode 100644 index 00000000..61d00dbf --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_9.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['jacobipreconditioner',['JacobiPreconditioner',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1JacobiPreconditioner.html#ae2a3d9ed0d1de9899a0a545134dbe193',1,'openvdb::v3_2_0::math::pcg::JacobiPreconditioner']]], + ['join',['join',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1InfNormOp.html#a52f05d1403fc389584717ea45d306bbe',1,'openvdb::v3_2_0::math::pcg::Vector::InfNormOp::join()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1IsFiniteOp.html#af65b15971c4dce065c0819384986eb6a',1,'openvdb::v3_2_0::math::pcg::Vector::IsFiniteOp::join()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1IsFiniteOp.html#af65b15971c4dce065c0819384986eb6a',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::IsFiniteOp::join()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#abe99df4d5d1eb708dccd462f8b9e5be9',1,'openvdb::v3_2_0::math::Extrema::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1CopyLeafNodes.html#a44eca6edf9fca71236baca07d5369163',1,'openvdb::v3_2_0::tools::clip_internal::CopyLeafNodes::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#aeab5734b22d66df2980d9d9d965653e4',1,'openvdb::v3_2_0::tools::SparseExtractor::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#a2d4968d46b42fdb9df79916e226039b0',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveVoxelValues.html#a40b5d9c6a665adb2d9c64beef21a9bba',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveVoxelValues::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveTileValues.html#ae410b066b7160158bb3c4b5304a79b24',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveTileValues::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__fracture__internal_1_1FindMinMaxVoxelValue.html#ac2717cf4b6fb638cb096ac0ab7623683',1,'openvdb::v3_2_0::tools::level_set_fracture_internal::FindMinMaxVoxelValue::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1PopulateTree.html#a68059aa640c85e3ac44f172afe3beb45',1,'openvdb::v3_2_0::tools::level_set_util_internal::PopulateTree::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinVoxelValue.html#a3d47cdaed2e6e0754c31593ac09239da',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinVoxelValue::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinTileValue.html#aea965f9d7ea7eca008813733b976c7c8',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinTileValue::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskIsovalueCrossingVoxels.html#a42a9c54dc73ef6e130c75cb76e27e166',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskIsovalueCrossingVoxels::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskSegmentGroup.html#a80832c70070fa284d84cdd70cb201830',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskSegmentGroup::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandLeafNodeRegion.html#a9406776de2d6c7fe031bc7e84755c911',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandLeafNodeRegion::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ConstructVoxelMask.html#ab03af36a6bcc1c2ef6c9e5caaf00346f',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ConstructVoxelMask::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#adfce595f2247dfd250e05765d2f34362',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1GenEdgeData.html#a600b3eb10cbe0366c77d6074eb286c77',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::GenEdgeData::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1ComputeExtremas.html#a926aa20fa1fe962bcd7ccfa2551f2a1b',1,'openvdb::v3_2_0::tools::particle_atlas_internal::ComputeExtremas::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid_1_1ReducePool.html#acf2ac694fbf57fa9e94b1854ea7dbc44',1,'openvdb::v3_2_0::tools::PointMaskGrid::ReducePool::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1StatsOp.html#a702bb5b14d59f48a7fb8b3be54e11311',1,'openvdb::v3_2_0::tools::stats_internal::StatsOp::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1HistOp.html#ae4a60dbe71726d3c80f3f00b27148b97',1,'openvdb::v3_2_0::tools::stats_internal::HistOp::join()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1MathOp.html#ae3438324d8e9f9c2608539a1317ef11b',1,'openvdb::v3_2_0::tools::stats_internal::MathOp::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpTransformer.html#aa48f481e466259efce754981f15afba0',1,'openvdb::v3_2_0::tools::valxform::SharedOpTransformer::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpTransformer.html#a5dbd630151a598de060057be94e8faac',1,'openvdb::v3_2_0::tools::valxform::CopyableOpTransformer::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1OpAccumulator.html#a6cd9c489ebbfc9f821eafd0d2243ce7b',1,'openvdb::v3_2_0::tools::valxform::OpAccumulator::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#a442e33f1adeb9dd30b07bf77a29819ae',1,'openvdb::v3_2_0::tools::internal::SignData::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartGen.html#a3c0adc25fa05ba8a5352e19a31708ef8',1,'openvdb::v3_2_0::tools::internal::PartGen::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenSeamMask.html#a94f0f50751eef7504cc80cf3009de1e4',1,'openvdb::v3_2_0::tools::internal::GenSeamMask::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTopologyMask.html#a752d8363b9d2ff4808a0cfb055bd2c3d',1,'openvdb::v3_2_0::tools::internal::GenTopologyMask::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenBoundaryMask.html#ac58f19fd1bf190cb276b750391e6744e',1,'openvdb::v3_2_0::tools::internal::GenBoundaryMask::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTileMask.html#a7879bc2668e446c73277cc7c453da3c3',1,'openvdb::v3_2_0::tools::internal::GenTileMask::join()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UpdatePoints.html#adfb81a510ba902cb43c549de42435ec8',1,'openvdb::v3_2_0::tools::internal::UpdatePoints::join()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_a.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_a.html new file mode 100644 index 00000000..1ae07c72 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_a.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_a.js new file mode 100644 index 00000000..4ca63632 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['keyerror',['KeyError',['../classopenvdb_1_1v3__2__0_1_1KeyError.html#a4b7e7a659a543534d1282829390d270b',1,'openvdb::v3_2_0::KeyError::KeyError()'],['../classopenvdb_1_1v3__2__0_1_1KeyError.html#a3cf2c8b18c59d95c64103f39c07e67cb',1,'openvdb::v3_2_0::KeyError::KeyError(const std::string &msg)']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_b.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_b.html new file mode 100644 index 00000000..6848eb58 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_b.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_b.js new file mode 100644 index 00000000..aa2f0549 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_b.js @@ -0,0 +1,52 @@ +var searchData= +[ + ['l2norm',['l2Norm',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#aee93a17ba455860f3ab55af4c14258bd',1,'openvdb::v3_2_0::math::pcg::Vector']]], + ['labelboundaryvoxels',['LabelBoundaryVoxels',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1LabelBoundaryVoxels.html#adc0b5dedb8b7bae8837a24ec75d7edf3',1,'openvdb::v3_2_0::tools::level_set_util_internal::LabelBoundaryVoxels']]], + ['laplacian',['Laplacian',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian.html#a5c40c64a051b85ea779f903509bd5f98',1,'openvdb::v3_2_0::tools::Laplacian::Laplacian(const GridT &grid, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian.html#a24007e200d7c3b056c8ebd6457b9582a',1,'openvdb::v3_2_0::tools::Laplacian::Laplacian(const GridT &grid, const MaskGridType &mask, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#ae4bbbae6c115ebb610b963b01c50b03a',1,'openvdb::v3_2_0::math::GradStencil::laplacian()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html#ae4bbbae6c115ebb610b963b01c50b03a',1,'openvdb::v3_2_0::math::WenoStencil::laplacian()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CurvatureStencil.html#ae4bbbae6c115ebb610b963b01c50b03a',1,'openvdb::v3_2_0::math::CurvatureStencil::laplacian()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#ad2bb531334a573ac7447d9b8ae0987bb',1,'openvdb::v3_2_0::tools::LevelSetFilter::laplacian()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#af55f3361b55d27809c1da5bf33db393a',1,'openvdb::v3_2_0::tools::laplacian(const GridType &grid, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a2c8b10bc1b3daa909a50c4b1a68c1c79',1,'openvdb::v3_2_0::tools::laplacian(const GridType &grid, const MaskT &mask, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aea45d3e6bb340ccefaff8666b617ce1e',1,'openvdb::v3_2_0::tools::laplacian(const GridType &grid, bool threaded=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a731b2b621da3da70164a138d5b15d06c',1,'openvdb::v3_2_0::tools::laplacian(const GridType &grid, const MaskT mask, bool threaded=true)']]], + ['leaf',['leaf',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a7a21299f2b9561affcdac1956dd9e37b',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['leafbs',['LeafBS',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1LeafBS.html#a9d16052c15e10c367c985c9a2766e7cf',1,'openvdb::v3_2_0::tools::internal::LeafBS']]], + ['leafcache',['LeafCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#a04ec5ce13c4e24465c221b3cdc5b409b',1,'openvdb::v3_2_0::tools::Morphology::LeafCache']]], + ['leafcount',['leafCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a0667d468064aa044670a06a84b9c48ed',1,'openvdb::v3_2_0::tree::InternalNode::leafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a412b718c7c8ef03f8439e4882eeea860',1,'openvdb::v3_2_0::tree::LeafManager::leafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#adcd302bc7002e4c827f23306869d9158',1,'openvdb::v3_2_0::tree::LeafNode::leafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#adcd302bc7002e4c827f23306869d9158',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::leafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#adcd302bc7002e4c827f23306869d9158',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::leafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a0667d468064aa044670a06a84b9c48ed',1,'openvdb::v3_2_0::tree::RootNode::leafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a7f3ef6cf016b0fbc3473d3dee3813bf8',1,'openvdb::v3_2_0::tree::TreeBase::leafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a5471710f3f6ebe42e5fcb6e528d2d804',1,'openvdb::v3_2_0::tree::Tree::leafCount()']]], + ['leafcountop',['LeafCountOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1LeafCountOp.html#aa6d587987d3176deed475660d109f491',1,'openvdb::v3_2_0::tools::poisson::internal::LeafCountOp']]], + ['leafindexop',['LeafIndexOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1LeafIndexOp.html#a30da718e67cd34848fd46e23247a0903',1,'openvdb::v3_2_0::tools::poisson::internal::LeafIndexOp']]], + ['leafiteratorbase',['LeafIteratorBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#a4bcdf5c59c44906065aa685087ea4e86',1,'openvdb::v3_2_0::tree::LeafIteratorBase::LeafIteratorBase()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#abd2fbc561143901e9f9fae2e98d008b4',1,'openvdb::v3_2_0::tree::LeafIteratorBase::LeafIteratorBase(TreeT &tree)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#a60d50dd2049b3b43f9db7d14f5a316e2',1,'openvdb::v3_2_0::tree::LeafIteratorBase::LeafIteratorBase(const LeafIteratorBase &other)']]], + ['leafmanager',['LeafManager',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a6bad6c4b86a2ec52ce35cbd5519cfa45',1,'openvdb::v3_2_0::tree::LeafManager::LeafManager(TreeType &tree, size_t auxBuffersPerLeaf=0, bool serial=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a80195dcd80d3614f522176fb87464046',1,'openvdb::v3_2_0::tree::LeafManager::LeafManager(TreeType &tree, LeafType **begin, LeafType **end, size_t auxBuffersPerLeaf=0, bool serial=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a4564928988bed112c6e4a9db516ef2dd',1,'openvdb::v3_2_0::tree::LeafManager::LeafManager(const LeafManager &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange.html#a07a10fba4f01331e376881d8ba744364',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::leafManager()']]], + ['leafnode',['LeafNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a0f75bca74f67c041259a8a04d71ff3fd',1,'openvdb::v3_2_0::tree::LeafNode::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#af30d6bad3d4dedcd924a063b498af624',1,'openvdb::v3_2_0::tree::LeafNode::LeafNode(const Coord &coords, const ValueType &value=zeroVal< ValueType >(), bool active=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a6d0a7198255f5dd33d16679d8003098d',1,'openvdb::v3_2_0::tree::LeafNode::LeafNode(PartialCreate, const Coord &coords, const ValueType &value=zeroVal< ValueType >(), bool active=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a23a333c67622c60bbec5d08f16387c06',1,'openvdb::v3_2_0::tree::LeafNode::LeafNode(const LeafNode &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#afe89df18cceff54e3bd31e0c4003b96e',1,'openvdb::v3_2_0::tree::LeafNode::LeafNode(const LeafNode< OtherValueType, Log2Dim > &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aa610154b5e8a5f70b37b612d88919f6d',1,'openvdb::v3_2_0::tree::LeafNode::LeafNode(const LeafNode< OtherValueType, Log2Dim > &other, const ValueType &offValue, const ValueType &onValue, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#afd8db9afd141aebea06ac54ee0d072bb',1,'openvdb::v3_2_0::tree::LeafNode::LeafNode(const LeafNode< OtherValueType, Log2Dim > &other, const ValueType &background, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a0f75bca74f67c041259a8a04d71ff3fd',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ab815c7bf726b5cc537b50dd1fd0d4aeb',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode(const Coord &xyz, bool value=false, bool active=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aa796a4508fc6047a117a846b0279fcbd',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode(PartialCreate, const Coord &xyz, bool value=false, bool active=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a23a333c67622c60bbec5d08f16387c06',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode(const LeafNode &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#afe89df18cceff54e3bd31e0c4003b96e',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode(const LeafNode< OtherValueType, Log2Dim > &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#abbffb1af29b2fa62232a0ba25467e62f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode(const LeafNode< ValueType, Log2Dim > &other, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a306e14ace40f93828e91ccba4a5dcfcb',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode(const LeafNode< ValueType, Log2Dim > &other, bool offValue, bool onValue, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a88f477f966059bb18bbe808ec0d8df1b',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode(const LeafNode< ValueType, Log2Dim > &other, bool background, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a0f75bca74f67c041259a8a04d71ff3fd',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a970e806cd1bb10143f9fa0b10f16577d',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode(const Coord &xyz, bool value=false, bool dummy=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a7b16ac983038dcbe4febae6fa968a738',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode(PartialCreate, const Coord &xyz, bool value=false, bool dummy=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a23a333c67622c60bbec5d08f16387c06',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode(const LeafNode &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#afe89df18cceff54e3bd31e0c4003b96e',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode(const LeafNode< OtherValueType, Log2Dim > &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#abbffb1af29b2fa62232a0ba25467e62f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode(const LeafNode< ValueType, Log2Dim > &other, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a306e14ace40f93828e91ccba4a5dcfcb',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode(const LeafNode< ValueType, Log2Dim > &other, bool offValue, bool onValue, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a88f477f966059bb18bbe808ec0d8df1b',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode(const LeafNode< ValueType, Log2Dim > &other, bool background, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a475e3a9da2bcfdcf4479597b2280c274',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode(const LeafNode< ValueT, Log2Dim > &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a2a1c206648706e190dce1b98884f1b52',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode(const LeafNode< ValueT, Log2Dim > &other, bool background, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8da43f433f3e9d9a0a4314d0416e6a0b',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode(const LeafNode< ValueT, Log2Dim > &other, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ab4280a66b7e44f66270f2279b6e64071',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode(const LeafNode< ValueT, Log2Dim > &other, bool offValue, bool onValue, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a475e3a9da2bcfdcf4479597b2280c274',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode(const LeafNode< ValueT, Log2Dim > &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aec2668b6a857032ce0107be14449ed53',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode(const LeafNode< ValueT, Log2Dim > &other, bool, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8da43f433f3e9d9a0a4314d0416e6a0b',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode(const LeafNode< ValueT, Log2Dim > &other, TopologyCopy)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ab4280a66b7e44f66270f2279b6e64071',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode(const LeafNode< ValueT, Log2Dim > &other, bool offValue, bool onValue, TopologyCopy)']]], + ['leafnodeconnectivitytable',['LeafNodeConnectivityTable',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html#a6f553e28abba571691043eb1cd291eff',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::LeafNodeConnectivityTable']]], + ['leafnodeoriginop',['LeafNodeOriginOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1LeafNodeOriginOp.html#a925f2b1df1e7816aa18c5159842cfdf7',1,'openvdb::v3_2_0::tools::point_partitioner_internal::LeafNodeOriginOp']]], + ['leafrange',['leafRange',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#ab53d69fe0d3e0ff147d8bbb6c63c5ebf',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::leafRange()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a9e36974eedb5516344a08fd19d6d1782',1,'openvdb::v3_2_0::tree::LeafManager::leafRange()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange.html#a08cbef04afd2cc6bf739c836b99d5f18',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::LeafRange(size_t begin, size_t end, const LeafManager &leafManager, size_t grainSize=1)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange.html#a6cd26f4af69c8e80a67726cd34e0a818',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::LeafRange(LeafRange &r, tbb::split)']]], + ['leafs',['leafs',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#ab94d27ce2d49e400a41c37854b865c00',1,'openvdb::v3_2_0::tools::LevelSetTracker::leafs()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#ae00315098d8626e03706c33b6bc53e9b',1,'openvdb::v3_2_0::tools::LevelSetTracker::leafs() const ']]], + ['leaftopologydifference',['leafTopologyDifference',['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a1057cf902b65b940bdbfb52d792a9521',1,'openvdb::v3_2_0::util']]], + ['leaftopologydiffop',['LeafTopologyDiffOp',['../classopenvdb_1_1v3__2__0_1_1util_1_1LeafTopologyDiffOp.html#a2b5d235489ff8f798fef32fc8b9817e4',1,'openvdb::v3_2_0::util::LeafTopologyDiffOp']]], + ['leaftopologyintersection',['leafTopologyIntersection',['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a07b2109a2d53b0005d0911f6c7546f0a',1,'openvdb::v3_2_0::util']]], + ['leaftopologyintop',['LeafTopologyIntOp',['../classopenvdb_1_1v3__2__0_1_1util_1_1LeafTopologyIntOp.html#adaf3195780ce2ac0dcd8e00a11f63c1f',1,'openvdb::v3_2_0::util::LeafTopologyIntOp']]], + ['legacyfrustum',['LegacyFrustum',['../classopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1LegacyFrustum.html#ac3a8750b5733a01c62a535798dac39d0',1,'openvdb::v3_2_0::math::internal::LegacyFrustum']]], + ['length',['length',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ac391672014f7b4faed37018787333e4b',1,'openvdb::v3_2_0::math::Vec2::length()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ac391672014f7b4faed37018787333e4b',1,'openvdb::v3_2_0::math::Vec3::length()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#ac391672014f7b4faed37018787333e4b',1,'openvdb::v3_2_0::math::Vec4::length()']]], + ['lengthsqr',['lengthSqr',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#af4824f2f07e9ed09affc66def9071a53',1,'openvdb::v3_2_0::math::Vec2::lengthSqr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#af4824f2f07e9ed09affc66def9071a53',1,'openvdb::v3_2_0::math::Vec3::lengthSqr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#af4824f2f07e9ed09affc66def9071a53',1,'openvdb::v3_2_0::math::Vec4::lengthSqr()']]], + ['lessthan',['lessThan',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#addad7ee328b61672dc25f78d8949c273',1,'openvdb::v3_2_0::math::Coord']]], + ['levels',['levels',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#a46cd9e53fa2bd4e45f7214c6aee838a6',1,'openvdb::v3_2_0::tools::ParticleAtlas::levels()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#a46cd9e53fa2bd4e45f7214c6aee838a6',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::levels()']]], + ['levelsetadvection',['LevelSetAdvection',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#afa6bc3ff3c017048ea2ff59b407cf6fe',1,'openvdb::v3_2_0::tools::LevelSetAdvection']]], + ['levelsetarea',['levelSetArea',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a87eba7caae7de895111fd539b2ca1a46',1,'openvdb::v3_2_0::tools::levelSetArea(const GridType &grid, bool useWorldSpace=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac438fd72f053cbf1d92d7b9b928ed1a0',1,'openvdb::v3_2_0::tools::levelSetArea(const GridT &grid, bool useWorldSpace)']]], + ['levelsetfilter',['LevelSetFilter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a41a7796f2097e5a555c147c5caff2568',1,'openvdb::v3_2_0::tools::LevelSetFilter']]], + ['levelsetfracture',['LevelSetFracture',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFracture.html#afe3544e840b466f446f4a7a951c1dee8',1,'openvdb::v3_2_0::tools::LevelSetFracture']]], + ['levelsetmeasure',['LevelSetMeasure',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#a5f7a6ac9404851a3b117d9686d3ff142',1,'openvdb::v3_2_0::tools::LevelSetMeasure::LevelSetMeasure(const GridType &grid, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#af949df54493b7b40bda113d82422ee2f',1,'openvdb::v3_2_0::tools::LevelSetMeasure::LevelSetMeasure(ManagerType &leafs, Real Dx, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a47a09d95ea44d64ff1add95331e6c321',1,'openvdb::v3_2_0::tools::levelSetMeasure(const GridType &grid, Real &area, Real &volume, bool useWorldSpace=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a6fbbd9feadc4cc9b74f04a24832cf186',1,'openvdb::v3_2_0::tools::levelSetMeasure(const GridType &grid, Real &area, Real &volume, Real &avgCurvature, bool useWorldSpace=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a1432938ada025b83165332c5c8cd2fb5',1,'openvdb::v3_2_0::tools::levelSetMeasure(const GridT &grid, Real &area, Real &volume, bool useWorldSpace)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8c5d615877d59bea3bc787c6826e0be9',1,'openvdb::v3_2_0::tools::levelSetMeasure(const GridT &grid, Real &area, Real &volume, Real &avgCurvature, bool useWorldSpace)']]], + ['levelsetmorphing',['LevelSetMorphing',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a989ff97a75fb961cc6d27d22e261ed4d',1,'openvdb::v3_2_0::tools::LevelSetMorphing']]], + ['levelsetpruneop',['LevelSetPruneOp',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetPruneOp.html#a48a65b15bab5ed81e3adbb45ee1e59c0',1,'openvdb::v3_2_0::tools::LevelSetPruneOp::LevelSetPruneOp(TreeT &tree)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetPruneOp.html#a291c1f13df2cecce15b4fd92d2d9b968',1,'openvdb::v3_2_0::tools::LevelSetPruneOp::LevelSetPruneOp(TreeT &tree, const ValueT &outside, const ValueT &inside)']]], + ['levelsetrayintersector',['LevelSetRayIntersector',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#a7b255eda4292b07659d37566c18c5280',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector']]], + ['levelsetraytracer',['LevelSetRayTracer',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#a0171885ecf7931e3db21f27c63b2749f',1,'openvdb::v3_2_0::tools::LevelSetRayTracer::LevelSetRayTracer(const GridT &grid, const BaseShader &shader, BaseCamera &camera, size_t pixelSamples=1, unsigned int seed=0)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#ac9fa1eb6f4c0d91203eede8846e916df',1,'openvdb::v3_2_0::tools::LevelSetRayTracer::LevelSetRayTracer(const IntersectorT &inter, const BaseShader &shader, BaseCamera &camera, size_t pixelSamples=1, unsigned int seed=0)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#ad1635962357ce95f7e351a7c327a4012',1,'openvdb::v3_2_0::tools::LevelSetRayTracer::LevelSetRayTracer(const LevelSetRayTracer &other)']]], + ['levelsetrebuild',['levelSetRebuild',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a42ea3c773bf61480206095e14bb62238',1,'openvdb::v3_2_0::tools::levelSetRebuild(const GridType &grid, float isovalue=0, float halfWidth=float(LEVEL_SET_HALF_WIDTH), const math::Transform *xform=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#afe0b765a192f3905ca3beaaa07ca6c57',1,'openvdb::v3_2_0::tools::levelSetRebuild(const GridType &grid, float isovalue, float exBandWidth, float inBandWidth, const math::Transform *xform=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#af3cd54de2cfa1fa33096665d9c973530',1,'openvdb::v3_2_0::tools::levelSetRebuild(const GridType &grid, float isovalue, float exBandWidth, float inBandWidth, const math::Transform *xform=NULL, InterruptT *interrupter=NULL)']]], + ['levelsetsphere',['LevelSetSphere',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetSphere.html#a37f5b602835c76b62aec4bc5748ef8b0',1,'openvdb::v3_2_0::tools::LevelSetSphere']]], + ['levelsettracker',['LevelSetTracker',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#aed83e8642be33d5ecc1c5cf64264308c',1,'openvdb::v3_2_0::tools::LevelSetTracker']]], + ['levelsetvolume',['levelSetVolume',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aa924a0fd965c8581200e4194d77b6d34',1,'openvdb::v3_2_0::tools::levelSetVolume(const GridType &grid, bool useWorldSpace=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ab2748df502ed9dc84dce1cec55eb7aca',1,'openvdb::v3_2_0::tools::levelSetVolume(const GridT &grid, bool useWorldSpace)']]], + ['libraryversion',['libraryVersion',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a6bd641a55d72c9b50f1c27ce665f2d4f',1,'openvdb::v3_2_0::io::Archive::libraryVersion()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a6bd641a55d72c9b50f1c27ce665f2d4f',1,'openvdb::v3_2_0::io::StreamMetadata::libraryVersion()']]], + ['linearop',['LinearOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1LinearOp.html#a63574a8677b0fb1227942cf25f7a22c8',1,'openvdb::v3_2_0::math::pcg::internal::LinearOp']]], + ['linearsearchimpl',['LinearSearchImpl',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#a4f5cf20a21a4e55fab67b29708b3edb2',1,'openvdb::v3_2_0::tools::LinearSearchImpl']]], + ['linfinitynorm',['lInfinityNorm',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af558ce4af158e49ae1472e29a8c77200',1,'openvdb::v3_2_0::math']]], + ['load',['load',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a92cd6b36a1276d2c9affea59253326ed',1,'openvdb::v3_2_0::util::NodeMask::load()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a92cd6b36a1276d2c9affea59253326ed',1,'openvdb::v3_2_0::util::NodeMask< 1 >::load()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a92cd6b36a1276d2c9affea59253326ed',1,'openvdb::v3_2_0::util::NodeMask< 2 >::load()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a92cd6b36a1276d2c9affea59253326ed',1,'openvdb::v3_2_0::util::RootNodeMask::load()']]], + ['log2dim',['log2dim',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a93137277438fecb5b2fcd44a48628f16',1,'openvdb::v3_2_0::tree::LeafNode::log2dim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a93137277438fecb5b2fcd44a48628f16',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::log2dim()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a93137277438fecb5b2fcd44a48628f16',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::log2dim()']]], + ['log2pagesize',['log2PageSize',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a20079d9af0877028f05572c5eda297a4',1,'openvdb::v3_2_0::util::PagedArray']]], + ['lonenorm',['lOneNorm',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4047d655e0a5cb7c4bb21ecc523c118e',1,'openvdb::v3_2_0::math']]], + ['lookat',['lookAt',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#a761695e2b121c7ef033d050662b8abe8',1,'openvdb::v3_2_0::tools::BaseCamera']]], + ['lookuperror',['LookupError',['../classopenvdb_1_1v3__2__0_1_1LookupError.html#ab38b56e6489cfd7e383e27d1e44224ea',1,'openvdb::v3_2_0::LookupError::LookupError()'],['../classopenvdb_1_1v3__2__0_1_1LookupError.html#a9f1ffd090ac1b57279cd24d53fe53688',1,'openvdb::v3_2_0::LookupError::LookupError(const std::string &msg)']]], + ['lowermatrix',['lowerMatrix',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#a1956e0c9fff95ac8e0f7cd642ae9aa7d',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_c.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_c.html new file mode 100644 index 00000000..a0dda656 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_c.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_c.js new file mode 100644 index 00000000..2d57d57d --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_c.js @@ -0,0 +1,85 @@ +var searchData= +[ + ['magnitude',['Magnitude',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude.html#a6befb991df14acf2dd3ed9ccaa44cb82',1,'openvdb::v3_2_0::tools::Magnitude::Magnitude(const InGridType &grid, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude.html#a17e5666324959f0e9830293f55641e25',1,'openvdb::v3_2_0::tools::Magnitude::Magnitude(const InGridType &grid, const MaskGridType &mask, InterruptT *interrupt=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a9370eee6dbb6de354a68a54b9cdd1dba',1,'openvdb::v3_2_0::tools::magnitude(const GridType &grid, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a06fe38fb2a95969530d664ef92f7dcae',1,'openvdb::v3_2_0::tools::magnitude(const GridType &grid, const MaskT &mask, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a0732e019d0efcac7f0eb0df07bfc7f80',1,'openvdb::v3_2_0::tools::magnitude(const GridType &grid, bool threaded=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aa3e37698f657fdc03ad63a36bcb7470d',1,'openvdb::v3_2_0::tools::magnitude(const GridType &grid, const MaskT &mask, bool threaded=true)']]], + ['makechildnodeempty',['makeChildNodeEmpty',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ac20b5f81858f56ea4d5b86106434e8bb',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['map',['map',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#accc63e204c4b118ae654260ab9c0f131',1,'openvdb::v3_2_0::math::Transform::map()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a8a4d2c36dba128229472e08dad1dd923',1,'openvdb::v3_2_0::math::Transform::map() const ']]], + ['mapadapter',['MapAdapter',['../structopenvdb_1_1v3__2__0_1_1math_1_1MapAdapter.html#adbcdd55379d41481bf431b147c91d312',1,'openvdb::v3_2_0::math::MapAdapter']]], + ['mapbase',['MapBase',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#ab6232aa508855677288726b3ce65e992',1,'openvdb::v3_2_0::math::MapBase']]], + ['mappoints',['MapPoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MapPoints.html#a9780efc4a9c5d284be3635b4401afb96',1,'openvdb::v3_2_0::tools::internal::MapPoints']]], + ['maptype',['mapType',['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#aeeed2d8fb3fd153d0310c6094bb9df9b',1,'openvdb::v3_2_0::math::AffineMap::mapType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#aeeed2d8fb3fd153d0310c6094bb9df9b',1,'openvdb::v3_2_0::math::ScaleMap::mapType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#aeeed2d8fb3fd153d0310c6094bb9df9b',1,'openvdb::v3_2_0::math::UniformScaleMap::mapType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#aeeed2d8fb3fd153d0310c6094bb9df9b',1,'openvdb::v3_2_0::math::TranslationMap::mapType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#aeeed2d8fb3fd153d0310c6094bb9df9b',1,'openvdb::v3_2_0::math::ScaleTranslateMap::mapType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#aeeed2d8fb3fd153d0310c6094bb9df9b',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::mapType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#aeeed2d8fb3fd153d0310c6094bb9df9b',1,'openvdb::v3_2_0::math::UnitaryMap::mapType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#aeeed2d8fb3fd153d0310c6094bb9df9b',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::mapType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#aeeed2d8fb3fd153d0310c6094bb9df9b',1,'openvdb::v3_2_0::math::CompoundMap::mapType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#af6d21e5dd5380c8db96b67e6eea75b77',1,'openvdb::v3_2_0::math::Transform::mapType()']]], + ['march',['march',['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA.html#a6949cf445c4a515ab29bdf4272457630',1,'openvdb::v3_2_0::math::VolumeHDDA::march()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA_3_01TreeT_00_01RayT_00_010_01_4.html#a6949cf445c4a515ab29bdf4272457630',1,'openvdb::v3_2_0::math::VolumeHDDA< TreeT, RayT, 0 >::march()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#af4173fb25fc272ff5b3bad7bc8fe4f99',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::march()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a40855a4444963c88dc441cad2b0272fb',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::march(RealType &t0, RealType &t1)']]], + ['mask',['mask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Diagnose.html#a9e1de0351fe582d118efbab5807a9923',1,'openvdb::v3_2_0::tools::Diagnose::mask() const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Diagnose.html#ac6573c43ff7d01bf210531d30bb0455e',1,'openvdb::v3_2_0::tools::Diagnose::mask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#a9e1de0351fe582d118efbab5807a9923',1,'openvdb::v3_2_0::tools::CheckLevelSet::mask() const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#ac6573c43ff7d01bf210531d30bb0455e',1,'openvdb::v3_2_0::tools::CheckLevelSet::mask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#a9e1de0351fe582d118efbab5807a9923',1,'openvdb::v3_2_0::tools::CheckFogVolume::mask() const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#ac6573c43ff7d01bf210531d30bb0455e',1,'openvdb::v3_2_0::tools::CheckFogVolume::mask()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskSegmentGroup.html#a0b6f24e5e832c9fe0777a302933fe02a',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskSegmentGroup::mask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenSeamMask.html#af66f40e0e61b5813b5a779ead13a754b',1,'openvdb::v3_2_0::tools::internal::GenSeamMask::mask()']]], + ['maskedcopy',['MaskedCopy',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskedCopy.html#a536a66d63dc4323caa71fd7fba74d776',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskedCopy']]], + ['maskedges',['MaskEdges',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MaskEdges.html#a818bda525da363feb32200548fd72187',1,'openvdb::v3_2_0::tools::internal::MaskEdges']]], + ['maskinteriortiles',['MaskInteriorTiles',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorTiles.html#ad33c7514f4451699b1d40f5570b59438',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorTiles']]], + ['maskinteriorvoxels',['MaskInteriorVoxels',['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1MaskInteriorVoxels.html#aa1bd96df7db6a59e922cf783c9359970',1,'openvdb::v3_2_0::tools::clip_internal::MaskInteriorVoxels::MaskInteriorVoxels()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorVoxels.html#a16f22b2b2210a6404df172619fe447b8',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorVoxels::MaskInteriorVoxels()']]], + ['maskisovaluecrossingvoxels',['MaskIsovalueCrossingVoxels',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskIsovalueCrossingVoxels.html#ae061a5ae7d21db9cab48a060c007b069',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskIsovalueCrossingVoxels::MaskIsovalueCrossingVoxels(const InputTreeType &inputTree, const std::vector< const InputLeafNodeType * > &inputLeafNodes, BoolTreeType &maskTree, InputValueType iso)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskIsovalueCrossingVoxels.html#ab19802bcd76b85c91664fa892dd38359',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskIsovalueCrossingVoxels::MaskIsovalueCrossingVoxels(MaskIsovalueCrossingVoxels &rhs, tbb::split)']]], + ['maskmanager',['MaskManager',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1MaskManager.html#a042f502ffba8d73b794059ada1590361',1,'openvdb::v3_2_0::tools::Morphology::MaskManager']]], + ['masknodeinternalneighbours',['maskNodeInternalNeighbours',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal.html#aa6760de6a30b8d1960df4dbecb5ada62',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal']]], + ['maskop',['MaskOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1MaskOp.html#a338cfdcbd49056edffdbc6f6826b23a8',1,'openvdb::v3_2_0::tools::MultiResGrid::MaskOp']]], + ['masksegmentgroup',['MaskSegmentGroup',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskSegmentGroup.html#ac8c5b7253cdbb9a795d3f299b622547e',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskSegmentGroup::MaskSegmentGroup(const std::vector< NodeMaskSegmentType * > &segments)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskSegmentGroup.html#af510f5955b6275c34354cc6e8e324048',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskSegmentGroup::MaskSegmentGroup(const MaskSegmentGroup &rhs, tbb::split)']]], + ['masktolevelset',['maskToLevelSet',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aaff643eb2f73725a0cae51bdafc096cc',1,'openvdb::v3_2_0::tools::maskToLevelSet(const GridT &grid, int halfWidth=3, int dilation=1, int erosion=1, InterrupterT *interrupt=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a3fc47cfad2977fb76aefaa4e27466482',1,'openvdb::v3_2_0::tools::maskToLevelSet(const GridT &grid, int halfWidth=3, int dilation=1, int erosion=1)']]], + ['mat',['Mat',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#a13e4639b574685e1d9162ed953e607ed',1,'openvdb::v3_2_0::math::Mat::Mat()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#acb2334fc4b0ad4732e6ff82339829aff',1,'openvdb::v3_2_0::math::Mat::Mat(Mat const &src)']]], + ['mat3',['Mat3',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a0cdfb3756d0a42ef5b982d3edcba2849',1,'openvdb::v3_2_0::math::Mat3::Mat3()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a4f3c62a07134932141ca7b232cbebedf',1,'openvdb::v3_2_0::math::Mat3::Mat3(const Quat< T > &q)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a388ae0eae0c195dfa49243f8ec887380',1,'openvdb::v3_2_0::math::Mat3::Mat3(Source a, Source b, Source c, Source d, Source e, Source f, Source g, Source h, Source i)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#af5c6e52f518ee1b0a32ca326be232a45',1,'openvdb::v3_2_0::math::Mat3::Mat3(const Vec3< Source > &v1, const Vec3< Source > &v2, const Vec3< Source > &v3, bool rows=true)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a05da645433d2aa5a093b9bd83bff462c',1,'openvdb::v3_2_0::math::Mat3::Mat3(Source *a)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a4153835232b2b5ec21e6bc47f310b795',1,'openvdb::v3_2_0::math::Mat3::Mat3(const Mat< 3, T > &m)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a3f290b7cc60dc850211e9998f591a61d',1,'openvdb::v3_2_0::math::Mat3::Mat3(const Mat3< Source > &m)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a09019555d02c7e94c1c871d1b05c2ec9',1,'openvdb::v3_2_0::math::Mat3::Mat3(const Mat4< T > &m)']]], + ['mat4',['Mat4',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a582edf2e4e6ed40c4cea7d0fec9a252f',1,'openvdb::v3_2_0::math::Mat4::Mat4()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#ab225ef444ee1962bc0abfafb9b8dfb5b',1,'openvdb::v3_2_0::math::Mat4::Mat4(Source *a)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#abec46d0f9d9083cccab32bbe61e8ce2a',1,'openvdb::v3_2_0::math::Mat4::Mat4(Source a, Source b, Source c, Source d, Source e, Source f, Source g, Source h, Source i, Source j, Source k, Source l, Source m, Source n, Source o, Source p)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a84369eb1962b9b38120540353c4e309f',1,'openvdb::v3_2_0::math::Mat4::Mat4(const Vec4< Source > &v1, const Vec4< Source > &v2, const Vec4< Source > &v3, const Vec4< Source > &v4, bool rows=true)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a854635f86081effa7694c6848fdc52b7',1,'openvdb::v3_2_0::math::Mat4::Mat4(const Mat< 4, T > &m)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a28dccdc05858b244cd361cea1f57512b',1,'openvdb::v3_2_0::math::Mat4::Mat4(const Mat4< Source > &m)']]], + ['matchedgegroup',['matchEdgeGroup',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a77524c5b4199eb058ecedc2dc1c4a7bf',1,'openvdb::v3_2_0::tools::internal']]], + ['mathop',['MathOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1MathOp.html#a3191e23081357c1a6220d18259d392ce',1,'openvdb::v3_2_0::tools::stats_internal::MathOp']]], + ['matmul',['MatMul',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MatMul.html#a59cf6c732ef2e69040ccffa439bc0409',1,'openvdb::v3_2_0::tools::MatMul']]], + ['matmulnormalize',['MatMulNormalize',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MatMulNormalize.html#a1e6df66ef085affe9e09b5b12e842cb5',1,'openvdb::v3_2_0::tools::MatMulNormalize']]], + ['matrixcopyop',['MatrixCopyOp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1MatrixCopyOp.html#a2891ae9bfcc5a05155a6bcbd06efe237',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::MatrixCopyOp']]], + ['matrixtransform',['MatrixTransform',['../structopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer_1_1MatrixTransform.html#a4858a47c4f0da5667232226d68503836',1,'openvdb::v3_2_0::tools::GridTransformer::MatrixTransform::MatrixTransform()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer_1_1MatrixTransform.html#ae33e39598646db1e41a5bfab61afa5fc',1,'openvdb::v3_2_0::tools::GridTransformer::MatrixTransform::MatrixTransform(const Mat4R &xform)']]], + ['matteshader',['MatteShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MatteShader.html#ab545f042a19242b24003b4a3b2cf5cc0',1,'openvdb::v3_2_0::tools::MatteShader::MatteShader()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MatteShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#a683f39cdf723f28f036c43fcfb5be65e',1,'openvdb::v3_2_0::tools::MatteShader< Film::RGBA, SamplerType >::MatteShader()']]], + ['max',['max',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#ad4cb1df7ed158de5d3f02f7d92ca8568',1,'openvdb::v3_2_0::math::BBox::max() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a9e6cf1099dcd1b06ec3732a3ac9b39de',1,'openvdb::v3_2_0::math::BBox::max()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#ad980beb19efd25513ebe6ec3c7cbf1e1',1,'openvdb::v3_2_0::math::Coord::max()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a7d6efe25641f5d0d9d1a3a925eb0225f',1,'openvdb::v3_2_0::math::CoordBBox::max() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a9353b644936db74c010160ebd01a1d6c',1,'openvdb::v3_2_0::math::CoordBBox::max()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MinMax.html#a9ecdb03d1db38be2a4a41fbc0585da12',1,'openvdb::v3_2_0::math::MinMax::max()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#a9bfc3700bf01576b1ca49e5a64b87abe',1,'openvdb::v3_2_0::math::Extrema::max()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html#a9bfc3700bf01576b1ca49e5a64b87abe',1,'openvdb::v3_2_0::math::Histogram::max() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html#a54ce7fdd774eaed1b608ded4fa144821',1,'openvdb::v3_2_0::math::Histogram::max(int n) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#adfff52a286ad3af8678c25389e70f944',1,'openvdb::v3_2_0::math::BaseStencil::max()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html#a1c0cffbff201ac950f3dc3a14159781d',1,'openvdb::v3_2_0::tools::composite::max(const T &a, const T &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html#a412abfdfd0f015575bb78f4971a89a8d',1,'openvdb::v3_2_0::tools::composite::max(const T &a, const T &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aa019924cc631f7fa27fe3d75a9a0d2a5',1,'openvdb::v3_2_0::math::Max(const Type &a, const Type &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#adc3ff239e08f6709eff6724cfc9ea6c8',1,'openvdb::v3_2_0::math::Max(const Type &a, const Type &b, const Type &c)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1a58032a4fb68a17f654fa3c33ea2b42',1,'openvdb::v3_2_0::math::Max(const Type &a, const Type &b, const Type &c, const Type &d)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a5483ed2a0a98f38b9257f34d3be973e4',1,'openvdb::v3_2_0::math::Max(const Type &a, const Type &b, const Type &c, const Type &d, const Type &e)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a79859ed6801f6440d5771db99d9f8f68',1,'openvdb::v3_2_0::math::Max(const Type &a, const Type &b, const Type &c, const Type &d, const Type &e, const Type &f)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ac9386c1b6e7de0a87e921d919a088839',1,'openvdb::v3_2_0::math::Max(const Type &a, const Type &b, const Type &c, const Type &d, const Type &e, const Type &f, const Type &g)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a0f2bf9f2a59f93a548fc834e977135c1',1,'openvdb::v3_2_0::math::Max(const Type &a, const Type &b, const Type &c, const Type &d, const Type &e, const Type &f, const Type &g, const Type &h)']]], + ['maxcomponent',['maxComponent',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a7262dd7cf1f83a05f72f6642b0469771',1,'openvdb::v3_2_0::math::Coord::maxComponent(const Coord &other)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a6a7c8e99b11b6ebd378f59b96cb26a00',1,'openvdb::v3_2_0::math::Coord::maxComponent(const Coord &lhs, const Coord &rhs)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aa04fd7f7a60948ac5699040eb5689dfa',1,'openvdb::v3_2_0::math::maxComponent(const Vec2< T > &v1, const Vec2< T > &v2)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a401014bf1dc4a54ba61eff88cce7a7b3',1,'openvdb::v3_2_0::math::maxComponent(const Vec3< T > &v1, const Vec3< T > &v2)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9b3b5fdd4594a65b622ea384fd75421b',1,'openvdb::v3_2_0::math::maxComponent(const Vec4< T > &v1, const Vec4< T > &v2)']]], + ['maxextent',['maxExtent',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a70f8b67987ddb9a519dd84ec627ca4f7',1,'openvdb::v3_2_0::math::BBox::maxExtent()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a70f8b67987ddb9a519dd84ec627ca4f7',1,'openvdb::v3_2_0::math::CoordBBox::maxExtent()']]], + ['maxindex',['maxIndex',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a0f17216607a0bc3bc9eb3e7adaffec0c',1,'openvdb::v3_2_0::math::Coord::maxIndex()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7d936b4c8c1ce2c74325659a95a621e6',1,'openvdb::v3_2_0::math::MaxIndex()']]], + ['maxmask',['maxMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a9777c31969d25df95ca03c7b10ae6b96',1,'openvdb::v3_2_0::tools::Filter::maxMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a9777c31969d25df95ca03c7b10ae6b96',1,'openvdb::v3_2_0::tools::LevelSetFilter::maxMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#ac67a493ef6c55b2f08cbe5287e499eda',1,'openvdb::v3_2_0::tools::LevelSetMorphing::maxMask()']]], + ['maxop',['MaxOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1MaxOp.html#a0c6c190ae87ca54ab1b640ac3d5479f5',1,'openvdb::v3_2_0::tools::valxform::MaxOp']]], + ['maxradius',['maxRadius',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#aad4662786a91b6328e7afaeb08e7cb3b',1,'openvdb::v3_2_0::tools::ParticleAtlas::maxRadius()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#aded45bdb44a1eb66916e29741218a8f7',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray::maxRadius()']]], + ['maxtime',['maxTime',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#aece917d283f06e2a2ed5245b55edc6c5',1,'openvdb::v3_2_0::math::DDA']]], + ['mean',['mean',['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#a9921c567694a5f661302230feffb76d1',1,'openvdb::v3_2_0::math::Stats::mean()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#ac50200883bf25c19d4e530b423006f1b',1,'openvdb::v3_2_0::math::BaseStencil::mean()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#aa42f3249123b1bc7edb87ffe9c90e7c0',1,'openvdb::v3_2_0::tools::Filter::mean()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a7a30610c3e575d02232c37a32b677e61',1,'openvdb::v3_2_0::tools::LevelSetFilter::mean()']]], + ['meancurvature',['MeanCurvature',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature.html#a69c0351b9ae07bf51343611bc94caa27',1,'openvdb::v3_2_0::tools::MeanCurvature::MeanCurvature(const GridT &grid, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature.html#a2721a20794bff9868b0e6d17109438c7',1,'openvdb::v3_2_0::tools::MeanCurvature::MeanCurvature(const GridT &grid, const MaskGridType &mask, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CurvatureStencil.html#afbe5b2520b2297d6a754cb12fb3d1706',1,'openvdb::v3_2_0::math::CurvatureStencil::meanCurvature()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a7a5893cebb58d7a4c9d3d7707f1b38f5',1,'openvdb::v3_2_0::tools::LevelSetFilter::meanCurvature()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a5ad8501c4e8a1e0f613d880f3431d6ca',1,'openvdb::v3_2_0::tools::meanCurvature(const GridType &grid, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a85e0a1a825212802a6a672420f1be648',1,'openvdb::v3_2_0::tools::meanCurvature(const GridType &grid, const MaskT &mask, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a1122c282c3171ab20dab422669efb9f2',1,'openvdb::v3_2_0::tools::meanCurvature(const GridType &grid, bool threaded=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a08f7d8f2c3776627dccc08503f200cfd',1,'openvdb::v3_2_0::tools::meanCurvature(const GridType &grid, const MaskT &mask, bool threaded=true)']]], + ['meancurvaturenormgrad',['meanCurvatureNormGrad',['../classopenvdb_1_1v3__2__0_1_1math_1_1CurvatureStencil.html#ad3bd283e8cdfbd6463812edbb5d850f0',1,'openvdb::v3_2_0::math::CurvatureStencil']]], + ['measure',['measure',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#ad492a5607196f162a2502ab9b126cc95',1,'openvdb::v3_2_0::tools::LevelSetMeasure::measure(Real &area, Real &volume, bool useWorldUnits=true)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#aa223d5ee09ea00e2f17635e71222a4e3',1,'openvdb::v3_2_0::tools::LevelSetMeasure::measure(Real &area, Real &volume, Real &avgMeanCurvature, bool useWorldUnits=true)']]], + ['median',['median',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#ae7da36055083f73e0dadd21471ac0edf',1,'openvdb::v3_2_0::math::BaseStencil::median()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a289cdc97474dd92e10951f348787ee31',1,'openvdb::v3_2_0::tools::Filter::median()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a3142781f74b059b159f7bf9c9bdf4451',1,'openvdb::v3_2_0::tools::LevelSetFilter::median()']]], + ['memorylayout',['memoryLayout',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#ac563a9e8934d509ecb00d9455947b368',1,'openvdb::v3_2_0::tools::Dense']]], + ['memusage',['memUsage',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a841adaa0436a1b87710d384aa22d74b1',1,'openvdb::v3_2_0::GridBase::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#aae2d9daf6809e19c51946932dacc9f06',1,'openvdb::v3_2_0::Grid::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a8443805eb98462d37d9c3f7b549ede0f',1,'openvdb::v3_2_0::tools::Dense::memUsage()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a8443805eb98462d37d9c3f7b549ede0f',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a8443805eb98462d37d9c3f7b549ede0f',1,'openvdb::v3_2_0::tree::InternalNode::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#ad70aba631622897801f7c95dc36aa1c5',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a8443805eb98462d37d9c3f7b549ede0f',1,'openvdb::v3_2_0::tree::LeafNode::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#ad70aba631622897801f7c95dc36aa1c5',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8443805eb98462d37d9c3f7b549ede0f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#ad70aba631622897801f7c95dc36aa1c5',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8443805eb98462d37d9c3f7b549ede0f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a8443805eb98462d37d9c3f7b549ede0f',1,'openvdb::v3_2_0::tree::RootNode::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#aae2d9daf6809e19c51946932dacc9f06',1,'openvdb::v3_2_0::tree::TreeBase::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#aae2d9daf6809e19c51946932dacc9f06',1,'openvdb::v3_2_0::tree::Tree::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a9ebea8c8ab198dedc6b9dc270cd0011e',1,'openvdb::v3_2_0::util::NodeMask::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a9ebea8c8ab198dedc6b9dc270cd0011e',1,'openvdb::v3_2_0::util::NodeMask< 1 >::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a9ebea8c8ab198dedc6b9dc270cd0011e',1,'openvdb::v3_2_0::util::NodeMask< 2 >::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#ad7ce9e4ed283b5ada12c2fd72701c991',1,'openvdb::v3_2_0::util::RootNodeMask::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#af5aca2ade65de662ce2bef5b16bf0152',1,'openvdb::v3_2_0::util::PagedArray::memUsage()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html#a44872b3c78bf4e21b2c0c5a3ab6c75cb',1,'openvdb::v3_2_0::util::PagedArray::Page::memUsage()']]], + ['merge',['merge',['../classopenvdb_1_1v3__2__0_1_1Grid.html#adf11d9e6e826c6ce03707c950c5c4930',1,'openvdb::v3_2_0::Grid::merge()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a23b8659f79e745e474113157d6813db9',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::merge(const PointIndexLeafNode &rhs)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a4119e466f0aaba9e53ef8b8d97af8a18',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::merge(const ValueType &tileValue, bool tileActive)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a13c35d9f38248d636ac40d9ac327192f',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::merge(const PointIndexLeafNode &other, const ValueType &, const ValueType &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a0678918b353a7fa416685a3a5ba6c3fb',1,'openvdb::v3_2_0::tree::InternalNode::merge(InternalNode &other, const ValueType &background, const ValueType &otherBackground)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a4119e466f0aaba9e53ef8b8d97af8a18',1,'openvdb::v3_2_0::tree::InternalNode::merge(const ValueType &tileValue, bool tileActive)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ad10d3b3839961c3f5e8138fef390dc62',1,'openvdb::v3_2_0::tree::LeafNode::merge(const LeafNode &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a4119e466f0aaba9e53ef8b8d97af8a18',1,'openvdb::v3_2_0::tree::LeafNode::merge(const ValueType &tileValue, bool tileActive)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a9c72e2c46ffacb220cb6c1f91b4955f4',1,'openvdb::v3_2_0::tree::LeafNode::merge(const LeafNode &other, const ValueType &, const ValueType &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#acacc2ed7ee525bdcb40d54592aa3cd2e',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::merge(const LeafNode &other, bool bg=false, bool otherBG=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ac297dac860f2a8354b94a9962598e79a',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::merge(bool tileValue, bool tileActive)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#acacc2ed7ee525bdcb40d54592aa3cd2e',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::merge(const LeafNode &other, bool bg=false, bool otherBG=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aebc46e0e9072bed1fd585288da1839e1',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::merge(bool tileValue, bool tileActive=false)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a52a7e4a512b1082887098547c2781ed0',1,'openvdb::v3_2_0::tree::RootNode::merge()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a2ba5f332b68e4a1ebba9dbf4b95ec807',1,'openvdb::v3_2_0::tree::Tree::merge()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#ac07534f9ba83f95d11ce49c4ef4d5ce4',1,'openvdb::v3_2_0::util::PagedArray::merge()']]], + ['mergebinsop',['MergeBinsOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MergeBinsOp.html#ad6173d68c1bf4107c1b320e379b07d16',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MergeBinsOp']]], + ['mergevoxelregions',['MergeVoxelRegions',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#a6e6bf5047a24b35e3bf24001a8567edf',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions']]], + ['mergevoxels',['mergeVoxels',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a354c08c0d29cb5ddfa3fa084c158989f',1,'openvdb::v3_2_0::tools::internal']]], + ['meshtolevelset',['meshToLevelSet',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a49d6517666da8e1ec1175651ebf12f32',1,'openvdb::v3_2_0::tools::meshToLevelSet(const openvdb::math::Transform &xform, const std::vector< Vec3s > &points, const std::vector< Vec3I > &triangles, float halfWidth=float(LEVEL_SET_HALF_WIDTH))'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#afb69abc32d73ce0e3cd67b569bed65b8',1,'openvdb::v3_2_0::tools::meshToLevelSet(const openvdb::math::Transform &xform, const std::vector< Vec3s > &points, const std::vector< Vec4I > &quads, float halfWidth=float(LEVEL_SET_HALF_WIDTH))'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a88550f83eda208f6a4efd332735bb215',1,'openvdb::v3_2_0::tools::meshToLevelSet(const openvdb::math::Transform &xform, const std::vector< Vec3s > &points, const std::vector< Vec3I > &triangles, const std::vector< Vec4I > &quads, float halfWidth=float(LEVEL_SET_HALF_WIDTH))']]], + ['meshtosigneddistancefield',['meshToSignedDistanceField',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ab994dead75e3d110e11eb64dce6ca65a',1,'openvdb::v3_2_0::tools']]], + ['meshtounsigneddistancefield',['meshToUnsignedDistanceField',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a7a77a75ddf87809699a67916ea172add',1,'openvdb::v3_2_0::tools']]], + ['meshtovolume',['meshToVolume',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a92209132a587125e118307aea798ce30',1,'openvdb::v3_2_0::tools::meshToVolume(const MeshDataAdapter &mesh, const math::Transform &transform, float exteriorBandWidth=3.0f, float interiorBandWidth=3.0f, int flags=0, typename GridType::template ValueConverter< Int32 >::Type *polygonIndexGrid=NULL)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a991dc1c88fb30ef128bdd5e40c702d75',1,'openvdb::v3_2_0::tools::meshToVolume(Interrupter &interrupter, const MeshDataAdapter &mesh, const math::Transform &transform, float exteriorBandWidth=3.0f, float interiorBandWidth=3.0f, int flags=0, typename GridType::template ValueConverter< Int32 >::Type *polygonIndexGrid=NULL)']]], + ['meshtovoxeledgedata',['MeshToVoxelEdgeData',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData.html#ad206018355b0b6e4f1200146955a44b3',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData']]], + ['metacount',['metaCount',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a35dade13004130e3a51fd165597d6f24',1,'openvdb::v3_2_0::MetaMap']]], + ['metadata',['Metadata',['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a20ed44ba04640e7899bc99dc9e06846d',1,'openvdb::v3_2_0::Metadata']]], + ['metamap',['MetaMap',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#af932a63d2fb9981c86b4f87c060b0d6e',1,'openvdb::v3_2_0::MetaMap::MetaMap()'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#aa472342c2ce685400f7710e6c1a771ca',1,'openvdb::v3_2_0::MetaMap::MetaMap(const MetaMap &other)']]], + ['metavalue',['metaValue',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a82ecd84c09b4debc8275c79f8dca1c74',1,'openvdb::v3_2_0::MetaMap::metaValue(const Name &)'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a1a0ea028e2b978328279923a3026cfc0',1,'openvdb::v3_2_0::MetaMap::metaValue(const Name &) const ']]], + ['mid',['mid',['../structopenvdb_1_1v3__2__0_1_1math_1_1Ray_1_1TimeSpan.html#a324d34e094a86c230f819866cbb54909',1,'openvdb::v3_2_0::math::Ray::TimeSpan::mid()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#ad8dcaae14409f024c3381e36d5dea9b7',1,'openvdb::v3_2_0::math::Ray::mid()']]], + ['min',['min',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a70d4d4921617e45221bcecf01c340db1',1,'openvdb::v3_2_0::math::BBox::min() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#abe5f9c24f1823e29efde292b59f5802d',1,'openvdb::v3_2_0::math::BBox::min()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#abcfa3833e73de42b7dcc1dfb82e73647',1,'openvdb::v3_2_0::math::Coord::min()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a0fa0c965de8fe40cc4a9e7383bed5b64',1,'openvdb::v3_2_0::math::CoordBBox::min() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#aff1af0cee55a5f14797072a1281e4f15',1,'openvdb::v3_2_0::math::CoordBBox::min()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MinMax.html#a8fdccc46bacba4559a2d4fcf487ab43d',1,'openvdb::v3_2_0::math::MinMax::min()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#a2316dcf397d4aaefbe79179748f2a007',1,'openvdb::v3_2_0::math::Extrema::min()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html#a2316dcf397d4aaefbe79179748f2a007',1,'openvdb::v3_2_0::math::Histogram::min() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html#ac72df3f4e8b9c9db9982bbeabe0c8d51',1,'openvdb::v3_2_0::math::Histogram::min(int n) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#ad87eba235dd24cd0850163842a5ccce4',1,'openvdb::v3_2_0::math::BaseStencil::min()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html#aa53e6939a0dded43d1a9d0a4fcb33072',1,'openvdb::v3_2_0::tools::composite::min(const T &a, const T &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html#a9c4493a29dfeca8c15da54f21ecfb52f',1,'openvdb::v3_2_0::tools::composite::min(const T &a, const T &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ac00b4e9cae5d3e5a9d17ebe95bb24337',1,'openvdb::v3_2_0::math::Min(const Type &a, const Type &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a332d119e5abfe729c72366f7888cf364',1,'openvdb::v3_2_0::math::Min(const Type &a, const Type &b, const Type &c)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab8b90e133a9d6384396083b7d0b125d1',1,'openvdb::v3_2_0::math::Min(const Type &a, const Type &b, const Type &c, const Type &d)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a3eb5788fad7f40622a74284c1f37cdc2',1,'openvdb::v3_2_0::math::Min(const Type &a, const Type &b, const Type &c, const Type &d, const Type &e)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aaba37a38f11758ca8e1829ff8a60a820',1,'openvdb::v3_2_0::math::Min(const Type &a, const Type &b, const Type &c, const Type &d, const Type &e, const Type &f)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7d68f7b0d4318dfc4587cc97853bd728',1,'openvdb::v3_2_0::math::Min(const Type &a, const Type &b, const Type &c, const Type &d, const Type &e, const Type &f, const Type &g)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aeca3ce7f6f2a73cdfe8f43b7faa5de91',1,'openvdb::v3_2_0::math::Min(const Type &a, const Type &b, const Type &c, const Type &d, const Type &e, const Type &f, const Type &g, const Type &h)']]], + ['mincombine',['MinCombine',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1MinCombine.html#aa38bdcaac539bad06f4602a828d6408a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::MinCombine']]], + ['mincomponent',['minComponent',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a46fce96f01a8c6fad36ee9993a21365f',1,'openvdb::v3_2_0::math::Coord::minComponent(const Coord &other)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#af084f1a31e41546a361b63485fe31844',1,'openvdb::v3_2_0::math::Coord::minComponent(const Coord &lhs, const Coord &rhs)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9769c576117b5b196ed12938c6190cb7',1,'openvdb::v3_2_0::math::minComponent(const Vec2< T > &v1, const Vec2< T > &v2)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab919184ca9cd1285c9674bab74ad9ae6',1,'openvdb::v3_2_0::math::minComponent(const Vec3< T > &v1, const Vec3< T > &v2)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#adedf4ff2433945aa84e4f237ae50c532',1,'openvdb::v3_2_0::math::minComponent(const Vec4< T > &v1, const Vec4< T > &v2)']]], + ['minextent',['minExtent',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#af0a30e92d1d69b59583830eb3c5173cc',1,'openvdb::v3_2_0::math::BBox::minExtent()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#af0a30e92d1d69b59583830eb3c5173cc',1,'openvdb::v3_2_0::math::CoordBBox::minExtent()']]], + ['minindex',['minIndex',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a2c97e9c1fdaf2e2d4aff72890f5a9dbd',1,'openvdb::v3_2_0::math::Coord::minIndex()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ac5d0da2d1895b43fe37005fc3b520a64',1,'openvdb::v3_2_0::math::MinIndex()']]], + ['minmask',['minMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a6c99015227b7be710f9fb0fa5fab6fa7',1,'openvdb::v3_2_0::tools::Filter::minMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a6c99015227b7be710f9fb0fa5fab6fa7',1,'openvdb::v3_2_0::tools::LevelSetFilter::minMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#abf3f69e652c633242860dc72e28cc0fb',1,'openvdb::v3_2_0::tools::LevelSetMorphing::minMask()']]], + ['minmax',['MinMax',['../classopenvdb_1_1v3__2__0_1_1math_1_1MinMax.html#ae06942b363abbd3216ff9b3b4a35ea7e',1,'openvdb::v3_2_0::math::MinMax']]], + ['minnarrowbandwidth',['minNarrowBandWidth',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1Tolerance.html#a5321371ab1e9bdaa628464dd6954d3ba',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::Tolerance']]], + ['minop',['MinOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1MinOp.html#a1729eed65ecabfa5feb1a07b0b53a1a1',1,'openvdb::v3_2_0::tools::valxform::MinOp']]], + ['minradius',['minRadius',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#a4e7bc02ba47bfb57b69c92ba27aed585',1,'openvdb::v3_2_0::tools::ParticleAtlas::minRadius()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#a05794307218d50f5671e7269ac367d86',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray::minRadius()']]], + ['mipmap',['mipmap',['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1BoolSampler.html#a6c9ddbbbd600c052cade13207665aa39',1,'openvdb::v3_2_0::tools::clip_internal::BoolSampler::mipmap()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler.html#a6c9ddbbbd600c052cade13207665aa39',1,'openvdb::v3_2_0::tools::Sampler::mipmap()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointSampler.html#a6c9ddbbbd600c052cade13207665aa39',1,'openvdb::v3_2_0::tools::PointSampler::mipmap()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html#a6c9ddbbbd600c052cade13207665aa39',1,'openvdb::v3_2_0::tools::BoxSampler::mipmap()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadraticSampler.html#a6c9ddbbbd600c052cade13207665aa39',1,'openvdb::v3_2_0::tools::QuadraticSampler::mipmap()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredPointSampler.html#a6c9ddbbbd600c052cade13207665aa39',1,'openvdb::v3_2_0::tools::StaggeredPointSampler::mipmap()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredBoxSampler.html#a6c9ddbbbd600c052cade13207665aa39',1,'openvdb::v3_2_0::tools::StaggeredBoxSampler::mipmap()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredQuadraticSampler.html#a6c9ddbbbd600c052cade13207665aa39',1,'openvdb::v3_2_0::tools::StaggeredQuadraticSampler::mipmap()']]], + ['mod',['Mod',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae6ec9dc2329f78606c19ee66cb44947a',1,'openvdb::v3_2_0::math::Mod(int x, int y)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a27d99fa25b7fdddc3c81f9cc41ba59a0',1,'openvdb::v3_2_0::math::Mod(float x, float y)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a0ff3eeea1b688e287c26934c6cb1b48a',1,'openvdb::v3_2_0::math::Mod(double x, double y)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a41dde38e08a635a024944417baee15a2',1,'openvdb::v3_2_0::math::Mod(long double x, long double y)']]], + ['modifyitem',['modifyItem',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ValueIter.html#a41e63c9557ee60d364243b8056709225',1,'openvdb::v3_2_0::tree::InternalNode::ValueIter::modifyItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueIter.html#ade5db9021ff78f2202190ffce2ea963f',1,'openvdb::v3_2_0::tree::LeafNode::ValueIter::modifyItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ValueIter.html#ade5db9021ff78f2202190ffce2ea963f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter::modifyItem()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ValueIter.html#ade5db9021ff78f2202190ffce2ea963f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter::modifyItem()']]], + ['modifyvalue',['modifyValue',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a3380f7ca101cd90c6b77073edecb181c',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::modifyValue(Index, const ModifyOp &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ae1d1b15ee3ea5f2e9431e84138a9a02b',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::modifyValue(const Coord &, const ModifyOp &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::InternalNode::modifyValue()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#a3cc3619337daed341d5243d870987bad',1,'openvdb::v3_2_0::tree::SparseIteratorBase::modifyValue()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueIter.html#a3cc3619337daed341d5243d870987bad',1,'openvdb::v3_2_0::tree::LeafNode::ValueIter::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ae2369c9fcb45b30e0494c994b0bd80fc',1,'openvdb::v3_2_0::tree::LeafNode::modifyValue(Index offset, const ModifyOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::LeafNode::modifyValue(const Coord &xyz, const ModifyOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ae2369c9fcb45b30e0494c994b0bd80fc',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::modifyValue(Index offset, const ModifyOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::modifyValue(const Coord &xyz, const ModifyOp &op)'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ValueIter.html#a3cc3619337daed341d5243d870987bad',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ae2369c9fcb45b30e0494c994b0bd80fc',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::modifyValue(Index offset, const ModifyOp &op)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::modifyValue(const Coord &xyz, const ModifyOp &op)'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ValueIter.html#a3cc3619337daed341d5243d870987bad',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::RootNode::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::Tree::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a1685a02e9a6a4f3c11b7c6b9889d0072',1,'openvdb::v3_2_0::tree::IterListItem::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a1685a02e9a6a4f3c11b7c6b9889d0072',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a1685a02e9a6a4f3c11b7c6b9889d0072',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a3cc3619337daed341d5243d870987bad',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::ValueAccessor::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::CacheItem::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::ValueAccessor0::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::ValueAccessor1::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::ValueAccessor2::modifyValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#aa6954a428c0ef18a03431f251f4e7d24',1,'openvdb::v3_2_0::tree::ValueAccessor3::modifyValue()']]], + ['modifyvalueandactivestate',['modifyValueAndActiveState',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a5c8f5a38edbc0381957806c5a3977818',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::InternalNode::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::LeafNode::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::RootNode::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::Tree::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::ValueAccessor::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::CacheItem::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::ValueAccessor0::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::ValueAccessor1::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::ValueAccessor2::modifyValueAndActiveState()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a5cb69af7e17c3a9a6d6dc360c878448c',1,'openvdb::v3_2_0::tree::ValueAccessor3::modifyValueAndActiveState()']]], + ['modifyvalueandactivestateandcache',['modifyValueAndActiveStateAndCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a6f1495dab035bd189f9e1bfd9b6a4862',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::modifyValueAndActiveStateAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#af057648803b9073ce1703dbf061e0d1f',1,'openvdb::v3_2_0::tree::InternalNode::modifyValueAndActiveStateAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#af057648803b9073ce1703dbf061e0d1f',1,'openvdb::v3_2_0::tree::LeafNode::modifyValueAndActiveStateAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#af057648803b9073ce1703dbf061e0d1f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::modifyValueAndActiveStateAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#af057648803b9073ce1703dbf061e0d1f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::modifyValueAndActiveStateAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#af057648803b9073ce1703dbf061e0d1f',1,'openvdb::v3_2_0::tree::RootNode::modifyValueAndActiveStateAndCache()']]], + ['modifyvalueandcache',['modifyValueAndCache',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a7bed5c7c0d76cacfb514d9744f754402',1,'openvdb::v3_2_0::tree::InternalNode::modifyValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a7bed5c7c0d76cacfb514d9744f754402',1,'openvdb::v3_2_0::tree::LeafNode::modifyValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a7bed5c7c0d76cacfb514d9744f754402',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::modifyValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a7bed5c7c0d76cacfb514d9744f754402',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::modifyValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a7bed5c7c0d76cacfb514d9744f754402',1,'openvdb::v3_2_0::tree::RootNode::modifyValueAndCache()']]], + ['morphology',['Morphology',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a8a91a5eb7059fe4e32beba357755aaa6',1,'openvdb::v3_2_0::tools::Morphology::Morphology(TreeType &tree)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a7a06034300a1464451a0ede3735490b6',1,'openvdb::v3_2_0::tools::Morphology::Morphology(ManagerType *mgr)']]], + ['movepoints',['MovePoints',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MovePoints.html#a6eefa0d00728e2d0a2f1ae7b46da7fa1',1,'openvdb::v3_2_0::tools::internal::MovePoints']]], + ['movesegmentdataop',['MoveSegmentDataOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MoveSegmentDataOp.html#a272b3538f8d2afb22bd910c2e84af7a0',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MoveSegmentDataOp']]], + ['moveto',['moveTo',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a8c1795bb2a69d1596846dda8db1fa810',1,'openvdb::v3_2_0::math::BaseStencil::moveTo(const Coord &ijk)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a6786888a357f4a08d2e1e3f4ab206007',1,'openvdb::v3_2_0::math::BaseStencil::moveTo(const Coord &ijk, const ValueType &centerValue)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a283eb7116175c5c9b83f0eff6872c1df',1,'openvdb::v3_2_0::math::BaseStencil::moveTo(const IterType &iter)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#aa7ce5de66f389ecebf0eab3c9dbce076',1,'openvdb::v3_2_0::math::BaseStencil::moveTo(const Vec3R &xyz)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DenseStencil.html#a8c1795bb2a69d1596846dda8db1fa810',1,'openvdb::v3_2_0::math::DenseStencil::moveTo(const Coord &ijk)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DenseStencil.html#a283eb7116175c5c9b83f0eff6872c1df',1,'openvdb::v3_2_0::math::DenseStencil::moveTo(const IterType &iter)']]], + ['mult',['mult',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a0214d97cab290fbd487716272d92d3c7',1,'openvdb::v3_2_0::math::Quat']]], + ['multiresgrid',['MultiResGrid',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a45e4c07c8affb292bd58c0239ab3a9dd',1,'openvdb::v3_2_0::tools::MultiResGrid::MultiResGrid(size_t levels, ValueType background, double voxelSize=1.0)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a332c33e3c1c39fb142201962c71bf3bf',1,'openvdb::v3_2_0::tools::MultiResGrid::MultiResGrid(size_t levels, const Grid< TreeType > &grid, bool useInjection=false)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a7cf562b91683466fd3704b971c389ca0',1,'openvdb::v3_2_0::tools::MultiResGrid::MultiResGrid(size_t levels, GridPtr grid, bool useInjection=false)']]], + ['multop',['MultOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1MultOp.html#a02199a89e05223221d75d2ef4b905bce',1,'openvdb::v3_2_0::tools::valxform::MultOp']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_d.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_d.html new file mode 100644 index 00000000..5589e4db --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_d.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_d.js new file mode 100644 index 00000000..fd2b4715 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_d.js @@ -0,0 +1,53 @@ +var searchData= +[ + ['name',['name',['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1BoolSampler.html#aa6be32e0d1b4bd24f8745d1d3267b295',1,'openvdb::v3_2_0::tools::clip_internal::BoolSampler::name()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler.html#aa6be32e0d1b4bd24f8745d1d3267b295',1,'openvdb::v3_2_0::tools::Sampler::name()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointSampler.html#aa6be32e0d1b4bd24f8745d1d3267b295',1,'openvdb::v3_2_0::tools::PointSampler::name()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html#aa6be32e0d1b4bd24f8745d1d3267b295',1,'openvdb::v3_2_0::tools::BoxSampler::name()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadraticSampler.html#aa6be32e0d1b4bd24f8745d1d3267b295',1,'openvdb::v3_2_0::tools::QuadraticSampler::name()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredPointSampler.html#aa6be32e0d1b4bd24f8745d1d3267b295',1,'openvdb::v3_2_0::tools::StaggeredPointSampler::name()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredBoxSampler.html#aa6be32e0d1b4bd24f8745d1d3267b295',1,'openvdb::v3_2_0::tools::StaggeredBoxSampler::name()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredQuadraticSampler.html#aa6be32e0d1b4bd24f8745d1d3267b295',1,'openvdb::v3_2_0::tools::StaggeredQuadraticSampler::name()']]], + ['nameasstring',['nameAsString',['../classopenvdb_1_1v3__2__0_1_1io_1_1GridDescriptor.html#a379199014736f027bf11fd2c3f7c0b85',1,'openvdb::v3_2_0::io::GridDescriptor']]], + ['nameiterator',['NameIterator',['../classopenvdb_1_1v3__2__0_1_1io_1_1File_1_1NameIterator.html#ae5b24b1dd0691b2a3d187aa6e4187e6c',1,'openvdb::v3_2_0::io::File::NameIterator']]], + ['nearestcoord',['nearestCoord',['../namespaceopenvdb_1_1v3__2__0_1_1util.html#ae6b18cc30bfc545a1a1d691e88f467c6',1,'openvdb::v3_2_0::util']]], + ['needsactivevoxepadding',['needsActiveVoxePadding',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#af5ae121150b2407f088e1b3bc0c1e433',1,'openvdb::v3_2_0::tools::internal']]], + ['negate',['negate',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#abcdb1512395327f8236a4f4a4d4ff648',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::negate()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#abcdb1512395327f8236a4f4a4d4ff648',1,'openvdb::v3_2_0::tree::InternalNode::negate()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#abcdb1512395327f8236a4f4a4d4ff648',1,'openvdb::v3_2_0::tree::LeafNode::negate()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#abcdb1512395327f8236a4f4a4d4ff648',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::negate()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#abcdb1512395327f8236a4f4a4d4ff648',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::negate()']]], + ['negative',['negative',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7b353210b1a3d79dc34eb9380e50e4c0',1,'openvdb::v3_2_0::math::negative(const T &val)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a2467e202fb4c5cd1f2aabab78b82520a',1,'openvdb::v3_2_0::math::negative(const bool &val)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a41fc2fc612db63378525bdeeda90b88d',1,'openvdb::v3_2_0::math::negative(const std::string &val)']]], + ['neighbor',['Neighbor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1Neighbor.html#a18e5bd400ed24e3fd0960943b302f88d',1,'openvdb::v3_2_0::tools::Morphology::Neighbor']]], + ['newdistnodes',['newDistNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#a68bee170e6c06685e3551aca0a967a77',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband']]], + ['newindexnodes',['newIndexNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#a7a59d49ed2e099a9a2022e18fdc3d8d7',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband']]], + ['newmasktree',['newMaskTree',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandLeafNodeRegion.html#ab944f47adf086a09fe8170437968b1a8',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandLeafNodeRegion::newMaskTree()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#ab944f47adf086a09fe8170437968b1a8',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::newMaskTree()']]], + ['newsetvalue',['newSetValue',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#ab63c145fbe586179c5afb574b69e7c98',1,'openvdb::v3_2_0::tree::ValueAccessor']]], + ['newtree',['newTree',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a742dad1af803e5c35040cc24868f2d40',1,'openvdb::v3_2_0::GridBase::newTree()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#ad39713416d1f162fbb2543ae58bba35c',1,'openvdb::v3_2_0::Grid::newTree()']]], + ['next',['next',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#abc23a9cafdc850ec4e93aa0dcac6383c',1,'openvdb::v3_2_0::math::DDA::next()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::next()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::tools::PointIndexIterator::next()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator::next()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::tree::IteratorBase::next()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a478269266193d35f2f5acb03ad06136b',1,'openvdb::v3_2_0::tree::IterListItem::next()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a478269266193d35f2f5acb03ad06136b',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::next()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a478269266193d35f2f5acb03ad06136b',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::next()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::next()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::tree::NodeIteratorBase::next()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::tree::LeafIteratorBase::next()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorRange.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::tree::IteratorRange::next()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1OnMaskIterator.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::util::OnMaskIterator::next()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1OffMaskIterator.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::util::OffMaskIterator::next()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1DenseMaskIterator.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::util::DenseMaskIterator::next()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OnIterator.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::util::RootNodeMask::OnIterator::next()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OffIterator.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::util::RootNodeMask::OffIterator::next()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1DenseIterator.html#a80870c233d0237e3588a2d6f8d176916',1,'openvdb::v3_2_0::util::RootNodeMask::DenseIterator::next()']]], + ['nineteenpointstencil',['NineteenPointStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1NineteenPointStencil.html#afc53d6a4f3807dca4f4913ae85c47a07',1,'openvdb::v3_2_0::math::NineteenPointStencil']]], + ['nodebs',['NodeBS',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1NodeBS.html#adaa391b3f16165efa04b99f117c4116f',1,'openvdb::v3_2_0::tools::internal::NodeBS']]], + ['nodecount',['nodeCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#af2a4b92741d800e6525c0bcc7230fa8e',1,'openvdb::v3_2_0::tree::NodeList::nodeCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#af2a4b92741d800e6525c0bcc7230fa8e',1,'openvdb::v3_2_0::tree::NodeManagerLink::nodeCount() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#a02c2d85a30bc576d8351124a329cf92b',1,'openvdb::v3_2_0::tree::NodeManagerLink::nodeCount(Index i) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#af2a4b92741d800e6525c0bcc7230fa8e',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::nodeCount() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#a5a5eff974b3d3e2364177029332df611',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::nodeCount(Index) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#af2a4b92741d800e6525c0bcc7230fa8e',1,'openvdb::v3_2_0::tree::NodeManager::nodeCount() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#a02c2d85a30bc576d8351124a329cf92b',1,'openvdb::v3_2_0::tree::NodeManager::nodeCount(Index i) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#af2a4b92741d800e6525c0bcc7230fa8e',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::nodeCount() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#a5a5eff974b3d3e2364177029332df611',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::nodeCount(Index) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#af2a4b92741d800e6525c0bcc7230fa8e',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::nodeCount() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a02c2d85a30bc576d8351124a329cf92b',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::nodeCount(Index i) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#af2a4b92741d800e6525c0bcc7230fa8e',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::nodeCount() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a02c2d85a30bc576d8351124a329cf92b',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::nodeCount(Index i) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#af2a4b92741d800e6525c0bcc7230fa8e',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::nodeCount() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a02c2d85a30bc576d8351124a329cf92b',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::nodeCount(Index i) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#af2a4b92741d800e6525c0bcc7230fa8e',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::nodeCount() const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a02c2d85a30bc576d8351124a329cf92b',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::nodeCount(Index i) const ']]], + ['nodeiteratorbase',['NodeIteratorBase',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a7169672650c84fe5d7dbda4fcab2ae04',1,'openvdb::v3_2_0::tree::NodeIteratorBase::NodeIteratorBase()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#ac34bd1fc5e0666259f303e3b2c45b5f0',1,'openvdb::v3_2_0::tree::NodeIteratorBase::NodeIteratorBase(TreeT &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#ac6057d2812404e42c2caf0aa7541f85f',1,'openvdb::v3_2_0::tree::NodeIteratorBase::NodeIteratorBase(const NodeIteratorBase &other)']]], + ['nodelist',['nodeList',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange.html#a04d02da71da493dd822862e9a48a7bb1',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::nodeList()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#aa3a9df0253e6d4d127148724e132751e',1,'openvdb::v3_2_0::tree::NodeList::NodeList()']]], + ['nodemanager',['NodeManager',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#ad62075f7dbaf6457e3206ea1c65e6a04',1,'openvdb::v3_2_0::tree::NodeManager::NodeManager()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#ad62075f7dbaf6457e3206ea1c65e6a04',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::NodeManager()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#ad62075f7dbaf6457e3206ea1c65e6a04',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::NodeManager()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#ad62075f7dbaf6457e3206ea1c65e6a04',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::NodeManager()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#ad62075f7dbaf6457e3206ea1c65e6a04',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::NodeManager()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#ad62075f7dbaf6457e3206ea1c65e6a04',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::NodeManager()']]], + ['nodemanagerlink',['NodeManagerLink',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#aa7efe14a099868abd1345bc4317df02c',1,'openvdb::v3_2_0::tree::NodeManagerLink::NodeManagerLink()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#aa7efe14a099868abd1345bc4317df02c',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::NodeManagerLink()']]], + ['nodemask',['NodeMask',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ac942c03f8a094afad0a9632d70a02dca',1,'openvdb::v3_2_0::util::NodeMask::NodeMask()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a6027ebba6c192d886132bd6a44b9ab4d',1,'openvdb::v3_2_0::util::NodeMask::NodeMask(bool on)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#acc7b46b8a39c2bfb491b7d752ffc39c7',1,'openvdb::v3_2_0::util::NodeMask::NodeMask(const NodeMask &other)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ac942c03f8a094afad0a9632d70a02dca',1,'openvdb::v3_2_0::util::NodeMask< 1 >::NodeMask()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a6027ebba6c192d886132bd6a44b9ab4d',1,'openvdb::v3_2_0::util::NodeMask< 1 >::NodeMask(bool on)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#acc7b46b8a39c2bfb491b7d752ffc39c7',1,'openvdb::v3_2_0::util::NodeMask< 1 >::NodeMask(const NodeMask &other)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ac942c03f8a094afad0a9632d70a02dca',1,'openvdb::v3_2_0::util::NodeMask< 2 >::NodeMask()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a6027ebba6c192d886132bd6a44b9ab4d',1,'openvdb::v3_2_0::util::NodeMask< 2 >::NodeMask(bool on)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#acc7b46b8a39c2bfb491b7d752ffc39c7',1,'openvdb::v3_2_0::util::NodeMask< 2 >::NodeMask(const NodeMask &other)']]], + ['nodemasksegment',['NodeMaskSegment',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1NodeMaskSegment.html#a5367353056782aca5ec2d08e31be7ae3',1,'openvdb::v3_2_0::tools::level_set_util_internal::NodeMaskSegment']]], + ['nodemasksegmentation',['nodeMaskSegmentation',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal.html#aa4b9363aae5ae02f30c718ad119adfc6',1,'openvdb::v3_2_0::tools::level_set_util_internal']]], + ['noderange',['NodeRange',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange.html#a2b692749403550984465da88a15079b1',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::NodeRange(size_t begin, size_t end, const NodeList &nodeList, size_t grainSize=1)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange.html#af3166343a38b07563455dec0b013f340',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::NodeRange(NodeRange &r, tbb::split)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#a67c120b5d229cb4165a8b7bf5fa63823',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::nodeRange()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#a46c0b20d92c0700ca45f4f3f4f9cf21e',1,'openvdb::v3_2_0::tree::NodeList::nodeRange()']]], + ['nodes',['nodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html#a9883ee9c53f52a91c8ff1e5f026f2597',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::LeafNodeConnectivityTable::nodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html#ae261b12fa1b1ba15dce9796dfe552841',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::LeafNodeConnectivityTable::nodes() const ']]], + ['nodeunion',['NodeUnion',['../structopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnion.html#a4ae1423de7d932181d485f6c5e2b391f',1,'openvdb::v3_2_0::tree::NodeUnion']]], + ['nodeunionimpl',['NodeUnionImpl',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01false_00_01ValueT_00_01ChildT_01_4.html#abdf42a3c66ee943a982af3a20614119b',1,'openvdb::v3_2_0::tree::NodeUnionImpl< false, ValueT, ChildT >::NodeUnionImpl()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01true_00_01ValueT_00_01ChildT_01_4.html#abdf42a3c66ee943a982af3a20614119b',1,'openvdb::v3_2_0::tree::NodeUnionImpl< true, ValueT, ChildT >::NodeUnionImpl()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01true_00_01ValueT_00_01ChildT_01_4.html#a125c25372cc3bae21eda28f32b96942a',1,'openvdb::v3_2_0::tree::NodeUnionImpl< true, ValueT, ChildT >::NodeUnionImpl(const NodeUnionImpl &other)']]], + ['nonleafcount',['nonLeafCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ad8d22ef34f6459bcffc00f6eb8f747b9',1,'openvdb::v3_2_0::tree::InternalNode::nonLeafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a990fc39a0c24140b9c1506255bb14918',1,'openvdb::v3_2_0::tree::LeafNode::nonLeafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a990fc39a0c24140b9c1506255bb14918',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::nonLeafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a990fc39a0c24140b9c1506255bb14918',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::nonLeafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ad8d22ef34f6459bcffc00f6eb8f747b9',1,'openvdb::v3_2_0::tree::RootNode::nonLeafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a11d3e40260ba955b4a19778072e684b0',1,'openvdb::v3_2_0::tree::TreeBase::nonLeafCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a007c10ac7c3106556c8b53e5bd14e6ea',1,'openvdb::v3_2_0::tree::Tree::nonLeafCount()']]], + ['nonlinearfrustummap',['NonlinearFrustumMap',['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a034267f27dbcdade97adeba2b40b188a',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::NonlinearFrustumMap()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#aa398b18728e56b6c5cdebf2f5386a406',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::NonlinearFrustumMap(const BBoxd &bb, double taper, double depth)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a06277bdf28173349f9f7ff8e9cb5eea7',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::NonlinearFrustumMap(const BBoxd &bb, double taper, double depth, const MapBase::Ptr &secondMap)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#aa0e02e24cc4750f73159c562b35cc104',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::NonlinearFrustumMap(const NonlinearFrustumMap &other)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a617947ab06812ed4ccb1344297daf758',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::NonlinearFrustumMap(const Vec3d &position, const Vec3d &direction, const Vec3d &up, double aspect, double z_near, double depth, Coord::ValueType x_count, Coord::ValueType z_count)']]], + ['nonuniformpointscatter',['NonUniformPointScatter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1NonUniformPointScatter.html#a146b51526e890562ada2161c571504ff',1,'openvdb::v3_2_0::tools::NonUniformPointScatter']]], + ['normalize',['Normalize',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Normalize.html#aedadf453de06c8f0ba24b6694a7246da',1,'openvdb::v3_2_0::tools::Normalize::Normalize(const GridT &grid, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Normalize.html#a491b734521db7939cf33446f21551817',1,'openvdb::v3_2_0::tools::Normalize::Normalize(const GridT &grid, const MaskGridType &mask, InterruptT *interrupt=NULL)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ab394010939518b8d240de6cbcd97de3e',1,'openvdb::v3_2_0::math::Quat::normalize()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a2b23e3f21a0e9c4c83a07c16f3e2f132',1,'openvdb::v3_2_0::math::Vec2::normalize()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ae37fa555d3e29bc5ee4b0c813f86f18d',1,'openvdb::v3_2_0::math::Vec3::normalize()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a2b23e3f21a0e9c4c83a07c16f3e2f132',1,'openvdb::v3_2_0::math::Vec4::normalize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a6e084d9731121c25a00947bd847b3f37',1,'openvdb::v3_2_0::tools::LevelSetTracker::normalize(const MaskType *mask)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#acd0de676568888d848beb97dcc53ae47',1,'openvdb::v3_2_0::tools::LevelSetTracker::normalize()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a648cae0f8b75b19c0ad0dc1fa9d50671',1,'openvdb::v3_2_0::tools::LevelSetTracker::normalize(const MaskT *mask)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#af5c0227e6c84797a06542df58c2b564d',1,'openvdb::v3_2_0::tools::normalize(const GridType &grid, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac1b083e3b964ba0f08ff56bf2d50981e',1,'openvdb::v3_2_0::tools::normalize(const GridType &grid, const MaskT &mask, bool threaded, InterruptT *interrupt)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8d46a44f1c19d00286f8d0a844731863',1,'openvdb::v3_2_0::tools::normalize(const GridType &grid, bool threaded=true)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#acd846ae90792904770779eee713f6616',1,'openvdb::v3_2_0::tools::normalize(const GridType &grid, const MaskT &mask, bool threaded=true)']]], + ['normalizelevelset',['normalizeLevelSet',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1ttls__internal.html#a83d6e46928df810bf0bc44e67cb810a1',1,'openvdb::v3_2_0::tools::ttls_internal']]], + ['normalshader',['NormalShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1NormalShader.html#a4f6ebe79871fa4c47782b78d25ce8e3d',1,'openvdb::v3_2_0::tools::NormalShader::NormalShader()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1NormalShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#a1d7d874dc43fc51ec7cf81ff8263a9ae',1,'openvdb::v3_2_0::tools::NormalShader< Film::RGBA, SamplerType >::NormalShader()']]], + ['normgrad',['normGrad',['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature.html#a72bb6768d5477823764281c923a06540',1,'openvdb::v3_2_0::math::MeanCurvature::normGrad(const MapType &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature.html#a5860b3e423942ad591e4f9deaeff7783',1,'openvdb::v3_2_0::math::MeanCurvature::normGrad(const MapType &map, const StencilT stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01TranslationMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html#aa47365bbc028285b2d3765c2db95db2a',1,'openvdb::v3_2_0::math::MeanCurvature< TranslationMap, DiffScheme2, DiffScheme1 >::normGrad(const TranslationMap &, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01TranslationMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html#a39b91fb5aba8de2f7103d32d1db6dd61',1,'openvdb::v3_2_0::math::MeanCurvature< TranslationMap, DiffScheme2, DiffScheme1 >::normGrad(const TranslationMap &, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01UniformScaleMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html#a14f61ab41806a698e6b9a6167d8a93b0',1,'openvdb::v3_2_0::math::MeanCurvature< UniformScaleMap, DiffScheme2, DiffScheme1 >::normGrad(const UniformScaleMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01UniformScaleMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html#a6291a15ff594b9181baf8f7112378b5b',1,'openvdb::v3_2_0::math::MeanCurvature< UniformScaleMap, DiffScheme2, DiffScheme1 >::normGrad(const UniformScaleMap &map, const StencilT &stencil)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01UniformScaleTranslateMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html#ad6671993d5e59d754def5573ce27f0c9',1,'openvdb::v3_2_0::math::MeanCurvature< UniformScaleTranslateMap, DiffScheme2, DiffScheme1 >::normGrad(const UniformScaleTranslateMap &map, const Accessor &grid, const Coord &ijk)'],['../structopenvdb_1_1v3__2__0_1_1math_1_1MeanCurvature_3_01UniformScaleTranslateMap_00_01DiffScheme2_00_01DiffScheme1_01_4.html#a966ba8b3e4b8604418ef5b5252f1a190',1,'openvdb::v3_2_0::math::MeanCurvature< UniformScaleTranslateMap, DiffScheme2, DiffScheme1 >::normGrad(const UniformScaleTranslateMap &map, const StencilT &stencil)']]], + ['normsqgrad',['normSqGrad',['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#ad7722eb4f94400831c99c088b826ad09',1,'openvdb::v3_2_0::math::GradStencil::normSqGrad()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html#ad7722eb4f94400831c99c088b826ad09',1,'openvdb::v3_2_0::math::WenoStencil::normSqGrad()']]], + ['notimplementederror',['NotImplementedError',['../classopenvdb_1_1v3__2__0_1_1NotImplementedError.html#a9fd1a9c66fa28ec3eb7a1d33007177cf',1,'openvdb::v3_2_0::NotImplementedError::NotImplementedError()'],['../classopenvdb_1_1v3__2__0_1_1NotImplementedError.html#a9564e24795595e63403b7d40b6a049c7',1,'openvdb::v3_2_0::NotImplementedError::NotImplementedError(const std::string &msg)']]], + ['nullinterrupter',['NullInterrupter',['../structopenvdb_1_1v3__2__0_1_1util_1_1NullInterrupter.html#a7a3998c44adf488f9a10905fcf493190',1,'openvdb::v3_2_0::util::NullInterrupter']]], + ['numbackgroundtiles',['numBackgroundTiles',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#aca78cbf1bae9694422702b2f3fb81950',1,'openvdb::v3_2_0::tree::RootNode']]], + ['numbins',['numBins',['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html#a4e13276a5b9a3d97688c688ba554019f',1,'openvdb::v3_2_0::math::Histogram']]], + ['numcachelevels',['numCacheLevels',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a3c00b5ebee5269cfdeaab0c02e39231c',1,'openvdb::v3_2_0::tree::ValueAccessor::numCacheLevels()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a3c00b5ebee5269cfdeaab0c02e39231c',1,'openvdb::v3_2_0::tree::ValueAccessor0::numCacheLevels()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a3c00b5ebee5269cfdeaab0c02e39231c',1,'openvdb::v3_2_0::tree::ValueAccessor1::numCacheLevels()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a3c00b5ebee5269cfdeaab0c02e39231c',1,'openvdb::v3_2_0::tree::ValueAccessor2::numCacheLevels()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a3c00b5ebee5269cfdeaab0c02e39231c',1,'openvdb::v3_2_0::tree::ValueAccessor3::numCacheLevels()']]], + ['numcolumns',['numColumns',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#a452ca1fc00492dece72b9039dd1cac31',1,'openvdb::v3_2_0::math::Mat::numColumns()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a452ca1fc00492dece72b9039dd1cac31',1,'openvdb::v3_2_0::math::Vec2::numColumns()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a452ca1fc00492dece72b9039dd1cac31',1,'openvdb::v3_2_0::math::Vec3::numColumns()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a452ca1fc00492dece72b9039dd1cac31',1,'openvdb::v3_2_0::math::Vec4::numColumns()']]], + ['numelements',['numElements',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#ad0561ec473355048d1b49e9dc900193a',1,'openvdb::v3_2_0::math::Mat::numElements()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ad0561ec473355048d1b49e9dc900193a',1,'openvdb::v3_2_0::math::Quat::numElements()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ad0561ec473355048d1b49e9dc900193a',1,'openvdb::v3_2_0::math::Vec2::numElements()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ad0561ec473355048d1b49e9dc900193a',1,'openvdb::v3_2_0::math::Vec3::numElements()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#ad0561ec473355048d1b49e9dc900193a',1,'openvdb::v3_2_0::math::Vec4::numElements()']]], + ['numiterations',['numIterations',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestPointProjector.html#ac3e52d7cea2caf8be492c0c6f6acb696',1,'openvdb::v3_2_0::tools::ClosestPointProjector']]], + ['numlevels',['numLevels',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a005b95a9208b4877830b0fc0ab5378d5',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['numpixels',['numPixels',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Film.html#a0564952d6e13d44c783cbe20326f2c0a',1,'openvdb::v3_2_0::tools::Film']]], + ['numquads',['numQuads',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#acd2c266f1db1a93f57487795d6d9b858',1,'openvdb::v3_2_0::tools::PolygonPool']]], + ['numrows',['numRows',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a20052c0b048dd2133f34ff3b5433cdbd',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::numRows()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#a54dfa580a5678b5ce1a82c7cec8b9766',1,'openvdb::v3_2_0::math::Mat::numRows()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a54dfa580a5678b5ce1a82c7cec8b9766',1,'openvdb::v3_2_0::math::Vec2::numRows()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a54dfa580a5678b5ce1a82c7cec8b9766',1,'openvdb::v3_2_0::math::Vec3::numRows()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a54dfa580a5678b5ce1a82c7cec8b9766',1,'openvdb::v3_2_0::math::Vec4::numRows()']]], + ['numtriangles',['numTriangles',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#a4cc1fc3b35a4b56d7d09813a962aa2d3',1,'openvdb::v3_2_0::tools::PolygonPool']]], + ['numvalues',['numValues',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a6777fd128d5b36e2ddf572d11bbcf256',1,'openvdb::v3_2_0::tree::LeafNode::numValues()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a6777fd128d5b36e2ddf572d11bbcf256',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::numValues()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a6777fd128d5b36e2ddf572d11bbcf256',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::numValues()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_e.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_e.html new file mode 100644 index 00000000..67226c87 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_e.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_e.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_e.js new file mode 100644 index 00000000..13c68261 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_e.js @@ -0,0 +1,72 @@ +var searchData= +[ + ['offiterator',['OffIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OffIterator.html#a5a888056a21c9317b9d31e061201577d',1,'openvdb::v3_2_0::util::RootNodeMask::OffIterator::OffIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OffIterator.html#a77855a9afa6df1aacb23bef870cd8e2d',1,'openvdb::v3_2_0::util::RootNodeMask::OffIterator::OffIterator(Index32 pos, const RootNodeMask *parent)']]], + ['offleafvoxelcount',['offLeafVoxelCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a78ac72edbf61ebf466b06f6bb4f1ffc6',1,'openvdb::v3_2_0::tree::InternalNode::offLeafVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a78ac72edbf61ebf466b06f6bb4f1ffc6',1,'openvdb::v3_2_0::tree::LeafNode::offLeafVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a78ac72edbf61ebf466b06f6bb4f1ffc6',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::offLeafVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a78ac72edbf61ebf466b06f6bb4f1ffc6',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::offLeafVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a78ac72edbf61ebf466b06f6bb4f1ffc6',1,'openvdb::v3_2_0::tree::RootNode::offLeafVoxelCount()']]], + ['offmaskiterator',['OffMaskIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1OffMaskIterator.html#a4370c2cd07bc10bf400c3af458cfcf2e',1,'openvdb::v3_2_0::util::OffMaskIterator::OffMaskIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1OffMaskIterator.html#a5dbb630dfcfaa2227df73017f434fb52',1,'openvdb::v3_2_0::util::OffMaskIterator::OffMaskIterator(Index32 pos, const NodeMask *parent)']]], + ['offset',['offset',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#aa01a0fa4a62cb4585b0ac0e5db5d5a79',1,'openvdb::v3_2_0::math::Coord::offset(Int32 dx, Int32 dy, Int32 dz)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a397fd90fcb6ac28df7b7f45443ad8127',1,'openvdb::v3_2_0::math::Coord::offset(Int32 n)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#abac6b3b6b2bda7ff44f4cd9c0d775a04',1,'openvdb::v3_2_0::tools::Filter::offset()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#abac6b3b6b2bda7ff44f4cd9c0d775a04',1,'openvdb::v3_2_0::tools::LevelSetFilter::offset()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#a40cf8952b548ef07eb6fd0fa091914c0',1,'openvdb::v3_2_0::tree::IteratorBase::offset()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html#a3a6a6bede646a208af46044270a02747',1,'openvdb::v3_2_0::util::BaseMaskIterator::offset()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#a3a6a6bede646a208af46044270a02747',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::offset()']]], + ['offsetandmincomp',['OffsetAndMinComp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ttls__internal_1_1OffsetAndMinComp.html#a428e707f61ee2883d1d4319ab7ad053a',1,'openvdb::v3_2_0::tools::ttls_internal::OffsetAndMinComp']]], + ['offsetby',['offsetBy',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a4e1bfb7f53c8e565af01ab37cf5bc7c5',1,'openvdb::v3_2_0::math::Coord::offsetBy(Int32 dx, Int32 dy, Int32 dz) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a454eb2f938b1303dced2c1d356248d80',1,'openvdb::v3_2_0::math::Coord::offsetBy(Int32 n) const ']]], + ['offsetsnextx',['offsetsNextX',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html#adbe85880cfc9a2a9da602efd9edf8b96',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::LeafNodeConnectivityTable']]], + ['offsetsnexty',['offsetsNextY',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html#a7398dcf73888b161ad4f89bc90d78402',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::LeafNodeConnectivityTable']]], + ['offsetsnextz',['offsetsNextZ',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html#af9f285ce5b5e6c5834d864d5db73062a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::LeafNodeConnectivityTable']]], + ['offsetsprevx',['offsetsPrevX',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html#a543c64e19bb0fa608f6a06b8f3db1fce',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::LeafNodeConnectivityTable']]], + ['offsetsprevy',['offsetsPrevY',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html#a3005bf63790a1d9a60afa60de72e0388',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::LeafNodeConnectivityTable']]], + ['offsetsprevz',['offsetsPrevZ',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html#a189473d11bce9dca6f59f9c4f556cc9b',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::LeafNodeConnectivityTable']]], + ['offsettocoord',['offsetToCoord',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a5657262321ae0bc8da1ef47ecc16e63e',1,'openvdb::v3_2_0::tools::Dense']]], + ['offsettoglobalcoord',['offsetToGlobalCoord',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a79eb1621afd1bcf8ca45386b04a839bb',1,'openvdb::v3_2_0::tree::InternalNode::offsetToGlobalCoord()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a79eb1621afd1bcf8ca45386b04a839bb',1,'openvdb::v3_2_0::tree::LeafNode::offsetToGlobalCoord()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a79eb1621afd1bcf8ca45386b04a839bb',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::offsetToGlobalCoord()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a79eb1621afd1bcf8ca45386b04a839bb',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::offsetToGlobalCoord()']]], + ['offsettolocalcoord',['offsetToLocalCoord',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutZYX_01_4.html#a185a7dc62527f8d54252cc7a443595a8',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutZYX >::offsetToLocalCoord()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutXYZ_01_4.html#a185a7dc62527f8d54252cc7a443595a8',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutXYZ >::offsetToLocalCoord()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#addacd0d833277c846d6c519fc3a46c68',1,'openvdb::v3_2_0::tree::InternalNode::offsetToLocalCoord()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a0780d59f892d82bf5fab713b6991a9ce',1,'openvdb::v3_2_0::tree::LeafNode::offsetToLocalCoord()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a0780d59f892d82bf5fab713b6991a9ce',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::offsetToLocalCoord()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a0780d59f892d82bf5fab713b6991a9ce',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::offsetToLocalCoord()']]], + ['offsetvalues',['OffsetValues',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1OffsetValues.html#a9657f7176d1e398f6236e6c4ac72140e',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::OffsetValues']]], + ['offtilecount',['offTileCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a8907e9fc37d18f869f928ee7906da0c6',1,'openvdb::v3_2_0::tree::LeafNode::offTileCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a8907e9fc37d18f869f928ee7906da0c6',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::offTileCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a8907e9fc37d18f869f928ee7906da0c6',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::offTileCount()']]], + ['offvoxelcount',['offVoxelCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a22486b1420a67aaf492e7e4ca2ca6fb6',1,'openvdb::v3_2_0::tree::InternalNode::offVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a22486b1420a67aaf492e7e4ca2ca6fb6',1,'openvdb::v3_2_0::tree::LeafNode::offVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a22486b1420a67aaf492e7e4ca2ca6fb6',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::offVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a22486b1420a67aaf492e7e4ca2ca6fb6',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::offVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a22486b1420a67aaf492e7e4ca2ca6fb6',1,'openvdb::v3_2_0::tree::RootNode::offVoxelCount()']]], + ['oniterator',['OnIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OnIterator.html#a14ec0457cc69b58b5702402610536a8d',1,'openvdb::v3_2_0::util::RootNodeMask::OnIterator::OnIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OnIterator.html#ab8bc3f2e10dde61889aea4d0a48b4b9e',1,'openvdb::v3_2_0::util::RootNodeMask::OnIterator::OnIterator(Index32 pos, const RootNodeMask *parent)']]], + ['onleafvoxelcount',['onLeafVoxelCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#abe2ccd641ba4842769eb649c856d05b9',1,'openvdb::v3_2_0::tree::InternalNode::onLeafVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#abe2ccd641ba4842769eb649c856d05b9',1,'openvdb::v3_2_0::tree::LeafNode::onLeafVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#abe2ccd641ba4842769eb649c856d05b9',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::onLeafVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#abe2ccd641ba4842769eb649c856d05b9',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::onLeafVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#abe2ccd641ba4842769eb649c856d05b9',1,'openvdb::v3_2_0::tree::RootNode::onLeafVoxelCount()']]], + ['onmaskiterator',['OnMaskIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1OnMaskIterator.html#ae0b0082295385bfd8050e6c47298a0c2',1,'openvdb::v3_2_0::util::OnMaskIterator::OnMaskIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1OnMaskIterator.html#a99dc046c8ea356aee7de91310ec65d53',1,'openvdb::v3_2_0::util::OnMaskIterator::OnMaskIterator(Index32 pos, const NodeMask *parent)']]], + ['ontilecount',['onTileCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ad8c7f5922acf9662196a81ec4470aedd',1,'openvdb::v3_2_0::tree::InternalNode::onTileCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a060eb262f663c1f12224ede7b83d78c4',1,'openvdb::v3_2_0::tree::LeafNode::onTileCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a060eb262f663c1f12224ede7b83d78c4',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::onTileCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a060eb262f663c1f12224ede7b83d78c4',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::onTileCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ad8c7f5922acf9662196a81ec4470aedd',1,'openvdb::v3_2_0::tree::RootNode::onTileCount()']]], + ['onvoxelcount',['onVoxelCount',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ae41639979a334066f76633037c605a77',1,'openvdb::v3_2_0::tree::InternalNode::onVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ae41639979a334066f76633037c605a77',1,'openvdb::v3_2_0::tree::LeafNode::onVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ae41639979a334066f76633037c605a77',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::onVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ae41639979a334066f76633037c605a77',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::onVoxelCount()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ae41639979a334066f76633037c605a77',1,'openvdb::v3_2_0::tree::RootNode::onVoxelCount()']]], + ['opaccumulator',['OpAccumulator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1OpAccumulator.html#a467c5e2b847ca314de0d2eecdd16144b',1,'openvdb::v3_2_0::tools::valxform::OpAccumulator::OpAccumulator(const IterT &iter, OpT &op)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1OpAccumulator.html#a71c6cb5d781ca8c740c65e9804ee706e',1,'openvdb::v3_2_0::tools::valxform::OpAccumulator::OpAccumulator(OpAccumulator &other, tbb::split)']]], + ['open',['open',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#ab9e653cf43c03bbfe0decd34494892ca',1,'openvdb::v3_2_0::io::File']]], + ['operator_20bool',['operator bool',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::math::BBox::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1ConstValueIter.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::ConstValueIter::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox_1_1Iterator.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::math::CoordBBox::Iterator::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::math::CoordBBox::operator bool()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::operator bool()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::tools::PointIndexIterator::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::tree::IteratorBase::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::tree::NodeIteratorBase::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::tree::LeafIteratorBase::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorRange.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::tree::IteratorRange::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::util::BaseMaskIterator::operator bool()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#aa385aa18f5e42db5a415c25a90f4193d',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::operator bool()']]], + ['operator_20const_20t_20_2a',['operator const T *',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#af015545c1c88375a1fff0fd898f0d34e',1,'openvdb::v3_2_0::math::Quat']]], + ['operator_20inttype',['operator IntType',['../structopenvdb_1_1v3__2__0_1_1PointIndex.html#a5a37309c2e6fbc2eae2923f08446fd3a',1,'openvdb::v3_2_0::PointIndex']]], + ['operator_20t_20_2a',['operator T *',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a4e20322854ce5d78776cdaf1a87aacd9',1,'openvdb::v3_2_0::math::Quat']]], + ['operator_21',['operator!',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ad1c03d624d523f3931c833ae5e78b52b',1,'openvdb::v3_2_0::util::NodeMask::operator!()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ad1c03d624d523f3931c833ae5e78b52b',1,'openvdb::v3_2_0::util::NodeMask< 1 >::operator!()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ad1c03d624d523f3931c833ae5e78b52b',1,'openvdb::v3_2_0::util::NodeMask< 2 >::operator!()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a4737924bdaa559fe3f14eba5a8c065d8',1,'openvdb::v3_2_0::util::RootNodeMask::operator!()']]], + ['operator_21_3d',['operator!=',['../classopenvdb_1_1v3__2__0_1_1io_1_1File_1_1NameIterator.html#ad731ea38f82bc7860e8433d848277c51',1,'openvdb::v3_2_0::io::File::NameIterator::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a89e388b14180bed405a8a79515147289',1,'openvdb::v3_2_0::math::BBox::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#ad9e5ec82eff0fda53c118df6e5238e32',1,'openvdb::v3_2_0::math::Coord::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a58e1c19d8f710a140c032df0013e904c',1,'openvdb::v3_2_0::math::CoordBBox::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#af4182351a8514afb9e7e67522eca08e1',1,'openvdb::v3_2_0::math::AffineMap::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#aef40ae86c50b1e10c1dad269496487d9',1,'openvdb::v3_2_0::math::ScaleMap::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#a6a31c78b78ebc140d30c36f8ecc1d356',1,'openvdb::v3_2_0::math::UniformScaleMap::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a7ad4c5c42c645dc90dd5e58603d21b36',1,'openvdb::v3_2_0::math::TranslationMap::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#aef659ece0e1424a8d95ad612dfc73c70',1,'openvdb::v3_2_0::math::ScaleTranslateMap::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#a901caac11b12ab77117021639f89f7d8',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a8e04f29c9cea4dcff8b3649aca6d2154',1,'openvdb::v3_2_0::math::UnitaryMap::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#af341fca5459db88643203d9dd5dc2cb1',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#a9b64e962db3abd01438b76d6385c7545',1,'openvdb::v3_2_0::math::CompoundMap::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a3f0aa5f483c1b26faf9e90b19e41b01b',1,'openvdb::v3_2_0::math::Transform::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ab5c8425b0e68d6ade1af1f5eb6c67e89',1,'openvdb::v3_2_0::math::Vec2::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a48a8614b8bf344ff90eb97546b65e8c2',1,'openvdb::v3_2_0::Metadata::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a6dab276e85d6d39f851627dc2a59f7d4',1,'openvdb::v3_2_0::MetaMap::operator!=()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#aa9de743b41d10fa23ec01eac2fb3a7fb',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::operator!=()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#aaf3d0b0f1b6a05bbfa2e9d06250077ce',1,'openvdb::v3_2_0::tools::PointIndexIterator::operator!=()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ad36e89f6be128b5cbfb838313ea6008c',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#a14acdab1503d84949f8990590036ccfd',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#a29eff03eadeb4d3fef8f68516b3dd11e',1,'openvdb::v3_2_0::tree::IteratorBase::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#a8c6df673280990e664cbf787369ef582',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#ab1cf65525fdc5fcfed175ca83afbe5d9',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ab2435a9d5ed7aff17a894950d296e070',1,'openvdb::v3_2_0::tree::LeafNode::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#ab1cf65525fdc5fcfed175ca83afbe5d9',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aede954bfcde9f04fd10627324cc528be',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#ab1cf65525fdc5fcfed175ca83afbe5d9',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aede954bfcde9f04fd10627324cc528be',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#a8c6df673280990e664cbf787369ef582',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a959590aa97e5f65a585a3c0a5ff6375f',1,'openvdb::v3_2_0::tree::Tree::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html#ad9ff37fe97916e12f1dd3837625ab526',1,'openvdb::v3_2_0::util::BaseMaskIterator::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a0d9fa5484e29c67516f279af02832f9b',1,'openvdb::v3_2_0::util::NodeMask::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a0d9fa5484e29c67516f279af02832f9b',1,'openvdb::v3_2_0::util::NodeMask< 1 >::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a0d9fa5484e29c67516f279af02832f9b',1,'openvdb::v3_2_0::util::NodeMask< 2 >::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#a61e196cdfb06bb5f8872b73924542217',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a3dfc951161e78be4395f68474be1fa2d',1,'openvdb::v3_2_0::util::RootNodeMask::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#af2589a4ffc907771127419cd41a33dcb',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a8c6df673280990e664cbf787369ef582',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a1b96b467feb95a206a604818a079be80',1,'openvdb::v3_2_0::math::Mat3::operator!=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#ab6fc63084c691d2dab40d617ea6651ca',1,'openvdb::v3_2_0::math::Mat4::operator!=()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a11cf47180047164e5a58f4544dbf6bb4',1,'openvdb::v3_2_0::math::operator!=(const Vec3< T0 > &v0, const Vec3< T1 > &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab06c7c478c16261c5890d6a6bc5f89c9',1,'openvdb::v3_2_0::math::operator!=(const Vec4< T0 > &v0, const Vec4< T1 > &v1)']]], + ['operator_26',['operator&',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#ada52b01155b31f1e74a565e9928b20bf',1,'openvdb::v3_2_0::math::Coord::operator&()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#aa4ba4ee5b2f8066ebb398a6b5d36e6b8',1,'openvdb::v3_2_0::math::CoordBBox::operator&()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a37fffa038bb93361898368d410fcd821',1,'openvdb::v3_2_0::util::NodeMask::operator&()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a37fffa038bb93361898368d410fcd821',1,'openvdb::v3_2_0::util::NodeMask< 1 >::operator&()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a37fffa038bb93361898368d410fcd821',1,'openvdb::v3_2_0::util::NodeMask< 2 >::operator&()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#ad4a426dc0c3bb5d7e0b673d75bb5035e',1,'openvdb::v3_2_0::util::RootNodeMask::operator&()']]], + ['operator_26_3d',['operator&=',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#ace0899d6352cccd9cc453f68f35fd799',1,'openvdb::v3_2_0::math::Coord::operator&=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#ad37a6e54afd41f55937d1d66157c007e',1,'openvdb::v3_2_0::math::CoordBBox::operator&=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#abeacdb85957f00d5ba1805a7081f46c9',1,'openvdb::v3_2_0::util::NodeMask::operator&=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#abeacdb85957f00d5ba1805a7081f46c9',1,'openvdb::v3_2_0::util::NodeMask< 1 >::operator&=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#abeacdb85957f00d5ba1805a7081f46c9',1,'openvdb::v3_2_0::util::NodeMask< 2 >::operator&=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a92f7b922ea0f5aa5882315fdc6c467f1',1,'openvdb::v3_2_0::util::RootNodeMask::operator&=()']]], + ['operator_28_29',['operator()',['../structopenvdb_1_1v3__2__0_1_1GridNamePred.html#afd282c9630283c6d0fa16e65cf1a6821',1,'openvdb::v3_2_0::GridNamePred::operator()()'],['../structopenvdb_1_1v3__2__0_1_1SwappedCombineOp.html#a59279775385d3f45e923bbbf5fd14ed7',1,'openvdb::v3_2_0::SwappedCombineOp::operator()()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#aacf0f35e98dd04febf9c1b428ae7c779',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::operator()()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1CopyOp.html#a70594558a5d2b66b30dd8157882d88e7',1,'openvdb::v3_2_0::math::pcg::internal::CopyOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1FillOp.html#a70594558a5d2b66b30dd8157882d88e7',1,'openvdb::v3_2_0::math::pcg::internal::FillOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1LinearOp.html#a70594558a5d2b66b30dd8157882d88e7',1,'openvdb::v3_2_0::math::pcg::internal::LinearOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1DeterministicDotProductOp.html#a70594558a5d2b66b30dd8157882d88e7',1,'openvdb::v3_2_0::math::pcg::Vector::DeterministicDotProductOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1InfNormOp.html#a88765d3a82417a34b4dcb14b14687514',1,'openvdb::v3_2_0::math::pcg::Vector::InfNormOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1IsFiniteOp.html#a8c710fdfda02c711aebe97145d853f34',1,'openvdb::v3_2_0::math::pcg::Vector::IsFiniteOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1MatrixCopyOp.html#a70594558a5d2b66b30dd8157882d88e7',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::MatrixCopyOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1IsFiniteOp.html#a8c710fdfda02c711aebe97145d853f34',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::IsFiniteOp::operator()()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a8c8ceabc696d63c5c1949706e5f949af',1,'openvdb::v3_2_0::math::Mat3::operator()(int i, int j)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a52f400707bfe09b4abe0f2cc6dac6e74',1,'openvdb::v3_2_0::math::Mat3::operator()(int i, int j) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a8c8ceabc696d63c5c1949706e5f949af',1,'openvdb::v3_2_0::math::Mat4::operator()(int i, int j)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a52f400707bfe09b4abe0f2cc6dac6e74',1,'openvdb::v3_2_0::math::Mat4::operator()(int i, int j) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Rand01.html#a72e333a0205ea074b388ef83727c8960',1,'openvdb::v3_2_0::math::Rand01::operator()()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1RandInt.html#a51b68caa26bd35621916edcf08af6b1f',1,'openvdb::v3_2_0::math::RandInt::operator()()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1RandInt.html#ae2c5638d9d44fa42f045913b43b0311d',1,'openvdb::v3_2_0::math::RandInt::operator()(IntType imin, IntType imax)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#adce494aef973cb47c29682e6e99dbc56',1,'openvdb::v3_2_0::math::Quat::operator()(int i)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ad0e4e848d2b4ddc9f50872e020ed3f2b',1,'openvdb::v3_2_0::math::Quat::operator()(int i) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#afaf6d5f6f5a6accd065787f4d65ef7e9',1,'openvdb::v3_2_0::math::Ray::operator()()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#adce494aef973cb47c29682e6e99dbc56',1,'openvdb::v3_2_0::math::Vec2::operator()(int i)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ad0e4e848d2b4ddc9f50872e020ed3f2b',1,'openvdb::v3_2_0::math::Vec2::operator()(int i) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#adce494aef973cb47c29682e6e99dbc56',1,'openvdb::v3_2_0::math::Vec3::operator()(int i)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ad0e4e848d2b4ddc9f50872e020ed3f2b',1,'openvdb::v3_2_0::math::Vec3::operator()(int i) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#adce494aef973cb47c29682e6e99dbc56',1,'openvdb::v3_2_0::math::Vec4::operator()(int i)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#ad0e4e848d2b4ddc9f50872e020ed3f2b',1,'openvdb::v3_2_0::math::Vec4::operator()(int i) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeBackgroundOp.html#a45e16956bbe5cbfb5c7f6e71e7696187',1,'openvdb::v3_2_0::tools::ChangeBackgroundOp::operator()(RootT &root) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeBackgroundOp.html#a13593e8b1a097836618fa1b804a9d229',1,'openvdb::v3_2_0::tools::ChangeBackgroundOp::operator()(LeafT &node) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeBackgroundOp.html#ae1f5ed28c41182784d3730246694abea',1,'openvdb::v3_2_0::tools::ChangeBackgroundOp::operator()(NodeT &node) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeLevelSetBackgroundOp.html#a45e16956bbe5cbfb5c7f6e71e7696187',1,'openvdb::v3_2_0::tools::ChangeLevelSetBackgroundOp::operator()(RootT &root) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeLevelSetBackgroundOp.html#a13593e8b1a097836618fa1b804a9d229',1,'openvdb::v3_2_0::tools::ChangeLevelSetBackgroundOp::operator()(LeafT &node) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeLevelSetBackgroundOp.html#ae1f5ed28c41182784d3730246694abea',1,'openvdb::v3_2_0::tools::ChangeLevelSetBackgroundOp::operator()(NodeT &node) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1MaskInteriorVoxels.html#addf70f6c2ad52e155e55d8019aea7696',1,'openvdb::v3_2_0::tools::clip_internal::MaskInteriorVoxels::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1CopyLeafNodes.html#ad6b1ade4989f783bd95d99185c8d8f4a',1,'openvdb::v3_2_0::tools::clip_internal::CopyLeafNodes::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1ConvertGrid.html#a10f2c5a2677278e33187e70cc1d2a35c',1,'openvdb::v3_2_0::tools::clip_internal::ConvertGrid::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1ConvertGrid_3_01GridT_00_01GridT_01_4.html#a51d9c6d1c3a463279e38a5ea085b1da6',1,'openvdb::v3_2_0::tools::clip_internal::ConvertGrid< GridT, GridT >::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildPrimarySegment.html#a3ca27034df6644c0a57e145dfbc72613',1,'openvdb::v3_2_0::tools::composite::BuildPrimarySegment::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildSecondarySegment.html#a3ca27034df6644c0a57e145dfbc72613',1,'openvdb::v3_2_0::tools::composite::BuildSecondarySegment::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CompReplaceOp.html#a8730cfdf672ddfa8df0b5fcb97fdd12e',1,'openvdb::v3_2_0::tools::CompReplaceOp::operator()(const typename TreeT::ValueOnCIter &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CompReplaceOp.html#accd3c4b8b4c0fef2b6ba71956fe024b5',1,'openvdb::v3_2_0::tools::CompReplaceOp::operator()(const typename TreeT::LeafCIter &leafIter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgUnionVisitor.html#a3287046d8080bbff842ea83190d824dc',1,'openvdb::v3_2_0::tools::CsgUnionVisitor::operator()(AIterT &, BIterT &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgUnionVisitor.html#a78629ce4e4e3d34a530c8ca05d0a9787',1,'openvdb::v3_2_0::tools::CsgUnionVisitor::operator()(IterT &aIter, IterT &bIter)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgUnionVisitor.html#a3fd0588fd3783a1ab7cbfab3524df02e',1,'openvdb::v3_2_0::tools::CsgUnionVisitor::operator()(ChildIterT &aIter, ChildIterT &bIter)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgIntersectVisitor.html#a3287046d8080bbff842ea83190d824dc',1,'openvdb::v3_2_0::tools::CsgIntersectVisitor::operator()(AIterT &, BIterT &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgIntersectVisitor.html#a78629ce4e4e3d34a530c8ca05d0a9787',1,'openvdb::v3_2_0::tools::CsgIntersectVisitor::operator()(IterT &aIter, IterT &bIter)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgIntersectVisitor.html#a3fd0588fd3783a1ab7cbfab3524df02e',1,'openvdb::v3_2_0::tools::CsgIntersectVisitor::operator()(ChildIterT &aIter, ChildIterT &bIter)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgDiffVisitor.html#a3287046d8080bbff842ea83190d824dc',1,'openvdb::v3_2_0::tools::CsgDiffVisitor::operator()(AIterT &, BIterT &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgDiffVisitor.html#a78629ce4e4e3d34a530c8ca05d0a9787',1,'openvdb::v3_2_0::tools::CsgDiffVisitor::operator()(IterT &aIter, IterT &bIter)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgDiffVisitor.html#a3fd0588fd3783a1ab7cbfab3524df02e',1,'openvdb::v3_2_0::tools::CsgDiffVisitor::operator()(ChildIterT &aIter, ChildIterT &bIter)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyToDense.html#ac6f1be3197a00b75d474be1652e5d61e',1,'openvdb::v3_2_0::tools::CopyToDense::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyFromDense.html#a8e3d01c07ed0cfc820050e4e43e39307',1,'openvdb::v3_2_0::tools::CopyFromDense::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#a63e264c67f7b3f7a7a58d2d86c856b04',1,'openvdb::v3_2_0::tools::SparseExtractor::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ExtractAll.html#a67ec018dbfb5f53f53b400de16adb9ca',1,'openvdb::v3_2_0::tools::ExtractAll::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseTransformer.html#a2695ba889acb169f0e7cc2bf17f37151',1,'openvdb::v3_2_0::tools::DenseTransformer::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#a4b2a0005a957c56761a791a7b150d914',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor::operator()(const MaskLeafT &maskLeaf, size_t) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#a6a071f315936181b62c6ccf686b67e76',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor::operator()(const Range3d &range) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNan.html#a57250505f7f6f1ba83f3d237a071128d',1,'openvdb::v3_2_0::tools::CheckNan::operator()(const ElementType &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNan.html#ae18c14600b4c2d664f22691f61d8385f',1,'openvdb::v3_2_0::tools::CheckNan::operator()(const T &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNan.html#a04986e385f35b8f1d6d9ef739b7ddf1f',1,'openvdb::v3_2_0::tools::CheckNan::operator()(const TreeIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNan.html#a985e64420b68db1b91d44c9fc347db7d',1,'openvdb::v3_2_0::tools::CheckNan::operator()(const VoxelIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckInf.html#a57250505f7f6f1ba83f3d237a071128d',1,'openvdb::v3_2_0::tools::CheckInf::operator()(const ElementType &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckInf.html#ae18c14600b4c2d664f22691f61d8385f',1,'openvdb::v3_2_0::tools::CheckInf::operator()(const T &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckInf.html#a04986e385f35b8f1d6d9ef739b7ddf1f',1,'openvdb::v3_2_0::tools::CheckInf::operator()(const TreeIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckInf.html#a985e64420b68db1b91d44c9fc347db7d',1,'openvdb::v3_2_0::tools::CheckInf::operator()(const VoxelIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckFinite.html#a57250505f7f6f1ba83f3d237a071128d',1,'openvdb::v3_2_0::tools::CheckFinite::operator()(const ElementType &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckFinite.html#ae18c14600b4c2d664f22691f61d8385f',1,'openvdb::v3_2_0::tools::CheckFinite::operator()(const T &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckFinite.html#a04986e385f35b8f1d6d9ef739b7ddf1f',1,'openvdb::v3_2_0::tools::CheckFinite::operator()(const TreeIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckFinite.html#a985e64420b68db1b91d44c9fc347db7d',1,'openvdb::v3_2_0::tools::CheckFinite::operator()(const VoxelIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMagnitude.html#a57250505f7f6f1ba83f3d237a071128d',1,'openvdb::v3_2_0::tools::CheckMagnitude::operator()(const ElementType &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMagnitude.html#ae18c14600b4c2d664f22691f61d8385f',1,'openvdb::v3_2_0::tools::CheckMagnitude::operator()(const T &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMagnitude.html#a04986e385f35b8f1d6d9ef739b7ddf1f',1,'openvdb::v3_2_0::tools::CheckMagnitude::operator()(const TreeIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMagnitude.html#a985e64420b68db1b91d44c9fc347db7d',1,'openvdb::v3_2_0::tools::CheckMagnitude::operator()(const VoxelIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckRange.html#a57250505f7f6f1ba83f3d237a071128d',1,'openvdb::v3_2_0::tools::CheckRange::operator()(const ElementType &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckRange.html#ae18c14600b4c2d664f22691f61d8385f',1,'openvdb::v3_2_0::tools::CheckRange::operator()(const T &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckRange.html#a04986e385f35b8f1d6d9ef739b7ddf1f',1,'openvdb::v3_2_0::tools::CheckRange::operator()(const TreeIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckRange.html#a985e64420b68db1b91d44c9fc347db7d',1,'openvdb::v3_2_0::tools::CheckRange::operator()(const VoxelIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMin.html#a57250505f7f6f1ba83f3d237a071128d',1,'openvdb::v3_2_0::tools::CheckMin::operator()(const ElementType &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMin.html#ae18c14600b4c2d664f22691f61d8385f',1,'openvdb::v3_2_0::tools::CheckMin::operator()(const T &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMin.html#a04986e385f35b8f1d6d9ef739b7ddf1f',1,'openvdb::v3_2_0::tools::CheckMin::operator()(const TreeIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMin.html#a985e64420b68db1b91d44c9fc347db7d',1,'openvdb::v3_2_0::tools::CheckMin::operator()(const VoxelIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMax.html#a57250505f7f6f1ba83f3d237a071128d',1,'openvdb::v3_2_0::tools::CheckMax::operator()(const ElementType &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMax.html#ae18c14600b4c2d664f22691f61d8385f',1,'openvdb::v3_2_0::tools::CheckMax::operator()(const T &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMax.html#a04986e385f35b8f1d6d9ef739b7ddf1f',1,'openvdb::v3_2_0::tools::CheckMax::operator()(const TreeIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMax.html#a985e64420b68db1b91d44c9fc347db7d',1,'openvdb::v3_2_0::tools::CheckMax::operator()(const VoxelIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#a66a68e890f02f21bdc10dcf27aa388a1',1,'openvdb::v3_2_0::tools::CheckNormGrad::operator()(const ValueType &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#a741c1faff3a670224b3bfe2d42d8f301',1,'openvdb::v3_2_0::tools::CheckNormGrad::operator()(const TreeIterT &) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#a985e64420b68db1b91d44c9fc347db7d',1,'openvdb::v3_2_0::tools::CheckNormGrad::operator()(const VoxelIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#a66a68e890f02f21bdc10dcf27aa388a1',1,'openvdb::v3_2_0::tools::CheckEikonal::operator()(const ValueType &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#a741c1faff3a670224b3bfe2d42d8f301',1,'openvdb::v3_2_0::tools::CheckEikonal::operator()(const TreeIterT &) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#a985e64420b68db1b91d44c9fc347db7d',1,'openvdb::v3_2_0::tools::CheckEikonal::operator()(const VoxelIterT &iter) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#a57250505f7f6f1ba83f3d237a071128d',1,'openvdb::v3_2_0::tools::CheckDivergence::operator()(const ElementType &v) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#a741c1faff3a670224b3bfe2d42d8f301',1,'openvdb::v3_2_0::tools::CheckDivergence::operator()(const TreeIterT &) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#a985e64420b68db1b91d44c9fc347db7d',1,'openvdb::v3_2_0::tools::CheckDivergence::operator()(const VoxelIterT &iter) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveVoxelValues.html#ad6b1ade4989f783bd95d99185c8d8f4a',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveVoxelValues::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveTileValues.html#a9f9d607b5947cffbbf7943011dc4a741',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveTileValues::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a2695ba889acb169f0e7cc2bf17f37151',1,'openvdb::v3_2_0::tools::Filter::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html#a344bc988a2b07b9f463f4ef2b9db7043',1,'openvdb::v3_2_0::tools::gridop::GridOperator::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Divergence_1_1Functor.html#a1424bc766170676bbac147c2a81f8ec0',1,'openvdb::v3_2_0::tools::Divergence::Functor::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Gradient_1_1Functor.html#a1424bc766170676bbac147c2a81f8ec0',1,'openvdb::v3_2_0::tools::Gradient::Functor::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian_1_1Functor.html#a1424bc766170676bbac147c2a81f8ec0',1,'openvdb::v3_2_0::tools::Laplacian::Functor::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature_1_1Functor.html#a1424bc766170676bbac147c2a81f8ec0',1,'openvdb::v3_2_0::tools::MeanCurvature::Functor::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude_1_1Functor.html#a1424bc766170676bbac147c2a81f8ec0',1,'openvdb::v3_2_0::tools::Magnitude::Functor::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Normalize_1_1Functor.html#a1424bc766170676bbac147c2a81f8ec0',1,'openvdb::v3_2_0::tools::Normalize::Functor::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler.html#a001957a4aac16be9ead6766fff314145',1,'openvdb::v3_2_0::tools::DualGridSampler::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerT_01_4.html#a001957a4aac16be9ead6766fff314145',1,'openvdb::v3_2_0::tools::DualGridSampler< tree::ValueAccessor< TreeT >, SamplerT >::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#ae5992863e8fdf13ecb37765222d3110c',1,'openvdb::v3_2_0::tools::AlphaMask::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter_1_1Filter_1_1Avg.html#a98c29532afc34180783d5f045fd1cbb4',1,'openvdb::v3_2_0::tools::LevelSetFilter::Filter::Avg::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__fracture__internal_1_1FindMinMaxVoxelValue.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::level_set_fracture_internal::FindMinMaxVoxelValue::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiracDelta.html#a0b91f4e08854f5c5aec5455de2f4607f',1,'openvdb::v3_2_0::tools::DiracDelta::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PointListTransform.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::internal::PointListTransform::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PrimCpy.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::internal::PrimCpy::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorVoxels.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorVoxels::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorTiles.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorTiles::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1PopulateTree.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::level_set_util_internal::PopulateTree::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1LabelBoundaryVoxels.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::LabelBoundaryVoxels::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FlipRegionSign.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::FlipRegionSign::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinVoxelValue.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinVoxelValue::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinTileValue.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinTileValue::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SDFVoxelsToFogVolume.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::SDFVoxelsToFogVolume::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SDFTilesToFogVolume.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::SDFTilesToFogVolume::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillMaskBoundary.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillMaskBoundary::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskIsovalueCrossingVoxels.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskIsovalueCrossingVoxels::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SegmentNodeMask.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::SegmentNodeMask::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ConnectNodeMaskSegments.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::ConnectNodeMaskSegments::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskSegmentGroup.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskSegmentGroup::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandLeafNodeRegion.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandLeafNodeRegion::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillLeafNodeVoxels.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillLeafNodeVoxels::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandNarrowbandMask.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandNarrowbandMask::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FloodFillSign.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::FloodFillSign::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskedCopy.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskedCopy::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ComputeActiveVoxelCount.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::level_set_util_internal::ComputeActiveVoxelCount::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GreaterCount.html#a4ad0421e425d69339f8f89dc25e4d8ce',1,'openvdb::v3_2_0::tools::level_set_util_internal::GreaterCount::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1TransformPoints.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::TransformPoints::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1CombineLeafNodes.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::CombineLeafNodes::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1StashOriginAndStoreOffset.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::StashOriginAndStoreOffset::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RestoreOrigin.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RestoreOrigin::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeNodeConnectivity.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ComputeNodeConnectivity::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SweepExteriorSign.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SweepExteriorSign::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedFillExteriorSign.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedFillExteriorSign::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1FillArray.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::FillArray::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SyncVoxelMask.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SyncVoxelMask::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedPoints::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeIntersectingVoxelSign.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ComputeIntersectingVoxelSign::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ValidateIntersectingVoxels.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ValidateIntersectingVoxels::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RemoveSelfIntersectingSurface.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RemoveSelfIntersectingSurface::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ReleaseChildNodes.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ReleaseChildNodes::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1StealUniqueLeafNodes.html#a3ca27034df6644c0a57e145dfbc72613',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::StealUniqueLeafNodes::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizePolygons.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizePolygons::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1DiffLeafNodeMask.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::DiffLeafNodeMask::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1UnionValueMasks.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::UnionValueMasks::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ConstructVoxelMask.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ConstructVoxelMask::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1AddNodes.html#a3ca27034df6644c0a57e145dfbc72613',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::AddNodes::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1TransformValues.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::TransformValues::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1InactivateValues.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::InactivateValues::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1OffsetValues.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::OffsetValues::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1Renormalize.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::Renormalize::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1MinCombine.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::MinCombine::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1GenEdgeData.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::GenEdgeData::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1ErodeVoxelsOp.html#a65781f4ff82f1267c1d4c99b5b9b66cf',1,'openvdb::v3_2_0::tools::Morphology::ErodeVoxelsOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1MaskManager.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::Morphology::MaskManager::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1UpdateMasks.html#a8e3d01c07ed0cfc820050e4e43e39307',1,'openvdb::v3_2_0::tools::Morphology::UpdateMasks::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1CopyMasks.html#a8e3d01c07ed0cfc820050e4e43e39307',1,'openvdb::v3_2_0::tools::Morphology::CopyMasks::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1activation_1_1ActivationOp.html#a1d0397a159289d339286bec39049d217',1,'openvdb::v3_2_0::tools::activation::ActivationOp::operator()(const typename TreeType::ValueOnIter &it) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1activation_1_1ActivationOp.html#ae479a1e413badeffb302cf8a60ab82b3',1,'openvdb::v3_2_0::tools::activation::ActivationOp::operator()(const typename TreeType::ValueOffIter &it) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1activation_1_1ActivationOp.html#a4cfbb89bbdc7d51be4b56a3ffa0ccd21',1,'openvdb::v3_2_0::tools::activation::ActivationOp::operator()(const typename TreeType::LeafIter &lit) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DilationOp.html#a0dd2104bc82c7b0e8644d381fd2eb0f8',1,'openvdb::v3_2_0::tools::DilationOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1MaskOp.html#a48af7dca4ffa67b1db6e3bf1fe2b8312',1,'openvdb::v3_2_0::tools::MultiResGrid::MaskOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1ComputeExtremas.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::particle_atlas_internal::ComputeExtremas::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RemapIndices.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::particle_atlas_internal::RemapIndices::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::PointAdvect::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1ValidPartitioningOp.html#a139cc413e962180c1171a851b1ea2d82',1,'openvdb::v3_2_0::tools::point_index_grid_internal::ValidPartitioningOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1PopulateLeafNodesOp.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::point_index_grid_internal::PopulateLeafNodesOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid_1_1ReducePool.html#a8590a7fd0babb5affc029945e2ca93f2',1,'openvdb::v3_2_0::tools::PointMaskGrid::ReducePool::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1ComputePointOrderOp.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::point_partitioner_internal::ComputePointOrderOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1CreateOrderedPointIndexArrayOp.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::point_partitioner_internal::CreateOrderedPointIndexArrayOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1VoxelOrderOp.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::point_partitioner_internal::VoxelOrderOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1LeafNodeOriginOp.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::point_partitioner_internal::LeafNodeOriginOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MoveSegmentDataOp.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MoveSegmentDataOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MergeBinsOp.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MergeBinsOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1OrderSegmentsOp.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::point_partitioner_internal::OrderSegmentsOp::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1UniformPointScatter.html#ac0e0546d8df4f8666b5f744f24b61598',1,'openvdb::v3_2_0::tools::UniformPointScatter::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseUniformPointScatter.html#ac0e0546d8df4f8666b5f744f24b61598',1,'openvdb::v3_2_0::tools::DenseUniformPointScatter::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1NonUniformPointScatter.html#ac0e0546d8df4f8666b5f744f24b61598',1,'openvdb::v3_2_0::tools::NonUniformPointScatter::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1LeafCountOp.html#a99e83f626900952369798ef653da027e',1,'openvdb::v3_2_0::tools::poisson::internal::LeafCountOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1LeafIndexOp.html#aa29f38f727f0b484818db1c326c4bcaf',1,'openvdb::v3_2_0::tools::poisson::internal::LeafIndexOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyToVecOp.html#a3f13cff3dad5f7a0f5f07f56ac64dab4',1,'openvdb::v3_2_0::tools::poisson::internal::CopyToVecOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyFromVecOp.html#a3f13cff3dad5f7a0f5f07f56ac64dab4',1,'openvdb::v3_2_0::tools::poisson::internal::CopyFromVecOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1DirichletOp.html#a44787a05ab39eb89d39fae1b585d7e7d',1,'openvdb::v3_2_0::tools::poisson::internal::DirichletOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1ISLaplacianOp.html#a3f13cff3dad5f7a0f5f07f56ac64dab4',1,'openvdb::v3_2_0::tools::poisson::internal::ISLaplacianOp::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1InactivePruneOp.html#a0063eb96b185ab4be93954864d5f91b0',1,'openvdb::v3_2_0::tools::InactivePruneOp::operator()(LeafT &) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1InactivePruneOp.html#ae1f5ed28c41182784d3730246694abea',1,'openvdb::v3_2_0::tools::InactivePruneOp::operator()(NodeT &node) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1InactivePruneOp.html#a45e16956bbe5cbfb5c7f6e71e7696187',1,'openvdb::v3_2_0::tools::InactivePruneOp::operator()(RootT &root) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1TolerancePruneOp.html#a45e16956bbe5cbfb5c7f6e71e7696187',1,'openvdb::v3_2_0::tools::TolerancePruneOp::operator()(RootT &root) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1TolerancePruneOp.html#ae1f5ed28c41182784d3730246694abea',1,'openvdb::v3_2_0::tools::TolerancePruneOp::operator()(NodeT &node) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1TolerancePruneOp.html#a0063eb96b185ab4be93954864d5f91b0',1,'openvdb::v3_2_0::tools::TolerancePruneOp::operator()(LeafT &) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetPruneOp.html#a0063eb96b185ab4be93954864d5f91b0',1,'openvdb::v3_2_0::tools::LevelSetPruneOp::operator()(LeafT &) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetPruneOp.html#ae1f5ed28c41182784d3730246694abea',1,'openvdb::v3_2_0::tools::LevelSetPruneOp::operator()(NodeT &node) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetPruneOp.html#a45e16956bbe5cbfb5c7f6e71e7696187',1,'openvdb::v3_2_0::tools::LevelSetPruneOp::operator()(RootT &root) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::LevelSetRayTracer::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::VolumeRender::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseShader.html#a638bffd471802ef321f8c95087f0682e',1,'openvdb::v3_2_0::tools::BaseShader::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MatteShader.html#a225b39f7a269aca826a1f41431c1a1d2',1,'openvdb::v3_2_0::tools::MatteShader::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MatteShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#af47f9c1997335deb9977b37236bd7c27',1,'openvdb::v3_2_0::tools::MatteShader< Film::RGBA, SamplerType >::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1NormalShader.html#a7431a14e8637855f3601ab67487f3df8',1,'openvdb::v3_2_0::tools::NormalShader::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1NormalShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#a194c5249ca8960eb6f1ff69c743ab9bd',1,'openvdb::v3_2_0::tools::NormalShader< Film::RGBA, SamplerType >::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PositionShader.html#a225b39f7a269aca826a1f41431c1a1d2',1,'openvdb::v3_2_0::tools::PositionShader::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PositionShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#a225b39f7a269aca826a1f41431c1a1d2',1,'openvdb::v3_2_0::tools::PositionShader< Film::RGBA, SamplerType >::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiffuseShader.html#ab3faef4e0a74e29ce19485cea03fc1d4',1,'openvdb::v3_2_0::tools::DiffuseShader::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiffuseShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#a7b2caefe81e1b8a49105f75b4bc28540',1,'openvdb::v3_2_0::tools::DiffuseShader< Film::RGBA, SamplerType >::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SignedFloodFillOp.html#abc80a0c613395cdc62d75e988aff356f',1,'openvdb::v3_2_0::tools::SignedFloodFillOp::operator()(LeafT &leaf) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SignedFloodFillOp.html#ae1f5ed28c41182784d3730246694abea',1,'openvdb::v3_2_0::tools::SignedFloodFillOp::operator()(NodeT &node) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SignedFloodFillOp.html#a45e16956bbe5cbfb5c7f6e71e7696187',1,'openvdb::v3_2_0::tools::SignedFloodFillOp::operator()(RootT &root) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1GetVal.html#ace4d6f46ef543010e33756b8d6a6e08e',1,'openvdb::v3_2_0::tools::stats_internal::GetVal::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1StatsOp.html#a19d0e346d3589cfcd45168275e0a7aa4',1,'openvdb::v3_2_0::tools::stats_internal::StatsOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1HistOp.html#a19d0e346d3589cfcd45168275e0a7aa4',1,'openvdb::v3_2_0::tools::stats_internal::HistOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1MathOp.html#ad29b7c8264935700b9183f2fee447972',1,'openvdb::v3_2_0::tools::stats_internal::MathOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ttls__internal_1_1OffsetAndMinComp.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::ttls_internal::OffsetAndMinComp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1MinOp.html#abbf28485b26b972edbb5e24281423303',1,'openvdb::v3_2_0::tools::valxform::MinOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1MaxOp.html#abbf28485b26b972edbb5e24281423303',1,'openvdb::v3_2_0::tools::valxform::MaxOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SumOp.html#abbf28485b26b972edbb5e24281423303',1,'openvdb::v3_2_0::tools::valxform::SumOp::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1MultOp.html#abbf28485b26b972edbb5e24281423303',1,'openvdb::v3_2_0::tools::valxform::MultOp::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpApplier.html#a70faa237b9ab17dd3cf38b978f850a34',1,'openvdb::v3_2_0::tools::valxform::SharedOpApplier::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpApplier.html#a70faa237b9ab17dd3cf38b978f850a34',1,'openvdb::v3_2_0::tools::valxform::CopyableOpApplier::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpTransformer.html#a1e2a84509e672c74f4afba484efde31d',1,'openvdb::v3_2_0::tools::valxform::SharedOpTransformer::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpTransformer.html#a62ac0d182d61dae21671bd16c10ae160',1,'openvdb::v3_2_0::tools::valxform::CopyableOpTransformer::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1OpAccumulator.html#a2fbc4895ec930e032b0c6a7d14ceb054',1,'openvdb::v3_2_0::tools::valxform::OpAccumulator::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1HomogeneousMatMul.html#acaceb3fad0005e8130a71b2e54af7e43',1,'openvdb::v3_2_0::tools::HomogeneousMatMul::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MatMul.html#acaceb3fad0005e8130a71b2e54af7e43',1,'openvdb::v3_2_0::tools::MatMul::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MatMulNormalize.html#acaceb3fad0005e8130a71b2e54af7e43',1,'openvdb::v3_2_0::tools::MatMulNormalize::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiscreteField.html#adaace498ef214e1a9a2881dda506bbdf',1,'openvdb::v3_2_0::tools::DiscreteField::operator()(const Vec3d &xyz, ValueType) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiscreteField.html#a184217ae3991646d17488916603d9c78',1,'openvdb::v3_2_0::tools::DiscreteField::operator()(const Coord &ijk, ValueType) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1EnrightField.html#a73310ed490a1c3dab30b8a4de175e2fd',1,'openvdb::v3_2_0::tools::EnrightField::operator()(const Vec3d &xyz, ValueType time) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1EnrightField.html#a1367246a67d63c5c1bc7f2c5d565cee2',1,'openvdb::v3_2_0::tools::EnrightField::operator()(const Coord &ijk, ValueType time) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#ae152d18af6cedcc024f5d388dd9ab1d5',1,'openvdb::v3_2_0::tools::VolumeToMesh::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#ad6b1ade4989f783bd95d99185c8d8f4a',1,'openvdb::v3_2_0::tools::internal::SignData::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1CountPoints.html#a9606fbf9d4c9c9af5e599c4a08298822',1,'openvdb::v3_2_0::tools::internal::CountPoints::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MapPoints.html#a9606fbf9d4c9c9af5e599c4a08298822',1,'openvdb::v3_2_0::tools::internal::MapPoints::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1CountRegions.html#a9606fbf9d4c9c9af5e599c4a08298822',1,'openvdb::v3_2_0::tools::internal::CountRegions::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPoints.html#ad41b3aed152b59aa8429e47730aea8e5',1,'openvdb::v3_2_0::tools::internal::GenPoints::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SeamWeights.html#abf0e2661d40e48d95cefe9adfec00dd9',1,'openvdb::v3_2_0::tools::internal::SeamWeights::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#ad41b3aed152b59aa8429e47730aea8e5',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPolygons.html#ad41b3aed152b59aa8429e47730aea8e5',1,'openvdb::v3_2_0::tools::internal::GenPolygons::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartOp.html#a9606fbf9d4c9c9af5e599c4a08298822',1,'openvdb::v3_2_0::tools::internal::PartOp::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartGen.html#ad6b1ade4989f783bd95d99185c8d8f4a',1,'openvdb::v3_2_0::tools::internal::PartGen::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenSeamMask.html#ad6b1ade4989f783bd95d99185c8d8f4a',1,'openvdb::v3_2_0::tools::internal::GenSeamMask::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TagSeamEdges.html#addf70f6c2ad52e155e55d8019aea7696',1,'openvdb::v3_2_0::tools::internal::TagSeamEdges::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MaskEdges.html#addf70f6c2ad52e155e55d8019aea7696',1,'openvdb::v3_2_0::tools::internal::MaskEdges::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1FlagUsedPoints.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::internal::FlagUsedPoints::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1RemapIndices.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::internal::RemapIndices::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MovePoints.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::internal::MovePoints::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTopologyMask.html#ad6b1ade4989f783bd95d99185c8d8f4a',1,'openvdb::v3_2_0::tools::internal::GenTopologyMask::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenBoundaryMask.html#ad6b1ade4989f783bd95d99185c8d8f4a',1,'openvdb::v3_2_0::tools::internal::GenBoundaryMask::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTileMask.html#ad6b1ade4989f783bd95d99185c8d8f4a',1,'openvdb::v3_2_0::tools::internal::GenTileMask::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PointListCopy.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tools::internal::PointListCopy::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1LeafBS.html#ad41b3aed152b59aa8429e47730aea8e5',1,'openvdb::v3_2_0::tools::internal::LeafBS::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1NodeBS.html#ad41b3aed152b59aa8429e47730aea8e5',1,'openvdb::v3_2_0::tools::internal::NodeBS::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1ClosestPointDist.html#ad41b3aed152b59aa8429e47730aea8e5',1,'openvdb::v3_2_0::tools::internal::ClosestPointDist::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UpdatePoints.html#a2eb9e9903d756906a2a3bc8e9c231c8c',1,'openvdb::v3_2_0::tools::internal::UpdatePoints::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DeepCopy.html#aa243eb741f43f85866f9c476e6f48b8a',1,'openvdb::v3_2_0::tree::InternalNode::DeepCopy::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy1.html#aa243eb741f43f85866f9c476e6f48b8a',1,'openvdb::v3_2_0::tree::InternalNode::TopologyCopy1::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy2.html#aa243eb741f43f85866f9c476e6f48b8a',1,'openvdb::v3_2_0::tree::InternalNode::TopologyCopy2::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1VoxelizeActiveTiles.html#aa243eb741f43f85866f9c476e6f48b8a',1,'openvdb::v3_2_0::tree::InternalNode::VoxelizeActiveTiles::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyUnion_1_1A.html#a65d726a271a2c304ecf948f1aa2a228a',1,'openvdb::v3_2_0::tree::InternalNode::TopologyUnion::A::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyUnion.html#aa243eb741f43f85866f9c476e6f48b8a',1,'openvdb::v3_2_0::tree::InternalNode::TopologyUnion::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyIntersection_1_1A.html#a0e1e9e3dbd63fe0f2513c4a2bc1aa13a',1,'openvdb::v3_2_0::tree::InternalNode::TopologyIntersection::A::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyIntersection.html#aa243eb741f43f85866f9c476e6f48b8a',1,'openvdb::v3_2_0::tree::InternalNode::TopologyIntersection::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyDifference_1_1A.html#a0e1e9e3dbd63fe0f2513c4a2bc1aa13a',1,'openvdb::v3_2_0::tree::InternalNode::TopologyDifference::A::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyDifference_1_1B.html#a9864eef76ed469b611a54647810eaf1e',1,'openvdb::v3_2_0::tree::InternalNode::TopologyDifference::B::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyDifference.html#aa243eb741f43f85866f9c476e6f48b8a',1,'openvdb::v3_2_0::tree::InternalNode::TopologyDifference::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#ae79d211818696dc7678e3e5ada3d6848',1,'openvdb::v3_2_0::tree::LeafManager::operator()()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#aa20054c74aed6085ab2e292fc2962a49',1,'openvdb::v3_2_0::tree::NodeList::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree_1_1DeallocateLeafNodes.html#a4e321d236e1b27b67cbb2f99730a64d6',1,'openvdb::v3_2_0::tree::Tree::DeallocateLeafNodes::operator()()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1CombineOpAdapter.html#a7e5747f5c7f79b8735eaabc511345595',1,'openvdb::v3_2_0::tree::CombineOpAdapter::operator()()'],['../structopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Fill.html#a8e3d01c07ed0cfc820050e4e43e39307',1,'openvdb::v3_2_0::util::PagedArray::Fill::operator()()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1LeafTopologyIntOp.html#aff0d41b6385657507733671f37a0237b',1,'openvdb::v3_2_0::util::LeafTopologyIntOp::operator()()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1LeafTopologyDiffOp.html#aff0d41b6385657507733671f37a0237b',1,'openvdb::v3_2_0::util::LeafTopologyDiffOp::operator()()']]], + ['operator_2a',['operator*',['../classopenvdb_1_1v3__2__0_1_1io_1_1File_1_1NameIterator.html#a19d7c668b510da6e6531446927c77e9e',1,'openvdb::v3_2_0::io::File::NameIterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1ConstValueIter.html#a563c7bf6f8b0e5d2be59a11001c16c57',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::ConstValueIter::operator*()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox_1_1Iterator.html#afc156e7ba9ab5fdfb860fafab83be758',1,'openvdb::v3_2_0::math::CoordBBox::Iterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a8ca5cae7cb4c2bdd22af6d69496b44ef',1,'openvdb::v3_2_0::math::Quat::operator*(const Quat &q) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a5ee0bfb534161e16ae8189956e453c47',1,'openvdb::v3_2_0::math::Quat::operator*(T scalar) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#ad09c1ea5be390e76e162d079e185ba4e',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::operator*()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a563c7bf6f8b0e5d2be59a11001c16c57',1,'openvdb::v3_2_0::tools::PointIndexIterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#a860eeebd5a7d24bb152fda47d4bcdfa4',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#ad09c1ea5be390e76e162d079e185ba4e',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator::operator*() const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#a8c31a20ec1078b4e1e71f9fafcbc3661',1,'openvdb::v3_2_0::tools::Film::RGBA::operator*(ValueT scale) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#a2b98a2ef8e25e0c7fd1f445c657036d2',1,'openvdb::v3_2_0::tools::Film::RGBA::operator*(const RGBA &rhs) const '],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#a3270e2b3442d81232e7922f658b60d5b',1,'openvdb::v3_2_0::tree::SparseIteratorBase::operator*()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#a4df7784912276f1ca6a7f75ffc2cb541',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#ab84f5b878aa6bcc73309a5aa21451c38',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a0c2aa4bb7ebc2734389a1e396353ad3b',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::operator*()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#a0d9591749ec78328966e05b5303dfa8b',1,'openvdb::v3_2_0::tree::LeafIteratorBase::operator*()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1OnMaskIterator.html#a9e97de71e9a2b74e270c58741acc7c8f',1,'openvdb::v3_2_0::util::OnMaskIterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1OffMaskIterator.html#a9e97de71e9a2b74e270c58741acc7c8f',1,'openvdb::v3_2_0::util::OffMaskIterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1DenseMaskIterator.html#a9e97de71e9a2b74e270c58741acc7c8f',1,'openvdb::v3_2_0::util::DenseMaskIterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OnIterator.html#a9e97de71e9a2b74e270c58741acc7c8f',1,'openvdb::v3_2_0::util::RootNodeMask::OnIterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OffIterator.html#a9e97de71e9a2b74e270c58741acc7c8f',1,'openvdb::v3_2_0::util::RootNodeMask::OffIterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1DenseIterator.html#a9e97de71e9a2b74e270c58741acc7c8f',1,'openvdb::v3_2_0::util::RootNodeMask::DenseIterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#a0c2aa4bb7ebc2734389a1e396353ad3b',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#ad9ec29fddecc43414a3b2ff6680c9261',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator*()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a183889763b75627c4b28e788cc1fbb5f',1,'openvdb::v3_2_0::math::Mat3::operator*(S scalar, const Mat3< T > &m)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a2d8407c20855b9b45a081be54284fe00',1,'openvdb::v3_2_0::math::Mat3::operator*(const Mat3< T > &m, S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a8e40ccbd3c218d03cf886c78410e30a9',1,'openvdb::v3_2_0::math::Mat3::operator*(const Mat3< MT > &_m, const Vec3< T > &_v)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#ae802fb6965c388c782b388d0b65e3398',1,'openvdb::v3_2_0::math::Mat3::operator*(const Vec3< T > &_v, const Mat3< MT > &_m)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#aa9be65e76ae6c34be7cfcf0920c8ab2e',1,'openvdb::v3_2_0::math::Mat4::operator*(S scalar, const Mat4< T > &m)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a3c8dfb84ee5364be6e46ad2e957227ac',1,'openvdb::v3_2_0::math::Mat4::operator*(const Mat4< T > &m, S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#aef4da8365964b954dbf45fc89b478c3b',1,'openvdb::v3_2_0::math::Mat4::operator*(const Mat4< MT > &_m, const Vec4< T > &_v)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a40b16531473bae42fced2e2af0ed3ef8',1,'openvdb::v3_2_0::math::Mat4::operator*(const Vec4< T > &_v, const Mat4< MT > &_m)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a6bb7dbbe6eac76c5ab56d14a44e42054',1,'openvdb::v3_2_0::math::Mat4::operator*(const Mat4< MT > &_m, const Vec3< T > &_v)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a6c1c733f608528224d3921d30adafb75',1,'openvdb::v3_2_0::math::Mat4::operator*(const Vec3< T > &_v, const Mat4< MT > &_m)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#acaedaf8e88143243abe7729a82507b65',1,'openvdb::v3_2_0::math::Mat4::operator*(const Mat4< T0 > &m0, const Mat4< T1 > &m1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a43c54bf1abde3f44911edcd8f3671350',1,'openvdb::v3_2_0::math::operator*(const Mat3< T0 > &m0, const Mat3< T1 > &m1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a8b9cad896989813d8d1bfa844f0bb0c0',1,'openvdb::v3_2_0::math::operator*(S scalar, const Quat< T > &q)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aacaba1aaed35294f5fb2f0b809699cbc',1,'openvdb::v3_2_0::math::operator*(S scalar, const Vec2< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a2eea014c346322868020c787a66c6e32',1,'openvdb::v3_2_0::math::operator*(const Vec2< T > &v, S scalar)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a96614e9559d5edb22569fc606c5cee29',1,'openvdb::v3_2_0::math::operator*(const Vec2< T0 > &v0, const Vec2< T1 > &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae9cfc3f2b93db5c8b0258ec412527f78',1,'openvdb::v3_2_0::math::operator*(S scalar, const Vec3< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a0a4ad86a81441624ffdae9e2c1cd02c8',1,'openvdb::v3_2_0::math::operator*(const Vec3< T > &v, S scalar)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ac94844ded83b683bd3e7a09e9a28380a',1,'openvdb::v3_2_0::math::operator*(const Vec3< T0 > &v0, const Vec3< T1 > &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a3c2360d38dddde7b427a5d36d1d3b97b',1,'openvdb::v3_2_0::math::operator*(S scalar, const Vec4< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1b0f6fc09e61cb19d6bb6f1c2660378b',1,'openvdb::v3_2_0::math::operator*(const Vec4< T > &v, S scalar)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a901f05a8b5ea2b73fc60116c6b6687dc',1,'openvdb::v3_2_0::math::operator*(const Vec4< T0 > &v0, const Vec4< T1 > &v1)']]], + ['operator_2a_3d',['operator*=',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a27ea78526e0f3b6240710ea942208740',1,'openvdb::v3_2_0::math::pcg::Vector::operator*=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a25d5a16479fb4356c7dd3791d9d7a7d5',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::operator*=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1RowEditor.html#a73fb7547492d0c9c1e2d6b41a152d13f',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::RowEditor::operator*=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a8295899e1b57c9a37c82160699499a83',1,'openvdb::v3_2_0::math::Mat3::operator*=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#af36beb09939dbde7b69db617402e562a',1,'openvdb::v3_2_0::math::Mat3::operator*=(const Mat3< S > &m1)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#ac8aacd8fbff44f48de698b93a31b7913',1,'openvdb::v3_2_0::math::Mat4::operator*=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a9adf02885b273ef7b0ac15e9f8c8c13f',1,'openvdb::v3_2_0::math::Mat4::operator*=(const Mat4< S > &m1)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ab6cc50b94a1ef5337d6200d839454b89',1,'openvdb::v3_2_0::math::Quat::operator*=(T scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a994071f122d2134e01826c6d7cc03d46',1,'openvdb::v3_2_0::math::Quat::operator*=(const Quat &q)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a09eae3167eaf188f3dd764a990c3f7f5',1,'openvdb::v3_2_0::math::Vec2::operator*=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ae4291c3fb31bda3369a102e3df5de221',1,'openvdb::v3_2_0::math::Vec2::operator*=(const Vec2< S > &v1)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#af8b1f78792e6990c352e6b73dc3b7053',1,'openvdb::v3_2_0::math::Vec3::operator*=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a77226dd58f28508c7ea4672aa3fb1016',1,'openvdb::v3_2_0::math::Vec3::operator*=(const Vec3< S > &v1)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a1945d3a8ed7e42b41fa44ae467cc5546',1,'openvdb::v3_2_0::math::Vec4::operator*=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a8a75cae3ac9ccf4a4809451c05608242',1,'openvdb::v3_2_0::math::Vec4::operator*=(const Vec4< S > &v1)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#abc0082904f548f43f95c2b50128ec4da',1,'openvdb::v3_2_0::math::Mat3::operator*=()']]], + ['operator_2b',['operator+',['../structopenvdb_1_1v3__2__0_1_1PointIndex.html#aa0ba79d45c04189d10a5d5068e8a3c1d',1,'openvdb::v3_2_0::PointIndex::operator+()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#afd954fe5ced3d887516899c9443934a7',1,'openvdb::v3_2_0::math::Coord::operator+()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a743a9d8e0a93cc65bbefd9e715f306f8',1,'openvdb::v3_2_0::math::Quat::operator+()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#a2ceb08966a7fb4cf6dded4a767779353',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData::operator+()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#a3f68e703097b166d5f7e19488500606c',1,'openvdb::v3_2_0::tools::Film::RGBA::operator+()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#ab37c41eef1666e2d7fa2f604817acfdb',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator+()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#aac0e40288cebe4b50d685eb66035e90c',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator+()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a284c2cc8c0492ec2a2c1d5c48465abad',1,'openvdb::v3_2_0::math::Mat3::operator+()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a1beb2d5aaa98378e767f9f0cd314a9f4',1,'openvdb::v3_2_0::math::Mat4::operator+()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a73325f420b5ed5a925f5fd027f8ba6ec',1,'openvdb::v3_2_0::math::operator+(const Vec3< T > &v0, const Coord &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a37c30689accfa3867b4e679d5682dce7',1,'openvdb::v3_2_0::math::operator+(const Coord &v1, const Vec3< T > &v0)'],['../namespaceopenvdb_1_1v3__2__0.html#af373f304cae5a0ea4879c67769ddcec1',1,'openvdb::v3_2_0::operator+(const std::string &s, bool)'],['../namespaceopenvdb_1_1v3__2__0.html#a92017926cc8ffdf352132ca9d6f77169',1,'openvdb::v3_2_0::operator+(const std::string &s, int)'],['../namespaceopenvdb_1_1v3__2__0.html#adaed9173be18bf669c3ad91e7bd727b5',1,'openvdb::v3_2_0::operator+(const std::string &s, float)'],['../namespaceopenvdb_1_1v3__2__0.html#a2ba3199ed758769ee881eb0991119d71',1,'openvdb::v3_2_0::operator+(const std::string &s, double)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a0789b6f39c976ba7b6d7b4cd6a956620',1,'openvdb::v3_2_0::math::operator+(const Vec2< T0 > &v0, const Vec2< T1 > &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a94c603d7f7adae0fdc1c30cf8a47e519',1,'openvdb::v3_2_0::math::operator+(const Vec2< T > &v, S scalar)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a606df55a1993b40f2840edd8f90c19fd',1,'openvdb::v3_2_0::math::operator+(const Vec3< T0 > &v0, const Vec3< T1 > &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a5e837c962aac8ae9aca90427db8a93cd',1,'openvdb::v3_2_0::math::operator+(const Vec3< T > &v, S scalar)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab467c81fbcc8ac35a0f709dd4977134e',1,'openvdb::v3_2_0::math::operator+(const Vec4< T0 > &v0, const Vec4< T1 > &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a84ba7cf64535f308e151693f1b259895',1,'openvdb::v3_2_0::math::operator+(const Vec4< T > &v, S scalar)']]], + ['operator_2b_2b',['operator++',['../classopenvdb_1_1v3__2__0_1_1io_1_1File_1_1NameIterator.html#ab654c152dce5fb4213d8eff68303b4f4',1,'openvdb::v3_2_0::io::File::NameIterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1ConstValueIter.html#a2e438db871de1cda325e7d8085360339',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::ConstValueIter::operator++()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox_1_1Iterator.html#aef12ef33726bc591f569f822c7b5ac41',1,'openvdb::v3_2_0::math::CoordBBox::Iterator::operator++()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#a00f008b80917746917b874d00abd02a9',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::operator++()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a00f008b80917746917b874d00abd02a9',1,'openvdb::v3_2_0::tools::PointIndexIterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#ac5dc603a326175611a77c94a6413584d',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#a3e1ce44f40bb701a250e2614f5438791',1,'openvdb::v3_2_0::tree::IteratorBase::operator++()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#aef12ef33726bc591f569f822c7b5ac41',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#aef12ef33726bc591f569f822c7b5ac41',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a7475897440e38eea95f3a7208a8ba029',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::operator++()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#adef55c16eb0bcf0b1245c2dbf1416a88',1,'openvdb::v3_2_0::tree::NodeIteratorBase::operator++()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#aae76048af20d9c79c5df4def75e9c13a',1,'openvdb::v3_2_0::tree::LeafIteratorBase::operator++()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorRange.html#a838a2b1e48837a88318d9781d9cf9a66',1,'openvdb::v3_2_0::tree::IteratorRange::operator++()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1OnMaskIterator.html#aac9a3ef2576b4b2012abaa1d87f64a91',1,'openvdb::v3_2_0::util::OnMaskIterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1OffMaskIterator.html#a3c51cfd8a0807c848490bfdf5273b36b',1,'openvdb::v3_2_0::util::OffMaskIterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1DenseMaskIterator.html#ae2c3ac67a8bedc4954c11f0a18382a5c',1,'openvdb::v3_2_0::util::DenseMaskIterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OnIterator.html#af7a25b7831116ec03cba6b6fe3ee1a2b',1,'openvdb::v3_2_0::util::RootNodeMask::OnIterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1OffIterator.html#a158870b80fe6765adc383ff74b95d2f6',1,'openvdb::v3_2_0::util::RootNodeMask::OffIterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1DenseIterator.html#ae6c9279638b333f2ed53819f803a4493',1,'openvdb::v3_2_0::util::RootNodeMask::DenseIterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#a858a8f58b67c9fc79d628f5ebef436b3',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#ab7eab0ba59cfdc636f6acdd4c86ed8f8',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator++(int)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#aef12ef33726bc591f569f822c7b5ac41',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator++()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#ac1702aedba13b4112b891b58dfd78eba',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator++(int)']]], + ['operator_2b_3d',['operator+=',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#af30f4c2a8d8809d508eefd8888244e51',1,'openvdb::v3_2_0::math::Coord::operator+=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a7a8842a64a40e6dbf5b7f41e8b33406e',1,'openvdb::v3_2_0::math::Mat3::operator+=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a7192ad4c0ffc0a3f632b8cf75a719f26',1,'openvdb::v3_2_0::math::Mat4::operator+=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a61a6b1d3b4fd9c5f799f7d4c1155a20c',1,'openvdb::v3_2_0::math::Quat::operator+=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a399f5332e5e50eba2b71568dfa5697b4',1,'openvdb::v3_2_0::math::Vec2::operator+=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a880e5b0a5dc13327283848c29e8ce4b9',1,'openvdb::v3_2_0::math::Vec2::operator+=(const Vec2< S > &v1)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ac6e6acd15e2e5d39969d18681dd4e925',1,'openvdb::v3_2_0::math::Vec3::operator+=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a3c74a5d5f64c54cf3f888b0fe0fa1756',1,'openvdb::v3_2_0::math::Vec3::operator+=(const Vec3< S > &v1)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#ab379b07a84109d0e895b37b2a0f0a541',1,'openvdb::v3_2_0::math::Vec4::operator+=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#aa08c454f5ecb150947bc890aa2132051',1,'openvdb::v3_2_0::math::Vec4::operator+=(const Vec4< S > &v1)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#a3147d465f1bcaf5bc95e26ac3355c11c',1,'openvdb::v3_2_0::tools::Film::RGBA::operator+=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#ae8ff1b7777cfbe30e22f534b27123af0',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator+=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a0fdff6f56668772e186dfbcc818496ce',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator+=()']]], + ['operator_2d',['operator-',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a9666dd0685a288085cae8c718dceaba4',1,'openvdb::v3_2_0::math::Coord::operator-(const Coord &rhs) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#ae60baccf9f7829ec5b1e5b4e2593fbb3',1,'openvdb::v3_2_0::math::Coord::operator-() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#ab728c0163ae1bfea054716efa2c9589b',1,'openvdb::v3_2_0::math::Mat3::operator-()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#ae5fb13158e0e81260e69dff3915b4b26',1,'openvdb::v3_2_0::math::Mat4::operator-()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a259c54ac7d96344a6642a34c5f157bf7',1,'openvdb::v3_2_0::math::Quat::operator-(const Quat &q) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#aaa87f73b2254aab1910584494a51ea81',1,'openvdb::v3_2_0::math::Quat::operator-() const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a19c068782e6ef6c8bf7e4656f73a0e3c',1,'openvdb::v3_2_0::math::Vec2::operator-()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a3d2db871fdefc92a633f83ac95276ee2',1,'openvdb::v3_2_0::math::Vec3::operator-()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a45f295757d2399d81d75016902443403',1,'openvdb::v3_2_0::math::Vec4::operator-()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#aa4a308848e72fd3e59844da0154590dd',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData::operator-(const T &) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#a9d3e445be91311a23c0426c7a350fc17',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData::operator-() const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#ab83c03ced4a8c51b4855e534b32613c5',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator-(const difference_type &pos) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#a26d501a5964f0f7b4550ec436f8db2b4',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator-(const ConstIterator &other) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a51dbcc20d285e2d6927d78b668610f4e',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator-(const difference_type &pos) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#aa560a6ec40067d94d75b854ac8c9e2b9',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator-(const Iterator &other) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#af5ad76a5628a7b1effff4eea41653e1e',1,'openvdb::v3_2_0::math::Mat3::operator-()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#ab0af2cb0604fcc0bec0a63f0980ce3b6',1,'openvdb::v3_2_0::math::Mat4::operator-()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aa2fdd07184e0ba994b79a54c0f934b5a',1,'openvdb::v3_2_0::math::operator-(const Vec3< T > &v0, const Coord &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#abe5bcacb4c3969bb6e1420c80946776e',1,'openvdb::v3_2_0::math::operator-(const Coord &v1, const Vec3< T > &v0)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a47f2e9c8a24b4179f7403da033cbdf94',1,'openvdb::v3_2_0::math::operator-(const Vec2< T0 > &v0, const Vec2< T1 > &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab86a2d13f4f7f6041dcf5b0d822e2b63',1,'openvdb::v3_2_0::math::operator-(const Vec2< T > &v, S scalar)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a06bede4f23a4ccc7e2f90b628f70c427',1,'openvdb::v3_2_0::math::operator-(const Vec3< T0 > &v0, const Vec3< T1 > &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a8e25a116ed1babb11c055b5bf4d6b553',1,'openvdb::v3_2_0::math::operator-(const Vec3< T > &v, S scalar)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a0b11f5d137919683230de46be2c4c6e2',1,'openvdb::v3_2_0::math::operator-(const Vec4< T0 > &v0, const Vec4< T1 > &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a2b8a41a79f16a91f0dc44b975dae8e7f',1,'openvdb::v3_2_0::math::operator-(const Vec4< T > &v, S scalar)']]], + ['operator_2d_2d',['operator--',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#a60a4a4f63e7493cf8afb2278a9cd2ed4',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator--()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#af84e31447f5dc1dd3e746d10acffb868',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator--(int)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a34e5ed23ddc31b7d8d4bfb5bfacbaab6',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator--()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a826422223993becdf7c1e60aea56e9c0',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator--(int)']]], + ['operator_2d_3d',['operator-=',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#acb0910b9c001a4632594439423a704d5',1,'openvdb::v3_2_0::math::Coord::operator-=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a3663d2dfdc62875340f7e30bbb59e6ba',1,'openvdb::v3_2_0::math::Mat3::operator-=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#ad647c7d2b6246e17671289edf08f45f1',1,'openvdb::v3_2_0::math::Mat4::operator-=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#aa140b4a600627aba04b1d6b885284996',1,'openvdb::v3_2_0::math::Quat::operator-=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#add694ad7f19ad946272ab081a4c478ce',1,'openvdb::v3_2_0::math::Vec2::operator-=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#ab5466d034823a88fac147d68afc616af',1,'openvdb::v3_2_0::math::Vec2::operator-=(const Vec2< S > &v1)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a81505c5b9e94c48f617ab7145e381d97',1,'openvdb::v3_2_0::math::Vec3::operator-=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#aa75d121f19376dcc2cdb22ccda794497',1,'openvdb::v3_2_0::math::Vec3::operator-=(const Vec3< S > &v1)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#af9651d37d9d9d20658a21d7d5a8c5e33',1,'openvdb::v3_2_0::math::Vec4::operator-=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a75e37bcfe0a6f4dc568cd36c137f70f8',1,'openvdb::v3_2_0::math::Vec4::operator-=(const Vec4< S > &v1)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ac1f6685961e34847c92688f580e04ecb',1,'openvdb::v3_2_0::util::NodeMask::operator-=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ac1f6685961e34847c92688f580e04ecb',1,'openvdb::v3_2_0::util::NodeMask< 1 >::operator-=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ac1f6685961e34847c92688f580e04ecb',1,'openvdb::v3_2_0::util::NodeMask< 2 >::operator-=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#a792a5cb53dc294863945ba72b5b74046',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator-=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a8980a96e3e2a47a0295df52e3947b47c',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator-=()']]], + ['operator_2d_3e',['operator->',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#a197bfaabb857d574f1d3c858ea8241ab',1,'openvdb::v3_2_0::tree::SparseIteratorBase::operator->()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#aa2b78c95f9367bd8fca00286d44122e7',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::operator->()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#a3d57be8c4b7459c658ea9a92fa6933f1',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::operator->()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#abc094ec2e24f4668b185fa526683ccfa',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::operator->()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#adf5829cfe2e8853fb0d23a4d4d7f3014',1,'openvdb::v3_2_0::tree::LeafIteratorBase::operator->()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#abc094ec2e24f4668b185fa526683ccfa',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator->()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a7b777b0d7945bd83f898e95192216024',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator->()']]], + ['operator_2f',['operator/',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a0e07479416e99018c281dc43c1cd6a16',1,'openvdb::v3_2_0::math::Quat::operator/()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a180b92ee97573582ffc46b94cb616b27',1,'openvdb::v3_2_0::math::operator/(S scalar, const Vec2< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a18465c34c7fa501e03f05bfc3466d218',1,'openvdb::v3_2_0::math::operator/(const Vec2< T > &v, S scalar)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a220e25e7166561ac1d8b9befc443f005',1,'openvdb::v3_2_0::math::operator/(const Vec2< T0 > &v0, const Vec2< T1 > &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aab5fd63ebdc87dc1648cf79533b52237',1,'openvdb::v3_2_0::math::operator/(S scalar, const Vec3< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a91fb728b585d4485347f0ec236a36b3a',1,'openvdb::v3_2_0::math::operator/(const Vec3< T > &v, S scalar)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9ff18578274dae7bf0cccb8d35e304ca',1,'openvdb::v3_2_0::math::operator/(const Vec3< T0 > &v0, const Vec3< T1 > &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a653a1a4b65d1d309ea0f7adb349268e3',1,'openvdb::v3_2_0::math::operator/(S scalar, const Vec4< T > &v)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a60d89b63a90442b7af138f02314e412e',1,'openvdb::v3_2_0::math::operator/(const Vec4< T > &v, S scalar)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a11883f01476023b0a69fb56f1bd03479',1,'openvdb::v3_2_0::math::operator/(const Vec4< T0 > &v0, const Vec4< T1 > &v1)']]], + ['operator_2f_3d',['operator/=',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a60248c9829dd03bbc564a0ae3737b92f',1,'openvdb::v3_2_0::math::Vec2::operator/=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#aae9878e8d4adcc607ca9a4f7e8fd561f',1,'openvdb::v3_2_0::math::Vec2::operator/=(const Vec2< S > &v1)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a3529ccb28634eeaa3e9d465dace5f165',1,'openvdb::v3_2_0::math::Vec3::operator/=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a605d9d50dfd771afa2f600f86fb1c8c8',1,'openvdb::v3_2_0::math::Vec3::operator/=(const Vec3< S > &v1)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a53bfb8156f5fa45def1b1a365d6e2bb2',1,'openvdb::v3_2_0::math::Vec4::operator/=(S scalar)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a5d2b59f401c42db0f3380ec1d8fc8137',1,'openvdb::v3_2_0::math::Vec4::operator/=(const Vec4< S > &v1)']]], + ['operator_3c',['operator<',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a60f94d8417c5434836eb7d1c521dd9e4',1,'openvdb::v3_2_0::math::Coord::operator<()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#af9b1b292c4b6bff0b50fc927cf7d7965',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData::operator<()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband_1_1Fragment.html#ae6270b5afdf309fcd6cefa4b5477ba47',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::Fragment::operator<()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html#a65a93d73c497c81b7389ee74fbdccec3',1,'openvdb::v3_2_0::util::BaseMaskIterator::operator<()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#a43530c3f2563eb0493faa4a80fe4710a',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::operator<()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#af2576d9419b0d102db87a29e43bf245e',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator<()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#afc0acb4d4cd2dd135d49aecd33f4f2bd',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator<()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aa83ae5355b86a4d34bd9861541412561',1,'openvdb::v3_2_0::math::operator<()']]], + ['operator_3c_3c',['operator<<',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a8ca157fb9c69492d02ab9df2e2d449b6',1,'openvdb::v3_2_0::math::Coord::operator<<()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a91b8be809e8ee4564bea8bd082d3cdef',1,'openvdb::v3_2_0::math::CoordBBox::operator<<()'],['../namespaceopenvdb_1_1v3__2__0_1_1io.html#add660b552aa6175549c83bddd94bd768',1,'openvdb::v3_2_0::io::operator<<(std::ostream &, const StreamMetadata &)'],['../namespaceopenvdb_1_1v3__2__0_1_1io.html#abc71a3088742b77cbfbe7134fef5ac7a',1,'openvdb::v3_2_0::io::operator<<(std::ostream &, const StreamMetadata::AuxDataMap &)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4fdf607982655a8a8f8f446cd57e8015',1,'openvdb::v3_2_0::math::operator<<()'],['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg.html#ac1c8c0e2c87a517c469155dee4c0bfb3',1,'openvdb::v3_2_0::math::pcg::operator<<()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a346823971698aac10d1541edc13e0555',1,'openvdb::v3_2_0::math::operator<<(std::ostream &os, const Coord &xyz)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1ec3b7d4f14851ff4881fd2e5ab924cf',1,'openvdb::v3_2_0::math::operator<<(std::ostream &os, const CoordBBox &b)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#afcf4fd29cdfb99117fc63f381f8287b2',1,'openvdb::v3_2_0::math::operator<<(std::ostream &os, const DDA< RayT, Log2Dim > &dda)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae13e3a9927dba7cbe96607f8dba9afb8',1,'openvdb::v3_2_0::math::operator<<(std::ostream &os, const Ray< RealT > &r)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a88d1ed4b2bfcd72c4316b8743474815e',1,'openvdb::v3_2_0::math::operator<<(std::ostream &, const Transform &)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a0ccf30ed7b0b93f314e08a0ccb5e9798',1,'openvdb::v3_2_0::math::operator<<(std::ostream &ostr, const Tuple< SIZE, T > &classname)'],['../namespaceopenvdb_1_1v3__2__0.html#a7ea4a9046558b7ec2cc44a7e34bc6b75',1,'openvdb::v3_2_0::operator<<(std::ostream &ostr, const Metadata &metadata)'],['../namespaceopenvdb_1_1v3__2__0.html#ae26b2ef2621eba66db830603eff1c388',1,'openvdb::v3_2_0::operator<<(std::ostream &, const MetaMap &)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aeea3d8dcd3b18c32c08449294a806588',1,'openvdb::v3_2_0::tools::operator<<()'],['../namespaceopenvdb_1_1v3__2__0_1_1tree.html#a324e47e9417f0e0fb621eb3de60197e2',1,'openvdb::v3_2_0::tree::operator<<()'],['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a98dc3a7ced7805e1c707fc499ad12b3c',1,'openvdb::v3_2_0::util::operator<<()']]], + ['operator_3c_3c_3d',['operator<<=',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a809c80789b4036f012a3c326b54b2def',1,'openvdb::v3_2_0::math::Coord::operator<<=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#ab88d3fa04e5dc308e8bbdcd29d6ba54e',1,'openvdb::v3_2_0::math::CoordBBox::operator<<=()']]], + ['operator_3c_3d',['operator<=',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a70163b01bf0a3f8520e2359f2f124bd1',1,'openvdb::v3_2_0::math::Coord::operator<=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#a77bc21be9f255bbc6f347c045186bb42',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator<=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#ae206b92e415299c3fc072fb0fe2905b3',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator<=()']]], + ['operator_3d',['operator=',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a94d85a1d5aa83ae1109cf1636353a0a4',1,'openvdb::v3_2_0::io::File::operator=()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a0ea823cb2879d84a7018ae14c6d30676',1,'openvdb::v3_2_0::io::StreamMetadata::operator=()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Stream.html#afc298243ba26edc13ff0e947df21263c',1,'openvdb::v3_2_0::io::Stream::operator=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#ac97b0adbe2cd710bc0043dbbe0c62b55',1,'openvdb::v3_2_0::math::pcg::Vector::operator=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#af36fd380b0362d20353e18ad2b702972',1,'openvdb::v3_2_0::math::AffineMap::operator=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#aabeb9faba93106804760ed804b570c99',1,'openvdb::v3_2_0::math::CompoundMap::operator=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a301a7cfbf13259daeaca0ff326e7829a',1,'openvdb::v3_2_0::math::Mat3::operator=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a8388e3e849221e57cb9601f56d84460b',1,'openvdb::v3_2_0::math::Mat4::operator=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ad2fc720d6721dcef84c0628ae397655c',1,'openvdb::v3_2_0::math::Quat::operator=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a6a6d9b668b48a927a47e4e251b1f9e95',1,'openvdb::v3_2_0::math::Vec2::operator=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#ac25017a4491a060a0a322ba7c5ae9561',1,'openvdb::v3_2_0::math::Vec3::operator=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a226123a8e1d3926d0c29195a8a3f0e3d',1,'openvdb::v3_2_0::math::Vec4::operator=()'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a2a7cfe69c863616f5528f279206c25bd',1,'openvdb::v3_2_0::MetaMap::operator=()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a5ef5a95cd07f9b7288edf67acb4831e5',1,'openvdb::v3_2_0::tools::PointIndexIterator::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#a3b1f367367768c391af7f2957a9e1953',1,'openvdb::v3_2_0::tree::IteratorBase::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#a175d0e9a7e069bd44866193cd15c3292',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#a17850d463855f899807c7eea266f4a2c',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#a4768c1ee6b9141a3d9e7c29c5efa7e20',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#a4768c1ee6b9141a3d9e7c29c5efa7e20',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#a175d0e9a7e069bd44866193cd15c3292',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01true_00_01ValueT_00_01ChildT_01_4.html#abeec9219eb994697fbb087dadccc18f5',1,'openvdb::v3_2_0::tree::NodeUnionImpl< true, ValueT, ChildT >::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a1b775efb979e2d7445d43aaf7cb900d0',1,'openvdb::v3_2_0::tree::RootNode::operator=(const RootNode &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a0447467224f7c21ad0e3926279ab7eb9',1,'openvdb::v3_2_0::tree::RootNode::operator=(const RootNode< OtherChildType > &other)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#aba4cc4656656e79a82aac5c9ce747e57',1,'openvdb::v3_2_0::tree::Tree::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a681d3357ee25ccb872f03cc0f0717195',1,'openvdb::v3_2_0::tree::IterListItem::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a681d3357ee25ccb872f03cc0f0717195',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a681d3357ee25ccb872f03cc0f0717195',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a8344620e951e52f43719236fac411523',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a3f806102bf7c7a87ef79c39c04518332',1,'openvdb::v3_2_0::tree::NodeIteratorBase::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#a39eeee9f00c9c02139414ce57b7e01f9',1,'openvdb::v3_2_0::tree::LeafIteratorBase::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html#a60087b50dd40da857cba105a9fb5e312',1,'openvdb::v3_2_0::tree::ValueAccessorBase::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a6643cfe0185b1d287b48cdbcd7374875',1,'openvdb::v3_2_0::tree::ValueAccessor::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a6e572954f375468efca4549222333fd9',1,'openvdb::v3_2_0::tree::ValueAccessor0::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a4fab6677cd80d297b83aa161e3c7c791',1,'openvdb::v3_2_0::tree::ValueAccessor1::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a89efbb2eca41711f84d84f916e71b3e1',1,'openvdb::v3_2_0::tree::ValueAccessor2::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a792a00c97806e398466f6feb8c8f9058',1,'openvdb::v3_2_0::tree::ValueAccessor3::operator=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html#a9ad59d0fd8c0ed1f370885f24bcf6f21',1,'openvdb::v3_2_0::util::BaseMaskIterator::operator=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a336b756005c07d48de0a6a8d1056a2c0',1,'openvdb::v3_2_0::util::NodeMask::operator=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#acb52e8d1be111920d9821e2f095a3fba',1,'openvdb::v3_2_0::util::NodeMask< 1 >::operator=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#acb52e8d1be111920d9821e2f095a3fba',1,'openvdb::v3_2_0::util::NodeMask< 2 >::operator=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#aca1a391bb41461cafd64c1f0250bcdb5',1,'openvdb::v3_2_0::util::RootNodeMask::operator=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#a77ead81103e15adc3a03e76c81d7924d',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::operator=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#a098521b7d40674cefdc71c327bf95f61',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a175d0e9a7e069bd44866193cd15c3292',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html#acfb0fbbae0d000eac86fbb180e486400',1,'openvdb::v3_2_0::util::PagedArray::Page::operator=()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#aef2b73375c068f1a01a7ee5b4f55d8b1',1,'openvdb::v3_2_0::tree::RootNode::operator=()']]], + ['operator_3d_3d',['operator==',['../classopenvdb_1_1v3__2__0_1_1io_1_1File_1_1NameIterator.html#a9d73d20213a22e433671dec0b4ce5537',1,'openvdb::v3_2_0::io::File::NameIterator::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#a3c3b29f650a424a29bb8e346df0bfa07',1,'openvdb::v3_2_0::math::BBox::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a9d3adb1e959e70488f1897270ed10a80',1,'openvdb::v3_2_0::math::Coord::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a2f21cf39354306b2b782d6c8bfd34b65',1,'openvdb::v3_2_0::math::CoordBBox::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a2c044f52721ee1690c680810cc940786',1,'openvdb::v3_2_0::math::AffineMap::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#ac04e34de1681c37a7e5ec1a0b7052074',1,'openvdb::v3_2_0::math::ScaleMap::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#ae6cec21c41829338971b74594e94b710',1,'openvdb::v3_2_0::math::UniformScaleMap::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a3acdd826c9992def160d7dbaa3e20d9e',1,'openvdb::v3_2_0::math::TranslationMap::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#ad7c3cfa8d684ee1ae09050b95d60ecd3',1,'openvdb::v3_2_0::math::ScaleTranslateMap::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#ac3d19c5d4be0dec92691dd9dfb0ea99b',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a8c4b5dd0df786a8c159650a21ff46984',1,'openvdb::v3_2_0::math::UnitaryMap::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a7af826081bcc8e3961c0e8e3f5975088',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#afd00d6ece415c224a07da9ba51c7c4db',1,'openvdb::v3_2_0::math::CompoundMap::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#aa4aaba32df427ce2d6be263fed52141e',1,'openvdb::v3_2_0::math::Quat::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#ae44784e4c6086a3bffaf7d2eaf96159f',1,'openvdb::v3_2_0::math::Transform::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#aa8b8c2ed85b3f3c3e66b885fad74c5fb',1,'openvdb::v3_2_0::math::Vec2::operator==()'],['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a69319ad7ffb1adba19650a3eea15a063',1,'openvdb::v3_2_0::Metadata::operator==()'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a23564bccd2e94e800561c6253771254e',1,'openvdb::v3_2_0::MetaMap::operator==()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#a544b9a0cc876271323f097097868f020',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData::operator==()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#a780e8b40a1c045c0d9d057f1895266e7',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::operator==()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a227d88264b09d8d9264793a152e14cf9',1,'openvdb::v3_2_0::tools::PointIndexIterator::operator==()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#abb9d3f570b74142ccf2db6c3b0de92ee',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::operator==()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#a34a3abd63f1d106c1b06917c04c88c78',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator::operator==()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#a65a9d79e34ea49135c34a491468f6dce',1,'openvdb::v3_2_0::tree::IteratorBase::operator==()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#a1ea001976a5bc8ae8dc365e2a912b59a',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::operator==()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#a413a0a3b3768ad3e8ffed553aa107b08',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::operator==()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a173d413289af1fe67a5f2f3eeb909eec',1,'openvdb::v3_2_0::tree::LeafNode::operator==()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#a413a0a3b3768ad3e8ffed553aa107b08',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::operator==()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#adb5a9a18ada9456b31c4ce9961877978',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::operator==()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#a413a0a3b3768ad3e8ffed553aa107b08',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::operator==()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#adb5a9a18ada9456b31c4ce9961877978',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::operator==()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#a1ea001976a5bc8ae8dc365e2a912b59a',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::operator==()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ab55f4c7d759598db855f46080fe66617',1,'openvdb::v3_2_0::tree::Tree::operator==()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html#a948fa276b91fc02b51465aeddfcbe735',1,'openvdb::v3_2_0::util::BaseMaskIterator::operator==()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a050a5b69679a0ecf64e5463b7dcc6708',1,'openvdb::v3_2_0::util::NodeMask::operator==()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a050a5b69679a0ecf64e5463b7dcc6708',1,'openvdb::v3_2_0::util::NodeMask< 1 >::operator==()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a050a5b69679a0ecf64e5463b7dcc6708',1,'openvdb::v3_2_0::util::NodeMask< 2 >::operator==()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#a0b1b9ef7aad543db14a5e00eb025bbe6',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::operator==()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a6d07bb21181053e79fde7b97abe40ea3',1,'openvdb::v3_2_0::util::RootNodeMask::operator==()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#ac60a65eb14220a00258e801b8450725c',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator==()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a1ea001976a5bc8ae8dc365e2a912b59a',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#ad3a9a3613f47a3c3af263fe72599450c',1,'openvdb::v3_2_0::math::Mat3::operator==()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a679a33cc9a91af7a67b3a65bc61c9774',1,'openvdb::v3_2_0::math::Mat4::operator==()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a3e2c3e85acfcb944c3b1c9ef86396b66',1,'openvdb::v3_2_0::math::operator==(const Vec3< T0 > &v0, const Vec3< T1 > &v1)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ab0186df5f2423c17e699bbb05d2eafab',1,'openvdb::v3_2_0::math::operator==(const Vec4< T0 > &v0, const Vec4< T1 > &v1)']]], + ['operator_3e',['operator>',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#ae95f05b467295c58a4f638588d31c311',1,'openvdb::v3_2_0::math::Coord::operator>()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#aedb68d5d04e10071597b2678fb5c6162',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData::operator>()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#ace06f52dd966550726c6a70a82f090da',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator>()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#ac90b39fbbfb3065da1070feb98abc0cd',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator>()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae7143fe5273ca75da02de59834e08170',1,'openvdb::v3_2_0::math::operator>()']]], + ['operator_3e_3d',['operator>=',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#afe230713547c1df474bd959025293d86',1,'openvdb::v3_2_0::math::Coord::operator>=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#ae048628685abb87fa671248a918994b6',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator>=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a0a821d98fcfa64812e1a46a5682a37fe',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator>=()']]], + ['operator_3e_3e',['operator>>',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a3b91ca23468a9251915ad74c34c20cc7',1,'openvdb::v3_2_0::math::Coord::operator>>()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a139aaa72ce406dbac0511edd46836b3e',1,'openvdb::v3_2_0::math::CoordBBox::operator>>()']]], + ['operator_3e_3e_3d',['operator>>=',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a2788df1ec897a7b049ade9f126a53829',1,'openvdb::v3_2_0::math::Coord::operator>>=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a2d3fb8357b430c0c57f04511c8c1fb2a',1,'openvdb::v3_2_0::math::CoordBBox::operator>>=()']]], + ['operator_5b_5d',['operator[]',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a23025fcff737c99690e9d44fce06b547',1,'openvdb::v3_2_0::math::pcg::Vector::operator[](SizeType i)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#acd5ae8d09724aa6d52363b8b98a0671c',1,'openvdb::v3_2_0::math::pcg::Vector::operator[](SizeType i) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a24e1dafd2faebac8412cdacc9aeae4e1',1,'openvdb::v3_2_0::math::Coord::operator[](size_t i) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#adb02eea82af0bca01894ebfe1988e57a',1,'openvdb::v3_2_0::math::Coord::operator[](size_t i)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a904037f984db327b4058a9817c21a6fc',1,'openvdb::v3_2_0::math::Mat3::operator[](int i)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#af58f1c63abcf51bc57b462ccadd28e01',1,'openvdb::v3_2_0::math::Mat3::operator[](int i) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a904037f984db327b4058a9817c21a6fc',1,'openvdb::v3_2_0::math::Mat4::operator[](int i)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#af58f1c63abcf51bc57b462ccadd28e01',1,'openvdb::v3_2_0::math::Mat4::operator[](int i) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a0534e977fc9fee424b3ef94f27a9ed61',1,'openvdb::v3_2_0::math::Quat::operator[](int i)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a8b36789e9ecc47ad57fc55d85015651d',1,'openvdb::v3_2_0::math::Quat::operator[](int i) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#a8b36789e9ecc47ad57fc55d85015651d',1,'openvdb::v3_2_0::math::Tuple::operator[](int i) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#a0534e977fc9fee424b3ef94f27a9ed61',1,'openvdb::v3_2_0::math::Tuple::operator[](int i)'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a68d753337de4f85f9fa5cde7b916c102',1,'openvdb::v3_2_0::MetaMap::operator[](const Name &)'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a768c40208c2798a39b8482e12f0489e9',1,'openvdb::v3_2_0::MetaMap::operator[](const Name &) const '],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#a89ad8333cad4f3b317bb4dee4001e4dd',1,'openvdb::v3_2_0::tools::Morphology::LeafCache::operator[]()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#abda484fc4c22d06aa481b74151208676',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::operator[]()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#a527e545f54ed0ed38fe3d5ac8278302f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::operator[]()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#a527e545f54ed0ed38fe3d5ac8278302f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::operator[]()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#a297495e5317027b2e01d36640dc9f99b',1,'openvdb::v3_2_0::tree::NodeList::operator[]()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#ace71b58daf79e5ba3a3b54391106015a',1,'openvdb::v3_2_0::util::PagedArray::operator[](size_t i)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a639335fbac6c8dfea293b113322bc90b',1,'openvdb::v3_2_0::util::PagedArray::operator[](size_t i) const '],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#a1265918803de1cf81a86613659734fbd',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::operator[]()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#aae6f35718c1444c1e2c2cff2a7974f19',1,'openvdb::v3_2_0::util::PagedArray::Iterator::operator[]()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html#a4bb36966532a762570bffc6e92dcc45f',1,'openvdb::v3_2_0::util::PagedArray::Page::operator[](const size_t i)'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html#a467af5f59bb2c072c93e3c08ce9314e2',1,'openvdb::v3_2_0::util::PagedArray::Page::operator[](const size_t i) const ']]], + ['operator_5e',['operator^',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ace3eead8e9218a35454c65d9bb3227cb',1,'openvdb::v3_2_0::util::NodeMask::operator^()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ace3eead8e9218a35454c65d9bb3227cb',1,'openvdb::v3_2_0::util::NodeMask< 1 >::operator^()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ace3eead8e9218a35454c65d9bb3227cb',1,'openvdb::v3_2_0::util::NodeMask< 2 >::operator^()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a00d753912b40d387976282541bd045db',1,'openvdb::v3_2_0::util::RootNodeMask::operator^()']]], + ['operator_5e_3d',['operator^=',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#aa0a300534a1ad94a1dd1c44e45f391b5',1,'openvdb::v3_2_0::util::NodeMask::operator^=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#aa0a300534a1ad94a1dd1c44e45f391b5',1,'openvdb::v3_2_0::util::NodeMask< 1 >::operator^=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#aa0a300534a1ad94a1dd1c44e45f391b5',1,'openvdb::v3_2_0::util::NodeMask< 2 >::operator^=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a0b62c6a283c7ebb1415ce779a19ceaf3',1,'openvdb::v3_2_0::util::RootNodeMask::operator^=()']]], + ['operator_7c',['operator|',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a4b09b2ac66db1e89bf0d53d0434bca49',1,'openvdb::v3_2_0::math::Coord::operator|()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#ab00c193b7f7b95a8722998c41de33cbb',1,'openvdb::v3_2_0::math::CoordBBox::operator|()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a4bc033b1803e7875e1d44a7191d4ccdf',1,'openvdb::v3_2_0::util::NodeMask::operator|()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a4bc033b1803e7875e1d44a7191d4ccdf',1,'openvdb::v3_2_0::util::NodeMask< 1 >::operator|()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a4bc033b1803e7875e1d44a7191d4ccdf',1,'openvdb::v3_2_0::util::NodeMask< 2 >::operator|()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#ad292a8f3f7779c54cd1be32c58a762c2',1,'openvdb::v3_2_0::util::RootNodeMask::operator|()']]], + ['operator_7c_3d',['operator|=',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a9cd598a971ac11acba6dc31fd1e7dfe3',1,'openvdb::v3_2_0::math::Coord::operator|=()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a6ffa161a30062ffad30a7624c36307ac',1,'openvdb::v3_2_0::math::CoordBBox::operator|=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a15c13d8e7de79e77e851a6cc034c1e33',1,'openvdb::v3_2_0::util::NodeMask::operator|=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a15c13d8e7de79e77e851a6cc034c1e33',1,'openvdb::v3_2_0::util::NodeMask< 1 >::operator|=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a15c13d8e7de79e77e851a6cc034c1e33',1,'openvdb::v3_2_0::util::NodeMask< 2 >::operator|=()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a255973eebe29eb2b2c0604b3fcf37c30',1,'openvdb::v3_2_0::util::RootNodeMask::operator|=()']]], + ['opextrema',['opExtrema',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ab4a308e2e6c2d283bfafb3bd80c8ca43',1,'openvdb::v3_2_0::tools']]], + ['opstatistics',['opStatistics',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a35876c2d474f3ed28fc6a6aa4b4f5678',1,'openvdb::v3_2_0::tools']]], + ['order',['order',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Sampler.html#a4440d8900b99dab3c079c8b53775952f',1,'openvdb::v3_2_0::tools::Sampler::order()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointSampler.html#a4440d8900b99dab3c079c8b53775952f',1,'openvdb::v3_2_0::tools::PointSampler::order()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html#a4440d8900b99dab3c079c8b53775952f',1,'openvdb::v3_2_0::tools::BoxSampler::order()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadraticSampler.html#a4440d8900b99dab3c079c8b53775952f',1,'openvdb::v3_2_0::tools::QuadraticSampler::order()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredPointSampler.html#a4440d8900b99dab3c079c8b53775952f',1,'openvdb::v3_2_0::tools::StaggeredPointSampler::order()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredBoxSampler.html#a4440d8900b99dab3c079c8b53775952f',1,'openvdb::v3_2_0::tools::StaggeredBoxSampler::order()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1StaggeredQuadraticSampler.html#a4440d8900b99dab3c079c8b53775952f',1,'openvdb::v3_2_0::tools::StaggeredQuadraticSampler::order()']]], + ['ordersegmentsop',['OrderSegmentsOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1OrderSegmentsOp.html#a56be7df1c1b16226efebf92df9146163',1,'openvdb::v3_2_0::tools::point_partitioner_internal::OrderSegmentsOp']]], + ['origin',['origin',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a15521fcd64a8d8846a2d7bed78a9e2e6',1,'openvdb::v3_2_0::math::Vec4::origin()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a605928767da2cb90e6ad6b5021f49592',1,'openvdb::v3_2_0::tools::Dense::origin()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#a578da933fb822c6ed41100510d04f561',1,'openvdb::v3_2_0::tools::PointPartitioner::origin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a605928767da2cb90e6ad6b5021f49592',1,'openvdb::v3_2_0::tree::InternalNode::origin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a605928767da2cb90e6ad6b5021f49592',1,'openvdb::v3_2_0::tree::LeafNode::origin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a605928767da2cb90e6ad6b5021f49592',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::origin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a605928767da2cb90e6ad6b5021f49592',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::origin()']]], + ['orthographiccamera',['OrthographicCamera',['../classopenvdb_1_1v3__2__0_1_1tools_1_1OrthographicCamera.html#ac62a5cc4afa2c181a067e158054110eb',1,'openvdb::v3_2_0::tools::OrthographicCamera']]], + ['orthonormalize',['orthonormalize',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ae85e544f961fd9e5701b699bde8fa9d3',1,'openvdb::v3_2_0::math::orthonormalize(Vec2< T > &v1, Vec2< T > &v2)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1af7472500d9d842f11740c28eaf6334',1,'openvdb::v3_2_0::math::orthonormalize(Vec3< T > &v1, Vec3< T > &v2, Vec3< T > &v3)']]], + ['outerproduct',['outerProduct',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a24caa832f7cddb123cebc1249f4a0cc1',1,'openvdb::v3_2_0::math']]], + ['over',['over',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#ac81a1c000eb43d6df3b4ddfb8f287c77',1,'openvdb::v3_2_0::tools::Film::RGBA']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_f.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_f.html new file mode 100644 index 00000000..588e52c8 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_f.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_f.js new file mode 100644 index 00000000..ebc737dd --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/functions_f.js @@ -0,0 +1,106 @@ +var searchData= +[ + ['pack',['pack',['../classopenvdb_1_1v3__2__0_1_1math_1_1QuantizedUnitVec.html#ad941c3e631b49b5726346754818f444a',1,'openvdb::v3_2_0::math::QuantizedUnitVec']]], + ['packpoint',['packPoint',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#ada09be2d2b80c4dfa43f71ba65dbb35c',1,'openvdb::v3_2_0::tools::internal']]], + ['padmat4',['padMat4',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a41d263c41993e8204f0c62662fbb6c10',1,'openvdb::v3_2_0::math']]], + ['page',['Page',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html#ad46824bcf955eca748ab30370d74662f',1,'openvdb::v3_2_0::util::PagedArray::Page::Page()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html#ab495bfa40de68d32054260ce1898f4a5',1,'openvdb::v3_2_0::util::PagedArray::Page::Page(const Page &other)']]], + ['pagecount',['pageCount',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#afa45f1c72bbf184403757d41a180933d',1,'openvdb::v3_2_0::util::PagedArray']]], + ['pagedarray',['PagedArray',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a53d94f3afe55677c30f923898e0c85e3',1,'openvdb::v3_2_0::util::PagedArray']]], + ['pagesize',['pageSize',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#afa3a6d6e461b89bd214b04bb6ed883a6',1,'openvdb::v3_2_0::util::PagedArray']]], + ['parent',['parent',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#a028d46713c75897f22290e78fd4bb097',1,'openvdb::v3_2_0::tree::IteratorBase::parent()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ValueBuffer.html#a6cb3c26c0f735364e7c31953f9509779',1,'openvdb::v3_2_0::util::PagedArray::ValueBuffer::parent()']]], + ['partgen',['PartGen',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartGen.html#a54cd529b5d19ddba8a4ac133162d85d1',1,'openvdb::v3_2_0::tools::internal::PartGen::PartGen(const LeafManagerT &leafs, size_t partitions, size_t activePart)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartGen.html#ae7abeabaf57d5b1143b666b190c14087',1,'openvdb::v3_2_0::tools::internal::PartGen::PartGen(PartGen &, tbb::split)']]], + ['particlearray',['particleArray',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#a1aba85bb14440b49ddba69c4fa3b7c99',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray']]], + ['particleatlas',['ParticleAtlas',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#a824e864e8d1f37ec1d425aae56d2a426',1,'openvdb::v3_2_0::tools::ParticleAtlas']]], + ['particlestolevelset',['ParticlesToLevelSet',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#ae726cfa78d37eb28295c1ce78c29e75b',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['partition',['partition',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#ab533746a172398b14d0ea46edc67131f',1,'openvdb::v3_2_0::tools::VolumeToMesh::partition()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal.html#afc0d0c6f5908b2b57899e9ab764924f3',1,'openvdb::v3_2_0::tools::point_partitioner_internal::partition()']]], + ['partop',['PartOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartOp.html#a4a28185630b6f8294d1a805a175382e1',1,'openvdb::v3_2_0::tools::internal::PartOp']]], + ['perspectivecamera',['PerspectiveCamera',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PerspectiveCamera.html#a0e217dd4e8c18e046caed7fbee8b6bb6',1,'openvdb::v3_2_0::tools::PerspectiveCamera']]], + ['pixel',['pixel',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Film.html#a0c9b5f2b03ee43f2f9abdbce9f54b51e',1,'openvdb::v3_2_0::tools::Film::pixel(size_t w, size_t h) const '],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Film.html#a5d9bc86ea99fdf1d8735de19ef424589',1,'openvdb::v3_2_0::tools::Film::pixel(size_t w, size_t h)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#a782e112415654e8e74d4faf06791032e',1,'openvdb::v3_2_0::tools::BaseCamera::pixel()']]], + ['pixels',['pixels',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Film.html#a688604aa803a696a002aa2256c915507',1,'openvdb::v3_2_0::tools::Film']]], + ['pointaccessor',['PointAccessor',['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PointAccessor.html#a1f626dd36946df7f9c331f4205038abe',1,'openvdb::v3_2_0::tools::internal::PointAccessor']]], + ['pointadvect',['PointAdvect',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#a08fa08c7b462c711299c3eb78410a97f',1,'openvdb::v3_2_0::tools::PointAdvect::PointAdvect(const GridT &velGrid, InterrupterType *interrupter=NULL)'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#af2014a5e562b98340ecf73991f6d0465',1,'openvdb::v3_2_0::tools::PointAdvect::PointAdvect(const PointAdvect &other)']]], + ['pointcount',['pointCount',['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadAndTriangleDataAdapter.html#a6187b928560add9deef56d5bf52206ba',1,'openvdb::v3_2_0::tools::QuadAndTriangleDataAdapter']]], + ['pointflags',['pointFlags',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#a3c99b75616a43477192d9dca14cd66fe',1,'openvdb::v3_2_0::tools::VolumeToMesh::pointFlags()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#adf931c7fffeebbc4d4d7f61a09c528bd',1,'openvdb::v3_2_0::tools::VolumeToMesh::pointFlags() const ']]], + ['pointindex',['PointIndex',['../structopenvdb_1_1v3__2__0_1_1PointIndex.html#a374fcf2ffb75483c7f0519a6441eaf23',1,'openvdb::v3_2_0::PointIndex']]], + ['pointindexfilter',['PointIndexFilter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexFilter.html#a31e21f972b6328d0afe68293989ced43',1,'openvdb::v3_2_0::tools::PointIndexFilter::PointIndexFilter(const PointArray &points, const TreeType &tree, const math::Transform &xform)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexFilter.html#a4e80ac3da79ef7d89e6ade56ce7b6006',1,'openvdb::v3_2_0::tools::PointIndexFilter::PointIndexFilter(const PointIndexFilter &rhs)']]], + ['pointindexgrid',['pointIndexGrid',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#ab9efc7602c90b866f6f9cd429b084cfe',1,'openvdb::v3_2_0::tools::ParticleAtlas::pointIndexGrid(size_t n)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#a853892982d81c9eb6ab8b885ef8520e1',1,'openvdb::v3_2_0::tools::ParticleAtlas::pointIndexGrid(size_t n) const ']]], + ['pointindexiterator',['PointIndexIterator',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a4e4afffbd814c870c852d2c35ec179ef',1,'openvdb::v3_2_0::tools::PointIndexIterator::PointIndexIterator()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a09130812bbbb7522393fb92f3388176a',1,'openvdb::v3_2_0::tools::PointIndexIterator::PointIndexIterator(const PointIndexIterator &rhs)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a35fa98f25d7bf1335ce920702e668714',1,'openvdb::v3_2_0::tools::PointIndexIterator::PointIndexIterator(const Coord &ijk, ConstAccessor &acc)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a59a38eaa08f11199d58d0b752acf288c',1,'openvdb::v3_2_0::tools::PointIndexIterator::PointIndexIterator(const CoordBBox &bbox, ConstAccessor &acc)']]], + ['pointindexleafnode',['PointIndexLeafNode',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a588802761d0d4120affc1744265cecd5',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::PointIndexLeafNode()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a0eb83a5db60623901bddc5cba5ac6a53',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::PointIndexLeafNode(const Coord &coords, const T &value=zeroVal< T >(), bool active=false)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a7b67f630151879400d660c13b27ed005',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::PointIndexLeafNode(PartialCreate, const Coord &coords, const T &value=zeroVal< T >(), bool active=false)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a43a3139912c984f08db8b2da458445fb',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::PointIndexLeafNode(const PointIndexLeafNode &rhs)']]], + ['pointindexsearch',['pointIndexSearch',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal.html#a37e6da3b3519fe210f327f4f46df6671',1,'openvdb::v3_2_0::tools::point_index_grid_internal']]], + ['pointindexsearchvoxels',['pointIndexSearchVoxels',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal.html#a855db80d38f4d21c84c0da733057fc43',1,'openvdb::v3_2_0::tools::point_index_grid_internal']]], + ['pointlist',['pointList',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#a4a884bcc7d41dea13808dfe8b335b029',1,'openvdb::v3_2_0::tools::VolumeToMesh']]], + ['pointlistcopy',['PointListCopy',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PointListCopy.html#a43cdb164968f7fe44ccd44b1c21a8e9c',1,'openvdb::v3_2_0::tools::internal::PointListCopy']]], + ['pointlistsize',['pointListSize',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#a66a0aa5d79111e4f11bebd3eaa286ae9',1,'openvdb::v3_2_0::tools::VolumeToMesh']]], + ['pointlisttransform',['PointListTransform',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PointListTransform.html#a067bfb6bdad10e80290a9ec1a345fab3',1,'openvdb::v3_2_0::tools::internal::PointListTransform']]], + ['pointmaskgrid',['PointMaskGrid',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid.html#ace7d5df0acb0591b23b3202377531565',1,'openvdb::v3_2_0::tools::PointMaskGrid::PointMaskGrid()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a3649899e0b20732ce887ccd09ec8d2fa',1,'openvdb::v3_2_0::tools::pointMaskGrid()']]], + ['pointpartitioner',['PointPartitioner',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#aa26a1faf57c765343af4af93454bbc68',1,'openvdb::v3_2_0::tools::PointPartitioner']]], + ['polardecomposition',['polarDecomposition',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a34e588510016f4264e031d2b488ae0c1',1,'openvdb::v3_2_0::math']]], + ['polygoncount',['polygonCount',['../structopenvdb_1_1v3__2__0_1_1tools_1_1QuadAndTriangleDataAdapter.html#a6683cc1c6d9c84da78f63d0c84d81905',1,'openvdb::v3_2_0::tools::QuadAndTriangleDataAdapter']]], + ['polygonpool',['PolygonPool',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#ad139ee6421d6a459d3c6cc329fa8369c',1,'openvdb::v3_2_0::tools::PolygonPool::PolygonPool()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PolygonPool.html#a56b4ced4fb1457e22c8948e6a7e980ca',1,'openvdb::v3_2_0::tools::PolygonPool::PolygonPool(const size_t numQuads, const size_t numTriangles)']]], + ['polygonpoollist',['polygonPoolList',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#a47eaa59d46e277e0894282c29fd2e6f7',1,'openvdb::v3_2_0::tools::VolumeToMesh::polygonPoolList()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#a0e30e7904f1c1a19966f3f21293de9f6',1,'openvdb::v3_2_0::tools::VolumeToMesh::polygonPoolList() const ']]], + ['polygonpoollistsize',['polygonPoolListSize',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeToMesh.html#a6aecefda5d4b8e88c2ad911043a13a5c',1,'openvdb::v3_2_0::tools::VolumeToMesh']]], + ['pop_5fback',['pop_back',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#ab48f65e37130b674bc0f6220cbb59491',1,'openvdb::v3_2_0::util::PagedArray']]], + ['populateindextree',['populateIndexTree',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#a28bc96576c35b652d14262997693ef21',1,'openvdb::v3_2_0::tools::poisson']]], + ['populateleafnodesop',['PopulateLeafNodesOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1PopulateLeafNodesOp.html#a6a2ff4d707969e25e365d8209f879cb6',1,'openvdb::v3_2_0::tools::point_index_grid_internal::PopulateLeafNodesOp']]], + ['populatetree',['PopulateTree',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1PopulateTree.html#a3ba76eb2a9ee89f1f9078f0e36c65e5d',1,'openvdb::v3_2_0::tools::level_set_util_internal::PopulateTree::PopulateTree(TreeType &tree, LeafNodeType **leafnodes, const size_t *nodexIndexMap, ValueType background)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1PopulateTree.html#a82daa4cf479cc03a01ebb86552e43df8',1,'openvdb::v3_2_0::tools::level_set_util_internal::PopulateTree::PopulateTree(PopulateTree &rhs, tbb::split)']]], + ['pos',['pos',['../classopenvdb_1_1v3__2__0_1_1math_1_1SevenPointStencil.html#a8a1412a115d1cf6b91b1e48da65bb44f',1,'openvdb::v3_2_0::math::SevenPointStencil::pos()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BoxStencil.html#a8a1412a115d1cf6b91b1e48da65bb44f',1,'openvdb::v3_2_0::math::BoxStencil::pos()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SecondOrderDenseStencil.html#a8a1412a115d1cf6b91b1e48da65bb44f',1,'openvdb::v3_2_0::math::SecondOrderDenseStencil::pos()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ThirteenPointStencil.html#a8a1412a115d1cf6b91b1e48da65bb44f',1,'openvdb::v3_2_0::math::ThirteenPointStencil::pos()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1FourthOrderDenseStencil.html#a8a1412a115d1cf6b91b1e48da65bb44f',1,'openvdb::v3_2_0::math::FourthOrderDenseStencil::pos()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NineteenPointStencil.html#a8a1412a115d1cf6b91b1e48da65bb44f',1,'openvdb::v3_2_0::math::NineteenPointStencil::pos()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SixthOrderDenseStencil.html#a8a1412a115d1cf6b91b1e48da65bb44f',1,'openvdb::v3_2_0::math::SixthOrderDenseStencil::pos()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IteratorBase.html#aa7079339b0d8f4039d67a7e8a25c190e',1,'openvdb::v3_2_0::tree::IteratorBase::pos()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager_1_1LeafRange_1_1Iterator.html#af80a47b72287661cccd127d6ea9b5c36',1,'openvdb::v3_2_0::tree::LeafManager::LeafRange::Iterator::pos()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList_1_1NodeRange_1_1Iterator.html#af80a47b72287661cccd127d6ea9b5c36',1,'openvdb::v3_2_0::tree::NodeList::NodeRange::Iterator::pos()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#ac56586316283b607b1846ba5f264ee3e',1,'openvdb::v3_2_0::tree::IterListItem::pos()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#ac56586316283b607b1846ba5f264ee3e',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::pos()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#ac56586316283b607b1846ba5f264ee3e',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::pos()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html#a40e01968e3f2015064127f0227052f58',1,'openvdb::v3_2_0::util::BaseMaskIterator::pos()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#a40e01968e3f2015064127f0227052f58',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::pos()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#af80a47b72287661cccd127d6ea9b5c36',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::pos()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#af80a47b72287661cccd127d6ea9b5c36',1,'openvdb::v3_2_0::util::PagedArray::Iterator::pos()']]], + ['positionshader',['PositionShader',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PositionShader.html#afb3ce29d1fe4604e1f2c775c9b6725fe',1,'openvdb::v3_2_0::tools::PositionShader::PositionShader()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PositionShader_3_01Film_1_1RGBA_00_01SamplerType_01_4.html#a5920d9c6e5f9c8d83f48cb58244df760',1,'openvdb::v3_2_0::tools::PositionShader< Film::RGBA, SamplerType >::PositionShader()']]], + ['postmult',['postMult',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a548d9f1c7b9af3790c9b8658222f33a5',1,'openvdb::v3_2_0::math::Transform::postMult(const Mat4d &)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a20ae8d3b76a69e5c9f08e8507ccf7508',1,'openvdb::v3_2_0::math::Transform::postMult(const Mat3d &)']]], + ['postrotate',['postRotate',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#aed096136416779ab650333931b2f9858',1,'openvdb::v3_2_0::math::MapBase::postRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#aae45404fb6a65190ce789f7671f7460c',1,'openvdb::v3_2_0::math::AffineMap::postRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#ab86ba48fb5953c630c9203d7900a41b7',1,'openvdb::v3_2_0::math::ScaleMap::postRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#ab86ba48fb5953c630c9203d7900a41b7',1,'openvdb::v3_2_0::math::TranslationMap::postRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#ab86ba48fb5953c630c9203d7900a41b7',1,'openvdb::v3_2_0::math::ScaleTranslateMap::postRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#ab86ba48fb5953c630c9203d7900a41b7',1,'openvdb::v3_2_0::math::UnitaryMap::postRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#aae45404fb6a65190ce789f7671f7460c',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::postRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a33aea91c54ba93aecc1a648e464f89a8',1,'openvdb::v3_2_0::math::Mat4::postRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a38a350340789d94656e71eee9916076c',1,'openvdb::v3_2_0::math::Transform::postRotate()']]], + ['postscale',['postScale',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#aef66dc19dc5723d057d4367d74356455',1,'openvdb::v3_2_0::math::MapBase::postScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a0c8efa8ae6bb141efc8cab673324e92c',1,'openvdb::v3_2_0::math::AffineMap::postScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a1bbd96799c4c8d0ff62eb8cc25e86395',1,'openvdb::v3_2_0::math::ScaleMap::postScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a1bbd96799c4c8d0ff62eb8cc25e86395',1,'openvdb::v3_2_0::math::TranslationMap::postScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a1bbd96799c4c8d0ff62eb8cc25e86395',1,'openvdb::v3_2_0::math::ScaleTranslateMap::postScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a1bbd96799c4c8d0ff62eb8cc25e86395',1,'openvdb::v3_2_0::math::UnitaryMap::postScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a0c8efa8ae6bb141efc8cab673324e92c',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::postScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#ac144e1db0c68fd87748e27fe4d96f80a',1,'openvdb::v3_2_0::math::Mat4::postScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#ad69f937f25ac5be7c9a71a3e0deddb2d',1,'openvdb::v3_2_0::math::Transform::postScale(const Vec3d &)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a82659cde4fe069a70880dfcb139e24db',1,'openvdb::v3_2_0::math::Transform::postScale(double)']]], + ['postshear',['postShear',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#aede26dff492edb1a38267b60ece00bc8',1,'openvdb::v3_2_0::math::MapBase::postShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a53a07c4faa1621f3b670818f5f046b5e',1,'openvdb::v3_2_0::math::AffineMap::postShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a53a07c4faa1621f3b670818f5f046b5e',1,'openvdb::v3_2_0::math::ScaleMap::postShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a53a07c4faa1621f3b670818f5f046b5e',1,'openvdb::v3_2_0::math::TranslationMap::postShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a53a07c4faa1621f3b670818f5f046b5e',1,'openvdb::v3_2_0::math::ScaleTranslateMap::postShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a53a07c4faa1621f3b670818f5f046b5e',1,'openvdb::v3_2_0::math::UnitaryMap::postShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a53a07c4faa1621f3b670818f5f046b5e',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::postShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a63c1c6744beeceedaa2b3bafe94aaf48',1,'openvdb::v3_2_0::math::Mat4::postShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#af73ca4f71e4871c9677e17d37b3c69ea',1,'openvdb::v3_2_0::math::Transform::postShear()']]], + ['posttranslate',['postTranslate',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#ac106d7886d3a2139a952331ed2d76250',1,'openvdb::v3_2_0::math::MapBase::postTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a0722d5393c41367cef98374f3e8c0f17',1,'openvdb::v3_2_0::math::AffineMap::postTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#ac92bf622b4d941cd239479748e5166c3',1,'openvdb::v3_2_0::math::ScaleMap::postTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#ac92bf622b4d941cd239479748e5166c3',1,'openvdb::v3_2_0::math::UniformScaleMap::postTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a0722d5393c41367cef98374f3e8c0f17',1,'openvdb::v3_2_0::math::TranslationMap::postTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a0722d5393c41367cef98374f3e8c0f17',1,'openvdb::v3_2_0::math::ScaleTranslateMap::postTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#a0722d5393c41367cef98374f3e8c0f17',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::postTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a0722d5393c41367cef98374f3e8c0f17',1,'openvdb::v3_2_0::math::UnitaryMap::postTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a0722d5393c41367cef98374f3e8c0f17',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::postTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a051d1c234447df316d9e611c13b526f6',1,'openvdb::v3_2_0::math::Mat4::postTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#aa37a11b327b78181359f5e35227156c0',1,'openvdb::v3_2_0::math::Transform::postTranslate()']]], + ['pow',['Pow',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9d3a91c9312258022d3e34a212e2a130',1,'openvdb::v3_2_0::math::Pow(Type x, int n)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aadf1dd1bf05b3017841664ede48c343a',1,'openvdb::v3_2_0::math::Pow(float b, float e)'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a46eb7772fda09f75afcbae730a29208d',1,'openvdb::v3_2_0::math::Pow(double b, double e)']]], + ['pow2',['Pow2',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4736afb360be55356565a64271b5ce3c',1,'openvdb::v3_2_0::math']]], + ['pow3',['Pow3',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af8b85f71555f3afc0a280f4b925433f1',1,'openvdb::v3_2_0::math']]], + ['pow4',['Pow4',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7cc76fba52ca4f8b0b64367b5d13d246',1,'openvdb::v3_2_0::math']]], + ['powlerp',['powLerp',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ac764dd6f0550faabdafc99e4de8d6e90',1,'openvdb::v3_2_0::math']]], + ['powsolve',['powSolve',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a423a0c217b954107035844a0248caffd',1,'openvdb::v3_2_0::math']]], + ['preconditioner',['Preconditioner',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Preconditioner.html#a275167db1b005dd48d695928098f46b7',1,'openvdb::v3_2_0::math::pcg::Preconditioner']]], + ['premult',['preMult',['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#adfb2cf25ab2e2d86da604c83fac6ff13',1,'openvdb::v3_2_0::math::Transform::preMult(const Mat4d &)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#afc3bae4fb226a832c0399a68e1d5a0f5',1,'openvdb::v3_2_0::math::Transform::preMult(const Mat3d &)']]], + ['prerotate',['preRotate',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#afe3c54df679a73cfa441d30942f2b4a4',1,'openvdb::v3_2_0::math::MapBase::preRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#ab3a4f47b042c11efd22aec7e41ec2383',1,'openvdb::v3_2_0::math::AffineMap::preRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a6cc8f42b8d2e0f79281762f7f3f48645',1,'openvdb::v3_2_0::math::ScaleMap::preRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a6cc8f42b8d2e0f79281762f7f3f48645',1,'openvdb::v3_2_0::math::TranslationMap::preRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a6cc8f42b8d2e0f79281762f7f3f48645',1,'openvdb::v3_2_0::math::ScaleTranslateMap::preRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a6cc8f42b8d2e0f79281762f7f3f48645',1,'openvdb::v3_2_0::math::UnitaryMap::preRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#ab3a4f47b042c11efd22aec7e41ec2383',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::preRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a553dbb93ea3eb9ccf0e075123bb48b90',1,'openvdb::v3_2_0::math::Mat4::preRotate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a827df214068afcf258e91d06dc9d52a8',1,'openvdb::v3_2_0::math::Transform::preRotate()']]], + ['prescale',['preScale',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#aa353a0418553cbbab46d50a751fec522',1,'openvdb::v3_2_0::math::MapBase::preScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a41ade2084e0355463c7eca46c78666d6',1,'openvdb::v3_2_0::math::AffineMap::preScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#a86f8266f45d17c36039896bc5b0772f9',1,'openvdb::v3_2_0::math::ScaleMap::preScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a86f8266f45d17c36039896bc5b0772f9',1,'openvdb::v3_2_0::math::TranslationMap::preScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a86f8266f45d17c36039896bc5b0772f9',1,'openvdb::v3_2_0::math::ScaleTranslateMap::preScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a86f8266f45d17c36039896bc5b0772f9',1,'openvdb::v3_2_0::math::UnitaryMap::preScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a41ade2084e0355463c7eca46c78666d6',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::preScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a1442bceaea3367cd5b2d2ff89d0d1b4b',1,'openvdb::v3_2_0::math::Mat4::preScale()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a52c3265c5b7754792cc180b7f05ad379',1,'openvdb::v3_2_0::math::Transform::preScale(const Vec3d &)'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#ae01329231434be4d1f32e4771b6582a4',1,'openvdb::v3_2_0::math::Transform::preScale(double)']]], + ['preshear',['preShear',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a51695fff90d4242b4379a3317f46e3fa',1,'openvdb::v3_2_0::math::MapBase::preShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#aff99cd3a472d1ce6aa79a4fee4c2953c',1,'openvdb::v3_2_0::math::AffineMap::preShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#aff99cd3a472d1ce6aa79a4fee4c2953c',1,'openvdb::v3_2_0::math::ScaleMap::preShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#aff99cd3a472d1ce6aa79a4fee4c2953c',1,'openvdb::v3_2_0::math::TranslationMap::preShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#aff99cd3a472d1ce6aa79a4fee4c2953c',1,'openvdb::v3_2_0::math::ScaleTranslateMap::preShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#aff99cd3a472d1ce6aa79a4fee4c2953c',1,'openvdb::v3_2_0::math::UnitaryMap::preShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#aff99cd3a472d1ce6aa79a4fee4c2953c',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::preShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a788febd9a66a36a1c19f607079e61291',1,'openvdb::v3_2_0::math::Mat4::preShear()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#ae2352091736b5dc540b23ee612307422',1,'openvdb::v3_2_0::math::Transform::preShear()']]], + ['pretransform',['pretransform',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#aaf30abe93cba053480ccaa110aa13c3b',1,'openvdb::v3_2_0::math::Mat3::pretransform()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a30b6f926de87ee5c9fa638c51535707d',1,'openvdb::v3_2_0::math::Mat4::pretransform(const Vec4< T0 > &v) const '],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#aaf30abe93cba053480ccaa110aa13c3b',1,'openvdb::v3_2_0::math::Mat4::pretransform(const Vec3< T0 > &v) const ']]], + ['pretransformh',['pretransformH',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a955f5393e942df350011b7e4fdb37ce4',1,'openvdb::v3_2_0::math::Mat4']]], + ['pretranslate',['preTranslate',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#aec333f513fcc5b569ec697b3f2c79d86',1,'openvdb::v3_2_0::math::MapBase::preTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a366e490514e0a76c4307eec7c4784bae',1,'openvdb::v3_2_0::math::AffineMap::preTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#ace58bd308ece873d3327a40bd30a090a',1,'openvdb::v3_2_0::math::ScaleMap::preTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#ace58bd308ece873d3327a40bd30a090a',1,'openvdb::v3_2_0::math::UniformScaleMap::preTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a366e490514e0a76c4307eec7c4784bae',1,'openvdb::v3_2_0::math::TranslationMap::preTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a366e490514e0a76c4307eec7c4784bae',1,'openvdb::v3_2_0::math::ScaleTranslateMap::preTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#a366e490514e0a76c4307eec7c4784bae',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::preTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a366e490514e0a76c4307eec7c4784bae',1,'openvdb::v3_2_0::math::UnitaryMap::preTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a366e490514e0a76c4307eec7c4784bae',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::preTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a2ea9bf4884840c97e8055d7dedc127b0',1,'openvdb::v3_2_0::math::Mat4::preTranslate()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a156d4b4a7608b24ec006a77932474bb1',1,'openvdb::v3_2_0::math::Transform::preTranslate()']]], + ['primcpy',['PrimCpy',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PrimCpy.html#a8a7a0cd5dbc5073fce67059be2c34773',1,'openvdb::v3_2_0::tools::internal::PrimCpy']]], + ['print',['print',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a90d0a29cd7eeaaa69057b57dbba56e08',1,'openvdb::v3_2_0::GridBase::print()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a64b3c93051a7b475b0ed59c10c901248',1,'openvdb::v3_2_0::Grid::print()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#a3d83bd59cda5c6a2e4d9cbaa484ef6e0',1,'openvdb::v3_2_0::math::DDA::print()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MinMax.html#a4c6b24818abce963a6c8823a9ae0d1dc',1,'openvdb::v3_2_0::math::MinMax::print()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#a4c6b24818abce963a6c8823a9ae0d1dc',1,'openvdb::v3_2_0::math::Extrema::print()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#a4c6b24818abce963a6c8823a9ae0d1dc',1,'openvdb::v3_2_0::math::Stats::print()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Histogram.html#ae17eb77c1ea1c47a0c0c6a6fa82a6058',1,'openvdb::v3_2_0::math::Histogram::print()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#ad6b0bbfc212faafdbaecb6631f579718',1,'openvdb::v3_2_0::math::Transform::print()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a5d2a16e5a5dc7bd9b77421ae9bd646a0',1,'openvdb::v3_2_0::tools::Dense::print()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a64b3c93051a7b475b0ed59c10c901248',1,'openvdb::v3_2_0::tools::MultiResGrid::print()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1UniformPointScatter.html#a70fb4e9c5c323f3e57454cdf70c7b159',1,'openvdb::v3_2_0::tools::UniformPointScatter::print()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseUniformPointScatter.html#a70fb4e9c5c323f3e57454cdf70c7b159',1,'openvdb::v3_2_0::tools::DenseUniformPointScatter::print()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1NonUniformPointScatter.html#a70fb4e9c5c323f3e57454cdf70c7b159',1,'openvdb::v3_2_0::tools::NonUniformPointScatter::print()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a5474dcdd01eba8c989b9faf9e0e88f91',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::print()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#a5474dcdd01eba8c989b9faf9e0e88f91',1,'openvdb::v3_2_0::tools::VolumeRender::print()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a179b817778ec6b6608839c31de7c9da2',1,'openvdb::v3_2_0::tree::TreeBase::print()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a179b817778ec6b6608839c31de7c9da2',1,'openvdb::v3_2_0::tree::Tree::print()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a3d83bd59cda5c6a2e4d9cbaa484ef6e0',1,'openvdb::v3_2_0::util::PagedArray::print()']]], + ['printall',['printAll',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a163b6941a1d3877788ea4d11d8a3d991',1,'openvdb::v3_2_0::util::NodeMask::printAll()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a4f28028c364847215d634c0580d9451f',1,'openvdb::v3_2_0::util::NodeMask< 1 >::printAll()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a4f28028c364847215d634c0580d9451f',1,'openvdb::v3_2_0::util::NodeMask< 2 >::printAll()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a163b6941a1d3877788ea4d11d8a3d991',1,'openvdb::v3_2_0::util::RootNodeMask::printAll()']]], + ['printbits',['printBits',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#adbb2b267300ff6d49a26d3adcc571694',1,'openvdb::v3_2_0::util::NodeMask::printBits()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#aceaad207dfef320af7748398666b9721',1,'openvdb::v3_2_0::util::NodeMask< 1 >::printBits()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#aceaad207dfef320af7748398666b9721',1,'openvdb::v3_2_0::util::NodeMask< 2 >::printBits()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#adbb2b267300ff6d49a26d3adcc571694',1,'openvdb::v3_2_0::util::RootNodeMask::printBits()']]], + ['printbytes',['printBytes',['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a1b7fb487c9eddb26b58152c6acb19709',1,'openvdb::v3_2_0::util']]], + ['printinfo',['printInfo',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a4dc1f182fc93d3fd640b8d00c7f6738b',1,'openvdb::v3_2_0::util::NodeMask::printInfo()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a4dc1f182fc93d3fd640b8d00c7f6738b',1,'openvdb::v3_2_0::util::NodeMask< 1 >::printInfo()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a4dc1f182fc93d3fd640b8d00c7f6738b',1,'openvdb::v3_2_0::util::NodeMask< 2 >::printInfo()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a4dc1f182fc93d3fd640b8d00c7f6738b',1,'openvdb::v3_2_0::util::RootNodeMask::printInfo()']]], + ['printnumber',['printNumber',['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a1d637aa58ffb3ce95ea51108fb15b2b2',1,'openvdb::v3_2_0::util']]], + ['probechild',['probeChild',['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#ad714fb7774cad75ef742d4fa97b603fd',1,'openvdb::v3_2_0::tree::DenseIteratorBase::probeChild(NonConstValueType &value) const '],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#ab5ce147c7a8d7b56be7bedeb41c5bd64',1,'openvdb::v3_2_0::tree::DenseIteratorBase::probeChild(SetItemT *&child, NonConstValueType &value) const ']]], + ['probeconstleaf',['probeConstLeaf',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a488340833bdc0183cd16b071d917728d',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::probeConstLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ab0e736a8c396807bd2643176d6e7beee',1,'openvdb::v3_2_0::tree::InternalNode::probeConstLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#afbd1b7c386409e38d52b54a751b8401d',1,'openvdb::v3_2_0::tree::LeafNode::probeConstLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#afbd1b7c386409e38d52b54a751b8401d',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::probeConstLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#afbd1b7c386409e38d52b54a751b8401d',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::probeConstLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ab0e736a8c396807bd2643176d6e7beee',1,'openvdb::v3_2_0::tree::RootNode::probeConstLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a5730e3a8bc07b016c9c4f95f62651e32',1,'openvdb::v3_2_0::tree::Tree::probeConstLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a4a86e7d65de16a43a7b1eef5c5da1033',1,'openvdb::v3_2_0::tree::ValueAccessor::probeConstLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#ad3822b561fe227ab527e6bc9e7fd2761',1,'openvdb::v3_2_0::tree::CacheItem::probeConstLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#ad3822b561fe227ab527e6bc9e7fd2761',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::probeConstLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a4a86e7d65de16a43a7b1eef5c5da1033',1,'openvdb::v3_2_0::tree::ValueAccessor0::probeConstLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a4a86e7d65de16a43a7b1eef5c5da1033',1,'openvdb::v3_2_0::tree::ValueAccessor1::probeConstLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a152df98a1e265346919d5fa90283139d',1,'openvdb::v3_2_0::tree::ValueAccessor2::probeConstLeaf(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a4a86e7d65de16a43a7b1eef5c5da1033',1,'openvdb::v3_2_0::tree::ValueAccessor2::probeConstLeaf(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a4a86e7d65de16a43a7b1eef5c5da1033',1,'openvdb::v3_2_0::tree::ValueAccessor3::probeConstLeaf()']]], + ['probeconstleafandcache',['probeConstLeafAndCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ad9c7cd26fd2944ab72dda78a979ba0ff',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::probeConstLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a1df4d3142810d501c9a24a329e838536',1,'openvdb::v3_2_0::tree::InternalNode::probeConstLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a4fd7ba7b9a5dd59af220c5a145c70bc1',1,'openvdb::v3_2_0::tree::LeafNode::probeConstLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a4fd7ba7b9a5dd59af220c5a145c70bc1',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::probeConstLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a4fd7ba7b9a5dd59af220c5a145c70bc1',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::probeConstLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a1df4d3142810d501c9a24a329e838536',1,'openvdb::v3_2_0::tree::RootNode::probeConstLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a6df78afa72de28b8ffe278e4b40554f9',1,'openvdb::v3_2_0::tree::InternalNode::probeConstLeafAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a6df78afa72de28b8ffe278e4b40554f9',1,'openvdb::v3_2_0::tree::RootNode::probeConstLeafAndCache()']]], + ['probeconstnode',['probeConstNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a5d69d156fff1dfe3f65db583558c8d52',1,'openvdb::v3_2_0::tree::InternalNode::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a9a2464f7acaee2ea2cb6caf2d2a24914',1,'openvdb::v3_2_0::tree::LeafNode::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a9a2464f7acaee2ea2cb6caf2d2a24914',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a9a2464f7acaee2ea2cb6caf2d2a24914',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ae193824374c84407959836af2b954d24',1,'openvdb::v3_2_0::tree::RootNode::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a6a15e82fdd32905312c0260f66f9129a',1,'openvdb::v3_2_0::tree::Tree::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#ad1db5a3cd9f727c41548cecb5a6c633a',1,'openvdb::v3_2_0::tree::ValueAccessor::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a5823dba000645b7eee8cec1908e2d49f',1,'openvdb::v3_2_0::tree::CacheItem::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a8f0f94778aeb2d83da174ea39f2e760c',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#ad1db5a3cd9f727c41548cecb5a6c633a',1,'openvdb::v3_2_0::tree::ValueAccessor0::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#ad1db5a3cd9f727c41548cecb5a6c633a',1,'openvdb::v3_2_0::tree::ValueAccessor1::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#ad1db5a3cd9f727c41548cecb5a6c633a',1,'openvdb::v3_2_0::tree::ValueAccessor2::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#ad1db5a3cd9f727c41548cecb5a6c633a',1,'openvdb::v3_2_0::tree::ValueAccessor3::probeConstNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ad1db5a3cd9f727c41548cecb5a6c633a',1,'openvdb::v3_2_0::tree::InternalNode::probeConstNode()']]], + ['probeconstnodeandcache',['probeConstNodeAndCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a008c0f4a1887952d6f1abe2a1f50ebda',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::probeConstNodeAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#add8131519ed759d408a0a4d57563efab',1,'openvdb::v3_2_0::tree::InternalNode::probeConstNodeAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a008c0f4a1887952d6f1abe2a1f50ebda',1,'openvdb::v3_2_0::tree::LeafNode::probeConstNodeAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a008c0f4a1887952d6f1abe2a1f50ebda',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::probeConstNodeAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a008c0f4a1887952d6f1abe2a1f50ebda',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::probeConstNodeAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#aa5343004e67df99c4720888555351b29',1,'openvdb::v3_2_0::tree::RootNode::probeConstNodeAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a8f6136a9adc7cb5bd213a75f9a37ca03',1,'openvdb::v3_2_0::tree::InternalNode::probeConstNodeAndCache()']]], + ['probeleaf',['probeLeaf',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a978340cfc174f809203a7eb56ae43357',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::probeLeaf(const Coord &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a8f35954f2e082c780a1f3b8a9dc336d7',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::probeLeaf(const Coord &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a416387666c1bf211debea718d27e5e2f',1,'openvdb::v3_2_0::tree::InternalNode::probeLeaf(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a0565d3c3e0bd185197352b63e4d7a1e7',1,'openvdb::v3_2_0::tree::InternalNode::probeLeaf(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a1bf288e37bf3e1e2811374d4b29b9d17',1,'openvdb::v3_2_0::tree::LeafNode::probeLeaf(const Coord &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a3d9829bdb6a976e32a4d38dab5af9421',1,'openvdb::v3_2_0::tree::LeafNode::probeLeaf(const Coord &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a1bf288e37bf3e1e2811374d4b29b9d17',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::probeLeaf(const Coord &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a3d9829bdb6a976e32a4d38dab5af9421',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::probeLeaf(const Coord &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a1bf288e37bf3e1e2811374d4b29b9d17',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::probeLeaf(const Coord &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a3d9829bdb6a976e32a4d38dab5af9421',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::probeLeaf(const Coord &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a416387666c1bf211debea718d27e5e2f',1,'openvdb::v3_2_0::tree::RootNode::probeLeaf(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a0565d3c3e0bd185197352b63e4d7a1e7',1,'openvdb::v3_2_0::tree::RootNode::probeLeaf(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a48bab17c2781af76eacbc64ba399e1d7',1,'openvdb::v3_2_0::tree::Tree::probeLeaf(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a0565d3c3e0bd185197352b63e4d7a1e7',1,'openvdb::v3_2_0::tree::Tree::probeLeaf(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a0b1a8557f5239a416f76dbc2e99dbd82',1,'openvdb::v3_2_0::tree::ValueAccessor::probeLeaf(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a1073bed5f60f76508014a877796d8082',1,'openvdb::v3_2_0::tree::ValueAccessor::probeLeaf(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a4a4d3e3612ea8bda4adc059ac9b87e5c',1,'openvdb::v3_2_0::tree::CacheItem::probeLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a4a4d3e3612ea8bda4adc059ac9b87e5c',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::probeLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a0b1a8557f5239a416f76dbc2e99dbd82',1,'openvdb::v3_2_0::tree::ValueAccessor0::probeLeaf(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a1073bed5f60f76508014a877796d8082',1,'openvdb::v3_2_0::tree::ValueAccessor0::probeLeaf(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a0b1a8557f5239a416f76dbc2e99dbd82',1,'openvdb::v3_2_0::tree::ValueAccessor1::probeLeaf(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a1073bed5f60f76508014a877796d8082',1,'openvdb::v3_2_0::tree::ValueAccessor1::probeLeaf(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a0b1a8557f5239a416f76dbc2e99dbd82',1,'openvdb::v3_2_0::tree::ValueAccessor2::probeLeaf(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a1073bed5f60f76508014a877796d8082',1,'openvdb::v3_2_0::tree::ValueAccessor2::probeLeaf(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a0b1a8557f5239a416f76dbc2e99dbd82',1,'openvdb::v3_2_0::tree::ValueAccessor3::probeLeaf(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a1073bed5f60f76508014a877796d8082',1,'openvdb::v3_2_0::tree::ValueAccessor3::probeLeaf(const Coord &xyz) const ']]], + ['probeleafandcache',['probeLeafAndCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#afe22f5356467d106fda49b77d4f4f87d',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::probeLeafAndCache(const Coord &, AccessorT &)'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a32e507889d4cca30bba783d8b8b2bc4a',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::probeLeafAndCache(const Coord &, AccessorT &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a69eaa58a07109bba3487f514bc5d03bf',1,'openvdb::v3_2_0::tree::InternalNode::probeLeafAndCache(const Coord &xyz, AccessorT &acc)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ac52a4f527e2f7c37f9cacb2e12676628',1,'openvdb::v3_2_0::tree::InternalNode::probeLeafAndCache(const Coord &xyz, AccessorT &acc) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a99121ff7318d421a7ffc24f5c9c7092e',1,'openvdb::v3_2_0::tree::LeafNode::probeLeafAndCache(const Coord &, AccessorT &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a0b60fbdbc81d9dd21200a542d1f09acb',1,'openvdb::v3_2_0::tree::LeafNode::probeLeafAndCache(const Coord &, AccessorT &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a99121ff7318d421a7ffc24f5c9c7092e',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::probeLeafAndCache(const Coord &, AccessorT &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a0b60fbdbc81d9dd21200a542d1f09acb',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::probeLeafAndCache(const Coord &, AccessorT &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a99121ff7318d421a7ffc24f5c9c7092e',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::probeLeafAndCache(const Coord &, AccessorT &)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a0b60fbdbc81d9dd21200a542d1f09acb',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::probeLeafAndCache(const Coord &, AccessorT &) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a69eaa58a07109bba3487f514bc5d03bf',1,'openvdb::v3_2_0::tree::RootNode::probeLeafAndCache(const Coord &xyz, AccessorT &acc)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ac52a4f527e2f7c37f9cacb2e12676628',1,'openvdb::v3_2_0::tree::RootNode::probeLeafAndCache(const Coord &xyz, AccessorT &acc) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a3337cf5ee7f6e4190d74a28320d226e3',1,'openvdb::v3_2_0::tree::InternalNode::probeLeafAndCache(const Coord &xyz, AccessorT &acc)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a19109c78ded455aa6750cf943d70a96e',1,'openvdb::v3_2_0::tree::InternalNode::probeLeafAndCache(const Coord &xyz, AccessorT &acc) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a3337cf5ee7f6e4190d74a28320d226e3',1,'openvdb::v3_2_0::tree::RootNode::probeLeafAndCache(const Coord &xyz, AccessorT &acc)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a19109c78ded455aa6750cf943d70a96e',1,'openvdb::v3_2_0::tree::RootNode::probeLeafAndCache(const Coord &xyz, AccessorT &acc) const ']]], + ['probenode',['probeNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#af75b5bd4a7cdb2d9472f3327e1c28277',1,'openvdb::v3_2_0::tree::InternalNode::probeNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#af8bae6cfc399078500a25075c8392340',1,'openvdb::v3_2_0::tree::LeafNode::probeNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#af8bae6cfc399078500a25075c8392340',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::probeNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#af8bae6cfc399078500a25075c8392340',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::probeNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#af4aba8013df108be4d7eb3f58dd72cc6',1,'openvdb::v3_2_0::tree::RootNode::probeNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a1096806c2a3867c6a168981093c5a0fe',1,'openvdb::v3_2_0::tree::Tree::probeNode(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a8aeba79ef14e7bd1c9ec1a00f959e3b6',1,'openvdb::v3_2_0::tree::Tree::probeNode(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#ab1f0b235067a11fd0a6a03f48573723c',1,'openvdb::v3_2_0::tree::ValueAccessor::probeNode(const Coord &xyz)'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#aecd6f4986aeee9221c8eec8b637fbb9b',1,'openvdb::v3_2_0::tree::ValueAccessor::probeNode(const Coord &xyz) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#ab1f0b235067a11fd0a6a03f48573723c',1,'openvdb::v3_2_0::tree::CacheItem::probeNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#af75b5bd4a7cdb2d9472f3327e1c28277',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::probeNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#ab1f0b235067a11fd0a6a03f48573723c',1,'openvdb::v3_2_0::tree::ValueAccessor0::probeNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#ab1f0b235067a11fd0a6a03f48573723c',1,'openvdb::v3_2_0::tree::ValueAccessor1::probeNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#ab1f0b235067a11fd0a6a03f48573723c',1,'openvdb::v3_2_0::tree::ValueAccessor2::probeNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#ab1f0b235067a11fd0a6a03f48573723c',1,'openvdb::v3_2_0::tree::ValueAccessor3::probeNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ab1f0b235067a11fd0a6a03f48573723c',1,'openvdb::v3_2_0::tree::InternalNode::probeNode()']]], + ['probenodeandcache',['probeNodeAndCache',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a25259439cdd265f95cea4b55ded1a1c6',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::probeNodeAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ab553194d6f24e37d0486b99f12d5b970',1,'openvdb::v3_2_0::tree::InternalNode::probeNodeAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a25259439cdd265f95cea4b55ded1a1c6',1,'openvdb::v3_2_0::tree::LeafNode::probeNodeAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a25259439cdd265f95cea4b55ded1a1c6',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::probeNodeAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a25259439cdd265f95cea4b55ded1a1c6',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::probeNodeAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a4603c14d21fce223c55c03783fb7a8b2',1,'openvdb::v3_2_0::tree::RootNode::probeNodeAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a93451bf57e5716c6f7d5d01c28c611d3',1,'openvdb::v3_2_0::tree::InternalNode::probeNodeAndCache()']]], + ['probevalue',['probeValue',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a0535ed999c1364a5bc5f31e668e5ef7c',1,'openvdb::v3_2_0::tree::InternalNode::probeValue()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a15daa1515991b5da293bc31b3d1af167',1,'openvdb::v3_2_0::tree::DenseIteratorBase::probeValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ad45d685c273174dfb07180a2f0d38a8f',1,'openvdb::v3_2_0::tree::LeafNode::probeValue(const Coord &xyz, ValueType &val) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aa133b9ced16d8e132ed376e9fe712157',1,'openvdb::v3_2_0::tree::LeafNode::probeValue(Index offset, ValueType &val) const '],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a384ddbb5e1f9bdad64f4f3f430fce809',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::probeValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a384ddbb5e1f9bdad64f4f3f430fce809',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::probeValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a0535ed999c1364a5bc5f31e668e5ef7c',1,'openvdb::v3_2_0::tree::RootNode::probeValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a0535ed999c1364a5bc5f31e668e5ef7c',1,'openvdb::v3_2_0::tree::Tree::probeValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a0535ed999c1364a5bc5f31e668e5ef7c',1,'openvdb::v3_2_0::tree::ValueAccessor::probeValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a34e96f272ab481eb549ee29fff242881',1,'openvdb::v3_2_0::tree::CacheItem::probeValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a34e96f272ab481eb549ee29fff242881',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::probeValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a0535ed999c1364a5bc5f31e668e5ef7c',1,'openvdb::v3_2_0::tree::ValueAccessor0::probeValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a0535ed999c1364a5bc5f31e668e5ef7c',1,'openvdb::v3_2_0::tree::ValueAccessor1::probeValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a0535ed999c1364a5bc5f31e668e5ef7c',1,'openvdb::v3_2_0::tree::ValueAccessor2::probeValue()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a0535ed999c1364a5bc5f31e668e5ef7c',1,'openvdb::v3_2_0::tree::ValueAccessor3::probeValue()']]], + ['probevalueandcache',['probeValueAndCache',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ab682876d96e5d4b4c7bd90ef19638d7c',1,'openvdb::v3_2_0::tree::InternalNode::probeValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a930652dd91d4aab8c576638b30617cbf',1,'openvdb::v3_2_0::tree::LeafNode::probeValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a935e893263dc341b5de98a10c4012d9f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::probeValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a935e893263dc341b5de98a10c4012d9f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::probeValueAndCache()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ab682876d96e5d4b4c7bd90ef19638d7c',1,'openvdb::v3_2_0::tree::RootNode::probeValueAndCache()']]], + ['probevalues',['probeValues',['../structopenvdb_1_1v3__2__0_1_1tools_1_1BoxSampler.html#a37fdab3245bdf482be42fb117bfd1023',1,'openvdb::v3_2_0::tools::BoxSampler']]], + ['process',['process',['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html#aca2bdc8824a91b01803bca6955bc8ce9',1,'openvdb::v3_2_0::tools::gridop::GridOperator::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Cpt.html#ae9f30f1c39da5131d000088cdf9afea0',1,'openvdb::v3_2_0::tools::Cpt::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Curl.html#a076055e501cef7a05a5894cd279e643b',1,'openvdb::v3_2_0::tools::Curl::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Divergence.html#a75672d8d2b16d7e9b353841f031b340c',1,'openvdb::v3_2_0::tools::Divergence::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Gradient.html#a75672d8d2b16d7e9b353841f031b340c',1,'openvdb::v3_2_0::tools::Gradient::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian.html#a076055e501cef7a05a5894cd279e643b',1,'openvdb::v3_2_0::tools::Laplacian::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature.html#a076055e501cef7a05a5894cd279e643b',1,'openvdb::v3_2_0::tools::MeanCurvature::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude.html#a75672d8d2b16d7e9b353841f031b340c',1,'openvdb::v3_2_0::tools::Magnitude::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Normalize.html#a076055e501cef7a05a5894cd279e643b',1,'openvdb::v3_2_0::tools::Normalize::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpApplier.html#a8ec24e20adbeeac65646f4884899d863',1,'openvdb::v3_2_0::tools::valxform::SharedOpApplier::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpApplier.html#a8ec24e20adbeeac65646f4884899d863',1,'openvdb::v3_2_0::tools::valxform::CopyableOpApplier::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpTransformer.html#a8ec24e20adbeeac65646f4884899d863',1,'openvdb::v3_2_0::tools::valxform::SharedOpTransformer::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpTransformer.html#a8ec24e20adbeeac65646f4884899d863',1,'openvdb::v3_2_0::tools::valxform::CopyableOpTransformer::process()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1OpAccumulator.html#a8ec24e20adbeeac65646f4884899d863',1,'openvdb::v3_2_0::tools::valxform::OpAccumulator::process()']]], + ['processbottomup',['processBottomUp',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#afd8f485ce126b9b529db0402611ff40a',1,'openvdb::v3_2_0::tree::NodeManagerLink::processBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#afd8f485ce126b9b529db0402611ff40a',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::processBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#a0b18cc46435bfdadfbfb3fa1690b7e80',1,'openvdb::v3_2_0::tree::NodeManager::processBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#aaa0a11643bab9f481137b0a693f13863',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::processBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a0b18cc46435bfdadfbfb3fa1690b7e80',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::processBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a0b18cc46435bfdadfbfb3fa1690b7e80',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::processBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a0b18cc46435bfdadfbfb3fa1690b7e80',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::processBottomUp()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a0b18cc46435bfdadfbfb3fa1690b7e80',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::processBottomUp()']]], + ['processtopdown',['processTopDown',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#a3bacd204719eecf8ef3c3696e814211b',1,'openvdb::v3_2_0::tree::NodeManagerLink::processTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#a3bacd204719eecf8ef3c3696e814211b',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::processTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#a1bc8ebde233bb904affc56fd51b6d08a',1,'openvdb::v3_2_0::tree::NodeManager::processTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#a501e50ba175715c92d651e171afac1fc',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::processTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a1bc8ebde233bb904affc56fd51b6d08a',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::processTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a1bc8ebde233bb904affc56fd51b6d08a',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::processTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a1bc8ebde233bb904affc56fd51b6d08a',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::processTopDown()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a1bc8ebde233bb904affc56fd51b6d08a',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::processTopDown()']]], + ['processtypedmap',['processTypedMap',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#adb714febefb61aa1286b349e086557e3',1,'openvdb::v3_2_0::math']]], + ['processx',['processX',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html#a71e793ff431e4493936f9ab608d17d66',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedPoints']]], + ['processy',['processY',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html#af9a0bfb47d9a770e49dd3c6d1c06c958',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedPoints']]], + ['processz',['processZ',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html#a3f99d497af5a0dacc9da390f332d9f54',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedPoints']]], + ['projection',['projection',['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a188ce993b498175393d0706574746300',1,'openvdb::v3_2_0::math::Vec2::projection()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a77c0876ba7b5a8fb157df7110a44149b',1,'openvdb::v3_2_0::math::Vec3::projection()']]], + ['projecttoconstraintsurface',['projectToConstraintSurface',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestPointProjector.html#a0a3e45d84169d282eaa8913ba7c3a52f',1,'openvdb::v3_2_0::tools::ClosestPointProjector']]], + ['prolongate',['prolongate',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#aeb0449de717b38dd852cfaed5f093e34',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['prolongateactivevoxels',['prolongateActiveVoxels',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a18ddd896f767ca27ec505f1df38e98b5',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['prune',['prune',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a66ec42d2ff5b84117b1da4cbba719f1b',1,'openvdb::v3_2_0::tools::LevelSetTracker::prune()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a462c7056adc55d8da2cc5828934ff859',1,'openvdb::v3_2_0::tree::InternalNode::prune()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a32b7de2717353e590fe2521c0243841a',1,'openvdb::v3_2_0::tree::LeafNode::prune()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a32b7de2717353e590fe2521c0243841a',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::prune()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a32b7de2717353e590fe2521c0243841a',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::prune()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a462c7056adc55d8da2cc5828934ff859',1,'openvdb::v3_2_0::tree::RootNode::prune()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a462c7056adc55d8da2cc5828934ff859',1,'openvdb::v3_2_0::tree::Tree::prune()'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a8057e1165c928a37703f90eb9496083c',1,'openvdb::v3_2_0::tools::prune()']]], + ['prunegrid',['pruneGrid',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a946aadf4f9405301582b15976dc8494f',1,'openvdb::v3_2_0::GridBase::pruneGrid()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#a7e4352e92d2e25d4bfddadbb91ae4322',1,'openvdb::v3_2_0::Grid::pruneGrid()']]], + ['pruneinactive',['pruneInactive',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ae81e76930df0c635a4e175887352257e',1,'openvdb::v3_2_0::tools']]], + ['pruneinactivewithvalue',['pruneInactiveWithValue',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ad68447719ca38904491830b5c1caefa8',1,'openvdb::v3_2_0::tools']]], + ['prunelevelset',['pruneLevelSet',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a467d50f8a53357977d5720498a88d72c',1,'openvdb::v3_2_0::tools::pruneLevelSet(TreeT &tree, bool threaded=true, size_t grainSize=1)'],['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac57eaa5cdb5f7180a68b88901e9421ad',1,'openvdb::v3_2_0::tools::pruneLevelSet(TreeT &tree, const typename TreeT::ValueType &outsideWidth, const typename TreeT::ValueType &insideWidth, bool threaded=true, size_t grainSize=1)']]], + ['prunetiles',['pruneTiles',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ab8ffdc3cdd984ae9e4c0742406cfdaee',1,'openvdb::v3_2_0::tools']]], + ['push_5fback',['push_back',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#a46ec940815ed036de9c5b5cc94b9b916',1,'openvdb::v3_2_0::tree::NodeList::push_back()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#aafda3d7e372dc7bcbb6d4177b9fbee3f',1,'openvdb::v3_2_0::util::PagedArray::push_back()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ValueBuffer.html#a6b3c5ce2a81a96f719e6251941cc850b',1,'openvdb::v3_2_0::util::PagedArray::ValueBuffer::push_back()']]], + ['push_5fback_5funsafe',['push_back_unsafe',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a2db49bee5258957acd0317c8d4342fb3',1,'openvdb::v3_2_0::util::PagedArray']]], + ['put',['put',['../classopenvdb_1_1v3__2__0_1_1util_1_1FormattedInt.html#ad7f5328ef74c5ae08e6161c400b879ae',1,'openvdb::v3_2_0::util::FormattedInt']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/mag_sel.png b/nuparu/include/openvdb/share/doc/openvdb/html/search/mag_sel.png new file mode 100644 index 00000000..81f6040a Binary files /dev/null and b/nuparu/include/openvdb/share/doc/openvdb/html/search/mag_sel.png differ diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/namespaces_0.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/namespaces_0.html new file mode 100644 index 00000000..6d5853b6 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/namespaces_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/namespaces_0.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/namespaces_0.js new file mode 100644 index 00000000..80187ea7 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/namespaces_0.js @@ -0,0 +1,36 @@ +var searchData= +[ + ['activation',['activation',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1activation.html',1,'openvdb::v3_2_0::tools']]], + ['clip_5finternal',['clip_internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal.html',1,'openvdb::v3_2_0::tools']]], + ['composite',['composite',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1composite.html',1,'openvdb::v3_2_0::tools']]], + ['diagnostics_5finternal',['diagnostics_internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal.html',1,'openvdb::v3_2_0::tools']]], + ['ds',['ds',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1ds.html',1,'openvdb::v3_2_0::tools']]], + ['filter_5finternal',['filter_internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1filter__internal.html',1,'openvdb::v3_2_0::tools']]], + ['gridop',['gridop',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1gridop.html',1,'openvdb::v3_2_0::tools']]], + ['internal',['internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html',1,'openvdb::v3_2_0::tools']]], + ['internal',['internal',['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1internal.html',1,'openvdb::v3_2_0::math']]], + ['internal',['internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal.html',1,'openvdb::v3_2_0::tools::poisson']]], + ['internal',['internal',['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal.html',1,'openvdb::v3_2_0::math::pcg']]], + ['io',['io',['../namespaceopenvdb_1_1v3__2__0_1_1io.html',1,'openvdb::v3_2_0']]], + ['iter',['iter',['../namespaceopenvdb_1_1v3__2__0_1_1tree_1_1iter.html',1,'openvdb::v3_2_0::tree']]], + ['leafmgr',['leafmgr',['../namespaceopenvdb_1_1v3__2__0_1_1tree_1_1leafmgr.html',1,'openvdb::v3_2_0::tree']]], + ['level_5fset_5ffracture_5finternal',['level_set_fracture_internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1level__set__fracture__internal.html',1,'openvdb::v3_2_0::tools']]], + ['level_5fset_5futil_5finternal',['level_set_util_internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal.html',1,'openvdb::v3_2_0::tools']]], + ['local_5futil',['local_util',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1local__util.html',1,'openvdb::v3_2_0::tools']]], + ['math',['math',['../namespaceopenvdb_1_1v3__2__0_1_1math.html',1,'openvdb::v3_2_0']]], + ['mesh_5fto_5fvolume_5finternal',['mesh_to_volume_internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal.html',1,'openvdb::v3_2_0::tools']]], + ['openvdb',['openvdb',['../namespaceopenvdb.html',1,'']]], + ['particle_5fatlas_5finternal',['particle_atlas_internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal.html',1,'openvdb::v3_2_0::tools']]], + ['pcg',['pcg',['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg.html',1,'openvdb::v3_2_0::math']]], + ['point_5findex_5fgrid_5finternal',['point_index_grid_internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal.html',1,'openvdb::v3_2_0::tools']]], + ['point_5fpartitioner_5finternal',['point_partitioner_internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal.html',1,'openvdb::v3_2_0::tools']]], + ['poisson',['poisson',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html',1,'openvdb::v3_2_0::tools']]], + ['scheme',['Scheme',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1Scheme.html',1,'openvdb::v3_2_0::tools']]], + ['stats_5finternal',['stats_internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal.html',1,'openvdb::v3_2_0::tools']]], + ['tools',['tools',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html',1,'openvdb::v3_2_0']]], + ['tree',['tree',['../namespaceopenvdb_1_1v3__2__0_1_1tree.html',1,'openvdb::v3_2_0']]], + ['ttls_5finternal',['ttls_internal',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1ttls__internal.html',1,'openvdb::v3_2_0::tools']]], + ['util',['util',['../namespaceopenvdb_1_1v3__2__0_1_1util.html',1,'openvdb::v3_2_0']]], + ['v3_5f2_5f0',['v3_2_0',['../namespaceopenvdb_1_1v3__2__0.html',1,'openvdb']]], + ['valxform',['valxform',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1valxform.html',1,'openvdb::v3_2_0::tools']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/namespaces_1.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/namespaces_1.html new file mode 100644 index 00000000..8392b75c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/namespaces_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/namespaces_1.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/namespaces_1.js new file mode 100644 index 00000000..dc71a307 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/namespaces_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['pyopenvdb',['pyopenvdb',['../namespacepyopenvdb.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/namespaces_2.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/namespaces_2.html new file mode 100644 index 00000000..6fc2dd85 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/namespaces_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/namespaces_2.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/namespaces_2.js new file mode 100644 index 00000000..5d90d761 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/namespaces_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['tbb',['tbb',['../namespacetbb.html',1,'']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/nomatches.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/nomatches.html new file mode 100644 index 00000000..b1ded27e --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/nomatches.html @@ -0,0 +1,12 @@ + + + + + + + +
+
No Matches
+
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_0.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_0.html new file mode 100644 index 00000000..4b85b346 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_0.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_0.js new file mode 100644 index 00000000..97adb9bb --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['coding_20style',['Coding Style',['../codingStyle.html',1,'index']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_1.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_1.html new file mode 100644 index 00000000..8c53f612 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_1.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_1.js new file mode 100644 index 00000000..331febaa --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['frequently_20asked_20questions',['Frequently Asked Questions',['../faq.html',1,'index']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_2.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_2.html new file mode 100644 index 00000000..949520e9 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_2.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_2.js new file mode 100644 index 00000000..57898e71 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['openvdb_20cookbook',['OpenVDB Cookbook',['../codeExamples.html',1,'faq']]], + ['openvdb',['OpenVDB',['../index.html',1,'']]], + ['openvdb_20overview',['OpenVDB Overview',['../overview.html',1,'index']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_3.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_3.html new file mode 100644 index 00000000..9f6e491a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_3.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_3.js new file mode 100644 index 00000000..d6aa5940 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['porting_20to_20openvdb_200_2e98_2e0',['Porting to OpenVDB 0.98.0',['../api_0_98_0.html',1,'changes']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_4.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_4.html new file mode 100644 index 00000000..adefe54b --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_4.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_4.js new file mode 100644 index 00000000..765dbcb3 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['release_20notes',['Release Notes',['../changes.html',1,'index']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_5.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_5.html new file mode 100644 index 00000000..53a21e3b --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_5.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_5.js new file mode 100644 index 00000000..4365a59b --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['transforms_20and_20maps',['Transforms and Maps',['../transformsAndMaps.html',1,'overview']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_6.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_6.html new file mode 100644 index 00000000..0b17bb3d --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_6.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_6.js new file mode 100644 index 00000000..b16cdde4 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/pages_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['using_20openvdb_20in_20python',['Using OpenVDB in Python',['../python.html',1,'index']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/related_0.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_0.html new file mode 100644 index 00000000..a4c22852 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/related_0.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_0.js new file mode 100644 index 00000000..0a6de9a5 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['testfile',['TestFile',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#acf953049eacd7a2525b86ea7ec25be5a',1,'openvdb::v3_2_0::io::Archive::TestFile()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#acf953049eacd7a2525b86ea7ec25be5a',1,'openvdb::v3_2_0::io::File::TestFile()']]], + ['testleaf',['TestLeaf',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#aa1afd221f2a74a02081ab42f04511b84',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::TestLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aa1afd221f2a74a02081ab42f04511b84',1,'openvdb::v3_2_0::tree::LeafNode::TestLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#aa1afd221f2a74a02081ab42f04511b84',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::TestLeaf()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#aa1afd221f2a74a02081ab42f04511b84',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::TestLeaf()']]], + ['testleafio',['TestLeafIO',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a4ec250a46a39d26ead24aff07632e82b',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['testmultiresgrid',['TestMultiResGrid',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a868d6184b07911a2d2e36e351fc9793a',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['teststream',['TestStream',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a44f87839bb17db5d4f50b1cc375a2c37',1,'openvdb::v3_2_0::io::File']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/related_1.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_1.html new file mode 100644 index 00000000..484eb671 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/related_1.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_1.js new file mode 100644 index 00000000..0a4ff285 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['basestencil',['BaseStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1SevenPointStencil.html#ab7bb49e181c1ccad52de629de038e762',1,'openvdb::v3_2_0::math::SevenPointStencil::BaseStencil()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BoxStencil.html#ab7bb49e181c1ccad52de629de038e762',1,'openvdb::v3_2_0::math::BoxStencil::BaseStencil()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SecondOrderDenseStencil.html#ab7bb49e181c1ccad52de629de038e762',1,'openvdb::v3_2_0::math::SecondOrderDenseStencil::BaseStencil()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ThirteenPointStencil.html#ab7bb49e181c1ccad52de629de038e762',1,'openvdb::v3_2_0::math::ThirteenPointStencil::BaseStencil()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1FourthOrderDenseStencil.html#ab7bb49e181c1ccad52de629de038e762',1,'openvdb::v3_2_0::math::FourthOrderDenseStencil::BaseStencil()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NineteenPointStencil.html#ab7bb49e181c1ccad52de629de038e762',1,'openvdb::v3_2_0::math::NineteenPointStencil::BaseStencil()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SixthOrderDenseStencil.html#ab7bb49e181c1ccad52de629de038e762',1,'openvdb::v3_2_0::math::SixthOrderDenseStencil::BaseStencil()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#ab7bb49e181c1ccad52de629de038e762',1,'openvdb::v3_2_0::math::GradStencil::BaseStencil()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html#ab7bb49e181c1ccad52de629de038e762',1,'openvdb::v3_2_0::math::WenoStencil::BaseStencil()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CurvatureStencil.html#ab7bb49e181c1ccad52de629de038e762',1,'openvdb::v3_2_0::math::CurvatureStencil::BaseStencil()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DenseStencil.html#ab7bb49e181c1ccad52de629de038e762',1,'openvdb::v3_2_0::math::DenseStencil::BaseStencil()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/related_2.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_2.html new file mode 100644 index 00000000..82034199 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/related_2.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_2.js new file mode 100644 index 00000000..ae33c03b --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['file',['File',['../classopenvdb_1_1v3__2__0_1_1io_1_1MappedFile.html#a68d15876ad188b7628261b12d0eac8aa',1,'openvdb::v3_2_0::io::MappedFile']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/related_3.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_3.html new file mode 100644 index 00000000..b8a03a66 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/related_3.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_3.js new file mode 100644 index 00000000..0c4b69ab --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_3.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['internalnode',['InternalNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a5fc7cbf1929731e78733e1b476142b8a',1,'openvdb::v3_2_0::tree::InternalNode::InternalNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a5fc7cbf1929731e78733e1b476142b8a',1,'openvdb::v3_2_0::tree::ValueAccessor::InternalNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a5fc7cbf1929731e78733e1b476142b8a',1,'openvdb::v3_2_0::tree::ValueAccessor1::InternalNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a5fc7cbf1929731e78733e1b476142b8a',1,'openvdb::v3_2_0::tree::ValueAccessor2::InternalNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a5fc7cbf1929731e78733e1b476142b8a',1,'openvdb::v3_2_0::tree::ValueAccessor3::InternalNode()']]], + ['iteratorbase_3c_20maskdenseiter_2c_20leafnode_20_3e',['IteratorBase< MaskDenseIter, LeafNode >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a4c74a0a4d53c8800ac1398729de810ba',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::IteratorBase< MaskDenseIter, LeafNode >()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a4c74a0a4d53c8800ac1398729de810ba',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::IteratorBase< MaskDenseIter, LeafNode >()']]], + ['iteratorbase_3c_20maskdenseiterator_2c_20internalnode_20_3e',['IteratorBase< MaskDenseIterator, InternalNode >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ad4f85768c6ab3bd7b0cc76eb825f5042',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['iteratorbase_3c_20maskdenseiterator_2c_20leafnode_20_3e',['IteratorBase< MaskDenseIterator, LeafNode >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ae892d82a90aca2a915c8fcaa47019559',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['iteratorbase_3c_20maskoffiter_2c_20leafnode_20_3e',['IteratorBase< MaskOffIter, LeafNode >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a18f0e02b416494ad1869af09e3bbb3f5',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::IteratorBase< MaskOffIter, LeafNode >()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a18f0e02b416494ad1869af09e3bbb3f5',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::IteratorBase< MaskOffIter, LeafNode >()']]], + ['iteratorbase_3c_20maskoffiterator_2c_20internalnode_20_3e',['IteratorBase< MaskOffIterator, InternalNode >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#acf55bfd617c2997e7f10c7ae61e112d4',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['iteratorbase_3c_20maskoffiterator_2c_20leafnode_20_3e',['IteratorBase< MaskOffIterator, LeafNode >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a128718657ba71c5f77cd6c01cbae6bac',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['iteratorbase_3c_20maskoniter_2c_20leafnode_20_3e',['IteratorBase< MaskOnIter, LeafNode >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a94606ef790406076be26d47be96fb4eb',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::IteratorBase< MaskOnIter, LeafNode >()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a94606ef790406076be26d47be96fb4eb',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::IteratorBase< MaskOnIter, LeafNode >()']]], + ['iteratorbase_3c_20maskoniterator_2c_20internalnode_20_3e',['IteratorBase< MaskOnIterator, InternalNode >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a3600507f55f3f4a1e38b481435756f5b',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['iteratorbase_3c_20maskoniterator_2c_20leafnode_20_3e',['IteratorBase< MaskOnIterator, LeafNode >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a1cd20542045038ece79860e343d2b651',1,'openvdb::v3_2_0::tree::LeafNode']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/related_4.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_4.html new file mode 100644 index 00000000..e3fcdd55 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/related_4.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_4.js new file mode 100644 index 00000000..4d1f1c75 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['leafnode',['LeafNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#acc3ddf7c43384bed1ebfea497bdb4b3a',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aba19a13fc4d7d33601cb67afaea8b94f',1,'openvdb::v3_2_0::tree::LeafNode::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#acc3ddf7c43384bed1ebfea497bdb4b3a',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aba19a13fc4d7d33601cb67afaea8b94f',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#acc3ddf7c43384bed1ebfea497bdb4b3a',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aba19a13fc4d7d33601cb67afaea8b94f',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#aba19a13fc4d7d33601cb67afaea8b94f',1,'openvdb::v3_2_0::tree::ValueAccessor::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#aba19a13fc4d7d33601cb67afaea8b94f',1,'openvdb::v3_2_0::tree::ValueAccessor1::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#aba19a13fc4d7d33601cb67afaea8b94f',1,'openvdb::v3_2_0::tree::ValueAccessor2::LeafNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#aba19a13fc4d7d33601cb67afaea8b94f',1,'openvdb::v3_2_0::tree::ValueAccessor3::LeafNode()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/related_5.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_5.html new file mode 100644 index 00000000..3c774b0c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/related_5.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_5.js new file mode 100644 index 00000000..3911fc93 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['levelsethdda',['LevelSetHDDA',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#a8e7268aae3f9594f96330c390d4c6a1b',1,'openvdb::v3_2_0::tools::LinearSearchImpl']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/related_6.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_6.html new file mode 100644 index 00000000..7599f093 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/related_6.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_6.js new file mode 100644 index 00000000..cbf2bbd9 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['operator_3c_3c',['operator<<',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#a65608fdfdaa2b0cb5cfe77215a38b74e',1,'openvdb::v3_2_0::math::Mat::operator<<()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#a182375dad7577cef9608ba55b9bd66ba',1,'openvdb::v3_2_0::math::Quat::operator<<()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/related_7.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_7.html new file mode 100644 index 00000000..1b989936 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/related_7.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_7.js new file mode 100644 index 00000000..227ff37c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['pointindexleafnode',['PointIndexLeafNode',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a3a3bf45757796b18e4a6b1dd33c41cac',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/related_8.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_8.html new file mode 100644 index 00000000..c81e7f01 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/related_8.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_8.js new file mode 100644 index 00000000..7b6c1d1c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_8.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['rootnode',['RootNode',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#aff4f5e7209d5ad66394519639bd989f8',1,'openvdb::v3_2_0::tree::RootNode::RootNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#aff4f5e7209d5ad66394519639bd989f8',1,'openvdb::v3_2_0::tree::ValueAccessor::RootNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#aff4f5e7209d5ad66394519639bd989f8',1,'openvdb::v3_2_0::tree::ValueAccessor1::RootNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#aff4f5e7209d5ad66394519639bd989f8',1,'openvdb::v3_2_0::tree::ValueAccessor2::RootNode()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#aff4f5e7209d5ad66394519639bd989f8',1,'openvdb::v3_2_0::tree::ValueAccessor3::RootNode()']]], + ['rootnodecombinehelper',['RootNodeCombineHelper',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a733720747a659027d37f72bd461207eb',1,'openvdb::v3_2_0::tree::RootNode']]], + ['rootnodecopyhelper',['RootNodeCopyHelper',['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#adac3b94dde9b204ff858644761361a95',1,'openvdb::v3_2_0::tree::RootNode']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/related_9.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_9.html new file mode 100644 index 00000000..85c3aed7 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/related_9.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_9.js new file mode 100644 index 00000000..fe04df21 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_9.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['slerp',['slerp',['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#aea60bacac9490ebd9edc4efd1d2f294c',1,'openvdb::v3_2_0::math::Quat']]], + ['sparsestencilmatrix',['SparseStencilMatrix',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1ConstValueIter.html#ae06102ac48be63f6223f2290bbb995ee',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::ConstValueIter']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/related_a.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_a.html new file mode 100644 index 00000000..2de89c36 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/related_a.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_a.js new file mode 100644 index 00000000..2bced8f4 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_a.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['iteratorbase_3c_20maskdenseiterator_2c_20pointindexleafnode_20_3e',['IteratorBase< MaskDenseIterator, PointIndexLeafNode >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a3785363d3c61ef99db5b316626826bcf',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['iteratorbase_3c_20maskoffiterator_2c_20pointindexleafnode_20_3e',['IteratorBase< MaskOffIterator, PointIndexLeafNode >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a9027fb5ad7622da41c7136f73a4d7d97',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['iteratorbase_3c_20maskoniterator_2c_20pointindexleafnode_20_3e',['IteratorBase< MaskOnIterator, PointIndexLeafNode >',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a7affd1f640ff2ba587c7d86076297d01',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['tree',['Tree',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html#aa2f9f90efcd38311bf153da95f3561c0',1,'openvdb::v3_2_0::tree::ValueAccessorBase::Tree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#aa2f9f90efcd38311bf153da95f3561c0',1,'openvdb::v3_2_0::tree::ValueAccessor::Tree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#aa2f9f90efcd38311bf153da95f3561c0',1,'openvdb::v3_2_0::tree::ValueAccessor0::Tree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#aa2f9f90efcd38311bf153da95f3561c0',1,'openvdb::v3_2_0::tree::ValueAccessor1::Tree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#aa2f9f90efcd38311bf153da95f3561c0',1,'openvdb::v3_2_0::tree::ValueAccessor2::Tree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#aa2f9f90efcd38311bf153da95f3561c0',1,'openvdb::v3_2_0::tree::ValueAccessor3::Tree()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/related_b.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_b.html new file mode 100644 index 00000000..29b40f4f --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/related_b.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_b.js new file mode 100644 index 00000000..3286df93 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/related_b.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['valuebuffer',['ValueBuffer',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#afc867e0705ff7ee57a5a4be9bb466aa8',1,'openvdb::v3_2_0::util::PagedArray']]], + ['valueiter_3c_20maskdenseiter_2c_20const_20leafnode_2c_20bool_20_3e',['ValueIter< MaskDenseIter, const LeafNode, bool >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#abeedbac6cafa33bd7112a35970c29769',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter< MaskDenseIter, const LeafNode, bool >()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#abeedbac6cafa33bd7112a35970c29769',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter< MaskDenseIter, const LeafNode, bool >()']]], + ['valueiter_3c_20maskdenseiter_2c_20leafnode_2c_20bool_20_3e',['ValueIter< MaskDenseIter, LeafNode, bool >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a24c54047ff064fab82a33f2c5452ee06',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter< MaskDenseIter, LeafNode, bool >()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a24c54047ff064fab82a33f2c5452ee06',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter< MaskDenseIter, LeafNode, bool >()']]], + ['valueiter_3c_20maskdenseiterator_2c_20const_20leafnode_2c_20valuetype_2c_20valueall_20_3e',['ValueIter< MaskDenseIterator, const LeafNode, ValueType, ValueAll >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ac89fb3a89a9e294a52ab9b7feb8dae50',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['valueiter_3c_20maskdenseiterator_2c_20leafnode_2c_20valuetype_2c_20valueall_20_3e',['ValueIter< MaskDenseIterator, LeafNode, ValueType, ValueAll >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a3675046a1176b83ebe4ebb111da91165',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['valueiter_3c_20maskoffiter_2c_20const_20leafnode_2c_20bool_20_3e',['ValueIter< MaskOffIter, const LeafNode, bool >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#aab86b327edf42ea2bcda6a47778dccbd',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter< MaskOffIter, const LeafNode, bool >()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#aab86b327edf42ea2bcda6a47778dccbd',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter< MaskOffIter, const LeafNode, bool >()']]], + ['valueiter_3c_20maskoffiter_2c_20leafnode_2c_20bool_20_3e',['ValueIter< MaskOffIter, LeafNode, bool >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a65235074ade0fc7aee1ef3b78f8b77ca',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter< MaskOffIter, LeafNode, bool >()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a65235074ade0fc7aee1ef3b78f8b77ca',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter< MaskOffIter, LeafNode, bool >()']]], + ['valueiter_3c_20maskoffiterator_2c_20const_20leafnode_2c_20valuetype_2c_20valueoff_20_3e',['ValueIter< MaskOffIterator, const LeafNode, ValueType, ValueOff >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aa2bab862e1ff531c17ef5fa66abc576c',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['valueiter_3c_20maskoffiterator_2c_20leafnode_2c_20valuetype_2c_20valueoff_20_3e',['ValueIter< MaskOffIterator, LeafNode, ValueType, ValueOff >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a694162e77b842f678df1a4de52d02734',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['valueiter_3c_20maskoniter_2c_20const_20leafnode_2c_20bool_20_3e',['ValueIter< MaskOnIter, const LeafNode, bool >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a97abb4c6d4b44b83678bffcb390bf9d7',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter< MaskOnIter, const LeafNode, bool >()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a97abb4c6d4b44b83678bffcb390bf9d7',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter< MaskOnIter, const LeafNode, bool >()']]], + ['valueiter_3c_20maskoniter_2c_20leafnode_2c_20bool_20_3e',['ValueIter< MaskOnIter, LeafNode, bool >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a2ae17205785ce515d39186f1d5199010',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter< MaskOnIter, LeafNode, bool >()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a2ae17205785ce515d39186f1d5199010',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter< MaskOnIter, LeafNode, bool >()']]], + ['valueiter_3c_20maskoniterator_2c_20const_20leafnode_2c_20valuetype_2c_20valueon_20_3e',['ValueIter< MaskOnIterator, const LeafNode, ValueType, ValueOn >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#afc19468f513d1a479b479321dff894f0',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['valueiter_3c_20maskoniterator_2c_20leafnode_2c_20valuetype_2c_20valueon_20_3e',['ValueIter< MaskOnIterator, LeafNode, ValueType, ValueOn >',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ab26b5b4bba83d15af89c00d61fff384f',1,'openvdb::v3_2_0::tree::LeafNode']]], + ['volumehdda_3c_20treet_2c_20rayt_2c_201_20_3e',['VolumeHDDA< TreeT, RayT, 1 >',['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA_3_01TreeT_00_01RayT_00_010_01_4.html#a02cfe000fd80e389096ff8a613c9edd1',1,'openvdb::v3_2_0::math::VolumeHDDA< TreeT, RayT, 0 >']]], + ['volumehdda_3c_20treet_2c_20rayt_2c_20childnodelevel_2b1_20_3e',['VolumeHDDA< TreeT, RayT, ChildNodeLevel+1 >',['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA.html#a18baa920f5d88c00f55a344eeb414a58',1,'openvdb::v3_2_0::math::VolumeHDDA']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/search.css b/nuparu/include/openvdb/share/doc/openvdb/html/search/search.css new file mode 100644 index 00000000..fdf0c4ef --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/search.css @@ -0,0 +1,271 @@ +/*---------------- Search Box */ + +#FSearchBox { + float: left; +} + +#MSearchBox { + white-space : nowrap; + position: absolute; + float: none; + display: inline; + margin-top: 8px; + right: 0px; + width: 170px; + z-index: 102; + background-color: white; +} + +#MSearchBox .left +{ + display:block; + position:absolute; + left:10px; + width:20px; + height:19px; + background:url('search_l.png') no-repeat; + background-position:right; +} + +#MSearchSelect { + display:block; + position:absolute; + width:20px; + height:19px; +} + +.left #MSearchSelect { + left:4px; +} + +.right #MSearchSelect { + right:5px; +} + +#MSearchField { + display:block; + position:absolute; + height:19px; + background:url('search_m.png') repeat-x; + border:none; + width:111px; + margin-left:20px; + padding-left:4px; + color: #909090; + outline: none; + font: 9pt Arial, Verdana, sans-serif; +} + +#FSearchBox #MSearchField { + margin-left:15px; +} + +#MSearchBox .right { + display:block; + position:absolute; + right:10px; + top:0px; + width:20px; + height:19px; + background:url('search_r.png') no-repeat; + background-position:left; +} + +#MSearchClose { + display: none; + position: absolute; + top: 4px; + background : none; + border: none; + margin: 0px 4px 0px 0px; + padding: 0px 0px; + outline: none; +} + +.left #MSearchClose { + left: 6px; +} + +.right #MSearchClose { + right: 2px; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #F4736A; + background-color: #FEF7F7; + z-index: 1; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #BC180D; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + width: 60ex; + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000; + background-color: #FDE9E8; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #CB1A0E; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #CB1A0E; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; +} + +.SRResult { + display: none; +} + +DIV.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #FDECEB; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/search.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/search.js new file mode 100644 index 00000000..dedce3bf --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/search.js @@ -0,0 +1,791 @@ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches.html'; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName == 'DIV' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName == 'DIV' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_0.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_0.js new file mode 100644 index 00000000..f470a416 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['_5fnodet',['_NodeT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#acdd0d59217dacc1c61a9fb7ffa448d3a',1,'openvdb::v3_2_0::tree::IterListItem::_NodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#acdd0d59217dacc1c61a9fb7ffa448d3a',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::_NodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#acdd0d59217dacc1c61a9fb7ffa448d3a',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::_NodeT()']]], + ['_5fresulttreetype',['_ResultTreeType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#a4d8056e5a52ce98b80e8fdaf5df3913c',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_1.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_1.html new file mode 100644 index 00000000..9b25237c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_1.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_1.js new file mode 100644 index 00000000..6ca549d0 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_1.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['accessor',['Accessor',['../classopenvdb_1_1v3__2__0_1_1Grid.html#afb00204092e1421d7df4f2c9e811be45',1,'openvdb::v3_2_0::Grid::Accessor()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData.html#a13920213a898b6cbba09a28d456fe93a',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::Accessor()']]], + ['accessorregistry',['AccessorRegistry',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a7d72c24105ed661d000bcead8c855fb9',1,'openvdb::v3_2_0::tree::Tree']]], + ['accessort',['AccessorT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyFromDense.html#af0ff2ef806ba601bc777cb4df5c9c744',1,'openvdb::v3_2_0::tools::CopyFromDense::AccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html#ad02a69ae957d31b24a4777cb29c955fe',1,'openvdb::v3_2_0::tools::gridop::GridOperator::AccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#ad3fe55e73c82f301017d7517bf8c4e06',1,'openvdb::v3_2_0::tools::LinearSearchImpl::AccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#a893d40d378311def8014d93caff818c7',1,'openvdb::v3_2_0::tools::internal::SignData::AccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPoints.html#a893d40d378311def8014d93caff818c7',1,'openvdb::v3_2_0::tools::internal::GenPoints::AccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SeamWeights.html#a893d40d378311def8014d93caff818c7',1,'openvdb::v3_2_0::tools::internal::SeamWeights::AccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#a893d40d378311def8014d93caff818c7',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions::AccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TagSeamEdges.html#a893d40d378311def8014d93caff818c7',1,'openvdb::v3_2_0::tools::internal::TagSeamEdges::AccessorT()']]], + ['accessortype',['AccessorType',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a1d0440c25c46f78ae6182fdf60b67c20',1,'openvdb::v3_2_0::TreeAdapter::AccessorType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a1d0440c25c46f78ae6182fdf60b67c20',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::AccessorType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a1d0440c25c46f78ae6182fdf60b67c20',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::AccessorType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#abe280da7072440c8fb03d73741169995',1,'openvdb::v3_2_0::math::BaseStencil::AccessorType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#a9a7828e73f5f1d8e60a97e29464c4026',1,'openvdb::v3_2_0::tools::GridSampler::AccessorType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html#ab2a81953bec5ec02e6cc62c8ec9e4050',1,'openvdb::v3_2_0::tools::GridSampler< tree::ValueAccessor< TreeT >, SamplerType >::AccessorType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler.html#a940f86ae6fe4c2e8976f80c73c1f78a9',1,'openvdb::v3_2_0::tools::DualGridSampler::AccessorType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerT_01_4.html#ab2a81953bec5ec02e6cc62c8ec9e4050',1,'openvdb::v3_2_0::tools::DualGridSampler< tree::ValueAccessor< TreeT >, SamplerT >::AccessorType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1DiffLeafNodeMask.html#a1d0440c25c46f78ae6182fdf60b67c20',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::DiffLeafNodeMask::AccessorType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a1d0440c25c46f78ae6182fdf60b67c20',1,'openvdb::v3_2_0::tools::Morphology::AccessorType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#a2094bb397f41971860d952e8c98c886c',1,'openvdb::v3_2_0::tools::VolumeRender::AccessorType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocitySampler.html#a8009bd70a6c63777fb8cf4327a6e0a10',1,'openvdb::v3_2_0::tools::VelocitySampler::AccessorType()']]], + ['acct',['AccT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#a160632bafe32f88e8294bd1ec5d82cec',1,'openvdb::v3_2_0::tools::CheckNormGrad::AccT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#a160632bafe32f88e8294bd1ec5d82cec',1,'openvdb::v3_2_0::tools::CheckDivergence::AccT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#aea0b545e85347bf1f6e5be07f1d53361',1,'openvdb::v3_2_0::tools::AlphaMask::AccT()']]], + ['alphatype',['AlphaType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a1ed0ae6885cc52e5c1a0369437fabddc',1,'openvdb::v3_2_0::tools::Filter::AlphaType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a1ed0ae6885cc52e5c1a0369437fabddc',1,'openvdb::v3_2_0::tools::LevelSetFilter::AlphaType()']]], + ['attgridtype',['AttGridType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a74324941bba923890bb5a91a241d8230',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['atttype',['AttType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#aadbf8ea855e973869b15815a104bf798',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['auxdatamap',['AuxDataMap',['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#aac6a6165a8a07ea595b828e2a248d98c',1,'openvdb::v3_2_0::io::StreamMetadata']]], + ['avaluet',['AValueT',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#aa682bf85167ca3d4d0ab8b4344479ecb',1,'openvdb::v3_2_0::CombineArgs']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_10.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_10.html new file mode 100644 index 00000000..891918bc --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_10.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_10.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_10.js new file mode 100644 index 00000000..b7805487 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_10.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['random01',['Random01',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a99f853a1b932705029be5e71607b6bbd',1,'openvdb::v3_2_0::math']]], + ['randomint',['RandomInt',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aa33e90af3e479e935569d50c20ddcb33',1,'openvdb::v3_2_0::math']]], + ['range',['Range',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RadialRangeFilter.html#abe03036ac3f8fd11ef5755b9403db347',1,'openvdb::v3_2_0::tools::particle_atlas_internal::RadialRangeFilter::Range()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1BBoxFilter.html#abe03036ac3f8fd11ef5755b9403db347',1,'openvdb::v3_2_0::tools::particle_atlas_internal::BBoxFilter::Range()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1BBoxFilter.html#abe03036ac3f8fd11ef5755b9403db347',1,'openvdb::v3_2_0::tools::point_index_grid_internal::BBoxFilter::Range()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1RadialRangeFilter.html#abe03036ac3f8fd11ef5755b9403db347',1,'openvdb::v3_2_0::tools::point_index_grid_internal::RadialRangeFilter::Range()']]], + ['range3d',['Range3d',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#ae5f6bcf730061b750b501b9b0103268a',1,'openvdb::v3_2_0::tools::SparseExtractor::Range3d()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#ae5f6bcf730061b750b501b9b0103268a',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor::Range3d()']]], + ['rangedeque',['RangeDeque',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RadialRangeFilter.html#af25c7dc3aaf69725d6fb47ab3a389e17',1,'openvdb::v3_2_0::tools::particle_atlas_internal::RadialRangeFilter::RangeDeque()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1BBoxFilter.html#af25c7dc3aaf69725d6fb47ab3a389e17',1,'openvdb::v3_2_0::tools::particle_atlas_internal::BBoxFilter::RangeDeque()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1BBoxFilter.html#af25c7dc3aaf69725d6fb47ab3a389e17',1,'openvdb::v3_2_0::tools::point_index_grid_internal::BBoxFilter::RangeDeque()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1RadialRangeFilter.html#af25c7dc3aaf69725d6fb47ab3a389e17',1,'openvdb::v3_2_0::tools::point_index_grid_internal::RadialRangeFilter::RangeDeque()']]], + ['ranget',['RangeT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1ErodeVoxelsOp.html#abfe0d11208733b830b3ce6feae7ff0ac',1,'openvdb::v3_2_0::tools::Morphology::ErodeVoxelsOp::RangeT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1MaskOp.html#ae2edd9b69d31605a76cc7b25d92d2ee1',1,'openvdb::v3_2_0::tools::MultiResGrid::MaskOp::RangeT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid_1_1ReducePool.html#a1e2d583ad6fc1b0bd295b9b0d07ab1db',1,'openvdb::v3_2_0::tools::PointMaskGrid::ReducePool::RangeT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafManagerImpl.html#a5ce1a5aa471bc457b54feeae47a8b04a',1,'openvdb::v3_2_0::tree::LeafManagerImpl::RangeT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafManagerImpl_3_01LeafManager_3_01const_01TreeT_01_4_01_4.html#a5ce1a5aa471bc457b54feeae47a8b04a',1,'openvdb::v3_2_0::tree::LeafManagerImpl< LeafManager< const TreeT > >::RangeT()']]], + ['rangetype',['RangeType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseTransformer.html#a73336be54755cd0438c9a7c2298dc2ea',1,'openvdb::v3_2_0::tools::DenseTransformer::RangeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a84a0f8c16513fb5cdef01b99531c8941',1,'openvdb::v3_2_0::tools::Filter::RangeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a02f5d57c17bb98d1720b2bd1ef5a38e0',1,'openvdb::v3_2_0::tree::LeafManager::RangeType()']]], + ['rayt',['RayT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#a1c5dcc505cff8f3a8f4198a777a2435e',1,'openvdb::v3_2_0::tools::LinearSearchImpl::RayT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseShader.html#accc82e9bfdabcaf82a7fcd1bfe32ff48',1,'openvdb::v3_2_0::tools::BaseShader::RayT()']]], + ['raytype',['RayType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#a47e1d56b220e0d553fb1b48aeb3467bb',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::RayType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a47e1d56b220e0d553fb1b48aeb3467bb',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::RayType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#afec8f0d09ffa3c6d7a1fdfe2866dde6f',1,'openvdb::v3_2_0::tools::LevelSetRayTracer::RayType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#afec8f0d09ffa3c6d7a1fdfe2866dde6f',1,'openvdb::v3_2_0::tools::VolumeRender::RayType()']]], + ['real',['Real',['../namespaceopenvdb_1_1v3__2__0.html#a445a5f0e2a34c9d97d69a3c2d1957907',1,'openvdb::v3_2_0']]], + ['realt',['RealT',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#a1f1c2c964fdec9d9bf5991fef3734b16',1,'openvdb::v3_2_0::math::DDA']]], + ['realtype',['RealType',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#a655de90b5db96149fcf10f2ed06f6256',1,'openvdb::v3_2_0::math::DDA::RealType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#a3ebd1e03ef474a8e9aca622ac8d4d09e',1,'openvdb::v3_2_0::math::Ray::RealType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#a655de90b5db96149fcf10f2ed06f6256',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::RealType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a655de90b5db96149fcf10f2ed06f6256',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::RealType()']]], + ['resultleafnodetype',['ResultLeafNodeType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#a60e7707bf58a6e2e68dbce787b37c0d7',1,'openvdb::v3_2_0::tools::SparseExtractor::ResultLeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#a60e7707bf58a6e2e68dbce787b37c0d7',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor::ResultLeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ExtractAll.html#a60e7707bf58a6e2e68dbce787b37c0d7',1,'openvdb::v3_2_0::tools::ExtractAll::ResultLeafNodeType()']]], + ['resulttreetype',['ResultTreeType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#a112dd01f9a043c86fcb3b364713a1340',1,'openvdb::v3_2_0::tools::SparseExtractor::ResultTreeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#aa56d457d9faa1117e1f8d5f4e55bffc1',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor::ResultTreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ExtractAll.html#aa56d457d9faa1117e1f8d5f4e55bffc1',1,'openvdb::v3_2_0::tools::ExtractAll::ResultTreeType()']]], + ['resultvaluetype',['ResultValueType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#afb8f7ff06ef34b92309df959428d6926',1,'openvdb::v3_2_0::tools::SparseExtractor::ResultValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#afb8f7ff06ef34b92309df959428d6926',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor::ResultValueType()']]], + ['rootitert',['RootIterT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#abd99255809df525cc59410399f36682b',1,'openvdb::v3_2_0::tree::NodeIteratorBase::RootIterT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#abd99255809df525cc59410399f36682b',1,'openvdb::v3_2_0::tree::LeafIteratorBase::RootIterT()']]], + ['rootitertraits',['RootIterTraits',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#aa7596d9d02cec346533eed3baedd7ef0',1,'openvdb::v3_2_0::tree::NodeIteratorBase::RootIterTraits()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#aa7596d9d02cec346533eed3baedd7ef0',1,'openvdb::v3_2_0::tree::LeafIteratorBase::RootIterTraits()']]], + ['rootnodet',['RootNodeT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a23ad49b8cabe9f044a0820545616e8d6',1,'openvdb::v3_2_0::tree::NodeIteratorBase::RootNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#a23ad49b8cabe9f044a0820545616e8d6',1,'openvdb::v3_2_0::tree::LeafIteratorBase::RootNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a0cfb0158f94bbc0c07766058ac478e89',1,'openvdb::v3_2_0::tree::ValueAccessor::RootNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a0cfb0158f94bbc0c07766058ac478e89',1,'openvdb::v3_2_0::tree::ValueAccessor0::RootNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a0cfb0158f94bbc0c07766058ac478e89',1,'openvdb::v3_2_0::tree::ValueAccessor1::RootNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a0cfb0158f94bbc0c07766058ac478e89',1,'openvdb::v3_2_0::tree::ValueAccessor2::RootNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a0cfb0158f94bbc0c07766058ac478e89',1,'openvdb::v3_2_0::tree::ValueAccessor3::RootNodeT()']]], + ['rootnodetype',['RootNodeType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildPrimarySegment.html#a6eddacb347513c1a0b76ee5c77527aed',1,'openvdb::v3_2_0::tools::composite::BuildPrimarySegment::RootNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildSecondarySegment.html#a6eddacb347513c1a0b76ee5c77527aed',1,'openvdb::v3_2_0::tools::composite::BuildSecondarySegment::RootNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FloodFillSign.html#a6eddacb347513c1a0b76ee5c77527aed',1,'openvdb::v3_2_0::tools::level_set_util_internal::FloodFillSign::RootNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a5d77fefeb4e16e1bea6e770ab2175b56',1,'openvdb::v3_2_0::tree::LeafManager::RootNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#a7d08386e86e19d1a30b4f25d07aa0f4f',1,'openvdb::v3_2_0::tree::NodeManager::RootNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#a7d08386e86e19d1a30b4f25d07aa0f4f',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::RootNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a7d08386e86e19d1a30b4f25d07aa0f4f',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::RootNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a7d08386e86e19d1a30b4f25d07aa0f4f',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::RootNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a7d08386e86e19d1a30b4f25d07aa0f4f',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::RootNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a7d08386e86e19d1a30b4f25d07aa0f4f',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::RootNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#abc44cb0c032a80ed68bf3b9f782a6831',1,'openvdb::v3_2_0::tree::Tree::RootNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#aacd5236487edef4de7151627e6c0cef0',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::RootNodeType()']]], + ['roott',['RootT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeBackgroundOp.html#ae56cc657f7550cb1e4ecf8cfea6d2d93',1,'openvdb::v3_2_0::tools::ChangeBackgroundOp::RootT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeLevelSetBackgroundOp.html#ae56cc657f7550cb1e4ecf8cfea6d2d93',1,'openvdb::v3_2_0::tools::ChangeLevelSetBackgroundOp::RootT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1InactivePruneOp.html#af2b2500a72e5d85e7acf2347db844938',1,'openvdb::v3_2_0::tools::InactivePruneOp::RootT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1TolerancePruneOp.html#af2b2500a72e5d85e7acf2347db844938',1,'openvdb::v3_2_0::tools::TolerancePruneOp::RootT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetPruneOp.html#af2b2500a72e5d85e7acf2347db844938',1,'openvdb::v3_2_0::tools::LevelSetPruneOp::RootT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SignedFloodFillOp.html#ae56cc657f7550cb1e4ecf8cfea6d2d93',1,'openvdb::v3_2_0::tools::SignedFloodFillOp::RootT()']]], + ['roottype',['RootType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a8c2dad3c864cab35a447dff0e4a9a96f',1,'openvdb::v3_2_0::tools::VolumeRayIntersector']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_11.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_11.html new file mode 100644 index 00000000..78f6d56a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_11.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_11.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_11.js new file mode 100644 index 00000000..23f3d2aa --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_11.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['samlertype',['SamlerType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#a5c22664ad3eac5cac5545e0d01e459e6',1,'openvdb::v3_2_0::tools::AlphaMask']]], + ['samplertype',['SamplerType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#a34d314fe0ad08b57e26dc5a5434e90fe',1,'openvdb::v3_2_0::tools::VolumeRender']]], + ['scalargrid',['ScalarGrid',['../namespaceopenvdb_1_1v3__2__0.html#a0efc6e9fd1c6c24164eeeee2d50df801',1,'openvdb::v3_2_0']]], + ['scalartree',['ScalarTree',['../namespaceopenvdb_1_1v3__2__0.html#ad638a06eb446fed0cddb86dcbbd3c289',1,'openvdb::v3_2_0']]], + ['scalartype',['ScalarType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1ComputeExtremas.html#a9b8b8d426efe4ff5a7867bb79e8a347c',1,'openvdb::v3_2_0::tools::particle_atlas_internal::ComputeExtremas::ScalarType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#a9b8b8d426efe4ff5a7867bb79e8a347c',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray::ScalarType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RadialRangeFilter.html#a9b8b8d426efe4ff5a7867bb79e8a347c',1,'openvdb::v3_2_0::tools::particle_atlas_internal::RadialRangeFilter::ScalarType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1BBoxFilter.html#a9b8b8d426efe4ff5a7867bb79e8a347c',1,'openvdb::v3_2_0::tools::particle_atlas_internal::BBoxFilter::ScalarType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexFilter.html#a9b8b8d426efe4ff5a7867bb79e8a347c',1,'openvdb::v3_2_0::tools::PointIndexFilter::ScalarType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1BBoxFilter.html#a9b8b8d426efe4ff5a7867bb79e8a347c',1,'openvdb::v3_2_0::tools::point_index_grid_internal::BBoxFilter::ScalarType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1RadialRangeFilter.html#a9b8b8d426efe4ff5a7867bb79e8a347c',1,'openvdb::v3_2_0::tools::point_index_grid_internal::RadialRangeFilter::ScalarType()']]], + ['sdfgridtype',['SdfGridType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a86360109c4d4d028fc3526768e1978bf',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['sdftype',['SdfType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#ab1864cab9091f84edfb8b6dfbd49d38b',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['segment',['Segment',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MoveSegmentDataOp.html#a68fc89c821f0583c0e1e6e8fe96835a2',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MoveSegmentDataOp::Segment()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MergeBinsOp.html#a68fc89c821f0583c0e1e6e8fe96835a2',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MergeBinsOp::Segment()']]], + ['segmentptr',['SegmentPtr',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MoveSegmentDataOp.html#af87d89363ef176c69dd89a6db07b357a',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MoveSegmentDataOp::SegmentPtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MergeBinsOp.html#af87d89363ef176c69dd89a6db07b357a',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MergeBinsOp::SegmentPtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1OrderSegmentsOp.html#a6d6e781155b1e42926f2e12bc7a5f420',1,'openvdb::v3_2_0::tools::point_partitioner_internal::OrderSegmentsOp::SegmentPtr()']]], + ['settype',['SetType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveVoxelValues.html#abc8b747bc4ff51ee3a4bd3be9a5121b4',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveVoxelValues::SetType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveTileValues.html#abc8b747bc4ff51ee3a4bd3be9a5121b4',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveTileValues::SetType()']]], + ['sizerange',['SizeRange',['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg.html#af85676c715387990c429d7e4baa89200',1,'openvdb::v3_2_0::math::pcg']]], + ['sizetype',['SizeType',['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg.html#a51ed7a9d9dd68b654a0bc7772a1ba34f',1,'openvdb::v3_2_0::math::pcg']]], + ['spectraldecomposedmap',['SpectralDecomposedMap',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7a4a32225b190fdb8ecc0d271581baa0',1,'openvdb::v3_2_0::math']]], + ['srcaccessort',['SrcAccessorT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTopologyMask.html#a248dfdcdfe3ea1e2aca1da758236faa4',1,'openvdb::v3_2_0::tools::internal::GenTopologyMask']]], + ['stencilt',['StencilT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#a6741d6c7452a3b84e6c12c6f4912afd0',1,'openvdb::v3_2_0::tools::LinearSearchImpl']]], + ['stenciltype',['StencilType',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_1_1ISStencil.html#a58bbe5b8b1369a90c810be4a05d9690e',1,'openvdb::v3_2_0::math::BIAS_SCHEME::ISStencil::StencilType()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01FIRST__BIAS_01_4_1_1ISStencil.html#a58bbe5b8b1369a90c810be4a05d9690e',1,'openvdb::v3_2_0::math::BIAS_SCHEME< FIRST_BIAS >::ISStencil::StencilType()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01SECOND__BIAS_01_4_1_1ISStencil.html#afff00b618eeef85e6058c7af50d68e3e',1,'openvdb::v3_2_0::math::BIAS_SCHEME< SECOND_BIAS >::ISStencil::StencilType()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01THIRD__BIAS_01_4_1_1ISStencil.html#a55992f13d1e7771d27279b9e4a9f9f5e',1,'openvdb::v3_2_0::math::BIAS_SCHEME< THIRD_BIAS >::ISStencil::StencilType()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01WENO5__BIAS_01_4_1_1ISStencil.html#a55992f13d1e7771d27279b9e4a9f9f5e',1,'openvdb::v3_2_0::math::BIAS_SCHEME< WENO5_BIAS >::ISStencil::StencilType()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01HJWENO5__BIAS_01_4_1_1ISStencil.html#a55992f13d1e7771d27279b9e4a9f9f5e',1,'openvdb::v3_2_0::math::BIAS_SCHEME< HJWENO5_BIAS >::ISStencil::StencilType()']]], + ['stringgrid',['StringGrid',['../namespaceopenvdb_1_1v3__2__0.html#ad1cbf3303b74ea0658f207a3ede75c07',1,'openvdb::v3_2_0']]], + ['stringmetadata',['StringMetadata',['../namespaceopenvdb_1_1v3__2__0.html#a5625a4354bb397a6ecfb7f44c9d59531',1,'openvdb::v3_2_0']]], + ['stringtree',['StringTree',['../namespaceopenvdb_1_1v3__2__0.html#af3dad2a928121957fbd8abd81c4ceaaf',1,'openvdb::v3_2_0']]], + ['subtreet',['SubtreeT',['../structopenvdb_1_1v3__2__0_1_1tree_1_1NodeChain.html#a016896c4be194bf5136a3a8998940a5a',1,'openvdb::v3_2_0::tree::NodeChain::SubtreeT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1iter_1_1InvertedTree.html#a0119ecfd7ca680faf8987ef7d7e7260a',1,'openvdb::v3_2_0::tree::iter::InvertedTree::SubtreeT()']]], + ['symmetricmap',['SymmetricMap',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a942f2c4fa2fd1d8a7271aab8edb6314b',1,'openvdb::v3_2_0::math']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_12.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_12.html new file mode 100644 index 00000000..44cb166d --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_12.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_12.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_12.js new file mode 100644 index 00000000..741d2d0d --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_12.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['tileitert',['TileIterT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNan.html#ab67c6a6c5c01dd172dfaa3c2fedd1699',1,'openvdb::v3_2_0::tools::CheckNan::TileIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckInf.html#ab67c6a6c5c01dd172dfaa3c2fedd1699',1,'openvdb::v3_2_0::tools::CheckInf::TileIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckFinite.html#ab67c6a6c5c01dd172dfaa3c2fedd1699',1,'openvdb::v3_2_0::tools::CheckFinite::TileIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMagnitude.html#ab67c6a6c5c01dd172dfaa3c2fedd1699',1,'openvdb::v3_2_0::tools::CheckMagnitude::TileIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckRange.html#ab67c6a6c5c01dd172dfaa3c2fedd1699',1,'openvdb::v3_2_0::tools::CheckRange::TileIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMin.html#ab67c6a6c5c01dd172dfaa3c2fedd1699',1,'openvdb::v3_2_0::tools::CheckMin::TileIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMax.html#ab67c6a6c5c01dd172dfaa3c2fedd1699',1,'openvdb::v3_2_0::tools::CheckMax::TileIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#ab67c6a6c5c01dd172dfaa3c2fedd1699',1,'openvdb::v3_2_0::tools::CheckNormGrad::TileIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#ab67c6a6c5c01dd172dfaa3c2fedd1699',1,'openvdb::v3_2_0::tools::CheckEikonal::TileIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#ab67c6a6c5c01dd172dfaa3c2fedd1699',1,'openvdb::v3_2_0::tools::CheckDivergence::TileIterT()']]], + ['timespant',['TimeSpanT',['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA.html#a0cee5839ee2c2079aeae24aed498b3b0',1,'openvdb::v3_2_0::math::VolumeHDDA::TimeSpanT()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA_3_01TreeT_00_01RayT_00_010_01_4.html#a0cee5839ee2c2079aeae24aed498b3b0',1,'openvdb::v3_2_0::math::VolumeHDDA< TreeT, RayT, 0 >::TimeSpanT()']]], + ['togridptrt',['ToGridPtrT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1ConvertGrid.html#a245d3550508c97ac67f8ba57419eccbf',1,'openvdb::v3_2_0::tools::clip_internal::ConvertGrid']]], + ['topologygrid',['TopologyGrid',['../namespaceopenvdb_1_1v3__2__0.html#a4956b51f1ebabcb911839053eb1d746a',1,'openvdb::v3_2_0']]], + ['topologytree',['TopologyTree',['../namespaceopenvdb_1_1v3__2__0.html#a5484a70c5d53851cf79d78f62905c989',1,'openvdb::v3_2_0']]], + ['trackert',['TrackerT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#ac165d5a7bddd0b4fdd763da4f6720439',1,'openvdb::v3_2_0::tools::LevelSetAdvection::TrackerT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#ac165d5a7bddd0b4fdd763da4f6720439',1,'openvdb::v3_2_0::tools::LevelSetMorphing::TrackerT()']]], + ['treebase',['TreeBase',['../namespaceopenvdb_1_1v3__2__0.html#a15cd29f1deaf28e53f61fe753f176eb5',1,'openvdb::v3_2_0']]], + ['treeptr',['TreePtr',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a1debe4564bc39db1b455b9bf7872bb4f',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['treeptrtype',['TreePtrType',['../classopenvdb_1_1v3__2__0_1_1Grid.html#afef2a21e48eda1f64f66669f7f826de3',1,'openvdb::v3_2_0::Grid::TreePtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a50074b4ecb1554dd79b20d1e2a238044',1,'openvdb::v3_2_0::TreeAdapter::TreePtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a50074b4ecb1554dd79b20d1e2a238044',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::TreePtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a50074b4ecb1554dd79b20d1e2a238044',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::TreePtrType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildPrimarySegment.html#a50074b4ecb1554dd79b20d1e2a238044',1,'openvdb::v3_2_0::tools::composite::BuildPrimarySegment::TreePtrType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildSecondarySegment.html#a50074b4ecb1554dd79b20d1e2a238044',1,'openvdb::v3_2_0::tools::composite::BuildSecondarySegment::TreePtrType()']]], + ['treet',['TreeT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CsgVisitorBase.html#a15967b95a876348b5a225bef7a3e6902',1,'openvdb::v3_2_0::tools::CsgVisitorBase::TreeT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgUnionVisitor.html#a15967b95a876348b5a225bef7a3e6902',1,'openvdb::v3_2_0::tools::CsgUnionVisitor::TreeT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgIntersectVisitor.html#a15967b95a876348b5a225bef7a3e6902',1,'openvdb::v3_2_0::tools::CsgIntersectVisitor::TreeT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgDiffVisitor.html#a15967b95a876348b5a225bef7a3e6902',1,'openvdb::v3_2_0::tools::CsgDiffVisitor::TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyToDense.html#af61d2fea6a53c3e0c9cd3fc35684b952',1,'openvdb::v3_2_0::tools::CopyToDense::TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyFromDense.html#af61d2fea6a53c3e0c9cd3fc35684b952',1,'openvdb::v3_2_0::tools::CopyFromDense::TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#af61d2fea6a53c3e0c9cd3fc35684b952',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor::TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#a6fc4d79a23d40016f923bc6fb59b57ca',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#a3fa1cbd9a37dfb670f9cab7fb0b9f713',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::TreeT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1MathOp.html#abf54fa49495b0d1c2f23668106476e7d',1,'openvdb::v3_2_0::tools::stats_internal::MathOp::TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestSurfacePoint.html#a6fc4d79a23d40016f923bc6fb59b57ca',1,'openvdb::v3_2_0::tools::ClosestSurfacePoint::TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#af61d2fea6a53c3e0c9cd3fc35684b952',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#af61d2fea6a53c3e0c9cd3fc35684b952',1,'openvdb::v3_2_0::tree::NodeIteratorBase::TreeT()']]], + ['treetype',['TreeType',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a781db8c1f2c3f4f03715a0ac432b38a0',1,'openvdb::v3_2_0::Grid::TreeType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a781db8c1f2c3f4f03715a0ac432b38a0',1,'openvdb::v3_2_0::TreeAdapter::TreeType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a781db8c1f2c3f4f03715a0ac432b38a0',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::TreeType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a781db8c1f2c3f4f03715a0ac432b38a0',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::math::BaseStencil::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SevenPointStencil.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::math::SevenPointStencil::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BoxStencil.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::math::BoxStencil::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SecondOrderDenseStencil.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::math::SecondOrderDenseStencil::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ThirteenPointStencil.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::math::ThirteenPointStencil::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1FourthOrderDenseStencil.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::math::FourthOrderDenseStencil::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NineteenPointStencil.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::math::NineteenPointStencil::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SixthOrderDenseStencil.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::math::SixthOrderDenseStencil::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::math::GradStencil::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::math::WenoStencil::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CurvatureStencil.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::math::CurvatureStencil::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DenseStencil.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::math::DenseStencil::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#afb7bf3ee90caeae22f3bbd81e7aa7bcc',1,'openvdb::v3_2_0::tools::Filter::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#a36d460ea0a4df4f3dfa13b7e071e75d3',1,'openvdb::v3_2_0::tools::GridSampler::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html#af5ba81f3debea34f5eb54aa410259619',1,'openvdb::v3_2_0::tools::GridSampler< tree::ValueAccessor< TreeT >, SamplerType >::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler.html#aa72d230f274d703bad6bd9a6a2516190',1,'openvdb::v3_2_0::tools::DualGridSampler::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerT_01_4.html#af5ba81f3debea34f5eb54aa410259619',1,'openvdb::v3_2_0::tools::DualGridSampler< tree::ValueAccessor< TreeT >, SamplerT >::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#afb7bf3ee90caeae22f3bbd81e7aa7bcc',1,'openvdb::v3_2_0::tools::LevelSetFilter::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#afb7bf3ee90caeae22f3bbd81e7aa7bcc',1,'openvdb::v3_2_0::tools::LevelSetMeasure::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::tools::LevelSetMorphing::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#ae83fe5f85ef3c031cd27e541cfe84341',1,'openvdb::v3_2_0::tools::LevelSetTracker::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData.html#aea106a722e3afdcc1416e9e9e130352e',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::TreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#a31ee3420fcda29b6bd440229afd01963',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#af5ba81f3debea34f5eb54aa410259619',1,'openvdb::v3_2_0::tree::LeafManager::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a781db8c1f2c3f4f03715a0ac432b38a0',1,'openvdb::v3_2_0::tree::ValueAccessor::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a781db8c1f2c3f4f03715a0ac432b38a0',1,'openvdb::v3_2_0::tree::ValueAccessor0::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a781db8c1f2c3f4f03715a0ac432b38a0',1,'openvdb::v3_2_0::tree::ValueAccessor1::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a781db8c1f2c3f4f03715a0ac432b38a0',1,'openvdb::v3_2_0::tree::ValueAccessor2::TreeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a781db8c1f2c3f4f03715a0ac432b38a0',1,'openvdb::v3_2_0::tree::ValueAccessor3::TreeType()']]], + ['treetypeptr',['TreeTypePtr',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1GridOrTreeConstructor.html#ade86befaf01a9b9552b6073232a34de0',1,'openvdb::v3_2_0::tools::composite::GridOrTreeConstructor::TreeTypePtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#ade86befaf01a9b9552b6073232a34de0',1,'openvdb::v3_2_0::tools::composite::GridOrTreeConstructor< Grid< TreeType > >::TreeTypePtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskSegmentGroup.html#ade86befaf01a9b9552b6073232a34de0',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskSegmentGroup::TreeTypePtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FloodFillSign.html#ade86befaf01a9b9552b6073232a34de0',1,'openvdb::v3_2_0::tools::level_set_util_internal::FloodFillSign::TreeTypePtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskedCopy.html#ade86befaf01a9b9552b6073232a34de0',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskedCopy::TreeTypePtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor.html#ade86befaf01a9b9552b6073232a34de0',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor::TreeTypePtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#ade86befaf01a9b9552b6073232a34de0',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor< Grid< TreeType > >::TreeTypePtr()']]], + ['treevaluet',['TreeValueT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyToVecOp.html#ac57a660a29c8a6e5912851dbd08578eb',1,'openvdb::v3_2_0::tools::poisson::internal::CopyToVecOp']]], + ['triangleconstrow',['TriangleConstRow',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#a9c20229c5982d6722ea8fba79164e67f',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner']]], + ['triangleroweditor',['TriangleRowEditor',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#a77cf11753a97abf94dc7fb57f9618d74',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner']]], + ['triangularmatrix',['TriangularMatrix',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#a316e64466934b9a1b9ef33cec98d6420',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner']]], + ['type',['type',['../structopenvdb_1_1v3__2__0_1_1math_1_1promote.html#a9e155c97926413dbf4e714fb820f9c6a',1,'openvdb::v3_2_0::math::promote::type()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1UniquePtr.html#a6e368a7fb23816e16795aa38b898cf2c',1,'openvdb::v3_2_0::tools::internal::UniquePtr::type()'],['../structopenvdb_1_1v3__2__0_1_1Grid_1_1ValueConverter.html#ab878c96052e4bd7ffd01406e542a419b',1,'openvdb::v3_2_0::Grid::ValueConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1DSConverter.html#a87d4cf7f297f6694fc209f3a6ec3f167',1,'openvdb::v3_2_0::tools::DSConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1VectorToScalarConverter.html#a11740aac462a0be7c37c692175a28e3a',1,'openvdb::v3_2_0::tools::VectorToScalarConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ScalarToVectorConverter.html#a8b727e6fbafe29f45e41f6dd34442324',1,'openvdb::v3_2_0::tools::ScalarToVectorConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1ToMaskGrid.html#ad1b893a92556ac5d1b808479729f5790',1,'openvdb::v3_2_0::tools::gridop::ToMaskGrid::Type()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1DimToWord_3_013_01_4.html#a9d11d1b8a430e90035e92601c81e727c',1,'openvdb::v3_2_0::tools::DimToWord< 3 >::Type()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1DimToWord_3_014_01_4.html#abbb059b13f910992506421a532f66d07',1,'openvdb::v3_2_0::tools::DimToWord< 4 >::Type()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1DimToWord_3_015_01_4.html#a26dc433e5d0d9824a01c3d8af7e09ca9',1,'openvdb::v3_2_0::tools::DimToWord< 5 >::Type()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1DimToWord_3_016_01_4.html#a913d787c8b2ab9d92605b20ad85fc5dd',1,'openvdb::v3_2_0::tools::DimToWord< 6 >::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1ValueConverter.html#a241f44943eef08b01c13405a1c9f84ba',1,'openvdb::v3_2_0::tree::InternalNode::ValueConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueConverter.html#a96c3cfd601615c865529caf8aa3d39d5',1,'openvdb::v3_2_0::tree::LeafNode::ValueConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ValueConverter.html#ab7370e7563e54bb527a70c151700b39a',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ValueConverter.html#a96c3cfd601615c865529caf8aa3d39d5',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1RootNode_1_1ValueConverter.html#aa8fd1f62842d2bf20ffa71817f25f110',1,'openvdb::v3_2_0::tree::RootNode::ValueConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1NodeChain.html#a05a33b77c742935517ca2e34a5ca6507',1,'openvdb::v3_2_0::tree::NodeChain::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1NodeChain_3_01HeadT_00_011_01_4.html#a3c05a489a315d0caa6cbdee5940a3c4a',1,'openvdb::v3_2_0::tree::NodeChain< HeadT, 1 >::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree_1_1ValueConverter.html#aee1be7ed6a52b19655f813d536f35afd',1,'openvdb::v3_2_0::tree::Tree::ValueConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree3.html#a1012aacb1e7f5ebe56cb8acd3b78cebd',1,'openvdb::v3_2_0::tree::Tree3::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree4.html#a730b8e56ad8b5eca191d78546c8fc6c2',1,'openvdb::v3_2_0::tree::Tree4::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree5.html#ad7e9705f00a3dcfd7be60c992fd3a76a',1,'openvdb::v3_2_0::tree::Tree5::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1CopyConstness.html#a28a8146771b7ddd0b9ec08b41012c08d',1,'openvdb::v3_2_0::tree::CopyConstness::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1CopyConstness_3_01const_01FromType_00_01ToType_01_4.html#a393e31991d3756aecd249aba8d38224f',1,'openvdb::v3_2_0::tree::CopyConstness< const FromType, ToType >::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1iter_1_1InvertedTree.html#a05a33b77c742935517ca2e34a5ca6507',1,'openvdb::v3_2_0::tree::iter::InvertedTree::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1iter_1_1InvertedTree_3_01HeadT_00_011_01_4.html#a3c05a489a315d0caa6cbdee5940a3c4a',1,'openvdb::v3_2_0::tree::iter::InvertedTree< HeadT, 1 >::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOnIter_01_4_1_1NodeConverter.html#ae5ce22373ac106e412fd8cb585caf5b7',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOnIter >::NodeConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOnCIter_01_4_1_1NodeConverter.html#af2f91160480282d27e83171eafab3aba',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOnCIter >::NodeConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOffIter_01_4_1_1NodeConverter.html#aa12895ccb526efd3a57bed2d49ed4fc8',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOffIter >::NodeConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOffCIter_01_4_1_1NodeConverter.html#af1305dbc58a8503ac69f5b0a26cf64aa',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOffCIter >::NodeConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildAllIter_01_4_1_1NodeConverter.html#aa75d85eb65f948bf3303fa87ab8e8b17',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildAllIter >::NodeConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildAllCIter_01_4_1_1NodeConverter.html#a9cdc604bc85df2b3db1377797d91eba9',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildAllCIter >::NodeConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOnIter_01_4_1_1NodeConverter.html#acac1f09f1d13cdb7a686fa963ad0c1fd',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOnIter >::NodeConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOnCIter_01_4_1_1NodeConverter.html#a0e044311f5e7bcce228455eae33b9285',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOnCIter >::NodeConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOffIter_01_4_1_1NodeConverter.html#a96683c62e3c10a976f19f699528d6a16',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOffIter >::NodeConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOffCIter_01_4_1_1NodeConverter.html#a8c6b66ce0a05409bfb5cadda1e82d03e',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOffCIter >::NodeConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueAllIter_01_4_1_1NodeConverter.html#a3a797e676984c8492da21dbb50716840',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueAllIter >::NodeConverter::Type()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueAllCIter_01_4_1_1NodeConverter.html#a3ccec23c187f79376fa7028f4256409d',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueAllCIter >::NodeConverter::Type()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_13.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_13.html new file mode 100644 index 00000000..9ce960c9 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_13.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_13.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_13.js new file mode 100644 index 00000000..ec24ad68 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_13.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['uchartreeacc',['UCharTreeAcc',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#a751c230b1d43a58d51ba0bbad3bacb69',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData']]], + ['uchartreetype',['UCharTreeType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#a91730f2e8d4ce28c64a6b5e10e785da9',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData']]], + ['uint32pointpartitioner',['UInt32PointPartitioner',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a0f143f1cea06b16a55cd2523ab2d2df9',1,'openvdb::v3_2_0::tools']]], + ['uint32tree',['UInt32Tree',['../namespaceopenvdb_1_1v3__2__0.html#a3056a126b3e57feee79d0b7684e46cc2',1,'openvdb::v3_2_0']]], + ['uniontype',['UnionType',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a57297009813014bcf584a1d4ba0cd053',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['unitaryandtranslationmap',['UnitaryAndTranslationMap',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a430b50ab102d4f232678ccc550a13e28',1,'openvdb::v3_2_0::math']]], + ['unsafeaccessor',['UnsafeAccessor',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a0583888267e2dfc451e784097906afc6',1,'openvdb::v3_2_0::Grid']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_14.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_14.html new file mode 100644 index 00000000..a852999f --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_14.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_14.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_14.js new file mode 100644 index 00000000..e0f5782c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_14.js @@ -0,0 +1,76 @@ +var searchData= +[ + ['value_5ftype',['value_type',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#a265a253612b46abed17c61b0a5e5ce30',1,'openvdb::v3_2_0::math::Mat::value_type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a265a253612b46abed17c61b0a5e5ce30',1,'openvdb::v3_2_0::math::Mat3::value_type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a265a253612b46abed17c61b0a5e5ce30',1,'openvdb::v3_2_0::math::Mat4::value_type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#a265a253612b46abed17c61b0a5e5ce30',1,'openvdb::v3_2_0::math::Tuple::value_type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a265a253612b46abed17c61b0a5e5ce30',1,'openvdb::v3_2_0::math::Vec2::value_type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a265a253612b46abed17c61b0a5e5ce30',1,'openvdb::v3_2_0::math::Vec3::value_type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a265a253612b46abed17c61b0a5e5ce30',1,'openvdb::v3_2_0::math::Vec4::value_type()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#afb2098030697daa35ca2c6106c6467ed',1,'openvdb::v3_2_0::tree::NodeList::value_type()']]], + ['valueall',['ValueAll',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a1a3035d659c23eeef5dfc6f292494092',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['valueallciter',['ValueAllCIter',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a3a22cbf2e0fe6e1aac15cb543ec5861a',1,'openvdb::v3_2_0::Grid::ValueAllCIter()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#aa930cf76a10403ec7d29d255df3f18fe',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ValueAllCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a6dac9485b31ee5a376bb0d93400f76b5',1,'openvdb::v3_2_0::tree::InternalNode::ValueAllCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a197f0603cecd47cb739e02f404ba4233',1,'openvdb::v3_2_0::tree::LeafNode::ValueAllCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a24d322eccc7dbfd07d2afaa03fcb7e7b',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueAllCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a24d322eccc7dbfd07d2afaa03fcb7e7b',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueAllCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ad2bd1bc2dfbeb43c37726f8d54cb9030',1,'openvdb::v3_2_0::tree::RootNode::ValueAllCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#afe596029b18684d42d21c42dff113ca9',1,'openvdb::v3_2_0::tree::Tree::ValueAllCIter()']]], + ['valuealliter',['ValueAllIter',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a7881ea5e6b8538a65a17ef8d0abc3d78',1,'openvdb::v3_2_0::Grid::ValueAllIter()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#abeb5b7e57c5e5db6bdb7a6a2c735cc44',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ValueAllIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a8e6040589f2734f53a8f3bd1634612fb',1,'openvdb::v3_2_0::tree::InternalNode::ValueAllIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a01b73276836d0b1a675d5b134babfbb6',1,'openvdb::v3_2_0::tree::LeafNode::ValueAllIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a3da6c03d2c047f4d977eef25041deeb9',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueAllIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a3da6c03d2c047f4d977eef25041deeb9',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueAllIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#adbfc1fbd1786a5ee06d7e9609353947e',1,'openvdb::v3_2_0::tree::RootNode::ValueAllIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a3679e9e0ab166205346c3aee0f853108',1,'openvdb::v3_2_0::tree::Tree::ValueAllIter()']]], + ['valueitert',['ValueIterT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a00ff291e80d0936f783a186595fedb98',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase']]], + ['valueoff',['ValueOff',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a2f93046fbb557896a03650d2bb92bccb',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['valueoffciter',['ValueOffCIter',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a40701e2eb5580bf0d33d647fed69bb9d',1,'openvdb::v3_2_0::Grid::ValueOffCIter()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ac84455be93367d898f23e04242bd9f87',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ValueOffCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a04521fbe98279d68f903d390ab43f791',1,'openvdb::v3_2_0::tree::InternalNode::ValueOffCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a6bf11b46ff23b7a56b02874518030f65',1,'openvdb::v3_2_0::tree::LeafNode::ValueOffCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a49dde1dd5ab68b8a10cf377f6b1d9207',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueOffCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a49dde1dd5ab68b8a10cf377f6b1d9207',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueOffCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a64f8fae8bedbde7096fd6cf44bab2912',1,'openvdb::v3_2_0::tree::RootNode::ValueOffCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a54d53e169bfd6750a72f58010ce3a1f3',1,'openvdb::v3_2_0::tree::Tree::ValueOffCIter()']]], + ['valueoffiter',['ValueOffIter',['../classopenvdb_1_1v3__2__0_1_1Grid.html#aa3bfddcea0ca11dc312deb2d9b008111',1,'openvdb::v3_2_0::Grid::ValueOffIter()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a3c7d03a6a73269e3ecb112d9d29cb66c',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ValueOffIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#add0b730188f16f2a2bb136021fb9fa83',1,'openvdb::v3_2_0::tree::InternalNode::ValueOffIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a74ce6f148e56b87669aae7020d44c628',1,'openvdb::v3_2_0::tree::LeafNode::ValueOffIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ac42f064bad772fd05ffaad3896dd2460',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueOffIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ac42f064bad772fd05ffaad3896dd2460',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueOffIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#ae801b56a803db51bf352c0e4037cb3b8',1,'openvdb::v3_2_0::tree::RootNode::ValueOffIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a327373295f10d7d43867f8f0107e5b7a',1,'openvdb::v3_2_0::tree::Tree::ValueOffIter()']]], + ['valueon',['ValueOn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a1266bc26608220282bcaad99c9964219',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['valueonciter',['ValueOnCIter',['../classopenvdb_1_1v3__2__0_1_1Grid.html#af73f7039c425b2517eb1772881d83ad4',1,'openvdb::v3_2_0::Grid::ValueOnCIter()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a3f64aa587bf9877f513726f2e253864e',1,'openvdb::v3_2_0::tools::MultiResGrid::ValueOnCIter()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a5feb26b7e51126fd9ac9351dc1555ecf',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ValueOnCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aa43c2083ef97b5e3f5044d6775a219fd',1,'openvdb::v3_2_0::tree::InternalNode::ValueOnCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a9a340941968357f08a190704f55ea38a',1,'openvdb::v3_2_0::tree::LeafNode::ValueOnCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#af6dc0739fa46d8e16116a698acdad6f5',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueOnCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#af6dc0739fa46d8e16116a698acdad6f5',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueOnCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#abfe6ed07bf810c06dfd8d15a9fc98e0a',1,'openvdb::v3_2_0::tree::RootNode::ValueOnCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a867ccecd35cba81c357f2a2b19710d3c',1,'openvdb::v3_2_0::tree::Tree::ValueOnCIter()']]], + ['valueoniter',['ValueOnIter',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a489aa6fa35d5ee2842072babf80c7f0c',1,'openvdb::v3_2_0::Grid::ValueOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a4504541b6669543b453079e5e9a30a8e',1,'openvdb::v3_2_0::tools::MultiResGrid::ValueOnIter()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a45e33d71316ed355765214c726cd2bd1',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ValueOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a896c235dcf22ae2dc1380c5fcf83610e',1,'openvdb::v3_2_0::tree::InternalNode::ValueOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#abc30a210cae685c0eab30eccf68ca8fe',1,'openvdb::v3_2_0::tree::LeafNode::ValueOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#abf84d9a2067a5234c332f70425c1430e',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#abf84d9a2067a5234c332f70425c1430e',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a77220d34c323bf6823b0dfb344b3b929',1,'openvdb::v3_2_0::tree::RootNode::ValueOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a2bc8a326316be76b916b32302506f427',1,'openvdb::v3_2_0::tree::Tree::ValueOnIter()']]], + ['valuet',['ValueT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeBackgroundOp.html#a86c9921e32bad03c7072d67d87576ed2',1,'openvdb::v3_2_0::tools::ChangeBackgroundOp::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeLevelSetBackgroundOp.html#a86c9921e32bad03c7072d67d87576ed2',1,'openvdb::v3_2_0::tools::ChangeLevelSetBackgroundOp::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1MaskInteriorVoxels.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::clip_internal::MaskInteriorVoxels::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CsgVisitorBase.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::CsgVisitorBase::ValueT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgUnionVisitor.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::CsgUnionVisitor::ValueT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgIntersectVisitor.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::CsgIntersectVisitor::ValueT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgDiffVisitor.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::CsgDiffVisitor::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyToDense.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::CopyToDense::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyFromDense.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::CopyFromDense::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseTransformer.html#a7a7651c713cdafbbfff498b2368058d5',1,'openvdb::v3_2_0::tools::DenseTransformer::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TileSampler.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::internal::TileSampler::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetSphere.html#ad71604ad8f1601cf353e9802c729c620',1,'openvdb::v3_2_0::tools::LevelSetSphere::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1activation_1_1ActivationOp.html#aafbf33dd701a39e4d364970973de358f',1,'openvdb::v3_2_0::tools::activation::ActivationOp::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid.html#ad71604ad8f1601cf353e9802c729c620',1,'openvdb::v3_2_0::tools::PointMaskGrid::ValueT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1ISLaplacianOp.html#a7094bb06e8d868718178ef88654a7ddb',1,'openvdb::v3_2_0::tools::poisson::internal::ISLaplacianOp::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1InactivePruneOp.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::InactivePruneOp::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1TolerancePruneOp.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::TolerancePruneOp::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetPruneOp.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::LevelSetPruneOp::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#ad71604ad8f1601cf353e9802c729c620',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LinearSearchImpl.html#ad71604ad8f1601cf353e9802c729c620',1,'openvdb::v3_2_0::tools::LinearSearchImpl::ValueT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#a61b6c8d2f9f6079011d098b1506a4dc0',1,'openvdb::v3_2_0::tools::Film::RGBA::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SignedFloodFillOp.html#a86c9921e32bad03c7072d67d87576ed2',1,'openvdb::v3_2_0::tools::SignedFloodFillOp::ValueT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1GetVal.html#a96d6195383e4f5c37b9e543154b757d6',1,'openvdb::v3_2_0::tools::stats_internal::GetVal::ValueT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1MathOp.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::stats_internal::MathOp::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::internal::SignData::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTileMask.html#aad0ee7a16afd38950bc913397444b7db',1,'openvdb::v3_2_0::tools::internal::GenTileMask::ValueT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#ab7f035a548f0da8691e2980969090e49',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::ValueT()']]], + ['valuetype',['ValueType',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a419a5559efe3c2c66addff643dfb4aa7',1,'openvdb::v3_2_0::Grid::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::TreeAdapter::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#ace14d133cbf9aa4792a3b82aa6ba6295',1,'openvdb::v3_2_0::math::BBox::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a215e2850ed819f54851fa725fdc8842c',1,'openvdb::v3_2_0::math::pcg::Vector::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a2bf6f4ff7ad07785ab4a1a2764f3dd34',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Preconditioner.html#a215e2850ed819f54851fa725fdc8842c',1,'openvdb::v3_2_0::math::pcg::Preconditioner::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1JacobiPreconditioner.html#abdf2f0abdf31f81ccc64246c16fbe79e',1,'openvdb::v3_2_0::math::pcg::JacobiPreconditioner::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#abdf2f0abdf31f81ccc64246c16fbe79e',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a4d2295cf7165a5b398ac6522b4bbe059',1,'openvdb::v3_2_0::math::Coord::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a15d8c3c12c49d057ea4385ce935d9427',1,'openvdb::v3_2_0::math::CoordBBox::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#a215e2850ed819f54851fa725fdc8842c',1,'openvdb::v3_2_0::math::Mat::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#a215e2850ed819f54851fa725fdc8842c',1,'openvdb::v3_2_0::math::Mat3::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a215e2850ed819f54851fa725fdc8842c',1,'openvdb::v3_2_0::math::Mat4::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Rand01.html#a566d154ee322e052476004d84e8a4e3c',1,'openvdb::v3_2_0::math::Rand01::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1ReturnValue.html#a375ca53bc5425c4c5ebf2855b22d0c1e',1,'openvdb::v3_2_0::math::internal::ReturnValue::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a736336446db9fff9182de2a0232a662e',1,'openvdb::v3_2_0::math::BaseStencil::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SevenPointStencil.html#a736336446db9fff9182de2a0232a662e',1,'openvdb::v3_2_0::math::SevenPointStencil::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BoxStencil.html#a736336446db9fff9182de2a0232a662e',1,'openvdb::v3_2_0::math::BoxStencil::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SecondOrderDenseStencil.html#ab5388e403c00c365cf358a85af632fe5',1,'openvdb::v3_2_0::math::SecondOrderDenseStencil::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ThirteenPointStencil.html#ab5388e403c00c365cf358a85af632fe5',1,'openvdb::v3_2_0::math::ThirteenPointStencil::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1FourthOrderDenseStencil.html#ab5388e403c00c365cf358a85af632fe5',1,'openvdb::v3_2_0::math::FourthOrderDenseStencil::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NineteenPointStencil.html#ab5388e403c00c365cf358a85af632fe5',1,'openvdb::v3_2_0::math::NineteenPointStencil::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SixthOrderDenseStencil.html#ab5388e403c00c365cf358a85af632fe5',1,'openvdb::v3_2_0::math::SixthOrderDenseStencil::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#ab5388e403c00c365cf358a85af632fe5',1,'openvdb::v3_2_0::math::GradStencil::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html#ab5388e403c00c365cf358a85af632fe5',1,'openvdb::v3_2_0::math::WenoStencil::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CurvatureStencil.html#a736336446db9fff9182de2a0232a662e',1,'openvdb::v3_2_0::math::CurvatureStencil::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DenseStencil.html#ab5388e403c00c365cf358a85af632fe5',1,'openvdb::v3_2_0::math::DenseStencil::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#a215e2850ed819f54851fa725fdc8842c',1,'openvdb::v3_2_0::math::Tuple::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec2.html#a215e2850ed819f54851fa725fdc8842c',1,'openvdb::v3_2_0::math::Vec2::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec3.html#a215e2850ed819f54851fa725fdc8842c',1,'openvdb::v3_2_0::math::Vec3::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Vec4.html#a215e2850ed819f54851fa725fdc8842c',1,'openvdb::v3_2_0::math::Vec4::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildPrimarySegment.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::composite::BuildPrimarySegment::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildSecondarySegment.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::composite::BuildSecondarySegment::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a10b843fba2f32761b707fafe0d9ce802',1,'openvdb::v3_2_0::tools::Dense::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1DSConverter.html#a4bde5a01ad278ac06936f18c27505407',1,'openvdb::v3_2_0::tools::DSConverter::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#a736336446db9fff9182de2a0232a662e',1,'openvdb::v3_2_0::tools::CheckNormGrad::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#a736336446db9fff9182de2a0232a662e',1,'openvdb::v3_2_0::tools::CheckEikonal::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#a736336446db9fff9182de2a0232a662e',1,'openvdb::v3_2_0::tools::CheckDivergence::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#ab5388e403c00c365cf358a85af632fe5',1,'openvdb::v3_2_0::tools::CheckLevelSet::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#ab5388e403c00c365cf358a85af632fe5',1,'openvdb::v3_2_0::tools::CheckFogVolume::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveVoxelValues.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveVoxelValues::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveTileValues.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveTileValues::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#ab5388e403c00c365cf358a85af632fe5',1,'openvdb::v3_2_0::tools::Filter::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#aa83b1b27d0de51e22462ccba9c414bb1',1,'openvdb::v3_2_0::tools::GridSampler::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html#a4e42b16f0b1f0cb9e95ef7201950956a',1,'openvdb::v3_2_0::tools::GridSampler< tree::ValueAccessor< TreeT >, SamplerType >::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler.html#a27802638e9fcaed29c7b31e83de6c4f5',1,'openvdb::v3_2_0::tools::DualGridSampler::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerT_01_4.html#a4e42b16f0b1f0cb9e95ef7201950956a',1,'openvdb::v3_2_0::tools::DualGridSampler< tree::ValueAccessor< TreeT >, SamplerT >::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#ac14b451d2da8b7fbf1e74c9645a489d9',1,'openvdb::v3_2_0::tools::LevelSetAdvection::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::LevelSetFilter::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__fracture__internal_1_1FindMinMaxVoxelValue.html#aa2a1b49e8c2a648bd403da8c5ba203a5',1,'openvdb::v3_2_0::tools::level_set_fracture_internal::FindMinMaxVoxelValue::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::LevelSetMeasure::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#ac14b451d2da8b7fbf1e74c9645a489d9',1,'openvdb::v3_2_0::tools::LevelSetMorphing::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::LevelSetTracker::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorVoxels.html#aa2a1b49e8c2a648bd403da8c5ba203a5',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorVoxels::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorTiles.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorTiles::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1PopulateTree.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::level_set_util_internal::PopulateTree::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1LabelBoundaryVoxels.html#aa2a1b49e8c2a648bd403da8c5ba203a5',1,'openvdb::v3_2_0::tools::level_set_util_internal::LabelBoundaryVoxels::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FlipRegionSign.html#aa2a1b49e8c2a648bd403da8c5ba203a5',1,'openvdb::v3_2_0::tools::level_set_util_internal::FlipRegionSign::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinVoxelValue.html#aa2a1b49e8c2a648bd403da8c5ba203a5',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinVoxelValue::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinTileValue.html#a501769e212c99c82d4c5e6b70c9c08b9',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinTileValue::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SDFVoxelsToFogVolume.html#aa2a1b49e8c2a648bd403da8c5ba203a5',1,'openvdb::v3_2_0::tools::level_set_util_internal::SDFVoxelsToFogVolume::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillMaskBoundary.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillMaskBoundary::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandLeafNodeRegion.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandLeafNodeRegion::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillLeafNodeVoxels.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillLeafNodeVoxels::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FloodFillSign.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::level_set_util_internal::FloodFillSign::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskedCopy.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskedCopy::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SweepExteriorSign.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SweepExteriorSign::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedFillExteriorSign.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedFillExteriorSign::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SyncVoxelMask.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SyncVoxelMask::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedPoints::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeIntersectingVoxelSign.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ComputeIntersectingVoxelSign::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ValidateIntersectingVoxels.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ValidateIntersectingVoxels::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RemoveSelfIntersectingSurface.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RemoveSelfIntersectingSurface::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1TransformValues.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::TransformValues::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1InactivateValues.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::InactivateValues::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1OffsetValues.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::OffsetValues::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1Renormalize.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::Renormalize::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1MinCombine.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::MinCombine::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::MultiResGrid::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::PointIndexIterator::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a215e2850ed819f54851fa725fdc8842c',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#ab5388e403c00c365cf358a85af632fe5',1,'openvdb::v3_2_0::tools::VolumeRender::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1IterTraits.html#a48fb29fd6c1a4372689b48b1859c62b0',1,'openvdb::v3_2_0::tools::stats_internal::IterTraits::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1IterTraits_3_01tree_1_1TreeValueIteratod0548f7bac16dff837855a3f29cfb162.html#af635c9d7fd08be6810f5e7fa306553dd',1,'openvdb::v3_2_0::tools::stats_internal::IterTraits< tree::TreeValueIteratorBase< TreeT, ValueIterT > >::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ttls__internal_1_1OffsetAndMinComp.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tools::ttls_internal::OffsetAndMinComp::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiscreteField.html#af1855eabba36af0df54613388dbd8ed2',1,'openvdb::v3_2_0::tools::DiscreteField::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1EnrightField.html#a9d76559dd01e51fca531fd88b0d5d059',1,'openvdb::v3_2_0::tools::EnrightField::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocitySampler.html#a736336446db9fff9182de2a0232a662e',1,'openvdb::v3_2_0::tools::VelocitySampler::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a63819828647f2e275fc72efd5f55e98c',1,'openvdb::v3_2_0::tree::InternalNode::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#a1d8a07008737fd50334d43dbf7a3068b',1,'openvdb::v3_2_0::tree::SparseIteratorBase::ValueType()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a27a13f2b229fbfb5f53cdbb3445afefd',1,'openvdb::v3_2_0::tree::DenseIteratorBase::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a4e42b16f0b1f0cb9e95ef7201950956a',1,'openvdb::v3_2_0::tree::LeafManager::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a215e2850ed819f54851fa725fdc8842c',1,'openvdb::v3_2_0::tree::LeafNode::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#afeb45cf59c16bacc3d571844deeb903d',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#afeb45cf59c16bacc3d571844deeb903d',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#acafc83e4fc3a640a706a65d66513a9bc',1,'openvdb::v3_2_0::tree::RootNode::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#aae63ab459d30a49fbf775e55b20cd1df',1,'openvdb::v3_2_0::tree::Tree::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a4eff730ce1981799d1e9e809b30b1485',1,'openvdb::v3_2_0::tree::ValueAccessor::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a2c26d58dfd651265b44c5e946ad97f59',1,'openvdb::v3_2_0::tree::CacheItem::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#aae63ab459d30a49fbf775e55b20cd1df',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tree::ValueAccessor0::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tree::ValueAccessor1::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tree::ValueAccessor2::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#ab3eb89e5f992f5902c2e5087d915ea0a',1,'openvdb::v3_2_0::tree::ValueAccessor3::ValueType()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray.html#a10b843fba2f32761b707fafe0d9ce802',1,'openvdb::v3_2_0::util::PagedArray::ValueType()']]], + ['vec2d',['Vec2d',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a5d9960b44dec6cd115402d1266d8d946',1,'openvdb::v3_2_0::math']]], + ['vec2dmetadata',['Vec2DMetadata',['../namespaceopenvdb_1_1v3__2__0.html#a11efa2ab39658e465e84f977eded6ea7',1,'openvdb::v3_2_0']]], + ['vec2dtree',['Vec2DTree',['../namespaceopenvdb_1_1v3__2__0.html#a2b79a6c06e50c1d80085bb0ba93b8e6a',1,'openvdb::v3_2_0']]], + ['vec2f',['Vec2f',['../namespaceopenvdb_1_1v3__2__0.html#af42e020ae7ee1371841001dd980c4e9a',1,'openvdb::v3_2_0']]], + ['vec2h',['Vec2H',['../namespaceopenvdb_1_1v3__2__0.html#ae84abad4e0016deb1c3c921fcd5f9a39',1,'openvdb::v3_2_0']]], + ['vec2i',['Vec2i',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a03c7152664e1a976cd47ca4e68580d16',1,'openvdb::v3_2_0::math::Vec2i()'],['../namespaceopenvdb_1_1v3__2__0.html#a28689d0dd1b72588ff47cda1a567f911',1,'openvdb::v3_2_0::Vec2I()']]], + ['vec2imetadata',['Vec2IMetadata',['../namespaceopenvdb_1_1v3__2__0.html#add67b3aefaf9463b5644a9740418ee8d',1,'openvdb::v3_2_0']]], + ['vec2itree',['Vec2ITree',['../namespaceopenvdb_1_1v3__2__0.html#ad7b4baeff66c84f52c9e3ccad22ea273',1,'openvdb::v3_2_0']]], + ['vec2r',['Vec2R',['../namespaceopenvdb_1_1v3__2__0.html#acfa6f350314f32ce9e0b3d4955d6fa7c',1,'openvdb::v3_2_0']]], + ['vec2s',['Vec2s',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a1aeafc7471280f67e7ed9134457c5115',1,'openvdb::v3_2_0::math']]], + ['vec2smetadata',['Vec2SMetadata',['../namespaceopenvdb_1_1v3__2__0.html#a220540457f67db992a306685e688c750',1,'openvdb::v3_2_0']]], + ['vec2stree',['Vec2STree',['../namespaceopenvdb_1_1v3__2__0.html#a62be112de385eb05bec2b3aa9fb61028',1,'openvdb::v3_2_0']]], + ['vec2ui',['Vec2ui',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a36c1f8158ea27698935b0ebf48c6ef22',1,'openvdb::v3_2_0::math']]], + ['vec3d',['Vec3d',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ac7030f700e7e312e526c66765cc26f2c',1,'openvdb::v3_2_0::math']]], + ['vec3dgrid',['Vec3DGrid',['../namespaceopenvdb_1_1v3__2__0.html#af449dc9c5efdffe692293d251e6e7ddd',1,'openvdb::v3_2_0::Vec3DGrid()'],['../namespaceopenvdb_1_1v3__2__0.html#ab733fef37fc9a5d33dcf3845b2c7183b',1,'openvdb::v3_2_0::Vec3dGrid()']]], + ['vec3dmetadata',['Vec3DMetadata',['../namespaceopenvdb_1_1v3__2__0.html#ae69d6a9270c81822ff73bdc863559d0f',1,'openvdb::v3_2_0']]], + ['vec3dtree',['Vec3DTree',['../namespaceopenvdb_1_1v3__2__0.html#acf6372e214a8b1d1896f6af48e645455',1,'openvdb::v3_2_0::Vec3DTree()'],['../namespaceopenvdb_1_1v3__2__0.html#ad1c1ea0603e4d7273cf36b893945db6a',1,'openvdb::v3_2_0::Vec3dTree()']]], + ['vec3f',['Vec3f',['../namespaceopenvdb_1_1v3__2__0.html#aad16c11fc989660440b62fc2853a8f9a',1,'openvdb::v3_2_0']]], + ['vec3fgrid',['Vec3fGrid',['../namespaceopenvdb_1_1v3__2__0.html#a8e538947664ee679b9e2990f5ec6f9d1',1,'openvdb::v3_2_0']]], + ['vec3ftree',['Vec3fTree',['../namespaceopenvdb_1_1v3__2__0.html#a6f5555a82cc71bcc837b31cbc6bf9eb8',1,'openvdb::v3_2_0']]], + ['vec3h',['Vec3H',['../namespaceopenvdb_1_1v3__2__0.html#a5a31140f4350f09d91d06e9f624286e6',1,'openvdb::v3_2_0']]], + ['vec3i',['Vec3I',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#acaaa98402a816151d4074ca0ca650317',1,'openvdb::v3_2_0::math::Coord::Vec3I()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a98424217402ef3bba79463a8cc03d467',1,'openvdb::v3_2_0::math::Coord::Vec3i()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a4a70e1ddeccbb56c2112ec48ae13bc8e',1,'openvdb::v3_2_0::math::Vec3i()'],['../namespaceopenvdb_1_1v3__2__0.html#a7422e0d02b8ea28dae96423cf4f72442',1,'openvdb::v3_2_0::Vec3I()']]], + ['vec3igrid',['Vec3IGrid',['../namespaceopenvdb_1_1v3__2__0.html#a87115ca5c0e6d1e8537d61e771276a35',1,'openvdb::v3_2_0']]], + ['vec3imetadata',['Vec3IMetadata',['../namespaceopenvdb_1_1v3__2__0.html#af40c95425ea01965c564b5a291cd755d',1,'openvdb::v3_2_0']]], + ['vec3itree',['Vec3ITree',['../namespaceopenvdb_1_1v3__2__0.html#a88ecacd4c6e2ce475f717b70518242f1',1,'openvdb::v3_2_0']]], + ['vec3r',['Vec3R',['../namespaceopenvdb_1_1v3__2__0.html#a766fe5be658c1eff35ecf426f7164ae6',1,'openvdb::v3_2_0']]], + ['vec3s',['Vec3s',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a0b5c02d92c75ba7328e47e7eaee80449',1,'openvdb::v3_2_0::math']]], + ['vec3sgrid',['Vec3SGrid',['../namespaceopenvdb_1_1v3__2__0.html#ac7dfc125a2d71449a20ade7827b32f77',1,'openvdb::v3_2_0']]], + ['vec3slist',['Vec3sList',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFracture.html#acc0166f4275a7fcd7e042295e469c03e',1,'openvdb::v3_2_0::tools::LevelSetFracture']]], + ['vec3smetadata',['Vec3SMetadata',['../namespaceopenvdb_1_1v3__2__0.html#a461a6b8d81b40d012d7d0906dfe34847',1,'openvdb::v3_2_0']]], + ['vec3stree',['Vec3STree',['../namespaceopenvdb_1_1v3__2__0.html#a0779faf3cecbd886788868f717d85835',1,'openvdb::v3_2_0']]], + ['vec3t',['Vec3T',['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#af6a59adc01c697f14ba0fe60b6edcf60',1,'openvdb::v3_2_0::math::DDA::Vec3T()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#af6a59adc01c697f14ba0fe60b6edcf60',1,'openvdb::v3_2_0::math::Ray::Vec3T()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetSphere.html#aa0c7050ac36e7940e1766f9e8ed6e823',1,'openvdb::v3_2_0::tools::LevelSetSphere::Vec3T()']]], + ['vec3type',['Vec3Type',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#aa512d9a5228da259f36b241659b63406',1,'openvdb::v3_2_0::math::BBox::Vec3Type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DDA.html#aa28405382ff1844b8d64debfc23ba25f',1,'openvdb::v3_2_0::math::DDA::Vec3Type()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1internal_1_1ReturnValue.html#ab076879beed7dfa4264d3ca09c210c1b',1,'openvdb::v3_2_0::math::internal::ReturnValue::Vec3Type()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Ray.html#aaca5029869fc187ceb64cf2e5a2575d7',1,'openvdb::v3_2_0::math::Ray::Vec3Type()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#ab1c38494e1946ec14e6a816fcbfb0580',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::Vec3Type()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#a473b3eedadcc193cbd7326745abe9ffc',1,'openvdb::v3_2_0::tools::LevelSetRayTracer::Vec3Type()']]], + ['vec3ui',['Vec3ui',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a20681751d86f0abe7835b2db6b6900d4',1,'openvdb::v3_2_0::math']]], + ['vec4d',['Vec4d',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a3fc75b57541cf0d3c6220e003489b9d2',1,'openvdb::v3_2_0::math']]], + ['vec4f',['Vec4f',['../namespaceopenvdb_1_1v3__2__0.html#acfea3906dd15f3f77f6d0b2f5e9753f8',1,'openvdb::v3_2_0']]], + ['vec4h',['Vec4H',['../namespaceopenvdb_1_1v3__2__0.html#a11bc6b0fed40ea5aa8a888e0e4e9b509',1,'openvdb::v3_2_0']]], + ['vec4i',['Vec4I',['../namespaceopenvdb_1_1v3__2__0.html#aa3003b934842c073260924e61793d158',1,'openvdb::v3_2_0::Vec4I()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#abdf164c737bdbaa31c28cfcfc6f55141',1,'openvdb::v3_2_0::math::Vec4i()']]], + ['vec4r',['Vec4R',['../namespaceopenvdb_1_1v3__2__0.html#a3f85a6f8254c048433fe38114f0cc40b',1,'openvdb::v3_2_0']]], + ['vec4s',['Vec4s',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ace4ffad84c7d8244b8551f1bb5c476b1',1,'openvdb::v3_2_0::math']]], + ['vec4ui',['Vec4ui',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a5d47e933d3a6206ae129a73b07fb5e82',1,'openvdb::v3_2_0::math']]], + ['veccomponentvaluet',['VecComponentValueT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1VectorToScalarConverter.html#abcc6c999ffb28ca82a4ce89a3bbfbcb2',1,'openvdb::v3_2_0::tools::VectorToScalarConverter']]], + ['vect',['VecT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid_1_1ReducePool.html#a6369b9ef742832903e38c461bbcea052',1,'openvdb::v3_2_0::tools::PointMaskGrid::ReducePool']]], + ['vectord',['VectorD',['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg.html#a8adc738dc34c81963442957755622330',1,'openvdb::v3_2_0::math::pcg']]], + ['vectorgrid',['VectorGrid',['../namespaceopenvdb_1_1v3__2__0.html#af48f213e5824d0c84d3bab0bde27b9f3',1,'openvdb::v3_2_0']]], + ['vectors',['VectorS',['../namespaceopenvdb_1_1v3__2__0_1_1math_1_1pcg.html#a887ad7f4f617aaa2136dd8007fc1aa6f',1,'openvdb::v3_2_0::math::pcg']]], + ['vectort',['VectorT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyToVecOp.html#acdc7862828391d406d8c5ce6ec480fee',1,'openvdb::v3_2_0::tools::poisson::internal::CopyToVecOp::VectorT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyFromVecOp.html#acdc7862828391d406d8c5ce6ec480fee',1,'openvdb::v3_2_0::tools::poisson::internal::CopyFromVecOp::VectorT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1ISLaplacianOp.html#a3a1f7ff468b65d5b9676447fde6bb42b',1,'openvdb::v3_2_0::tools::poisson::internal::ISLaplacianOp::VectorT()']]], + ['vectortree',['VectorTree',['../namespaceopenvdb_1_1v3__2__0.html#a5374297655c6118cf8d4c8eea37b9eb0',1,'openvdb::v3_2_0']]], + ['vectortype',['VectorType',['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#aae39324d94f38451bfd841e1cb1443a8',1,'openvdb::v3_2_0::math::BBox::VectorType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#aad1102bc73e5d508622c1c9348ee1f89',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::VectorType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1JacobiPreconditioner.html#aad1102bc73e5d508622c1c9348ee1f89',1,'openvdb::v3_2_0::math::pcg::JacobiPreconditioner::VectorType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#aad1102bc73e5d508622c1c9348ee1f89',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner::VectorType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#a9175a0c17157bc107ca1ff6fea96e02f',1,'openvdb::v3_2_0::tools::LevelSetAdvection::VectorType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DiscreteField.html#a115c4db4b7f46bbab2797ef32523c310',1,'openvdb::v3_2_0::tools::DiscreteField::VectorType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1EnrightField.html#a3ebc2314239cf73059205c46aa9e9746',1,'openvdb::v3_2_0::tools::EnrightField::VectorType()']]], + ['vectorvaluet',['VectorValueT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ScalarToVectorConverter.html#a668c584a12a44bc68eb6d37b2b491d54',1,'openvdb::v3_2_0::tools::ScalarToVectorConverter']]], + ['vectype',['VecType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocityIntegrator.html#af4ceb35ad7b35bf31f19616fed9b5ea7',1,'openvdb::v3_2_0::tools::VelocityIntegrator']]], + ['velocityfieldintegrator',['VelocityFieldIntegrator',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#af4408f4c877874605a2d9c42cbc2848e',1,'openvdb::v3_2_0::tools::PointAdvect']]], + ['velocityintegratortype',['VelocityIntegratorType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#ac26c84ffbe7c2c26b7cb1d1513f32218',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect']]], + ['vidxleaft',['VIdxLeafT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyToVecOp.html#aafd541ca0327e9b6cda4aca57a5a4270',1,'openvdb::v3_2_0::tools::poisson::internal::CopyToVecOp::VIdxLeafT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyFromVecOp.html#a55025f5a74ea7286ac36e9bb41436207',1,'openvdb::v3_2_0::tools::poisson::internal::CopyFromVecOp::VIdxLeafT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1ISLaplacianOp.html#aafd541ca0327e9b6cda4aca57a5a4270',1,'openvdb::v3_2_0::tools::poisson::internal::ISLaplacianOp::VIdxLeafT()']]], + ['vidxtreet',['VIdxTreeT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyToVecOp.html#a35e6561d91404001af79317fc52c3b32',1,'openvdb::v3_2_0::tools::poisson::internal::CopyToVecOp::VIdxTreeT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1ISLaplacianOp.html#aeef4702154e422c6e570bd6f1b29dcea',1,'openvdb::v3_2_0::tools::poisson::internal::ISLaplacianOp::VIdxTreeT()']]], + ['vindex',['VIndex',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#a81b5632db740d867fc3ac3dc898a61c2',1,'openvdb::v3_2_0::tools::poisson']]], + ['voxelitert',['VoxelIterT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNan.html#a3e2c5b62f63adcb6d683b3cd67760e92',1,'openvdb::v3_2_0::tools::CheckNan::VoxelIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckInf.html#a3e2c5b62f63adcb6d683b3cd67760e92',1,'openvdb::v3_2_0::tools::CheckInf::VoxelIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckFinite.html#a3e2c5b62f63adcb6d683b3cd67760e92',1,'openvdb::v3_2_0::tools::CheckFinite::VoxelIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMagnitude.html#a3e2c5b62f63adcb6d683b3cd67760e92',1,'openvdb::v3_2_0::tools::CheckMagnitude::VoxelIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckRange.html#a3e2c5b62f63adcb6d683b3cd67760e92',1,'openvdb::v3_2_0::tools::CheckRange::VoxelIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMin.html#a3e2c5b62f63adcb6d683b3cd67760e92',1,'openvdb::v3_2_0::tools::CheckMin::VoxelIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMax.html#a3e2c5b62f63adcb6d683b3cd67760e92',1,'openvdb::v3_2_0::tools::CheckMax::VoxelIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#a3e2c5b62f63adcb6d683b3cd67760e92',1,'openvdb::v3_2_0::tools::CheckNormGrad::VoxelIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#a3e2c5b62f63adcb6d683b3cd67760e92',1,'openvdb::v3_2_0::tools::CheckEikonal::VoxelIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#a3e2c5b62f63adcb6d683b3cd67760e92',1,'openvdb::v3_2_0::tools::CheckDivergence::VoxelIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1MaskOp.html#a46f0164de3c43aa310f68bc4739f9cf1',1,'openvdb::v3_2_0::tools::MultiResGrid::MaskOp::VoxelIterT()']]], + ['voxelizationdatatype',['VoxelizationDataType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizePolygons.html#a7fc8d78545ef551256f192024133cb13',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizePolygons']]], + ['voxeloffsetarray',['VoxelOffsetArray',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#aed4d7bd6cde92b0dbd4c65c0bb46084b',1,'openvdb::v3_2_0::tools::PointPartitioner::VoxelOffsetArray()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1VoxelOrderOp.html#aed4d7bd6cde92b0dbd4c65c0bb46084b',1,'openvdb::v3_2_0::tools::point_partitioner_internal::VoxelOrderOp::VoxelOffsetArray()']]], + ['voxeloffsettype',['VoxelOffsetType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#a3fe6597b21a5811e12b0cda92b024895',1,'openvdb::v3_2_0::tools::PointPartitioner::VoxelOffsetType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1VoxelOrderOp.html#a3fe6597b21a5811e12b0cda92b024895',1,'openvdb::v3_2_0::tools::point_partitioner_internal::VoxelOrderOp::VoxelOffsetType()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_15.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_15.html new file mode 100644 index 00000000..77d624f8 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_15.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_15.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_15.js new file mode 100644 index 00000000..f030deb6 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_15.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['w',['W',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyUnion.html#aab5a023ede703505077ae89b351f6a7e',1,'openvdb::v3_2_0::tree::InternalNode::TopologyUnion::W()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyIntersection.html#aab5a023ede703505077ae89b351f6a7e',1,'openvdb::v3_2_0::tree::InternalNode::TopologyIntersection::W()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyDifference.html#aab5a023ede703505077ae89b351f6a7e',1,'openvdb::v3_2_0::tree::InternalNode::TopologyDifference::W()']]], + ['word',['Word',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a665434b7fb1f18b54432cf0197a4896a',1,'openvdb::v3_2_0::tools::Morphology::Word()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a5c5531d9a3e8ebc394d4b0d94b794c2d',1,'openvdb::v3_2_0::util::NodeMask::Word()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a53c9b118148a2a92d6ed6debc4ef0bbd',1,'openvdb::v3_2_0::util::NodeMask< 1 >::Word()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a5c5531d9a3e8ebc394d4b0d94b794c2d',1,'openvdb::v3_2_0::util::NodeMask< 2 >::Word()']]], + ['wordtype',['WordType',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#a6167f63ff9602c0f5e4e17ae366dc237',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::WordType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#a791615639ccd6cb2398978165440288a',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::WordType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#a791615639ccd6cb2398978165440288a',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::WordType()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_2.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_2.html new file mode 100644 index 00000000..d0f43514 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_2.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_2.js new file mode 100644 index 00000000..e618239b --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_2.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['baseleaf',['BaseLeaf',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a4a8b9dd08ea23f4e3d6b5ee7a8ad4b67',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['baset',['BaseT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#ac497b9aad06e332bbef089bcd0126092',1,'openvdb::v3_2_0::tools::Dense::BaseT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1UniformPointScatter.html#afd39e37dfd028144a9e65090dfa0380e',1,'openvdb::v3_2_0::tools::UniformPointScatter::BaseT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseUniformPointScatter.html#afd39e37dfd028144a9e65090dfa0380e',1,'openvdb::v3_2_0::tools::DenseUniformPointScatter::BaseT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1NonUniformPointScatter.html#afd39e37dfd028144a9e65090dfa0380e',1,'openvdb::v3_2_0::tools::NonUniformPointScatter::BaseT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DenseIter.html#ae30bf4db08524cd2e2d1b69ef1818b9d',1,'openvdb::v3_2_0::tree::InternalNode::DenseIter::BaseT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1ValueIter.html#a56aba411c8ee975aa69a6ae6131a380a',1,'openvdb::v3_2_0::tree::LeafNode::ValueIter::BaseT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1DenseIter.html#a7b72971dc25c9d9f0ffa65c1b6bf7c3e',1,'openvdb::v3_2_0::tree::LeafNode::DenseIter::BaseT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1ValueIter.html#a56aba411c8ee975aa69a6ae6131a380a',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ValueIter::BaseT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1DenseIter.html#a4a886a84294bda984eaa402ae967d368',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::DenseIter::BaseT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1ValueIter.html#a56aba411c8ee975aa69a6ae6131a380a',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ValueIter::BaseT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1DenseIter.html#a4a886a84294bda984eaa402ae967d368',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::DenseIter::BaseT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#a8102ea8851ceecff90578deeaeb0dd00',1,'openvdb::v3_2_0::tree::ValueAccessor::BaseT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#a8102ea8851ceecff90578deeaeb0dd00',1,'openvdb::v3_2_0::tree::ValueAccessor0::BaseT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a8102ea8851ceecff90578deeaeb0dd00',1,'openvdb::v3_2_0::tree::ValueAccessor1::BaseT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a8102ea8851ceecff90578deeaeb0dd00',1,'openvdb::v3_2_0::tree::ValueAccessor2::BaseT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a8102ea8851ceecff90578deeaeb0dd00',1,'openvdb::v3_2_0::tree::ValueAccessor3::BaseT()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#a1f2a5b14139b66bed2b762b91b571bc2',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::BaseT()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a1f2a5b14139b66bed2b762b91b571bc2',1,'openvdb::v3_2_0::util::PagedArray::Iterator::BaseT()']]], + ['basetype',['BaseType',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1JacobiPreconditioner.html#a227787171295d456e96ee712e44e8a1e',1,'openvdb::v3_2_0::math::pcg::JacobiPreconditioner::BaseType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#a227787171295d456e96ee712e44e8a1e',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner::BaseType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a557dcbcc11c8893b3197d0b0bcb5a4ba',1,'openvdb::v3_2_0::tools::LevelSetFilter::BaseType()']]], + ['bboxd',['BBoxd',['../namespaceopenvdb_1_1v3__2__0.html#ad81bed4f9fa737381a1ee43b08968ba8',1,'openvdb::v3_2_0']]], + ['boolaccessort',['BoolAccessorT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartGen.html#a5e181a574205c60e4abfdb61ab1bf1e2',1,'openvdb::v3_2_0::tools::internal::PartGen::BoolAccessorT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MaskEdges.html#acd986c9457aa0ac24dcf709fc74b0cac',1,'openvdb::v3_2_0::tools::internal::MaskEdges::BoolAccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTopologyMask.html#a5e181a574205c60e4abfdb61ab1bf1e2',1,'openvdb::v3_2_0::tools::internal::GenTopologyMask::BoolAccessorT()']]], + ['boolgrid',['BoolGrid',['../namespaceopenvdb_1_1v3__2__0.html#a4e3a4422409e5bda845d0fb678105e61',1,'openvdb::v3_2_0']]], + ['boolgridptrtype',['BoolGridPtrType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#ab9d2959ca5ca3c7369ce09f73382f293',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor< Grid< TreeType > >']]], + ['boolgridt',['BoolGridT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTopologyMask.html#a26ce31414f8e20eb887043f13a8787c5',1,'openvdb::v3_2_0::tools::internal::GenTopologyMask']]], + ['boolgridtype',['BoolGridType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#af4ef2b11a63553965f7cc3589c576bd7',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor< Grid< TreeType > >']]], + ['boolleafnodetype',['BoolLeafNodeType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorVoxels.html#ac4944a53ae47b3001cf2581422203655',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorVoxels::BoolLeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillMaskBoundary.html#a3b2a0f1c9b315529905e4c19623d4d14',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillMaskBoundary::BoolLeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskIsovalueCrossingVoxels.html#a3b2a0f1c9b315529905e4c19623d4d14',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskIsovalueCrossingVoxels::BoolLeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandLeafNodeRegion.html#a3b2a0f1c9b315529905e4c19623d4d14',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandLeafNodeRegion::BoolLeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillLeafNodeVoxels.html#ac4944a53ae47b3001cf2581422203655',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillLeafNodeVoxels::BoolLeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandNarrowbandMask.html#a3b2a0f1c9b315529905e4c19623d4d14',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandNarrowbandMask::BoolLeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskedCopy.html#a3b2a0f1c9b315529905e4c19623d4d14',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskedCopy::BoolLeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1DiffLeafNodeMask.html#a3b2a0f1c9b315529905e4c19623d4d14',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::DiffLeafNodeMask::BoolLeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ConstructVoxelMask.html#a3b2a0f1c9b315529905e4c19623d4d14',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ConstructVoxelMask::BoolLeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#a3b2a0f1c9b315529905e4c19623d4d14',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::BoolLeafNodeType()']]], + ['boolmetadata',['BoolMetadata',['../namespaceopenvdb_1_1v3__2__0.html#ac83331aa013b2c477fe5ba07baca16f6',1,'openvdb::v3_2_0']]], + ['booltree',['BoolTree',['../namespaceopenvdb_1_1v3__2__0.html#a155dad3305a25615b4eb7640dff865e3',1,'openvdb::v3_2_0']]], + ['booltreeptrtype',['BoolTreePtrType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor.html#aad350786cf5b3f5921daa30dfc613ad6',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor::BoolTreePtrType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#a39965a6ef35b347379b9d066cd766323',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor< Grid< TreeType > >::BoolTreePtrType()']]], + ['booltreet',['BoolTreeT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#ac26d717797387f231f7b82d4577e865a',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions::BoolTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartGen.html#af8f12062fdbb0fd7de6d3d62cb7f051d',1,'openvdb::v3_2_0::tools::internal::PartGen::BoolTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenSeamMask.html#ac26d717797387f231f7b82d4577e865a',1,'openvdb::v3_2_0::tools::internal::GenSeamMask::BoolTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTopologyMask.html#af8f12062fdbb0fd7de6d3d62cb7f051d',1,'openvdb::v3_2_0::tools::internal::GenTopologyMask::BoolTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenBoundaryMask.html#af8f12062fdbb0fd7de6d3d62cb7f051d',1,'openvdb::v3_2_0::tools::internal::GenBoundaryMask::BoolTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTileMask.html#ac26d717797387f231f7b82d4577e865a',1,'openvdb::v3_2_0::tools::internal::GenTileMask::BoolTreeT()']]], + ['booltreetype',['BoolTreeType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillMaskBoundary.html#af3b76973abe2aa843173c5aa0c17b091',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillMaskBoundary::BoolTreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskIsovalueCrossingVoxels.html#a9d0fe98335b111dd49fce14a3809d427',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskIsovalueCrossingVoxels::BoolTreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandLeafNodeRegion.html#af3b76973abe2aa843173c5aa0c17b091',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandLeafNodeRegion::BoolTreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandNarrowbandMask.html#af3b76973abe2aa843173c5aa0c17b091',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandNarrowbandMask::BoolTreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskedCopy.html#af3b76973abe2aa843173c5aa0c17b091',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskedCopy::BoolTreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#af3b76973abe2aa843173c5aa0c17b091',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor< Grid< TreeType > >::BoolTreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1DiffLeafNodeMask.html#af3b76973abe2aa843173c5aa0c17b091',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::DiffLeafNodeMask::BoolTreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ConstructVoxelMask.html#af3b76973abe2aa843173c5aa0c17b091',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ConstructVoxelMask::BoolTreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#af3b76973abe2aa843173c5aa0c17b091',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::BoolTreeType()']]], + ['booltreetypeptr',['BoolTreeTypePtr',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandNarrowbandMask.html#ae990502c3b30cf3b943ee2be8caaf11a',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandNarrowbandMask::BoolTreeTypePtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskedCopy.html#ae990502c3b30cf3b943ee2be8caaf11a',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskedCopy::BoolTreeTypePtr()']]], + ['buffertype',['BufferType',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#af04c83d3598f1d70089dbd305c16752c',1,'openvdb::v3_2_0::math::BaseStencil::BufferType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#ab937f2bc78c00ac61ab4778c46d30022',1,'openvdb::v3_2_0::tools::Filter::BufferType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#a4d3407f83d1cf99e0fd1ef9bf7bfba60',1,'openvdb::v3_2_0::tools::LevelSetAdvection::BufferType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a4d3407f83d1cf99e0fd1ef9bf7bfba60',1,'openvdb::v3_2_0::tools::LevelSetMorphing::BufferType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#ab937f2bc78c00ac61ab4778c46d30022',1,'openvdb::v3_2_0::tools::LevelSetTracker::BufferType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#af6c00e7118213372abaa3723ec2cbe7f',1,'openvdb::v3_2_0::tree::LeafManager::BufferType()']]], + ['buft',['BufT',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafManagerImpl.html#a9b7639b7a5be74c0af2e21ef6ac0e03b',1,'openvdb::v3_2_0::tree::LeafManagerImpl::BufT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafManagerImpl_3_01LeafManager_3_01const_01TreeT_01_4_01_4.html#a9b7639b7a5be74c0af2e21ef6ac0e03b',1,'openvdb::v3_2_0::tree::LeafManagerImpl< LeafManager< const TreeT > >::BufT()']]], + ['buildtype',['BuildType',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a765793818cec1ab26e406bc61358781a',1,'openvdb::v3_2_0::Grid::BuildType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a76215159f704cb790ce5758354f69829',1,'openvdb::v3_2_0::tree::InternalNode::BuildType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a97b26b7067dae9fb321da27d51901f1e',1,'openvdb::v3_2_0::tree::LeafNode::BuildType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a9281e794577882ff398455d4feb28045',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::BuildType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a69bc5cdb711491f6a699018350bcbdfc',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::BuildType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#abb603e01760bdae19f51b004f6115912',1,'openvdb::v3_2_0::tree::RootNode::BuildType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a9ea5644705e0f1c8b486662415d192c9',1,'openvdb::v3_2_0::tree::Tree::BuildType()']]], + ['bvaluet',['BValueT',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a11094dca5cd4ba450b8c8d3b7ab934e8',1,'openvdb::v3_2_0::CombineArgs']]], + ['byte',['Byte',['../namespaceopenvdb_1_1v3__2__0.html#ae3a497195d617519e5353ea7b417940f',1,'openvdb::v3_2_0']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_3.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_3.html new file mode 100644 index 00000000..ea809700 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_3.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_3.js new file mode 100644 index 00000000..74af10a8 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_3.js @@ -0,0 +1,36 @@ +var searchData= +[ + ['chaint',['ChainT',['../structopenvdb_1_1v3__2__0_1_1math_1_1LevelSetHDDA.html#a2c79d774d4a2e3f522ae5718a02b61fb',1,'openvdb::v3_2_0::math::LevelSetHDDA::ChainT()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA.html#a2c79d774d4a2e3f522ae5718a02b61fb',1,'openvdb::v3_2_0::math::VolumeHDDA::ChainT()']]], + ['charleafnodetype',['CharLeafNodeType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1LabelBoundaryVoxels.html#a07a7a0392b416d6706755bf5adb4e60d',1,'openvdb::v3_2_0::tools::level_set_util_internal::LabelBoundaryVoxels']]], + ['childall',['ChildAll',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a4eaf633cc26bf43d0937eaea095427a9',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['childallciter',['ChildAllCIter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a7ab4a48f20c4fe38104d3a71801d65aa',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ChildAllCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a565353f9d0dca60c20f0ce1840fb2733',1,'openvdb::v3_2_0::tree::InternalNode::ChildAllCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a14f3a4397381364921a21f6f8994c9e0',1,'openvdb::v3_2_0::tree::LeafNode::ChildAllCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a77041c54eb75a0113bb6743ddf6cd6a4',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ChildAllCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a77041c54eb75a0113bb6743ddf6cd6a4',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ChildAllCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a5c461535e88fbfbfc15b7e61fff84983',1,'openvdb::v3_2_0::tree::RootNode::ChildAllCIter()']]], + ['childalliter',['ChildAllIter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#adb126aa251a21bf7558649e89a93a523',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ChildAllIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a8e0a205ac14a3e97e798a1d64909d860',1,'openvdb::v3_2_0::tree::InternalNode::ChildAllIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#adda674a4902e81b3c818861a09dbb7bd',1,'openvdb::v3_2_0::tree::LeafNode::ChildAllIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a77c08cf78e8db1ab4fb56fdc582bfe73',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ChildAllIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a77c08cf78e8db1ab4fb56fdc582bfe73',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ChildAllIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#adcd9bb29a11e8141a078145b43328802',1,'openvdb::v3_2_0::tree::RootNode::ChildAllIter()']]], + ['childitert',['ChildIterT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CsgVisitorBase.html#af32b9db747e3ab21ad2970f77bcc9bb3',1,'openvdb::v3_2_0::tools::CsgVisitorBase::ChildIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgUnionVisitor.html#af32b9db747e3ab21ad2970f77bcc9bb3',1,'openvdb::v3_2_0::tools::CsgUnionVisitor::ChildIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgIntersectVisitor.html#af32b9db747e3ab21ad2970f77bcc9bb3',1,'openvdb::v3_2_0::tools::CsgIntersectVisitor::ChildIterT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CsgDiffVisitor.html#af32b9db747e3ab21ad2970f77bcc9bb3',1,'openvdb::v3_2_0::tools::CsgDiffVisitor::ChildIterT()']]], + ['childnodetype',['ChildNodeType',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ab19550973f323999fb152aec7d5a7ad9',1,'openvdb::v3_2_0::tree::InternalNode::ChildNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#ad83f79a19cd0d8139fa36b64970243ce',1,'openvdb::v3_2_0::tree::DenseIteratorBase::ChildNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a2ecf727e32e2b6c3f8a9d5beffee11fe',1,'openvdb::v3_2_0::tree::RootNode::ChildNodeType()']]], + ['childoff',['ChildOff',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a544e8c97a6ab7f2a22a5bb35a86b08f7',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['childoffciter',['ChildOffCIter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a73437df4c3acd3bb0d60e15e62d63829',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ChildOffCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a4e598ebff5609a38e9fb716881c390af',1,'openvdb::v3_2_0::tree::InternalNode::ChildOffCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a1bea186ed4bbb116894853b34776eddb',1,'openvdb::v3_2_0::tree::LeafNode::ChildOffCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ab81e9441398d5d7ebd3251394b6936dd',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ChildOffCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ab81e9441398d5d7ebd3251394b6936dd',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ChildOffCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a9f494cfe68f77d9631d2f128ae0f23c0',1,'openvdb::v3_2_0::tree::RootNode::ChildOffCIter()']]], + ['childoffiter',['ChildOffIter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a652942d991cae3a33ece173893031e38',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ChildOffIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a6b3909a5ddc0a449d43f2e9e8fb336f6',1,'openvdb::v3_2_0::tree::InternalNode::ChildOffIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a4271855c8d737a1f653ce7429ef6c429',1,'openvdb::v3_2_0::tree::LeafNode::ChildOffIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a54fb1a14891083e010331e60ccf142f2',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ChildOffIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a54fb1a14891083e010331e60ccf142f2',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ChildOffIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a5d719774baffb6e2c58be81eb1239ccc',1,'openvdb::v3_2_0::tree::RootNode::ChildOffIter()']]], + ['childon',['ChildOn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#adeee6036e73f9c170119734cd24fad39',1,'openvdb::v3_2_0::tools::PointIndexLeafNode']]], + ['childonciter',['ChildOnCIter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ad68ec4694089cd26384293677e05b926',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ChildOnCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aa52a09abfc4a3d259a4dc97abcaa4a34',1,'openvdb::v3_2_0::tree::InternalNode::ChildOnCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a856fcbdcacc39bf9ca513899cf3e39e6',1,'openvdb::v3_2_0::tree::LeafNode::ChildOnCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a386533b2bcc1382b515d1981a863f9ee',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ChildOnCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a386533b2bcc1382b515d1981a863f9ee',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ChildOnCIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a294c74833e2fcc71e6fee12b3ef9ffe9',1,'openvdb::v3_2_0::tree::RootNode::ChildOnCIter()']]], + ['childoniter',['ChildOnIter',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a0d504d02dfabd78a417f8efab7785288',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::ChildOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#afebcee7d85b715991e09f2c18c148b0e',1,'openvdb::v3_2_0::tree::InternalNode::ChildOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a4ba8ffa476a1b827d459eb9b7aeb543b',1,'openvdb::v3_2_0::tree::LeafNode::ChildOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a39ecedbe76c6da041ba9755a3077b735',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::ChildOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a39ecedbe76c6da041ba9755a3077b735',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::ChildOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#af278268a92236d9bd09bb723d1bac4a8',1,'openvdb::v3_2_0::tree::RootNode::ChildOnIter()']]], + ['childonitert',['ChildOnIterT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#aa4031b31c9766a09a5993e1c5b69d1e5',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase']]], + ['childt',['ChildT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#ae501b61e32c8527fd88c403320b6bc30',1,'openvdb::v3_2_0::tree::IterListItem::ChildT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#ae501b61e32c8527fd88c403320b6bc30',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::ChildT()']]], + ['closestpointprojectortype',['ClosestPointProjectorType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#ab5aaf0b446daddd92db57e5db960d5c0',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect']]], + ['connectivitytable',['ConnectivityTable',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SweepExteriorSign.html#acf8771bce7b214f0b5ae363a19da684c',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SweepExteriorSign::ConnectivityTable()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html#acf8771bce7b214f0b5ae363a19da684c',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedPoints::ConnectivityTable()']]], + ['constaccessor',['ConstAccessor',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a63160186ea049fb0c37fd03113d50703',1,'openvdb::v3_2_0::Grid::ConstAccessor()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#ac9aec2a9eab747bd39b44184936880f3',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator::ConstAccessor()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#ac9aec2a9eab747bd39b44184936880f3',1,'openvdb::v3_2_0::tools::PointIndexIterator::ConstAccessor()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexFilter.html#ac9aec2a9eab747bd39b44184936880f3',1,'openvdb::v3_2_0::tools::PointIndexFilter::ConstAccessor()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1MathOp.html#a6aef5ce0b49982c348b5598f159b76c2',1,'openvdb::v3_2_0::tools::stats_internal::MathOp::ConstAccessor()']]], + ['constaccessorptr',['ConstAccessorPtr',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas_1_1Iterator.html#a7ef6d0d383fa9e4b6f214e19a483be73',1,'openvdb::v3_2_0::tools::ParticleAtlas::Iterator']]], + ['constaccessorregistry',['ConstAccessorRegistry',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a5a699bff88287893dfa370e7bd2a74a8',1,'openvdb::v3_2_0::tree::Tree']]], + ['constaccessortype',['ConstAccessorType',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#ab8df5589cedd771f0cb45e2a3c1f732c',1,'openvdb::v3_2_0::TreeAdapter::ConstAccessorType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#ab8df5589cedd771f0cb45e2a3c1f732c',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::ConstAccessorType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#ab8df5589cedd771f0cb45e2a3c1f732c',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::ConstAccessorType()']]], + ['constgridptr',['ConstGridPtr',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#ae6b98147dc7919cbe8aee11ffe8ee144',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['constgridptrtype',['ConstGridPtrType',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a2042bc64ffb70334636efe734febd248',1,'openvdb::v3_2_0::TreeAdapter::ConstGridPtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a2042bc64ffb70334636efe734febd248',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::ConstGridPtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a2042bc64ffb70334636efe734febd248',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::ConstGridPtrType()']]], + ['constmetaiterator',['ConstMetaIterator',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#abc2f9ab90bfac4bc7c34efa219692ccc',1,'openvdb::v3_2_0::MetaMap']]], + ['constptr',['ConstPtr',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a29fd2cd32a8b8c750878068594f534c8',1,'openvdb::v3_2_0::GridBase::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#ab83a67bd13dbb481297e5d34545a6163',1,'openvdb::v3_2_0::Grid::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a539fdfc77b5ec41bc8400ac8b7b69894',1,'openvdb::v3_2_0::io::Archive::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a786cb12ab0e248391a6a854c1b7ef3bc',1,'openvdb::v3_2_0::io::StreamMetadata::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a22fefff9ab05359f4f4d43e2fed1c2e5',1,'openvdb::v3_2_0::math::MapBase::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a018455f9ef5d8614e70164c4fb0e8f79',1,'openvdb::v3_2_0::math::AffineMap::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#aa03a55fbeaaf5c4d5de0399548c1540c',1,'openvdb::v3_2_0::math::ScaleMap::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#a8f74838f452198f309e119ff5e493f15',1,'openvdb::v3_2_0::math::UniformScaleMap::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a4bc63877e606f7ee20ea3e6f2e42d2a8',1,'openvdb::v3_2_0::math::TranslationMap::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#a4b6261ceffb213cb1f5ec19f49ced675',1,'openvdb::v3_2_0::math::ScaleTranslateMap::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#a2eae821d2fcf75b9d1aa9f8f0a42c409',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a28bc01b3673a03002254fa3a63975010',1,'openvdb::v3_2_0::math::UnitaryMap::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a84cf0dcb9c8ec2e2f6ad794ffd2956c2',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#a3c6ed4d44f5b73fb2af4244a824cca9b',1,'openvdb::v3_2_0::math::CompoundMap::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#ad7aec5ce004d480fedb9bee89077da98',1,'openvdb::v3_2_0::math::Transform::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a7d71520dfe249352beefdf23db3d6625',1,'openvdb::v3_2_0::Metadata::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#a036328fbb49ee736b6af9e7be1e80f5a',1,'openvdb::v3_2_0::TypedMetadata::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a4c9a011888b4785b16a4c166b4101f57',1,'openvdb::v3_2_0::MetaMap::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#ab8bab402bb508f8c74b009d08f8dbc67',1,'openvdb::v3_2_0::tools::Dense::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a6eb525cf234392a6a9c0c98e845df078',1,'openvdb::v3_2_0::tools::MultiResGrid::ConstPtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#a8766c50c3caee094a4691ddf241149be',1,'openvdb::v3_2_0::tools::ParticleAtlas::ConstPtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#af73735c3aa19c4afade49dce78e62c56',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#abc7cdd18eef2903f83c703a5836de3a2',1,'openvdb::v3_2_0::tools::PointPartitioner::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#a456011c95cb6204edd0bd82102e95b0d',1,'openvdb::v3_2_0::tree::TreeBase::ConstPtr()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a57dc1f8dc23484b7b3031fec2783ee8a',1,'openvdb::v3_2_0::tree::Tree::ConstPtr()']]], + ['consttreeptr',['ConstTreePtr',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a5cb91efeeb9dd7372ff35141e96f3bb3',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['consttreeptrtype',['ConstTreePtrType',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a89b6df4c3b0d652c2ee92c9cd9f71169',1,'openvdb::v3_2_0::Grid::ConstTreePtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a6d5f599b95c41271456bf837ebbb1269',1,'openvdb::v3_2_0::TreeAdapter::ConstTreePtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a6d5f599b95c41271456bf837ebbb1269',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::ConstTreePtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a6d5f599b95c41271456bf837ebbb1269',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::ConstTreePtrType()']]], + ['constunsafeaccessor',['ConstUnsafeAccessor',['../classopenvdb_1_1v3__2__0_1_1Grid.html#a62c236b87d52b19a3f2c07cbd1e5f1e6',1,'openvdb::v3_2_0::Grid']]], + ['coordarray',['CoordArray',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1LeafNodeOriginOp.html#a4a5bbd63b006a19f9020d7dfbf3aed7e',1,'openvdb::v3_2_0::tools::point_partitioner_internal::LeafNodeOriginOp']]], + ['coordlimits',['CoordLimits',['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#ade9904d2a0e27d9d303ba07a207674bb',1,'openvdb::v3_2_0::tree::CacheItem']]], + ['cptaccessor',['CptAccessor',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestPointProjector.html#a9cacbe98a698cf87ede535ac64c4a695',1,'openvdb::v3_2_0::tools::ClosestPointProjector']]], + ['cptgridtype',['CptGridType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestPointProjector.html#a8f69d34e6183146f0cda14f09fa8de8f',1,'openvdb::v3_2_0::tools::ClosestPointProjector']]], + ['cptvaluetype',['CptValueType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestPointProjector.html#a524d154923db2c64adb56cc994642d36',1,'openvdb::v3_2_0::tools::ClosestPointProjector']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_4.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_4.html new file mode 100644 index 00000000..1b65dc3d --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_4.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_4.js new file mode 100644 index 00000000..f18738aa --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_4.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['datatable',['DataTable',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizePolygons.html#ab36a9882c54da6831fd0ca027f0c1b44',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizePolygons']]], + ['denseiterator',['DenseIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ab35fb59a7b6dc73937e7c8307fd2e8df',1,'openvdb::v3_2_0::util::NodeMask::DenseIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ab35fb59a7b6dc73937e7c8307fd2e8df',1,'openvdb::v3_2_0::util::NodeMask< 1 >::DenseIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ab35fb59a7b6dc73937e7c8307fd2e8df',1,'openvdb::v3_2_0::util::NodeMask< 2 >::DenseIterator()']]], + ['denset',['DenseT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyToDense.html#a36b7848bc9f0c7af80bee275a127062c',1,'openvdb::v3_2_0::tools::CopyToDense::DenseT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyFromDense.html#a36b7848bc9f0c7af80bee275a127062c',1,'openvdb::v3_2_0::tools::CopyFromDense::DenseT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseTransformer.html#a1f6d54128c1968b15710930698a77e71',1,'openvdb::v3_2_0::tools::DenseTransformer::DenseT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ContiguousOp.html#a1f6d54128c1968b15710930698a77e71',1,'openvdb::v3_2_0::tools::ContiguousOp::DenseT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#a1f6d54128c1968b15710930698a77e71',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor::DenseT()']]], + ['densevaluetype',['DenseValueType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#a2bb0b32f06f08871e824965dec59bcab',1,'openvdb::v3_2_0::tools::SparseExtractor::DenseValueType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#a1896c39e7a6259e67bcef9a8f9692485',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor::DenseValueType()']]], + ['difference_5ftype',['difference_type',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ConstIterator.html#a73fa7542806f925921484e1b57764b89',1,'openvdb::v3_2_0::util::PagedArray::ConstIterator::difference_type()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Iterator.html#a73fa7542806f925921484e1b57764b89',1,'openvdb::v3_2_0::util::PagedArray::Iterator::difference_type()']]], + ['disablet',['DisableT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#a131bd8d3ac26e28522ab343e89361c4d',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['doublegrid',['DoubleGrid',['../namespaceopenvdb_1_1v3__2__0.html#a157f0ffa062b770188623e563fd128d9',1,'openvdb::v3_2_0']]], + ['doublemetadata',['DoubleMetadata',['../namespaceopenvdb_1_1v3__2__0.html#ab663ecc076d6168b44bdb1f1607361a1',1,'openvdb::v3_2_0']]], + ['doubletree',['DoubleTree',['../namespaceopenvdb_1_1v3__2__0.html#a0f1f7b962c15962ab6c41807dbb19fa0',1,'openvdb::v3_2_0']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_5.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_5.html new file mode 100644 index 00000000..e662ff8a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_5.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_5.js new file mode 100644 index 00000000..cbbb614a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['elementtype',['ElementType',['../structopenvdb_1_1v3__2__0_1_1VecTraits.html#a367f2f6dcbdbf1c2d2eacf1819163462',1,'openvdb::v3_2_0::VecTraits::ElementType()'],['../structopenvdb_1_1v3__2__0_1_1VecTraits_3_01math_1_1Vec2_3_01T_01_4_01_4.html#a367f2f6dcbdbf1c2d2eacf1819163462',1,'openvdb::v3_2_0::VecTraits< math::Vec2< T > >::ElementType()'],['../structopenvdb_1_1v3__2__0_1_1VecTraits_3_01math_1_1Vec3_3_01T_01_4_01_4.html#a367f2f6dcbdbf1c2d2eacf1819163462',1,'openvdb::v3_2_0::VecTraits< math::Vec3< T > >::ElementType()'],['../structopenvdb_1_1v3__2__0_1_1VecTraits_3_01math_1_1Vec4_3_01T_01_4_01_4.html#a367f2f6dcbdbf1c2d2eacf1819163462',1,'openvdb::v3_2_0::VecTraits< math::Vec4< T > >::ElementType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BBox.html#aa11b92fa821da8f64d941c6baa08a2e2',1,'openvdb::v3_2_0::math::BBox::ElementType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNan.html#af41e18ae17c354f72b3c7e18eaa4fe71',1,'openvdb::v3_2_0::tools::CheckNan::ElementType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckInf.html#af41e18ae17c354f72b3c7e18eaa4fe71',1,'openvdb::v3_2_0::tools::CheckInf::ElementType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckFinite.html#af41e18ae17c354f72b3c7e18eaa4fe71',1,'openvdb::v3_2_0::tools::CheckFinite::ElementType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMagnitude.html#af41e18ae17c354f72b3c7e18eaa4fe71',1,'openvdb::v3_2_0::tools::CheckMagnitude::ElementType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckRange.html#af41e18ae17c354f72b3c7e18eaa4fe71',1,'openvdb::v3_2_0::tools::CheckRange::ElementType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMin.html#af41e18ae17c354f72b3c7e18eaa4fe71',1,'openvdb::v3_2_0::tools::CheckMin::ElementType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMax.html#af41e18ae17c354f72b3c7e18eaa4fe71',1,'openvdb::v3_2_0::tools::CheckMax::ElementType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#a79cf0a3895ebd23ae0d6b97ef4d3d0c2',1,'openvdb::v3_2_0::tools::CheckDivergence::ElementType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VelocityIntegrator.html#a1c47b7aceaefbb5182580c36adc6e570',1,'openvdb::v3_2_0::tools::VelocityIntegrator::ElementType()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_6.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_6.html new file mode 100644 index 00000000..7ff6756a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_6.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_6.js new file mode 100644 index 00000000..e07105f8 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_6.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['floatgrid',['FloatGrid',['../namespaceopenvdb_1_1v3__2__0.html#a4619b58336d0a1196e19b00edd6113bc',1,'openvdb::v3_2_0']]], + ['floatgridt',['FloatGridT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#a4d639424d93026521c99853652d6374f',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions']]], + ['floatmetadata',['FloatMetadata',['../namespaceopenvdb_1_1v3__2__0.html#a8e805e484bc0873814bfa2d230149565',1,'openvdb::v3_2_0']]], + ['floattree',['FloatTree',['../namespaceopenvdb_1_1v3__2__0.html#a6b41620b1f0b01f83684d2e024728562',1,'openvdb::v3_2_0']]], + ['floattreeacc',['FloatTreeAcc',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#a47a04d9309f2d9dc0da3241dc13ea52b',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData']]], + ['floattreet',['FloatTreeT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#a5fe2e14d891e544814a35e6574cc7ef7',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions']]], + ['floattype',['FloatType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#ad440d7719441093d79f59336a2ecaf51',1,'openvdb::v3_2_0::tools::AlphaMask']]], + ['fromgridptrt',['FromGridPtrT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1ConvertGrid.html#a03fbd5fbf90481daef284b1500084096',1,'openvdb::v3_2_0::tools::clip_internal::ConvertGrid']]], + ['fullydecomposedmap',['FullyDecomposedMap',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#ad289703594d6ddfd6a34f6d6a5c2b310',1,'openvdb::v3_2_0::math']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_7.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_7.html new file mode 100644 index 00000000..ce0d4997 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_7.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_7.js new file mode 100644 index 00000000..b5a92144 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_7.js @@ -0,0 +1,27 @@ +var searchData= +[ + ['gridcptrset',['GridCPtrSet',['../namespaceopenvdb_1_1v3__2__0.html#a58e8d497e45c257c18ef5ac5e3319803',1,'openvdb::v3_2_0']]], + ['gridcptrsetciter',['GridCPtrSetCIter',['../namespaceopenvdb_1_1v3__2__0.html#a47e84bca5432ffcd6495610eefccc57c',1,'openvdb::v3_2_0']]], + ['gridcptrsetiter',['GridCPtrSetIter',['../namespaceopenvdb_1_1v3__2__0.html#a32e99c711aece059837de901a307d5ae',1,'openvdb::v3_2_0']]], + ['gridcptrsetptr',['GridCPtrSetPtr',['../namespaceopenvdb_1_1v3__2__0.html#ad24fd8265701e20e43cb2b4ab7e2c811',1,'openvdb::v3_2_0']]], + ['gridcptrvec',['GridCPtrVec',['../namespaceopenvdb_1_1v3__2__0.html#ad0216534109af5570eb86ec930177b26',1,'openvdb::v3_2_0']]], + ['gridcptrvecciter',['GridCPtrVecCIter',['../namespaceopenvdb_1_1v3__2__0.html#a1fb8555e0a11165cc329c69f2e7032da',1,'openvdb::v3_2_0']]], + ['gridcptrveciter',['GridCPtrVecIter',['../namespaceopenvdb_1_1v3__2__0.html#ac5f3554828a9c96835919964266886d3',1,'openvdb::v3_2_0']]], + ['gridcptrvecptr',['GridCPtrVecPtr',['../namespaceopenvdb_1_1v3__2__0.html#a13ea4dcb7bce9fb63d58725e2f96de6e',1,'openvdb::v3_2_0']]], + ['gridfactory',['GridFactory',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a4b508bf186892235547251c8b87ac477',1,'openvdb::v3_2_0::GridBase']]], + ['gridptr',['GridPtr',['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a7154089a47c160aaeeeca16ef22e5c02',1,'openvdb::v3_2_0::tools::MultiResGrid']]], + ['gridptrlist',['GridPtrList',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFracture.html#a5d6557d0ead726d5702146c5cb5bff24',1,'openvdb::v3_2_0::tools::LevelSetFracture']]], + ['gridptrlistiter',['GridPtrListIter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFracture.html#afd5eb5a3688d2b976daee9c808b4651d',1,'openvdb::v3_2_0::tools::LevelSetFracture']]], + ['gridptrset',['GridPtrSet',['../namespaceopenvdb_1_1v3__2__0.html#ac19af022c6192db3d95418b72ea21629',1,'openvdb::v3_2_0']]], + ['gridptrsetciter',['GridPtrSetCIter',['../namespaceopenvdb_1_1v3__2__0.html#ab4f90e2386d1be1eb3143530b4c001ee',1,'openvdb::v3_2_0']]], + ['gridptrsetiter',['GridPtrSetIter',['../namespaceopenvdb_1_1v3__2__0.html#a87bb6ac69c42c572bd0f5fd0aca49735',1,'openvdb::v3_2_0']]], + ['gridptrsetptr',['GridPtrSetPtr',['../namespaceopenvdb_1_1v3__2__0.html#a9c0ab962974dbd17747f806144120a4a',1,'openvdb::v3_2_0']]], + ['gridptrt',['GridPtrT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1ConvertGrid_3_01GridT_00_01GridT_01_4.html#a13cc009d20e3a508aebbb4b83b5ce0d9',1,'openvdb::v3_2_0::tools::clip_internal::ConvertGrid< GridT, GridT >']]], + ['gridptrtype',['GridPtrType',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a53f5752b0073fe8df274d71dc9349a21',1,'openvdb::v3_2_0::TreeAdapter::GridPtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a53f5752b0073fe8df274d71dc9349a21',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::GridPtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a53f5752b0073fe8df274d71dc9349a21',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::GridPtrType()']]], + ['gridptrvec',['GridPtrVec',['../namespaceopenvdb_1_1v3__2__0.html#aa7853474b8fa140799c730775f891aca',1,'openvdb::v3_2_0']]], + ['gridptrvecciter',['GridPtrVecCIter',['../namespaceopenvdb_1_1v3__2__0.html#acf2522d80b2e4602c2ece93adc66741a',1,'openvdb::v3_2_0']]], + ['gridptrveciter',['GridPtrVecIter',['../namespaceopenvdb_1_1v3__2__0.html#a492eebbb69bb00db9ebb2bf7f2bc24ea',1,'openvdb::v3_2_0']]], + ['gridptrvecptr',['GridPtrVecPtr',['../namespaceopenvdb_1_1v3__2__0.html#aab1ee9f1c00e75f96098bbad7a368bbc',1,'openvdb::v3_2_0']]], + ['gridtype',['GridType',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#af26705de7d42ddca41212a763a14e3f2',1,'openvdb::v3_2_0::TreeAdapter::GridType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#af26705de7d42ddca41212a763a14e3f2',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::GridType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#af26705de7d42ddca41212a763a14e3f2',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::GridType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::math::BaseStencil::GridType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SevenPointStencil.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::math::SevenPointStencil::GridType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BoxStencil.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::math::BoxStencil::GridType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SecondOrderDenseStencil.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::math::SecondOrderDenseStencil::GridType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ThirteenPointStencil.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::math::ThirteenPointStencil::GridType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1FourthOrderDenseStencil.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::math::FourthOrderDenseStencil::GridType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NineteenPointStencil.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::math::NineteenPointStencil::GridType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SixthOrderDenseStencil.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::math::SixthOrderDenseStencil::GridType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::math::GradStencil::GridType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::math::WenoStencil::GridType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CurvatureStencil.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::math::CurvatureStencil::GridType()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1DenseStencil.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::math::DenseStencil::GridType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#af26705de7d42ddca41212a763a14e3f2',1,'openvdb::v3_2_0::tools::composite::GridOrTreeConstructor< Grid< TreeType > >::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::tools::Filter::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#ab375735b33e0ba300eb16ee7fae55f6c',1,'openvdb::v3_2_0::tools::GridSampler::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html#af26705de7d42ddca41212a763a14e3f2',1,'openvdb::v3_2_0::tools::GridSampler< tree::ValueAccessor< TreeT >, SamplerType >::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler.html#ae0dec06f780823be22ea63411b6a2c95',1,'openvdb::v3_2_0::tools::DualGridSampler::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DualGridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerT_01_4.html#af26705de7d42ddca41212a763a14e3f2',1,'openvdb::v3_2_0::tools::DualGridSampler< tree::ValueAccessor< TreeT >, SamplerT >::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::tools::AlphaMask::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::tools::LevelSetAdvection::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::tools::LevelSetFilter::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::tools::LevelSetMeasure::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::tools::LevelSetMorphing::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::tools::LevelSetTracker::GridType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#af26705de7d42ddca41212a763a14e3f2',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor< Grid< TreeType > >::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::tools::PointAdvect::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayIntersector.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::tools::LevelSetRayIntersector::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRayIntersector.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::tools::VolumeRayIntersector::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetRayTracer.html#af2d5d92dfd52e23c51ffaa35cf4dba4d',1,'openvdb::v3_2_0::tools::LevelSetRayTracer::GridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1VolumeRender.html#a5a64143640c29aca9fb9700ddf470641',1,'openvdb::v3_2_0::tools::VolumeRender::GridType()']]], + ['gridtypeptr',['GridTypePtr',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#a1467afe082b516d076b320a662be6473',1,'openvdb::v3_2_0::tools::composite::GridOrTreeConstructor< Grid< TreeType > >::GridTypePtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GridOrTreeConstructor_3_01Grid_3_01TreeType_01_4_01_4.html#a1467afe082b516d076b320a662be6473',1,'openvdb::v3_2_0::tools::level_set_util_internal::GridOrTreeConstructor< Grid< TreeType > >::GridTypePtr()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_8.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_8.html new file mode 100644 index 00000000..0dcf5f2f --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_8.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_8.js new file mode 100644 index 00000000..65da269d --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['halft',['HalfT',['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf.html#a6fdccf6e2530d06f53a17ecd38a8e24c',1,'openvdb::v3_2_0::io::RealToHalf::HalfT()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01float_01_4.html#a9355846cc3d5115dc758973144dca66f',1,'openvdb::v3_2_0::io::RealToHalf< float >::HalfT()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01double_01_4.html#a9355846cc3d5115dc758973144dca66f',1,'openvdb::v3_2_0::io::RealToHalf< double >::HalfT()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec2s_01_4.html#a2d5c491869190c3ed0e47f173c808ed3',1,'openvdb::v3_2_0::io::RealToHalf< Vec2s >::HalfT()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec2d_01_4.html#a2d5c491869190c3ed0e47f173c808ed3',1,'openvdb::v3_2_0::io::RealToHalf< Vec2d >::HalfT()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec3s_01_4.html#ad24f75fc1fb6696a4788706187f38b42',1,'openvdb::v3_2_0::io::RealToHalf< Vec3s >::HalfT()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1RealToHalf_3_01Vec3d_01_4.html#ad24f75fc1fb6696a4788706187f38b42',1,'openvdb::v3_2_0::io::RealToHalf< Vec3d >::HalfT()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1HalfReader_3_01true_00_01T_01_4.html#a2547341b2f5b210a1a61c4e6c050d88c',1,'openvdb::v3_2_0::io::HalfReader< true, T >::HalfT()'],['../structopenvdb_1_1v3__2__0_1_1io_1_1HalfWriter_3_01true_00_01T_01_4.html#a2547341b2f5b210a1a61c4e6c050d88c',1,'openvdb::v3_2_0::io::HalfWriter< true, T >::HalfT()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_9.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_9.html new file mode 100644 index 00000000..98b0b3bc --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_9.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_9.js new file mode 100644 index 00000000..745394dc --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_9.js @@ -0,0 +1,51 @@ +var searchData= +[ + ['id',['Id',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a55dd3d458c152bdb1c7c34d4597722c7',1,'openvdb::v3_2_0::io::Queue']]], + ['implt',['ImplT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1GetVal.html#a3f53baa29d697259f499e0563e59841a',1,'openvdb::v3_2_0::tools::stats_internal::GetVal']]], + ['index',['Index',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#aee532d4b44808a8f321ad6d4ba4f3f91',1,'openvdb::v3_2_0::tools::SparseExtractor::Index()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#aee532d4b44808a8f321ad6d4ba4f3f91',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor::Index()'],['../namespaceopenvdb_1_1v3__2__0.html#a6786cb661047b99900e3e8d3d4a031e6',1,'openvdb::v3_2_0::Index()']]], + ['index32',['Index32',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a645f179f9d65431ffd25354db30cda9f',1,'openvdb::v3_2_0::math::Coord::Index32()'],['../namespaceopenvdb_1_1v3__2__0.html#a645f179f9d65431ffd25354db30cda9f',1,'openvdb::v3_2_0::Index32()']]], + ['index64',['Index64',['../classopenvdb_1_1v3__2__0_1_1math_1_1CoordBBox.html#a9d784ca0e99d06fae78a3c2e7e19c919',1,'openvdb::v3_2_0::math::CoordBBox::Index64()'],['../namespaceopenvdb_1_1v3__2__0.html#a9d784ca0e99d06fae78a3c2e7e19c919',1,'openvdb::v3_2_0::Index64()']]], + ['indexarray',['IndexArray',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a7bd5b3a884338d784438f7af54936453',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::IndexArray()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1VoxelOrderOp.html#a4058ed78158e76a54b8d4ec8c2bc2c1e',1,'openvdb::v3_2_0::tools::point_partitioner_internal::VoxelOrderOp::IndexArray()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1LeafNodeOriginOp.html#a4058ed78158e76a54b8d4ec8c2bc2c1e',1,'openvdb::v3_2_0::tools::point_partitioner_internal::LeafNodeOriginOp::IndexArray()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1OrderSegmentsOp.html#a4058ed78158e76a54b8d4ec8c2bc2c1e',1,'openvdb::v3_2_0::tools::point_partitioner_internal::OrderSegmentsOp::IndexArray()']]], + ['indexdeque',['IndexDeque',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RadialRangeFilter.html#a345449f49fbeaac5fa60793c054916fe',1,'openvdb::v3_2_0::tools::particle_atlas_internal::RadialRangeFilter::IndexDeque()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1BBoxFilter.html#a345449f49fbeaac5fa60793c054916fe',1,'openvdb::v3_2_0::tools::particle_atlas_internal::BBoxFilter::IndexDeque()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1BBoxFilter.html#a345449f49fbeaac5fa60793c054916fe',1,'openvdb::v3_2_0::tools::point_index_grid_internal::BBoxFilter::IndexDeque()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1RadialRangeFilter.html#a345449f49fbeaac5fa60793c054916fe',1,'openvdb::v3_2_0::tools::point_index_grid_internal::RadialRangeFilter::IndexDeque()']]], + ['indexpair',['IndexPair',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MergeBinsOp.html#af84b24f4c3dd2adaebfd231b0955c49f',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MergeBinsOp::IndexPair()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#af84b24f4c3dd2adaebfd231b0955c49f',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp::IndexPair()']]], + ['indexpairlist',['IndexPairList',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MergeBinsOp.html#ae5d40819a20ddb46008b8bcff11c3891',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MergeBinsOp::IndexPairList()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#ae5d40819a20ddb46008b8bcff11c3891',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp::IndexPairList()']]], + ['indexpairlistmap',['IndexPairListMap',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MergeBinsOp.html#a42ed098e6581259d041fc04ae9b72412',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MergeBinsOp::IndexPairListMap()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#a42ed098e6581259d041fc04ae9b72412',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp::IndexPairListMap()']]], + ['indexpairlistmapptr',['IndexPairListMapPtr',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MergeBinsOp.html#aca6d867b13c2896af32ebc7062415300',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MergeBinsOp::IndexPairListMapPtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#aca6d867b13c2896af32ebc7062415300',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp::IndexPairListMapPtr()']]], + ['indexpairlistptr',['IndexPairListPtr',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1MergeBinsOp.html#ac302d9ccc88389ca64d06a86e2ea4857',1,'openvdb::v3_2_0::tools::point_partitioner_internal::MergeBinsOp::IndexPairListPtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#ac302d9ccc88389ca64d06a86e2ea4857',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp::IndexPairListPtr()']]], + ['indexrange',['IndexRange',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1NodeBS.html#a81beb889f26b26840a2f75af4d99f019',1,'openvdb::v3_2_0::tools::internal::NodeBS::IndexRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1ClosestPointDist.html#a81beb889f26b26840a2f75af4d99f019',1,'openvdb::v3_2_0::tools::internal::ClosestPointDist::IndexRange()']]], + ['indext',['IndexT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1PopulateLeafNodesOp.html#ae3f3843950615ebb8a55fb55f429db0e',1,'openvdb::v3_2_0::tools::point_index_grid_internal::PopulateLeafNodesOp']]], + ['indextype',['IndexType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#a79e662e22f964ab5c3ab7aca226184a2',1,'openvdb::v3_2_0::tools::ParticleAtlas::IndexType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#a153e05586229d204b574373c0ef1a6c6',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner_1_1IndexIterator.html#a153e05586229d204b574373c0ef1a6c6',1,'openvdb::v3_2_0::tools::PointPartitioner::IndexIterator::IndexType()']]], + ['ingridtype',['InGridType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Cpt.html#a38e1f92482c057064469f8ab41ad0cf1',1,'openvdb::v3_2_0::tools::Cpt::InGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Curl.html#a51c88f39165b9834c13df1c455690691',1,'openvdb::v3_2_0::tools::Curl::InGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Divergence.html#a38e1f92482c057064469f8ab41ad0cf1',1,'openvdb::v3_2_0::tools::Divergence::InGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Gradient.html#a38e1f92482c057064469f8ab41ad0cf1',1,'openvdb::v3_2_0::tools::Gradient::InGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian.html#a51c88f39165b9834c13df1c455690691',1,'openvdb::v3_2_0::tools::Laplacian::InGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature.html#a51c88f39165b9834c13df1c455690691',1,'openvdb::v3_2_0::tools::MeanCurvature::InGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude.html#a38e1f92482c057064469f8ab41ad0cf1',1,'openvdb::v3_2_0::tools::Magnitude::InGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Normalize.html#a51c88f39165b9834c13df1c455690691',1,'openvdb::v3_2_0::tools::Normalize::InGridType()']]], + ['inputleafnodetype',['InputLeafNodeType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskIsovalueCrossingVoxels.html#a4bf9a049c9f5b8205749a0627c653b34',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskIsovalueCrossingVoxels']]], + ['inputvaluetype',['InputValueType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskIsovalueCrossingVoxels.html#ac766e699f8354bbe9936ec7f540a74be',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskIsovalueCrossingVoxels']]], + ['int',['Int',['../namespaceopenvdb_1_1v3__2__0.html#a5293f165e3de725398d6ebfca71903ec',1,'openvdb::v3_2_0']]], + ['int16',['Int16',['../namespaceopenvdb_1_1v3__2__0.html#a6d70d2452bc784cc9a499c567e4b5a77',1,'openvdb::v3_2_0']]], + ['int16accessort',['Int16AccessorT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#ab7b176255bb24be34f45b693592a387e',1,'openvdb::v3_2_0::tools::internal::SignData::Int16AccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MapPoints.html#a7243cbc243c1c7e07b78e883a4a93c2b',1,'openvdb::v3_2_0::tools::internal::MapPoints::Int16AccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SeamWeights.html#a7243cbc243c1c7e07b78e883a4a93c2b',1,'openvdb::v3_2_0::tools::internal::SeamWeights::Int16AccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#a7243cbc243c1c7e07b78e883a4a93c2b',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions::Int16AccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPolygons.html#a7243cbc243c1c7e07b78e883a4a93c2b',1,'openvdb::v3_2_0::tools::internal::GenPolygons::Int16AccessorT()']]], + ['int16caccessort',['Int16CAccessorT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPoints.html#a9b36e18eaa70a866b3baa74a8f9e95c7',1,'openvdb::v3_2_0::tools::internal::GenPoints']]], + ['int16treet',['Int16TreeT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#a53a0ba16e068199a8a32810357ef26f5',1,'openvdb::v3_2_0::tools::internal::SignData::Int16TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPoints.html#a53a0ba16e068199a8a32810357ef26f5',1,'openvdb::v3_2_0::tools::internal::GenPoints::Int16TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SeamWeights.html#a53a0ba16e068199a8a32810357ef26f5',1,'openvdb::v3_2_0::tools::internal::SeamWeights::Int16TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#abff12748f424029d7175ccb31bc7b81b',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions::Int16TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPolygons.html#abff12748f424029d7175ccb31bc7b81b',1,'openvdb::v3_2_0::tools::internal::GenPolygons::Int16TreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestSurfacePoint.html#a53a0ba16e068199a8a32810357ef26f5',1,'openvdb::v3_2_0::tools::ClosestSurfacePoint::Int16TreeT()']]], + ['int32',['Int32',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a20b0c262d9ef5d263888e463dfa99638',1,'openvdb::v3_2_0::math::Coord::Int32()'],['../namespaceopenvdb_1_1v3__2__0.html#a20b0c262d9ef5d263888e463dfa99638',1,'openvdb::v3_2_0::Int32()']]], + ['int32grid',['Int32Grid',['../namespaceopenvdb_1_1v3__2__0.html#aaef7a3882681a620606551eff7f621c4',1,'openvdb::v3_2_0']]], + ['int32leafnodetype',['Int32LeafNodeType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1CombineLeafNodes.html#a9bfe854c940699ac002f19dd8441906f',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::CombineLeafNodes::Int32LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeIntersectingVoxelSign.html#a9bfe854c940699ac002f19dd8441906f',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ComputeIntersectingVoxelSign::Int32LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#a9bfe854c940699ac002f19dd8441906f',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::Int32LeafNodeType()']]], + ['int32metadata',['Int32Metadata',['../namespaceopenvdb_1_1v3__2__0.html#a0fe835bccd0efe020e4ea88ec6b6b7de',1,'openvdb::v3_2_0']]], + ['int32tree',['Int32Tree',['../namespaceopenvdb_1_1v3__2__0.html#a4871236c97a1615ac24f58069d55f17f',1,'openvdb::v3_2_0']]], + ['int32treeacc',['Int32TreeAcc',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#ac201ddf12b50afb5a66154a9337dc73d',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData']]], + ['int32treetype',['Int32TreeType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1CombineLeafNodes.html#a18923392e6d7835d2a96a1138339aff4',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::CombineLeafNodes::Int32TreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeIntersectingVoxelSign.html#a18923392e6d7835d2a96a1138339aff4',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ComputeIntersectingVoxelSign::Int32TreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RemoveSelfIntersectingSurface.html#a18923392e6d7835d2a96a1138339aff4',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RemoveSelfIntersectingSurface::Int32TreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#a18923392e6d7835d2a96a1138339aff4',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData::Int32TreeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#a18923392e6d7835d2a96a1138339aff4',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::Int32TreeType()']]], + ['int64',['Int64',['../namespaceopenvdb_1_1v3__2__0.html#a2de3f49eadcae5078cd57134586ee25d',1,'openvdb::v3_2_0']]], + ['int64grid',['Int64Grid',['../namespaceopenvdb_1_1v3__2__0.html#a41eb0bcf26fa04f42242f1b9cfedac7b',1,'openvdb::v3_2_0']]], + ['int64metadata',['Int64Metadata',['../namespaceopenvdb_1_1v3__2__0.html#a46605b9b7bcd5c256518f26575dba98d',1,'openvdb::v3_2_0']]], + ['int64tree',['Int64Tree',['../namespaceopenvdb_1_1v3__2__0.html#a3578b768dd57513edaa806ddebed80df',1,'openvdb::v3_2_0']]], + ['intaccessort',['IntAccessorT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#a7feac3964002f7d878609501c6bcc588',1,'openvdb::v3_2_0::tools::internal::SignData::IntAccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1CountRegions.html#a7feac3964002f7d878609501c6bcc588',1,'openvdb::v3_2_0::tools::internal::CountRegions::IntAccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPoints.html#a7feac3964002f7d878609501c6bcc588',1,'openvdb::v3_2_0::tools::internal::GenPoints::IntAccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SeamWeights.html#a1bb60896d5cf4f744e43788317ce5257',1,'openvdb::v3_2_0::tools::internal::SeamWeights::IntAccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#a7feac3964002f7d878609501c6bcc588',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions::IntAccessorT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPolygons.html#a1bb60896d5cf4f744e43788317ce5257',1,'openvdb::v3_2_0::tools::internal::GenPolygons::IntAccessorT()']]], + ['intcaccessort',['IntCAccessorT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPoints.html#a22b2e91d030ace991ccd10cf07d2fe18',1,'openvdb::v3_2_0::tools::internal::GenPoints']]], + ['internalnodetype',['InternalNodeType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildPrimarySegment.html#ab365520008399ba9ab0d62cdf4c63d74',1,'openvdb::v3_2_0::tools::composite::BuildPrimarySegment::InternalNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildSecondarySegment.html#ab365520008399ba9ab0d62cdf4c63d74',1,'openvdb::v3_2_0::tools::composite::BuildSecondarySegment::InternalNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FloodFillSign.html#ab365520008399ba9ab0d62cdf4c63d74',1,'openvdb::v3_2_0::tools::level_set_util_internal::FloodFillSign::InternalNodeType()']]], + ['interruptertype',['InterrupterType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1ParticlesToLevelSet.html#ad6113a94c63d579febb5241937771f9e',1,'openvdb::v3_2_0::tools::ParticlesToLevelSet']]], + ['interruptfunc',['InterruptFunc',['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html#aeea8015056fedafc44e3e7d77b0dae89',1,'openvdb::v3_2_0::tools::GridResampler']]], + ['intleaft',['IntLeafT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1CountRegions.html#af2ff40bebdd26bb7890c9c4180da5823',1,'openvdb::v3_2_0::tools::internal::CountRegions']]], + ['intreet',['InTreeT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpTransformer.html#a0dd838be8f4902f033f95dfb9d452a86',1,'openvdb::v3_2_0::tools::valxform::SharedOpTransformer::InTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpTransformer.html#a0dd838be8f4902f033f95dfb9d452a86',1,'openvdb::v3_2_0::tools::valxform::CopyableOpTransformer::InTreeT()']]], + ['inttreet',['IntTreeT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SignData.html#a287e191ca672922fb2b46d3077af5c51',1,'openvdb::v3_2_0::tools::internal::SignData::IntTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPoints.html#a287e191ca672922fb2b46d3077af5c51',1,'openvdb::v3_2_0::tools::internal::GenPoints::IntTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SeamWeights.html#a287e191ca672922fb2b46d3077af5c51',1,'openvdb::v3_2_0::tools::internal::SeamWeights::IntTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1MergeVoxelRegions.html#a287e191ca672922fb2b46d3077af5c51',1,'openvdb::v3_2_0::tools::internal::MergeVoxelRegions::IntTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPolygons.html#a90b04f7594ec7e7fe3472ceded571fc3',1,'openvdb::v3_2_0::tools::internal::GenPolygons::IntTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenBoundaryMask.html#a35921011e807dcca3a4db24244ffc051',1,'openvdb::v3_2_0::tools::internal::GenBoundaryMask::IntTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ClosestSurfacePoint.html#a287e191ca672922fb2b46d3077af5c51',1,'openvdb::v3_2_0::tools::ClosestSurfacePoint::IntTreeT()']]], + ['inttype',['IntType',['../structopenvdb_1_1v3__2__0_1_1PointIndex.html#a1ac5afc307132ac962afa58465e6c1be',1,'openvdb::v3_2_0::PointIndex::IntType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseTransformer.html#a9dc9503ba94d9195ce5aa1392bb0eae7',1,'openvdb::v3_2_0::tools::DenseTransformer::IntType()']]], + ['invtreet',['InvTreeT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#ac95a27af03901c3501213083682c1d30',1,'openvdb::v3_2_0::tree::NodeIteratorBase::InvTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#ac95a27af03901c3501213083682c1d30',1,'openvdb::v3_2_0::tree::LeafIteratorBase::InvTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#afc634a6a2b05e91148109419ff728661',1,'openvdb::v3_2_0::tree::ValueAccessor1::InvTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#afc634a6a2b05e91148109419ff728661',1,'openvdb::v3_2_0::tree::ValueAccessor2::InvTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#afc634a6a2b05e91148109419ff728661',1,'openvdb::v3_2_0::tree::ValueAccessor3::InvTreeT()']]], + ['iterrange',['IterRange',['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveTileValues.html#abe6378c864b7a38f6ca0a273ee70a87b',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveTileValues::IterRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpApplier.html#a31c29a834c73f006df3be2a3ce3f86ff',1,'openvdb::v3_2_0::tools::valxform::SharedOpApplier::IterRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpApplier.html#a31c29a834c73f006df3be2a3ce3f86ff',1,'openvdb::v3_2_0::tools::valxform::CopyableOpApplier::IterRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpTransformer.html#a169040a459a5904c589df612cc99d7bb',1,'openvdb::v3_2_0::tools::valxform::SharedOpTransformer::IterRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpTransformer.html#a169040a459a5904c589df612cc99d7bb',1,'openvdb::v3_2_0::tools::valxform::CopyableOpTransformer::IterRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1OpAccumulator.html#a31c29a834c73f006df3be2a3ce3f86ff',1,'openvdb::v3_2_0::tools::valxform::OpAccumulator::IterRange()']]], + ['itert',['IterT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid_1_1ReducePool.html#a30eb9077b2f866c5fa85235007299843',1,'openvdb::v3_2_0::tools::PointMaskGrid::ReducePool::IterT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOnIter_01_4.html#ab67825126bf3ecdbc239f9dcf1e5b88a',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOnIter >::IterT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOnCIter_01_4.html#a88d7fc4fefc28544bddcd60953ffe896',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOnCIter >::IterT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOffIter_01_4.html#acacb235300c99ce548b7d5a587b05626',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOffIter >::IterT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildOffCIter_01_4.html#a263e78291b7304e9cd6af0285dd57fb3',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildOffCIter >::IterT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildAllIter_01_4.html#a3f335ba26a42aca44c72ed5273711631',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildAllIter >::IterT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ChildAllCIter_01_4.html#a6cec0a23cb581c0205036ebbad27965e',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ChildAllCIter >::IterT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOnIter_01_4.html#af151ba4d7fb0fd09ac96967a8a16f556',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOnIter >::IterT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOnCIter_01_4.html#af556b5f849c5d7c6985dda1d1e634777',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOnCIter >::IterT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOffIter_01_4.html#ab7dab98e2ee075bd7db1bc830ccb8347',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOffIter >::IterT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueOffCIter_01_4.html#aae4bb4891399430e5f5259c368fac62f',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueOffCIter >::IterT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueAllIter_01_4.html#ac375468e72a3a4795f7f61233409643a',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueAllIter >::IterT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1IterTraits_3_01NodeT_00_01typename_01NodeT_1_1ValueAllCIter_01_4.html#ac6c19d6f0ca5f2354b67ca88336520b1',1,'openvdb::v3_2_0::tree::IterTraits< NodeT, typename NodeT::ValueAllCIter >::IterT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#aa75dfab8fa497a9d989955b595896920',1,'openvdb::v3_2_0::tree::IterListItem::IterT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#aa75dfab8fa497a9d989955b595896920',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::IterT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#aa75dfab8fa497a9d989955b595896920',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::IterT()']]], + ['itertype',['IterType',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#abe5d3603dbb0f44bb3a9d23b1e127f18',1,'openvdb::v3_2_0::math::BaseStencil']]], + ['itraits',['ITraits',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a96fa5ee63f04c5089f697ee0d1237e56',1,'openvdb::v3_2_0::tree::IterListItem::ITraits()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a96fa5ee63f04c5089f697ee0d1237e56',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::ITraits()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a96fa5ee63f04c5089f697ee0d1237e56',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::ITraits()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_a.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_a.html new file mode 100644 index 00000000..ab222114 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_a.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_a.js new file mode 100644 index 00000000..54ce515a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_a.js @@ -0,0 +1,25 @@ +var searchData= +[ + ['laplacianmatrix',['LaplacianMatrix',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1poisson.html#a137cf22df6cdf12622718437e02885d0',1,'openvdb::v3_2_0::tools::poisson']]], + ['leafarray',['LeafArray',['../classopenvdb_1_1v3__2__0_1_1tools_1_1diagnostics__internal_1_1InactiveVoxelValues.html#acaebf35b65a5e863f6ebd07c574b5e6f',1,'openvdb::v3_2_0::tools::diagnostics_internal::InactiveVoxelValues']]], + ['leafciter',['LeafCIter',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ab70d61f51d3e67a8b4494bb045c90c79',1,'openvdb::v3_2_0::tree::Tree']]], + ['leafiter',['LeafIter',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#abd661fdeff6388ca9d64ee76b5dcbf8a',1,'openvdb::v3_2_0::tree::Tree']]], + ['leafitertype',['LeafIterType',['../structopenvdb_1_1v3__2__0_1_1tree_1_1leafmgr_1_1TreeTraits.html#ac5a92b4d11d1730f6224959b38cac9e5',1,'openvdb::v3_2_0::tree::leafmgr::TreeTraits::LeafIterType()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1leafmgr_1_1TreeTraits_3_01const_01TreeT_01_4.html#a8851dbc0964e3472b56bc069c2ce2096',1,'openvdb::v3_2_0::tree::leafmgr::TreeTraits< const TreeT >::LeafIterType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#ac3ab5c0d0cdce81e8959dd8a6be69ff5',1,'openvdb::v3_2_0::tree::LeafManager::LeafIterType()']]], + ['leafmanagert',['LeafManagerT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html#af6ae739b66d5ea985c9bc2bb8bb57a1a',1,'openvdb::v3_2_0::tools::gridop::GridOperator::LeafManagerT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1PartGen.html#a0f2b8b03885e2bb84f1da4bd12653fb2',1,'openvdb::v3_2_0::tools::internal::PartGen::LeafManagerT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenTopologyMask.html#a0f2b8b03885e2bb84f1da4bd12653fb2',1,'openvdb::v3_2_0::tools::internal::GenTopologyMask::LeafManagerT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenBoundaryMask.html#a0f2b8b03885e2bb84f1da4bd12653fb2',1,'openvdb::v3_2_0::tools::internal::GenBoundaryMask::LeafManagerT()']]], + ['leafmanagertype',['LeafManagerType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#afa0c8fc1c88cf66e55b1610bb3b4d779',1,'openvdb::v3_2_0::tools::Filter::LeafManagerType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#afa0c8fc1c88cf66e55b1610bb3b4d779',1,'openvdb::v3_2_0::tools::LevelSetTracker::LeafManagerType()']]], + ['leafnodet',['LeafNodeT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1MaskInteriorVoxels.html#ae2f09f8e80b57849d25263270714da7b',1,'openvdb::v3_2_0::tools::clip_internal::MaskInteriorVoxels::LeafNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#abd78689c901a53d288df7978965848a6',1,'openvdb::v3_2_0::tree::LeafIteratorBase::LeafNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#aeaa590cd7291806e51ce3418a4e8b7f4',1,'openvdb::v3_2_0::tree::ValueAccessor::LeafNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor0.html#aeaa590cd7291806e51ce3418a4e8b7f4',1,'openvdb::v3_2_0::tree::ValueAccessor0::LeafNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#aeaa590cd7291806e51ce3418a4e8b7f4',1,'openvdb::v3_2_0::tree::ValueAccessor1::LeafNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#aeaa590cd7291806e51ce3418a4e8b7f4',1,'openvdb::v3_2_0::tree::ValueAccessor2::LeafNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#aeaa590cd7291806e51ce3418a4e8b7f4',1,'openvdb::v3_2_0::tree::ValueAccessor3::LeafNodeT()']]], + ['leafnodetype',['LeafNodeType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildPrimarySegment.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::composite::BuildPrimarySegment::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildSecondarySegment.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::composite::BuildSecondarySegment::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1PopulateTree.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::level_set_util_internal::PopulateTree::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillMaskBoundary.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillMaskBoundary::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskSegmentGroup.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskSegmentGroup::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandLeafNodeRegion.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandLeafNodeRegion::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillLeafNodeVoxels.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillLeafNodeVoxels::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FloodFillSign.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::level_set_util_internal::FloodFillSign::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskedCopy.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskedCopy::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1CombineLeafNodes.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::CombineLeafNodes::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1StashOriginAndStoreOffset.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::StashOriginAndStoreOffset::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RestoreOrigin.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RestoreOrigin::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeNodeConnectivity.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ComputeNodeConnectivity::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1LeafNodeConnectivityTable.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::LeafNodeConnectivityTable::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SweepExteriorSign.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SweepExteriorSign::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedFillExteriorSign.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedFillExteriorSign::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SyncVoxelMask.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SyncVoxelMask::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedPoints::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeIntersectingVoxelSign.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ComputeIntersectingVoxelSign::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ValidateIntersectingVoxels.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ValidateIntersectingVoxels::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RemoveSelfIntersectingSurface.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RemoveSelfIntersectingSurface::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1StealUniqueLeafNodes.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::StealUniqueLeafNodes::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1DiffLeafNodeMask.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::DiffLeafNodeMask::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ConstructVoxelMask.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ConstructVoxelMask::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1AddNodes.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::AddNodes::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1TransformValues.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::TransformValues::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1InactivateValues.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::InactivateValues::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1OffsetValues.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::OffsetValues::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1Renormalize.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::Renormalize::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1MinCombine.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::MinCombine::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexIterator.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::PointIndexIterator::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ab0f61bc46ec780acf4f4fcb78652248a',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::LeafNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ttls__internal_1_1OffsetAndMinComp.html#a2916f2bfde6d6f808bc1eb43ace3cc08',1,'openvdb::v3_2_0::tools::ttls_internal::OffsetAndMinComp::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a962095d534799728b2ff65025501f5d6',1,'openvdb::v3_2_0::tree::InternalNode::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a6c5991738312c890f8d05301c745e889',1,'openvdb::v3_2_0::tree::LeafManager::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ad9d7d3f2b66d577db1512f0469eee302',1,'openvdb::v3_2_0::tree::LeafNode::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ad4503b9277a0521e259e9ce235ce669d',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a07c0a99d2bef9a85e256276da435c135',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a23b3e9dd8f606477f0359c8a2539e756',1,'openvdb::v3_2_0::tree::RootNode::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a96e8cc29fdf9ac44f03095b4e22ea37e',1,'openvdb::v3_2_0::tree::Tree::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a2c231cb2b63033c2d43acd75eef0d5c8',1,'openvdb::v3_2_0::tree::CacheItem::LeafNodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem_3_01TreeCacheT_00_01NodeVecT_00_01true_01_4.html#a96e8cc29fdf9ac44f03095b4e22ea37e',1,'openvdb::v3_2_0::tree::CacheItem< TreeCacheT, NodeVecT, true >::LeafNodeType()']]], + ['leafrange',['LeafRange',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#ac48423498c752934e69def6317cc56e9',1,'openvdb::v3_2_0::tools::LevelSetAdvection::LeafRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#ac48423498c752934e69def6317cc56e9',1,'openvdb::v3_2_0::tools::LevelSetMorphing::LeafRange()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#a4375dc8fd3edc4872e9445f1fca65d20',1,'openvdb::v3_2_0::tools::LevelSetTracker::LeafRange()']]], + ['leaft',['LeafT',['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA_3_01TreeT_00_01RayT_00_010_01_4.html#a1f8e19b652f40cc62bcf2e9cf4ded5a8',1,'openvdb::v3_2_0::math::VolumeHDDA< TreeT, RayT, 0 >::LeafT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeBackgroundOp.html#ac3b4d95d68c958cf0b1262cd281e737b',1,'openvdb::v3_2_0::tools::ChangeBackgroundOp::LeafT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ChangeLevelSetBackgroundOp.html#ac3b4d95d68c958cf0b1262cd281e737b',1,'openvdb::v3_2_0::tools::ChangeLevelSetBackgroundOp::LeafT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CopyFromDense.html#a1f8e19b652f40cc62bcf2e9cf4ded5a8',1,'openvdb::v3_2_0::tools::CopyFromDense::LeafT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#a1f8e19b652f40cc62bcf2e9cf4ded5a8',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor::LeafT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyToVecOp.html#aeae3a81d126f62d5df87269a85841e12',1,'openvdb::v3_2_0::tools::poisson::internal::CopyToVecOp::LeafT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1InactivePruneOp.html#a1f8e19b652f40cc62bcf2e9cf4ded5a8',1,'openvdb::v3_2_0::tools::InactivePruneOp::LeafT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1TolerancePruneOp.html#a1f8e19b652f40cc62bcf2e9cf4ded5a8',1,'openvdb::v3_2_0::tools::TolerancePruneOp::LeafT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetPruneOp.html#a1f8e19b652f40cc62bcf2e9cf4ded5a8',1,'openvdb::v3_2_0::tools::LevelSetPruneOp::LeafT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SignedFloodFillOp.html#ac3b4d95d68c958cf0b1262cd281e737b',1,'openvdb::v3_2_0::tools::SignedFloodFillOp::LeafT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafManagerImpl.html#a93a9b9b77bf2ec2f65c4b1585ac14325',1,'openvdb::v3_2_0::tree::LeafManagerImpl::LeafT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafManagerImpl_3_01LeafManager_3_01const_01TreeT_01_4_01_4.html#a93a9b9b77bf2ec2f65c4b1585ac14325',1,'openvdb::v3_2_0::tree::LeafManagerImpl< LeafManager< const TreeT > >::LeafT()']]], + ['leaftype',['LeafType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#aea1fb1ab2ed122f63d3331872709a013',1,'openvdb::v3_2_0::tools::Filter::LeafType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetAdvection.html#a8d9a4b5e1242f75c88154df7fb3ad0b9',1,'openvdb::v3_2_0::tools::LevelSetAdvection::LeafType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMorphing.html#a8d9a4b5e1242f75c88154df7fb3ad0b9',1,'openvdb::v3_2_0::tools::LevelSetMorphing::LeafType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#aea1fb1ab2ed122f63d3331872709a013',1,'openvdb::v3_2_0::tools::LevelSetTracker::LeafType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#aea1fb1ab2ed122f63d3331872709a013',1,'openvdb::v3_2_0::tools::Morphology::LeafType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a9696afbf24b6fed72a3848088b3aff7e',1,'openvdb::v3_2_0::tree::LeafManager::LeafType()']]], + ['limits',['Limits',['../classopenvdb_1_1v3__2__0_1_1math_1_1Coord.html#a561cc2a15e4d23fa5cd655d1633d9716',1,'openvdb::v3_2_0::math::Coord']]], + ['listt',['ListT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#a87c5ce931b2a70692d36f854fc1a59f0',1,'openvdb::v3_2_0::tree::NodeList']]], + ['listt0',['ListT0',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a71d932294118b298abbbf47a4124377d',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::ListT0()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a71d932294118b298abbbf47a4124377d',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::ListT0()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a71d932294118b298abbbf47a4124377d',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::ListT0()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a71d932294118b298abbbf47a4124377d',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::ListT0()']]], + ['listt1',['ListT1',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a2e820164390a1f703e825e74ad432fda',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::ListT1()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a2e820164390a1f703e825e74ad432fda',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::ListT1()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a2e820164390a1f703e825e74ad432fda',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::ListT1()']]], + ['listt2',['ListT2',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a9a4b44278d8a279dc5f6f209dad9f325',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::ListT2()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a9a4b44278d8a279dc5f6f209dad9f325',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::ListT2()']]], + ['listt3',['ListT3',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#aab3892e2d1057a21db1f4e3b419686e4',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >']]], + ['localdata',['LocalData',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeIntersectingVoxelSign.html#ac46d9eabb8d5c4c00b6fd86164196b7c',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ComputeIntersectingVoxelSign']]], + ['localdatatable',['LocalDataTable',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ComputeIntersectingVoxelSign.html#a7c46bc61562e34c9357ae67a40e5427c',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ComputeIntersectingVoxelSign']]], + ['locationtype',['LocationType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#ae37737d93dcbc518f7bf23574a15a960',1,'openvdb::v3_2_0::tools::PointAdvect::LocationType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#ae37737d93dcbc518f7bf23574a15a960',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect::LocationType()']]], + ['lockt',['LockT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor.html#adf810148044ad3054e9419fdab5f0105',1,'openvdb::v3_2_0::tree::ValueAccessor']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_b.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_b.html new file mode 100644 index 00000000..7664eedc --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_b.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_b.js new file mode 100644 index 00000000..0a65bcbc --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_b.js @@ -0,0 +1,37 @@ +var searchData= +[ + ['managert',['ManagerT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1MaskOp.html#a657e2b3a0205ca7da9915258ae5a1484',1,'openvdb::v3_2_0::tools::MultiResGrid::MaskOp::ManagerT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafManagerImpl_3_01LeafManager_3_01const_01TreeT_01_4_01_4.html#a673da19b147fc4921b97f15e83702901',1,'openvdb::v3_2_0::tree::LeafManagerImpl< LeafManager< const TreeT > >::ManagerT()']]], + ['managertype',['ManagerType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetMeasure.html#a339ead1a60ac493c14cb7600701211b6',1,'openvdb::v3_2_0::tools::LevelSetMeasure::ManagerType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a05d661b0f9037e044b2430e383dc572e',1,'openvdb::v3_2_0::tools::Morphology::ManagerType()']]], + ['mapdictionary',['MapDictionary',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapRegistry.html#a9aa51380952d6364c67eeafa0ff383d8',1,'openvdb::v3_2_0::math::MapRegistry']]], + ['mapfactory',['MapFactory',['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#a325faed3969e6f7f36216b67bc85aa03',1,'openvdb::v3_2_0::math::MapBase']]], + ['maskdenseiter',['MaskDenseIter',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a6de49a6d78541ee5698097dc641a3e86',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::MaskDenseIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a6de49a6d78541ee5698097dc641a3e86',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::MaskDenseIter()']]], + ['maskdenseiterator',['MaskDenseIterator',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a06023eaf4fbd8092ff12eb1829ea1a49',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::MaskDenseIterator()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a06023eaf4fbd8092ff12eb1829ea1a49',1,'openvdb::v3_2_0::tree::InternalNode::MaskDenseIterator()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a06023eaf4fbd8092ff12eb1829ea1a49',1,'openvdb::v3_2_0::tree::LeafNode::MaskDenseIterator()']]], + ['maskgrid',['MaskGrid',['../namespaceopenvdb_1_1v3__2__0.html#a4ad586079c586a506e17e3a73918e41a',1,'openvdb::v3_2_0']]], + ['maskleafciter',['MaskLeafCIter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#a91921150e1636d9575cf1b4cc448c8fc',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor']]], + ['maskleafmanagert',['MaskLeafManagerT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1CopyLeafNodes.html#adff80b5bd0147623107d8dddf6ab6e12',1,'openvdb::v3_2_0::tools::clip_internal::CopyLeafNodes']]], + ['maskleaft',['MaskLeafT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#a42e9be0445eb07c4ba3c3eb5dcf4ee34',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor']]], + ['maskleafvec',['MaskLeafVec',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#af047097b93b88550e59893c545990209',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor']]], + ['maskoffiter',['MaskOffIter',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a23f880a7c92e6150918559326270edb0',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::MaskOffIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a23f880a7c92e6150918559326270edb0',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::MaskOffIter()']]], + ['maskoffiterator',['MaskOffIterator',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#ac987a793c5c17616139f71d4ef68836d',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::MaskOffIterator()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#ac987a793c5c17616139f71d4ef68836d',1,'openvdb::v3_2_0::tree::InternalNode::MaskOffIterator()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ac987a793c5c17616139f71d4ef68836d',1,'openvdb::v3_2_0::tree::LeafNode::MaskOffIterator()']]], + ['maskoniter',['MaskOnIter',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a6cf1eeb573f296d8a1a70394d8ec34af',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::MaskOnIter()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a6cf1eeb573f296d8a1a70394d8ec34af',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::MaskOnIter()']]], + ['maskoniterator',['MaskOnIterator',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#aa628d48b1fb44f64a69217a3c3f5f31b',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::MaskOnIterator()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aa628d48b1fb44f64a69217a3c3f5f31b',1,'openvdb::v3_2_0::tree::InternalNode::MaskOnIterator()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#aa628d48b1fb44f64a69217a3c3f5f31b',1,'openvdb::v3_2_0::tree::LeafNode::MaskOnIterator()']]], + ['maskt',['MaskT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1MaskOp.html#a970639a7ca66f75bf8364920ac6fcac0',1,'openvdb::v3_2_0::tools::MultiResGrid::MaskOp']]], + ['masktree',['MaskTree',['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseExtractor.html#af2452bc9149f5d9053973ca1a88a206d',1,'openvdb::v3_2_0::tools::SparseExtractor::MaskTree()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseMaskedExtractor.html#af2452bc9149f5d9053973ca1a88a206d',1,'openvdb::v3_2_0::tools::SparseMaskedExtractor::MaskTree()'],['../namespaceopenvdb_1_1v3__2__0.html#a9ce184648052c93e51c62424e287c2a1',1,'openvdb::v3_2_0::MaskTree()']]], + ['masktreet',['MaskTreeT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1clip__internal_1_1CopyLeafNodes.html#a91ff2674951cf9a5af3d085c506d5040',1,'openvdb::v3_2_0::tools::clip_internal::CopyLeafNodes::MaskTreeT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1SparseToDenseCompositor.html#a91ff2674951cf9a5af3d085c506d5040',1,'openvdb::v3_2_0::tools::SparseToDenseCompositor::MaskTreeT()']]], + ['masktreetype',['MaskTreeType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker.html#ab9e8c0cbaa4b10fcd383498d9ba851f4',1,'openvdb::v3_2_0::tools::LevelSetTracker']]], + ['masktype',['MaskType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Diagnose.html#a693ca5fd5bf6ae701f4103c661a1a2e3',1,'openvdb::v3_2_0::tools::Diagnose::MaskType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckLevelSet.html#aba9226377de0ff32d20b93775559a6e7',1,'openvdb::v3_2_0::tools::CheckLevelSet::MaskType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1CheckFogVolume.html#aba9226377de0ff32d20b93775559a6e7',1,'openvdb::v3_2_0::tools::CheckFogVolume::MaskType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Filter.html#a02c1464eb4bb8e2e414ba5efbbab6393',1,'openvdb::v3_2_0::tools::Filter::MaskType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#a02c1464eb4bb8e2e414ba5efbbab6393',1,'openvdb::v3_2_0::tools::AlphaMask::MaskType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter.html#a02c1464eb4bb8e2e414ba5efbbab6393',1,'openvdb::v3_2_0::tools::LevelSetFilter::MaskType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#ae205c06f54b7f212b9664493f01ff7da',1,'openvdb::v3_2_0::tools::Morphology::MaskType()']]], + ['mat3d',['Mat3d',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a15b8d95db03b150f5b6b9ac7a17c744c',1,'openvdb::v3_2_0::math']]], + ['mat3f',['Mat3f',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#afade7f9f65a4be6ecaacad8f0cb705b6',1,'openvdb::v3_2_0::math']]], + ['mat3r',['Mat3R',['../namespaceopenvdb_1_1v3__2__0.html#a2511d8857bd9a6423d3c6fde5c88bde7',1,'openvdb::v3_2_0']]], + ['mat3s',['Mat3s',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#aee0814e3251871e89dff147270c95f32',1,'openvdb::v3_2_0::math']]], + ['mat4d',['Mat4d',['../namespaceopenvdb_1_1v3__2__0.html#ab3a91c5eb62320610ea0fd6bd6fb4146',1,'openvdb::v3_2_0::Mat4d()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#af33c8658fedbfc4706d6505b1fd475a8',1,'openvdb::v3_2_0::math::Mat4d()']]], + ['mat4dmetadata',['Mat4DMetadata',['../namespaceopenvdb_1_1v3__2__0.html#aa82b216527004b9571c1d0dfbb8fe9b1',1,'openvdb::v3_2_0']]], + ['mat4f',['Mat4f',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a33bfa92ce72de8bdaba601d6a3a8d377',1,'openvdb::v3_2_0::math']]], + ['mat4r',['Mat4R',['../namespaceopenvdb_1_1v3__2__0.html#ab9150b39b5c273900f5cb5fcb930096f',1,'openvdb::v3_2_0']]], + ['mat4s',['Mat4s',['../namespaceopenvdb_1_1v3__2__0.html#a414c7ee0bbf9fa7baa5c54c6b6c8f505',1,'openvdb::v3_2_0::Mat4s()'],['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a25559485ccf91e3db302192dac6e439a',1,'openvdb::v3_2_0::math::Mat4s()']]], + ['mat4smetadata',['Mat4SMetadata',['../namespaceopenvdb_1_1v3__2__0.html#aeb18227765214253b36604920903430c',1,'openvdb::v3_2_0']]], + ['metadatamap',['MetadataMap',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#ab78f30d303230ef5c7bc7dad620790b5',1,'openvdb::v3_2_0::MetaMap']]], + ['metaiterator',['MetaIterator',['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a1591b2f992798e6203a78ae2de3d09dd',1,'openvdb::v3_2_0::MetaMap']]], + ['mybase',['MyBase',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat3.html#ae4d4560bf0392ac23d8bd170feec4947',1,'openvdb::v3_2_0::math::Mat3::MyBase()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat4.html#a4e603dfa15cc4480a4d349bf72562f64',1,'openvdb::v3_2_0::math::Mat4::MyBase()']]], + ['mytype',['MyType',['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#a8607bc8cb2ede029d0a4ae5001d6330d',1,'openvdb::v3_2_0::math::CompoundMap']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_c.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_c.html new file mode 100644 index 00000000..ca5e370c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_c.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_c.js new file mode 100644 index 00000000..1c458a76 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_c.js @@ -0,0 +1,38 @@ +var searchData= +[ + ['name',['Name',['../namespaceopenvdb_1_1v3__2__0.html#a019c188253c90cf2d0b1d6bf710190f4',1,'openvdb::v3_2_0']]], + ['namedgridmap',['NamedGridMap',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a98b450a19e69b2b8996ddca8fc1fa067',1,'openvdb::v3_2_0::io::Archive']]], + ['namemap',['NameMap',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#a185ac871f7280e6ea525b5eb56eb4587',1,'openvdb::v3_2_0::io::File']]], + ['namemapciter',['NameMapCIter',['../classopenvdb_1_1v3__2__0_1_1io_1_1File.html#aa6dbd64ba14d51185c2d409d981d267d',1,'openvdb::v3_2_0::io::File']]], + ['ncchildt',['NCChildT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a23b7ebd5bee8ab1fb729300f82bb0386',1,'openvdb::v3_2_0::tree::IterListItem::NCChildT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a23b7ebd5bee8ab1fb729300f82bb0386',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::NCChildT()']]], + ['ncleafnodet',['NCLeafNodeT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#a627378f1fa605a0b82d748dcc3a73a68',1,'openvdb::v3_2_0::tree::LeafIteratorBase']]], + ['ncnodet',['NCNodeT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a6925074a464ed498d508adbe456a309c',1,'openvdb::v3_2_0::tree::IterListItem::NCNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a6925074a464ed498d508adbe456a309c',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::NCNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a6925074a464ed498d508adbe456a309c',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::NCNodeT()']]], + ['ncrootnodet',['NCRootNodeT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a545e593438b07544d634dda5d00bdfef',1,'openvdb::v3_2_0::tree::NodeIteratorBase::NCRootNodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#a545e593438b07544d634dda5d00bdfef',1,'openvdb::v3_2_0::tree::LeafIteratorBase::NCRootNodeT()']]], + ['ncvaluet',['NCValueT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a99cbebf71189866f2b001a1c66b0cdfc',1,'openvdb::v3_2_0::tree::IterListItem::NCValueT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a99cbebf71189866f2b001a1c66b0cdfc',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::NCValueT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a99cbebf71189866f2b001a1c66b0cdfc',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::NCValueT()']]], + ['nodechaintype',['NodeChainType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildPrimarySegment.html#a8b1fe8abb7e13ac7470ba9ea1e7e2d73',1,'openvdb::v3_2_0::tools::composite::BuildPrimarySegment::NodeChainType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildSecondarySegment.html#a8b1fe8abb7e13ac7470ba9ea1e7e2d73',1,'openvdb::v3_2_0::tools::composite::BuildSecondarySegment::NodeChainType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FloodFillSign.html#a8b1fe8abb7e13ac7470ba9ea1e7e2d73',1,'openvdb::v3_2_0::tools::level_set_util_internal::FloodFillSign::NodeChainType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a0982fa3467dd846d831fccca042f87b7',1,'openvdb::v3_2_0::tree::RootNode::NodeChainType()']]], + ['nodeciter',['NodeCIter',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a48fd0d2b2f429cc7b7a21b70b2844b25',1,'openvdb::v3_2_0::tree::Tree']]], + ['nodeiter',['NodeIter',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#ac34433f7d2e2eb2d95fddef8e0b1d523',1,'openvdb::v3_2_0::tree::Tree']]], + ['nodemasksegmenttype',['NodeMaskSegmentType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SegmentNodeMask.html#a5cd2ce8057f8bc45f6ac7bd217dd26a4',1,'openvdb::v3_2_0::tools::level_set_util_internal::SegmentNodeMask::NodeMaskSegmentType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ConnectNodeMaskSegments.html#a5cd2ce8057f8bc45f6ac7bd217dd26a4',1,'openvdb::v3_2_0::tools::level_set_util_internal::ConnectNodeMaskSegments::NodeMaskSegmentType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskSegmentGroup.html#af719360c74f407748b7e9fd3c9385da6',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskSegmentGroup::NodeMaskSegmentType()']]], + ['nodemasksegmenttypeptr',['NodeMaskSegmentTypePtr',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SegmentNodeMask.html#a759e0814f87d1e3d0e5e31a88d28ce80',1,'openvdb::v3_2_0::tools::level_set_util_internal::SegmentNodeMask::NodeMaskSegmentTypePtr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ConnectNodeMaskSegments.html#a759e0814f87d1e3d0e5e31a88d28ce80',1,'openvdb::v3_2_0::tools::level_set_util_internal::ConnectNodeMaskSegments::NodeMaskSegmentTypePtr()']]], + ['nodemasksegmentvector',['NodeMaskSegmentVector',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SegmentNodeMask.html#a2b9e9014495c9e881c52b6c73d8f02ef',1,'openvdb::v3_2_0::tools::level_set_util_internal::SegmentNodeMask::NodeMaskSegmentVector()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ConnectNodeMaskSegments.html#a2b9e9014495c9e881c52b6c73d8f02ef',1,'openvdb::v3_2_0::tools::level_set_util_internal::ConnectNodeMaskSegments::NodeMaskSegmentVector()']]], + ['nodemasktype',['NodeMaskType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildPrimarySegment.html#ad926943d080d5e746033a5be01ed99ef',1,'openvdb::v3_2_0::tools::composite::BuildPrimarySegment::NodeMaskType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1composite_1_1BuildSecondarySegment.html#ad926943d080d5e746033a5be01ed99ef',1,'openvdb::v3_2_0::tools::composite::BuildSecondarySegment::NodeMaskType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1NodeMaskSegment.html#a63ad0305a158b91fedb74b0ac7f57c7d',1,'openvdb::v3_2_0::tools::level_set_util_internal::NodeMaskSegment::NodeMaskType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ConnectNodeMaskSegments.html#a63ad0305a158b91fedb74b0ac7f57c7d',1,'openvdb::v3_2_0::tools::level_set_util_internal::ConnectNodeMaskSegments::NodeMaskType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandLeafNodeRegion.html#ad926943d080d5e746033a5be01ed99ef',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandLeafNodeRegion::NodeMaskType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillLeafNodeVoxels.html#ad926943d080d5e746033a5be01ed99ef',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillLeafNodeVoxels::NodeMaskType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband.html#ad926943d080d5e746033a5be01ed99ef',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::NodeMaskType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a89539d1156e6ad8837ff948b2a2307ea',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::NodeMaskType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a89539d1156e6ad8837ff948b2a2307ea',1,'openvdb::v3_2_0::tree::InternalNode::NodeMaskType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a89539d1156e6ad8837ff948b2a2307ea',1,'openvdb::v3_2_0::tree::LeafNode::NodeMaskType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a89539d1156e6ad8837ff948b2a2307ea',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::NodeMaskType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a89539d1156e6ad8837ff948b2a2307ea',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::NodeMaskType()']]], + ['nodet',['NodeT',['../structopenvdb_1_1v3__2__0_1_1math_1_1LevelSetHDDA.html#a95381de0e25829d02834b011f207905a',1,'openvdb::v3_2_0::math::LevelSetHDDA::NodeT()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1VolumeHDDA.html#acc1e3979c4ee61bfcc2deb2fc8edc4ae',1,'openvdb::v3_2_0::math::VolumeHDDA::NodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#af2e6c9b80035addb030eeaa6fb472012',1,'openvdb::v3_2_0::tree::IterListItem::NodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#af2e6c9b80035addb030eeaa6fb472012',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::NodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#af2e6c9b80035addb030eeaa6fb472012',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::NodeT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a7ff070f090763763e0a0fe2bff78039a',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::NodeT()']]], + ['nodet0',['NodeT0',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a8328a160872f90dc186f214d93591e9c',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::NodeT0()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a8328a160872f90dc186f214d93591e9c',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::NodeT0()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a8328a160872f90dc186f214d93591e9c',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::NodeT0()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a8328a160872f90dc186f214d93591e9c',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::NodeT0()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor1.html#a39372bcfd8f6d1ac8afc2f757862f175',1,'openvdb::v3_2_0::tree::ValueAccessor1::NodeT0()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#a39372bcfd8f6d1ac8afc2f757862f175',1,'openvdb::v3_2_0::tree::ValueAccessor2::NodeT0()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#a39372bcfd8f6d1ac8afc2f757862f175',1,'openvdb::v3_2_0::tree::ValueAccessor3::NodeT0()']]], + ['nodet1',['NodeT1',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a14ad531eb746ccd947b7f67e4d8e9de4',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::NodeT1()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a150a8410fea91bbc898692a9dd3482ce',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::NodeT1()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a150a8410fea91bbc898692a9dd3482ce',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::NodeT1()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a150a8410fea91bbc898692a9dd3482ce',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::NodeT1()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor2.html#abecf715579e470c3c50dec0858ff1d50',1,'openvdb::v3_2_0::tree::ValueAccessor2::NodeT1()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#abecf715579e470c3c50dec0858ff1d50',1,'openvdb::v3_2_0::tree::ValueAccessor3::NodeT1()']]], + ['nodet2',['NodeT2',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a4bd87f3ad1467105e4d732d2eaff1f21',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::NodeT2()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a67729803c824a26c8dbaa5093f762a32',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::NodeT2()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a67729803c824a26c8dbaa5093f762a32',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::NodeT2()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessor3.html#add7ea05ae81fa164ff7f7be093f17576',1,'openvdb::v3_2_0::tree::ValueAccessor3::NodeT2()']]], + ['nodet3',['NodeT3',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#ae78a2c0e976a5709495ab3be7bcf7e02',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::NodeT3()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a58f4360b0549e86c047b2cff82bc3952',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::NodeT3()']]], + ['nodet4',['NodeT4',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#aab185431dd6da83416887c8f9f954610',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >']]], + ['nodetype',['NodeType',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#a88fbbb3bca7df33c47be9f2b0d408955',1,'openvdb::v3_2_0::tree::SparseIteratorBase::NodeType()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a88fbbb3bca7df33c47be9f2b0d408955',1,'openvdb::v3_2_0::tree::DenseIteratorBase::NodeType()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1CacheItem.html#a53ea168ef3193928e7979c02817f735d',1,'openvdb::v3_2_0::tree::CacheItem::NodeType()']]], + ['nonconstaccessortype',['NonConstAccessorType',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a4c6207dadb898cd12bf254e8817d2f6d',1,'openvdb::v3_2_0::TreeAdapter::NonConstAccessorType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a4c6207dadb898cd12bf254e8817d2f6d',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::NonConstAccessorType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a4c6207dadb898cd12bf254e8817d2f6d',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::NonConstAccessorType()']]], + ['nonconstbuffertype',['NonConstBufferType',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a9539b6120b9d985d3c77fadeab6d7769',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['nonconstchildnodetype',['NonConstChildNodeType',['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#ab8cc698ecc36cc2a6bcf8c0bd4d90639',1,'openvdb::v3_2_0::tree::DenseIteratorBase']]], + ['nonconstgridptrtype',['NonConstGridPtrType',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a932fb26412a242d16d3630d4a8517225',1,'openvdb::v3_2_0::TreeAdapter::NonConstGridPtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a932fb26412a242d16d3630d4a8517225',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::NonConstGridPtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a932fb26412a242d16d3630d4a8517225',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::NonConstGridPtrType()']]], + ['nonconstgridtype',['NonConstGridType',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#a227e7cceedb13897b43857a2a0107a8f',1,'openvdb::v3_2_0::TreeAdapter::NonConstGridType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#a227e7cceedb13897b43857a2a0107a8f',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::NonConstGridType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#a227e7cceedb13897b43857a2a0107a8f',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::NonConstGridType()']]], + ['nonconstleaftype',['NonConstLeafType',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a3aa32bb9bbf634ba2c32589db8316860',1,'openvdb::v3_2_0::tree::LeafManager']]], + ['nonconstnodetype',['NonConstNodeType',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#a073b0571f0fccd18553fa4fcb835ff87',1,'openvdb::v3_2_0::tree::SparseIteratorBase::NonConstNodeType()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a073b0571f0fccd18553fa4fcb835ff87',1,'openvdb::v3_2_0::tree::DenseIteratorBase::NonConstNodeType()']]], + ['nonconsttreeptrtype',['NonConstTreePtrType',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#ab4ed1f25cd3194982f763e4b8e73bc8f',1,'openvdb::v3_2_0::TreeAdapter::NonConstTreePtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#ab4ed1f25cd3194982f763e4b8e73bc8f',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::NonConstTreePtrType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#ab4ed1f25cd3194982f763e4b8e73bc8f',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::NonConstTreePtrType()']]], + ['nonconsttreetype',['NonConstTreeType',['../structopenvdb_1_1v3__2__0_1_1TreeAdapter.html#ad90332e5c18721d6dbd9e7453ef0a74e',1,'openvdb::v3_2_0::TreeAdapter::NonConstTreeType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01Grid_3_01__TreeType_01_4_01_4.html#ad90332e5c18721d6dbd9e7453ef0a74e',1,'openvdb::v3_2_0::TreeAdapter< Grid< _TreeType > >::NonConstTreeType()'],['../structopenvdb_1_1v3__2__0_1_1TreeAdapter_3_01tree_1_1ValueAccessor_3_01__TreeType_01_4_01_4.html#ad90332e5c18721d6dbd9e7453ef0a74e',1,'openvdb::v3_2_0::TreeAdapter< tree::ValueAccessor< _TreeType > >::NonConstTreeType()']]], + ['nonconstvaluet',['NonConstValueT',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DenseIter.html#ad7abce612a88828c02f160d5a0d08972',1,'openvdb::v3_2_0::tree::InternalNode::DenseIter::NonConstValueT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1DenseIter.html#ad7abce612a88828c02f160d5a0d08972',1,'openvdb::v3_2_0::tree::LeafNode::DenseIter::NonConstValueT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1DenseIter.html#ad7abce612a88828c02f160d5a0d08972',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::DenseIter::NonConstValueT()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1DenseIter.html#ad7abce612a88828c02f160d5a0d08972',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::DenseIter::NonConstValueT()']]], + ['nonconstvaluetype',['NonConstValueType',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#ab617e717e5addbc62bc74c4aa878e3c2',1,'openvdb::v3_2_0::tree::SparseIteratorBase::NonConstValueType()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#af97f7780ee30cadd5687ed65e12eedf0',1,'openvdb::v3_2_0::tree::DenseIteratorBase::NonConstValueType()']]], + ['notifier',['Notifier',['../classopenvdb_1_1v3__2__0_1_1io_1_1MappedFile.html#a55ab8243710575fe37d91cf80ad8fe9a',1,'openvdb::v3_2_0::io::MappedFile::Notifier()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#af6447994af80545baa1ddea91cb56823',1,'openvdb::v3_2_0::io::Queue::Notifier()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_d.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_d.html new file mode 100644 index 00000000..ff088daa --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_d.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_d.js new file mode 100644 index 00000000..6191fefd --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_d.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['offiterator',['OffIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a1f638b980a5663b7b3f8adc42076aeb4',1,'openvdb::v3_2_0::util::NodeMask::OffIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a1f638b980a5663b7b3f8adc42076aeb4',1,'openvdb::v3_2_0::util::NodeMask< 1 >::OffIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a1f638b980a5663b7b3f8adc42076aeb4',1,'openvdb::v3_2_0::util::NodeMask< 2 >::OffIterator()']]], + ['oniterator',['OnIterator',['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ad1770ff270617ac685e52d4ed719f353',1,'openvdb::v3_2_0::util::NodeMask::OnIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ad1770ff270617ac685e52d4ed719f353',1,'openvdb::v3_2_0::util::NodeMask< 1 >::OnIterator()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ad1770ff270617ac685e52d4ed719f353',1,'openvdb::v3_2_0::util::NodeMask< 2 >::OnIterator()']]], + ['opt',['OpT',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator_3_01DS__OVER_00_01ValueT_01_4.html#a7bfab844eb8f687e08c0ec57995edf32',1,'openvdb::v3_2_0::tools::ds::CompositeFunctorTranslator< DS_OVER, ValueT >::OpT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator_3_01DS__ADD_00_01ValueT_01_4.html#ab95d5fc8e34b9eeee6990dacb80da353',1,'openvdb::v3_2_0::tools::ds::CompositeFunctorTranslator< DS_ADD, ValueT >::OpT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator_3_01DS__SUB_00_01ValueT_01_4.html#a5628d3e24c197d60481434f832a619b2',1,'openvdb::v3_2_0::tools::ds::CompositeFunctorTranslator< DS_SUB, ValueT >::OpT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator_3_01DS__MIN_00_01ValueT_01_4.html#a2361f3c4872d39273fc0668c66a2257d',1,'openvdb::v3_2_0::tools::ds::CompositeFunctorTranslator< DS_MIN, ValueT >::OpT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator_3_01DS__MAX_00_01ValueT_01_4.html#a03fd71ab63fc72220f638554618a4b51',1,'openvdb::v3_2_0::tools::ds::CompositeFunctorTranslator< DS_MAX, ValueT >::OpT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ds_1_1CompositeFunctorTranslator_3_01DS__MULT_00_01ValueT_01_4.html#ad122bfc5875a0602920af0d28b8be029',1,'openvdb::v3_2_0::tools::ds::CompositeFunctorTranslator< DS_MULT, ValueT >::OpT()']]], + ['outgridtype',['OutGridType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Cpt.html#acd35ce15294339dd3fc52984762e954d',1,'openvdb::v3_2_0::tools::Cpt::OutGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Curl.html#a9a0f994472bae11c23894828bad7e189',1,'openvdb::v3_2_0::tools::Curl::OutGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Divergence.html#a94a036e8b78849f2ed656f3a15ee0b2b',1,'openvdb::v3_2_0::tools::Divergence::OutGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Gradient.html#acd35ce15294339dd3fc52984762e954d',1,'openvdb::v3_2_0::tools::Gradient::OutGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian.html#a9a0f994472bae11c23894828bad7e189',1,'openvdb::v3_2_0::tools::Laplacian::OutGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature.html#a9a0f994472bae11c23894828bad7e189',1,'openvdb::v3_2_0::tools::MeanCurvature::OutGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude.html#a94a036e8b78849f2ed656f3a15ee0b2b',1,'openvdb::v3_2_0::tools::Magnitude::OutGridType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Normalize.html#a9a0f994472bae11c23894828bad7e189',1,'openvdb::v3_2_0::tools::Normalize::OutGridType()']]], + ['outleaft',['OutLeafT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html#a3dbe0bcc241cbbfe38cd8ec65e0cfc2d',1,'openvdb::v3_2_0::tools::gridop::GridOperator::OutLeafT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyFromVecOp.html#a3dbe0bcc241cbbfe38cd8ec65e0cfc2d',1,'openvdb::v3_2_0::tools::poisson::internal::CopyFromVecOp::OutLeafT()']]], + ['outtreet',['OutTreeT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html#a27f776c4a676e749a189953b09a9df87',1,'openvdb::v3_2_0::tools::gridop::GridOperator::OutTreeT()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyFromVecOp.html#ac8e23a8dcd2f88f5c3beeec23f1da01a',1,'openvdb::v3_2_0::tools::poisson::internal::CopyFromVecOp::OutTreeT()']]], + ['outvaluet',['OutValueT',['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SharedOpTransformer.html#afe142d4fbcc44d9f06217da4d80dd054',1,'openvdb::v3_2_0::tools::valxform::SharedOpTransformer::OutValueT()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1CopyableOpTransformer.html#afe142d4fbcc44d9f06217da4d80dd054',1,'openvdb::v3_2_0::tools::valxform::CopyableOpTransformer::OutValueT()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_e.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_e.html new file mode 100644 index 00000000..b9d556fd --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_e.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_e.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_e.js new file mode 100644 index 00000000..7e0ff7b4 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_e.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['pagedarraytype',['PagedArrayType',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1ValueBuffer.html#a559ccdc2513d129e335aba31aad8094e',1,'openvdb::v3_2_0::util::PagedArray::ValueBuffer']]], + ['particlearray',['ParticleArray',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#ac8203033b236ed43756038aca7d3b58c',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray']]], + ['particleindexatlas',['ParticleIndexAtlas',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#aad26628d37f31050774f7517b55e31de',1,'openvdb::v3_2_0::tools']]], + ['partitioner',['Partitioner',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1PopulateLeafNodesOp.html#a5adda353541f797ab3e6f3e47c926999',1,'openvdb::v3_2_0::tools::point_index_grid_internal::PopulateLeafNodesOp']]], + ['pointdataindex32',['PointDataIndex32',['../namespaceopenvdb_1_1v3__2__0.html#acb2dc492be2267cade6252554c5f48c4',1,'openvdb::v3_2_0']]], + ['pointdataindex64',['PointDataIndex64',['../namespaceopenvdb_1_1v3__2__0.html#a711d34e3130dc4e0dbd302f3c5579b7a',1,'openvdb::v3_2_0']]], + ['pointindex32',['PointIndex32',['../namespaceopenvdb_1_1v3__2__0.html#a3db7d512d0ea530a58be65edc2cf2cbe',1,'openvdb::v3_2_0']]], + ['pointindex64',['PointIndex64',['../namespaceopenvdb_1_1v3__2__0.html#a6dd1a276b51e133a2d40a9f82a0abfe8',1,'openvdb::v3_2_0']]], + ['pointindexgrid',['PointIndexGrid',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a0d27cdf9655b62779d998856c77a1057',1,'openvdb::v3_2_0::tools']]], + ['pointindexgridptr',['PointIndexGridPtr',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#a5001686ca559153137c3ce73f4b8630b',1,'openvdb::v3_2_0::tools::ParticleAtlas']]], + ['pointindextree',['PointIndexTree',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ac6e92995301c99651f6ceba87ca894cd',1,'openvdb::v3_2_0::tools']]], + ['pointlist',['PointList',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#a87a2501f5cad48bd50d422ffc6e7ea7a',1,'openvdb::v3_2_0::tools']]], + ['pointlisttype',['PointListType',['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointAdvect.html#a09cfcdbf2b5270867256281a7e966e46',1,'openvdb::v3_2_0::tools::PointAdvect::PointListType()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1ConstrainedPointAdvect.html#a09cfcdbf2b5270867256281a7e966e46',1,'openvdb::v3_2_0::tools::ConstrainedPointAdvect::PointListType()']]], + ['polardecomposedmap',['PolarDecomposedMap',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a7c666ca29a217070668b001227d01b08',1,'openvdb::v3_2_0::math']]], + ['polygonpoollist',['PolygonPoolList',['../namespaceopenvdb_1_1v3__2__0_1_1tools.html#ae5ff19b45ed66a869844887351e1d10a',1,'openvdb::v3_2_0::tools']]], + ['pooltype',['PoolType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1MaskOp.html#ac498150ed381e14326499f9426cd846e',1,'openvdb::v3_2_0::tools::MultiResGrid::MaskOp']]], + ['postype',['PosType',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1ComputeExtremas.html#a329ed64dd1bd32258a09f921ee49dfef',1,'openvdb::v3_2_0::tools::particle_atlas_internal::ComputeExtremas::PosType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#a9f758e0f828c6d4a42d1d0e8da044bd6',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray::PosType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RadialRangeFilter.html#a7e6876dbec6ee12be049fd8e6356d907',1,'openvdb::v3_2_0::tools::particle_atlas_internal::RadialRangeFilter::PosType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1BBoxFilter.html#a7e6876dbec6ee12be049fd8e6356d907',1,'openvdb::v3_2_0::tools::particle_atlas_internal::BBoxFilter::PosType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexFilter.html#a30254b50da11af50261a73951ec71e93',1,'openvdb::v3_2_0::tools::PointIndexFilter::PosType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1BBoxFilter.html#a30254b50da11af50261a73951ec71e93',1,'openvdb::v3_2_0::tools::point_index_grid_internal::BBoxFilter::PosType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1RadialRangeFilter.html#a30254b50da11af50261a73951ec71e93',1,'openvdb::v3_2_0::tools::point_index_grid_internal::RadialRangeFilter::PosType()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#a30254b50da11af50261a73951ec71e93',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp::PosType()']]], + ['previtert',['PrevIterT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#addf975e03522433851c52a71cd22c0a1',1,'openvdb::v3_2_0::tree::IterListItem::PrevIterT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#addf975e03522433851c52a71cd22c0a1',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::PrevIterT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#addf975e03522433851c52a71cd22c0a1',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::PrevIterT()']]], + ['ptr',['Ptr',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ae5f073a322a4a562054f0b2506f48111',1,'openvdb::v3_2_0::GridBase::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1Grid.html#aac96d633d8cebcf0f08aa67d3e690dae',1,'openvdb::v3_2_0::Grid::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a71a34ec242e96e12ae593eb9e40e58f6',1,'openvdb::v3_2_0::io::Archive::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1StreamMetadata.html#a3aac2584efac935b80ed22b4e6b1e026',1,'openvdb::v3_2_0::io::StreamMetadata::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1io_1_1MappedFile.html#a56cdd0fe395e8c0a628d558493a98401',1,'openvdb::v3_2_0::io::MappedFile::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector.html#a6aa704ce9a9bf2476bfaa2e89c7aa647',1,'openvdb::v3_2_0::math::pcg::Vector::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#ad2bbf4b6e00be1bd4a0a86d235f4d57c',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Preconditioner.html#a726385a366d4dc25f4531bb9974f961c',1,'openvdb::v3_2_0::math::pcg::Preconditioner::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1JacobiPreconditioner.html#a4a0ff28ea3ad6cda00e5e577d23b1f84',1,'openvdb::v3_2_0::math::pcg::JacobiPreconditioner::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1IncompleteCholeskyPreconditioner.html#a555f877187b569ec717e958a315b1e41',1,'openvdb::v3_2_0::math::pcg::IncompleteCholeskyPreconditioner::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1MapBase.html#ac8b230da50a122307699d901092ff3f7',1,'openvdb::v3_2_0::math::MapBase::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1AffineMap.html#a2598e25f6e75056603015c0c44f0a94c',1,'openvdb::v3_2_0::math::AffineMap::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleMap.html#aee4c7ec1425731be3474bf10e2ff4224',1,'openvdb::v3_2_0::math::ScaleMap::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleMap.html#ac2ef3b40e0494a8675a91bc8378d5aee',1,'openvdb::v3_2_0::math::UniformScaleMap::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1TranslationMap.html#a5544d07d373129b6e446d06cdfdee6f1',1,'openvdb::v3_2_0::math::TranslationMap::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ScaleTranslateMap.html#aeb20a8fcd79bd7f1ba2e5b462abfdfd5',1,'openvdb::v3_2_0::math::ScaleTranslateMap::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UniformScaleTranslateMap.html#a6514165e9bc1dc98da6ba0eb7d22a81b',1,'openvdb::v3_2_0::math::UniformScaleTranslateMap::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1UnitaryMap.html#a9dbabdaa56462f5709c0820c071239eb',1,'openvdb::v3_2_0::math::UnitaryMap::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NonlinearFrustumMap.html#a51a06b16ab468a38ef3b65ab60e47f27',1,'openvdb::v3_2_0::math::NonlinearFrustumMap::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CompoundMap.html#ad01e8505e5d52d526ace2ad796f9a479',1,'openvdb::v3_2_0::math::CompoundMap::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Transform.html#a8e4669fc90b6bb567b10c541f450d68e',1,'openvdb::v3_2_0::math::Transform::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1Metadata.html#a95ed14273597421f00f70344b5df704e',1,'openvdb::v3_2_0::Metadata::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1TypedMetadata.html#aec7d87af5f26a6fecec55566f89b3ddd',1,'openvdb::v3_2_0::TypedMetadata::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1MetaMap.html#a885753a990797853172c3167e65b5afa',1,'openvdb::v3_2_0::MetaMap::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Dense.html#a78805283b66d1915c3803316569e43f7',1,'openvdb::v3_2_0::tools::Dense::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridResampler.html#a2ac04c4ebd1b09d5c4233c84f81e0e22',1,'openvdb::v3_2_0::tools::GridResampler::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer.html#abc139d5c665814773b11b26db694a256',1,'openvdb::v3_2_0::tools::GridTransformer::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler.html#a6c0c10a99f85980972e86772ea602883',1,'openvdb::v3_2_0::tools::GridSampler::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1GridSampler_3_01tree_1_1ValueAccessor_3_01TreeT_01_4_00_01SamplerType_01_4.html#a6c0c10a99f85980972e86772ea602883',1,'openvdb::v3_2_0::tools::GridSampler< tree::ValueAccessor< TreeT >, SamplerType >::Ptr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1NodeMaskSegment.html#ac6c8bc65e36ad0f5bfbc92deef151fce',1,'openvdb::v3_2_0::tools::level_set_util_internal::NodeMaskSegment::Ptr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#a988b619d1c40122bfdd4cdf360d10192',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid.html#a17e238dcdf59e364f00cda1363a25907',1,'openvdb::v3_2_0::tools::MultiResGrid::Ptr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1ParticleAtlas.html#a195b5c3d7c3368ff4dfc303f28caf1c3',1,'openvdb::v3_2_0::tools::ParticleAtlas::Ptr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1SplittableParticleArray.html#ae7e6c03e9242d5f437a7b7e569e43f88',1,'openvdb::v3_2_0::tools::particle_atlas_internal::SplittableParticleArray::Ptr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointIndexLeafNode.html#a40a88b76b6996ab276e75795c6b00c76',1,'openvdb::v3_2_0::tools::PointIndexLeafNode::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1PointPartitioner.html#a1997fae0d5e9bc397475816eb504106a',1,'openvdb::v3_2_0::tools::PointPartitioner::Ptr()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1Array.html#a05d202de4db7bc6d2fcf416e50ebf369',1,'openvdb::v3_2_0::tools::point_partitioner_internal::Array::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#ae3098610d5ce2b73b3268333ce3c31ee',1,'openvdb::v3_2_0::tree::LeafNode::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a50d93bdc3b1ea617993a7750eaa7599a',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a50d93bdc3b1ea617993a7750eaa7599a',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeBase.html#aea4cbab691f3a5248e9ca56ed7e44917',1,'openvdb::v3_2_0::tree::TreeBase::Ptr()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a147dd2d717216bac58c91dbb5c08f7c9',1,'openvdb::v3_2_0::tree::Tree::Ptr()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_f.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_f.html new file mode 100644 index 00000000..939fbbbe --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_f.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_f.js new file mode 100644 index 00000000..f839b629 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/typedefs_f.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['quantizedpointlist',['QuantizedPointList',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1GenPoints.html#acd50b5469e47cffdb459de4dcd5091e6',1,'openvdb::v3_2_0::tools::internal::GenPoints::QuantizedPointList()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1SeamWeights.html#acd50b5469e47cffdb459de4dcd5091e6',1,'openvdb::v3_2_0::tools::internal::SeamWeights::QuantizedPointList()']]], + ['quatd',['Quatd',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a654db6f69ba779142505b111ec5728f9',1,'openvdb::v3_2_0::math']]], + ['quatr',['QuatR',['../namespaceopenvdb_1_1v3__2__0.html#a1e295ffc775b9956031b7867648cc215',1,'openvdb::v3_2_0']]], + ['quats',['Quats',['../namespaceopenvdb_1_1v3__2__0_1_1math.html#a9e15946d603c11211474397ac969f512',1,'openvdb::v3_2_0::math']]], + ['quatslist',['QuatsList',['../classopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFracture.html#a57c99a05d30f9adf92b2daec6728b191',1,'openvdb::v3_2_0::tools::LevelSetFracture']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_0.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_0.html new file mode 100644 index 00000000..2837a574 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_0.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_0.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_0.js new file mode 100644 index 00000000..dee18b47 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['a',['a',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1LinearOp.html#ae85d3e47bd936aeb234df3aa289ced21',1,'openvdb::v3_2_0::math::pcg::internal::LinearOp::a()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1DeterministicDotProductOp.html#a6f537013471eb17409fa5b460d94314a',1,'openvdb::v3_2_0::math::pcg::Vector::DeterministicDotProductOp::a()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#a3171b3ba3c059121ba36d93808b227ef',1,'openvdb::v3_2_0::tools::Film::RGBA::a()']]], + ['absoluteerror',['absoluteError',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1State.html#a07606f9b03cabe60801fc2684ce897b8',1,'openvdb::v3_2_0::math::pcg::State']]], + ['absval',['absVal',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMagnitude.html#a0cef15facea8711b1d27396a09f202d3',1,'openvdb::v3_2_0::tools::CheckMagnitude']]], + ['acc',['acc',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#a1ef2162c81dc225a01574be904c7c7b1',1,'openvdb::v3_2_0::tools::CheckNormGrad::acc()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#a1ef2162c81dc225a01574be904c7c7b1',1,'openvdb::v3_2_0::tools::CheckDivergence::acc()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter_1_1Filter_1_1Avg.html#a63ed1e6d36ddd8529aea18eb6e31dd4e',1,'openvdb::v3_2_0::tools::LevelSetFilter::Filter::Avg::acc()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#a3326e011578fd3070c7a33635e21ea6f',1,'openvdb::v3_2_0::tools::Morphology::LeafCache::acc()']]], + ['arraysize',['arraySize',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1DeterministicDotProductOp.html#a9130d627fc1e0525a206dfb291859f68',1,'openvdb::v3_2_0::math::pcg::Vector::DeterministicDotProductOp']]], + ['atree',['aTree',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CompReplaceOp.html#a42ba40f44264250becb19facf58e5408',1,'openvdb::v3_2_0::tools::CompReplaceOp']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_1.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_1.html new file mode 100644 index 00000000..6a866b1b --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_1.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_1.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_1.js new file mode 100644 index 00000000..8e7b67b2 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_1.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['b',['b',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1DeterministicDotProductOp.html#afc7b41e1e036f8d36d760b48809fe851',1,'openvdb::v3_2_0::math::pcg::Vector::DeterministicDotProductOp::b()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#ad3329878fc8080399ff8dafd492d3731',1,'openvdb::v3_2_0::tools::Film::RGBA::b()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy1.html#ab37e76e21ecce8fc4bda5b39d88701ec',1,'openvdb::v3_2_0::tree::InternalNode::TopologyCopy1::b()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyIntersection.html#ab37e76e21ecce8fc4bda5b39d88701ec',1,'openvdb::v3_2_0::tree::InternalNode::TopologyIntersection::b()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyDifference.html#ab37e76e21ecce8fc4bda5b39d88701ec',1,'openvdb::v3_2_0::tree::InternalNode::TopologyDifference::b()']]], + ['bd',['BD',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME.html#aa3a728f53e154e2df1ed5057809c1e7e',1,'openvdb::v3_2_0::math::BIAS_SCHEME::BD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01FIRST__BIAS_01_4.html#aa3a728f53e154e2df1ed5057809c1e7e',1,'openvdb::v3_2_0::math::BIAS_SCHEME< FIRST_BIAS >::BD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01SECOND__BIAS_01_4.html#aa3a728f53e154e2df1ed5057809c1e7e',1,'openvdb::v3_2_0::math::BIAS_SCHEME< SECOND_BIAS >::BD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01THIRD__BIAS_01_4.html#aa3a728f53e154e2df1ed5057809c1e7e',1,'openvdb::v3_2_0::math::BIAS_SCHEME< THIRD_BIAS >::BD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01WENO5__BIAS_01_4.html#aa3a728f53e154e2df1ed5057809c1e7e',1,'openvdb::v3_2_0::math::BIAS_SCHEME< WENO5_BIAS >::BD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01HJWENO5__BIAS_01_4.html#aa3a728f53e154e2df1ed5057809c1e7e',1,'openvdb::v3_2_0::math::BIAS_SCHEME< HJWENO5_BIAS >::BD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradientBiased.html#aa3a728f53e154e2df1ed5057809c1e7e',1,'openvdb::v3_2_0::math::ISGradientBiased::BD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradientNormSqrd.html#aa3a728f53e154e2df1ed5057809c1e7e',1,'openvdb::v3_2_0::math::ISGradientNormSqrd::BD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientNormSqrd.html#aa3a728f53e154e2df1ed5057809c1e7e',1,'openvdb::v3_2_0::math::GradientNormSqrd::BD()']]], + ['bincount',['binCount',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1DeterministicDotProductOp.html#a68c108b36c21ab6e67ee0838cdc15e5c',1,'openvdb::v3_2_0::math::pcg::Vector::DeterministicDotProductOp']]], + ['boundaryop',['boundaryOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1ISLaplacianOp.html#ac3c060e5a38b2898fcad772bf67934b6',1,'openvdb::v3_2_0::tools::poisson::internal::ISLaplacianOp']]], + ['bufpos',['bufpos',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1FileInfo.html#a4b14a68968aec230d7d4287a5b4b8b69',1,'openvdb::v3_2_0::tree::LeafNode::FileInfo']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_10.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_10.html new file mode 100644 index 00000000..552cc461 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_10.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_10.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_10.js new file mode 100644 index 00000000..cb35bca6 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_10.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['v',['v',['../structopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Fill.html#a3efae0f277f4e78cc0a6cb2bae75d24f',1,'openvdb::v3_2_0::util::PagedArray::Fill']]], + ['val',['val',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1FillOp.html#a0ae7fd0420096516284bce77e9cc8407',1,'openvdb::v3_2_0::math::pcg::internal::FillOp::val()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1MinOp.html#a4f2c20cf054c2c29fe71a612998129de',1,'openvdb::v3_2_0::tools::valxform::MinOp::val()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1MaxOp.html#a4f2c20cf054c2c29fe71a612998129de',1,'openvdb::v3_2_0::tools::valxform::MaxOp::val()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1SumOp.html#a4f2c20cf054c2c29fe71a612998129de',1,'openvdb::v3_2_0::tools::valxform::SumOp::val()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1valxform_1_1MultOp.html#a4f2c20cf054c2c29fe71a612998129de',1,'openvdb::v3_2_0::tools::valxform::MultOp::val()']]], + ['value',['value',['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_linear::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01AffineMap_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_linear< AffineMap >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01ScaleMap_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_linear< ScaleMap >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01UniformScaleMap_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_linear< UniformScaleMap >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01UnitaryMap_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_linear< UnitaryMap >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01TranslationMap_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_linear< TranslationMap >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01ScaleTranslateMap_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_linear< ScaleTranslateMap >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01UniformScaleTranslateMap_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_linear< UniformScaleTranslateMap >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__linear_3_01CompoundMap_3_01T1_00_01T2_01_4_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_linear< CompoundMap< T1, T2 > >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__uniform__scale.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_uniform_scale::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__uniform__scale_3_01UniformScaleMap_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_uniform_scale< UniformScaleMap >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__uniform__scale__translate.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_uniform_scale_translate::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__uniform__scale__translate_3_01TranslationMap_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_uniform_scale_translate< TranslationMap >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__uniform__scale__translate_3_01UniformScaleTranslateMap_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_uniform_scale_translate< UniformScaleTranslateMap >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__scale.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_scale::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__scale_3_01ScaleMap_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_scale< ScaleMap >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__scale__translate.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_scale_translate::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__scale__translate_3_01ScaleTranslateMap_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_scale_translate< ScaleTranslateMap >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__uniform__diagonal__jacobian.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_uniform_diagonal_jacobian::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__diagonal__jacobian.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_diagonal_jacobian::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__vec3d.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_vec3d::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__vec3d_3_01Vec3d_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_vec3d< Vec3d >::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__double.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_double::value()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1is__double_3_01double_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::math::is_double< double >::value()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameLeafConfig_3_01Dim1_00_01openvdb_1_1tools_1_1PointIndex81825ed065985d5c1a4f0ecf51aab07a.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::tree::SameLeafConfig< Dim1, openvdb::tools::PointIndexLeafNode< T2, Dim1 > >::value()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1SameConfiguration.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::tree::InternalNode::SameConfiguration::value()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameInternalConfig.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::tree::SameInternalConfig::value()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameInternalConfig_3_01ChildT1_00_01Dim1_00_01InternalNode_3_01ChildT2_00_01Dim1_01_4_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::tree::SameInternalConfig< ChildT1, Dim1, InternalNode< ChildT2, Dim1 > >::value()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1SameConfiguration.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::tree::LeafNode::SameConfiguration::value()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameLeafConfig.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::tree::SameLeafConfig::value()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameLeafConfig_3_01Dim1_00_01LeafNode_3_01T2_00_01Dim1_01_4_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::tree::SameLeafConfig< Dim1, LeafNode< T2, Dim1 > >::value()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1SameConfiguration.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::SameConfiguration::value()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1SameConfiguration.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::SameConfiguration::value()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01false_00_01ValueT_00_01ChildT_01_4.html#a0bd8e8b76a16eb8c0d32d42313755c8e',1,'openvdb::v3_2_0::tree::NodeUnionImpl< false, ValueT, ChildT >::value()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01true_00_01ValueT_00_01ChildT_01_4.html#a3ca69d875de534c2e6495bce613700c1',1,'openvdb::v3_2_0::tree::NodeUnionImpl< true, ValueT, ChildT >::value()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1RootNode_1_1SameConfiguration.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::tree::RootNode::SameConfiguration::value()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameRootConfig.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::tree::SameRootConfig::value()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1SameRootConfig_3_01ChildT1_00_01RootNode_3_01ChildT2_01_4_01_4.html#a11ddd051208250c32dc4985abcafa86d',1,'openvdb::v3_2_0::tree::SameRootConfig< ChildT1, RootNode< ChildT2 > >::value()']]], + ['vector',['vector',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyToVecOp.html#a907a80a97d2e386b5fb2eca2fa073340',1,'openvdb::v3_2_0::tools::poisson::internal::CopyToVecOp::vector()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyFromVecOp.html#a1815c69bebb68acdfcad1909149ec203',1,'openvdb::v3_2_0::tools::poisson::internal::CopyFromVecOp::vector()']]], + ['visited',['visited',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1NodeMaskSegment.html#a1df99df902f5f6e81ec3e21e9c07360e',1,'openvdb::v3_2_0::tools::level_set_util_internal::NodeMaskSegment']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_11.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_11.html new file mode 100644 index 00000000..166f676a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_11.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_11.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_11.js new file mode 100644 index 00000000..7aabd639 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_11.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['width',['width',['../structopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter_1_1Filter_1_1Avg.html#aead35c445a85f61ef3de500997ed4f68',1,'openvdb::v3_2_0::tools::LevelSetFilter::Filter::Avg']]], + ['word_5fcount',['WORD_COUNT',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#a26a37533c0026ba68db9b8698868fce0',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::WORD_COUNT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4_1_1Buffer.html#a26a37533c0026ba68db9b8698868fce0',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::Buffer::WORD_COUNT()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4_1_1Buffer.html#a26a37533c0026ba68db9b8698868fce0',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::Buffer::WORD_COUNT()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a53a566358b65c3373774eed86a7619be',1,'openvdb::v3_2_0::util::NodeMask::WORD_COUNT()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a53a566358b65c3373774eed86a7619be',1,'openvdb::v3_2_0::util::NodeMask< 1 >::WORD_COUNT()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a53a566358b65c3373774eed86a7619be',1,'openvdb::v3_2_0::util::NodeMask< 2 >::WORD_COUNT()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_12.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_12.html new file mode 100644 index 00000000..a772f50c --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_12.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_12.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_12.js new file mode 100644 index 00000000..d93e1806 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_12.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['x',['x',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1LinearOp.html#ab9f2b95fd91746a7f5b8d8ad736e0d16',1,'openvdb::v3_2_0::math::pcg::internal::LinearOp::x()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband_1_1Fragment.html#a73795e333468c9f6a9699b7d4a0a36f1',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::Fragment::x()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_13.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_13.html new file mode 100644 index 00000000..c025a384 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_13.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_13.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_13.js new file mode 100644 index 00000000..b485421a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_13.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['y',['y',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1LinearOp.html#a7f08e2f399bb9a8d9888eaed97d8e218',1,'openvdb::v3_2_0::math::pcg::internal::LinearOp::y()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband_1_1Fragment.html#a240bd7293d6bf140375a9d7d2567938c',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::Fragment::y()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_14.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_14.html new file mode 100644 index 00000000..cd7fff8f --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_14.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_14.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_14.js new file mode 100644 index 00000000..4a5eec4a --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_14.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['z',['z',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband_1_1Fragment.html#a236b43e6ea858cfc3256afdebf1f6d31',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::Fragment']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_2.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_2.html new file mode 100644 index 00000000..3115f99e --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_2.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_2.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_2.js new file mode 100644 index 00000000..19bbe9de --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_2.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['child',['child',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01false_00_01ValueT_00_01ChildT_01_4.html#a929f8b62da5b9d241a3a9661b6ce7768',1,'openvdb::v3_2_0::tree::NodeUnionImpl< false, ValueT, ChildT >::child()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeUnionImpl_3_01true_00_01ValueT_00_01ChildT_01_4.html#a929f8b62da5b9d241a3a9661b6ce7768',1,'openvdb::v3_2_0::tree::NodeUnionImpl< true, ValueT, ChildT >::child()']]], + ['connections',['connections',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1NodeMaskSegment.html#ac9926163402c881a0cbc5da7ea953a0b',1,'openvdb::v3_2_0::tools::level_set_util_internal::NodeMaskSegment']]], + ['coord_5foffsets',['COORD_OFFSETS',['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a04f6be1271dd40cd85a3b5a4d845c340',1,'openvdb::v3_2_0::util']]], + ['count',['count',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1LeafCountOp.html#a39aed3647004507f1b8240a8a7c731dc',1,'openvdb::v3_2_0::tools::poisson::internal::LeafCountOp::count()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1LeafIndexOp.html#abcaf6868c0c14f0804605749fca6978a',1,'openvdb::v3_2_0::tools::poisson::internal::LeafIndexOp::count()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_3.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_3.html new file mode 100644 index 00000000..b2941ee6 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_3.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_3.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_3.js new file mode 100644 index 00000000..14457498 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_3.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['d',['d',['../structopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Fill.html#a1366435d7d5a045ddaa682effe7ac374',1,'openvdb::v3_2_0::util::PagedArray::Fill']]], + ['data',['data',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1FillOp.html#ac88dceffbecaed1137b0e27783adbcc5',1,'openvdb::v3_2_0::math::pcg::internal::FillOp::data()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1InfNormOp.html#a13924c1d5f2db40d873e0a808bb89b68',1,'openvdb::v3_2_0::math::pcg::Vector::InfNormOp::data()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1IsFiniteOp.html#a13924c1d5f2db40d873e0a808bb89b68',1,'openvdb::v3_2_0::math::pcg::Vector::IsFiniteOp::data()']]], + ['default_5fcapacity',['DEFAULT_CAPACITY',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a016e92e197533d47412d07329bd24ec7',1,'openvdb::v3_2_0::io::Queue']]], + ['default_5fcompression_5fflags',['DEFAULT_COMPRESSION_FLAGS',['../classopenvdb_1_1v3__2__0_1_1io_1_1Archive.html#a2aaced0ac95e38fb1b8efa0211d67532',1,'openvdb::v3_2_0::io::Archive']]], + ['default_5ftimeout',['DEFAULT_TIMEOUT',['../classopenvdb_1_1v3__2__0_1_1io_1_1Queue.html#a9da65584b3e3b8f4fb79b1ceb99cb901',1,'openvdb::v3_2_0::io::Queue']]], + ['depth',['DEPTH',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#a33812eef2746f526e18a7d13ad9d0eb3',1,'openvdb::v3_2_0::tree::LeafManager::DEPTH()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a33812eef2746f526e18a7d13ad9d0eb3',1,'openvdb::v3_2_0::tree::Tree::DEPTH()']]], + ['dim',['DIM',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a785cb9180680cc5b0dcb6efac36579c7',1,'openvdb::v3_2_0::tree::InternalNode::DIM()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a785cb9180680cc5b0dcb6efac36579c7',1,'openvdb::v3_2_0::tree::LeafNode::DIM()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a785cb9180680cc5b0dcb6efac36579c7',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::DIM()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a785cb9180680cc5b0dcb6efac36579c7',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::DIM()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a8db21c605cfb673d79c36ff2884c6387',1,'openvdb::v3_2_0::util::NodeMask::DIM()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a8db21c605cfb673d79c36ff2884c6387',1,'openvdb::v3_2_0::util::NodeMask< 1 >::DIM()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a8db21c605cfb673d79c36ff2884c6387',1,'openvdb::v3_2_0::util::NodeMask< 2 >::DIM()']]], + ['dist',['dist',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband_1_1Fragment.html#aa2ebdd6fd2366762c5554ba197c40a02',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::Fragment']]], + ['distacc',['distAcc',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#a9106117996882c042c7f682ef076f0b7',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData']]], + ['disttree',['distTree',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#ac380eb87f8a6061519cd8fecedcb620e',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_4.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_4.html new file mode 100644 index 00000000..e14a4ffc --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_4.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_4.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_4.js new file mode 100644 index 00000000..20d7121d --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_4.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['fd',['FD',['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME.html#a77eb9d5341b3d8fc4e23bf0b5947c0a7',1,'openvdb::v3_2_0::math::BIAS_SCHEME::FD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01FIRST__BIAS_01_4.html#a77eb9d5341b3d8fc4e23bf0b5947c0a7',1,'openvdb::v3_2_0::math::BIAS_SCHEME< FIRST_BIAS >::FD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01SECOND__BIAS_01_4.html#a77eb9d5341b3d8fc4e23bf0b5947c0a7',1,'openvdb::v3_2_0::math::BIAS_SCHEME< SECOND_BIAS >::FD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01THIRD__BIAS_01_4.html#a77eb9d5341b3d8fc4e23bf0b5947c0a7',1,'openvdb::v3_2_0::math::BIAS_SCHEME< THIRD_BIAS >::FD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01WENO5__BIAS_01_4.html#a77eb9d5341b3d8fc4e23bf0b5947c0a7',1,'openvdb::v3_2_0::math::BIAS_SCHEME< WENO5_BIAS >::FD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1BIAS__SCHEME_3_01HJWENO5__BIAS_01_4.html#a77eb9d5341b3d8fc4e23bf0b5947c0a7',1,'openvdb::v3_2_0::math::BIAS_SCHEME< HJWENO5_BIAS >::FD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradientBiased.html#a77eb9d5341b3d8fc4e23bf0b5947c0a7',1,'openvdb::v3_2_0::math::ISGradientBiased::FD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1ISGradientNormSqrd.html#a77eb9d5341b3d8fc4e23bf0b5947c0a7',1,'openvdb::v3_2_0::math::ISGradientNormSqrd::FD()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1GradientNormSqrd.html#a77eb9d5341b3d8fc4e23bf0b5947c0a7',1,'openvdb::v3_2_0::math::GradientNormSqrd::FD()']]], + ['first',['first',['../structopenvdb_1_1v3__2__0_1_1VersionId.html#a278eb73b0cdb4b6029426dbd091b643f',1,'openvdb::v3_2_0::VersionId']]], + ['frac',['frac',['../structopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetFilter_1_1Filter_1_1Avg.html#acec7f06014438557c76e42134a4b1584',1,'openvdb::v3_2_0::tools::LevelSetFilter::Filter::Avg']]], + ['from',['from',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1CopyOp.html#ac0b6a2034684c625672aa10f55c9ba5d',1,'openvdb::v3_2_0::math::pcg::internal::CopyOp::from()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1MatrixCopyOp.html#a632c425b08ce90158e9fd9c9ae82a236',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::MatrixCopyOp::from()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_5.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_5.html new file mode 100644 index 00000000..ee6461cb --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_5.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_5.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_5.js new file mode 100644 index 00000000..dbf32118 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_5.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['g',['g',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#a2f7de5360e6a7a324e6727df48028058',1,'openvdb::v3_2_0::tools::Film::RGBA']]], + ['getvalue',['getValue',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1StatsOp.html#a9e5447b81a174353f70817eaa64e4dfd',1,'openvdb::v3_2_0::tools::stats_internal::StatsOp::getValue()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1HistOp.html#a9e5447b81a174353f70817eaa64e4dfd',1,'openvdb::v3_2_0::tools::stats_internal::HistOp::getValue()']]], + ['grainsize',['grainSize',['../structopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker_1_1State.html#a887606cb7c0d8e19afb1a67ac7293519',1,'openvdb::v3_2_0::tools::LevelSetTracker::State']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_6.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_6.html new file mode 100644 index 00000000..9b457a20 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_6.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_6.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_6.js new file mode 100644 index 00000000..d55a2141 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['hist',['hist',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1HistOp.html#afdc47db672e1b0d0f2785733f3559fc1',1,'openvdb::v3_2_0::tools::stats_internal::HistOp']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_7.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_7.html new file mode 100644 index 00000000..aae170d5 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_7.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_7.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_7.js new file mode 100644 index 00000000..97c4cd09 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_7.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['idx',['idx',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ExpandNarrowband_1_1Fragment.html#aec10b44dd7a1095e58ccfa0929fd0da9',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ExpandNarrowband::Fragment']]], + ['idxtree',['idxTree',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1ISLaplacianOp.html#ad47e4e816ddefd1db62622dbc5b7c552',1,'openvdb::v3_2_0::tools::poisson::internal::ISLaplacianOp']]], + ['indexacc',['indexAcc',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#a24023a8a2fb6a0cff9833374ee7153cb',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData']]], + ['indextree',['indexTree',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#a1ae9d3bcc7780a76cdf6c48bd0fc0419',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData']]], + ['init',['init',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1Neighbor.html#a50300ba6e38ec30121edcc07ebac42c6',1,'openvdb::v3_2_0::tools::Morphology::Neighbor']]], + ['interiormask',['interiorMask',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1ISLaplacianOp.html#a2347ac76b741224c4d5dcd211b0a473a',1,'openvdb::v3_2_0::tools::poisson::internal::ISLaplacianOp']]], + ['invalid_5fidx',['INVALID_IDX',['../namespaceopenvdb_1_1v3__2__0_1_1util.html#a64406e5329e76b683c1af3b539095e35',1,'openvdb::v3_2_0::util']]], + ['invdx',['invdx',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#aaa664a886f6602c4ef89fe57c703ccb9',1,'openvdb::v3_2_0::tools::CheckDivergence']]], + ['invdx2',['invdx2',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#adeeaa84fce7ecd05b231df73ec704a2d',1,'openvdb::v3_2_0::tools::CheckNormGrad']]], + ['invmat',['invMat',['../structopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer_1_1MatrixTransform.html#a564886cdd8f123501134b040da23824b',1,'openvdb::v3_2_0::tools::GridTransformer::MatrixTransform']]], + ['isconsttree',['IsConstTree',['../structopenvdb_1_1v3__2__0_1_1tree_1_1leafmgr_1_1TreeTraits.html#aed029134efd058169d0a0d3cae1c6f32',1,'openvdb::v3_2_0::tree::leafmgr::TreeTraits::IsConstTree()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1leafmgr_1_1TreeTraits_3_01const_01TreeT_01_4.html#aed029134efd058169d0a0d3cae1c6f32',1,'openvdb::v3_2_0::tree::leafmgr::TreeTraits< const TreeT >::IsConstTree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafManager.html#aed029134efd058169d0a0d3cae1c6f32',1,'openvdb::v3_2_0::tree::LeafManager::IsConstTree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html#aed029134efd058169d0a0d3cae1c6f32',1,'openvdb::v3_2_0::tree::ValueAccessorBase::IsConstTree()']]], + ['isdenseiterator',['IsDenseIterator',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#a613fb4feec64df5531f23ca51f014a16',1,'openvdb::v3_2_0::tree::SparseIteratorBase::IsDenseIterator()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a613fb4feec64df5531f23ca51f014a16',1,'openvdb::v3_2_0::tree::DenseIteratorBase::IsDenseIterator()']]], + ['ison',['isOn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1Neighbor.html#ae530c5af75c42fc2bd1fb588c38aa332',1,'openvdb::v3_2_0::tools::Morphology::Neighbor']]], + ['issparseiterator',['IsSparseIterator',['../structopenvdb_1_1v3__2__0_1_1tree_1_1SparseIteratorBase.html#a60f03f7ddff0699d38a58e1038d44b99',1,'openvdb::v3_2_0::tree::SparseIteratorBase::IsSparseIterator()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1DenseIteratorBase.html#a60f03f7ddff0699d38a58e1038d44b99',1,'openvdb::v3_2_0::tree::DenseIteratorBase::IsSparseIterator()']]], + ['isvec',['IsVec',['../structopenvdb_1_1v3__2__0_1_1VecTraits.html#a9245bd630c2aa374c09b0e04fa6d718f',1,'openvdb::v3_2_0::VecTraits::IsVec()'],['../structopenvdb_1_1v3__2__0_1_1VecTraits_3_01math_1_1Vec2_3_01T_01_4_01_4.html#a9245bd630c2aa374c09b0e04fa6d718f',1,'openvdb::v3_2_0::VecTraits< math::Vec2< T > >::IsVec()'],['../structopenvdb_1_1v3__2__0_1_1VecTraits_3_01math_1_1Vec3_3_01T_01_4_01_4.html#a9245bd630c2aa374c09b0e04fa6d718f',1,'openvdb::v3_2_0::VecTraits< math::Vec3< T > >::IsVec()'],['../structopenvdb_1_1v3__2__0_1_1VecTraits_3_01math_1_1Vec4_3_01T_01_4_01_4.html#a9245bd630c2aa374c09b0e04fa6d718f',1,'openvdb::v3_2_0::VecTraits< math::Vec4< T > >::IsVec()']]], + ['iterations',['iterations',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1State.html#a1d10e252e778731e59f0f71afd7e727e',1,'openvdb::v3_2_0::math::pcg::State']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_8.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_8.html new file mode 100644 index 00000000..7d96ca32 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_8.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_8.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_8.js new file mode 100644 index 00000000..ba41d216 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_8.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['laplacian',['laplacian',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1ISLaplacianOp.html#a5d41c45c1fe61f0531f15ae0faca8ee6',1,'openvdb::v3_2_0::tools::poisson::internal::ISLaplacianOp']]], + ['leaf',['leaf',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1Neighbor.html#a3d446c9884a43d26b5913e37f8acc0cc',1,'openvdb::v3_2_0::tools::Morphology::Neighbor']]], + ['leaf_5fdepth',['LEAF_DEPTH',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#ad6a3a64a75bc299bc4544a701425d08d',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::LEAF_DEPTH()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#ad6a3a64a75bc299bc4544a701425d08d',1,'openvdb::v3_2_0::tree::NodeIteratorBase::LEAF_DEPTH()']]], + ['leaf_5fdim',['LEAF_DIM',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#acd3ca1285aa143fa86e20aaf73b32481',1,'openvdb::v3_2_0::tools::Morphology']]], + ['leaf_5flevel',['LEAF_LEVEL',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a3361c3abbeff052681dab2111b72e451',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::LEAF_LEVEL()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a3361c3abbeff052681dab2111b72e451',1,'openvdb::v3_2_0::tree::NodeIteratorBase::LEAF_LEVEL()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#a3361c3abbeff052681dab2111b72e451',1,'openvdb::v3_2_0::tree::LeafIteratorBase::LEAF_LEVEL()']]], + ['leaf_5flog2dim',['LEAF_LOG2DIM',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#afca1658ff1c574903574c49ff21e1628',1,'openvdb::v3_2_0::tools::Morphology']]], + ['leaf_5fparent_5flevel',['LEAF_PARENT_LEVEL',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#a13a703a994565b187e092d5a9f731b6e',1,'openvdb::v3_2_0::tree::LeafIteratorBase']]], + ['leafs',['leafs',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#a509aae5cab71356b065df391c9f85106',1,'openvdb::v3_2_0::tools::Morphology::LeafCache']]], + ['level',['LEVEL',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a7efd456219bae7db497d009ad92961a7',1,'openvdb::v3_2_0::tree::InternalNode::LEVEL()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a7efd456219bae7db497d009ad92961a7',1,'openvdb::v3_2_0::tree::LeafNode::LEVEL()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a7efd456219bae7db497d009ad92961a7',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LEVEL()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a7efd456219bae7db497d009ad92961a7',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LEVEL()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1RootNode.html#a7efd456219bae7db497d009ad92961a7',1,'openvdb::v3_2_0::tree::RootNode::LEVEL()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem.html#a5ff2bc5b629e55b486f6d711a80c39e3',1,'openvdb::v3_2_0::tree::IterListItem::Level()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_01VecSize_00_010U_01_4.html#a5ff2bc5b629e55b486f6d711a80c39e3',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, VecSize, 0U >::Level()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1IterListItem_3_01PrevItemT_00_01NodeVecT_00_011_00_01__Level_01_4.html#a5ff2bc5b629e55b486f6d711a80c39e3',1,'openvdb::v3_2_0::tree::IterListItem< PrevItemT, NodeVecT, 1, _Level >::Level()']]], + ['level_5fset_5fhalf_5fwidth',['LEVEL_SET_HALF_WIDTH',['../namespaceopenvdb_1_1v3__2__0.html#a04f60dd7b4a065a54f873613ff8df50f',1,'openvdb::v3_2_0']]], + ['levels',['LEVELS',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#a9dceb61c091a4eefa6ac859253f22ec6',1,'openvdb::v3_2_0::tree::NodeManager::LEVELS()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#a9dceb61c091a4eefa6ac859253f22ec6',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::LEVELS()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a9dceb61c091a4eefa6ac859253f22ec6',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::LEVELS()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a9dceb61c091a4eefa6ac859253f22ec6',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::LEVELS()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a9dceb61c091a4eefa6ac859253f22ec6',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::LEVELS()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a9dceb61c091a4eefa6ac859253f22ec6',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::LEVELS()']]], + ['log2dim',['LOG2DIM',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#acbde5e0147479268c2f56863eb0c2775',1,'openvdb::v3_2_0::tree::InternalNode::LOG2DIM()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#acbde5e0147479268c2f56863eb0c2775',1,'openvdb::v3_2_0::tree::LeafNode::LOG2DIM()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#acbde5e0147479268c2f56863eb0c2775',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::LOG2DIM()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#acbde5e0147479268c2f56863eb0c2775',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::LOG2DIM()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#ac830c7465e47c88b5577127b866612de',1,'openvdb::v3_2_0::util::NodeMask::LOG2DIM()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#ac830c7465e47c88b5577127b866612de',1,'openvdb::v3_2_0::util::NodeMask< 1 >::LOG2DIM()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#ac830c7465e47c88b5577127b866612de',1,'openvdb::v3_2_0::util::NodeMask< 2 >::LOG2DIM()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_9.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_9.html new file mode 100644 index 00000000..29d10923 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_9.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_9.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_9.js new file mode 100644 index 00000000..d5dfc237 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_9.js @@ -0,0 +1,153 @@ +var searchData= +[ + ['macc',['mAcc',['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html#a1a292a5ddbcfb770da1cf4957425375c',1,'openvdb::v3_2_0::tools::gridop::GridOperator::mAcc()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#ac71827fa0d54c92ffc308bdb2ad36de2',1,'openvdb::v3_2_0::tools::AlphaMask::mAcc()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#ae4dded66913cf50b19f71f9e19fc43f3',1,'openvdb::v3_2_0::tools::Morphology::mAcc()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1MathOp.html#af6a752e59fbae92fbb9ba6775344c41a',1,'openvdb::v3_2_0::tools::stats_internal::MathOp::mAcc()']]], + ['maccessorregistry',['mAccessorRegistry',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a3f395a4d4c40770f12f1ac8e08fdfbda',1,'openvdb::v3_2_0::tree::Tree']]], + ['mactive',['mActive',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TileSampler.html#ab582c8b862d2c49ab3ad21ac7b036500',1,'openvdb::v3_2_0::tools::internal::TileSampler']]], + ['mainside',['mAInside',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CsgVisitorBase.html#a7670e7ec412be012579e7a593f058254',1,'openvdb::v3_2_0::tools::CsgVisitorBase']]], + ['maisactive',['mAIsActive',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a3d1d419081544f085c4fc0812b7ac3e8',1,'openvdb::v3_2_0::CombineArgs']]], + ['maoutside',['mAOutside',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CsgVisitorBase.html#a719680952f5df1f678d932bbb022d3ad',1,'openvdb::v3_2_0::tools::CsgVisitorBase']]], + ['map',['map',['../structopenvdb_1_1v3__2__0_1_1math_1_1MapAdapter.html#a9b1a727d69fd9d9c45c0f3ab0fff6e71',1,'openvdb::v3_2_0::math::MapAdapter']]], + ['mapping',['mapping',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1FileInfo.html#a57817a76da1bb7e5e2a59566e2327cc2',1,'openvdb::v3_2_0::tree::LeafNode::FileInfo']]], + ['marray',['mArray',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1FillArray.html#a3e22c506f2c60985d7db112fa5cae72d',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::FillArray']]], + ['mask',['Mask',['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html#ac22eeebbaa29b22b84aa84986293f93e',1,'openvdb::v3_2_0::util::PagedArray::Page::Mask()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1NodeMaskSegment.html#a73814dcc88ab963bcfa5be183e8e5e9a',1,'openvdb::v3_2_0::tools::level_set_util_internal::NodeMaskSegment::mask()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#aaa4dd9913464ea4acba910ae525063a3',1,'openvdb::v3_2_0::tools::Morphology::LeafCache::mask()']]], + ['maskpos',['maskpos',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1FileInfo.html#aa0c1a143d5f7ab4615d6c4f965bda03e',1,'openvdb::v3_2_0::tree::LeafNode::FileInfo']]], + ['mat',['mat',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1IsFiniteOp.html#a430358b3f5d69a38e10a0813028701e6',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::IsFiniteOp::mat()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1GridTransformer_1_1MatrixTransform.html#aa8607ea054820d2ac22cd3ba6d23aabc',1,'openvdb::v3_2_0::tools::GridTransformer::MatrixTransform::mat()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1HomogeneousMatMul.html#a5c83e050fc2b2e0f06288f74cde5d715',1,'openvdb::v3_2_0::tools::HomogeneousMatMul::mat()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MatMul.html#a5c83e050fc2b2e0f06288f74cde5d715',1,'openvdb::v3_2_0::tools::MatMul::mat()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MatMulNormalize.html#a5c83e050fc2b2e0f06288f74cde5d715',1,'openvdb::v3_2_0::tools::MatMulNormalize::mat()']]], + ['maux',['mAux',['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#ad1c8e51baddccfaff6f4be858336922c',1,'openvdb::v3_2_0::math::Stats']]], + ['mavalptr',['mAValPtr',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a582ffe7c91b905f25a55d9ca15b347f0',1,'openvdb::v3_2_0::CombineArgs']]], + ['mavg',['mAvg',['../classopenvdb_1_1v3__2__0_1_1math_1_1Stats.html#a1d259d725d0ba5bc05cbfd03a4dd17df',1,'openvdb::v3_2_0::math::Stats']]], + ['maxradius',['maxRadius',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1ComputeExtremas.html#a801c0f15883bbe3e5bed85a23b0225cd',1,'openvdb::v3_2_0::tools::particle_atlas_internal::ComputeExtremas']]], + ['maxval',['maxVal',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckRange.html#aa412993556cc23295151aa98653affff',1,'openvdb::v3_2_0::tools::CheckRange::maxVal()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMax.html#aa412993556cc23295151aa98653affff',1,'openvdb::v3_2_0::tools::CheckMax::maxVal()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#a88cc619226eda30a511d48fcb571bb53',1,'openvdb::v3_2_0::tools::CheckEikonal::maxVal()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#a88cc619226eda30a511d48fcb571bb53',1,'openvdb::v3_2_0::tools::CheckDivergence::maxVal()']]], + ['maxval2',['maxVal2',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#a7ec78e64657f41d360ed29ce991ec82f',1,'openvdb::v3_2_0::tools::CheckNormGrad']]], + ['maxvalue',['maxValue',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__fracture__internal_1_1FindMinMaxVoxelValue.html#ad3aa7702330e578d4c8045f8442329af',1,'openvdb::v3_2_0::tools::level_set_fracture_internal::FindMinMaxVoxelValue']]], + ['mbbox',['mBBox',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutZYX_01_4.html#a6104949c915033a80c0d4d19b00196b1',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutZYX >::mBBox()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutXYZ_01_4.html#a6104949c915033a80c0d4d19b00196b1',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutXYZ >::mBBox()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TileSampler.html#a8a55455c4a195847d52c35d3653f847b',1,'openvdb::v3_2_0::tools::internal::TileSampler::mBBox()']]], + ['mbinlog2dim',['mBinLog2Dim',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#ab3f8377663d15c7946dc0e17f0ce6b33',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp']]], + ['mbinside',['mBInside',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CsgVisitorBase.html#a9b2ce814dc63f3caba5fa8f36c51c79b',1,'openvdb::v3_2_0::tools::CsgVisitorBase']]], + ['mbinvolume',['mBinVolume',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1OrderSegmentsOp.html#a3bbe791d9838e148641ae59ccbabc9dd',1,'openvdb::v3_2_0::tools::point_partitioner_internal::OrderSegmentsOp']]], + ['mbisactive',['mBIsActive',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a5e19ace3e015e8b5fbd47314c679d607',1,'openvdb::v3_2_0::CombineArgs']]], + ['mbits',['mBits',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a02e3e9b56bc571ec5dceaecbc9418997',1,'openvdb::v3_2_0::util::RootNodeMask']]], + ['mbitsize',['mBitSize',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a608023362640c73576339e9e3bb7afb4',1,'openvdb::v3_2_0::util::RootNodeMask::mBitSize()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#a608023362640c73576339e9e3bb7afb4',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::mBitSize()']]], + ['mblind',['mBlind',['../ParticlesToLevelSet_8h.html#aec9cfef65559465f147bfbb5474d64a4',1,'ParticlesToLevelSet.h']]], + ['mboutside',['mBOutside',['../classopenvdb_1_1v3__2__0_1_1tools_1_1CsgVisitorBase.html#a90d42a2c43f9439e6706009e92b02926',1,'openvdb::v3_2_0::tools::CsgVisitorBase']]], + ['mbucketcounters',['mBucketCounters',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1ComputePointOrderOp.html#ab779e5caedc8e27b8e6c76a25d9a83eb',1,'openvdb::v3_2_0::tools::point_partitioner_internal::ComputePointOrderOp']]], + ['mbucketlog2dim',['mBucketLog2Dim',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#a136eab5a30bdea28bf96e6be5d5b39d8',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp']]], + ['mbucketoffsets',['mBucketOffsets',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1ComputePointOrderOp.html#a0f62e99677d7e63ef7473512f03cd48a',1,'openvdb::v3_2_0::tools::point_partitioner_internal::ComputePointOrderOp']]], + ['mbuffer',['mBuffer',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a5d0b20ac855d21274cac7f4e614d839d',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::mBuffer()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a5d0b20ac855d21274cac7f4e614d839d',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::mBuffer()']]], + ['mbvalptr',['mBValPtr',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a7dcde5b4a8694c24daf3098a22cee2eb',1,'openvdb::v3_2_0::CombineArgs']]], + ['mcache',['mCache',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a5f858d23895d634f4d57bfee7d2dbc1f',1,'openvdb::v3_2_0::math::BaseStencil']]], + ['mcenter',['mCenter',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a8e5a2cd3040e6b36ea7e4cf2fbb4ed6e',1,'openvdb::v3_2_0::math::BaseStencil']]], + ['mchain',['mChain',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#afac226eb43df0ebcd040f11d7cf7051d',1,'openvdb::v3_2_0::tree::NodeManager']]], + ['mchangednodemask',['mChangedNodeMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedFillExteriorSign.html#a42705528b2aaf4b824e966030d1ff99a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedFillExteriorSign::mChangedNodeMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SyncVoxelMask.html#acc273cc6932d511689f186b8a92dde3b',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SyncVoxelMask::mChangedNodeMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html#a42705528b2aaf4b824e966030d1ff99a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedPoints::mChangedNodeMask()']]], + ['mchangedvoxelmask',['mChangedVoxelMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SyncVoxelMask.html#aafee84b4d68b1453eb26f8e3482fe74e',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SyncVoxelMask::mChangedVoxelMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html#aafee84b4d68b1453eb26f8e3482fe74e',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedPoints::mChangedVoxelMask()']]], + ['mchildmask',['mChildMask',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a2d63b70c1831dd29d599480c447d8015',1,'openvdb::v3_2_0::tree::InternalNode']]], + ['mconnectivity',['mConnectivity',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html#af65e6b27417b414b0ad8c2c986538be7',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedPoints']]], + ['mconstaccessorregistry',['mConstAccessorRegistry',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a134837ab866ef110faba3311e77acd2b',1,'openvdb::v3_2_0::tree::Tree']]], + ['mcoordinates',['mCoordinates',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1StashOriginAndStoreOffset.html#a39dcbc1325a02ce04c017cda1ca5087c',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::StashOriginAndStoreOffset::mCoordinates()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RestoreOrigin.html#a2f3bc50fa50bd33209a17de2bb5b8a91',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RestoreOrigin::mCoordinates()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1LeafNodeOriginOp.html#a39dcbc1325a02ce04c017cda1ca5087c',1,'openvdb::v3_2_0::tools::point_partitioner_internal::LeafNodeOriginOp::mCoordinates()']]], + ['mcountarray',['mCountArray',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ComputeActiveVoxelCount.html#a73e717e857d75a75233cfaf4d8687e83',1,'openvdb::v3_2_0::tools::level_set_util_internal::ComputeActiveVoxelCount::mCountArray()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1GreaterCount.html#a2bd9d76ae84239b7df79f2f0efdcf78c',1,'openvdb::v3_2_0::tools::level_set_util_internal::GreaterCount::mCountArray()']]], + ['mdata',['mData',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#aff418187195521a0d255ee833666d892',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp::mData()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#a50ddca5b92e4d145f0bd6f1309c10142',1,'openvdb::v3_2_0::tree::LeafNode::Buffer::mData()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html#a5272dee6af3c9c095cd1f12f7b151201',1,'openvdb::v3_2_0::util::PagedArray::Page::mData()']]], + ['mdisttree',['mDistTree',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RemoveSelfIntersectingSurface.html#a34ee2fa9f3c11287bd1b96c4d3177606',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RemoveSelfIntersectingSurface']]], + ['mempty',['mEmpty',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TileSampler.html#a8b31290890664f24c4a438328f21b45f',1,'openvdb::v3_2_0::tools::internal::TileSampler']]], + ['meta',['meta',['../structopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1FileInfo.html#a05da3de2d0117d8c6c94bead008b1d01',1,'openvdb::v3_2_0::tree::LeafNode::FileInfo']]], + ['meta_5ffile_5fbbox_5fmax',['META_FILE_BBOX_MAX',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a19d9339054141127b21cad1c44d09b6b',1,'openvdb::v3_2_0::GridBase']]], + ['meta_5ffile_5fbbox_5fmin',['META_FILE_BBOX_MIN',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a81c0cda67c9a3b01d566622a09544b13',1,'openvdb::v3_2_0::GridBase']]], + ['meta_5ffile_5fcompression',['META_FILE_COMPRESSION',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a75e2a4a681d51f1d0cf36a0d6ef0930d',1,'openvdb::v3_2_0::GridBase']]], + ['meta_5ffile_5fmem_5fbytes',['META_FILE_MEM_BYTES',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a0fa5dd3a2ffb3bc2dbec0c4da205b216',1,'openvdb::v3_2_0::GridBase']]], + ['meta_5ffile_5fvoxel_5fcount',['META_FILE_VOXEL_COUNT',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ae2ad899b69d395c9a0a09b160b76d0e0',1,'openvdb::v3_2_0::GridBase']]], + ['meta_5fgrid_5fclass',['META_GRID_CLASS',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#aa72485314e3ad339aec794e9009868c1',1,'openvdb::v3_2_0::GridBase']]], + ['meta_5fgrid_5fcreator',['META_GRID_CREATOR',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#aa4042cca7c41c31dbdc379ad47f1247c',1,'openvdb::v3_2_0::GridBase']]], + ['meta_5fgrid_5fname',['META_GRID_NAME',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#aa591a941dff12acf9898cf88a536129f',1,'openvdb::v3_2_0::GridBase']]], + ['meta_5fis_5flocal_5fspace',['META_IS_LOCAL_SPACE',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a4a6d8398d66bdd1c5819d55a5cccc8ad',1,'openvdb::v3_2_0::GridBase']]], + ['meta_5fsave_5fhalf_5ffloat',['META_SAVE_HALF_FLOAT',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#a59d70f66efb23c69c0320d5f377f581f',1,'openvdb::v3_2_0::GridBase']]], + ['meta_5fvector_5ftype',['META_VECTOR_TYPE',['../classopenvdb_1_1v3__2__0_1_1GridBase.html#ab7e662b78a3459c4e7df594b02dc528a',1,'openvdb::v3_2_0::GridBase']]], + ['mfileinfo',['mFileInfo',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_1_1Buffer.html#a531f384cef38aded004297387fe001b7',1,'openvdb::v3_2_0::tree::LeafNode::Buffer']]], + ['mfilm',['mFilm',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#aeb3367355fd28ac35095df29c4478968',1,'openvdb::v3_2_0::tools::BaseCamera']]], + ['mgrid',['mGrid',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#a8f6ccd0c84475e8606642f6fe038394a',1,'openvdb::v3_2_0::math::BaseStencil::mGrid()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid_1_1ReducePool.html#a8511f863d65db0d366a00ebc7bbee88b',1,'openvdb::v3_2_0::tools::PointMaskGrid::ReducePool::mGrid()']]], + ['mindexsegments',['mIndexSegments',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1OrderSegmentsOp.html#aed5225cd8eac8d7bfa794f1ae2d46661',1,'openvdb::v3_2_0::tools::point_partitioner_internal::OrderSegmentsOp']]], + ['mindextree',['mIndexTree',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RemoveSelfIntersectingSurface.html#a2f68dbb1f89fdef0ecf47a4c37aacfec',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RemoveSelfIntersectingSurface']]], + ['mindices',['mIndices',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1CreateOrderedPointIndexArrayOp.html#a5add0cec990f91028a678d1362bf8176',1,'openvdb::v3_2_0::tools::point_partitioner_internal::CreateOrderedPointIndexArrayOp::mIndices()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1VoxelOrderOp.html#a6db45cfb5535094deab98b8b909cd61a',1,'openvdb::v3_2_0::tools::point_partitioner_internal::VoxelOrderOp::mIndices()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1LeafNodeOriginOp.html#a5add0cec990f91028a678d1362bf8176',1,'openvdb::v3_2_0::tools::point_partitioner_internal::LeafNodeOriginOp::mIndices()']]], + ['minputgrid',['mInputGrid',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Divergence_1_1Functor.html#aff33c33f42c75ae56d63a5742348a509',1,'openvdb::v3_2_0::tools::Divergence::Functor::mInputGrid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Divergence.html#aff33c33f42c75ae56d63a5742348a509',1,'openvdb::v3_2_0::tools::Divergence::mInputGrid()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Gradient_1_1Functor.html#a38e618a4d5a21b6d2fc021095ba1698f',1,'openvdb::v3_2_0::tools::Gradient::Functor::mInputGrid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Gradient.html#a38e618a4d5a21b6d2fc021095ba1698f',1,'openvdb::v3_2_0::tools::Gradient::mInputGrid()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian_1_1Functor.html#a17a99bfd693bfd71b6a8e334132f7439',1,'openvdb::v3_2_0::tools::Laplacian::Functor::mInputGrid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian.html#a17a99bfd693bfd71b6a8e334132f7439',1,'openvdb::v3_2_0::tools::Laplacian::mInputGrid()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature_1_1Functor.html#a17a99bfd693bfd71b6a8e334132f7439',1,'openvdb::v3_2_0::tools::MeanCurvature::Functor::mInputGrid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature.html#a17a99bfd693bfd71b6a8e334132f7439',1,'openvdb::v3_2_0::tools::MeanCurvature::mInputGrid()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude_1_1Functor.html#aff33c33f42c75ae56d63a5742348a509',1,'openvdb::v3_2_0::tools::Magnitude::Functor::mInputGrid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude.html#aff33c33f42c75ae56d63a5742348a509',1,'openvdb::v3_2_0::tools::Magnitude::mInputGrid()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Normalize_1_1Functor.html#a17a99bfd693bfd71b6a8e334132f7439',1,'openvdb::v3_2_0::tools::Normalize::Functor::mInputGrid()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Normalize.html#a17a99bfd693bfd71b6a8e334132f7439',1,'openvdb::v3_2_0::tools::Normalize::mInputGrid()']]], + ['minradius',['minRadius',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1ComputeExtremas.html#ae1d9e37b8ab08b6569f27b1bd4ea1f1a',1,'openvdb::v3_2_0::tools::particle_atlas_internal::ComputeExtremas']]], + ['minterrupt',['mInterrupt',['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::gridop::GridOperator::mInterrupt()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Divergence_1_1Functor.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::Divergence::Functor::mInterrupt()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Divergence.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::Divergence::mInterrupt()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Gradient_1_1Functor.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::Gradient::Functor::mInterrupt()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Gradient.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::Gradient::mInterrupt()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian_1_1Functor.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::Laplacian::Functor::mInterrupt()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::Laplacian::mInterrupt()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature_1_1Functor.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::MeanCurvature::Functor::mInterrupt()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::MeanCurvature::mInterrupt()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude_1_1Functor.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::Magnitude::Functor::mInterrupt()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::Magnitude::mInterrupt()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Normalize_1_1Functor.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::Normalize::Functor::mInterrupt()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Normalize.html#a1751587e8a80ea9854343495049d20a8',1,'openvdb::v3_2_0::tools::Normalize::mInterrupt()']]], + ['minterruptcount',['mInterruptCount',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#a2a178c30fee2cd20bbe9e61d63a4e511',1,'openvdb::v3_2_0::tools::BasePointScatter']]], + ['minterrupter',['mInterrupter',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#a1713d55a5b062d81cd12bbbfb78e9141',1,'openvdb::v3_2_0::tools::BasePointScatter']]], + ['mintsize',['mIntSize',['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask.html#a6f9e8803d8231d5724bcee833f10f652',1,'openvdb::v3_2_0::util::RootNodeMask']]], + ['minval',['minVal',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckRange.html#a0cfb2e3aae2525b8abfd45e71318d08b',1,'openvdb::v3_2_0::tools::CheckRange::minVal()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMin.html#a0cfb2e3aae2525b8abfd45e71318d08b',1,'openvdb::v3_2_0::tools::CheckMin::minVal()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#a0a0740cf108b7fda92940f828bacfa90',1,'openvdb::v3_2_0::tools::CheckEikonal::minVal()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckDivergence.html#a0a0740cf108b7fda92940f828bacfa90',1,'openvdb::v3_2_0::tools::CheckDivergence::minVal()']]], + ['minval2',['minVal2',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckNormGrad.html#abdb857cb336ef70112f63d4e71a9aa79',1,'openvdb::v3_2_0::tools::CheckNormGrad']]], + ['minvalue',['minValue',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__fracture__internal_1_1FindMinMaxVoxelValue.html#aab2e35030e8739187326ad38338023f1',1,'openvdb::v3_2_0::tools::level_set_fracture_internal::FindMinMaxVoxelValue::minValue()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinVoxelValue.html#aab2e35030e8739187326ad38338023f1',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinVoxelValue::minValue()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinTileValue.html#aab2e35030e8739187326ad38338023f1',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinTileValue::minValue()']]], + ['minvert',['mInvert',['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#a9eea8ea3eb0e6440afa992a3f093bb7d',1,'openvdb::v3_2_0::tools::AlphaMask']]], + ['minvnorm',['mInvNorm',['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#a922dd4f655710488fb16728c8081cfdc',1,'openvdb::v3_2_0::tools::AlphaMask']]], + ['misovalue',['mIsovalue',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorVoxels.html#afee4db1e4b4fc71be6874859bc591e00',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorVoxels::mIsovalue()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorTiles.html#afee4db1e4b4fc71be6874859bc591e00',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorTiles::mIsovalue()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1LabelBoundaryVoxels.html#afee4db1e4b4fc71be6874859bc591e00',1,'openvdb::v3_2_0::tools::level_set_util_internal::LabelBoundaryVoxels::mIsovalue()']]], + ['mleafnodes',['mLeafNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1PopulateLeafNodesOp.html#ab7a8071b9e54e1858d5ced24832daefb',1,'openvdb::v3_2_0::tools::point_index_grid_internal::PopulateLeafNodesOp']]], + ['mlist',['mList',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeList.html#a02ecdbe47fc81e7dfb394b68137259eb',1,'openvdb::v3_2_0::tree::NodeList::mList()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#af5bfa936fcffa3ab2045079cc4f92c1b',1,'openvdb::v3_2_0::tree::NodeManagerLink::mList()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink_3_01NodeT_00_010_01_4.html#af5bfa936fcffa3ab2045079cc4f92c1b',1,'openvdb::v3_2_0::tree::NodeManagerLink< NodeT, 0 >::mList()']]], + ['mlist0',['mList0',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a1adb2527f9db74658c7f2870d9c6e97f',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::mList0()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a1adb2527f9db74658c7f2870d9c6e97f',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::mList0()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a1adb2527f9db74658c7f2870d9c6e97f',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::mList0()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a1adb2527f9db74658c7f2870d9c6e97f',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::mList0()']]], + ['mlist1',['mList1',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a8a0021a530b432988f34c293497bd4c0',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::mList1()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a8a0021a530b432988f34c293497bd4c0',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::mList1()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a8a0021a530b432988f34c293497bd4c0',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::mList1()']]], + ['mlist2',['mList2',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#aeff57894453809f1b724386a78dbd1da',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::mList2()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#aeff57894453809f1b724386a78dbd1da',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::mList2()']]], + ['mlist3',['mList3',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a644f552973f508394d6edbcbd3c590b7',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >']]], + ['mlog2dim',['mLog2Dim',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1LeafNodeOriginOp.html#a036d560a6b28ba05cf2214f72fe8b659',1,'openvdb::v3_2_0::tools::point_partitioner_internal::LeafNodeOriginOp']]], + ['mm',['mm',['../classopenvdb_1_1v3__2__0_1_1math_1_1Mat.html#a01a2f9d41532824bed65b16ace0f6c44',1,'openvdb::v3_2_0::math::Mat::mm()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Quat.html#ae88aad6ab980ed9ef001bbab4c1cbfbd',1,'openvdb::v3_2_0::math::Quat::mm()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#aaade5d886d4f0e0f8fcf641294df5783',1,'openvdb::v3_2_0::math::Tuple::mm()']]], + ['mmanager',['mManager',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a306b6e6840b7f3b37bc3d4057005c004',1,'openvdb::v3_2_0::tools::Morphology::mManager()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1UpdateMasks.html#a37528306f13626b70231d7230671d05f',1,'openvdb::v3_2_0::tools::Morphology::UpdateMasks::mManager()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1CopyMasks.html#aa19391ab9ce14cb9dca6e926d54b54fe',1,'openvdb::v3_2_0::tools::Morphology::CopyMasks::mManager()']]], + ['mmap',['mMap',['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html#a33be238ad5add05746396057bda24a91',1,'openvdb::v3_2_0::tools::gridop::GridOperator']]], + ['mmask',['mMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1gridop_1_1GridOperator.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::gridop::GridOperator::mMask()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Divergence_1_1Functor.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::Divergence::Functor::mMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Divergence.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::Divergence::mMask()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Gradient_1_1Functor.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::Gradient::Functor::mMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Gradient.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::Gradient::mMask()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian_1_1Functor.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::Laplacian::Functor::mMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::Laplacian::mMask()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature_1_1Functor.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::MeanCurvature::Functor::mMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::MeanCurvature::mMask()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude_1_1Functor.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::Magnitude::Functor::mMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::Magnitude::mMask()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Normalize_1_1Functor.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::Normalize::Functor::mMask()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1Normalize.html#a20c448e2c24ae27850c398e0ecc00912',1,'openvdb::v3_2_0::tools::Normalize::mMask()']]], + ['mmasknodes',['mMaskNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorVoxels.html#a7145ad5ed33f4a096c0fdc9696a74ed8',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorVoxels::mMaskNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorTiles.html#a57f8d145c6385353c5ab73e6cb818551',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorTiles::mMaskNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1LabelBoundaryVoxels.html#a4ccde3575ee79d22c48784ee9db7c426',1,'openvdb::v3_2_0::tools::level_set_util_internal::LabelBoundaryVoxels::mMaskNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillLeafNodeVoxels.html#a7145ad5ed33f4a096c0fdc9696a74ed8',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillLeafNodeVoxels::mMaskNodes()']]], + ['mmasks',['mMasks',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1UpdateMasks.html#aa315d291b5951d232f5b67763e5ceee8',1,'openvdb::v3_2_0::tools::Morphology::UpdateMasks::mMasks()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1CopyMasks.html#a0c939aee9376503e3d4dfecb7f423d1e',1,'openvdb::v3_2_0::tools::Morphology::CopyMasks::mMasks()']]], + ['mmax',['mMax',['../classopenvdb_1_1v3__2__0_1_1math_1_1MinMax.html#a8d3e5077335f198db2672965af156a9f',1,'openvdb::v3_2_0::math::MinMax::mMax()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#a30d9751c240144067f2c48e439f6992f',1,'openvdb::v3_2_0::math::Extrema::mMax()']]], + ['mmin',['mMin',['../classopenvdb_1_1v3__2__0_1_1math_1_1MinMax.html#a541bc5059e3b7d3608e898af0bb7d9ef',1,'openvdb::v3_2_0::math::MinMax::mMin()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#ad70ad4e69d479e6214e8807cb757360a',1,'openvdb::v3_2_0::math::Extrema::mMin()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#a0a96358fce656fc89b040775217b5ce1',1,'openvdb::v3_2_0::tools::AlphaMask::mMin()']]], + ['mnext',['mNext',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManagerLink.html#a5040ca75b6f74480d11ec152f84b599a',1,'openvdb::v3_2_0::tree::NodeManagerLink']]], + ['mnode',['mNode',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1VoxelizeActiveTiles.html#aaee1a54f8a17c08f33e4d159f1ed0c25',1,'openvdb::v3_2_0::tree::InternalNode::VoxelizeActiveTiles']]], + ['mnodemask',['mNodeMask',['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedPoints.html#a61f94980d1d4ecd087f631e597779a1c',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedPoints']]], + ['mnodemaskarray',['mNodeMaskArray',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SegmentNodeMask.html#a12f04f5952a8c089fb911064ce12c46b',1,'openvdb::v3_2_0::tools::level_set_util_internal::SegmentNodeMask']]], + ['mnodes',['mNodes',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__fracture__internal_1_1FindMinMaxVoxelValue.html#a7fb2792893907a51543b4bcf4fea3368',1,'openvdb::v3_2_0::tools::level_set_fracture_internal::FindMinMaxVoxelValue::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorVoxels.html#a7fb2792893907a51543b4bcf4fea3368',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorVoxels::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1LabelBoundaryVoxels.html#a7fb2792893907a51543b4bcf4fea3368',1,'openvdb::v3_2_0::tools::level_set_util_internal::LabelBoundaryVoxels::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FlipRegionSign.html#ad99aadd91c18b3ba737839c21c30fb79',1,'openvdb::v3_2_0::tools::level_set_util_internal::FlipRegionSign::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinVoxelValue.html#a7fb2792893907a51543b4bcf4fea3368',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinVoxelValue::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FindMinTileValue.html#a18a64eae0438740ab5cc863987b6fb8a',1,'openvdb::v3_2_0::tools::level_set_util_internal::FindMinTileValue::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SDFVoxelsToFogVolume.html#ad99aadd91c18b3ba737839c21c30fb79',1,'openvdb::v3_2_0::tools::level_set_util_internal::SDFVoxelsToFogVolume::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SDFTilesToFogVolume.html#a49a7a46bf3e961977d75d82d45a732ae',1,'openvdb::v3_2_0::tools::level_set_util_internal::SDFTilesToFogVolume::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SegmentNodeMask.html#a8d9bf2c672ba85b1986129e7d8936061',1,'openvdb::v3_2_0::tools::level_set_util_internal::SegmentNodeMask::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1StashOriginAndStoreOffset.html#ad99aadd91c18b3ba737839c21c30fb79',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::StashOriginAndStoreOffset::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RestoreOrigin.html#ad99aadd91c18b3ba737839c21c30fb79',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RestoreOrigin::mNodes()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SeedFillExteriorSign.html#ad99aadd91c18b3ba737839c21c30fb79',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SeedFillExteriorSign::mNodes()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1SyncVoxelMask.html#ad99aadd91c18b3ba737839c21c30fb79',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::SyncVoxelMask::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ValidateIntersectingVoxels.html#ad99aadd91c18b3ba737839c21c30fb79',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ValidateIntersectingVoxels::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1RemoveSelfIntersectingSurface.html#ae2eaa0e3e3f0599eecceac785737d8af',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::RemoveSelfIntersectingSurface::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ReleaseChildNodes.html#a41ea969c745cedc750285ecfb44274c3',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ReleaseChildNodes::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1AddNodes.html#aaea3b72e9af17b69e78f0be3a53d6e5a',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::AddNodes::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RemapIndices.html#a1da09b0471a70e360d952d3fc0ab1479',1,'openvdb::v3_2_0::tools::particle_atlas_internal::RemapIndices::mNodes()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#abc5bd21eaa8b0c9fefa604d87a2487ee',1,'openvdb::v3_2_0::tree::InternalNode::mNodes()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1Tree_1_1DeallocateLeafNodes.html#ad99aadd91c18b3ba737839c21c30fb79',1,'openvdb::v3_2_0::tree::Tree::DeallocateLeafNodes::mNodes()']]], + ['mnumsegments',['mNumSegments',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#a0968239e7029f02ab4579ce922fc058f',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp']]], + ['moffsetsegments',['mOffsetSegments',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1OrderSegmentsOp.html#af8519042dcd6869bb1524c85dda9f983',1,'openvdb::v3_2_0::tools::point_partitioner_internal::OrderSegmentsOp']]], + ['mop',['mOp',['../structopenvdb_1_1v3__2__0_1_1tools_1_1ContiguousOp.html#a578862660695781eb3ee9d922714ee22',1,'openvdb::v3_2_0::tools::ContiguousOp::mOp()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1MathOp.html#a99562e6c82bf54327177afe6f5149056',1,'openvdb::v3_2_0::tools::stats_internal::MathOp::mOp()']]], + ['morderedindexarray',['mOrderedIndexArray',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1CreateOrderedPointIndexArrayOp.html#af493fb43a642f977308766ac67e53e8d',1,'openvdb::v3_2_0::tools::point_partitioner_internal::CreateOrderedPointIndexArrayOp']]], + ['morigin',['mOrigin',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#af414bde19eeac7a19348e1c7c795217b',1,'openvdb::v3_2_0::tree::InternalNode::mOrigin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#af414bde19eeac7a19348e1c7c795217b',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::mOrigin()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#af414bde19eeac7a19348e1c7c795217b',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::mOrigin()']]], + ['moutputgrid',['mOutputGrid',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Divergence_1_1Functor.html#a52d73c3917e4240a7e1530a5e043fcfa',1,'openvdb::v3_2_0::tools::Divergence::Functor::mOutputGrid()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Gradient_1_1Functor.html#a52d73c3917e4240a7e1530a5e043fcfa',1,'openvdb::v3_2_0::tools::Gradient::Functor::mOutputGrid()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian_1_1Functor.html#a28981ccc232ba941888d689389165232',1,'openvdb::v3_2_0::tools::Laplacian::Functor::mOutputGrid()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature_1_1Functor.html#a28981ccc232ba941888d689389165232',1,'openvdb::v3_2_0::tools::MeanCurvature::Functor::mOutputGrid()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude_1_1Functor.html#a52d73c3917e4240a7e1530a5e043fcfa',1,'openvdb::v3_2_0::tools::Magnitude::Functor::mOutputGrid()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Normalize_1_1Functor.html#a28981ccc232ba941888d689389165232',1,'openvdb::v3_2_0::tools::Normalize::Functor::mOutputGrid()']]], + ['mownsgrid',['mOwnsGrid',['../structopenvdb_1_1v3__2__0_1_1tools_1_1PointMaskGrid_1_1ReducePool.html#a565164802f04c934f640168c4df207bd',1,'openvdb::v3_2_0::tools::PointMaskGrid::ReducePool']]], + ['mownsmanager',['mOwnsManager',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a617b6112d3cf467991f49d91b468565e',1,'openvdb::v3_2_0::tools::Morphology']]], + ['mpageoffsetarrays',['mPageOffsetArrays',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1OrderSegmentsOp.html#adb6f49bd3cad8514dfd4ecb8dfa22128',1,'openvdb::v3_2_0::tools::point_partitioner_internal::OrderSegmentsOp']]], + ['mpages',['mPages',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1VoxelOrderOp.html#aad2fc16bd790d1bc63261872c19cbefb',1,'openvdb::v3_2_0::tools::point_partitioner_internal::VoxelOrderOp::mPages()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1LeafNodeOriginOp.html#aad2fc16bd790d1bc63261872c19cbefb',1,'openvdb::v3_2_0::tools::point_partitioner_internal::LeafNodeOriginOp::mPages()']]], + ['mparent',['mParent',['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html#af7fe7e8f2d47f112d1cf0d9747fca2b5',1,'openvdb::v3_2_0::util::BaseMaskIterator::mParent()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#a2f56aaf7d07ab91ea2c6fb666b5d7f1b',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::mParent()']]], + ['mparticles',['mParticles',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1RemapIndices.html#a48ff9e7adf344712bd48fb3e03063bb0',1,'openvdb::v3_2_0::tools::particle_atlas_internal::RemapIndices']]], + ['mpartitioner',['mPartitioner',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__index__grid__internal_1_1PopulateLeafNodesOp.html#af7b1d937f25caaf115024c63f6744247',1,'openvdb::v3_2_0::tools::point_index_grid_internal::PopulateLeafNodesOp']]], + ['mpointcount',['mPointCount',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#ad61cded56c971a1e64733b4c8bd41bc7',1,'openvdb::v3_2_0::tools::BasePointScatter']]], + ['mpointorder',['mPointOrder',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1ComputePointOrderOp.html#aff6131d40e5501f49e212989d16ece60',1,'openvdb::v3_2_0::tools::point_partitioner_internal::ComputePointOrderOp::mPointOrder()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1CreateOrderedPointIndexArrayOp.html#a4df1ec0e84716a7cba9e8fca9e66efae',1,'openvdb::v3_2_0::tools::point_partitioner_internal::CreateOrderedPointIndexArrayOp::mPointOrder()']]], + ['mpoints',['mPoints',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1LeafNodeOriginOp.html#a6eeaf628f86ce17aa24c228d7c348834',1,'openvdb::v3_2_0::tools::point_partitioner_internal::LeafNodeOriginOp::mPoints()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#a6eeaf628f86ce17aa24c228d7c348834',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp::mPoints()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#a4e753786b355d9112fd7547fd85bbf86',1,'openvdb::v3_2_0::tools::BasePointScatter::mPoints()']]], + ['mpointsin',['mPointsIn',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1TransformPoints.html#a3fa7754130c22853678576e3ec0f66aa',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::TransformPoints']]], + ['mpointsout',['mPointsOut',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1TransformPoints.html#aeea557a0e08be7ba4273c306555fbb27',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::TransformPoints']]], + ['mpool',['mPool',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MultiResGrid_1_1MaskOp.html#a69635ab801b380543d555a475a5035b3',1,'openvdb::v3_2_0::tools::MultiResGrid::MaskOp']]], + ['mpos',['mPos',['../classopenvdb_1_1v3__2__0_1_1util_1_1BaseMaskIterator.html#ab28e5158898fe509080028cfd895ce28',1,'openvdb::v3_2_0::util::BaseMaskIterator::mPos()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1RootNodeMask_1_1BaseIterator.html#ab28e5158898fe509080028cfd895ce28',1,'openvdb::v3_2_0::util::RootNodeMask::BaseIterator::mPos()']]], + ['mrand01',['mRand01',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#a96e0c347190b48bf38e77b340e7ea902',1,'openvdb::v3_2_0::tools::BasePointScatter']]], + ['mray',['mRay',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#ad6ca3d15eecb3e76a051b9eeb4d05e69',1,'openvdb::v3_2_0::tools::BaseCamera']]], + ['mresultisactive',['mResultIsActive',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#ad77b601397f8182816a05b8b11c3b6b1',1,'openvdb::v3_2_0::CombineArgs']]], + ['mresultval',['mResultVal',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a5ce5828fb27887003b04ac7bc6f38f5f',1,'openvdb::v3_2_0::CombineArgs']]], + ['mresultvalptr',['mResultValPtr',['../classopenvdb_1_1v3__2__0_1_1CombineArgs.html#a4fa59ec48f0468d55fe1e0d77e9a67f5',1,'openvdb::v3_2_0::CombineArgs']]], + ['mroot',['mRoot',['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager.html#a0b293dd9772aad6b65a774f9952844df',1,'openvdb::v3_2_0::tree::NodeManager::mRoot()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_010_01_4.html#a0b293dd9772aad6b65a774f9952844df',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 0 >::mRoot()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_011_01_4.html#a66e7ac40d8b9ef7608f4dd5bdfcf81dd',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 1 >::mRoot()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_012_01_4.html#a3254ef258ed8f94627a1a3c9cfcfe7bd',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 2 >::mRoot()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_013_01_4.html#a6e197e2e1e81c748d50f11f92434ad01',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 3 >::mRoot()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeManager_3_01TreeOrLeafManagerT_00_014_01_4.html#a74ea42eceaece758e964e0509b887a1a',1,'openvdb::v3_2_0::tree::NodeManager< TreeOrLeafManagerT, 4 >::mRoot()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#a45a3cfd69ab5d6507b191bfe16ad3866',1,'openvdb::v3_2_0::tree::Tree::mRoot()']]], + ['msampler',['mSampler',['../classopenvdb_1_1v3__2__0_1_1tools_1_1AlphaMask.html#a224460051f7f7fc0ec34b3d6ab26a5df',1,'openvdb::v3_2_0::tools::AlphaMask']]], + ['mscaleheight',['mScaleHeight',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#a5c5bf87ef2b0409653cccfa84baa23fc',1,'openvdb::v3_2_0::tools::BaseCamera']]], + ['mscalewidth',['mScaleWidth',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#a5f144508faa9739d74b1896274f6b1f3',1,'openvdb::v3_2_0::tools::BaseCamera']]], + ['mscreentoworld',['mScreenToWorld',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BaseCamera.html#af41737a2b2f121096082457d687814b6',1,'openvdb::v3_2_0::tools::BaseCamera']]], + ['msegments',['mSegments',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandNarrowbandMask.html#a70cde43a4d2c263c86a578ece1d09bd3',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandNarrowbandMask::mSegments()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ComputeActiveVoxelCount.html#a29d061ec90a764f1376c4682f82b051d',1,'openvdb::v3_2_0::tools::level_set_util_internal::ComputeActiveVoxelCount::mSegments()']]], + ['msize',['mSize',['../classopenvdb_1_1v3__2__0_1_1math_1_1Extrema.html#a52e13c49d14c17f5a85451f1cead46dd',1,'openvdb::v3_2_0::math::Extrema']]], + ['mstats',['mStats',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1MathOp.html#a1b9ccf6af8f3c4e0df1d0f3090ede7f9',1,'openvdb::v3_2_0::tools::stats_internal::MathOp']]], + ['mstencil',['mStencil',['../classopenvdb_1_1v3__2__0_1_1math_1_1BaseStencil.html#ad341a8754b815932474f111e22771e2d',1,'openvdb::v3_2_0::math::BaseStencil']]], + ['msteps',['mSteps',['../classopenvdb_1_1v3__2__0_1_1tools_1_1Morphology.html#a95a5b140b9a55112881cce7b5437ec21',1,'openvdb::v3_2_0::tools::Morphology']]], + ['mthreaded',['mThreaded',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Divergence_1_1Functor.html#af7883da2bf5e3b439778e9290e7c297e',1,'openvdb::v3_2_0::tools::Divergence::Functor::mThreaded()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Gradient_1_1Functor.html#af7883da2bf5e3b439778e9290e7c297e',1,'openvdb::v3_2_0::tools::Gradient::Functor::mThreaded()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Laplacian_1_1Functor.html#af7883da2bf5e3b439778e9290e7c297e',1,'openvdb::v3_2_0::tools::Laplacian::Functor::mThreaded()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeanCurvature_1_1Functor.html#af7883da2bf5e3b439778e9290e7c297e',1,'openvdb::v3_2_0::tools::MeanCurvature::Functor::mThreaded()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Magnitude_1_1Functor.html#af7883da2bf5e3b439778e9290e7c297e',1,'openvdb::v3_2_0::tools::Magnitude::Functor::mThreaded()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Normalize_1_1Functor.html#af7883da2bf5e3b439778e9290e7c297e',1,'openvdb::v3_2_0::tools::Normalize::Functor::mThreaded()']]], + ['mtree',['mTree',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1MaskInteriorTiles.html#a4451e091324858e9887386c891eb5e52',1,'openvdb::v3_2_0::tools::level_set_util_internal::MaskInteriorTiles::mTree()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SDFTilesToFogVolume.html#a4451e091324858e9887386c891eb5e52',1,'openvdb::v3_2_0::tools::level_set_util_internal::SDFTilesToFogVolume::mTree()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1FillLeafNodeVoxels.html#a4451e091324858e9887386c891eb5e52',1,'openvdb::v3_2_0::tools::level_set_util_internal::FillLeafNodeVoxels::mTree()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1ExpandNarrowbandMask.html#a4451e091324858e9887386c891eb5e52',1,'openvdb::v3_2_0::tools::level_set_util_internal::ExpandNarrowbandMask::mTree()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1ValidateIntersectingVoxels.html#a1cd2e8765a31f92c08e132dce77569e3',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::ValidateIntersectingVoxels::mTree()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1AddNodes.html#a1cd2e8765a31f92c08e132dce77569e3',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::AddNodes::mTree()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1ValueAccessorBase.html#a3bad99f14356d386d0240b16967f678a',1,'openvdb::v3_2_0::tree::ValueAccessorBase::mTree()']]], + ['mval',['mVal',['../classopenvdb_1_1v3__2__0_1_1tools_1_1internal_1_1TileSampler.html#a422983dc264ea7e3513cb16b214cefcb',1,'openvdb::v3_2_0::tools::internal::TileSampler']]], + ['mvalue',['mValue',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1FillArray.html#ab432bfd176d7d6a2763a4c9399657c67',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::FillArray']]], + ['mvaluemask',['mValueMask',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#a3afa0e552b2ab6c5f3236e98d56b8903',1,'openvdb::v3_2_0::tree::InternalNode::mValueMask()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a3afa0e552b2ab6c5f3236e98d56b8903',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::mValueMask()']]], + ['mvisible',['mVisible',['../ParticlesToLevelSet_8h.html#afe2b4fa29c315142fa15f71cb8044d84',1,'ParticlesToLevelSet.h']]], + ['mvoxelcount',['mVoxelCount',['../classopenvdb_1_1v3__2__0_1_1tools_1_1BasePointScatter.html#a7f2324ecb0b1909536715417f5d6a423',1,'openvdb::v3_2_0::tools::BasePointScatter']]], + ['mvoxeloffsets',['mVoxelOffsets',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1VoxelOrderOp.html#ad0e74572f6ce94fd7efdb1791d25de23',1,'openvdb::v3_2_0::tools::point_partitioner_internal::VoxelOrderOp::mVoxelOffsets()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#a31b03bccc1e6e379ce720a038ee2c942',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp::mVoxelOffsets()']]], + ['mweight',['mWeight',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1SDFVoxelsToFogVolume.html#ade3cad010b30dd7294114d25092e1466',1,'openvdb::v3_2_0::tools::level_set_util_internal::SDFVoxelsToFogVolume']]], + ['mx',['mX',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutZYX_01_4.html#aef2045ff3af1624ed6c3e05da71d64a6',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutZYX >']]], + ['mxdist',['mXDist',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#ab7fefe8916f444284ed2eba6a1486e2f',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData']]], + ['mxform',['mXForm',['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1LeafNodeOriginOp.html#a7a20b1f60ced83195c02389d546d8088',1,'openvdb::v3_2_0::tools::point_partitioner_internal::LeafNodeOriginOp::mXForm()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1point__partitioner__internal_1_1BinPointIndicesOp.html#a7a20b1f60ced83195c02389d546d8088',1,'openvdb::v3_2_0::tools::point_partitioner_internal::BinPointIndicesOp::mXForm()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1TransformPoints.html#a54dc167a143860c2cc02529884a95199',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::TransformPoints::mXform()']]], + ['mxprim',['mXPrim',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#a39c9c2ddc88e7c539cfa77b869c429f8',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData']]], + ['my',['mY',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutZYX_01_4.html#ae3b293a59d64bf30ce4e44821943e9ca',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutZYX >::mY()'],['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutXYZ_01_4.html#ae3b293a59d64bf30ce4e44821943e9ca',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutXYZ >::mY()']]], + ['mydist',['mYDist',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#aaad18e74cc76aab82be5c46e833c3fc0',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData']]], + ['myprim',['mYPrim',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#ad4e5e55c703fee5e4f17e7a2ed8b2634',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData']]], + ['mz',['mZ',['../classopenvdb_1_1v3__2__0_1_1tools_1_1DenseBase_3_01ValueT_00_01LayoutXYZ_01_4.html#a56fdb9022f2c442bb3473a882d2dbd18',1,'openvdb::v3_2_0::tools::DenseBase< ValueT, LayoutXYZ >']]], + ['mzdist',['mZDist',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#a5119d34f5202e6611fe387d48db7d4da',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData']]], + ['mzprim',['mZPrim',['../structopenvdb_1_1v3__2__0_1_1tools_1_1MeshToVoxelEdgeData_1_1EdgeData.html#acebf086d067693667a005e78ad96333b',1,'openvdb::v3_2_0::tools::MeshToVoxelEdgeData::EdgeData']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_a.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_a.html new file mode 100644 index 00000000..b4a88a82 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_a.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_a.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_a.js new file mode 100644 index 00000000..547f0d46 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_a.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['name',['name',['../structopenvdb_1_1v3__2__0_1_1GridNamePred.html#a7082db574ba2d2d69ccafb060398b7d8',1,'openvdb::v3_2_0::GridNamePred']]], + ['normcount',['normCount',['../structopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker_1_1State.html#abd9bcaf6b4c24cdf70a5d9929d77ff23',1,'openvdb::v3_2_0::tools::LevelSetTracker::State']]], + ['num_5fvalues',['NUM_VALUES',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#abb8a8fff522a3cd8472b242f22ce8cde',1,'openvdb::v3_2_0::tree::InternalNode::NUM_VALUES()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#abb8a8fff522a3cd8472b242f22ce8cde',1,'openvdb::v3_2_0::tree::LeafNode::NUM_VALUES()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#abb8a8fff522a3cd8472b242f22ce8cde',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::NUM_VALUES()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#abb8a8fff522a3cd8472b242f22ce8cde',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::NUM_VALUES()']]], + ['num_5fvoxels',['NUM_VOXELS',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#aea8547ecf74d52579ee34a5ac62d6c0e',1,'openvdb::v3_2_0::tree::InternalNode::NUM_VOXELS()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#a6ec354438f15b62f496d794e80181373',1,'openvdb::v3_2_0::tree::LeafNode::NUM_VOXELS()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a6ec354438f15b62f496d794e80181373',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::NUM_VOXELS()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a6ec354438f15b62f496d794e80181373',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::NUM_VOXELS()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_b.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_b.html new file mode 100644 index 00000000..3eb3a399 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_b.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_b.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_b.js new file mode 100644 index 00000000..f90c2700 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_b.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['offtile',['offTile',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#a349e0f8a033548c4a9edd7ffb6119d2e',1,'openvdb::v3_2_0::tools::Morphology::LeafCache']]], + ['offv',['offV',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy2.html#a14cde73a5412cff3cbab9889d534e41e',1,'openvdb::v3_2_0::tree::InternalNode::TopologyCopy2']]], + ['ontile',['onTile',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#acc19f07338e67564b697fb7a275c2793',1,'openvdb::v3_2_0::tools::Morphology::LeafCache']]], + ['onv',['onV',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy2.html#ac227f8b4c8fda27b3e8788fe17309171',1,'openvdb::v3_2_0::tree::InternalNode::TopologyCopy2']]], + ['op',['op',['../structopenvdb_1_1v3__2__0_1_1SwappedCombineOp.html#af397ea1d2b713e547c15e949890313da',1,'openvdb::v3_2_0::SwappedCombineOp::op()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1CombineOpAdapter.html#af397ea1d2b713e547c15e949890313da',1,'openvdb::v3_2_0::tree::CombineOpAdapter::op()']]], + ['openvdb_5ffile_5fversion',['OPENVDB_FILE_VERSION',['../namespaceopenvdb_1_1v3__2__0.html#a92a71ea4cce8e2e9c931d01b5b24b9d1',1,'openvdb::v3_2_0']]], + ['openvdb_5flibrary_5fmajor_5fversion',['OPENVDB_LIBRARY_MAJOR_VERSION',['../namespaceopenvdb_1_1v3__2__0.html#a6a9f092ecf0f16defadb23a13629cd62',1,'openvdb::v3_2_0']]], + ['openvdb_5flibrary_5fminor_5fversion',['OPENVDB_LIBRARY_MINOR_VERSION',['../namespaceopenvdb_1_1v3__2__0.html#ad72210c9b211de996a18108009e71979',1,'openvdb::v3_2_0']]], + ['openvdb_5flibrary_5fpatch_5fversion',['OPENVDB_LIBRARY_PATCH_VERSION',['../namespaceopenvdb_1_1v3__2__0.html#a9fca3ac01682078c4721c6a109d171d1',1,'openvdb::v3_2_0']]], + ['openvdb_5flibrary_5fversion',['OPENVDB_LIBRARY_VERSION',['../namespaceopenvdb_1_1v3__2__0.html#adb9dac755c814d036506d1e7a41ebc10',1,'openvdb::v3_2_0']]], + ['openvdb_5fmagic',['OPENVDB_MAGIC',['../namespaceopenvdb_1_1v3__2__0.html#ad39fdafd7bf1a352a9459ae46fb2cf1c',1,'openvdb::v3_2_0']]], + ['origin',['origin',['../structopenvdb_1_1v3__2__0_1_1tools_1_1level__set__util__internal_1_1NodeMaskSegment.html#a8cf3c1fbda7d90f2e9c564d8ebad662a',1,'openvdb::v3_2_0::tools::level_set_util_internal::NodeMaskSegment::origin()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#a5c83dab7335e6e6ae3f08c24870a35ca',1,'openvdb::v3_2_0::tools::Morphology::LeafCache::origin()']]], + ['out',['out',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1LinearOp.html#a81115d81febd7d8516d8b54f13ccdefc',1,'openvdb::v3_2_0::math::pcg::internal::LinearOp']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_c.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_c.html new file mode 100644 index 00000000..525eaaae --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_c.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_c.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_c.js new file mode 100644 index 00000000..1b423efb --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_c.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['particlearray',['particleArray',['../structopenvdb_1_1v3__2__0_1_1tools_1_1particle__atlas__internal_1_1ComputeExtremas.html#a0cf87abd365629ee564cab8a941f3890',1,'openvdb::v3_2_0::tools::particle_atlas_internal::ComputeExtremas']]], + ['primidacc',['primIdAcc',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#a6f0db7de900e18607a497752bb01321f',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData']]], + ['primidtree',['primIdTree',['../structopenvdb_1_1v3__2__0_1_1tools_1_1mesh__to__volume__internal_1_1VoxelizationData.html#aa177442f5cd670e3066c433ac437e1f2',1,'openvdb::v3_2_0::tools::mesh_to_volume_internal::VoxelizationData']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_d.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_d.html new file mode 100644 index 00000000..7891ec74 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_d.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_d.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_d.js new file mode 100644 index 00000000..e60c2c6e --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_d.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['r',['r',['../structopenvdb_1_1v3__2__0_1_1tools_1_1Film_1_1RGBA.html#a642b9bbe27cd5a9c63c52f1bd62ead58',1,'openvdb::v3_2_0::tools::Film::RGBA']]], + ['reducetmp',['reducetmp',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1Vector_1_1DeterministicDotProductOp.html#a2c84dc413932c96285e8cb452dbf7615',1,'openvdb::v3_2_0::math::pcg::Vector::DeterministicDotProductOp']]], + ['relativeerror',['relativeError',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1State.html#a7d9f74f0e442eb1bc448ad27678df9ed',1,'openvdb::v3_2_0::math::pcg::State']]], + ['root_5fdepth',['ROOT_DEPTH',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#a2039e543461c0875b463385909d98d2d',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::ROOT_DEPTH()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#a2039e543461c0875b463385909d98d2d',1,'openvdb::v3_2_0::tree::NodeIteratorBase::ROOT_DEPTH()']]], + ['root_5flevel',['ROOT_LEVEL',['../classopenvdb_1_1v3__2__0_1_1tree_1_1TreeValueIteratorBase.html#ac882f329d7bac2f6ead8bd6eb878a1fd',1,'openvdb::v3_2_0::tree::TreeValueIteratorBase::ROOT_LEVEL()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1NodeIteratorBase.html#ac882f329d7bac2f6ead8bd6eb878a1fd',1,'openvdb::v3_2_0::tree::NodeIteratorBase::ROOT_LEVEL()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafIteratorBase.html#ac882f329d7bac2f6ead8bd6eb878a1fd',1,'openvdb::v3_2_0::tree::LeafIteratorBase::ROOT_LEVEL()']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_e.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_e.html new file mode 100644 index 00000000..c957c0cf --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_e.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_e.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_e.js new file mode 100644 index 00000000..f60cead6 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_e.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['s',['s',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DeepCopy.html#ab157c7a347098753bf74f90dd835b323',1,'openvdb::v3_2_0::tree::InternalNode::DeepCopy::s()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy1.html#ab157c7a347098753bf74f90dd835b323',1,'openvdb::v3_2_0::tree::InternalNode::TopologyCopy1::s()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy2.html#ab157c7a347098753bf74f90dd835b323',1,'openvdb::v3_2_0::tree::InternalNode::TopologyCopy2::s()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyUnion.html#ab157c7a347098753bf74f90dd835b323',1,'openvdb::v3_2_0::tree::InternalNode::TopologyUnion::s()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyIntersection.html#ab157c7a347098753bf74f90dd835b323',1,'openvdb::v3_2_0::tree::InternalNode::TopologyIntersection::s()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyDifference.html#ab157c7a347098753bf74f90dd835b323',1,'openvdb::v3_2_0::tree::InternalNode::TopologyDifference::s()']]], + ['sadaptable',['sAdaptable',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a4cb1143a21a18b6b91dcf29cca8cd836',1,'openvdb::v3_2_0::tools::internal']]], + ['sambiguousface',['sAmbiguousFace',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#a23f508f76f4b48123161151698c99780',1,'openvdb::v3_2_0::tools::internal']]], + ['second',['second',['../structopenvdb_1_1v3__2__0_1_1VersionId.html#aaf698bc8e6905e3e97116abfea3c766c',1,'openvdb::v3_2_0::VersionId']]], + ['sedgegrouptable',['sEdgeGroupTable',['../namespaceopenvdb_1_1v3__2__0_1_1tools_1_1internal.html#aa4e425ab60c97125c0b59edba857b79a',1,'openvdb::v3_2_0::tools::internal']]], + ['size',['SIZE',['../classopenvdb_1_1v3__2__0_1_1math_1_1SevenPointStencil.html#af08413a3ee12cf78b0ddeea71e2648b3',1,'openvdb::v3_2_0::math::SevenPointStencil::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1BoxStencil.html#af08413a3ee12cf78b0ddeea71e2648b3',1,'openvdb::v3_2_0::math::BoxStencil::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SecondOrderDenseStencil.html#af08413a3ee12cf78b0ddeea71e2648b3',1,'openvdb::v3_2_0::math::SecondOrderDenseStencil::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1ThirteenPointStencil.html#af08413a3ee12cf78b0ddeea71e2648b3',1,'openvdb::v3_2_0::math::ThirteenPointStencil::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1FourthOrderDenseStencil.html#af08413a3ee12cf78b0ddeea71e2648b3',1,'openvdb::v3_2_0::math::FourthOrderDenseStencil::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1NineteenPointStencil.html#af08413a3ee12cf78b0ddeea71e2648b3',1,'openvdb::v3_2_0::math::NineteenPointStencil::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1SixthOrderDenseStencil.html#af08413a3ee12cf78b0ddeea71e2648b3',1,'openvdb::v3_2_0::math::SixthOrderDenseStencil::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1GradStencil.html#af08413a3ee12cf78b0ddeea71e2648b3',1,'openvdb::v3_2_0::math::GradStencil::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1WenoStencil.html#af08413a3ee12cf78b0ddeea71e2648b3',1,'openvdb::v3_2_0::math::WenoStencil::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1CurvatureStencil.html#af08413a3ee12cf78b0ddeea71e2648b3',1,'openvdb::v3_2_0::math::CurvatureStencil::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#acc76c5cb3a1194e8709198916eb66671',1,'openvdb::v3_2_0::tree::LeafNode::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#acc76c5cb3a1194e8709198916eb66671',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#acc76c5cb3a1194e8709198916eb66671',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask.html#a8bef27a409ee3c3bfea14a7f91266b5d',1,'openvdb::v3_2_0::util::NodeMask::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_011_01_4.html#a8bef27a409ee3c3bfea14a7f91266b5d',1,'openvdb::v3_2_0::util::NodeMask< 1 >::SIZE()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1NodeMask_3_012_01_4.html#a8bef27a409ee3c3bfea14a7f91266b5d',1,'openvdb::v3_2_0::util::NodeMask< 2 >::SIZE()'],['../structopenvdb_1_1v3__2__0_1_1VecTraits.html#a98e1f423a914fbfd9c6b25fa88a74460',1,'openvdb::v3_2_0::VecTraits::Size()'],['../structopenvdb_1_1v3__2__0_1_1VecTraits_3_01math_1_1Vec2_3_01T_01_4_01_4.html#a98e1f423a914fbfd9c6b25fa88a74460',1,'openvdb::v3_2_0::VecTraits< math::Vec2< T > >::Size()'],['../structopenvdb_1_1v3__2__0_1_1VecTraits_3_01math_1_1Vec3_3_01T_01_4_01_4.html#a98e1f423a914fbfd9c6b25fa88a74460',1,'openvdb::v3_2_0::VecTraits< math::Vec3< T > >::Size()'],['../structopenvdb_1_1v3__2__0_1_1VecTraits_3_01math_1_1Vec4_3_01T_01_4_01_4.html#a98e1f423a914fbfd9c6b25fa88a74460',1,'openvdb::v3_2_0::VecTraits< math::Vec4< T > >::Size()'],['../classopenvdb_1_1v3__2__0_1_1util_1_1PagedArray_1_1Page.html#ad9cbb88cc8635ed20ad0d21ab892fbdc',1,'openvdb::v3_2_0::util::PagedArray::Page::Size()'],['../classopenvdb_1_1v3__2__0_1_1math_1_1Tuple.html#aab938108caad0d0e47d6885b5ba2d23a',1,'openvdb::v3_2_0::math::Tuple::size()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1Morphology_1_1LeafCache.html#a854352f53b148adc24983a58a1866d66',1,'openvdb::v3_2_0::tools::Morphology::LeafCache::size()'],['../MaskToLevelSet_8h.html#aab938108caad0d0e47d6885b5ba2d23a',1,'size(): MaskToLevelSet.h'],['../ParticlesToLevelSet_8h.html#aab938108caad0d0e47d6885b5ba2d23a',1,'size(): ParticlesToLevelSet.h']]], + ['soff',['sOff',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#a2c2dd94242d16c17b9144c58d05db4b4',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::sOff()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#a2c2dd94242d16c17b9144c58d05db4b4',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::sOff()']]], + ['son',['sOn',['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#ad0df23e379999fac3d046d5d60299aca',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::sOn()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#ad0df23e379999fac3d046d5d60299aca',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::sOn()']]], + ['source',['source',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1ISLaplacianOp.html#afc7b08ed7dd68f1e1c2d802c318b43f8',1,'openvdb::v3_2_0::tools::poisson::internal::ISLaplacianOp']]], + ['spatialscheme',['spatialScheme',['../structopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker_1_1State.html#a37891ce976dc0d9f47cc1f1d94dfd2e8',1,'openvdb::v3_2_0::tools::LevelSetTracker::State']]], + ['stats',['stats',['../structopenvdb_1_1v3__2__0_1_1tools_1_1stats__internal_1_1StatsOp.html#a833304e665c728361734b29f86332dca',1,'openvdb::v3_2_0::tools::stats_internal::StatsOp']]], + ['stencil',['stencil',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckEikonal.html#ae91bf08b0b38829442e3748dc6b60f96',1,'openvdb::v3_2_0::tools::CheckEikonal']]], + ['streetypename',['sTreeTypeName',['../classopenvdb_1_1v3__2__0_1_1tree_1_1Tree.html#acc8fe71ac3494d1f468e2fc0ece4ca34',1,'openvdb::v3_2_0::tree::Tree']]], + ['success',['success',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1State.html#a7960f9c558f9ee2c3d4a8fdea096fb56',1,'openvdb::v3_2_0::math::pcg::State']]], + ['szerovalue',['sZeroValue',['../classopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix.html#a790d50d17536c3f6b1db2efb43f20aa3',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_f.html b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_f.html new file mode 100644 index 00000000..15a2fd58 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_f.html @@ -0,0 +1,26 @@ + + + + + + + + + +
+
Loading...
+
+ +
Searching...
+
No Matches
+ +
+ + diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_f.js b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_f.js new file mode 100644 index 00000000..be58ad09 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/search/variables_f.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['t',['t',['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1DeepCopy.html#a870bf8f16f4af48f5ea5ab1cef3b3990',1,'openvdb::v3_2_0::tree::InternalNode::DeepCopy::t()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy1.html#a870bf8f16f4af48f5ea5ab1cef3b3990',1,'openvdb::v3_2_0::tree::InternalNode::TopologyCopy1::t()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyCopy2.html#a870bf8f16f4af48f5ea5ab1cef3b3990',1,'openvdb::v3_2_0::tree::InternalNode::TopologyCopy2::t()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyUnion.html#a870bf8f16f4af48f5ea5ab1cef3b3990',1,'openvdb::v3_2_0::tree::InternalNode::TopologyUnion::t()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyIntersection.html#a870bf8f16f4af48f5ea5ab1cef3b3990',1,'openvdb::v3_2_0::tree::InternalNode::TopologyIntersection::t()'],['../structopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode_1_1TopologyDifference.html#a870bf8f16f4af48f5ea5ab1cef3b3990',1,'openvdb::v3_2_0::tree::InternalNode::TopologyDifference::t()']]], + ['t0',['t0',['../structopenvdb_1_1v3__2__0_1_1math_1_1Ray_1_1TimeSpan.html#abad8605a6cc153d57057f85aff470296',1,'openvdb::v3_2_0::math::Ray::TimeSpan']]], + ['t1',['t1',['../structopenvdb_1_1v3__2__0_1_1math_1_1Ray_1_1TimeSpan.html#a95687fa19792f11baca73b61f0b88740',1,'openvdb::v3_2_0::math::Ray::TimeSpan']]], + ['temporalscheme',['temporalScheme',['../structopenvdb_1_1v3__2__0_1_1tools_1_1LevelSetTracker_1_1State.html#aa5b428944097f49ee7303bf50657e0b3',1,'openvdb::v3_2_0::tools::LevelSetTracker::State']]], + ['to',['to',['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1internal_1_1CopyOp.html#a03f14612204aafa51f37586ca182529b',1,'openvdb::v3_2_0::math::pcg::internal::CopyOp::to()'],['../structopenvdb_1_1v3__2__0_1_1math_1_1pcg_1_1SparseStencilMatrix_1_1MatrixCopyOp.html#a4303ffb50d15a06d4a5a45ebd74d277a',1,'openvdb::v3_2_0::math::pcg::SparseStencilMatrix::MatrixCopyOp::to()']]], + ['tolval',['tolVal',['../structopenvdb_1_1v3__2__0_1_1tools_1_1CheckMagnitude.html#a2b7938ed37487cabd6b7ef3338c1e8a6',1,'openvdb::v3_2_0::tools::CheckMagnitude']]], + ['total',['TOTAL',['../classopenvdb_1_1v3__2__0_1_1tree_1_1InternalNode.html#adff5839c640682a9a122640e11486eaf',1,'openvdb::v3_2_0::tree::InternalNode::TOTAL()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode.html#adff5839c640682a9a122640e11486eaf',1,'openvdb::v3_2_0::tree::LeafNode::TOTAL()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01bool_00_01Log2Dim_01_4.html#adff5839c640682a9a122640e11486eaf',1,'openvdb::v3_2_0::tree::LeafNode< bool, Log2Dim >::TOTAL()'],['../classopenvdb_1_1v3__2__0_1_1tree_1_1LeafNode_3_01ValueMask_00_01Log2Dim_01_4.html#adff5839c640682a9a122640e11486eaf',1,'openvdb::v3_2_0::tree::LeafNode< ValueMask, Log2Dim >::TOTAL()']]], + ['tree',['tree',['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyToVecOp.html#a3cfdbfcce0bf5c9da0af4cd4bae56bf8',1,'openvdb::v3_2_0::tools::poisson::internal::CopyToVecOp::tree()'],['../structopenvdb_1_1v3__2__0_1_1tools_1_1poisson_1_1internal_1_1CopyFromVecOp.html#a950a3ca7232fd6b385c321830ead6244',1,'openvdb::v3_2_0::tools::poisson::internal::CopyFromVecOp::tree()'],['../MaskToLevelSet_8h.html#aa626f3df6e9e1c3192e1af84b51db04b',1,'tree(): MaskToLevelSet.h'],['../ParticlesToLevelSet_8h.html#aa626f3df6e9e1c3192e1af84b51db04b',1,'tree(): ParticlesToLevelSet.h']]] +]; diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/splitbar.png b/nuparu/include/openvdb/share/doc/openvdb/html/splitbar.png new file mode 100644 index 00000000..f347a6fe Binary files /dev/null and b/nuparu/include/openvdb/share/doc/openvdb/html/splitbar.png differ diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/sync_off.png b/nuparu/include/openvdb/share/doc/openvdb/html/sync_off.png new file mode 100644 index 00000000..24929b6f Binary files /dev/null and b/nuparu/include/openvdb/share/doc/openvdb/html/sync_off.png differ diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/sync_on.png b/nuparu/include/openvdb/share/doc/openvdb/html/sync_on.png new file mode 100644 index 00000000..29bb31ea Binary files /dev/null and b/nuparu/include/openvdb/share/doc/openvdb/html/sync_on.png differ diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/tab_a.png b/nuparu/include/openvdb/share/doc/openvdb/html/tab_a.png new file mode 100644 index 00000000..e9db1d1b Binary files /dev/null and b/nuparu/include/openvdb/share/doc/openvdb/html/tab_a.png differ diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/tab_b.png b/nuparu/include/openvdb/share/doc/openvdb/html/tab_b.png new file mode 100644 index 00000000..22dfb810 Binary files /dev/null and b/nuparu/include/openvdb/share/doc/openvdb/html/tab_b.png differ diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/tab_h.png b/nuparu/include/openvdb/share/doc/openvdb/html/tab_h.png new file mode 100644 index 00000000..4566b098 Binary files /dev/null and b/nuparu/include/openvdb/share/doc/openvdb/html/tab_h.png differ diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/tab_s.png b/nuparu/include/openvdb/share/doc/openvdb/html/tab_s.png new file mode 100644 index 00000000..3a8156dc Binary files /dev/null and b/nuparu/include/openvdb/share/doc/openvdb/html/tab_s.png differ diff --git a/nuparu/include/openvdb/share/doc/openvdb/html/tabs.css b/nuparu/include/openvdb/share/doc/openvdb/html/tabs.css new file mode 100644 index 00000000..f7913555 --- /dev/null +++ b/nuparu/include/openvdb/share/doc/openvdb/html/tabs.css @@ -0,0 +1,60 @@ +.tabs, .tabs2, .tabs3 { + background-image: url('tab_b.png'); + width: 100%; + z-index: 101; + font-size: 13px; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +} + +.tabs2 { + font-size: 10px; +} +.tabs3 { + font-size: 9px; +} + +.tablist { + margin: 0; + padding: 0; + display: table; +} + +.tablist li { + float: left; + display: table-cell; + background-image: url('tab_b.png'); + line-height: 36px; + list-style: none; +} + +.tablist a { + display: block; + padding: 0 20px; + font-weight: bold; + background-image:url('tab_s.png'); + background-repeat:no-repeat; + background-position:right; + color: #7D1008; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; + outline: none; +} + +.tabs3 .tablist a { + padding: 0 10px; +} + +.tablist a:hover { + background-image: url('tab_h.png'); + background-repeat:repeat-x; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); + text-decoration: none; +} + +.tablist li.current a { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} diff --git a/src/camera/camera.cpp b/src/camera/camera.cpp index fb246b12..bde9343d 100644 --- a/src/camera/camera.cpp +++ b/src/camera/camera.cpp @@ -1,6 +1,133 @@ -// -// camera.cpp -// Thanda -// +#include "camera.h" +#include -#include "camera.hpp" +Camera::Camera(): + Camera(800, 600) +{ +} + +Camera::Camera( + float width, + float height + ) : m_width(width), + m_height(height), + m_fov(45), + m_eye(glm::vec3(0.0f, 0.0f, -5.0f)), + m_target(glm::vec3(0.0f)), + m_up(glm::vec3(0.0f, 1.0f, 0.0f)), + m_right(glm::vec3(1.0f, 0.0f, 0.0f)), + m_nearClip(1.0f), + m_farClip(1000.0f) +{ + m_forward = m_target - m_eye; + RecomputeAttributes(); +} + +void +Camera::EnablePerspective( + bool enabled + ) +{ + m_isPerspective = enabled; + + if (!m_isPerspective) { + m_eye = glm::vec3(0.0, 0.0, 10.0); + } else { + m_eye = glm::vec3(10.0f, 10.0f, -20.0f); + } + RecomputeAttributes(); +} + +void +Camera::RecomputeAttributes() +{ + m_forward = m_target - m_eye; + m_right = glm::cross(m_forward, m_up); + + m_view = glm::lookAt( + m_eye, + m_target, + m_up + ); + + if (m_isPerspective) { + m_proj = glm::perspective( + m_fov, + m_width / m_height, + m_nearClip, + m_farClip + ); + } else { + m_proj = glm::ortho( + 0.0f, + m_width, + 0.0f, + m_height + ); + } +} + +glm::mat4 +Camera::GetViewProj() const +{ + return m_proj * m_view; +} + +void +Camera::RotateAboutRight( + float deg + ) +{ + deg *= DEG2RAD; + glm::mat4 rotation = glm::rotate(glm::mat4(1.0f), deg, m_up); + m_target = m_target - m_eye; + m_target = glm::vec3(rotation * glm::vec4(m_target, 1.0f)); + m_target = m_target + m_eye; + RecomputeAttributes(); +} + +void +Camera::RotateAboutUp( + float deg + ) +{ + deg *= DEG2RAD; + glm::mat4 rotation = glm::rotate(glm::mat4(1.0f), deg, m_right); + m_target = m_target - m_eye; + m_target = glm::vec3(rotation * glm::vec4(m_target, 1.0f)); + m_target = m_target + m_eye; + RecomputeAttributes(); +} + +void +Camera::Zoom( + float amount + ) +{ + glm::vec3 translation = m_forward * amount; + m_eye += translation; + m_target += translation; + RecomputeAttributes(); +} + +void +Camera::TranslateAlongRight( + float amt + ) +{ + glm::vec3 translation = m_right * amt; + m_eye += translation; + m_target += translation; + RecomputeAttributes(); +} + +void +Camera::TranslateAlongUp( + float amt + ) +{ + glm::vec3 translation = m_up * amt; + m_eye += translation; + m_target += translation; + RecomputeAttributes(); +} diff --git a/src/camera/camera.h b/src/camera/camera.h new file mode 100644 index 00000000..0b6879a2 --- /dev/null +++ b/src/camera/camera.h @@ -0,0 +1,47 @@ +#ifndef CAMERA_H +#define CAMERA_H + +#include +#include + +class Camera +{ +public: + Camera(); + Camera(float width, float height); + + // -- Camera attributes + glm::mat4 GetViewProj() const; + void EnablePerspective(bool enabled); + void RecomputeAttributes(); + inline const float Width() const { return m_width; } + inline const float Height() const { return m_height; } + + // -- Camera movement + void RotateAboutRight(float deg); + void RotateAboutUp(float deg); + void Zoom(float amount); + void TranslateAlongRight(float amount); + void TranslateAlongUp(float amount); + +protected: + + // -- Attributes + float m_width; + float m_height; + float m_fov; + glm::vec3 m_eye; + glm::vec3 m_target; + glm::vec3 m_forward; + glm::vec3 m_up; + glm::vec3 m_right; + float m_nearClip; + float m_farClip; + + glm::mat4 m_view; + glm::mat4 m_proj; + bool m_isPerspective = true; +}; + + +#endif /* CAMERA_H */ diff --git a/src/camera/camera.hpp b/src/camera/camera.hpp deleted file mode 100644 index 59ad2b12..00000000 --- a/src/camera/camera.hpp +++ /dev/null @@ -1,10 +0,0 @@ -// -// camera.hpp -// Thanda -// - -#ifndef camera_hpp -#define camera_hpp - - -#endif /* camera_hpp */ diff --git a/src/fluidSolver/SPHGrid.cpp b/src/fluidSolver/SPHGrid.cpp new file mode 100644 index 00000000..c4ce20e6 --- /dev/null +++ b/src/fluidSolver/SPHGrid.cpp @@ -0,0 +1,340 @@ +#include "SPHGrid.h" + +#define OPENVDB_SDF + +void +SPHGrid::WriteVdb( + const std::vector& particles, + size_t frameNumber + ) +{ +#ifdef OPENVDB_SDF + openvdb::initialize(); + + openvdb::FloatGrid::Ptr grid = openvdb::FloatGrid::create(10.0); + + CoordBBox indexBB(Coord(0, 0, 0), Coord(m_width, m_height, m_depth)); + MakeWaterSurface(grid, FluidParticle::separation, indexBB, m_cellSize, particles); + + // specify dataset name + grid->setName("WaterSurface"); + + // save grid in the file + openvdb::io::File file(string("geo_tank/fluidGeo") + to_string(frameNumber) + string(".vdb")); + openvdb::GridPtrVec grids; + grids.push_back(grid); + file.write(grids); + file.close(); +#endif + +#ifdef OPENVDB_POINTS + // Initialize the OpenVDB and OpenVDB Points library. This must be called at least + // once per program and may safely be called multiple times. + openvdb::initialize(); + openvdb::points::initialize(); + + // Create some point positions + std::vector positions; + + for (FluidParticle* p : particles) { + glm::vec3 + positions.push_back(openvdb::Vec3f(p->Position().x, p->Position().y, p->Position().z)); + } + + // Create a linear transform with voxel size of 10.0 + const float voxelSize = 10.0f; + openvdb::math::Transform::Ptr transform = openvdb::math::Transform::createLinearTransform(voxelSize); + + // Create the PointDataGrid, position attribute is mandatory + PointDataGrid::Ptr pointDataGrid = createPointDataGrid( + positions, TypedAttributeArray::attributeType(), *transform); + + // Create a VDB file object. + openvdb::io::File file("mygrids.vdb"); + + // Add the grid pointer to a container. + openvdb::GridPtrVec grids; + grids.push_back(pointDataGrid); + + // Write out the contents of the container. + file.write(grids); + file.close(); +#endif +} + +void +SPHGrid::MakeWaterSurface( + FloatGrid::Ptr grid, + const float radius, + const CoordBBox& indexBB, + const double cellSize, + const std::vector& particles + ) +{ + FloatGrid::Accessor accessor = grid->getAccessor(); + + for (Int32 i = indexBB.min().x(); i <= indexBB.max().x(); ++i) { + for (Int32 j = indexBB.min().y(); j <= indexBB.max().y(); ++j) { + for (Int32 k = indexBB.min().z(); k <= indexBB.max().z(); ++k) { + + // transform point (i, j, k) of index space into world space + glm::vec3 point = GetWorlCoord(glm::ivec3(i, j, k)); + + // compute level set function value + float distance = 9999; + + int cellIdx = GetCellIdx(i, j, k); + std::vector list = m_cells[cellIdx]; + + for (FluidParticle* particle : list) { + float voxelToParticle = glm::distance(particle->Position(), point) - radius; + if (voxelToParticle < distance) { + distance = voxelToParticle; + } + } + if (distance < 9999) { + accessor.setValue(Coord(i, j, k), distance); + } + } + } + } + + grid->setTransform(openvdb::math::Transform::createLinearTransform(cellSize)); +} + +// ---------------------------------------------------- // +// SPHGrid +// ---------------------------------------------------- // +SPHGrid::SPHGrid( + const std::vector& particles, + const glm::vec3& gridMin, + const glm::vec3& gridMax, + const double cellSize, + const bool useGrid + ) : m_width(1), m_height(1), m_depth(1), + m_cellSize(cellSize), m_gridMin(gridMin), m_gridMax(gridMax), + m_useGrid(useGrid) +{ + if (useGrid) { + m_width = ceil((m_gridMax.x - m_gridMin.x) / m_cellSize); + m_height = ceil((m_gridMax.y - m_gridMin.y) / m_cellSize); + m_depth = ceil((m_gridMax.z - m_gridMin.z) / m_cellSize); + m_cells.resize(m_width * m_height * m_depth); + + } else { + // Grid size is only 1 + m_cells.resize(1); + } + + this->ResetGrid(particles); + +} + +void +SPHGrid::ResetGrid( + const std::vector& particles + ) +{ + for(FluidParticle* p : particles) { + AddParticle(p); + } + + static size_t frameNumber = 0; + // WriteVdb(particles, frameNumber++); +} + +// Add particle to grid based on its position +void +SPHGrid::AddParticle( + FluidParticle* particle + ) +{ + if (!m_useGrid) { + // No grid, push particle in normally + m_cells[0].push_back(particle); + } else { + // Add particle to grid based on its position + int idx = GetCellIdx(particle->Position()); + if (idx > m_cells.size() || idx < 0) { + // LOG(WARNING) << "Error adding particle " + idx << endl; + return; + } + + // If the particle isn't added to the cell yet, add it now + if (std::find(m_cells[idx].begin(), m_cells[idx].end(),particle) == m_cells[idx].end()) { + m_cells[idx].push_back(particle); + } + } +} + +int +SPHGrid::GetCellIdx( + const glm::vec3& position + ) +{ + glm::ivec3 coord = GetCellCoord(position); + int i = coord.x; + int j = coord.y; + int k = coord.z; + + // -- Error checking + if (i < 0 || j < 0 || k < 0 || i >= m_width || j >= m_height || k >= m_depth) { + return -1; + } + + int idx = this->GetCellIdx(i, j, k); + return idx; +} + +int +SPHGrid::GetCellIdx( + int i, + int j, + int k + ) +{ +#define USE_Z_CURVE +#ifndef USE_Z_CURVE + int idx = i + j * m_depth + k * m_width * m_height; + if (idx < 0) { + LOG(ERROR) << "Get cell idx is negative " + idx << endl; + } +#else + // -- Uses z-curve indexing + // See https://en.wikipedia.org/wiki/Z-order_curve + + auto key = make_tuple(i, j, k); + if (m_idxCache.find(key) != m_idxCache.end()) { + // We already cached the index, return the value + return m_idxCache[key]; + } + + int i_temp = i; + int j_temp = j; + int k_temp = k; + int idx = 0; + int digit = 0; + while (i_temp != 0 || j_temp != 0 || k_temp != 0) { + // Interleave bits + char i_bit = i_temp & 0x1; + idx = idx | (i_bit << digit); + digit++; + i_temp = i_temp >> 1; + + char j_bit = j_temp & 0x1; + idx = idx | (j_bit << digit); + digit++; + j_temp = j_temp >> 1; + + char k_bit = k_temp & 0x1; + idx = idx | (k_bit << digit); + digit++; + k_temp = k_temp >> 1; + } + if (idx < 0 || idx > m_cells.size()) { + // LOG(ERROR) << "Get cell idx is negative " + idx << endl; + return -1; + } + m_idxCache[key] = idx; +#endif + return idx; +} + +glm::ivec3 +SPHGrid::GetCellCoord( + const glm::vec3& position + ) +{ + return glm::ivec3( + (position.x - m_gridMin.x) / m_cellSize, + (position.y - m_gridMin.y) / m_cellSize, + (position.z - m_gridMin.z) / m_cellSize + ); +} + +glm::vec3 +SPHGrid::GetWorlCoord( + const glm::ivec3& cellCoord + ) +{ + return glm::vec3( + cellCoord.x * m_cellSize + m_gridMin.x, + cellCoord.y * m_cellSize + m_gridMin.y, + cellCoord.z * m_cellSize + m_gridMin.z + ); +} + +void +SPHGrid::UpdateNeighbors( + FluidParticle* particle + ) +{ + particle->ResetNeighborCount(); + if (m_useGrid) { + this->UpdateNeighborsUniformGrid(particle); + } else { + this->UpdateNeighborsSimple(particle); + } +} + + +void +SPHGrid::UpdateNeighborsSimple( + FluidParticle* particle + ) +{ + size_t len = m_cells[0].size(); + + for (size_t i = 0; i < len; ++i) { + FluidParticle* neighbor = m_cells[0][i]; + if (glm::distance(neighbor->Position(), particle->Position()) < m_cellSize && + neighbor != particle) { + + if(!particle->AddNeighbor(neighbor)) { + // Can't add more neighbors to limit, stop loop + break; + } + } + } +} + +void +SPHGrid::UpdateNeighborsUniformGrid( + FluidParticle* particle + ) +{ + // -- Use grid to search neighbor + glm::ivec3 cellCoord = this->GetCellCoord(particle->Position()); + + // Search in all 27 neighboring cells + for (int i = -1; i <= 1; ++i) { + for (int j = -1; j <= 1; ++j) { + for (int k = -1; k <= 1; ++k) { + + // Check if any neighbor is out of bound + if (cellCoord.x + i < 0 || + cellCoord.y + j < 0 || + cellCoord.z + k < 0 || + cellCoord.x + i >= m_width || + cellCoord.y + j >= m_height || + cellCoord.z + k >= m_depth) { + continue; + } + + int idx = this->GetCellIdx(i + cellCoord.x, j + cellCoord.y, k + cellCoord.z); + + glm::vec3 particlePosition = particle->Position(); + for(FluidParticle* neighbor : m_cells[idx]) { + if (glm::distance(neighbor->Position(), particlePosition) < m_cellSize * 2.0 && + neighbor != particle) { + + if(!particle->AddNeighbor(neighbor)) { + // Can't add more neighbors to limit, stop loop + break; + } + } + } + } + } + } +} diff --git a/src/fluidSolver/SPHGrid.h b/src/fluidSolver/SPHGrid.h new file mode 100644 index 00000000..d40894cf --- /dev/null +++ b/src/fluidSolver/SPHGrid.h @@ -0,0 +1,93 @@ +#ifndef SPHGRID_H +#define SPHGRID_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef OPENVDB_POINTS +#include +#include +#include +#include +#endif + +#include + +#include +#include + +using namespace std; +using namespace tbb; +using namespace openvdb; + +// ---------------------------------------------------- // +// SPHGrid +// ---------------------------------------------------- // +class SPHGrid +{ +public: + SPHGrid( + const std::vector& particles, + const glm::vec3& gridMin, + const glm::vec3& gridMax, + const double cellSize, + const bool useGrid // Use grid to speed up neighbor search + ); + virtual void ResetGrid(const std::vector& particles); + virtual void AddParticle(FluidParticle* particle); + virtual void UpdateNeighbors( + FluidParticle* + ); + +private: + + int m_width; // Uses i or x + int m_height; // Uses j or y + int m_depth; // Uses k or z + double m_cellSize; // radius of particle influence + glm::vec3 m_gridMin; + glm::vec3 m_gridMax; + bool m_useGrid; + + // -- Grid + std::vector> m_cells; + std::map, int> m_idxCache; + + // -- Open vdb + void WriteVdb( + const std::vector& particles, + size_t frameNumber + ); + void MakeWaterSurface( + FloatGrid::Ptr grid, + const float radius, + const CoordBBox& indexBB, + const double cellSize, + const std::vector& particles + ); + + + // -- Cell idx/coordinates + int GetCellIdx(const glm::vec3&); + int GetCellIdx(int i, int j, int k); + glm::ivec3 GetCellCoord(const glm::vec3& position); + glm::vec3 GetWorlCoord(const glm::ivec3& cellCoord); + + // -- Neighbor search algorithms + void UpdateNeighborsSimple( + FluidParticle* + ); + void UpdateNeighborsUniformGrid( + FluidParticle* + ); +}; + +#endif diff --git a/src/fluidSolver/SPHKernels.h b/src/fluidSolver/SPHKernels.h new file mode 100644 index 00000000..f0464e9e --- /dev/null +++ b/src/fluidSolver/SPHKernels.h @@ -0,0 +1,76 @@ +#ifndef KERNELS_H +#define KERNELS_H + +#define _USE_MATH_DEFINES +#include +#include +#include + +inline double KernelPoly6(double x, double h) +{ + if (x < 0 || x > h) { + return 0; + } + + if (h <= 0) { + return 0; + } + /// @todo: cache h2 and x2 + double result = (315 * pow(h * h - x * x, 3.0f)) / (64.0f * M_PI * pow(h, 9.0f)); + return result < 0.0f ? 0.0f : result; +} + +inline double KernelSpiky(double x, double h) +{ + if (x < 0 || x > h) { + return 0; + } + + if (h <= 0) { + return 0; + } + + double result = (15.0f * pow(h - x, 3.0f)) / (M_PI * pow(h, 6.0f)); + return result < 0.0 ? 0.0f : result; +} + +inline glm::vec3 GradKernelSpiky(glm::vec3 x_vec, double x, double h) +{ + if (x <= 0 || x > h) { + return glm::vec3(0.0f); + } + + if (h <= 0) { + return glm::vec3(0.0f); + } + + float scalarPart = -45.0f * (h - x) * (h - x) / (M_PI * pow(h, 6.0f)); + return scalarPart * (x_vec) / (float)x; +} + +inline double LaplacianKernelViscous(double x, double h) +{ + return 45.0f * (h - x) / (M_PI * pow(h, 6.0f)); +} + +inline double KernelViscous(double x, double h) +{ + if (x <= 0 || x > h) { + return 0; + } + + if (h <= 0) { + return 0; + } + + return (15 * + ( + -(pow(x, 3) / (2 * pow(h, 3))) + + pow(x, 2) / (pow(h, 2)) + + h / (2 * x) - + 1 + )) / + (2 * M_PI * pow(h, 3)); +} + +#endif diff --git a/src/fluidSolver/SPHSolver.cpp b/src/fluidSolver/SPHSolver.cpp new file mode 100644 index 00000000..f80cb393 --- /dev/null +++ b/src/fluidSolver/SPHSolver.cpp @@ -0,0 +1,313 @@ +#include "SPHSolver.h" + +// ---------------------------------------------------- // +// SPHSolver +// ---------------------------------------------------- // +SPHSolver::SPHSolver( + const glm::vec3& containerDim, + const glm::vec3& particleDim, + const glm::vec3& particleCenter, + const float tankHeight, + const float separation, + const double cellSize, + const float stiffness, + const float viscosity, + const float mass, + const float restDensity + ) : FluidSolver(containerDim, particleDim, particleCenter, tankHeight, separation, mass), + m_grid(nullptr), + m_stiffness(stiffness), + m_viscosity(viscosity), + m_restDensity(restDensity), + m_kernelRadius(cellSize * 2.0) +{ + m_grid = new SPHGrid( + m_particles, + -m_containerDim, + m_containerDim, + cellSize, + true + ); + + srand(time(NULL)); +} + +SPHSolver::~SPHSolver() +{ + delete m_grid; +} + +void +SPHSolver::SetConstant( + SPHConstantType type, + float value + ) +{ + switch(type) { + case SPHStiffness: + m_stiffness = value; + break; + case SPHViscosity: + m_viscosity = value; + break; + case SPHRestDensity: + m_restDensity = value; + break; + case SPHMass: + FluidParticle::mass = value; + break; + } +} + +void +SPHSolver::CheckBoxIntersection( + Box* box + ) +{ + for (FluidParticle* particle : m_particles) { + glm::vec3 newVel; + bool intersected = false; + glm::vec3 newPos = box->Intersect(particle->Position(), newVel, intersected); + if (intersected) { + particle->SetPosition(newPos); + particle->SetVelocity(particle->Velocity() + 2.0f * newVel); + } + } +} + +void +SPHSolver::Update( + const float deltaT + ) +{ + m_grid->ResetGrid(m_particles); + + // -- Measure time to solve fluid + double startTime = glfwGetTime(); + +#ifdef USE_TBB + // -- Search all neighbors + int len = m_particles.size(); + parallel_for(0, len, [&](int i) { + FluidParticle* p = m_particles[i]; + m_grid->UpdateNeighbors(p); + }); + + // -- Calculate density & pressures + parallel_for(0, len, [&](int i) { + FluidParticle* p = m_particles[i]; + this->CalculateDensity(p); + this->CalculatePressure(p); + }); + + // -- Calculate force field + parallel_for(0, len, [&](int i) { + FluidParticle* p = m_particles[i]; + this->CalculatePressureForceField(p); + this->CalculateViscosityForceField(p); + }); + + // -- Update particles + parallel_for(0, len, [&](int i) { + FluidParticle* p = m_particles[i]; + this->UpdateDynamics(p, deltaT); + }); + +#else + + // -- Search all neighbors + for (FluidParticle* p : m_particles) { + m_grid->UpdateNeighbors(p); + } + + // -- Calculate density & pressures + for (FluidParticle* p : m_particles) { + this->CalculateDensity(p); + this->CalculatePressure(p); + } + + // -- Calculate force field + for (FluidParticle* p : m_particles) { + this->CalculatePressureForceField(p); + this->CalculateViscosityForceField(p); + } + + // -- Update particles + for (FluidParticle* p : m_particles) { + this->UpdateDynamics(p, deltaT); + } + +#endif + + double endTime = glfwGetTime(); + double deltaTime = double(endTime - startTime); +} + +void +SPHSolver::CalculateDensity( + FluidParticle* particle + ) +{ + // -- Compute density over a kernel function of neighbors + +#ifdef USE_TBB + float density = parallel_reduce( + blocked_range( particle->neighbors, particle->neighbors + particle->neighborsCount ), + 0.f, + [&](const blocked_range& range, float init)->float { + for( FluidParticle** neighbor = range.begin(); neighbor != range.end(); ++neighbor) + { + init += KernelPoly6(glm::distance((*neighbor)->Position(), particle->Position()), m_kernelRadius); + } + return init; + }, + []( float x, float y )->float { + return x + y; + } + ); +#else + float density = 0.0f; + for (size_t i = 0; i < particle->neighborsCount; ++i) { + FluidParticle* neighbor = particle->neighbors[i]; + float tempDensity = KernelPoly6(glm::distance(neighbor->Position(), particle->Position()), m_kernelRadius); + density += tempDensity; + } +#endif; + density = FluidParticle::mass * density; + particle->SetDensity(density); +} + +void +SPHSolver::CalculatePressure( + FluidParticle* particle + ) +{ + float pressure = m_stiffness * (particle->Density() - m_restDensity); + + // Clamp from being negative + // pressure = pressure < 0.0 ? 0 : pressure; + particle->SetPressure(pressure); +} + +void +SPHSolver::CalculatePressureForceField( + FluidParticle* particle + ) +{ + // -- Compute pressure gradient + glm::vec3 pressureGrad(0.0f); + float particleDensitySquared = particle->Density() * particle->Density(); + +#ifdef USE_TBB + pressureGrad = parallel_reduce( + blocked_range( particle->neighbors, particle->neighbors + particle->neighborsCount ), + glm::vec3(0.0), + [&](const blocked_range& range, glm::vec3 init)->glm::vec3 { + for( FluidParticle** neighbor = range.begin(); neighbor != range.end(); ++neighbor ) + { + glm::vec3 r = particle->Position() - (*neighbor)->Position(); + float x = glm::distance((*neighbor)->Position(), particle->Position()); + glm::vec3 kernelGrad = GradKernelSpiky(r, x, m_kernelRadius); + + float neighborDensitySquared = (*neighbor)->Density() * (*neighbor)->Density(); + float tempPressureForce = + ( + (particle->Pressure() / particleDensitySquared) + + ((*neighbor)->Pressure() / neighborDensitySquared) + ); + init += tempPressureForce * kernelGrad; + } + return init; + }, + []( glm::vec3 x, glm::vec3 y )->glm::vec3 { + return x + y; + } + ); +#else + for (size_t i = 0; i < particle->neighborsCount; ++i) { + FluidParticle* neighbor = particle->neighbors[i]; + glm::vec3 r = particle->Position() - neighbor->Position(); + float x = glm::distance(neighbor->Position(), particle->Position()); + glm::vec3 kernelGrad = GradKernelSpiky(r, x, m_kernelRadius); + + float neighborDensitySquared = neighbor->Density() * neighbor->Density(); + float tempPressureForce = + ( + particle->Pressure() / particleDensitySquared + + neighbor->Pressure() / neighborDensitySquared + ); + pressureGrad += tempPressureForce * kernelGrad; + } +#endif + pressureGrad = -pressureGrad * FluidParticle::mass * FluidParticle::mass; + particle->SetPressureForce(pressureGrad); + +} + +void +SPHSolver::CalculateViscosityForceField( + FluidParticle* particle + ) +{ + glm::vec3 viscosityForce(0.0f); + for (size_t i = 0; i < particle->neighborsCount; ++i) { + FluidParticle* neighbor = particle->neighbors[i]; + float laplacianKernelViscous = LaplacianKernelViscous(glm::distance(particle->Position(), neighbor->Position()), m_kernelRadius); + glm::vec3 tempVisForce = (neighbor->Velocity() - particle->Velocity()) * laplacianKernelViscous / neighbor->Density(); + viscosityForce += tempVisForce; + } + viscosityForce = viscosityForce * FluidParticle::mass * FluidParticle::mass * m_viscosity * 0.01f; + particle->SetViscosityForce(viscosityForce); +} + + +void +SPHSolver::UpdateDynamics( + FluidParticle* particle, + const float deltaT + ) +{ + particle->Update(deltaT); + + // Check boundary + glm::vec3 newPosition = particle->Position(); + glm::vec3 newVel = particle->Velocity(); + if (particle->Position().x < m_minBoundary.x + 0.01f) { + newPosition.x = m_minBoundary.x + 0.01f; + newVel.x = -newVel.x * 0.2; + // newVel.y *= 0.9f; + // newVel.z *= 0.9f; + } else if (particle->Position().x > m_maxBoundary.x - 0.01f) { + newPosition.x = m_maxBoundary.x - 0.01f; + newVel.x = -newVel.x * 0.2; + // newVel.y *= 0.9f; + // newVel.z *= 0.9f; + } + + if (particle->Position().y < m_minBoundary.y + 0.01f) { + newPosition.y = m_minBoundary.y + 0.01f; + newVel.y = -newVel.y * 0.2; + // newVel.x *= 0.9f; + // newVel.z *= 0.9f; + } else if (particle->Position().y > m_maxBoundary.y - 0.01f) { + newPosition.y = m_maxBoundary.y - 0.01f; + newVel.y = -newVel.y * 0.2f; + // newVel.x *= 0.9f; + // newVel.z *= 0.9f; + } + + if (particle->Position().z < m_minBoundary.z + 0.01f) { + newPosition.z = m_minBoundary.z + 0.01f; + newVel.z = -newVel.z * 0.2; + // newVel.x *= 0.9f; + // newVel.y *= 0.9f; + } else if (particle->Position().z > m_maxBoundary.z - 0.01f) { + newPosition.z = m_maxBoundary.z - 0.01f; + newVel.z = -newVel.z * 0.2; + // newVel.x *= 0.9f; + // newVel.y *= 0.9f; + } + + particle->SetPosition(newPosition); + particle->SetVelocity(newVel); +} diff --git a/src/fluidSolver/SPHSolver.h b/src/fluidSolver/SPHSolver.h new file mode 100644 index 00000000..537bc422 --- /dev/null +++ b/src/fluidSolver/SPHSolver.h @@ -0,0 +1,74 @@ +#ifndef SPHSOLVER_H +#define SPHSOLVER_H + +#include +#include +#include + +#define USE_TBB + +typedef enum { + SPHStiffness, + SPHViscosity, + SPHRestDensity, + SPHMass +} SPHConstantType; + +// ---------------------------------------------------- // +// SPHSolver +// ---------------------------------------------------- // +class SPHSolver : public FluidSolver +{ +public: + SPHSolver( + const glm::vec3& containerDim, + const glm::vec3& particleDim, + const glm::vec3& particleCenter, + const float tankHeight, + const float separation, + const double cellSize, + const float stiffness, + const float viscosity, + const float mass, + const float restDensity + ); + + virtual ~SPHSolver(); + + void SetConstant( + SPHConstantType type, + float value + ); + virtual void Update(const float deltaT); + void CheckBoxIntersection(Box* box); + void AddParticle(FluidParticle*); + +protected: + + SPHGrid* m_grid; + + // -- Particle info + float m_stiffness; + float m_viscosity; + float m_restDensity; + double m_kernelRadius; + + void CalculateDensity( + FluidParticle* particle + ); + void CalculatePressure( + FluidParticle* particle + ); + void CalculatePressureForceField( + FluidParticle* particle + ); + void CalculateViscosityForceField( + FluidParticle* particle + ); + void UpdateDynamics( + FluidParticle* particle, + const float deltaT + ); +}; + +#endif /* SPHSOLVER_H */ diff --git a/src/fluidSolver/fluidParticle.cpp b/src/fluidSolver/fluidParticle.cpp new file mode 100644 index 00000000..aa2e9235 --- /dev/null +++ b/src/fluidSolver/fluidParticle.cpp @@ -0,0 +1,42 @@ +#include "FluidParticle.h" + +float FluidParticle::mass = 0.125f; +SPHColor FluidParticle::colorType = SPHColorSimple; +float FluidParticle::separation = 0.05f; + +// ---------------------------------------------------- // +// FluidParticle +// ---------------------------------------------------- // +FluidParticle::FluidParticle() +{ + +} + +FluidParticle::FluidParticle( + const glm::vec3& pos, + const glm::vec3& vel, + const glm::vec4& col + ) :m_pos(pos), m_vel(vel), m_col(col) +{ + +} + +void +FluidParticle::Update( + const float deltaT + ) +{ + // @todo: HACK HERE, should read cell size from json! + float cellSize = 0.10001; + + glm::vec3 gravity(0.0f, GRAVITY, 0.0f); + m_force = (m_pressureForce + m_viscosityForce + gravity); + m_vel = m_vel + m_force * deltaT / FluidParticle::mass; + + // -- Enforce CFL condition + float vMax = 0.4 * cellSize / deltaT; + if (glm::length(m_vel) > vMax) { + m_vel = glm::normalize(m_vel) * vMax; + } + m_pos = m_pos + m_vel * deltaT; +} diff --git a/src/fluidSolver/fluidParticle.h b/src/fluidSolver/fluidParticle.h new file mode 100644 index 00000000..6bbc7b06 --- /dev/null +++ b/src/fluidSolver/fluidParticle.h @@ -0,0 +1,101 @@ +#ifndef FLUID_PARTICLE_H +#define FLUID_PARTICLE_H + +#include + +#include +#include +#include + +using namespace std; + +#define NEIGHBORS_MAX 1000 + +typedef enum { + SPHColorSimple, + SPHColorPressure, + SPHColorViscosity, + SPHColorVelocity, + SPHColorAllForces +} SPHColor; + +// ---------------------------------------------------- // +// FluidParticle +// ---------------------------------------------------- // +class FluidParticle +{ +public: + + static float mass; + static SPHColor colorType; + static float separation; + + FluidParticle(); + FluidParticle( + const glm::vec3& pos, + const glm::vec3& vel, + const glm::vec4& col + ); + + virtual void Update(const float deltaT); + + // -- Getters/setters + inline const glm::vec3& Position() const { return m_pos; } + inline void SetPosition(const glm::vec3& pos) { m_pos = pos; } + inline const glm::vec3& Velocity() const { return m_vel; } + inline void SetVelocity(const glm::vec3& vel) { m_vel = vel; } + inline const glm::vec4& Color() const { + switch(FluidParticle::colorType) { + case SPHColorSimple: + return m_col; + case SPHColorPressure: + return glm::vec4(glm::abs(m_pressureForce), 1.0f); + case SPHColorViscosity: + return glm::vec4(glm::abs(m_viscosityForce), 1.0f); + case SPHColorVelocity: + return glm::vec4(glm::abs(m_vel), 1.0f); + case SPHColorAllForces: + return glm::vec4(glm::abs(m_force), 1.0f); + default: + return m_col; + } + } + inline void SetColor(const glm::vec4& color) { m_col = color; } + inline const float& Density() const { return m_density; } + inline void SetDensity(float density) { m_density = density; } + inline const float Pressure() const { return m_pressure; } + inline void SetPressure(const float pressure) { m_pressure = pressure; } + inline const glm::vec3& PressureForce() const { return m_pressureForce; } + inline void SetPressureForce(const glm::vec3& pressureForce) { m_pressureForce = pressureForce; } + inline const glm::vec3& ViscosityForce() const { return m_viscosityForce; } + inline void SetViscosityForce(const glm::vec3& viscosityForce) { m_viscosityForce = viscosityForce; } + inline const float& SpawnTime() const { return m_spawnTime; } + inline void SetSpawnTime(float spawnTime) { m_spawnTime = spawnTime; } + inline void ResetNeighborCount() { neighborsCount = 0; } + + // @return true if successful + inline bool AddNeighbor(FluidParticle* neighbor) { + if (neighborsCount < NEIGHBORS_MAX) { + neighbors[neighborsCount++] = neighbor; + return true; + } else { + return false; + } + } + + FluidParticle* neighbors[NEIGHBORS_MAX]; + size_t neighborsCount = 0; + +protected: + glm::vec3 m_pos; + glm::vec3 m_vel; + glm::vec4 m_col; + glm::vec3 m_pressureForce; + glm::vec3 m_viscosityForce; + glm::vec3 m_force; + float m_pressure = 0.0f; + float m_density = 1.0f; + float m_spawnTime = 0.0f; +}; + +#endif diff --git a/src/fluidSolver/fluidSolver.cpp b/src/fluidSolver/fluidSolver.cpp index 9c9a1663..0c0083ee 100644 --- a/src/fluidSolver/fluidSolver.cpp +++ b/src/fluidSolver/fluidSolver.cpp @@ -1,6 +1,138 @@ -// -// fluidSolver.cpp -// Thanda +#include "fluidSolver.h" +// ---------------------------------------------------- // +// FluidSolver +// ---------------------------------------------------- // +FluidSolver::FluidSolver( + const glm::vec3& containerDim, + const glm::vec3& particleDim, + const glm::vec3& particleCenter, + const float tankHeight, + const float separation, + const float mass + ) : m_containerDim(containerDim), + m_particleDim(particleDim), + m_particleCenter(particleCenter), + m_separation(separation) +{ + // -- Store separation in particle class + FluidParticle::separation = m_separation; -#include "fluidSolver.hpp" + // -- Initialize all particles drops + float midX = m_particleDim.x / 2.f; + float midY = m_particleDim.y / 2.f; + float midZ = m_particleDim.z / 2.f; + for (float x = -midX; x < midX; x += m_separation) + { + for (float y = -midY; y < midY; y += m_separation) + { + for (float z = -midZ; z < midX; z += m_separation) + { + // float jitterx = static_cast (rand()) / static_cast (RAND_MAX); + // float jittery = static_cast (rand()) / static_cast (RAND_MAX); + // float jitterz = static_cast (rand()) / static_cast (RAND_MAX); + + m_particles.push_back( + new FluidParticle( + glm::vec3(x, y, z) + particleCenter, + glm::vec3(0.0f, 0.0f, 0.0f), + glm::vec4(0.3f, 0.3f, 1.0f, 1.0f) + ) + ); + } + } + } + + // -- Set container boundary + m_minBoundary = -m_containerDim / 2.0f; + m_maxBoundary = m_containerDim / 2.0f; + + // -- Initialize fluid tank at the bottom of the container + for (float x = m_minBoundary.z; x < m_maxBoundary.x; x += m_separation) + { + for (float y = m_minBoundary.y; y < m_minBoundary.y + tankHeight; y += m_separation) + { + for (float z = m_minBoundary.z; z < m_maxBoundary.z; z += m_separation) + { + m_particles.push_back( + new FluidParticle( + glm::vec3(x, y, z), + glm::vec3(0.0f, 0.0f, 0.0f), + glm::vec4(0.3f, 0.2f, 1.0f, 1.0f) + ) + ); + } + } + } + + // -- Set particle properties + FluidParticle::mass = mass; +} + +FluidSolver::~FluidSolver() +{ + for (auto &particle : m_particles) + { + if (particle != nullptr) + { + delete particle; + } + } +} + +const std::vector +FluidSolver::ParticlePositions() const +{ + std::vector positions; + for (auto &particle : m_particles) + { + positions.push_back(particle->Position()); + } + + return positions; +} + +const std::vector +FluidSolver::ParticleVelocities() const +{ + std::vector velocities; + for (auto &particle : m_particles) + { + velocities.push_back(particle->Velocity()); + } + + return velocities; +} + +const std::vector +FluidSolver::ParticleSpawnTimes() const +{ + std::vector spawnTimes; + for (auto &particle : m_particles) + { + spawnTimes.push_back(particle->SpawnTime()); + } + + return spawnTimes; +} + +const std::vector +FluidSolver::ParticleColors() const +{ + int len = m_particles.size(); + std::vector colors; + colors.resize(len); + for (int i = 0; i < len; ++i) { + FluidParticle* particle = m_particles[i]; + colors.insert(colors.begin() + i, particle->Color()); + } + + return colors; +} + +void +FluidSolver::Update( + const float deltaT + ) +{ +} diff --git a/src/fluidSolver/fluidSolver.h b/src/fluidSolver/fluidSolver.h new file mode 100644 index 00000000..80a528df --- /dev/null +++ b/src/fluidSolver/fluidSolver.h @@ -0,0 +1,60 @@ +#ifndef FLUIDSOLVER_H +#define FLUIDSOLVER_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +using namespace tbb; + +// ---------------------------------------------------- // +// FluidSolver +// ---------------------------------------------------- // +class FluidSolver +{ +public: + FluidSolver( + const glm::vec3& containerDim, + const glm::vec3& particleDim, + const glm::vec3& particleCenter, + const float tankHeight, + const float separation, + const float mass + ); + + virtual ~FluidSolver(); + virtual const std::vector ParticlePositions() const; + virtual const std::vector ParticleVelocities() const; + virtual const std::vector ParticleSpawnTimes() const; + virtual const std::vector ParticleColors() const; + + virtual void Update(const float deltaT); + + inline const uint NumParticles() const { + return m_particles.size(); + } + +protected: + + // -- Particle info + glm::vec3 m_containerDim; + glm::vec3 m_particleDim; + glm::vec3 m_particleCenter; + glm::vec3 m_minBoundary; + glm::vec3 m_maxBoundary; + float m_separation; + + // @todo: convert to shared pointers + std::vector m_particles; +}; + +#endif /* FLUIDSOLVER_H */ diff --git a/src/fluidSolver/fluidSolver.hpp b/src/fluidSolver/fluidSolver.hpp deleted file mode 100644 index 6429c4e3..00000000 --- a/src/fluidSolver/fluidSolver.hpp +++ /dev/null @@ -1,9 +0,0 @@ -// -// fluidSolver.hpp -// Thanda - -#ifndef fluidSolver_hpp -#define fluidSolver_hpp - - -#endif /* fluidSolver_hpp */ diff --git a/src/fluidSolver/geo/fluidGeo.bgeo b/src/fluidSolver/geo/fluidGeo.bgeo new file mode 100644 index 00000000..34215732 Binary files /dev/null and b/src/fluidSolver/geo/fluidGeo.bgeo differ diff --git a/src/geom/geom.cpp b/src/geom/geom.cpp deleted file mode 100644 index c4438fdc..00000000 --- a/src/geom/geom.cpp +++ /dev/null @@ -1,5 +0,0 @@ -// -// geom.cpp -// Thanda - -#include "geom.hpp" diff --git a/src/geom/geom.hpp b/src/geom/geom.hpp deleted file mode 100644 index 91e658f7..00000000 --- a/src/geom/geom.hpp +++ /dev/null @@ -1,9 +0,0 @@ -// -// geom.hpp -// Thanda - -#ifndef geom_hpp -#define geom_hpp - - -#endif /* geom_hpp */ diff --git a/src/geometry/box.cpp b/src/geometry/box.cpp new file mode 100644 index 00000000..88c16075 --- /dev/null +++ b/src/geometry/box.cpp @@ -0,0 +1,281 @@ +#include "box.h" + +Box::Box( + DrawMode drawMode + ) +{ + SetDrawMode(drawMode); + InitPositions(); + InitNormals(); + InitColors(); + InitIndices(); +} + +const glm::vec3 +Box::GetMinBoundary() const +{ + // @todo: use global transformation when building a scene graph + return m_translation - m_scale / 2.0f; +} + +const glm::vec3 +Box::GetMaxBoundary() const +{ + // @todo: use global transformation when building a scene graph + return m_translation + m_scale / 2.0f; +} + +glm::vec3 +Box::Intersect( + const glm::vec3& position, + glm::vec3& newVelocity, + bool& intersected + ) +{ + glm::vec3 localPos = glm::vec3(glm::inverse(m_localTransform) * glm::vec4(position, 1.0f)); + if (localPos.x < 0.5f && localPos.x > -0.5f && + localPos.y < 0.5f && localPos.y > -0.5f && + localPos.z < 0.5f && localPos.z > -0.5f + ) + { + // Find the nearest face, the push it out that way + float minDis = 99999; + float dis[6] = { + fabs(localPos.x - 0.5f), + fabs(localPos.x + 0.5f), + fabs(localPos.y - 0.5f), + fabs(localPos.y + 0.5f), + fabs(localPos.z - 0.5f), + fabs(localPos.z + 0.5f) + }; + + BoxFace face = BoxFace_PosX; + for (char f = 0; f < (char)BoxFace_Max; ++f) { + if (dis[f] < minDis) { + minDis = dis[f]; + face = (BoxFace)f; + } + } + + switch(face) { + case BoxFace_PosX: + localPos.x = 0.55f; + newVelocity = glm::vec3(1.0f, 0.0f, 0.0f); + break; + case BoxFace_NegX: + localPos.x = -0.55f; + newVelocity = glm::vec3(-1.0f, 0.0f, 0.0f); + break; + case BoxFace_PosY: + localPos.y = 0.55f; + newVelocity = glm::vec3(0.0f, 1.0f, 0.0f); + break; + case BoxFace_NegY: + localPos.y = -0.55f; + newVelocity = glm::vec3(0.0f, -1.0f, 0.0f); + break; + case BoxFace_PosZ: + localPos.z = 0.55f; + newVelocity = glm::vec3(0.0f, 0.0f, 1.0f); + break; + case BoxFace_NegZ: + localPos.z = -0.55f; + newVelocity = glm::vec3(0.0f, 0.0f, -1.0f); + break; + } + newVelocity = glm::vec3(m_localTransform * glm::vec4(newVelocity, 0.0f)); + + intersected = true; + + glm::vec3 positionWorld = glm::vec3(m_localTransform * glm::vec4(localPos, 1.0f)); + return positionWorld; + } + + return position; +} + + +void +Box::InitPositions() +{ + m_positions.clear(); + //Front face + //UR + m_positions.push_back(glm::vec3(0.5f, 0.5f, 0.5f)); + //LR + m_positions.push_back(glm::vec3(0.5f, -0.5f, 0.5f)); + //LL + m_positions.push_back(glm::vec3(-0.5f, -0.5f, 0.5f)); + //UL + m_positions.push_back(glm::vec3(-0.5f, 0.5f, 0.5f)); + + //Right face + //UR + m_positions.push_back(glm::vec3(0.5f, 0.5f, -0.5f)); + //LR + m_positions.push_back(glm::vec3(0.5f, -0.5f, -0.5f)); + //LL + m_positions.push_back(glm::vec3(0.5f, -0.5f, 0.5f)); + //UL + m_positions.push_back(glm::vec3(0.5f, 0.5f, 0.5f)); + + //Left face + //UR + m_positions.push_back(glm::vec3(-0.5f, 0.5f, 0.5f)); + //LR + m_positions.push_back(glm::vec3(-0.5f, -0.5f, 0.5f)); + //LL + m_positions.push_back(glm::vec3(-0.5f, -0.5f, -0.5f)); + //UL + m_positions.push_back(glm::vec3(-0.5f, 0.5f, -0.5f)); + + //Back face + //UR + m_positions.push_back(glm::vec3(-0.5f, 0.5f, -0.5f)); + //LR + m_positions.push_back(glm::vec3(-0.5f, -0.5f, -0.5f)); + //LL + m_positions.push_back(glm::vec3(0.5f, -0.5f, -0.5f)); + //UL + m_positions.push_back(glm::vec3(0.5f, 0.5f, -0.5f)); + + //Top face + //UR + m_positions.push_back(glm::vec3(0.5f, 0.5f, -0.5f)); + //LR + m_positions.push_back(glm::vec3(0.5f, 0.5f, 0.5f)); + //LL + m_positions.push_back(glm::vec3(-0.5f, 0.5f, 0.5f)); + //UL + m_positions.push_back(glm::vec3(-0.5f, 0.5f, -0.5f)); + + //Bottom face + //UR + m_positions.push_back(glm::vec3(0.5f, -0.5f, 0.5f)); + //LR + m_positions.push_back(glm::vec3(0.5f, -0.5f, -0.5f)); + //LL + m_positions.push_back(glm::vec3(-0.5f, -0.5f, -0.5f)); + //UL + m_positions.push_back(glm::vec3(-0.5f, -0.5f, 0.5f)); +} + +void +Box::InitNormals() +{ + m_normals.clear(); + // Front face + m_normals.push_back(glm::vec3(0.0f, 0.0f, 1.0f)); + //LR + m_normals.push_back(glm::vec3(0.0f, 0.0f, 1.0f)); + //LL + m_normals.push_back(glm::vec3(0.0f, 0.0f, 1.0f)); + //UL + m_normals.push_back(glm::vec3(0.0f, 0.0f, 1.0f)); + + //Right face + //UR + m_normals.push_back(glm::vec3(1.0f, 0.0f, 0.0f)); + //LR + m_normals.push_back(glm::vec3(1.0f, 0.0f, 0.0f)); + //LL + m_normals.push_back(glm::vec3(1.0f, 0.0f, 0.0f)); + //UL + m_normals.push_back(glm::vec3(1.0f, 0.0f, 0.0f)); + + //Left face + //UR + m_normals.push_back(glm::vec3(-1.0f, 0.0f, 0.0f)); + //LR + m_normals.push_back(glm::vec3(-1.0f, 0.0f, 0.0f)); + //LL + m_normals.push_back(glm::vec3(-1.0f, 0.0f, 0.0f)); + //UL + m_normals.push_back(glm::vec3(-1.0f, 0.0f, 0.0f)); + + //Back face + //UR + m_normals.push_back(glm::vec3(0.0f, 0.0f, -1.0f)); + //LR + m_normals.push_back(glm::vec3(0.0f, 0.0f, -1.0f)); + //LL + m_normals.push_back(glm::vec3(0.0f, 0.0f, -1.0f)); + //UL + m_normals.push_back(glm::vec3(0.0f, 0.0f, -1.0f)); + + //Top face + //UR + m_normals.push_back(glm::vec3(0.0f, 1.0f, 0.0f)); + //LR + m_normals.push_back(glm::vec3(0.0f, 1.0f, 0.0f)); + //LL + m_normals.push_back(glm::vec3(0.0f, 1.0f, 0.0f)); + //UL + m_normals.push_back(glm::vec3(0.0f, 1.0f, 0.0f)); + + //Bottom face + //UR + m_normals.push_back(glm::vec3(0.0f, -1.0f, 0.0f)); + //LR + m_normals.push_back(glm::vec3(0.0f, -1.0f, 0.0f)); + //LL + m_normals.push_back(glm::vec3(0.0f, -1.0f, 0.0f)); + //UL + m_normals.push_back(glm::vec3(0.0f, -1.0f, 0.0f)); +} + +void +Box::InitColors() +{ + if (m_colors.size() == 0) { + // Set default color + int len = m_positions.size(); + for (int i = 0; i < len; ++i) { + m_colors.push_back(glm::vec4(0, 1.0f, 1.0f, 1.0f)); + } + } +} + +void +Box::InitIndices() +{ + m_indices.clear(); + if (m_drawMode == DrawMode_Wireframe) + { + // Square for each face + for(int i = 0; i < 6; i++){ + m_indices.push_back(i * 4); + m_indices.push_back(i * 4 + 1); + m_indices.push_back(i * 4 + 1); + m_indices.push_back(i * 4 + 2); + m_indices.push_back(i * 4 + 2); + m_indices.push_back(i * 4 + 3); + m_indices.push_back(i * 4 + 3); + m_indices.push_back(i * 4); + } + } + else if (m_drawMode == DrawMode_Shaded) + { + // Two triangles for each faces + for(int i = 0; i < 6; i++){ + m_indices.push_back(i * 4); + m_indices.push_back(i * 4 + 1); + m_indices.push_back(i * 4 + 2); + m_indices.push_back(i * 4); + m_indices.push_back(i * 4 + 2); + m_indices.push_back(i * 4 + 3); + } + } +} + +void +Box::Create() +{ + glGenVertexArrays(1, &m_vao); + glGenBuffers(1, &m_posBuffer); + glGenBuffers(1, &m_norBuffer); + glGenBuffers(1, &m_colBuffer); + glGenBuffers(1, &m_idxBuffer); + + UpdateVAO(); +} diff --git a/src/geometry/box.h b/src/geometry/box.h new file mode 100644 index 00000000..d7a3c036 --- /dev/null +++ b/src/geometry/box.h @@ -0,0 +1,36 @@ +#ifndef BOX_H +#define BOX_H + +#include + +typedef enum { + BoxFace_PosX, + BoxFace_NegX, + BoxFace_PosY, + BoxFace_NegY, + BoxFace_PosZ, + BoxFace_NegZ, + BoxFace_Max +} BoxFace; + +class Box : public Geometry +{ +public: + Box(DrawMode mode); + virtual void Create(); + virtual glm::vec3 Intersect( + const glm::vec3& position, + glm::vec3& newVelocity, + bool& intersected + ); + virtual const glm::vec3 GetMinBoundary() const; + virtual const glm::vec3 GetMaxBoundary() const; + +protected: + virtual void InitPositions(); + virtual void InitNormals(); + virtual void InitColors(); + virtual void InitIndices(); +}; + +#endif diff --git a/src/geometry/fluidGeo.cpp b/src/geometry/fluidGeo.cpp new file mode 100644 index 00000000..35d157fa --- /dev/null +++ b/src/geometry/fluidGeo.cpp @@ -0,0 +1,193 @@ +#include +#include +#include + +FluidGeo::FluidGeo( + const vector& positions, + const vector& velocities, + const vector& spawnTimes, + const vector& colors + ) : + m_velocities(velocities), + m_spawnTimes(spawnTimes), + m_useVao2(false) +{ + m_positions = positions; + m_colors = colors; +} + +GLenum +FluidGeo::GLDrawMode() const +{ + return GL_POINTS; +} + +void +FluidGeo::ToggleVao() +{ + m_useVao2 = !m_useVao2; +} + +GLuint +FluidGeo::PosBuffer() const +{ + return m_useVao2 ? m_posBuffer2 : m_posBuffer; +} + +GLuint +FluidGeo::VelBuffer() const +{ + return m_useVao2 ? m_velBuffer2 : m_velBuffer; +} + +GLuint +FluidGeo::SpawnTimeBuffer() const +{ + return m_useVao2 ? m_spawnTimeBuffer2 : m_spawnTimeBuffer; +} + +GLuint +FluidGeo::ColBuffer() const +{ + return m_useVao2 ? m_colBuffer2 : m_colBuffer; +} + +void +FluidGeo::EnableVertexAttributes() const +{ + GLuint curvao = m_useVao2 ? m_vao2 : m_vao; + GLuint curposBuffer = m_useVao2 ? m_posBuffer2 : m_posBuffer; + GLuint curvelBuffer = m_useVao2 ? m_velBuffer2 : m_velBuffer; + GLuint curspawntimeBuffer = m_useVao2 ? m_spawnTimeBuffer2 : m_spawnTimeBuffer; + GLuint curColBuffer = m_useVao2 ? m_colBuffer2 : m_colBuffer; + + glBindVertexArray(curvao); + + // Enable vertex attributes + glBindBuffer(GL_ARRAY_BUFFER, curposBuffer); + glVertexAttribPointer(POSITION_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); + + glBindBuffer(GL_ARRAY_BUFFER, curvelBuffer); + glVertexAttribPointer(VELOCITY_LOCATION, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); + + glBindBuffer(GL_ARRAY_BUFFER, curspawntimeBuffer); + glVertexAttribPointer(SPAWNTIME_LOCATION, 1, GL_FLOAT, GL_FALSE, 0, (void*)0); + + glBindBuffer(GL_ARRAY_BUFFER, curColBuffer); + glVertexAttribPointer(COLOR_LOCATION, 4, GL_FLOAT, GL_FALSE, 0, (void*)0); + + glEnableVertexAttribArray(POSITION_LOCATION); + glEnableVertexAttribArray(VELOCITY_LOCATION); + glEnableVertexAttribArray(SPAWNTIME_LOCATION); + glEnableVertexAttribArray(COLOR_LOCATION); +} + +void +FluidGeo::DisableVertexAttributes() const +{ + glDisableVertexAttribArray(POSITION_LOCATION); + glDisableVertexAttribArray(VELOCITY_LOCATION); + glDisableVertexAttribArray(SPAWNTIME_LOCATION); + glDisableVertexAttribArray(COLOR_LOCATION); + glBindBuffer(GL_ARRAY_BUFFER, NULL); + glBindVertexArray(NULL); +} + +void +FluidGeo::Create() +{ + InitIndices(); + + glGenBuffers(1, &m_idxBuffer); + + glGenVertexArrays(1, &m_vao); + glGenBuffers(1, &m_posBuffer); + glGenBuffers(1, &m_velBuffer); + glGenBuffers(1, &m_spawnTimeBuffer); + glGenBuffers(1, &m_colBuffer); + + // -- Secondary vao to ping-pong transform feedback + glGenVertexArrays(1, &m_vao2); + glGenBuffers(1, &m_posBuffer2); + glGenBuffers(1, &m_velBuffer2); + glGenBuffers(1, &m_spawnTimeBuffer2); + glGenBuffers(1, &m_colBuffer2); + + // Share the same m_idxBuffer + glBindVertexArray(m_vao); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_idxBuffer); + glBufferData( + GL_ELEMENT_ARRAY_BUFFER, + m_indices.size() * sizeof(GLushort), + &m_indices[0], + GL_STATIC_DRAW + ); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, NULL); + glBindVertexArray(NULL); + + glBindVertexArray(m_vao2); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_idxBuffer); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, NULL); + glBindVertexArray(NULL); + + UpdateVao(); + ToggleVao(); + UpdateVao(); + ToggleVao(); +} + +void +FluidGeo::UpdateVao() +{ + GLuint curvao = m_useVao2 ? m_vao2 : m_vao; + GLuint curposBuffer = m_useVao2 ? m_posBuffer2 : m_posBuffer; + GLuint curvelBuffer = m_useVao2 ? m_velBuffer2 : m_velBuffer; + GLuint curspawntimeBuffer = m_useVao2 ? m_spawnTimeBuffer2 : m_spawnTimeBuffer; + GLuint curColBuffer = m_useVao2 ? m_colBuffer2 : m_colBuffer; + + glBindVertexArray(curvao); + glBindBuffer(GL_ARRAY_BUFFER, curposBuffer); + glBufferData( + GL_ARRAY_BUFFER, + m_positions.size() * sizeof(glm::vec3), + &m_positions[0], + GL_DYNAMIC_COPY); + glBindBuffer(GL_ARRAY_BUFFER, NULL); + + glBindBuffer(GL_ARRAY_BUFFER, curvelBuffer); + glBufferData( + GL_ARRAY_BUFFER, + m_velocities.size() * sizeof(glm::vec3), + &m_velocities[0], + GL_DYNAMIC_COPY); + glBindBuffer(GL_ARRAY_BUFFER, NULL); + + glBindBuffer(GL_ARRAY_BUFFER, curspawntimeBuffer); + glBufferData( + GL_ARRAY_BUFFER, + m_spawnTimes.size() * sizeof(float), + &m_spawnTimes[0], + GL_DYNAMIC_COPY); + glBindBuffer(GL_ARRAY_BUFFER, NULL); + + glBindBuffer(GL_ARRAY_BUFFER, curColBuffer); + glBufferData( + GL_ARRAY_BUFFER, + m_colors.size() * sizeof(glm::vec4), + &m_colors[0], + GL_DYNAMIC_COPY); + glBindBuffer(GL_ARRAY_BUFFER, NULL); + + glBindVertexArray(NULL); +} + +// ------ Private ------ // +void +FluidGeo::InitIndices() +{ + int len = m_positions.size(); + for (int i = 0; i < len; ++i) + { + m_indices.push_back(i); + } +} diff --git a/src/geometry/fluidGeo.h b/src/geometry/fluidGeo.h new file mode 100644 index 00000000..40fe3cda --- /dev/null +++ b/src/geometry/fluidGeo.h @@ -0,0 +1,64 @@ +#ifndef FLUID_GEO_H +#define FLUID_GEO_H + +#include +#include + +class FluidGeo : public Geometry +{ +public: + FluidGeo( + const vector& positions, + const vector& velocities, + const vector& spawnTimes, + const vector& colors + ); + + virtual void Create(); + virtual GLenum GLDrawMode() const; + + // Override to update transform feedback buffers + virtual void EnableVertexAttributes() const; + virtual void DisableVertexAttributes() const; + + // Vao -> vertex array object + virtual void UpdateVao(); + + void ToggleVao(); + + // Getters/Setters + GLuint PosBuffer() const; + GLuint VelBuffer() const; + GLuint SpawnTimeBuffer() const; + GLuint ColBuffer() const; + void SetVelocities(const vector& velocities) { + m_velocities = velocities; + } + +protected: + virtual void InitIndices(); + + vector m_velocities; + vector m_spawnTimes; + + // -- Secondary vao to ping-pong transform feedback + + // Which vao we are using + bool m_useVao2; + + // Vertex buffers + GLuint m_posBuffer2; + + GLuint m_velBuffer; + GLuint m_velBuffer2; + + GLuint m_spawnTimeBuffer; + GLuint m_spawnTimeBuffer2; + + GLuint m_colBuffer2; + + // Vertex array object + GLuint m_vao2; +}; + +#endif diff --git a/src/geometry/geometry.cpp b/src/geometry/geometry.cpp new file mode 100644 index 00000000..ff3523fc --- /dev/null +++ b/src/geometry/geometry.cpp @@ -0,0 +1,158 @@ +#include "geometry.h" + +void +Geometry::SetDrawMode( + DrawMode drawMode + ) +{ + m_drawMode = drawMode; +} + +GLenum +Geometry::GLDrawMode() const +{ + switch(m_drawMode) { + case DrawMode_Wireframe: + return GL_LINES; + case DrawMode_Vertex: + return GL_POINTS; + case DrawMode_Shaded: + default: + return GL_TRIANGLES; + } +} + +GLsizei +Geometry::ElementCount() const +{ + return m_indices.size(); +} + +void +Geometry::EnableVertexAttributes() const +{ + glBindVertexArray(m_vao); + + // Enable vertex attributes + glEnableVertexAttribArray(0); + glBindBuffer(GL_ARRAY_BUFFER, m_posBuffer); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); + + glEnableVertexAttribArray(1); + glBindBuffer(GL_ARRAY_BUFFER, m_norBuffer); + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); + + glEnableVertexAttribArray(2); + glBindBuffer(GL_ARRAY_BUFFER, m_colBuffer); + glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 0, (void*)0); + + // Bind element buffer + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_idxBuffer); +} + +void +Geometry::DisableVertexAttributes() const +{ + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, NULL); + glDisableVertexAttribArray(0); + glDisableVertexAttribArray(1); + glDisableVertexAttribArray(2); + glBindBuffer(GL_ARRAY_BUFFER, NULL); + glBindVertexArray(NULL); +} + +void +Geometry::Translate( + const float& x, + const float& y, + const float& z + ) +{ + m_localTransform = glm::translate(m_localTransform, glm::vec3(x, y, z)); + m_translation += glm::vec3(x, y, z); +} + +void +Geometry::Rotate( + const float& radx, + const float& rady, + const float& radz + ) +{ + m_localTransform = glm::rotate(m_localTransform, radx, glm::vec3(1.0f, 0.0f, 0.0f)); + m_localTransform = glm::rotate(m_localTransform, rady, glm::vec3(0.0f, 1.0f, 0.0f)); + m_localTransform = glm::rotate(m_localTransform, radz, glm::vec3(0.0f, 0.0f, 1.0f)); + + m_orientation *= glm::quat(glm::vec3(radx, rady, radz)); +} + +void +Geometry::Scale( + const float& scalex, + const float& scaley, + const float& scalez + ) +{ + m_localTransform = glm::scale(m_localTransform, glm::vec3(scalex, scaley, scalez)); + + m_scale += glm::vec3(scalex, scaley, scalez); +} + +glm::mat4 +Geometry::GetLocalTransformation() const +{ + return m_localTransform; +} + +glm::mat4 +Geometry::GetGlobalTransformation() const +{ + return m_globalTransform; +} + +void +Geometry::UpdateVAO() +{ + glBindVertexArray(m_vao); + + // @todo: Is it faster to allocate all the buffers ahead of time? + + // -- Position + + glBindBuffer(GL_ARRAY_BUFFER, m_posBuffer); + glBufferData( + GL_ARRAY_BUFFER, + m_positions.size() * sizeof(glm::vec3), + &m_positions[0], + GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, NULL); + + glBindBuffer(GL_ARRAY_BUFFER, m_norBuffer); + glBufferData( + GL_ARRAY_BUFFER, + m_normals.size() * sizeof(glm::vec3), + &m_normals[0], + GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, NULL); + + glBindBuffer(GL_ARRAY_BUFFER, m_colBuffer); + glBufferData( + GL_ARRAY_BUFFER, + m_colors.size() * sizeof(glm::vec4), + &m_colors[0], + GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, NULL); + + // -- Index + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_idxBuffer); + glBufferData( + GL_ELEMENT_ARRAY_BUFFER, + m_indices.size() * sizeof(GLushort), + &m_indices[0], + GL_STATIC_DRAW + ); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, NULL); + + glBindVertexArray(NULL); +} diff --git a/src/geometry/geometry.h b/src/geometry/geometry.h new file mode 100644 index 00000000..8706ee72 --- /dev/null +++ b/src/geometry/geometry.h @@ -0,0 +1,108 @@ +#ifndef GEOMETRY_H +#define GEOMETRY_H + +// GL libraries + +#include +#include +#include +#include +#include +#include +#include +// C++ + +#include +#include + +// Custom + +#include + + +#define POSITION_LOCATION 0 +#define VELOCITY_LOCATION 1 +#define SPAWNTIME_LOCATION 2 +#define COLOR_LOCATION 3 + + +typedef enum { + DrawMode_Wireframe, + DrawMode_Shaded, + DrawMode_Vertex +} DrawMode; + +using namespace std; + +class Geometry +{ +public: + virtual void Create() = 0; + virtual void UpdateVAO(); + + // -- OpenGL helpers + virtual void SetDrawMode(DrawMode); + virtual GLenum GLDrawMode() const; + virtual GLsizei ElementCount() const; + + // Bind the vertex array object for this geometry + virtual void EnableVertexAttributes() const; + virtual void DisableVertexAttributes() const; + + // Getters/Setters + void SetColor(const glm::vec4& color) { + m_colors.clear(); + int len = m_positions.size(); + for (int i = 0; i < len; ++i) { + m_colors.push_back(color); + } + } + void SetColors(const vector& colors) { + m_colors = colors; + }; + + void SetPositions(const std::vector& positions) { + m_positions = positions; + } + + const GLuint PosBuffer() const { return m_posBuffer; } + const GLuint NorBuffer() const { return m_norBuffer; } + const GLuint ColBuffer() const { return m_colBuffer; } + + virtual glm::vec3 Intersect(const glm::vec3& position) {return position;} + + // -- Transformations + void Translate(const float& x, const float& y, const float& z); + void Rotate(const float& radx, const float& rady, const float& radz); + void Scale(const float& scaleX, const float& scaleY, const float& scaleZ); + glm::mat4 GetLocalTransformation() const; + glm::mat4 GetGlobalTransformation() const; + +protected: + DrawMode m_drawMode = DrawMode_Shaded; + + vector m_positions; + vector m_normals; + vector m_colors; + vector m_indices; + + // Transformation + glm::mat4 m_localTransform; + glm::mat4 m_globalTransform; + glm::vec3 m_translation; + glm::quat m_orientation; + glm::vec3 m_scale; + + // Vertex buffers + GLuint m_posBuffer; + GLuint m_norBuffer; + GLuint m_colBuffer; + + // Index buffer + GLuint m_idxBuffer; + + // Vertex array object + GLuint m_vao; +}; + +#endif diff --git a/src/glsl/particle_advect.frag b/src/glsl/particle_advect.frag new file mode 100644 index 00000000..af247290 --- /dev/null +++ b/src/glsl/particle_advect.frag @@ -0,0 +1,11 @@ +#version 330 core + +precision highp float; +precision highp int; + +out vec4 color; + +void main() +{ + color = vec4(1.0); +} diff --git a/src/glsl/particle_advect.vert b/src/glsl/particle_advect.vert new file mode 100644 index 00000000..d0eb5658 --- /dev/null +++ b/src/glsl/particle_advect.vert @@ -0,0 +1,34 @@ +#version 330 core +#define POSITION_LOCATION 0 +#define VELOCITY_LOCATION 1 +#define SPAWNTIME_LOCATION 2 +#define COLOR_LOCATION 3 + +precision highp float; +precision highp int; +layout(std140, column_major) uniform; + +uniform float u_time; +uniform vec3 u_accel; + +layout(location = POSITION_LOCATION) in vec3 a_position; +layout(location = VELOCITY_LOCATION) in vec3 a_velocity; +layout(location = SPAWNTIME_LOCATION) in float a_spawntime; +layout(location = COLOR_LOCATION) in vec4 a_color; + +out vec3 v_position; +out vec3 v_velocity; +out float v_spawntime; +out vec4 v_color; + +float rand(vec2 co){ + return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); +} + +void main() +{ + v_velocity = a_velocity + vec3(0.0, 0.01, 0.0);// u_time * u_accel + vec3(0.0, 0.1, 0.0); + v_position = a_position + u_time * v_velocity + vec3(0.0, 0.1, 0.0); + v_spawntime = a_spawntime; + v_color = a_color; +} diff --git a/src/glsl/particle_draw.frag b/src/glsl/particle_draw.frag new file mode 100644 index 00000000..93ad060c --- /dev/null +++ b/src/glsl/particle_draw.frag @@ -0,0 +1,21 @@ +#version 330 core + +precision highp float; +precision highp int; + +uniform vec3 u_minBoundary; +uniform vec3 u_maxBoundary; + +in vec3 v_position; +in vec4 v_color; + +out vec4 color; + +void main() +{ + if (v_position.y < u_minBoundary.y) { + color = vec4(0.0, -v_position.y * 0.1, 1.0, 1.0); + } else { + color = v_color; + } +} diff --git a/src/glsl/particle_draw.vert b/src/glsl/particle_draw.vert new file mode 100644 index 00000000..db5487bb --- /dev/null +++ b/src/glsl/particle_draw.vert @@ -0,0 +1,36 @@ +#version 330 core +#define POSITION_LOCATION 0 +#define VELOCITY_LOCATION 1 +#define SPAWNTIME_LOCATION 2 +#define COLOR_LOCATION 3 + +precision highp float; +precision highp int; + +uniform mat4 u_model; +uniform mat4 u_viewProj; +uniform float u_time; + +layout(location = POSITION_LOCATION) in vec3 a_position; +layout(location = VELOCITY_LOCATION) in vec3 a_velocity; +layout(location = SPAWNTIME_LOCATION) in float a_spawntime; +layout(location = COLOR_LOCATION) in vec4 a_color; + +out vec3 v_position; +out vec4 v_color; + +float rand(vec2 co){ + return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); +} + +void main() +{ + vec3 position = vec3( + a_position.x, + a_position.y,// - (u_time * u_time * u_time * u_time), + a_position.z + ); + gl_Position = u_viewProj * u_model * vec4(position, 1.0); + v_position = position; + v_color = a_color; +} diff --git a/src/glsl/simple.frag b/src/glsl/simple.frag new file mode 100644 index 00000000..cdd05b5a --- /dev/null +++ b/src/glsl/simple.frag @@ -0,0 +1,23 @@ +#version 150 core + +precision highp float; +precision highp int; +layout(std140, column_major) uniform; + +in vec4 v_color; +in vec3 v_normal; +in vec3 v_lightVec; + +out vec4 color; + +void main() +{ + vec4 diffuse = v_color; + float diffuseTerm = dot(normalize(v_normal), normalize(v_lightVec)); + diffuseTerm = clamp(diffuseTerm, 0, 1); + + float ambientTerm = 0.1; + float lightIntensity = diffuseTerm + ambientTerm; + + color = vec4(vec3(diffuse * lightIntensity), 1); +} diff --git a/src/glsl/simple.vert b/src/glsl/simple.vert new file mode 100644 index 00000000..d34c402a --- /dev/null +++ b/src/glsl/simple.vert @@ -0,0 +1,32 @@ +#version 330 core +#define POSITION_LOCATION 0 +#define NORMAL_LOCATION 1 +#define COLOR_LOCATION 2 + +precision highp float; +precision highp int; +layout(std140, column_major) uniform; + +uniform mat4 u_model; +uniform mat4 u_viewProj; + +layout(location = POSITION_LOCATION) in vec3 a_position; +layout(location = NORMAL_LOCATION) in vec3 a_normal; +layout(location = COLOR_LOCATION) in vec4 a_color; + +out vec4 v_color; +out vec3 v_normal; +out vec3 v_lightVec; + +const vec4 lightPos = vec4(7, 5, -3, 1); // Virtual light + +void main() +{ + vec4 modelPosition = u_model * vec4(a_position, 1.0); + gl_Position = u_viewProj * modelPosition; + + // Pass through frag shader + v_color = a_color; + v_normal = vec3(transpose(inverse(u_model)) * vec4(a_normal, 0.0)); + v_lightVec = (lightPos - modelPosition).xyz; +} diff --git a/src/input/keyboardControl.cpp b/src/input/keyboardControl.cpp new file mode 100644 index 00000000..6c8c58e7 --- /dev/null +++ b/src/input/keyboardControl.cpp @@ -0,0 +1,17 @@ +#include "keyboardControl.h" + +KeyboardControl::KeyboardControl( + GLFWwindow* window + ) : m_window(window) +{ + // Ensure we can capture key presses + glfwSetInputMode(m_window, GLFW_STICKY_KEYS, GL_TRUE); +} + +bool +KeyboardControl::KeyPressed( + const KeyCode& keyCode + ) const +{ + return glfwGetKey(m_window, keyCode) == GLFW_PRESS; +} diff --git a/src/input/keyboardControl.h b/src/input/keyboardControl.h new file mode 100644 index 00000000..57cc4630 --- /dev/null +++ b/src/input/keyboardControl.h @@ -0,0 +1,36 @@ +#ifndef KEYBOARD_CONTROL_H +#define KEYBOARD_CONTROL_H + +#include + +typedef enum { + Key_Escape = GLFW_KEY_ESCAPE, + Key_W = GLFW_KEY_W, + Key_A = GLFW_KEY_A, + Key_S = GLFW_KEY_S, + Key_D = GLFW_KEY_D, + Key_P = GLFW_KEY_P, + Key_Up = GLFW_KEY_UP, + Key_Down = GLFW_KEY_DOWN, + Key_Left = GLFW_KEY_LEFT, + Key_Right = GLFW_KEY_RIGHT, + Key_Space = GLFW_KEY_SPACE +} KeyCode; + +typedef enum { + Key_Pressed = GLFW_PRESS, + Key_Released = GLFW_RELEASE, + Key_Repeat = GLFW_REPEAT +} KeyAction; + +class KeyboardControl +{ +public: + KeyboardControl(GLFWwindow*); + bool KeyPressed(const KeyCode&) const; + +private: + GLFWwindow* m_window; +}; + +#endif diff --git a/src/loadShaders.cpp b/src/loadShaders.cpp new file mode 100644 index 00000000..f2ff10e7 --- /dev/null +++ b/src/loadShaders.cpp @@ -0,0 +1,103 @@ +// @todo: Properly credit OpenGL Tutorials + +#include +#include +#include +#include +#include + +#include + +#include "loadShaders.h" + +GLuint +CreateShader( + const char* filepath, + const GLenum shaderType + ) +{ + GLuint shaderId = glCreateShader(shaderType); + + // Read shader code from file + std::string shaderCode; + std::ifstream shaderStream(filepath, std::ios::in); + + if (shaderStream.is_open()) { + std::string line = " "; + while (getline(shaderStream, line)) { + shaderCode += "\n" + line; + } + shaderStream.close(); + } else { + printf("Can't open"); + getchar(); + return 0; + } + + GLint result = GL_FALSE; + int infoLogLength; + + // Compile shader + printf("Compiling %s shader: %s\n", shaderType == GL_VERTEX_SHADER ? "vertex" : "fragment", filepath); + char const* sourcePointer = shaderCode.c_str(); + glShaderSource(shaderId, 1, &sourcePointer, NULL); + glCompileShader(shaderId); + + // Check shader + glGetShaderiv(shaderId, GL_COMPILE_STATUS, &result); + glGetShaderiv(shaderId, GL_INFO_LOG_LENGTH, &infoLogLength); + + if (infoLogLength > 0) { + std::vector shaderErrorMessage(infoLogLength + 1); + glGetShaderInfoLog(shaderId, infoLogLength, NULL, &shaderErrorMessage[0]); + printf("%s\n", &shaderErrorMessage[0]); + } + + return shaderId; +} + +GLuint +LinkProgram( + GLuint vertexShaderID, + GLuint fragmentShaderID + ) +{ + GLint result = GL_FALSE; + int infoLogLength; + + // Link the program + GLuint programID = glCreateProgram(); + printf("Linking program\n"); + glAttachShader(programID, vertexShaderID); + glAttachShader(programID, fragmentShaderID); + glLinkProgram(programID); + + // Check the program + glGetProgramiv(programID, GL_LINK_STATUS, &result); + glGetProgramiv(programID, GL_INFO_LOG_LENGTH, &infoLogLength); + if (infoLogLength > 0) { + std::vector programErrorMessage(infoLogLength + 1); + glGetProgramInfoLog(programID, infoLogLength, NULL, &programErrorMessage[0]); + printf("%s\n", &programErrorMessage[0]); + } + + glDetachShader(programID, vertexShaderID); + glDetachShader(programID, fragmentShaderID); + + glDeleteShader(vertexShaderID); + glDeleteShader(fragmentShaderID); + + return programID; +} + +GLuint +LoadShaders( + const char* vertFilePath, + const char* fragFilePath + ) +{ + GLuint vertexShaderID = CreateShader(vertFilePath, GL_VERTEX_SHADER); + GLuint fragmentShaderID = CreateShader(fragFilePath, GL_FRAGMENT_SHADER); + + return LinkProgram(vertexShaderID, fragmentShaderID); +} diff --git a/src/loadShaders.h b/src/loadShaders.h new file mode 100644 index 00000000..a364b504 --- /dev/null +++ b/src/loadShaders.h @@ -0,0 +1,10 @@ +#ifndef loadShader_h +#define loadShader_h + +#include + +GLuint CreateShader(const char* filepath, const GLenum shaderType); +GLuint LinkProgram(GLuint vertexShaderID, GLuint fragmentShaderID); +GLuint LoadShaders(const char* vertex_file_path, const char* fragment_file_path); + +#endif /* loadShader_h */ diff --git a/src/main.cpp b/src/main.cpp index 2a00d1e4..0bfdd1b9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,11 +1,100 @@ -#include "main.hpp" +#include + +#include +#include +#include +#include +#include + +INITIALIZE_EASYLOGGINGPP + +#define UNIT_TEST using namespace std; +void TestKernels() +{ + float x[] = {0, 1.0f, 5.4f, 100.7f, -30.f, 36.f, -4.f}; + float h[] = {10.f, 1.0f, 2.4f, 140.23f, -22.f, -2.f, 20.f}; + glm::vec3 r[] = { + glm::vec3(1,0,0), + glm::vec3(0,1,0), + glm::vec3(0,0,1), + glm::vec3(1,0,0), + glm::vec3(0,1,0), + glm::vec3(0,1,0), + glm::vec3(0,0,1) + }; + + LOG(INFO) << "TestKernels" << endl; + + int testLen = 7; + for (int i = 0; i < testLen; ++i) { + LOG(INFO) << "KernelPoly6, x: " + to_string(x[i]) + ", h: " + to_string(h[i]) << endl; + float wPoly6 = KernelPoly6(x[i], h[i]); + LOG(INFO) << wPoly6 << endl; + + // LOG(INFO) << "Grad" << endl; + // glm::vec3 gradSpiky = GradKernelSpike(r, x, h); + // LOG(INFO) << "x: " << gradSpiky.x << ", y: " << gradSpiky.y << ", z: " << gradSpiky.z << endl; + +#ifdef TEST_SPIKY + LOG(INFO) << "KernelSpiky: x: " + to_string(x[i]) + ", h: " + to_string(h[i]) << endl; + float wSpiky = KernelSpiky(x[i], h[i]); + LOG(INFO) << wSpiky << endl; +#endif + +#ifdef TEST_VISCOUS + LOG(INFO) << "KernelViscous: x: " + to_string(x[i]) + ", h: " + to_string(h[i]) << endl; + float wViscous = KernelViscous(x[i], h[i]); + LOG(INFO) << wSpiky << endl; +#endif + } +} -int main() +void TestSuite() { + LOG(INFO) << "------------------------" << endl; + LOG(INFO) << "UNIT TEST ENABLED" << endl; + + // @todo: NEED TO WRITE PROPER TEST SUITE! + bool passed = false; + TestKernels(); + + LOG(INFO) << "END UNIT TEST" << endl; + LOG(INFO) << "------------------------" << endl; +} + +int +main(int argv, char* argc[]) { + +#ifdef UNIT_TEST + TestSuite(); +#endif + + nanogui::ref app; + + try { + nanogui::init(); + + { + app = new Viewer(1600, 900); + app->drawAll(); + app->setVisible(true); + nanogui::mainloop(); + } + nanogui::shutdown(); + } catch (const std::runtime_error &e) { + std::string error_msg = std::string("Caught a fatal error: ") + std::string(e.what()); + #if defined(_WIN32) + MessageBoxA(nullptr, error_msg.c_str(), NULL, MB_ICONERROR | MB_OK); + #else + std::cerr << error_msg << endl; + #endif + app->CleanUp(); + return -1; + } return 0; } diff --git a/src/main.hpp b/src/main.hpp deleted file mode 100644 index fe1f64d5..00000000 --- a/src/main.hpp +++ /dev/null @@ -1,9 +0,0 @@ -// -// main.hpp -// Thanda - -#ifndef main_hpp -#define main_hpp - -#endif /* main_hpp */ - diff --git a/src/mathConstants.h b/src/mathConstants.h new file mode 100644 index 00000000..08d33aba --- /dev/null +++ b/src/mathConstants.h @@ -0,0 +1,13 @@ +#ifndef MATH_CONSTANTS_H +#define MATH_CONSTANTS_H + +// Math constants + +static const float PI = 3.14159265358979323846f; +static const float TWO_PI = 2 * PI; +static const float INV_PI = 1.0f / PI; +static const float DEG2RAD = PI / 180.f; +static const float RAD2DEG = 180.f / PI; +static const float GRAVITY = -9.8f; + +#endif diff --git a/src/scene/scene.cpp b/src/scene/scene.cpp index 32300ca9..26013f0e 100644 --- a/src/scene/scene.cpp +++ b/src/scene/scene.cpp @@ -1,5 +1,333 @@ -// -// scene.cpp -// Thanda +#include +#include -#include "scene.hpp" +Scene::Scene() : + Scene(800, 600) +{} + +Scene::Scene( + const float& screenWidth, + const float& screenHeight + ) : + m_testBoxOne(nullptr), + m_testBoxTwo(nullptr), + m_fluidContainer(nullptr), + m_fluidGeo(nullptr), + m_fluidSolver(nullptr) +{ + // Initialize camera + m_camera = new Camera(screenWidth, screenHeight); +} + +void +Scene::InitFromTestScene() +{ + m_testBoxOne = new Box(DrawMode_Wireframe); + m_testBoxOne->SetDrawMode(DrawMode_Wireframe); + m_testBoxOne->Create(); +} + +void +Scene::InitFromJson( + const char* filepath + ) +{ + // -- Parse JSON + Json::Value root; + bool success = ParseJson(filepath, root); + if (!success) { + // Failed parsing JSON + return; + } + + // -- Get container information + const Json::Value containerDimJson = root["containerDim"]; + + glm::vec3 containerDim( + containerDimJson["scaleX"].asFloat(), + containerDimJson["scaleY"].asFloat(), + containerDimJson["scaleZ"].asFloat() + ); + + // Create geometry for the container + m_fluidContainer = new Box(DrawMode_Wireframe); + m_fluidContainer->Scale(containerDim.x, containerDim.y, containerDim.z); + m_fluidContainer->Create(); + + // -- Get particle information + const Json::Value particleDimJson = root["particleDim"]; + glm::vec3 particleDim( + particleDimJson["boundX"].asFloat(), + particleDimJson["boundY"].asFloat(), + particleDimJson["boundZ"].asFloat() + ); + + const Json::Value particleCenterJson = root["particleCenter"]; + glm::vec3 particleCenter( + particleCenterJson["centerX"].asFloat(), + particleCenterJson["centerY"].asFloat(), + particleCenterJson["centerZ"].asFloat() + ); + + const float tankHeight = root["tankHeight"].asFloat(); + const float separation = root["particleSeparation"].asFloat(); + const float cellSize = root["cellSize"].asFloat(); + const float stiffness = root["stiffness"].asFloat(); + const float viscosity = root["viscosity"].asFloat(); + const float mass = root["mass"].asFloat(); + const float restDensity = root["restDensity"].asFloat(); + + // -- Initialize fluid solvers + m_fluidSolver = new SPHSolver( + containerDim, + particleDim, + particleCenter, + tankHeight, + separation, + cellSize, + stiffness, + viscosity, + mass, + restDensity + ); + + // -- Initialize fluid geo + m_fluidGeo = new FluidGeo( + m_fluidSolver->ParticlePositions(), + m_fluidSolver->ParticleVelocities(), + m_fluidSolver->ParticleSpawnTimes(), + m_fluidSolver->ParticleColors() + ); + m_fluidGeo->Create(); + + // -- Solid object + if (m_enableTestBox1) { + CreateTestBoxOne(); + } + + if (m_enableTestBox2) { + CreateTestBoxTwo(); + } +} + +void +Scene::SetConstant( + SPHConstantType type, + float value + ) +{ + if (m_fluidSolver) { + m_fluidSolver->SetConstant(type, value); + } +} + +void +Scene::ReadInputs( + KeyCode key, + KeyAction action + ) +{ + if (key == Key_Space && action == Key_Pressed) { + this->Pause(); + } + + if (action == Key_Repeat) { + UpdateCamera(key); + } +} + +void +Scene::Pause() +{ + m_paused = !m_paused; +} + +void +Scene::Update( + const float deltaT, + ParticleAdvectProgram& progAdvect + ) +{ + if (m_paused) { + return; + } + // Rotate solid + if (m_enableTestBox1) { + m_testBoxOne->Rotate(0.0f, deltaT * 200.0f, 0.0f); + m_testBoxOne->Translate(0.0f, cos(deltaT) * 0.05f, 0.0f); + } + + if (m_enableTestBox2) { + m_testBoxTwo->Translate(cos(deltaT) * 0.05f, 0.0f, 0.0f); + } + + // Update solver + UpdateFluidSolver(deltaT, progAdvect); +} + +void +Scene::Draw( + const ShaderProgram& prog + ) const +{ + prog.Draw(*m_camera, *m_testBoxOne); +} + +void +Scene::DrawTransformFeedback( + const ShaderProgram& prog, + ParticleAdvectProgram& progAdvect + ) +{ + DrawFluidSolver(prog, progAdvect); +} + +void +Scene::CleanUp() +{ + if (m_camera != nullptr) { + delete m_camera; + } + + if (m_testBoxOne != nullptr) { + delete m_testBoxOne; + } + + if (m_testBoxTwo != nullptr) { + delete m_testBoxTwo; + } + + if (m_fluidContainer != nullptr) { + delete m_fluidContainer; + } + + if (m_fluidGeo != nullptr) { + delete m_fluidGeo; + } + + if (m_fluidSolver != nullptr) { + delete m_fluidSolver; + } +} + +// ----- Private ------ // + +void +Scene::UpdateCamera( + KeyCode key + ) +{ + // Camera mode + if (key == Key_P) { + static bool perspective = true; + perspective = !perspective; + m_camera->EnablePerspective(perspective); + } + + // Camera movement + float rotateAmt = 20.0f; + float zoomAmt = 0.01f; + if (key == Key_Up) { + m_camera->RotateAboutUp(rotateAmt); + } + if (key == Key_Down) { + m_camera->RotateAboutUp(-rotateAmt); + } + + if (key == Key_Left) { + m_camera->RotateAboutRight(rotateAmt); + } + + if (key == Key_Right) { + m_camera->RotateAboutRight(-rotateAmt); + } + + if (key == Key_W){ + m_camera->Zoom(zoomAmt); + } + + if (key == Key_S){ + m_camera->Zoom(-zoomAmt); + } + + if (key == Key_D){ + m_camera->TranslateAlongRight(zoomAmt); + } + + if (key == Key_A){ + m_camera->TranslateAlongRight(-zoomAmt); + } +} + +void +Scene::UpdateFluidSolver( + const float deltaT, + ParticleAdvectProgram& progAdvect + ) +{ + // -- Test box 1 + if (m_enableTestBox1) { + m_fluidSolver->CheckBoxIntersection(m_testBoxOne); + } + + // -- Test box 2 + if (m_enableTestBox2) { + m_fluidSolver->CheckBoxIntersection(m_testBoxTwo); + } + + m_fluidSolver->Update(deltaT); + m_fluidGeo->SetVelocities(m_fluidSolver->ParticleVelocities()); + m_fluidGeo->SetPositions(m_fluidSolver->ParticlePositions()); + + // Advect particle? + progAdvect.Advect(deltaT, m_fluidGeo); +} + +void +Scene::DrawFluidSolver( + const ShaderProgram& prog, + ParticleAdvectProgram& progAdvect + ) +{ + // -- Draw container + prog.Draw(*m_camera, *m_fluidContainer); + + // -- Draw solids + if (m_enableTestBox1) { + prog.Draw(*m_camera, *m_testBoxOne); + } + + if (m_enableTestBox2) { + prog.Draw(*m_camera, *m_testBoxTwo); + } + + // -- Draw particles + m_fluidGeo->SetColors(m_fluidSolver->ParticleColors()); + progAdvect.Draw(m_camera, m_fluidGeo, m_fluidContainer); + +} + +void +Scene::CreateTestBoxOne() +{ + if (m_testBoxOne == nullptr) { + m_testBoxOne = new Box(DrawMode_Shaded); + m_testBoxOne->Translate(0.0f, -1.0f, 0.1f); + m_testBoxOne->Scale(1.0f, 0.2f, 0.9f); + m_testBoxOne->SetColor(glm::vec4(0.8f, 0.3f, 0.2f, 1.0f)); + m_testBoxOne->Create(); + } + +} + +void +Scene::CreateTestBoxTwo() +{ + if (m_testBoxTwo == nullptr) { + m_testBoxTwo = new Box(DrawMode_Shaded); + m_testBoxTwo->Translate(-1.0f, 0.0f, 0.0f); + m_testBoxTwo->Scale(0.2f, 1.0f, 0.9f); + m_testBoxTwo->SetColor(glm::vec4(0.3f, 0.8f, 0.2f, 1.0f)); + m_testBoxTwo->Create(); + } +} diff --git a/src/scene/scene.h b/src/scene/scene.h new file mode 100644 index 00000000..65baf2fa --- /dev/null +++ b/src/scene/scene.h @@ -0,0 +1,89 @@ +#ifndef SCENE_H +#define SCENE_H + +#include +#include +#include +#include +#include +#include + +class Scene +{ +public: + Scene(); + Scene( + const float& screenWidth, + const float& screenHeight + ); + + void InitFromTestScene(); + void InitFromJson(const char* filepath); + void Pause(); + void SetConstant( + SPHConstantType type, + float value + ); + void EnableTestBoxOne(bool enable) { + m_enableTestBox1 = enable; + if (enable) { + CreateTestBoxOne(); + } + } + void EnableTestBoxTwo(bool enable) { + m_enableTestBox2 = enable; + if (enable) { + CreateTestBoxTwo(); + } + } + + virtual void ReadInputs(KeyCode key, KeyAction action); + virtual void Update( + const float deltaT, + ParticleAdvectProgram& prog + ); + virtual void Draw(const ShaderProgram&) const; + virtual void DrawTransformFeedback( + const ShaderProgram& prog, + ParticleAdvectProgram& progAdvect + ); + virtual void CleanUp(); + + inline const uint NumParticles() const { + if (m_fluidSolver) { + return m_fluidSolver->NumParticles(); + } else { + return 0; + } + } + +protected: + bool m_paused = false; + Camera* m_camera; + bool m_enableTestBox1 = false; + bool m_enableTestBox2 = false; + Box* m_testBoxOne; + Box* m_testBoxTwo; + Box* m_fluidContainer; + FluidGeo* m_fluidGeo; + SPHSolver* m_fluidSolver; + + // -- Test box helpers + void CreateTestBoxOne(); + void CreateTestBoxTwo(); + + // -- Update helpers + void UpdateCamera(KeyCode key); + void UpdateFluidSolver( + const float deltaT, + ParticleAdvectProgram& prog + ); + + // -- Draw helpers + void DrawFluidSolver( + const ShaderProgram& prog, + ParticleAdvectProgram& progAdvect + ); +}; + +#endif diff --git a/src/scene/scene.hpp b/src/scene/scene.hpp deleted file mode 100644 index 84022a43..00000000 --- a/src/scene/scene.hpp +++ /dev/null @@ -1,3 +0,0 @@ -// -// scene.hpp -// Thanda \ No newline at end of file diff --git a/src/scene/scene.json b/src/scene/scene.json index 789b4a42..49b34ec8 100644 --- a/src/scene/scene.json +++ b/src/scene/scene.json @@ -1,13 +1,24 @@ { - "containerDim" : { - "scaleX" : 5.0, - "scaleY" : 5.0, - "scaleZ" : 5.0 - }, - "particleDim" : { - "boundX" : 3.7, - "boundY" : 3.7, - "boundZ" : 3.7 - }, - "particleSeparation" : 0.1 -} \ No newline at end of file + "containerDim" : { + "scaleX" : 2.0, + "scaleY" : 2.0, + "scaleZ" : 2.0 + }, + "particleDim" : { + "boundX" : 1.0, + "boundY" : 1.0, + "boundZ" : 1.0 + }, + "particleCenter": { + "centerX": 0.0, + "centerY": 0.0, + "centerZ": 0.0 + }, + "tankHeight": 0.0, + "stiffness": 10, + "viscosity": 0.0, + "mass": 0.125, + "restDensity": 1000, + "cellSize": 0.1, + "particleSeparation": 0.05 +} diff --git a/src/scene/scene_simple.json b/src/scene/scene_simple.json new file mode 100644 index 00000000..49b34ec8 --- /dev/null +++ b/src/scene/scene_simple.json @@ -0,0 +1,24 @@ +{ + "containerDim" : { + "scaleX" : 2.0, + "scaleY" : 2.0, + "scaleZ" : 2.0 + }, + "particleDim" : { + "boundX" : 1.0, + "boundY" : 1.0, + "boundZ" : 1.0 + }, + "particleCenter": { + "centerX": 0.0, + "centerY": 0.0, + "centerZ": 0.0 + }, + "tankHeight": 0.0, + "stiffness": 10, + "viscosity": 0.0, + "mass": 0.125, + "restDensity": 1000, + "cellSize": 0.1, + "particleSeparation": 0.05 +} diff --git a/src/scene/scene_tank.json b/src/scene/scene_tank.json new file mode 100644 index 00000000..ae6a31a4 --- /dev/null +++ b/src/scene/scene_tank.json @@ -0,0 +1,24 @@ +{ + "containerDim" : { + "scaleX" : 2.0, + "scaleY" : 2.0, + "scaleZ" : 2.0 + }, + "particleDim" : { + "boundX" : 0.5, + "boundY" : 0.7, + "boundZ" : 0.5 + }, + "particleCenter": { + "centerX": 0.2, + "centerY": 0.2, + "centerZ": 0.0 + }, + "tankHeight": 0.3, + "stiffness": 10, + "viscosity": 0.0, + "mass": 0.125, + "restDensity": 1000, + "cellSize": 0.1, + "particleSeparation": 0.05 +} diff --git a/src/shaderProgram/particleAdvectProgram.cpp b/src/shaderProgram/particleAdvectProgram.cpp new file mode 100644 index 00000000..a7006704 --- /dev/null +++ b/src/shaderProgram/particleAdvectProgram.cpp @@ -0,0 +1,279 @@ +#include +#include +#include +#include + +void +FlipPixels( + GLubyte* pixels, + int w, + int h + ) +{ + int i = 0, j = h-1, k; + while (i < j) { + GLubyte* ri = &pixels[i]; + GLubyte* rj = &pixels[j]; + for (k = 0; k < w * 3; k++) { + GLubyte t = ri[k]; + ri[k] = rj[k]; + rj[k] = t; + } + i++; + j--; + } +} + +void +SaveScreenShotBmp( + int width, + int height, + string filePath, + int frameNumber + ) +{ + GLubyte* pixels = new GLubyte[ 3 * width * height]; + glReadBuffer( GL_BACK ); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, pixels); + FlipPixels(pixels, width, height); + std::string fileName = filePath + std::to_string(frameNumber) + std::string(".bmp"); + stbi_write_bmp(fileName.c_str(), width, height, 3, pixels); + delete pixels; +} + +ParticleAdvectProgram::ParticleAdvectProgram( + const char* vertAdvectFilepath, + const char* fragAdvectFilepath, + const char* vertDrawFilepath, + const char* fragDrawFilepath + ) +{ + // -- Load advect program + GLuint vertShaderID = CreateShader(vertAdvectFilepath, GL_VERTEX_SHADER); + GLuint fragShaderID = CreateShader(fragAdvectFilepath, GL_FRAGMENT_SHADER); + GLuint m_programAdvect = glCreateProgram(); + glAttachShader(m_programAdvect, vertShaderID); + glAttachShader(m_programAdvect, fragShaderID); + + const GLchar* varyings[] = { + "v_position", "v_velocity", "v_spawntime", "v_color" + }; + + glTransformFeedbackVaryings( + m_programAdvect, + sizeof(varyings), + varyings, + GL_SEPARATE_ATTRIBS + ); + + glDetachShader(m_programAdvect, vertShaderID); + glDetachShader(m_programAdvect, fragShaderID); + + glDeleteShader(vertShaderID); + glDeleteShader(fragShaderID); + + // -- Advect program uniforms + m_unifAdvectTime = glGetUniformLocation(m_programAdvect, "u_time"); + m_unifAdvectAccel = glGetUniformLocation(m_programAdvect, "u_accel"); + + // -- Load draw program + m_programDraw = LoadShaders(vertDrawFilepath, fragDrawFilepath); + + // -- Draw program uniforms + m_unifDrawModel = glGetUniformLocation(m_programDraw, "u_model"); + m_unifDrawViewProj = glGetUniformLocation(m_programDraw, "u_viewProj"); + m_unifDrawTime = glGetUniformLocation(m_programDraw, "u_time"); + m_unifDrawMinBoundary = glGetUniformLocation(m_programDraw, "u_minBoundary"); + m_unifDrawMaxBoundary = glGetUniformLocation(m_programDraw, "u_maxBoundary"); + + // -- Generate two transform feedback buffers for ping-pong'ing + glGenTransformFeedbacks(2, &m_TFBuffers[0]); + + // -- Set big point size + glPointSize(5.0f); +} + +void +ParticleAdvectProgram::Advect( + const float deltaTime, + FluidGeo* fluidGeo + ) +{ + glUseProgram(m_programAdvect); + + // -- Setup uniforms + + if (m_unifAdvectTime != -1) { + glUniform1f( + m_unifAdvectTime, deltaTime + ); + } + + if (m_unifAdvectAccel != -1) { + glUniform3f( + m_unifAdvectAccel, 0.0f, -10.1f, 0.0f + ); + } + + // -- Bind transform feedback buffer + if (m_isFirstDraw) { + glBindTransformFeedback( + GL_TRANSFORM_FEEDBACK, + m_TFBuffers[(m_curTFBuffer + 1) & 0x1] + ); + + fluidGeo->ToggleVao(); + fluidGeo->UpdateVao(); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, fluidGeo->PosBuffer()); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 1, fluidGeo->VelBuffer()); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 2, fluidGeo->SpawnTimeBuffer()); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 3, fluidGeo->ColBuffer()); + + fluidGeo->ToggleVao(); + + glBindTransformFeedback( + GL_TRANSFORM_FEEDBACK, + m_TFBuffers[m_curTFBuffer] + ); + fluidGeo->UpdateVao(); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, fluidGeo->PosBuffer()); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 1, fluidGeo->VelBuffer()); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 2, fluidGeo->SpawnTimeBuffer()); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 3, fluidGeo->ColBuffer()); + + } else { + glBindTransformFeedback( + GL_TRANSFORM_FEEDBACK, + m_TFBuffers[m_curTFBuffer] + ); + } + + // -- Enable attributes + fluidGeo->EnableVertexAttributes(); + + // Toggle the vao we're using so that we can store the output of + // transform feedback into the secondary vao + fluidGeo->ToggleVao(); + + // Set transform feedback buffer + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, fluidGeo->PosBuffer()); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 1, fluidGeo->VelBuffer()); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 2, fluidGeo->SpawnTimeBuffer()); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 3, fluidGeo->ColBuffer()); + + // Turn off rasterization - we are not drawing + glEnable(GL_RASTERIZER_DISCARD); + + // Render + glBeginTransformFeedback(fluidGeo->GLDrawMode()); + glDrawArrays(fluidGeo->GLDrawMode(), 0, fluidGeo->ElementCount()); + glEndTransformFeedback(); + + // Turn on rasterization - we are done + glDisable(GL_RASTERIZER_DISCARD); + glUseProgram(NULL); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, NULL); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 1, NULL); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 2, NULL); + glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 3, NULL); + fluidGeo->DisableVertexAttributes(); + + fluidGeo->ToggleVao(); +} + +void +ParticleAdvectProgram::Draw( + const Camera* camera, + const FluidGeo* fluidGeo, + const Box* container + ) +{ + glUseProgram(m_programDraw); + + // -- Set uniforms + if (m_unifDrawModel != -1) { + glUniformMatrix4fv( + m_unifDrawModel, + 1, + GL_FALSE, + &(fluidGeo->GetLocalTransformation()[0][0]) + ); + } + + if (m_unifDrawViewProj != -1) { + glUniformMatrix4fv( + m_unifDrawViewProj, + 1, + GL_FALSE, + &(camera->GetViewProj()[0][0]) + ); + } + + // @todo: maybe we only need to pass delta time through + static float lastTime = glfwGetTime(); + float currentTime = glfwGetTime(); + float deltaTime = float(currentTime - lastTime); + + if (m_unifDrawTime != -1) { + glUniform1f( + m_unifDrawTime, currentTime + ); + } + + if (m_unifDrawMinBoundary != -1) { + glm::vec3 minBoundary = container->GetMinBoundary(); + glUniform3f( + m_unifDrawMinBoundary, + minBoundary.x, + minBoundary.y, + minBoundary.z + ); + } + + if (m_unifDrawMaxBoundary != -1) { + glm::vec3 maxBoundary = container->GetMaxBoundary(); + glUniform3f( + m_unifDrawMaxBoundary, + maxBoundary.x, + maxBoundary.y, + maxBoundary.z + ); + } + // Enable attributes + fluidGeo->EnableVertexAttributes(); + + // Render + if (m_isFirstDraw) + { + glDrawArrays(fluidGeo->GLDrawMode(), 0, fluidGeo->ElementCount()); + // m_isFirstDraw = false; + } + else + { + glDrawTransformFeedback( + fluidGeo->GLDrawMode(), + m_TFBuffers[m_curTFBuffer]); + } + + + // -- Read frame buffer pixels the store to image + int width = (int)camera->Width() * 2; + int height = (int)camera->Height() * 2; + static int frameNumber = 0; + // SaveScreenShotBmp(width, height, "recording_solid_tank/frame_", frameNumber++); + + fluidGeo->DisableVertexAttributes(); + + // -- Toggle transform feedback buffer + m_curTFBuffer = (m_curTFBuffer + 1) & 0x1; +} + +void +ParticleAdvectProgram::CleanUp() +{ + glDeleteProgram(m_programAdvect); + glDeleteProgram(m_programDraw); +} + + diff --git a/src/shaderProgram/particleAdvectProgram.h b/src/shaderProgram/particleAdvectProgram.h new file mode 100644 index 00000000..08a70824 --- /dev/null +++ b/src/shaderProgram/particleAdvectProgram.h @@ -0,0 +1,60 @@ +#ifndef PARTICLE_ADVECT_PROGRAM_H +#define PARTICLE_ADVECT_PROGRAM_H + +#include +#include +#include +#include + +class FluidGeo; + +class ParticleAdvectProgram +{ +public: + ParticleAdvectProgram( + const char* vertAdvectFilepath, + const char* fragAdvectFilepath, + const char* vertDrawFilepath, + const char* fragDrawFilepath + ); + + // First pass + virtual void Advect( + const float deltaTime, + FluidGeo* + ); + + // Second pass + virtual void Draw( + const Camera*, + const FluidGeo*, + const Box* + ); + + virtual void CleanUp(); + +protected: + GLuint m_programAdvect; + GLuint m_programDraw; + + // Transform feedback buffer + GLuint m_TFBuffers[2]; + char m_curTFBuffer = 0; + + // Uniform locations for advect program + int m_unifAdvectTime; + int m_unifAdvectAccel; + + // Uniform locations for draw program + int m_unifDrawTime; + int m_unifDrawColor; + int m_unifDrawModel; + int m_unifDrawViewProj; + int m_unifDrawMinBoundary; + int m_unifDrawMaxBoundary; + + // First draw + bool m_isFirstDraw = true; +}; + +#endif diff --git a/src/shaderProgram/shaderProgram.cpp b/src/shaderProgram/shaderProgram.cpp new file mode 100644 index 00000000..e395a465 --- /dev/null +++ b/src/shaderProgram/shaderProgram.cpp @@ -0,0 +1,65 @@ +#include "shaderProgram.h" +using namespace std; + +ShaderProgram::ShaderProgram( + const char* vertFilePath, + const char* fragFilePath + ) +{ + m_programID = LoadShaders(vertFilePath, fragFilePath); + + m_unifModel = glGetUniformLocation(m_programID, "u_model"); + m_unifViewProj = glGetUniformLocation(m_programID, "u_viewProj"); + + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LESS); + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); +} + +void +ShaderProgram::Draw( + const Camera& camera, + const Geometry& geo + ) const +{ + glUseProgram(m_programID); + + // Enable attributes + geo.EnableVertexAttributes(); + + // Set uniforms + + if (m_unifModel != -1) { + glUniformMatrix4fv( + m_unifModel, + 1, + GL_FALSE, + &(geo.GetLocalTransformation()[0][0]) + ); + } + + if (m_unifViewProj != -1) { + glUniformMatrix4fv( + m_unifViewProj, + 1, + GL_FALSE, + &(camera.GetViewProj()[0][0]) + ); + } + // Render + glDrawElements( + geo.GLDrawMode(), + geo.ElementCount(), + GL_UNSIGNED_SHORT, + NULL + ); + + geo.DisableVertexAttributes(); +} + +void +ShaderProgram::CleanUp() +{ + glDeleteProgram(m_programID); +} diff --git a/src/shaderProgram/shaderProgram.h b/src/shaderProgram/shaderProgram.h new file mode 100644 index 00000000..81fc3724 --- /dev/null +++ b/src/shaderProgram/shaderProgram.h @@ -0,0 +1,32 @@ +#ifndef SHADER_PROGRAM_H +#define SHADER_PROGRAM_H + +#include "loadShaders.h" +#include "geometry/geometry.h" +#include "camera/camera.h" + +class ShaderProgram +{ + +public: + ShaderProgram( + const char* vertFilePath, + const char* fragFilePath + ); + + virtual void Draw( + const Camera&, + const Geometry& + ) const; + + virtual void CleanUp(); + +protected: + GLuint m_programID; + + // Uniform locations + int m_unifModel; + int m_unifViewProj; +}; + +#endif diff --git a/src/thirdparty/easylogging++.h b/src/thirdparty/easylogging++.h new file mode 100755 index 00000000..f9a67feb --- /dev/null +++ b/src/thirdparty/easylogging++.h @@ -0,0 +1,6663 @@ +// +// Easylogging++ v9.80 +// Single-header only, cross-platform logging library for C++ applications +// +// Copyright (c) 2015 muflihun.com +// +// This library is released under the MIT Licence. +// http://easylogging.muflihun.com/licence.php +// +// easylogging@muflihun.com +// +// https://github.com/easylogging/easyloggingpp +// http://easylogging.muflihun.com +// http://muflihun.com +// +#ifndef EASYLOGGINGPP_H +#define EASYLOGGINGPP_H +// Compilers and C++0x/C++11 Evaluation +#if defined(__GNUC__) +# define ELPP_COMPILER_GCC 1 +# define ELPP_GCC_VERSION (__GNUC__ * 10000 \ + + __GNUC_MINOR__ * 100 \ + + __GNUC_PATCHLEVEL__) +# if defined(__GXX_EXPERIMENTAL_CXX0X__) +# define ELPP_CXX0X 1 +# elif(ELPP_GCC_VERSION >= 40801) +# define ELPP_CXX11 1 +# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) +#endif // defined(__GNUC__) +// Visual C++ +#if defined(_MSC_VER) +# define ELPP_COMPILER_MSVC 1 +# define ELPP_CRT_DBG_WARNINGS 1 +# if (_MSC_VER == 1600) +# define ELPP_CXX0X 1 +# elif(_MSC_VER >= 1700) +# define ELPP_CXX11 1 +# endif // (_MSC_VER == 1600) +#endif // defined(_MSC_VER) +// Clang++ +#if defined(__clang__) && (__clang__ == 1) +# define ELPP_COMPILER_CLANG 1 +# define ELPP_CLANG_VERSION (__clang_major__ * 10000 \ + + __clang_minor__ * 100 \ + + __clang_patchlevel__) +# if (ELPP_CLANG_VERSION >= 30300) +# define ELPP_CXX11 1 +# endif // (ELPP_CLANG_VERSION >= 30300) +#endif // defined(__clang__) && (__clang__ == 1) +// MinGW +#if defined(__MINGW32__) || defined(__MINGW64__) +# define ELPP_MINGW 1 +#endif // defined(__MINGW32__) || defined(__MINGW64__) +// Cygwin +#if defined(__CYGWIN__) && (__CYGWIN__ == 1) +# define ELPP_CYGWIN 1 +#endif // defined(__CYGWIN__) && (__CYGWIN__ == 1) +// Intel C++ +#if defined(__INTEL_COMPILER) +# define ELPP_COMPILER_INTEL 1 +#endif +// Operating System Evaluation +// Windows +#if defined(_WIN32) || defined(_WIN64) +# define ELPP_OS_WINDOWS 1 +#endif // defined(_WIN32) || defined(_WIN64) +// Linux +#if (defined(__linux) || defined(__linux__)) +# define ELPP_OS_LINUX 1 +#endif // (defined(__linux) || defined(__linux__)) +// Mac +#if defined(__APPLE__) +# define ELPP_OS_MAC 1 +#endif // defined(__APPLE__) +// FreeBSD +#if defined(__FreeBSD__) +# define ELPP_OS_FREEBSD 1 +#endif +// Solaris +#if defined(__sun) +# define ELPP_OS_SOLARIS 1 +#endif +// Unix +#if ((ELPP_OS_LINUX || ELPP_OS_MAC || ELPP_OS_FREEBSD || ELPP_OS_SOLARIS) && (!ELPP_OS_WINDOWS)) +# define ELPP_OS_UNIX 1 +#endif // ((ELPP_OS_LINUX || ELPP_OS_MAC || ELPP_OS_FREEBSD || ELPP_OS_SOLARIS) && (!ELPP_OS_WINDOWS)) +// Android +#if defined(__ANDROID__) +# define ELPP_OS_ANDROID 1 +#endif // defined(__ANDROID__) +// Evaluating Cygwin as *nix OS +#if !ELPP_OS_UNIX && !ELPP_OS_WINDOWS && ELPP_CYGWIN +# undef ELPP_OS_UNIX +# undef ELPP_OS_LINUX +# define ELPP_OS_UNIX 1 +# define ELPP_OS_LINUX 1 +#endif // !ELPP_OS_UNIX && !ELPP_OS_WINDOWS && ELPP_CYGWIN +#if !defined(ELPP_INTERNAL_DEBUGGING_OUT_INFO) +# define ELPP_INTERNAL_DEBUGGING_OUT_INFO std::cout +#endif // !defined(ELPP_INTERNAL_DEBUGGING_OUT) +#if !defined(ELPP_INTERNAL_DEBUGGING_OUT_ERROR) +# define ELPP_INTERNAL_DEBUGGING_OUT_ERROR std::cerr +#endif // !defined(ELPP_INTERNAL_DEBUGGING_OUT) +#if !defined(ELPP_INTERNAL_DEBUGGING_ENDL) +# define ELPP_INTERNAL_DEBUGGING_ENDL std::endl +#endif // !defined(ELPP_INTERNAL_DEBUGGING_OUT) +#if !defined(ELPP_INTERNAL_DEBUGGING_MSG) +# define ELPP_INTERNAL_DEBUGGING_MSG(msg) msg +#endif // !defined(ELPP_INTERNAL_DEBUGGING_OUT) +// Internal Assertions and errors +#if !defined(ELPP_DISABLE_ASSERT) +# if (defined(ELPP_DEBUG_ASSERT_FAILURE)) +# define ELPP_ASSERT(expr, msg) if (!(expr)) { \ + std::stringstream internalInfoStream; internalInfoStream << msg; \ + ELPP_INTERNAL_DEBUGGING_OUT_ERROR \ + << "EASYLOGGING++ ASSERTION FAILED (LINE: " << __LINE__ << ") [" #expr << "] WITH MESSAGE \"" \ + << ELPP_INTERNAL_DEBUGGING_MSG(internalInfoStream.str()) << "\"" << ELPP_INTERNAL_DEBUGGING_ENDL; base::utils::abort(1, \ + "ELPP Assertion failure, please define ELPP_DEBUG_ASSERT_FAILURE"); } +# else +# define ELPP_ASSERT(expr, msg) if (!(expr)) { \ + std::stringstream internalInfoStream; internalInfoStream << msg; \ + ELPP_INTERNAL_DEBUGGING_OUT_ERROR\ + << "ASSERTION FAILURE FROM EASYLOGGING++ (LINE: " \ + << __LINE__ << ") [" #expr << "] WITH MESSAGE \"" << ELPP_INTERNAL_DEBUGGING_MSG(internalInfoStream.str()) << "\"" \ + << ELPP_INTERNAL_DEBUGGING_ENDL; } +# endif // (defined(ELPP_DEBUG_ASSERT_FAILURE)) +#else +# define ELPP_ASSERT(x, y) +#endif //(!defined(ELPP_DISABLE_ASSERT) +#if ELPP_COMPILER_MSVC +# define ELPP_INTERNAL_DEBUGGING_WRITE_PERROR \ + { char buff[256]; strerror_s(buff, 256, errno); \ + ELPP_INTERNAL_DEBUGGING_OUT_ERROR << ": " << buff << " [" << errno << "]";} (void)0 +#else +# define ELPP_INTERNAL_DEBUGGING_WRITE_PERROR \ + ELPP_INTERNAL_DEBUGGING_OUT_ERROR << ": " << strerror(errno) << " [" << errno << "]"; (void)0 +#endif // ELPP_COMPILER_MSVC +#if defined(ELPP_DEBUG_ERRORS) +# if !defined(ELPP_INTERNAL_ERROR) +# define ELPP_INTERNAL_ERROR(msg, pe) { \ + std::stringstream internalInfoStream; internalInfoStream << " " << msg; \ + ELPP_INTERNAL_DEBUGGING_OUT_ERROR \ + << "ERROR FROM EASYLOGGING++ (LINE: " << __LINE__ << ") " \ + << ELPP_INTERNAL_DEBUGGING_MSG(internalInfoStream.str()) << ELPP_INTERNAL_DEBUGGING_ENDL; \ + if (pe) { ELPP_INTERNAL_DEBUGGING_OUT_ERROR << " "; ELPP_INTERNAL_DEBUGGING_WRITE_PERROR; }} (void)0 +# endif +#else +# undef ELPP_INTERNAL_INFO +# define ELPP_INTERNAL_ERROR(msg, pe) +#endif // defined(ELPP_DEBUG_ERRORS) +#if (defined(ELPP_DEBUG_INFO)) +# if !(defined(ELPP_INTERNAL_INFO_LEVEL)) +# define ELPP_INTERNAL_INFO_LEVEL 9 +# endif // !(defined(ELPP_INTERNAL_INFO_LEVEL)) +# if !defined(ELPP_INTERNAL_INFO) +# define ELPP_INTERNAL_INFO(lvl, msg) { if (lvl <= ELPP_INTERNAL_INFO_LEVEL) { \ + std::stringstream internalInfoStream; internalInfoStream << " " << msg; \ + ELPP_INTERNAL_DEBUGGING_OUT_INFO << ELPP_INTERNAL_DEBUGGING_MSG(internalInfoStream.str()) \ + << ELPP_INTERNAL_DEBUGGING_ENDL; }} +# endif +#else +# undef ELPP_INTERNAL_INFO +# define ELPP_INTERNAL_INFO(lvl, msg) +#endif // (defined(ELPP_DEBUG_INFO)) +#if defined(ELPP_STACKTRACE_ON_CRASH) +# if (ELPP_COMPILER_GCC && !ELPP_MINGW) +# define ELPP_STACKTRACE 1 +# else +# if ELPP_COMPILER_MSVC +# pragma message("Stack trace not available for this compiler") +# else +# warning "Stack trace not available for this compiler"; +# endif // ELPP_COMPILER_MSVC +# endif // ELPP_COMPILER_GCC +#endif // (defined(ELPP_STACKTRACE_ON_CRASH)) +// Miscellaneous macros +#define ELPP_UNUSED(x) (void)x +#if ELPP_OS_UNIX +// Log file permissions for unix-based systems +# define ELPP_LOG_PERMS S_IRUSR | S_IWUSR | S_IXUSR | S_IWGRP | S_IRGRP | S_IXGRP | S_IWOTH | S_IXOTH +#endif // ELPP_OS_UNIX +#if defined(ELPP_AS_DLL) && ELPP_COMPILER_MSVC +# if defined(ELPP_EXPORT_SYMBOLS) +# define ELPP_EXPORT __declspec(dllexport) +# else +# define ELPP_EXPORT __declspec(dllimport) +# endif // defined(ELPP_EXPORT_SYMBOLS) +#else +# define ELPP_EXPORT +#endif // defined(ELPP_AS_DLL) && ELPP_COMPILER_MSVC +// Some special functions that are VC++ specific +#undef STRTOK +#undef STRERROR +#undef STRCAT +#undef STRCPY +#if ELPP_CRT_DBG_WARNINGS +# define STRTOK(a, b, c) strtok_s(a, b, c) +# define STRERROR(a, b, c) strerror_s(a, b, c) +# define STRCAT(a, b, len) strcat_s(a, len, b) +# define STRCPY(a, b, len) strcpy_s(a, len, b) +#else +# define STRTOK(a, b, c) strtok(a, b) +# define STRERROR(a, b, c) strerror(c) +# define STRCAT(a, b, len) strcat(a, b) +# define STRCPY(a, b, len) strcpy(a, b) +#endif +// Compiler specific support evaluations +#if (!ELPP_MINGW && !ELPP_COMPILER_CLANG) || defined(ELPP_FORCE_USE_STD_THREAD) +# define ELPP_USE_STD_THREADING 1 +#endif // (!ELPP_MINGW && !ELPP_COMPILER_CLANG) || defined(ELPP_FORCE_USE_STD_THREAD) +#undef ELPP_FINAL +#if ELPP_COMPILER_INTEL || (ELPP_GCC_VERSION < 40702) +# define ELPP_FINAL +#else +# define ELPP_FINAL final +#endif // ELPP_COMPILER_INTEL || (ELPP_GCC_VERSION < 40702) +#if defined(ELPP_EXPERIMENTAL_ASYNC) +# define ELPP_ASYNC_LOGGING 1 +#else +# define ELPP_ASYNC_LOGGING 0 +#endif // defined(ELPP_EXPERIMENTAL_ASYNC) +#if defined(ELPP_THREAD_SAFE) || ELPP_ASYNC_LOGGING +# define ELPP_THREADING_ENABLED 1 +#endif // defined(ELPP_THREAD_SAFE) || ELPP_ASYNC_LOGGING +// Function macro ELPP_FUNC +#undef ELPP_FUNC +#if ELPP_COMPILER_MSVC // Visual C++ +# define ELPP_FUNC __FUNCSIG__ +#elif ELPP_COMPILER_GCC // GCC +# define ELPP_FUNC __PRETTY_FUNCTION__ +#elif ELPP_COMPILER_INTEL // Intel C++ +# define ELPP_FUNC __PRETTY_FUNCTION__ +#elif ELPP_COMPILER_CLANG // Clang++ +# define ELPP_FUNC __PRETTY_FUNCTION__ +#else +# if defined(__func__) +# define ELPP_FUNC __func__ +# else +# define ELPP_FUNC "" +# endif // defined(__func__) +#endif // defined(_MSC_VER) +#undef ELPP_VARIADIC_TEMPLATES_SUPPORTED +// Keep following line commented until features are fixed +#if ELPP_COMPILER_GCC || ELPP_COMPILER_CLANG || ELPP_COMPILER_INTEL || (ELPP_COMPILER_MSVC && _MSC_VER >= 1800) +# define ELPP_VARIADIC_TEMPLATES_SUPPORTED 1 +#endif // ELPP_COMPILER_GCC || ELPP_COMPILER_CLANG || ELPP_COMPILER_INTEL || (ELPP_COMPILER_MSVC && _MSC_VER >= 1800) +// Logging Enable/Disable macros +#if (!defined(ELPP_DISABLE_LOGS)) +# define ELPP_LOGGING_ENABLED 1 +#endif // (!defined(ELPP_DISABLE_LOGS)) +#if (!defined(ELPP_DISABLE_DEBUG_LOGS) && (ELPP_LOGGING_ENABLED) && ((defined(_DEBUG)) || (!defined(NDEBUG)))) +# define ELPP_DEBUG_LOG 1 +#else +# define ELPP_DEBUG_LOG 0 +#endif // (!defined(ELPP_DISABLE_DEBUG_LOGS) && (ELPP_LOGGING_ENABLED) && ((defined(_DEBUG)) || (!defined(NDEBUG)))) +#if (!defined(ELPP_DISABLE_INFO_LOGS) && (ELPP_LOGGING_ENABLED)) +# define ELPP_INFO_LOG 1 +#else +# define ELPP_INFO_LOG 0 +#endif // (!defined(ELPP_DISABLE_INFO_LOGS) && (ELPP_LOGGING_ENABLED)) +#if (!defined(ELPP_DISABLE_WARNING_LOGS) && (ELPP_LOGGING_ENABLED)) +# define ELPP_WARNING_LOG 1 +#else +# define ELPP_WARNING_LOG 0 +#endif // (!defined(ELPP_DISABLE_WARNING_LOGS) && (ELPP_LOGGING_ENABLED)) +#if (!defined(ELPP_DISABLE_ERROR_LOGS) && (ELPP_LOGGING_ENABLED)) +# define ELPP_ERROR_LOG 1 +#else +# define ELPP_ERROR_LOG 0 +#endif // (!defined(ELPP_DISABLE_ERROR_LOGS) && (ELPP_LOGGING_ENABLED)) +#if (!defined(ELPP_DISABLE_FATAL_LOGS) && (ELPP_LOGGING_ENABLED)) +# define ELPP_FATAL_LOG 1 +#else +# define ELPP_FATAL_LOG 0 +#endif // (!defined(ELPP_DISABLE_FATAL_LOGS) && (ELPP_LOGGING_ENABLED)) +#if (!defined(ELPP_DISABLE_TRACE_LOGS) && (ELPP_LOGGING_ENABLED)) +# define ELPP_TRACE_LOG 1 +#else +# define ELPP_TRACE_LOG 0 +#endif // (!defined(ELPP_DISABLE_TRACE_LOGS) && (ELPP_LOGGING_ENABLED)) +#if (!defined(ELPP_DISABLE_VERBOSE_LOGS) && (ELPP_LOGGING_ENABLED)) +# define ELPP_VERBOSE_LOG 1 +#else +# define ELPP_VERBOSE_LOG 0 +#endif // (!defined(ELPP_DISABLE_VERBOSE_LOGS) && (ELPP_LOGGING_ENABLED)) +#if (!(ELPP_CXX0X || ELPP_CXX11)) +# error "Easylogging++ 9.0+ is only compatible with C++0x (or higher) compliant compiler" +#endif // (!(ELPP_CXX0X || ELPP_CXX11)) +// Headers +#if defined(ELPP_SYSLOG) +# include +#endif // defined(ELPP_SYSLOG) +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(ELPP_UNICODE) +# include +# if ELPP_OS_WINDOWS +# include +# endif // ELPP_OS_WINDOWS +#endif // defined(ELPP_UNICODE) +#if ELPP_STACKTRACE +# include +# include +#endif // ELPP_STACKTRACE +#if ELPP_OS_ANDROID +# include +#endif // ELPP_OS_ANDROID +#if ELPP_OS_UNIX +# include +# include +#elif ELPP_OS_WINDOWS +# include +# include +# if defined(WIN32_LEAN_AND_MEAN) +# if defined(ELPP_WINSOCK2) +# include +# else +# include +# endif // defined(ELPP_WINSOCK2) +# endif // defined(WIN32_LEAN_AND_MEAN) +#endif // ELPP_OS_UNIX +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if ELPP_THREADING_ENABLED +# if ELPP_USE_STD_THREADING +# include +# include +# else +# if ELPP_OS_UNIX +# include +# endif // ELPP_OS_UNIX +# endif // ELPP_USE_STD_THREADING +#endif // ELPP_THREADING_ENABLED +#if ELPP_ASYNC_LOGGING +# include +# include +# include +#endif // ELPP_ASYNC_LOGGING +#if defined(ELPP_STL_LOGGING) +// For logging STL based templates +# include +# include +# include +# include +# include +# include +# if defined(ELPP_LOG_STD_ARRAY) +# include +# endif // defined(ELPP_LOG_STD_ARRAY) +# if defined(ELPP_LOG_UNORDERED_MAP) +# include +# endif // defined(ELPP_LOG_UNORDERED_MAP) +# if defined(ELPP_LOG_UNORDERED_SET) +# include +# endif // defined(ELPP_UNORDERED_SET) +#endif // defined(ELPP_STL_LOGGING) +#if defined(ELPP_QT_LOGGING) +// For logging Qt based classes & templates +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +#endif // defined(ELPP_QT_LOGGING) +#if defined(ELPP_BOOST_LOGGING) +// For logging boost based classes & templates +# include +# include +# include +# include +# include +# include +# include +# include +#endif // defined(ELPP_BOOST_LOGGING) +#if defined(ELPP_WXWIDGETS_LOGGING) +// For logging wxWidgets based classes & templates +# include +#endif // defined(ELPP_WXWIDGETS_LOGGING) +// Forward declarations +namespace el { +class Logger; +class LogMessage; +class PerformanceTrackingData; +class Loggers; +class Helpers; +template class Callback; +class LogDispatchCallback; +class PerformanceTrackingCallback; +class LogDispatchData; +namespace base { +class Storage; +class RegisteredLoggers; +class PerformanceTracker; +class MessageBuilder; +class Writer; +class PErrorWriter; +class LogDispatcher; +class DefaultLogBuilder; +class DefaultLogDispatchCallback; +#if ELPP_ASYNC_LOGGING +class AsyncLogDispatchCallback; +class AsyncDispatchWorker; +#endif // ELPP_ASYNC_LOGGING +class DefaultPerformanceTrackingCallback; +} // namespace base +} // namespace el +/// @brief Easylogging++ entry namespace +namespace el { +/// @brief Namespace containing base/internal functionality used by Easylogging++ +namespace base { +/// @brief Data types used by Easylogging++ +namespace type { +#undef ELPP_LITERAL +#undef ELPP_STRLEN +#undef ELPP_COUT +#if defined(ELPP_UNICODE) +# define ELPP_LITERAL(txt) L##txt +# define ELPP_STRLEN wcslen +# if defined ELPP_CUSTOM_COUT +# define ELPP_COUT ELPP_CUSTOM_COUT +# else +# define ELPP_COUT std::wcout +# endif // defined ELPP_CUSTOM_COUT +typedef wchar_t char_t; +typedef std::wstring string_t; +typedef std::wstringstream stringstream_t; +typedef std::wfstream fstream_t; +typedef std::wostream ostream_t; +#else +# define ELPP_LITERAL(txt) txt +# define ELPP_STRLEN strlen +# if defined ELPP_CUSTOM_COUT +# define ELPP_COUT ELPP_CUSTOM_COUT +# else +# define ELPP_COUT std::cout +# endif // defined ELPP_CUSTOM_COUT +typedef char char_t; +typedef std::string string_t; +typedef std::stringstream stringstream_t; +typedef std::fstream fstream_t; +typedef std::ostream ostream_t; +#endif // defined(ELPP_UNICODE) +#if defined(ELPP_CUSTOM_COUT_LINE) +# define ELPP_COUT_LINE(logLine) ELPP_CUSTOM_COUT_LINE(logLine) +#else +# define ELPP_COUT_LINE(logLine) logLine << std::flush +#endif // defined(ELPP_CUSTOM_COUT_LINE) +typedef unsigned short EnumType; +typedef std::shared_ptr StoragePointer; +typedef int VerboseLevel; +typedef std::shared_ptr LogDispatchCallbackPtr; +typedef std::shared_ptr PerformanceTrackingCallbackPtr; +} // namespace type +/// @brief Internal helper class that prevent copy constructor for class +/// +/// @detail When using this class simply inherit it privately +class NoCopy { +protected: + NoCopy(void) {} +private: + NoCopy(const NoCopy&); + NoCopy& operator=(const NoCopy&); +}; +/// @brief Internal helper class that makes all default constructors private. +/// +/// @detail This prevents initializing class making it static unless an explicit constructor is declared. +/// When using this class simply inherit it privately +class StaticClass { +private: + StaticClass(void); + StaticClass(const StaticClass&); + StaticClass& operator=(const StaticClass&); +}; +} // namespace base +/// @brief Represents enumeration for severity level used to determine level of logging +/// +/// @detail With Easylogging++, developers may disable or enable any level regardless of +/// what the severity is. Or they can choose to log using hierarchical logging flag +enum class Level : base::type::EnumType { + /// @brief Generic level that represents all the levels. Useful when setting global configuration for all levels + Global = 1, + /// @brief Information that can be useful to back-trace certain events - mostly useful than debug logs. + Trace = 2, + /// @brief Informational events most useful for developers to debug application + Debug = 4, + /// @brief Severe error information that will presumably abort application + Fatal = 8, + /// @brief Information representing errors in application but application will keep running + Error = 16, + /// @brief Useful when application has potentially harmful situtaions + Warning = 32, + /// @brief Information that can be highly useful and vary with verbose logging level. + Verbose = 64, + /// @brief Mainly useful to represent current progress of application + Info = 128, + /// @brief Represents unknown level + Unknown = 1010 +}; +/// @brief Static class that contains helper functions for el::Level +class LevelHelper : base::StaticClass { +public: + /// @brief Represents minimum valid level. Useful when iterating through enum. + static const base::type::EnumType kMinValid = static_cast(Level::Trace); + /// @brief Represents maximum valid level. This is used internally and you should not need it. + static const base::type::EnumType kMaxValid = static_cast(Level::Info); + /// @brief Casts level to int, useful for iterating through enum. + static base::type::EnumType castToInt(Level level) { + return static_cast(level); + } + /// @brief Casts int(ushort) to level, useful for iterating through enum. + static Level castFromInt(base::type::EnumType l) { + return static_cast(l); + } + /// @brief Converts level to associated const char* + /// @return Upper case string based level. + static const char* convertToString(Level level) { + // Do not use switch over strongly typed enums because Intel C++ compilers dont support them yet. + if (level == Level::Global) return "GLOBAL"; + if (level == Level::Debug) return "DEBUG"; + if (level == Level::Info) return "INFO"; + if (level == Level::Warning) return "WARNING"; + if (level == Level::Error) return "ERROR"; + if (level == Level::Fatal) return "FATAL"; + if (level == Level::Verbose) return "VERBOSE"; + if (level == Level::Trace) return "TRACE"; + return "UNKNOWN"; + } + /// @brief Converts from levelStr to Level + /// @param levelStr Upper case string based level. + /// Lower case is also valid but providing upper case is recommended. + static Level convertFromString(const char* levelStr) { + if ((strcmp(levelStr, "GLOBAL") == 0) || (strcmp(levelStr, "global") == 0)) + return Level::Global; + if ((strcmp(levelStr, "DEBUG") == 0) || (strcmp(levelStr, "debug") == 0)) + return Level::Debug; + if ((strcmp(levelStr, "INFO") == 0) || (strcmp(levelStr, "info") == 0)) + return Level::Info; + if ((strcmp(levelStr, "WARNING") == 0) || (strcmp(levelStr, "warning") == 0)) + return Level::Warning; + if ((strcmp(levelStr, "ERROR") == 0) || (strcmp(levelStr, "error") == 0)) + return Level::Error; + if ((strcmp(levelStr, "FATAL") == 0) || (strcmp(levelStr, "fatal") == 0)) + return Level::Fatal; + if ((strcmp(levelStr, "VERBOSE") == 0) || (strcmp(levelStr, "verbose") == 0)) + return Level::Verbose; + if ((strcmp(levelStr, "TRACE") == 0) || (strcmp(levelStr, "trace") == 0)) + return Level::Trace; + return Level::Unknown; + } + /// @brief Applies specified function to each level starting from startIndex + /// @param startIndex initial value to start the iteration from. This is passed as pointer and + /// is left-shifted so this can be used inside function (fn) to represent current level. + /// @param fn function to apply with each level. This bool represent whether or not to stop iterating through levels. + static inline void forEachLevel(base::type::EnumType* startIndex, const std::function& fn) { + base::type::EnumType lIndexMax = LevelHelper::kMaxValid; + do { + if (fn()) { + break; + } + *startIndex = static_cast(*startIndex << 1); + } while (*startIndex <= lIndexMax); + } +}; +/// @brief Represents enumeration of ConfigurationType used to configure or access certain aspect +/// of logging +enum class ConfigurationType : base::type::EnumType { + /// @brief Determines whether or not corresponding level and logger of logging is enabled + /// You may disable all logs by using el::Level::Global + Enabled = 1, + /// @brief Whether or not to write corresponding log to log file + ToFile = 2, + /// @brief Whether or not to write corresponding level and logger log to standard output. + /// By standard output meaning termnal, command prompt etc + ToStandardOutput = 4, + /// @brief Determines format of logging corresponding level and logger. + Format = 8, + /// @brief Determines log file (full path) to write logs to for correponding level and logger + Filename = 16, + /// @brief Specifies milliseconds width. Width can be within range (1-6) + MillisecondsWidth = 32, + /// @brief Determines whether or not performance tracking is enabled. + /// + /// @detail This does not depend on logger or level. Performance tracking always uses 'performance' logger + PerformanceTracking = 64, + /// @brief Specifies log file max size. + /// + /// @detail If file size of corresponding log file (for corresponding level) is >= specified size, log file will + /// be truncated and re-initiated. + MaxLogFileSize = 128, + /// @brief Specifies number of log entries to hold until we flush pending log data + LogFlushThreshold = 256, + /// @brief Represents unknown configuration + Unknown = 1010 +}; +/// @brief Static class that contains helper functions for el::ConfigurationType +class ConfigurationTypeHelper : base::StaticClass { +public: + /// @brief Represents minimum valid configuration type. Useful when iterating through enum. + static const base::type::EnumType kMinValid = static_cast(ConfigurationType::Enabled); + /// @brief Represents maximum valid configuration type. This is used internally and you should not need it. + static const base::type::EnumType kMaxValid = static_cast(ConfigurationType::MaxLogFileSize); + /// @brief Casts configuration type to int, useful for iterating through enum. + static base::type::EnumType castToInt(ConfigurationType configurationType) { + return static_cast(configurationType); + } + /// @brief Casts int(ushort) to configurationt type, useful for iterating through enum. + static ConfigurationType castFromInt(base::type::EnumType c) { + return static_cast(c); + } + /// @brief Converts configuration type to associated const char* + /// @returns Upper case string based configuration type. + static const char* convertToString(ConfigurationType configurationType) { + // Do not use switch over strongly typed enums because Intel C++ compilers dont support them yet. + if (configurationType == ConfigurationType::Enabled) return "ENABLED"; + if (configurationType == ConfigurationType::Filename) return "FILENAME"; + if (configurationType == ConfigurationType::Format) return "FORMAT"; + if (configurationType == ConfigurationType::ToFile) return "TO_FILE"; + if (configurationType == ConfigurationType::ToStandardOutput) return "TO_STANDARD_OUTPUT"; + if (configurationType == ConfigurationType::MillisecondsWidth) return "MILLISECONDS_WIDTH"; + if (configurationType == ConfigurationType::PerformanceTracking) return "PERFORMANCE_TRACKING"; + if (configurationType == ConfigurationType::MaxLogFileSize) return "MAX_LOG_FILE_SIZE"; + if (configurationType == ConfigurationType::LogFlushThreshold) return "LOG_FLUSH_THRESHOLD"; + return "UNKNOWN"; + } + /// @brief Converts from configStr to ConfigurationType + /// @param configStr Upper case string based configuration type. + /// Lower case is also valid but providing upper case is recommended. + static ConfigurationType convertFromString(const char* configStr) { + if ((strcmp(configStr, "ENABLED") == 0) || (strcmp(configStr, "enabled") == 0)) + return ConfigurationType::Enabled; + if ((strcmp(configStr, "TO_FILE") == 0) || (strcmp(configStr, "to_file") == 0)) + return ConfigurationType::ToFile; + if ((strcmp(configStr, "TO_STANDARD_OUTPUT") == 0) || (strcmp(configStr, "to_standard_output") == 0)) + return ConfigurationType::ToStandardOutput; + if ((strcmp(configStr, "FORMAT") == 0) || (strcmp(configStr, "format") == 0)) + return ConfigurationType::Format; + if ((strcmp(configStr, "FILENAME") == 0) || (strcmp(configStr, "filename") == 0)) + return ConfigurationType::Filename; + if ((strcmp(configStr, "MILLISECONDS_WIDTH") == 0) || (strcmp(configStr, "milliseconds_width") == 0)) + return ConfigurationType::MillisecondsWidth; + if ((strcmp(configStr, "PERFORMANCE_TRACKING") == 0) || (strcmp(configStr, "performance_tracking") == 0)) + return ConfigurationType::PerformanceTracking; + if ((strcmp(configStr, "MAX_LOG_FILE_SIZE") == 0) || (strcmp(configStr, "max_log_file_size") == 0)) + return ConfigurationType::MaxLogFileSize; + if ((strcmp(configStr, "LOG_FLUSH_THRESHOLD") == 0) || (strcmp(configStr, "log_flush_threshold") == 0)) + return ConfigurationType::LogFlushThreshold; + return ConfigurationType::Unknown; + } + /// @brief Applies specified function to each configuration type starting from startIndex + /// @param startIndex initial value to start the iteration from. This is passed by pointer and is left-shifted + /// so this can be used inside function (fn) to represent current configuration type. + /// @param fn function to apply with each configuration type. + /// This bool represent whether or not to stop iterating through configurations. + static inline void forEachConfigType(base::type::EnumType* startIndex, const std::function& fn) { + base::type::EnumType cIndexMax = ConfigurationTypeHelper::kMaxValid; + do { + if (fn()) { + break; + } + *startIndex = static_cast(*startIndex << 1); + } while (*startIndex <= cIndexMax); + } +}; +/// @brief Flags used while writing logs. This flags are set by user +enum class LoggingFlag : base::type::EnumType { + /// @brief Makes sure we have new line for each container log entry + NewLineForContainer = 1, + /// @brief Makes sure if -vmodule is used and does not specifies a module, then verbose + /// logging is allowed via that module. + AllowVerboseIfModuleNotSpecified = 2, + /// @brief When handling crashes by default, detailed crash reason will be logged as well + LogDetailedCrashReason = 4, + /// @brief Allows to disable application abortion when logged using FATAL level + DisableApplicationAbortOnFatalLog = 8, + /// @brief Flushes log with every log-entry (performance sensative) - Disabled by default + ImmediateFlush = 16, + /// @brief Enables strict file rolling + StrictLogFileSizeCheck = 32, + /// @brief Make terminal output colorful for supported terminals + ColoredTerminalOutput = 64, + /// @brief Supports use of multiple logging in same macro, e.g, CLOG(INFO, "default", "network") + MultiLoggerSupport = 128, + /// @brief Disables comparing performance tracker's checkpoints + DisablePerformanceTrackingCheckpointComparison = 256, + /// @brief Disable VModules + DisableVModules = 512, + /// @brief Disable VModules extensions + DisableVModulesExtensions = 1024, + /// @brief Enables hierarchical logging + HierarchicalLogging = 2048, + /// @brief Creates logger automatically when not available + CreateLoggerAutomatically = 4096, + /// @brief Adds spaces b/w logs that separated by left-shift operator + AutoSpacing = 8192, + /// @brief Preserves time format and does not convert it to sec, hour etc (performance tracking only) + FixedTimeFormat = 16384 +}; +namespace base { +/// @brief Namespace containing constants used internally. +namespace consts { + // Level log values - These are values that are replaced in place of %level format specifier + static const base::type::char_t* kInfoLevelLogValue = ELPP_LITERAL("INFO "); + static const base::type::char_t* kDebugLevelLogValue = ELPP_LITERAL("DEBUG"); + static const base::type::char_t* kWarningLevelLogValue = ELPP_LITERAL("WARN "); + static const base::type::char_t* kErrorLevelLogValue = ELPP_LITERAL("ERROR"); + static const base::type::char_t* kFatalLevelLogValue = ELPP_LITERAL("FATAL"); + static const base::type::char_t* kVerboseLevelLogValue = ELPP_LITERAL("VER"); + static const base::type::char_t* kTraceLevelLogValue = ELPP_LITERAL("TRACE"); + static const base::type::char_t* kInfoLevelShortLogValue = ELPP_LITERAL("I"); + static const base::type::char_t* kDebugLevelShortLogValue = ELPP_LITERAL("D"); + static const base::type::char_t* kWarningLevelShortLogValue = ELPP_LITERAL("W"); + static const base::type::char_t* kErrorLevelShortLogValue = ELPP_LITERAL("E"); + static const base::type::char_t* kFatalLevelShortLogValue = ELPP_LITERAL("F"); + static const base::type::char_t* kVerboseLevelShortLogValue = ELPP_LITERAL("V"); + static const base::type::char_t* kTraceLevelShortLogValue = ELPP_LITERAL("T"); + // Format specifiers - These are used to define log format + static const base::type::char_t* kAppNameFormatSpecifier = ELPP_LITERAL("%app"); + static const base::type::char_t* kLoggerIdFormatSpecifier = ELPP_LITERAL("%logger"); + static const base::type::char_t* kThreadIdFormatSpecifier = ELPP_LITERAL("%thread"); + static const base::type::char_t* kSeverityLevelFormatSpecifier = ELPP_LITERAL("%level"); + static const base::type::char_t* kSeverityLevelShortFormatSpecifier = ELPP_LITERAL("%levshort"); + static const base::type::char_t* kDateTimeFormatSpecifier = ELPP_LITERAL("%datetime"); + static const base::type::char_t* kLogFileFormatSpecifier = ELPP_LITERAL("%file"); + static const base::type::char_t* kLogFileBaseFormatSpecifier = ELPP_LITERAL("%fbase"); + static const base::type::char_t* kLogLineFormatSpecifier = ELPP_LITERAL("%line"); + static const base::type::char_t* kLogLocationFormatSpecifier = ELPP_LITERAL("%loc"); + static const base::type::char_t* kLogFunctionFormatSpecifier = ELPP_LITERAL("%func"); + static const base::type::char_t* kCurrentUserFormatSpecifier = ELPP_LITERAL("%user"); + static const base::type::char_t* kCurrentHostFormatSpecifier = ELPP_LITERAL("%host"); + static const base::type::char_t* kMessageFormatSpecifier = ELPP_LITERAL("%msg"); + static const base::type::char_t* kVerboseLevelFormatSpecifier = ELPP_LITERAL("%vlevel"); + static const char* kDateTimeFormatSpecifierForFilename = "%datetime"; + // Date/time + static const char* kDays[7] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; + static const char* kDaysAbbrev[7] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; + static const char* kMonths[12] = { "January", "February", "March", "Apri", "May", "June", "July", "August", + "September", "October", "November", "December" }; + static const char* kMonthsAbbrev[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; + static const char* kDefaultDateTimeFormat = "%Y-%M-%d %H:%m:%s,%g"; + static const char* kDefaultDateTimeFormatInFilename = "%Y-%M-%d_%H-%m"; + static const int kYearBase = 1900; + static const char* kAm = "AM"; + static const char* kPm = "PM"; + // Miscellaneous constants + static const char* kDefaultLoggerId = "default"; + static const char* kPerformanceLoggerId = "performance"; + static const char* kSysLogLoggerId = "syslog"; + static const char* kNullPointer = "nullptr"; + static const char kFormatSpecifierChar = '%'; +#if ELPP_VARIADIC_TEMPLATES_SUPPORTED + static const char kFormatSpecifierCharValue = 'v'; +#endif // ELPP_VARIADIC_TEMPLATES_SUPPORTED + static const unsigned int kMaxLogPerContainer = 100; + static const unsigned int kMaxLogPerCounter = 100000; + static const unsigned int kDefaultMillisecondsWidth = 3; + static const base::type::VerboseLevel kMaxVerboseLevel = 9; + static const char* kUnknownUser = "user"; + static const char* kUnknownHost = "unknown-host"; +#if defined(ELPP_DEFAULT_LOG_FILE) + static const char* kDefaultLogFile = ELPP_DEFAULT_LOG_FILE; +#else +# if ELPP_OS_UNIX +# if ELPP_OS_ANDROID + static const char* kDefaultLogFile = "logs/myeasylog.log"; +# else + static const char* kDefaultLogFile = "logs/myeasylog.log"; +# endif // ELPP_OS_ANDROID +# elif ELPP_OS_WINDOWS + static const char* kDefaultLogFile = "logs\\myeasylog.log"; +# endif // ELPP_OS_UNIX +#endif // defined(ELPP_DEFAULT_LOG_FILE) +#if !defined(ELPP_DISABLE_LOG_FILE_FROM_ARG) + static const char* kDefaultLogFileParam = "--default-log-file"; +#endif // !defined(ELPP_DISABLE_LOG_FILE_FROM_ARG) +#if defined(ELPP_LOGGING_FLAGS_FROM_ARG) + static const char* kLoggingFlagsParam = "--logging-flags"; +#endif // defined(ELPP_LOGGING_FLAGS_FROM_ARG) +#if ELPP_OS_WINDOWS + static const char* kFilePathSeperator = "\\"; +#else + static const char* kFilePathSeperator = "/"; +#endif // ELPP_OS_WINDOWS + static const char* kValidLoggerIdSymbols = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._"; + static const char* kConfigurationComment = "##"; + static const char* kConfigurationLevel = "*"; + static const char* kConfigurationLoggerId = "--"; + static const std::size_t kSourceFilenameMaxLength = 100; + static const std::size_t kSourceLineMaxLength = 10; + static const Level kPerformanceTrackerDefaultLevel = Level::Info; + const struct { + double value; + const base::type::char_t* unit; + } kTimeFormats[] = { + { 1000.0f, ELPP_LITERAL("mis") }, + { 1000.0f, ELPP_LITERAL("ms") }, + { 60.0f, ELPP_LITERAL("seconds") }, + { 60.0f, ELPP_LITERAL("minutes") }, + { 24.0f, ELPP_LITERAL("hours") }, + { 7.0f, ELPP_LITERAL("days") } + }; + static const int kTimeFormatsCount = sizeof(kTimeFormats) / sizeof(kTimeFormats[0]); + const struct { + int numb; + const char* name; + const char* brief; + const char* detail; + } kCrashSignals[] = { + // NOTE: Do not re-order, if you do please check CrashHandler(bool) constructor and CrashHandler::setHandler(..) + { SIGABRT, "SIGABRT", "Abnormal termination", + "Program was abnormally terminated." }, + { SIGFPE, "SIGFPE", "Erroneous arithmetic operation", + "Arithemetic operation issue such as division by zero or operation resulting in overflow." }, + { SIGILL, "SIGILL", "Illegal instruction", + "Generally due to a corruption in the code or to an attempt to execute data."}, + { SIGSEGV, "SIGSEGV", "Invalid access to memory", + "Program is trying to read an invalid (unallocated, deleted or corrupted) or inaccessible memory." }, + { SIGINT, "SIGINT", "Interactive attention signal", + "Interruption generated (generally) by user or operating system." }, + }; + static const int kCrashSignalsCount = sizeof(kCrashSignals) / sizeof(kCrashSignals[0]); +} // namespace consts +} // namespace base +typedef std::function PreRollOutCallback; +namespace base { +static inline void defaultPreRollOutCallback(const char*, std::size_t) {} +/// @brief Enum to represent timestamp unit +enum class TimestampUnit : base::type::EnumType { + Microsecond = 0, Millisecond = 1, Second = 2, Minute = 3, Hour = 4, Day = 5 +}; +/// @brief Format flags used to determine specifiers that are active for performance improvements. +enum class FormatFlags : base::type::EnumType { + DateTime = 1<<1, LoggerId = 1<<2, File = 1<<3, Line = 1<<4, Location = 1<<5, Function = 1<<6, + User = 1<<7, Host = 1<<8, LogMessage = 1<<9, VerboseLevel = 1<<10, AppName = 1<<11, ThreadId = 1<<12, + Level = 1<<13, FileBase = 1<<14, LevelShort = 1<<15 +}; +/// @brief A milliseconds width class containing actual width and offset for date/time +class MillisecondsWidth { +public: + MillisecondsWidth(void) { init(base::consts::kDefaultMillisecondsWidth); } + explicit MillisecondsWidth(int width) { init(width); } + bool operator==(const MillisecondsWidth& msWidth) { return m_width == msWidth.m_width && m_offset == msWidth.m_offset; } + int m_width; unsigned int m_offset; +private: + void init(int width) { + if (width < 1 || width > 6) { + width = base::consts::kDefaultMillisecondsWidth; + } + m_width = width; + switch (m_width) { + case 3: m_offset = 1000; break; + case 4: m_offset = 100; break; + case 5: m_offset = 10; break; + case 6: m_offset = 1; break; + default: m_offset = 1000; break; + } + } +}; +/// @brief Namespace containing utility functions/static classes used internally +namespace utils { +/// @brief Deletes memory safely and points to null +template +static inline +typename std::enable_if::value, void>::type +safeDelete(T*& pointer) { + if (pointer == nullptr) + return; + delete pointer; + pointer = nullptr; +} +/// @brief Gets value of const char* but if it is nullptr, a string nullptr is returned +static inline const char* charPtrVal(const char* pointer) { + return pointer == nullptr ? base::consts::kNullPointer : pointer; +} +/// @brief Aborts application due with user-defined status +static inline void abort(int status, const std::string& reason = std::string()) { + // Both status and reason params are there for debugging with tools like gdb etc + ELPP_UNUSED(status); + ELPP_UNUSED(reason); +#if defined(ELPP_COMPILER_MSVC) && defined(_M_IX86) && defined(_DEBUG) + // Ignore msvc critical error dialog - break instead (on debug mode) + _asm int 3 +#else + ::abort(); +#endif // defined(ELPP_COMPILER_MSVC) && defined(_M_IX86) && defined(_DEBUG) +} +/// @brief Bitwise operations for C++11 strong enum class. This casts e into Flag_T and returns value after bitwise operation +/// Use these function as
flag = bitwise::Or(MyEnum::val1, flag);
+namespace bitwise { +template +static inline base::type::EnumType And(Enum e, base::type::EnumType flag) { + return static_cast(flag) & static_cast(e); +} +template +static inline base::type::EnumType Not(Enum e, base::type::EnumType flag) { + return static_cast(flag) & ~(static_cast(e)); +} +template +static inline base::type::EnumType Or(Enum e, base::type::EnumType flag) { + return static_cast(flag) | static_cast(e); +} +} // namespace bitwise +template +static inline void addFlag(Enum e, base::type::EnumType* flag) { + *flag = base::utils::bitwise::Or(e, *flag); +} +template +static inline void removeFlag(Enum e, base::type::EnumType* flag) { + *flag = base::utils::bitwise::Not(e, *flag); +} +template +static inline bool hasFlag(Enum e, base::type::EnumType flag) { + return base::utils::bitwise::And(e, flag) > 0x0; +} +} // namespace utils +namespace threading { +#if ELPP_THREADING_ENABLED +# if !ELPP_USE_STD_THREADING +namespace internal { +/// @brief A mutex wrapper for compiler that dont yet support std::mutex +class Mutex : base::NoCopy { +public: + Mutex(void) { +# if ELPP_OS_UNIX + pthread_mutex_init(&m_underlyingMutex, nullptr); +# elif ELPP_OS_WINDOWS + InitializeCriticalSection(&m_underlyingMutex); +# endif // ELPP_OS_UNIX + } + + virtual ~Mutex(void) { +# if ELPP_OS_UNIX + pthread_mutex_destroy(&m_underlyingMutex); +# elif ELPP_OS_WINDOWS + DeleteCriticalSection(&m_underlyingMutex); +# endif // ELPP_OS_UNIX + } + + inline void lock(void) { +# if ELPP_OS_UNIX + pthread_mutex_lock(&m_underlyingMutex); +# elif ELPP_OS_WINDOWS + EnterCriticalSection(&m_underlyingMutex); +# endif // ELPP_OS_UNIX + } + + inline bool try_lock(void) { +# if ELPP_OS_UNIX + return (pthread_mutex_trylock(&m_underlyingMutex) == 0); +# elif ELPP_OS_WINDOWS + return TryEnterCriticalSection(&m_underlyingMutex); +# endif // ELPP_OS_UNIX + } + + inline void unlock(void) { +# if ELPP_OS_UNIX + pthread_mutex_unlock(&m_underlyingMutex); +# elif ELPP_OS_WINDOWS + LeaveCriticalSection(&m_underlyingMutex); +# endif // ELPP_OS_UNIX + } + +private: +# if ELPP_OS_UNIX + pthread_mutex_t m_underlyingMutex; +# elif ELPP_OS_WINDOWS + CRITICAL_SECTION m_underlyingMutex; +# endif // ELPP_OS_UNIX +}; +/// @brief Scoped lock for compiler that dont yet support std::lock_guard +template +class ScopedLock : base::NoCopy { +public: + explicit ScopedLock(M& mutex) { + m_mutex = &mutex; + m_mutex->lock(); + } + + virtual ~ScopedLock(void) { + m_mutex->unlock(); + } +private: + M* m_mutex; + ScopedLock(void); +}; +} // namespace internal +/// @brief Gets ID of currently running threading in windows systems. On unix, nothing is returned. +static inline std::string getCurrentThreadId(void) { + std::stringstream ss; +# if (ELPP_OS_WINDOWS) + ss << GetCurrentThreadId(); +# endif // (ELPP_OS_WINDOWS) + return ss.str(); +} +static inline void msleep(int) { + // No implementation for non std::thread version +} +typedef base::threading::internal::Mutex Mutex; +typedef base::threading::internal::ScopedLock ScopedLock; +# else +/// @brief Gets ID of currently running threading using std::this_thread::get_id() +static inline std::string getCurrentThreadId(void) { + std::stringstream ss; + ss << std::this_thread::get_id(); + return ss.str(); +} +static inline void msleep(int ms) { + // Only when async logging enabled - this is because async is strict on compiler +#if ELPP_ASYNC_LOGGING + std::this_thread::sleep_for(std::chrono::milliseconds(ms)); +#endif // ELPP_ASYNC_LOGGING +} +typedef std::mutex Mutex; +typedef std::lock_guard ScopedLock; +# endif // !ELPP_USE_STD_THREADING +#else +namespace internal { +/// @brief Mutex wrapper used when multi-threading is disabled. +class NoMutex : base::NoCopy { +public: + NoMutex(void) {} + inline void lock(void) {} + inline bool try_lock(void) { return true; } + inline void unlock(void) {} +}; +/// @brief Lock guard wrapper used when multi-threading is disabled. +template +class NoScopedLock : base::NoCopy { +public: + explicit NoScopedLock(Mutex&) { + } + virtual ~NoScopedLock(void) { + } +private: + NoScopedLock(void); +}; +} // namespace internal +static inline std::string getCurrentThreadId(void) { + return std::string(); +} +static inline void msleep(int) { + // No custom implementation +} +typedef base::threading::internal::NoMutex Mutex; +typedef base::threading::internal::NoScopedLock ScopedLock; +#endif // ELPP_THREADING_ENABLED +/// @brief Base of thread safe class, this class is inheritable-only +class ThreadSafe { +public: + virtual inline void acquireLock(void) ELPP_FINAL { m_mutex.lock(); } + virtual inline void releaseLock(void) ELPP_FINAL { m_mutex.unlock(); } + virtual inline base::threading::Mutex& lock(void) ELPP_FINAL { return m_mutex; } +protected: + ThreadSafe(void) {} + virtual ~ThreadSafe(void) {} +private: + base::threading::Mutex m_mutex; +}; +} // namespace threading +namespace utils { +class File : base::StaticClass { +public: + /// @brief Creates new out file stream for specified filename. + /// @return Pointer to newly created fstream or nullptr + static base::type::fstream_t* newFileStream(const std::string& filename) { + base::type::fstream_t *fs = new base::type::fstream_t(filename.c_str(), + base::type::fstream_t::out | base::type::fstream_t::app); +#if defined(ELPP_UNICODE) + std::locale elppUnicodeLocale(""); +#if ELPP_OS_WINDOWS + std::locale elppUnicodeLocaleWindows(elppUnicodeLocale, new std::codecvt_utf8_utf16); + elppUnicodeLocale = elppUnicodeLocaleWindows; +#endif + fs->imbue(elppUnicodeLocale); +#endif // defined(ELPP_UNICODE) + if (fs->is_open()) { + fs->flush(); + } else { + base::utils::safeDelete(fs); + ELPP_INTERNAL_ERROR("Bad file [" << filename << "]", true); + } + return fs; + } + + /// @brief Gets size of file provided in stream + static std::size_t getSizeOfFile(base::type::fstream_t* fs) { + if (fs == nullptr) { + return 0; + } + std::streampos currPos = fs->tellg(); + fs->seekg(0, fs->end); + std::size_t size = static_cast(fs->tellg()); + fs->seekg(currPos); + return size; + } + + /// @brief Determines whether or not provided path exist in current file system + static inline bool pathExists(const char* path, bool considerFile = false) { + if (path == nullptr) { + return false; + } +#if ELPP_OS_UNIX + ELPP_UNUSED(considerFile); + struct stat st; + return (stat(path, &st) == 0); +#elif ELPP_OS_WINDOWS + DWORD fileType = GetFileAttributesA(path); + if (fileType == INVALID_FILE_ATTRIBUTES) { + return false; + } + return considerFile ? true : ((fileType & FILE_ATTRIBUTE_DIRECTORY) == 0 ? false : true); +#endif // ELPP_OS_UNIX + } + + /// @brief Creates specified path on file system + /// @param path Path to create. + static bool createPath(const std::string& path) { + if (path.empty()) { + return false; + } + if (base::utils::File::pathExists(path.c_str())) { + return true; + } + int status = -1; + + char* currPath = const_cast(path.c_str()); + std::string builtPath = std::string(); +#if ELPP_OS_UNIX + if (path[0] == '/') { + builtPath = "/"; + } + currPath = STRTOK(currPath, base::consts::kFilePathSeperator, 0); +#elif ELPP_OS_WINDOWS + // Use secure functions API + char* nextTok_ = nullptr; + currPath = STRTOK(currPath, base::consts::kFilePathSeperator, &nextTok_); + ELPP_UNUSED(nextTok_); +#endif // ELPP_OS_UNIX + while (currPath != nullptr) { + builtPath.append(currPath); + builtPath.append(base::consts::kFilePathSeperator); +#if ELPP_OS_UNIX + status = mkdir(builtPath.c_str(), ELPP_LOG_PERMS); + currPath = STRTOK(nullptr, base::consts::kFilePathSeperator, 0); +#elif ELPP_OS_WINDOWS + status = _mkdir(builtPath.c_str()); + currPath = STRTOK(nullptr, base::consts::kFilePathSeperator, &nextTok_); +#endif // ELPP_OS_UNIX + } + if (status == -1) { + ELPP_INTERNAL_ERROR("Error while creating path [" << path << "]", true); + return false; + } + return true; + } + /// @brief Extracts path of filename with leading slash + static std::string extractPathFromFilename(const std::string& fullPath, + const char* seperator = base::consts::kFilePathSeperator) { + if ((fullPath == "") || (fullPath.find(seperator) == std::string::npos)) { + return fullPath; + } + std::size_t lastSlashAt = fullPath.find_last_of(seperator); + if (lastSlashAt == 0) { + return std::string(seperator); + } + return fullPath.substr(0, lastSlashAt + 1); + } + /// @brief builds stripped filename and puts it in buff + static void buildStrippedFilename(const char* filename, char buff[], + std::size_t limit = base::consts::kSourceFilenameMaxLength) { + std::size_t sizeOfFilename = strlen(filename); + if (sizeOfFilename >= limit) { + filename += (sizeOfFilename - limit); + if (filename[0] != '.' && filename[1] != '.') { // prepend if not already + filename += 3; // 3 = '..' + STRCAT(buff, "..", limit); + } + } + STRCAT(buff, filename, limit); + } + /// @brief builds base filename and puts it in buff + static void buildBaseFilename(const std::string& fullPath, char buff[], + std::size_t limit = base::consts::kSourceFilenameMaxLength, + const char* seperator = base::consts::kFilePathSeperator) { + const char *filename = fullPath.c_str(); + std::size_t lastSlashAt = fullPath.find_last_of(seperator); + filename += lastSlashAt ? lastSlashAt+1 : 0; + std::size_t sizeOfFilename = strlen(filename); + if (sizeOfFilename >= limit) { + filename += (sizeOfFilename - limit); + if (filename[0] != '.' && filename[1] != '.') { // prepend if not already + filename += 3; // 3 = '..' + STRCAT(buff, "..", limit); + } + } + STRCAT(buff, filename, limit); + } +}; +/// @brief String utilities helper class used internally. You should not use it. +class Str : base::StaticClass { +public: + /// @brief Checks if character is digit. Dont use libc implementation of it to prevent locale issues. + static inline bool isDigit(char c) { + return c >= '0' && c <= '9'; + } + + /// @brief Matches wildcards, '*' and '?' only supported. + static bool wildCardMatch(const char* str, const char* pattern) { + while (*pattern) { + switch (*pattern) { + case '?': + if (!*str) + return false; + ++str; + ++pattern; + break; + case '*': + if (wildCardMatch(str, pattern + 1)) + return true; + if (*str && wildCardMatch(str + 1, pattern)) + return true; + return false; + break; + default: + if (*str++ != *pattern++) + return false; + break; + } + } + return !*str && !*pattern; + } + + /// @brief Trims string from start + /// @param [in,out] str String to trim + static inline std::string& ltrim(std::string& str) { + str.erase(str.begin(), std::find_if(str.begin(), str.end(), std::not1(std::ptr_fun(&std::isspace)))); + return str; + } + + /// @brief Trim string from end + /// @param [in,out] str String to trim + static inline std::string& rtrim(std::string& str) { + str.erase(std::find_if(str.rbegin(), str.rend(), std::not1(std::ptr_fun(&std::isspace))).base(), str.end()); + return str; + } + + /// @brief Trims string from left and right + /// @param [in,out] str String to trim + static inline std::string& trim(std::string& str) { + return ltrim(rtrim(str)); + } + + /// @brief Determines whether or not str starts with specified string + /// @param str String to check + /// @param start String to check against + /// @return Returns true if starts with specified string, false otherwise + static inline bool startsWith(const std::string& str, const std::string& start) { + return (str.length() >= start.length()) && (str.compare(0, start.length(), start) == 0); + } + + /// @brief Determines whether or not str ends with specified string + /// @param str String to check + /// @param end String to check against + /// @return Returns true if ends with specified string, false otherwise + static inline bool endsWith(const std::string& str, const std::string& end) { + return (str.length() >= end.length()) && (str.compare(str.length() - end.length(), end.length(), end) == 0); + } + + /// @brief Replaces all instances of replaceWhat with 'replaceWith'. Original variable is changed for performance. + /// @param [in,out] str String to replace from + /// @param replaceWhat Character to replace + /// @param replaceWith Character to replace with + /// @return Modified version of str + static inline std::string& replaceAll(std::string& str, char replaceWhat, char replaceWith) { + std::replace(str.begin(), str.end(), replaceWhat, replaceWith); + return str; + } + + /// @brief Replaces all instances of 'replaceWhat' with 'replaceWith'. (String version) Replaces in place + /// @param str String to replace from + /// @param replaceWhat Character to replace + /// @param replaceWith Character to replace with + /// @return Modified (original) str + static inline std::string& replaceAll(std::string& str, const std::string& replaceWhat, // NOLINT + const std::string& replaceWith) { + if (replaceWhat == replaceWith) + return str; + std::size_t foundAt = std::string::npos; + while ((foundAt = str.find(replaceWhat, foundAt + 1)) != std::string::npos) { + str.replace(foundAt, replaceWhat.length(), replaceWith); + } + return str; + } + + static void replaceFirstWithEscape(base::type::string_t& str, const base::type::string_t& replaceWhat, // NOLINT + const base::type::string_t& replaceWith) { + std::size_t foundAt = base::type::string_t::npos; + while ((foundAt = str.find(replaceWhat, foundAt + 1)) != base::type::string_t::npos) { + if (foundAt > 0 && str[foundAt - 1] == base::consts::kFormatSpecifierChar) { + str.erase(foundAt > 0 ? foundAt - 1 : 0, 1); + ++foundAt; + } else { + str.replace(foundAt, replaceWhat.length(), replaceWith); + return; + } + } + } +#if defined(ELPP_UNICODE) + static void replaceFirstWithEscape(base::type::string_t& str, const base::type::string_t& replaceWhat, // NOLINT + const std::string& replaceWith) { + replaceFirstWithEscape(str, replaceWhat, base::type::string_t(replaceWith.begin(), replaceWith.end())); + } +#endif // defined(ELPP_UNICODE) + /// @brief Converts string to uppercase + /// @param str String to convert + /// @return Uppercase string + static inline std::string& toUpper(std::string& str) { + std::transform(str.begin(), str.end(), str.begin(), ::toupper); + return str; + } + + /// @brief Compares cstring equality - uses strcmp + static inline bool cStringEq(const char* s1, const char* s2) { + if (s1 == nullptr && s2 == nullptr) return true; + if (s1 == nullptr || s2 == nullptr) return false; + return strcmp(s1, s2) == 0; + } + + /// @brief Compares cstring equality (case-insensitive) - uses toupper(char) + /// Dont use strcasecmp because of CRT (VC++) + static bool cStringCaseEq(const char* s1, const char* s2) { + if (s1 == nullptr && s2 == nullptr) return true; + if (s1 == nullptr || s2 == nullptr) return false; + if (strlen(s1) != strlen(s2)) return false; + while (*s1 != '\0' && *s2 != '\0') { + if (::toupper(*s1) != ::toupper(*s2)) return false; + ++s1; + ++s2; + } + return true; + } + + /// @brief Returns true if c exist in str + static inline bool contains(const char* str, char c) { + for (; *str; ++str) { + if (*str == c) + return true; + } + return false; + } + + static inline char* convertAndAddToBuff(std::size_t n, int len, char* buf, const char* bufLim, bool zeroPadded = true) { + char localBuff[10] = ""; + char* p = localBuff + sizeof(localBuff) - 2; + if (n > 0) { + for (; n > 0 && p > localBuff && len > 0; n /= 10, --len) + *--p = static_cast(n % 10 + '0'); + } else { + *--p = '0'; + --len; + } + if (zeroPadded) + while (p > localBuff && len-- > 0) *--p = static_cast('0'); + return addToBuff(p, buf, bufLim); + } + + static inline char* addToBuff(const char* str, char* buf, const char* bufLim) { + while ((buf < bufLim) && ((*buf = *str++) != '\0')) + ++buf; + return buf; + } + + static inline char* clearBuff(char buff[], std::size_t lim) { + STRCPY(buff, "", lim); + ELPP_UNUSED(lim); // For *nix we dont have anything using lim in above STRCPY macro + return buff; + } + + /// @brief Converst wchar* to char* + /// NOTE: Need to free return value after use! + static char* wcharPtrToCharPtr(const wchar_t* line) { + std::size_t len_ = wcslen(line) + 1; + char* buff_ = static_cast(malloc(len_ + 1)); +# if ELPP_OS_UNIX || (ELPP_OS_WINDOWS && !ELPP_CRT_DBG_WARNINGS) + std::wcstombs(buff_, line, len_); +# elif ELPP_OS_WINDOWS + std::size_t convCount_ = 0; + mbstate_t mbState_; + ::memset(static_cast(&mbState_), 0, sizeof(mbState_)); + wcsrtombs_s(&convCount_, buff_, len_, &line, len_, &mbState_); +# endif // ELPP_OS_UNIX || (ELPP_OS_WINDOWS && !ELPP_CRT_DBG_WARNINGS) + return buff_; + } +}; +/// @brief Operating System helper static class used internally. You should not use it. +class OS : base::StaticClass { +public: +#if ELPP_OS_WINDOWS + /// @brief Gets environment variables for Windows based OS. + /// We are not using getenv(const char*) because of CRT deprecation + /// @param varname Variable name to get environment variable value for + /// @return If variable exist the value of it otherwise nullptr + static const char* getWindowsEnvironmentVariable(const char* varname) { + const DWORD bufferLen = 50; + static char buffer[bufferLen]; + if (GetEnvironmentVariableA(varname, buffer, bufferLen)) { + return buffer; + } + return nullptr; + } +#endif // ELPP_OS_WINDOWS +#if ELPP_OS_ANDROID + /// @brief Reads android property value + static inline std::string getProperty(const char* prop) { + char propVal[PROP_VALUE_MAX + 1]; + int ret = __system_property_get(prop, propVal); + return ret == 0 ? std::string() : std::string(propVal); + } + + /// @brief Reads android device name + static std::string getDeviceName(void) { + std::stringstream ss; + std::string manufacturer = getProperty("ro.product.manufacturer"); + std::string model = getProperty("ro.product.model"); + if (manufacturer.empty() || model.empty()) { + return std::string(); + } + ss << manufacturer << "-" << model; + return ss.str(); + } +#endif // ELPP_OS_ANDROID + + /// @brief Runs command on terminal and returns the output. + /// + /// @detail This is applicable only on unix based systems, for all other OS, an empty string is returned. + /// @param command Bash command + /// @return Result of bash output or empty string if no result found. + static const std::string getBashOutput(const char* command) { +#if (ELPP_OS_UNIX && !ELPP_OS_ANDROID && !ELPP_CYGWIN) + if (command == nullptr) { + return std::string(); + } + FILE* proc = nullptr; + if ((proc = popen(command, "r")) == nullptr) { + ELPP_INTERNAL_ERROR("\nUnable to run command [" << command << "]", true); + return std::string(); + } + char hBuff[4096]; + if (fgets(hBuff, sizeof(hBuff), proc) != nullptr) { + pclose(proc); + if (hBuff[strlen(hBuff) - 1] == '\n') { + hBuff[strlen(hBuff) - 1] = '\0'; + } + return std::string(hBuff); + } + return std::string(); +#else + ELPP_UNUSED(command); + return std::string(); +#endif // (ELPP_OS_UNIX && !ELPP_OS_ANDROID && !ELPP_CYGWIN) + } + + /// @brief Gets environment variable. This is cross-platform and CRT safe (for VC++) + /// @param variableName Environment variable name + /// @param defaultVal If no environment variable or value found the value to return by default + /// @param alternativeBashCommand If environment variable not found what would be alternative bash command + /// in order to look for value user is looking for. E.g, for 'user' alternative command will 'whoami' + static std::string getEnvironmentVariable(const char* variableName, const char* defaultVal, const char* alternativeBashCommand = nullptr) { +#if ELPP_OS_UNIX + const char* val = getenv(variableName); +#elif ELPP_OS_WINDOWS + const char* val = getWindowsEnvironmentVariable(variableName); +#endif // ELPP_OS_UNIX + if ((val == nullptr) || ((strcmp(val, "") == 0))) { +#if ELPP_OS_UNIX && defined(ELPP_FORCE_ENV_VAR_FROM_BASH) + // Try harder on unix-based systems + std::string valBash = base::utils::OS::getBashOutput(alternativeBashCommand); + if (valBash.empty()) { + return std::string(defaultVal); + } else { + return valBash; + } +#elif ELPP_OS_WINDOWS || ELPP_OS_UNIX + ELPP_UNUSED(alternativeBashCommand); + return std::string(defaultVal); +#endif // ELPP_OS_UNIX && defined(ELPP_FORCE_ENV_VAR_FROM_BASH) + } + return std::string(val); + } + /// @brief Gets current username. + static inline std::string currentUser(void) { +#if ELPP_OS_UNIX && !ELPP_OS_ANDROID + return getEnvironmentVariable("USER", base::consts::kUnknownUser, "whoami"); +#elif ELPP_OS_WINDOWS + return getEnvironmentVariable("USERNAME", base::consts::kUnknownUser); +#elif ELPP_OS_ANDROID + ELPP_UNUSED(base::consts::kUnknownUser); + return std::string("android"); +#else + return std::string(); +#endif // ELPP_OS_UNIX && !ELPP_OS_ANDROID + } + + /// @brief Gets current host name or computer name. + /// + /// @detail For android systems this is device name with its manufacturer and model seperated by hyphen + static inline std::string currentHost(void) { +#if ELPP_OS_UNIX && !ELPP_OS_ANDROID + return getEnvironmentVariable("HOSTNAME", base::consts::kUnknownHost, "hostname"); +#elif ELPP_OS_WINDOWS + return getEnvironmentVariable("COMPUTERNAME", base::consts::kUnknownHost); +#elif ELPP_OS_ANDROID + ELPP_UNUSED(base::consts::kUnknownHost); + return getDeviceName(); +#else + return std::string(); +#endif // ELPP_OS_UNIX && !ELPP_OS_ANDROID + } + /// @brief Whether or not terminal supports colors + static inline bool termSupportsColor(void) { + std::string term = getEnvironmentVariable("TERM", ""); + return term == "xterm" || term == "xterm-color" || term == "xterm-256color" || + term == "screen" || term == "linux" || term == "cygwin"; + } +}; +extern std::string s_currentUser; +extern std::string s_currentHost; +extern bool s_termSupportsColor; +#define ELPP_INITI_BASIC_DECLR \ + namespace el {\ + namespace base {\ + namespace utils {\ + std::string s_currentUser = el::base::utils::OS::currentUser(); \ + std::string s_currentHost = el::base::utils::OS::currentHost(); \ + bool s_termSupportsColor = el::base::utils::OS::termSupportsColor(); \ + }\ + }\ + } +/// @brief Contains utilities for cross-platform date/time. This class make use of el::base::utils::Str +class DateTime : base::StaticClass { +public: + /// @brief Cross platform gettimeofday for Windows and unix platform. This can be used to determine current millisecond. + /// + /// @detail For unix system it uses gettimeofday(timeval*, timezone*) and for Windows, a seperate implementation is provided + /// @param [in,out] tv Pointer that gets updated + static void gettimeofday(struct timeval* tv) { +#if ELPP_OS_WINDOWS + if (tv != nullptr) { +# if ELPP_COMPILER_MSVC || defined(_MSC_EXTENSIONS) + const unsigned __int64 delta_ = 11644473600000000Ui64; +# else + const unsigned __int64 delta_ = 11644473600000000ULL; +# endif // ELPP_COMPILER_MSVC || defined(_MSC_EXTENSIONS) + const double secOffSet = 0.000001; + const unsigned long usecOffSet = 1000000; + FILETIME fileTime; + GetSystemTimeAsFileTime(&fileTime); + unsigned __int64 present = 0; + present |= fileTime.dwHighDateTime; + present = present << 32; + present |= fileTime.dwLowDateTime; + present /= 10; // mic-sec + // Subtract the difference + present -= delta_; + tv->tv_sec = static_cast(present * secOffSet); + tv->tv_usec = static_cast(present % usecOffSet); + } +#else + ::gettimeofday(tv, nullptr); +#endif // ELPP_OS_WINDOWS + } + + /// @brief Gets current date and time with milliseconds. + /// @param format User provided date/time format + /// @param msWidth A pointer to base::MillisecondsWidth from configuration (non-null) + /// @returns string based date time in specified format. + static inline std::string getDateTime(const char* format, const base::MillisecondsWidth* msWidth) { + struct timeval currTime; + gettimeofday(&currTime); + struct ::tm timeInfo; + buildTimeInfo(&currTime, &timeInfo); + const int kBuffSize = 30; + char buff_[kBuffSize] = ""; + parseFormat(buff_, kBuffSize, format, &timeInfo, static_cast(currTime.tv_usec / msWidth->m_offset), msWidth); + return std::string(buff_); + } + + /// @brief Formats time to get unit accordingly, units like second if > 1000 or minutes if > 60000 etc + static base::type::string_t formatTime(unsigned long long time, base::TimestampUnit timestampUnit) { + double result = static_cast(time); + base::type::EnumType start = static_cast(timestampUnit); + const base::type::char_t* unit = base::consts::kTimeFormats[start].unit; + for (base::type::EnumType i = start; i < base::consts::kTimeFormatsCount - 1; ++i) { + if (result <= base::consts::kTimeFormats[i].value) { + break; + } + result /= base::consts::kTimeFormats[i].value; + unit = base::consts::kTimeFormats[i + 1].unit; + } + base::type::stringstream_t ss; + ss << result << " " << unit; + return ss.str(); + } + + /// @brief Gets time difference in milli/micro second depending on timestampUnit + static inline unsigned long long getTimeDifference(const struct timeval& endTime, const struct timeval& startTime, base::TimestampUnit timestampUnit) { + if (timestampUnit == base::TimestampUnit::Microsecond) { + return static_cast(static_cast(1000000 * endTime.tv_sec + endTime.tv_usec) - + static_cast(1000000 * startTime.tv_sec + startTime.tv_usec)); + } else { + return static_cast((((endTime.tv_sec - startTime.tv_sec) * 1000000) + (endTime.tv_usec - startTime.tv_usec)) / 1000); + } + } + +private: + static inline struct ::tm* buildTimeInfo(struct timeval* currTime, struct ::tm* timeInfo) { +#if ELPP_OS_UNIX + time_t rawTime = currTime->tv_sec; + ::localtime_r(&rawTime, timeInfo); + return timeInfo; +#else +# if ELPP_COMPILER_MSVC + ELPP_UNUSED(currTime); + time_t t; + _time64(&t); + localtime_s(timeInfo, &t); + return timeInfo; +# else + // For any other compilers that don't have CRT warnings issue e.g, MinGW or TDM GCC- we use different method + time_t rawTime = currTime->tv_sec; + struct tm* tmInf = localtime(&rawTime); + *timeInfo = *tmInf; + return timeInfo; +# endif // ELPP_COMPILER_MSVC +#endif // ELPP_OS_UNIX + } + static char* parseFormat(char* buf, std::size_t bufSz, const char* format, const struct tm* tInfo, + std::size_t msec, const base::MillisecondsWidth* msWidth) { + const char* bufLim = buf + bufSz; + for (; *format; ++format) { + if (*format == base::consts::kFormatSpecifierChar) { + switch (*++format) { + case base::consts::kFormatSpecifierChar: // Escape + break; + case '\0': // End + --format; + break; + case 'd': // Day + buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_mday, 2, buf, bufLim); + continue; + case 'a': // Day of week (short) + buf = base::utils::Str::addToBuff(base::consts::kDaysAbbrev[tInfo->tm_wday], buf, bufLim); + continue; + case 'A': // Day of week (long) + buf = base::utils::Str::addToBuff(base::consts::kDays[tInfo->tm_wday], buf, bufLim); + continue; + case 'M': // month + buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_mon + 1, 2, buf, bufLim); + continue; + case 'b': // month (short) + buf = base::utils::Str::addToBuff(base::consts::kMonthsAbbrev[tInfo->tm_mon], buf, bufLim); + continue; + case 'B': // month (long) + buf = base::utils::Str::addToBuff(base::consts::kMonths[tInfo->tm_mon], buf, bufLim); + continue; + case 'y': // year (two digits) + buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_year + base::consts::kYearBase, 2, buf, bufLim); + continue; + case 'Y': // year (four digits) + buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_year + base::consts::kYearBase, 4, buf, bufLim); + continue; + case 'h': // hour (12-hour) + buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_hour % 12, 2, buf, bufLim); + continue; + case 'H': // hour (24-hour) + buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_hour, 2, buf, bufLim); + continue; + case 'm': // minute + buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_min, 2, buf, bufLim); + continue; + case 's': // second + buf = base::utils::Str::convertAndAddToBuff(tInfo->tm_sec, 2, buf, bufLim); + continue; + case 'z': // milliseconds + case 'g': + buf = base::utils::Str::convertAndAddToBuff(msec, msWidth->m_width, buf, bufLim); + continue; + case 'F': // AM/PM + buf = base::utils::Str::addToBuff((tInfo->tm_hour >= 12) ? base::consts::kPm : base::consts::kAm, buf, bufLim); + continue; + default: + continue; + } + } + if (buf == bufLim) break; + *buf++ = *format; + } + return buf; + } +}; +/// @brief Command line arguments for application if specified using el::Helpers::setArgs(..) or START_EASYLOGGINGPP(..) +class CommandLineArgs { +public: + CommandLineArgs(void) { + setArgs(0, static_cast(nullptr)); + } + CommandLineArgs(int argc, const char** argv) { + setArgs(argc, argv); + } + CommandLineArgs(int argc, char** argv) { + setArgs(argc, argv); + } + virtual ~CommandLineArgs(void) {} + /// @brief Sets arguments and parses them + inline void setArgs(int argc, const char** argv) { + setArgs(argc, const_cast(argv)); + } + /// @brief Sets arguments and parses them + inline void setArgs(int argc, char** argv) { + m_params.clear(); + m_paramsWithValue.clear(); + if (argc == 0 || argv == nullptr) { + return; + } + m_argc = argc; + m_argv = argv; + for (int i = 1; i < m_argc; ++i) { + const char* v = (strstr(m_argv[i], "=")); + if (v != nullptr && strlen(v) > 0) { + std::string key = std::string(m_argv[i]); + key = key.substr(0, key.find_first_of('=')); + if (hasParamWithValue(key.c_str())) { + ELPP_INTERNAL_INFO(1, "Skipping [" << key << "] arg since it already has value [" + << getParamValue(key.c_str()) << "]"); + } else { + m_paramsWithValue.insert(std::make_pair(key, std::string(v + 1))); + } + } + if (v == nullptr) { + if (hasParam(m_argv[i])) { + ELPP_INTERNAL_INFO(1, "Skipping [" << m_argv[i] << "] arg since it already exists"); + } else { + m_params.push_back(std::string(m_argv[i])); + } + } + } + } + /// @brief Returns true if arguments contain paramKey with a value (seperated by '=') + inline bool hasParamWithValue(const char* paramKey) const { + return m_paramsWithValue.find(std::string(paramKey)) != m_paramsWithValue.end(); + } + /// @brief Returns value of arguments + /// @see hasParamWithValue(const char*) + inline const char* getParamValue(const char* paramKey) const { + return m_paramsWithValue.find(std::string(paramKey))->second.c_str(); + } + /// @brief Return true if arguments has a param (not having a value) i,e without '=' + inline bool hasParam(const char* paramKey) const { + return std::find(m_params.begin(), m_params.end(), std::string(paramKey)) != m_params.end(); + } + /// @brief Returns true if no params available. This exclude argv[0] + inline bool empty(void) const { + return m_params.empty() && m_paramsWithValue.empty(); + } + /// @brief Returns total number of arguments. This exclude argv[0] + inline std::size_t size(void) const { + return m_params.size() + m_paramsWithValue.size(); + } + inline friend base::type::ostream_t& operator<<(base::type::ostream_t& os, const CommandLineArgs& c) { + for (int i = 1; i < c.m_argc; ++i) { + os << ELPP_LITERAL("[") << c.m_argv[i] << ELPP_LITERAL("]"); + if (i < c.m_argc - 1) { + os << ELPP_LITERAL(" "); + } + } + return os; + } + +private: + int m_argc; + char** m_argv; + std::map m_paramsWithValue; + std::vector m_params; +}; +/// @brief Abstract registry (aka repository) that provides basic interface for pointer repository specified by T_Ptr type. +/// +/// @detail Most of the functions are virtual final methods but anything implementing this abstract class should implement +/// unregisterAll() and deepCopy(const AbstractRegistry&) and write registerNew() method according to container +/// and few more methods; get() to find element, unregister() to unregister single entry. +/// Please note that this is thread-unsafe and should also implement thread-safety mechanisms in implementation. +template +class AbstractRegistry : public base::threading::ThreadSafe { +public: + typedef typename Container::iterator iterator; + typedef typename Container::const_iterator const_iterator; + + /// @brief Default constructor + AbstractRegistry(void) {} + + /// @brief Move constructor that is useful for base classes + AbstractRegistry(AbstractRegistry&& sr) { + if (this == &sr) { + return; + } + unregisterAll(); + m_list = std::move(sr.m_list); + } + + bool operator==(const AbstractRegistry& other) { + if (size() != other.size()) { + return false; + } + for (std::size_t i = 0; i < m_list.size(); ++i) { + if (m_list.at(i) != other.m_list.at(i)) { + return false; + } + } + return true; + } + + bool operator!=(const AbstractRegistry& other) { + if (size() != other.size()) { + return true; + } + for (std::size_t i = 0; i < m_list.size(); ++i) { + if (m_list.at(i) != other.m_list.at(i)) { + return true; + } + } + return false; + } + + /// @brief Assignment move operator + AbstractRegistry& operator=(AbstractRegistry&& sr) { + if (this == &sr) { + return *this; + } + unregisterAll(); + m_list = std::move(sr.m_list); + return *this; + } + + virtual ~AbstractRegistry(void) { + } + + /// @return Iterator pointer from start of repository + virtual inline iterator begin(void) ELPP_FINAL { + return m_list.begin(); + } + + /// @return Iterator pointer from end of repository + virtual inline iterator end(void) ELPP_FINAL { + return m_list.end(); + } + + + /// @return Constant iterator pointer from start of repository + virtual inline const_iterator cbegin(void) const ELPP_FINAL { + return m_list.cbegin(); + } + + /// @return End of repository + virtual inline const_iterator cend(void) const ELPP_FINAL { + return m_list.cend(); + } + + /// @return Whether or not repository is empty + virtual inline bool empty(void) const ELPP_FINAL { + return m_list.empty(); + } + + /// @return Size of repository + virtual inline std::size_t size(void) const ELPP_FINAL { + return m_list.size(); + } + + /// @brief Returns underlying container by reference + virtual inline Container& list(void) ELPP_FINAL { + return m_list; + } + + /// @brief Returns underlying container by constant reference. + virtual inline const Container& list(void) const ELPP_FINAL { + return m_list; + } + + /// @brief Unregisters all the pointers from current repository. + virtual void unregisterAll(void) = 0; + +protected: + virtual void deepCopy(const AbstractRegistry&) = 0; + void reinitDeepCopy(const AbstractRegistry& sr) { + unregisterAll(); + deepCopy(sr); + } + +private: + Container m_list; +}; + +/// @brief A pointer registry mechanism to manage memory and provide search functionalities. (non-predicate version) +/// +/// @detail NOTE: This is thread-unsafe implementation (although it contains lock function, it does not use these functions) +/// of AbstractRegistry. Any implementation of this class should be +/// explicitly (by using lock functions) +template +class Registry : public AbstractRegistry> { +public: + typedef typename Registry::iterator iterator; + typedef typename Registry::const_iterator const_iterator; + + Registry(void) {} + + /// @brief Copy constructor that is useful for base classes. Try to avoid this constructor, use move constructor. + Registry(const Registry& sr) : AbstractRegistry>() { + if (this == &sr) { + return; + } + this->reinitDeepCopy(sr); + } + + /// @brief Assignment operator that unregisters all the existing registeries and deeply copies each of repo element + /// @see unregisterAll() + /// @see deepCopy(const AbstractRegistry&) + Registry& operator=(const Registry& sr) { + if (this == &sr) { + return *this; + } + this->reinitDeepCopy(sr); + return *this; + } + + virtual ~Registry(void) { + unregisterAll(); + } + +protected: + virtual inline void unregisterAll(void) ELPP_FINAL { + if (!this->empty()) { + for (auto&& curr : this->list()) { + base::utils::safeDelete(curr.second); + } + this->list().clear(); + } + } + + /// @brief Registers new registry to repository. + virtual inline void registerNew(const T_Key& uniqKey, T_Ptr* ptr) ELPP_FINAL { + unregister(uniqKey); + this->list().insert(std::make_pair(uniqKey, ptr)); + } + + /// @brief Unregisters single entry mapped to specified unique key + inline void unregister(const T_Key& uniqKey) { + T_Ptr* existing = get(uniqKey); + if (existing != nullptr) { + base::utils::safeDelete(existing); + this->list().erase(uniqKey); + } + } + + /// @brief Gets pointer from repository. If none found, nullptr is returned. + inline T_Ptr* get(const T_Key& uniqKey) { + iterator it = this->list().find(uniqKey); + return it == this->list().end() + ? nullptr + : it->second; + } + +private: + virtual inline void deepCopy(const AbstractRegistry>& sr) ELPP_FINAL { + for (const_iterator it = sr.cbegin(); it != sr.cend(); ++it) { + registerNew(it->first, new T_Ptr(*it->second)); + } + } +}; + +/// @brief A pointer registry mechanism to manage memory and provide search functionalities. (predicate version) +/// +/// @detail NOTE: This is thread-unsafe implementation of AbstractRegistry. Any implementation of this class +/// should be made thread-safe explicitly +template +class RegistryWithPred : public AbstractRegistry> { +public: + typedef typename RegistryWithPred::iterator iterator; + typedef typename RegistryWithPred::const_iterator const_iterator; + + RegistryWithPred(void) { + } + + virtual ~RegistryWithPred(void) { + unregisterAll(); + } + + /// @brief Copy constructor that is useful for base classes. Try to avoid this constructor, use move constructor. + RegistryWithPred(const RegistryWithPred& sr) : AbstractRegistry>() { + if (this == &sr) { + return; + } + this->reinitDeepCopy(sr); + } + + /// @brief Assignment operator that unregisters all the existing registeries and deeply copies each of repo element + /// @see unregisterAll() + /// @see deepCopy(const AbstractRegistry&) + RegistryWithPred& operator=(const RegistryWithPred& sr) { + if (this == &sr) { + return *this; + } + this->reinitDeepCopy(sr); + return *this; + } + + friend inline base::type::ostream_t& operator<<(base::type::ostream_t& os, const RegistryWithPred& sr) { + for (const_iterator it = sr.list().begin(); it != sr.list().end(); ++it) { + os << ELPP_LITERAL(" ") << **it << ELPP_LITERAL("\n"); + } + return os; + } + +protected: + virtual inline void unregisterAll(void) ELPP_FINAL { + if (!this->empty()) { + for (auto&& curr : this->list()) { + base::utils::safeDelete(curr); + } + this->list().clear(); + } + } + + virtual void unregister(T_Ptr*& ptr) ELPP_FINAL { + if (ptr) { + iterator iter = this->begin(); + for (; iter != this->end(); ++iter) { + if (ptr == *iter) { + break; + } + } + if (iter != this->end() && *iter != nullptr) { + this->list().erase(iter); + base::utils::safeDelete(*iter); + } + } + } + + virtual inline void registerNew(T_Ptr* ptr) ELPP_FINAL { + this->list().push_back(ptr); + } + + /// @brief Gets pointer from repository with speicifed arguments. Arguments are passed to predicate + /// in order to validate pointer. + template + inline T_Ptr* get(const T& arg1, const T2 arg2) { + iterator iter = std::find_if(this->list().begin(), this->list().end(), Pred(arg1, arg2)); + if (iter != this->list().end() && *iter != nullptr) { + return *iter; + } + return nullptr; + } + +private: + virtual inline void deepCopy(const AbstractRegistry>& sr) { + for (const_iterator it = sr.list().begin(); it != sr.list().end(); ++it) { + registerNew(new T_Ptr(**it)); + } + } +}; + +} // namespace utils +} // namespace base +/// @brief Base of Easylogging++ friendly class +/// +/// @detail After inheriting this class publicly, implement pure-virtual function `void log(std::ostream&) const` +class Loggable { +public: + virtual ~Loggable(void) {} + virtual void log(el::base::type::ostream_t&) const = 0; +private: + friend inline el::base::type::ostream_t& operator<<(el::base::type::ostream_t& os, const Loggable& loggable) { + loggable.log(os); + return os; + } +}; +namespace base { +/// @brief Represents log format containing flags and date format. This is used internally to start initial log +class LogFormat : public Loggable { +public: + LogFormat(void) : + m_level(Level::Unknown), + m_userFormat(base::type::string_t()), + m_format(base::type::string_t()), + m_dateTimeFormat(std::string()), + m_flags(0x0) { + } + + LogFormat(Level level, const base::type::string_t& format) + : m_level(level), m_userFormat(format) { + parseFromFormat(m_userFormat); + } + + LogFormat(const LogFormat& logFormat) { + m_level = logFormat.m_level; + m_userFormat = logFormat.m_userFormat; + m_format = logFormat.m_format; + m_dateTimeFormat = logFormat.m_dateTimeFormat; + m_flags = logFormat.m_flags; + } + + LogFormat(LogFormat&& logFormat) { + m_level = std::move(logFormat.m_level); + m_userFormat = std::move(logFormat.m_userFormat); + m_format = std::move(logFormat.m_format); + m_dateTimeFormat = std::move(logFormat.m_dateTimeFormat); + m_flags = std::move(logFormat.m_flags); + } + + LogFormat& operator=(const LogFormat& logFormat) { + m_level = logFormat.m_level; + m_userFormat = logFormat.m_userFormat; + m_dateTimeFormat = logFormat.m_dateTimeFormat; + m_flags = logFormat.m_flags; + return *this; + } + + virtual ~LogFormat(void) { + } + + inline bool operator==(const LogFormat& other) { + return m_level == other.m_level && m_userFormat == other.m_userFormat && m_format == other.m_format && + m_dateTimeFormat == other.m_dateTimeFormat && m_flags == other.m_flags; + } + + /// @brief Updates format to be used while logging. + /// @param userFormat User provided format + void parseFromFormat(const base::type::string_t& userFormat) { + // We make copy because we will be changing the format + // i.e, removing user provided date format from original format + // and then storing it. + base::type::string_t formatCopy = userFormat; + m_flags = 0x0; + auto conditionalAddFlag = [&](const base::type::char_t* specifier, base::FormatFlags flag) { + std::size_t foundAt = base::type::string_t::npos; + while ((foundAt = formatCopy.find(specifier, foundAt + 1)) != base::type::string_t::npos){ + if (foundAt > 0 && formatCopy[foundAt - 1] == base::consts::kFormatSpecifierChar) { + if (hasFlag(flag)) { + // If we already have flag we remove the escape chars so that '%%' is turned to '%' + // even after specifier resolution - this is because we only replaceFirst specifier + formatCopy.erase(foundAt > 0 ? foundAt - 1 : 0, 1); + ++foundAt; + } + } else { + if (!hasFlag(flag)) addFlag(flag); + } + } + }; + conditionalAddFlag(base::consts::kAppNameFormatSpecifier, base::FormatFlags::AppName); + conditionalAddFlag(base::consts::kSeverityLevelFormatSpecifier, base::FormatFlags::Level); + conditionalAddFlag(base::consts::kSeverityLevelShortFormatSpecifier, base::FormatFlags::LevelShort); + conditionalAddFlag(base::consts::kLoggerIdFormatSpecifier, base::FormatFlags::LoggerId); + conditionalAddFlag(base::consts::kThreadIdFormatSpecifier, base::FormatFlags::ThreadId); + conditionalAddFlag(base::consts::kLogFileFormatSpecifier, base::FormatFlags::File); + conditionalAddFlag(base::consts::kLogFileBaseFormatSpecifier, base::FormatFlags::FileBase); + conditionalAddFlag(base::consts::kLogLineFormatSpecifier, base::FormatFlags::Line); + conditionalAddFlag(base::consts::kLogLocationFormatSpecifier, base::FormatFlags::Location); + conditionalAddFlag(base::consts::kLogFunctionFormatSpecifier, base::FormatFlags::Function); + conditionalAddFlag(base::consts::kCurrentUserFormatSpecifier, base::FormatFlags::User); + conditionalAddFlag(base::consts::kCurrentHostFormatSpecifier, base::FormatFlags::Host); + conditionalAddFlag(base::consts::kMessageFormatSpecifier, base::FormatFlags::LogMessage); + conditionalAddFlag(base::consts::kVerboseLevelFormatSpecifier, base::FormatFlags::VerboseLevel); + // For date/time we need to extract user's date format first + std::size_t dateIndex = std::string::npos; + if ((dateIndex = formatCopy.find(base::consts::kDateTimeFormatSpecifier)) != std::string::npos) { + while (dateIndex > 0 && formatCopy[dateIndex - 1] == base::consts::kFormatSpecifierChar) { + dateIndex = formatCopy.find(base::consts::kDateTimeFormatSpecifier, dateIndex + 1); + } + if (dateIndex != std::string::npos) { + addFlag(base::FormatFlags::DateTime); + updateDateFormat(dateIndex, formatCopy); + } + } + m_format = formatCopy; + updateFormatSpec(); + } + + inline Level level(void) const { + return m_level; + } + + inline const base::type::string_t& userFormat(void) const { + return m_userFormat; + } + + inline const base::type::string_t& format(void) const { + return m_format; + } + + inline const std::string& dateTimeFormat(void) const { + return m_dateTimeFormat; + } + + inline base::type::EnumType flags(void) const { + return m_flags; + } + + inline bool hasFlag(base::FormatFlags flag) const { + return base::utils::hasFlag(flag, m_flags); + } + + virtual void log(el::base::type::ostream_t& os) const { + os << m_format; + } + +protected: + /// @brief Updates date time format if available in currFormat. + /// @param index Index where %datetime, %date or %time was found + /// @param [in,out] currFormat current format that is being used to format + virtual void updateDateFormat(std::size_t index, base::type::string_t& currFormat) ELPP_FINAL { + if (hasFlag(base::FormatFlags::DateTime)) { + index += ELPP_STRLEN(base::consts::kDateTimeFormatSpecifier); + } + const base::type::char_t* ptr = currFormat.c_str() + index; + if ((currFormat.size() > index) && (ptr[0] == '{')) { + // User has provided format for date/time + ++ptr; + int count = 1; // Start by 1 in order to remove starting brace + std::stringstream ss; + for (; *ptr; ++ptr, ++count) { + if (*ptr == '}') { + ++count; // In order to remove ending brace + break; + } + ss << *ptr; + } + currFormat.erase(index, count); + m_dateTimeFormat = ss.str(); + } else { + // No format provided, use default + if (hasFlag(base::FormatFlags::DateTime)) { + m_dateTimeFormat = std::string(base::consts::kDefaultDateTimeFormat); + } + } + } + + /// @brief Updates %level from format. This is so that we dont have to do it at log-writing-time. It uses m_format and m_level + virtual void updateFormatSpec(void) ELPP_FINAL { + // Do not use switch over strongly typed enums because Intel C++ compilers dont support them yet. + if (m_level == Level::Debug) { + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelFormatSpecifier, + base::consts::kDebugLevelLogValue); + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelShortFormatSpecifier, + base::consts::kDebugLevelShortLogValue); + } else if (m_level == Level::Info) { + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelFormatSpecifier, + base::consts::kInfoLevelLogValue); + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelShortFormatSpecifier, + base::consts::kInfoLevelShortLogValue); + } else if (m_level == Level::Warning) { + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelFormatSpecifier, + base::consts::kWarningLevelLogValue); + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelShortFormatSpecifier, + base::consts::kWarningLevelShortLogValue); + } else if (m_level == Level::Error) { + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelFormatSpecifier, + base::consts::kErrorLevelLogValue); + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelShortFormatSpecifier, + base::consts::kErrorLevelShortLogValue); + } else if (m_level == Level::Fatal) { + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelFormatSpecifier, + base::consts::kFatalLevelLogValue); + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelShortFormatSpecifier, + base::consts::kFatalLevelShortLogValue); + } else if (m_level == Level::Verbose) { + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelFormatSpecifier, + base::consts::kVerboseLevelLogValue); + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelShortFormatSpecifier, + base::consts::kVerboseLevelShortLogValue); + } else if (m_level == Level::Trace) { + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelFormatSpecifier, + base::consts::kTraceLevelLogValue); + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kSeverityLevelShortFormatSpecifier, + base::consts::kTraceLevelShortLogValue); + } + if (hasFlag(base::FormatFlags::User)) { + std::string s = base::utils::s_currentUser; + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kCurrentUserFormatSpecifier, + base::utils::s_currentUser); + } + if (hasFlag(base::FormatFlags::Host)) { + base::utils::Str::replaceFirstWithEscape(m_format, base::consts::kCurrentHostFormatSpecifier, + base::utils::s_currentHost); + } + // Ignore Level::Global and Level::Unknown + } + + inline void addFlag(base::FormatFlags flag) { + base::utils::addFlag(flag, &m_flags); + } + +private: + Level m_level; + base::type::string_t m_userFormat; + base::type::string_t m_format; + std::string m_dateTimeFormat; + base::type::EnumType m_flags; + friend class el::Logger; // To resolve loggerId format specifier easily +}; +} // namespace base +/// @brief Resolving function for format specifier +typedef std::function FormatSpecifierValueResolver; +/// @brief User-provided custom format specifier +/// @see el::Helpers::installCustomFormatSpecifier +/// @see FormatSpecifierValueResolver +class CustomFormatSpecifier { +public: + CustomFormatSpecifier(const char* formatSpecifier, const FormatSpecifierValueResolver& resolver) : + m_formatSpecifier(formatSpecifier), m_resolver(resolver) {} + inline const char* formatSpecifier(void) const { return m_formatSpecifier; } + inline const FormatSpecifierValueResolver& resolver(void) const { return m_resolver; } + inline bool operator==(const char* formatSpecifier) { + return strcmp(m_formatSpecifier, formatSpecifier) == 0; + } + +private: + const char* m_formatSpecifier; + FormatSpecifierValueResolver m_resolver; +}; +/// @brief Represents single configuration that has representing level, configuration type and a string based value. +/// +/// @detail String based value means any value either its boolean, integer or string itself, it will be embedded inside quotes +/// and will be parsed later. +/// +/// Consider some examples below: +/// * el::Configuration confEnabledInfo(el::Level::Info, el::ConfigurationType::Enabled, "true"); +/// * el::Configuration confMaxLogFileSizeInfo(el::Level::Info, el::ConfigurationType::MaxLogFileSize, "2048"); +/// * el::Configuration confFilenameInfo(el::Level::Info, el::ConfigurationType::Filename, "/var/log/my.log"); +class Configuration : public Loggable { +public: + Configuration(const Configuration& c) : + m_level(c.m_level), + m_configurationType(c.m_configurationType), + m_value(c.m_value) { + } + + Configuration& operator=(const Configuration& c) { + m_level = c.m_level; + m_configurationType = c.m_configurationType; + m_value = c.m_value; + return *this; + } + + virtual ~Configuration(void) { + } + + /// @brief Full constructor used to sets value of configuration + Configuration(Level level, ConfigurationType configurationType, const std::string& value) : + m_level(level), + m_configurationType(configurationType), + m_value(value) { + } + + /// @brief Gets level of current configuration + inline Level level(void) const { + return m_level; + } + + /// @brief Gets configuration type of current configuration + inline ConfigurationType configurationType(void) const { + return m_configurationType; + } + + /// @brief Gets string based configuration value + inline const std::string& value(void) const { + return m_value; + } + + /// @brief Set string based configuration value + /// @param value Value to set. Values have to be std::string; For boolean values use "true", "false", for any integral values + /// use them in quotes. They will be parsed when configuring + inline void setValue(const std::string& value) { + m_value = value; + } + + virtual inline void log(el::base::type::ostream_t& os) const { + os << LevelHelper::convertToString(m_level) + << ELPP_LITERAL(" ") << ConfigurationTypeHelper::convertToString(m_configurationType) + << ELPP_LITERAL(" = ") << m_value.c_str(); + } + + /// @brief Used to find configuration from configuration (pointers) repository. Avoid using it. + class Predicate { + public: + Predicate(Level level, ConfigurationType configurationType) : + m_level(level), + m_configurationType(configurationType) { + } + + inline bool operator()(const Configuration* conf) const { + return ((conf != nullptr) && (conf->level() == m_level) && (conf->configurationType() == m_configurationType)); + } + + private: + Level m_level; + ConfigurationType m_configurationType; + }; + +private: + Level m_level; + ConfigurationType m_configurationType; + std::string m_value; +}; + +/// @brief Thread-safe Configuration repository +/// +/// @detail This repository represents configurations for all the levels and configuration type mapped to a value. +class Configurations : public base::utils::RegistryWithPred { +public: + /// @brief Default constructor with empty repository + Configurations(void) : + m_configurationFile(std::string()), + m_isFromFile(false) { + } + + /// @brief Constructor used to set configurations using configuration file. + /// @param configurationFile Full path to configuration file + /// @param useDefaultsForRemaining Lets you set the remaining configurations to default. + /// @param base If provided, this configuration will be based off existing repository that this argument is pointing to. + /// @see parseFromFile(const std::string&, Configurations* base) + /// @see setRemainingToDefault() + Configurations(const std::string& configurationFile, bool useDefaultsForRemaining = true, Configurations* base = nullptr) : + m_configurationFile(configurationFile), + m_isFromFile(false) { + parseFromFile(configurationFile, base); + if (useDefaultsForRemaining) { + setRemainingToDefault(); + } + } + + virtual ~Configurations(void) { + } + + /// @brief Parses configuration from file. + /// @param configurationFile Full path to configuration file + /// @param base Configurations to base new configuration repository off. This value is used when you want to use + /// existing Configurations to base all the values and then set rest of configuration via configuration file. + /// @return True if successfully parsed, false otherwise. You may define 'ELPP_DEBUG_ASSERT_FAILURE' to make sure you + /// do not proceed without successful parse. + inline bool parseFromFile(const std::string& configurationFile, Configurations* base = nullptr) { + // We initial assertion with true because if we have assertion diabled, we want to pass this + // check and if assertion is enabled we will have values re-assigned any way. + bool assertionPassed = true; + ELPP_ASSERT((assertionPassed = base::utils::File::pathExists(configurationFile.c_str(), true)), + "Configuration file [" << configurationFile << "] does not exist!"); + if (!assertionPassed) { + return false; + } + bool success = Parser::parseFromFile(configurationFile, this, base); + m_isFromFile = success; + return success; + } + + /// @brief Parse configurations from configuration string. + /// + /// @detail This configuration string has same syntax as configuration file contents. Make sure all the necessary + /// new line characters are provided. + /// @param base Configurations to base new configuration repository off. This value is used when you want to use + /// existing Configurations to base all the values and then set rest of configuration via configuration text. + /// @return True if successfully parsed, false otherwise. You may define 'ELPP_DEBUG_ASSERT_FAILURE' to make sure you + /// do not proceed without successful parse. + inline bool parseFromText(const std::string& configurationsString, Configurations* base = nullptr) { + bool success = Parser::parseFromText(configurationsString, this, base); + if (success) { + m_isFromFile = false; + } + return success; + } + + /// @brief Sets configuration based-off an existing configurations. + /// @param base Pointer to existing configurations. + inline void setFromBase(Configurations* base) { + if (base == nullptr || base == this) { + return; + } + base::threading::ScopedLock scopedLock(base->lock()); + for (Configuration*& conf : base->list()) { + set(conf); + } + } + + /// @brief Determines whether or not specified configuration type exists in the repository. + /// + /// @detail Returns as soon as first level is found. + /// @param configurationType Type of configuration to check existence for. + bool hasConfiguration(ConfigurationType configurationType) { + base::type::EnumType lIndex = LevelHelper::kMinValid; + bool result = false; + LevelHelper::forEachLevel(&lIndex, [&](void) -> bool { + if (hasConfiguration(LevelHelper::castFromInt(lIndex), configurationType)) { + result = true; + } + return result; + }); + return result; + } + + /// @brief Determines whether or not specified configuration type exists for specified level + /// @param level Level to check + /// @param configurationType Type of configuration to check existence for. + inline bool hasConfiguration(Level level, ConfigurationType configurationType) { + base::threading::ScopedLock scopedLock(lock()); +#if ELPP_COMPILER_INTEL + // We cant specify template types here, Intel C++ throws compilation error + // "error: type name is not allowed" + return RegistryWithPred::get(level, configurationType) != nullptr; +#else + return RegistryWithPred::get(level, configurationType) != nullptr; +#endif // ELPP_COMPILER_INTEL + } + + /// @brief Sets value of configuration for specified level. + /// + /// @detail Any existing configuration for specified level will be replaced. Also note that configuration types + /// ConfigurationType::MillisecondsWidth and ConfigurationType::PerformanceTracking will be ignored if not set for + /// Level::Global because these configurations are not dependant on level. + /// @param level Level to set configuration for (el::Level). + /// @param configurationType Type of configuration (el::ConfigurationType) + /// @param value A string based value. Regardless of what the data type of configuration is, it will always be string + /// from users' point of view. This is then parsed later to be used internally. + /// @see Configuration::setValue(const std::string& value) + /// @see el::Level + /// @see el::ConfigurationType + inline void set(Level level, ConfigurationType configurationType, const std::string& value) { + base::threading::ScopedLock scopedLock(lock()); + unsafeSet(level, configurationType, value); // This is not unsafe anymore as we have locked mutex + if (level == Level::Global) { + unsafeSetGlobally(configurationType, value, false); // Again this is not unsafe either + } + } + + /// @brief Sets single configuration based on other single configuration. + /// @see set(Level level, ConfigurationType configurationType, const std::string& value) + inline void set(Configuration* conf) { + if (conf == nullptr) { + return; + } + set(conf->level(), conf->configurationType(), conf->value()); + } + + inline Configuration* get(Level level, ConfigurationType configurationType) { + base::threading::ScopedLock scopedLock(lock()); + return RegistryWithPred::get(level, configurationType); + } + + /// @brief Sets configuration for all levels. + /// @param configurationType Type of configuration + /// @param value String based value + /// @see Configurations::set(Level level, ConfigurationType configurationType, const std::string& value) + inline void setGlobally(ConfigurationType configurationType, const std::string& value) { + setGlobally(configurationType, value, false); + } + + /// @brief Clears repository so that all the configurations are unset + inline void clear(void) { + base::threading::ScopedLock scopedLock(lock()); + unregisterAll(); + } + + /// @brief Gets configuration file used in parsing this configurations. + /// + /// @detail If this repository was set manually or by text this returns empty string. + inline const std::string& configurationFile(void) const { + return m_configurationFile; + } + + /// @brief Sets configurations to "factory based" configurations. + void setToDefault(void) { + setGlobally(ConfigurationType::Enabled, std::string("true"), true); +#if !defined(ELPP_NO_DEFAULT_LOG_FILE) + setGlobally(ConfigurationType::Filename, std::string(base::consts::kDefaultLogFile), true); +#else + ELPP_UNUSED(base::consts::kDefaultLogFile); +#endif // !defined(ELPP_NO_DEFAULT_LOG_FILE) + setGlobally(ConfigurationType::ToFile, std::string("true"), true); + setGlobally(ConfigurationType::ToStandardOutput, std::string("true"), true); + setGlobally(ConfigurationType::MillisecondsWidth, std::string("3"), true); + setGlobally(ConfigurationType::PerformanceTracking, std::string("true"), true); + setGlobally(ConfigurationType::MaxLogFileSize, std::string("0"), true); + setGlobally(ConfigurationType::LogFlushThreshold, std::string("0"), true); + + setGlobally(ConfigurationType::Format, std::string("%datetime %level [%logger] %msg"), true); + set(Level::Debug, ConfigurationType::Format, std::string("%datetime %level [%logger] [%user@%host] [%func] [%loc] %msg")); + // INFO and WARNING are set to default by Level::Global + set(Level::Error, ConfigurationType::Format, std::string("%datetime %level [%logger] %msg")); + set(Level::Fatal, ConfigurationType::Format, std::string("%datetime %level [%logger] %msg")); + set(Level::Verbose, ConfigurationType::Format, std::string("%datetime %level-%vlevel [%logger] %msg")); + set(Level::Trace, ConfigurationType::Format, std::string("%datetime %level [%logger] [%func] [%loc] %msg")); + } + + /// @brief Lets you set the remaining configurations to default. + /// + /// @detail By remaining, it means that the level/type a configuration does not exist for. + /// This function is useful when you want to minimize chances of failures, e.g, if you have a configuration file that sets + /// configuration for all the configurations except for Enabled or not, we use this so that ENABLED is set to default i.e, + /// true. If you dont do this explicitley (either by calling this function or by using second param in Constructor + /// and try to access a value, an error is thrown + void setRemainingToDefault(void) { + base::threading::ScopedLock scopedLock(lock()); + unsafeSetIfNotExist(Level::Global, ConfigurationType::Enabled, std::string("true")); +#if !defined(ELPP_NO_DEFAULT_LOG_FILE) + unsafeSetIfNotExist(Level::Global, ConfigurationType::Filename, std::string(base::consts::kDefaultLogFile)); +#endif // !defined(ELPP_NO_DEFAULT_LOG_FILE) + unsafeSetIfNotExist(Level::Global, ConfigurationType::ToFile, std::string("true")); + unsafeSetIfNotExist(Level::Global, ConfigurationType::ToStandardOutput, std::string("true")); + unsafeSetIfNotExist(Level::Global, ConfigurationType::MillisecondsWidth, std::string("3")); + unsafeSetIfNotExist(Level::Global, ConfigurationType::PerformanceTracking, std::string("true")); + unsafeSetIfNotExist(Level::Global, ConfigurationType::MaxLogFileSize, std::string("0")); + unsafeSetIfNotExist(Level::Global, ConfigurationType::Format, std::string("%datetime %level [%logger] %msg")); + unsafeSetIfNotExist(Level::Debug, ConfigurationType::Format, + std::string("%datetime %level [%logger] [%user@%host] [%func] [%loc] %msg")); + // INFO and WARNING are set to default by Level::Global + unsafeSetIfNotExist(Level::Error, ConfigurationType::Format, std::string("%datetime %level [%logger] %msg")); + unsafeSetIfNotExist(Level::Fatal, ConfigurationType::Format, std::string("%datetime %level [%logger] %msg")); + unsafeSetIfNotExist(Level::Verbose, ConfigurationType::Format, std::string("%datetime %level-%vlevel [%logger] %msg")); + unsafeSetIfNotExist(Level::Trace, ConfigurationType::Format, std::string("%datetime %level [%logger] [%func] [%loc] %msg")); + } + + /// @brief Parser used internally to parse configurations from file or text. + /// + /// @detail This class makes use of base::utils::Str. + /// You should not need this unless you are working on some tool for Easylogging++ + class Parser : base::StaticClass { + public: + /// @brief Parses configuration from file. + /// @param configurationFile Full path to configuration file + /// @param sender Sender configurations pointer. Usually 'this' is used from calling class + /// @param base Configurations to base new configuration repository off. This value is used when you want to use + /// existing Configurations to base all the values and then set rest of configuration via configuration file. + /// @return True if successfully parsed, false otherwise. You may define '_STOP_ON_FIRSTELPP_ASSERTION' to make sure you + /// do not proceed without successful parse. + static bool parseFromFile(const std::string& configurationFile, Configurations* sender, Configurations* base = nullptr) { + sender->setFromBase(base); + std::ifstream fileStream_(configurationFile.c_str(), std::ifstream::in); + ELPP_ASSERT(fileStream_.is_open(), "Unable to open configuration file [" << configurationFile << "] for parsing."); + bool parsedSuccessfully = false; + std::string line = std::string(); + Level currLevel = Level::Unknown; + std::string currConfigStr = std::string(); + std::string currLevelStr = std::string(); + while (fileStream_.good()) { + std::getline(fileStream_, line); + parsedSuccessfully = parseLine(&line, &currConfigStr, &currLevelStr, &currLevel, sender); + ELPP_ASSERT(parsedSuccessfully, "Unable to parse configuration line: " << line); + } + return parsedSuccessfully; + } + + /// @brief Parse configurations from configuration string. + /// + /// @detail This configuration string has same syntax as configuration file contents. Make sure all the necessary + /// new line characters are provided. You may define '_STOP_ON_FIRSTELPP_ASSERTION' to make sure you + /// do not proceed without successful parse (This is recommended) + /// @param configurationsString + /// @param sender Sender configurations pointer. Usually 'this' is used from calling class + /// @param base Configurations to base new configuration repository off. This value is used when you want to use + /// existing Configurations to base all the values and then set rest of configuration via configuration text. + /// @return True if successfully parsed, false otherwise. + static bool parseFromText(const std::string& configurationsString, Configurations* sender, Configurations* base = nullptr) { + sender->setFromBase(base); + bool parsedSuccessfully = false; + std::stringstream ss(configurationsString); + std::string line = std::string(); + Level currLevel = Level::Unknown; + std::string currConfigStr = std::string(); + std::string currLevelStr = std::string(); + while (std::getline(ss, line)) { + parsedSuccessfully = parseLine(&line, &currConfigStr, &currLevelStr, &currLevel, sender); + ELPP_ASSERT(parsedSuccessfully, "Unable to parse configuration line: " << line); + } + return parsedSuccessfully; + } + + private: + friend class el::Loggers; + static void ignoreComments(std::string* line) { + std::size_t foundAt = 0; + std::size_t quotesStart = line->find("\""); + std::size_t quotesEnd = std::string::npos; + if (quotesStart != std::string::npos) { + quotesEnd = line->find("\"", quotesStart + 1); + while (quotesEnd != std::string::npos && line->at(quotesEnd - 1) == '\\') { + // Do not erase slash yet - we will erase it in parseLine(..) while loop + quotesEnd = line->find("\"", quotesEnd + 2); + } + } + if ((foundAt = line->find(base::consts::kConfigurationComment)) != std::string::npos) { + if (foundAt < quotesEnd) { + foundAt = line->find(base::consts::kConfigurationComment, quotesEnd + 1); + } + *line = line->substr(0, foundAt); + } + } + static inline bool isLevel(const std::string& line) { + return base::utils::Str::startsWith(line, std::string(base::consts::kConfigurationLevel)); + } + + static inline bool isComment(const std::string& line) { + return base::utils::Str::startsWith(line, std::string(base::consts::kConfigurationComment)); + } + + static inline bool isConfig(const std::string& line) { + std::size_t assignment = line.find('='); + return line != "" && + (line[0] >= 65 || line[0] <= 90 || line[0] >= 97 || line[0] <= 122) && + (assignment != std::string::npos) && + (line.size() > assignment); + } + + static bool parseLine(std::string* line, std::string* currConfigStr, std::string* currLevelStr, Level* currLevel, Configurations* conf) { + ConfigurationType currConfig = ConfigurationType::Unknown; + std::string currValue = std::string(); + *line = base::utils::Str::trim(*line); + if (isComment(*line)) return true; + ignoreComments(line); + *line = base::utils::Str::trim(*line); + if (line->empty()) { + // Comment ignored + return true; + } + if (isLevel(*line)) { + if (line->size() <= 2) { + return true; + } + *currLevelStr = line->substr(1, line->size() - 2); + *currLevelStr = base::utils::Str::toUpper(*currLevelStr); + *currLevelStr = base::utils::Str::trim(*currLevelStr); + *currLevel = LevelHelper::convertFromString(currLevelStr->c_str()); + return true; + } + if (isConfig(*line)) { + std::size_t assignment = line->find('='); + *currConfigStr = line->substr(0, assignment); + *currConfigStr = base::utils::Str::toUpper(*currConfigStr); + *currConfigStr = base::utils::Str::trim(*currConfigStr); + currConfig = ConfigurationTypeHelper::convertFromString(currConfigStr->c_str()); + currValue = line->substr(assignment + 1); + currValue = base::utils::Str::trim(currValue); + std::size_t quotesStart = currValue.find("\"", 0); + std::size_t quotesEnd = std::string::npos; + if (quotesStart != std::string::npos) { + quotesEnd = currValue.find("\"", quotesStart + 1); + while (quotesEnd != std::string::npos && currValue.at(quotesEnd - 1) == '\\') { + currValue = currValue.erase(quotesEnd - 1, 1); + quotesEnd = currValue.find("\"", quotesEnd + 2); + } + } + if (quotesStart != std::string::npos && quotesEnd != std::string::npos) { + // Quote provided - check and strip if valid + ELPP_ASSERT((quotesStart < quotesEnd), "Configuration error - No ending quote found in [" + << currConfigStr << "]"); + ELPP_ASSERT((quotesStart + 1 != quotesEnd), "Empty configuration value for [" << currConfigStr << "]"); + if ((quotesStart != quotesEnd) && (quotesStart + 1 != quotesEnd)) { + // Explicit check in case if assertion is disabled + currValue = currValue.substr(quotesStart + 1, quotesEnd - 1); + } + } + } + ELPP_ASSERT(*currLevel != Level::Unknown, "Unrecognized severity level [" << *currLevelStr << "]"); + ELPP_ASSERT(currConfig != ConfigurationType::Unknown, "Unrecognized configuration [" << *currConfigStr << "]"); + if (*currLevel == Level::Unknown || currConfig == ConfigurationType::Unknown) { + return false; // unrecognizable level or config + } + conf->set(*currLevel, currConfig, currValue); + return true; + } + }; + +private: + std::string m_configurationFile; + bool m_isFromFile; + friend class el::Loggers; + + /// @brief Unsafely sets configuration if does not already exist + void unsafeSetIfNotExist(Level level, ConfigurationType configurationType, const std::string& value) { + Configuration* conf = RegistryWithPred::get(level, configurationType); + if (conf == nullptr) { + unsafeSet(level, configurationType, value); + } + } + + /// @brief Thread unsafe set + void unsafeSet(Level level, ConfigurationType configurationType, const std::string& value) { + Configuration* conf = RegistryWithPred::get(level, configurationType); + if (conf == nullptr) { + registerNew(new Configuration(level, configurationType, value)); + } else { + conf->setValue(value); + } + if (level == Level::Global) { + unsafeSetGlobally(configurationType, value, false); + } + } + + /// @brief Sets configurations for all levels including Level::Global if includeGlobalLevel is true + /// @see Configurations::setGlobally(ConfigurationType configurationType, const std::string& value) + void setGlobally(ConfigurationType configurationType, const std::string& value, bool includeGlobalLevel) { + if (includeGlobalLevel) { + set(Level::Global, configurationType, value); + } + base::type::EnumType lIndex = LevelHelper::kMinValid; + LevelHelper::forEachLevel(&lIndex, [&](void) -> bool { + set(LevelHelper::castFromInt(lIndex), configurationType, value); + return false; // Do not break lambda function yet as we need to set all levels regardless + }); + } + + /// @brief Sets configurations (Unsafely) for all levels including Level::Global if includeGlobalLevel is true + /// @see Configurations::setGlobally(ConfigurationType configurationType, const std::string& value) + void unsafeSetGlobally(ConfigurationType configurationType, const std::string& value, bool includeGlobalLevel) { + if (includeGlobalLevel) { + unsafeSet(Level::Global, configurationType, value); + } + base::type::EnumType lIndex = LevelHelper::kMinValid; + LevelHelper::forEachLevel(&lIndex, [&](void) -> bool { + unsafeSet(LevelHelper::castFromInt(lIndex), configurationType, value); + return false; // Do not break lambda function yet as we need to set all levels regardless + }); + } +}; + +namespace base { +typedef std::shared_ptr FileStreamPtr; +typedef std::map LogStreamsReferenceMap; +/// @brief Configurations with data types. +/// +/// @detail el::Configurations have string based values. This is whats used internally in order to read correct configurations. +/// This is to perform faster while writing logs using correct configurations. +/// +/// This is thread safe and final class containing non-virtual destructor (means nothing should inherit this class) +class TypedConfigurations : public base::threading::ThreadSafe { +public: + /// @brief Constructor to initialize (construct) the object off el::Configurations + /// @param configurations Configurations pointer/reference to base this typed configurations off. + /// @param logStreamsReference Use ELPP->registeredLoggers()->logStreamsReference() + TypedConfigurations(Configurations* configurations, base::LogStreamsReferenceMap* logStreamsReference) { + m_configurations = configurations; + m_logStreamsReference = logStreamsReference; + build(m_configurations); + } + + TypedConfigurations(const TypedConfigurations& other) { + this->m_configurations = other.m_configurations; + this->m_logStreamsReference = other.m_logStreamsReference; + build(m_configurations); + } + + virtual ~TypedConfigurations(void) { + } + + const Configurations* configurations(void) const { + return m_configurations; + } + + inline bool enabled(Level level) { + return getConfigByVal(level, &m_enabledMap, "enabled"); + } + + inline bool toFile(Level level) { + return getConfigByVal(level, &m_toFileMap, "toFile"); + } + + inline const std::string& filename(Level level) { + return getConfigByRef(level, &m_filenameMap, "filename"); + } + + inline bool toStandardOutput(Level level) { + return getConfigByVal(level, &m_toStandardOutputMap, "toStandardOutput"); + } + + inline const base::LogFormat& logFormat(Level level) { + return getConfigByRef(level, &m_logFormatMap, "logFormat"); + } + + inline const base::MillisecondsWidth& millisecondsWidth(Level level = Level::Global) { + return getConfigByRef(level, &m_millisecondsWidthMap, "millisecondsWidth"); + } + + inline bool performanceTracking(Level level = Level::Global) { + return getConfigByVal(level, &m_performanceTrackingMap, "performanceTracking"); + } + + inline base::type::fstream_t* fileStream(Level level) { + return getConfigByRef(level, &m_fileStreamMap, "fileStream").get(); + } + + inline std::size_t maxLogFileSize(Level level) { + return getConfigByVal(level, &m_maxLogFileSizeMap, "maxLogFileSize"); + } + + inline std::size_t logFlushThreshold(Level level) { + return getConfigByVal(level, &m_logFlushThresholdMap, "logFlushThreshold"); + } + +private: + Configurations* m_configurations; + std::map m_enabledMap; + std::map m_toFileMap; + std::map m_filenameMap; + std::map m_toStandardOutputMap; + std::map m_logFormatMap; + std::map m_millisecondsWidthMap; + std::map m_performanceTrackingMap; + std::map m_fileStreamMap; + std::map m_maxLogFileSizeMap; + std::map m_logFlushThresholdMap; + base::LogStreamsReferenceMap* m_logStreamsReference; + + friend class el::Helpers; + friend class el::base::MessageBuilder; + friend class el::base::Writer; + friend class el::base::DefaultLogDispatchCallback; + friend class el::base::LogDispatcher; + + template + inline Conf_T getConfigByVal(Level level, const std::map* confMap, const char* confName) { + base::threading::ScopedLock scopedLock(lock()); + return unsafeGetConfigByVal(level, confMap, confName); // This is not unsafe anymore - mutex locked in scope + } + + template + inline Conf_T& getConfigByRef(Level level, std::map* confMap, const char* confName) { + base::threading::ScopedLock scopedLock(lock()); + return unsafeGetConfigByRef(level, confMap, confName); // This is not unsafe anymore - mutex locked in scope + } + + template + inline Conf_T unsafeGetConfigByVal(Level level, const std::map* confMap, const char* confName) { + ELPP_UNUSED(confName); + typename std::map::const_iterator it = confMap->find(level); + if (it == confMap->end()) { + try { + return confMap->at(Level::Global); + } catch (...) { + ELPP_INTERNAL_ERROR("Unable to get configuration [" << confName << "] for level [" + << LevelHelper::convertToString(level) << "]" + << std::endl << "Please ensure you have properly configured logger.", false); + return Conf_T(); + } + } + return it->second; + } + + template + inline Conf_T& unsafeGetConfigByRef(Level level, std::map* confMap, const char* confName) { + ELPP_UNUSED(confName); + typename std::map::iterator it = confMap->find(level); + if (it == confMap->end()) { + try { + return confMap->at(Level::Global); + } catch (...) { + ELPP_INTERNAL_ERROR("Unable to get configuration [" << confName << "] for level [" + << LevelHelper::convertToString(level) << "]" + << std::endl << "Please ensure you have properly configured logger.", false); + } + } + return it->second; + } + + template + void setValue(Level level, const Conf_T& value, std::map* confMap, bool includeGlobalLevel = true) { + // If map is empty and we are allowed to add into generic level (Level::Global), do it! + if (confMap->empty() && includeGlobalLevel) { + confMap->insert(std::make_pair(Level::Global, value)); + return; + } + // If same value exist in generic level already, dont add it to explicit level + typename std::map::iterator it = confMap->find(Level::Global); + if (it != confMap->end() && it->second == value) { + return; + } + // Now make sure we dont double up values if we really need to add it to explicit level + it = confMap->find(level); + if (it == confMap->end()) { + // Value not found for level, add new + confMap->insert(std::make_pair(level, value)); + } else { + // Value found, just update value + confMap->at(level) = value; + } + } + + void build(Configurations* configurations) { + base::threading::ScopedLock scopedLock(lock()); + auto getBool = [] (std::string boolStr) -> bool { // Pass by value for trimming + base::utils::Str::trim(boolStr); + return (boolStr == "TRUE" || boolStr == "true" || boolStr == "1"); + }; + std::vector withFileSizeLimit; + for (Configurations::const_iterator it = configurations->begin(); it != configurations->end(); ++it) { + Configuration* conf = *it; + // We cannot use switch on strong enums because Intel C++ dont support them yet + if (conf->configurationType() == ConfigurationType::Enabled) { + setValue(conf->level(), getBool(conf->value()), &m_enabledMap); + } else if (conf->configurationType() == ConfigurationType::ToFile) { + setValue(conf->level(), getBool(conf->value()), &m_toFileMap); + } else if (conf->configurationType() == ConfigurationType::ToStandardOutput) { + setValue(conf->level(), getBool(conf->value()), &m_toStandardOutputMap); + } else if (conf->configurationType() == ConfigurationType::Filename) { + // We do not yet configure filename but we will configure in another + // loop. This is because if file cannot be created, we will force ToFile + // to be false. Because configuring logger is not necessarily performance + // sensative operation, we can live with another loop; (by the way this loop + // is not very heavy either) + } else if (conf->configurationType() == ConfigurationType::Format) { + setValue(conf->level(), base::LogFormat(conf->level(), + base::type::string_t(conf->value().begin(), conf->value().end())), &m_logFormatMap); + } else if (conf->configurationType() == ConfigurationType::MillisecondsWidth) { + setValue(Level::Global, + base::MillisecondsWidth(static_cast(getULong(conf->value()))), &m_millisecondsWidthMap); + } else if (conf->configurationType() == ConfigurationType::PerformanceTracking) { + setValue(Level::Global, getBool(conf->value()), &m_performanceTrackingMap); + } else if (conf->configurationType() == ConfigurationType::MaxLogFileSize) { + setValue(conf->level(), static_cast(getULong(conf->value())), &m_maxLogFileSizeMap); +#if !defined(ELPP_NO_DEFAULT_LOG_FILE) + withFileSizeLimit.push_back(conf); +#endif // !defined(ELPP_NO_DEFAULT_LOG_FILE) + } else if (conf->configurationType() == ConfigurationType::LogFlushThreshold) { + setValue(conf->level(), static_cast(getULong(conf->value())), &m_logFlushThresholdMap); + } + } + // As mentioned early, we will now set filename configuration in separate loop to deal with non-existent files + for (Configurations::const_iterator it = configurations->begin(); it != configurations->end(); ++it) { + Configuration* conf = *it; + if (conf->configurationType() == ConfigurationType::Filename) { + insertFile(conf->level(), conf->value()); + } + } + for (std::vector::iterator conf = withFileSizeLimit.begin(); + conf != withFileSizeLimit.end(); ++conf) { + // This is not unsafe as mutex is locked in currect scope + unsafeValidateFileRolling((*conf)->level(), base::defaultPreRollOutCallback); + } + } + + unsigned long getULong(std::string confVal) { + bool valid = true; + base::utils::Str::trim(confVal); + valid = !confVal.empty() && std::find_if(confVal.begin(), confVal.end(), + [](char c) { return !base::utils::Str::isDigit(c); }) == confVal.end(); + if (!valid) { + valid = false; + ELPP_ASSERT(valid, "Configuration value not a valid integer [" << confVal << "]"); + return 0; + } + return atol(confVal.c_str()); + } + + std::string resolveFilename(const std::string& filename) { + std::string resultingFilename = filename; + std::size_t dateIndex = std::string::npos; + std::string dateTimeFormatSpecifierStr = std::string(base::consts::kDateTimeFormatSpecifierForFilename); + if ((dateIndex = resultingFilename.find(dateTimeFormatSpecifierStr.c_str())) != std::string::npos) { + while (dateIndex > 0 && resultingFilename[dateIndex - 1] == base::consts::kFormatSpecifierChar) { + dateIndex = resultingFilename.find(dateTimeFormatSpecifierStr.c_str(), dateIndex + 1); + } + if (dateIndex != std::string::npos) { + const char* ptr = resultingFilename.c_str() + dateIndex; + // Goto end of specifier + ptr += dateTimeFormatSpecifierStr.size(); + std::string fmt; + if ((resultingFilename.size() > dateIndex) && (ptr[0] == '{')) { + // User has provided format for date/time + ++ptr; + int count = 1; // Start by 1 in order to remove starting brace + std::stringstream ss; + for (; *ptr; ++ptr, ++count) { + if (*ptr == '}') { + ++count; // In order to remove ending brace + break; + } + ss << *ptr; + } + resultingFilename.erase(dateIndex + dateTimeFormatSpecifierStr.size(), count); + fmt = ss.str(); + } else { + fmt = std::string(base::consts::kDefaultDateTimeFormatInFilename); + } + base::MillisecondsWidth msWidth(3); + std::string now = base::utils::DateTime::getDateTime(fmt.c_str(), &msWidth); + base::utils::Str::replaceAll(now, '/', '-'); // Replace path element since we are dealing with filename + base::utils::Str::replaceAll(resultingFilename, dateTimeFormatSpecifierStr, now); + } + } + return resultingFilename; + } + + void insertFile(Level level, const std::string& fullFilename) { + std::string resolvedFilename = resolveFilename(fullFilename); + if (resolvedFilename.empty()) { + std::cerr << "Could not load empty file for logging, please re-check your configurations for level [" + << LevelHelper::convertToString(level) << "]"; + } + std::string filePath = base::utils::File::extractPathFromFilename(resolvedFilename, base::consts::kFilePathSeperator); + if (filePath.size() < resolvedFilename.size()) { + base::utils::File::createPath(filePath); + } + auto create = [&](Level level) { + base::LogStreamsReferenceMap::iterator filestreamIter = m_logStreamsReference->find(resolvedFilename); + base::type::fstream_t* fs = nullptr; + if (filestreamIter == m_logStreamsReference->end()) { + // We need a completely new stream, nothing to share with + fs = base::utils::File::newFileStream(resolvedFilename); + m_filenameMap.insert(std::make_pair(level, resolvedFilename)); + m_fileStreamMap.insert(std::make_pair(level, base::FileStreamPtr(fs))); + m_logStreamsReference->insert(std::make_pair(resolvedFilename, base::FileStreamPtr(m_fileStreamMap.at(level)))); + } else { + // Woops! we have an existing one, share it! + m_filenameMap.insert(std::make_pair(level, filestreamIter->first)); + m_fileStreamMap.insert(std::make_pair(level, base::FileStreamPtr(filestreamIter->second))); + fs = filestreamIter->second.get(); + } + if (fs == nullptr) { + // We display bad file error from newFileStream() + ELPP_INTERNAL_ERROR("Setting [TO_FILE] of [" + << LevelHelper::convertToString(level) << "] to FALSE", false); + setValue(level, false, &m_toFileMap); + } + }; + // If we dont have file conf for any level, create it for Level::Global first + // otherwise create for specified level + create(m_filenameMap.empty() && m_fileStreamMap.empty() ? Level::Global : level); + } + + bool unsafeValidateFileRolling(Level level, const PreRollOutCallback& PreRollOutCallback) { + base::type::fstream_t* fs = unsafeGetConfigByRef(level, &m_fileStreamMap, "fileStream").get(); + if (fs == nullptr) { + return true; + } + std::size_t maxLogFileSize = unsafeGetConfigByVal(level, &m_maxLogFileSizeMap, "maxLogFileSize"); + std::size_t currFileSize = base::utils::File::getSizeOfFile(fs); + if (maxLogFileSize != 0 && currFileSize >= maxLogFileSize) { + std::string fname = unsafeGetConfigByRef(level, &m_filenameMap, "filename"); + ELPP_INTERNAL_INFO(1, "Truncating log file [" << fname << "] as a result of configurations for level [" + << LevelHelper::convertToString(level) << "]"); + fs->close(); + PreRollOutCallback(fname.c_str(), currFileSize); + fs->open(fname, std::fstream::out | std::fstream::trunc); + return true; + } + return false; + } + + bool validateFileRolling(Level level, const PreRollOutCallback& PreRollOutCallback) { + base::threading::ScopedLock scopedLock(lock()); + return unsafeValidateFileRolling(level, PreRollOutCallback); + } +}; +/// @brief Class that keeps record of current line hit for occasional logging +class HitCounter { +public: + HitCounter(void) : + m_filename(""), + m_lineNumber(0), + m_hitCounts(0) { + } + + HitCounter(const char* filename, unsigned long int lineNumber) : + m_filename(filename), + m_lineNumber(lineNumber), + m_hitCounts(0) { + } + + HitCounter(const HitCounter& hitCounter) : + m_filename(hitCounter.m_filename), + m_lineNumber(hitCounter.m_lineNumber), + m_hitCounts(hitCounter.m_hitCounts) { + } + + HitCounter& operator=(const HitCounter& hitCounter) { + m_filename = hitCounter.m_filename; + m_lineNumber = hitCounter.m_lineNumber; + m_hitCounts = hitCounter.m_hitCounts; + return *this; + } + + virtual ~HitCounter(void) { + } + + /// @brief Resets location of current hit counter + inline void resetLocation(const char* filename, unsigned long int lineNumber) { + m_filename = filename; + m_lineNumber = lineNumber; + } + + /// @brief Validates hit counts and resets it if necessary + inline void validateHitCounts(std::size_t n) { + if (m_hitCounts >= base::consts::kMaxLogPerCounter) { + m_hitCounts = (n >= 1 ? base::consts::kMaxLogPerCounter % n : 0); + } + ++m_hitCounts; + } + + inline const char* filename(void) const { + return m_filename; + } + + inline unsigned long int lineNumber(void) const { + return m_lineNumber; + } + + inline std::size_t hitCounts(void) const { + return m_hitCounts; + } + + inline void increment(void) { + ++m_hitCounts; + } + + class Predicate { + public: + Predicate(const char* filename, unsigned long int lineNumber) + : m_filename(filename), + m_lineNumber(lineNumber) { + } + inline bool operator()(const HitCounter* counter) { + return ((counter != nullptr) && + (strcmp(counter->m_filename, m_filename) == 0) && + (counter->m_lineNumber == m_lineNumber)); + } + + private: + const char* m_filename; + unsigned long int m_lineNumber; + }; + +private: + const char* m_filename; + unsigned long int m_lineNumber; + std::size_t m_hitCounts; +}; +/// @brief Repository for hit counters used across the application +class RegisteredHitCounters : public base::utils::RegistryWithPred { +public: + /// @brief Validates counter for every N, i.e, registers new if does not exist otherwise updates original one + /// @return True if validation resulted in triggering hit. Meaning logs should be written everytime true is returned + bool validateEveryN(const char* filename, unsigned long int lineNumber, std::size_t n) { + base::threading::ScopedLock scopedLock(lock()); + base::HitCounter* counter = get(filename, lineNumber); + if (counter == nullptr) { + registerNew(counter = new base::HitCounter(filename, lineNumber)); + } + counter->validateHitCounts(n); + bool result = (n >= 1 && counter->hitCounts() != 0 && counter->hitCounts() % n == 0); + return result; + } + + /// @brief Validates counter for hits >= N, i.e, registers new if does not exist otherwise updates original one + /// @return True if validation resulted in triggering hit. Meaning logs should be written everytime true is returned + bool validateAfterN(const char* filename, unsigned long int lineNumber, std::size_t n) { + base::threading::ScopedLock scopedLock(lock()); + base::HitCounter* counter = get(filename, lineNumber); + if (counter == nullptr) { + registerNew(counter = new base::HitCounter(filename, lineNumber)); + } + // Do not use validateHitCounts here since we do not want to reset counter here + // Note the >= instead of > because we are incrementing + // after this check + if (counter->hitCounts() >= n) + return true; + counter->increment(); + return false; + } + + /// @brief Validates counter for hits are <= n, i.e, registers new if does not exist otherwise updates original one + /// @return True if validation resulted in triggering hit. Meaning logs should be written everytime true is returned + bool validateNTimes(const char* filename, unsigned long int lineNumber, std::size_t n) { + base::threading::ScopedLock scopedLock(lock()); + base::HitCounter* counter = get(filename, lineNumber); + if (counter == nullptr) { + registerNew(counter = new base::HitCounter(filename, lineNumber)); + } + counter->increment(); + // Do not use validateHitCounts here since we do not want to reset counter here + if (counter->hitCounts() <= n) + return true; + return false; + } + + /// @brief Gets hit counter registered at specified position + inline const base::HitCounter* getCounter(const char* filename, unsigned long int lineNumber) { + base::threading::ScopedLock scopedLock(lock()); + return get(filename, lineNumber); + } +}; +/// @brief Action to be taken for dispatching +enum class DispatchAction : base::type::EnumType { + None = 1, NormalLog = 2, SysLog = 4 +}; +} // namespace base +template +class Callback : protected base::threading::ThreadSafe { +public: + Callback(void) : m_enabled(true) {} + inline bool enabled(void) const { return m_enabled; } + inline void setEnabled(bool enabled) { + base::threading::ScopedLock scopedLock(lock()); + m_enabled = enabled; + } +protected: + virtual void handle(const T* handlePtr) = 0; +private: + bool m_enabled; +}; +class LogDispatchData { +public: + LogDispatchData() : m_logMessage(nullptr), m_dispatchAction(base::DispatchAction::None) {} + inline const LogMessage* logMessage(void) const { return m_logMessage; } + inline base::DispatchAction dispatchAction(void) const { return m_dispatchAction; } +private: + LogMessage* m_logMessage; + base::DispatchAction m_dispatchAction; + friend class base::LogDispatcher; + + inline void setLogMessage(LogMessage* logMessage) { m_logMessage = logMessage; } + inline void setDispatchAction(base::DispatchAction dispatchAction) { m_dispatchAction = dispatchAction; } +}; +class LogDispatchCallback : public Callback { +private: + friend class base::LogDispatcher; +}; +class PerformanceTrackingCallback : public Callback { +private: + friend class base::PerformanceTracker; +}; +class LogBuilder : base::NoCopy { +public: + virtual ~LogBuilder(void) { ELPP_INTERNAL_INFO(3, "Destroying log builder...")} + virtual base::type::string_t build(const LogMessage* logMessage, bool appendNewLine) const = 0; + void convertToColoredOutput(base::type::string_t* logLine, Level level) { + if (!base::utils::s_termSupportsColor) return; + const base::type::char_t* resetColor = ELPP_LITERAL("\x1b[0m"); + if (level == Level::Error || level == Level::Fatal) + *logLine = ELPP_LITERAL("\x1b[31m") + *logLine + resetColor; + else if (level == Level::Warning) + *logLine = ELPP_LITERAL("\x1b[33m") + *logLine + resetColor; + } +private: + friend class el::base::DefaultLogDispatchCallback; +}; +typedef std::shared_ptr LogBuilderPtr; +/// @brief Represents a logger holding ID and configurations we need to write logs +/// +/// @detail This class does not write logs itself instead its used by writer to read configuations from. +class Logger : public base::threading::ThreadSafe, public Loggable { +public: + Logger(const std::string& id, base::LogStreamsReferenceMap* logStreamsReference) : + m_id(id), + m_typedConfigurations(nullptr), + m_parentApplicationName(std::string()), + m_isConfigured(false), + m_logStreamsReference(logStreamsReference) { + initUnflushedCount(); + } + + Logger(const std::string& id, const Configurations& configurations, base::LogStreamsReferenceMap* logStreamsReference) : + m_id(id), + m_typedConfigurations(nullptr), + m_parentApplicationName(std::string()), + m_isConfigured(false), + m_logStreamsReference(logStreamsReference) { + initUnflushedCount(); + configure(configurations); + } + + Logger(const Logger& logger) { + base::utils::safeDelete(m_typedConfigurations); + m_id = logger.m_id; + m_typedConfigurations = logger.m_typedConfigurations; + m_parentApplicationName = logger.m_parentApplicationName; + m_isConfigured = logger.m_isConfigured; + m_configurations = logger.m_configurations; + m_unflushedCount = logger.m_unflushedCount; + m_logStreamsReference = logger.m_logStreamsReference; + } + + Logger& operator=(const Logger& logger) { + base::utils::safeDelete(m_typedConfigurations); + m_id = logger.m_id; + m_typedConfigurations = logger.m_typedConfigurations; + m_parentApplicationName = logger.m_parentApplicationName; + m_isConfigured = logger.m_isConfigured; + m_configurations = logger.m_configurations; + m_unflushedCount = logger.m_unflushedCount; + m_logStreamsReference = logger.m_logStreamsReference; + return *this; + } + + virtual ~Logger(void) { + base::utils::safeDelete(m_typedConfigurations); + } + + virtual inline void log(el::base::type::ostream_t& os) const { + os << m_id.c_str(); + } + + /// @brief Configures the logger using specified configurations. + void configure(const Configurations& configurations) { + m_isConfigured = false; // we set it to false in case if we fail + initUnflushedCount(); + if (m_typedConfigurations != nullptr) { + Configurations* c = const_cast(m_typedConfigurations->configurations()); + if (c->hasConfiguration(Level::Global, ConfigurationType::Filename)) { + // This check is definitely needed for cases like ELPP_NO_DEFAULT_LOG_FILE + flush(); + } + } + base::threading::ScopedLock scopedLock(lock()); + if (m_configurations != configurations) { + m_configurations.setFromBase(const_cast(&configurations)); + } + base::utils::safeDelete(m_typedConfigurations); + m_typedConfigurations = new base::TypedConfigurations(&m_configurations, m_logStreamsReference); + resolveLoggerFormatSpec(); + m_isConfigured = true; + } + + /// @brief Reconfigures logger using existing configurations + inline void reconfigure(void) { + ELPP_INTERNAL_INFO(1, "Reconfiguring logger [" << m_id << "]"); + configure(m_configurations); + } + + inline const std::string& id(void) const { + return m_id; + } + + inline const std::string& parentApplicationName(void) const { + return m_parentApplicationName; + } + + inline void setParentApplicationName(const std::string& parentApplicationName) { + m_parentApplicationName = parentApplicationName; + } + + inline Configurations* configurations(void) { + return &m_configurations; + } + + inline base::TypedConfigurations* typedConfigurations(void) { + return m_typedConfigurations; + } + + static inline bool isValidId(const std::string& id) { + for (std::string::const_iterator it = id.begin(); it != id.end(); ++it) { + if (!base::utils::Str::contains(base::consts::kValidLoggerIdSymbols, *it)) { + return false; + } + } + return true; + } + /// @brief Flushes logger to sync all log files for all levels + inline void flush(void) { + ELPP_INTERNAL_INFO(3, "Flushing logger [" << m_id << "] all levels"); + base::threading::ScopedLock scopedLock(lock()); + base::type::EnumType lIndex = LevelHelper::kMinValid; + LevelHelper::forEachLevel(&lIndex, [&](void) -> bool { + flush(LevelHelper::castFromInt(lIndex), nullptr); + return false; + }); + } + + inline void flush(Level level, base::type::fstream_t* fs) { + if (fs == nullptr && m_typedConfigurations->toFile(level)) { + fs = m_typedConfigurations->fileStream(level); + } + if (fs != nullptr) { + fs->flush(); + m_unflushedCount.find(level)->second = 0; + } + } + + inline bool isFlushNeeded(Level level) { + return ++m_unflushedCount.find(level)->second >= m_typedConfigurations->logFlushThreshold(level); + } + + inline LogBuilder* logBuilder(void) const { + return m_logBuilder.get(); + } + + inline void setLogBuilder(const LogBuilderPtr& logBuilder) { + m_logBuilder = logBuilder; + } + + inline bool enabled(Level level) const { + return m_typedConfigurations->enabled(level); + } + +#if ELPP_VARIADIC_TEMPLATES_SUPPORTED +# define LOGGER_LEVEL_WRITERS_SIGNATURES(FUNCTION_NAME)\ + template \ + inline void FUNCTION_NAME(const char*, const T&, const Args&...);\ + template \ + inline void FUNCTION_NAME(const T&); + + template + inline void verbose(int, const char*, const T&, const Args&...); + + template + inline void verbose(int, const T&); + + LOGGER_LEVEL_WRITERS_SIGNATURES(info) + LOGGER_LEVEL_WRITERS_SIGNATURES(debug) + LOGGER_LEVEL_WRITERS_SIGNATURES(warn) + LOGGER_LEVEL_WRITERS_SIGNATURES(error) + LOGGER_LEVEL_WRITERS_SIGNATURES(fatal) + LOGGER_LEVEL_WRITERS_SIGNATURES(trace) +# undef LOGGER_LEVEL_WRITERS_SIGNATURES +#endif // ELPP_VARIADIC_TEMPLATES_SUPPORTED +private: + std::string m_id; + base::TypedConfigurations* m_typedConfigurations; + base::type::stringstream_t m_stream; + std::string m_parentApplicationName; + bool m_isConfigured; + Configurations m_configurations; + std::map m_unflushedCount; + base::LogStreamsReferenceMap* m_logStreamsReference; + LogBuilderPtr m_logBuilder; + + friend class el::LogMessage; + friend class el::Loggers; + friend class el::Helpers; + friend class el::base::RegisteredLoggers; + friend class el::base::DefaultLogDispatchCallback; + friend class el::base::MessageBuilder; + friend class el::base::Writer; + friend class el::base::PErrorWriter; + friend class el::base::Storage; + friend class el::base::PerformanceTracker; + friend class el::base::LogDispatcher; + + Logger(void); + +#if ELPP_VARIADIC_TEMPLATES_SUPPORTED + template + void log_(Level, int, const char*, const T&, const Args&...); + + template + inline void log_(Level, int, const T&); + + template + void log(Level, const char*, const T&, const Args&...); + + template + inline void log(Level, const T&); +#endif // ELPP_VARIADIC_TEMPLATES_SUPPORTED + + void initUnflushedCount(void) { + m_unflushedCount.clear(); + base::type::EnumType lIndex = LevelHelper::kMinValid; + LevelHelper::forEachLevel(&lIndex, [&](void) -> bool { + m_unflushedCount.insert(std::make_pair(LevelHelper::castFromInt(lIndex), 0)); + return false; + }); + } + + inline base::type::stringstream_t& stream(void) { + return m_stream; + } + + void resolveLoggerFormatSpec(void) const { + base::type::EnumType lIndex = LevelHelper::kMinValid; + LevelHelper::forEachLevel(&lIndex, [&](void) -> bool { + base::LogFormat* logFormat = + const_cast(&m_typedConfigurations->logFormat(LevelHelper::castFromInt(lIndex))); + base::utils::Str::replaceFirstWithEscape(logFormat->m_format, base::consts::kLoggerIdFormatSpecifier, m_id); + return false; + }); + } +}; +namespace base { +/// @brief Loggers repository +class RegisteredLoggers : public base::utils::Registry { +public: + explicit RegisteredLoggers(const LogBuilderPtr& defaultLogBuilder) : + m_defaultLogBuilder(defaultLogBuilder) { + m_defaultConfigurations.setToDefault(); + } + + virtual ~RegisteredLoggers(void) { + flushAll(); + } + + inline void setDefaultConfigurations(const Configurations& configurations) { + base::threading::ScopedLock scopedLock(lock()); + m_defaultConfigurations.setFromBase(const_cast(&configurations)); + } + + inline Configurations* defaultConfigurations(void) { + return &m_defaultConfigurations; + } + + Logger* get(const std::string& id, bool forceCreation = true) { + base::threading::ScopedLock scopedLock(lock()); + Logger* logger_ = base::utils::Registry::get(id); + if (logger_ == nullptr && forceCreation) { + bool validId = Logger::isValidId(id); + if (!validId) { + ELPP_ASSERT(validId, "Invalid logger ID [" << id << "]. Not registering this logger."); + return nullptr; + } + logger_ = new Logger(id, m_defaultConfigurations, &m_logStreamsReference); + logger_->m_logBuilder = m_defaultLogBuilder; + registerNew(id, logger_); + } + return logger_; + } + + bool remove(const std::string& id) { + if (id == "default") { + return false; + } + Logger* logger = base::utils::Registry::get(id); + if (logger != nullptr) { + unregister(logger); + } + return true; + } + + inline bool has(const std::string& id) { + return get(id, false) != nullptr; + } + + inline void unregister(Logger*& logger) { + base::threading::ScopedLock scopedLock(lock()); + base::utils::Registry::unregister(logger->id()); + } + + inline base::LogStreamsReferenceMap* logStreamsReference(void) { + return &m_logStreamsReference; + } + + inline void flushAll(void) { + ELPP_INTERNAL_INFO(1, "Flushing all log files"); + base::threading::ScopedLock scopedLock(lock()); + for (base::LogStreamsReferenceMap::iterator it = m_logStreamsReference.begin(); + it != m_logStreamsReference.end(); ++it) { + if (it->second.get() == nullptr) continue; + it->second->flush(); + } + } + +private: + LogBuilderPtr m_defaultLogBuilder; + Configurations m_defaultConfigurations; + base::LogStreamsReferenceMap m_logStreamsReference; + friend class el::base::Storage; +}; +/// @brief Represents registries for verbose logging +class VRegistry : base::NoCopy, public base::threading::ThreadSafe { +public: + explicit VRegistry(base::type::VerboseLevel level, base::type::EnumType* pFlags) : m_level(level), m_pFlags(pFlags) { + } + + /// @brief Sets verbose level. Accepted range is 0-9 + inline void setLevel(base::type::VerboseLevel level) { + base::threading::ScopedLock scopedLock(lock()); + if (level < 0) + m_level = 0; + else if (level > 9) + m_level = base::consts::kMaxVerboseLevel; + else + m_level = level; + } + + inline base::type::VerboseLevel level(void) const { + return m_level; + } + + inline void clearModules(void) { + base::threading::ScopedLock scopedLock(lock()); + m_modules.clear(); + } + + void setModules(const char* modules) { + base::threading::ScopedLock scopedLock(lock()); + auto addSuffix = [](std::stringstream& ss, const char* sfx, const char* prev) { + if (prev != nullptr && base::utils::Str::endsWith(ss.str(), std::string(prev))) { + std::string chr(ss.str().substr(0, ss.str().size() - strlen(prev))); + ss.str(std::string("")); + ss << chr; + } + if (base::utils::Str::endsWith(ss.str(), std::string(sfx))) { + std::string chr(ss.str().substr(0, ss.str().size() - strlen(sfx))); + ss.str(std::string("")); + ss << chr; + } + ss << sfx; + }; + auto insert = [&](std::stringstream& ss, base::type::VerboseLevel level) { + if (!base::utils::hasFlag(LoggingFlag::DisableVModulesExtensions, *m_pFlags)) { + addSuffix(ss, ".h", nullptr); + m_modules.insert(std::make_pair(ss.str(), level)); + addSuffix(ss, ".c", ".h"); + m_modules.insert(std::make_pair(ss.str(), level)); + addSuffix(ss, ".cpp", ".c"); + m_modules.insert(std::make_pair(ss.str(), level)); + addSuffix(ss, ".cc", ".cpp"); + m_modules.insert(std::make_pair(ss.str(), level)); + addSuffix(ss, ".cxx", ".cc"); + m_modules.insert(std::make_pair(ss.str(), level)); + addSuffix(ss, ".-inl.h", ".cxx"); + m_modules.insert(std::make_pair(ss.str(), level)); + addSuffix(ss, ".hxx", ".-inl.h"); + m_modules.insert(std::make_pair(ss.str(), level)); + addSuffix(ss, ".hpp", ".hxx"); + m_modules.insert(std::make_pair(ss.str(), level)); + addSuffix(ss, ".hh", ".hpp"); + } + m_modules.insert(std::make_pair(ss.str(), level)); + }; + bool isMod = true; + bool isLevel = false; + std::stringstream ss; + int level = -1; + for (; *modules; ++modules) { + switch (*modules) { + case '=': + isLevel = true; + isMod = false; + break; + case ',': + isLevel = false; + isMod = true; + if (!ss.str().empty() && level != -1) { + insert(ss, level); + ss.str(std::string("")); + level = -1; + } + break; + default: + if (isMod) { + ss << *modules; + } else if (isLevel) { + if (isdigit(*modules)) { + level = static_cast(*modules) - 48; + } + } + break; + } + } + if (!ss.str().empty() && level != -1) { + insert(ss, level); + } + } + + bool allowed(base::type::VerboseLevel vlevel, const char* file) { + base::threading::ScopedLock scopedLock(lock()); + if (m_modules.empty() || file == nullptr) { + return vlevel <= m_level; + } else { + std::map::iterator it = m_modules.begin(); + for (; it != m_modules.end(); ++it) { + if (base::utils::Str::wildCardMatch(file, it->first.c_str())) { + return vlevel <= it->second; + } + } + if (base::utils::hasFlag(LoggingFlag::AllowVerboseIfModuleNotSpecified, *m_pFlags)) { + return true; + } + return false; + } + } + + inline const std::map& modules(void) const { + return m_modules; + } + + void setFromArgs(const base::utils::CommandLineArgs* commandLineArgs) { + if (commandLineArgs->hasParam("-v") || commandLineArgs->hasParam("--verbose") || + commandLineArgs->hasParam("-V") || commandLineArgs->hasParam("--VERBOSE")) { + setLevel(base::consts::kMaxVerboseLevel); + } else if (commandLineArgs->hasParamWithValue("--v")) { + setLevel(atoi(commandLineArgs->getParamValue("--v"))); + } else if (commandLineArgs->hasParamWithValue("--V")) { + setLevel(atoi(commandLineArgs->getParamValue("--V"))); + } else if ((commandLineArgs->hasParamWithValue("-vmodule")) && vModulesEnabled()) { + setModules(commandLineArgs->getParamValue("-vmodule")); + } else if (commandLineArgs->hasParamWithValue("-VMODULE") && vModulesEnabled()) { + setModules(commandLineArgs->getParamValue("-VMODULE")); + } + } + + /// @brief Whether or not vModules enabled + inline bool vModulesEnabled(void) { + return !base::utils::hasFlag(LoggingFlag::DisableVModules, *m_pFlags); + } + +private: + base::type::VerboseLevel m_level; + base::type::EnumType* m_pFlags; + std::map m_modules; +}; +} // namespace base +class LogMessage { +public: + LogMessage(Level level, const std::string& file, unsigned long int line, const std::string& func, + base::type::VerboseLevel verboseLevel, Logger* logger) : + m_level(level), m_file(file), m_line(line), m_func(func), + m_verboseLevel(verboseLevel), m_logger(logger), m_message(std::move(logger->stream().str())) { + } + inline Level level(void) const { return m_level; } + inline const std::string& file(void) const { return m_file; } + inline unsigned long int line(void) const { return m_line; } // NOLINT + inline const std::string& func(void) const { return m_func; } + inline base::type::VerboseLevel verboseLevel(void) const { return m_verboseLevel; } + inline Logger* logger(void) const { return m_logger; } + inline const base::type::string_t& message(void) const { return m_message; } +private: + Level m_level; + std::string m_file; + unsigned long int m_line; + std::string m_func; + base::type::VerboseLevel m_verboseLevel; + Logger* m_logger; + base::type::string_t m_message; +}; +namespace base { +#if ELPP_ASYNC_LOGGING +class AsyncLogItem { +public: + explicit AsyncLogItem(const LogMessage& logMessage, const LogDispatchData& data, const base::type::string_t& logLine) + : m_logMessage(logMessage), m_dispatchData(data), m_logLine(logLine) {} + virtual ~AsyncLogItem() {} + inline LogMessage* logMessage(void) { return &m_logMessage; } + inline LogDispatchData* data(void) { return &m_dispatchData; } + inline base::type::string_t logLine(void) { return m_logLine; } +private: + LogMessage m_logMessage; + LogDispatchData m_dispatchData; + base::type::string_t m_logLine; +}; +class AsyncLogQueue : public base::threading::ThreadSafe { +public: + virtual ~AsyncLogQueue() { + ELPP_INTERNAL_INFO(6, "~AsyncLogQueue"); + } + + inline AsyncLogItem next(void) { + base::threading::ScopedLock scopedLock(lock()); + AsyncLogItem result = m_queue.front(); + m_queue.pop(); + return result; + } + + inline void push(const AsyncLogItem& item) { + base::threading::ScopedLock scopedLock(lock()); + m_queue.push(item); + } + inline void pop(void) { + base::threading::ScopedLock scopedLock(lock()); + m_queue.pop(); + } + inline AsyncLogItem front(void) { + base::threading::ScopedLock scopedLock(lock()); + return m_queue.front(); + } + inline bool empty(void) { + base::threading::ScopedLock scopedLock(lock()); + return m_queue.empty(); + } +private: + std::queue m_queue; +}; +class IWorker { +public: + virtual ~IWorker() {} + virtual void start() = 0; +}; +#endif // ELPP_ASYNC_LOGGING +/// @brief Easylogging++ management storage +class Storage : base::NoCopy, public base::threading::ThreadSafe { +public: +#if ELPP_ASYNC_LOGGING + Storage(const LogBuilderPtr& defaultLogBuilder, base::IWorker* asyncDispatchWorker) : +#else + explicit Storage(const LogBuilderPtr& defaultLogBuilder) : +#endif // ELPP_ASYNC_LOGGING + m_registeredHitCounters(new base::RegisteredHitCounters()), + m_registeredLoggers(new base::RegisteredLoggers(defaultLogBuilder)), + m_flags(0x0), + m_vRegistry(new base::VRegistry(0, &m_flags)), +#if ELPP_ASYNC_LOGGING + m_asyncLogQueue(new base::AsyncLogQueue()), + m_asyncDispatchWorker(asyncDispatchWorker), +#endif // ELPP_ASYNC_LOGGING + m_preRollOutCallback(base::defaultPreRollOutCallback) { + // Register default logger + m_registeredLoggers->get(std::string(base::consts::kDefaultLoggerId)); + // Register performance logger and reconfigure format + Logger* performanceLogger = m_registeredLoggers->get(std::string(base::consts::kPerformanceLoggerId)); + performanceLogger->configurations()->setGlobally(ConfigurationType::Format, std::string("%datetime %level %msg")); + performanceLogger->reconfigure(); +#if defined(ELPP_SYSLOG) + // Register syslog logger and reconfigure format + Logger* sysLogLogger = m_registeredLoggers->get(std::string(base::consts::kSysLogLoggerId)); + sysLogLogger->configurations()->setGlobally(ConfigurationType::Format, std::string("%level: %msg")); + sysLogLogger->reconfigure(); +#else + ELPP_UNUSED(base::consts::kSysLogLoggerId); +#endif // defined(ELPP_SYSLOG) + addFlag(LoggingFlag::AllowVerboseIfModuleNotSpecified); +#if ELPP_ASYNC_LOGGING + installLogDispatchCallback(std::string("AsyncLogDispatchCallback")); +#else + installLogDispatchCallback(std::string("DefaultLogDispatchCallback")); +#endif // ELPP_ASYNC_LOGGING + installPerformanceTrackingCallback(std::string("DefaultPerformanceTrackingCallback")); + ELPP_INTERNAL_INFO(1, "Easylogging++ has been initialized"); +#if ELPP_ASYNC_LOGGING + m_asyncDispatchWorker->start(); +#endif // ELPP_ASYNC_LOGGING + } + + virtual ~Storage(void) { + ELPP_INTERNAL_INFO(4, "Destroying storage"); +#if ELPP_ASYNC_LOGGING + ELPP_INTERNAL_INFO(5, "Replacing log dispatch callback to synchronous"); + uninstallLogDispatchCallback(std::string("AsyncLogDispatchCallback")); + installLogDispatchCallback(std::string("DefaultLogDispatchCallback")); + ELPP_INTERNAL_INFO(5, "Destroying asyncDispatchWorker"); + base::utils::safeDelete(m_asyncDispatchWorker); + ELPP_INTERNAL_INFO(5, "Destroying asyncLogQueue"); + base::utils::safeDelete(m_asyncLogQueue); +#endif // ELPP_ASYNC_LOGGING + ELPP_INTERNAL_INFO(5, "Destroying registeredHitCounters"); + base::utils::safeDelete(m_registeredHitCounters); + ELPP_INTERNAL_INFO(5, "Destroying registeredLoggers"); + base::utils::safeDelete(m_registeredLoggers); + ELPP_INTERNAL_INFO(5, "Destroying vRegistry"); + base::utils::safeDelete(m_vRegistry); + } + + inline bool validateEveryNCounter(const char* filename, unsigned long int lineNumber, std::size_t occasion) { + return hitCounters()->validateEveryN(filename, lineNumber, occasion); + } + + inline bool validateAfterNCounter(const char* filename, unsigned long int lineNumber, std::size_t n) { // NOLINT + return hitCounters()->validateAfterN(filename, lineNumber, n); + } + + inline bool validateNTimesCounter(const char* filename, unsigned long int lineNumber, std::size_t n) { // NOLINT + return hitCounters()->validateNTimes(filename, lineNumber, n); + } + + inline base::RegisteredHitCounters* hitCounters(void) const { + return m_registeredHitCounters; + } + + inline base::RegisteredLoggers* registeredLoggers(void) const { + return m_registeredLoggers; + } + + inline base::VRegistry* vRegistry(void) const { + return m_vRegistry; + } + +#if ELPP_ASYNC_LOGGING + inline base::AsyncLogQueue* asyncLogQueue(void) const { + return m_asyncLogQueue; + } +#endif // ELPP_ASYNC_LOGGING + + inline const base::utils::CommandLineArgs* commandLineArgs(void) const { + return &m_commandLineArgs; + } + + inline void addFlag(LoggingFlag flag) { + base::utils::addFlag(flag, &m_flags); + } + + inline void removeFlag(LoggingFlag flag) { + base::utils::removeFlag(flag, &m_flags); + } + + inline bool hasFlag(LoggingFlag flag) const { + return base::utils::hasFlag(flag, m_flags); + } + + inline base::type::EnumType flags(void) const { + return m_flags; + } + + inline void setFlags(base::type::EnumType flags) { + m_flags = flags; + } + + inline void setPreRollOutCallback(const PreRollOutCallback& callback) { + m_preRollOutCallback = callback; + } + + inline void unsetPreRollOutCallback(void) { + m_preRollOutCallback = base::defaultPreRollOutCallback; + } + + inline PreRollOutCallback& preRollOutCallback(void) { + return m_preRollOutCallback; + } + + inline bool hasCustomFormatSpecifier(const char* formatSpecifier) { + base::threading::ScopedLock scopedLock(lock()); + return std::find(m_customFormatSpecifiers.begin(), m_customFormatSpecifiers.end(), + formatSpecifier) != m_customFormatSpecifiers.end(); + } + + inline void installCustomFormatSpecifier(const CustomFormatSpecifier& customFormatSpecifier) { + if (hasCustomFormatSpecifier(customFormatSpecifier.formatSpecifier())) { + return; + } + base::threading::ScopedLock scopedLock(lock()); + m_customFormatSpecifiers.push_back(customFormatSpecifier); + } + + inline bool uninstallCustomFormatSpecifier(const char* formatSpecifier) { + base::threading::ScopedLock scopedLock(lock()); + std::vector::iterator it = std::find(m_customFormatSpecifiers.begin(), + m_customFormatSpecifiers.end(), formatSpecifier); + if (it != m_customFormatSpecifiers.end() && strcmp(formatSpecifier, it->formatSpecifier()) == 0) { + m_customFormatSpecifiers.erase(it); + return true; + } + return false; + } + + const std::vector* customFormatSpecifiers(void) const { + return &m_customFormatSpecifiers; + } + + inline void setLoggingLevel(Level level) { + m_loggingLevel = level; + } + + template + inline bool installLogDispatchCallback(const std::string& id) { + return installCallback(id, &m_logDispatchCallbacks); + } + + template + inline void uninstallLogDispatchCallback(const std::string& id) { + uninstallCallback(id, &m_logDispatchCallbacks); + } + template + inline T* logDispatchCallback(const std::string& id) { + return callback(id, &m_logDispatchCallbacks); + } + + template + inline bool installPerformanceTrackingCallback(const std::string& id) { + return installCallback(id, &m_performanceTrackingCallbacks); + } + + template + inline void uninstallPerformanceTrackingCallback(const std::string& id) { + uninstallCallback(id, &m_performanceTrackingCallbacks); + } + + template + inline T* performanceTrackingCallback(const std::string& id) { + return callback(id, &m_performanceTrackingCallbacks); + } +private: + base::RegisteredHitCounters* m_registeredHitCounters; + base::RegisteredLoggers* m_registeredLoggers; + base::type::EnumType m_flags; + base::VRegistry* m_vRegistry; +#if ELPP_ASYNC_LOGGING + base::AsyncLogQueue* m_asyncLogQueue; + base::IWorker* m_asyncDispatchWorker; +#endif // ELPP_ASYNC_LOGGING + base::utils::CommandLineArgs m_commandLineArgs; + PreRollOutCallback m_preRollOutCallback; + std::map m_logDispatchCallbacks; + std::map m_performanceTrackingCallbacks; + std::vector m_customFormatSpecifiers; + Level m_loggingLevel; + + friend class el::Helpers; + friend class el::base::DefaultLogDispatchCallback; + friend class el::LogBuilder; + friend class el::base::MessageBuilder; + friend class el::base::Writer; + friend class el::base::PerformanceTracker; + friend class el::base::LogDispatcher; + + void setApplicationArguments(int argc, char** argv) { + m_commandLineArgs.setArgs(argc, argv); + m_vRegistry->setFromArgs(commandLineArgs()); + // default log file +#if !defined(ELPP_DISABLE_LOG_FILE_FROM_ARG) + if (m_commandLineArgs.hasParamWithValue(base::consts::kDefaultLogFileParam)) { + Configurations c; + c.setGlobally(ConfigurationType::Filename, std::string(m_commandLineArgs.getParamValue(base::consts::kDefaultLogFileParam))); + registeredLoggers()->setDefaultConfigurations(c); + for (base::RegisteredLoggers::iterator it = registeredLoggers()->begin(); + it != registeredLoggers()->end(); ++it) { + it->second->configure(c); + } + } +#endif // !defined(ELPP_DISABLE_LOG_FILE_FROM_ARG) +#if defined(ELPP_LOGGING_FLAGS_FROM_ARG) + if (m_commandLineArgs.hasParamWithValue(base::consts::kLoggingFlagsParam)) { + m_flags = atoi(m_commandLineArgs.getParamValue(base::consts::kLoggingFlagsParam)); + } +#endif // defined(ELPP_LOGGING_FLAGS_FROM_ARG) + } + + inline void setApplicationArguments(int argc, const char** argv) { + setApplicationArguments(argc, const_cast(argv)); + } + + template + inline bool installCallback(const std::string& id, std::map* mapT) { + if (mapT->find(id) == mapT->end()) { + mapT->insert(std::make_pair(id, TPtr(new T()))); + return true; + } + return false; + } + + template + inline void uninstallCallback(const std::string& id, std::map* mapT) { + if (mapT->find(id) != mapT->end()) { + mapT->erase(id); + } + } + + template + inline T* callback(const std::string& id, std::map* mapT) { + typename std::map::iterator iter = mapT->find(id); + if (iter != mapT->end()) { + return static_cast(iter->second.get()); + } + return nullptr; + } +}; +extern ELPP_EXPORT base::type::StoragePointer elStorage; +#define ELPP el::base::elStorage +class DefaultLogDispatchCallback : public LogDispatchCallback { +protected: + void handle(const LogDispatchData* data) { + m_data = data; + dispatch(std::move(m_data->logMessage()->logger()->logBuilder()->build(m_data->logMessage(), + m_data->dispatchAction() == base::DispatchAction::NormalLog))); + } +private: + const LogDispatchData* m_data; + void dispatch(base::type::string_t&& logLine) { + if (m_data->dispatchAction() == base::DispatchAction::NormalLog) { + if (m_data->logMessage()->logger()->m_typedConfigurations->toFile(m_data->logMessage()->level())) { + base::type::fstream_t* fs = m_data->logMessage()->logger()->m_typedConfigurations->fileStream(m_data->logMessage()->level()); + if (fs != nullptr) { + fs->write(logLine.c_str(), logLine.size()); + if (fs->fail()) { + ELPP_INTERNAL_ERROR("Unable to write log to file [" + << m_data->logMessage()->logger()->m_typedConfigurations->filename(m_data->logMessage()->level()) << "].\n" + << "Few possible reasons (could be something else):\n" << " * Permission denied\n" + << " * Disk full\n" << " * Disk is not writable", true); + } else { + if (ELPP->hasFlag(LoggingFlag::ImmediateFlush) || (m_data->logMessage()->logger()->isFlushNeeded(m_data->logMessage()->level()))) { + m_data->logMessage()->logger()->flush(m_data->logMessage()->level(), fs); + } + } + } else { + ELPP_INTERNAL_ERROR("Log file for [" << LevelHelper::convertToString(m_data->logMessage()->level()) << "] " + << "has not been configured but [TO_FILE] is configured to TRUE. [Logger ID: " + << m_data->logMessage()->logger()->id() << "]", false); + } + } + if (m_data->logMessage()->logger()->m_typedConfigurations->toStandardOutput(m_data->logMessage()->level())) { + if (ELPP->hasFlag(LoggingFlag::ColoredTerminalOutput)) + m_data->logMessage()->logger()->logBuilder()->convertToColoredOutput(&logLine, m_data->logMessage()->level()); + ELPP_COUT << ELPP_COUT_LINE(logLine); + } + } +#if defined(ELPP_SYSLOG) + else if (m_data->dispatchAction() == base::DispatchAction::SysLog) { + // Determine syslog priority + int sysLogPriority = 0; + if (m_data->logMessage()->level() == Level::Fatal) + sysLogPriority = LOG_EMERG; + else if (m_data->logMessage()->level() == Level::Error) + sysLogPriority = LOG_ERR; + else if (m_data->logMessage()->level() == Level::Warning) + sysLogPriority = LOG_WARNING; + else if (m_data->logMessage()->level() == Level::Info) + sysLogPriority = LOG_INFO; + else if (m_data->logMessage()->level() == Level::Debug) + sysLogPriority = LOG_DEBUG; + else + sysLogPriority = LOG_NOTICE; +# if defined(ELPP_UNICODE) + char* line = base::utils::Str::wcharPtrToCharPtr(logLine.c_str()); + syslog(sysLogPriority, "%s", line); + free(line); +# else + syslog(sysLogPriority, "%s", logLine.c_str()); +# endif + } +#endif // defined(ELPP_SYSLOG) + } +}; +#if ELPP_ASYNC_LOGGING +class AsyncLogDispatchCallback : public LogDispatchCallback { +protected: + void handle(const LogDispatchData* data) { + base::type::string_t logLine = data->logMessage()->logger()->logBuilder()->build(data->logMessage(), data->dispatchAction() == base::DispatchAction::NormalLog); + if (data->dispatchAction() == base::DispatchAction::NormalLog && data->logMessage()->logger()->typedConfigurations()->toStandardOutput(data->logMessage()->level())) { + if (ELPP->hasFlag(LoggingFlag::ColoredTerminalOutput)) + data->logMessage()->logger()->logBuilder()->convertToColoredOutput(&logLine, data->logMessage()->level()); + ELPP_COUT << ELPP_COUT_LINE(logLine); + } + // Save resources and only queue if we want to write to file otherwise just ignore handler + if (data->logMessage()->logger()->typedConfigurations()->toFile(data->logMessage()->level())) { + ELPP->asyncLogQueue()->push(AsyncLogItem(*(data->logMessage()), *data, logLine)); + } + } +}; +class AsyncDispatchWorker : public base::IWorker, public base::threading::ThreadSafe { +public: + AsyncDispatchWorker() { + setContinueRunning(false); + } + + virtual ~AsyncDispatchWorker() { + setContinueRunning(false); + ELPP_INTERNAL_INFO(6, "Stopping dispatch worker - Cleaning log queue"); + clean(); + ELPP_INTERNAL_INFO(6, "Log queue cleaned"); + } + + inline bool clean() { + std::mutex m; + std::unique_lock lk(m); + cv.wait(lk, []{ return !ELPP->asyncLogQueue()->empty(); }); + emptyQueue(); + lk.unlock(); + cv.notify_one(); + return ELPP->asyncLogQueue()->empty(); + } + + inline void emptyQueue() { + while (!ELPP->asyncLogQueue()->empty()) { + AsyncLogItem data = ELPP->asyncLogQueue()->next(); + handle(&data); + base::threading::msleep(100); + } + } + + virtual inline void start() { + base::threading::msleep(5000); // Wait extra few seconds + setContinueRunning(true); + std::thread t1(&AsyncDispatchWorker::runner, this); + t1.join(); + } + + void handle(AsyncLogItem* logItem) { + LogDispatchData* data = logItem->data(); + LogMessage* logMessage = logItem->logMessage(); + Logger* logger = logMessage->logger(); + base::TypedConfigurations* conf = logger->typedConfigurations(); + base::type::string_t logLine = logItem->logLine(); + if (data->dispatchAction() == base::DispatchAction::NormalLog) { + if (conf->toFile(logMessage->level())) { + base::type::fstream_t* fs = conf->fileStream(logMessage->level()); + if (fs != nullptr) { + fs->write(logLine.c_str(), logLine.size()); + if (fs->fail()) { + ELPP_INTERNAL_ERROR("Unable to write log to file [" + << conf->filename(logMessage->level()) << "].\n" + << "Few possible reasons (could be something else):\n" << " * Permission denied\n" + << " * Disk full\n" << " * Disk is not writable", true); + } else { + if (ELPP->hasFlag(LoggingFlag::ImmediateFlush) || (logger->isFlushNeeded(logMessage->level()))) { + logger->flush(logMessage->level(), fs); + } + } + } else { + ELPP_INTERNAL_ERROR("Log file for [" << LevelHelper::convertToString(logMessage->level()) << "] " + << "has not been configured but [TO_FILE] is configured to TRUE. [Logger ID: " << logger->id() << "]", false); + } + } + } +# if defined(ELPP_SYSLOG) + else if (data->dispatchAction() == base::DispatchAction::SysLog) { + // Determine syslog priority + int sysLogPriority = 0; + if (logMessage->level() == Level::Fatal) + sysLogPriority = LOG_EMERG; + else if (logMessage->level() == Level::Error) + sysLogPriority = LOG_ERR; + else if (logMessage->level() == Level::Warning) + sysLogPriority = LOG_WARNING; + else if (logMessage->level() == Level::Info) + sysLogPriority = LOG_INFO; + else if (logMessage->level() == Level::Debug) + sysLogPriority = LOG_DEBUG; + else + sysLogPriority = LOG_NOTICE; +# if defined(ELPP_UNICODE) + char* line = base::utils::Str::wcharPtrToCharPtr(logLine.c_str()); + syslog(sysLogPriority, "%s", line); + free(line); +# else + syslog(sysLogPriority, "%s", logLine.c_str()); +# endif + } +# endif // defined(ELPP_SYSLOG) + } + + void run() { + while (continueRunning()) { + emptyQueue(); + base::threading::msleep(10); // 10ms + } + } + + static void* runner(void *context) { + static_cast(context)->run(); + return NULL; + } + + void setContinueRunning(bool value) { + base::threading::ScopedLock scopedLock(m_continueRunningMutex); + m_continueRunning = value; + } + bool continueRunning(void) { + return m_continueRunning; + } +private: + std::condition_variable cv; + bool m_continueRunning; + base::threading::Mutex m_continueRunningMutex; +}; +#endif // ELPP_ASYNC_LOGGING +} // namespace base +namespace base { +class DefaultLogBuilder : public LogBuilder { +public: + base::type::string_t build(const LogMessage* logMessage, bool appendNewLine) const { + base::TypedConfigurations* tc = logMessage->logger()->typedConfigurations(); + const base::LogFormat* logFormat = &tc->logFormat(logMessage->level()); + base::type::string_t logLine = logFormat->format(); + char buff[base::consts::kSourceFilenameMaxLength + base::consts::kSourceLineMaxLength] = ""; + const char* bufLim = buff + sizeof(buff); + if (logFormat->hasFlag(base::FormatFlags::AppName)) { + // App name + base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kAppNameFormatSpecifier, + logMessage->logger()->parentApplicationName()); + } + if (logFormat->hasFlag(base::FormatFlags::ThreadId)) { + // Thread ID + base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kThreadIdFormatSpecifier, + base::threading::getCurrentThreadId()); + } + if (logFormat->hasFlag(base::FormatFlags::DateTime)) { + // DateTime + base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kDateTimeFormatSpecifier, + base::utils::DateTime::getDateTime(logFormat->dateTimeFormat().c_str(), + &tc->millisecondsWidth(logMessage->level()))); + } + if (logFormat->hasFlag(base::FormatFlags::Function)) { + // Function + base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kLogFunctionFormatSpecifier, logMessage->func()); + } + if (logFormat->hasFlag(base::FormatFlags::File)) { + // File + char* buf = base::utils::Str::clearBuff(buff, base::consts::kSourceFilenameMaxLength); + base::utils::File::buildStrippedFilename(logMessage->file().c_str(), buff); + buf = base::utils::Str::addToBuff(buff, buf, bufLim); + base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kLogFileFormatSpecifier, std::string(buff)); + } + if (logFormat->hasFlag(base::FormatFlags::FileBase)) { + // FileBase + char* buf = base::utils::Str::clearBuff(buff, base::consts::kSourceFilenameMaxLength); + base::utils::File::buildBaseFilename(logMessage->file(), buff); + buf = base::utils::Str::addToBuff(buff, buf, bufLim); + base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kLogFileBaseFormatSpecifier, std::string(buff)); + } + if (logFormat->hasFlag(base::FormatFlags::Line)) { + // Line + char* buf = base::utils::Str::clearBuff(buff, base::consts::kSourceLineMaxLength); + buf = base::utils::Str::convertAndAddToBuff(logMessage->line(), + base::consts::kSourceLineMaxLength, buf, bufLim, false); + base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kLogLineFormatSpecifier, std::string(buff)); + } + if (logFormat->hasFlag(base::FormatFlags::Location)) { + // Location + char* buf = base::utils::Str::clearBuff(buff, + base::consts::kSourceFilenameMaxLength + base::consts::kSourceLineMaxLength); + base::utils::File::buildStrippedFilename(logMessage->file().c_str(), buff); + buf = base::utils::Str::addToBuff(buff, buf, bufLim); + buf = base::utils::Str::addToBuff(":", buf, bufLim); + buf = base::utils::Str::convertAndAddToBuff(logMessage->line(), + base::consts::kSourceLineMaxLength, buf, bufLim, false); + base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kLogLocationFormatSpecifier, std::string(buff)); + } + if (logMessage->level() == Level::Verbose && logFormat->hasFlag(base::FormatFlags::VerboseLevel)) { + // Verbose level + char* buf = base::utils::Str::clearBuff(buff, 1); + buf = base::utils::Str::convertAndAddToBuff(logMessage->verboseLevel(), 1, buf, bufLim, false); + base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kVerboseLevelFormatSpecifier, std::string(buff)); + } + if (logFormat->hasFlag(base::FormatFlags::LogMessage)) { + // Log message + base::utils::Str::replaceFirstWithEscape(logLine, base::consts::kMessageFormatSpecifier, logMessage->message()); + } +#if !defined(ELPP_DISABLE_CUSTOM_FORMAT_SPECIFIERS) + for (std::vector::const_iterator it = ELPP->customFormatSpecifiers()->begin(); + it != ELPP->customFormatSpecifiers()->end(); ++it) { + std::string fs(it->formatSpecifier()); + base::type::string_t wcsFormatSpecifier(fs.begin(), fs.end()); + base::utils::Str::replaceFirstWithEscape(logLine, wcsFormatSpecifier, std::string(it->resolver()())); + } +#endif // !defined(ELPP_DISABLE_CUSTOM_FORMAT_SPECIFIERS) + if (appendNewLine) logLine += ELPP_LITERAL("\n"); + return logLine; + } +}; +/// @brief Dispatches log messages +class LogDispatcher : base::NoCopy { +public: + LogDispatcher(bool proceed, LogMessage&& logMessage, base::DispatchAction dispatchAction) : + m_proceed(proceed), + m_logMessage(std::move(logMessage)), + m_dispatchAction(std::move(dispatchAction)) { + } + + void dispatch(void) { + if (m_proceed && m_dispatchAction == base::DispatchAction::None) { + m_proceed = false; + } + if (!m_proceed) { + return; + } + // We minimize the time of ELPP's lock - this lock is released after log is written + base::threading::ScopedLock scopedLock(ELPP->lock()); + base::TypedConfigurations* tc = m_logMessage.logger()->m_typedConfigurations; + if (ELPP->hasFlag(LoggingFlag::StrictLogFileSizeCheck)) { + tc->validateFileRolling(m_logMessage.level(), ELPP->preRollOutCallback()); + } + LogDispatchCallback* callback = nullptr; + LogDispatchData data; + for (const std::pair& h + : ELPP->m_logDispatchCallbacks) { + callback = h.second.get(); + if (callback != nullptr && callback->enabled()) { + data.setLogMessage(&m_logMessage); + data.setDispatchAction(m_dispatchAction); + callback->acquireLock(); + callback->handle(&data); + callback->releaseLock(); + } + } + } + +private: + bool m_proceed; + LogMessage m_logMessage; + base::DispatchAction m_dispatchAction; +}; +#if defined(ELPP_STL_LOGGING) +/// @brief Workarounds to write some STL logs +/// +/// @detail There is workaround needed to loop through some stl containers. In order to do that, we need iterable containers +/// of same type and provide iterator interface and pass it on to writeIterator(). +/// Remember, this is passed by value in constructor so that we dont change original containers. +/// This operation is as expensive as Big-O(std::min(class_.size(), base::consts::kMaxLogPerContainer)) +namespace workarounds { +/// @brief Abstract IterableContainer template that provides interface for iterable classes of type T +template +class IterableContainer { +public: + typedef typename Container::iterator iterator; + typedef typename Container::const_iterator const_iterator; + IterableContainer(void) {} + virtual ~IterableContainer(void) {} + iterator begin(void) { return getContainer().begin(); } + iterator end(void) { return getContainer().end(); } +private: + virtual Container& getContainer(void) = 0; +}; +/// @brief Implements IterableContainer and provides iterable std::priority_queue class +template, typename Comparator = std::less> +class IterablePriorityQueue : public IterableContainer, public std::priority_queue { +public: + IterablePriorityQueue(std::priority_queue queue_) { + std::size_t count_ = 0; + while (++count_ < base::consts::kMaxLogPerContainer && !queue_.empty()) { + this->push(queue_.top()); + queue_.pop(); + } + } +private: + inline Container& getContainer(void) { + return this->c; + } +}; +/// @brief Implements IterableContainer and provides iterable std::queue class +template> +class IterableQueue : public IterableContainer, public std::queue { +public: + IterableQueue(std::queue queue_) { + std::size_t count_ = 0; + while (++count_ < base::consts::kMaxLogPerContainer && !queue_.empty()) { + this->push(queue_.front()); + queue_.pop(); + } + } +private: + inline Container& getContainer(void) { + return this->c; + } +}; +/// @brief Implements IterableContainer and provides iterable std::stack class +template> +class IterableStack : public IterableContainer, public std::stack { +public: + IterableStack(std::stack stack_) { + std::size_t count_ = 0; + while (++count_ < base::consts::kMaxLogPerContainer && !stack_.empty()) { + this->push(stack_.top()); + stack_.pop(); + } + } +private: + inline Container& getContainer(void) { + return this->c; + } +}; +} // namespace workarounds +#endif // defined(ELPP_STL_LOGGING) +// Log message builder +class MessageBuilder { +public: + MessageBuilder(void) : m_logger(nullptr), m_containerLogSeperator(ELPP_LITERAL("")) {} + void initialize(Logger* logger) { + m_logger = logger; + m_containerLogSeperator = ELPP->hasFlag(LoggingFlag::NewLineForContainer) ? + ELPP_LITERAL("\n ") : ELPP_LITERAL(", "); + } + +# define ELPP_SIMPLE_LOG(LOG_TYPE)\ + inline MessageBuilder& operator<<(LOG_TYPE msg) {\ + m_logger->stream() << msg;\ + if (ELPP->hasFlag(LoggingFlag::AutoSpacing)) {\ + m_logger->stream() << " ";\ + }\ + return *this;\ + } + + inline MessageBuilder& operator<<(const std::string& msg) { + return operator<<(msg.c_str()); + } + ELPP_SIMPLE_LOG(char) + ELPP_SIMPLE_LOG(bool) + ELPP_SIMPLE_LOG(signed short) + ELPP_SIMPLE_LOG(unsigned short) + ELPP_SIMPLE_LOG(signed int) + ELPP_SIMPLE_LOG(unsigned int) + ELPP_SIMPLE_LOG(signed long) + ELPP_SIMPLE_LOG(unsigned long) + ELPP_SIMPLE_LOG(float) + ELPP_SIMPLE_LOG(double) + ELPP_SIMPLE_LOG(char*) + ELPP_SIMPLE_LOG(const char*) + ELPP_SIMPLE_LOG(const void*) + ELPP_SIMPLE_LOG(long double) + inline MessageBuilder& operator<<(const std::wstring& msg) { + return operator<<(msg.c_str()); + } + inline MessageBuilder& operator<<(const wchar_t* msg) { + if (msg == nullptr) { + m_logger->stream() << base::consts::kNullPointer; + return *this; + } +# if defined(ELPP_UNICODE) + m_logger->stream() << msg; +# else + char* buff_ = base::utils::Str::wcharPtrToCharPtr(msg); + m_logger->stream() << buff_; + free(buff_); +# endif + if (ELPP->hasFlag(LoggingFlag::AutoSpacing)) { + m_logger->stream() << " "; + } + return *this; + } + // ostream manipulators + inline MessageBuilder& operator<<(std::ostream& (*OStreamMani)(std::ostream&)) { + m_logger->stream() << OStreamMani; + return *this; + } +#define ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(temp) \ + template \ + inline MessageBuilder& operator<<(const temp& template_inst) { \ + return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size()); \ + } +#define ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(temp) \ + template \ + inline MessageBuilder& operator<<(const temp& template_inst) { \ + return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size()); \ + } +#define ELPP_ITERATOR_CONTAINER_LOG_THREE_ARG(temp) \ + template \ + inline MessageBuilder& operator<<(const temp& template_inst) { \ + return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size()); \ + } +#define ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(temp) \ + template \ + inline MessageBuilder& operator<<(const temp& template_inst) { \ + return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size()); \ + } +#define ELPP_ITERATOR_CONTAINER_LOG_FIVE_ARG(temp) \ + template \ + inline MessageBuilder& operator<<(const temp& template_inst) { \ + return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size()); \ + } + +#if defined(ELPP_STL_LOGGING) + ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(std::vector) + ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(std::list) + ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(std::deque) + ELPP_ITERATOR_CONTAINER_LOG_THREE_ARG(std::set) + ELPP_ITERATOR_CONTAINER_LOG_THREE_ARG(std::multiset) + ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(std::map) + ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(std::multimap) + template + inline MessageBuilder& operator<<(const std::queue& queue_) { + base::workarounds::IterableQueue iterableQueue_ = + static_cast >(queue_); + return writeIterator(iterableQueue_.begin(), iterableQueue_.end(), iterableQueue_.size()); + } + template + inline MessageBuilder& operator<<(const std::stack& stack_) { + base::workarounds::IterableStack iterableStack_ = + static_cast >(stack_); + return writeIterator(iterableStack_.begin(), iterableStack_.end(), iterableStack_.size()); + } + template + inline MessageBuilder& operator<<(const std::priority_queue& priorityQueue_) { + base::workarounds::IterablePriorityQueue iterablePriorityQueue_ = + static_cast >(priorityQueue_); + return writeIterator(iterablePriorityQueue_.begin(), iterablePriorityQueue_.end(), iterablePriorityQueue_.size()); + } + template + inline MessageBuilder& operator<<(const std::pair& pair_) { + m_logger->stream() << ELPP_LITERAL("("); + operator << (static_cast(pair_.first)); + m_logger->stream() << ELPP_LITERAL(", "); + operator << (static_cast(pair_.second)); + m_logger->stream() << ELPP_LITERAL(")"); + return *this; + } + template + inline MessageBuilder& operator<<(const std::bitset& bitset_) { + m_logger->stream() << ELPP_LITERAL("["); + operator << (bitset_.to_string()); + m_logger->stream() << ELPP_LITERAL("]"); + return *this; + } +# if defined(ELPP_LOG_STD_ARRAY) + template + inline MessageBuilder& operator<<(const std::array& array) { + return writeIterator(array.begin(), array.end(), array.size()); + } +# endif // defined(ELPP_LOG_STD_ARRAY) +# if defined(ELPP_LOG_UNORDERED_MAP) + ELPP_ITERATOR_CONTAINER_LOG_FIVE_ARG(std::unordered_map) + ELPP_ITERATOR_CONTAINER_LOG_FIVE_ARG(std::unordered_multimap) +# endif // defined(ELPP_LOG_UNORDERED_MAP) +# if defined(ELPP_LOG_UNORDERED_SET) + ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(std::unordered_set) + ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(std::unordered_multiset) +# endif // defined(ELPP_LOG_UNORDERED_SET) +#endif // defined(ELPP_STL_LOGGING) +#if defined(ELPP_QT_LOGGING) + inline MessageBuilder& operator<<(const QString& msg) { +# if defined(ELPP_UNICODE) + m_logger->stream() << msg.toStdWString(); +# else + m_logger->stream() << msg.toStdString(); +# endif // defined(ELPP_UNICODE) + return *this; + } + inline MessageBuilder& operator<<(const QByteArray& msg) { + return operator << (QString(msg)); + } + inline MessageBuilder& operator<<(const QStringRef& msg) { + return operator<<(msg.toString()); + } + inline MessageBuilder& operator<<(qint64 msg) { +# if defined(ELPP_UNICODE) + m_logger->stream() << QString::number(msg).toStdWString(); +# else + m_logger->stream() << QString::number(msg).toStdString(); +# endif // defined(ELPP_UNICODE) + return *this; + } + inline MessageBuilder& operator<<(quint64 msg) { +# if defined(ELPP_UNICODE) + m_logger->stream() << QString::number(msg).toStdWString(); +# else + m_logger->stream() << QString::number(msg).toStdString(); +# endif // defined(ELPP_UNICODE) + return *this; + } + inline MessageBuilder& operator<<(QChar msg) { + m_logger->stream() << msg.toLatin1(); + return *this; + } + inline MessageBuilder& operator<<(const QLatin1String& msg) { + m_logger->stream() << msg.latin1(); + return *this; + } + ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(QList) + ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(QVector) + ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(QQueue) + ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(QSet) + ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(QLinkedList) + ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(QStack) + template + inline MessageBuilder& operator<<(const QPair& pair_) { + m_logger->stream() << ELPP_LITERAL("("); + operator << (static_cast(pair_.first)); + m_logger->stream() << ELPP_LITERAL(", "); + operator << (static_cast(pair_.second)); + m_logger->stream() << ELPP_LITERAL(")"); + return *this; + } + template + inline MessageBuilder& operator<<(const QMap& map_) { + m_logger->stream() << ELPP_LITERAL("["); + QList keys = map_.keys(); + typename QList::const_iterator begin = keys.begin(); + typename QList::const_iterator end = keys.end(); + int max_ = static_cast(base::consts::kMaxLogPerContainer); // to prevent warning + for (int index_ = 0; begin != end && index_ < max_; ++index_, ++begin) { + m_logger->stream() << ELPP_LITERAL("("); + operator << (static_cast(*begin)); + m_logger->stream() << ELPP_LITERAL(", "); + operator << (static_cast(map_.value(*begin))); + m_logger->stream() << ELPP_LITERAL(")"); + m_logger->stream() << ((index_ < keys.size() -1) ? m_containerLogSeperator : ELPP_LITERAL("")); + } + if (begin != end) { + m_logger->stream() << ELPP_LITERAL("..."); + } + m_logger->stream() << ELPP_LITERAL("]"); + return *this; + } + template + inline MessageBuilder& operator<<(const QMultiMap& map_) { + operator << (static_cast>(map_)); + return *this; + } + template + inline MessageBuilder& operator<<(const QHash& hash_) { + m_logger->stream() << ELPP_LITERAL("["); + QList keys = hash_.keys(); + typename QList::const_iterator begin = keys.begin(); + typename QList::const_iterator end = keys.end(); + int max_ = static_cast(base::consts::kMaxLogPerContainer); // prevent type warning + for (int index_ = 0; begin != end && index_ < max_; ++index_, ++begin) { + m_logger->stream() << ELPP_LITERAL("("); + operator << (static_cast(*begin)); + m_logger->stream() << ELPP_LITERAL(", "); + operator << (static_cast(hash_.value(*begin))); + m_logger->stream() << ELPP_LITERAL(")"); + m_logger->stream() << ((index_ < keys.size() -1) ? m_containerLogSeperator : ELPP_LITERAL("")); + } + if (begin != end) { + m_logger->stream() << ELPP_LITERAL("..."); + } + m_logger->stream() << ELPP_LITERAL("]"); + return *this; + } + template + inline MessageBuilder& operator<<(const QMultiHash& multiHash_) { + operator << (static_cast>(multiHash_)); + return *this; + } +#endif // defined(ELPP_QT_LOGGING) +#if defined(ELPP_BOOST_LOGGING) + ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(boost::container::vector) + ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(boost::container::stable_vector) + ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(boost::container::list) + ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(boost::container::deque) + ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(boost::container::map) + ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(boost::container::flat_map) + ELPP_ITERATOR_CONTAINER_LOG_THREE_ARG(boost::container::set) + ELPP_ITERATOR_CONTAINER_LOG_THREE_ARG(boost::container::flat_set) +#endif // defined(ELPP_BOOST_LOGGING) + +/// @brief Macro used internally that can be used externally to make containers easylogging++ friendly +/// +/// @detail This macro expands to write an ostream& operator<< for container. This container is expected to +/// have begin() and end() methods that return respective iterators +/// @param ContainerType Type of container e.g, MyList from WX_DECLARE_LIST(int, MyList); in wxwidgets +/// @param SizeMethod Method used to get size of container. +/// @param ElementInstance Instance of element to be fed out. Insance name is "elem". See WXELPP_ENABLED macro +/// for an example usage +#define MAKE_CONTAINERELPP_FRIENDLY(ContainerType, SizeMethod, ElementInstance) \ + el::base::type::ostream_t& operator<<(el::base::type::ostream_t& ss, const ContainerType& container) {\ + const el::base::type::char_t* sep = ELPP->hasFlag(el::LoggingFlag::NewLineForContainer) ? \ + ELPP_LITERAL("\n ") : ELPP_LITERAL(", ");\ + ContainerType::const_iterator elem = container.begin();\ + ContainerType::const_iterator endElem = container.end();\ + std::size_t size_ = container.SizeMethod; \ + ss << ELPP_LITERAL("[");\ + for (std::size_t i = 0; elem != endElem && i < el::base::consts::kMaxLogPerContainer; ++i, ++elem) { \ + ss << ElementInstance;\ + ss << ((i < size_ - 1) ? sep : ELPP_LITERAL(""));\ + }\ + if (elem != endElem) {\ + ss << ELPP_LITERAL("...");\ + }\ + ss << ELPP_LITERAL("]");\ + return ss;\ + } +#if defined(ELPP_WXWIDGETS_LOGGING) + ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(wxVector) +# define ELPP_WX_PTR_ENABLED(ContainerType) MAKE_CONTAINERELPP_FRIENDLY(ContainerType, size(), *(*elem)) +# define ELPP_WX_ENABLED(ContainerType) MAKE_CONTAINERELPP_FRIENDLY(ContainerType, size(), (*elem)) +# define ELPP_WX_HASH_MAP_ENABLED(ContainerType) MAKE_CONTAINERELPP_FRIENDLY(ContainerType, size(), \ + ELPP_LITERAL("(") << elem->first << ELPP_LITERAL(", ") << elem->second << ELPP_LITERAL(")") +#else +# define ELPP_WX_PTR_ENABLED(ContainerType) +# define ELPP_WX_ENABLED(ContainerType) +# define ELPP_WX_HASH_MAP_ENABLED(ContainerType) +#endif // defined(ELPP_WXWIDGETS_LOGGING) + // Other classes + template + ELPP_SIMPLE_LOG(const Class&) +#undef ELPP_SIMPLE_LOG +#undef ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG +#undef ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG +#undef ELPP_ITERATOR_CONTAINER_LOG_THREE_ARG +#undef ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG +#undef ELPP_ITERATOR_CONTAINER_LOG_FIVE_ARG +private: + Logger* m_logger; + const base::type::char_t* m_containerLogSeperator; + + template + inline MessageBuilder& writeIterator(Iterator begin_, Iterator end_, std::size_t size_) { + m_logger->stream() << ELPP_LITERAL("["); + for (std::size_t i = 0; begin_ != end_ && i < base::consts::kMaxLogPerContainer; ++i, ++begin_) { + operator << (*begin_); + m_logger->stream() << ((i < size_ - 1) ? m_containerLogSeperator : ELPP_LITERAL("")); + } + if (begin_ != end_) { + m_logger->stream() << ELPP_LITERAL("..."); + } + m_logger->stream() << ELPP_LITERAL("]"); + if (ELPP->hasFlag(LoggingFlag::AutoSpacing)) { + m_logger->stream() << " "; + } + return *this; + } +}; +/// @brief Writes nothing - Used when certain log is disabled +class NullWriter : base::NoCopy { +public: + NullWriter(void) {} + + // Null manipulator + inline NullWriter& operator<<(std::ostream& (*)(std::ostream&)) { + return *this; + } + + template + inline NullWriter& operator<<(const T&) { + return *this; + } +}; +/// @brief Main entry point of each logging +class Writer : base::NoCopy { +public: + Writer(Level level, const char* file, unsigned long int line, + const char* func, base::DispatchAction dispatchAction = base::DispatchAction::NormalLog, + base::type::VerboseLevel verboseLevel = 0) : + m_level(level), m_file(file), m_line(line), m_func(func), m_verboseLevel(verboseLevel), + m_proceed(false), m_dispatchAction(dispatchAction) { + } + + virtual ~Writer(void) { + processDispatch(); + } + + template + inline Writer& operator<<(const T& log) { +#if ELPP_LOGGING_ENABLED + if (m_proceed) { + m_messageBuilder << log; + } +#endif // ELPP_LOGGING_ENABLED + return *this; + } + + inline Writer& operator<<(std::ostream& (*log)(std::ostream&)) { +#if ELPP_LOGGING_ENABLED + if (m_proceed) { + m_messageBuilder << log; + } +#endif // ELPP_LOGGING_ENABLED + return *this; + } + + Writer& construct(Logger* logger, bool needLock = true) { + m_logger = logger; + initializeLogger(logger->id(), false, needLock); + m_messageBuilder.initialize(m_logger); + return *this; + } + + Writer& construct(int count, const char* loggerIds, ...) { + if (ELPP->hasFlag(LoggingFlag::MultiLoggerSupport)) { + va_list loggersList; + va_start(loggersList, loggerIds); + const char* id = loggerIds; + for (int i = 0; i < count; ++i) { + m_loggerIds.push_back(std::string(id)); + id = va_arg(loggersList, const char*); + } + va_end(loggersList); + initializeLogger(m_loggerIds.at(0)); + } else { + initializeLogger(std::string(loggerIds)); + } + m_messageBuilder.initialize(m_logger); + return *this; + } +protected: + Level m_level; + const char* m_file; + const unsigned long int m_line; + const char* m_func; + base::type::VerboseLevel m_verboseLevel; + Logger* m_logger; + bool m_proceed; + base::MessageBuilder m_messageBuilder; + base::DispatchAction m_dispatchAction; + std::vector m_loggerIds; + friend class el::Helpers; + + void initializeLogger(const std::string& loggerId, bool lookup = true, bool needLock = true) { + if (lookup) { + m_logger = ELPP->registeredLoggers()->get(loggerId, ELPP->hasFlag(LoggingFlag::CreateLoggerAutomatically)); + } + if (m_logger == nullptr) { + ELPP->acquireLock(); + if (!ELPP->registeredLoggers()->has(std::string(base::consts::kDefaultLoggerId))) { + // Somehow default logger has been unregistered. Not good! Register again + ELPP->registeredLoggers()->get(std::string(base::consts::kDefaultLoggerId)); + } + ELPP->releaseLock(); // Need to unlock it for next writer + Writer(Level::Debug, m_file, m_line, m_func).construct(1, base::consts::kDefaultLoggerId) + << "Logger [" << loggerId << "] is not registered yet!"; + m_proceed = false; + } else { + if (needLock) { + m_logger->acquireLock(); // This should not be unlocked by checking m_proceed because + // m_proceed can be changed by lines below + } + if (ELPP->hasFlag(LoggingFlag::HierarchicalLogging)) { + m_proceed = m_level == Level::Verbose ? m_logger->enabled(m_level) : + LevelHelper::castToInt(m_level) >= LevelHelper::castToInt(ELPP->m_loggingLevel); + } else { + m_proceed = m_logger->enabled(m_level); + } + } + } + + void processDispatch() { +#if ELPP_LOGGING_ENABLED + if (ELPP->hasFlag(LoggingFlag::MultiLoggerSupport)) { + bool firstDispatched = false; + base::type::string_t logMessage; + std::size_t i = 0; + do { + if (m_proceed) { + if (firstDispatched) { + m_logger->stream() << logMessage; + } else { + firstDispatched = true; + if (m_loggerIds.size() > 1) { + logMessage = m_logger->stream().str(); + } + } + triggerDispatch(); + } else if (m_logger != nullptr) { + m_logger->stream().str(ELPP_LITERAL("")); + m_logger->releaseLock(); + } + if (i + 1 < m_loggerIds.size()) { + initializeLogger(m_loggerIds.at(i + 1)); + } + } while (++i < m_loggerIds.size()); + } else { + if (m_proceed) { + triggerDispatch(); + } else if (m_logger != nullptr) { + m_logger->stream().str(ELPP_LITERAL("")); + m_logger->releaseLock(); + } + } +#else + if (m_logger != nullptr) { + m_logger->stream().str(ELPP_LITERAL("")); + m_logger->releaseLock(); + } +#endif // ELPP_LOGGING_ENABLED + } + + void triggerDispatch(void) { + if (m_proceed) { + base::LogDispatcher(m_proceed, LogMessage(m_level, m_file, m_line, m_func, m_verboseLevel, + m_logger), m_dispatchAction).dispatch(); + } + if (m_logger != nullptr) { + m_logger->stream().str(ELPP_LITERAL("")); + m_logger->releaseLock(); + } + if (m_proceed && m_level == Level::Fatal + && !ELPP->hasFlag(LoggingFlag::DisableApplicationAbortOnFatalLog)) { + base::Writer(Level::Warning, m_file, m_line, m_func).construct(1, base::consts::kDefaultLoggerId) + << "Aborting application. Reason: Fatal log at [" << m_file << ":" << m_line << "]"; + std::stringstream reasonStream; + reasonStream << "Fatal log at [" << m_file << ":" << m_line << "]" + << " If you wish to disable 'abort on fatal log' please use " + << "el::Helpers::addFlag(el::LoggingFlag::DisableApplicationAbortOnFatalLog)"; + base::utils::abort(1, reasonStream.str()); + } + m_proceed = false; + } +}; +class PErrorWriter : public base::Writer { +public: + PErrorWriter(Level level, const char* file, unsigned long int line, + const char* func, base::DispatchAction dispatchAction = base::DispatchAction::NormalLog, + base::type::VerboseLevel verboseLevel = 0) : + base::Writer(level, file, line, func, dispatchAction, verboseLevel) { + } + + virtual ~PErrorWriter(void) { + if (m_proceed) { +#if ELPP_COMPILER_MSVC + char buff[256]; + strerror_s(buff, 256, errno); + m_logger->stream() << ": " << buff << " [" << errno << "]"; +#else + m_logger->stream() << ": " << strerror(errno) << " [" << errno << "]"; +#endif + } + } +}; +} // namespace base +// Logging from Logger class. Why this is here? Because we have Storage and Writer class available +#if ELPP_VARIADIC_TEMPLATES_SUPPORTED + template + void Logger::log_(Level level, int vlevel, const char* s, const T& value, const Args&... args) { + base::MessageBuilder b; + b.initialize(this); + while (*s) { + if (*s == base::consts::kFormatSpecifierChar) { + if (*(s + 1) == base::consts::kFormatSpecifierChar) { + ++s; + } else { + if (*(s + 1) == base::consts::kFormatSpecifierCharValue) { + ++s; + b << value; + log_(level, vlevel, ++s, args...); + return; + } + } + } + b << *s++; + } + ELPP_INTERNAL_ERROR("Too many arguments provided. Unable to handle. Please provide more format specifiers", false); + } + template + inline void Logger::log_(Level level, int vlevel, const T& log) { + if (level == Level::Verbose) { + if (ELPP->vRegistry()->allowed(vlevel, __FILE__)) { + base::Writer(Level::Verbose, "FILE", 0, "FUNCTION", + base::DispatchAction::NormalLog, vlevel).construct(this, false) << log; + } else { + stream().str(ELPP_LITERAL("")); + } + } else { + base::Writer(level, "FILE", 0, "FUNCTION").construct(this, false) << log; + } + } + template + void Logger::log(Level level, const char* s, const T& value, const Args&... args) { + base::threading::ScopedLock scopedLock(lock()); + log_(level, 0, s, value, args...); + } + template + inline void Logger::log(Level level, const T& log) { + base::threading::ScopedLock scopedLock(lock()); + log_(level, 0, log); + } +# if ELPP_VERBOSE_LOG + template + inline void Logger::verbose(int vlevel, const char* s, const T& value, const Args&... args) { + base::threading::ScopedLock scopedLock(lock()); + log_(el::Level::Verbose, vlevel, s, value, args...); + } + template + inline void Logger::verbose(int vlevel, const T& log) { + base::threading::ScopedLock scopedLock(lock()); + log_(el::Level::Verbose, vlevel, log); + } +# else + template + inline void Logger::verbose(int, const char*, const T&, const Args&...) { + return; + } + template + inline void Logger::verbose(int, const T&) { + return; + } +# endif // ELPP_VERBOSE_LOG +# define LOGGER_LEVEL_WRITERS(FUNCTION_NAME, LOG_LEVEL)\ + template \ + inline void Logger::FUNCTION_NAME(const char* s, const T& value, const Args&... args) {\ + log(LOG_LEVEL, s, value, args...);\ + }\ + template \ + inline void Logger::FUNCTION_NAME(const T& value) {\ + log(LOG_LEVEL, value);\ + } +# define LOGGER_LEVEL_WRITERS_DISABLED(FUNCTION_NAME, LOG_LEVEL)\ + template \ + inline void Logger::FUNCTION_NAME(const char*, const T&, const Args&...) {\ + return;\ + }\ + template \ + inline void Logger::FUNCTION_NAME(const T&) {\ + return;\ + } + +# if ELPP_INFO_LOG + LOGGER_LEVEL_WRITERS(info, Level::Info) +# else + LOGGER_LEVEL_WRITERS_DISABLED(info, Level::Info) +# endif // ELPP_INFO_LOG +# if ELPP_DEBUG_LOG + LOGGER_LEVEL_WRITERS(debug, Level::Debug) +# else + LOGGER_LEVEL_WRITERS_DISABLED(debug, Level::Debug) +# endif // ELPP_DEBUG_LOG +# if ELPP_WARNING_LOG + LOGGER_LEVEL_WRITERS(warn, Level::Warning) +# else + LOGGER_LEVEL_WRITERS_DISABLED(warn, Level::Warning) +# endif // ELPP_WARNING_LOG +# if ELPP_ERROR_LOG + LOGGER_LEVEL_WRITERS(error, Level::Error) +# else + LOGGER_LEVEL_WRITERS_DISABLED(error, Level::Error) +# endif // ELPP_ERROR_LOG +# if ELPP_FATAL_LOG + LOGGER_LEVEL_WRITERS(fatal, Level::Fatal) +# else + LOGGER_LEVEL_WRITERS_DISABLED(fatal, Level::Fatal) +# endif // ELPP_FATAL_LOG +# if ELPP_TRACE_LOG + LOGGER_LEVEL_WRITERS(trace, Level::Trace) +# else + LOGGER_LEVEL_WRITERS_DISABLED(trace, Level::Trace) +# endif // ELPP_TRACE_LOG +# undef LOGGER_LEVEL_WRITERS +# undef LOGGER_LEVEL_WRITERS_DISABLED +#endif // ELPP_VARIADIC_TEMPLATES_SUPPORTED +#if ELPP_COMPILER_MSVC +# define ELPP_VARIADIC_FUNC_MSVC(variadicFunction, variadicArgs) variadicFunction variadicArgs +# define ELPP_VARIADIC_FUNC_MSVC_RUN(variadicFunction, ...) ELPP_VARIADIC_FUNC_MSVC(variadicFunction, (__VA_ARGS__)) +# define el_getVALength(...) ELPP_VARIADIC_FUNC_MSVC_RUN(el_resolveVALength, 0, ## __VA_ARGS__,\ + 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) +#else +# if ELPP_COMPILER_CLANG +# define el_getVALength(...) el_resolveVALength(0, __VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) +# else +# define el_getVALength(...) el_resolveVALength(0, ## __VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) +# endif // ELPP_COMPILER_CLANG +#endif // ELPP_COMPILER_MSVC +#define el_resolveVALength(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N +#define ELPP_WRITE_LOG(writer, level, dispatchAction, ...) \ + writer(level, __FILE__, __LINE__, ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__) +#define ELPP_WRITE_LOG_IF(writer, condition, level, dispatchAction, ...) if (condition) \ + writer(level, __FILE__, __LINE__, ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__) +#define ELPP_WRITE_LOG_EVERY_N(writer, occasion, level, dispatchAction, ...) \ + if (ELPP->validateEveryNCounter(__FILE__, __LINE__, occasion)) \ + writer(level, __FILE__, __LINE__, ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__) +#define ELPP_WRITE_LOG_AFTER_N(writer, n, level, dispatchAction, ...) \ + if (ELPP->validateAfterNCounter(__FILE__, __LINE__, n)) \ + writer(level, __FILE__, __LINE__, ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__) +#define ELPP_WRITE_LOG_N_TIMES(writer, n, level, dispatchAction, ...) \ + if (ELPP->validateNTimesCounter(__FILE__, __LINE__, n)) \ + writer(level, __FILE__, __LINE__, ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__) +#undef ELPP_CURR_FILE_PERFORMANCE_LOGGER +#if defined(ELPP_PERFORMANCE_LOGGER) +# define ELPP_CURR_FILE_PERFORMANCE_LOGGER ELPP_PERFORMANCE_LOGGER +#else +# define ELPP_CURR_FILE_PERFORMANCE_LOGGER el::base::consts::kPerformanceLoggerId +#endif +class PerformanceTrackingData { +public: + enum class DataType : base::type::EnumType { + Checkpoint = 1, Complete = 2 + }; + // Do not use constructor, will run into multiple definition error, use init(PerformanceTracker*) + explicit PerformanceTrackingData(DataType dataType) : m_performanceTracker(nullptr), + m_dataType(dataType), m_file(""), m_line(0), m_func("") {} + inline const std::string* blockName(void) const; + inline const struct timeval* startTime(void) const; + inline const struct timeval* endTime(void) const; + inline const struct timeval* lastCheckpointTime(void) const; + inline const base::PerformanceTracker* performanceTracker(void) const { return m_performanceTracker; } + inline PerformanceTrackingData::DataType dataType(void) const { return m_dataType; } + inline bool firstCheckpoint(void) const { return m_firstCheckpoint; } + inline std::string checkpointId(void) const { return m_checkpointId; } + inline const char* file(void) const { return m_file; } + inline unsigned long int line(void) const { return m_line; } + inline const char* func(void) const { return m_func; } + inline const base::type::string_t* formattedTimeTaken() const { return &m_formattedTimeTaken; } + inline const std::string& loggerId(void) const; +private: + base::PerformanceTracker* m_performanceTracker; + base::type::string_t m_formattedTimeTaken; + PerformanceTrackingData::DataType m_dataType; + bool m_firstCheckpoint; + std::string m_checkpointId; + const char* m_file; + unsigned long int m_line; + const char* m_func; + inline void init(base::PerformanceTracker* performanceTracker, bool firstCheckpoint = false) { + m_performanceTracker = performanceTracker; + m_firstCheckpoint = firstCheckpoint; + } + + friend class el::base::PerformanceTracker; +}; +namespace base { +/// @brief Represents performanceTracker block of code that conditionally adds performance status to log +/// either when goes outside the scope of when checkpoint() is called +class PerformanceTracker : public base::threading::ThreadSafe, public Loggable { +public: + PerformanceTracker(const std::string& blockName, + base::TimestampUnit timestampUnit = base::TimestampUnit::Millisecond, + const std::string& loggerId = std::string(ELPP_CURR_FILE_PERFORMANCE_LOGGER), + bool scopedLog = true, Level level = base::consts::kPerformanceTrackerDefaultLevel) : + m_blockName(blockName), m_timestampUnit(timestampUnit), m_loggerId(loggerId), m_scopedLog(scopedLog), + m_level(level), m_hasChecked(false), m_lastCheckpointId(std::string()), m_enabled(false) { +#if !defined(ELPP_DISABLE_PERFORMANCE_TRACKING) && ELPP_LOGGING_ENABLED + // We store it locally so that if user happen to change configuration by the end of scope + // or before calling checkpoint, we still depend on state of configuraton at time of construction + el::Logger* loggerPtr = ELPP->registeredLoggers()->get(loggerId, false); + m_enabled = loggerPtr != nullptr && loggerPtr->m_typedConfigurations->performanceTracking(m_level); + if (m_enabled) { + base::utils::DateTime::gettimeofday(&m_startTime); + } +#endif // !defined(ELPP_DISABLE_PERFORMANCE_TRACKING) && ELPP_LOGGING_ENABLED + } + /// @brief Copy constructor + PerformanceTracker(const PerformanceTracker& t) : + m_blockName(t.m_blockName), m_timestampUnit(t.m_timestampUnit), m_loggerId(t.m_loggerId), m_scopedLog(t.m_scopedLog), + m_level(t.m_level), m_hasChecked(t.m_hasChecked), m_lastCheckpointId(t.m_lastCheckpointId), m_enabled(t.m_enabled), + m_startTime(t.m_startTime), m_endTime(t.m_endTime), m_lastCheckpointTime(t.m_lastCheckpointTime) { + } + virtual ~PerformanceTracker(void) { +#if !defined(ELPP_DISABLE_PERFORMANCE_TRACKING) && ELPP_LOGGING_ENABLED + if (m_enabled) { + base::threading::ScopedLock scopedLock(lock()); + if (m_scopedLog) { + base::utils::DateTime::gettimeofday(&m_endTime); + base::type::string_t formattedTime = getFormattedTimeTaken(); + PerformanceTrackingData data(PerformanceTrackingData::DataType::Complete); + data.init(this); + data.m_formattedTimeTaken = formattedTime; + PerformanceTrackingCallback* callback = nullptr; + for (const std::pair& h + : ELPP->m_performanceTrackingCallbacks) { + callback = h.second.get(); + if (callback != nullptr && callback->enabled()) { + callback->acquireLock(); + callback->handle(&data); + callback->releaseLock(); + } + } + } + } +#endif // !defined(ELPP_DISABLE_PERFORMANCE_TRACKING) + } + /// @brief A checkpoint for current performanceTracker block. + void checkpoint(const std::string& id = std::string(), const char* file = __FILE__, unsigned long int line = __LINE__, const char* func = "") { +#if !defined(ELPP_DISABLE_PERFORMANCE_TRACKING) && ELPP_LOGGING_ENABLED + if (m_enabled) { + base::threading::ScopedLock scopedLock(lock()); + base::utils::DateTime::gettimeofday(&m_endTime); + base::type::string_t formattedTime = m_hasChecked ? getFormattedTimeTaken(m_lastCheckpointTime) : ELPP_LITERAL(""); + PerformanceTrackingData data(PerformanceTrackingData::DataType::Checkpoint); + data.init(this); + data.m_checkpointId = id; + data.m_file = file; + data.m_line = line; + data.m_func = func; + data.m_formattedTimeTaken = formattedTime; + PerformanceTrackingCallback* callback = nullptr; + for (const std::pair& h + : ELPP->m_performanceTrackingCallbacks) { + callback = h.second.get(); + if (callback != nullptr && callback->enabled()) { + callback->acquireLock(); + callback->handle(&data); + callback->releaseLock(); + } + } + base::utils::DateTime::gettimeofday(&m_lastCheckpointTime); + m_hasChecked = true; + m_lastCheckpointId = id; + } +#endif // !defined(ELPP_DISABLE_PERFORMANCE_TRACKING) && ELPP_LOGGING_ENABLED + ELPP_UNUSED(id); + ELPP_UNUSED(file); + ELPP_UNUSED(line); + ELPP_UNUSED(func); + } + inline Level level(void) const { return m_level; } +private: + std::string m_blockName; + base::TimestampUnit m_timestampUnit; + std::string m_loggerId; + bool m_scopedLog; + Level m_level; + bool m_hasChecked; + std::string m_lastCheckpointId; + bool m_enabled; + struct timeval m_startTime, m_endTime, m_lastCheckpointTime; + + PerformanceTracker(void); + + friend class el::PerformanceTrackingData; + friend class base::DefaultPerformanceTrackingCallback; + + const inline base::type::string_t getFormattedTimeTaken() const { + return getFormattedTimeTaken(m_startTime); + } + + const base::type::string_t getFormattedTimeTaken(struct timeval startTime) const { + if (ELPP->hasFlag(LoggingFlag::FixedTimeFormat)) { + base::type::stringstream_t ss; + ss << base::utils::DateTime::getTimeDifference(m_endTime, + startTime, m_timestampUnit) << " " << base::consts::kTimeFormats[static_cast(m_timestampUnit)].unit; + return ss.str(); + } + return base::utils::DateTime::formatTime(base::utils::DateTime::getTimeDifference(m_endTime, + startTime, m_timestampUnit), m_timestampUnit); + } + + virtual inline void log(el::base::type::ostream_t& os) const { + os << getFormattedTimeTaken(); + } +}; +class DefaultPerformanceTrackingCallback : public PerformanceTrackingCallback { +protected: + void handle(const PerformanceTrackingData* data) { + m_data = data; + base::type::stringstream_t ss; + if (m_data->dataType() == PerformanceTrackingData::DataType::Complete) { + ss << ELPP_LITERAL("Executed [") << m_data->blockName()->c_str() << ELPP_LITERAL("] in [") << *m_data->formattedTimeTaken() << ELPP_LITERAL("]"); + } else { + ss << ELPP_LITERAL("Performance checkpoint"); + if (!m_data->checkpointId().empty()) { + ss << ELPP_LITERAL(" [") << m_data->checkpointId().c_str() << ELPP_LITERAL("]"); + } + ss << ELPP_LITERAL(" for block [") << m_data->blockName()->c_str() << ELPP_LITERAL("] : [") << *m_data->performanceTracker(); + if (!ELPP->hasFlag(LoggingFlag::DisablePerformanceTrackingCheckpointComparison) && m_data->performanceTracker()->m_hasChecked) { + ss << ELPP_LITERAL(" ([") << *m_data->formattedTimeTaken() << ELPP_LITERAL("] from "); + if (m_data->performanceTracker()->m_lastCheckpointId.empty()) { + ss << ELPP_LITERAL("last checkpoint"); + } else { + ss << ELPP_LITERAL("checkpoint '") << m_data->performanceTracker()->m_lastCheckpointId.c_str() << ELPP_LITERAL("'"); + } + ss << ELPP_LITERAL(")]"); + } else { + ss << ELPP_LITERAL("]"); + } + } + el::base::Writer(m_data->performanceTracker()->level(), m_data->file(), m_data->line(), m_data->func()).construct(1, m_data->loggerId().c_str()) << ss.str(); + } +private: + const PerformanceTrackingData* m_data; +}; +} // namespace base +inline const std::string* PerformanceTrackingData::blockName() const { + return const_cast(&m_performanceTracker->m_blockName); +} +inline const struct timeval* PerformanceTrackingData::startTime() const { + return const_cast(&m_performanceTracker->m_startTime); +} +inline const struct timeval* PerformanceTrackingData::endTime() const { + return const_cast(&m_performanceTracker->m_endTime); +} +inline const struct timeval* PerformanceTrackingData::lastCheckpointTime() const { + return const_cast(&m_performanceTracker->m_lastCheckpointTime); +} +inline const std::string& PerformanceTrackingData::loggerId(void) const { return m_performanceTracker->m_loggerId; } +namespace base { +/// @brief Contains some internal debugging tools like crash handler and stack tracer +namespace debug { +class StackTrace : base::NoCopy { +public: + static const std::size_t kMaxStack = 64; + static const std::size_t kStackStart = 2; // We want to skip c'tor and StackTrace::generateNew() + class StackTraceEntry { + public: + StackTraceEntry(std::size_t index, const char* loc, const char* demang, const char* hex, const char* addr) { + m_index = index; + m_location = std::string(loc); + m_demangled = std::string(demang); + m_hex = std::string(hex); + m_addr = std::string(addr); + } + StackTraceEntry(std::size_t index, char* loc) { + m_index = index; + m_location = std::string(loc); + } + std::size_t m_index; + std::string m_location; + std::string m_demangled; + std::string m_hex; + std::string m_addr; + friend std::ostream& operator<<(std::ostream& ss, const StackTraceEntry& si) { + ss << "[" << si.m_index << "] " << si.m_location << (si.m_demangled.empty() ? "" : ":") << si.m_demangled + << (si.m_hex.empty() ? "" : "+") << si.m_hex << si.m_addr; + return ss; + } + + private: + StackTraceEntry(void); + }; + + StackTrace(void) { + generateNew(); + } + + virtual ~StackTrace(void) { + } + + inline std::vector& getLatestStack(void) { + return m_stack; + } + + friend inline std::ostream& operator<<(std::ostream& os, const StackTrace& st) { + std::vector::const_iterator it = st.m_stack.begin(); + while (it != st.m_stack.end()) { + os << " " << *it++ << "\n"; + } + return os; + } + +private: + std::vector m_stack; + + void generateNew(void) { +#if ELPP_STACKTRACE + m_stack.clear(); + void* stack[kMaxStack]; + std::size_t size = backtrace(stack, kMaxStack); + char** strings = backtrace_symbols(stack, size); + if (size > kStackStart) { // Skip StackTrace c'tor and generateNew + for (std::size_t i = kStackStart; i < size; ++i) { + char* mangName = nullptr; + char* hex = nullptr; + char* addr = nullptr; + for (char* c = strings[i]; *c; ++c) { + switch (*c) { + case '(': + mangName = c; + break; + case '+': + hex = c; + break; + case ')': + addr = c; + break; + } + } + // Perform demangling if parsed properly + if (mangName != nullptr && hex != nullptr && addr != nullptr && mangName < hex) { + *mangName++ = '\0'; + *hex++ = '\0'; + *addr++ = '\0'; + int status = 0; + char* demangName = abi::__cxa_demangle(mangName, 0, 0, &status); + // if demangling is successful, output the demangled function name + if (status == 0) { + // Success (see http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.3/a01696.html) + StackTraceEntry entry(i - 1, strings[i], demangName, hex, addr); + m_stack.push_back(entry); + } else { + // Not successful - we will use mangled name + StackTraceEntry entry(i - 1, strings[i], mangName, hex, addr); + m_stack.push_back(entry); + } + free(demangName); + } else { + StackTraceEntry entry(i - 1, strings[i]); + m_stack.push_back(entry); + } + } + } + free(strings); +#else + ELPP_INTERNAL_INFO(1, "Stacktrace generation not supported for selected compiler"); +#endif // ELPP_STACKTRACE + } +}; +static std::string crashReason(int sig) { + std::stringstream ss; + bool foundReason = false; + for (int i = 0; i < base::consts::kCrashSignalsCount; ++i) { + if (base::consts::kCrashSignals[i].numb == sig) { + ss << "Application has crashed due to [" << base::consts::kCrashSignals[i].name << "] signal"; + if (ELPP->hasFlag(el::LoggingFlag::LogDetailedCrashReason)) { + ss << std::endl << + " " << base::consts::kCrashSignals[i].brief << std::endl << + " " << base::consts::kCrashSignals[i].detail; + } + foundReason = true; + } + } + if (!foundReason) { + ss << "Application has crashed due to unknown signal [" << sig << "]"; + } + return ss.str(); +} +/// @brief Logs reason of crash from sig +static void logCrashReason(int sig, bool stackTraceIfAvailable, Level level, const char* logger) { + std::stringstream ss; + ss << "CRASH HANDLED; "; + ss << crashReason(sig); +#if ELPP_STACKTRACE + if (stackTraceIfAvailable) { + ss << std::endl << " ======= Backtrace: =========" << std::endl << base::debug::StackTrace(); + } +#else + ELPP_UNUSED(stackTraceIfAvailable); +#endif // ELPP_STACKTRACE + ELPP_WRITE_LOG(el::base::Writer, level, base::DispatchAction::NormalLog, logger) << ss.str(); +} +static inline void crashAbort(int sig) { + base::utils::abort(sig); +} +/// @brief Default application crash handler +/// +/// @detail This function writes log using 'default' logger, prints stack trace for GCC based compilers and aborts program. +static inline void defaultCrashHandler(int sig) { + base::debug::logCrashReason(sig, true, Level::Fatal, base::consts::kDefaultLoggerId); + base::debug::crashAbort(sig); +} +/// @brief Handles unexpected crashes +class CrashHandler : base::NoCopy { +public: + typedef void (*Handler)(int); + + explicit CrashHandler(bool useDefault) { + if (useDefault) { + setHandler(defaultCrashHandler); + } + } + explicit CrashHandler(const Handler& cHandler) { + setHandler(cHandler); + } + void setHandler(const Handler& cHandler) { + m_handler = cHandler; +#if defined(ELPP_HANDLE_SIGABRT) + int i = 0; // SIGABRT is at base::consts::kCrashSignals[0] +#else + int i = 1; +#endif // defined(ELPP_HANDLE_SIGABRT) + for (; i < base::consts::kCrashSignalsCount; ++i) { + m_handler = signal(base::consts::kCrashSignals[i].numb, cHandler); + } + } + +private: + Handler m_handler; +}; +} // namespace debug +} // namespace base +extern base::debug::CrashHandler elCrashHandler; +#define MAKE_LOGGABLE(ClassType, ClassInstance, OutputStreamInstance) \ + el::base::type::ostream_t& operator<<(el::base::type::ostream_t& OutputStreamInstance, const ClassType& ClassInstance) +/// @brief Initializes syslog with process ID, options and facility. calls closelog() on d'tor +class SysLogInitializer { +public: + SysLogInitializer(const char* processIdent, int options = 0, int facility = 0) { +#if defined(ELPP_SYSLOG) + openlog(processIdent, options, facility); +#else + ELPP_UNUSED(processIdent); + ELPP_UNUSED(options); + ELPP_UNUSED(facility); +#endif // defined(ELPP_SYSLOG) + } + virtual ~SysLogInitializer(void) { +#if defined(ELPP_SYSLOG) + closelog(); +#endif // defined(ELPP_SYSLOG) + } +}; +#define ELPP_INITIALIZE_SYSLOG(id, opt, fac) el::SysLogInitializer elSyslogInit(id, opt, fac) +/// @brief Static helpers for developers +class Helpers : base::StaticClass { +public: + /// @brief Shares logging repository (base::Storage) + static inline void setStorage(base::type::StoragePointer storage) { + ELPP = storage; + } + /// @return Main storage repository + static inline base::type::StoragePointer storage() { + return ELPP; + } + /// @brief Sets application arguments and figures out whats active for logging and whats not. + static inline void setArgs(int argc, char** argv) { + ELPP->setApplicationArguments(argc, argv); + } + /// @copydoc setArgs(int argc, char** argv) + static inline void setArgs(int argc, const char** argv) { + ELPP->setApplicationArguments(argc, const_cast(argv)); + } + /// @brief Overrides default crash handler and installs custom handler. + /// @param crashHandler A functor with no return type that takes single int argument. + /// Handler is a typedef with specification: void (*Handler)(int) + static inline void setCrashHandler(const el::base::debug::CrashHandler::Handler& crashHandler) { + el::elCrashHandler.setHandler(crashHandler); + } + /// @brief Abort due to crash with signal in parameter + /// @param sig Crash signal + static inline void crashAbort(int sig, const char* sourceFile = "", unsigned int long line = 0) { + std::stringstream ss; + ss << base::debug::crashReason(sig).c_str(); + ss << " - [Called el::Helpers::crashAbort(" << sig << ")]"; + if (sourceFile != nullptr && strlen(sourceFile) > 0) { + ss << " - Source: " << sourceFile; + if (line > 0) + ss << ":" << line; + else + ss << " (line number not specified)"; + } + base::utils::abort(sig, ss.str()); + } + /// @brief Logs reason of crash as per sig + /// @param sig Crash signal + /// @param stackTraceIfAvailable Includes stack trace if available + /// @param level Logging level + /// @param logger Logger to use for logging + static inline void logCrashReason(int sig, bool stackTraceIfAvailable = false, + Level level = Level::Fatal, const char* logger = base::consts::kDefaultLoggerId) { + el::base::debug::logCrashReason(sig, stackTraceIfAvailable, level, logger); + } + /// @brief Installs pre rollout callback, this callback is triggered when log file is about to be rolled out + /// (can be useful for backing up) + static inline void installPreRollOutCallback(const PreRollOutCallback& callback) { + ELPP->setPreRollOutCallback(callback); + } + /// @brief Uninstalls pre rollout callback + static inline void uninstallPreRollOutCallback(void) { + ELPP->unsetPreRollOutCallback(); + } + /// @brief Installs post log dispatch callback, this callback is triggered when log is dispatched + template + static inline bool installLogDispatchCallback(const std::string& id) { + return ELPP->installLogDispatchCallback(id); + } + /// @brief Uninstalls log dispatch callback + template + static inline void uninstallLogDispatchCallback(const std::string& id) { + ELPP->uninstallLogDispatchCallback(id); + } + template + static inline T* logDispatchCallback(const std::string& id) { + return ELPP->logDispatchCallback(id); + } + /// @brief Installs post performance tracking callback, this callback is triggered when performance tracking is finished + template + static inline bool installPerformanceTrackingCallback(const std::string& id) { + return ELPP->installPerformanceTrackingCallback(id); + } + /// @brief Uninstalls post performance tracking handler + template + static inline void uninstallPerformanceTrackingCallback(const std::string& id) { + ELPP->uninstallPerformanceTrackingCallback(id); + } + template + static inline T* performanceTrackingCallback(const std::string& id) { + return ELPP->performanceTrackingCallback(id); + } + /// @brief Converts template to std::string - useful for loggable classes to log containers within log(std::ostream&) const + template + static std::string convertTemplateToStdString(const T& templ) { + el::Logger* logger = + ELPP->registeredLoggers()->get(el::base::consts::kDefaultLoggerId); + if (logger == nullptr) { + return std::string(); + } + base::MessageBuilder b; + b.initialize(logger); + logger->acquireLock(); + b << templ; +#if defined(ELPP_UNICODE) + std::string s = std::string(logger->stream().str().begin(), logger->stream().str().end()); +#else + std::string s = logger->stream().str(); +#endif // defined(ELPP_UNICODE) + logger->stream().str(ELPP_LITERAL("")); + logger->releaseLock(); + return s; + } + /// @brief Returns command line arguments (pointer) provided to easylogging++ + static inline const el::base::utils::CommandLineArgs* commandLineArgs(void) { + return ELPP->commandLineArgs(); + } + /// @brief Installs user defined format specifier and handler + static inline void installCustomFormatSpecifier(const CustomFormatSpecifier& customFormatSpecifier) { + ELPP->installCustomFormatSpecifier(customFormatSpecifier); + } + /// @brief Uninstalls user defined format specifier and handler + static inline bool uninstallCustomFormatSpecifier(const char* formatSpecifier) { + return ELPP->uninstallCustomFormatSpecifier(formatSpecifier); + } + /// @brief Returns true if custom format specifier is installed + static inline bool hasCustomFormatSpecifier(const char* formatSpecifier) { + return ELPP->hasCustomFormatSpecifier(formatSpecifier); + } + static inline void validateFileRolling(Logger* logger, Level level) { + if (logger == nullptr) return; + logger->m_typedConfigurations->validateFileRolling(level, ELPP->preRollOutCallback()); + } +}; +/// @brief Static helpers to deal with loggers and their configurations +class Loggers : base::StaticClass { +public: + /// @brief Gets existing or registers new logger + static inline Logger* getLogger(const std::string& identity, bool registerIfNotAvailable = true) { + base::threading::ScopedLock scopedLock(ELPP->lock()); + return ELPP->registeredLoggers()->get(identity, registerIfNotAvailable); + } + /// @brief Unregisters logger - use it only when you know what you are doing, you may unregister + /// loggers initialized / used by third-party libs. + static inline bool unregisterLogger(const std::string& identity) { + base::threading::ScopedLock scopedLock(ELPP->lock()); + return ELPP->registeredLoggers()->remove(identity); + } + /// @brief Whether or not logger with id is registered + static inline bool hasLogger(const std::string& identity) { + base::threading::ScopedLock scopedLock(ELPP->lock()); + return ELPP->registeredLoggers()->has(identity); + } + /// @brief Reconfigures specified logger with new configurations + static inline Logger* reconfigureLogger(Logger* logger, const Configurations& configurations) { + if (!logger) return nullptr; + logger->configure(configurations); + return logger; + } + /// @brief Reconfigures logger with new configurations after looking it up using identity + static inline Logger* reconfigureLogger(const std::string& identity, const Configurations& configurations) { + return Loggers::reconfigureLogger(Loggers::getLogger(identity), configurations); + } + /// @brief Reconfigures logger's single configuration + static inline Logger* reconfigureLogger(const std::string& identity, ConfigurationType configurationType, + const std::string& value) { + Logger* logger = Loggers::getLogger(identity); + if (logger == nullptr) { + return nullptr; + } + logger->configurations()->set(Level::Global, configurationType, value); + logger->reconfigure(); + return logger; + } + /// @brief Reconfigures all the existing loggers with new configurations + static inline void reconfigureAllLoggers(const Configurations& configurations) { + for (base::RegisteredLoggers::iterator it = ELPP->registeredLoggers()->begin(); + it != ELPP->registeredLoggers()->end(); ++it) { + Loggers::reconfigureLogger(it->second, configurations); + } + } + /// @brief Reconfigures single configuration for all the loggers + static inline void reconfigureAllLoggers(ConfigurationType configurationType, const std::string& value) { + reconfigureAllLoggers(Level::Global, configurationType, value); + } + /// @brief Reconfigures single configuration for all the loggers for specified level + static inline void reconfigureAllLoggers(Level level, ConfigurationType configurationType, + const std::string& value) { + for (base::RegisteredLoggers::iterator it = ELPP->registeredLoggers()->begin(); + it != ELPP->registeredLoggers()->end(); ++it) { + Logger* logger = it->second; + logger->configurations()->set(level, configurationType, value); + logger->reconfigure(); + } + } + /// @brief Sets default configurations. This configuration is used for future (and conditionally for existing) loggers + static inline void setDefaultConfigurations(const Configurations& configurations, bool reconfigureExistingLoggers = false) { + ELPP->registeredLoggers()->setDefaultConfigurations(configurations); + if (reconfigureExistingLoggers) { + Loggers::reconfigureAllLoggers(configurations); + } + } + /// @brief Returns current default + static inline const Configurations* defaultConfigurations(void) { + return ELPP->registeredLoggers()->defaultConfigurations(); + } + /// @brief Returns log stream reference pointer if needed by user + static inline const base::LogStreamsReferenceMap* logStreamsReference(void) { + return ELPP->registeredLoggers()->logStreamsReference(); + } + /// @brief Default typed configuration based on existing defaultConf + static base::TypedConfigurations defaultTypedConfigurations(void) { + return base::TypedConfigurations( + ELPP->registeredLoggers()->defaultConfigurations(), + ELPP->registeredLoggers()->logStreamsReference()); + } + /// @brief Populates all logger IDs in current repository. + /// @param [out] targetList List of fill up. + static inline std::vector* populateAllLoggerIds(std::vector* targetList) { + targetList->clear(); + for (base::RegisteredLoggers::iterator it = ELPP->registeredLoggers()->list().begin(); + it != ELPP->registeredLoggers()->list().end(); ++it) { + targetList->push_back(it->first); + } + return targetList; + } + /// @brief Sets configurations from global configuration file. + static void configureFromGlobal(const char* globalConfigurationFilePath) { + std::ifstream gcfStream(globalConfigurationFilePath, std::ifstream::in); + ELPP_ASSERT(gcfStream.is_open(), "Unable to open global configuration file [" << globalConfigurationFilePath + << "] for parsing."); + std::string line = std::string(); + std::stringstream ss; + Logger* logger = nullptr; + auto configure = [&](void) { + ELPP_INTERNAL_INFO(8, "Configuring logger: '" << logger->id() << "' with configurations \n" << ss.str() + << "\n--------------"); + Configurations c; + c.parseFromText(ss.str()); + logger->configure(c); + }; + while (gcfStream.good()) { + std::getline(gcfStream, line); + ELPP_INTERNAL_INFO(1, "Parsing line: " << line); + base::utils::Str::trim(line); + if (Configurations::Parser::isComment(line)) continue; + Configurations::Parser::ignoreComments(&line); + base::utils::Str::trim(line); + if (line.size() > 2 && base::utils::Str::startsWith(line, std::string(base::consts::kConfigurationLoggerId))) { + if (!ss.str().empty() && logger != nullptr) { + configure(); + } + ss.str(std::string("")); + line = line.substr(2); + base::utils::Str::trim(line); + if (line.size() > 1) { + ELPP_INTERNAL_INFO(1, "Getting logger: '" << line << "'"); + logger = getLogger(line); + } + } else { + ss << line << "\n"; + } + } + if (!ss.str().empty() && logger != nullptr) { + configure(); + } + } + /// @brief Configures loggers using command line arg. Ensure you have already set command line args, + /// @return False if invalid argument or argument with no value provided, true if attempted to configure logger. + /// If true is returned that does not mean it has been configured successfully, it only means that it + /// has attempeted to configure logger using configuration file provided in argument + static inline bool configureFromArg(const char* argKey) { +#if defined(ELPP_DISABLE_CONFIGURATION_FROM_PROGRAM_ARGS) + ELPP_UNUSED(argKey); +#else + if (!Helpers::commandLineArgs()->hasParamWithValue(argKey)) { + return false; + } + configureFromGlobal(Helpers::commandLineArgs()->getParamValue(argKey)); +#endif // defined(ELPP_DISABLE_CONFIGURATION_FROM_PROGRAM_ARGS) + return true; + } + /// @brief Flushes all loggers for all levels - Be careful if you dont know how many loggers are registered + static inline void flushAll(void) { + ELPP->registeredLoggers()->flushAll(); + } + /// @brief Adds logging flag used internally. + static inline void addFlag(LoggingFlag flag) { + ELPP->addFlag(flag); + } + /// @brief Removes logging flag used internally. + static inline void removeFlag(LoggingFlag flag) { + ELPP->removeFlag(flag); + } + /// @brief Determines whether or not certain flag is active + static inline bool hasFlag(LoggingFlag flag) { + return ELPP->hasFlag(flag); + } + /// @brief Adds flag and removes it when scope goes out + class ScopedAddFlag { + public: + ScopedAddFlag(LoggingFlag flag) : m_flag(flag) { Loggers::addFlag(m_flag); } + ~ScopedAddFlag(void) { Loggers::removeFlag(m_flag); } + private: + LoggingFlag m_flag; + }; + /// @brief Removes flag and add it when scope goes out + class ScopedRemoveFlag { + public: + ScopedRemoveFlag(LoggingFlag flag) : m_flag(flag) { Loggers::removeFlag(m_flag); } + ~ScopedRemoveFlag(void) { Loggers::addFlag(m_flag); } + private: + LoggingFlag m_flag; + }; + /// @brief Sets hierarchy for logging. Needs to enable logging flag (HierarchicalLogging) + static inline void setLoggingLevel(Level level) { + ELPP->setLoggingLevel(level); + } + /// @brief Sets verbose level on the fly + static inline void setVerboseLevel(base::type::VerboseLevel level) { + ELPP->vRegistry()->setLevel(level); + } + /// @brief Gets current verbose level + static inline base::type::VerboseLevel verboseLevel(void) { + return ELPP->vRegistry()->level(); + } + /// @brief Sets vmodules as specified (on the fly) + static inline void setVModules(const char* modules) { + if (ELPP->vRegistry()->vModulesEnabled()) { + ELPP->vRegistry()->setModules(modules); + } + } + /// @brief Clears vmodules + static inline void clearVModules(void) { + ELPP->vRegistry()->clearModules(); + } +}; +class VersionInfo : base::StaticClass { +public: + /// @brief Current version number + static inline const std::string version(void) { return std::string("9.80"); } + /// @brief Release date of current version + static inline const std::string releaseDate(void) { return std::string("08-01-2015 0850hrs"); } +}; +} // namespace el +#undef VLOG_IS_ON +/// @brief Determines whether verbose logging is on for specified level current file. +#define VLOG_IS_ON(verboseLevel) (ELPP->vRegistry()->allowed(verboseLevel, __FILE__)) +#undef TIMED_BLOCK +#undef TIMED_SCOPE +#undef TIMED_FUNC +#undef ELPP_MIN_UNIT +#if defined(ELPP_PERFORMANCE_MICROSECONDS) +# define ELPP_MIN_UNIT el::base::TimestampUnit::Microsecond +#else +# define ELPP_MIN_UNIT el::base::TimestampUnit::Millisecond +#endif // (defined(ELPP_PERFORMANCE_MICROSECONDS)) +/// @brief Performance tracked scope. Performance gets written when goes out of scope using +/// 'performance' logger. +/// +/// @detail Please note in order to check the performance at a certain time you can use obj.checkpoint(); +/// @see el::base::PerformanceTracker +/// @see el::base::PerformanceTracker::checkpoint +// Note: Do not surround this definition with null macro because of obj instance +#define TIMED_SCOPE(obj, blockname) el::base::PerformanceTracker obj(blockname, ELPP_MIN_UNIT) +#define TIMED_BLOCK(obj, blockName) for (struct { int i; el::base::PerformanceTracker timer; } obj = { 0, \ + el::base::PerformanceTracker(blockName, ELPP_MIN_UNIT) }; obj.i < 1; ++obj.i) +/// @brief Performance tracked function. Performance gets written when goes out of scope using +/// 'performance' logger. +/// +/// @detail Please note in order to check the performance at a certain time you can use obj.checkpoint(); +/// @see el::base::PerformanceTracker +/// @see el::base::PerformanceTracker::checkpoint +#define TIMED_FUNC(obj) TIMED_SCOPE(obj, ELPP_FUNC) +#undef PERFORMANCE_CHECKPOINT +#undef PERFORMANCE_CHECKPOINT_WITH_ID +#define PERFORMANCE_CHECKPOINT(obj) obj.checkpoint(std::string(), __FILE__, __LINE__, ELPP_FUNC) +#define PERFORMANCE_CHECKPOINT_WITH_ID(obj, id) obj.checkpoint(id, __FILE__, __LINE__, ELPP_FUNC) +#undef ELPP_COUNTER +#undef ELPP_COUNTER_POS +/// @brief Gets hit counter for file/line +#define ELPP_COUNTER (ELPP->hitCounters()->getCounter(__FILE__, __LINE__)) +/// @brief Gets hit counter position for file/line, -1 if not registered yet +#define ELPP_COUNTER_POS (ELPP_COUNTER == nullptr ? -1 : ELPP_COUNTER->hitCounts()) +// Undef levels to support LOG(LEVEL) +#undef INFO +#undef WARNING +#undef DEBUG +#undef ERROR +#undef FATAL +#undef TRACE +#undef VERBOSE +// Undef existing +#undef CINFO +#undef CWARNING +#undef CDEBUG +#undef CFATAL +#undef CERROR +#undef CTRACE +#undef CVERBOSE +#undef CINFO_IF +#undef CWARNING_IF +#undef CDEBUG_IF +#undef CERROR_IF +#undef CFATAL_IF +#undef CTRACE_IF +#undef CVERBOSE_IF +#undef CINFO_EVERY_N +#undef CWARNING_EVERY_N +#undef CDEBUG_EVERY_N +#undef CERROR_EVERY_N +#undef CFATAL_EVERY_N +#undef CTRACE_EVERY_N +#undef CVERBOSE_EVERY_N +#undef CINFO_AFTER_N +#undef CWARNING_AFTER_N +#undef CDEBUG_AFTER_N +#undef CERROR_AFTER_N +#undef CFATAL_AFTER_N +#undef CTRACE_AFTER_N +#undef CVERBOSE_AFTER_N +#undef CINFO_N_TIMES +#undef CWARNING_N_TIMES +#undef CDEBUG_N_TIMES +#undef CERROR_N_TIMES +#undef CFATAL_N_TIMES +#undef CTRACE_N_TIMES +#undef CVERBOSE_N_TIMES +// Normal logs +#if ELPP_INFO_LOG +# define CINFO(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Info, dispatchAction, __VA_ARGS__) +#else +# define CINFO(writer, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_INFO_LOG +#if ELPP_WARNING_LOG +# define CWARNING(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Warning, dispatchAction, __VA_ARGS__) +#else +# define CWARNING(writer, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_WARNING_LOG +#if ELPP_DEBUG_LOG +# define CDEBUG(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Debug, dispatchAction, __VA_ARGS__) +#else +# define CDEBUG(writer, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_DEBUG_LOG +#if ELPP_ERROR_LOG +# define CERROR(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Error, dispatchAction, __VA_ARGS__) +#else +# define CERROR(writer, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_ERROR_LOG +#if ELPP_FATAL_LOG +# define CFATAL(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Fatal, dispatchAction, __VA_ARGS__) +#else +# define CFATAL(writer, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_FATAL_LOG +#if ELPP_TRACE_LOG +# define CTRACE(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Trace, dispatchAction, __VA_ARGS__) +#else +# define CTRACE(writer, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_TRACE_LOG +#if ELPP_VERBOSE_LOG +# define CVERBOSE(writer, vlevel, dispatchAction, ...) if (VLOG_IS_ON(vlevel)) writer(\ + el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__) +#else +# define CVERBOSE(writer, vlevel, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_VERBOSE_LOG +// Conditional logs +#if ELPP_INFO_LOG +# define CINFO_IF(writer, condition_, dispatchAction, ...) \ + ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Info, dispatchAction, __VA_ARGS__) +#else +# define CINFO_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_INFO_LOG +#if ELPP_WARNING_LOG +# define CWARNING_IF(writer, condition_, dispatchAction, ...)\ + ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Warning, dispatchAction, __VA_ARGS__) +#else +# define CWARNING_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_WARNING_LOG +#if ELPP_DEBUG_LOG +# define CDEBUG_IF(writer, condition_, dispatchAction, ...)\ + ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Debug, dispatchAction, __VA_ARGS__) +#else +# define CDEBUG_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_DEBUG_LOG +#if ELPP_ERROR_LOG +# define CERROR_IF(writer, condition_, dispatchAction, ...)\ + ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Error, dispatchAction, __VA_ARGS__) +#else +# define CERROR_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_ERROR_LOG +#if ELPP_FATAL_LOG +# define CFATAL_IF(writer, condition_, dispatchAction, ...)\ + ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Fatal, dispatchAction, __VA_ARGS__) +#else +# define CFATAL_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_FATAL_LOG +#if ELPP_TRACE_LOG +# define CTRACE_IF(writer, condition_, dispatchAction, ...)\ + ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Trace, dispatchAction, __VA_ARGS__) +#else +# define CTRACE_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_TRACE_LOG +#if ELPP_VERBOSE_LOG +# define CVERBOSE_IF(writer, condition_, vlevel, dispatchAction, ...) if (VLOG_IS_ON(vlevel) && (condition_)) writer( \ + el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__) +#else +# define CVERBOSE_IF(writer, condition_, vlevel, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_VERBOSE_LOG +// Occasional logs +#if ELPP_INFO_LOG +# define CINFO_EVERY_N(writer, occasion, dispatchAction, ...)\ + ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Info, dispatchAction, __VA_ARGS__) +#else +# define CINFO_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_INFO_LOG +#if ELPP_WARNING_LOG +# define CWARNING_EVERY_N(writer, occasion, dispatchAction, ...)\ + ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Warning, dispatchAction, __VA_ARGS__) +#else +# define CWARNING_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_WARNING_LOG +#if ELPP_DEBUG_LOG +# define CDEBUG_EVERY_N(writer, occasion, dispatchAction, ...)\ + ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Debug, dispatchAction, __VA_ARGS__) +#else +# define CDEBUG_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_DEBUG_LOG +#if ELPP_ERROR_LOG +# define CERROR_EVERY_N(writer, occasion, dispatchAction, ...)\ + ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Error, dispatchAction, __VA_ARGS__) +#else +# define CERROR_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_ERROR_LOG +#if ELPP_FATAL_LOG +# define CFATAL_EVERY_N(writer, occasion, dispatchAction, ...)\ + ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Fatal, dispatchAction, __VA_ARGS__) +#else +# define CFATAL_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_FATAL_LOG +#if ELPP_TRACE_LOG +# define CTRACE_EVERY_N(writer, occasion, dispatchAction, ...)\ + ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Trace, dispatchAction, __VA_ARGS__) +#else +# define CTRACE_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_TRACE_LOG +#if ELPP_VERBOSE_LOG +# define CVERBOSE_EVERY_N(writer, occasion, vlevel, dispatchAction, ...)\ + CVERBOSE_IF(writer, ELPP->validateEveryNCounter(__FILE__, __LINE__, occasion), vlevel, dispatchAction, __VA_ARGS__) +#else +# define CVERBOSE_EVERY_N(writer, occasion, vlevel, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_VERBOSE_LOG +// After N logs +#if ELPP_INFO_LOG +# define CINFO_AFTER_N(writer, n, dispatchAction, ...)\ + ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Info, dispatchAction, __VA_ARGS__) +#else +# define CINFO_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_INFO_LOG +#if ELPP_WARNING_LOG +# define CWARNING_AFTER_N(writer, n, dispatchAction, ...)\ + ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Warning, dispatchAction, __VA_ARGS__) +#else +# define CWARNING_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_WARNING_LOG +#if ELPP_DEBUG_LOG +# define CDEBUG_AFTER_N(writer, n, dispatchAction, ...)\ + ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Debug, dispatchAction, __VA_ARGS__) +#else +# define CDEBUG_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_DEBUG_LOG +#if ELPP_ERROR_LOG +# define CERROR_AFTER_N(writer, n, dispatchAction, ...)\ + ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Error, dispatchAction, __VA_ARGS__) +#else +# define CERROR_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_ERROR_LOG +#if ELPP_FATAL_LOG +# define CFATAL_AFTER_N(writer, n, dispatchAction, ...)\ + ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Fatal, dispatchAction, __VA_ARGS__) +#else +# define CFATAL_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_FATAL_LOG +#if ELPP_TRACE_LOG +# define CTRACE_AFTER_N(writer, n, dispatchAction, ...)\ + ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Trace, dispatchAction, __VA_ARGS__) +#else +# define CTRACE_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_TRACE_LOG +#if ELPP_VERBOSE_LOG +# define CVERBOSE_AFTER_N(writer, n, vlevel, dispatchAction, ...)\ + CVERBOSE_IF(writer, ELPP->validateAfterNCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__) +#else +# define CVERBOSE_AFTER_N(writer, n, vlevel, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_VERBOSE_LOG +// N Times logs +#if ELPP_INFO_LOG +# define CINFO_N_TIMES(writer, n, dispatchAction, ...)\ + ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Info, dispatchAction, __VA_ARGS__) +#else +# define CINFO_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_INFO_LOG +#if ELPP_WARNING_LOG +# define CWARNING_N_TIMES(writer, n, dispatchAction, ...)\ + ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Warning, dispatchAction, __VA_ARGS__) +#else +# define CWARNING_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_WARNING_LOG +#if ELPP_DEBUG_LOG +# define CDEBUG_N_TIMES(writer, n, dispatchAction, ...)\ + ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Debug, dispatchAction, __VA_ARGS__) +#else +# define CDEBUG_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_DEBUG_LOG +#if ELPP_ERROR_LOG +# define CERROR_N_TIMES(writer, n, dispatchAction, ...)\ + ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Error, dispatchAction, __VA_ARGS__) +#else +# define CERROR_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_ERROR_LOG +#if ELPP_FATAL_LOG +# define CFATAL_N_TIMES(writer, n, dispatchAction, ...)\ + ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Fatal, dispatchAction, __VA_ARGS__) +#else +# define CFATAL_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_FATAL_LOG +#if ELPP_TRACE_LOG +# define CTRACE_N_TIMES(writer, n, dispatchAction, ...)\ + ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Trace, dispatchAction, __VA_ARGS__) +#else +# define CTRACE_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_TRACE_LOG +#if ELPP_VERBOSE_LOG +# define CVERBOSE_N_TIMES(writer, n, vlevel, dispatchAction, ...)\ + CVERBOSE_IF(writer, ELPP->validateNTimesCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__) +#else +# define CVERBOSE_N_TIMES(writer, n, vlevel, dispatchAction, ...) el::base::NullWriter() +#endif // ELPP_VERBOSE_LOG +// +// Custom Loggers - Requires (level, dispatchAction, loggerId/s) +// +// undef existing +#undef CLOG +#undef CLOG_VERBOSE +#undef CVLOG +#undef CLOG_IF +#undef CLOG_VERBOSE_IF +#undef CVLOG_IF +#undef CLOG_EVERY_N +#undef CVLOG_EVERY_N +#undef CLOG_AFTER_N +#undef CVLOG_AFTER_N +#undef CLOG_N_TIMES +#undef CVLOG_N_TIMES +// Normal logs +#define CLOG(LEVEL, ...)\ + C##LEVEL(el::base::Writer, el::base::DispatchAction::NormalLog, __VA_ARGS__) +#define CVLOG(vlevel, ...) CVERBOSE(el::base::Writer, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__) +// Conditional logs +#define CLOG_IF(condition, LEVEL, ...)\ + C##LEVEL##_IF(el::base::Writer, condition, el::base::DispatchAction::NormalLog, __VA_ARGS__) +#define CVLOG_IF(condition, vlevel, ...)\ + CVERBOSE_IF(el::base::Writer, condition, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__) +// Hit counts based logs +#define CLOG_EVERY_N(n, LEVEL, ...)\ + C##LEVEL##_EVERY_N(el::base::Writer, n, el::base::DispatchAction::NormalLog, __VA_ARGS__) +#define CVLOG_EVERY_N(n, vlevel, ...)\ + CVERBOSE_EVERY_N(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__) +#define CLOG_AFTER_N(n, LEVEL, ...)\ + C##LEVEL##_AFTER_N(el::base::Writer, n, el::base::DispatchAction::NormalLog, __VA_ARGS__) +#define CVLOG_AFTER_N(n, vlevel, ...)\ + CVERBOSE_AFTER_N(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__) +#define CLOG_N_TIMES(n, LEVEL, ...)\ + C##LEVEL##_N_TIMES(el::base::Writer, n, el::base::DispatchAction::NormalLog, __VA_ARGS__) +#define CVLOG_N_TIMES(n, vlevel, ...)\ + CVERBOSE_N_TIMES(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__) +// +// Default Loggers macro using CLOG(), CLOG_VERBOSE() and CVLOG() macros +// +// undef existing +#undef LOG +#undef VLOG +#undef LOG_IF +#undef VLOG_IF +#undef LOG_EVERY_N +#undef VLOG_EVERY_N +#undef LOG_AFTER_N +#undef VLOG_AFTER_N +#undef LOG_N_TIMES +#undef VLOG_N_TIMES +#undef ELPP_CURR_FILE_LOGGER_ID +#if defined(ELPP_DEFAULT_LOGGER) +# define ELPP_CURR_FILE_LOGGER_ID ELPP_DEFAULT_LOGGER +#else +# define ELPP_CURR_FILE_LOGGER_ID el::base::consts::kDefaultLoggerId +#endif +#undef ELPP_TRACE +#define ELPP_TRACE CLOG(TRACE, ELPP_CURR_FILE_LOGGER_ID) +// Normal logs +#define LOG(LEVEL) CLOG(LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define VLOG(vlevel) CVLOG(vlevel, ELPP_CURR_FILE_LOGGER_ID) +// Conditional logs +#define LOG_IF(condition, LEVEL) CLOG_IF(condition, LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define VLOG_IF(condition, vlevel) CVLOG_IF(condition, vlevel, ELPP_CURR_FILE_LOGGER_ID) +// Hit counts based logs +#define LOG_EVERY_N(n, LEVEL) CLOG_EVERY_N(n, LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define VLOG_EVERY_N(n, vlevel) CVLOG_EVERY_N(n, vlevel, ELPP_CURR_FILE_LOGGER_ID) +#define LOG_AFTER_N(n, LEVEL) CLOG_AFTER_N(n, LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define VLOG_AFTER_N(n, vlevel) CVLOG_AFTER_N(n, vlevel, ELPP_CURR_FILE_LOGGER_ID) +#define LOG_N_TIMES(n, LEVEL) CLOG_N_TIMES(n, LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define VLOG_N_TIMES(n, vlevel) CVLOG_N_TIMES(n, vlevel, ELPP_CURR_FILE_LOGGER_ID) +// Generic PLOG() +#undef CPLOG +#undef CPLOG_IF +#undef PLOG +#undef PLOG_IF +#undef DCPLOG +#undef DCPLOG_IF +#undef DPLOG +#undef DPLOG_IF +#define CPLOG(LEVEL, ...)\ + C##LEVEL(el::base::PErrorWriter, el::base::DispatchAction::NormalLog, __VA_ARGS__) +#define CPLOG_IF(condition, LEVEL, ...)\ + C##LEVEL##_IF(el::base::PErrorWriter, condition, el::base::DispatchAction::NormalLog, __VA_ARGS__) +#define DCPLOG(LEVEL, ...)\ + if (ELPP_DEBUG_LOG) C##LEVEL(el::base::PErrorWriter, el::base::DispatchAction::NormalLog, __VA_ARGS__) +#define DCPLOG_IF(condition, LEVEL, ...)\ + C##LEVEL##_IF(el::base::PErrorWriter, (ELPP_DEBUG_LOG) && (condition), el::base::DispatchAction::NormalLog, __VA_ARGS__) +#define PLOG(LEVEL) CPLOG(LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define PLOG_IF(condition, LEVEL) CPLOG_IF(condition, LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define DPLOG(LEVEL) DCPLOG(LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define DPLOG_IF(condition, LEVEL) DCPLOG_IF(condition, LEVEL, ELPP_CURR_FILE_LOGGER_ID) +// Generic SYSLOG() +#undef CSYSLOG +#undef CSYSLOG_IF +#undef CSYSLOG_EVERY_N +#undef CSYSLOG_AFTER_N +#undef CSYSLOG_N_TIMES +#undef SYSLOG +#undef SYSLOG_IF +#undef SYSLOG_EVERY_N +#undef SYSLOG_AFTER_N +#undef SYSLOG_N_TIMES +#undef DCSYSLOG +#undef DCSYSLOG_IF +#undef DCSYSLOG_EVERY_N +#undef DCSYSLOG_AFTER_N +#undef DCSYSLOG_N_TIMES +#undef DSYSLOG +#undef DSYSLOG_IF +#undef DSYSLOG_EVERY_N +#undef DSYSLOG_AFTER_N +#undef DSYSLOG_N_TIMES +#if defined(ELPP_SYSLOG) +# define CSYSLOG(LEVEL, ...)\ + C##LEVEL(el::base::Writer, el::base::DispatchAction::SysLog, __VA_ARGS__) +# define CSYSLOG_IF(condition, LEVEL, ...)\ + C##LEVEL##_IF(el::base::Writer, condition, el::base::DispatchAction::SysLog, __VA_ARGS__) +# define CSYSLOG_EVERY_N(n, LEVEL, ...) C##LEVEL##_EVERY_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__) +# define CSYSLOG_AFTER_N(n, LEVEL, ...) C##LEVEL##_AFTER_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__) +# define CSYSLOG_N_TIMES(n, LEVEL, ...) C##LEVEL##_N_TIMES(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__) +# define SYSLOG(LEVEL) CSYSLOG(LEVEL, el::base::consts::kSysLogLoggerId) +# define SYSLOG_IF(condition, LEVEL) CSYSLOG_IF(condition, LEVEL, el::base::consts::kSysLogLoggerId) +# define SYSLOG_EVERY_N(n, LEVEL) CSYSLOG_EVERY_N(n, LEVEL, el::base::consts::kSysLogLoggerId) +# define SYSLOG_AFTER_N(n, LEVEL) CSYSLOG_AFTER_N(n, LEVEL, el::base::consts::kSysLogLoggerId) +# define SYSLOG_N_TIMES(n, LEVEL) CSYSLOG_N_TIMES(n, LEVEL, el::base::consts::kSysLogLoggerId) +# define DCSYSLOG(LEVEL, ...) if (ELPP_DEBUG_LOG) C##LEVEL(el::base::Writer, el::base::DispatchAction::SysLog, __VA_ARGS__) +# define DCSYSLOG_IF(condition, LEVEL, ...)\ + C##LEVEL##_IF(el::base::Writer, (ELPP_DEBUG_LOG) && (condition), el::base::DispatchAction::SysLog, __VA_ARGS__) +# define DCSYSLOG_EVERY_N(n, LEVEL, ...)\ + if (ELPP_DEBUG_LOG) C##LEVEL##_EVERY_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__) +# define DCSYSLOG_AFTER_N(n, LEVEL, ...)\ + if (ELPP_DEBUG_LOG) C##LEVEL##_AFTER_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__) +# define DCSYSLOG_N_TIMES(n, LEVEL, ...)\ + if (ELPP_DEBUG_LOG) C##LEVEL##_EVERY_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__) +# define DSYSLOG(LEVEL) DCSYSLOG(LEVEL, el::base::consts::kSysLogLoggerId) +# define DSYSLOG_IF(condition, LEVEL) DCSYSLOG_IF(condition, LEVEL, el::base::consts::kSysLogLoggerId) +# define DSYSLOG_EVERY_N(n, LEVEL) DCSYSLOG_EVERY_N(n, LEVEL, el::base::consts::kSysLogLoggerId) +# define DSYSLOG_AFTER_N(n, LEVEL) DCSYSLOG_AFTER_N(n, LEVEL, el::base::consts::kSysLogLoggerId) +# define DSYSLOG_N_TIMES(n, LEVEL) DCSYSLOG_N_TIMES(n, LEVEL, el::base::consts::kSysLogLoggerId) +#else +# define CSYSLOG(LEVEL, ...) el::base::NullWriter() +# define CSYSLOG_IF(condition, LEVEL, ...) el::base::NullWriter() +# define CSYSLOG_EVERY_N(n, LEVEL, ...) el::base::NullWriter() +# define CSYSLOG_AFTER_N(n, LEVEL, ...) el::base::NullWriter() +# define CSYSLOG_N_TIMES(n, LEVEL, ...) el::base::NullWriter() +# define SYSLOG(LEVEL) el::base::NullWriter() +# define SYSLOG_IF(condition, LEVEL) el::base::NullWriter() +# define SYSLOG_EVERY_N(n, LEVEL) el::base::NullWriter() +# define SYSLOG_AFTER_N(n, LEVEL) el::base::NullWriter() +# define SYSLOG_N_TIMES(n, LEVEL) el::base::NullWriter() +# define DCSYSLOG(LEVEL, ...) el::base::NullWriter() +# define DCSYSLOG_IF(condition, LEVEL, ...) el::base::NullWriter() +# define DCSYSLOG_EVERY_N(n, LEVEL, ...) el::base::NullWriter() +# define DCSYSLOG_AFTER_N(n, LEVEL, ...) el::base::NullWriter() +# define DCSYSLOG_N_TIMES(n, LEVEL, ...) el::base::NullWriter() +# define DSYSLOG(LEVEL) el::base::NullWriter() +# define DSYSLOG_IF(condition, LEVEL) el::base::NullWriter() +# define DSYSLOG_EVERY_N(n, LEVEL) el::base::NullWriter() +# define DSYSLOG_AFTER_N(n, LEVEL) el::base::NullWriter() +# define DSYSLOG_N_TIMES(n, LEVEL) el::base::NullWriter() +#endif // defined(ELPP_SYSLOG) +// +// Custom Debug Only Loggers - Requires (level, loggerId/s) +// +// undef existing +#undef DCLOG +#undef DCVLOG +#undef DCLOG_IF +#undef DCVLOG_IF +#undef DCLOG_EVERY_N +#undef DCVLOG_EVERY_N +#undef DCLOG_AFTER_N +#undef DCVLOG_AFTER_N +#undef DCLOG_N_TIMES +#undef DCVLOG_N_TIMES +// Normal logs +#define DCLOG(LEVEL, ...) if (ELPP_DEBUG_LOG) CLOG(LEVEL, __VA_ARGS__) +#define DCLOG_VERBOSE(vlevel, ...) if (ELPP_DEBUG_LOG) CLOG_VERBOSE(vlevel, __VA_ARGS__) +#define DCVLOG(vlevel, ...) if (ELPP_DEBUG_LOG) CVLOG(vlevel, __VA_ARGS__) +// Conditional logs +#define DCLOG_IF(condition, LEVEL, ...) if (ELPP_DEBUG_LOG) CLOG_IF(condition, LEVEL, __VA_ARGS__) +#define DCVLOG_IF(condition, vlevel, ...) if (ELPP_DEBUG_LOG) CVLOG_IF(condition, vlevel, __VA_ARGS__) +// Hit counts based logs +#define DCLOG_EVERY_N(n, LEVEL, ...) if (ELPP_DEBUG_LOG) CLOG_EVERY_N(n, LEVEL, __VA_ARGS__) +#define DCVLOG_EVERY_N(n, vlevel, ...) if (ELPP_DEBUG_LOG) CVLOG_EVERY_N(n, vlevel, __VA_ARGS__) +#define DCLOG_AFTER_N(n, LEVEL, ...) if (ELPP_DEBUG_LOG) CLOG_AFTER_N(n, LEVEL, __VA_ARGS__) +#define DCVLOG_AFTER_N(n, vlevel, ...) if (ELPP_DEBUG_LOG) CVLOG_AFTER_N(n, vlevel, __VA_ARGS__) +#define DCLOG_N_TIMES(n, LEVEL, ...) if (ELPP_DEBUG_LOG) CLOG_N_TIMES(n, LEVEL, __VA_ARGS__) +#define DCVLOG_N_TIMES(n, vlevel, ...) if (ELPP_DEBUG_LOG) CVLOG_N_TIMES(n, vlevel, __VA_ARGS__) +// +// Default Debug Only Loggers macro using CLOG(), CLOG_VERBOSE() and CVLOG() macros +// +// undef existing +#undef DLOG +#undef DVLOG +#undef DLOG_IF +#undef DVLOG_IF +#undef DLOG_EVERY_N +#undef DVLOG_EVERY_N +#undef DLOG_AFTER_N +#undef DVLOG_AFTER_N +#undef DLOG_N_TIMES +#undef DVLOG_N_TIMES +// Normal logs +#define DLOG(LEVEL) DCLOG(LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define DVLOG(vlevel) DCVLOG(vlevel, ELPP_CURR_FILE_LOGGER_ID) +// Conditional logs +#define DLOG_IF(condition, LEVEL) DCLOG_IF(condition, LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define DVLOG_IF(condition, vlevel) DCVLOG_IF(condition, vlevel, ELPP_CURR_FILE_LOGGER_ID) +// Hit counts based logs +#define DLOG_EVERY_N(n, LEVEL) DCLOG_EVERY_N(n, LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define DVLOG_EVERY_N(n, vlevel) DCVLOG_EVERY_N(n, vlevel, ELPP_CURR_FILE_LOGGER_ID) +#define DLOG_AFTER_N(n, LEVEL) DCLOG_AFTER_N(n, LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define DVLOG_AFTER_N(n, vlevel) DCVLOG_AFTER_N(n, vlevel, ELPP_CURR_FILE_LOGGER_ID) +#define DLOG_N_TIMES(n, LEVEL) DCLOG_N_TIMES(n, LEVEL, ELPP_CURR_FILE_LOGGER_ID) +#define DVLOG_N_TIMES(n, vlevel) DCVLOG_N_TIMES(n, vlevel, ELPP_CURR_FILE_LOGGER_ID) +// Check macros +#undef CCHECK +#undef CPCHECK +#undef CCHECK_EQ +#undef CCHECK_NE +#undef CCHECK_LT +#undef CCHECK_GT +#undef CCHECK_LE +#undef CCHECK_GE +#undef CCHECK_BOUNDS +#undef CCHECK_NOTNULL +#undef CCHECK_STRCASEEQ +#undef CCHECK_STRCASENE +#undef CHECK +#undef PCHECK +#undef CHECK_EQ +#undef CHECK_NE +#undef CHECK_LT +#undef CHECK_GT +#undef CHECK_LE +#undef CHECK_GE +#undef CHECK_BOUNDS +#undef CHECK_NOTNULL +#undef CHECK_STRCASEEQ +#undef CHECK_STRCASENE +#define CCHECK(condition, ...) CLOG_IF(!(condition), FATAL, __VA_ARGS__) << "Check failed: [" << #condition << "] " +#define CPCHECK(condition, ...) CPLOG_IF(!(condition), FATAL, __VA_ARGS__) << "Check failed: [" << #condition << "] " +#define CHECK(condition) CCHECK(condition, ELPP_CURR_FILE_LOGGER_ID) +#define PCHECK(condition) CPCHECK(condition, ELPP_CURR_FILE_LOGGER_ID) +#define CCHECK_EQ(a, b, ...) CCHECK(a == b, __VA_ARGS__) +#define CCHECK_NE(a, b, ...) CCHECK(a != b, __VA_ARGS__) +#define CCHECK_LT(a, b, ...) CCHECK(a < b, __VA_ARGS__) +#define CCHECK_GT(a, b, ...) CCHECK(a > b, __VA_ARGS__) +#define CCHECK_LE(a, b, ...) CCHECK(a <= b, __VA_ARGS__) +#define CCHECK_GE(a, b, ...) CCHECK(a >= b, __VA_ARGS__) +#define CCHECK_BOUNDS(val, min, max, ...) CCHECK(val >= min && val <= max, __VA_ARGS__) +#define CHECK_EQ(a, b) CCHECK_EQ(a, b, ELPP_CURR_FILE_LOGGER_ID) +#define CHECK_NE(a, b) CCHECK_NE(a, b, ELPP_CURR_FILE_LOGGER_ID) +#define CHECK_LT(a, b) CCHECK_LT(a, b, ELPP_CURR_FILE_LOGGER_ID) +#define CHECK_GT(a, b) CCHECK_GT(a, b, ELPP_CURR_FILE_LOGGER_ID) +#define CHECK_LE(a, b) CCHECK_LE(a, b, ELPP_CURR_FILE_LOGGER_ID) +#define CHECK_GE(a, b) CCHECK_GE(a, b, ELPP_CURR_FILE_LOGGER_ID) +#define CHECK_BOUNDS(val, min, max) CCHECK_BOUNDS(val, min, max, ELPP_CURR_FILE_LOGGER_ID) +namespace el { +namespace base { +namespace utils { +template +static T* checkNotNull(T* ptr, const char* name, const char* loggers, ...) { + CLOG_IF(ptr == nullptr, FATAL, loggers) << "Check failed: [" << name << " != nullptr]"; + return ptr; +} +} // namespace utils +} // namespace base +} // namespace el +#define CCHECK_NOTNULL(ptr, ...) el::base::utils::checkNotNull(ptr, #ptr, __VA_ARGS__) +#define CCHECK_STREQ(str1, str2, ...) CLOG_IF(!el::base::utils::Str::cStringEq(str1, str2), FATAL, __VA_ARGS__) \ + << "Check failed: [" << #str1 << " == " << #str2 << "] " +#define CCHECK_STRNE(str1, str2, ...) CLOG_IF(el::base::utils::Str::cStringEq(str1, str2), FATAL, __VA_ARGS__) \ + << "Check failed: [" << #str1 << " != " << #str2 << "] " +#define CCHECK_STRCASEEQ(str1, str2, ...) CLOG_IF(!el::base::utils::Str::cStringCaseEq(str1, str2), FATAL, __VA_ARGS__) \ + << "Check failed: [" << #str1 << " == " << #str2 << "] " +#define CCHECK_STRCASENE(str1, str2, ...) CLOG_IF(el::base::utils::Str::cStringCaseEq(str1, str2), FATAL, __VA_ARGS__) \ + << "Check failed: [" << #str1 << " != " << #str2 << "] " +#define CHECK_NOTNULL(ptr) CCHECK_NOTNULL(ptr, ELPP_CURR_FILE_LOGGER_ID) +#define CHECK_STREQ(str1, str2) CCHECK_STREQ(str1, str2, ELPP_CURR_FILE_LOGGER_ID) +#define CHECK_STRNE(str1, str2) CCHECK_STRNE(str1, str2, ELPP_CURR_FILE_LOGGER_ID) +#define CHECK_STRCASEEQ(str1, str2) CCHECK_STRCASEEQ(str1, str2, ELPP_CURR_FILE_LOGGER_ID) +#define CHECK_STRCASENE(str1, str2) CCHECK_STRCASENE(str1, str2, ELPP_CURR_FILE_LOGGER_ID) +#undef DCCHECK +#undef DCCHECK_EQ +#undef DCCHECK_NE +#undef DCCHECK_LT +#undef DCCHECK_GT +#undef DCCHECK_LE +#undef DCCHECK_GE +#undef DCCHECK_BOUNDS +#undef DCCHECK_NOTNULL +#undef DCCHECK_STRCASEEQ +#undef DCCHECK_STRCASENE +#undef DCPCHECK +#undef DCHECK +#undef DCHECK_EQ +#undef DCHECK_NE +#undef DCHECK_LT +#undef DCHECK_GT +#undef DCHECK_LE +#undef DCHECK_GE +#undef DCHECK_BOUNDS_ +#undef DCHECK_NOTNULL +#undef DCHECK_STRCASEEQ +#undef DCHECK_STRCASENE +#undef DPCHECK +#define DCCHECK(condition, ...) if (ELPP_DEBUG_LOG) CCHECK(condition, __VA_ARGS__) +#define DCCHECK_EQ(a, b, ...) if (ELPP_DEBUG_LOG) CCHECK_EQ(a, b, __VA_ARGS__) +#define DCCHECK_NE(a, b, ...) if (ELPP_DEBUG_LOG) CCHECK_NE(a, b, __VA_ARGS__) +#define DCCHECK_LT(a, b, ...) if (ELPP_DEBUG_LOG) CCHECK_LT(a, b, __VA_ARGS__) +#define DCCHECK_GT(a, b, ...) if (ELPP_DEBUG_LOG) CCHECK_GT(a, b, __VA_ARGS__) +#define DCCHECK_LE(a, b, ...) if (ELPP_DEBUG_LOG) CCHECK_LE(a, b, __VA_ARGS__) +#define DCCHECK_GE(a, b, ...) if (ELPP_DEBUG_LOG) CCHECK_GE(a, b, __VA_ARGS__) +#define DCCHECK_BOUNDS(val, min, max, ...) if (ELPP_DEBUG_LOG) CCHECK_BOUNDS(val, min, max, __VA_ARGS__) +#define DCCHECK_NOTNULL(ptr, ...) if (ELPP_DEBUG_LOG) CCHECK_NOTNULL(ptr, __VA_ARGS__) +#define DCCHECK_STREQ(str1, str2, ...) if (ELPP_DEBUG_LOG) CCHECK_STREQ(str1, str2, __VA_ARGS__) +#define DCCHECK_STRNE(str1, str2, ...) if (ELPP_DEBUG_LOG) CCHECK_STRNE(str1, str2, __VA_ARGS__) +#define DCCHECK_STRCASEEQ(str1, str2, ...) if (ELPP_DEBUG_LOG) CCHECK_STRCASEEQ(str1, str2, __VA_ARGS__) +#define DCCHECK_STRCASENE(str1, str2, ...) if (ELPP_DEBUG_LOG) CCHECK_STRCASENE(str1, str2, __VA_ARGS__) +#define DCPCHECK(condition, ...) if (ELPP_DEBUG_LOG) CPCHECK(condition, __VA_ARGS__) +#define DCHECK(condition) DCCHECK(condition, ELPP_CURR_FILE_LOGGER_ID) +#define DCHECK_EQ(a, b) DCCHECK_EQ(a, b, ELPP_CURR_FILE_LOGGER_ID) +#define DCHECK_NE(a, b) DCCHECK_NE(a, b, ELPP_CURR_FILE_LOGGER_ID) +#define DCHECK_LT(a, b) DCCHECK_LT(a, b, ELPP_CURR_FILE_LOGGER_ID) +#define DCHECK_GT(a, b) DCCHECK_GT(a, b, ELPP_CURR_FILE_LOGGER_ID) +#define DCHECK_LE(a, b) DCCHECK_LE(a, b, ELPP_CURR_FILE_LOGGER_ID) +#define DCHECK_GE(a, b) DCCHECK_GE(a, b, ELPP_CURR_FILE_LOGGER_ID) +#define DCHECK_BOUNDS(val, min, max) DCCHECK_BOUNDS(val, min, max, ELPP_CURR_FILE_LOGGER_ID) +#define DCHECK_NOTNULL(ptr) DCCHECK_NOTNULL(ptr, ELPP_CURR_FILE_LOGGER_ID) +#define DCHECK_STREQ(str1, str2) DCCHECK_STREQ(str1, str2, ELPP_CURR_FILE_LOGGER_ID) +#define DCHECK_STRNE(str1, str2) DCCHECK_STRNE(str1, str2, ELPP_CURR_FILE_LOGGER_ID) +#define DCHECK_STRCASEEQ(str1, str2) DCCHECK_STRCASEEQ(str1, str2, ELPP_CURR_FILE_LOGGER_ID) +#define DCHECK_STRCASENE(str1, str2) DCCHECK_STRCASENE(str1, str2, ELPP_CURR_FILE_LOGGER_ID) +#define DPCHECK(condition) DCPCHECK(condition, ELPP_CURR_FILE_LOGGER_ID) +#if defined(ELPP_DISABLE_DEFAULT_CRASH_HANDLING) +# define ELPP_USE_DEF_CRASH_HANDLER false +#else +# define ELPP_USE_DEF_CRASH_HANDLER true +#endif // defined(ELPP_DISABLE_DEFAULT_CRASH_HANDLING) +#define ELPP_CRASH_HANDLER_INIT +#define ELPP_INIT_EASYLOGGINGPP(val)\ + ELPP_INITI_BASIC_DECLR\ + namespace el {\ + namespace base {\ + el::base::type::StoragePointer elStorage(val);\ + }\ + el::base::debug::CrashHandler elCrashHandler(ELPP_USE_DEF_CRASH_HANDLER);\ + } + +#if ELPP_ASYNC_LOGGING +# define INITIALIZE_EASYLOGGINGPP\ + ELPP_INIT_EASYLOGGINGPP(new el::base::Storage(el::LogBuilderPtr(new el::base::DefaultLogBuilder()),\ + new el::base::AsyncDispatchWorker()))\ + +#else +# define INITIALIZE_EASYLOGGINGPP\ + ELPP_INIT_EASYLOGGINGPP(new el::base::Storage(el::LogBuilderPtr(new el::base::DefaultLogBuilder()))) +#endif // ELPP_ASYNC_LOGGING +#define INITIALIZE_NULL_EASYLOGGINGPP\ + ELPP_INITI_BASIC_DECLR\ + namespace el {\ + namespace base {\ + el::base::type::StoragePointer elStorage;\ + }\ + el::base::debug::CrashHandler elCrashHandler(ELPP_USE_DEF_CRASH_HANDLER);\ + } +// NOTE: no ELPP_INITI_BASIC_DECLR when sharing - causes double free corruption on external symbols +#define SHARE_EASYLOGGINGPP(initializedStorage)\ + namespace el {\ + namespace base {\ + el::base::type::StoragePointer elStorage(initializedStorage);\ + }\ + el::base::debug::CrashHandler elCrashHandler(ELPP_USE_DEF_CRASH_HANDLER);\ + } + +#if defined(ELPP_UNICODE) +# define START_EASYLOGGINGPP(argc, argv) el::Helpers::setArgs(argc, argv); std::locale::global(std::locale("")) +#else +# define START_EASYLOGGINGPP(argc, argv) el::Helpers::setArgs(argc, argv) +#endif // defined(ELPP_UNICODE) +#endif // EASYLOGGINGPP_H diff --git a/src/thirdparty/jsoncpp b/src/thirdparty/jsoncpp new file mode 160000 index 00000000..b4d2b658 --- /dev/null +++ b/src/thirdparty/jsoncpp @@ -0,0 +1 @@ +Subproject commit b4d2b658416b8087f89599daac9b9c36c6c56616 diff --git a/src/thirdparty/nanogui b/src/thirdparty/nanogui new file mode 160000 index 00000000..3c31c570 --- /dev/null +++ b/src/thirdparty/nanogui @@ -0,0 +1 @@ +Subproject commit 3c31c57087f3a140dfafbefd3bb27cc5ce6d05c7 diff --git a/src/thirdparty/openvdb b/src/thirdparty/openvdb new file mode 160000 index 00000000..c332c9c4 --- /dev/null +++ b/src/thirdparty/openvdb @@ -0,0 +1 @@ +Subproject commit c332c9c4bfc4471c8ce81f445af1ea6db36a08ca diff --git a/src/thirdparty/openvdb_points_dev b/src/thirdparty/openvdb_points_dev new file mode 160000 index 00000000..804a95f8 --- /dev/null +++ b/src/thirdparty/openvdb_points_dev @@ -0,0 +1 @@ +Subproject commit 804a95f8992cd02d963194399805d228efd773e8 diff --git a/src/utility.cpp b/src/utility.cpp new file mode 100644 index 00000000..bd23b9ae --- /dev/null +++ b/src/utility.cpp @@ -0,0 +1,39 @@ +#include +#include + +bool +ParseJson( + const char* filepath, + Json::Value& root + ) +{ + // -- Open file + std::string jsonText; + std::string line; + std::ifstream jsonFile(filepath); + if (jsonFile.is_open() == false) { + std::cout << "JSON file not open." << std::endl; + return false; + } + while (std::getline(jsonFile, line)) { + jsonText += line; + } + + // -- Parse json + Json::Reader reader; + bool success = reader.parse(jsonText, root, false); + if (!success) + { + std::cout << "Parsing failed." << std::endl; + + // report to the user the failure and their locations in the document. + std::cout << reader.getFormatedErrorMessages() << std::endl; + return false; + } + + return true; +} + + + + diff --git a/src/utility.h b/src/utility.h new file mode 100644 index 00000000..fab6acca --- /dev/null +++ b/src/utility.h @@ -0,0 +1,13 @@ +#ifndef UTILITY_H +#define UTILITY_H + +#include +#include +#include +#include + +// This file includes all the helpers for our fluid solvers + +bool ParseJson(const char* filepath, Json::Value& root); + +#endif UTILITY_H diff --git a/src/viewer.cpp b/src/viewer.cpp new file mode 100644 index 00000000..ec16b34c --- /dev/null +++ b/src/viewer.cpp @@ -0,0 +1,301 @@ +#include "viewer.h" + +Viewer::Viewer( + int width, + int height + ) : nanogui::Screen(Eigen::Vector2i(width, height), "Korra Fluid Simulation"), + m_program(nullptr), + m_programAdvect(nullptr), + m_scene(nullptr), + m_labelFps(nullptr), + m_checkBoxSolid1(nullptr), + m_checkBoxSolid2(nullptr) +{ + m_width = width; + m_height = height; + + this->Init(); +} + +void +Viewer::Init() +{ + // -- Initialise GLFW + if( !glfwInit() ) + { + fprintf( stderr, "Failed to initialize GLFW\n" ); + getchar(); + } + + // antiliasing 4 samples + glfwWindowHint(GLFW_SAMPLES, 4); + glfwWindowHint(GLFW_RESIZABLE,GL_FALSE); + // Get version 3.3 + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + // To make MacOS happy; should not be needed + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); + // Make sure with don't use old profile + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + + // -- Initialize GLEW + + // *N.B*: Strange we have to do this to make glGenVertexArrays to work? + // + // GLEW obtains information on the supported extensions from the graphics driver. Experimental or pre-release drivers, however, might not report every available extension through the standard mechanism, in which case GLEW will report it unsupported. To circumvent this situation, the glewExperimental global switch can be turned on by setting it to GL_TRUE before calling glewInit(), which ensures that all extensions with valid entry points will be exposed. + glewExperimental = GL_TRUE; + if (glewInit() != GLEW_OK) { + fprintf(stderr, "Failed to initialize GLEW\n"); + getchar(); + this->CleanUp(); + } + + // -- Initialize shader program + m_program = new ShaderProgram("../src/glsl/simple.vert", "../src/glsl/simple.frag"); + m_programAdvect = new ParticleAdvectProgram( + "../src/glsl/particle_advect.vert", + "../src/glsl/particle_advect.frag", + "../src/glsl/particle_draw.vert", + "../src/glsl/particle_draw.frag" + ); + + // -- Initialize scene + m_scene = new Scene(m_width, m_height); + + // Have a test scene here in case our graphics pipeline is broken +// #define TEST_SCENE +#ifdef TEST_SCENE + m_scene->InitFromTestScene(); +#else + m_scene->InitFromJson("../src/scene/scene.json"); +#endif + + // -- Initialize GUI + InitGUI(); +} + +void +Viewer::InitGUI() +{ + Window* toolbox = new Window(this, "Bending parameters"); + toolbox->setPosition(Vector2i(20, 20)); + toolbox->setLayout(new GroupLayout()); + + // -- Diagnostics + Widget* widget = new Widget(toolbox); + GridLayout *layout = + new GridLayout( + Orientation::Horizontal, + 2, + Alignment::Middle, + 15, + 5); + layout->setColAlignment( + { Alignment::Maximum, Alignment::Fill }); + layout->setSpacing(0, 10); + widget->setLayout(layout); + + // FPS + // new Label(widget, "FPS: ", "sans-bold"); + // m_labelFps = new Label(widget, to_string(m_fps), "sans-bold"); + + new Label(widget, "Number of particles: ", "sans-bold"); + new Label(widget, to_string(m_scene->NumParticles()), "sans-bold"); + + // Paricle infos + + // -- Parameter widgets + widget = new Widget(toolbox); + layout = + new GridLayout( + Orientation::Horizontal, + 3, + Alignment::Middle, + 15, + 5); + layout->setColAlignment( + { Alignment::Maximum, Alignment::Fill }); + layout->setSpacing(0, 10); + widget->setLayout(layout); + + // Global constants + + new Label(widget, "Mass: ", "sans-bold"); + Slider *slider = new Slider(widget); + Label* label = new Label(widget, "0.125", "sans-bold"); + slider->setValue(0.0f); + slider->setCallback([this, label](float value) { + float mass = value + 0.125f; + m_scene->SetConstant(SPHMass, mass); + label->setCaption(to_string(mass)); + }); + + new Label(widget, "Stiffness: ", "sans-bold"); + slider = new Slider(widget); + label = new Label(widget, "10", "sans-bold"); + slider->setValue(0.f); + slider->setCallback([this, label](float value) { + float stiffness = value * 1000.0f + 10.f; + m_scene->SetConstant(SPHStiffness, stiffness); + label->setCaption(to_string(stiffness)); + }); + + new Label(widget, "Viscosity: ", "sans-bold"); + slider = new Slider(widget); + label = new Label(widget, "0", "sans-bold"); + slider->setValue(0.0f); + slider->setCallback([this, label](float value) { + float viscosity = value * 10.0f; + m_scene->SetConstant(SPHViscosity, viscosity); + label->setCaption(to_string(viscosity)); + }); + + new Label(widget, "Rest Density: ", "sans-bold"); + slider = new Slider(widget); + label = new Label(widget, "1000", "sans-bold"); + slider->setValue(0.5f); + slider->setCallback([this, label](float value) { + float restDensity = value * 2000.0f; + m_scene->SetConstant(SPHRestDensity, restDensity); + label->setCaption(to_string(restDensity)); + }); + + new Label(widget, "Time step: ", "sans-bold"); + slider = new Slider(widget); + label = new Label(widget, "0.001", "sans-bold"); + slider->setValue(0.1f); + slider->setCallback([this, label](float value) { + m_timeStep = value / 100.0f + 0.001f; + label->setCaption(to_string(m_timeStep)); + }); + + m_checkBoxSolid1 = new CheckBox(widget, "Test box 1"); + m_checkBoxSolid1->setCallback([this](bool state) { + m_scene->EnableTestBoxOne(state); + }); + + m_checkBoxSolid2 = new CheckBox(widget, "Test box 2"); + m_checkBoxSolid2->setCallback([this](bool state) { + m_scene->EnableTestBoxTwo(state); + }); + + // -- Coloring particles + widget = new Widget(toolbox); + widget->setLayout(new GroupLayout()); + new Label(widget, "Particle color", "sans-bold"); + ComboBox* cb = new ComboBox(widget, { "Blue", "Pressure", "Viscosity", "Velocity", "All forces"}); + cb->setCallback([this](int index) { + FluidParticle::colorType = (SPHColor)index; + }); + + // -- Buttons + widget = new Widget(toolbox); + widget->setLayout(new GroupLayout()); + + // Pause + Button* b = new Button(widget, "Pause"); + b->setCallback([this] { + m_scene->Pause(); + }); + + // Replay + b = new Button(widget, "Replay"); + b->setCallback([this] { + this->ReplayScene(); + }); + + // Quit + b = new Button(widget, "Quit"); + b->setCallback([this] { + this->CleanUp(); + }); + + performLayout(mNVGContext); +} + +void +Viewer::ReplayScene() +{ + if (m_scene != nullptr) { + delete m_scene; + } + m_scene = new Scene(m_width, m_height); + m_scene->InitFromJson("../src/scene/scene.json"); + + // -- Update scene based on current state of GUI + m_scene->EnableTestBoxOne(m_checkBoxSolid1->checked()); + m_scene->EnableTestBoxTwo(m_checkBoxSolid2->checked()); +} + +void +Viewer::draw( + NVGcontext *ctx + ) +{ + Screen::draw(ctx); +} + +void +Viewer::drawContents() +{ + // -- Update fps + static double lastTime = glfwGetTime(); + double currentTime = glfwGetTime(); + double deltaTime = double(currentTime - lastTime); + m_fps = 1000.0 / deltaTime; + // m_labelFps->setCaption(to_string(m_fps)); + +#ifdef TEST_SCENE + m_scene->Draw(*m_program); +#else + m_scene->Update(m_timeStep, *m_programAdvect); + m_scene->DrawTransformFeedback(*m_program, *m_programAdvect); +#endif + +} + +bool +Viewer::keyboardEvent( + int key, + int scancode, + int action, + int modifiers + ) +{ + if (Screen::keyboardEvent(key, scancode, action, modifiers)) + return true; + + // Quit + if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) { + this->CleanUp(); + return true; + } + + // Replay + if (key == GLFW_KEY_R && action == GLFW_PRESS) { + this->ReplayScene(); + } + + m_scene->ReadInputs((KeyCode)key, (KeyAction)action); + return false; +} + +void +Viewer::CleanUp() +{ + m_program->CleanUp(); + m_programAdvect->CleanUp(); + m_scene->CleanUp(); + + // *N.B*: Should delete resources in reverse order of creation + delete m_scene; + delete m_programAdvect; + delete m_program; + + setVisible(false); + nanogui::shutdown(); + + // Close OpenGL window and terminate GLFW + glfwTerminate(); +} + diff --git a/src/viewer.h b/src/viewer.h new file mode 100644 index 00000000..f7689ca1 --- /dev/null +++ b/src/viewer.h @@ -0,0 +1,79 @@ +#ifndef viewer_hpp +#define viewer_hpp + +// #define TEST_SCENE + +// C++ libraries + +#include + +// GL libraries + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(_WIN32) +#include +#endif +// #include +#include + +#include +#include +#include +#include +#include + +using namespace nanogui; + +class Viewer :public nanogui::Screen +{ +public: + Viewer( + int width = 800, + int height = 600 + ); + + virtual void CleanUp(); + virtual void draw(NVGcontext *ctx); + virtual void drawContents(); + virtual bool keyboardEvent(int key, int scancode, int action, int modifiers); + + float Width() { + return m_width; + } + + float Height() { + return m_height; + } + +protected: + void Init(); + void InitGUI(); + void ReplayScene(); + + float m_width; + float m_height; + float m_timeStep = 0.001f; + uint m_fps; + + ShaderProgram* m_program; + ParticleAdvectProgram* m_programAdvect; + Scene* m_scene; + + // -- GUI variables + Label* m_labelFps; + CheckBox* m_checkBoxSolid1; + CheckBox* m_checkBoxSolid2; +}; + +#endif /* viewer_hpp */ diff --git a/src/viewer/viewer.cpp b/src/viewer/viewer.cpp deleted file mode 100644 index 60d1868a..00000000 --- a/src/viewer/viewer.cpp +++ /dev/null @@ -1,5 +0,0 @@ -// -// viewer.cpp -// Thanda - -#include "viewer.hpp" diff --git a/src/viewer/viewer.hpp b/src/viewer/viewer.hpp deleted file mode 100644 index abb78a17..00000000 --- a/src/viewer/viewer.hpp +++ /dev/null @@ -1,9 +0,0 @@ -// -// viewer.hpp -// Thanda - -#ifndef viewer_hpp -#define viewer_hpp - - -#endif /* viewer_hpp */