warp-lang 1.0.2__py3-none-macosx_10_13_universal2.whl → 1.1.0__py3-none-macosx_10_13_universal2.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of warp-lang might be problematic. Click here for more details.
- warp/__init__.py +108 -97
- warp/__init__.pyi +1 -1
- warp/bin/libwarp-clang.dylib +0 -0
- warp/bin/libwarp.dylib +0 -0
- warp/build.py +115 -113
- warp/build_dll.py +383 -375
- warp/builtins.py +3425 -3354
- warp/codegen.py +2878 -2792
- warp/config.py +40 -36
- warp/constants.py +45 -45
- warp/context.py +5194 -5102
- warp/dlpack.py +442 -442
- warp/examples/__init__.py +16 -16
- warp/examples/assets/bear.usd +0 -0
- warp/examples/assets/bunny.usd +0 -0
- warp/examples/assets/cartpole.urdf +110 -110
- warp/examples/assets/crazyflie.usd +0 -0
- warp/examples/assets/cube.usd +0 -0
- warp/examples/assets/nv_ant.xml +92 -92
- warp/examples/assets/nv_humanoid.xml +183 -183
- warp/examples/assets/quadruped.urdf +267 -267
- warp/examples/assets/rocks.nvdb +0 -0
- warp/examples/assets/rocks.usd +0 -0
- warp/examples/assets/sphere.usd +0 -0
- warp/examples/benchmarks/benchmark_api.py +383 -383
- warp/examples/benchmarks/benchmark_cloth.py +278 -277
- warp/examples/benchmarks/benchmark_cloth_cupy.py +88 -88
- warp/examples/benchmarks/benchmark_cloth_jax.py +97 -100
- warp/examples/benchmarks/benchmark_cloth_numba.py +146 -142
- warp/examples/benchmarks/benchmark_cloth_numpy.py +77 -77
- warp/examples/benchmarks/benchmark_cloth_pytorch.py +86 -86
- warp/examples/benchmarks/benchmark_cloth_taichi.py +112 -112
- warp/examples/benchmarks/benchmark_cloth_warp.py +146 -146
- warp/examples/benchmarks/benchmark_launches.py +295 -295
- warp/examples/browse.py +29 -29
- warp/examples/core/example_dem.py +234 -219
- warp/examples/core/example_fluid.py +293 -267
- warp/examples/core/example_graph_capture.py +144 -126
- warp/examples/core/example_marching_cubes.py +188 -174
- warp/examples/core/example_mesh.py +174 -155
- warp/examples/core/example_mesh_intersect.py +205 -193
- warp/examples/core/example_nvdb.py +176 -170
- warp/examples/core/example_raycast.py +105 -90
- warp/examples/core/example_raymarch.py +199 -178
- warp/examples/core/example_render_opengl.py +185 -141
- warp/examples/core/example_sph.py +405 -387
- warp/examples/core/example_torch.py +222 -181
- warp/examples/core/example_wave.py +263 -248
- warp/examples/fem/bsr_utils.py +378 -380
- warp/examples/fem/example_apic_fluid.py +407 -389
- warp/examples/fem/example_convection_diffusion.py +182 -168
- warp/examples/fem/example_convection_diffusion_dg.py +219 -209
- warp/examples/fem/example_convection_diffusion_dg0.py +204 -194
- warp/examples/fem/example_deformed_geometry.py +177 -159
- warp/examples/fem/example_diffusion.py +201 -173
- warp/examples/fem/example_diffusion_3d.py +177 -152
- warp/examples/fem/example_diffusion_mgpu.py +221 -214
- warp/examples/fem/example_mixed_elasticity.py +244 -222
- warp/examples/fem/example_navier_stokes.py +259 -243
- warp/examples/fem/example_stokes.py +220 -192
- warp/examples/fem/example_stokes_transfer.py +265 -249
- warp/examples/fem/mesh_utils.py +133 -109
- warp/examples/fem/plot_utils.py +292 -287
- warp/examples/optim/example_bounce.py +260 -246
- warp/examples/optim/example_cloth_throw.py +222 -209
- warp/examples/optim/example_diffray.py +566 -536
- warp/examples/optim/example_drone.py +864 -835
- warp/examples/optim/example_inverse_kinematics.py +176 -168
- warp/examples/optim/example_inverse_kinematics_torch.py +185 -169
- warp/examples/optim/example_spring_cage.py +239 -231
- warp/examples/optim/example_trajectory.py +223 -199
- warp/examples/optim/example_walker.py +306 -293
- warp/examples/sim/example_cartpole.py +139 -129
- warp/examples/sim/example_cloth.py +196 -186
- warp/examples/sim/example_granular.py +124 -111
- warp/examples/sim/example_granular_collision_sdf.py +197 -186
- warp/examples/sim/example_jacobian_ik.py +236 -214
- warp/examples/sim/example_particle_chain.py +118 -105
- warp/examples/sim/example_quadruped.py +193 -180
- warp/examples/sim/example_rigid_chain.py +197 -187
- warp/examples/sim/example_rigid_contact.py +189 -177
- warp/examples/sim/example_rigid_force.py +127 -125
- warp/examples/sim/example_rigid_gyroscopic.py +109 -95
- warp/examples/sim/example_rigid_soft_contact.py +134 -122
- warp/examples/sim/example_soft_body.py +190 -177
- warp/fabric.py +337 -335
- warp/fem/__init__.py +60 -27
- warp/fem/cache.py +401 -388
- warp/fem/dirichlet.py +178 -179
- warp/fem/domain.py +262 -263
- warp/fem/field/__init__.py +100 -101
- warp/fem/field/field.py +148 -149
- warp/fem/field/nodal_field.py +298 -299
- warp/fem/field/restriction.py +22 -21
- warp/fem/field/test.py +180 -181
- warp/fem/field/trial.py +183 -183
- warp/fem/geometry/__init__.py +15 -19
- warp/fem/geometry/closest_point.py +69 -70
- warp/fem/geometry/deformed_geometry.py +270 -271
- warp/fem/geometry/element.py +744 -744
- warp/fem/geometry/geometry.py +184 -186
- warp/fem/geometry/grid_2d.py +380 -373
- warp/fem/geometry/grid_3d.py +441 -435
- warp/fem/geometry/hexmesh.py +953 -953
- warp/fem/geometry/partition.py +374 -376
- warp/fem/geometry/quadmesh_2d.py +532 -532
- warp/fem/geometry/tetmesh.py +840 -840
- warp/fem/geometry/trimesh_2d.py +577 -577
- warp/fem/integrate.py +1630 -1615
- warp/fem/operator.py +190 -191
- warp/fem/polynomial.py +214 -213
- warp/fem/quadrature/__init__.py +2 -2
- warp/fem/quadrature/pic_quadrature.py +243 -245
- warp/fem/quadrature/quadrature.py +295 -294
- warp/fem/space/__init__.py +294 -292
- warp/fem/space/basis_space.py +488 -489
- warp/fem/space/collocated_function_space.py +100 -105
- warp/fem/space/dof_mapper.py +236 -236
- warp/fem/space/function_space.py +148 -145
- warp/fem/space/grid_2d_function_space.py +267 -267
- warp/fem/space/grid_3d_function_space.py +305 -306
- warp/fem/space/hexmesh_function_space.py +350 -352
- warp/fem/space/partition.py +350 -350
- warp/fem/space/quadmesh_2d_function_space.py +368 -369
- warp/fem/space/restriction.py +158 -160
- warp/fem/space/shape/__init__.py +13 -15
- warp/fem/space/shape/cube_shape_function.py +738 -738
- warp/fem/space/shape/shape_function.py +102 -103
- warp/fem/space/shape/square_shape_function.py +611 -611
- warp/fem/space/shape/tet_shape_function.py +565 -567
- warp/fem/space/shape/triangle_shape_function.py +429 -429
- warp/fem/space/tetmesh_function_space.py +294 -292
- warp/fem/space/topology.py +297 -295
- warp/fem/space/trimesh_2d_function_space.py +223 -221
- warp/fem/types.py +77 -77
- warp/fem/utils.py +495 -495
- warp/jax.py +166 -141
- warp/jax_experimental.py +341 -339
- warp/native/array.h +1072 -1025
- warp/native/builtin.h +1560 -1560
- warp/native/bvh.cpp +398 -398
- warp/native/bvh.cu +525 -525
- warp/native/bvh.h +429 -429
- warp/native/clang/clang.cpp +495 -464
- warp/native/crt.cpp +31 -31
- warp/native/crt.h +334 -334
- warp/native/cuda_crt.h +1049 -1049
- warp/native/cuda_util.cpp +549 -540
- warp/native/cuda_util.h +288 -203
- warp/native/cutlass_gemm.cpp +34 -34
- warp/native/cutlass_gemm.cu +372 -372
- warp/native/error.cpp +66 -66
- warp/native/error.h +27 -27
- warp/native/fabric.h +228 -228
- warp/native/hashgrid.cpp +301 -278
- warp/native/hashgrid.cu +78 -77
- warp/native/hashgrid.h +227 -227
- warp/native/initializer_array.h +32 -32
- warp/native/intersect.h +1204 -1204
- warp/native/intersect_adj.h +365 -365
- warp/native/intersect_tri.h +322 -322
- warp/native/marching.cpp +2 -2
- warp/native/marching.cu +497 -497
- warp/native/marching.h +2 -2
- warp/native/mat.h +1498 -1498
- warp/native/matnn.h +333 -333
- warp/native/mesh.cpp +203 -203
- warp/native/mesh.cu +293 -293
- warp/native/mesh.h +1887 -1887
- warp/native/nanovdb/NanoVDB.h +4782 -4782
- warp/native/nanovdb/PNanoVDB.h +2553 -2553
- warp/native/nanovdb/PNanoVDBWrite.h +294 -294
- warp/native/noise.h +850 -850
- warp/native/quat.h +1084 -1084
- warp/native/rand.h +299 -299
- warp/native/range.h +108 -108
- warp/native/reduce.cpp +156 -156
- warp/native/reduce.cu +348 -348
- warp/native/runlength_encode.cpp +61 -61
- warp/native/runlength_encode.cu +46 -46
- warp/native/scan.cpp +30 -30
- warp/native/scan.cu +36 -36
- warp/native/scan.h +7 -7
- warp/native/solid_angle.h +442 -442
- warp/native/sort.cpp +94 -94
- warp/native/sort.cu +97 -97
- warp/native/sort.h +14 -14
- warp/native/sparse.cpp +337 -337
- warp/native/sparse.cu +544 -544
- warp/native/spatial.h +630 -630
- warp/native/svd.h +562 -562
- warp/native/temp_buffer.h +30 -30
- warp/native/vec.h +1132 -1132
- warp/native/volume.cpp +297 -297
- warp/native/volume.cu +32 -32
- warp/native/volume.h +538 -538
- warp/native/volume_builder.cu +425 -425
- warp/native/volume_builder.h +19 -19
- warp/native/warp.cpp +1057 -1052
- warp/native/warp.cu +2943 -2828
- warp/native/warp.h +313 -305
- warp/optim/__init__.py +9 -9
- warp/optim/adam.py +120 -120
- warp/optim/linear.py +1104 -939
- warp/optim/sgd.py +104 -92
- warp/render/__init__.py +10 -10
- warp/render/render_opengl.py +3217 -3204
- warp/render/render_usd.py +768 -749
- warp/render/utils.py +152 -150
- warp/sim/__init__.py +52 -59
- warp/sim/articulation.py +685 -685
- warp/sim/collide.py +1594 -1590
- warp/sim/import_mjcf.py +489 -481
- warp/sim/import_snu.py +220 -221
- warp/sim/import_urdf.py +536 -516
- warp/sim/import_usd.py +887 -881
- warp/sim/inertia.py +316 -317
- warp/sim/integrator.py +234 -233
- warp/sim/integrator_euler.py +1956 -1956
- warp/sim/integrator_featherstone.py +1910 -1991
- warp/sim/integrator_xpbd.py +3294 -3312
- warp/sim/model.py +4473 -4314
- warp/sim/particles.py +113 -112
- warp/sim/render.py +417 -403
- warp/sim/utils.py +413 -410
- warp/sparse.py +1227 -1227
- warp/stubs.py +2109 -2469
- warp/tape.py +1162 -225
- warp/tests/__init__.py +1 -1
- warp/tests/__main__.py +4 -4
- warp/tests/assets/torus.usda +105 -105
- warp/tests/aux_test_class_kernel.py +26 -26
- warp/tests/aux_test_compile_consts_dummy.py +10 -10
- warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -21
- warp/tests/aux_test_dependent.py +22 -22
- warp/tests/aux_test_grad_customs.py +23 -23
- warp/tests/aux_test_reference.py +11 -11
- warp/tests/aux_test_reference_reference.py +10 -10
- warp/tests/aux_test_square.py +17 -17
- warp/tests/aux_test_unresolved_func.py +14 -14
- warp/tests/aux_test_unresolved_symbol.py +14 -14
- warp/tests/disabled_kinematics.py +239 -239
- warp/tests/run_coverage_serial.py +31 -31
- warp/tests/test_adam.py +157 -157
- warp/tests/test_arithmetic.py +1124 -1124
- warp/tests/test_array.py +2417 -2326
- warp/tests/test_array_reduce.py +150 -150
- warp/tests/test_async.py +668 -656
- warp/tests/test_atomic.py +141 -141
- warp/tests/test_bool.py +204 -149
- warp/tests/test_builtins_resolution.py +1292 -1292
- warp/tests/test_bvh.py +164 -171
- warp/tests/test_closest_point_edge_edge.py +228 -228
- warp/tests/test_codegen.py +566 -553
- warp/tests/test_compile_consts.py +97 -101
- warp/tests/test_conditional.py +246 -246
- warp/tests/test_copy.py +232 -215
- warp/tests/test_ctypes.py +632 -632
- warp/tests/test_dense.py +67 -67
- warp/tests/test_devices.py +91 -98
- warp/tests/test_dlpack.py +530 -529
- warp/tests/test_examples.py +400 -378
- warp/tests/test_fabricarray.py +955 -955
- warp/tests/test_fast_math.py +62 -54
- warp/tests/test_fem.py +1277 -1278
- warp/tests/test_fp16.py +130 -130
- warp/tests/test_func.py +338 -337
- warp/tests/test_generics.py +571 -571
- warp/tests/test_grad.py +746 -640
- warp/tests/test_grad_customs.py +333 -336
- warp/tests/test_hash_grid.py +210 -164
- warp/tests/test_import.py +39 -39
- warp/tests/test_indexedarray.py +1134 -1134
- warp/tests/test_intersect.py +67 -67
- warp/tests/test_jax.py +307 -307
- warp/tests/test_large.py +167 -164
- warp/tests/test_launch.py +354 -354
- warp/tests/test_lerp.py +261 -261
- warp/tests/test_linear_solvers.py +191 -171
- warp/tests/test_lvalue.py +421 -493
- warp/tests/test_marching_cubes.py +65 -65
- warp/tests/test_mat.py +1801 -1827
- warp/tests/test_mat_lite.py +115 -115
- warp/tests/test_mat_scalar_ops.py +2907 -2889
- warp/tests/test_math.py +126 -193
- warp/tests/test_matmul.py +500 -499
- warp/tests/test_matmul_lite.py +410 -410
- warp/tests/test_mempool.py +188 -190
- warp/tests/test_mesh.py +284 -324
- warp/tests/test_mesh_query_aabb.py +228 -241
- warp/tests/test_mesh_query_point.py +692 -702
- warp/tests/test_mesh_query_ray.py +292 -303
- warp/tests/test_mlp.py +276 -276
- warp/tests/test_model.py +110 -110
- warp/tests/test_modules_lite.py +39 -39
- warp/tests/test_multigpu.py +163 -163
- warp/tests/test_noise.py +248 -248
- warp/tests/test_operators.py +250 -250
- warp/tests/test_options.py +123 -125
- warp/tests/test_peer.py +133 -137
- warp/tests/test_pinned.py +78 -78
- warp/tests/test_print.py +54 -54
- warp/tests/test_quat.py +2086 -2086
- warp/tests/test_rand.py +288 -288
- warp/tests/test_reload.py +217 -217
- warp/tests/test_rounding.py +179 -179
- warp/tests/test_runlength_encode.py +190 -190
- warp/tests/test_sim_grad.py +243 -0
- warp/tests/test_sim_kinematics.py +91 -97
- warp/tests/test_smoothstep.py +168 -168
- warp/tests/test_snippet.py +305 -266
- warp/tests/test_sparse.py +468 -460
- warp/tests/test_spatial.py +2148 -2148
- warp/tests/test_streams.py +486 -473
- warp/tests/test_struct.py +710 -675
- warp/tests/test_tape.py +173 -148
- warp/tests/test_torch.py +743 -743
- warp/tests/test_transient_module.py +87 -87
- warp/tests/test_types.py +556 -659
- warp/tests/test_utils.py +490 -499
- warp/tests/test_vec.py +1264 -1268
- warp/tests/test_vec_lite.py +73 -73
- warp/tests/test_vec_scalar_ops.py +2099 -2099
- warp/tests/test_verify_fp.py +94 -94
- warp/tests/test_volume.py +737 -736
- warp/tests/test_volume_write.py +255 -265
- warp/tests/unittest_serial.py +37 -37
- warp/tests/unittest_suites.py +363 -359
- warp/tests/unittest_utils.py +603 -578
- warp/tests/unused_test_misc.py +71 -71
- warp/tests/walkthrough_debug.py +85 -85
- warp/thirdparty/appdirs.py +598 -598
- warp/thirdparty/dlpack.py +143 -143
- warp/thirdparty/unittest_parallel.py +566 -561
- warp/torch.py +321 -295
- warp/types.py +4504 -4450
- warp/utils.py +1008 -821
- {warp_lang-1.0.2.dist-info → warp_lang-1.1.0.dist-info}/LICENSE.md +126 -126
- {warp_lang-1.0.2.dist-info → warp_lang-1.1.0.dist-info}/METADATA +338 -400
- warp_lang-1.1.0.dist-info/RECORD +352 -0
- warp/examples/assets/cube.usda +0 -42
- warp/examples/assets/sphere.usda +0 -56
- warp/examples/assets/torus.usda +0 -105
- warp_lang-1.0.2.dist-info/RECORD +0 -352
- {warp_lang-1.0.2.dist-info → warp_lang-1.1.0.dist-info}/WHEEL +0 -0
- {warp_lang-1.0.2.dist-info → warp_lang-1.1.0.dist-info}/top_level.txt +0 -0
warp/native/volume.h
CHANGED
|
@@ -1,538 +1,538 @@
|
|
|
1
|
-
/** Copyright (c) 2022 NVIDIA CORPORATION. All rights reserved.
|
|
2
|
-
* NVIDIA CORPORATION and its licensors retain all intellectual property
|
|
3
|
-
* and proprietary rights in and to this software, related documentation
|
|
4
|
-
* and any modifications thereto. Any use, reproduction, disclosure or
|
|
5
|
-
* distribution of this software and related documentation without an express
|
|
6
|
-
* license agreement from NVIDIA CORPORATION is strictly prohibited.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
#pragma once
|
|
10
|
-
|
|
11
|
-
#include "builtin.h"
|
|
12
|
-
|
|
13
|
-
#define PNANOVDB_C
|
|
14
|
-
#define PNANOVDB_MEMCPY_CUSTOM
|
|
15
|
-
#define pnanovdb_memcpy memcpy
|
|
16
|
-
#include "nanovdb/PNanoVDB.h"
|
|
17
|
-
#include "nanovdb/PNanoVDBWrite.h"
|
|
18
|
-
|
|
19
|
-
namespace wp
|
|
20
|
-
{
|
|
21
|
-
namespace volume
|
|
22
|
-
{
|
|
23
|
-
|
|
24
|
-
static constexpr int CLOSEST = 0;
|
|
25
|
-
static constexpr int LINEAR = 1;
|
|
26
|
-
|
|
27
|
-
// helper functions
|
|
28
|
-
CUDA_CALLABLE inline pnanovdb_buf_t id_to_buffer(uint64_t id)
|
|
29
|
-
{
|
|
30
|
-
pnanovdb_buf_t buf;
|
|
31
|
-
buf.data = (uint32_t*)id;
|
|
32
|
-
return buf;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
CUDA_CALLABLE inline pnanovdb_uint32_t get_grid_type(const pnanovdb_buf_t& buf)
|
|
36
|
-
{
|
|
37
|
-
const pnanovdb_grid_t *grid_data = (const pnanovdb_grid_t*)buf.data;
|
|
38
|
-
return grid_data->grid_type;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
CUDA_CALLABLE inline pnanovdb_root_handle_t get_root(const pnanovdb_buf_t& buf,
|
|
42
|
-
const pnanovdb_grid_handle_t& grid = { 0u })
|
|
43
|
-
{
|
|
44
|
-
const auto tree = pnanovdb_grid_get_tree(buf, grid);
|
|
45
|
-
return pnanovdb_tree_get_root(buf, tree);
|
|
46
|
-
}
|
|
47
|
-
} // namespace volume
|
|
48
|
-
|
|
49
|
-
CUDA_CALLABLE inline void pnano_read(float& result, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk) {
|
|
50
|
-
const pnanovdb_address_t address = pnanovdb_root_get_value_address(PNANOVDB_GRID_TYPE_FLOAT, buf, root, ijk);
|
|
51
|
-
result = pnanovdb_read_float(buf, address);
|
|
52
|
-
}
|
|
53
|
-
CUDA_CALLABLE inline void pnano_read(int32_t& result, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk) {
|
|
54
|
-
const pnanovdb_address_t address = pnanovdb_root_get_value_address(PNANOVDB_GRID_TYPE_INT32, buf, root, ijk);
|
|
55
|
-
result = pnanovdb_read_int32(buf, address);
|
|
56
|
-
}
|
|
57
|
-
CUDA_CALLABLE inline void pnano_read(vec3& result, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk) {
|
|
58
|
-
const pnanovdb_address_t address = pnanovdb_root_get_value_address(PNANOVDB_GRID_TYPE_VEC3F, buf, root, ijk);
|
|
59
|
-
const pnanovdb_vec3_t v = pnanovdb_read_vec3f(buf, address);
|
|
60
|
-
result = {v.x, v.y, v.z};
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
CUDA_CALLABLE inline void pnano_read(float& result, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk) {
|
|
64
|
-
pnanovdb_address_t address = pnanovdb_readaccessor_get_value_address(PNANOVDB_GRID_TYPE_FLOAT, buf, acc, ijk);
|
|
65
|
-
result = pnanovdb_read_float(buf, address);
|
|
66
|
-
}
|
|
67
|
-
CUDA_CALLABLE inline void pnano_read(int32_t& result, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk) {
|
|
68
|
-
pnanovdb_address_t address = pnanovdb_readaccessor_get_value_address(PNANOVDB_GRID_TYPE_INT32, buf, acc, ijk);
|
|
69
|
-
result = pnanovdb_read_int32(buf, address);
|
|
70
|
-
}
|
|
71
|
-
CUDA_CALLABLE inline void pnano_read(vec3& result, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk) {
|
|
72
|
-
pnanovdb_address_t address = pnanovdb_readaccessor_get_value_address(PNANOVDB_GRID_TYPE_VEC3F, buf, acc, ijk);
|
|
73
|
-
const pnanovdb_vec3_t v = pnanovdb_read_vec3f(buf, address);
|
|
74
|
-
result = {v.x, v.y, v.z};
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Sampling the volume at the given index-space coordinates, uvw can be fractional
|
|
78
|
-
template<typename T>
|
|
79
|
-
CUDA_CALLABLE inline T volume_sample(uint64_t id, vec3 uvw, int sampling_mode)
|
|
80
|
-
{
|
|
81
|
-
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
82
|
-
const pnanovdb_root_handle_t root = volume::get_root(buf);
|
|
83
|
-
const pnanovdb_vec3_t uvw_pnano{ uvw[0], uvw[1], uvw[2] };
|
|
84
|
-
|
|
85
|
-
if (sampling_mode == volume::CLOSEST)
|
|
86
|
-
{
|
|
87
|
-
const pnanovdb_coord_t ijk = pnanovdb_vec3_round_to_coord(uvw_pnano);
|
|
88
|
-
T val;
|
|
89
|
-
pnano_read(val, buf, root, PNANOVDB_REF(ijk));
|
|
90
|
-
return val;
|
|
91
|
-
}
|
|
92
|
-
else if (sampling_mode == volume::LINEAR)
|
|
93
|
-
{
|
|
94
|
-
// NB. linear sampling is not used on int volumes
|
|
95
|
-
constexpr pnanovdb_coord_t OFFSETS[] = {
|
|
96
|
-
{ 0, 0, 0 }, { 0, 0, 1 }, { 0, 1, 0 }, { 0, 1, 1 }, { 1, 0, 0 }, { 1, 0, 1 }, { 1, 1, 0 }, { 1, 1, 1 },
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
const pnanovdb_vec3_t ijk_base{ floorf(uvw_pnano.x), floorf(uvw_pnano.y), floorf(uvw_pnano.z) };
|
|
100
|
-
const pnanovdb_vec3_t ijk_frac{ uvw_pnano.x - ijk_base.x, uvw_pnano.y - ijk_base.y, uvw_pnano.z - ijk_base.z };
|
|
101
|
-
const pnanovdb_coord_t ijk{ (pnanovdb_int32_t)ijk_base.x, (pnanovdb_int32_t)ijk_base.y, (pnanovdb_int32_t)ijk_base.z };
|
|
102
|
-
|
|
103
|
-
pnanovdb_readaccessor_t accessor;
|
|
104
|
-
pnanovdb_readaccessor_init(PNANOVDB_REF(accessor), root);
|
|
105
|
-
T val = 0;
|
|
106
|
-
const float wx[2]{ 1 - ijk_frac.x, ijk_frac.x };
|
|
107
|
-
const float wy[2]{ 1 - ijk_frac.y, ijk_frac.y };
|
|
108
|
-
const float wz[2]{ 1 - ijk_frac.z, ijk_frac.z };
|
|
109
|
-
for (int idx = 0; idx < 8; ++idx)
|
|
110
|
-
{
|
|
111
|
-
const pnanovdb_coord_t& offs = OFFSETS[idx];
|
|
112
|
-
const pnanovdb_coord_t ijk_shifted = pnanovdb_coord_add(ijk, offs);
|
|
113
|
-
T v;
|
|
114
|
-
pnano_read(v, buf, PNANOVDB_REF(accessor), PNANOVDB_REF(ijk_shifted));
|
|
115
|
-
val = add(val, T(wx[offs.x] * wy[offs.y] * wz[offs.z] * v));
|
|
116
|
-
}
|
|
117
|
-
return val;
|
|
118
|
-
}
|
|
119
|
-
return 0;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// Sampling a float volume at the given index-space coordinates, uvw can be fractional
|
|
123
|
-
CUDA_CALLABLE inline float volume_sample_f(uint64_t id, vec3 uvw, int sampling_mode)
|
|
124
|
-
{
|
|
125
|
-
if (volume::get_grid_type(volume::id_to_buffer(id)) != PNANOVDB_GRID_TYPE_FLOAT) return 0.f;
|
|
126
|
-
return volume_sample<float>(id, uvw, sampling_mode);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
// Sampling an int volume at the given index-space coordinates, uvw can be fractional
|
|
130
|
-
CUDA_CALLABLE inline int32_t volume_sample_i(uint64_t id, vec3 uvw)
|
|
131
|
-
{
|
|
132
|
-
if (volume::get_grid_type(volume::id_to_buffer(id)) != PNANOVDB_GRID_TYPE_INT32) return 0;
|
|
133
|
-
return volume_sample<int32_t>(id, uvw, volume::CLOSEST);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// Sampling a vector volume at the given index-space coordinates, uvw can be fractional
|
|
137
|
-
CUDA_CALLABLE inline vec3 volume_sample_v(uint64_t id, vec3 uvw, int sampling_mode)
|
|
138
|
-
{
|
|
139
|
-
if (volume::get_grid_type(volume::id_to_buffer(id)) != PNANOVDB_GRID_TYPE_VEC3F) return vec3(0.f);
|
|
140
|
-
return volume_sample<vec3>(id, uvw, sampling_mode);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
CUDA_CALLABLE inline void adj_volume_sample_f(
|
|
144
|
-
uint64_t id, vec3 uvw, int sampling_mode, uint64_t& adj_id, vec3& adj_uvw, int& adj_sampling_mode, const float& adj_ret)
|
|
145
|
-
{
|
|
146
|
-
if (volume::get_grid_type(volume::id_to_buffer(id)) != PNANOVDB_GRID_TYPE_FLOAT) return;
|
|
147
|
-
|
|
148
|
-
if (sampling_mode != volume::LINEAR) {
|
|
149
|
-
return; // NOP
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
153
|
-
const pnanovdb_root_handle_t root = volume::get_root(buf);
|
|
154
|
-
const pnanovdb_vec3_t uvw_pnano{ uvw[0], uvw[1], uvw[2] };
|
|
155
|
-
|
|
156
|
-
constexpr pnanovdb_coord_t OFFSETS[] = {
|
|
157
|
-
{ 0, 0, 0 }, { 0, 0, 1 }, { 0, 1, 0 }, { 0, 1, 1 }, { 1, 0, 0 }, { 1, 0, 1 }, { 1, 1, 0 }, { 1, 1, 1 },
|
|
158
|
-
};
|
|
159
|
-
|
|
160
|
-
const pnanovdb_vec3_t ijk_base{ floorf(uvw_pnano.x), floorf(uvw_pnano.y), floorf(uvw_pnano.z) };
|
|
161
|
-
const pnanovdb_vec3_t ijk_frac{ uvw_pnano.x - ijk_base.x, uvw_pnano.y - ijk_base.y, uvw_pnano.z - ijk_base.z };
|
|
162
|
-
const pnanovdb_coord_t ijk{ (pnanovdb_int32_t)ijk_base.x, (pnanovdb_int32_t)ijk_base.y, (pnanovdb_int32_t)ijk_base.z };
|
|
163
|
-
|
|
164
|
-
pnanovdb_readaccessor_t accessor;
|
|
165
|
-
pnanovdb_readaccessor_init(PNANOVDB_REF(accessor), root);
|
|
166
|
-
const float wx[2]{ 1 - ijk_frac.x, ijk_frac.x };
|
|
167
|
-
const float wy[2]{ 1 - ijk_frac.y, ijk_frac.y };
|
|
168
|
-
const float wz[2]{ 1 - ijk_frac.z, ijk_frac.z };
|
|
169
|
-
vec3 dphi(0,0,0);
|
|
170
|
-
for (int idx = 0; idx < 8; ++idx)
|
|
171
|
-
{
|
|
172
|
-
const pnanovdb_coord_t& offs = OFFSETS[idx];
|
|
173
|
-
const pnanovdb_coord_t ijk_shifted = pnanovdb_coord_add(ijk, offs);
|
|
174
|
-
float v;
|
|
175
|
-
pnano_read(v, buf, PNANOVDB_REF(accessor), PNANOVDB_REF(ijk_shifted));
|
|
176
|
-
const vec3 signs(offs.x * 2 - 1, offs.y * 2 - 1, offs.z * 2 - 1);
|
|
177
|
-
const vec3 grad_w(signs[0] * wy[offs.y] * wz[offs.z], signs[1] * wx[offs.x] * wz[offs.z], signs[2] * wx[offs.x] * wy[offs.y]);
|
|
178
|
-
dphi = add(dphi, mul(v, grad_w));
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
adj_uvw += mul(dphi, adj_ret);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
CUDA_CALLABLE inline void adj_volume_sample_v(
|
|
185
|
-
uint64_t id, vec3 uvw, int sampling_mode, uint64_t& adj_id, vec3& adj_uvw, int& adj_sampling_mode, const vec3& adj_ret)
|
|
186
|
-
{
|
|
187
|
-
if (volume::get_grid_type(volume::id_to_buffer(id)) != PNANOVDB_GRID_TYPE_VEC3F) return;
|
|
188
|
-
|
|
189
|
-
if (sampling_mode != volume::LINEAR) {
|
|
190
|
-
return; // NOP
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
194
|
-
const pnanovdb_root_handle_t root = volume::get_root(buf);
|
|
195
|
-
const pnanovdb_vec3_t uvw_pnano{ uvw[0], uvw[1], uvw[2] };
|
|
196
|
-
|
|
197
|
-
constexpr pnanovdb_coord_t OFFSETS[] = {
|
|
198
|
-
{ 0, 0, 0 }, { 0, 0, 1 }, { 0, 1, 0 }, { 0, 1, 1 }, { 1, 0, 0 }, { 1, 0, 1 }, { 1, 1, 0 }, { 1, 1, 1 },
|
|
199
|
-
};
|
|
200
|
-
|
|
201
|
-
const pnanovdb_vec3_t ijk_base{ floorf(uvw_pnano.x), floorf(uvw_pnano.y), floorf(uvw_pnano.z) };
|
|
202
|
-
const pnanovdb_vec3_t ijk_frac{ uvw_pnano.x - ijk_base.x, uvw_pnano.y - ijk_base.y, uvw_pnano.z - ijk_base.z };
|
|
203
|
-
const pnanovdb_coord_t ijk{ (pnanovdb_int32_t)ijk_base.x, (pnanovdb_int32_t)ijk_base.y, (pnanovdb_int32_t)ijk_base.z };
|
|
204
|
-
|
|
205
|
-
pnanovdb_readaccessor_t accessor;
|
|
206
|
-
pnanovdb_readaccessor_init(PNANOVDB_REF(accessor), root);
|
|
207
|
-
const float wx[2]{ 1 - ijk_frac.x, ijk_frac.x };
|
|
208
|
-
const float wy[2]{ 1 - ijk_frac.y, ijk_frac.y };
|
|
209
|
-
const float wz[2]{ 1 - ijk_frac.z, ijk_frac.z };
|
|
210
|
-
vec3 dphi[3] = {{0,0,0}, {0,0,0}, {0,0,0}};
|
|
211
|
-
for (int idx = 0; idx < 8; ++idx)
|
|
212
|
-
{
|
|
213
|
-
const pnanovdb_coord_t& offs = OFFSETS[idx];
|
|
214
|
-
const pnanovdb_coord_t ijk_shifted = pnanovdb_coord_add(ijk, offs);
|
|
215
|
-
vec3 v;
|
|
216
|
-
pnano_read(v, buf, PNANOVDB_REF(accessor), PNANOVDB_REF(ijk_shifted));
|
|
217
|
-
const vec3 signs(offs.x * 2 - 1, offs.y * 2 - 1, offs.z * 2 - 1);
|
|
218
|
-
const vec3 grad_w(signs[0] * wy[offs.y] * wz[offs.z], signs[1] * wx[offs.x] * wz[offs.z], signs[2] * wx[offs.x] * wy[offs.y]);
|
|
219
|
-
dphi[0] = add(dphi[0], mul(v[0], grad_w));
|
|
220
|
-
dphi[1] = add(dphi[1], mul(v[1], grad_w));
|
|
221
|
-
dphi[2] = add(dphi[2], mul(v[2], grad_w));
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
for (int k = 0; k < 3; ++k)
|
|
225
|
-
{
|
|
226
|
-
adj_uvw[k] += dot(dphi[k], adj_ret);
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
CUDA_CALLABLE inline void adj_volume_sample_i(uint64_t id, vec3 uvw, uint64_t& adj_id, vec3& adj_uvw, const int32_t& adj_ret)
|
|
231
|
-
{
|
|
232
|
-
// NOP
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
// Sampling the volume at the given index-space coordinates, uvw can be fractional
|
|
236
|
-
CUDA_CALLABLE inline float volume_sample_grad_f(uint64_t id, vec3 uvw, int sampling_mode, vec3& grad)
|
|
237
|
-
{
|
|
238
|
-
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
239
|
-
const pnanovdb_root_handle_t root = volume::get_root(buf);
|
|
240
|
-
const pnanovdb_vec3_t uvw_pnano{ uvw[0], uvw[1], uvw[2] };
|
|
241
|
-
|
|
242
|
-
if (sampling_mode == volume::CLOSEST)
|
|
243
|
-
{
|
|
244
|
-
const pnanovdb_coord_t ijk = pnanovdb_vec3_round_to_coord(uvw_pnano);
|
|
245
|
-
float val;
|
|
246
|
-
pnano_read(val, buf, root, PNANOVDB_REF(ijk));
|
|
247
|
-
grad = vec3(0.0f, 0.0f, 0.0f);
|
|
248
|
-
return val;
|
|
249
|
-
}
|
|
250
|
-
else if (sampling_mode == volume::LINEAR)
|
|
251
|
-
{
|
|
252
|
-
// NB. linear sampling is not used on int volumes
|
|
253
|
-
constexpr pnanovdb_coord_t OFFSETS[] = {
|
|
254
|
-
{ 0, 0, 0 }, { 0, 0, 1 }, { 0, 1, 0 }, { 0, 1, 1 }, { 1, 0, 0 }, { 1, 0, 1 }, { 1, 1, 0 }, { 1, 1, 1 },
|
|
255
|
-
};
|
|
256
|
-
|
|
257
|
-
const pnanovdb_vec3_t ijk_base{ floorf(uvw_pnano.x), floorf(uvw_pnano.y), floorf(uvw_pnano.z) };
|
|
258
|
-
const pnanovdb_vec3_t ijk_frac{ uvw_pnano.x - ijk_base.x, uvw_pnano.y - ijk_base.y, uvw_pnano.z - ijk_base.z };
|
|
259
|
-
const pnanovdb_coord_t ijk{ (pnanovdb_int32_t)ijk_base.x, (pnanovdb_int32_t)ijk_base.y, (pnanovdb_int32_t)ijk_base.z };
|
|
260
|
-
|
|
261
|
-
pnanovdb_readaccessor_t accessor;
|
|
262
|
-
pnanovdb_readaccessor_init(PNANOVDB_REF(accessor), root);
|
|
263
|
-
float val = 0.0f;
|
|
264
|
-
const float wx[2]{ 1 - ijk_frac.x, ijk_frac.x };
|
|
265
|
-
const float wy[2]{ 1 - ijk_frac.y, ijk_frac.y };
|
|
266
|
-
const float wz[2]{ 1 - ijk_frac.z, ijk_frac.z };
|
|
267
|
-
|
|
268
|
-
const float sign_dx[8] = {-1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f};
|
|
269
|
-
const float sign_dy[8] = {-1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f};
|
|
270
|
-
const float sign_dz[8] = {-1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f};
|
|
271
|
-
|
|
272
|
-
float dfdx = 0.0f;
|
|
273
|
-
float dfdy = 0.0f;
|
|
274
|
-
float dfdz = 0.0f;
|
|
275
|
-
for (int idx = 0; idx < 8; ++idx)
|
|
276
|
-
{
|
|
277
|
-
const pnanovdb_coord_t& offs = OFFSETS[idx];
|
|
278
|
-
const pnanovdb_coord_t ijk_shifted = pnanovdb_coord_add(ijk, offs);
|
|
279
|
-
float v;
|
|
280
|
-
pnano_read(v, buf, PNANOVDB_REF(accessor), PNANOVDB_REF(ijk_shifted));
|
|
281
|
-
val = add(val, wx[offs.x] * wy[offs.y] * wz[offs.z] * v);
|
|
282
|
-
dfdx = add(dfdx, wy[offs.y] * wz[offs.z] * sign_dx[idx] * v);
|
|
283
|
-
dfdy = add(dfdy, wx[offs.x] * wz[offs.z] * sign_dy[idx] * v);
|
|
284
|
-
dfdz = add(dfdz, wx[offs.x] * wy[offs.y] * sign_dz[idx] * v);
|
|
285
|
-
}
|
|
286
|
-
grad = vec3(dfdx, dfdy, dfdz);
|
|
287
|
-
return val;
|
|
288
|
-
}
|
|
289
|
-
return 0.0f;
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
CUDA_CALLABLE inline void adj_volume_sample_grad_f(
|
|
293
|
-
uint64_t id, vec3 uvw, int sampling_mode, vec3& grad, uint64_t& adj_id, vec3& adj_uvw, int& adj_sampling_mode, vec3& adj_grad, const float& adj_ret)
|
|
294
|
-
{
|
|
295
|
-
if (volume::get_grid_type(volume::id_to_buffer(id)) != PNANOVDB_GRID_TYPE_FLOAT) return;
|
|
296
|
-
|
|
297
|
-
if (sampling_mode != volume::LINEAR) {
|
|
298
|
-
return; // NOP
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
302
|
-
const pnanovdb_root_handle_t root = volume::get_root(buf);
|
|
303
|
-
const pnanovdb_vec3_t uvw_pnano{ uvw[0], uvw[1], uvw[2] };
|
|
304
|
-
|
|
305
|
-
constexpr pnanovdb_coord_t OFFSETS[] = {
|
|
306
|
-
{ 0, 0, 0 }, { 0, 0, 1 }, { 0, 1, 0 }, { 0, 1, 1 }, { 1, 0, 0 }, { 1, 0, 1 }, { 1, 1, 0 }, { 1, 1, 1 },
|
|
307
|
-
};
|
|
308
|
-
|
|
309
|
-
const pnanovdb_vec3_t ijk_base{ floorf(uvw_pnano.x), floorf(uvw_pnano.y), floorf(uvw_pnano.z) };
|
|
310
|
-
const pnanovdb_vec3_t ijk_frac{ uvw_pnano.x - ijk_base.x, uvw_pnano.y - ijk_base.y, uvw_pnano.z - ijk_base.z };
|
|
311
|
-
const pnanovdb_coord_t ijk{ (pnanovdb_int32_t)ijk_base.x, (pnanovdb_int32_t)ijk_base.y, (pnanovdb_int32_t)ijk_base.z };
|
|
312
|
-
|
|
313
|
-
pnanovdb_readaccessor_t accessor;
|
|
314
|
-
pnanovdb_readaccessor_init(PNANOVDB_REF(accessor), root);
|
|
315
|
-
const float wx[2]{ 1 - ijk_frac.x, ijk_frac.x };
|
|
316
|
-
const float wy[2]{ 1 - ijk_frac.y, ijk_frac.y };
|
|
317
|
-
const float wz[2]{ 1 - ijk_frac.z, ijk_frac.z };
|
|
318
|
-
const float sign_dx[8] = {-1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f};
|
|
319
|
-
const float sign_dy[8] = {-1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f};
|
|
320
|
-
const float sign_dz[8] = {-1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f};
|
|
321
|
-
|
|
322
|
-
float dfdxdy = 0.0f;
|
|
323
|
-
float dfdxdz = 0.0f;
|
|
324
|
-
float dfdydx = 0.0f;
|
|
325
|
-
float dfdydz = 0.0f;
|
|
326
|
-
float dfdzdx = 0.0f;
|
|
327
|
-
float dfdzdy = 0.0f;
|
|
328
|
-
vec3 dphi(0,0,0);
|
|
329
|
-
for (int idx = 0; idx < 8; ++idx)
|
|
330
|
-
{
|
|
331
|
-
const pnanovdb_coord_t& offs = OFFSETS[idx];
|
|
332
|
-
const pnanovdb_coord_t ijk_shifted = pnanovdb_coord_add(ijk, offs);
|
|
333
|
-
float v;
|
|
334
|
-
pnano_read(v, buf, PNANOVDB_REF(accessor), PNANOVDB_REF(ijk_shifted));
|
|
335
|
-
const vec3 signs(offs.x * 2 - 1, offs.y * 2 - 1, offs.z * 2 - 1);
|
|
336
|
-
const vec3 grad_w(signs[0] * wy[offs.y] * wz[offs.z], signs[1] * wx[offs.x] * wz[offs.z], signs[2] * wx[offs.x] * wy[offs.y]);
|
|
337
|
-
dphi = add(dphi, mul(v, grad_w));
|
|
338
|
-
|
|
339
|
-
dfdxdy = add(dfdxdy, signs[1] * wz[offs.z] * sign_dx[idx] * v);
|
|
340
|
-
dfdxdz = add(dfdxdz, wy[offs.y] * signs[2] * sign_dx[idx] * v);
|
|
341
|
-
|
|
342
|
-
dfdydx = add(dfdydx, signs[0] * wz[offs.z] * sign_dy[idx] * v);
|
|
343
|
-
dfdydz = add(dfdydz, wx[offs.x] * signs[2] * sign_dy[idx] * v);
|
|
344
|
-
|
|
345
|
-
dfdzdx = add(dfdzdx, signs[0] * wy[offs.y] * sign_dz[idx] * v);
|
|
346
|
-
dfdzdy = add(dfdzdy, wx[offs.x] * signs[1] * sign_dz[idx] * v);
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
adj_uvw += mul(dphi, adj_ret);
|
|
350
|
-
adj_uvw[0] += adj_grad[1] * dfdydx + adj_grad[2] * dfdzdx;
|
|
351
|
-
adj_uvw[1] += adj_grad[0] * dfdxdy + adj_grad[2] * dfdzdy;
|
|
352
|
-
adj_uvw[2] += adj_grad[0] * dfdxdz + adj_grad[1] * dfdydz;
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
CUDA_CALLABLE inline float volume_lookup_f(uint64_t id, int32_t i, int32_t j, int32_t k)
|
|
356
|
-
{
|
|
357
|
-
if (volume::get_grid_type(volume::id_to_buffer(id)) != PNANOVDB_GRID_TYPE_FLOAT) return 0.f;
|
|
358
|
-
|
|
359
|
-
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
360
|
-
const pnanovdb_root_handle_t root = volume::get_root(buf);
|
|
361
|
-
|
|
362
|
-
const pnanovdb_coord_t ijk{ i, j, k };
|
|
363
|
-
float val;
|
|
364
|
-
pnano_read(val, buf, root, PNANOVDB_REF(ijk));
|
|
365
|
-
return val;
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
CUDA_CALLABLE inline int32_t volume_lookup_i(uint64_t id, int32_t i, int32_t j, int32_t k)
|
|
369
|
-
{
|
|
370
|
-
if (volume::get_grid_type(volume::id_to_buffer(id)) != PNANOVDB_GRID_TYPE_INT32) return 0;
|
|
371
|
-
|
|
372
|
-
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
373
|
-
const pnanovdb_root_handle_t root = volume::get_root(buf);
|
|
374
|
-
|
|
375
|
-
const pnanovdb_coord_t ijk{ i, j, k };
|
|
376
|
-
int32_t val;
|
|
377
|
-
pnano_read(val, buf, root, PNANOVDB_REF(ijk));
|
|
378
|
-
return val;
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
CUDA_CALLABLE inline vec3 volume_lookup_v(uint64_t id, int32_t i, int32_t j, int32_t k)
|
|
382
|
-
{
|
|
383
|
-
if (volume::get_grid_type(volume::id_to_buffer(id)) != PNANOVDB_GRID_TYPE_VEC3F) return vec3(0.f);
|
|
384
|
-
|
|
385
|
-
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
386
|
-
const pnanovdb_root_handle_t root = volume::get_root(buf);
|
|
387
|
-
|
|
388
|
-
const pnanovdb_coord_t ijk{ i, j, k };
|
|
389
|
-
vec3 val;
|
|
390
|
-
pnano_read(val, buf, root, PNANOVDB_REF(ijk));
|
|
391
|
-
return val;
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
CUDA_CALLABLE inline void adj_volume_lookup_f(
|
|
395
|
-
uint64_t id, int32_t i, int32_t j, int32_t k, uint64_t& adj_id, int32_t& adj_i, int32_t& adj_j, int32_t& adj_k, const float& adj_ret)
|
|
396
|
-
{
|
|
397
|
-
// NOP
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
CUDA_CALLABLE inline void adj_volume_lookup_i(
|
|
401
|
-
uint64_t id, int32_t i, int32_t j, int32_t k, uint64_t& adj_id, int32_t& adj_i, int32_t& adj_j, int32_t& adj_k, const int32_t& adj_ret)
|
|
402
|
-
{
|
|
403
|
-
// NOP
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
CUDA_CALLABLE inline void adj_volume_lookup_v(
|
|
407
|
-
uint64_t id, int32_t i, int32_t j, int32_t k, uint64_t& adj_id, int32_t& adj_i, int32_t& adj_j, int32_t& adj_k, const vec3& adj_ret)
|
|
408
|
-
{
|
|
409
|
-
// NOP
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
CUDA_CALLABLE inline void volume_store_f(uint64_t id, int32_t i, int32_t j, int32_t k, const float& value)
|
|
413
|
-
{
|
|
414
|
-
if (volume::get_grid_type(volume::id_to_buffer(id)) != PNANOVDB_GRID_TYPE_FLOAT) return;
|
|
415
|
-
|
|
416
|
-
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
417
|
-
const pnanovdb_root_handle_t root = volume::get_root(buf);
|
|
418
|
-
|
|
419
|
-
const pnanovdb_coord_t ijk{ i, j, k };
|
|
420
|
-
const pnanovdb_address_t address = pnanovdb_root_get_value_address(PNANOVDB_GRID_TYPE_FLOAT, buf, root, PNANOVDB_REF(ijk));
|
|
421
|
-
pnanovdb_write_float(buf, address, value);
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
CUDA_CALLABLE inline void adj_volume_store_f(
|
|
425
|
-
uint64_t id, int32_t i, int32_t j, int32_t k, const float& value,
|
|
426
|
-
uint64_t& adj_id, int32_t& adj_i, int32_t& adj_j, int32_t& adj_k, float& adj_value)
|
|
427
|
-
{
|
|
428
|
-
adj_value += volume_lookup_f(id, i, j, k);
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
CUDA_CALLABLE inline void volume_store_v(uint64_t id, int32_t i, int32_t j, int32_t k, const vec3& value)
|
|
432
|
-
{
|
|
433
|
-
if (volume::get_grid_type(volume::id_to_buffer(id)) != PNANOVDB_GRID_TYPE_VEC3F) return;
|
|
434
|
-
|
|
435
|
-
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
436
|
-
const pnanovdb_root_handle_t root = volume::get_root(buf);
|
|
437
|
-
|
|
438
|
-
const pnanovdb_coord_t ijk{ i, j, k };
|
|
439
|
-
const pnanovdb_address_t address = pnanovdb_root_get_value_address(PNANOVDB_GRID_TYPE_VEC3F, buf, root, PNANOVDB_REF(ijk));
|
|
440
|
-
const pnanovdb_vec3_t v{ value[0], value[1], value[2] };
|
|
441
|
-
pnanovdb_write_vec3(buf, address, &v);
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
CUDA_CALLABLE inline void adj_volume_store_v(
|
|
445
|
-
uint64_t id, int32_t i, int32_t j, int32_t k, const vec3& value,
|
|
446
|
-
uint64_t& adj_id, int32_t& adj_i, int32_t& adj_j, int32_t& adj_k, vec3& adj_value)
|
|
447
|
-
{
|
|
448
|
-
adj_value = add(adj_value, volume_lookup_v(id, i, j, k));
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
CUDA_CALLABLE inline void volume_store_i(uint64_t id, int32_t i, int32_t j, int32_t k, const int32_t& value)
|
|
452
|
-
{
|
|
453
|
-
if (volume::get_grid_type(volume::id_to_buffer(id)) != PNANOVDB_GRID_TYPE_INT32) return;
|
|
454
|
-
|
|
455
|
-
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
456
|
-
const pnanovdb_root_handle_t root = volume::get_root(buf);
|
|
457
|
-
|
|
458
|
-
const pnanovdb_coord_t ijk{ i, j, k };
|
|
459
|
-
const pnanovdb_address_t address = pnanovdb_root_get_value_address(PNANOVDB_GRID_TYPE_INT32, buf, root, PNANOVDB_REF(ijk));
|
|
460
|
-
pnanovdb_write_int32(buf, address, value);
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
CUDA_CALLABLE inline void adj_volume_store_i(
|
|
464
|
-
uint64_t id, int32_t i, int32_t j, int32_t k, const int32_t& value,
|
|
465
|
-
uint64_t& adj_id, int32_t& adj_i, int32_t& adj_j, int32_t& adj_k, int32_t& adj_value)
|
|
466
|
-
{
|
|
467
|
-
adj_value = add(adj_value, volume_lookup_i(id, i, j, k));
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
// Transform position from index space to world space
|
|
471
|
-
CUDA_CALLABLE inline vec3 volume_index_to_world(uint64_t id, vec3 uvw)
|
|
472
|
-
{
|
|
473
|
-
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
474
|
-
const pnanovdb_grid_handle_t grid = { 0u };
|
|
475
|
-
const pnanovdb_vec3_t pos{ uvw[0], uvw[1], uvw[2] };
|
|
476
|
-
const pnanovdb_vec3_t xyz = pnanovdb_grid_index_to_worldf(buf, grid, PNANOVDB_REF(pos));
|
|
477
|
-
return { xyz.x, xyz.y, xyz.z };
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
// Transform position from world space to index space
|
|
481
|
-
CUDA_CALLABLE inline vec3 volume_world_to_index(uint64_t id, vec3 xyz)
|
|
482
|
-
{
|
|
483
|
-
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
484
|
-
const pnanovdb_grid_handle_t grid = { 0u };
|
|
485
|
-
const pnanovdb_vec3_t pos{ xyz[0], xyz[1], xyz[2] };
|
|
486
|
-
const pnanovdb_vec3_t uvw = pnanovdb_grid_world_to_indexf(buf, grid, PNANOVDB_REF(pos));
|
|
487
|
-
return { uvw.x, uvw.y, uvw.z };
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
CUDA_CALLABLE inline void adj_volume_index_to_world(uint64_t id, vec3 uvw, uint64_t& adj_id, vec3& adj_uvw, const vec3& adj_ret)
|
|
491
|
-
{
|
|
492
|
-
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
493
|
-
const pnanovdb_grid_handle_t grid = { 0u };
|
|
494
|
-
const pnanovdb_vec3_t pos{ adj_ret[0], adj_ret[1], adj_ret[2] };
|
|
495
|
-
const pnanovdb_vec3_t xyz = pnanovdb_grid_index_to_world_dirf(buf, grid, PNANOVDB_REF(pos));
|
|
496
|
-
adj_uvw = add(adj_uvw, vec3{ xyz.x, xyz.y, xyz.z });
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
CUDA_CALLABLE inline void adj_volume_world_to_index(uint64_t id, vec3 xyz, uint64_t& adj_id, vec3& adj_xyz, const vec3& adj_ret)
|
|
500
|
-
{
|
|
501
|
-
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
502
|
-
const pnanovdb_grid_handle_t grid = { 0u };
|
|
503
|
-
const pnanovdb_vec3_t pos{ adj_ret[0], adj_ret[1], adj_ret[2] };
|
|
504
|
-
const pnanovdb_vec3_t uvw = pnanovdb_grid_world_to_index_dirf(buf, grid, PNANOVDB_REF(pos));
|
|
505
|
-
adj_xyz = add(adj_xyz, vec3{ uvw.x, uvw.y, uvw.z });
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
// Transform direction from index space to world space
|
|
509
|
-
CUDA_CALLABLE inline vec3 volume_index_to_world_dir(uint64_t id, vec3 uvw)
|
|
510
|
-
{
|
|
511
|
-
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
512
|
-
const pnanovdb_grid_handle_t grid = { 0u };
|
|
513
|
-
const pnanovdb_vec3_t pos{ uvw[0], uvw[1], uvw[2] };
|
|
514
|
-
const pnanovdb_vec3_t xyz = pnanovdb_grid_index_to_world_dirf(buf, grid, PNANOVDB_REF(pos));
|
|
515
|
-
return { xyz.x, xyz.y, xyz.z };
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
// Transform direction from world space to index space
|
|
519
|
-
CUDA_CALLABLE inline vec3 volume_world_to_index_dir(uint64_t id, vec3 xyz)
|
|
520
|
-
{
|
|
521
|
-
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
522
|
-
const pnanovdb_grid_handle_t grid = { 0u };
|
|
523
|
-
const pnanovdb_vec3_t pos{ xyz[0], xyz[1], xyz[2] };
|
|
524
|
-
const pnanovdb_vec3_t uvw = pnanovdb_grid_world_to_index_dirf(buf, grid, PNANOVDB_REF(pos));
|
|
525
|
-
return { uvw.x, uvw.y, uvw.z };
|
|
526
|
-
}
|
|
527
|
-
|
|
528
|
-
CUDA_CALLABLE inline void adj_volume_index_to_world_dir(uint64_t id, vec3 uvw, uint64_t& adj_id, vec3& adj_uvw, const vec3& adj_ret)
|
|
529
|
-
{
|
|
530
|
-
adj_volume_index_to_world(id, uvw, adj_id, adj_uvw, adj_ret);
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
CUDA_CALLABLE inline void adj_volume_world_to_index_dir(uint64_t id, vec3 xyz, uint64_t& adj_id, vec3& adj_xyz, const vec3& adj_ret)
|
|
534
|
-
{
|
|
535
|
-
adj_volume_world_to_index(id, xyz, adj_id, adj_xyz, adj_ret);
|
|
536
|
-
}
|
|
537
|
-
|
|
538
|
-
} // namespace wp
|
|
1
|
+
/** Copyright (c) 2022 NVIDIA CORPORATION. All rights reserved.
|
|
2
|
+
* NVIDIA CORPORATION and its licensors retain all intellectual property
|
|
3
|
+
* and proprietary rights in and to this software, related documentation
|
|
4
|
+
* and any modifications thereto. Any use, reproduction, disclosure or
|
|
5
|
+
* distribution of this software and related documentation without an express
|
|
6
|
+
* license agreement from NVIDIA CORPORATION is strictly prohibited.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
#pragma once
|
|
10
|
+
|
|
11
|
+
#include "builtin.h"
|
|
12
|
+
|
|
13
|
+
#define PNANOVDB_C
|
|
14
|
+
#define PNANOVDB_MEMCPY_CUSTOM
|
|
15
|
+
#define pnanovdb_memcpy memcpy
|
|
16
|
+
#include "nanovdb/PNanoVDB.h"
|
|
17
|
+
#include "nanovdb/PNanoVDBWrite.h"
|
|
18
|
+
|
|
19
|
+
namespace wp
|
|
20
|
+
{
|
|
21
|
+
namespace volume
|
|
22
|
+
{
|
|
23
|
+
|
|
24
|
+
static constexpr int CLOSEST = 0;
|
|
25
|
+
static constexpr int LINEAR = 1;
|
|
26
|
+
|
|
27
|
+
// helper functions
|
|
28
|
+
CUDA_CALLABLE inline pnanovdb_buf_t id_to_buffer(uint64_t id)
|
|
29
|
+
{
|
|
30
|
+
pnanovdb_buf_t buf;
|
|
31
|
+
buf.data = (uint32_t*)id;
|
|
32
|
+
return buf;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
CUDA_CALLABLE inline pnanovdb_uint32_t get_grid_type(const pnanovdb_buf_t& buf)
|
|
36
|
+
{
|
|
37
|
+
const pnanovdb_grid_t *grid_data = (const pnanovdb_grid_t*)buf.data;
|
|
38
|
+
return grid_data->grid_type;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
CUDA_CALLABLE inline pnanovdb_root_handle_t get_root(const pnanovdb_buf_t& buf,
|
|
42
|
+
const pnanovdb_grid_handle_t& grid = { 0u })
|
|
43
|
+
{
|
|
44
|
+
const auto tree = pnanovdb_grid_get_tree(buf, grid);
|
|
45
|
+
return pnanovdb_tree_get_root(buf, tree);
|
|
46
|
+
}
|
|
47
|
+
} // namespace volume
|
|
48
|
+
|
|
49
|
+
CUDA_CALLABLE inline void pnano_read(float& result, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk) {
|
|
50
|
+
const pnanovdb_address_t address = pnanovdb_root_get_value_address(PNANOVDB_GRID_TYPE_FLOAT, buf, root, ijk);
|
|
51
|
+
result = pnanovdb_read_float(buf, address);
|
|
52
|
+
}
|
|
53
|
+
CUDA_CALLABLE inline void pnano_read(int32_t& result, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk) {
|
|
54
|
+
const pnanovdb_address_t address = pnanovdb_root_get_value_address(PNANOVDB_GRID_TYPE_INT32, buf, root, ijk);
|
|
55
|
+
result = pnanovdb_read_int32(buf, address);
|
|
56
|
+
}
|
|
57
|
+
CUDA_CALLABLE inline void pnano_read(vec3& result, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk) {
|
|
58
|
+
const pnanovdb_address_t address = pnanovdb_root_get_value_address(PNANOVDB_GRID_TYPE_VEC3F, buf, root, ijk);
|
|
59
|
+
const pnanovdb_vec3_t v = pnanovdb_read_vec3f(buf, address);
|
|
60
|
+
result = {v.x, v.y, v.z};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
CUDA_CALLABLE inline void pnano_read(float& result, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk) {
|
|
64
|
+
pnanovdb_address_t address = pnanovdb_readaccessor_get_value_address(PNANOVDB_GRID_TYPE_FLOAT, buf, acc, ijk);
|
|
65
|
+
result = pnanovdb_read_float(buf, address);
|
|
66
|
+
}
|
|
67
|
+
CUDA_CALLABLE inline void pnano_read(int32_t& result, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk) {
|
|
68
|
+
pnanovdb_address_t address = pnanovdb_readaccessor_get_value_address(PNANOVDB_GRID_TYPE_INT32, buf, acc, ijk);
|
|
69
|
+
result = pnanovdb_read_int32(buf, address);
|
|
70
|
+
}
|
|
71
|
+
CUDA_CALLABLE inline void pnano_read(vec3& result, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk) {
|
|
72
|
+
pnanovdb_address_t address = pnanovdb_readaccessor_get_value_address(PNANOVDB_GRID_TYPE_VEC3F, buf, acc, ijk);
|
|
73
|
+
const pnanovdb_vec3_t v = pnanovdb_read_vec3f(buf, address);
|
|
74
|
+
result = {v.x, v.y, v.z};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Sampling the volume at the given index-space coordinates, uvw can be fractional
|
|
78
|
+
template<typename T>
|
|
79
|
+
CUDA_CALLABLE inline T volume_sample(uint64_t id, vec3 uvw, int sampling_mode)
|
|
80
|
+
{
|
|
81
|
+
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
82
|
+
const pnanovdb_root_handle_t root = volume::get_root(buf);
|
|
83
|
+
const pnanovdb_vec3_t uvw_pnano{ uvw[0], uvw[1], uvw[2] };
|
|
84
|
+
|
|
85
|
+
if (sampling_mode == volume::CLOSEST)
|
|
86
|
+
{
|
|
87
|
+
const pnanovdb_coord_t ijk = pnanovdb_vec3_round_to_coord(uvw_pnano);
|
|
88
|
+
T val;
|
|
89
|
+
pnano_read(val, buf, root, PNANOVDB_REF(ijk));
|
|
90
|
+
return val;
|
|
91
|
+
}
|
|
92
|
+
else if (sampling_mode == volume::LINEAR)
|
|
93
|
+
{
|
|
94
|
+
// NB. linear sampling is not used on int volumes
|
|
95
|
+
constexpr pnanovdb_coord_t OFFSETS[] = {
|
|
96
|
+
{ 0, 0, 0 }, { 0, 0, 1 }, { 0, 1, 0 }, { 0, 1, 1 }, { 1, 0, 0 }, { 1, 0, 1 }, { 1, 1, 0 }, { 1, 1, 1 },
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
const pnanovdb_vec3_t ijk_base{ floorf(uvw_pnano.x), floorf(uvw_pnano.y), floorf(uvw_pnano.z) };
|
|
100
|
+
const pnanovdb_vec3_t ijk_frac{ uvw_pnano.x - ijk_base.x, uvw_pnano.y - ijk_base.y, uvw_pnano.z - ijk_base.z };
|
|
101
|
+
const pnanovdb_coord_t ijk{ (pnanovdb_int32_t)ijk_base.x, (pnanovdb_int32_t)ijk_base.y, (pnanovdb_int32_t)ijk_base.z };
|
|
102
|
+
|
|
103
|
+
pnanovdb_readaccessor_t accessor;
|
|
104
|
+
pnanovdb_readaccessor_init(PNANOVDB_REF(accessor), root);
|
|
105
|
+
T val = 0;
|
|
106
|
+
const float wx[2]{ 1 - ijk_frac.x, ijk_frac.x };
|
|
107
|
+
const float wy[2]{ 1 - ijk_frac.y, ijk_frac.y };
|
|
108
|
+
const float wz[2]{ 1 - ijk_frac.z, ijk_frac.z };
|
|
109
|
+
for (int idx = 0; idx < 8; ++idx)
|
|
110
|
+
{
|
|
111
|
+
const pnanovdb_coord_t& offs = OFFSETS[idx];
|
|
112
|
+
const pnanovdb_coord_t ijk_shifted = pnanovdb_coord_add(ijk, offs);
|
|
113
|
+
T v;
|
|
114
|
+
pnano_read(v, buf, PNANOVDB_REF(accessor), PNANOVDB_REF(ijk_shifted));
|
|
115
|
+
val = add(val, T(wx[offs.x] * wy[offs.y] * wz[offs.z] * v));
|
|
116
|
+
}
|
|
117
|
+
return val;
|
|
118
|
+
}
|
|
119
|
+
return 0;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Sampling a float volume at the given index-space coordinates, uvw can be fractional
|
|
123
|
+
CUDA_CALLABLE inline float volume_sample_f(uint64_t id, vec3 uvw, int sampling_mode)
|
|
124
|
+
{
|
|
125
|
+
if (volume::get_grid_type(volume::id_to_buffer(id)) != PNANOVDB_GRID_TYPE_FLOAT) return 0.f;
|
|
126
|
+
return volume_sample<float>(id, uvw, sampling_mode);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Sampling an int volume at the given index-space coordinates, uvw can be fractional
|
|
130
|
+
CUDA_CALLABLE inline int32_t volume_sample_i(uint64_t id, vec3 uvw)
|
|
131
|
+
{
|
|
132
|
+
if (volume::get_grid_type(volume::id_to_buffer(id)) != PNANOVDB_GRID_TYPE_INT32) return 0;
|
|
133
|
+
return volume_sample<int32_t>(id, uvw, volume::CLOSEST);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Sampling a vector volume at the given index-space coordinates, uvw can be fractional
|
|
137
|
+
CUDA_CALLABLE inline vec3 volume_sample_v(uint64_t id, vec3 uvw, int sampling_mode)
|
|
138
|
+
{
|
|
139
|
+
if (volume::get_grid_type(volume::id_to_buffer(id)) != PNANOVDB_GRID_TYPE_VEC3F) return vec3(0.f);
|
|
140
|
+
return volume_sample<vec3>(id, uvw, sampling_mode);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
CUDA_CALLABLE inline void adj_volume_sample_f(
|
|
144
|
+
uint64_t id, vec3 uvw, int sampling_mode, uint64_t& adj_id, vec3& adj_uvw, int& adj_sampling_mode, const float& adj_ret)
|
|
145
|
+
{
|
|
146
|
+
if (volume::get_grid_type(volume::id_to_buffer(id)) != PNANOVDB_GRID_TYPE_FLOAT) return;
|
|
147
|
+
|
|
148
|
+
if (sampling_mode != volume::LINEAR) {
|
|
149
|
+
return; // NOP
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
153
|
+
const pnanovdb_root_handle_t root = volume::get_root(buf);
|
|
154
|
+
const pnanovdb_vec3_t uvw_pnano{ uvw[0], uvw[1], uvw[2] };
|
|
155
|
+
|
|
156
|
+
constexpr pnanovdb_coord_t OFFSETS[] = {
|
|
157
|
+
{ 0, 0, 0 }, { 0, 0, 1 }, { 0, 1, 0 }, { 0, 1, 1 }, { 1, 0, 0 }, { 1, 0, 1 }, { 1, 1, 0 }, { 1, 1, 1 },
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
const pnanovdb_vec3_t ijk_base{ floorf(uvw_pnano.x), floorf(uvw_pnano.y), floorf(uvw_pnano.z) };
|
|
161
|
+
const pnanovdb_vec3_t ijk_frac{ uvw_pnano.x - ijk_base.x, uvw_pnano.y - ijk_base.y, uvw_pnano.z - ijk_base.z };
|
|
162
|
+
const pnanovdb_coord_t ijk{ (pnanovdb_int32_t)ijk_base.x, (pnanovdb_int32_t)ijk_base.y, (pnanovdb_int32_t)ijk_base.z };
|
|
163
|
+
|
|
164
|
+
pnanovdb_readaccessor_t accessor;
|
|
165
|
+
pnanovdb_readaccessor_init(PNANOVDB_REF(accessor), root);
|
|
166
|
+
const float wx[2]{ 1 - ijk_frac.x, ijk_frac.x };
|
|
167
|
+
const float wy[2]{ 1 - ijk_frac.y, ijk_frac.y };
|
|
168
|
+
const float wz[2]{ 1 - ijk_frac.z, ijk_frac.z };
|
|
169
|
+
vec3 dphi(0,0,0);
|
|
170
|
+
for (int idx = 0; idx < 8; ++idx)
|
|
171
|
+
{
|
|
172
|
+
const pnanovdb_coord_t& offs = OFFSETS[idx];
|
|
173
|
+
const pnanovdb_coord_t ijk_shifted = pnanovdb_coord_add(ijk, offs);
|
|
174
|
+
float v;
|
|
175
|
+
pnano_read(v, buf, PNANOVDB_REF(accessor), PNANOVDB_REF(ijk_shifted));
|
|
176
|
+
const vec3 signs(offs.x * 2 - 1, offs.y * 2 - 1, offs.z * 2 - 1);
|
|
177
|
+
const vec3 grad_w(signs[0] * wy[offs.y] * wz[offs.z], signs[1] * wx[offs.x] * wz[offs.z], signs[2] * wx[offs.x] * wy[offs.y]);
|
|
178
|
+
dphi = add(dphi, mul(v, grad_w));
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
adj_uvw += mul(dphi, adj_ret);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
CUDA_CALLABLE inline void adj_volume_sample_v(
|
|
185
|
+
uint64_t id, vec3 uvw, int sampling_mode, uint64_t& adj_id, vec3& adj_uvw, int& adj_sampling_mode, const vec3& adj_ret)
|
|
186
|
+
{
|
|
187
|
+
if (volume::get_grid_type(volume::id_to_buffer(id)) != PNANOVDB_GRID_TYPE_VEC3F) return;
|
|
188
|
+
|
|
189
|
+
if (sampling_mode != volume::LINEAR) {
|
|
190
|
+
return; // NOP
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
194
|
+
const pnanovdb_root_handle_t root = volume::get_root(buf);
|
|
195
|
+
const pnanovdb_vec3_t uvw_pnano{ uvw[0], uvw[1], uvw[2] };
|
|
196
|
+
|
|
197
|
+
constexpr pnanovdb_coord_t OFFSETS[] = {
|
|
198
|
+
{ 0, 0, 0 }, { 0, 0, 1 }, { 0, 1, 0 }, { 0, 1, 1 }, { 1, 0, 0 }, { 1, 0, 1 }, { 1, 1, 0 }, { 1, 1, 1 },
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
const pnanovdb_vec3_t ijk_base{ floorf(uvw_pnano.x), floorf(uvw_pnano.y), floorf(uvw_pnano.z) };
|
|
202
|
+
const pnanovdb_vec3_t ijk_frac{ uvw_pnano.x - ijk_base.x, uvw_pnano.y - ijk_base.y, uvw_pnano.z - ijk_base.z };
|
|
203
|
+
const pnanovdb_coord_t ijk{ (pnanovdb_int32_t)ijk_base.x, (pnanovdb_int32_t)ijk_base.y, (pnanovdb_int32_t)ijk_base.z };
|
|
204
|
+
|
|
205
|
+
pnanovdb_readaccessor_t accessor;
|
|
206
|
+
pnanovdb_readaccessor_init(PNANOVDB_REF(accessor), root);
|
|
207
|
+
const float wx[2]{ 1 - ijk_frac.x, ijk_frac.x };
|
|
208
|
+
const float wy[2]{ 1 - ijk_frac.y, ijk_frac.y };
|
|
209
|
+
const float wz[2]{ 1 - ijk_frac.z, ijk_frac.z };
|
|
210
|
+
vec3 dphi[3] = {{0,0,0}, {0,0,0}, {0,0,0}};
|
|
211
|
+
for (int idx = 0; idx < 8; ++idx)
|
|
212
|
+
{
|
|
213
|
+
const pnanovdb_coord_t& offs = OFFSETS[idx];
|
|
214
|
+
const pnanovdb_coord_t ijk_shifted = pnanovdb_coord_add(ijk, offs);
|
|
215
|
+
vec3 v;
|
|
216
|
+
pnano_read(v, buf, PNANOVDB_REF(accessor), PNANOVDB_REF(ijk_shifted));
|
|
217
|
+
const vec3 signs(offs.x * 2 - 1, offs.y * 2 - 1, offs.z * 2 - 1);
|
|
218
|
+
const vec3 grad_w(signs[0] * wy[offs.y] * wz[offs.z], signs[1] * wx[offs.x] * wz[offs.z], signs[2] * wx[offs.x] * wy[offs.y]);
|
|
219
|
+
dphi[0] = add(dphi[0], mul(v[0], grad_w));
|
|
220
|
+
dphi[1] = add(dphi[1], mul(v[1], grad_w));
|
|
221
|
+
dphi[2] = add(dphi[2], mul(v[2], grad_w));
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
for (int k = 0; k < 3; ++k)
|
|
225
|
+
{
|
|
226
|
+
adj_uvw[k] += dot(dphi[k], adj_ret);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
CUDA_CALLABLE inline void adj_volume_sample_i(uint64_t id, vec3 uvw, uint64_t& adj_id, vec3& adj_uvw, const int32_t& adj_ret)
|
|
231
|
+
{
|
|
232
|
+
// NOP
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// Sampling the volume at the given index-space coordinates, uvw can be fractional
|
|
236
|
+
CUDA_CALLABLE inline float volume_sample_grad_f(uint64_t id, vec3 uvw, int sampling_mode, vec3& grad)
|
|
237
|
+
{
|
|
238
|
+
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
239
|
+
const pnanovdb_root_handle_t root = volume::get_root(buf);
|
|
240
|
+
const pnanovdb_vec3_t uvw_pnano{ uvw[0], uvw[1], uvw[2] };
|
|
241
|
+
|
|
242
|
+
if (sampling_mode == volume::CLOSEST)
|
|
243
|
+
{
|
|
244
|
+
const pnanovdb_coord_t ijk = pnanovdb_vec3_round_to_coord(uvw_pnano);
|
|
245
|
+
float val;
|
|
246
|
+
pnano_read(val, buf, root, PNANOVDB_REF(ijk));
|
|
247
|
+
grad = vec3(0.0f, 0.0f, 0.0f);
|
|
248
|
+
return val;
|
|
249
|
+
}
|
|
250
|
+
else if (sampling_mode == volume::LINEAR)
|
|
251
|
+
{
|
|
252
|
+
// NB. linear sampling is not used on int volumes
|
|
253
|
+
constexpr pnanovdb_coord_t OFFSETS[] = {
|
|
254
|
+
{ 0, 0, 0 }, { 0, 0, 1 }, { 0, 1, 0 }, { 0, 1, 1 }, { 1, 0, 0 }, { 1, 0, 1 }, { 1, 1, 0 }, { 1, 1, 1 },
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
const pnanovdb_vec3_t ijk_base{ floorf(uvw_pnano.x), floorf(uvw_pnano.y), floorf(uvw_pnano.z) };
|
|
258
|
+
const pnanovdb_vec3_t ijk_frac{ uvw_pnano.x - ijk_base.x, uvw_pnano.y - ijk_base.y, uvw_pnano.z - ijk_base.z };
|
|
259
|
+
const pnanovdb_coord_t ijk{ (pnanovdb_int32_t)ijk_base.x, (pnanovdb_int32_t)ijk_base.y, (pnanovdb_int32_t)ijk_base.z };
|
|
260
|
+
|
|
261
|
+
pnanovdb_readaccessor_t accessor;
|
|
262
|
+
pnanovdb_readaccessor_init(PNANOVDB_REF(accessor), root);
|
|
263
|
+
float val = 0.0f;
|
|
264
|
+
const float wx[2]{ 1 - ijk_frac.x, ijk_frac.x };
|
|
265
|
+
const float wy[2]{ 1 - ijk_frac.y, ijk_frac.y };
|
|
266
|
+
const float wz[2]{ 1 - ijk_frac.z, ijk_frac.z };
|
|
267
|
+
|
|
268
|
+
const float sign_dx[8] = {-1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f};
|
|
269
|
+
const float sign_dy[8] = {-1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f};
|
|
270
|
+
const float sign_dz[8] = {-1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f};
|
|
271
|
+
|
|
272
|
+
float dfdx = 0.0f;
|
|
273
|
+
float dfdy = 0.0f;
|
|
274
|
+
float dfdz = 0.0f;
|
|
275
|
+
for (int idx = 0; idx < 8; ++idx)
|
|
276
|
+
{
|
|
277
|
+
const pnanovdb_coord_t& offs = OFFSETS[idx];
|
|
278
|
+
const pnanovdb_coord_t ijk_shifted = pnanovdb_coord_add(ijk, offs);
|
|
279
|
+
float v;
|
|
280
|
+
pnano_read(v, buf, PNANOVDB_REF(accessor), PNANOVDB_REF(ijk_shifted));
|
|
281
|
+
val = add(val, wx[offs.x] * wy[offs.y] * wz[offs.z] * v);
|
|
282
|
+
dfdx = add(dfdx, wy[offs.y] * wz[offs.z] * sign_dx[idx] * v);
|
|
283
|
+
dfdy = add(dfdy, wx[offs.x] * wz[offs.z] * sign_dy[idx] * v);
|
|
284
|
+
dfdz = add(dfdz, wx[offs.x] * wy[offs.y] * sign_dz[idx] * v);
|
|
285
|
+
}
|
|
286
|
+
grad = vec3(dfdx, dfdy, dfdz);
|
|
287
|
+
return val;
|
|
288
|
+
}
|
|
289
|
+
return 0.0f;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
CUDA_CALLABLE inline void adj_volume_sample_grad_f(
|
|
293
|
+
uint64_t id, vec3 uvw, int sampling_mode, vec3& grad, uint64_t& adj_id, vec3& adj_uvw, int& adj_sampling_mode, vec3& adj_grad, const float& adj_ret)
|
|
294
|
+
{
|
|
295
|
+
if (volume::get_grid_type(volume::id_to_buffer(id)) != PNANOVDB_GRID_TYPE_FLOAT) return;
|
|
296
|
+
|
|
297
|
+
if (sampling_mode != volume::LINEAR) {
|
|
298
|
+
return; // NOP
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
302
|
+
const pnanovdb_root_handle_t root = volume::get_root(buf);
|
|
303
|
+
const pnanovdb_vec3_t uvw_pnano{ uvw[0], uvw[1], uvw[2] };
|
|
304
|
+
|
|
305
|
+
constexpr pnanovdb_coord_t OFFSETS[] = {
|
|
306
|
+
{ 0, 0, 0 }, { 0, 0, 1 }, { 0, 1, 0 }, { 0, 1, 1 }, { 1, 0, 0 }, { 1, 0, 1 }, { 1, 1, 0 }, { 1, 1, 1 },
|
|
307
|
+
};
|
|
308
|
+
|
|
309
|
+
const pnanovdb_vec3_t ijk_base{ floorf(uvw_pnano.x), floorf(uvw_pnano.y), floorf(uvw_pnano.z) };
|
|
310
|
+
const pnanovdb_vec3_t ijk_frac{ uvw_pnano.x - ijk_base.x, uvw_pnano.y - ijk_base.y, uvw_pnano.z - ijk_base.z };
|
|
311
|
+
const pnanovdb_coord_t ijk{ (pnanovdb_int32_t)ijk_base.x, (pnanovdb_int32_t)ijk_base.y, (pnanovdb_int32_t)ijk_base.z };
|
|
312
|
+
|
|
313
|
+
pnanovdb_readaccessor_t accessor;
|
|
314
|
+
pnanovdb_readaccessor_init(PNANOVDB_REF(accessor), root);
|
|
315
|
+
const float wx[2]{ 1 - ijk_frac.x, ijk_frac.x };
|
|
316
|
+
const float wy[2]{ 1 - ijk_frac.y, ijk_frac.y };
|
|
317
|
+
const float wz[2]{ 1 - ijk_frac.z, ijk_frac.z };
|
|
318
|
+
const float sign_dx[8] = {-1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f};
|
|
319
|
+
const float sign_dy[8] = {-1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f};
|
|
320
|
+
const float sign_dz[8] = {-1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f};
|
|
321
|
+
|
|
322
|
+
float dfdxdy = 0.0f;
|
|
323
|
+
float dfdxdz = 0.0f;
|
|
324
|
+
float dfdydx = 0.0f;
|
|
325
|
+
float dfdydz = 0.0f;
|
|
326
|
+
float dfdzdx = 0.0f;
|
|
327
|
+
float dfdzdy = 0.0f;
|
|
328
|
+
vec3 dphi(0,0,0);
|
|
329
|
+
for (int idx = 0; idx < 8; ++idx)
|
|
330
|
+
{
|
|
331
|
+
const pnanovdb_coord_t& offs = OFFSETS[idx];
|
|
332
|
+
const pnanovdb_coord_t ijk_shifted = pnanovdb_coord_add(ijk, offs);
|
|
333
|
+
float v;
|
|
334
|
+
pnano_read(v, buf, PNANOVDB_REF(accessor), PNANOVDB_REF(ijk_shifted));
|
|
335
|
+
const vec3 signs(offs.x * 2 - 1, offs.y * 2 - 1, offs.z * 2 - 1);
|
|
336
|
+
const vec3 grad_w(signs[0] * wy[offs.y] * wz[offs.z], signs[1] * wx[offs.x] * wz[offs.z], signs[2] * wx[offs.x] * wy[offs.y]);
|
|
337
|
+
dphi = add(dphi, mul(v, grad_w));
|
|
338
|
+
|
|
339
|
+
dfdxdy = add(dfdxdy, signs[1] * wz[offs.z] * sign_dx[idx] * v);
|
|
340
|
+
dfdxdz = add(dfdxdz, wy[offs.y] * signs[2] * sign_dx[idx] * v);
|
|
341
|
+
|
|
342
|
+
dfdydx = add(dfdydx, signs[0] * wz[offs.z] * sign_dy[idx] * v);
|
|
343
|
+
dfdydz = add(dfdydz, wx[offs.x] * signs[2] * sign_dy[idx] * v);
|
|
344
|
+
|
|
345
|
+
dfdzdx = add(dfdzdx, signs[0] * wy[offs.y] * sign_dz[idx] * v);
|
|
346
|
+
dfdzdy = add(dfdzdy, wx[offs.x] * signs[1] * sign_dz[idx] * v);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
adj_uvw += mul(dphi, adj_ret);
|
|
350
|
+
adj_uvw[0] += adj_grad[1] * dfdydx + adj_grad[2] * dfdzdx;
|
|
351
|
+
adj_uvw[1] += adj_grad[0] * dfdxdy + adj_grad[2] * dfdzdy;
|
|
352
|
+
adj_uvw[2] += adj_grad[0] * dfdxdz + adj_grad[1] * dfdydz;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
CUDA_CALLABLE inline float volume_lookup_f(uint64_t id, int32_t i, int32_t j, int32_t k)
|
|
356
|
+
{
|
|
357
|
+
if (volume::get_grid_type(volume::id_to_buffer(id)) != PNANOVDB_GRID_TYPE_FLOAT) return 0.f;
|
|
358
|
+
|
|
359
|
+
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
360
|
+
const pnanovdb_root_handle_t root = volume::get_root(buf);
|
|
361
|
+
|
|
362
|
+
const pnanovdb_coord_t ijk{ i, j, k };
|
|
363
|
+
float val;
|
|
364
|
+
pnano_read(val, buf, root, PNANOVDB_REF(ijk));
|
|
365
|
+
return val;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
CUDA_CALLABLE inline int32_t volume_lookup_i(uint64_t id, int32_t i, int32_t j, int32_t k)
|
|
369
|
+
{
|
|
370
|
+
if (volume::get_grid_type(volume::id_to_buffer(id)) != PNANOVDB_GRID_TYPE_INT32) return 0;
|
|
371
|
+
|
|
372
|
+
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
373
|
+
const pnanovdb_root_handle_t root = volume::get_root(buf);
|
|
374
|
+
|
|
375
|
+
const pnanovdb_coord_t ijk{ i, j, k };
|
|
376
|
+
int32_t val;
|
|
377
|
+
pnano_read(val, buf, root, PNANOVDB_REF(ijk));
|
|
378
|
+
return val;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
CUDA_CALLABLE inline vec3 volume_lookup_v(uint64_t id, int32_t i, int32_t j, int32_t k)
|
|
382
|
+
{
|
|
383
|
+
if (volume::get_grid_type(volume::id_to_buffer(id)) != PNANOVDB_GRID_TYPE_VEC3F) return vec3(0.f);
|
|
384
|
+
|
|
385
|
+
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
386
|
+
const pnanovdb_root_handle_t root = volume::get_root(buf);
|
|
387
|
+
|
|
388
|
+
const pnanovdb_coord_t ijk{ i, j, k };
|
|
389
|
+
vec3 val;
|
|
390
|
+
pnano_read(val, buf, root, PNANOVDB_REF(ijk));
|
|
391
|
+
return val;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
CUDA_CALLABLE inline void adj_volume_lookup_f(
|
|
395
|
+
uint64_t id, int32_t i, int32_t j, int32_t k, uint64_t& adj_id, int32_t& adj_i, int32_t& adj_j, int32_t& adj_k, const float& adj_ret)
|
|
396
|
+
{
|
|
397
|
+
// NOP
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
CUDA_CALLABLE inline void adj_volume_lookup_i(
|
|
401
|
+
uint64_t id, int32_t i, int32_t j, int32_t k, uint64_t& adj_id, int32_t& adj_i, int32_t& adj_j, int32_t& adj_k, const int32_t& adj_ret)
|
|
402
|
+
{
|
|
403
|
+
// NOP
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
CUDA_CALLABLE inline void adj_volume_lookup_v(
|
|
407
|
+
uint64_t id, int32_t i, int32_t j, int32_t k, uint64_t& adj_id, int32_t& adj_i, int32_t& adj_j, int32_t& adj_k, const vec3& adj_ret)
|
|
408
|
+
{
|
|
409
|
+
// NOP
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
CUDA_CALLABLE inline void volume_store_f(uint64_t id, int32_t i, int32_t j, int32_t k, const float& value)
|
|
413
|
+
{
|
|
414
|
+
if (volume::get_grid_type(volume::id_to_buffer(id)) != PNANOVDB_GRID_TYPE_FLOAT) return;
|
|
415
|
+
|
|
416
|
+
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
417
|
+
const pnanovdb_root_handle_t root = volume::get_root(buf);
|
|
418
|
+
|
|
419
|
+
const pnanovdb_coord_t ijk{ i, j, k };
|
|
420
|
+
const pnanovdb_address_t address = pnanovdb_root_get_value_address(PNANOVDB_GRID_TYPE_FLOAT, buf, root, PNANOVDB_REF(ijk));
|
|
421
|
+
pnanovdb_write_float(buf, address, value);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
CUDA_CALLABLE inline void adj_volume_store_f(
|
|
425
|
+
uint64_t id, int32_t i, int32_t j, int32_t k, const float& value,
|
|
426
|
+
uint64_t& adj_id, int32_t& adj_i, int32_t& adj_j, int32_t& adj_k, float& adj_value)
|
|
427
|
+
{
|
|
428
|
+
adj_value += volume_lookup_f(id, i, j, k);
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
CUDA_CALLABLE inline void volume_store_v(uint64_t id, int32_t i, int32_t j, int32_t k, const vec3& value)
|
|
432
|
+
{
|
|
433
|
+
if (volume::get_grid_type(volume::id_to_buffer(id)) != PNANOVDB_GRID_TYPE_VEC3F) return;
|
|
434
|
+
|
|
435
|
+
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
436
|
+
const pnanovdb_root_handle_t root = volume::get_root(buf);
|
|
437
|
+
|
|
438
|
+
const pnanovdb_coord_t ijk{ i, j, k };
|
|
439
|
+
const pnanovdb_address_t address = pnanovdb_root_get_value_address(PNANOVDB_GRID_TYPE_VEC3F, buf, root, PNANOVDB_REF(ijk));
|
|
440
|
+
const pnanovdb_vec3_t v{ value[0], value[1], value[2] };
|
|
441
|
+
pnanovdb_write_vec3(buf, address, &v);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
CUDA_CALLABLE inline void adj_volume_store_v(
|
|
445
|
+
uint64_t id, int32_t i, int32_t j, int32_t k, const vec3& value,
|
|
446
|
+
uint64_t& adj_id, int32_t& adj_i, int32_t& adj_j, int32_t& adj_k, vec3& adj_value)
|
|
447
|
+
{
|
|
448
|
+
adj_value = add(adj_value, volume_lookup_v(id, i, j, k));
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
CUDA_CALLABLE inline void volume_store_i(uint64_t id, int32_t i, int32_t j, int32_t k, const int32_t& value)
|
|
452
|
+
{
|
|
453
|
+
if (volume::get_grid_type(volume::id_to_buffer(id)) != PNANOVDB_GRID_TYPE_INT32) return;
|
|
454
|
+
|
|
455
|
+
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
456
|
+
const pnanovdb_root_handle_t root = volume::get_root(buf);
|
|
457
|
+
|
|
458
|
+
const pnanovdb_coord_t ijk{ i, j, k };
|
|
459
|
+
const pnanovdb_address_t address = pnanovdb_root_get_value_address(PNANOVDB_GRID_TYPE_INT32, buf, root, PNANOVDB_REF(ijk));
|
|
460
|
+
pnanovdb_write_int32(buf, address, value);
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
CUDA_CALLABLE inline void adj_volume_store_i(
|
|
464
|
+
uint64_t id, int32_t i, int32_t j, int32_t k, const int32_t& value,
|
|
465
|
+
uint64_t& adj_id, int32_t& adj_i, int32_t& adj_j, int32_t& adj_k, int32_t& adj_value)
|
|
466
|
+
{
|
|
467
|
+
adj_value = add(adj_value, volume_lookup_i(id, i, j, k));
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
// Transform position from index space to world space
|
|
471
|
+
CUDA_CALLABLE inline vec3 volume_index_to_world(uint64_t id, vec3 uvw)
|
|
472
|
+
{
|
|
473
|
+
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
474
|
+
const pnanovdb_grid_handle_t grid = { 0u };
|
|
475
|
+
const pnanovdb_vec3_t pos{ uvw[0], uvw[1], uvw[2] };
|
|
476
|
+
const pnanovdb_vec3_t xyz = pnanovdb_grid_index_to_worldf(buf, grid, PNANOVDB_REF(pos));
|
|
477
|
+
return { xyz.x, xyz.y, xyz.z };
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
// Transform position from world space to index space
|
|
481
|
+
CUDA_CALLABLE inline vec3 volume_world_to_index(uint64_t id, vec3 xyz)
|
|
482
|
+
{
|
|
483
|
+
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
484
|
+
const pnanovdb_grid_handle_t grid = { 0u };
|
|
485
|
+
const pnanovdb_vec3_t pos{ xyz[0], xyz[1], xyz[2] };
|
|
486
|
+
const pnanovdb_vec3_t uvw = pnanovdb_grid_world_to_indexf(buf, grid, PNANOVDB_REF(pos));
|
|
487
|
+
return { uvw.x, uvw.y, uvw.z };
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
CUDA_CALLABLE inline void adj_volume_index_to_world(uint64_t id, vec3 uvw, uint64_t& adj_id, vec3& adj_uvw, const vec3& adj_ret)
|
|
491
|
+
{
|
|
492
|
+
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
493
|
+
const pnanovdb_grid_handle_t grid = { 0u };
|
|
494
|
+
const pnanovdb_vec3_t pos{ adj_ret[0], adj_ret[1], adj_ret[2] };
|
|
495
|
+
const pnanovdb_vec3_t xyz = pnanovdb_grid_index_to_world_dirf(buf, grid, PNANOVDB_REF(pos));
|
|
496
|
+
adj_uvw = add(adj_uvw, vec3{ xyz.x, xyz.y, xyz.z });
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
CUDA_CALLABLE inline void adj_volume_world_to_index(uint64_t id, vec3 xyz, uint64_t& adj_id, vec3& adj_xyz, const vec3& adj_ret)
|
|
500
|
+
{
|
|
501
|
+
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
502
|
+
const pnanovdb_grid_handle_t grid = { 0u };
|
|
503
|
+
const pnanovdb_vec3_t pos{ adj_ret[0], adj_ret[1], adj_ret[2] };
|
|
504
|
+
const pnanovdb_vec3_t uvw = pnanovdb_grid_world_to_index_dirf(buf, grid, PNANOVDB_REF(pos));
|
|
505
|
+
adj_xyz = add(adj_xyz, vec3{ uvw.x, uvw.y, uvw.z });
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
// Transform direction from index space to world space
|
|
509
|
+
CUDA_CALLABLE inline vec3 volume_index_to_world_dir(uint64_t id, vec3 uvw)
|
|
510
|
+
{
|
|
511
|
+
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
512
|
+
const pnanovdb_grid_handle_t grid = { 0u };
|
|
513
|
+
const pnanovdb_vec3_t pos{ uvw[0], uvw[1], uvw[2] };
|
|
514
|
+
const pnanovdb_vec3_t xyz = pnanovdb_grid_index_to_world_dirf(buf, grid, PNANOVDB_REF(pos));
|
|
515
|
+
return { xyz.x, xyz.y, xyz.z };
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
// Transform direction from world space to index space
|
|
519
|
+
CUDA_CALLABLE inline vec3 volume_world_to_index_dir(uint64_t id, vec3 xyz)
|
|
520
|
+
{
|
|
521
|
+
const pnanovdb_buf_t buf = volume::id_to_buffer(id);
|
|
522
|
+
const pnanovdb_grid_handle_t grid = { 0u };
|
|
523
|
+
const pnanovdb_vec3_t pos{ xyz[0], xyz[1], xyz[2] };
|
|
524
|
+
const pnanovdb_vec3_t uvw = pnanovdb_grid_world_to_index_dirf(buf, grid, PNANOVDB_REF(pos));
|
|
525
|
+
return { uvw.x, uvw.y, uvw.z };
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
CUDA_CALLABLE inline void adj_volume_index_to_world_dir(uint64_t id, vec3 uvw, uint64_t& adj_id, vec3& adj_uvw, const vec3& adj_ret)
|
|
529
|
+
{
|
|
530
|
+
adj_volume_index_to_world(id, uvw, adj_id, adj_uvw, adj_ret);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
CUDA_CALLABLE inline void adj_volume_world_to_index_dir(uint64_t id, vec3 xyz, uint64_t& adj_id, vec3& adj_xyz, const vec3& adj_ret)
|
|
534
|
+
{
|
|
535
|
+
adj_volume_world_to_index(id, xyz, adj_id, adj_xyz, adj_ret);
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
} // namespace wp
|