warp-lang 1.0.2__py3-none-manylinux2014_x86_64.whl → 1.2.0__py3-none-manylinux2014_x86_64.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.so +0 -0
- warp/bin/warp.so +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_builder.cu
CHANGED
|
@@ -1,425 +1,446 @@
|
|
|
1
|
-
#include "volume_builder.h"
|
|
2
|
-
|
|
3
|
-
#include <cuda.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
#include <
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
(
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
return
|
|
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
|
-
|
|
264
|
-
|
|
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
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
1
|
+
#include "volume_builder.h"
|
|
2
|
+
|
|
3
|
+
#include <nanovdb/tools/cuda/PointsToGrid.cuh>
|
|
4
|
+
|
|
5
|
+
#include <cuda.h>
|
|
6
|
+
#include <cuda_runtime_api.h>
|
|
7
|
+
|
|
8
|
+
#include <cub/cub.cuh>
|
|
9
|
+
|
|
10
|
+
#if defined(__NVCC_DIAG_PRAGMA_SUPPORT__)
|
|
11
|
+
// dynamic initialization is not supported for a function-scope static __shared__ variable within a
|
|
12
|
+
// __device__/__global__ function
|
|
13
|
+
#pragma nv_diag_suppress 20054
|
|
14
|
+
#elif defined(__NVCC__)
|
|
15
|
+
#pragma diag_suppress 20054
|
|
16
|
+
#endif
|
|
17
|
+
namespace
|
|
18
|
+
{
|
|
19
|
+
/// Allocator class following interface of cub::cachingDeviceAllocator, as expected by naovdb::PointsToGrid
|
|
20
|
+
struct Allocator
|
|
21
|
+
{
|
|
22
|
+
|
|
23
|
+
cudaError_t DeviceAllocate(void **d_ptr, ///< [out] Reference to pointer to the allocation
|
|
24
|
+
size_t bytes, ///< [in] Minimum number of bytes for the allocation
|
|
25
|
+
cudaStream_t active_stream) ///< [in] The stream to be associated with this allocation
|
|
26
|
+
{
|
|
27
|
+
// in PointsToGrid stream argument always coincide with current stream, ignore
|
|
28
|
+
*d_ptr = alloc_device(WP_CURRENT_CONTEXT, bytes);
|
|
29
|
+
return cudaSuccess;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
cudaError_t DeviceFree(void *d_ptr)
|
|
33
|
+
{
|
|
34
|
+
free_device(WP_CURRENT_CONTEXT, d_ptr);
|
|
35
|
+
return cudaSuccess;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
cudaError_t FreeAllCached()
|
|
39
|
+
{
|
|
40
|
+
return cudaSuccess;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/// @brief Implementation of NanoVDB's DeviceBuffer that uses warp allocators
|
|
45
|
+
class DeviceBuffer
|
|
46
|
+
{
|
|
47
|
+
uint64_t mSize; // total number of bytes managed by this buffer (assumed to be identical for host and device)
|
|
48
|
+
void *mCpuData, *mGpuData; // raw pointers to the host and device buffers
|
|
49
|
+
bool mManaged;
|
|
50
|
+
|
|
51
|
+
public:
|
|
52
|
+
/// @brief Static factory method that return an instance of this buffer
|
|
53
|
+
/// @param size byte size of buffer to be initialized
|
|
54
|
+
/// @param dummy this argument is currently ignored but required to match the API of the HostBuffer
|
|
55
|
+
/// @param host If true buffer is initialized only on the host/CPU, else on the device/GPU
|
|
56
|
+
/// @param stream optional stream argument (defaults to stream NULL)
|
|
57
|
+
/// @return An instance of this class using move semantics
|
|
58
|
+
static DeviceBuffer create(uint64_t size, const DeviceBuffer *dummy = nullptr, bool host = true,
|
|
59
|
+
void *stream = nullptr)
|
|
60
|
+
{
|
|
61
|
+
return DeviceBuffer(size, host, stream);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/// @brief Static factory method that return an instance of this buffer that wraps externally managed memory
|
|
65
|
+
/// @param size byte size of buffer specified by external memory
|
|
66
|
+
/// @param cpuData pointer to externally managed host memory
|
|
67
|
+
/// @param gpuData pointer to externally managed device memory
|
|
68
|
+
/// @return An instance of this class using move semantics
|
|
69
|
+
static DeviceBuffer create(uint64_t size, void *cpuData, void *gpuData)
|
|
70
|
+
{
|
|
71
|
+
return DeviceBuffer(size, cpuData, gpuData);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/// @brief Constructor
|
|
75
|
+
/// @param size byte size of buffer to be initialized
|
|
76
|
+
/// @param host If true buffer is initialized only on the host/CPU, else on the device/GPU
|
|
77
|
+
/// @param stream optional stream argument (defaults to stream NULL)
|
|
78
|
+
DeviceBuffer(uint64_t size = 0, bool host = true, void *stream = nullptr)
|
|
79
|
+
: mSize(0), mCpuData(nullptr), mGpuData(nullptr), mManaged(false)
|
|
80
|
+
{
|
|
81
|
+
if (size > 0)
|
|
82
|
+
this->init(size, host, stream);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
DeviceBuffer(uint64_t size, void *cpuData, void *gpuData)
|
|
86
|
+
: mSize(size), mCpuData(cpuData), mGpuData(gpuData), mManaged(false)
|
|
87
|
+
{
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/// @brief Disallow copy-construction
|
|
91
|
+
DeviceBuffer(const DeviceBuffer &) = delete;
|
|
92
|
+
|
|
93
|
+
/// @brief Move copy-constructor
|
|
94
|
+
DeviceBuffer(DeviceBuffer &&other) noexcept
|
|
95
|
+
: mSize(other.mSize), mCpuData(other.mCpuData), mGpuData(other.mGpuData), mManaged(other.mManaged)
|
|
96
|
+
{
|
|
97
|
+
other.mSize = 0;
|
|
98
|
+
other.mCpuData = nullptr;
|
|
99
|
+
other.mGpuData = nullptr;
|
|
100
|
+
other.mManaged = false;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/// @brief Disallow copy assignment operation
|
|
104
|
+
DeviceBuffer &operator=(const DeviceBuffer &) = delete;
|
|
105
|
+
|
|
106
|
+
/// @brief Move copy assignment operation
|
|
107
|
+
DeviceBuffer &operator=(DeviceBuffer &&other) noexcept
|
|
108
|
+
{
|
|
109
|
+
this->clear();
|
|
110
|
+
mSize = other.mSize;
|
|
111
|
+
mCpuData = other.mCpuData;
|
|
112
|
+
mGpuData = other.mGpuData;
|
|
113
|
+
mManaged = other.mManaged;
|
|
114
|
+
other.mSize = 0;
|
|
115
|
+
other.mCpuData = nullptr;
|
|
116
|
+
other.mGpuData = nullptr;
|
|
117
|
+
other.mManaged = false;
|
|
118
|
+
return *this;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/// @brief Destructor frees memory on both the host and device
|
|
122
|
+
~DeviceBuffer()
|
|
123
|
+
{
|
|
124
|
+
this->clear();
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
/// @brief Initialize buffer
|
|
128
|
+
/// @param size byte size of buffer to be initialized
|
|
129
|
+
/// @param host If true buffer is initialized only on the host/CPU, else on the device/GPU
|
|
130
|
+
/// @note All existing buffers are first cleared
|
|
131
|
+
/// @warning size is expected to be non-zero. Use clear() clear buffer!
|
|
132
|
+
void init(uint64_t size, bool host = true, void *stream = nullptr)
|
|
133
|
+
{
|
|
134
|
+
if (mSize > 0)
|
|
135
|
+
this->clear(stream);
|
|
136
|
+
NANOVDB_ASSERT(size > 0);
|
|
137
|
+
if (host)
|
|
138
|
+
{
|
|
139
|
+
mCpuData =
|
|
140
|
+
alloc_pinned(size); // un-managed pinned memory on the host (can be slow to access!). Always 32B aligned
|
|
141
|
+
}
|
|
142
|
+
else
|
|
143
|
+
{
|
|
144
|
+
mGpuData = alloc_device(WP_CURRENT_CONTEXT, size);
|
|
145
|
+
}
|
|
146
|
+
mSize = size;
|
|
147
|
+
mManaged = true;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/// @brief Returns a raw pointer to the host/CPU buffer managed by this allocator.
|
|
151
|
+
/// @warning Note that the pointer can be NULL!
|
|
152
|
+
void *data() const
|
|
153
|
+
{
|
|
154
|
+
return mCpuData;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/// @brief Returns a raw pointer to the device/GPU buffer managed by this allocator.
|
|
158
|
+
/// @warning Note that the pointer can be NULL!
|
|
159
|
+
void *deviceData() const
|
|
160
|
+
{
|
|
161
|
+
return mGpuData;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/// @brief Returns the size in bytes of the raw memory buffer managed by this allocator.
|
|
165
|
+
uint64_t size() const
|
|
166
|
+
{
|
|
167
|
+
return mSize;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
//@{
|
|
171
|
+
/// @brief Returns true if this allocator is empty, i.e. has no allocated memory
|
|
172
|
+
bool empty() const
|
|
173
|
+
{
|
|
174
|
+
return mSize == 0;
|
|
175
|
+
}
|
|
176
|
+
bool isEmpty() const
|
|
177
|
+
{
|
|
178
|
+
return mSize == 0;
|
|
179
|
+
}
|
|
180
|
+
//@}
|
|
181
|
+
|
|
182
|
+
/// @brief Detach device data so it is not dealloced when this buffer is destroyed
|
|
183
|
+
void detachDeviceData()
|
|
184
|
+
{
|
|
185
|
+
mGpuData = nullptr;
|
|
186
|
+
if (!mCpuData)
|
|
187
|
+
{
|
|
188
|
+
mSize = 0;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/// @brief De-allocate all memory managed by this allocator and set all pointers to NULL
|
|
193
|
+
void clear(void *stream = nullptr)
|
|
194
|
+
{
|
|
195
|
+
if (mManaged && mGpuData)
|
|
196
|
+
free_device(WP_CURRENT_CONTEXT, mGpuData);
|
|
197
|
+
if (mManaged && mCpuData)
|
|
198
|
+
free_pinned(mCpuData);
|
|
199
|
+
mCpuData = mGpuData = nullptr;
|
|
200
|
+
mSize = 0;
|
|
201
|
+
mManaged = false;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
}; // DeviceBuffer class
|
|
205
|
+
|
|
206
|
+
template <typename Tree> __global__ void activateAllLeafVoxels(Tree *tree)
|
|
207
|
+
{
|
|
208
|
+
const unsigned leaf_count = tree->mNodeCount[0];
|
|
209
|
+
|
|
210
|
+
const unsigned tid = blockIdx.x * blockDim.x + threadIdx.x;
|
|
211
|
+
|
|
212
|
+
if (tid < leaf_count)
|
|
213
|
+
{
|
|
214
|
+
// activate all leaf voxels
|
|
215
|
+
typename Tree::LeafNodeType *const leaf_nodes = tree->getFirstLeaf();
|
|
216
|
+
typename Tree::LeafNodeType &leaf = leaf_nodes[tid];
|
|
217
|
+
leaf.mValueMask.setOn();
|
|
218
|
+
leaf.updateBBox();
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if (tid == 0)
|
|
222
|
+
{
|
|
223
|
+
tree->mVoxelCount = Tree::LeafNodeType::SIZE * leaf_count; // full leaves
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
template <typename Node>
|
|
228
|
+
__device__ std::enable_if_t<!nanovdb::BuildTraits<typename Node::BuildType>::is_index> setBackgroundValue(
|
|
229
|
+
Node &node, unsigned tile_id, const typename Node::BuildType background_value)
|
|
230
|
+
{
|
|
231
|
+
node.setValue(tile_id, background_value);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
template <typename Node>
|
|
235
|
+
__device__ std::enable_if_t<nanovdb::BuildTraits<typename Node::BuildType>::is_index> setBackgroundValue(
|
|
236
|
+
Node &node, unsigned tile_id, const typename Node::BuildType background_value)
|
|
237
|
+
{
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
template <typename Node>
|
|
241
|
+
__device__ std::enable_if_t<!nanovdb::BuildTraits<typename Node::BuildType>::is_index> setBackgroundValue(
|
|
242
|
+
Node &node, const typename Node::BuildType background_value)
|
|
243
|
+
{
|
|
244
|
+
node.mBackground = background_value;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
template <typename Node>
|
|
248
|
+
__device__ std::enable_if_t<nanovdb::BuildTraits<typename Node::BuildType>::is_index> setBackgroundValue(
|
|
249
|
+
Node &node, const typename Node::BuildType background_value)
|
|
250
|
+
{
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
template <typename Tree, typename NodeT>
|
|
254
|
+
__global__ void setInternalBBoxAndBackgroundValue(Tree *tree, const typename Tree::BuildType background_value)
|
|
255
|
+
{
|
|
256
|
+
using BBox = nanovdb::math::BBox<typename NodeT::CoordT>;
|
|
257
|
+
__shared__ BBox bbox;
|
|
258
|
+
|
|
259
|
+
const unsigned node_count = tree->mNodeCount[NodeT::LEVEL];
|
|
260
|
+
const unsigned node_id = blockIdx.x;
|
|
261
|
+
|
|
262
|
+
if (node_id < node_count)
|
|
263
|
+
{
|
|
264
|
+
|
|
265
|
+
if (threadIdx.x == 0)
|
|
266
|
+
{
|
|
267
|
+
bbox = BBox();
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
__syncthreads();
|
|
271
|
+
|
|
272
|
+
NodeT &node = tree->template getFirstNode<NodeT>()[node_id];
|
|
273
|
+
for (unsigned child_id = threadIdx.x; child_id < NodeT::SIZE; child_id += blockDim.x)
|
|
274
|
+
{
|
|
275
|
+
if (node.isChild(child_id))
|
|
276
|
+
{
|
|
277
|
+
bbox.expandAtomic(node.getChild(child_id)->bbox());
|
|
278
|
+
}
|
|
279
|
+
else
|
|
280
|
+
{
|
|
281
|
+
setBackgroundValue(node, child_id, background_value);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
__syncthreads();
|
|
286
|
+
|
|
287
|
+
if (threadIdx.x == 0)
|
|
288
|
+
{
|
|
289
|
+
node.mBBox = bbox;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
template <typename Tree>
|
|
295
|
+
__global__ void setRootBBoxAndBackgroundValue(nanovdb::Grid<Tree> *grid,
|
|
296
|
+
const typename Tree::BuildType background_value)
|
|
297
|
+
{
|
|
298
|
+
using BBox = typename Tree::RootNodeType::BBoxType;
|
|
299
|
+
__shared__ BBox bbox;
|
|
300
|
+
|
|
301
|
+
Tree &tree = grid->tree();
|
|
302
|
+
const unsigned upper_count = tree.mNodeCount[2];
|
|
303
|
+
|
|
304
|
+
if (threadIdx.x == 0)
|
|
305
|
+
{
|
|
306
|
+
bbox = BBox();
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
__syncthreads();
|
|
310
|
+
|
|
311
|
+
for (unsigned upper_id = threadIdx.x; upper_id < upper_count; upper_id += blockDim.x)
|
|
312
|
+
{
|
|
313
|
+
typename Tree::UpperNodeType &upper = tree.getFirstUpper()[upper_id];
|
|
314
|
+
bbox.expandAtomic(upper.bbox());
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
__syncthreads();
|
|
318
|
+
|
|
319
|
+
if (threadIdx.x == 0)
|
|
320
|
+
{
|
|
321
|
+
typename Tree::RootNodeType &root = tree.root();
|
|
322
|
+
setBackgroundValue(root, background_value);
|
|
323
|
+
root.mBBox = bbox;
|
|
324
|
+
|
|
325
|
+
grid->mWorldBBox = root.mBBox.transform(grid->map());
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
template <typename BuildT>
|
|
330
|
+
void finalize_grid(nanovdb::Grid<nanovdb::NanoTree<BuildT>> &out_grid, const BuildGridParams<BuildT> ¶ms)
|
|
331
|
+
{
|
|
332
|
+
// set background value, activate all voxels for allocated tiles and update bbox
|
|
333
|
+
|
|
334
|
+
using Tree = nanovdb::NanoTree<BuildT>;
|
|
335
|
+
Tree *tree = &out_grid.tree();
|
|
336
|
+
|
|
337
|
+
int node_counts[3];
|
|
338
|
+
memcpy_d2h(WP_CURRENT_CONTEXT, node_counts, tree->mNodeCount, sizeof(node_counts));
|
|
339
|
+
// synchronization below is unnecessary as node_counts is in pageable memory.
|
|
340
|
+
// keep it for clarity
|
|
341
|
+
cudaStream_t stream = static_cast<cudaStream_t>(cuda_stream_get_current());
|
|
342
|
+
cuda_stream_synchronize(stream);
|
|
343
|
+
|
|
344
|
+
const unsigned int leaf_count = node_counts[0];
|
|
345
|
+
const unsigned int lower_count = node_counts[1];
|
|
346
|
+
const unsigned int upper_count = node_counts[2];
|
|
347
|
+
|
|
348
|
+
constexpr unsigned NUM_THREADS = 256;
|
|
349
|
+
const unsigned leaf_blocks = (leaf_count + NUM_THREADS - 1) / NUM_THREADS;
|
|
350
|
+
activateAllLeafVoxels<Tree><<<leaf_blocks, NUM_THREADS, 0, stream>>>(tree);
|
|
351
|
+
|
|
352
|
+
setInternalBBoxAndBackgroundValue<Tree, typename Tree::LowerNodeType>
|
|
353
|
+
<<<lower_count, NUM_THREADS, 0, stream>>>(tree, params.background_value);
|
|
354
|
+
setInternalBBoxAndBackgroundValue<Tree, typename Tree::UpperNodeType>
|
|
355
|
+
<<<upper_count, NUM_THREADS, 0, stream>>>(tree, params.background_value);
|
|
356
|
+
setRootBBoxAndBackgroundValue<Tree><<<1, NUM_THREADS, 0, stream>>>(&out_grid, params.background_value);
|
|
357
|
+
|
|
358
|
+
check_cuda(cuda_context_check(WP_CURRENT_CONTEXT));
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
template <>
|
|
362
|
+
void finalize_grid(nanovdb::Grid<nanovdb::NanoTree<nanovdb::ValueOnIndex>> &out_grid,
|
|
363
|
+
const BuildGridParams<nanovdb::ValueOnIndex> ¶ms)
|
|
364
|
+
{
|
|
365
|
+
// nothing to do for OnIndex grids
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/// "fancy-pointer" that transforms from world to index coordinates
|
|
369
|
+
struct WorldSpacePointsPtr
|
|
370
|
+
{
|
|
371
|
+
const nanovdb::Vec3f *points;
|
|
372
|
+
const nanovdb::Map map;
|
|
373
|
+
|
|
374
|
+
__device__ nanovdb::Vec3f operator[](int idx) const
|
|
375
|
+
{
|
|
376
|
+
return map.applyInverseMapF(points[idx]);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
__device__ nanovdb::Vec3f operator*() const
|
|
380
|
+
{
|
|
381
|
+
return (*this)[0];
|
|
382
|
+
}
|
|
383
|
+
};
|
|
384
|
+
|
|
385
|
+
} // namespace
|
|
386
|
+
|
|
387
|
+
namespace nanovdb
|
|
388
|
+
{
|
|
389
|
+
template <> struct BufferTraits<DeviceBuffer>
|
|
390
|
+
{
|
|
391
|
+
static constexpr bool hasDeviceDual = true;
|
|
392
|
+
};
|
|
393
|
+
|
|
394
|
+
} // namespace nanovdb
|
|
395
|
+
|
|
396
|
+
template <typename BuildT>
|
|
397
|
+
void build_grid_from_points(nanovdb::Grid<nanovdb::NanoTree<BuildT>> *&out_grid, size_t &out_grid_size,
|
|
398
|
+
const void *points, size_t num_points, bool points_in_world_space,
|
|
399
|
+
const BuildGridParams<BuildT> ¶ms)
|
|
400
|
+
{
|
|
401
|
+
|
|
402
|
+
out_grid = nullptr;
|
|
403
|
+
out_grid_size = 0;
|
|
404
|
+
|
|
405
|
+
cudaStream_t stream = static_cast<cudaStream_t>(cuda_stream_get_current());
|
|
406
|
+
nanovdb::Map map(params.voxel_size, params.translation);
|
|
407
|
+
nanovdb::tools::cuda::PointsToGrid<BuildT, Allocator> p2g(map, stream);
|
|
408
|
+
|
|
409
|
+
// p2g.setVerbose(2);
|
|
410
|
+
p2g.setGridName(params.name);
|
|
411
|
+
p2g.setChecksum(nanovdb::CheckMode::Disable);
|
|
412
|
+
|
|
413
|
+
// Only compute bbox for OnIndex grids. Otherwise bbox will be computed after activating all leaf voxels
|
|
414
|
+
p2g.includeBBox(nanovdb::BuildTraits<BuildT>::is_onindex);
|
|
415
|
+
|
|
416
|
+
nanovdb::GridHandle<DeviceBuffer> grid_handle;
|
|
417
|
+
|
|
418
|
+
if (points_in_world_space)
|
|
419
|
+
{
|
|
420
|
+
grid_handle = p2g.getHandle(WorldSpacePointsPtr{static_cast<const nanovdb::Vec3f *>(points), map}, num_points,
|
|
421
|
+
DeviceBuffer());
|
|
422
|
+
}
|
|
423
|
+
else
|
|
424
|
+
{
|
|
425
|
+
grid_handle = p2g.getHandle(static_cast<const nanovdb::Coord *>(points), num_points, DeviceBuffer());
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
out_grid = grid_handle.deviceGrid<BuildT>();
|
|
429
|
+
out_grid_size = grid_handle.gridSize();
|
|
430
|
+
|
|
431
|
+
finalize_grid(*out_grid, params);
|
|
432
|
+
|
|
433
|
+
// So that buffer is not destroyed when handles goes out of scope
|
|
434
|
+
grid_handle.buffer().detachDeviceData();
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
template void build_grid_from_points(nanovdb::Grid<nanovdb::NanoTree<float>> *&, size_t &, const void *, size_t, bool,
|
|
438
|
+
const BuildGridParams<float> &);
|
|
439
|
+
template void build_grid_from_points(nanovdb::Grid<nanovdb::NanoTree<nanovdb::Vec3f>> *&, size_t &, const void *,
|
|
440
|
+
size_t, bool, const BuildGridParams<nanovdb::Vec3f> &);
|
|
441
|
+
template void build_grid_from_points(nanovdb::Grid<nanovdb::NanoTree<int32_t>> *&, size_t &, const void *, size_t, bool,
|
|
442
|
+
const BuildGridParams<int32_t> &);
|
|
443
|
+
template void build_grid_from_points(nanovdb::Grid<nanovdb::NanoTree<nanovdb::ValueIndex>> *&, size_t &, const void *,
|
|
444
|
+
size_t, bool, const BuildGridParams<nanovdb::ValueIndex> &);
|
|
445
|
+
template void build_grid_from_points(nanovdb::Grid<nanovdb::NanoTree<nanovdb::ValueOnIndex>> *&, size_t &, const void *,
|
|
446
|
+
size_t, bool, const BuildGridParams<nanovdb::ValueOnIndex> &);
|