warp-lang 1.0.2__py3-none-win_amd64.whl → 1.2.0__py3-none-win_amd64.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/warp-clang.dll +0 -0
- warp/bin/warp.dll +0 -0
- warp/build.py +88 -113
- warp/build_dll.py +383 -375
- warp/builtins.py +3693 -3354
- warp/codegen.py +2925 -2792
- warp/config.py +40 -36
- warp/constants.py +49 -45
- warp/context.py +5409 -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 +381 -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 +145 -146
- warp/examples/benchmarks/benchmark_launches.py +293 -295
- warp/examples/browse.py +29 -29
- warp/examples/core/example_dem.py +232 -219
- warp/examples/core/example_fluid.py +291 -267
- warp/examples/core/example_graph_capture.py +142 -126
- warp/examples/core/example_marching_cubes.py +186 -174
- warp/examples/core/example_mesh.py +172 -155
- warp/examples/core/example_mesh_intersect.py +203 -193
- warp/examples/core/example_nvdb.py +174 -170
- warp/examples/core/example_raycast.py +103 -90
- warp/examples/core/example_raymarch.py +197 -178
- warp/examples/core/example_render_opengl.py +183 -141
- warp/examples/core/example_sph.py +403 -387
- warp/examples/core/example_torch.py +219 -181
- warp/examples/core/example_wave.py +261 -248
- warp/examples/fem/bsr_utils.py +378 -380
- warp/examples/fem/example_apic_fluid.py +432 -389
- warp/examples/fem/example_burgers.py +262 -0
- warp/examples/fem/example_convection_diffusion.py +180 -168
- warp/examples/fem/example_convection_diffusion_dg.py +217 -209
- warp/examples/fem/example_deformed_geometry.py +175 -159
- warp/examples/fem/example_diffusion.py +199 -173
- warp/examples/fem/example_diffusion_3d.py +178 -152
- warp/examples/fem/example_diffusion_mgpu.py +219 -214
- warp/examples/fem/example_mixed_elasticity.py +242 -222
- warp/examples/fem/example_navier_stokes.py +257 -243
- warp/examples/fem/example_stokes.py +218 -192
- warp/examples/fem/example_stokes_transfer.py +263 -249
- warp/examples/fem/mesh_utils.py +133 -109
- warp/examples/fem/plot_utils.py +292 -287
- warp/examples/optim/example_bounce.py +258 -246
- warp/examples/optim/example_cloth_throw.py +220 -209
- warp/examples/optim/example_diffray.py +564 -536
- warp/examples/optim/example_drone.py +862 -835
- warp/examples/optim/example_inverse_kinematics.py +174 -168
- warp/examples/optim/example_inverse_kinematics_torch.py +183 -169
- warp/examples/optim/example_spring_cage.py +237 -231
- warp/examples/optim/example_trajectory.py +221 -199
- warp/examples/optim/example_walker.py +304 -293
- warp/examples/sim/example_cartpole.py +137 -129
- warp/examples/sim/example_cloth.py +194 -186
- warp/examples/sim/example_granular.py +122 -111
- warp/examples/sim/example_granular_collision_sdf.py +195 -186
- warp/examples/sim/example_jacobian_ik.py +234 -214
- warp/examples/sim/example_particle_chain.py +116 -105
- warp/examples/sim/example_quadruped.py +191 -180
- warp/examples/sim/example_rigid_chain.py +195 -187
- warp/examples/sim/example_rigid_contact.py +187 -177
- warp/examples/sim/example_rigid_force.py +125 -125
- warp/examples/sim/example_rigid_gyroscopic.py +107 -95
- warp/examples/sim/example_rigid_soft_contact.py +132 -122
- warp/examples/sim/example_soft_body.py +188 -177
- warp/fabric.py +337 -335
- warp/fem/__init__.py +61 -27
- warp/fem/cache.py +403 -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 +16 -19
- warp/fem/geometry/closest_point.py +69 -70
- warp/fem/geometry/deformed_geometry.py +270 -271
- warp/fem/geometry/element.py +748 -744
- warp/fem/geometry/geometry.py +184 -186
- warp/fem/geometry/grid_2d.py +380 -373
- warp/fem/geometry/grid_3d.py +437 -435
- warp/fem/geometry/hexmesh.py +953 -953
- warp/fem/geometry/nanogrid.py +455 -0
- 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 +1684 -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 +179 -292
- warp/fem/space/basis_space.py +522 -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 +148 -267
- warp/fem/space/grid_3d_function_space.py +167 -306
- warp/fem/space/hexmesh_function_space.py +253 -352
- warp/fem/space/nanogrid_function_space.py +202 -0
- warp/fem/space/partition.py +350 -350
- warp/fem/space/quadmesh_2d_function_space.py +261 -369
- warp/fem/space/restriction.py +161 -160
- warp/fem/space/shape/__init__.py +90 -15
- warp/fem/space/shape/cube_shape_function.py +728 -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 +224 -292
- warp/fem/space/topology.py +297 -295
- warp/fem/space/trimesh_2d_function_space.py +153 -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 +1081 -1025
- warp/native/builtin.h +1603 -1560
- warp/native/bvh.cpp +402 -398
- warp/native/bvh.cu +533 -525
- warp/native/bvh.h +430 -429
- warp/native/clang/clang.cpp +496 -464
- warp/native/crt.cpp +42 -32
- warp/native/crt.h +352 -335
- 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/exports.h +187 -0
- 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 +1545 -1498
- warp/native/matnn.h +333 -333
- warp/native/mesh.cpp +203 -203
- warp/native/mesh.cu +292 -293
- warp/native/mesh.h +1887 -1887
- warp/native/nanovdb/GridHandle.h +366 -0
- warp/native/nanovdb/HostBuffer.h +590 -0
- warp/native/nanovdb/NanoVDB.h +6624 -4782
- warp/native/nanovdb/PNanoVDB.h +3390 -2553
- warp/native/noise.h +850 -850
- warp/native/quat.h +1112 -1085
- warp/native/rand.h +303 -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 +1177 -1133
- warp/native/volume.cpp +529 -297
- warp/native/volume.cu +58 -32
- warp/native/volume.h +960 -538
- warp/native/volume_builder.cu +446 -425
- warp/native/volume_builder.h +34 -19
- warp/native/volume_impl.h +61 -0
- warp/native/warp.cpp +1057 -1052
- warp/native/warp.cu +2949 -2828
- warp/native/warp.h +321 -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 +3356 -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 +1917 -1991
- warp/sim/integrator_xpbd.py +3288 -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 +1289 -1227
- warp/stubs.py +2192 -2469
- warp/tape.py +1162 -225
- warp/tests/__init__.py +1 -1
- warp/tests/__main__.py +4 -4
- warp/tests/assets/test_index_grid.nvdb +0 -0
- 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 +20 -22
- warp/tests/aux_test_grad_customs.py +21 -23
- warp/tests/aux_test_reference.py +9 -11
- warp/tests/aux_test_reference_reference.py +8 -10
- warp/tests/aux_test_square.py +15 -17
- warp/tests/aux_test_unresolved_func.py +14 -14
- warp/tests/aux_test_unresolved_symbol.py +14 -14
- warp/tests/disabled_kinematics.py +237 -239
- warp/tests/run_coverage_serial.py +31 -31
- warp/tests/test_adam.py +155 -157
- warp/tests/test_arithmetic.py +1088 -1124
- warp/tests/test_array.py +2415 -2326
- warp/tests/test_array_reduce.py +148 -150
- warp/tests/test_async.py +666 -656
- warp/tests/test_atomic.py +139 -141
- warp/tests/test_bool.py +212 -149
- warp/tests/test_builtins_resolution.py +1290 -1292
- warp/tests/test_bvh.py +162 -171
- warp/tests/test_closest_point_edge_edge.py +227 -228
- warp/tests/test_codegen.py +562 -553
- warp/tests/test_compile_consts.py +217 -101
- warp/tests/test_conditional.py +244 -246
- warp/tests/test_copy.py +230 -215
- warp/tests/test_ctypes.py +630 -632
- warp/tests/test_dense.py +65 -67
- warp/tests/test_devices.py +89 -98
- warp/tests/test_dlpack.py +528 -529
- warp/tests/test_examples.py +403 -378
- warp/tests/test_fabricarray.py +952 -955
- warp/tests/test_fast_math.py +60 -54
- warp/tests/test_fem.py +1298 -1278
- warp/tests/test_fp16.py +128 -130
- warp/tests/test_func.py +336 -337
- warp/tests/test_generics.py +596 -571
- warp/tests/test_grad.py +885 -640
- warp/tests/test_grad_customs.py +331 -336
- warp/tests/test_hash_grid.py +208 -164
- warp/tests/test_import.py +37 -39
- warp/tests/test_indexedarray.py +1132 -1134
- warp/tests/test_intersect.py +65 -67
- warp/tests/test_jax.py +305 -307
- warp/tests/test_large.py +169 -164
- warp/tests/test_launch.py +352 -354
- warp/tests/test_lerp.py +217 -261
- warp/tests/test_linear_solvers.py +189 -171
- warp/tests/test_lvalue.py +419 -493
- warp/tests/test_marching_cubes.py +63 -65
- warp/tests/test_mat.py +1799 -1827
- warp/tests/test_mat_lite.py +113 -115
- warp/tests/test_mat_scalar_ops.py +2905 -2889
- warp/tests/test_math.py +124 -193
- warp/tests/test_matmul.py +498 -499
- warp/tests/test_matmul_lite.py +408 -410
- warp/tests/test_mempool.py +186 -190
- warp/tests/test_mesh.py +281 -324
- warp/tests/test_mesh_query_aabb.py +226 -241
- warp/tests/test_mesh_query_point.py +690 -702
- warp/tests/test_mesh_query_ray.py +290 -303
- warp/tests/test_mlp.py +274 -276
- warp/tests/test_model.py +108 -110
- warp/tests/test_module_hashing.py +111 -0
- warp/tests/test_modules_lite.py +36 -39
- warp/tests/test_multigpu.py +161 -163
- warp/tests/test_noise.py +244 -248
- warp/tests/test_operators.py +248 -250
- warp/tests/test_options.py +121 -125
- warp/tests/test_peer.py +131 -137
- warp/tests/test_pinned.py +76 -78
- warp/tests/test_print.py +52 -54
- warp/tests/test_quat.py +2084 -2086
- warp/tests/test_rand.py +324 -288
- warp/tests/test_reload.py +207 -217
- warp/tests/test_rounding.py +177 -179
- warp/tests/test_runlength_encode.py +188 -190
- warp/tests/test_sim_grad.py +241 -0
- warp/tests/test_sim_kinematics.py +89 -97
- warp/tests/test_smoothstep.py +166 -168
- warp/tests/test_snippet.py +303 -266
- warp/tests/test_sparse.py +466 -460
- warp/tests/test_spatial.py +2146 -2148
- warp/tests/test_special_values.py +362 -0
- warp/tests/test_streams.py +484 -473
- warp/tests/test_struct.py +708 -675
- warp/tests/test_tape.py +171 -148
- warp/tests/test_torch.py +741 -743
- warp/tests/test_transient_module.py +85 -87
- warp/tests/test_types.py +554 -659
- warp/tests/test_utils.py +488 -499
- warp/tests/test_vec.py +1262 -1268
- warp/tests/test_vec_lite.py +71 -73
- warp/tests/test_vec_scalar_ops.py +2097 -2099
- warp/tests/test_verify_fp.py +92 -94
- warp/tests/test_volume.py +961 -736
- warp/tests/test_volume_write.py +338 -265
- warp/tests/unittest_serial.py +38 -37
- warp/tests/unittest_suites.py +367 -359
- warp/tests/unittest_utils.py +434 -578
- warp/tests/unused_test_misc.py +69 -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 +563 -561
- warp/torch.py +321 -295
- warp/types.py +4941 -4450
- warp/utils.py +1008 -821
- {warp_lang-1.0.2.dist-info → warp_lang-1.2.0.dist-info}/LICENSE.md +126 -126
- {warp_lang-1.0.2.dist-info → warp_lang-1.2.0.dist-info}/METADATA +365 -400
- warp_lang-1.2.0.dist-info/RECORD +359 -0
- warp/examples/assets/cube.usda +0 -42
- warp/examples/assets/sphere.usda +0 -56
- warp/examples/assets/torus.usda +0 -105
- warp/examples/fem/example_convection_diffusion_dg0.py +0 -194
- warp/native/nanovdb/PNanoVDBWrite.h +0 -295
- warp_lang-1.0.2.dist-info/RECORD +0 -352
- {warp_lang-1.0.2.dist-info → warp_lang-1.2.0.dist-info}/WHEEL +0 -0
- {warp_lang-1.0.2.dist-info → warp_lang-1.2.0.dist-info}/top_level.txt +0 -0
warp/native/volume.cpp
CHANGED
|
@@ -1,297 +1,529 @@
|
|
|
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
|
-
#include "
|
|
10
|
-
#include "volume_builder.h"
|
|
11
|
-
#include "
|
|
12
|
-
#include "
|
|
13
|
-
|
|
14
|
-
#include <map>
|
|
15
|
-
|
|
16
|
-
using namespace wp;
|
|
17
|
-
|
|
18
|
-
namespace
|
|
19
|
-
{
|
|
20
|
-
|
|
21
|
-
struct VolumeDesc
|
|
22
|
-
{
|
|
23
|
-
// NanoVDB buffer either in device or host memory
|
|
24
|
-
void*
|
|
25
|
-
uint64_t size_in_bytes;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
if (
|
|
49
|
-
return false;
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
{
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
VolumeDesc volume;
|
|
264
|
-
if (volume_get_descriptor(id, volume))
|
|
265
|
-
{
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
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
|
+
#include "cuda_util.h"
|
|
10
|
+
#include "volume_builder.h"
|
|
11
|
+
#include "volume_impl.h"
|
|
12
|
+
#include "warp.h"
|
|
13
|
+
|
|
14
|
+
#include <map>
|
|
15
|
+
|
|
16
|
+
using namespace wp;
|
|
17
|
+
|
|
18
|
+
namespace
|
|
19
|
+
{
|
|
20
|
+
|
|
21
|
+
struct VolumeDesc
|
|
22
|
+
{
|
|
23
|
+
// NanoVDB buffer either in device or host memory
|
|
24
|
+
void *buffer;
|
|
25
|
+
uint64_t size_in_bytes;
|
|
26
|
+
bool owner; // whether the buffer should be deallocated when the volume is destroyed
|
|
27
|
+
|
|
28
|
+
pnanovdb_grid_t grid_data;
|
|
29
|
+
pnanovdb_tree_t tree_data;
|
|
30
|
+
|
|
31
|
+
// Host-accessible version of the blind metadata (copy if GPU, alias if CPU)
|
|
32
|
+
pnanovdb_gridblindmetadata_t *blind_metadata;
|
|
33
|
+
|
|
34
|
+
// CUDA context for this volume (NULL if CPU)
|
|
35
|
+
void *context;
|
|
36
|
+
|
|
37
|
+
pnanovdb_buf_t as_pnano() const
|
|
38
|
+
{
|
|
39
|
+
return pnanovdb_make_buf(static_cast<uint32_t *>(buffer), size_in_bytes);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
// Host-side volume descriptors. Maps each CPU/GPU volume buffer address (id) to a CPU desc
|
|
44
|
+
std::map<uint64_t, VolumeDesc> g_volume_descriptors;
|
|
45
|
+
|
|
46
|
+
bool volume_get_descriptor(uint64_t id, const VolumeDesc *&volumeDesc)
|
|
47
|
+
{
|
|
48
|
+
if (id == 0)
|
|
49
|
+
return false;
|
|
50
|
+
|
|
51
|
+
const auto &iter = g_volume_descriptors.find(id);
|
|
52
|
+
if (iter == g_volume_descriptors.end())
|
|
53
|
+
return false;
|
|
54
|
+
else
|
|
55
|
+
volumeDesc = &iter->second;
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
bool volume_exists(const void *id)
|
|
60
|
+
{
|
|
61
|
+
const VolumeDesc *volume;
|
|
62
|
+
return volume_get_descriptor((uint64_t)id, volume);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
void volume_add_descriptor(uint64_t id, VolumeDesc &&volumeDesc)
|
|
66
|
+
{
|
|
67
|
+
g_volume_descriptors[id] = std::move(volumeDesc);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
void volume_rem_descriptor(uint64_t id)
|
|
71
|
+
{
|
|
72
|
+
g_volume_descriptors.erase(id);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
} // anonymous namespace
|
|
76
|
+
|
|
77
|
+
// NB: buf must be a host pointer
|
|
78
|
+
uint64_t volume_create_host(void *buf, uint64_t size, bool copy, bool owner)
|
|
79
|
+
{
|
|
80
|
+
if (size > 0 && size < sizeof(pnanovdb_grid_t) + sizeof(pnanovdb_tree_t))
|
|
81
|
+
return 0; // This cannot be a valid NanoVDB grid with data
|
|
82
|
+
|
|
83
|
+
if (!copy && volume_exists(buf))
|
|
84
|
+
{
|
|
85
|
+
// descriptor already created for this volume
|
|
86
|
+
return 0;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
VolumeDesc volume;
|
|
90
|
+
volume.context = NULL;
|
|
91
|
+
|
|
92
|
+
memcpy_h2h(&volume.grid_data, buf, sizeof(pnanovdb_grid_t));
|
|
93
|
+
memcpy_h2h(&volume.tree_data, (pnanovdb_grid_t *)buf + 1, sizeof(pnanovdb_tree_t));
|
|
94
|
+
|
|
95
|
+
if (volume.grid_data.magic != PNANOVDB_MAGIC_NUMBER && volume.grid_data.magic != PNANOVDB_MAGIC_GRID)
|
|
96
|
+
return 0;
|
|
97
|
+
|
|
98
|
+
if (size == 0)
|
|
99
|
+
{
|
|
100
|
+
size = volume.grid_data.grid_size;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Copy or alias buffer
|
|
104
|
+
volume.size_in_bytes = size;
|
|
105
|
+
if (copy)
|
|
106
|
+
{
|
|
107
|
+
volume.buffer = alloc_host(size);
|
|
108
|
+
memcpy_h2h(volume.buffer, buf, size);
|
|
109
|
+
volume.owner = true;
|
|
110
|
+
}
|
|
111
|
+
else
|
|
112
|
+
{
|
|
113
|
+
volume.buffer = buf;
|
|
114
|
+
volume.owner = owner;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Alias blind metadata
|
|
118
|
+
volume.blind_metadata = reinterpret_cast<pnanovdb_gridblindmetadata_t *>(static_cast<uint8_t *>(volume.buffer) +
|
|
119
|
+
volume.grid_data.blind_metadata_offset);
|
|
120
|
+
|
|
121
|
+
uint64_t id = (uint64_t)volume.buffer;
|
|
122
|
+
|
|
123
|
+
volume_add_descriptor(id, std::move(volume));
|
|
124
|
+
|
|
125
|
+
return id;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// NB: buf must be a pointer on the same device
|
|
129
|
+
uint64_t volume_create_device(void *context, void *buf, uint64_t size, bool copy, bool owner)
|
|
130
|
+
{
|
|
131
|
+
if (size > 0 && size < sizeof(pnanovdb_grid_t) + sizeof(pnanovdb_tree_t))
|
|
132
|
+
return 0; // This cannot be a valid NanoVDB grid with data
|
|
133
|
+
|
|
134
|
+
if (!copy && volume_exists(buf))
|
|
135
|
+
{
|
|
136
|
+
// descriptor already created for this volume
|
|
137
|
+
return 0;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
ContextGuard guard(context);
|
|
141
|
+
|
|
142
|
+
VolumeDesc volume;
|
|
143
|
+
volume.context = context ? context : cuda_context_get_current();
|
|
144
|
+
|
|
145
|
+
memcpy_d2h(WP_CURRENT_CONTEXT, &volume.grid_data, buf, sizeof(pnanovdb_grid_t));
|
|
146
|
+
memcpy_d2h(WP_CURRENT_CONTEXT, &volume.tree_data, (pnanovdb_grid_t *)buf + 1, sizeof(pnanovdb_tree_t));
|
|
147
|
+
// no sync needed since the above copies are to pageable memory
|
|
148
|
+
|
|
149
|
+
if (volume.grid_data.magic != PNANOVDB_MAGIC_NUMBER && volume.grid_data.magic != PNANOVDB_MAGIC_GRID)
|
|
150
|
+
return 0;
|
|
151
|
+
|
|
152
|
+
if (size == 0)
|
|
153
|
+
{
|
|
154
|
+
size = volume.grid_data.grid_size;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Copy or alias data buffer
|
|
158
|
+
volume.size_in_bytes = size;
|
|
159
|
+
if (copy)
|
|
160
|
+
{
|
|
161
|
+
volume.buffer = alloc_device(WP_CURRENT_CONTEXT, size);
|
|
162
|
+
memcpy_d2d(WP_CURRENT_CONTEXT, volume.buffer, buf, size);
|
|
163
|
+
volume.owner = true;
|
|
164
|
+
}
|
|
165
|
+
else
|
|
166
|
+
{
|
|
167
|
+
volume.buffer = buf;
|
|
168
|
+
volume.owner = owner;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Make blind metadata accessible on host
|
|
172
|
+
const uint64_t blindmetadata_size = volume.grid_data.blind_metadata_count * sizeof(pnanovdb_gridblindmetadata_t);
|
|
173
|
+
volume.blind_metadata = static_cast<pnanovdb_gridblindmetadata_t *>(alloc_pinned(blindmetadata_size));
|
|
174
|
+
memcpy_d2h(WP_CURRENT_CONTEXT, volume.blind_metadata,
|
|
175
|
+
static_cast<uint8_t *>(volume.buffer) + volume.grid_data.blind_metadata_offset, blindmetadata_size);
|
|
176
|
+
|
|
177
|
+
uint64_t id = (uint64_t)volume.buffer;
|
|
178
|
+
volume_add_descriptor(id, std::move(volume));
|
|
179
|
+
|
|
180
|
+
return id;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
void volume_get_buffer_info(uint64_t id, void **buf, uint64_t *size)
|
|
184
|
+
{
|
|
185
|
+
*buf = 0;
|
|
186
|
+
*size = 0;
|
|
187
|
+
|
|
188
|
+
const VolumeDesc *volume;
|
|
189
|
+
if (volume_get_descriptor(id, volume))
|
|
190
|
+
{
|
|
191
|
+
*buf = volume->buffer;
|
|
192
|
+
*size = volume->size_in_bytes;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
void volume_get_voxel_size(uint64_t id, float *dx, float *dy, float *dz)
|
|
197
|
+
{
|
|
198
|
+
*dx = *dx = *dz = 0.0f;
|
|
199
|
+
|
|
200
|
+
const VolumeDesc *volume;
|
|
201
|
+
if (volume_get_descriptor(id, volume))
|
|
202
|
+
{
|
|
203
|
+
*dx = (float)volume->grid_data.voxel_size[0];
|
|
204
|
+
*dy = (float)volume->grid_data.voxel_size[1];
|
|
205
|
+
*dz = (float)volume->grid_data.voxel_size[2];
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
void volume_get_tile_and_voxel_count(uint64_t id, uint32_t &tile_count, uint64_t &voxel_count)
|
|
210
|
+
{
|
|
211
|
+
tile_count = 0;
|
|
212
|
+
voxel_count = 0;
|
|
213
|
+
|
|
214
|
+
const VolumeDesc *volume;
|
|
215
|
+
if (volume_get_descriptor(id, volume))
|
|
216
|
+
{
|
|
217
|
+
tile_count = volume->tree_data.node_count_leaf;
|
|
218
|
+
|
|
219
|
+
const uint32_t grid_type = volume->grid_data.grid_type;
|
|
220
|
+
|
|
221
|
+
switch (grid_type)
|
|
222
|
+
{
|
|
223
|
+
case PNANOVDB_GRID_TYPE_ONINDEX:
|
|
224
|
+
case PNANOVDB_GRID_TYPE_ONINDEXMASK:
|
|
225
|
+
// number of indexable voxels is number of active voxels
|
|
226
|
+
voxel_count = volume->tree_data.voxel_count;
|
|
227
|
+
break;
|
|
228
|
+
default:
|
|
229
|
+
// all leaf voxels are indexable
|
|
230
|
+
voxel_count = uint64_t(tile_count) * PNANOVDB_LEAF_TABLE_COUNT;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
const char *volume_get_grid_info(uint64_t id, uint64_t *grid_size, uint32_t *grid_index, uint32_t *grid_count,
|
|
236
|
+
float translation[3], float transform[9], char type_str[16])
|
|
237
|
+
{
|
|
238
|
+
const VolumeDesc *volume;
|
|
239
|
+
if (volume_get_descriptor(id, volume))
|
|
240
|
+
{
|
|
241
|
+
const pnanovdb_grid_t &grid_data = volume->grid_data;
|
|
242
|
+
*grid_count = grid_data.grid_count;
|
|
243
|
+
*grid_index = grid_data.grid_index;
|
|
244
|
+
*grid_size = grid_data.grid_size;
|
|
245
|
+
|
|
246
|
+
memcpy(translation, grid_data.map.vecf, sizeof(grid_data.map.vecf));
|
|
247
|
+
memcpy(transform, grid_data.map.matf, sizeof(grid_data.map.matf));
|
|
248
|
+
|
|
249
|
+
nanovdb::toStr(type_str, static_cast<nanovdb::GridType>(grid_data.grid_type));
|
|
250
|
+
return (const char *)grid_data.grid_name;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
*grid_size = 0;
|
|
254
|
+
*grid_index = 0;
|
|
255
|
+
*grid_count = 0;
|
|
256
|
+
type_str[0] = 0;
|
|
257
|
+
|
|
258
|
+
return nullptr;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
uint32_t volume_get_blind_data_count(uint64_t id)
|
|
262
|
+
{
|
|
263
|
+
const VolumeDesc *volume;
|
|
264
|
+
if (volume_get_descriptor(id, volume))
|
|
265
|
+
{
|
|
266
|
+
return volume->grid_data.blind_metadata_count;
|
|
267
|
+
}
|
|
268
|
+
return 0;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
const char *volume_get_blind_data_info(uint64_t id, uint32_t data_index, void **buf, uint64_t *value_count,
|
|
272
|
+
uint32_t *value_size, char type_str[16])
|
|
273
|
+
{
|
|
274
|
+
const VolumeDesc *volume;
|
|
275
|
+
if (volume_get_descriptor(id, volume) && data_index < volume->grid_data.blind_metadata_count)
|
|
276
|
+
{
|
|
277
|
+
const pnanovdb_gridblindmetadata_t &metadata = volume->blind_metadata[data_index];
|
|
278
|
+
*value_count = metadata.value_count;
|
|
279
|
+
*value_size = metadata.value_size;
|
|
280
|
+
|
|
281
|
+
nanovdb::toStr(type_str, static_cast<nanovdb::GridType>(metadata.data_type));
|
|
282
|
+
*buf = static_cast<uint8_t *>(volume->buffer) + volume->grid_data.blind_metadata_offset +
|
|
283
|
+
data_index * sizeof(pnanovdb_gridblindmetadata_t) + metadata.data_offset;
|
|
284
|
+
return (const char *)metadata.name;
|
|
285
|
+
}
|
|
286
|
+
*buf = nullptr;
|
|
287
|
+
*value_count = 0;
|
|
288
|
+
*value_size = 0;
|
|
289
|
+
type_str[0] = 0;
|
|
290
|
+
return nullptr;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
void volume_get_tiles_host(uint64_t id, void *buf)
|
|
294
|
+
{
|
|
295
|
+
static constexpr uint32_t MASK = (1u << 3u) - 1u; // mask for bit operations
|
|
296
|
+
|
|
297
|
+
const VolumeDesc *volume;
|
|
298
|
+
if (volume_get_descriptor(id, volume))
|
|
299
|
+
{
|
|
300
|
+
const uint32_t leaf_count = volume->tree_data.node_count_leaf;
|
|
301
|
+
|
|
302
|
+
pnanovdb_coord_t *leaf_coords = static_cast<pnanovdb_coord_t *>(buf);
|
|
303
|
+
|
|
304
|
+
const uint64_t first_leaf =
|
|
305
|
+
(uint64_t)volume->buffer + sizeof(pnanovdb_grid_t) + volume->tree_data.node_offset_leaf;
|
|
306
|
+
const uint32_t leaf_stride = PNANOVDB_GRID_TYPE_GET(volume->grid_data.grid_type, leaf_size);
|
|
307
|
+
|
|
308
|
+
const pnanovdb_buf_t pnano_buf = volume->as_pnano();
|
|
309
|
+
|
|
310
|
+
for (uint32_t i = 0; i < leaf_count; ++i)
|
|
311
|
+
{
|
|
312
|
+
pnanovdb_leaf_handle_t leaf = volume::get_leaf(pnano_buf, i);
|
|
313
|
+
leaf_coords[i] = volume::leaf_origin(pnano_buf, leaf);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
void volume_get_voxels_host(uint64_t id, void *buf)
|
|
319
|
+
{
|
|
320
|
+
const VolumeDesc *volume;
|
|
321
|
+
if (volume_get_descriptor(id, volume))
|
|
322
|
+
{
|
|
323
|
+
uint32_t leaf_count;
|
|
324
|
+
uint64_t voxel_count;
|
|
325
|
+
volume_get_tile_and_voxel_count(id, leaf_count, voxel_count);
|
|
326
|
+
|
|
327
|
+
pnanovdb_coord_t *voxel_coords = static_cast<pnanovdb_coord_t *>(buf);
|
|
328
|
+
|
|
329
|
+
const pnanovdb_buf_t pnano_buf = volume->as_pnano();
|
|
330
|
+
for (uint32_t i = 0; i < leaf_count; ++i)
|
|
331
|
+
{
|
|
332
|
+
pnanovdb_leaf_handle_t leaf = volume::get_leaf(pnano_buf, i);
|
|
333
|
+
pnanovdb_coord_t leaf_coords = volume::leaf_origin(pnano_buf, leaf);
|
|
334
|
+
|
|
335
|
+
for (uint32_t n = 0; n < 512; ++n)
|
|
336
|
+
{
|
|
337
|
+
pnanovdb_coord_t loc_ijk = volume::leaf_offset_to_local_coord(n);
|
|
338
|
+
pnanovdb_coord_t ijk = {
|
|
339
|
+
loc_ijk.x + leaf_coords.x,
|
|
340
|
+
loc_ijk.y + leaf_coords.y,
|
|
341
|
+
loc_ijk.z + leaf_coords.z,
|
|
342
|
+
};
|
|
343
|
+
|
|
344
|
+
const uint64_t index = volume::leaf_voxel_index(pnano_buf, i, ijk);
|
|
345
|
+
if (index < voxel_count)
|
|
346
|
+
{
|
|
347
|
+
voxel_coords[index] = ijk;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
void volume_destroy_host(uint64_t id)
|
|
355
|
+
{
|
|
356
|
+
const VolumeDesc *volume;
|
|
357
|
+
if (volume_get_descriptor(id, volume))
|
|
358
|
+
{
|
|
359
|
+
if (volume->owner)
|
|
360
|
+
{
|
|
361
|
+
free_host(volume->buffer);
|
|
362
|
+
}
|
|
363
|
+
volume_rem_descriptor(id);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
void volume_destroy_device(uint64_t id)
|
|
368
|
+
{
|
|
369
|
+
const VolumeDesc *volume;
|
|
370
|
+
if (volume_get_descriptor(id, volume))
|
|
371
|
+
{
|
|
372
|
+
ContextGuard guard(volume->context);
|
|
373
|
+
if (volume->owner)
|
|
374
|
+
{
|
|
375
|
+
free_device(WP_CURRENT_CONTEXT, volume->buffer);
|
|
376
|
+
}
|
|
377
|
+
free_pinned(volume->blind_metadata);
|
|
378
|
+
volume_rem_descriptor(id);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
#if WP_ENABLE_CUDA
|
|
383
|
+
uint64_t volume_f_from_tiles_device(void *context, void *points, int num_points, float voxel_size, float bg_value,
|
|
384
|
+
float tx, float ty, float tz, bool points_in_world_space)
|
|
385
|
+
{
|
|
386
|
+
nanovdb::FloatGrid *grid;
|
|
387
|
+
size_t gridSize;
|
|
388
|
+
BuildGridParams<float> params;
|
|
389
|
+
params.voxel_size = voxel_size;
|
|
390
|
+
params.background_value = bg_value;
|
|
391
|
+
params.translation = nanovdb::Vec3f{tx, ty, tz};
|
|
392
|
+
|
|
393
|
+
build_grid_from_points(grid, gridSize, points, num_points, points_in_world_space, params);
|
|
394
|
+
|
|
395
|
+
return volume_create_device(context, grid, gridSize, false, true);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
uint64_t volume_v_from_tiles_device(void *context, void *points, int num_points, float voxel_size, float bg_value_x,
|
|
399
|
+
float bg_value_y, float bg_value_z, float tx, float ty, float tz,
|
|
400
|
+
bool points_in_world_space)
|
|
401
|
+
{
|
|
402
|
+
nanovdb::Vec3fGrid *grid;
|
|
403
|
+
size_t gridSize;
|
|
404
|
+
BuildGridParams<nanovdb::Vec3f> params;
|
|
405
|
+
params.voxel_size = voxel_size;
|
|
406
|
+
params.background_value = nanovdb::Vec3f{bg_value_x, bg_value_y, bg_value_z};
|
|
407
|
+
params.translation = nanovdb::Vec3f{tx, ty, tz};
|
|
408
|
+
|
|
409
|
+
build_grid_from_points(grid, gridSize, points, num_points, points_in_world_space, params);
|
|
410
|
+
|
|
411
|
+
return volume_create_device(context, grid, gridSize, false, true);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
uint64_t volume_i_from_tiles_device(void *context, void *points, int num_points, float voxel_size, int bg_value,
|
|
415
|
+
float tx, float ty, float tz, bool points_in_world_space)
|
|
416
|
+
{
|
|
417
|
+
nanovdb::Int32Grid *grid;
|
|
418
|
+
size_t gridSize;
|
|
419
|
+
BuildGridParams<int32_t> params;
|
|
420
|
+
params.voxel_size = voxel_size;
|
|
421
|
+
params.background_value = (int32_t)(bg_value);
|
|
422
|
+
params.translation = nanovdb::Vec3f{tx, ty, tz};
|
|
423
|
+
|
|
424
|
+
build_grid_from_points(grid, gridSize, points, num_points, points_in_world_space, params);
|
|
425
|
+
|
|
426
|
+
return volume_create_device(context, grid, gridSize, false, true);
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
uint64_t volume_index_from_tiles_device(void *context, void *points, int num_points, float voxel_size, float tx,
|
|
430
|
+
float ty, float tz, bool points_in_world_space)
|
|
431
|
+
{
|
|
432
|
+
nanovdb::IndexGrid *grid;
|
|
433
|
+
size_t gridSize;
|
|
434
|
+
BuildGridParams<nanovdb::ValueIndex> params;
|
|
435
|
+
params.voxel_size = voxel_size;
|
|
436
|
+
params.translation = nanovdb::Vec3f{tx, ty, tz};
|
|
437
|
+
|
|
438
|
+
build_grid_from_points(grid, gridSize, points, num_points, points_in_world_space, params);
|
|
439
|
+
|
|
440
|
+
return volume_create_device(context, grid, gridSize, false, true);
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
uint64_t volume_from_active_voxels_device(void *context, void *points, int num_points, float voxel_size, float tx,
|
|
444
|
+
float ty, float tz, bool points_in_world_space)
|
|
445
|
+
{
|
|
446
|
+
nanovdb::OnIndexGrid *grid;
|
|
447
|
+
size_t gridSize;
|
|
448
|
+
BuildGridParams<nanovdb::ValueOnIndex> params;
|
|
449
|
+
params.voxel_size = voxel_size;
|
|
450
|
+
params.translation = nanovdb::Vec3f{tx, ty, tz};
|
|
451
|
+
|
|
452
|
+
build_grid_from_points(grid, gridSize, points, num_points, points_in_world_space, params);
|
|
453
|
+
|
|
454
|
+
return volume_create_device(context, grid, gridSize, false, true);
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
void launch_get_leaf_coords(void *context, const uint32_t leaf_count, pnanovdb_coord_t *leaf_coords,
|
|
458
|
+
pnanovdb_buf_t buf);
|
|
459
|
+
void launch_get_voxel_coords(void *context, const uint32_t leaf_count, const uint32_t voxel_count,
|
|
460
|
+
pnanovdb_coord_t *voxel_coords, pnanovdb_buf_t buf);
|
|
461
|
+
|
|
462
|
+
void volume_get_tiles_device(uint64_t id, void *buf)
|
|
463
|
+
{
|
|
464
|
+
const VolumeDesc *volume;
|
|
465
|
+
if (volume_get_descriptor(id, volume))
|
|
466
|
+
{
|
|
467
|
+
const uint32_t leaf_count = volume->tree_data.node_count_leaf;
|
|
468
|
+
|
|
469
|
+
pnanovdb_coord_t *leaf_coords = static_cast<pnanovdb_coord_t *>(buf);
|
|
470
|
+
launch_get_leaf_coords(volume->context, leaf_count, leaf_coords, volume->as_pnano());
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
void volume_get_voxels_device(uint64_t id, void *buf)
|
|
475
|
+
{
|
|
476
|
+
const VolumeDesc *volume;
|
|
477
|
+
if (volume_get_descriptor(id, volume))
|
|
478
|
+
{
|
|
479
|
+
uint32_t leaf_count;
|
|
480
|
+
uint64_t voxel_count;
|
|
481
|
+
volume_get_tile_and_voxel_count(id, leaf_count, voxel_count);
|
|
482
|
+
|
|
483
|
+
pnanovdb_coord_t *voxel_coords = static_cast<pnanovdb_coord_t *>(buf);
|
|
484
|
+
launch_get_voxel_coords(volume->context, leaf_count, voxel_count, voxel_coords, volume->as_pnano());
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
#else
|
|
489
|
+
// stubs for non-CUDA platforms
|
|
490
|
+
uint64_t volume_f_from_tiles_device(void *context, void *points, int num_points, float voxel_size, float bg_value,
|
|
491
|
+
float tx, float ty, float tz, bool points_in_world_space)
|
|
492
|
+
{
|
|
493
|
+
return 0;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
uint64_t volume_v_from_tiles_device(void *context, void *points, int num_points, float voxel_size, float bg_value_x,
|
|
497
|
+
float bg_value_y, float bg_value_z, float tx, float ty, float tz,
|
|
498
|
+
bool points_in_world_space)
|
|
499
|
+
{
|
|
500
|
+
return 0;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
uint64_t volume_i_from_tiles_device(void *context, void *points, int num_points, float voxel_size, int bg_value,
|
|
504
|
+
float tx, float ty, float tz, bool points_in_world_space)
|
|
505
|
+
{
|
|
506
|
+
return 0;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
uint64_t volume_index_from_tiles_device(void *context, void *points, int num_points, float voxel_size,
|
|
510
|
+
float tx, float ty, float tz, bool points_in_world_space)
|
|
511
|
+
{
|
|
512
|
+
return 0;
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
uint64_t volume_from_active_voxels_device(void *context, void *points, int num_points, float voxel_size, float tx,
|
|
516
|
+
float ty, float tz, bool points_in_world_space)
|
|
517
|
+
{
|
|
518
|
+
return 0;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
void volume_get_tiles_device(uint64_t id, void *buf)
|
|
522
|
+
{
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
void volume_get_voxels_device(uint64_t id, void *buf)
|
|
526
|
+
{
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
#endif
|