warp-lang 1.0.1__py3-none-manylinux2014_x86_64.whl → 1.1.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.

Files changed (346) hide show
  1. warp/__init__.py +108 -97
  2. warp/__init__.pyi +1 -1
  3. warp/bin/warp-clang.so +0 -0
  4. warp/bin/warp.so +0 -0
  5. warp/build.py +115 -113
  6. warp/build_dll.py +383 -375
  7. warp/builtins.py +3425 -3354
  8. warp/codegen.py +2878 -2792
  9. warp/config.py +40 -36
  10. warp/constants.py +45 -45
  11. warp/context.py +5194 -5102
  12. warp/dlpack.py +442 -442
  13. warp/examples/__init__.py +16 -16
  14. warp/examples/assets/bear.usd +0 -0
  15. warp/examples/assets/bunny.usd +0 -0
  16. warp/examples/assets/cartpole.urdf +110 -110
  17. warp/examples/assets/crazyflie.usd +0 -0
  18. warp/examples/assets/cube.usd +0 -0
  19. warp/examples/assets/nv_ant.xml +92 -92
  20. warp/examples/assets/nv_humanoid.xml +183 -183
  21. warp/examples/assets/quadruped.urdf +267 -267
  22. warp/examples/assets/rocks.nvdb +0 -0
  23. warp/examples/assets/rocks.usd +0 -0
  24. warp/examples/assets/sphere.usd +0 -0
  25. warp/examples/benchmarks/benchmark_api.py +383 -383
  26. warp/examples/benchmarks/benchmark_cloth.py +278 -279
  27. warp/examples/benchmarks/benchmark_cloth_cupy.py +88 -88
  28. warp/examples/benchmarks/benchmark_cloth_jax.py +97 -100
  29. warp/examples/benchmarks/benchmark_cloth_numba.py +146 -142
  30. warp/examples/benchmarks/benchmark_cloth_numpy.py +77 -77
  31. warp/examples/benchmarks/benchmark_cloth_pytorch.py +86 -86
  32. warp/examples/benchmarks/benchmark_cloth_taichi.py +112 -112
  33. warp/examples/benchmarks/benchmark_cloth_warp.py +146 -146
  34. warp/examples/benchmarks/benchmark_launches.py +295 -295
  35. warp/examples/browse.py +29 -28
  36. warp/examples/core/example_dem.py +234 -221
  37. warp/examples/core/example_fluid.py +293 -267
  38. warp/examples/core/example_graph_capture.py +144 -129
  39. warp/examples/core/example_marching_cubes.py +188 -176
  40. warp/examples/core/example_mesh.py +174 -154
  41. warp/examples/core/example_mesh_intersect.py +205 -193
  42. warp/examples/core/example_nvdb.py +176 -169
  43. warp/examples/core/example_raycast.py +105 -89
  44. warp/examples/core/example_raymarch.py +199 -178
  45. warp/examples/core/example_render_opengl.py +185 -141
  46. warp/examples/core/example_sph.py +405 -389
  47. warp/examples/core/example_torch.py +222 -181
  48. warp/examples/core/example_wave.py +263 -249
  49. warp/examples/fem/bsr_utils.py +378 -380
  50. warp/examples/fem/example_apic_fluid.py +407 -391
  51. warp/examples/fem/example_convection_diffusion.py +182 -168
  52. warp/examples/fem/example_convection_diffusion_dg.py +219 -209
  53. warp/examples/fem/example_convection_diffusion_dg0.py +204 -194
  54. warp/examples/fem/example_deformed_geometry.py +177 -159
  55. warp/examples/fem/example_diffusion.py +201 -173
  56. warp/examples/fem/example_diffusion_3d.py +177 -152
  57. warp/examples/fem/example_diffusion_mgpu.py +221 -214
  58. warp/examples/fem/example_mixed_elasticity.py +244 -222
  59. warp/examples/fem/example_navier_stokes.py +259 -243
  60. warp/examples/fem/example_stokes.py +220 -192
  61. warp/examples/fem/example_stokes_transfer.py +265 -249
  62. warp/examples/fem/mesh_utils.py +133 -109
  63. warp/examples/fem/plot_utils.py +292 -287
  64. warp/examples/optim/example_bounce.py +260 -248
  65. warp/examples/optim/example_cloth_throw.py +222 -210
  66. warp/examples/optim/example_diffray.py +566 -535
  67. warp/examples/optim/example_drone.py +864 -835
  68. warp/examples/optim/example_inverse_kinematics.py +176 -169
  69. warp/examples/optim/example_inverse_kinematics_torch.py +185 -170
  70. warp/examples/optim/example_spring_cage.py +239 -234
  71. warp/examples/optim/example_trajectory.py +223 -201
  72. warp/examples/optim/example_walker.py +306 -292
  73. warp/examples/sim/example_cartpole.py +139 -128
  74. warp/examples/sim/example_cloth.py +196 -184
  75. warp/examples/sim/example_granular.py +124 -113
  76. warp/examples/sim/example_granular_collision_sdf.py +197 -185
  77. warp/examples/sim/example_jacobian_ik.py +236 -213
  78. warp/examples/sim/example_particle_chain.py +118 -106
  79. warp/examples/sim/example_quadruped.py +193 -179
  80. warp/examples/sim/example_rigid_chain.py +197 -189
  81. warp/examples/sim/example_rigid_contact.py +189 -176
  82. warp/examples/sim/example_rigid_force.py +127 -126
  83. warp/examples/sim/example_rigid_gyroscopic.py +109 -97
  84. warp/examples/sim/example_rigid_soft_contact.py +134 -124
  85. warp/examples/sim/example_soft_body.py +190 -178
  86. warp/fabric.py +337 -335
  87. warp/fem/__init__.py +60 -27
  88. warp/fem/cache.py +401 -388
  89. warp/fem/dirichlet.py +178 -179
  90. warp/fem/domain.py +262 -263
  91. warp/fem/field/__init__.py +100 -101
  92. warp/fem/field/field.py +148 -149
  93. warp/fem/field/nodal_field.py +298 -299
  94. warp/fem/field/restriction.py +22 -21
  95. warp/fem/field/test.py +180 -181
  96. warp/fem/field/trial.py +183 -183
  97. warp/fem/geometry/__init__.py +15 -19
  98. warp/fem/geometry/closest_point.py +69 -70
  99. warp/fem/geometry/deformed_geometry.py +270 -271
  100. warp/fem/geometry/element.py +744 -744
  101. warp/fem/geometry/geometry.py +184 -186
  102. warp/fem/geometry/grid_2d.py +380 -373
  103. warp/fem/geometry/grid_3d.py +441 -435
  104. warp/fem/geometry/hexmesh.py +953 -953
  105. warp/fem/geometry/partition.py +374 -376
  106. warp/fem/geometry/quadmesh_2d.py +532 -532
  107. warp/fem/geometry/tetmesh.py +840 -840
  108. warp/fem/geometry/trimesh_2d.py +577 -577
  109. warp/fem/integrate.py +1630 -1615
  110. warp/fem/operator.py +190 -191
  111. warp/fem/polynomial.py +214 -213
  112. warp/fem/quadrature/__init__.py +2 -2
  113. warp/fem/quadrature/pic_quadrature.py +243 -245
  114. warp/fem/quadrature/quadrature.py +295 -294
  115. warp/fem/space/__init__.py +294 -292
  116. warp/fem/space/basis_space.py +488 -489
  117. warp/fem/space/collocated_function_space.py +100 -105
  118. warp/fem/space/dof_mapper.py +236 -236
  119. warp/fem/space/function_space.py +148 -145
  120. warp/fem/space/grid_2d_function_space.py +267 -267
  121. warp/fem/space/grid_3d_function_space.py +305 -306
  122. warp/fem/space/hexmesh_function_space.py +350 -352
  123. warp/fem/space/partition.py +350 -350
  124. warp/fem/space/quadmesh_2d_function_space.py +368 -369
  125. warp/fem/space/restriction.py +158 -160
  126. warp/fem/space/shape/__init__.py +13 -15
  127. warp/fem/space/shape/cube_shape_function.py +738 -738
  128. warp/fem/space/shape/shape_function.py +102 -103
  129. warp/fem/space/shape/square_shape_function.py +611 -611
  130. warp/fem/space/shape/tet_shape_function.py +565 -567
  131. warp/fem/space/shape/triangle_shape_function.py +429 -429
  132. warp/fem/space/tetmesh_function_space.py +294 -292
  133. warp/fem/space/topology.py +297 -295
  134. warp/fem/space/trimesh_2d_function_space.py +223 -221
  135. warp/fem/types.py +77 -77
  136. warp/fem/utils.py +495 -495
  137. warp/jax.py +166 -141
  138. warp/jax_experimental.py +341 -339
  139. warp/native/array.h +1072 -1025
  140. warp/native/builtin.h +1560 -1560
  141. warp/native/bvh.cpp +398 -398
  142. warp/native/bvh.cu +525 -525
  143. warp/native/bvh.h +429 -429
  144. warp/native/clang/clang.cpp +495 -464
  145. warp/native/crt.cpp +31 -31
  146. warp/native/crt.h +334 -334
  147. warp/native/cuda_crt.h +1049 -1049
  148. warp/native/cuda_util.cpp +549 -540
  149. warp/native/cuda_util.h +288 -203
  150. warp/native/cutlass_gemm.cpp +34 -34
  151. warp/native/cutlass_gemm.cu +372 -372
  152. warp/native/error.cpp +66 -66
  153. warp/native/error.h +27 -27
  154. warp/native/fabric.h +228 -228
  155. warp/native/hashgrid.cpp +301 -278
  156. warp/native/hashgrid.cu +78 -77
  157. warp/native/hashgrid.h +227 -227
  158. warp/native/initializer_array.h +32 -32
  159. warp/native/intersect.h +1204 -1204
  160. warp/native/intersect_adj.h +365 -365
  161. warp/native/intersect_tri.h +322 -322
  162. warp/native/marching.cpp +2 -2
  163. warp/native/marching.cu +497 -497
  164. warp/native/marching.h +2 -2
  165. warp/native/mat.h +1498 -1498
  166. warp/native/matnn.h +333 -333
  167. warp/native/mesh.cpp +203 -203
  168. warp/native/mesh.cu +293 -293
  169. warp/native/mesh.h +1887 -1887
  170. warp/native/nanovdb/NanoVDB.h +4782 -4782
  171. warp/native/nanovdb/PNanoVDB.h +2553 -2553
  172. warp/native/nanovdb/PNanoVDBWrite.h +294 -294
  173. warp/native/noise.h +850 -850
  174. warp/native/quat.h +1084 -1084
  175. warp/native/rand.h +299 -299
  176. warp/native/range.h +108 -108
  177. warp/native/reduce.cpp +156 -156
  178. warp/native/reduce.cu +348 -348
  179. warp/native/runlength_encode.cpp +61 -61
  180. warp/native/runlength_encode.cu +46 -46
  181. warp/native/scan.cpp +30 -30
  182. warp/native/scan.cu +36 -36
  183. warp/native/scan.h +7 -7
  184. warp/native/solid_angle.h +442 -442
  185. warp/native/sort.cpp +94 -94
  186. warp/native/sort.cu +97 -97
  187. warp/native/sort.h +14 -14
  188. warp/native/sparse.cpp +337 -337
  189. warp/native/sparse.cu +544 -544
  190. warp/native/spatial.h +630 -630
  191. warp/native/svd.h +562 -562
  192. warp/native/temp_buffer.h +30 -30
  193. warp/native/vec.h +1132 -1132
  194. warp/native/volume.cpp +297 -297
  195. warp/native/volume.cu +32 -32
  196. warp/native/volume.h +538 -538
  197. warp/native/volume_builder.cu +425 -425
  198. warp/native/volume_builder.h +19 -19
  199. warp/native/warp.cpp +1057 -1052
  200. warp/native/warp.cu +2943 -2828
  201. warp/native/warp.h +313 -305
  202. warp/optim/__init__.py +9 -9
  203. warp/optim/adam.py +120 -120
  204. warp/optim/linear.py +1104 -939
  205. warp/optim/sgd.py +104 -92
  206. warp/render/__init__.py +10 -10
  207. warp/render/render_opengl.py +3217 -3204
  208. warp/render/render_usd.py +768 -749
  209. warp/render/utils.py +152 -150
  210. warp/sim/__init__.py +52 -59
  211. warp/sim/articulation.py +685 -685
  212. warp/sim/collide.py +1594 -1590
  213. warp/sim/import_mjcf.py +489 -481
  214. warp/sim/import_snu.py +220 -221
  215. warp/sim/import_urdf.py +536 -516
  216. warp/sim/import_usd.py +887 -881
  217. warp/sim/inertia.py +316 -317
  218. warp/sim/integrator.py +234 -233
  219. warp/sim/integrator_euler.py +1956 -1956
  220. warp/sim/integrator_featherstone.py +1910 -1991
  221. warp/sim/integrator_xpbd.py +3294 -3312
  222. warp/sim/model.py +4473 -4314
  223. warp/sim/particles.py +113 -112
  224. warp/sim/render.py +417 -403
  225. warp/sim/utils.py +413 -410
  226. warp/sparse.py +1227 -1227
  227. warp/stubs.py +2109 -2469
  228. warp/tape.py +1162 -225
  229. warp/tests/__init__.py +1 -1
  230. warp/tests/__main__.py +4 -4
  231. warp/tests/assets/torus.usda +105 -105
  232. warp/tests/aux_test_class_kernel.py +26 -26
  233. warp/tests/aux_test_compile_consts_dummy.py +10 -10
  234. warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -21
  235. warp/tests/aux_test_dependent.py +22 -22
  236. warp/tests/aux_test_grad_customs.py +23 -23
  237. warp/tests/aux_test_reference.py +11 -11
  238. warp/tests/aux_test_reference_reference.py +10 -10
  239. warp/tests/aux_test_square.py +17 -17
  240. warp/tests/aux_test_unresolved_func.py +14 -14
  241. warp/tests/aux_test_unresolved_symbol.py +14 -14
  242. warp/tests/disabled_kinematics.py +239 -239
  243. warp/tests/run_coverage_serial.py +31 -31
  244. warp/tests/test_adam.py +157 -157
  245. warp/tests/test_arithmetic.py +1124 -1124
  246. warp/tests/test_array.py +2417 -2326
  247. warp/tests/test_array_reduce.py +150 -150
  248. warp/tests/test_async.py +668 -656
  249. warp/tests/test_atomic.py +141 -141
  250. warp/tests/test_bool.py +204 -149
  251. warp/tests/test_builtins_resolution.py +1292 -1292
  252. warp/tests/test_bvh.py +164 -171
  253. warp/tests/test_closest_point_edge_edge.py +228 -228
  254. warp/tests/test_codegen.py +566 -553
  255. warp/tests/test_compile_consts.py +97 -101
  256. warp/tests/test_conditional.py +246 -246
  257. warp/tests/test_copy.py +232 -215
  258. warp/tests/test_ctypes.py +632 -632
  259. warp/tests/test_dense.py +67 -67
  260. warp/tests/test_devices.py +91 -98
  261. warp/tests/test_dlpack.py +530 -529
  262. warp/tests/test_examples.py +400 -378
  263. warp/tests/test_fabricarray.py +955 -955
  264. warp/tests/test_fast_math.py +62 -54
  265. warp/tests/test_fem.py +1277 -1278
  266. warp/tests/test_fp16.py +130 -130
  267. warp/tests/test_func.py +338 -337
  268. warp/tests/test_generics.py +571 -571
  269. warp/tests/test_grad.py +746 -640
  270. warp/tests/test_grad_customs.py +333 -336
  271. warp/tests/test_hash_grid.py +210 -164
  272. warp/tests/test_import.py +39 -39
  273. warp/tests/test_indexedarray.py +1134 -1134
  274. warp/tests/test_intersect.py +67 -67
  275. warp/tests/test_jax.py +307 -307
  276. warp/tests/test_large.py +167 -164
  277. warp/tests/test_launch.py +354 -354
  278. warp/tests/test_lerp.py +261 -261
  279. warp/tests/test_linear_solvers.py +191 -171
  280. warp/tests/test_lvalue.py +421 -493
  281. warp/tests/test_marching_cubes.py +65 -65
  282. warp/tests/test_mat.py +1801 -1827
  283. warp/tests/test_mat_lite.py +115 -115
  284. warp/tests/test_mat_scalar_ops.py +2907 -2889
  285. warp/tests/test_math.py +126 -193
  286. warp/tests/test_matmul.py +500 -499
  287. warp/tests/test_matmul_lite.py +410 -410
  288. warp/tests/test_mempool.py +188 -190
  289. warp/tests/test_mesh.py +284 -324
  290. warp/tests/test_mesh_query_aabb.py +228 -241
  291. warp/tests/test_mesh_query_point.py +692 -702
  292. warp/tests/test_mesh_query_ray.py +292 -303
  293. warp/tests/test_mlp.py +276 -276
  294. warp/tests/test_model.py +110 -110
  295. warp/tests/test_modules_lite.py +39 -39
  296. warp/tests/test_multigpu.py +163 -163
  297. warp/tests/test_noise.py +248 -248
  298. warp/tests/test_operators.py +250 -250
  299. warp/tests/test_options.py +123 -125
  300. warp/tests/test_peer.py +133 -137
  301. warp/tests/test_pinned.py +78 -78
  302. warp/tests/test_print.py +54 -54
  303. warp/tests/test_quat.py +2086 -2086
  304. warp/tests/test_rand.py +288 -288
  305. warp/tests/test_reload.py +217 -217
  306. warp/tests/test_rounding.py +179 -179
  307. warp/tests/test_runlength_encode.py +190 -190
  308. warp/tests/test_sim_grad.py +243 -0
  309. warp/tests/test_sim_kinematics.py +91 -97
  310. warp/tests/test_smoothstep.py +168 -168
  311. warp/tests/test_snippet.py +305 -266
  312. warp/tests/test_sparse.py +468 -460
  313. warp/tests/test_spatial.py +2148 -2148
  314. warp/tests/test_streams.py +486 -473
  315. warp/tests/test_struct.py +710 -675
  316. warp/tests/test_tape.py +173 -148
  317. warp/tests/test_torch.py +743 -743
  318. warp/tests/test_transient_module.py +87 -87
  319. warp/tests/test_types.py +556 -659
  320. warp/tests/test_utils.py +490 -499
  321. warp/tests/test_vec.py +1264 -1268
  322. warp/tests/test_vec_lite.py +73 -73
  323. warp/tests/test_vec_scalar_ops.py +2099 -2099
  324. warp/tests/test_verify_fp.py +94 -94
  325. warp/tests/test_volume.py +737 -736
  326. warp/tests/test_volume_write.py +255 -265
  327. warp/tests/unittest_serial.py +37 -37
  328. warp/tests/unittest_suites.py +363 -359
  329. warp/tests/unittest_utils.py +603 -578
  330. warp/tests/unused_test_misc.py +71 -71
  331. warp/tests/walkthrough_debug.py +85 -85
  332. warp/thirdparty/appdirs.py +598 -598
  333. warp/thirdparty/dlpack.py +143 -143
  334. warp/thirdparty/unittest_parallel.py +566 -561
  335. warp/torch.py +321 -295
  336. warp/types.py +4504 -4450
  337. warp/utils.py +1008 -821
  338. {warp_lang-1.0.1.dist-info → warp_lang-1.1.0.dist-info}/LICENSE.md +126 -126
  339. {warp_lang-1.0.1.dist-info → warp_lang-1.1.0.dist-info}/METADATA +338 -400
  340. warp_lang-1.1.0.dist-info/RECORD +352 -0
  341. warp/examples/assets/cube.usda +0 -42
  342. warp/examples/assets/sphere.usda +0 -56
  343. warp/examples/assets/torus.usda +0 -105
  344. warp_lang-1.0.1.dist-info/RECORD +0 -352
  345. {warp_lang-1.0.1.dist-info → warp_lang-1.1.0.dist-info}/WHEEL +0 -0
  346. {warp_lang-1.0.1.dist-info → warp_lang-1.1.0.dist-info}/top_level.txt +0 -0
@@ -1,2553 +1,2553 @@
1
-
2
- // Copyright Contributors to the OpenVDB Project
3
- // SPDX-License-Identifier: MPL-2.0
4
-
5
- /*!
6
- \file PNanoVDB.h
7
-
8
- \author Andrew Reidmeyer
9
-
10
- \brief This file is a portable (e.g. pointer-less) C99/GLSL/HLSL port
11
- of NanoVDB.h, which is compatible with most graphics APIs.
12
- */
13
-
14
- #ifndef NANOVDB_PNANOVDB_H_HAS_BEEN_INCLUDED
15
- #define NANOVDB_PNANOVDB_H_HAS_BEEN_INCLUDED
16
-
17
- // ------------------------------------------------ Configuration -----------------------------------------------------------
18
-
19
- // platforms
20
- //#define PNANOVDB_C
21
- //#define PNANOVDB_HLSL
22
- //#define PNANOVDB_GLSL
23
-
24
- // addressing mode
25
- // PNANOVDB_ADDRESS_32
26
- // PNANOVDB_ADDRESS_64
27
- #if defined(PNANOVDB_C)
28
- #ifndef PNANOVDB_ADDRESS_32
29
- #define PNANOVDB_ADDRESS_64
30
- #endif
31
- #elif defined(PNANOVDB_HLSL)
32
- #ifndef PNANOVDB_ADDRESS_64
33
- #define PNANOVDB_ADDRESS_32
34
- #endif
35
- #elif defined(PNANOVDB_GLSL)
36
- #ifndef PNANOVDB_ADDRESS_64
37
- #define PNANOVDB_ADDRESS_32
38
- #endif
39
- #endif
40
-
41
- // bounds checking
42
- //#define PNANOVDB_BUF_BOUNDS_CHECK
43
-
44
- // enable HDDA by default on HLSL/GLSL, make explicit on C
45
- #if defined(PNANOVDB_C)
46
- //#define PNANOVDB_HDDA
47
- #ifdef PNANOVDB_HDDA
48
- #ifndef PNANOVDB_CMATH
49
- #define PNANOVDB_CMATH
50
- #endif
51
- #endif
52
- #elif defined(PNANOVDB_HLSL)
53
- #define PNANOVDB_HDDA
54
- #elif defined(PNANOVDB_GLSL)
55
- #define PNANOVDB_HDDA
56
- #endif
57
-
58
- #ifdef PNANOVDB_CMATH
59
- #include <math.h>
60
- #endif
61
-
62
- // ------------------------------------------------ Buffer -----------------------------------------------------------
63
-
64
- #if defined(PNANOVDB_BUF_CUSTOM)
65
- // NOP
66
- #elif defined(PNANOVDB_C)
67
- #define PNANOVDB_BUF_C
68
- #elif defined(PNANOVDB_HLSL)
69
- #define PNANOVDB_BUF_HLSL
70
- #elif defined(PNANOVDB_GLSL)
71
- #define PNANOVDB_BUF_GLSL
72
- #endif
73
-
74
- #if defined(PNANOVDB_BUF_C)
75
- // #include <stdint.h>
76
- #if !defined(_STDINT) && !defined(__GNUC__)
77
- //typedef signed char int8_t;
78
- //typedef signed short int16_t;
79
- typedef signed int int32_t;
80
- typedef signed long long int64_t;
81
- //typedef signed char int_fast8_t;
82
- //typedef signed short int_fast16_t;
83
- //typedef signed int int_fast32_t;
84
- //typedef signed long long int_fast64_t;
85
- //typedef signed char int_least8_t;
86
- //typedef signed short int_least16_t;
87
- //typedef signed int int_least32_t;
88
- //typedef signed long long int_least64_t;
89
- //typedef signed long long intmax_t;
90
- //typedef signed long intptr_t;
91
- //typedef unsigned char uint8_t;
92
- //typedef unsigned short uint16_t;
93
- typedef unsigned int uint32_t;
94
- typedef unsigned long long uint64_t;
95
- //typedef unsigned char uint_fast8_t;
96
- //typedef unsigned short uint_fast16_t;
97
- //typedef unsigned int uint_fast32_t;
98
- //typedef unsigned long long uint_fast64_t;
99
- //typedef unsigned char uint_least8_t;
100
- //typedef unsigned short uint_least16_t;
101
- //typedef unsigned int uint_least32_t;
102
- //typedef unsigned long long uint_least64_t;
103
- //typedef unsigned long long uintmax_t;
104
- #endif
105
- #if defined(__CUDACC__)
106
- #define PNANOVDB_BUF_FORCE_INLINE __host__ __device__ static __forceinline__
107
- #elif defined(_WIN32)
108
- #define PNANOVDB_BUF_FORCE_INLINE static inline __forceinline
109
- #else
110
- #define PNANOVDB_BUF_FORCE_INLINE static inline __attribute__((always_inline))
111
- #endif
112
- typedef struct pnanovdb_buf_t
113
- {
114
- uint32_t* data;
115
- #ifdef PNANOVDB_BUF_BOUNDS_CHECK
116
- uint64_t size_in_words;
117
- #endif
118
- }pnanovdb_buf_t;
119
- PNANOVDB_BUF_FORCE_INLINE pnanovdb_buf_t pnanovdb_make_buf(uint32_t* data, uint64_t size_in_words)
120
- {
121
- pnanovdb_buf_t ret;
122
- ret.data = data;
123
- #ifdef PNANOVDB_BUF_BOUNDS_CHECK
124
- ret.size_in_words = size_in_words;
125
- #endif
126
- return ret;
127
- }
128
- #if defined(PNANOVDB_ADDRESS_32)
129
- PNANOVDB_BUF_FORCE_INLINE uint32_t pnanovdb_buf_read_uint32(pnanovdb_buf_t buf, uint32_t byte_offset)
130
- {
131
- uint32_t wordaddress = (byte_offset >> 2u);
132
- #ifdef PNANOVDB_BUF_BOUNDS_CHECK
133
- return wordaddress < buf.size_in_words ? buf.data[wordaddress] : 0u;
134
- #else
135
- return buf.data[wordaddress];
136
- #endif
137
- }
138
- PNANOVDB_BUF_FORCE_INLINE uint64_t pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint32_t byte_offset)
139
- {
140
- uint64_t* data64 = (uint64_t*)buf.data;
141
- uint32_t wordaddress64 = (byte_offset >> 3u);
142
- #ifdef PNANOVDB_BUF_BOUNDS_CHECK
143
- uint64_t size_in_words64 = buf.size_in_words >> 1u;
144
- return wordaddress64 < size_in_words64 ? data64[wordaddress64] : 0llu;
145
- #else
146
- return data64[wordaddress64];
147
- #endif
148
- }
149
- #elif defined(PNANOVDB_ADDRESS_64)
150
- PNANOVDB_BUF_FORCE_INLINE uint32_t pnanovdb_buf_read_uint32(pnanovdb_buf_t buf, uint64_t byte_offset)
151
- {
152
- uint64_t wordaddress = (byte_offset >> 2u);
153
- #ifdef PNANOVDB_BUF_BOUNDS_CHECK
154
- return wordaddress < buf.size_in_words ? buf.data[wordaddress] : 0u;
155
- #else
156
- return buf.data[wordaddress];
157
- #endif
158
- }
159
- PNANOVDB_BUF_FORCE_INLINE uint64_t pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint64_t byte_offset)
160
- {
161
- uint64_t* data64 = (uint64_t*)buf.data;
162
- uint64_t wordaddress64 = (byte_offset >> 3u);
163
- #ifdef PNANOVDB_BUF_BOUNDS_CHECK
164
- uint64_t size_in_words64 = buf.size_in_words >> 1u;
165
- return wordaddress64 < size_in_words64 ? data64[wordaddress64] : 0llu;
166
- #else
167
- return data64[wordaddress64];
168
- #endif
169
- }
170
- #endif
171
- typedef uint32_t pnanovdb_grid_type_t;
172
- #define PNANOVDB_GRID_TYPE_GET(grid_typeIn, nameIn) pnanovdb_grid_type_constants[grid_typeIn].nameIn
173
- #elif defined(PNANOVDB_BUF_HLSL)
174
- #if defined(PNANOVDB_ADDRESS_32)
175
- #define pnanovdb_buf_t StructuredBuffer<uint>
176
- uint pnanovdb_buf_read_uint32(pnanovdb_buf_t buf, uint byte_offset)
177
- {
178
- return buf[(byte_offset >> 2u)];
179
- }
180
- uint2 pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint byte_offset)
181
- {
182
- uint2 ret;
183
- ret.x = pnanovdb_buf_read_uint32(buf, byte_offset + 0u);
184
- ret.y = pnanovdb_buf_read_uint32(buf, byte_offset + 4u);
185
- return ret;
186
- }
187
- #elif defined(PNANOVDB_ADDRESS_64)
188
- #define pnanovdb_buf_t StructuredBuffer<uint>
189
- uint pnanovdb_buf_read_uint32(pnanovdb_buf_t buf, uint64_t byte_offset)
190
- {
191
- return buf[uint(byte_offset >> 2u)];
192
- }
193
- uint64_t pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint64_t byte_offset)
194
- {
195
- uint64_t ret;
196
- ret = pnanovdb_buf_read_uint32(buf, byte_offset + 0u);
197
- ret = ret + (uint64_t(pnanovdb_buf_read_uint32(buf, byte_offset + 4u)) << 32u);
198
- return ret;
199
- }
200
- #endif
201
- #define pnanovdb_grid_type_t uint
202
- #define PNANOVDB_GRID_TYPE_GET(grid_typeIn, nameIn) pnanovdb_grid_type_constants[grid_typeIn].nameIn
203
- #elif defined(PNANOVDB_BUF_GLSL)
204
- struct pnanovdb_buf_t
205
- {
206
- uint unused; // to satisfy min struct size?
207
- };
208
- uint pnanovdb_buf_read_uint32(pnanovdb_buf_t buf, uint byte_offset)
209
- {
210
- return pnanovdb_buf_data[(byte_offset >> 2u)];
211
- }
212
- uvec2 pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint byte_offset)
213
- {
214
- uvec2 ret;
215
- ret.x = pnanovdb_buf_read_uint32(buf, byte_offset + 0u);
216
- ret.y = pnanovdb_buf_read_uint32(buf, byte_offset + 4u);
217
- return ret;
218
- }
219
- #define pnanovdb_grid_type_t uint
220
- #define PNANOVDB_GRID_TYPE_GET(grid_typeIn, nameIn) pnanovdb_grid_type_constants[grid_typeIn].nameIn
221
- #endif
222
-
223
- // ------------------------------------------------ Basic Types -----------------------------------------------------------
224
-
225
- // force inline
226
- #if defined(PNANOVDB_C)
227
- #if defined(__CUDACC__)
228
- #define PNANOVDB_FORCE_INLINE __host__ __device__ static __forceinline__
229
- #elif defined(_WIN32)
230
- #define PNANOVDB_FORCE_INLINE static inline __forceinline
231
- #else
232
- #define PNANOVDB_FORCE_INLINE static inline __attribute__((always_inline))
233
- #endif
234
- #elif defined(PNANOVDB_HLSL)
235
- #define PNANOVDB_FORCE_INLINE
236
- #elif defined(PNANOVDB_GLSL)
237
- #define PNANOVDB_FORCE_INLINE
238
- #endif
239
-
240
- // struct typedef, static const, inout
241
- #if defined(PNANOVDB_C)
242
- #define PNANOVDB_STRUCT_TYPEDEF(X) typedef struct X X;
243
- #define PNANOVDB_STATIC_CONST static const
244
- #define PNANOVDB_INOUT(X) X*
245
- #define PNANOVDB_IN(X) const X*
246
- #define PNANOVDB_DEREF(X) (*X)
247
- #define PNANOVDB_REF(X) &X
248
- #elif defined(PNANOVDB_HLSL)
249
- #define PNANOVDB_STRUCT_TYPEDEF(X)
250
- #define PNANOVDB_STATIC_CONST static const
251
- #define PNANOVDB_INOUT(X) inout X
252
- #define PNANOVDB_IN(X) X
253
- #define PNANOVDB_DEREF(X) X
254
- #define PNANOVDB_REF(X) X
255
- #elif defined(PNANOVDB_GLSL)
256
- #define PNANOVDB_STRUCT_TYPEDEF(X)
257
- #define PNANOVDB_STATIC_CONST const
258
- #define PNANOVDB_INOUT(X) inout X
259
- #define PNANOVDB_IN(X) X
260
- #define PNANOVDB_DEREF(X) X
261
- #define PNANOVDB_REF(X) X
262
- #endif
263
-
264
- // basic types, type conversion
265
- #if defined(PNANOVDB_C)
266
- #define PNANOVDB_NATIVE_64
267
- // #include <stdint.h>
268
- #if !defined(PNANOVDB_MEMCPY_CUSTOM)
269
- #include <string.h>
270
- #define pnanovdb_memcpy memcpy
271
- #endif
272
- typedef uint32_t pnanovdb_uint32_t;
273
- typedef int32_t pnanovdb_int32_t;
274
- typedef int32_t pnanovdb_bool_t;
275
- #define PNANOVDB_FALSE 0
276
- #define PNANOVDB_TRUE 1
277
- typedef uint64_t pnanovdb_uint64_t;
278
- typedef int64_t pnanovdb_int64_t;
279
- typedef struct pnanovdb_coord_t
280
- {
281
- pnanovdb_int32_t x, y, z;
282
- }pnanovdb_coord_t;
283
- typedef struct pnanovdb_vec3_t
284
- {
285
- float x, y, z;
286
- }pnanovdb_vec3_t;
287
- PNANOVDB_FORCE_INLINE pnanovdb_int32_t pnanovdb_uint32_as_int32(pnanovdb_uint32_t v) { return (pnanovdb_int32_t)v; }
288
- PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_uint64_as_int64(pnanovdb_uint64_t v) { return (pnanovdb_int64_t)v; }
289
- PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_int64_as_uint64(pnanovdb_int64_t v) { return (pnanovdb_uint64_t)v; }
290
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_int32_as_uint32(pnanovdb_int32_t v) { return (pnanovdb_uint32_t)v; }
291
- // PNANOVDB_FORCE_INLINE float pnanovdb_uint32_as_float(pnanovdb_uint32_t v) { return *((float*)&v); }
292
- // PNANOVDB_FORCE_INLINE double pnanovdb_uint64_as_double(pnanovdb_uint64_t v) { return *((double*)&v); }
293
- PNANOVDB_FORCE_INLINE float pnanovdb_uint32_as_float(pnanovdb_uint32_t v) { float vf; pnanovdb_memcpy(&vf, &v, sizeof(vf)); return vf; }
294
- PNANOVDB_FORCE_INLINE double pnanovdb_uint64_as_double(pnanovdb_uint64_t v) { double vf; pnanovdb_memcpy(&vf, &v, sizeof(vf)); return vf; }
295
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_uint64_low(pnanovdb_uint64_t v) { return (pnanovdb_uint32_t)v; }
296
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_uint64_high(pnanovdb_uint64_t v) { return (pnanovdb_uint32_t)(v >> 32u); }
297
- PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint32_as_uint64(pnanovdb_uint32_t x, pnanovdb_uint32_t y) { return ((pnanovdb_uint64_t)x) | (((pnanovdb_uint64_t)y) << 32u); }
298
- PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint32_as_uint64_low(pnanovdb_uint32_t x) { return ((pnanovdb_uint64_t)x); }
299
- PNANOVDB_FORCE_INLINE pnanovdb_int32_t pnanovdb_uint64_is_equal(pnanovdb_uint64_t a, pnanovdb_uint64_t b) { return a == b; }
300
- PNANOVDB_FORCE_INLINE pnanovdb_int32_t pnanovdb_int64_is_zero(pnanovdb_int64_t a) { return a == 0; }
301
- #ifdef PNANOVDB_CMATH
302
- PNANOVDB_FORCE_INLINE float pnanovdb_floor(float v) { return floorf(v); }
303
- #endif
304
- PNANOVDB_FORCE_INLINE pnanovdb_int32_t pnanovdb_float_to_int32(float v) { return (pnanovdb_int32_t)v; }
305
- PNANOVDB_FORCE_INLINE float pnanovdb_int32_to_float(pnanovdb_int32_t v) { return (float)v; }
306
- PNANOVDB_FORCE_INLINE float pnanovdb_uint32_to_float(pnanovdb_uint32_t v) { return (float)v; }
307
- PNANOVDB_FORCE_INLINE float pnanovdb_min(float a, float b) { return a < b ? a : b; }
308
- PNANOVDB_FORCE_INLINE float pnanovdb_max(float a, float b) { return a > b ? a : b; }
309
- #elif defined(PNANOVDB_HLSL)
310
- typedef uint pnanovdb_uint32_t;
311
- typedef int pnanovdb_int32_t;
312
- typedef bool pnanovdb_bool_t;
313
- #define PNANOVDB_FALSE false
314
- #define PNANOVDB_TRUE true
315
- typedef int3 pnanovdb_coord_t;
316
- typedef float3 pnanovdb_vec3_t;
317
- pnanovdb_int32_t pnanovdb_uint32_as_int32(pnanovdb_uint32_t v) { return int(v); }
318
- pnanovdb_uint32_t pnanovdb_int32_as_uint32(pnanovdb_int32_t v) { return uint(v); }
319
- float pnanovdb_uint32_as_float(pnanovdb_uint32_t v) { return asfloat(v); }
320
- float pnanovdb_floor(float v) { return floor(v); }
321
- pnanovdb_int32_t pnanovdb_float_to_int32(float v) { return int(v); }
322
- float pnanovdb_int32_to_float(pnanovdb_int32_t v) { return float(v); }
323
- float pnanovdb_uint32_to_float(pnanovdb_uint32_t v) { return float(v); }
324
- float pnanovdb_min(float a, float b) { return min(a, b); }
325
- float pnanovdb_max(float a, float b) { return max(a, b); }
326
- #if defined(PNANOVDB_ADDRESS_32)
327
- typedef uint2 pnanovdb_uint64_t;
328
- typedef int2 pnanovdb_int64_t;
329
- pnanovdb_int64_t pnanovdb_uint64_as_int64(pnanovdb_uint64_t v) { return int2(v); }
330
- pnanovdb_uint64_t pnanovdb_int64_as_uint64(pnanovdb_int64_t v) { return uint2(v); }
331
- double pnanovdb_uint64_as_double(pnanovdb_uint64_t v) { return asdouble(v.x, v.y); }
332
- pnanovdb_uint32_t pnanovdb_uint64_low(pnanovdb_uint64_t v) { return v.x; }
333
- pnanovdb_uint32_t pnanovdb_uint64_high(pnanovdb_uint64_t v) { return v.y; }
334
- pnanovdb_uint64_t pnanovdb_uint32_as_uint64(pnanovdb_uint32_t x, pnanovdb_uint32_t y) { return uint2(x, y); }
335
- pnanovdb_uint64_t pnanovdb_uint32_as_uint64_low(pnanovdb_uint32_t x) { return uint2(x, 0); }
336
- bool pnanovdb_uint64_is_equal(pnanovdb_uint64_t a, pnanovdb_uint64_t b) { return (a.x == b.x) && (a.y == b.y); }
337
- bool pnanovdb_int64_is_zero(pnanovdb_int64_t a) { return a.x == 0 && a.y == 0; }
338
- #else
339
- typedef uint64_t pnanovdb_uint64_t;
340
- typedef int64_t pnanovdb_int64_t;
341
- pnanovdb_int64_t pnanovdb_uint64_as_int64(pnanovdb_uint64_t v) { return int64_t(v); }
342
- pnanovdb_uint64_t pnanovdb_int64_as_uint64(pnanovdb_int64_t v) { return uint64_t(v); }
343
- double pnanovdb_uint64_as_double(pnanovdb_uint64_t v) { return asdouble(uint(v), uint(v >> 32u)); }
344
- pnanovdb_uint32_t pnanovdb_uint64_low(pnanovdb_uint64_t v) { return uint(v); }
345
- pnanovdb_uint32_t pnanovdb_uint64_high(pnanovdb_uint64_t v) { return uint(v >> 32u); }
346
- pnanovdb_uint64_t pnanovdb_uint32_as_uint64(pnanovdb_uint32_t x, pnanovdb_uint32_t y) { return uint64_t(x) + (uint64_t(y) << 32u); }
347
- pnanovdb_uint64_t pnanovdb_uint32_as_uint64_low(pnanovdb_uint32_t x) { return uint64_t(x); }
348
- bool pnanovdb_uint64_is_equal(pnanovdb_uint64_t a, pnanovdb_uint64_t b) { return a == b; }
349
- bool pnanovdb_int64_is_zero(pnanovdb_int64_t a) { return a == 0; }
350
- #endif
351
- #elif defined(PNANOVDB_GLSL)
352
- #define pnanovdb_uint32_t uint
353
- #define pnanovdb_int32_t int
354
- #define pnanovdb_bool_t bool
355
- #define PNANOVDB_FALSE false
356
- #define PNANOVDB_TRUE true
357
- #define pnanovdb_uint64_t uvec2
358
- #define pnanovdb_int64_t ivec2
359
- #define pnanovdb_coord_t ivec3
360
- #define pnanovdb_vec3_t vec3
361
- pnanovdb_int32_t pnanovdb_uint32_as_int32(pnanovdb_uint32_t v) { return int(v); }
362
- pnanovdb_int64_t pnanovdb_uint64_as_int64(pnanovdb_uint64_t v) { return ivec2(v); }
363
- pnanovdb_uint64_t pnanovdb_int64_as_uint64(pnanovdb_int64_t v) { return uvec2(v); }
364
- pnanovdb_uint32_t pnanovdb_int32_as_uint32(pnanovdb_int32_t v) { return uint(v); }
365
- float pnanovdb_uint32_as_float(pnanovdb_uint32_t v) { return uintBitsToFloat(v); }
366
- double pnanovdb_uint64_as_double(pnanovdb_uint64_t v) { return packDouble2x32(uvec2(v.x, v.y)); }
367
- pnanovdb_uint32_t pnanovdb_uint64_low(pnanovdb_uint64_t v) { return v.x; }
368
- pnanovdb_uint32_t pnanovdb_uint64_high(pnanovdb_uint64_t v) { return v.y; }
369
- pnanovdb_uint64_t pnanovdb_uint32_as_uint64(pnanovdb_uint32_t x, pnanovdb_uint32_t y) { return uvec2(x, y); }
370
- pnanovdb_uint64_t pnanovdb_uint32_as_uint64_low(pnanovdb_uint32_t x) { return uvec2(x, 0); }
371
- bool pnanovdb_uint64_is_equal(pnanovdb_uint64_t a, pnanovdb_uint64_t b) { return (a.x == b.x) && (a.y == b.y); }
372
- bool pnanovdb_int64_is_zero(pnanovdb_int64_t a) { return a.x == 0 && a.y == 0; }
373
- float pnanovdb_floor(float v) { return floor(v); }
374
- pnanovdb_int32_t pnanovdb_float_to_int32(float v) { return int(v); }
375
- float pnanovdb_int32_to_float(pnanovdb_int32_t v) { return float(v); }
376
- float pnanovdb_uint32_to_float(pnanovdb_uint32_t v) { return float(v); }
377
- float pnanovdb_min(float a, float b) { return min(a, b); }
378
- float pnanovdb_max(float a, float b) { return max(a, b); }
379
- #endif
380
-
381
- // ------------------------------------------------ Coord/Vec3 Utilties -----------------------------------------------------------
382
-
383
- #if defined(PNANOVDB_C)
384
- PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_uniform(float a)
385
- {
386
- pnanovdb_vec3_t v;
387
- v.x = a;
388
- v.y = a;
389
- v.z = a;
390
- return v;
391
- }
392
- PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_add(const pnanovdb_vec3_t a, const pnanovdb_vec3_t b)
393
- {
394
- pnanovdb_vec3_t v;
395
- v.x = a.x + b.x;
396
- v.y = a.y + b.y;
397
- v.z = a.z + b.z;
398
- return v;
399
- }
400
- PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_sub(const pnanovdb_vec3_t a, const pnanovdb_vec3_t b)
401
- {
402
- pnanovdb_vec3_t v;
403
- v.x = a.x - b.x;
404
- v.y = a.y - b.y;
405
- v.z = a.z - b.z;
406
- return v;
407
- }
408
- PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_mul(const pnanovdb_vec3_t a, const pnanovdb_vec3_t b)
409
- {
410
- pnanovdb_vec3_t v;
411
- v.x = a.x * b.x;
412
- v.y = a.y * b.y;
413
- v.z = a.z * b.z;
414
- return v;
415
- }
416
- PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_div(const pnanovdb_vec3_t a, const pnanovdb_vec3_t b)
417
- {
418
- pnanovdb_vec3_t v;
419
- v.x = a.x / b.x;
420
- v.y = a.y / b.y;
421
- v.z = a.z / b.z;
422
- return v;
423
- }
424
- PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_min(const pnanovdb_vec3_t a, const pnanovdb_vec3_t b)
425
- {
426
- pnanovdb_vec3_t v;
427
- v.x = a.x < b.x ? a.x : b.x;
428
- v.y = a.y < b.y ? a.y : b.y;
429
- v.z = a.z < b.z ? a.z : b.z;
430
- return v;
431
- }
432
- PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_max(const pnanovdb_vec3_t a, const pnanovdb_vec3_t b)
433
- {
434
- pnanovdb_vec3_t v;
435
- v.x = a.x > b.x ? a.x : b.x;
436
- v.y = a.y > b.y ? a.y : b.y;
437
- v.z = a.z > b.z ? a.z : b.z;
438
- return v;
439
- }
440
- PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_vec3_round_to_coord(const pnanovdb_vec3_t a)
441
- {
442
- pnanovdb_coord_t v;
443
- v.x = pnanovdb_float_to_int32(roundf(a.x));
444
- v.y = pnanovdb_float_to_int32(roundf(a.y));
445
- v.z = pnanovdb_float_to_int32(roundf(a.z));
446
- return v;
447
- }
448
- PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_coord_to_vec3(const pnanovdb_coord_t coord)
449
- {
450
- pnanovdb_vec3_t v;
451
- v.x = pnanovdb_int32_to_float(coord.x);
452
- v.y = pnanovdb_int32_to_float(coord.y);
453
- v.z = pnanovdb_int32_to_float(coord.z);
454
- return v;
455
- }
456
- PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_coord_uniform(const pnanovdb_int32_t a)
457
- {
458
- pnanovdb_coord_t v;
459
- v.x = a;
460
- v.y = a;
461
- v.z = a;
462
- return v;
463
- }
464
- PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_coord_add(pnanovdb_coord_t a, pnanovdb_coord_t b)
465
- {
466
- pnanovdb_coord_t v;
467
- v.x = a.x + b.x;
468
- v.y = a.y + b.y;
469
- v.z = a.z + b.z;
470
- return v;
471
- }
472
- #elif defined(PNANOVDB_HLSL)
473
- pnanovdb_vec3_t pnanovdb_vec3_uniform(float a) { return float3(a, a, a); }
474
- pnanovdb_vec3_t pnanovdb_vec3_add(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a + b; }
475
- pnanovdb_vec3_t pnanovdb_vec3_sub(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a - b; }
476
- pnanovdb_vec3_t pnanovdb_vec3_mul(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a * b; }
477
- pnanovdb_vec3_t pnanovdb_vec3_div(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a / b; }
478
- pnanovdb_vec3_t pnanovdb_vec3_min(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return min(a, b); }
479
- pnanovdb_vec3_t pnanovdb_vec3_max(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return max(a, b); }
480
- pnanovdb_vec3_t pnanovdb_coord_to_vec3(pnanovdb_coord_t coord) { return float3(coord); }
481
- pnanovdb_coord_t pnanovdb_coord_uniform(pnanovdb_int32_t a) { return int3(a, a, a); }
482
- pnanovdb_coord_t pnanovdb_coord_add(pnanovdb_coord_t a, pnanovdb_coord_t b) { return a + b; }
483
- #elif defined(PNANOVDB_GLSL)
484
- pnanovdb_vec3_t pnanovdb_vec3_uniform(float a) { return vec3(a, a, a); }
485
- pnanovdb_vec3_t pnanovdb_vec3_add(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a + b; }
486
- pnanovdb_vec3_t pnanovdb_vec3_sub(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a - b; }
487
- pnanovdb_vec3_t pnanovdb_vec3_mul(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a * b; }
488
- pnanovdb_vec3_t pnanovdb_vec3_div(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a / b; }
489
- pnanovdb_vec3_t pnanovdb_vec3_min(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return min(a, b); }
490
- pnanovdb_vec3_t pnanovdb_vec3_max(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return max(a, b); }
491
- pnanovdb_vec3_t pnanovdb_coord_to_vec3(const pnanovdb_coord_t coord) { return vec3(coord); }
492
- pnanovdb_coord_t pnanovdb_coord_uniform(pnanovdb_int32_t a) { return ivec3(a, a, a); }
493
- pnanovdb_coord_t pnanovdb_coord_add(pnanovdb_coord_t a, pnanovdb_coord_t b) { return a + b; }
494
- #endif
495
-
496
- // ------------------------------------------------ Address Type -----------------------------------------------------------
497
-
498
- #if defined(PNANOVDB_ADDRESS_32)
499
- struct pnanovdb_address_t
500
- {
501
- pnanovdb_uint32_t byte_offset;
502
- };
503
- PNANOVDB_STRUCT_TYPEDEF(pnanovdb_address_t)
504
-
505
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset(pnanovdb_address_t address, pnanovdb_uint32_t byte_offset)
506
- {
507
- pnanovdb_address_t ret = address;
508
- ret.byte_offset += byte_offset;
509
- return ret;
510
- }
511
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset_neg(pnanovdb_address_t address, pnanovdb_uint32_t byte_offset)
512
- {
513
- pnanovdb_address_t ret = address;
514
- ret.byte_offset -= byte_offset;
515
- return ret;
516
- }
517
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset_product(pnanovdb_address_t address, pnanovdb_uint32_t byte_offset, pnanovdb_uint32_t multiplier)
518
- {
519
- pnanovdb_address_t ret = address;
520
- ret.byte_offset += byte_offset * multiplier;
521
- return ret;
522
- }
523
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset64(pnanovdb_address_t address, pnanovdb_uint64_t byte_offset)
524
- {
525
- pnanovdb_address_t ret = address;
526
- // lose high bits on 32-bit
527
- ret.byte_offset += pnanovdb_uint64_low(byte_offset);
528
- return ret;
529
- }
530
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_address_mask(pnanovdb_address_t address, pnanovdb_uint32_t mask)
531
- {
532
- return address.byte_offset & mask;
533
- }
534
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_mask_inv(pnanovdb_address_t address, pnanovdb_uint32_t mask)
535
- {
536
- pnanovdb_address_t ret = address;
537
- ret.byte_offset &= (~mask);
538
- return ret;
539
- }
540
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_null()
541
- {
542
- pnanovdb_address_t ret = { 0 };
543
- return ret;
544
- }
545
- PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_address_is_null(pnanovdb_address_t address)
546
- {
547
- return address.byte_offset == 0u;
548
- }
549
- PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_address_in_interval(pnanovdb_address_t address, pnanovdb_address_t min_address, pnanovdb_address_t max_address)
550
- {
551
- return address.byte_offset >= min_address.byte_offset && address.byte_offset < max_address.byte_offset;
552
- }
553
- #elif defined(PNANOVDB_ADDRESS_64)
554
- struct pnanovdb_address_t
555
- {
556
- pnanovdb_uint64_t byte_offset;
557
- };
558
- PNANOVDB_STRUCT_TYPEDEF(pnanovdb_address_t)
559
-
560
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset(pnanovdb_address_t address, pnanovdb_uint32_t byte_offset)
561
- {
562
- pnanovdb_address_t ret = address;
563
- ret.byte_offset += byte_offset;
564
- return ret;
565
- }
566
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset_neg(pnanovdb_address_t address, pnanovdb_uint32_t byte_offset)
567
- {
568
- pnanovdb_address_t ret = address;
569
- ret.byte_offset -= byte_offset;
570
- return ret;
571
- }
572
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset_product(pnanovdb_address_t address, pnanovdb_uint32_t byte_offset, pnanovdb_uint32_t multiplier)
573
- {
574
- pnanovdb_address_t ret = address;
575
- ret.byte_offset += pnanovdb_uint32_as_uint64_low(byte_offset) * pnanovdb_uint32_as_uint64_low(multiplier);
576
- return ret;
577
- }
578
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset64(pnanovdb_address_t address, pnanovdb_uint64_t byte_offset)
579
- {
580
- pnanovdb_address_t ret = address;
581
- ret.byte_offset += byte_offset;
582
- return ret;
583
- }
584
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_address_mask(pnanovdb_address_t address, pnanovdb_uint32_t mask)
585
- {
586
- return pnanovdb_uint64_low(address.byte_offset) & mask;
587
- }
588
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_mask_inv(pnanovdb_address_t address, pnanovdb_uint32_t mask)
589
- {
590
- pnanovdb_address_t ret = address;
591
- ret.byte_offset &= (~pnanovdb_uint32_as_uint64_low(mask));
592
- return ret;
593
- }
594
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_null()
595
- {
596
- pnanovdb_address_t ret = { 0 };
597
- return ret;
598
- }
599
- PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_address_is_null(pnanovdb_address_t address)
600
- {
601
- return address.byte_offset == 0llu;
602
- }
603
- PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_address_in_interval(pnanovdb_address_t address, pnanovdb_address_t min_address, pnanovdb_address_t max_address)
604
- {
605
- return address.byte_offset >= min_address.byte_offset && address.byte_offset < max_address.byte_offset;
606
- }
607
- #endif
608
-
609
- // ------------------------------------------------ High Level Buffer Read -----------------------------------------------------------
610
-
611
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_read_uint32(pnanovdb_buf_t buf, pnanovdb_address_t address)
612
- {
613
- return pnanovdb_buf_read_uint32(buf, address.byte_offset);
614
- }
615
- PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_read_uint64(pnanovdb_buf_t buf, pnanovdb_address_t address)
616
- {
617
- return pnanovdb_buf_read_uint64(buf, address.byte_offset);
618
- }
619
- PNANOVDB_FORCE_INLINE pnanovdb_int32_t pnanovdb_read_int32(pnanovdb_buf_t buf, pnanovdb_address_t address)
620
- {
621
- return pnanovdb_uint32_as_int32(pnanovdb_read_uint32(buf, address));
622
- }
623
- PNANOVDB_FORCE_INLINE float pnanovdb_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address)
624
- {
625
- return pnanovdb_uint32_as_float(pnanovdb_read_uint32(buf, address));
626
- }
627
- PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_read_int64(pnanovdb_buf_t buf, pnanovdb_address_t address)
628
- {
629
- return pnanovdb_uint64_as_int64(pnanovdb_read_uint64(buf, address));
630
- }
631
- PNANOVDB_FORCE_INLINE double pnanovdb_read_double(pnanovdb_buf_t buf, pnanovdb_address_t address)
632
- {
633
- return pnanovdb_uint64_as_double(pnanovdb_read_uint64(buf, address));
634
- }
635
- PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_read_coord(pnanovdb_buf_t buf, pnanovdb_address_t address)
636
- {
637
- pnanovdb_coord_t ret;
638
- ret.x = pnanovdb_uint32_as_int32(pnanovdb_read_uint32(buf, pnanovdb_address_offset(address, 0u)));
639
- ret.y = pnanovdb_uint32_as_int32(pnanovdb_read_uint32(buf, pnanovdb_address_offset(address, 4u)));
640
- ret.z = pnanovdb_uint32_as_int32(pnanovdb_read_uint32(buf, pnanovdb_address_offset(address, 8u)));
641
- return ret;
642
- }
643
- PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_read_vec3f(pnanovdb_buf_t buf, pnanovdb_address_t address)
644
- {
645
- pnanovdb_vec3_t ret;
646
- ret.x = pnanovdb_uint32_as_float(pnanovdb_read_uint32(buf, pnanovdb_address_offset(address, 0u)));
647
- ret.y = pnanovdb_uint32_as_float(pnanovdb_read_uint32(buf, pnanovdb_address_offset(address, 4u)));
648
- ret.z = pnanovdb_uint32_as_float(pnanovdb_read_uint32(buf, pnanovdb_address_offset(address, 8u)));
649
- return ret;
650
- }
651
-
652
- PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_read_bit(pnanovdb_buf_t buf, pnanovdb_address_t address, pnanovdb_uint32_t bit_offset)
653
- {
654
- pnanovdb_address_t word_address = pnanovdb_address_mask_inv(address, 3u);
655
- pnanovdb_uint32_t bit_index = (pnanovdb_address_mask(address, 3u) << 3u) + bit_offset;
656
- pnanovdb_uint32_t value_word = pnanovdb_buf_read_uint32(buf, word_address.byte_offset);
657
- return ((value_word >> bit_index) & 1) != 0u;
658
- }
659
-
660
- #if defined(PNANOVDB_C)
661
- PNANOVDB_FORCE_INLINE short pnanovdb_read_half(pnanovdb_buf_t buf, pnanovdb_address_t address)
662
- {
663
- pnanovdb_uint32_t raw = pnanovdb_read_uint32(buf, address);
664
- return (short)(raw >> (pnanovdb_address_mask(address, 2) << 3));
665
- }
666
- #elif defined(PNANOVDB_HLSL)
667
- PNANOVDB_FORCE_INLINE float pnanovdb_read_half(pnanovdb_buf_t buf, pnanovdb_address_t address)
668
- {
669
- pnanovdb_uint32_t raw = pnanovdb_read_uint32(buf, address);
670
- return f16tof32(raw >> (pnanovdb_address_mask(address, 2) << 3));
671
- }
672
- #elif defined(PNANOVDB_GLSL)
673
- PNANOVDB_FORCE_INLINE float pnanovdb_read_half(pnanovdb_buf_t buf, pnanovdb_address_t address)
674
- {
675
- pnanovdb_uint32_t raw = pnanovdb_read_uint32(buf, address);
676
- return unpackHalf2x16(raw >> (pnanovdb_address_mask(address, 2) << 3)).x;
677
- }
678
- #endif
679
-
680
- // ------------------------------------------------ Core Structures -----------------------------------------------------------
681
-
682
- #define PNANOVDB_MAGIC_NUMBER 0x304244566f6e614eUL// "NanoVDB0" in hex - little endian (uint64_t)
683
-
684
- #define PNANOVDB_MAJOR_VERSION_NUMBER 32// reflects changes to the ABI
685
- #define PNANOVDB_MINOR_VERSION_NUMBER 3// reflects changes to the API but not ABI
686
- #define PNANOVDB_PATCH_VERSION_NUMBER 3// reflects bug-fixes with no ABI or API changes
687
-
688
- #define PNANOVDB_GRID_TYPE_UNKNOWN 0
689
- #define PNANOVDB_GRID_TYPE_FLOAT 1
690
- #define PNANOVDB_GRID_TYPE_DOUBLE 2
691
- #define PNANOVDB_GRID_TYPE_INT16 3
692
- #define PNANOVDB_GRID_TYPE_INT32 4
693
- #define PNANOVDB_GRID_TYPE_INT64 5
694
- #define PNANOVDB_GRID_TYPE_VEC3F 6
695
- #define PNANOVDB_GRID_TYPE_VEC3D 7
696
- #define PNANOVDB_GRID_TYPE_MASK 8
697
- #define PNANOVDB_GRID_TYPE_HALF 9
698
- #define PNANOVDB_GRID_TYPE_UINT32 10
699
- #define PNANOVDB_GRID_TYPE_BOOLEAN 11
700
- #define PNANOVDB_GRID_TYPE_RGBA8 12
701
- #define PNANOVDB_GRID_TYPE_FP4 13
702
- #define PNANOVDB_GRID_TYPE_FP8 14
703
- #define PNANOVDB_GRID_TYPE_FP16 15
704
- #define PNANOVDB_GRID_TYPE_FPN 16
705
- #define PNANOVDB_GRID_TYPE_VEC4F 17
706
- #define PNANOVDB_GRID_TYPE_VEC4D 18
707
- #define PNANOVDB_GRID_TYPE_END 19
708
-
709
- #define PNANOVDB_GRID_CLASS_UNKNOWN 0
710
- #define PNANOVDB_GRID_CLASS_LEVEL_SET 1 // narrow band levelset, e.g. SDF
711
- #define PNANOVDB_GRID_CLASS_FOG_VOLUME 2 // fog volume, e.g. density
712
- #define PNANOVDB_GRID_CLASS_STAGGERED 3 // staggered MAC grid, e.g. velocity
713
- #define PNANOVDB_GRID_CLASS_POINT_INDEX 4 // point index grid
714
- #define PNANOVDB_GRID_CLASS_POINT_DATA 5 // point data grid
715
- #define PNANOVDB_GRID_CLASS_TOPOLOGY 6 // grid with active states only (no values)
716
- #define PNANOVDB_GRID_CLASS_VOXEL_VOLUME 7 // volume of geometric cubes, e.g. minecraft
717
- #define PNANOVDB_GRID_CLASS_END 8
718
-
719
- #define PNANOVDB_GRID_FLAGS_HAS_LONG_GRID_NAME (1 << 0)
720
- #define PNANOVDB_GRID_FLAGS_HAS_BBOX (1 << 1)
721
- #define PNANOVDB_GRID_FLAGS_HAS_MIN_MAX (1 << 2)
722
- #define PNANOVDB_GRID_FLAGS_HAS_AVERAGE (1 << 3)
723
- #define PNANOVDB_GRID_FLAGS_HAS_STD_DEVIATION (1 << 4)
724
- #define PNANOVDB_GRID_FLAGS_IS_BREADTH_FIRST (1 << 5)
725
- #define PNANOVDB_GRID_FLAGS_END (1 << 6)
726
-
727
- #define PNANOVDB_LEAF_TYPE_DEFAULT 0
728
- #define PNANOVDB_LEAF_TYPE_LITE 1
729
- #define PNANOVDB_LEAF_TYPE_FP 2
730
-
731
- PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_value_strides_bits[PNANOVDB_GRID_TYPE_END] = { 0, 32, 64, 16, 32, 64, 96, 192, 0, 16, 32, 1, 32, 4, 8, 16, 0, 128, 256 };
732
- PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_table_strides_bits[PNANOVDB_GRID_TYPE_END] = { 64, 64, 64, 64, 64, 64, 128, 192, 64, 64, 64, 64, 64, 64, 64, 64, 64, 128, 256 };
733
- PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_minmax_strides_bits[PNANOVDB_GRID_TYPE_END] = { 0, 32, 64, 16, 32, 64, 96, 192, 8, 16, 32, 8, 32, 32, 32, 32, 32, 128, 256 };
734
- PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_minmax_aligns_bits[PNANOVDB_GRID_TYPE_END] = { 0, 32, 64, 16, 32, 64, 32, 64, 8, 16, 32, 8, 32, 32, 32, 32, 32, 32, 64 };
735
- PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_stat_strides_bits[PNANOVDB_GRID_TYPE_END] = { 0, 32, 64, 32, 32, 64, 32, 64, 8, 32, 32, 8, 32, 32, 32, 32, 32, 32, 64 };
736
- PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_leaf_type[PNANOVDB_GRID_TYPE_END] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 2, 2, 2, 2, 0, 0 };
737
-
738
- struct pnanovdb_map_t
739
- {
740
- float matf[9];
741
- float invmatf[9];
742
- float vecf[3];
743
- float taperf;
744
- double matd[9];
745
- double invmatd[9];
746
- double vecd[3];
747
- double taperd;
748
- };
749
- PNANOVDB_STRUCT_TYPEDEF(pnanovdb_map_t)
750
- struct pnanovdb_map_handle_t { pnanovdb_address_t address; };
751
- PNANOVDB_STRUCT_TYPEDEF(pnanovdb_map_handle_t)
752
-
753
- #define PNANOVDB_MAP_SIZE 264
754
-
755
- #define PNANOVDB_MAP_OFF_MATF 0
756
- #define PNANOVDB_MAP_OFF_INVMATF 36
757
- #define PNANOVDB_MAP_OFF_VECF 72
758
- #define PNANOVDB_MAP_OFF_TAPERF 84
759
- #define PNANOVDB_MAP_OFF_MATD 88
760
- #define PNANOVDB_MAP_OFF_INVMATD 160
761
- #define PNANOVDB_MAP_OFF_VECD 232
762
- #define PNANOVDB_MAP_OFF_TAPERD 256
763
-
764
- PNANOVDB_FORCE_INLINE float pnanovdb_map_get_matf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index) {
765
- return pnanovdb_read_float(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_MATF + 4u * index));
766
- }
767
- PNANOVDB_FORCE_INLINE float pnanovdb_map_get_invmatf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index) {
768
- return pnanovdb_read_float(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_INVMATF + 4u * index));
769
- }
770
- PNANOVDB_FORCE_INLINE float pnanovdb_map_get_vecf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index) {
771
- return pnanovdb_read_float(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_VECF + 4u * index));
772
- }
773
- PNANOVDB_FORCE_INLINE float pnanovdb_map_get_taperf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index) {
774
- return pnanovdb_read_float(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_TAPERF));
775
- }
776
- PNANOVDB_FORCE_INLINE double pnanovdb_map_get_matd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index) {
777
- return pnanovdb_read_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_MATD + 8u * index));
778
- }
779
- PNANOVDB_FORCE_INLINE double pnanovdb_map_get_invmatd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index) {
780
- return pnanovdb_read_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_INVMATD + 8u * index));
781
- }
782
- PNANOVDB_FORCE_INLINE double pnanovdb_map_get_vecd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index) {
783
- return pnanovdb_read_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_VECD + 8u * index));
784
- }
785
- PNANOVDB_FORCE_INLINE double pnanovdb_map_get_taperd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index) {
786
- return pnanovdb_read_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_TAPERD));
787
- }
788
-
789
- struct pnanovdb_grid_t
790
- {
791
- pnanovdb_uint64_t magic; // 8 bytes, 0
792
- pnanovdb_uint64_t checksum; // 8 bytes, 8
793
- pnanovdb_uint32_t version; // 4 bytes, 16
794
- pnanovdb_uint32_t flags; // 4 bytes, 20
795
- pnanovdb_uint32_t grid_index; // 4 bytes, 24
796
- pnanovdb_uint32_t grid_count; // 4 bytes, 28
797
- pnanovdb_uint64_t grid_size; // 8 bytes, 32
798
- pnanovdb_uint32_t grid_name[256 / 4]; // 256 bytes, 40
799
- pnanovdb_map_t map; // 264 bytes, 296
800
- double world_bbox[6]; // 48 bytes, 560
801
- double voxel_size[3]; // 24 bytes, 608
802
- pnanovdb_uint32_t grid_class; // 4 bytes, 632
803
- pnanovdb_uint32_t grid_type; // 4 bytes, 636
804
- pnanovdb_int64_t blind_metadata_offset; // 8 bytes, 640
805
- pnanovdb_uint32_t blind_metadata_count; // 4 bytes, 648
806
- pnanovdb_uint32_t pad[5]; // 20 bytes, 652
807
- };
808
- PNANOVDB_STRUCT_TYPEDEF(pnanovdb_grid_t)
809
- struct pnanovdb_grid_handle_t { pnanovdb_address_t address; };
810
- PNANOVDB_STRUCT_TYPEDEF(pnanovdb_grid_handle_t)
811
-
812
- #define PNANOVDB_GRID_SIZE 672
813
-
814
- #define PNANOVDB_GRID_OFF_MAGIC 0
815
- #define PNANOVDB_GRID_OFF_CHECKSUM 8
816
- #define PNANOVDB_GRID_OFF_VERSION 16
817
- #define PNANOVDB_GRID_OFF_FLAGS 20
818
- #define PNANOVDB_GRID_OFF_GRID_INDEX 24
819
- #define PNANOVDB_GRID_OFF_GRID_COUNT 28
820
- #define PNANOVDB_GRID_OFF_GRID_SIZE 32
821
- #define PNANOVDB_GRID_OFF_GRID_NAME 40
822
- #define PNANOVDB_GRID_OFF_MAP 296
823
- #define PNANOVDB_GRID_OFF_WORLD_BBOX 560
824
- #define PNANOVDB_GRID_OFF_VOXEL_SIZE 608
825
- #define PNANOVDB_GRID_OFF_GRID_CLASS 632
826
- #define PNANOVDB_GRID_OFF_GRID_TYPE 636
827
- #define PNANOVDB_GRID_OFF_BLIND_METADATA_OFFSET 640
828
- #define PNANOVDB_GRID_OFF_BLIND_METADATA_COUNT 648
829
-
830
- PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_grid_get_magic(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
831
- return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_MAGIC));
832
- }
833
- PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_grid_get_checksum(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
834
- return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_CHECKSUM));
835
- }
836
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_version(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
837
- return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_VERSION));
838
- }
839
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_flags(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
840
- return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_FLAGS));
841
- }
842
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_index(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
843
- return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_INDEX));
844
- }
845
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_count(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
846
- return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_COUNT));
847
- }
848
- PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_grid_get_grid_size(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
849
- return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_SIZE));
850
- }
851
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_name(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t index) {
852
- return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_NAME + 4u * index));
853
- }
854
- PNANOVDB_FORCE_INLINE pnanovdb_map_handle_t pnanovdb_grid_get_map(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
855
- pnanovdb_map_handle_t ret;
856
- ret.address = pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_MAP);
857
- return ret;
858
- }
859
- PNANOVDB_FORCE_INLINE double pnanovdb_grid_get_world_bbox(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t index) {
860
- return pnanovdb_read_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_WORLD_BBOX + 8u * index));
861
- }
862
- PNANOVDB_FORCE_INLINE double pnanovdb_grid_get_voxel_size(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t index) {
863
- return pnanovdb_read_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_VOXEL_SIZE + 8u * index));
864
- }
865
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_class(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
866
- return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_CLASS));
867
- }
868
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_type(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
869
- return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_TYPE));
870
- }
871
- PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_grid_get_blind_metadata_offset(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
872
- return pnanovdb_read_int64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_BLIND_METADATA_OFFSET));
873
- }
874
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_blind_metadata_count(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
875
- return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_BLIND_METADATA_COUNT));
876
- }
877
-
878
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_version_get_major(pnanovdb_uint32_t version)
879
- {
880
- return (version >> 21u) & ((1u << 11u) - 1u);
881
- }
882
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_version_get_minor(pnanovdb_uint32_t version)
883
- {
884
- return (version >> 10u) & ((1u << 11u) - 1u);
885
- }
886
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_version_get_patch(pnanovdb_uint32_t version)
887
- {
888
- return version & ((1u << 10u) - 1u);
889
- }
890
-
891
- struct pnanovdb_gridblindmetadata_t
892
- {
893
- pnanovdb_int64_t byte_offset; // 8 bytes, 0
894
- pnanovdb_uint64_t element_count; // 8 bytes, 8
895
- pnanovdb_uint32_t flags; // 4 bytes, 16
896
- pnanovdb_uint32_t semantic; // 4 bytes, 20
897
- pnanovdb_uint32_t data_class; // 4 bytes, 24
898
- pnanovdb_uint32_t data_type; // 4 bytes, 28
899
- pnanovdb_uint32_t name[256 / 4]; // 256 bytes, 32
900
- };
901
- PNANOVDB_STRUCT_TYPEDEF(pnanovdb_gridblindmetadata_t)
902
- struct pnanovdb_gridblindmetadata_handle_t { pnanovdb_address_t address; };
903
- PNANOVDB_STRUCT_TYPEDEF(pnanovdb_gridblindmetadata_handle_t)
904
-
905
- #define PNANOVDB_GRIDBLINDMETADATA_SIZE 288
906
-
907
- #define PNANOVDB_GRIDBLINDMETADATA_OFF_BYTE_OFFSET 0
908
- #define PNANOVDB_GRIDBLINDMETADATA_OFF_ELEMENT_COUNT 8
909
- #define PNANOVDB_GRIDBLINDMETADATA_OFF_FLAGS 16
910
- #define PNANOVDB_GRIDBLINDMETADATA_OFF_SEMANTIC 20
911
- #define PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_CLASS 24
912
- #define PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_TYPE 28
913
- #define PNANOVDB_GRIDBLINDMETADATA_OFF_NAME 32
914
-
915
- PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_gridblindmetadata_get_byte_offset(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
916
- return pnanovdb_read_int64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_BYTE_OFFSET));
917
- }
918
- PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_gridblindmetadata_get_element_count(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
919
- return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_ELEMENT_COUNT));
920
- }
921
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_flags(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
922
- return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_FLAGS));
923
- }
924
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_semantic(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
925
- return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_SEMANTIC));
926
- }
927
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_data_class(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
928
- return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_CLASS));
929
- }
930
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_data_type(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
931
- return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_TYPE));
932
- }
933
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_name(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_uint32_t index) {
934
- return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_NAME + 4u * index));
935
- }
936
-
937
- struct pnanovdb_tree_t
938
- {
939
- pnanovdb_uint64_t node_offset_leaf;
940
- pnanovdb_uint64_t node_offset_lower;
941
- pnanovdb_uint64_t node_offset_upper;
942
- pnanovdb_uint64_t node_offset_root;
943
- pnanovdb_uint32_t node_count_leaf;
944
- pnanovdb_uint32_t node_count_lower;
945
- pnanovdb_uint32_t node_count_upper;
946
- pnanovdb_uint32_t tile_count_leaf;
947
- pnanovdb_uint32_t tile_count_lower;
948
- pnanovdb_uint32_t tile_count_upper;
949
- pnanovdb_uint64_t voxel_count;
950
- };
951
- PNANOVDB_STRUCT_TYPEDEF(pnanovdb_tree_t)
952
- struct pnanovdb_tree_handle_t { pnanovdb_address_t address; };
953
- PNANOVDB_STRUCT_TYPEDEF(pnanovdb_tree_handle_t)
954
-
955
- #define PNANOVDB_TREE_SIZE 64
956
-
957
- #define PNANOVDB_TREE_OFF_NODE_OFFSET_LEAF 0
958
- #define PNANOVDB_TREE_OFF_NODE_OFFSET_LOWER 8
959
- #define PNANOVDB_TREE_OFF_NODE_OFFSET_UPPER 16
960
- #define PNANOVDB_TREE_OFF_NODE_OFFSET_ROOT 24
961
- #define PNANOVDB_TREE_OFF_NODE_COUNT_LEAF 32
962
- #define PNANOVDB_TREE_OFF_NODE_COUNT_LOWER 36
963
- #define PNANOVDB_TREE_OFF_NODE_COUNT_UPPER 40
964
- #define PNANOVDB_TREE_OFF_TILE_COUNT_LEAF 44
965
- #define PNANOVDB_TREE_OFF_TILE_COUNT_LOWER 48
966
- #define PNANOVDB_TREE_OFF_TILE_COUNT_UPPER 52
967
- #define PNANOVDB_TREE_OFF_VOXEL_COUNT 56
968
-
969
- PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_node_offset_leaf(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
970
- return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_OFFSET_LEAF));
971
- }
972
- PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_node_offset_lower(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
973
- return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_OFFSET_LOWER));
974
- }
975
- PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_node_offset_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
976
- return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_OFFSET_UPPER));
977
- }
978
- PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_node_offset_root(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
979
- return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_OFFSET_ROOT));
980
- }
981
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_node_count_leaf(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
982
- return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_COUNT_LEAF));
983
- }
984
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_node_count_lower(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
985
- return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_COUNT_LOWER));
986
- }
987
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_node_count_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
988
- return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_COUNT_UPPER));
989
- }
990
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_tile_count_leaf(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
991
- return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_TILE_COUNT_LEAF));
992
- }
993
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_tile_count_lower(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
994
- return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_TILE_COUNT_LOWER));
995
- }
996
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_tile_count_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
997
- return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_TILE_COUNT_UPPER));
998
- }
999
- PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_voxel_count(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
1000
- return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_VOXEL_COUNT));
1001
- }
1002
-
1003
- struct pnanovdb_root_t
1004
- {
1005
- pnanovdb_coord_t bbox_min;
1006
- pnanovdb_coord_t bbox_max;
1007
- pnanovdb_uint32_t table_size;
1008
- pnanovdb_uint32_t pad1; // background can start here
1009
- // background, min, max
1010
- };
1011
- PNANOVDB_STRUCT_TYPEDEF(pnanovdb_root_t)
1012
- struct pnanovdb_root_handle_t { pnanovdb_address_t address; };
1013
- PNANOVDB_STRUCT_TYPEDEF(pnanovdb_root_handle_t)
1014
-
1015
- #define PNANOVDB_ROOT_BASE_SIZE 28
1016
-
1017
- #define PNANOVDB_ROOT_OFF_BBOX_MIN 0
1018
- #define PNANOVDB_ROOT_OFF_BBOX_MAX 12
1019
- #define PNANOVDB_ROOT_OFF_TABLE_SIZE 24
1020
-
1021
- PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_root_get_bbox_min(pnanovdb_buf_t buf, pnanovdb_root_handle_t p) {
1022
- return pnanovdb_read_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_OFF_BBOX_MIN));
1023
- }
1024
- PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_root_get_bbox_max(pnanovdb_buf_t buf, pnanovdb_root_handle_t p) {
1025
- return pnanovdb_read_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_OFF_BBOX_MAX));
1026
- }
1027
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_root_get_tile_count(pnanovdb_buf_t buf, pnanovdb_root_handle_t p) {
1028
- return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_OFF_TABLE_SIZE));
1029
- }
1030
-
1031
- struct pnanovdb_root_tile_t
1032
- {
1033
- pnanovdb_uint64_t key;
1034
- pnanovdb_int64_t child; // signed byte offset from root to the child node, 0 means it is a constant tile, so use value
1035
- pnanovdb_uint32_t state;
1036
- pnanovdb_uint32_t pad1; // value can start here
1037
- // value
1038
- };
1039
- PNANOVDB_STRUCT_TYPEDEF(pnanovdb_root_tile_t)
1040
- struct pnanovdb_root_tile_handle_t { pnanovdb_address_t address; };
1041
- PNANOVDB_STRUCT_TYPEDEF(pnanovdb_root_tile_handle_t)
1042
-
1043
- #define PNANOVDB_ROOT_TILE_BASE_SIZE 20
1044
-
1045
- #define PNANOVDB_ROOT_TILE_OFF_KEY 0
1046
- #define PNANOVDB_ROOT_TILE_OFF_CHILD 8
1047
- #define PNANOVDB_ROOT_TILE_OFF_STATE 16
1048
-
1049
- PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_root_tile_get_key(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t p) {
1050
- return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_TILE_OFF_KEY));
1051
- }
1052
- PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_root_tile_get_child(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t p) {
1053
- return pnanovdb_read_int64(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_TILE_OFF_CHILD));
1054
- }
1055
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_root_tile_get_state(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t p) {
1056
- return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_TILE_OFF_STATE));
1057
- }
1058
-
1059
- struct pnanovdb_upper_t
1060
- {
1061
- pnanovdb_coord_t bbox_min;
1062
- pnanovdb_coord_t bbox_max;
1063
- pnanovdb_uint64_t flags;
1064
- pnanovdb_uint32_t value_mask[1024];
1065
- pnanovdb_uint32_t child_mask[1024];
1066
- // min, max
1067
- // alignas(32) pnanovdb_uint32_t table[];
1068
- };
1069
- PNANOVDB_STRUCT_TYPEDEF(pnanovdb_upper_t)
1070
- struct pnanovdb_upper_handle_t { pnanovdb_address_t address; };
1071
- PNANOVDB_STRUCT_TYPEDEF(pnanovdb_upper_handle_t)
1072
-
1073
- #define PNANOVDB_UPPER_TABLE_COUNT 32768
1074
- #define PNANOVDB_UPPER_BASE_SIZE 8224
1075
-
1076
- #define PNANOVDB_UPPER_OFF_BBOX_MIN 0
1077
- #define PNANOVDB_UPPER_OFF_BBOX_MAX 12
1078
- #define PNANOVDB_UPPER_OFF_FLAGS 24
1079
- #define PNANOVDB_UPPER_OFF_VALUE_MASK 32
1080
- #define PNANOVDB_UPPER_OFF_CHILD_MASK 4128
1081
-
1082
- PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_upper_get_bbox_min(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p) {
1083
- return pnanovdb_read_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_BBOX_MIN));
1084
- }
1085
- PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_upper_get_bbox_max(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p) {
1086
- return pnanovdb_read_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_BBOX_MAX));
1087
- }
1088
- PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_upper_get_flags(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p) {
1089
- return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_FLAGS));
1090
- }
1091
- PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_upper_get_value_mask(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p, pnanovdb_uint32_t bit_index) {
1092
- pnanovdb_uint32_t value = pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_VALUE_MASK + 4u * (bit_index >> 5u)));
1093
- return ((value >> (bit_index & 31u)) & 1) != 0u;
1094
- }
1095
- PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_upper_get_child_mask(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p, pnanovdb_uint32_t bit_index) {
1096
- pnanovdb_uint32_t value = pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_CHILD_MASK + 4u * (bit_index >> 5u)));
1097
- return ((value >> (bit_index & 31u)) & 1) != 0u;
1098
- }
1099
-
1100
- struct pnanovdb_lower_t
1101
- {
1102
- pnanovdb_coord_t bbox_min;
1103
- pnanovdb_coord_t bbox_max;
1104
- pnanovdb_uint64_t flags;
1105
- pnanovdb_uint32_t value_mask[128];
1106
- pnanovdb_uint32_t child_mask[128];
1107
- // min, max
1108
- // alignas(32) pnanovdb_uint32_t table[];
1109
- };
1110
- PNANOVDB_STRUCT_TYPEDEF(pnanovdb_lower_t)
1111
- struct pnanovdb_lower_handle_t { pnanovdb_address_t address; };
1112
- PNANOVDB_STRUCT_TYPEDEF(pnanovdb_lower_handle_t)
1113
-
1114
- #define PNANOVDB_LOWER_TABLE_COUNT 4096
1115
- #define PNANOVDB_LOWER_BASE_SIZE 1056
1116
-
1117
- #define PNANOVDB_LOWER_OFF_BBOX_MIN 0
1118
- #define PNANOVDB_LOWER_OFF_BBOX_MAX 12
1119
- #define PNANOVDB_LOWER_OFF_FLAGS 24
1120
- #define PNANOVDB_LOWER_OFF_VALUE_MASK 32
1121
- #define PNANOVDB_LOWER_OFF_CHILD_MASK 544
1122
-
1123
- PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_lower_get_bbox_min(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p) {
1124
- return pnanovdb_read_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_BBOX_MIN));
1125
- }
1126
- PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_lower_get_bbox_max(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p) {
1127
- return pnanovdb_read_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_BBOX_MAX));
1128
- }
1129
- PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_lower_get_flags(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p) {
1130
- return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_FLAGS));
1131
- }
1132
- PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_lower_get_value_mask(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p, pnanovdb_uint32_t bit_index) {
1133
- pnanovdb_uint32_t value = pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_VALUE_MASK + 4u * (bit_index >> 5u)));
1134
- return ((value >> (bit_index & 31u)) & 1) != 0u;
1135
- }
1136
- PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_lower_get_child_mask(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p, pnanovdb_uint32_t bit_index) {
1137
- pnanovdb_uint32_t value = pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_CHILD_MASK + 4u * (bit_index >> 5u)));
1138
- return ((value >> (bit_index & 31u)) & 1) != 0u;
1139
- }
1140
-
1141
- struct pnanovdb_leaf_t
1142
- {
1143
- pnanovdb_coord_t bbox_min;
1144
- pnanovdb_uint32_t bbox_dif_and_flags;
1145
- pnanovdb_uint32_t value_mask[16];
1146
- // min, max
1147
- // alignas(32) pnanovdb_uint32_t values[];
1148
- };
1149
- PNANOVDB_STRUCT_TYPEDEF(pnanovdb_leaf_t)
1150
- struct pnanovdb_leaf_handle_t { pnanovdb_address_t address; };
1151
- PNANOVDB_STRUCT_TYPEDEF(pnanovdb_leaf_handle_t)
1152
-
1153
- #define PNANOVDB_LEAF_TABLE_COUNT 512
1154
- #define PNANOVDB_LEAF_BASE_SIZE 80
1155
-
1156
- #define PNANOVDB_LEAF_OFF_BBOX_MIN 0
1157
- #define PNANOVDB_LEAF_OFF_BBOX_DIF_AND_FLAGS 12
1158
- #define PNANOVDB_LEAF_OFF_VALUE_MASK 16
1159
-
1160
- #define PNANOVDB_LEAF_TABLE_NEG_OFF_BBOX_DIF_AND_FLAGS 84
1161
- #define PNANOVDB_LEAF_TABLE_NEG_OFF_MINIMUM 16
1162
- #define PNANOVDB_LEAF_TABLE_NEG_OFF_QUANTUM 12
1163
-
1164
- PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_leaf_get_bbox_min(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t p) {
1165
- return pnanovdb_read_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_LEAF_OFF_BBOX_MIN));
1166
- }
1167
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_leaf_get_bbox_dif_and_flags(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t p) {
1168
- return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_LEAF_OFF_BBOX_DIF_AND_FLAGS));
1169
- }
1170
- PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_get_value_mask(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t p, pnanovdb_uint32_t bit_index) {
1171
- pnanovdb_uint32_t value = pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_LEAF_OFF_VALUE_MASK + 4u * (bit_index >> 5u)));
1172
- return ((value >> (bit_index & 31u)) & 1) != 0u;
1173
- }
1174
-
1175
- struct pnanovdb_grid_type_constants_t
1176
- {
1177
- pnanovdb_uint32_t root_off_background;
1178
- pnanovdb_uint32_t root_off_min;
1179
- pnanovdb_uint32_t root_off_max;
1180
- pnanovdb_uint32_t root_off_ave;
1181
- pnanovdb_uint32_t root_off_stddev;
1182
- pnanovdb_uint32_t root_size;
1183
- pnanovdb_uint32_t value_stride_bits;
1184
- pnanovdb_uint32_t table_stride;
1185
- pnanovdb_uint32_t root_tile_off_value;
1186
- pnanovdb_uint32_t root_tile_size;
1187
- pnanovdb_uint32_t upper_off_min;
1188
- pnanovdb_uint32_t upper_off_max;
1189
- pnanovdb_uint32_t upper_off_ave;
1190
- pnanovdb_uint32_t upper_off_stddev;
1191
- pnanovdb_uint32_t upper_off_table;
1192
- pnanovdb_uint32_t upper_size;
1193
- pnanovdb_uint32_t lower_off_min;
1194
- pnanovdb_uint32_t lower_off_max;
1195
- pnanovdb_uint32_t lower_off_ave;
1196
- pnanovdb_uint32_t lower_off_stddev;
1197
- pnanovdb_uint32_t lower_off_table;
1198
- pnanovdb_uint32_t lower_size;
1199
- pnanovdb_uint32_t leaf_off_min;
1200
- pnanovdb_uint32_t leaf_off_max;
1201
- pnanovdb_uint32_t leaf_off_ave;
1202
- pnanovdb_uint32_t leaf_off_stddev;
1203
- pnanovdb_uint32_t leaf_off_table;
1204
- pnanovdb_uint32_t leaf_size;
1205
- };
1206
- PNANOVDB_STRUCT_TYPEDEF(pnanovdb_grid_type_constants_t)
1207
-
1208
- PNANOVDB_STATIC_CONST pnanovdb_grid_type_constants_t pnanovdb_grid_type_constants[PNANOVDB_GRID_TYPE_END] =
1209
- {
1210
- {28, 28, 28, 28, 28, 32, 0, 8, 20, 32, 8224, 8224, 8224, 8224, 8224, 270368, 1056, 1056, 1056, 1056, 1056, 33824, 80, 80, 80, 80, 96, 96},
1211
- {28, 32, 36, 40, 44, 64, 32, 8, 20, 32, 8224, 8228, 8232, 8236, 8256, 270400, 1056, 1060, 1064, 1068, 1088, 33856, 80, 84, 88, 92, 96, 2144},
1212
- {32, 40, 48, 56, 64, 96, 64, 8, 24, 32, 8224, 8232, 8240, 8248, 8256, 270400, 1056, 1064, 1072, 1080, 1088, 33856, 80, 88, 96, 104, 128, 4224},
1213
- {28, 30, 32, 36, 40, 64, 16, 8, 20, 32, 8224, 8226, 8228, 8232, 8256, 270400, 1056, 1058, 1060, 1064, 1088, 33856, 80, 82, 84, 88, 96, 1120},
1214
- {28, 32, 36, 40, 44, 64, 32, 8, 20, 32, 8224, 8228, 8232, 8236, 8256, 270400, 1056, 1060, 1064, 1068, 1088, 33856, 80, 84, 88, 92, 96, 2144},
1215
- {32, 40, 48, 56, 64, 96, 64, 8, 24, 32, 8224, 8232, 8240, 8248, 8256, 270400, 1056, 1064, 1072, 1080, 1088, 33856, 80, 88, 96, 104, 128, 4224},
1216
- {28, 40, 52, 64, 68, 96, 96, 16, 20, 32, 8224, 8236, 8248, 8252, 8256, 532544, 1056, 1068, 1080, 1084, 1088, 66624, 80, 92, 104, 108, 128, 6272},
1217
- {32, 56, 80, 104, 112, 128, 192, 24, 24, 64, 8224, 8248, 8272, 8280, 8288, 794720, 1056, 1080, 1104, 1112, 1120, 99424, 80, 104, 128, 136, 160, 12448},
1218
- {28, 29, 30, 31, 32, 64, 0, 8, 20, 32, 8224, 8225, 8226, 8227, 8256, 270400, 1056, 1057, 1058, 1059, 1088, 33856, 80, 80, 80, 80, 96, 96},
1219
- {28, 30, 32, 36, 40, 64, 16, 8, 20, 32, 8224, 8226, 8228, 8232, 8256, 270400, 1056, 1058, 1060, 1064, 1088, 33856, 80, 82, 84, 88, 96, 1120},
1220
- {28, 32, 36, 40, 44, 64, 32, 8, 20, 32, 8224, 8228, 8232, 8236, 8256, 270400, 1056, 1060, 1064, 1068, 1088, 33856, 80, 84, 88, 92, 96, 2144},
1221
- {28, 29, 30, 31, 32, 64, 1, 8, 20, 32, 8224, 8225, 8226, 8227, 8256, 270400, 1056, 1057, 1058, 1059, 1088, 33856, 80, 80, 80, 80, 96, 160},
1222
- {28, 32, 36, 40, 44, 64, 32, 8, 20, 32, 8224, 8228, 8232, 8236, 8256, 270400, 1056, 1060, 1064, 1068, 1088, 33856, 80, 84, 88, 92, 96, 2144},
1223
- {28, 32, 36, 40, 44, 64, 0, 8, 20, 32, 8224, 8228, 8232, 8236, 8256, 270400, 1056, 1060, 1064, 1068, 1088, 33856, 88, 90, 92, 94, 96, 352},
1224
- {28, 32, 36, 40, 44, 64, 0, 8, 20, 32, 8224, 8228, 8232, 8236, 8256, 270400, 1056, 1060, 1064, 1068, 1088, 33856, 88, 90, 92, 94, 96, 608},
1225
- {28, 32, 36, 40, 44, 64, 0, 8, 20, 32, 8224, 8228, 8232, 8236, 8256, 270400, 1056, 1060, 1064, 1068, 1088, 33856, 88, 90, 92, 94, 96, 1120},
1226
- {28, 32, 36, 40, 44, 64, 0, 8, 20, 32, 8224, 8228, 8232, 8236, 8256, 270400, 1056, 1060, 1064, 1068, 1088, 33856, 88, 90, 92, 94, 96, 96},
1227
- {28, 44, 60, 76, 80, 96, 128, 16, 20, 64, 8224, 8240, 8256, 8260, 8288, 532576, 1056, 1072, 1088, 1092, 1120, 66656, 80, 96, 112, 116, 128, 8320},
1228
- {32, 64, 96, 128, 136, 160, 256, 32, 24, 64, 8224, 8256, 8288, 8296, 8320, 1056896, 1056, 1088, 1120, 1128, 1152, 132224, 80, 112, 144, 152, 160, 16544},
1229
- };
1230
-
1231
- // ------------------------------------------------ Basic Lookup -----------------------------------------------------------
1232
-
1233
- PNANOVDB_FORCE_INLINE pnanovdb_gridblindmetadata_handle_t pnanovdb_grid_get_gridblindmetadata(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, pnanovdb_uint32_t index)
1234
- {
1235
- pnanovdb_gridblindmetadata_handle_t meta = { grid.address };
1236
- pnanovdb_uint64_t byte_offset = pnanovdb_grid_get_blind_metadata_offset(buf, grid);
1237
- meta.address = pnanovdb_address_offset64(meta.address, byte_offset);
1238
- meta.address = pnanovdb_address_offset_product(meta.address, PNANOVDB_GRIDBLINDMETADATA_SIZE, index);
1239
- return meta;
1240
- }
1241
-
1242
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanodvb_grid_get_gridblindmetadata_value_address(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, pnanovdb_uint32_t index)
1243
- {
1244
- pnanovdb_gridblindmetadata_handle_t meta = pnanovdb_grid_get_gridblindmetadata(buf, grid, index);
1245
- pnanovdb_int64_t byte_offset = pnanovdb_gridblindmetadata_get_byte_offset(buf, meta);
1246
- pnanovdb_address_t address = grid.address;
1247
- address = pnanovdb_address_offset64(address, pnanovdb_int64_as_uint64(byte_offset));
1248
- return address;
1249
- }
1250
-
1251
- PNANOVDB_FORCE_INLINE pnanovdb_tree_handle_t pnanovdb_grid_get_tree(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid)
1252
- {
1253
- pnanovdb_tree_handle_t tree = { grid.address };
1254
- tree.address = pnanovdb_address_offset(tree.address, PNANOVDB_GRID_SIZE);
1255
- return tree;
1256
- }
1257
-
1258
- PNANOVDB_FORCE_INLINE pnanovdb_root_handle_t pnanovdb_tree_get_root(pnanovdb_buf_t buf, pnanovdb_tree_handle_t tree)
1259
- {
1260
- pnanovdb_root_handle_t root = { tree.address };
1261
- pnanovdb_uint64_t byte_offset = pnanovdb_tree_get_node_offset_root(buf, tree);
1262
- root.address = pnanovdb_address_offset64(root.address, byte_offset);
1263
- return root;
1264
- }
1265
-
1266
- PNANOVDB_FORCE_INLINE pnanovdb_root_tile_handle_t pnanovdb_root_get_tile(pnanovdb_grid_type_t grid_type, pnanovdb_root_handle_t root, pnanovdb_uint32_t n)
1267
- {
1268
- pnanovdb_root_tile_handle_t tile = { root.address };
1269
- tile.address = pnanovdb_address_offset(tile.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_size));
1270
- tile.address = pnanovdb_address_offset_product(tile.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_tile_size), n);
1271
- return tile;
1272
- }
1273
-
1274
- PNANOVDB_FORCE_INLINE pnanovdb_root_tile_handle_t pnanovdb_root_get_tile_zero(pnanovdb_grid_type_t grid_type, pnanovdb_root_handle_t root)
1275
- {
1276
- pnanovdb_root_tile_handle_t tile = { root.address };
1277
- tile.address = pnanovdb_address_offset(tile.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_size));
1278
- return tile;
1279
- }
1280
-
1281
- PNANOVDB_FORCE_INLINE pnanovdb_upper_handle_t pnanovdb_root_get_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, pnanovdb_root_tile_handle_t tile)
1282
- {
1283
- pnanovdb_upper_handle_t upper = { root.address };
1284
- upper.address = pnanovdb_address_offset64(upper.address, pnanovdb_int64_as_uint64(pnanovdb_root_tile_get_child(buf, tile)));
1285
- return upper;
1286
- }
1287
-
1288
- PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_coord_to_key(PNANOVDB_IN(pnanovdb_coord_t) ijk)
1289
- {
1290
- #if defined(PNANOVDB_NATIVE_64)
1291
- pnanovdb_uint64_t iu = pnanovdb_int32_as_uint32(PNANOVDB_DEREF(ijk).x) >> 12u;
1292
- pnanovdb_uint64_t ju = pnanovdb_int32_as_uint32(PNANOVDB_DEREF(ijk).y) >> 12u;
1293
- pnanovdb_uint64_t ku = pnanovdb_int32_as_uint32(PNANOVDB_DEREF(ijk).z) >> 12u;
1294
- return (ku) | (ju << 21u) | (iu << 42u);
1295
- #else
1296
- pnanovdb_uint32_t iu = pnanovdb_int32_as_uint32(PNANOVDB_DEREF(ijk).x) >> 12u;
1297
- pnanovdb_uint32_t ju = pnanovdb_int32_as_uint32(PNANOVDB_DEREF(ijk).y) >> 12u;
1298
- pnanovdb_uint32_t ku = pnanovdb_int32_as_uint32(PNANOVDB_DEREF(ijk).z) >> 12u;
1299
- pnanovdb_uint32_t key_x = ku | (ju << 21);
1300
- pnanovdb_uint32_t key_y = (iu << 10) | (ju >> 11);
1301
- return pnanovdb_uint32_as_uint64(key_x, key_y);
1302
- #endif
1303
- }
1304
-
1305
- PNANOVDB_FORCE_INLINE pnanovdb_root_tile_handle_t pnanovdb_root_find_tile(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1306
- {
1307
- pnanovdb_uint32_t tile_count = pnanovdb_uint32_as_int32(pnanovdb_root_get_tile_count(buf, root));
1308
- pnanovdb_root_tile_handle_t tile = pnanovdb_root_get_tile_zero(grid_type, root);
1309
- pnanovdb_uint64_t key = pnanovdb_coord_to_key(ijk);
1310
- for (pnanovdb_uint32_t i = 0u; i < tile_count; i++)
1311
- {
1312
- if (pnanovdb_uint64_is_equal(key, pnanovdb_root_tile_get_key(buf, tile)))
1313
- {
1314
- return tile;
1315
- }
1316
- tile.address = pnanovdb_address_offset(tile.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_tile_size));
1317
- }
1318
- pnanovdb_root_tile_handle_t null_handle = { pnanovdb_address_null() };
1319
- return null_handle;
1320
- }
1321
-
1322
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_leaf_coord_to_offset(PNANOVDB_IN(pnanovdb_coord_t) ijk)
1323
- {
1324
- return (((PNANOVDB_DEREF(ijk).x & 7) >> 0) << (2 * 3)) +
1325
- (((PNANOVDB_DEREF(ijk).y & 7) >> 0) << (3)) +
1326
- ((PNANOVDB_DEREF(ijk).z & 7) >> 0);
1327
- }
1328
-
1329
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_min_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t node)
1330
- {
1331
- pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, leaf_off_min);
1332
- return pnanovdb_address_offset(node.address, byte_offset);
1333
- }
1334
-
1335
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_max_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t node)
1336
- {
1337
- pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, leaf_off_max);
1338
- return pnanovdb_address_offset(node.address, byte_offset);
1339
- }
1340
-
1341
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_ave_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t node)
1342
- {
1343
- pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, leaf_off_ave);
1344
- return pnanovdb_address_offset(node.address, byte_offset);
1345
- }
1346
-
1347
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_stddev_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t node)
1348
- {
1349
- pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, leaf_off_stddev);
1350
- return pnanovdb_address_offset(node.address, byte_offset);
1351
- }
1352
-
1353
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_table_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t node, pnanovdb_uint32_t n)
1354
- {
1355
- pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, leaf_off_table) + ((PNANOVDB_GRID_TYPE_GET(grid_type, value_stride_bits) * n) >> 3u);
1356
- return pnanovdb_address_offset(node.address, byte_offset);
1357
- }
1358
-
1359
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1360
- {
1361
- pnanovdb_uint32_t n = pnanovdb_leaf_coord_to_offset(ijk);
1362
- return pnanovdb_leaf_get_table_address(grid_type, buf, leaf, n);
1363
- }
1364
-
1365
- PNANOVDB_FORCE_INLINE float pnanovdb_leaf_fp_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk, pnanovdb_uint32_t value_log_bits)
1366
- {
1367
- // value_log_bits // 2 3 4
1368
- pnanovdb_uint32_t value_bits = 1u << value_log_bits; // 4 8 16
1369
- pnanovdb_uint32_t value_mask = (1u << value_bits) - 1u; // 0xF 0xFF 0xFFFF
1370
- pnanovdb_uint32_t values_per_word_bits = 5u - value_log_bits; // 3 2 1
1371
- pnanovdb_uint32_t values_per_word_mask = (1u << values_per_word_bits) - 1u; // 7 3 1
1372
-
1373
- pnanovdb_uint32_t n = pnanovdb_leaf_coord_to_offset(ijk);
1374
- float minimum = pnanovdb_read_float(buf, pnanovdb_address_offset_neg(address, PNANOVDB_LEAF_TABLE_NEG_OFF_MINIMUM));
1375
- float quantum = pnanovdb_read_float(buf, pnanovdb_address_offset_neg(address, PNANOVDB_LEAF_TABLE_NEG_OFF_QUANTUM));
1376
- pnanovdb_uint32_t raw = pnanovdb_read_uint32(buf, pnanovdb_address_offset(address, ((n >> values_per_word_bits) << 2u)));
1377
- pnanovdb_uint32_t value_compressed = (raw >> ((n & values_per_word_mask) << value_log_bits)) & value_mask;
1378
- return pnanovdb_uint32_to_float(value_compressed) * quantum + minimum;
1379
- }
1380
-
1381
- PNANOVDB_FORCE_INLINE float pnanovdb_leaf_fp4_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1382
- {
1383
- return pnanovdb_leaf_fp_read_float(buf, address, ijk, 2u);
1384
- }
1385
-
1386
- PNANOVDB_FORCE_INLINE float pnanovdb_leaf_fp8_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1387
- {
1388
- return pnanovdb_leaf_fp_read_float(buf, address, ijk, 3u);
1389
- }
1390
-
1391
- PNANOVDB_FORCE_INLINE float pnanovdb_leaf_fp16_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1392
- {
1393
- return pnanovdb_leaf_fp_read_float(buf, address, ijk, 4u);
1394
- }
1395
-
1396
- PNANOVDB_FORCE_INLINE float pnanovdb_leaf_fpn_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1397
- {
1398
- pnanovdb_uint32_t bbox_dif_and_flags = pnanovdb_read_uint32(buf, pnanovdb_address_offset_neg(address, PNANOVDB_LEAF_TABLE_NEG_OFF_BBOX_DIF_AND_FLAGS));
1399
- pnanovdb_uint32_t flags = bbox_dif_and_flags >> 24u;
1400
- pnanovdb_uint32_t value_log_bits = flags >> 5; // b = 0, 1, 2, 3, 4 corresponding to 1, 2, 4, 8, 16 bits
1401
- return pnanovdb_leaf_fp_read_float(buf, address, ijk, value_log_bits);
1402
- }
1403
-
1404
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_lower_coord_to_offset(PNANOVDB_IN(pnanovdb_coord_t) ijk)
1405
- {
1406
- return (((PNANOVDB_DEREF(ijk).x & 127) >> 3) << (2 * 4)) +
1407
- (((PNANOVDB_DEREF(ijk).y & 127) >> 3) << (4)) +
1408
- ((PNANOVDB_DEREF(ijk).z & 127) >> 3);
1409
- }
1410
-
1411
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_min_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node)
1412
- {
1413
- pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, lower_off_min);
1414
- return pnanovdb_address_offset(node.address, byte_offset);
1415
- }
1416
-
1417
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_max_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node)
1418
- {
1419
- pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, lower_off_max);
1420
- return pnanovdb_address_offset(node.address, byte_offset);
1421
- }
1422
-
1423
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_ave_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node)
1424
- {
1425
- pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, lower_off_ave);
1426
- return pnanovdb_address_offset(node.address, byte_offset);
1427
- }
1428
-
1429
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_stddev_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node)
1430
- {
1431
- pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, lower_off_stddev);
1432
- return pnanovdb_address_offset(node.address, byte_offset);
1433
- }
1434
-
1435
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_table_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node, pnanovdb_uint32_t n)
1436
- {
1437
- pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, lower_off_table) + PNANOVDB_GRID_TYPE_GET(grid_type, table_stride) * n;
1438
- return pnanovdb_address_offset(node.address, byte_offset);
1439
- }
1440
-
1441
- PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_lower_get_table_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node, pnanovdb_uint32_t n)
1442
- {
1443
- pnanovdb_address_t table_address = pnanovdb_lower_get_table_address(grid_type, buf, node, n);
1444
- return pnanovdb_read_int64(buf, table_address);
1445
- }
1446
-
1447
- PNANOVDB_FORCE_INLINE pnanovdb_leaf_handle_t pnanovdb_lower_get_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, pnanovdb_uint32_t n)
1448
- {
1449
- pnanovdb_leaf_handle_t leaf = { lower.address };
1450
- leaf.address = pnanovdb_address_offset64(leaf.address, pnanovdb_int64_as_uint64(pnanovdb_lower_get_table_child(grid_type, buf, lower, n)));
1451
- return leaf;
1452
- }
1453
-
1454
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_value_address_and_level(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
1455
- {
1456
- pnanovdb_uint32_t n = pnanovdb_lower_coord_to_offset(ijk);
1457
- pnanovdb_address_t value_address;
1458
- if (pnanovdb_lower_get_child_mask(buf, lower, n))
1459
- {
1460
- pnanovdb_leaf_handle_t child = pnanovdb_lower_get_child(grid_type, buf, lower, n);
1461
- value_address = pnanovdb_leaf_get_value_address(grid_type, buf, child, ijk);
1462
- PNANOVDB_DEREF(level) = 0u;
1463
- }
1464
- else
1465
- {
1466
- value_address = pnanovdb_lower_get_table_address(grid_type, buf, lower, n);
1467
- PNANOVDB_DEREF(level) = 1u;
1468
- }
1469
- return value_address;
1470
- }
1471
-
1472
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1473
- {
1474
- pnanovdb_uint32_t level;
1475
- return pnanovdb_lower_get_value_address_and_level(grid_type, buf, lower, ijk, PNANOVDB_REF(level));
1476
- }
1477
-
1478
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_upper_coord_to_offset(PNANOVDB_IN(pnanovdb_coord_t) ijk)
1479
- {
1480
- return (((PNANOVDB_DEREF(ijk).x & 4095) >> 7) << (2 * 5)) +
1481
- (((PNANOVDB_DEREF(ijk).y & 4095) >> 7) << (5)) +
1482
- ((PNANOVDB_DEREF(ijk).z & 4095) >> 7);
1483
- }
1484
-
1485
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_min_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t node)
1486
- {
1487
- pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, upper_off_min);
1488
- return pnanovdb_address_offset(node.address, byte_offset);
1489
- }
1490
-
1491
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_max_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t node)
1492
- {
1493
- pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, upper_off_max);
1494
- return pnanovdb_address_offset(node.address, byte_offset);
1495
- }
1496
-
1497
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_ave_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t node)
1498
- {
1499
- pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, upper_off_ave);
1500
- return pnanovdb_address_offset(node.address, byte_offset);
1501
- }
1502
-
1503
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_stddev_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t node)
1504
- {
1505
- pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, upper_off_stddev);
1506
- return pnanovdb_address_offset(node.address, byte_offset);
1507
- }
1508
-
1509
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_table_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t node, pnanovdb_uint32_t n)
1510
- {
1511
- pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, upper_off_table) + PNANOVDB_GRID_TYPE_GET(grid_type, table_stride) * n;
1512
- return pnanovdb_address_offset(node.address, byte_offset);
1513
- }
1514
-
1515
- PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_upper_get_table_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t node, pnanovdb_uint32_t n)
1516
- {
1517
- pnanovdb_address_t bufAddress = pnanovdb_upper_get_table_address(grid_type, buf, node, n);
1518
- return pnanovdb_read_int64(buf, bufAddress);
1519
- }
1520
-
1521
- PNANOVDB_FORCE_INLINE pnanovdb_lower_handle_t pnanovdb_upper_get_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, pnanovdb_uint32_t n)
1522
- {
1523
- pnanovdb_lower_handle_t lower = { upper.address };
1524
- lower.address = pnanovdb_address_offset64(lower.address, pnanovdb_int64_as_uint64(pnanovdb_upper_get_table_child(grid_type, buf, upper, n)));
1525
- return lower;
1526
- }
1527
-
1528
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_value_address_and_level(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
1529
- {
1530
- pnanovdb_uint32_t n = pnanovdb_upper_coord_to_offset(ijk);
1531
- pnanovdb_address_t value_address;
1532
- if (pnanovdb_upper_get_child_mask(buf, upper, n))
1533
- {
1534
- pnanovdb_lower_handle_t child = pnanovdb_upper_get_child(grid_type, buf, upper, n);
1535
- value_address = pnanovdb_lower_get_value_address_and_level(grid_type, buf, child, ijk, level);
1536
- }
1537
- else
1538
- {
1539
- value_address = pnanovdb_upper_get_table_address(grid_type, buf, upper, n);
1540
- PNANOVDB_DEREF(level) = 2u;
1541
- }
1542
- return value_address;
1543
- }
1544
-
1545
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1546
- {
1547
- pnanovdb_uint32_t level;
1548
- return pnanovdb_upper_get_value_address_and_level(grid_type, buf, upper, ijk, PNANOVDB_REF(level));
1549
- }
1550
-
1551
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_min_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root)
1552
- {
1553
- pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, root_off_min);
1554
- return pnanovdb_address_offset(root.address, byte_offset);
1555
- }
1556
-
1557
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_max_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root)
1558
- {
1559
- pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, root_off_max);
1560
- return pnanovdb_address_offset(root.address, byte_offset);
1561
- }
1562
-
1563
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_ave_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root)
1564
- {
1565
- pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, root_off_ave);
1566
- return pnanovdb_address_offset(root.address, byte_offset);
1567
- }
1568
-
1569
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_stddev_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root)
1570
- {
1571
- pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, root_off_stddev);
1572
- return pnanovdb_address_offset(root.address, byte_offset);
1573
- }
1574
-
1575
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_tile_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t root_tile)
1576
- {
1577
- pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, root_tile_off_value);
1578
- return pnanovdb_address_offset(root_tile.address, byte_offset);
1579
- }
1580
-
1581
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address_and_level(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
1582
- {
1583
- pnanovdb_root_tile_handle_t tile = pnanovdb_root_find_tile(grid_type, buf, root, ijk);
1584
- pnanovdb_address_t ret;
1585
- if (pnanovdb_address_is_null(tile.address))
1586
- {
1587
- ret = pnanovdb_address_offset(root.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_off_background));
1588
- PNANOVDB_DEREF(level) = 4u;
1589
- }
1590
- else if (pnanovdb_int64_is_zero(pnanovdb_root_tile_get_child(buf, tile)))
1591
- {
1592
- ret = pnanovdb_address_offset(tile.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_tile_off_value));
1593
- PNANOVDB_DEREF(level) = 3u;
1594
- }
1595
- else
1596
- {
1597
- pnanovdb_upper_handle_t child = pnanovdb_root_get_child(grid_type, buf, root, tile);
1598
- ret = pnanovdb_upper_get_value_address_and_level(grid_type, buf, child, ijk, level);
1599
- }
1600
- return ret;
1601
- }
1602
-
1603
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1604
- {
1605
- pnanovdb_uint32_t level;
1606
- return pnanovdb_root_get_value_address_and_level(grid_type, buf, root, ijk, PNANOVDB_REF(level));
1607
- }
1608
-
1609
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address_bit(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_uint32_t) bit_index)
1610
- {
1611
- pnanovdb_uint32_t level;
1612
- pnanovdb_address_t address = pnanovdb_root_get_value_address_and_level(grid_type, buf, root, ijk, PNANOVDB_REF(level));
1613
- PNANOVDB_DEREF(bit_index) = level == 0u ? pnanovdb_int32_as_uint32(PNANOVDB_DEREF(ijk).x & 7) : 0u;
1614
- return address;
1615
- }
1616
-
1617
- PNANOVDB_FORCE_INLINE float pnanovdb_root_fp4_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk, pnanovdb_uint32_t level)
1618
- {
1619
- float ret;
1620
- if (level == 0)
1621
- {
1622
- ret = pnanovdb_leaf_fp4_read_float(buf, address, ijk);
1623
- }
1624
- else
1625
- {
1626
- ret = pnanovdb_read_float(buf, address);
1627
- }
1628
- return ret;
1629
- }
1630
-
1631
- PNANOVDB_FORCE_INLINE float pnanovdb_root_fp8_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk, pnanovdb_uint32_t level)
1632
- {
1633
- float ret;
1634
- if (level == 0)
1635
- {
1636
- ret = pnanovdb_leaf_fp8_read_float(buf, address, ijk);
1637
- }
1638
- else
1639
- {
1640
- ret = pnanovdb_read_float(buf, address);
1641
- }
1642
- return ret;
1643
- }
1644
-
1645
- PNANOVDB_FORCE_INLINE float pnanovdb_root_fp16_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk, pnanovdb_uint32_t level)
1646
- {
1647
- float ret;
1648
- if (level == 0)
1649
- {
1650
- ret = pnanovdb_leaf_fp16_read_float(buf, address, ijk);
1651
- }
1652
- else
1653
- {
1654
- ret = pnanovdb_read_float(buf, address);
1655
- }
1656
- return ret;
1657
- }
1658
-
1659
- PNANOVDB_FORCE_INLINE float pnanovdb_root_fpn_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk, pnanovdb_uint32_t level)
1660
- {
1661
- float ret;
1662
- if (level == 0)
1663
- {
1664
- ret = pnanovdb_leaf_fpn_read_float(buf, address, ijk);
1665
- }
1666
- else
1667
- {
1668
- ret = pnanovdb_read_float(buf, address);
1669
- }
1670
- return ret;
1671
- }
1672
-
1673
- // ------------------------------------------------ ReadAccessor -----------------------------------------------------------
1674
-
1675
- struct pnanovdb_readaccessor_t
1676
- {
1677
- pnanovdb_coord_t key;
1678
- pnanovdb_leaf_handle_t leaf;
1679
- pnanovdb_lower_handle_t lower;
1680
- pnanovdb_upper_handle_t upper;
1681
- pnanovdb_root_handle_t root;
1682
- };
1683
- PNANOVDB_STRUCT_TYPEDEF(pnanovdb_readaccessor_t)
1684
-
1685
- PNANOVDB_FORCE_INLINE void pnanovdb_readaccessor_init(PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, pnanovdb_root_handle_t root)
1686
- {
1687
- PNANOVDB_DEREF(acc).key.x = 0x7FFFFFFF;
1688
- PNANOVDB_DEREF(acc).key.y = 0x7FFFFFFF;
1689
- PNANOVDB_DEREF(acc).key.z = 0x7FFFFFFF;
1690
- PNANOVDB_DEREF(acc).leaf.address = pnanovdb_address_null();
1691
- PNANOVDB_DEREF(acc).lower.address = pnanovdb_address_null();
1692
- PNANOVDB_DEREF(acc).upper.address = pnanovdb_address_null();
1693
- PNANOVDB_DEREF(acc).root = root;
1694
- }
1695
-
1696
- PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_readaccessor_iscached0(PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, int dirty)
1697
- {
1698
- if (pnanovdb_address_is_null(PNANOVDB_DEREF(acc).leaf.address)) { return PNANOVDB_FALSE; }
1699
- if ((dirty & ~((1u << 3) - 1u)) != 0)
1700
- {
1701
- PNANOVDB_DEREF(acc).leaf.address = pnanovdb_address_null();
1702
- return PNANOVDB_FALSE;
1703
- }
1704
- return PNANOVDB_TRUE;
1705
- }
1706
- PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_readaccessor_iscached1(PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, int dirty)
1707
- {
1708
- if (pnanovdb_address_is_null(PNANOVDB_DEREF(acc).lower.address)) { return PNANOVDB_FALSE; }
1709
- if ((dirty & ~((1u << 7) - 1u)) != 0)
1710
- {
1711
- PNANOVDB_DEREF(acc).lower.address = pnanovdb_address_null();
1712
- return PNANOVDB_FALSE;
1713
- }
1714
- return PNANOVDB_TRUE;
1715
- }
1716
- PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_readaccessor_iscached2(PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, int dirty)
1717
- {
1718
- if (pnanovdb_address_is_null(PNANOVDB_DEREF(acc).upper.address)) { return PNANOVDB_FALSE; }
1719
- if ((dirty & ~((1u << 12) - 1u)) != 0)
1720
- {
1721
- PNANOVDB_DEREF(acc).upper.address = pnanovdb_address_null();
1722
- return PNANOVDB_FALSE;
1723
- }
1724
- return PNANOVDB_TRUE;
1725
- }
1726
- PNANOVDB_FORCE_INLINE int pnanovdb_readaccessor_computedirty(PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1727
- {
1728
- return (PNANOVDB_DEREF(ijk).x ^ PNANOVDB_DEREF(acc).key.x) | (PNANOVDB_DEREF(ijk).y ^ PNANOVDB_DEREF(acc).key.y) | (PNANOVDB_DEREF(ijk).z ^ PNANOVDB_DEREF(acc).key.z);
1729
- }
1730
-
1731
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_value_address_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
1732
- {
1733
- pnanovdb_uint32_t n = pnanovdb_leaf_coord_to_offset(ijk);
1734
- return pnanovdb_leaf_get_table_address(grid_type, buf, leaf, n);
1735
- }
1736
-
1737
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_value_address_and_level_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
1738
- {
1739
- pnanovdb_uint32_t n = pnanovdb_lower_coord_to_offset(ijk);
1740
- pnanovdb_address_t value_address;
1741
- if (pnanovdb_lower_get_child_mask(buf, lower, n))
1742
- {
1743
- pnanovdb_leaf_handle_t child = pnanovdb_lower_get_child(grid_type, buf, lower, n);
1744
- PNANOVDB_DEREF(acc).leaf = child;
1745
- PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
1746
- value_address = pnanovdb_leaf_get_value_address_and_cache(grid_type, buf, child, ijk, acc);
1747
- PNANOVDB_DEREF(level) = 0u;
1748
- }
1749
- else
1750
- {
1751
- value_address = pnanovdb_lower_get_table_address(grid_type, buf, lower, n);
1752
- PNANOVDB_DEREF(level) = 1u;
1753
- }
1754
- return value_address;
1755
- }
1756
-
1757
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_value_address_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
1758
- {
1759
- pnanovdb_uint32_t level;
1760
- return pnanovdb_lower_get_value_address_and_level_and_cache(grid_type, buf, lower, ijk, acc, PNANOVDB_REF(level));
1761
- }
1762
-
1763
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_value_address_and_level_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
1764
- {
1765
- pnanovdb_uint32_t n = pnanovdb_upper_coord_to_offset(ijk);
1766
- pnanovdb_address_t value_address;
1767
- if (pnanovdb_upper_get_child_mask(buf, upper, n))
1768
- {
1769
- pnanovdb_lower_handle_t child = pnanovdb_upper_get_child(grid_type, buf, upper, n);
1770
- PNANOVDB_DEREF(acc).lower = child;
1771
- PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
1772
- value_address = pnanovdb_lower_get_value_address_and_level_and_cache(grid_type, buf, child, ijk, acc, level);
1773
- }
1774
- else
1775
- {
1776
- value_address = pnanovdb_upper_get_table_address(grid_type, buf, upper, n);
1777
- PNANOVDB_DEREF(level) = 2u;
1778
- }
1779
- return value_address;
1780
- }
1781
-
1782
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_value_address_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
1783
- {
1784
- pnanovdb_uint32_t level;
1785
- return pnanovdb_upper_get_value_address_and_level_and_cache(grid_type, buf, upper, ijk, acc, PNANOVDB_REF(level));
1786
- }
1787
-
1788
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address_and_level_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
1789
- {
1790
- pnanovdb_root_tile_handle_t tile = pnanovdb_root_find_tile(grid_type, buf, root, ijk);
1791
- pnanovdb_address_t ret;
1792
- if (pnanovdb_address_is_null(tile.address))
1793
- {
1794
- ret = pnanovdb_address_offset(root.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_off_background));
1795
- PNANOVDB_DEREF(level) = 4u;
1796
- }
1797
- else if (pnanovdb_int64_is_zero(pnanovdb_root_tile_get_child(buf, tile)))
1798
- {
1799
- ret = pnanovdb_address_offset(tile.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_tile_off_value));
1800
- PNANOVDB_DEREF(level) = 3u;
1801
- }
1802
- else
1803
- {
1804
- pnanovdb_upper_handle_t child = pnanovdb_root_get_child(grid_type, buf, root, tile);
1805
- PNANOVDB_DEREF(acc).upper = child;
1806
- PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
1807
- ret = pnanovdb_upper_get_value_address_and_level_and_cache(grid_type, buf, child, ijk, acc, level);
1808
- }
1809
- return ret;
1810
- }
1811
-
1812
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
1813
- {
1814
- pnanovdb_uint32_t level;
1815
- return pnanovdb_root_get_value_address_and_level_and_cache(grid_type, buf, root, ijk, acc, PNANOVDB_REF(level));
1816
- }
1817
-
1818
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_readaccessor_get_value_address_and_level(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
1819
- {
1820
- int dirty = pnanovdb_readaccessor_computedirty(acc, ijk);
1821
-
1822
- pnanovdb_address_t value_address;
1823
- if (pnanovdb_readaccessor_iscached0(acc, dirty))
1824
- {
1825
- value_address = pnanovdb_leaf_get_value_address_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).leaf, ijk, acc);
1826
- PNANOVDB_DEREF(level) = 0u;
1827
- }
1828
- else if (pnanovdb_readaccessor_iscached1(acc, dirty))
1829
- {
1830
- value_address = pnanovdb_lower_get_value_address_and_level_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).lower, ijk, acc, level);
1831
- }
1832
- else if (pnanovdb_readaccessor_iscached2(acc, dirty))
1833
- {
1834
- value_address = pnanovdb_upper_get_value_address_and_level_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).upper, ijk, acc, level);
1835
- }
1836
- else
1837
- {
1838
- value_address = pnanovdb_root_get_value_address_and_level_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).root, ijk, acc, level);
1839
- }
1840
- return value_address;
1841
- }
1842
-
1843
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_readaccessor_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1844
- {
1845
- pnanovdb_uint32_t level;
1846
- return pnanovdb_readaccessor_get_value_address_and_level(grid_type, buf, acc, ijk, PNANOVDB_REF(level));
1847
- }
1848
-
1849
- PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_readaccessor_get_value_address_bit(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_uint32_t) bit_index)
1850
- {
1851
- pnanovdb_uint32_t level;
1852
- pnanovdb_address_t address = pnanovdb_readaccessor_get_value_address_and_level(grid_type, buf, acc, ijk, PNANOVDB_REF(level));
1853
- PNANOVDB_DEREF(bit_index) = level == 0u ? pnanovdb_int32_as_uint32(PNANOVDB_DEREF(ijk).x & 7) : 0u;
1854
- return address;
1855
- }
1856
-
1857
- // ------------------------------------------------ ReadAccessor GetDim -----------------------------------------------------------
1858
-
1859
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_leaf_get_dim_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
1860
- {
1861
- return 1u;
1862
- }
1863
-
1864
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_lower_get_dim_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
1865
- {
1866
- pnanovdb_uint32_t n = pnanovdb_lower_coord_to_offset(ijk);
1867
- pnanovdb_uint32_t ret;
1868
- if (pnanovdb_lower_get_child_mask(buf, lower, n))
1869
- {
1870
- pnanovdb_leaf_handle_t child = pnanovdb_lower_get_child(grid_type, buf, lower, n);
1871
- PNANOVDB_DEREF(acc).leaf = child;
1872
- PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
1873
- ret = pnanovdb_leaf_get_dim_and_cache(grid_type, buf, child, ijk, acc);
1874
- }
1875
- else
1876
- {
1877
- ret = (1u << (3u)); // node 0 dim
1878
- }
1879
- return ret;
1880
- }
1881
-
1882
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_upper_get_dim_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
1883
- {
1884
- pnanovdb_uint32_t n = pnanovdb_upper_coord_to_offset(ijk);
1885
- pnanovdb_uint32_t ret;
1886
- if (pnanovdb_upper_get_child_mask(buf, upper, n))
1887
- {
1888
- pnanovdb_lower_handle_t child = pnanovdb_upper_get_child(grid_type, buf, upper, n);
1889
- PNANOVDB_DEREF(acc).lower = child;
1890
- PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
1891
- ret = pnanovdb_lower_get_dim_and_cache(grid_type, buf, child, ijk, acc);
1892
- }
1893
- else
1894
- {
1895
- ret = (1u << (4u + 3u)); // node 1 dim
1896
- }
1897
- return ret;
1898
- }
1899
-
1900
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_root_get_dim_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
1901
- {
1902
- pnanovdb_root_tile_handle_t tile = pnanovdb_root_find_tile(grid_type, buf, root, ijk);
1903
- pnanovdb_uint32_t ret;
1904
- if (pnanovdb_address_is_null(tile.address))
1905
- {
1906
- ret = 1u << (5u + 4u + 3u); // background, node 2 dim
1907
- }
1908
- else if (pnanovdb_int64_is_zero(pnanovdb_root_tile_get_child(buf, tile)))
1909
- {
1910
- ret = 1u << (5u + 4u + 3u); // tile value, node 2 dim
1911
- }
1912
- else
1913
- {
1914
- pnanovdb_upper_handle_t child = pnanovdb_root_get_child(grid_type, buf, root, tile);
1915
- PNANOVDB_DEREF(acc).upper = child;
1916
- PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
1917
- ret = pnanovdb_upper_get_dim_and_cache(grid_type, buf, child, ijk, acc);
1918
- }
1919
- return ret;
1920
- }
1921
-
1922
- PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_readaccessor_get_dim(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1923
- {
1924
- int dirty = pnanovdb_readaccessor_computedirty(acc, ijk);
1925
-
1926
- pnanovdb_uint32_t dim;
1927
- if (pnanovdb_readaccessor_iscached0(acc, dirty))
1928
- {
1929
- dim = pnanovdb_leaf_get_dim_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).leaf, ijk, acc);
1930
- }
1931
- else if (pnanovdb_readaccessor_iscached1(acc, dirty))
1932
- {
1933
- dim = pnanovdb_lower_get_dim_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).lower, ijk, acc);
1934
- }
1935
- else if (pnanovdb_readaccessor_iscached2(acc, dirty))
1936
- {
1937
- dim = pnanovdb_upper_get_dim_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).upper, ijk, acc);
1938
- }
1939
- else
1940
- {
1941
- dim = pnanovdb_root_get_dim_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).root, ijk, acc);
1942
- }
1943
- return dim;
1944
- }
1945
-
1946
- // ------------------------------------------------ ReadAccessor IsActive -----------------------------------------------------------
1947
-
1948
- PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_is_active_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
1949
- {
1950
- pnanovdb_uint32_t n = pnanovdb_leaf_coord_to_offset(ijk);
1951
- return pnanovdb_leaf_get_value_mask(buf, leaf, n);
1952
- }
1953
-
1954
- PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_lower_is_active_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
1955
- {
1956
- pnanovdb_uint32_t n = pnanovdb_lower_coord_to_offset(ijk);
1957
- pnanovdb_bool_t is_active;
1958
- if (pnanovdb_lower_get_child_mask(buf, lower, n))
1959
- {
1960
- pnanovdb_leaf_handle_t child = pnanovdb_lower_get_child(grid_type, buf, lower, n);
1961
- PNANOVDB_DEREF(acc).leaf = child;
1962
- PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
1963
- is_active = pnanovdb_leaf_is_active_and_cache(grid_type, buf, child, ijk, acc);
1964
- }
1965
- else
1966
- {
1967
- is_active = pnanovdb_lower_get_value_mask(buf, lower, n);
1968
- }
1969
- return is_active;
1970
- }
1971
-
1972
- PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_upper_is_active_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
1973
- {
1974
- pnanovdb_uint32_t n = pnanovdb_upper_coord_to_offset(ijk);
1975
- pnanovdb_bool_t is_active;
1976
- if (pnanovdb_upper_get_child_mask(buf, upper, n))
1977
- {
1978
- pnanovdb_lower_handle_t child = pnanovdb_upper_get_child(grid_type, buf, upper, n);
1979
- PNANOVDB_DEREF(acc).lower = child;
1980
- PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
1981
- is_active = pnanovdb_lower_is_active_and_cache(grid_type, buf, child, ijk, acc);
1982
- }
1983
- else
1984
- {
1985
- is_active = pnanovdb_upper_get_value_mask(buf, upper, n);
1986
- }
1987
- return is_active;
1988
- }
1989
-
1990
- PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_root_is_active_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
1991
- {
1992
- pnanovdb_root_tile_handle_t tile = pnanovdb_root_find_tile(grid_type, buf, root, ijk);
1993
- pnanovdb_bool_t is_active;
1994
- if (pnanovdb_address_is_null(tile.address))
1995
- {
1996
- is_active = PNANOVDB_FALSE; // background
1997
- }
1998
- else if (pnanovdb_int64_is_zero(pnanovdb_root_tile_get_child(buf, tile)))
1999
- {
2000
- pnanovdb_uint32_t state = pnanovdb_root_tile_get_state(buf, tile);
2001
- is_active = state != 0u; // tile value
2002
- }
2003
- else
2004
- {
2005
- pnanovdb_upper_handle_t child = pnanovdb_root_get_child(grid_type, buf, root, tile);
2006
- PNANOVDB_DEREF(acc).upper = child;
2007
- PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
2008
- is_active = pnanovdb_upper_is_active_and_cache(grid_type, buf, child, ijk, acc);
2009
- }
2010
- return is_active;
2011
- }
2012
-
2013
- PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_readaccessor_is_active(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk)
2014
- {
2015
- int dirty = pnanovdb_readaccessor_computedirty(acc, ijk);
2016
-
2017
- pnanovdb_bool_t is_active;
2018
- if (pnanovdb_readaccessor_iscached0(acc, dirty))
2019
- {
2020
- is_active = pnanovdb_leaf_is_active_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).leaf, ijk, acc);
2021
- }
2022
- else if (pnanovdb_readaccessor_iscached1(acc, dirty))
2023
- {
2024
- is_active = pnanovdb_lower_is_active_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).lower, ijk, acc);
2025
- }
2026
- else if (pnanovdb_readaccessor_iscached2(acc, dirty))
2027
- {
2028
- is_active = pnanovdb_upper_is_active_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).upper, ijk, acc);
2029
- }
2030
- else
2031
- {
2032
- is_active = pnanovdb_root_is_active_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).root, ijk, acc);
2033
- }
2034
- return is_active;
2035
- }
2036
-
2037
- // ------------------------------------------------ Map Transforms -----------------------------------------------------------
2038
-
2039
- PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_map_apply(pnanovdb_buf_t buf, pnanovdb_map_handle_t map, PNANOVDB_IN(pnanovdb_vec3_t) src)
2040
- {
2041
- pnanovdb_vec3_t dst;
2042
- float sx = PNANOVDB_DEREF(src).x;
2043
- float sy = PNANOVDB_DEREF(src).y;
2044
- float sz = PNANOVDB_DEREF(src).z;
2045
- dst.x = sx * pnanovdb_map_get_matf(buf, map, 0) + sy * pnanovdb_map_get_matf(buf, map, 1) + sz * pnanovdb_map_get_matf(buf, map, 2) + pnanovdb_map_get_vecf(buf, map, 0);
2046
- dst.y = sx * pnanovdb_map_get_matf(buf, map, 3) + sy * pnanovdb_map_get_matf(buf, map, 4) + sz * pnanovdb_map_get_matf(buf, map, 5) + pnanovdb_map_get_vecf(buf, map, 1);
2047
- dst.z = sx * pnanovdb_map_get_matf(buf, map, 6) + sy * pnanovdb_map_get_matf(buf, map, 7) + sz * pnanovdb_map_get_matf(buf, map, 8) + pnanovdb_map_get_vecf(buf, map, 2);
2048
- return dst;
2049
- }
2050
-
2051
- PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_map_apply_inverse(pnanovdb_buf_t buf, pnanovdb_map_handle_t map, PNANOVDB_IN(pnanovdb_vec3_t) src)
2052
- {
2053
- pnanovdb_vec3_t dst;
2054
- float sx = PNANOVDB_DEREF(src).x - pnanovdb_map_get_vecf(buf, map, 0);
2055
- float sy = PNANOVDB_DEREF(src).y - pnanovdb_map_get_vecf(buf, map, 1);
2056
- float sz = PNANOVDB_DEREF(src).z - pnanovdb_map_get_vecf(buf, map, 2);
2057
- dst.x = sx * pnanovdb_map_get_invmatf(buf, map, 0) + sy * pnanovdb_map_get_invmatf(buf, map, 1) + sz * pnanovdb_map_get_invmatf(buf, map, 2);
2058
- dst.y = sx * pnanovdb_map_get_invmatf(buf, map, 3) + sy * pnanovdb_map_get_invmatf(buf, map, 4) + sz * pnanovdb_map_get_invmatf(buf, map, 5);
2059
- dst.z = sx * pnanovdb_map_get_invmatf(buf, map, 6) + sy * pnanovdb_map_get_invmatf(buf, map, 7) + sz * pnanovdb_map_get_invmatf(buf, map, 8);
2060
- return dst;
2061
- }
2062
-
2063
- PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_map_apply_jacobi(pnanovdb_buf_t buf, pnanovdb_map_handle_t map, PNANOVDB_IN(pnanovdb_vec3_t) src)
2064
- {
2065
- pnanovdb_vec3_t dst;
2066
- float sx = PNANOVDB_DEREF(src).x;
2067
- float sy = PNANOVDB_DEREF(src).y;
2068
- float sz = PNANOVDB_DEREF(src).z;
2069
- dst.x = sx * pnanovdb_map_get_matf(buf, map, 0) + sy * pnanovdb_map_get_matf(buf, map, 1) + sz * pnanovdb_map_get_matf(buf, map, 2);
2070
- dst.y = sx * pnanovdb_map_get_matf(buf, map, 3) + sy * pnanovdb_map_get_matf(buf, map, 4) + sz * pnanovdb_map_get_matf(buf, map, 5);
2071
- dst.z = sx * pnanovdb_map_get_matf(buf, map, 6) + sy * pnanovdb_map_get_matf(buf, map, 7) + sz * pnanovdb_map_get_matf(buf, map, 8);
2072
- return dst;
2073
- }
2074
-
2075
- PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_map_apply_inverse_jacobi(pnanovdb_buf_t buf, pnanovdb_map_handle_t map, PNANOVDB_IN(pnanovdb_vec3_t) src)
2076
- {
2077
- pnanovdb_vec3_t dst;
2078
- float sx = PNANOVDB_DEREF(src).x;
2079
- float sy = PNANOVDB_DEREF(src).y;
2080
- float sz = PNANOVDB_DEREF(src).z;
2081
- dst.x = sx * pnanovdb_map_get_invmatf(buf, map, 0) + sy * pnanovdb_map_get_invmatf(buf, map, 1) + sz * pnanovdb_map_get_invmatf(buf, map, 2);
2082
- dst.y = sx * pnanovdb_map_get_invmatf(buf, map, 3) + sy * pnanovdb_map_get_invmatf(buf, map, 4) + sz * pnanovdb_map_get_invmatf(buf, map, 5);
2083
- dst.z = sx * pnanovdb_map_get_invmatf(buf, map, 6) + sy * pnanovdb_map_get_invmatf(buf, map, 7) + sz * pnanovdb_map_get_invmatf(buf, map, 8);
2084
- return dst;
2085
- }
2086
-
2087
- PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_grid_world_to_indexf(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, PNANOVDB_IN(pnanovdb_vec3_t) src)
2088
- {
2089
- pnanovdb_map_handle_t map = pnanovdb_grid_get_map(buf, grid);
2090
- return pnanovdb_map_apply_inverse(buf, map, src);
2091
- }
2092
-
2093
- PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_grid_index_to_worldf(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, PNANOVDB_IN(pnanovdb_vec3_t) src)
2094
- {
2095
- pnanovdb_map_handle_t map = pnanovdb_grid_get_map(buf, grid);
2096
- return pnanovdb_map_apply(buf, map, src);
2097
- }
2098
-
2099
- PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_grid_world_to_index_dirf(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, PNANOVDB_IN(pnanovdb_vec3_t) src)
2100
- {
2101
- pnanovdb_map_handle_t map = pnanovdb_grid_get_map(buf, grid);
2102
- return pnanovdb_map_apply_inverse_jacobi(buf, map, src);
2103
- }
2104
-
2105
- PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_grid_index_to_world_dirf(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, PNANOVDB_IN(pnanovdb_vec3_t) src)
2106
- {
2107
- pnanovdb_map_handle_t map = pnanovdb_grid_get_map(buf, grid);
2108
- return pnanovdb_map_apply_jacobi(buf, map, src);
2109
- }
2110
-
2111
- // ------------------------------------------------ DitherLUT -----------------------------------------------------------
2112
-
2113
- // This table was generated with
2114
- /**************
2115
-
2116
- static constexpr inline uint32
2117
- SYSwang_inthash(uint32 key)
2118
- {
2119
- // From http://www.concentric.net/~Ttwang/tech/inthash.htm
2120
- key += ~(key << 16);
2121
- key ^= (key >> 5);
2122
- key += (key << 3);
2123
- key ^= (key >> 13);
2124
- key += ~(key << 9);
2125
- key ^= (key >> 17);
2126
- return key;
2127
- }
2128
-
2129
- static void
2130
- ut_initDitherR(float *pattern, float offset,
2131
- int x, int y, int z, int res, int goalres)
2132
- {
2133
- // These offsets are designed to maximize the difference between
2134
- // dither values in nearby voxels within a given 2x2x2 cell, without
2135
- // producing axis-aligned artifacts. The are organized in row-major
2136
- // order.
2137
- static const float theDitherOffset[] = {0,4,6,2,5,1,3,7};
2138
- static const float theScale = 0.125F;
2139
- int key = (((z << res) + y) << res) + x;
2140
-
2141
- if (res == goalres)
2142
- {
2143
- pattern[key] = offset;
2144
- return;
2145
- }
2146
-
2147
- // Randomly flip (on each axis) the dithering patterns used by the
2148
- // subcells. This key is xor'd with the subcell index below before
2149
- // looking up in the dither offset list.
2150
- key = SYSwang_inthash(key) & 7;
2151
-
2152
- x <<= 1;
2153
- y <<= 1;
2154
- z <<= 1;
2155
-
2156
- offset *= theScale;
2157
- for (int i = 0; i < 8; i++)
2158
- ut_initDitherR(pattern, offset+theDitherOffset[i ^ key]*theScale,
2159
- x+(i&1), y+((i&2)>>1), z+((i&4)>>2), res+1, goalres);
2160
- }
2161
-
2162
- // This is a compact algorithm that accomplishes essentially the same thing
2163
- // as ut_initDither() above. We should eventually switch to use this and
2164
- // clean the dead code.
2165
- static fpreal32 *
2166
- ut_initDitherRecursive(int goalres)
2167
- {
2168
- const int nfloat = 1 << (goalres*3);
2169
- float *pattern = new float[nfloat];
2170
- ut_initDitherR(pattern, 1.0F, 0, 0, 0, 0, goalres);
2171
-
2172
- // This has built an even spacing from 1/nfloat to 1.0.
2173
- // however, our dither pattern should be 1/(nfloat+1) to nfloat/(nfloat+1)
2174
- // So we do a correction here. Note that the earlier calculations are
2175
- // done with powers of 2 so are exact, so it does make sense to delay
2176
- // the renormalization to this pass.
2177
- float correctionterm = nfloat / (nfloat+1.0F);
2178
- for (int i = 0; i < nfloat; i++)
2179
- pattern[i] *= correctionterm;
2180
- return pattern;
2181
- }
2182
-
2183
- theDitherMatrix = ut_initDitherRecursive(3);
2184
-
2185
- for (int i = 0; i < 512/8; i ++)
2186
- {
2187
- for (int j = 0; j < 8; j ++)
2188
- std::cout << theDitherMatrix[i*8+j] << "f, ";
2189
- std::cout << std::endl;
2190
- }
2191
-
2192
- **************/
2193
-
2194
- PNANOVDB_STATIC_CONST float pnanovdb_dither_lut[512] =
2195
- {
2196
- 0.14425f, 0.643275f, 0.830409f, 0.331384f, 0.105263f, 0.604289f, 0.167641f, 0.666667f,
2197
- 0.892788f, 0.393762f, 0.0818713f, 0.580897f, 0.853801f, 0.354776f, 0.916179f, 0.417154f,
2198
- 0.612086f, 0.11306f, 0.79922f, 0.300195f, 0.510721f, 0.0116959f, 0.947368f, 0.448343f,
2199
- 0.362573f, 0.861598f, 0.0506823f, 0.549708f, 0.261209f, 0.760234f, 0.19883f, 0.697856f,
2200
- 0.140351f, 0.639376f, 0.576998f, 0.0779727f, 0.522417f, 0.0233918f, 0.460039f, 0.959064f,
2201
- 0.888889f, 0.389864f, 0.327485f, 0.826511f, 0.272904f, 0.77193f, 0.709552f, 0.210526f,
2202
- 0.483431f, 0.982456f, 0.296296f, 0.795322f, 0.116959f, 0.615984f, 0.0545809f, 0.553606f,
2203
- 0.732943f, 0.233918f, 0.545809f, 0.0467836f, 0.865497f, 0.366472f, 0.803119f, 0.304094f,
2204
- 0.518519f, 0.0194932f, 0.45614f, 0.955166f, 0.729045f, 0.230019f, 0.54191f, 0.042885f,
2205
- 0.269006f, 0.768031f, 0.705653f, 0.206628f, 0.479532f, 0.978558f, 0.292398f, 0.791423f,
2206
- 0.237817f, 0.736842f, 0.424951f, 0.923977f, 0.136452f, 0.635478f, 0.323587f, 0.822612f,
2207
- 0.986355f, 0.487329f, 0.674464f, 0.175439f, 0.88499f, 0.385965f, 0.573099f, 0.0740741f,
2208
- 0.51462f, 0.0155945f, 0.202729f, 0.701754f, 0.148148f, 0.647174f, 0.834308f, 0.335283f,
2209
- 0.265107f, 0.764133f, 0.951267f, 0.452242f, 0.896686f, 0.397661f, 0.08577f, 0.584795f,
2210
- 0.8577f, 0.358674f, 0.920078f, 0.421053f, 0.740741f, 0.241715f, 0.678363f, 0.179337f,
2211
- 0.109162f, 0.608187f, 0.17154f, 0.670565f, 0.491228f, 0.990253f, 0.42885f, 0.927875f,
2212
- 0.0662768f, 0.565302f, 0.62768f, 0.128655f, 0.183236f, 0.682261f, 0.744639f, 0.245614f,
2213
- 0.814815f, 0.315789f, 0.378168f, 0.877193f, 0.931774f, 0.432749f, 0.495127f, 0.994152f,
2214
- 0.0350877f, 0.534113f, 0.97076f, 0.471735f, 0.214425f, 0.71345f, 0.526316f, 0.0272904f,
2215
- 0.783626f, 0.2846f, 0.222222f, 0.721248f, 0.962963f, 0.463938f, 0.276803f, 0.775828f,
2216
- 0.966862f, 0.467836f, 0.405458f, 0.904483f, 0.0701754f, 0.569201f, 0.881092f, 0.382066f,
2217
- 0.218324f, 0.717349f, 0.654971f, 0.155945f, 0.818713f, 0.319688f, 0.132554f, 0.631579f,
2218
- 0.0623782f, 0.561404f, 0.748538f, 0.249513f, 0.912281f, 0.413255f, 0.974659f, 0.475634f,
2219
- 0.810916f, 0.311891f, 0.499025f, 0.998051f, 0.163743f, 0.662768f, 0.226121f, 0.725146f,
2220
- 0.690058f, 0.191033f, 0.00389864f, 0.502924f, 0.557505f, 0.0584795f, 0.120858f, 0.619883f,
2221
- 0.440546f, 0.939571f, 0.752437f, 0.253411f, 0.307992f, 0.807018f, 0.869396f, 0.37037f,
2222
- 0.658869f, 0.159844f, 0.346979f, 0.846004f, 0.588694f, 0.0896686f, 0.152047f, 0.651072f,
2223
- 0.409357f, 0.908382f, 0.596491f, 0.0974659f, 0.339181f, 0.838207f, 0.900585f, 0.401559f,
2224
- 0.34308f, 0.842105f, 0.779727f, 0.280702f, 0.693957f, 0.194932f, 0.25731f, 0.756335f,
2225
- 0.592593f, 0.0935673f, 0.0311891f, 0.530214f, 0.444444f, 0.94347f, 0.506823f, 0.00779727f,
2226
- 0.68616f, 0.187135f, 0.124756f, 0.623782f, 0.288499f, 0.787524f, 0.350877f, 0.849903f,
2227
- 0.436647f, 0.935673f, 0.873294f, 0.374269f, 0.538012f, 0.0389864f, 0.60039f, 0.101365f,
2228
- 0.57115f, 0.0721248f, 0.758285f, 0.259259f, 0.719298f, 0.220273f, 0.532164f, 0.0331384f,
2229
- 0.321637f, 0.820663f, 0.00974659f, 0.508772f, 0.469786f, 0.968811f, 0.282651f, 0.781676f,
2230
- 0.539961f, 0.0409357f, 0.727096f, 0.22807f, 0.500975f, 0.00194932f, 0.563353f, 0.0643275f,
2231
- 0.290448f, 0.789474f, 0.477583f, 0.976608f, 0.251462f, 0.750487f, 0.31384f, 0.812865f,
2232
- 0.94152f, 0.442495f, 0.879142f, 0.380117f, 0.37232f, 0.871345f, 0.309942f, 0.808967f,
2233
- 0.192982f, 0.692008f, 0.130604f, 0.62963f, 0.621832f, 0.122807f, 0.559454f, 0.0604289f,
2234
- 0.660819f, 0.161793f, 0.723197f, 0.224172f, 0.403509f, 0.902534f, 0.840156f, 0.341131f,
2235
- 0.411306f, 0.910331f, 0.473684f, 0.97271f, 0.653021f, 0.153996f, 0.0916179f, 0.590643f,
2236
- 0.196881f, 0.695906f, 0.384016f, 0.883041f, 0.0955166f, 0.594542f, 0.157895f, 0.65692f,
2237
- 0.945419f, 0.446394f, 0.633528f, 0.134503f, 0.844055f, 0.345029f, 0.906433f, 0.407407f,
2238
- 0.165692f, 0.664717f, 0.103314f, 0.602339f, 0.126706f, 0.625731f, 0.189084f, 0.688109f,
2239
- 0.91423f, 0.415205f, 0.851852f, 0.352827f, 0.875244f, 0.376218f, 0.937622f, 0.438596f,
2240
- 0.317739f, 0.816764f, 0.255361f, 0.754386f, 0.996101f, 0.497076f, 0.933723f, 0.434698f,
2241
- 0.567251f, 0.0682261f, 0.504873f, 0.00584795f, 0.247563f, 0.746589f, 0.185185f, 0.684211f,
2242
- 0.037037f, 0.536062f, 0.0994152f, 0.598441f, 0.777778f, 0.278752f, 0.465887f, 0.964912f,
2243
- 0.785575f, 0.28655f, 0.847953f, 0.348928f, 0.0292398f, 0.528265f, 0.7154f, 0.216374f,
2244
- 0.39961f, 0.898636f, 0.961014f, 0.461988f, 0.0487329f, 0.547758f, 0.111111f, 0.610136f,
2245
- 0.649123f, 0.150097f, 0.212476f, 0.711501f, 0.797271f, 0.298246f, 0.859649f, 0.360624f,
2246
- 0.118908f, 0.617934f, 0.0565302f, 0.555556f, 0.329435f, 0.82846f, 0.516569f, 0.0175439f,
2247
- 0.867446f, 0.368421f, 0.805068f, 0.306043f, 0.578947f, 0.079922f, 0.267057f, 0.766082f,
2248
- 0.270955f, 0.76998f, 0.707602f, 0.208577f, 0.668616f, 0.169591f, 0.606238f, 0.107212f,
2249
- 0.520468f, 0.0214425f, 0.45809f, 0.957115f, 0.419103f, 0.918129f, 0.356725f, 0.855751f,
2250
- 0.988304f, 0.489279f, 0.426901f, 0.925926f, 0.450292f, 0.949318f, 0.512671f, 0.0136452f,
2251
- 0.239766f, 0.738791f, 0.676413f, 0.177388f, 0.699805f, 0.20078f, 0.263158f, 0.762183f,
2252
- 0.773879f, 0.274854f, 0.337232f, 0.836257f, 0.672515f, 0.173489f, 0.734893f, 0.235867f,
2253
- 0.0253411f, 0.524366f, 0.586745f, 0.0877193f, 0.423002f, 0.922027f, 0.48538f, 0.984405f,
2254
- 0.74269f, 0.243665f, 0.680312f, 0.181287f, 0.953216f, 0.454191f, 0.1423f, 0.641326f,
2255
- 0.493177f, 0.992203f, 0.430799f, 0.929825f, 0.204678f, 0.703704f, 0.890838f, 0.391813f,
2256
- 0.894737f, 0.395712f, 0.0838207f, 0.582846f, 0.0448343f, 0.54386f, 0.231969f, 0.730994f,
2257
- 0.146199f, 0.645224f, 0.832359f, 0.333333f, 0.793372f, 0.294347f, 0.980507f, 0.481481f,
2258
- 0.364522f, 0.863548f, 0.80117f, 0.302144f, 0.824561f, 0.325536f, 0.138402f, 0.637427f,
2259
- 0.614035f, 0.11501f, 0.0526316f, 0.551657f, 0.0760234f, 0.575049f, 0.88694f, 0.387914f,
2260
- };
2261
-
2262
- PNANOVDB_FORCE_INLINE float pnanovdb_dither_lookup(pnanovdb_bool_t enabled, int offset)
2263
- {
2264
- return enabled ? pnanovdb_dither_lut[offset & 511] : 0.5f;
2265
- }
2266
-
2267
- // ------------------------------------------------ HDDA -----------------------------------------------------------
2268
-
2269
- #ifdef PNANOVDB_HDDA
2270
-
2271
- // Comment out to disable this explicit round-off check
2272
- #define PNANOVDB_ENFORCE_FORWARD_STEPPING
2273
-
2274
- #define PNANOVDB_HDDA_FLOAT_MAX 1e38f
2275
-
2276
- struct pnanovdb_hdda_t
2277
- {
2278
- pnanovdb_int32_t dim;
2279
- float tmin;
2280
- float tmax;
2281
- pnanovdb_coord_t voxel;
2282
- pnanovdb_coord_t step;
2283
- pnanovdb_vec3_t delta;
2284
- pnanovdb_vec3_t next;
2285
- };
2286
- PNANOVDB_STRUCT_TYPEDEF(pnanovdb_hdda_t)
2287
-
2288
- PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_hdda_pos_to_ijk(PNANOVDB_IN(pnanovdb_vec3_t) pos)
2289
- {
2290
- pnanovdb_coord_t voxel;
2291
- voxel.x = pnanovdb_float_to_int32(pnanovdb_floor(PNANOVDB_DEREF(pos).x));
2292
- voxel.y = pnanovdb_float_to_int32(pnanovdb_floor(PNANOVDB_DEREF(pos).y));
2293
- voxel.z = pnanovdb_float_to_int32(pnanovdb_floor(PNANOVDB_DEREF(pos).z));
2294
- return voxel;
2295
- }
2296
-
2297
- PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_hdda_pos_to_voxel(PNANOVDB_IN(pnanovdb_vec3_t) pos, int dim)
2298
- {
2299
- pnanovdb_coord_t voxel;
2300
- voxel.x = pnanovdb_float_to_int32(pnanovdb_floor(PNANOVDB_DEREF(pos).x)) & (~(dim - 1));
2301
- voxel.y = pnanovdb_float_to_int32(pnanovdb_floor(PNANOVDB_DEREF(pos).y)) & (~(dim - 1));
2302
- voxel.z = pnanovdb_float_to_int32(pnanovdb_floor(PNANOVDB_DEREF(pos).z)) & (~(dim - 1));
2303
- return voxel;
2304
- }
2305
-
2306
- PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_hdda_ray_start(PNANOVDB_IN(pnanovdb_vec3_t) origin, float tmin, PNANOVDB_IN(pnanovdb_vec3_t) direction)
2307
- {
2308
- pnanovdb_vec3_t pos = pnanovdb_vec3_add(
2309
- pnanovdb_vec3_mul(PNANOVDB_DEREF(direction), pnanovdb_vec3_uniform(tmin)),
2310
- PNANOVDB_DEREF(origin)
2311
- );
2312
- return pos;
2313
- }
2314
-
2315
- PNANOVDB_FORCE_INLINE void pnanovdb_hdda_init(PNANOVDB_INOUT(pnanovdb_hdda_t) hdda, PNANOVDB_IN(pnanovdb_vec3_t) origin, float tmin, PNANOVDB_IN(pnanovdb_vec3_t) direction, float tmax, int dim)
2316
- {
2317
- PNANOVDB_DEREF(hdda).dim = dim;
2318
- PNANOVDB_DEREF(hdda).tmin = tmin;
2319
- PNANOVDB_DEREF(hdda).tmax = tmax;
2320
-
2321
- pnanovdb_vec3_t pos = pnanovdb_hdda_ray_start(origin, tmin, direction);
2322
- pnanovdb_vec3_t dir_inv = pnanovdb_vec3_div(pnanovdb_vec3_uniform(1.f), PNANOVDB_DEREF(direction));
2323
-
2324
- PNANOVDB_DEREF(hdda).voxel = pnanovdb_hdda_pos_to_voxel(PNANOVDB_REF(pos), dim);
2325
-
2326
- // x
2327
- if (PNANOVDB_DEREF(direction).x == 0.f)
2328
- {
2329
- PNANOVDB_DEREF(hdda).next.x = PNANOVDB_HDDA_FLOAT_MAX;
2330
- PNANOVDB_DEREF(hdda).step.x = 0;
2331
- PNANOVDB_DEREF(hdda).delta.x = 0.f;
2332
- }
2333
- else if (dir_inv.x > 0.f)
2334
- {
2335
- PNANOVDB_DEREF(hdda).step.x = 1;
2336
- PNANOVDB_DEREF(hdda).next.x = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.x + dim - pos.x) * dir_inv.x;
2337
- PNANOVDB_DEREF(hdda).delta.x = dir_inv.x;
2338
- }
2339
- else
2340
- {
2341
- PNANOVDB_DEREF(hdda).step.x = -1;
2342
- PNANOVDB_DEREF(hdda).next.x = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.x - pos.x) * dir_inv.x;
2343
- PNANOVDB_DEREF(hdda).delta.x = -dir_inv.x;
2344
- }
2345
-
2346
- // y
2347
- if (PNANOVDB_DEREF(direction).y == 0.f)
2348
- {
2349
- PNANOVDB_DEREF(hdda).next.y = PNANOVDB_HDDA_FLOAT_MAX;
2350
- PNANOVDB_DEREF(hdda).step.y = 0;
2351
- PNANOVDB_DEREF(hdda).delta.y = 0.f;
2352
- }
2353
- else if (dir_inv.y > 0.f)
2354
- {
2355
- PNANOVDB_DEREF(hdda).step.y = 1;
2356
- PNANOVDB_DEREF(hdda).next.y = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.y + dim - pos.y) * dir_inv.y;
2357
- PNANOVDB_DEREF(hdda).delta.y = dir_inv.y;
2358
- }
2359
- else
2360
- {
2361
- PNANOVDB_DEREF(hdda).step.y = -1;
2362
- PNANOVDB_DEREF(hdda).next.y = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.y - pos.y) * dir_inv.y;
2363
- PNANOVDB_DEREF(hdda).delta.y = -dir_inv.y;
2364
- }
2365
-
2366
- // z
2367
- if (PNANOVDB_DEREF(direction).z == 0.f)
2368
- {
2369
- PNANOVDB_DEREF(hdda).next.z = PNANOVDB_HDDA_FLOAT_MAX;
2370
- PNANOVDB_DEREF(hdda).step.z = 0;
2371
- PNANOVDB_DEREF(hdda).delta.z = 0.f;
2372
- }
2373
- else if (dir_inv.z > 0.f)
2374
- {
2375
- PNANOVDB_DEREF(hdda).step.z = 1;
2376
- PNANOVDB_DEREF(hdda).next.z = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.z + dim - pos.z) * dir_inv.z;
2377
- PNANOVDB_DEREF(hdda).delta.z = dir_inv.z;
2378
- }
2379
- else
2380
- {
2381
- PNANOVDB_DEREF(hdda).step.z = -1;
2382
- PNANOVDB_DEREF(hdda).next.z = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.z - pos.z) * dir_inv.z;
2383
- PNANOVDB_DEREF(hdda).delta.z = -dir_inv.z;
2384
- }
2385
- }
2386
-
2387
- PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_hdda_update(PNANOVDB_INOUT(pnanovdb_hdda_t) hdda, PNANOVDB_IN(pnanovdb_vec3_t) origin, PNANOVDB_IN(pnanovdb_vec3_t) direction, int dim)
2388
- {
2389
- if (PNANOVDB_DEREF(hdda).dim == dim)
2390
- {
2391
- return PNANOVDB_FALSE;
2392
- }
2393
- PNANOVDB_DEREF(hdda).dim = dim;
2394
-
2395
- pnanovdb_vec3_t pos = pnanovdb_vec3_add(
2396
- pnanovdb_vec3_mul(PNANOVDB_DEREF(direction), pnanovdb_vec3_uniform(PNANOVDB_DEREF(hdda).tmin)),
2397
- PNANOVDB_DEREF(origin)
2398
- );
2399
- pnanovdb_vec3_t dir_inv = pnanovdb_vec3_div(pnanovdb_vec3_uniform(1.f), PNANOVDB_DEREF(direction));
2400
-
2401
- PNANOVDB_DEREF(hdda).voxel = pnanovdb_hdda_pos_to_voxel(PNANOVDB_REF(pos), dim);
2402
-
2403
- if (PNANOVDB_DEREF(hdda).step.x != 0)
2404
- {
2405
- PNANOVDB_DEREF(hdda).next.x = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.x - pos.x) * dir_inv.x;
2406
- if (PNANOVDB_DEREF(hdda).step.x > 0)
2407
- {
2408
- PNANOVDB_DEREF(hdda).next.x += dim * dir_inv.x;
2409
- }
2410
- }
2411
- if (PNANOVDB_DEREF(hdda).step.y != 0)
2412
- {
2413
- PNANOVDB_DEREF(hdda).next.y = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.y - pos.y) * dir_inv.y;
2414
- if (PNANOVDB_DEREF(hdda).step.y > 0)
2415
- {
2416
- PNANOVDB_DEREF(hdda).next.y += dim * dir_inv.y;
2417
- }
2418
- }
2419
- if (PNANOVDB_DEREF(hdda).step.z != 0)
2420
- {
2421
- PNANOVDB_DEREF(hdda).next.z = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.z - pos.z) * dir_inv.z;
2422
- if (PNANOVDB_DEREF(hdda).step.z > 0)
2423
- {
2424
- PNANOVDB_DEREF(hdda).next.z += dim * dir_inv.z;
2425
- }
2426
- }
2427
-
2428
- return PNANOVDB_TRUE;
2429
- }
2430
-
2431
- PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_hdda_step(PNANOVDB_INOUT(pnanovdb_hdda_t) hdda)
2432
- {
2433
- pnanovdb_bool_t ret;
2434
- if (PNANOVDB_DEREF(hdda).next.x < PNANOVDB_DEREF(hdda).next.y && PNANOVDB_DEREF(hdda).next.x < PNANOVDB_DEREF(hdda).next.z)
2435
- {
2436
- #ifdef PNANOVDB_ENFORCE_FORWARD_STEPPING
2437
- if (PNANOVDB_DEREF(hdda).next.x <= PNANOVDB_DEREF(hdda).tmin)
2438
- {
2439
- PNANOVDB_DEREF(hdda).next.x += PNANOVDB_DEREF(hdda).tmin - 0.999999f * PNANOVDB_DEREF(hdda).next.x + 1.0e-6f;
2440
- }
2441
- #endif
2442
- PNANOVDB_DEREF(hdda).tmin = PNANOVDB_DEREF(hdda).next.x;
2443
- PNANOVDB_DEREF(hdda).next.x += PNANOVDB_DEREF(hdda).dim * PNANOVDB_DEREF(hdda).delta.x;
2444
- PNANOVDB_DEREF(hdda).voxel.x += PNANOVDB_DEREF(hdda).dim * PNANOVDB_DEREF(hdda).step.x;
2445
- ret = PNANOVDB_DEREF(hdda).tmin <= PNANOVDB_DEREF(hdda).tmax;
2446
- }
2447
- else if (PNANOVDB_DEREF(hdda).next.y < PNANOVDB_DEREF(hdda).next.z)
2448
- {
2449
- #ifdef PNANOVDB_ENFORCE_FORWARD_STEPPING
2450
- if (PNANOVDB_DEREF(hdda).next.y <= PNANOVDB_DEREF(hdda).tmin)
2451
- {
2452
- PNANOVDB_DEREF(hdda).next.y += PNANOVDB_DEREF(hdda).tmin - 0.999999f * PNANOVDB_DEREF(hdda).next.y + 1.0e-6f;
2453
- }
2454
- #endif
2455
- PNANOVDB_DEREF(hdda).tmin = PNANOVDB_DEREF(hdda).next.y;
2456
- PNANOVDB_DEREF(hdda).next.y += PNANOVDB_DEREF(hdda).dim * PNANOVDB_DEREF(hdda).delta.y;
2457
- PNANOVDB_DEREF(hdda).voxel.y += PNANOVDB_DEREF(hdda).dim * PNANOVDB_DEREF(hdda).step.y;
2458
- ret = PNANOVDB_DEREF(hdda).tmin <= PNANOVDB_DEREF(hdda).tmax;
2459
- }
2460
- else
2461
- {
2462
- #ifdef PNANOVDB_ENFORCE_FORWARD_STEPPING
2463
- if (PNANOVDB_DEREF(hdda).next.z <= PNANOVDB_DEREF(hdda).tmin)
2464
- {
2465
- PNANOVDB_DEREF(hdda).next.z += PNANOVDB_DEREF(hdda).tmin - 0.999999f * PNANOVDB_DEREF(hdda).next.z + 1.0e-6f;
2466
- }
2467
- #endif
2468
- PNANOVDB_DEREF(hdda).tmin = PNANOVDB_DEREF(hdda).next.z;
2469
- PNANOVDB_DEREF(hdda).next.z += PNANOVDB_DEREF(hdda).dim * PNANOVDB_DEREF(hdda).delta.z;
2470
- PNANOVDB_DEREF(hdda).voxel.z += PNANOVDB_DEREF(hdda).dim * PNANOVDB_DEREF(hdda).step.z;
2471
- ret = PNANOVDB_DEREF(hdda).tmin <= PNANOVDB_DEREF(hdda).tmax;
2472
- }
2473
- return ret;
2474
- }
2475
-
2476
- PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_hdda_ray_clip(
2477
- PNANOVDB_IN(pnanovdb_vec3_t) bbox_min,
2478
- PNANOVDB_IN(pnanovdb_vec3_t) bbox_max,
2479
- PNANOVDB_IN(pnanovdb_vec3_t) origin, PNANOVDB_INOUT(float) tmin,
2480
- PNANOVDB_IN(pnanovdb_vec3_t) direction, PNANOVDB_INOUT(float) tmax
2481
- )
2482
- {
2483
- pnanovdb_vec3_t dir_inv = pnanovdb_vec3_div(pnanovdb_vec3_uniform(1.f), PNANOVDB_DEREF(direction));
2484
- pnanovdb_vec3_t t0 = pnanovdb_vec3_mul(pnanovdb_vec3_sub(PNANOVDB_DEREF(bbox_min), PNANOVDB_DEREF(origin)), dir_inv);
2485
- pnanovdb_vec3_t t1 = pnanovdb_vec3_mul(pnanovdb_vec3_sub(PNANOVDB_DEREF(bbox_max), PNANOVDB_DEREF(origin)), dir_inv);
2486
- pnanovdb_vec3_t tmin3 = pnanovdb_vec3_min(t0, t1);
2487
- pnanovdb_vec3_t tmax3 = pnanovdb_vec3_max(t0, t1);
2488
- float tnear = pnanovdb_max(tmin3.x, pnanovdb_max(tmin3.y, tmin3.z));
2489
- float tfar = pnanovdb_min(tmax3.x, pnanovdb_min(tmax3.y, tmax3.z));
2490
- pnanovdb_bool_t hit = tnear <= tfar;
2491
- PNANOVDB_DEREF(tmin) = pnanovdb_max(PNANOVDB_DEREF(tmin), tnear);
2492
- PNANOVDB_DEREF(tmax) = pnanovdb_min(PNANOVDB_DEREF(tmax), tfar);
2493
- return hit;
2494
- }
2495
-
2496
- PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_hdda_zero_crossing(
2497
- pnanovdb_grid_type_t grid_type,
2498
- pnanovdb_buf_t buf,
2499
- PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc,
2500
- PNANOVDB_IN(pnanovdb_vec3_t) origin, float tmin,
2501
- PNANOVDB_IN(pnanovdb_vec3_t) direction, float tmax,
2502
- PNANOVDB_INOUT(float) thit,
2503
- PNANOVDB_INOUT(float) v
2504
- )
2505
- {
2506
- pnanovdb_coord_t bbox_min = pnanovdb_root_get_bbox_min(buf, PNANOVDB_DEREF(acc).root);
2507
- pnanovdb_coord_t bbox_max = pnanovdb_root_get_bbox_max(buf, PNANOVDB_DEREF(acc).root);
2508
- pnanovdb_vec3_t bbox_minf = pnanovdb_coord_to_vec3(bbox_min);
2509
- pnanovdb_vec3_t bbox_maxf = pnanovdb_coord_to_vec3(pnanovdb_coord_add(bbox_max, pnanovdb_coord_uniform(1)));
2510
-
2511
- pnanovdb_bool_t hit = pnanovdb_hdda_ray_clip(PNANOVDB_REF(bbox_minf), PNANOVDB_REF(bbox_maxf), origin, PNANOVDB_REF(tmin), direction, PNANOVDB_REF(tmax));
2512
- if (!hit || tmax > 1.0e20f)
2513
- {
2514
- return PNANOVDB_FALSE;
2515
- }
2516
-
2517
- pnanovdb_vec3_t pos = pnanovdb_hdda_ray_start(origin, tmin, direction);
2518
- pnanovdb_coord_t ijk = pnanovdb_hdda_pos_to_ijk(PNANOVDB_REF(pos));
2519
-
2520
- pnanovdb_address_t address = pnanovdb_readaccessor_get_value_address(PNANOVDB_GRID_TYPE_FLOAT, buf, acc, PNANOVDB_REF(ijk));
2521
- float v0 = pnanovdb_read_float(buf, address);
2522
-
2523
- pnanovdb_int32_t dim = pnanovdb_uint32_as_int32(pnanovdb_readaccessor_get_dim(PNANOVDB_GRID_TYPE_FLOAT, buf, acc, PNANOVDB_REF(ijk)));
2524
- pnanovdb_hdda_t hdda;
2525
- pnanovdb_hdda_init(PNANOVDB_REF(hdda), origin, tmin, direction, tmax, dim);
2526
- while (pnanovdb_hdda_step(PNANOVDB_REF(hdda)))
2527
- {
2528
- pnanovdb_vec3_t pos_start = pnanovdb_hdda_ray_start(origin, hdda.tmin + 1.0001f, direction);
2529
- ijk = pnanovdb_hdda_pos_to_ijk(PNANOVDB_REF(pos_start));
2530
- dim = pnanovdb_uint32_as_int32(pnanovdb_readaccessor_get_dim(PNANOVDB_GRID_TYPE_FLOAT, buf, acc, PNANOVDB_REF(ijk)));
2531
- pnanovdb_hdda_update(PNANOVDB_REF(hdda), origin, direction, dim);
2532
- if (hdda.dim > 1 || !pnanovdb_readaccessor_is_active(grid_type, buf, acc, PNANOVDB_REF(ijk)))
2533
- {
2534
- continue;
2535
- }
2536
- while (pnanovdb_hdda_step(PNANOVDB_REF(hdda)) && pnanovdb_readaccessor_is_active(grid_type, buf, acc, PNANOVDB_REF(hdda.voxel)))
2537
- {
2538
- ijk = hdda.voxel;
2539
- pnanovdb_address_t address = pnanovdb_readaccessor_get_value_address(PNANOVDB_GRID_TYPE_FLOAT, buf, acc, PNANOVDB_REF(ijk));
2540
- PNANOVDB_DEREF(v) = pnanovdb_read_float(buf, address);
2541
- if (PNANOVDB_DEREF(v) * v0 < 0.f)
2542
- {
2543
- PNANOVDB_DEREF(thit) = hdda.tmin;
2544
- return PNANOVDB_TRUE;
2545
- }
2546
- }
2547
- }
2548
- return PNANOVDB_FALSE;
2549
- }
2550
-
2551
- #endif
2552
-
2553
- #endif // end of NANOVDB_PNANOVDB_H_HAS_BEEN_INCLUDED
1
+
2
+ // Copyright Contributors to the OpenVDB Project
3
+ // SPDX-License-Identifier: MPL-2.0
4
+
5
+ /*!
6
+ \file PNanoVDB.h
7
+
8
+ \author Andrew Reidmeyer
9
+
10
+ \brief This file is a portable (e.g. pointer-less) C99/GLSL/HLSL port
11
+ of NanoVDB.h, which is compatible with most graphics APIs.
12
+ */
13
+
14
+ #ifndef NANOVDB_PNANOVDB_H_HAS_BEEN_INCLUDED
15
+ #define NANOVDB_PNANOVDB_H_HAS_BEEN_INCLUDED
16
+
17
+ // ------------------------------------------------ Configuration -----------------------------------------------------------
18
+
19
+ // platforms
20
+ //#define PNANOVDB_C
21
+ //#define PNANOVDB_HLSL
22
+ //#define PNANOVDB_GLSL
23
+
24
+ // addressing mode
25
+ // PNANOVDB_ADDRESS_32
26
+ // PNANOVDB_ADDRESS_64
27
+ #if defined(PNANOVDB_C)
28
+ #ifndef PNANOVDB_ADDRESS_32
29
+ #define PNANOVDB_ADDRESS_64
30
+ #endif
31
+ #elif defined(PNANOVDB_HLSL)
32
+ #ifndef PNANOVDB_ADDRESS_64
33
+ #define PNANOVDB_ADDRESS_32
34
+ #endif
35
+ #elif defined(PNANOVDB_GLSL)
36
+ #ifndef PNANOVDB_ADDRESS_64
37
+ #define PNANOVDB_ADDRESS_32
38
+ #endif
39
+ #endif
40
+
41
+ // bounds checking
42
+ //#define PNANOVDB_BUF_BOUNDS_CHECK
43
+
44
+ // enable HDDA by default on HLSL/GLSL, make explicit on C
45
+ #if defined(PNANOVDB_C)
46
+ //#define PNANOVDB_HDDA
47
+ #ifdef PNANOVDB_HDDA
48
+ #ifndef PNANOVDB_CMATH
49
+ #define PNANOVDB_CMATH
50
+ #endif
51
+ #endif
52
+ #elif defined(PNANOVDB_HLSL)
53
+ #define PNANOVDB_HDDA
54
+ #elif defined(PNANOVDB_GLSL)
55
+ #define PNANOVDB_HDDA
56
+ #endif
57
+
58
+ #ifdef PNANOVDB_CMATH
59
+ #include <math.h>
60
+ #endif
61
+
62
+ // ------------------------------------------------ Buffer -----------------------------------------------------------
63
+
64
+ #if defined(PNANOVDB_BUF_CUSTOM)
65
+ // NOP
66
+ #elif defined(PNANOVDB_C)
67
+ #define PNANOVDB_BUF_C
68
+ #elif defined(PNANOVDB_HLSL)
69
+ #define PNANOVDB_BUF_HLSL
70
+ #elif defined(PNANOVDB_GLSL)
71
+ #define PNANOVDB_BUF_GLSL
72
+ #endif
73
+
74
+ #if defined(PNANOVDB_BUF_C)
75
+ // #include <stdint.h>
76
+ #if !defined(_STDINT) && !defined(__GNUC__)
77
+ //typedef signed char int8_t;
78
+ //typedef signed short int16_t;
79
+ typedef signed int int32_t;
80
+ typedef signed long long int64_t;
81
+ //typedef signed char int_fast8_t;
82
+ //typedef signed short int_fast16_t;
83
+ //typedef signed int int_fast32_t;
84
+ //typedef signed long long int_fast64_t;
85
+ //typedef signed char int_least8_t;
86
+ //typedef signed short int_least16_t;
87
+ //typedef signed int int_least32_t;
88
+ //typedef signed long long int_least64_t;
89
+ //typedef signed long long intmax_t;
90
+ //typedef signed long intptr_t;
91
+ //typedef unsigned char uint8_t;
92
+ //typedef unsigned short uint16_t;
93
+ typedef unsigned int uint32_t;
94
+ typedef unsigned long long uint64_t;
95
+ //typedef unsigned char uint_fast8_t;
96
+ //typedef unsigned short uint_fast16_t;
97
+ //typedef unsigned int uint_fast32_t;
98
+ //typedef unsigned long long uint_fast64_t;
99
+ //typedef unsigned char uint_least8_t;
100
+ //typedef unsigned short uint_least16_t;
101
+ //typedef unsigned int uint_least32_t;
102
+ //typedef unsigned long long uint_least64_t;
103
+ //typedef unsigned long long uintmax_t;
104
+ #endif
105
+ #if defined(__CUDACC__)
106
+ #define PNANOVDB_BUF_FORCE_INLINE __host__ __device__ static __forceinline__
107
+ #elif defined(_WIN32)
108
+ #define PNANOVDB_BUF_FORCE_INLINE static inline __forceinline
109
+ #else
110
+ #define PNANOVDB_BUF_FORCE_INLINE static inline __attribute__((always_inline))
111
+ #endif
112
+ typedef struct pnanovdb_buf_t
113
+ {
114
+ uint32_t* data;
115
+ #ifdef PNANOVDB_BUF_BOUNDS_CHECK
116
+ uint64_t size_in_words;
117
+ #endif
118
+ }pnanovdb_buf_t;
119
+ PNANOVDB_BUF_FORCE_INLINE pnanovdb_buf_t pnanovdb_make_buf(uint32_t* data, uint64_t size_in_words)
120
+ {
121
+ pnanovdb_buf_t ret;
122
+ ret.data = data;
123
+ #ifdef PNANOVDB_BUF_BOUNDS_CHECK
124
+ ret.size_in_words = size_in_words;
125
+ #endif
126
+ return ret;
127
+ }
128
+ #if defined(PNANOVDB_ADDRESS_32)
129
+ PNANOVDB_BUF_FORCE_INLINE uint32_t pnanovdb_buf_read_uint32(pnanovdb_buf_t buf, uint32_t byte_offset)
130
+ {
131
+ uint32_t wordaddress = (byte_offset >> 2u);
132
+ #ifdef PNANOVDB_BUF_BOUNDS_CHECK
133
+ return wordaddress < buf.size_in_words ? buf.data[wordaddress] : 0u;
134
+ #else
135
+ return buf.data[wordaddress];
136
+ #endif
137
+ }
138
+ PNANOVDB_BUF_FORCE_INLINE uint64_t pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint32_t byte_offset)
139
+ {
140
+ uint64_t* data64 = (uint64_t*)buf.data;
141
+ uint32_t wordaddress64 = (byte_offset >> 3u);
142
+ #ifdef PNANOVDB_BUF_BOUNDS_CHECK
143
+ uint64_t size_in_words64 = buf.size_in_words >> 1u;
144
+ return wordaddress64 < size_in_words64 ? data64[wordaddress64] : 0llu;
145
+ #else
146
+ return data64[wordaddress64];
147
+ #endif
148
+ }
149
+ #elif defined(PNANOVDB_ADDRESS_64)
150
+ PNANOVDB_BUF_FORCE_INLINE uint32_t pnanovdb_buf_read_uint32(pnanovdb_buf_t buf, uint64_t byte_offset)
151
+ {
152
+ uint64_t wordaddress = (byte_offset >> 2u);
153
+ #ifdef PNANOVDB_BUF_BOUNDS_CHECK
154
+ return wordaddress < buf.size_in_words ? buf.data[wordaddress] : 0u;
155
+ #else
156
+ return buf.data[wordaddress];
157
+ #endif
158
+ }
159
+ PNANOVDB_BUF_FORCE_INLINE uint64_t pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint64_t byte_offset)
160
+ {
161
+ uint64_t* data64 = (uint64_t*)buf.data;
162
+ uint64_t wordaddress64 = (byte_offset >> 3u);
163
+ #ifdef PNANOVDB_BUF_BOUNDS_CHECK
164
+ uint64_t size_in_words64 = buf.size_in_words >> 1u;
165
+ return wordaddress64 < size_in_words64 ? data64[wordaddress64] : 0llu;
166
+ #else
167
+ return data64[wordaddress64];
168
+ #endif
169
+ }
170
+ #endif
171
+ typedef uint32_t pnanovdb_grid_type_t;
172
+ #define PNANOVDB_GRID_TYPE_GET(grid_typeIn, nameIn) pnanovdb_grid_type_constants[grid_typeIn].nameIn
173
+ #elif defined(PNANOVDB_BUF_HLSL)
174
+ #if defined(PNANOVDB_ADDRESS_32)
175
+ #define pnanovdb_buf_t StructuredBuffer<uint>
176
+ uint pnanovdb_buf_read_uint32(pnanovdb_buf_t buf, uint byte_offset)
177
+ {
178
+ return buf[(byte_offset >> 2u)];
179
+ }
180
+ uint2 pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint byte_offset)
181
+ {
182
+ uint2 ret;
183
+ ret.x = pnanovdb_buf_read_uint32(buf, byte_offset + 0u);
184
+ ret.y = pnanovdb_buf_read_uint32(buf, byte_offset + 4u);
185
+ return ret;
186
+ }
187
+ #elif defined(PNANOVDB_ADDRESS_64)
188
+ #define pnanovdb_buf_t StructuredBuffer<uint>
189
+ uint pnanovdb_buf_read_uint32(pnanovdb_buf_t buf, uint64_t byte_offset)
190
+ {
191
+ return buf[uint(byte_offset >> 2u)];
192
+ }
193
+ uint64_t pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint64_t byte_offset)
194
+ {
195
+ uint64_t ret;
196
+ ret = pnanovdb_buf_read_uint32(buf, byte_offset + 0u);
197
+ ret = ret + (uint64_t(pnanovdb_buf_read_uint32(buf, byte_offset + 4u)) << 32u);
198
+ return ret;
199
+ }
200
+ #endif
201
+ #define pnanovdb_grid_type_t uint
202
+ #define PNANOVDB_GRID_TYPE_GET(grid_typeIn, nameIn) pnanovdb_grid_type_constants[grid_typeIn].nameIn
203
+ #elif defined(PNANOVDB_BUF_GLSL)
204
+ struct pnanovdb_buf_t
205
+ {
206
+ uint unused; // to satisfy min struct size?
207
+ };
208
+ uint pnanovdb_buf_read_uint32(pnanovdb_buf_t buf, uint byte_offset)
209
+ {
210
+ return pnanovdb_buf_data[(byte_offset >> 2u)];
211
+ }
212
+ uvec2 pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint byte_offset)
213
+ {
214
+ uvec2 ret;
215
+ ret.x = pnanovdb_buf_read_uint32(buf, byte_offset + 0u);
216
+ ret.y = pnanovdb_buf_read_uint32(buf, byte_offset + 4u);
217
+ return ret;
218
+ }
219
+ #define pnanovdb_grid_type_t uint
220
+ #define PNANOVDB_GRID_TYPE_GET(grid_typeIn, nameIn) pnanovdb_grid_type_constants[grid_typeIn].nameIn
221
+ #endif
222
+
223
+ // ------------------------------------------------ Basic Types -----------------------------------------------------------
224
+
225
+ // force inline
226
+ #if defined(PNANOVDB_C)
227
+ #if defined(__CUDACC__)
228
+ #define PNANOVDB_FORCE_INLINE __host__ __device__ static __forceinline__
229
+ #elif defined(_WIN32)
230
+ #define PNANOVDB_FORCE_INLINE static inline __forceinline
231
+ #else
232
+ #define PNANOVDB_FORCE_INLINE static inline __attribute__((always_inline))
233
+ #endif
234
+ #elif defined(PNANOVDB_HLSL)
235
+ #define PNANOVDB_FORCE_INLINE
236
+ #elif defined(PNANOVDB_GLSL)
237
+ #define PNANOVDB_FORCE_INLINE
238
+ #endif
239
+
240
+ // struct typedef, static const, inout
241
+ #if defined(PNANOVDB_C)
242
+ #define PNANOVDB_STRUCT_TYPEDEF(X) typedef struct X X;
243
+ #define PNANOVDB_STATIC_CONST static const
244
+ #define PNANOVDB_INOUT(X) X*
245
+ #define PNANOVDB_IN(X) const X*
246
+ #define PNANOVDB_DEREF(X) (*X)
247
+ #define PNANOVDB_REF(X) &X
248
+ #elif defined(PNANOVDB_HLSL)
249
+ #define PNANOVDB_STRUCT_TYPEDEF(X)
250
+ #define PNANOVDB_STATIC_CONST static const
251
+ #define PNANOVDB_INOUT(X) inout X
252
+ #define PNANOVDB_IN(X) X
253
+ #define PNANOVDB_DEREF(X) X
254
+ #define PNANOVDB_REF(X) X
255
+ #elif defined(PNANOVDB_GLSL)
256
+ #define PNANOVDB_STRUCT_TYPEDEF(X)
257
+ #define PNANOVDB_STATIC_CONST const
258
+ #define PNANOVDB_INOUT(X) inout X
259
+ #define PNANOVDB_IN(X) X
260
+ #define PNANOVDB_DEREF(X) X
261
+ #define PNANOVDB_REF(X) X
262
+ #endif
263
+
264
+ // basic types, type conversion
265
+ #if defined(PNANOVDB_C)
266
+ #define PNANOVDB_NATIVE_64
267
+ // #include <stdint.h>
268
+ #if !defined(PNANOVDB_MEMCPY_CUSTOM)
269
+ #include <string.h>
270
+ #define pnanovdb_memcpy memcpy
271
+ #endif
272
+ typedef uint32_t pnanovdb_uint32_t;
273
+ typedef int32_t pnanovdb_int32_t;
274
+ typedef int32_t pnanovdb_bool_t;
275
+ #define PNANOVDB_FALSE 0
276
+ #define PNANOVDB_TRUE 1
277
+ typedef uint64_t pnanovdb_uint64_t;
278
+ typedef int64_t pnanovdb_int64_t;
279
+ typedef struct pnanovdb_coord_t
280
+ {
281
+ pnanovdb_int32_t x, y, z;
282
+ }pnanovdb_coord_t;
283
+ typedef struct pnanovdb_vec3_t
284
+ {
285
+ float x, y, z;
286
+ }pnanovdb_vec3_t;
287
+ PNANOVDB_FORCE_INLINE pnanovdb_int32_t pnanovdb_uint32_as_int32(pnanovdb_uint32_t v) { return (pnanovdb_int32_t)v; }
288
+ PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_uint64_as_int64(pnanovdb_uint64_t v) { return (pnanovdb_int64_t)v; }
289
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_int64_as_uint64(pnanovdb_int64_t v) { return (pnanovdb_uint64_t)v; }
290
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_int32_as_uint32(pnanovdb_int32_t v) { return (pnanovdb_uint32_t)v; }
291
+ // PNANOVDB_FORCE_INLINE float pnanovdb_uint32_as_float(pnanovdb_uint32_t v) { return *((float*)&v); }
292
+ // PNANOVDB_FORCE_INLINE double pnanovdb_uint64_as_double(pnanovdb_uint64_t v) { return *((double*)&v); }
293
+ PNANOVDB_FORCE_INLINE float pnanovdb_uint32_as_float(pnanovdb_uint32_t v) { float vf; pnanovdb_memcpy(&vf, &v, sizeof(vf)); return vf; }
294
+ PNANOVDB_FORCE_INLINE double pnanovdb_uint64_as_double(pnanovdb_uint64_t v) { double vf; pnanovdb_memcpy(&vf, &v, sizeof(vf)); return vf; }
295
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_uint64_low(pnanovdb_uint64_t v) { return (pnanovdb_uint32_t)v; }
296
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_uint64_high(pnanovdb_uint64_t v) { return (pnanovdb_uint32_t)(v >> 32u); }
297
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint32_as_uint64(pnanovdb_uint32_t x, pnanovdb_uint32_t y) { return ((pnanovdb_uint64_t)x) | (((pnanovdb_uint64_t)y) << 32u); }
298
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint32_as_uint64_low(pnanovdb_uint32_t x) { return ((pnanovdb_uint64_t)x); }
299
+ PNANOVDB_FORCE_INLINE pnanovdb_int32_t pnanovdb_uint64_is_equal(pnanovdb_uint64_t a, pnanovdb_uint64_t b) { return a == b; }
300
+ PNANOVDB_FORCE_INLINE pnanovdb_int32_t pnanovdb_int64_is_zero(pnanovdb_int64_t a) { return a == 0; }
301
+ #ifdef PNANOVDB_CMATH
302
+ PNANOVDB_FORCE_INLINE float pnanovdb_floor(float v) { return floorf(v); }
303
+ #endif
304
+ PNANOVDB_FORCE_INLINE pnanovdb_int32_t pnanovdb_float_to_int32(float v) { return (pnanovdb_int32_t)v; }
305
+ PNANOVDB_FORCE_INLINE float pnanovdb_int32_to_float(pnanovdb_int32_t v) { return (float)v; }
306
+ PNANOVDB_FORCE_INLINE float pnanovdb_uint32_to_float(pnanovdb_uint32_t v) { return (float)v; }
307
+ PNANOVDB_FORCE_INLINE float pnanovdb_min(float a, float b) { return a < b ? a : b; }
308
+ PNANOVDB_FORCE_INLINE float pnanovdb_max(float a, float b) { return a > b ? a : b; }
309
+ #elif defined(PNANOVDB_HLSL)
310
+ typedef uint pnanovdb_uint32_t;
311
+ typedef int pnanovdb_int32_t;
312
+ typedef bool pnanovdb_bool_t;
313
+ #define PNANOVDB_FALSE false
314
+ #define PNANOVDB_TRUE true
315
+ typedef int3 pnanovdb_coord_t;
316
+ typedef float3 pnanovdb_vec3_t;
317
+ pnanovdb_int32_t pnanovdb_uint32_as_int32(pnanovdb_uint32_t v) { return int(v); }
318
+ pnanovdb_uint32_t pnanovdb_int32_as_uint32(pnanovdb_int32_t v) { return uint(v); }
319
+ float pnanovdb_uint32_as_float(pnanovdb_uint32_t v) { return asfloat(v); }
320
+ float pnanovdb_floor(float v) { return floor(v); }
321
+ pnanovdb_int32_t pnanovdb_float_to_int32(float v) { return int(v); }
322
+ float pnanovdb_int32_to_float(pnanovdb_int32_t v) { return float(v); }
323
+ float pnanovdb_uint32_to_float(pnanovdb_uint32_t v) { return float(v); }
324
+ float pnanovdb_min(float a, float b) { return min(a, b); }
325
+ float pnanovdb_max(float a, float b) { return max(a, b); }
326
+ #if defined(PNANOVDB_ADDRESS_32)
327
+ typedef uint2 pnanovdb_uint64_t;
328
+ typedef int2 pnanovdb_int64_t;
329
+ pnanovdb_int64_t pnanovdb_uint64_as_int64(pnanovdb_uint64_t v) { return int2(v); }
330
+ pnanovdb_uint64_t pnanovdb_int64_as_uint64(pnanovdb_int64_t v) { return uint2(v); }
331
+ double pnanovdb_uint64_as_double(pnanovdb_uint64_t v) { return asdouble(v.x, v.y); }
332
+ pnanovdb_uint32_t pnanovdb_uint64_low(pnanovdb_uint64_t v) { return v.x; }
333
+ pnanovdb_uint32_t pnanovdb_uint64_high(pnanovdb_uint64_t v) { return v.y; }
334
+ pnanovdb_uint64_t pnanovdb_uint32_as_uint64(pnanovdb_uint32_t x, pnanovdb_uint32_t y) { return uint2(x, y); }
335
+ pnanovdb_uint64_t pnanovdb_uint32_as_uint64_low(pnanovdb_uint32_t x) { return uint2(x, 0); }
336
+ bool pnanovdb_uint64_is_equal(pnanovdb_uint64_t a, pnanovdb_uint64_t b) { return (a.x == b.x) && (a.y == b.y); }
337
+ bool pnanovdb_int64_is_zero(pnanovdb_int64_t a) { return a.x == 0 && a.y == 0; }
338
+ #else
339
+ typedef uint64_t pnanovdb_uint64_t;
340
+ typedef int64_t pnanovdb_int64_t;
341
+ pnanovdb_int64_t pnanovdb_uint64_as_int64(pnanovdb_uint64_t v) { return int64_t(v); }
342
+ pnanovdb_uint64_t pnanovdb_int64_as_uint64(pnanovdb_int64_t v) { return uint64_t(v); }
343
+ double pnanovdb_uint64_as_double(pnanovdb_uint64_t v) { return asdouble(uint(v), uint(v >> 32u)); }
344
+ pnanovdb_uint32_t pnanovdb_uint64_low(pnanovdb_uint64_t v) { return uint(v); }
345
+ pnanovdb_uint32_t pnanovdb_uint64_high(pnanovdb_uint64_t v) { return uint(v >> 32u); }
346
+ pnanovdb_uint64_t pnanovdb_uint32_as_uint64(pnanovdb_uint32_t x, pnanovdb_uint32_t y) { return uint64_t(x) + (uint64_t(y) << 32u); }
347
+ pnanovdb_uint64_t pnanovdb_uint32_as_uint64_low(pnanovdb_uint32_t x) { return uint64_t(x); }
348
+ bool pnanovdb_uint64_is_equal(pnanovdb_uint64_t a, pnanovdb_uint64_t b) { return a == b; }
349
+ bool pnanovdb_int64_is_zero(pnanovdb_int64_t a) { return a == 0; }
350
+ #endif
351
+ #elif defined(PNANOVDB_GLSL)
352
+ #define pnanovdb_uint32_t uint
353
+ #define pnanovdb_int32_t int
354
+ #define pnanovdb_bool_t bool
355
+ #define PNANOVDB_FALSE false
356
+ #define PNANOVDB_TRUE true
357
+ #define pnanovdb_uint64_t uvec2
358
+ #define pnanovdb_int64_t ivec2
359
+ #define pnanovdb_coord_t ivec3
360
+ #define pnanovdb_vec3_t vec3
361
+ pnanovdb_int32_t pnanovdb_uint32_as_int32(pnanovdb_uint32_t v) { return int(v); }
362
+ pnanovdb_int64_t pnanovdb_uint64_as_int64(pnanovdb_uint64_t v) { return ivec2(v); }
363
+ pnanovdb_uint64_t pnanovdb_int64_as_uint64(pnanovdb_int64_t v) { return uvec2(v); }
364
+ pnanovdb_uint32_t pnanovdb_int32_as_uint32(pnanovdb_int32_t v) { return uint(v); }
365
+ float pnanovdb_uint32_as_float(pnanovdb_uint32_t v) { return uintBitsToFloat(v); }
366
+ double pnanovdb_uint64_as_double(pnanovdb_uint64_t v) { return packDouble2x32(uvec2(v.x, v.y)); }
367
+ pnanovdb_uint32_t pnanovdb_uint64_low(pnanovdb_uint64_t v) { return v.x; }
368
+ pnanovdb_uint32_t pnanovdb_uint64_high(pnanovdb_uint64_t v) { return v.y; }
369
+ pnanovdb_uint64_t pnanovdb_uint32_as_uint64(pnanovdb_uint32_t x, pnanovdb_uint32_t y) { return uvec2(x, y); }
370
+ pnanovdb_uint64_t pnanovdb_uint32_as_uint64_low(pnanovdb_uint32_t x) { return uvec2(x, 0); }
371
+ bool pnanovdb_uint64_is_equal(pnanovdb_uint64_t a, pnanovdb_uint64_t b) { return (a.x == b.x) && (a.y == b.y); }
372
+ bool pnanovdb_int64_is_zero(pnanovdb_int64_t a) { return a.x == 0 && a.y == 0; }
373
+ float pnanovdb_floor(float v) { return floor(v); }
374
+ pnanovdb_int32_t pnanovdb_float_to_int32(float v) { return int(v); }
375
+ float pnanovdb_int32_to_float(pnanovdb_int32_t v) { return float(v); }
376
+ float pnanovdb_uint32_to_float(pnanovdb_uint32_t v) { return float(v); }
377
+ float pnanovdb_min(float a, float b) { return min(a, b); }
378
+ float pnanovdb_max(float a, float b) { return max(a, b); }
379
+ #endif
380
+
381
+ // ------------------------------------------------ Coord/Vec3 Utilties -----------------------------------------------------------
382
+
383
+ #if defined(PNANOVDB_C)
384
+ PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_uniform(float a)
385
+ {
386
+ pnanovdb_vec3_t v;
387
+ v.x = a;
388
+ v.y = a;
389
+ v.z = a;
390
+ return v;
391
+ }
392
+ PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_add(const pnanovdb_vec3_t a, const pnanovdb_vec3_t b)
393
+ {
394
+ pnanovdb_vec3_t v;
395
+ v.x = a.x + b.x;
396
+ v.y = a.y + b.y;
397
+ v.z = a.z + b.z;
398
+ return v;
399
+ }
400
+ PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_sub(const pnanovdb_vec3_t a, const pnanovdb_vec3_t b)
401
+ {
402
+ pnanovdb_vec3_t v;
403
+ v.x = a.x - b.x;
404
+ v.y = a.y - b.y;
405
+ v.z = a.z - b.z;
406
+ return v;
407
+ }
408
+ PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_mul(const pnanovdb_vec3_t a, const pnanovdb_vec3_t b)
409
+ {
410
+ pnanovdb_vec3_t v;
411
+ v.x = a.x * b.x;
412
+ v.y = a.y * b.y;
413
+ v.z = a.z * b.z;
414
+ return v;
415
+ }
416
+ PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_div(const pnanovdb_vec3_t a, const pnanovdb_vec3_t b)
417
+ {
418
+ pnanovdb_vec3_t v;
419
+ v.x = a.x / b.x;
420
+ v.y = a.y / b.y;
421
+ v.z = a.z / b.z;
422
+ return v;
423
+ }
424
+ PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_min(const pnanovdb_vec3_t a, const pnanovdb_vec3_t b)
425
+ {
426
+ pnanovdb_vec3_t v;
427
+ v.x = a.x < b.x ? a.x : b.x;
428
+ v.y = a.y < b.y ? a.y : b.y;
429
+ v.z = a.z < b.z ? a.z : b.z;
430
+ return v;
431
+ }
432
+ PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_max(const pnanovdb_vec3_t a, const pnanovdb_vec3_t b)
433
+ {
434
+ pnanovdb_vec3_t v;
435
+ v.x = a.x > b.x ? a.x : b.x;
436
+ v.y = a.y > b.y ? a.y : b.y;
437
+ v.z = a.z > b.z ? a.z : b.z;
438
+ return v;
439
+ }
440
+ PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_vec3_round_to_coord(const pnanovdb_vec3_t a)
441
+ {
442
+ pnanovdb_coord_t v;
443
+ v.x = pnanovdb_float_to_int32(roundf(a.x));
444
+ v.y = pnanovdb_float_to_int32(roundf(a.y));
445
+ v.z = pnanovdb_float_to_int32(roundf(a.z));
446
+ return v;
447
+ }
448
+ PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_coord_to_vec3(const pnanovdb_coord_t coord)
449
+ {
450
+ pnanovdb_vec3_t v;
451
+ v.x = pnanovdb_int32_to_float(coord.x);
452
+ v.y = pnanovdb_int32_to_float(coord.y);
453
+ v.z = pnanovdb_int32_to_float(coord.z);
454
+ return v;
455
+ }
456
+ PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_coord_uniform(const pnanovdb_int32_t a)
457
+ {
458
+ pnanovdb_coord_t v;
459
+ v.x = a;
460
+ v.y = a;
461
+ v.z = a;
462
+ return v;
463
+ }
464
+ PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_coord_add(pnanovdb_coord_t a, pnanovdb_coord_t b)
465
+ {
466
+ pnanovdb_coord_t v;
467
+ v.x = a.x + b.x;
468
+ v.y = a.y + b.y;
469
+ v.z = a.z + b.z;
470
+ return v;
471
+ }
472
+ #elif defined(PNANOVDB_HLSL)
473
+ pnanovdb_vec3_t pnanovdb_vec3_uniform(float a) { return float3(a, a, a); }
474
+ pnanovdb_vec3_t pnanovdb_vec3_add(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a + b; }
475
+ pnanovdb_vec3_t pnanovdb_vec3_sub(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a - b; }
476
+ pnanovdb_vec3_t pnanovdb_vec3_mul(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a * b; }
477
+ pnanovdb_vec3_t pnanovdb_vec3_div(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a / b; }
478
+ pnanovdb_vec3_t pnanovdb_vec3_min(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return min(a, b); }
479
+ pnanovdb_vec3_t pnanovdb_vec3_max(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return max(a, b); }
480
+ pnanovdb_vec3_t pnanovdb_coord_to_vec3(pnanovdb_coord_t coord) { return float3(coord); }
481
+ pnanovdb_coord_t pnanovdb_coord_uniform(pnanovdb_int32_t a) { return int3(a, a, a); }
482
+ pnanovdb_coord_t pnanovdb_coord_add(pnanovdb_coord_t a, pnanovdb_coord_t b) { return a + b; }
483
+ #elif defined(PNANOVDB_GLSL)
484
+ pnanovdb_vec3_t pnanovdb_vec3_uniform(float a) { return vec3(a, a, a); }
485
+ pnanovdb_vec3_t pnanovdb_vec3_add(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a + b; }
486
+ pnanovdb_vec3_t pnanovdb_vec3_sub(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a - b; }
487
+ pnanovdb_vec3_t pnanovdb_vec3_mul(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a * b; }
488
+ pnanovdb_vec3_t pnanovdb_vec3_div(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a / b; }
489
+ pnanovdb_vec3_t pnanovdb_vec3_min(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return min(a, b); }
490
+ pnanovdb_vec3_t pnanovdb_vec3_max(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return max(a, b); }
491
+ pnanovdb_vec3_t pnanovdb_coord_to_vec3(const pnanovdb_coord_t coord) { return vec3(coord); }
492
+ pnanovdb_coord_t pnanovdb_coord_uniform(pnanovdb_int32_t a) { return ivec3(a, a, a); }
493
+ pnanovdb_coord_t pnanovdb_coord_add(pnanovdb_coord_t a, pnanovdb_coord_t b) { return a + b; }
494
+ #endif
495
+
496
+ // ------------------------------------------------ Address Type -----------------------------------------------------------
497
+
498
+ #if defined(PNANOVDB_ADDRESS_32)
499
+ struct pnanovdb_address_t
500
+ {
501
+ pnanovdb_uint32_t byte_offset;
502
+ };
503
+ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_address_t)
504
+
505
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset(pnanovdb_address_t address, pnanovdb_uint32_t byte_offset)
506
+ {
507
+ pnanovdb_address_t ret = address;
508
+ ret.byte_offset += byte_offset;
509
+ return ret;
510
+ }
511
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset_neg(pnanovdb_address_t address, pnanovdb_uint32_t byte_offset)
512
+ {
513
+ pnanovdb_address_t ret = address;
514
+ ret.byte_offset -= byte_offset;
515
+ return ret;
516
+ }
517
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset_product(pnanovdb_address_t address, pnanovdb_uint32_t byte_offset, pnanovdb_uint32_t multiplier)
518
+ {
519
+ pnanovdb_address_t ret = address;
520
+ ret.byte_offset += byte_offset * multiplier;
521
+ return ret;
522
+ }
523
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset64(pnanovdb_address_t address, pnanovdb_uint64_t byte_offset)
524
+ {
525
+ pnanovdb_address_t ret = address;
526
+ // lose high bits on 32-bit
527
+ ret.byte_offset += pnanovdb_uint64_low(byte_offset);
528
+ return ret;
529
+ }
530
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_address_mask(pnanovdb_address_t address, pnanovdb_uint32_t mask)
531
+ {
532
+ return address.byte_offset & mask;
533
+ }
534
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_mask_inv(pnanovdb_address_t address, pnanovdb_uint32_t mask)
535
+ {
536
+ pnanovdb_address_t ret = address;
537
+ ret.byte_offset &= (~mask);
538
+ return ret;
539
+ }
540
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_null()
541
+ {
542
+ pnanovdb_address_t ret = { 0 };
543
+ return ret;
544
+ }
545
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_address_is_null(pnanovdb_address_t address)
546
+ {
547
+ return address.byte_offset == 0u;
548
+ }
549
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_address_in_interval(pnanovdb_address_t address, pnanovdb_address_t min_address, pnanovdb_address_t max_address)
550
+ {
551
+ return address.byte_offset >= min_address.byte_offset && address.byte_offset < max_address.byte_offset;
552
+ }
553
+ #elif defined(PNANOVDB_ADDRESS_64)
554
+ struct pnanovdb_address_t
555
+ {
556
+ pnanovdb_uint64_t byte_offset;
557
+ };
558
+ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_address_t)
559
+
560
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset(pnanovdb_address_t address, pnanovdb_uint32_t byte_offset)
561
+ {
562
+ pnanovdb_address_t ret = address;
563
+ ret.byte_offset += byte_offset;
564
+ return ret;
565
+ }
566
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset_neg(pnanovdb_address_t address, pnanovdb_uint32_t byte_offset)
567
+ {
568
+ pnanovdb_address_t ret = address;
569
+ ret.byte_offset -= byte_offset;
570
+ return ret;
571
+ }
572
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset_product(pnanovdb_address_t address, pnanovdb_uint32_t byte_offset, pnanovdb_uint32_t multiplier)
573
+ {
574
+ pnanovdb_address_t ret = address;
575
+ ret.byte_offset += pnanovdb_uint32_as_uint64_low(byte_offset) * pnanovdb_uint32_as_uint64_low(multiplier);
576
+ return ret;
577
+ }
578
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset64(pnanovdb_address_t address, pnanovdb_uint64_t byte_offset)
579
+ {
580
+ pnanovdb_address_t ret = address;
581
+ ret.byte_offset += byte_offset;
582
+ return ret;
583
+ }
584
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_address_mask(pnanovdb_address_t address, pnanovdb_uint32_t mask)
585
+ {
586
+ return pnanovdb_uint64_low(address.byte_offset) & mask;
587
+ }
588
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_mask_inv(pnanovdb_address_t address, pnanovdb_uint32_t mask)
589
+ {
590
+ pnanovdb_address_t ret = address;
591
+ ret.byte_offset &= (~pnanovdb_uint32_as_uint64_low(mask));
592
+ return ret;
593
+ }
594
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_null()
595
+ {
596
+ pnanovdb_address_t ret = { 0 };
597
+ return ret;
598
+ }
599
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_address_is_null(pnanovdb_address_t address)
600
+ {
601
+ return address.byte_offset == 0llu;
602
+ }
603
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_address_in_interval(pnanovdb_address_t address, pnanovdb_address_t min_address, pnanovdb_address_t max_address)
604
+ {
605
+ return address.byte_offset >= min_address.byte_offset && address.byte_offset < max_address.byte_offset;
606
+ }
607
+ #endif
608
+
609
+ // ------------------------------------------------ High Level Buffer Read -----------------------------------------------------------
610
+
611
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_read_uint32(pnanovdb_buf_t buf, pnanovdb_address_t address)
612
+ {
613
+ return pnanovdb_buf_read_uint32(buf, address.byte_offset);
614
+ }
615
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_read_uint64(pnanovdb_buf_t buf, pnanovdb_address_t address)
616
+ {
617
+ return pnanovdb_buf_read_uint64(buf, address.byte_offset);
618
+ }
619
+ PNANOVDB_FORCE_INLINE pnanovdb_int32_t pnanovdb_read_int32(pnanovdb_buf_t buf, pnanovdb_address_t address)
620
+ {
621
+ return pnanovdb_uint32_as_int32(pnanovdb_read_uint32(buf, address));
622
+ }
623
+ PNANOVDB_FORCE_INLINE float pnanovdb_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address)
624
+ {
625
+ return pnanovdb_uint32_as_float(pnanovdb_read_uint32(buf, address));
626
+ }
627
+ PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_read_int64(pnanovdb_buf_t buf, pnanovdb_address_t address)
628
+ {
629
+ return pnanovdb_uint64_as_int64(pnanovdb_read_uint64(buf, address));
630
+ }
631
+ PNANOVDB_FORCE_INLINE double pnanovdb_read_double(pnanovdb_buf_t buf, pnanovdb_address_t address)
632
+ {
633
+ return pnanovdb_uint64_as_double(pnanovdb_read_uint64(buf, address));
634
+ }
635
+ PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_read_coord(pnanovdb_buf_t buf, pnanovdb_address_t address)
636
+ {
637
+ pnanovdb_coord_t ret;
638
+ ret.x = pnanovdb_uint32_as_int32(pnanovdb_read_uint32(buf, pnanovdb_address_offset(address, 0u)));
639
+ ret.y = pnanovdb_uint32_as_int32(pnanovdb_read_uint32(buf, pnanovdb_address_offset(address, 4u)));
640
+ ret.z = pnanovdb_uint32_as_int32(pnanovdb_read_uint32(buf, pnanovdb_address_offset(address, 8u)));
641
+ return ret;
642
+ }
643
+ PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_read_vec3f(pnanovdb_buf_t buf, pnanovdb_address_t address)
644
+ {
645
+ pnanovdb_vec3_t ret;
646
+ ret.x = pnanovdb_uint32_as_float(pnanovdb_read_uint32(buf, pnanovdb_address_offset(address, 0u)));
647
+ ret.y = pnanovdb_uint32_as_float(pnanovdb_read_uint32(buf, pnanovdb_address_offset(address, 4u)));
648
+ ret.z = pnanovdb_uint32_as_float(pnanovdb_read_uint32(buf, pnanovdb_address_offset(address, 8u)));
649
+ return ret;
650
+ }
651
+
652
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_read_bit(pnanovdb_buf_t buf, pnanovdb_address_t address, pnanovdb_uint32_t bit_offset)
653
+ {
654
+ pnanovdb_address_t word_address = pnanovdb_address_mask_inv(address, 3u);
655
+ pnanovdb_uint32_t bit_index = (pnanovdb_address_mask(address, 3u) << 3u) + bit_offset;
656
+ pnanovdb_uint32_t value_word = pnanovdb_buf_read_uint32(buf, word_address.byte_offset);
657
+ return ((value_word >> bit_index) & 1) != 0u;
658
+ }
659
+
660
+ #if defined(PNANOVDB_C)
661
+ PNANOVDB_FORCE_INLINE short pnanovdb_read_half(pnanovdb_buf_t buf, pnanovdb_address_t address)
662
+ {
663
+ pnanovdb_uint32_t raw = pnanovdb_read_uint32(buf, address);
664
+ return (short)(raw >> (pnanovdb_address_mask(address, 2) << 3));
665
+ }
666
+ #elif defined(PNANOVDB_HLSL)
667
+ PNANOVDB_FORCE_INLINE float pnanovdb_read_half(pnanovdb_buf_t buf, pnanovdb_address_t address)
668
+ {
669
+ pnanovdb_uint32_t raw = pnanovdb_read_uint32(buf, address);
670
+ return f16tof32(raw >> (pnanovdb_address_mask(address, 2) << 3));
671
+ }
672
+ #elif defined(PNANOVDB_GLSL)
673
+ PNANOVDB_FORCE_INLINE float pnanovdb_read_half(pnanovdb_buf_t buf, pnanovdb_address_t address)
674
+ {
675
+ pnanovdb_uint32_t raw = pnanovdb_read_uint32(buf, address);
676
+ return unpackHalf2x16(raw >> (pnanovdb_address_mask(address, 2) << 3)).x;
677
+ }
678
+ #endif
679
+
680
+ // ------------------------------------------------ Core Structures -----------------------------------------------------------
681
+
682
+ #define PNANOVDB_MAGIC_NUMBER 0x304244566f6e614eUL// "NanoVDB0" in hex - little endian (uint64_t)
683
+
684
+ #define PNANOVDB_MAJOR_VERSION_NUMBER 32// reflects changes to the ABI
685
+ #define PNANOVDB_MINOR_VERSION_NUMBER 3// reflects changes to the API but not ABI
686
+ #define PNANOVDB_PATCH_VERSION_NUMBER 3// reflects bug-fixes with no ABI or API changes
687
+
688
+ #define PNANOVDB_GRID_TYPE_UNKNOWN 0
689
+ #define PNANOVDB_GRID_TYPE_FLOAT 1
690
+ #define PNANOVDB_GRID_TYPE_DOUBLE 2
691
+ #define PNANOVDB_GRID_TYPE_INT16 3
692
+ #define PNANOVDB_GRID_TYPE_INT32 4
693
+ #define PNANOVDB_GRID_TYPE_INT64 5
694
+ #define PNANOVDB_GRID_TYPE_VEC3F 6
695
+ #define PNANOVDB_GRID_TYPE_VEC3D 7
696
+ #define PNANOVDB_GRID_TYPE_MASK 8
697
+ #define PNANOVDB_GRID_TYPE_HALF 9
698
+ #define PNANOVDB_GRID_TYPE_UINT32 10
699
+ #define PNANOVDB_GRID_TYPE_BOOLEAN 11
700
+ #define PNANOVDB_GRID_TYPE_RGBA8 12
701
+ #define PNANOVDB_GRID_TYPE_FP4 13
702
+ #define PNANOVDB_GRID_TYPE_FP8 14
703
+ #define PNANOVDB_GRID_TYPE_FP16 15
704
+ #define PNANOVDB_GRID_TYPE_FPN 16
705
+ #define PNANOVDB_GRID_TYPE_VEC4F 17
706
+ #define PNANOVDB_GRID_TYPE_VEC4D 18
707
+ #define PNANOVDB_GRID_TYPE_END 19
708
+
709
+ #define PNANOVDB_GRID_CLASS_UNKNOWN 0
710
+ #define PNANOVDB_GRID_CLASS_LEVEL_SET 1 // narrow band levelset, e.g. SDF
711
+ #define PNANOVDB_GRID_CLASS_FOG_VOLUME 2 // fog volume, e.g. density
712
+ #define PNANOVDB_GRID_CLASS_STAGGERED 3 // staggered MAC grid, e.g. velocity
713
+ #define PNANOVDB_GRID_CLASS_POINT_INDEX 4 // point index grid
714
+ #define PNANOVDB_GRID_CLASS_POINT_DATA 5 // point data grid
715
+ #define PNANOVDB_GRID_CLASS_TOPOLOGY 6 // grid with active states only (no values)
716
+ #define PNANOVDB_GRID_CLASS_VOXEL_VOLUME 7 // volume of geometric cubes, e.g. minecraft
717
+ #define PNANOVDB_GRID_CLASS_END 8
718
+
719
+ #define PNANOVDB_GRID_FLAGS_HAS_LONG_GRID_NAME (1 << 0)
720
+ #define PNANOVDB_GRID_FLAGS_HAS_BBOX (1 << 1)
721
+ #define PNANOVDB_GRID_FLAGS_HAS_MIN_MAX (1 << 2)
722
+ #define PNANOVDB_GRID_FLAGS_HAS_AVERAGE (1 << 3)
723
+ #define PNANOVDB_GRID_FLAGS_HAS_STD_DEVIATION (1 << 4)
724
+ #define PNANOVDB_GRID_FLAGS_IS_BREADTH_FIRST (1 << 5)
725
+ #define PNANOVDB_GRID_FLAGS_END (1 << 6)
726
+
727
+ #define PNANOVDB_LEAF_TYPE_DEFAULT 0
728
+ #define PNANOVDB_LEAF_TYPE_LITE 1
729
+ #define PNANOVDB_LEAF_TYPE_FP 2
730
+
731
+ PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_value_strides_bits[PNANOVDB_GRID_TYPE_END] = { 0, 32, 64, 16, 32, 64, 96, 192, 0, 16, 32, 1, 32, 4, 8, 16, 0, 128, 256 };
732
+ PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_table_strides_bits[PNANOVDB_GRID_TYPE_END] = { 64, 64, 64, 64, 64, 64, 128, 192, 64, 64, 64, 64, 64, 64, 64, 64, 64, 128, 256 };
733
+ PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_minmax_strides_bits[PNANOVDB_GRID_TYPE_END] = { 0, 32, 64, 16, 32, 64, 96, 192, 8, 16, 32, 8, 32, 32, 32, 32, 32, 128, 256 };
734
+ PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_minmax_aligns_bits[PNANOVDB_GRID_TYPE_END] = { 0, 32, 64, 16, 32, 64, 32, 64, 8, 16, 32, 8, 32, 32, 32, 32, 32, 32, 64 };
735
+ PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_stat_strides_bits[PNANOVDB_GRID_TYPE_END] = { 0, 32, 64, 32, 32, 64, 32, 64, 8, 32, 32, 8, 32, 32, 32, 32, 32, 32, 64 };
736
+ PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_leaf_type[PNANOVDB_GRID_TYPE_END] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 2, 2, 2, 2, 0, 0 };
737
+
738
+ struct pnanovdb_map_t
739
+ {
740
+ float matf[9];
741
+ float invmatf[9];
742
+ float vecf[3];
743
+ float taperf;
744
+ double matd[9];
745
+ double invmatd[9];
746
+ double vecd[3];
747
+ double taperd;
748
+ };
749
+ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_map_t)
750
+ struct pnanovdb_map_handle_t { pnanovdb_address_t address; };
751
+ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_map_handle_t)
752
+
753
+ #define PNANOVDB_MAP_SIZE 264
754
+
755
+ #define PNANOVDB_MAP_OFF_MATF 0
756
+ #define PNANOVDB_MAP_OFF_INVMATF 36
757
+ #define PNANOVDB_MAP_OFF_VECF 72
758
+ #define PNANOVDB_MAP_OFF_TAPERF 84
759
+ #define PNANOVDB_MAP_OFF_MATD 88
760
+ #define PNANOVDB_MAP_OFF_INVMATD 160
761
+ #define PNANOVDB_MAP_OFF_VECD 232
762
+ #define PNANOVDB_MAP_OFF_TAPERD 256
763
+
764
+ PNANOVDB_FORCE_INLINE float pnanovdb_map_get_matf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index) {
765
+ return pnanovdb_read_float(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_MATF + 4u * index));
766
+ }
767
+ PNANOVDB_FORCE_INLINE float pnanovdb_map_get_invmatf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index) {
768
+ return pnanovdb_read_float(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_INVMATF + 4u * index));
769
+ }
770
+ PNANOVDB_FORCE_INLINE float pnanovdb_map_get_vecf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index) {
771
+ return pnanovdb_read_float(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_VECF + 4u * index));
772
+ }
773
+ PNANOVDB_FORCE_INLINE float pnanovdb_map_get_taperf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index) {
774
+ return pnanovdb_read_float(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_TAPERF));
775
+ }
776
+ PNANOVDB_FORCE_INLINE double pnanovdb_map_get_matd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index) {
777
+ return pnanovdb_read_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_MATD + 8u * index));
778
+ }
779
+ PNANOVDB_FORCE_INLINE double pnanovdb_map_get_invmatd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index) {
780
+ return pnanovdb_read_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_INVMATD + 8u * index));
781
+ }
782
+ PNANOVDB_FORCE_INLINE double pnanovdb_map_get_vecd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index) {
783
+ return pnanovdb_read_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_VECD + 8u * index));
784
+ }
785
+ PNANOVDB_FORCE_INLINE double pnanovdb_map_get_taperd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index) {
786
+ return pnanovdb_read_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_TAPERD));
787
+ }
788
+
789
+ struct pnanovdb_grid_t
790
+ {
791
+ pnanovdb_uint64_t magic; // 8 bytes, 0
792
+ pnanovdb_uint64_t checksum; // 8 bytes, 8
793
+ pnanovdb_uint32_t version; // 4 bytes, 16
794
+ pnanovdb_uint32_t flags; // 4 bytes, 20
795
+ pnanovdb_uint32_t grid_index; // 4 bytes, 24
796
+ pnanovdb_uint32_t grid_count; // 4 bytes, 28
797
+ pnanovdb_uint64_t grid_size; // 8 bytes, 32
798
+ pnanovdb_uint32_t grid_name[256 / 4]; // 256 bytes, 40
799
+ pnanovdb_map_t map; // 264 bytes, 296
800
+ double world_bbox[6]; // 48 bytes, 560
801
+ double voxel_size[3]; // 24 bytes, 608
802
+ pnanovdb_uint32_t grid_class; // 4 bytes, 632
803
+ pnanovdb_uint32_t grid_type; // 4 bytes, 636
804
+ pnanovdb_int64_t blind_metadata_offset; // 8 bytes, 640
805
+ pnanovdb_uint32_t blind_metadata_count; // 4 bytes, 648
806
+ pnanovdb_uint32_t pad[5]; // 20 bytes, 652
807
+ };
808
+ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_grid_t)
809
+ struct pnanovdb_grid_handle_t { pnanovdb_address_t address; };
810
+ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_grid_handle_t)
811
+
812
+ #define PNANOVDB_GRID_SIZE 672
813
+
814
+ #define PNANOVDB_GRID_OFF_MAGIC 0
815
+ #define PNANOVDB_GRID_OFF_CHECKSUM 8
816
+ #define PNANOVDB_GRID_OFF_VERSION 16
817
+ #define PNANOVDB_GRID_OFF_FLAGS 20
818
+ #define PNANOVDB_GRID_OFF_GRID_INDEX 24
819
+ #define PNANOVDB_GRID_OFF_GRID_COUNT 28
820
+ #define PNANOVDB_GRID_OFF_GRID_SIZE 32
821
+ #define PNANOVDB_GRID_OFF_GRID_NAME 40
822
+ #define PNANOVDB_GRID_OFF_MAP 296
823
+ #define PNANOVDB_GRID_OFF_WORLD_BBOX 560
824
+ #define PNANOVDB_GRID_OFF_VOXEL_SIZE 608
825
+ #define PNANOVDB_GRID_OFF_GRID_CLASS 632
826
+ #define PNANOVDB_GRID_OFF_GRID_TYPE 636
827
+ #define PNANOVDB_GRID_OFF_BLIND_METADATA_OFFSET 640
828
+ #define PNANOVDB_GRID_OFF_BLIND_METADATA_COUNT 648
829
+
830
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_grid_get_magic(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
831
+ return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_MAGIC));
832
+ }
833
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_grid_get_checksum(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
834
+ return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_CHECKSUM));
835
+ }
836
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_version(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
837
+ return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_VERSION));
838
+ }
839
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_flags(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
840
+ return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_FLAGS));
841
+ }
842
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_index(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
843
+ return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_INDEX));
844
+ }
845
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_count(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
846
+ return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_COUNT));
847
+ }
848
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_grid_get_grid_size(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
849
+ return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_SIZE));
850
+ }
851
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_name(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t index) {
852
+ return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_NAME + 4u * index));
853
+ }
854
+ PNANOVDB_FORCE_INLINE pnanovdb_map_handle_t pnanovdb_grid_get_map(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
855
+ pnanovdb_map_handle_t ret;
856
+ ret.address = pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_MAP);
857
+ return ret;
858
+ }
859
+ PNANOVDB_FORCE_INLINE double pnanovdb_grid_get_world_bbox(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t index) {
860
+ return pnanovdb_read_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_WORLD_BBOX + 8u * index));
861
+ }
862
+ PNANOVDB_FORCE_INLINE double pnanovdb_grid_get_voxel_size(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t index) {
863
+ return pnanovdb_read_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_VOXEL_SIZE + 8u * index));
864
+ }
865
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_class(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
866
+ return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_CLASS));
867
+ }
868
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_type(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
869
+ return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_TYPE));
870
+ }
871
+ PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_grid_get_blind_metadata_offset(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
872
+ return pnanovdb_read_int64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_BLIND_METADATA_OFFSET));
873
+ }
874
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_blind_metadata_count(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
875
+ return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_BLIND_METADATA_COUNT));
876
+ }
877
+
878
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_version_get_major(pnanovdb_uint32_t version)
879
+ {
880
+ return (version >> 21u) & ((1u << 11u) - 1u);
881
+ }
882
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_version_get_minor(pnanovdb_uint32_t version)
883
+ {
884
+ return (version >> 10u) & ((1u << 11u) - 1u);
885
+ }
886
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_version_get_patch(pnanovdb_uint32_t version)
887
+ {
888
+ return version & ((1u << 10u) - 1u);
889
+ }
890
+
891
+ struct pnanovdb_gridblindmetadata_t
892
+ {
893
+ pnanovdb_int64_t byte_offset; // 8 bytes, 0
894
+ pnanovdb_uint64_t element_count; // 8 bytes, 8
895
+ pnanovdb_uint32_t flags; // 4 bytes, 16
896
+ pnanovdb_uint32_t semantic; // 4 bytes, 20
897
+ pnanovdb_uint32_t data_class; // 4 bytes, 24
898
+ pnanovdb_uint32_t data_type; // 4 bytes, 28
899
+ pnanovdb_uint32_t name[256 / 4]; // 256 bytes, 32
900
+ };
901
+ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_gridblindmetadata_t)
902
+ struct pnanovdb_gridblindmetadata_handle_t { pnanovdb_address_t address; };
903
+ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_gridblindmetadata_handle_t)
904
+
905
+ #define PNANOVDB_GRIDBLINDMETADATA_SIZE 288
906
+
907
+ #define PNANOVDB_GRIDBLINDMETADATA_OFF_BYTE_OFFSET 0
908
+ #define PNANOVDB_GRIDBLINDMETADATA_OFF_ELEMENT_COUNT 8
909
+ #define PNANOVDB_GRIDBLINDMETADATA_OFF_FLAGS 16
910
+ #define PNANOVDB_GRIDBLINDMETADATA_OFF_SEMANTIC 20
911
+ #define PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_CLASS 24
912
+ #define PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_TYPE 28
913
+ #define PNANOVDB_GRIDBLINDMETADATA_OFF_NAME 32
914
+
915
+ PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_gridblindmetadata_get_byte_offset(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
916
+ return pnanovdb_read_int64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_BYTE_OFFSET));
917
+ }
918
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_gridblindmetadata_get_element_count(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
919
+ return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_ELEMENT_COUNT));
920
+ }
921
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_flags(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
922
+ return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_FLAGS));
923
+ }
924
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_semantic(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
925
+ return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_SEMANTIC));
926
+ }
927
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_data_class(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
928
+ return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_CLASS));
929
+ }
930
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_data_type(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
931
+ return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_TYPE));
932
+ }
933
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_name(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_uint32_t index) {
934
+ return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_NAME + 4u * index));
935
+ }
936
+
937
+ struct pnanovdb_tree_t
938
+ {
939
+ pnanovdb_uint64_t node_offset_leaf;
940
+ pnanovdb_uint64_t node_offset_lower;
941
+ pnanovdb_uint64_t node_offset_upper;
942
+ pnanovdb_uint64_t node_offset_root;
943
+ pnanovdb_uint32_t node_count_leaf;
944
+ pnanovdb_uint32_t node_count_lower;
945
+ pnanovdb_uint32_t node_count_upper;
946
+ pnanovdb_uint32_t tile_count_leaf;
947
+ pnanovdb_uint32_t tile_count_lower;
948
+ pnanovdb_uint32_t tile_count_upper;
949
+ pnanovdb_uint64_t voxel_count;
950
+ };
951
+ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_tree_t)
952
+ struct pnanovdb_tree_handle_t { pnanovdb_address_t address; };
953
+ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_tree_handle_t)
954
+
955
+ #define PNANOVDB_TREE_SIZE 64
956
+
957
+ #define PNANOVDB_TREE_OFF_NODE_OFFSET_LEAF 0
958
+ #define PNANOVDB_TREE_OFF_NODE_OFFSET_LOWER 8
959
+ #define PNANOVDB_TREE_OFF_NODE_OFFSET_UPPER 16
960
+ #define PNANOVDB_TREE_OFF_NODE_OFFSET_ROOT 24
961
+ #define PNANOVDB_TREE_OFF_NODE_COUNT_LEAF 32
962
+ #define PNANOVDB_TREE_OFF_NODE_COUNT_LOWER 36
963
+ #define PNANOVDB_TREE_OFF_NODE_COUNT_UPPER 40
964
+ #define PNANOVDB_TREE_OFF_TILE_COUNT_LEAF 44
965
+ #define PNANOVDB_TREE_OFF_TILE_COUNT_LOWER 48
966
+ #define PNANOVDB_TREE_OFF_TILE_COUNT_UPPER 52
967
+ #define PNANOVDB_TREE_OFF_VOXEL_COUNT 56
968
+
969
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_node_offset_leaf(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
970
+ return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_OFFSET_LEAF));
971
+ }
972
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_node_offset_lower(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
973
+ return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_OFFSET_LOWER));
974
+ }
975
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_node_offset_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
976
+ return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_OFFSET_UPPER));
977
+ }
978
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_node_offset_root(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
979
+ return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_OFFSET_ROOT));
980
+ }
981
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_node_count_leaf(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
982
+ return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_COUNT_LEAF));
983
+ }
984
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_node_count_lower(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
985
+ return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_COUNT_LOWER));
986
+ }
987
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_node_count_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
988
+ return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_COUNT_UPPER));
989
+ }
990
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_tile_count_leaf(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
991
+ return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_TILE_COUNT_LEAF));
992
+ }
993
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_tile_count_lower(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
994
+ return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_TILE_COUNT_LOWER));
995
+ }
996
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_tile_count_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
997
+ return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_TILE_COUNT_UPPER));
998
+ }
999
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_voxel_count(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
1000
+ return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_VOXEL_COUNT));
1001
+ }
1002
+
1003
+ struct pnanovdb_root_t
1004
+ {
1005
+ pnanovdb_coord_t bbox_min;
1006
+ pnanovdb_coord_t bbox_max;
1007
+ pnanovdb_uint32_t table_size;
1008
+ pnanovdb_uint32_t pad1; // background can start here
1009
+ // background, min, max
1010
+ };
1011
+ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_root_t)
1012
+ struct pnanovdb_root_handle_t { pnanovdb_address_t address; };
1013
+ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_root_handle_t)
1014
+
1015
+ #define PNANOVDB_ROOT_BASE_SIZE 28
1016
+
1017
+ #define PNANOVDB_ROOT_OFF_BBOX_MIN 0
1018
+ #define PNANOVDB_ROOT_OFF_BBOX_MAX 12
1019
+ #define PNANOVDB_ROOT_OFF_TABLE_SIZE 24
1020
+
1021
+ PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_root_get_bbox_min(pnanovdb_buf_t buf, pnanovdb_root_handle_t p) {
1022
+ return pnanovdb_read_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_OFF_BBOX_MIN));
1023
+ }
1024
+ PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_root_get_bbox_max(pnanovdb_buf_t buf, pnanovdb_root_handle_t p) {
1025
+ return pnanovdb_read_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_OFF_BBOX_MAX));
1026
+ }
1027
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_root_get_tile_count(pnanovdb_buf_t buf, pnanovdb_root_handle_t p) {
1028
+ return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_OFF_TABLE_SIZE));
1029
+ }
1030
+
1031
+ struct pnanovdb_root_tile_t
1032
+ {
1033
+ pnanovdb_uint64_t key;
1034
+ pnanovdb_int64_t child; // signed byte offset from root to the child node, 0 means it is a constant tile, so use value
1035
+ pnanovdb_uint32_t state;
1036
+ pnanovdb_uint32_t pad1; // value can start here
1037
+ // value
1038
+ };
1039
+ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_root_tile_t)
1040
+ struct pnanovdb_root_tile_handle_t { pnanovdb_address_t address; };
1041
+ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_root_tile_handle_t)
1042
+
1043
+ #define PNANOVDB_ROOT_TILE_BASE_SIZE 20
1044
+
1045
+ #define PNANOVDB_ROOT_TILE_OFF_KEY 0
1046
+ #define PNANOVDB_ROOT_TILE_OFF_CHILD 8
1047
+ #define PNANOVDB_ROOT_TILE_OFF_STATE 16
1048
+
1049
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_root_tile_get_key(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t p) {
1050
+ return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_TILE_OFF_KEY));
1051
+ }
1052
+ PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_root_tile_get_child(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t p) {
1053
+ return pnanovdb_read_int64(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_TILE_OFF_CHILD));
1054
+ }
1055
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_root_tile_get_state(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t p) {
1056
+ return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_TILE_OFF_STATE));
1057
+ }
1058
+
1059
+ struct pnanovdb_upper_t
1060
+ {
1061
+ pnanovdb_coord_t bbox_min;
1062
+ pnanovdb_coord_t bbox_max;
1063
+ pnanovdb_uint64_t flags;
1064
+ pnanovdb_uint32_t value_mask[1024];
1065
+ pnanovdb_uint32_t child_mask[1024];
1066
+ // min, max
1067
+ // alignas(32) pnanovdb_uint32_t table[];
1068
+ };
1069
+ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_upper_t)
1070
+ struct pnanovdb_upper_handle_t { pnanovdb_address_t address; };
1071
+ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_upper_handle_t)
1072
+
1073
+ #define PNANOVDB_UPPER_TABLE_COUNT 32768
1074
+ #define PNANOVDB_UPPER_BASE_SIZE 8224
1075
+
1076
+ #define PNANOVDB_UPPER_OFF_BBOX_MIN 0
1077
+ #define PNANOVDB_UPPER_OFF_BBOX_MAX 12
1078
+ #define PNANOVDB_UPPER_OFF_FLAGS 24
1079
+ #define PNANOVDB_UPPER_OFF_VALUE_MASK 32
1080
+ #define PNANOVDB_UPPER_OFF_CHILD_MASK 4128
1081
+
1082
+ PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_upper_get_bbox_min(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p) {
1083
+ return pnanovdb_read_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_BBOX_MIN));
1084
+ }
1085
+ PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_upper_get_bbox_max(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p) {
1086
+ return pnanovdb_read_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_BBOX_MAX));
1087
+ }
1088
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_upper_get_flags(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p) {
1089
+ return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_FLAGS));
1090
+ }
1091
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_upper_get_value_mask(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p, pnanovdb_uint32_t bit_index) {
1092
+ pnanovdb_uint32_t value = pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_VALUE_MASK + 4u * (bit_index >> 5u)));
1093
+ return ((value >> (bit_index & 31u)) & 1) != 0u;
1094
+ }
1095
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_upper_get_child_mask(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p, pnanovdb_uint32_t bit_index) {
1096
+ pnanovdb_uint32_t value = pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_CHILD_MASK + 4u * (bit_index >> 5u)));
1097
+ return ((value >> (bit_index & 31u)) & 1) != 0u;
1098
+ }
1099
+
1100
+ struct pnanovdb_lower_t
1101
+ {
1102
+ pnanovdb_coord_t bbox_min;
1103
+ pnanovdb_coord_t bbox_max;
1104
+ pnanovdb_uint64_t flags;
1105
+ pnanovdb_uint32_t value_mask[128];
1106
+ pnanovdb_uint32_t child_mask[128];
1107
+ // min, max
1108
+ // alignas(32) pnanovdb_uint32_t table[];
1109
+ };
1110
+ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_lower_t)
1111
+ struct pnanovdb_lower_handle_t { pnanovdb_address_t address; };
1112
+ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_lower_handle_t)
1113
+
1114
+ #define PNANOVDB_LOWER_TABLE_COUNT 4096
1115
+ #define PNANOVDB_LOWER_BASE_SIZE 1056
1116
+
1117
+ #define PNANOVDB_LOWER_OFF_BBOX_MIN 0
1118
+ #define PNANOVDB_LOWER_OFF_BBOX_MAX 12
1119
+ #define PNANOVDB_LOWER_OFF_FLAGS 24
1120
+ #define PNANOVDB_LOWER_OFF_VALUE_MASK 32
1121
+ #define PNANOVDB_LOWER_OFF_CHILD_MASK 544
1122
+
1123
+ PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_lower_get_bbox_min(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p) {
1124
+ return pnanovdb_read_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_BBOX_MIN));
1125
+ }
1126
+ PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_lower_get_bbox_max(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p) {
1127
+ return pnanovdb_read_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_BBOX_MAX));
1128
+ }
1129
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_lower_get_flags(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p) {
1130
+ return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_FLAGS));
1131
+ }
1132
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_lower_get_value_mask(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p, pnanovdb_uint32_t bit_index) {
1133
+ pnanovdb_uint32_t value = pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_VALUE_MASK + 4u * (bit_index >> 5u)));
1134
+ return ((value >> (bit_index & 31u)) & 1) != 0u;
1135
+ }
1136
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_lower_get_child_mask(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p, pnanovdb_uint32_t bit_index) {
1137
+ pnanovdb_uint32_t value = pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_CHILD_MASK + 4u * (bit_index >> 5u)));
1138
+ return ((value >> (bit_index & 31u)) & 1) != 0u;
1139
+ }
1140
+
1141
+ struct pnanovdb_leaf_t
1142
+ {
1143
+ pnanovdb_coord_t bbox_min;
1144
+ pnanovdb_uint32_t bbox_dif_and_flags;
1145
+ pnanovdb_uint32_t value_mask[16];
1146
+ // min, max
1147
+ // alignas(32) pnanovdb_uint32_t values[];
1148
+ };
1149
+ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_leaf_t)
1150
+ struct pnanovdb_leaf_handle_t { pnanovdb_address_t address; };
1151
+ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_leaf_handle_t)
1152
+
1153
+ #define PNANOVDB_LEAF_TABLE_COUNT 512
1154
+ #define PNANOVDB_LEAF_BASE_SIZE 80
1155
+
1156
+ #define PNANOVDB_LEAF_OFF_BBOX_MIN 0
1157
+ #define PNANOVDB_LEAF_OFF_BBOX_DIF_AND_FLAGS 12
1158
+ #define PNANOVDB_LEAF_OFF_VALUE_MASK 16
1159
+
1160
+ #define PNANOVDB_LEAF_TABLE_NEG_OFF_BBOX_DIF_AND_FLAGS 84
1161
+ #define PNANOVDB_LEAF_TABLE_NEG_OFF_MINIMUM 16
1162
+ #define PNANOVDB_LEAF_TABLE_NEG_OFF_QUANTUM 12
1163
+
1164
+ PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_leaf_get_bbox_min(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t p) {
1165
+ return pnanovdb_read_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_LEAF_OFF_BBOX_MIN));
1166
+ }
1167
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_leaf_get_bbox_dif_and_flags(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t p) {
1168
+ return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_LEAF_OFF_BBOX_DIF_AND_FLAGS));
1169
+ }
1170
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_get_value_mask(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t p, pnanovdb_uint32_t bit_index) {
1171
+ pnanovdb_uint32_t value = pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_LEAF_OFF_VALUE_MASK + 4u * (bit_index >> 5u)));
1172
+ return ((value >> (bit_index & 31u)) & 1) != 0u;
1173
+ }
1174
+
1175
+ struct pnanovdb_grid_type_constants_t
1176
+ {
1177
+ pnanovdb_uint32_t root_off_background;
1178
+ pnanovdb_uint32_t root_off_min;
1179
+ pnanovdb_uint32_t root_off_max;
1180
+ pnanovdb_uint32_t root_off_ave;
1181
+ pnanovdb_uint32_t root_off_stddev;
1182
+ pnanovdb_uint32_t root_size;
1183
+ pnanovdb_uint32_t value_stride_bits;
1184
+ pnanovdb_uint32_t table_stride;
1185
+ pnanovdb_uint32_t root_tile_off_value;
1186
+ pnanovdb_uint32_t root_tile_size;
1187
+ pnanovdb_uint32_t upper_off_min;
1188
+ pnanovdb_uint32_t upper_off_max;
1189
+ pnanovdb_uint32_t upper_off_ave;
1190
+ pnanovdb_uint32_t upper_off_stddev;
1191
+ pnanovdb_uint32_t upper_off_table;
1192
+ pnanovdb_uint32_t upper_size;
1193
+ pnanovdb_uint32_t lower_off_min;
1194
+ pnanovdb_uint32_t lower_off_max;
1195
+ pnanovdb_uint32_t lower_off_ave;
1196
+ pnanovdb_uint32_t lower_off_stddev;
1197
+ pnanovdb_uint32_t lower_off_table;
1198
+ pnanovdb_uint32_t lower_size;
1199
+ pnanovdb_uint32_t leaf_off_min;
1200
+ pnanovdb_uint32_t leaf_off_max;
1201
+ pnanovdb_uint32_t leaf_off_ave;
1202
+ pnanovdb_uint32_t leaf_off_stddev;
1203
+ pnanovdb_uint32_t leaf_off_table;
1204
+ pnanovdb_uint32_t leaf_size;
1205
+ };
1206
+ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_grid_type_constants_t)
1207
+
1208
+ PNANOVDB_STATIC_CONST pnanovdb_grid_type_constants_t pnanovdb_grid_type_constants[PNANOVDB_GRID_TYPE_END] =
1209
+ {
1210
+ {28, 28, 28, 28, 28, 32, 0, 8, 20, 32, 8224, 8224, 8224, 8224, 8224, 270368, 1056, 1056, 1056, 1056, 1056, 33824, 80, 80, 80, 80, 96, 96},
1211
+ {28, 32, 36, 40, 44, 64, 32, 8, 20, 32, 8224, 8228, 8232, 8236, 8256, 270400, 1056, 1060, 1064, 1068, 1088, 33856, 80, 84, 88, 92, 96, 2144},
1212
+ {32, 40, 48, 56, 64, 96, 64, 8, 24, 32, 8224, 8232, 8240, 8248, 8256, 270400, 1056, 1064, 1072, 1080, 1088, 33856, 80, 88, 96, 104, 128, 4224},
1213
+ {28, 30, 32, 36, 40, 64, 16, 8, 20, 32, 8224, 8226, 8228, 8232, 8256, 270400, 1056, 1058, 1060, 1064, 1088, 33856, 80, 82, 84, 88, 96, 1120},
1214
+ {28, 32, 36, 40, 44, 64, 32, 8, 20, 32, 8224, 8228, 8232, 8236, 8256, 270400, 1056, 1060, 1064, 1068, 1088, 33856, 80, 84, 88, 92, 96, 2144},
1215
+ {32, 40, 48, 56, 64, 96, 64, 8, 24, 32, 8224, 8232, 8240, 8248, 8256, 270400, 1056, 1064, 1072, 1080, 1088, 33856, 80, 88, 96, 104, 128, 4224},
1216
+ {28, 40, 52, 64, 68, 96, 96, 16, 20, 32, 8224, 8236, 8248, 8252, 8256, 532544, 1056, 1068, 1080, 1084, 1088, 66624, 80, 92, 104, 108, 128, 6272},
1217
+ {32, 56, 80, 104, 112, 128, 192, 24, 24, 64, 8224, 8248, 8272, 8280, 8288, 794720, 1056, 1080, 1104, 1112, 1120, 99424, 80, 104, 128, 136, 160, 12448},
1218
+ {28, 29, 30, 31, 32, 64, 0, 8, 20, 32, 8224, 8225, 8226, 8227, 8256, 270400, 1056, 1057, 1058, 1059, 1088, 33856, 80, 80, 80, 80, 96, 96},
1219
+ {28, 30, 32, 36, 40, 64, 16, 8, 20, 32, 8224, 8226, 8228, 8232, 8256, 270400, 1056, 1058, 1060, 1064, 1088, 33856, 80, 82, 84, 88, 96, 1120},
1220
+ {28, 32, 36, 40, 44, 64, 32, 8, 20, 32, 8224, 8228, 8232, 8236, 8256, 270400, 1056, 1060, 1064, 1068, 1088, 33856, 80, 84, 88, 92, 96, 2144},
1221
+ {28, 29, 30, 31, 32, 64, 1, 8, 20, 32, 8224, 8225, 8226, 8227, 8256, 270400, 1056, 1057, 1058, 1059, 1088, 33856, 80, 80, 80, 80, 96, 160},
1222
+ {28, 32, 36, 40, 44, 64, 32, 8, 20, 32, 8224, 8228, 8232, 8236, 8256, 270400, 1056, 1060, 1064, 1068, 1088, 33856, 80, 84, 88, 92, 96, 2144},
1223
+ {28, 32, 36, 40, 44, 64, 0, 8, 20, 32, 8224, 8228, 8232, 8236, 8256, 270400, 1056, 1060, 1064, 1068, 1088, 33856, 88, 90, 92, 94, 96, 352},
1224
+ {28, 32, 36, 40, 44, 64, 0, 8, 20, 32, 8224, 8228, 8232, 8236, 8256, 270400, 1056, 1060, 1064, 1068, 1088, 33856, 88, 90, 92, 94, 96, 608},
1225
+ {28, 32, 36, 40, 44, 64, 0, 8, 20, 32, 8224, 8228, 8232, 8236, 8256, 270400, 1056, 1060, 1064, 1068, 1088, 33856, 88, 90, 92, 94, 96, 1120},
1226
+ {28, 32, 36, 40, 44, 64, 0, 8, 20, 32, 8224, 8228, 8232, 8236, 8256, 270400, 1056, 1060, 1064, 1068, 1088, 33856, 88, 90, 92, 94, 96, 96},
1227
+ {28, 44, 60, 76, 80, 96, 128, 16, 20, 64, 8224, 8240, 8256, 8260, 8288, 532576, 1056, 1072, 1088, 1092, 1120, 66656, 80, 96, 112, 116, 128, 8320},
1228
+ {32, 64, 96, 128, 136, 160, 256, 32, 24, 64, 8224, 8256, 8288, 8296, 8320, 1056896, 1056, 1088, 1120, 1128, 1152, 132224, 80, 112, 144, 152, 160, 16544},
1229
+ };
1230
+
1231
+ // ------------------------------------------------ Basic Lookup -----------------------------------------------------------
1232
+
1233
+ PNANOVDB_FORCE_INLINE pnanovdb_gridblindmetadata_handle_t pnanovdb_grid_get_gridblindmetadata(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, pnanovdb_uint32_t index)
1234
+ {
1235
+ pnanovdb_gridblindmetadata_handle_t meta = { grid.address };
1236
+ pnanovdb_uint64_t byte_offset = pnanovdb_grid_get_blind_metadata_offset(buf, grid);
1237
+ meta.address = pnanovdb_address_offset64(meta.address, byte_offset);
1238
+ meta.address = pnanovdb_address_offset_product(meta.address, PNANOVDB_GRIDBLINDMETADATA_SIZE, index);
1239
+ return meta;
1240
+ }
1241
+
1242
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanodvb_grid_get_gridblindmetadata_value_address(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, pnanovdb_uint32_t index)
1243
+ {
1244
+ pnanovdb_gridblindmetadata_handle_t meta = pnanovdb_grid_get_gridblindmetadata(buf, grid, index);
1245
+ pnanovdb_int64_t byte_offset = pnanovdb_gridblindmetadata_get_byte_offset(buf, meta);
1246
+ pnanovdb_address_t address = grid.address;
1247
+ address = pnanovdb_address_offset64(address, pnanovdb_int64_as_uint64(byte_offset));
1248
+ return address;
1249
+ }
1250
+
1251
+ PNANOVDB_FORCE_INLINE pnanovdb_tree_handle_t pnanovdb_grid_get_tree(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid)
1252
+ {
1253
+ pnanovdb_tree_handle_t tree = { grid.address };
1254
+ tree.address = pnanovdb_address_offset(tree.address, PNANOVDB_GRID_SIZE);
1255
+ return tree;
1256
+ }
1257
+
1258
+ PNANOVDB_FORCE_INLINE pnanovdb_root_handle_t pnanovdb_tree_get_root(pnanovdb_buf_t buf, pnanovdb_tree_handle_t tree)
1259
+ {
1260
+ pnanovdb_root_handle_t root = { tree.address };
1261
+ pnanovdb_uint64_t byte_offset = pnanovdb_tree_get_node_offset_root(buf, tree);
1262
+ root.address = pnanovdb_address_offset64(root.address, byte_offset);
1263
+ return root;
1264
+ }
1265
+
1266
+ PNANOVDB_FORCE_INLINE pnanovdb_root_tile_handle_t pnanovdb_root_get_tile(pnanovdb_grid_type_t grid_type, pnanovdb_root_handle_t root, pnanovdb_uint32_t n)
1267
+ {
1268
+ pnanovdb_root_tile_handle_t tile = { root.address };
1269
+ tile.address = pnanovdb_address_offset(tile.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_size));
1270
+ tile.address = pnanovdb_address_offset_product(tile.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_tile_size), n);
1271
+ return tile;
1272
+ }
1273
+
1274
+ PNANOVDB_FORCE_INLINE pnanovdb_root_tile_handle_t pnanovdb_root_get_tile_zero(pnanovdb_grid_type_t grid_type, pnanovdb_root_handle_t root)
1275
+ {
1276
+ pnanovdb_root_tile_handle_t tile = { root.address };
1277
+ tile.address = pnanovdb_address_offset(tile.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_size));
1278
+ return tile;
1279
+ }
1280
+
1281
+ PNANOVDB_FORCE_INLINE pnanovdb_upper_handle_t pnanovdb_root_get_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, pnanovdb_root_tile_handle_t tile)
1282
+ {
1283
+ pnanovdb_upper_handle_t upper = { root.address };
1284
+ upper.address = pnanovdb_address_offset64(upper.address, pnanovdb_int64_as_uint64(pnanovdb_root_tile_get_child(buf, tile)));
1285
+ return upper;
1286
+ }
1287
+
1288
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_coord_to_key(PNANOVDB_IN(pnanovdb_coord_t) ijk)
1289
+ {
1290
+ #if defined(PNANOVDB_NATIVE_64)
1291
+ pnanovdb_uint64_t iu = pnanovdb_int32_as_uint32(PNANOVDB_DEREF(ijk).x) >> 12u;
1292
+ pnanovdb_uint64_t ju = pnanovdb_int32_as_uint32(PNANOVDB_DEREF(ijk).y) >> 12u;
1293
+ pnanovdb_uint64_t ku = pnanovdb_int32_as_uint32(PNANOVDB_DEREF(ijk).z) >> 12u;
1294
+ return (ku) | (ju << 21u) | (iu << 42u);
1295
+ #else
1296
+ pnanovdb_uint32_t iu = pnanovdb_int32_as_uint32(PNANOVDB_DEREF(ijk).x) >> 12u;
1297
+ pnanovdb_uint32_t ju = pnanovdb_int32_as_uint32(PNANOVDB_DEREF(ijk).y) >> 12u;
1298
+ pnanovdb_uint32_t ku = pnanovdb_int32_as_uint32(PNANOVDB_DEREF(ijk).z) >> 12u;
1299
+ pnanovdb_uint32_t key_x = ku | (ju << 21);
1300
+ pnanovdb_uint32_t key_y = (iu << 10) | (ju >> 11);
1301
+ return pnanovdb_uint32_as_uint64(key_x, key_y);
1302
+ #endif
1303
+ }
1304
+
1305
+ PNANOVDB_FORCE_INLINE pnanovdb_root_tile_handle_t pnanovdb_root_find_tile(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1306
+ {
1307
+ pnanovdb_uint32_t tile_count = pnanovdb_uint32_as_int32(pnanovdb_root_get_tile_count(buf, root));
1308
+ pnanovdb_root_tile_handle_t tile = pnanovdb_root_get_tile_zero(grid_type, root);
1309
+ pnanovdb_uint64_t key = pnanovdb_coord_to_key(ijk);
1310
+ for (pnanovdb_uint32_t i = 0u; i < tile_count; i++)
1311
+ {
1312
+ if (pnanovdb_uint64_is_equal(key, pnanovdb_root_tile_get_key(buf, tile)))
1313
+ {
1314
+ return tile;
1315
+ }
1316
+ tile.address = pnanovdb_address_offset(tile.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_tile_size));
1317
+ }
1318
+ pnanovdb_root_tile_handle_t null_handle = { pnanovdb_address_null() };
1319
+ return null_handle;
1320
+ }
1321
+
1322
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_leaf_coord_to_offset(PNANOVDB_IN(pnanovdb_coord_t) ijk)
1323
+ {
1324
+ return (((PNANOVDB_DEREF(ijk).x & 7) >> 0) << (2 * 3)) +
1325
+ (((PNANOVDB_DEREF(ijk).y & 7) >> 0) << (3)) +
1326
+ ((PNANOVDB_DEREF(ijk).z & 7) >> 0);
1327
+ }
1328
+
1329
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_min_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t node)
1330
+ {
1331
+ pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, leaf_off_min);
1332
+ return pnanovdb_address_offset(node.address, byte_offset);
1333
+ }
1334
+
1335
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_max_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t node)
1336
+ {
1337
+ pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, leaf_off_max);
1338
+ return pnanovdb_address_offset(node.address, byte_offset);
1339
+ }
1340
+
1341
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_ave_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t node)
1342
+ {
1343
+ pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, leaf_off_ave);
1344
+ return pnanovdb_address_offset(node.address, byte_offset);
1345
+ }
1346
+
1347
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_stddev_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t node)
1348
+ {
1349
+ pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, leaf_off_stddev);
1350
+ return pnanovdb_address_offset(node.address, byte_offset);
1351
+ }
1352
+
1353
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_table_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t node, pnanovdb_uint32_t n)
1354
+ {
1355
+ pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, leaf_off_table) + ((PNANOVDB_GRID_TYPE_GET(grid_type, value_stride_bits) * n) >> 3u);
1356
+ return pnanovdb_address_offset(node.address, byte_offset);
1357
+ }
1358
+
1359
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1360
+ {
1361
+ pnanovdb_uint32_t n = pnanovdb_leaf_coord_to_offset(ijk);
1362
+ return pnanovdb_leaf_get_table_address(grid_type, buf, leaf, n);
1363
+ }
1364
+
1365
+ PNANOVDB_FORCE_INLINE float pnanovdb_leaf_fp_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk, pnanovdb_uint32_t value_log_bits)
1366
+ {
1367
+ // value_log_bits // 2 3 4
1368
+ pnanovdb_uint32_t value_bits = 1u << value_log_bits; // 4 8 16
1369
+ pnanovdb_uint32_t value_mask = (1u << value_bits) - 1u; // 0xF 0xFF 0xFFFF
1370
+ pnanovdb_uint32_t values_per_word_bits = 5u - value_log_bits; // 3 2 1
1371
+ pnanovdb_uint32_t values_per_word_mask = (1u << values_per_word_bits) - 1u; // 7 3 1
1372
+
1373
+ pnanovdb_uint32_t n = pnanovdb_leaf_coord_to_offset(ijk);
1374
+ float minimum = pnanovdb_read_float(buf, pnanovdb_address_offset_neg(address, PNANOVDB_LEAF_TABLE_NEG_OFF_MINIMUM));
1375
+ float quantum = pnanovdb_read_float(buf, pnanovdb_address_offset_neg(address, PNANOVDB_LEAF_TABLE_NEG_OFF_QUANTUM));
1376
+ pnanovdb_uint32_t raw = pnanovdb_read_uint32(buf, pnanovdb_address_offset(address, ((n >> values_per_word_bits) << 2u)));
1377
+ pnanovdb_uint32_t value_compressed = (raw >> ((n & values_per_word_mask) << value_log_bits)) & value_mask;
1378
+ return pnanovdb_uint32_to_float(value_compressed) * quantum + minimum;
1379
+ }
1380
+
1381
+ PNANOVDB_FORCE_INLINE float pnanovdb_leaf_fp4_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1382
+ {
1383
+ return pnanovdb_leaf_fp_read_float(buf, address, ijk, 2u);
1384
+ }
1385
+
1386
+ PNANOVDB_FORCE_INLINE float pnanovdb_leaf_fp8_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1387
+ {
1388
+ return pnanovdb_leaf_fp_read_float(buf, address, ijk, 3u);
1389
+ }
1390
+
1391
+ PNANOVDB_FORCE_INLINE float pnanovdb_leaf_fp16_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1392
+ {
1393
+ return pnanovdb_leaf_fp_read_float(buf, address, ijk, 4u);
1394
+ }
1395
+
1396
+ PNANOVDB_FORCE_INLINE float pnanovdb_leaf_fpn_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1397
+ {
1398
+ pnanovdb_uint32_t bbox_dif_and_flags = pnanovdb_read_uint32(buf, pnanovdb_address_offset_neg(address, PNANOVDB_LEAF_TABLE_NEG_OFF_BBOX_DIF_AND_FLAGS));
1399
+ pnanovdb_uint32_t flags = bbox_dif_and_flags >> 24u;
1400
+ pnanovdb_uint32_t value_log_bits = flags >> 5; // b = 0, 1, 2, 3, 4 corresponding to 1, 2, 4, 8, 16 bits
1401
+ return pnanovdb_leaf_fp_read_float(buf, address, ijk, value_log_bits);
1402
+ }
1403
+
1404
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_lower_coord_to_offset(PNANOVDB_IN(pnanovdb_coord_t) ijk)
1405
+ {
1406
+ return (((PNANOVDB_DEREF(ijk).x & 127) >> 3) << (2 * 4)) +
1407
+ (((PNANOVDB_DEREF(ijk).y & 127) >> 3) << (4)) +
1408
+ ((PNANOVDB_DEREF(ijk).z & 127) >> 3);
1409
+ }
1410
+
1411
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_min_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node)
1412
+ {
1413
+ pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, lower_off_min);
1414
+ return pnanovdb_address_offset(node.address, byte_offset);
1415
+ }
1416
+
1417
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_max_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node)
1418
+ {
1419
+ pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, lower_off_max);
1420
+ return pnanovdb_address_offset(node.address, byte_offset);
1421
+ }
1422
+
1423
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_ave_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node)
1424
+ {
1425
+ pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, lower_off_ave);
1426
+ return pnanovdb_address_offset(node.address, byte_offset);
1427
+ }
1428
+
1429
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_stddev_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node)
1430
+ {
1431
+ pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, lower_off_stddev);
1432
+ return pnanovdb_address_offset(node.address, byte_offset);
1433
+ }
1434
+
1435
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_table_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node, pnanovdb_uint32_t n)
1436
+ {
1437
+ pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, lower_off_table) + PNANOVDB_GRID_TYPE_GET(grid_type, table_stride) * n;
1438
+ return pnanovdb_address_offset(node.address, byte_offset);
1439
+ }
1440
+
1441
+ PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_lower_get_table_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node, pnanovdb_uint32_t n)
1442
+ {
1443
+ pnanovdb_address_t table_address = pnanovdb_lower_get_table_address(grid_type, buf, node, n);
1444
+ return pnanovdb_read_int64(buf, table_address);
1445
+ }
1446
+
1447
+ PNANOVDB_FORCE_INLINE pnanovdb_leaf_handle_t pnanovdb_lower_get_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, pnanovdb_uint32_t n)
1448
+ {
1449
+ pnanovdb_leaf_handle_t leaf = { lower.address };
1450
+ leaf.address = pnanovdb_address_offset64(leaf.address, pnanovdb_int64_as_uint64(pnanovdb_lower_get_table_child(grid_type, buf, lower, n)));
1451
+ return leaf;
1452
+ }
1453
+
1454
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_value_address_and_level(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
1455
+ {
1456
+ pnanovdb_uint32_t n = pnanovdb_lower_coord_to_offset(ijk);
1457
+ pnanovdb_address_t value_address;
1458
+ if (pnanovdb_lower_get_child_mask(buf, lower, n))
1459
+ {
1460
+ pnanovdb_leaf_handle_t child = pnanovdb_lower_get_child(grid_type, buf, lower, n);
1461
+ value_address = pnanovdb_leaf_get_value_address(grid_type, buf, child, ijk);
1462
+ PNANOVDB_DEREF(level) = 0u;
1463
+ }
1464
+ else
1465
+ {
1466
+ value_address = pnanovdb_lower_get_table_address(grid_type, buf, lower, n);
1467
+ PNANOVDB_DEREF(level) = 1u;
1468
+ }
1469
+ return value_address;
1470
+ }
1471
+
1472
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1473
+ {
1474
+ pnanovdb_uint32_t level;
1475
+ return pnanovdb_lower_get_value_address_and_level(grid_type, buf, lower, ijk, PNANOVDB_REF(level));
1476
+ }
1477
+
1478
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_upper_coord_to_offset(PNANOVDB_IN(pnanovdb_coord_t) ijk)
1479
+ {
1480
+ return (((PNANOVDB_DEREF(ijk).x & 4095) >> 7) << (2 * 5)) +
1481
+ (((PNANOVDB_DEREF(ijk).y & 4095) >> 7) << (5)) +
1482
+ ((PNANOVDB_DEREF(ijk).z & 4095) >> 7);
1483
+ }
1484
+
1485
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_min_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t node)
1486
+ {
1487
+ pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, upper_off_min);
1488
+ return pnanovdb_address_offset(node.address, byte_offset);
1489
+ }
1490
+
1491
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_max_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t node)
1492
+ {
1493
+ pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, upper_off_max);
1494
+ return pnanovdb_address_offset(node.address, byte_offset);
1495
+ }
1496
+
1497
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_ave_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t node)
1498
+ {
1499
+ pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, upper_off_ave);
1500
+ return pnanovdb_address_offset(node.address, byte_offset);
1501
+ }
1502
+
1503
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_stddev_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t node)
1504
+ {
1505
+ pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, upper_off_stddev);
1506
+ return pnanovdb_address_offset(node.address, byte_offset);
1507
+ }
1508
+
1509
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_table_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t node, pnanovdb_uint32_t n)
1510
+ {
1511
+ pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, upper_off_table) + PNANOVDB_GRID_TYPE_GET(grid_type, table_stride) * n;
1512
+ return pnanovdb_address_offset(node.address, byte_offset);
1513
+ }
1514
+
1515
+ PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_upper_get_table_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t node, pnanovdb_uint32_t n)
1516
+ {
1517
+ pnanovdb_address_t bufAddress = pnanovdb_upper_get_table_address(grid_type, buf, node, n);
1518
+ return pnanovdb_read_int64(buf, bufAddress);
1519
+ }
1520
+
1521
+ PNANOVDB_FORCE_INLINE pnanovdb_lower_handle_t pnanovdb_upper_get_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, pnanovdb_uint32_t n)
1522
+ {
1523
+ pnanovdb_lower_handle_t lower = { upper.address };
1524
+ lower.address = pnanovdb_address_offset64(lower.address, pnanovdb_int64_as_uint64(pnanovdb_upper_get_table_child(grid_type, buf, upper, n)));
1525
+ return lower;
1526
+ }
1527
+
1528
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_value_address_and_level(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
1529
+ {
1530
+ pnanovdb_uint32_t n = pnanovdb_upper_coord_to_offset(ijk);
1531
+ pnanovdb_address_t value_address;
1532
+ if (pnanovdb_upper_get_child_mask(buf, upper, n))
1533
+ {
1534
+ pnanovdb_lower_handle_t child = pnanovdb_upper_get_child(grid_type, buf, upper, n);
1535
+ value_address = pnanovdb_lower_get_value_address_and_level(grid_type, buf, child, ijk, level);
1536
+ }
1537
+ else
1538
+ {
1539
+ value_address = pnanovdb_upper_get_table_address(grid_type, buf, upper, n);
1540
+ PNANOVDB_DEREF(level) = 2u;
1541
+ }
1542
+ return value_address;
1543
+ }
1544
+
1545
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1546
+ {
1547
+ pnanovdb_uint32_t level;
1548
+ return pnanovdb_upper_get_value_address_and_level(grid_type, buf, upper, ijk, PNANOVDB_REF(level));
1549
+ }
1550
+
1551
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_min_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root)
1552
+ {
1553
+ pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, root_off_min);
1554
+ return pnanovdb_address_offset(root.address, byte_offset);
1555
+ }
1556
+
1557
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_max_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root)
1558
+ {
1559
+ pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, root_off_max);
1560
+ return pnanovdb_address_offset(root.address, byte_offset);
1561
+ }
1562
+
1563
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_ave_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root)
1564
+ {
1565
+ pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, root_off_ave);
1566
+ return pnanovdb_address_offset(root.address, byte_offset);
1567
+ }
1568
+
1569
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_stddev_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root)
1570
+ {
1571
+ pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, root_off_stddev);
1572
+ return pnanovdb_address_offset(root.address, byte_offset);
1573
+ }
1574
+
1575
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_tile_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t root_tile)
1576
+ {
1577
+ pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, root_tile_off_value);
1578
+ return pnanovdb_address_offset(root_tile.address, byte_offset);
1579
+ }
1580
+
1581
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address_and_level(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
1582
+ {
1583
+ pnanovdb_root_tile_handle_t tile = pnanovdb_root_find_tile(grid_type, buf, root, ijk);
1584
+ pnanovdb_address_t ret;
1585
+ if (pnanovdb_address_is_null(tile.address))
1586
+ {
1587
+ ret = pnanovdb_address_offset(root.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_off_background));
1588
+ PNANOVDB_DEREF(level) = 4u;
1589
+ }
1590
+ else if (pnanovdb_int64_is_zero(pnanovdb_root_tile_get_child(buf, tile)))
1591
+ {
1592
+ ret = pnanovdb_address_offset(tile.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_tile_off_value));
1593
+ PNANOVDB_DEREF(level) = 3u;
1594
+ }
1595
+ else
1596
+ {
1597
+ pnanovdb_upper_handle_t child = pnanovdb_root_get_child(grid_type, buf, root, tile);
1598
+ ret = pnanovdb_upper_get_value_address_and_level(grid_type, buf, child, ijk, level);
1599
+ }
1600
+ return ret;
1601
+ }
1602
+
1603
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1604
+ {
1605
+ pnanovdb_uint32_t level;
1606
+ return pnanovdb_root_get_value_address_and_level(grid_type, buf, root, ijk, PNANOVDB_REF(level));
1607
+ }
1608
+
1609
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address_bit(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_uint32_t) bit_index)
1610
+ {
1611
+ pnanovdb_uint32_t level;
1612
+ pnanovdb_address_t address = pnanovdb_root_get_value_address_and_level(grid_type, buf, root, ijk, PNANOVDB_REF(level));
1613
+ PNANOVDB_DEREF(bit_index) = level == 0u ? pnanovdb_int32_as_uint32(PNANOVDB_DEREF(ijk).x & 7) : 0u;
1614
+ return address;
1615
+ }
1616
+
1617
+ PNANOVDB_FORCE_INLINE float pnanovdb_root_fp4_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk, pnanovdb_uint32_t level)
1618
+ {
1619
+ float ret;
1620
+ if (level == 0)
1621
+ {
1622
+ ret = pnanovdb_leaf_fp4_read_float(buf, address, ijk);
1623
+ }
1624
+ else
1625
+ {
1626
+ ret = pnanovdb_read_float(buf, address);
1627
+ }
1628
+ return ret;
1629
+ }
1630
+
1631
+ PNANOVDB_FORCE_INLINE float pnanovdb_root_fp8_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk, pnanovdb_uint32_t level)
1632
+ {
1633
+ float ret;
1634
+ if (level == 0)
1635
+ {
1636
+ ret = pnanovdb_leaf_fp8_read_float(buf, address, ijk);
1637
+ }
1638
+ else
1639
+ {
1640
+ ret = pnanovdb_read_float(buf, address);
1641
+ }
1642
+ return ret;
1643
+ }
1644
+
1645
+ PNANOVDB_FORCE_INLINE float pnanovdb_root_fp16_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk, pnanovdb_uint32_t level)
1646
+ {
1647
+ float ret;
1648
+ if (level == 0)
1649
+ {
1650
+ ret = pnanovdb_leaf_fp16_read_float(buf, address, ijk);
1651
+ }
1652
+ else
1653
+ {
1654
+ ret = pnanovdb_read_float(buf, address);
1655
+ }
1656
+ return ret;
1657
+ }
1658
+
1659
+ PNANOVDB_FORCE_INLINE float pnanovdb_root_fpn_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk, pnanovdb_uint32_t level)
1660
+ {
1661
+ float ret;
1662
+ if (level == 0)
1663
+ {
1664
+ ret = pnanovdb_leaf_fpn_read_float(buf, address, ijk);
1665
+ }
1666
+ else
1667
+ {
1668
+ ret = pnanovdb_read_float(buf, address);
1669
+ }
1670
+ return ret;
1671
+ }
1672
+
1673
+ // ------------------------------------------------ ReadAccessor -----------------------------------------------------------
1674
+
1675
+ struct pnanovdb_readaccessor_t
1676
+ {
1677
+ pnanovdb_coord_t key;
1678
+ pnanovdb_leaf_handle_t leaf;
1679
+ pnanovdb_lower_handle_t lower;
1680
+ pnanovdb_upper_handle_t upper;
1681
+ pnanovdb_root_handle_t root;
1682
+ };
1683
+ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_readaccessor_t)
1684
+
1685
+ PNANOVDB_FORCE_INLINE void pnanovdb_readaccessor_init(PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, pnanovdb_root_handle_t root)
1686
+ {
1687
+ PNANOVDB_DEREF(acc).key.x = 0x7FFFFFFF;
1688
+ PNANOVDB_DEREF(acc).key.y = 0x7FFFFFFF;
1689
+ PNANOVDB_DEREF(acc).key.z = 0x7FFFFFFF;
1690
+ PNANOVDB_DEREF(acc).leaf.address = pnanovdb_address_null();
1691
+ PNANOVDB_DEREF(acc).lower.address = pnanovdb_address_null();
1692
+ PNANOVDB_DEREF(acc).upper.address = pnanovdb_address_null();
1693
+ PNANOVDB_DEREF(acc).root = root;
1694
+ }
1695
+
1696
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_readaccessor_iscached0(PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, int dirty)
1697
+ {
1698
+ if (pnanovdb_address_is_null(PNANOVDB_DEREF(acc).leaf.address)) { return PNANOVDB_FALSE; }
1699
+ if ((dirty & ~((1u << 3) - 1u)) != 0)
1700
+ {
1701
+ PNANOVDB_DEREF(acc).leaf.address = pnanovdb_address_null();
1702
+ return PNANOVDB_FALSE;
1703
+ }
1704
+ return PNANOVDB_TRUE;
1705
+ }
1706
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_readaccessor_iscached1(PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, int dirty)
1707
+ {
1708
+ if (pnanovdb_address_is_null(PNANOVDB_DEREF(acc).lower.address)) { return PNANOVDB_FALSE; }
1709
+ if ((dirty & ~((1u << 7) - 1u)) != 0)
1710
+ {
1711
+ PNANOVDB_DEREF(acc).lower.address = pnanovdb_address_null();
1712
+ return PNANOVDB_FALSE;
1713
+ }
1714
+ return PNANOVDB_TRUE;
1715
+ }
1716
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_readaccessor_iscached2(PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, int dirty)
1717
+ {
1718
+ if (pnanovdb_address_is_null(PNANOVDB_DEREF(acc).upper.address)) { return PNANOVDB_FALSE; }
1719
+ if ((dirty & ~((1u << 12) - 1u)) != 0)
1720
+ {
1721
+ PNANOVDB_DEREF(acc).upper.address = pnanovdb_address_null();
1722
+ return PNANOVDB_FALSE;
1723
+ }
1724
+ return PNANOVDB_TRUE;
1725
+ }
1726
+ PNANOVDB_FORCE_INLINE int pnanovdb_readaccessor_computedirty(PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1727
+ {
1728
+ return (PNANOVDB_DEREF(ijk).x ^ PNANOVDB_DEREF(acc).key.x) | (PNANOVDB_DEREF(ijk).y ^ PNANOVDB_DEREF(acc).key.y) | (PNANOVDB_DEREF(ijk).z ^ PNANOVDB_DEREF(acc).key.z);
1729
+ }
1730
+
1731
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_value_address_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
1732
+ {
1733
+ pnanovdb_uint32_t n = pnanovdb_leaf_coord_to_offset(ijk);
1734
+ return pnanovdb_leaf_get_table_address(grid_type, buf, leaf, n);
1735
+ }
1736
+
1737
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_value_address_and_level_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
1738
+ {
1739
+ pnanovdb_uint32_t n = pnanovdb_lower_coord_to_offset(ijk);
1740
+ pnanovdb_address_t value_address;
1741
+ if (pnanovdb_lower_get_child_mask(buf, lower, n))
1742
+ {
1743
+ pnanovdb_leaf_handle_t child = pnanovdb_lower_get_child(grid_type, buf, lower, n);
1744
+ PNANOVDB_DEREF(acc).leaf = child;
1745
+ PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
1746
+ value_address = pnanovdb_leaf_get_value_address_and_cache(grid_type, buf, child, ijk, acc);
1747
+ PNANOVDB_DEREF(level) = 0u;
1748
+ }
1749
+ else
1750
+ {
1751
+ value_address = pnanovdb_lower_get_table_address(grid_type, buf, lower, n);
1752
+ PNANOVDB_DEREF(level) = 1u;
1753
+ }
1754
+ return value_address;
1755
+ }
1756
+
1757
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_value_address_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
1758
+ {
1759
+ pnanovdb_uint32_t level;
1760
+ return pnanovdb_lower_get_value_address_and_level_and_cache(grid_type, buf, lower, ijk, acc, PNANOVDB_REF(level));
1761
+ }
1762
+
1763
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_value_address_and_level_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
1764
+ {
1765
+ pnanovdb_uint32_t n = pnanovdb_upper_coord_to_offset(ijk);
1766
+ pnanovdb_address_t value_address;
1767
+ if (pnanovdb_upper_get_child_mask(buf, upper, n))
1768
+ {
1769
+ pnanovdb_lower_handle_t child = pnanovdb_upper_get_child(grid_type, buf, upper, n);
1770
+ PNANOVDB_DEREF(acc).lower = child;
1771
+ PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
1772
+ value_address = pnanovdb_lower_get_value_address_and_level_and_cache(grid_type, buf, child, ijk, acc, level);
1773
+ }
1774
+ else
1775
+ {
1776
+ value_address = pnanovdb_upper_get_table_address(grid_type, buf, upper, n);
1777
+ PNANOVDB_DEREF(level) = 2u;
1778
+ }
1779
+ return value_address;
1780
+ }
1781
+
1782
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_value_address_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
1783
+ {
1784
+ pnanovdb_uint32_t level;
1785
+ return pnanovdb_upper_get_value_address_and_level_and_cache(grid_type, buf, upper, ijk, acc, PNANOVDB_REF(level));
1786
+ }
1787
+
1788
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address_and_level_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
1789
+ {
1790
+ pnanovdb_root_tile_handle_t tile = pnanovdb_root_find_tile(grid_type, buf, root, ijk);
1791
+ pnanovdb_address_t ret;
1792
+ if (pnanovdb_address_is_null(tile.address))
1793
+ {
1794
+ ret = pnanovdb_address_offset(root.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_off_background));
1795
+ PNANOVDB_DEREF(level) = 4u;
1796
+ }
1797
+ else if (pnanovdb_int64_is_zero(pnanovdb_root_tile_get_child(buf, tile)))
1798
+ {
1799
+ ret = pnanovdb_address_offset(tile.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_tile_off_value));
1800
+ PNANOVDB_DEREF(level) = 3u;
1801
+ }
1802
+ else
1803
+ {
1804
+ pnanovdb_upper_handle_t child = pnanovdb_root_get_child(grid_type, buf, root, tile);
1805
+ PNANOVDB_DEREF(acc).upper = child;
1806
+ PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
1807
+ ret = pnanovdb_upper_get_value_address_and_level_and_cache(grid_type, buf, child, ijk, acc, level);
1808
+ }
1809
+ return ret;
1810
+ }
1811
+
1812
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
1813
+ {
1814
+ pnanovdb_uint32_t level;
1815
+ return pnanovdb_root_get_value_address_and_level_and_cache(grid_type, buf, root, ijk, acc, PNANOVDB_REF(level));
1816
+ }
1817
+
1818
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_readaccessor_get_value_address_and_level(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
1819
+ {
1820
+ int dirty = pnanovdb_readaccessor_computedirty(acc, ijk);
1821
+
1822
+ pnanovdb_address_t value_address;
1823
+ if (pnanovdb_readaccessor_iscached0(acc, dirty))
1824
+ {
1825
+ value_address = pnanovdb_leaf_get_value_address_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).leaf, ijk, acc);
1826
+ PNANOVDB_DEREF(level) = 0u;
1827
+ }
1828
+ else if (pnanovdb_readaccessor_iscached1(acc, dirty))
1829
+ {
1830
+ value_address = pnanovdb_lower_get_value_address_and_level_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).lower, ijk, acc, level);
1831
+ }
1832
+ else if (pnanovdb_readaccessor_iscached2(acc, dirty))
1833
+ {
1834
+ value_address = pnanovdb_upper_get_value_address_and_level_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).upper, ijk, acc, level);
1835
+ }
1836
+ else
1837
+ {
1838
+ value_address = pnanovdb_root_get_value_address_and_level_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).root, ijk, acc, level);
1839
+ }
1840
+ return value_address;
1841
+ }
1842
+
1843
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_readaccessor_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1844
+ {
1845
+ pnanovdb_uint32_t level;
1846
+ return pnanovdb_readaccessor_get_value_address_and_level(grid_type, buf, acc, ijk, PNANOVDB_REF(level));
1847
+ }
1848
+
1849
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_readaccessor_get_value_address_bit(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_uint32_t) bit_index)
1850
+ {
1851
+ pnanovdb_uint32_t level;
1852
+ pnanovdb_address_t address = pnanovdb_readaccessor_get_value_address_and_level(grid_type, buf, acc, ijk, PNANOVDB_REF(level));
1853
+ PNANOVDB_DEREF(bit_index) = level == 0u ? pnanovdb_int32_as_uint32(PNANOVDB_DEREF(ijk).x & 7) : 0u;
1854
+ return address;
1855
+ }
1856
+
1857
+ // ------------------------------------------------ ReadAccessor GetDim -----------------------------------------------------------
1858
+
1859
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_leaf_get_dim_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
1860
+ {
1861
+ return 1u;
1862
+ }
1863
+
1864
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_lower_get_dim_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
1865
+ {
1866
+ pnanovdb_uint32_t n = pnanovdb_lower_coord_to_offset(ijk);
1867
+ pnanovdb_uint32_t ret;
1868
+ if (pnanovdb_lower_get_child_mask(buf, lower, n))
1869
+ {
1870
+ pnanovdb_leaf_handle_t child = pnanovdb_lower_get_child(grid_type, buf, lower, n);
1871
+ PNANOVDB_DEREF(acc).leaf = child;
1872
+ PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
1873
+ ret = pnanovdb_leaf_get_dim_and_cache(grid_type, buf, child, ijk, acc);
1874
+ }
1875
+ else
1876
+ {
1877
+ ret = (1u << (3u)); // node 0 dim
1878
+ }
1879
+ return ret;
1880
+ }
1881
+
1882
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_upper_get_dim_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
1883
+ {
1884
+ pnanovdb_uint32_t n = pnanovdb_upper_coord_to_offset(ijk);
1885
+ pnanovdb_uint32_t ret;
1886
+ if (pnanovdb_upper_get_child_mask(buf, upper, n))
1887
+ {
1888
+ pnanovdb_lower_handle_t child = pnanovdb_upper_get_child(grid_type, buf, upper, n);
1889
+ PNANOVDB_DEREF(acc).lower = child;
1890
+ PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
1891
+ ret = pnanovdb_lower_get_dim_and_cache(grid_type, buf, child, ijk, acc);
1892
+ }
1893
+ else
1894
+ {
1895
+ ret = (1u << (4u + 3u)); // node 1 dim
1896
+ }
1897
+ return ret;
1898
+ }
1899
+
1900
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_root_get_dim_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
1901
+ {
1902
+ pnanovdb_root_tile_handle_t tile = pnanovdb_root_find_tile(grid_type, buf, root, ijk);
1903
+ pnanovdb_uint32_t ret;
1904
+ if (pnanovdb_address_is_null(tile.address))
1905
+ {
1906
+ ret = 1u << (5u + 4u + 3u); // background, node 2 dim
1907
+ }
1908
+ else if (pnanovdb_int64_is_zero(pnanovdb_root_tile_get_child(buf, tile)))
1909
+ {
1910
+ ret = 1u << (5u + 4u + 3u); // tile value, node 2 dim
1911
+ }
1912
+ else
1913
+ {
1914
+ pnanovdb_upper_handle_t child = pnanovdb_root_get_child(grid_type, buf, root, tile);
1915
+ PNANOVDB_DEREF(acc).upper = child;
1916
+ PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
1917
+ ret = pnanovdb_upper_get_dim_and_cache(grid_type, buf, child, ijk, acc);
1918
+ }
1919
+ return ret;
1920
+ }
1921
+
1922
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_readaccessor_get_dim(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1923
+ {
1924
+ int dirty = pnanovdb_readaccessor_computedirty(acc, ijk);
1925
+
1926
+ pnanovdb_uint32_t dim;
1927
+ if (pnanovdb_readaccessor_iscached0(acc, dirty))
1928
+ {
1929
+ dim = pnanovdb_leaf_get_dim_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).leaf, ijk, acc);
1930
+ }
1931
+ else if (pnanovdb_readaccessor_iscached1(acc, dirty))
1932
+ {
1933
+ dim = pnanovdb_lower_get_dim_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).lower, ijk, acc);
1934
+ }
1935
+ else if (pnanovdb_readaccessor_iscached2(acc, dirty))
1936
+ {
1937
+ dim = pnanovdb_upper_get_dim_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).upper, ijk, acc);
1938
+ }
1939
+ else
1940
+ {
1941
+ dim = pnanovdb_root_get_dim_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).root, ijk, acc);
1942
+ }
1943
+ return dim;
1944
+ }
1945
+
1946
+ // ------------------------------------------------ ReadAccessor IsActive -----------------------------------------------------------
1947
+
1948
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_is_active_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
1949
+ {
1950
+ pnanovdb_uint32_t n = pnanovdb_leaf_coord_to_offset(ijk);
1951
+ return pnanovdb_leaf_get_value_mask(buf, leaf, n);
1952
+ }
1953
+
1954
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_lower_is_active_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
1955
+ {
1956
+ pnanovdb_uint32_t n = pnanovdb_lower_coord_to_offset(ijk);
1957
+ pnanovdb_bool_t is_active;
1958
+ if (pnanovdb_lower_get_child_mask(buf, lower, n))
1959
+ {
1960
+ pnanovdb_leaf_handle_t child = pnanovdb_lower_get_child(grid_type, buf, lower, n);
1961
+ PNANOVDB_DEREF(acc).leaf = child;
1962
+ PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
1963
+ is_active = pnanovdb_leaf_is_active_and_cache(grid_type, buf, child, ijk, acc);
1964
+ }
1965
+ else
1966
+ {
1967
+ is_active = pnanovdb_lower_get_value_mask(buf, lower, n);
1968
+ }
1969
+ return is_active;
1970
+ }
1971
+
1972
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_upper_is_active_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
1973
+ {
1974
+ pnanovdb_uint32_t n = pnanovdb_upper_coord_to_offset(ijk);
1975
+ pnanovdb_bool_t is_active;
1976
+ if (pnanovdb_upper_get_child_mask(buf, upper, n))
1977
+ {
1978
+ pnanovdb_lower_handle_t child = pnanovdb_upper_get_child(grid_type, buf, upper, n);
1979
+ PNANOVDB_DEREF(acc).lower = child;
1980
+ PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
1981
+ is_active = pnanovdb_lower_is_active_and_cache(grid_type, buf, child, ijk, acc);
1982
+ }
1983
+ else
1984
+ {
1985
+ is_active = pnanovdb_upper_get_value_mask(buf, upper, n);
1986
+ }
1987
+ return is_active;
1988
+ }
1989
+
1990
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_root_is_active_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
1991
+ {
1992
+ pnanovdb_root_tile_handle_t tile = pnanovdb_root_find_tile(grid_type, buf, root, ijk);
1993
+ pnanovdb_bool_t is_active;
1994
+ if (pnanovdb_address_is_null(tile.address))
1995
+ {
1996
+ is_active = PNANOVDB_FALSE; // background
1997
+ }
1998
+ else if (pnanovdb_int64_is_zero(pnanovdb_root_tile_get_child(buf, tile)))
1999
+ {
2000
+ pnanovdb_uint32_t state = pnanovdb_root_tile_get_state(buf, tile);
2001
+ is_active = state != 0u; // tile value
2002
+ }
2003
+ else
2004
+ {
2005
+ pnanovdb_upper_handle_t child = pnanovdb_root_get_child(grid_type, buf, root, tile);
2006
+ PNANOVDB_DEREF(acc).upper = child;
2007
+ PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
2008
+ is_active = pnanovdb_upper_is_active_and_cache(grid_type, buf, child, ijk, acc);
2009
+ }
2010
+ return is_active;
2011
+ }
2012
+
2013
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_readaccessor_is_active(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk)
2014
+ {
2015
+ int dirty = pnanovdb_readaccessor_computedirty(acc, ijk);
2016
+
2017
+ pnanovdb_bool_t is_active;
2018
+ if (pnanovdb_readaccessor_iscached0(acc, dirty))
2019
+ {
2020
+ is_active = pnanovdb_leaf_is_active_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).leaf, ijk, acc);
2021
+ }
2022
+ else if (pnanovdb_readaccessor_iscached1(acc, dirty))
2023
+ {
2024
+ is_active = pnanovdb_lower_is_active_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).lower, ijk, acc);
2025
+ }
2026
+ else if (pnanovdb_readaccessor_iscached2(acc, dirty))
2027
+ {
2028
+ is_active = pnanovdb_upper_is_active_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).upper, ijk, acc);
2029
+ }
2030
+ else
2031
+ {
2032
+ is_active = pnanovdb_root_is_active_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).root, ijk, acc);
2033
+ }
2034
+ return is_active;
2035
+ }
2036
+
2037
+ // ------------------------------------------------ Map Transforms -----------------------------------------------------------
2038
+
2039
+ PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_map_apply(pnanovdb_buf_t buf, pnanovdb_map_handle_t map, PNANOVDB_IN(pnanovdb_vec3_t) src)
2040
+ {
2041
+ pnanovdb_vec3_t dst;
2042
+ float sx = PNANOVDB_DEREF(src).x;
2043
+ float sy = PNANOVDB_DEREF(src).y;
2044
+ float sz = PNANOVDB_DEREF(src).z;
2045
+ dst.x = sx * pnanovdb_map_get_matf(buf, map, 0) + sy * pnanovdb_map_get_matf(buf, map, 1) + sz * pnanovdb_map_get_matf(buf, map, 2) + pnanovdb_map_get_vecf(buf, map, 0);
2046
+ dst.y = sx * pnanovdb_map_get_matf(buf, map, 3) + sy * pnanovdb_map_get_matf(buf, map, 4) + sz * pnanovdb_map_get_matf(buf, map, 5) + pnanovdb_map_get_vecf(buf, map, 1);
2047
+ dst.z = sx * pnanovdb_map_get_matf(buf, map, 6) + sy * pnanovdb_map_get_matf(buf, map, 7) + sz * pnanovdb_map_get_matf(buf, map, 8) + pnanovdb_map_get_vecf(buf, map, 2);
2048
+ return dst;
2049
+ }
2050
+
2051
+ PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_map_apply_inverse(pnanovdb_buf_t buf, pnanovdb_map_handle_t map, PNANOVDB_IN(pnanovdb_vec3_t) src)
2052
+ {
2053
+ pnanovdb_vec3_t dst;
2054
+ float sx = PNANOVDB_DEREF(src).x - pnanovdb_map_get_vecf(buf, map, 0);
2055
+ float sy = PNANOVDB_DEREF(src).y - pnanovdb_map_get_vecf(buf, map, 1);
2056
+ float sz = PNANOVDB_DEREF(src).z - pnanovdb_map_get_vecf(buf, map, 2);
2057
+ dst.x = sx * pnanovdb_map_get_invmatf(buf, map, 0) + sy * pnanovdb_map_get_invmatf(buf, map, 1) + sz * pnanovdb_map_get_invmatf(buf, map, 2);
2058
+ dst.y = sx * pnanovdb_map_get_invmatf(buf, map, 3) + sy * pnanovdb_map_get_invmatf(buf, map, 4) + sz * pnanovdb_map_get_invmatf(buf, map, 5);
2059
+ dst.z = sx * pnanovdb_map_get_invmatf(buf, map, 6) + sy * pnanovdb_map_get_invmatf(buf, map, 7) + sz * pnanovdb_map_get_invmatf(buf, map, 8);
2060
+ return dst;
2061
+ }
2062
+
2063
+ PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_map_apply_jacobi(pnanovdb_buf_t buf, pnanovdb_map_handle_t map, PNANOVDB_IN(pnanovdb_vec3_t) src)
2064
+ {
2065
+ pnanovdb_vec3_t dst;
2066
+ float sx = PNANOVDB_DEREF(src).x;
2067
+ float sy = PNANOVDB_DEREF(src).y;
2068
+ float sz = PNANOVDB_DEREF(src).z;
2069
+ dst.x = sx * pnanovdb_map_get_matf(buf, map, 0) + sy * pnanovdb_map_get_matf(buf, map, 1) + sz * pnanovdb_map_get_matf(buf, map, 2);
2070
+ dst.y = sx * pnanovdb_map_get_matf(buf, map, 3) + sy * pnanovdb_map_get_matf(buf, map, 4) + sz * pnanovdb_map_get_matf(buf, map, 5);
2071
+ dst.z = sx * pnanovdb_map_get_matf(buf, map, 6) + sy * pnanovdb_map_get_matf(buf, map, 7) + sz * pnanovdb_map_get_matf(buf, map, 8);
2072
+ return dst;
2073
+ }
2074
+
2075
+ PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_map_apply_inverse_jacobi(pnanovdb_buf_t buf, pnanovdb_map_handle_t map, PNANOVDB_IN(pnanovdb_vec3_t) src)
2076
+ {
2077
+ pnanovdb_vec3_t dst;
2078
+ float sx = PNANOVDB_DEREF(src).x;
2079
+ float sy = PNANOVDB_DEREF(src).y;
2080
+ float sz = PNANOVDB_DEREF(src).z;
2081
+ dst.x = sx * pnanovdb_map_get_invmatf(buf, map, 0) + sy * pnanovdb_map_get_invmatf(buf, map, 1) + sz * pnanovdb_map_get_invmatf(buf, map, 2);
2082
+ dst.y = sx * pnanovdb_map_get_invmatf(buf, map, 3) + sy * pnanovdb_map_get_invmatf(buf, map, 4) + sz * pnanovdb_map_get_invmatf(buf, map, 5);
2083
+ dst.z = sx * pnanovdb_map_get_invmatf(buf, map, 6) + sy * pnanovdb_map_get_invmatf(buf, map, 7) + sz * pnanovdb_map_get_invmatf(buf, map, 8);
2084
+ return dst;
2085
+ }
2086
+
2087
+ PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_grid_world_to_indexf(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, PNANOVDB_IN(pnanovdb_vec3_t) src)
2088
+ {
2089
+ pnanovdb_map_handle_t map = pnanovdb_grid_get_map(buf, grid);
2090
+ return pnanovdb_map_apply_inverse(buf, map, src);
2091
+ }
2092
+
2093
+ PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_grid_index_to_worldf(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, PNANOVDB_IN(pnanovdb_vec3_t) src)
2094
+ {
2095
+ pnanovdb_map_handle_t map = pnanovdb_grid_get_map(buf, grid);
2096
+ return pnanovdb_map_apply(buf, map, src);
2097
+ }
2098
+
2099
+ PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_grid_world_to_index_dirf(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, PNANOVDB_IN(pnanovdb_vec3_t) src)
2100
+ {
2101
+ pnanovdb_map_handle_t map = pnanovdb_grid_get_map(buf, grid);
2102
+ return pnanovdb_map_apply_inverse_jacobi(buf, map, src);
2103
+ }
2104
+
2105
+ PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_grid_index_to_world_dirf(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, PNANOVDB_IN(pnanovdb_vec3_t) src)
2106
+ {
2107
+ pnanovdb_map_handle_t map = pnanovdb_grid_get_map(buf, grid);
2108
+ return pnanovdb_map_apply_jacobi(buf, map, src);
2109
+ }
2110
+
2111
+ // ------------------------------------------------ DitherLUT -----------------------------------------------------------
2112
+
2113
+ // This table was generated with
2114
+ /**************
2115
+
2116
+ static constexpr inline uint32
2117
+ SYSwang_inthash(uint32 key)
2118
+ {
2119
+ // From http://www.concentric.net/~Ttwang/tech/inthash.htm
2120
+ key += ~(key << 16);
2121
+ key ^= (key >> 5);
2122
+ key += (key << 3);
2123
+ key ^= (key >> 13);
2124
+ key += ~(key << 9);
2125
+ key ^= (key >> 17);
2126
+ return key;
2127
+ }
2128
+
2129
+ static void
2130
+ ut_initDitherR(float *pattern, float offset,
2131
+ int x, int y, int z, int res, int goalres)
2132
+ {
2133
+ // These offsets are designed to maximize the difference between
2134
+ // dither values in nearby voxels within a given 2x2x2 cell, without
2135
+ // producing axis-aligned artifacts. The are organized in row-major
2136
+ // order.
2137
+ static const float theDitherOffset[] = {0,4,6,2,5,1,3,7};
2138
+ static const float theScale = 0.125F;
2139
+ int key = (((z << res) + y) << res) + x;
2140
+
2141
+ if (res == goalres)
2142
+ {
2143
+ pattern[key] = offset;
2144
+ return;
2145
+ }
2146
+
2147
+ // Randomly flip (on each axis) the dithering patterns used by the
2148
+ // subcells. This key is xor'd with the subcell index below before
2149
+ // looking up in the dither offset list.
2150
+ key = SYSwang_inthash(key) & 7;
2151
+
2152
+ x <<= 1;
2153
+ y <<= 1;
2154
+ z <<= 1;
2155
+
2156
+ offset *= theScale;
2157
+ for (int i = 0; i < 8; i++)
2158
+ ut_initDitherR(pattern, offset+theDitherOffset[i ^ key]*theScale,
2159
+ x+(i&1), y+((i&2)>>1), z+((i&4)>>2), res+1, goalres);
2160
+ }
2161
+
2162
+ // This is a compact algorithm that accomplishes essentially the same thing
2163
+ // as ut_initDither() above. We should eventually switch to use this and
2164
+ // clean the dead code.
2165
+ static fpreal32 *
2166
+ ut_initDitherRecursive(int goalres)
2167
+ {
2168
+ const int nfloat = 1 << (goalres*3);
2169
+ float *pattern = new float[nfloat];
2170
+ ut_initDitherR(pattern, 1.0F, 0, 0, 0, 0, goalres);
2171
+
2172
+ // This has built an even spacing from 1/nfloat to 1.0.
2173
+ // however, our dither pattern should be 1/(nfloat+1) to nfloat/(nfloat+1)
2174
+ // So we do a correction here. Note that the earlier calculations are
2175
+ // done with powers of 2 so are exact, so it does make sense to delay
2176
+ // the renormalization to this pass.
2177
+ float correctionterm = nfloat / (nfloat+1.0F);
2178
+ for (int i = 0; i < nfloat; i++)
2179
+ pattern[i] *= correctionterm;
2180
+ return pattern;
2181
+ }
2182
+
2183
+ theDitherMatrix = ut_initDitherRecursive(3);
2184
+
2185
+ for (int i = 0; i < 512/8; i ++)
2186
+ {
2187
+ for (int j = 0; j < 8; j ++)
2188
+ std::cout << theDitherMatrix[i*8+j] << "f, ";
2189
+ std::cout << std::endl;
2190
+ }
2191
+
2192
+ **************/
2193
+
2194
+ PNANOVDB_STATIC_CONST float pnanovdb_dither_lut[512] =
2195
+ {
2196
+ 0.14425f, 0.643275f, 0.830409f, 0.331384f, 0.105263f, 0.604289f, 0.167641f, 0.666667f,
2197
+ 0.892788f, 0.393762f, 0.0818713f, 0.580897f, 0.853801f, 0.354776f, 0.916179f, 0.417154f,
2198
+ 0.612086f, 0.11306f, 0.79922f, 0.300195f, 0.510721f, 0.0116959f, 0.947368f, 0.448343f,
2199
+ 0.362573f, 0.861598f, 0.0506823f, 0.549708f, 0.261209f, 0.760234f, 0.19883f, 0.697856f,
2200
+ 0.140351f, 0.639376f, 0.576998f, 0.0779727f, 0.522417f, 0.0233918f, 0.460039f, 0.959064f,
2201
+ 0.888889f, 0.389864f, 0.327485f, 0.826511f, 0.272904f, 0.77193f, 0.709552f, 0.210526f,
2202
+ 0.483431f, 0.982456f, 0.296296f, 0.795322f, 0.116959f, 0.615984f, 0.0545809f, 0.553606f,
2203
+ 0.732943f, 0.233918f, 0.545809f, 0.0467836f, 0.865497f, 0.366472f, 0.803119f, 0.304094f,
2204
+ 0.518519f, 0.0194932f, 0.45614f, 0.955166f, 0.729045f, 0.230019f, 0.54191f, 0.042885f,
2205
+ 0.269006f, 0.768031f, 0.705653f, 0.206628f, 0.479532f, 0.978558f, 0.292398f, 0.791423f,
2206
+ 0.237817f, 0.736842f, 0.424951f, 0.923977f, 0.136452f, 0.635478f, 0.323587f, 0.822612f,
2207
+ 0.986355f, 0.487329f, 0.674464f, 0.175439f, 0.88499f, 0.385965f, 0.573099f, 0.0740741f,
2208
+ 0.51462f, 0.0155945f, 0.202729f, 0.701754f, 0.148148f, 0.647174f, 0.834308f, 0.335283f,
2209
+ 0.265107f, 0.764133f, 0.951267f, 0.452242f, 0.896686f, 0.397661f, 0.08577f, 0.584795f,
2210
+ 0.8577f, 0.358674f, 0.920078f, 0.421053f, 0.740741f, 0.241715f, 0.678363f, 0.179337f,
2211
+ 0.109162f, 0.608187f, 0.17154f, 0.670565f, 0.491228f, 0.990253f, 0.42885f, 0.927875f,
2212
+ 0.0662768f, 0.565302f, 0.62768f, 0.128655f, 0.183236f, 0.682261f, 0.744639f, 0.245614f,
2213
+ 0.814815f, 0.315789f, 0.378168f, 0.877193f, 0.931774f, 0.432749f, 0.495127f, 0.994152f,
2214
+ 0.0350877f, 0.534113f, 0.97076f, 0.471735f, 0.214425f, 0.71345f, 0.526316f, 0.0272904f,
2215
+ 0.783626f, 0.2846f, 0.222222f, 0.721248f, 0.962963f, 0.463938f, 0.276803f, 0.775828f,
2216
+ 0.966862f, 0.467836f, 0.405458f, 0.904483f, 0.0701754f, 0.569201f, 0.881092f, 0.382066f,
2217
+ 0.218324f, 0.717349f, 0.654971f, 0.155945f, 0.818713f, 0.319688f, 0.132554f, 0.631579f,
2218
+ 0.0623782f, 0.561404f, 0.748538f, 0.249513f, 0.912281f, 0.413255f, 0.974659f, 0.475634f,
2219
+ 0.810916f, 0.311891f, 0.499025f, 0.998051f, 0.163743f, 0.662768f, 0.226121f, 0.725146f,
2220
+ 0.690058f, 0.191033f, 0.00389864f, 0.502924f, 0.557505f, 0.0584795f, 0.120858f, 0.619883f,
2221
+ 0.440546f, 0.939571f, 0.752437f, 0.253411f, 0.307992f, 0.807018f, 0.869396f, 0.37037f,
2222
+ 0.658869f, 0.159844f, 0.346979f, 0.846004f, 0.588694f, 0.0896686f, 0.152047f, 0.651072f,
2223
+ 0.409357f, 0.908382f, 0.596491f, 0.0974659f, 0.339181f, 0.838207f, 0.900585f, 0.401559f,
2224
+ 0.34308f, 0.842105f, 0.779727f, 0.280702f, 0.693957f, 0.194932f, 0.25731f, 0.756335f,
2225
+ 0.592593f, 0.0935673f, 0.0311891f, 0.530214f, 0.444444f, 0.94347f, 0.506823f, 0.00779727f,
2226
+ 0.68616f, 0.187135f, 0.124756f, 0.623782f, 0.288499f, 0.787524f, 0.350877f, 0.849903f,
2227
+ 0.436647f, 0.935673f, 0.873294f, 0.374269f, 0.538012f, 0.0389864f, 0.60039f, 0.101365f,
2228
+ 0.57115f, 0.0721248f, 0.758285f, 0.259259f, 0.719298f, 0.220273f, 0.532164f, 0.0331384f,
2229
+ 0.321637f, 0.820663f, 0.00974659f, 0.508772f, 0.469786f, 0.968811f, 0.282651f, 0.781676f,
2230
+ 0.539961f, 0.0409357f, 0.727096f, 0.22807f, 0.500975f, 0.00194932f, 0.563353f, 0.0643275f,
2231
+ 0.290448f, 0.789474f, 0.477583f, 0.976608f, 0.251462f, 0.750487f, 0.31384f, 0.812865f,
2232
+ 0.94152f, 0.442495f, 0.879142f, 0.380117f, 0.37232f, 0.871345f, 0.309942f, 0.808967f,
2233
+ 0.192982f, 0.692008f, 0.130604f, 0.62963f, 0.621832f, 0.122807f, 0.559454f, 0.0604289f,
2234
+ 0.660819f, 0.161793f, 0.723197f, 0.224172f, 0.403509f, 0.902534f, 0.840156f, 0.341131f,
2235
+ 0.411306f, 0.910331f, 0.473684f, 0.97271f, 0.653021f, 0.153996f, 0.0916179f, 0.590643f,
2236
+ 0.196881f, 0.695906f, 0.384016f, 0.883041f, 0.0955166f, 0.594542f, 0.157895f, 0.65692f,
2237
+ 0.945419f, 0.446394f, 0.633528f, 0.134503f, 0.844055f, 0.345029f, 0.906433f, 0.407407f,
2238
+ 0.165692f, 0.664717f, 0.103314f, 0.602339f, 0.126706f, 0.625731f, 0.189084f, 0.688109f,
2239
+ 0.91423f, 0.415205f, 0.851852f, 0.352827f, 0.875244f, 0.376218f, 0.937622f, 0.438596f,
2240
+ 0.317739f, 0.816764f, 0.255361f, 0.754386f, 0.996101f, 0.497076f, 0.933723f, 0.434698f,
2241
+ 0.567251f, 0.0682261f, 0.504873f, 0.00584795f, 0.247563f, 0.746589f, 0.185185f, 0.684211f,
2242
+ 0.037037f, 0.536062f, 0.0994152f, 0.598441f, 0.777778f, 0.278752f, 0.465887f, 0.964912f,
2243
+ 0.785575f, 0.28655f, 0.847953f, 0.348928f, 0.0292398f, 0.528265f, 0.7154f, 0.216374f,
2244
+ 0.39961f, 0.898636f, 0.961014f, 0.461988f, 0.0487329f, 0.547758f, 0.111111f, 0.610136f,
2245
+ 0.649123f, 0.150097f, 0.212476f, 0.711501f, 0.797271f, 0.298246f, 0.859649f, 0.360624f,
2246
+ 0.118908f, 0.617934f, 0.0565302f, 0.555556f, 0.329435f, 0.82846f, 0.516569f, 0.0175439f,
2247
+ 0.867446f, 0.368421f, 0.805068f, 0.306043f, 0.578947f, 0.079922f, 0.267057f, 0.766082f,
2248
+ 0.270955f, 0.76998f, 0.707602f, 0.208577f, 0.668616f, 0.169591f, 0.606238f, 0.107212f,
2249
+ 0.520468f, 0.0214425f, 0.45809f, 0.957115f, 0.419103f, 0.918129f, 0.356725f, 0.855751f,
2250
+ 0.988304f, 0.489279f, 0.426901f, 0.925926f, 0.450292f, 0.949318f, 0.512671f, 0.0136452f,
2251
+ 0.239766f, 0.738791f, 0.676413f, 0.177388f, 0.699805f, 0.20078f, 0.263158f, 0.762183f,
2252
+ 0.773879f, 0.274854f, 0.337232f, 0.836257f, 0.672515f, 0.173489f, 0.734893f, 0.235867f,
2253
+ 0.0253411f, 0.524366f, 0.586745f, 0.0877193f, 0.423002f, 0.922027f, 0.48538f, 0.984405f,
2254
+ 0.74269f, 0.243665f, 0.680312f, 0.181287f, 0.953216f, 0.454191f, 0.1423f, 0.641326f,
2255
+ 0.493177f, 0.992203f, 0.430799f, 0.929825f, 0.204678f, 0.703704f, 0.890838f, 0.391813f,
2256
+ 0.894737f, 0.395712f, 0.0838207f, 0.582846f, 0.0448343f, 0.54386f, 0.231969f, 0.730994f,
2257
+ 0.146199f, 0.645224f, 0.832359f, 0.333333f, 0.793372f, 0.294347f, 0.980507f, 0.481481f,
2258
+ 0.364522f, 0.863548f, 0.80117f, 0.302144f, 0.824561f, 0.325536f, 0.138402f, 0.637427f,
2259
+ 0.614035f, 0.11501f, 0.0526316f, 0.551657f, 0.0760234f, 0.575049f, 0.88694f, 0.387914f,
2260
+ };
2261
+
2262
+ PNANOVDB_FORCE_INLINE float pnanovdb_dither_lookup(pnanovdb_bool_t enabled, int offset)
2263
+ {
2264
+ return enabled ? pnanovdb_dither_lut[offset & 511] : 0.5f;
2265
+ }
2266
+
2267
+ // ------------------------------------------------ HDDA -----------------------------------------------------------
2268
+
2269
+ #ifdef PNANOVDB_HDDA
2270
+
2271
+ // Comment out to disable this explicit round-off check
2272
+ #define PNANOVDB_ENFORCE_FORWARD_STEPPING
2273
+
2274
+ #define PNANOVDB_HDDA_FLOAT_MAX 1e38f
2275
+
2276
+ struct pnanovdb_hdda_t
2277
+ {
2278
+ pnanovdb_int32_t dim;
2279
+ float tmin;
2280
+ float tmax;
2281
+ pnanovdb_coord_t voxel;
2282
+ pnanovdb_coord_t step;
2283
+ pnanovdb_vec3_t delta;
2284
+ pnanovdb_vec3_t next;
2285
+ };
2286
+ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_hdda_t)
2287
+
2288
+ PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_hdda_pos_to_ijk(PNANOVDB_IN(pnanovdb_vec3_t) pos)
2289
+ {
2290
+ pnanovdb_coord_t voxel;
2291
+ voxel.x = pnanovdb_float_to_int32(pnanovdb_floor(PNANOVDB_DEREF(pos).x));
2292
+ voxel.y = pnanovdb_float_to_int32(pnanovdb_floor(PNANOVDB_DEREF(pos).y));
2293
+ voxel.z = pnanovdb_float_to_int32(pnanovdb_floor(PNANOVDB_DEREF(pos).z));
2294
+ return voxel;
2295
+ }
2296
+
2297
+ PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_hdda_pos_to_voxel(PNANOVDB_IN(pnanovdb_vec3_t) pos, int dim)
2298
+ {
2299
+ pnanovdb_coord_t voxel;
2300
+ voxel.x = pnanovdb_float_to_int32(pnanovdb_floor(PNANOVDB_DEREF(pos).x)) & (~(dim - 1));
2301
+ voxel.y = pnanovdb_float_to_int32(pnanovdb_floor(PNANOVDB_DEREF(pos).y)) & (~(dim - 1));
2302
+ voxel.z = pnanovdb_float_to_int32(pnanovdb_floor(PNANOVDB_DEREF(pos).z)) & (~(dim - 1));
2303
+ return voxel;
2304
+ }
2305
+
2306
+ PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_hdda_ray_start(PNANOVDB_IN(pnanovdb_vec3_t) origin, float tmin, PNANOVDB_IN(pnanovdb_vec3_t) direction)
2307
+ {
2308
+ pnanovdb_vec3_t pos = pnanovdb_vec3_add(
2309
+ pnanovdb_vec3_mul(PNANOVDB_DEREF(direction), pnanovdb_vec3_uniform(tmin)),
2310
+ PNANOVDB_DEREF(origin)
2311
+ );
2312
+ return pos;
2313
+ }
2314
+
2315
+ PNANOVDB_FORCE_INLINE void pnanovdb_hdda_init(PNANOVDB_INOUT(pnanovdb_hdda_t) hdda, PNANOVDB_IN(pnanovdb_vec3_t) origin, float tmin, PNANOVDB_IN(pnanovdb_vec3_t) direction, float tmax, int dim)
2316
+ {
2317
+ PNANOVDB_DEREF(hdda).dim = dim;
2318
+ PNANOVDB_DEREF(hdda).tmin = tmin;
2319
+ PNANOVDB_DEREF(hdda).tmax = tmax;
2320
+
2321
+ pnanovdb_vec3_t pos = pnanovdb_hdda_ray_start(origin, tmin, direction);
2322
+ pnanovdb_vec3_t dir_inv = pnanovdb_vec3_div(pnanovdb_vec3_uniform(1.f), PNANOVDB_DEREF(direction));
2323
+
2324
+ PNANOVDB_DEREF(hdda).voxel = pnanovdb_hdda_pos_to_voxel(PNANOVDB_REF(pos), dim);
2325
+
2326
+ // x
2327
+ if (PNANOVDB_DEREF(direction).x == 0.f)
2328
+ {
2329
+ PNANOVDB_DEREF(hdda).next.x = PNANOVDB_HDDA_FLOAT_MAX;
2330
+ PNANOVDB_DEREF(hdda).step.x = 0;
2331
+ PNANOVDB_DEREF(hdda).delta.x = 0.f;
2332
+ }
2333
+ else if (dir_inv.x > 0.f)
2334
+ {
2335
+ PNANOVDB_DEREF(hdda).step.x = 1;
2336
+ PNANOVDB_DEREF(hdda).next.x = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.x + dim - pos.x) * dir_inv.x;
2337
+ PNANOVDB_DEREF(hdda).delta.x = dir_inv.x;
2338
+ }
2339
+ else
2340
+ {
2341
+ PNANOVDB_DEREF(hdda).step.x = -1;
2342
+ PNANOVDB_DEREF(hdda).next.x = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.x - pos.x) * dir_inv.x;
2343
+ PNANOVDB_DEREF(hdda).delta.x = -dir_inv.x;
2344
+ }
2345
+
2346
+ // y
2347
+ if (PNANOVDB_DEREF(direction).y == 0.f)
2348
+ {
2349
+ PNANOVDB_DEREF(hdda).next.y = PNANOVDB_HDDA_FLOAT_MAX;
2350
+ PNANOVDB_DEREF(hdda).step.y = 0;
2351
+ PNANOVDB_DEREF(hdda).delta.y = 0.f;
2352
+ }
2353
+ else if (dir_inv.y > 0.f)
2354
+ {
2355
+ PNANOVDB_DEREF(hdda).step.y = 1;
2356
+ PNANOVDB_DEREF(hdda).next.y = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.y + dim - pos.y) * dir_inv.y;
2357
+ PNANOVDB_DEREF(hdda).delta.y = dir_inv.y;
2358
+ }
2359
+ else
2360
+ {
2361
+ PNANOVDB_DEREF(hdda).step.y = -1;
2362
+ PNANOVDB_DEREF(hdda).next.y = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.y - pos.y) * dir_inv.y;
2363
+ PNANOVDB_DEREF(hdda).delta.y = -dir_inv.y;
2364
+ }
2365
+
2366
+ // z
2367
+ if (PNANOVDB_DEREF(direction).z == 0.f)
2368
+ {
2369
+ PNANOVDB_DEREF(hdda).next.z = PNANOVDB_HDDA_FLOAT_MAX;
2370
+ PNANOVDB_DEREF(hdda).step.z = 0;
2371
+ PNANOVDB_DEREF(hdda).delta.z = 0.f;
2372
+ }
2373
+ else if (dir_inv.z > 0.f)
2374
+ {
2375
+ PNANOVDB_DEREF(hdda).step.z = 1;
2376
+ PNANOVDB_DEREF(hdda).next.z = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.z + dim - pos.z) * dir_inv.z;
2377
+ PNANOVDB_DEREF(hdda).delta.z = dir_inv.z;
2378
+ }
2379
+ else
2380
+ {
2381
+ PNANOVDB_DEREF(hdda).step.z = -1;
2382
+ PNANOVDB_DEREF(hdda).next.z = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.z - pos.z) * dir_inv.z;
2383
+ PNANOVDB_DEREF(hdda).delta.z = -dir_inv.z;
2384
+ }
2385
+ }
2386
+
2387
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_hdda_update(PNANOVDB_INOUT(pnanovdb_hdda_t) hdda, PNANOVDB_IN(pnanovdb_vec3_t) origin, PNANOVDB_IN(pnanovdb_vec3_t) direction, int dim)
2388
+ {
2389
+ if (PNANOVDB_DEREF(hdda).dim == dim)
2390
+ {
2391
+ return PNANOVDB_FALSE;
2392
+ }
2393
+ PNANOVDB_DEREF(hdda).dim = dim;
2394
+
2395
+ pnanovdb_vec3_t pos = pnanovdb_vec3_add(
2396
+ pnanovdb_vec3_mul(PNANOVDB_DEREF(direction), pnanovdb_vec3_uniform(PNANOVDB_DEREF(hdda).tmin)),
2397
+ PNANOVDB_DEREF(origin)
2398
+ );
2399
+ pnanovdb_vec3_t dir_inv = pnanovdb_vec3_div(pnanovdb_vec3_uniform(1.f), PNANOVDB_DEREF(direction));
2400
+
2401
+ PNANOVDB_DEREF(hdda).voxel = pnanovdb_hdda_pos_to_voxel(PNANOVDB_REF(pos), dim);
2402
+
2403
+ if (PNANOVDB_DEREF(hdda).step.x != 0)
2404
+ {
2405
+ PNANOVDB_DEREF(hdda).next.x = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.x - pos.x) * dir_inv.x;
2406
+ if (PNANOVDB_DEREF(hdda).step.x > 0)
2407
+ {
2408
+ PNANOVDB_DEREF(hdda).next.x += dim * dir_inv.x;
2409
+ }
2410
+ }
2411
+ if (PNANOVDB_DEREF(hdda).step.y != 0)
2412
+ {
2413
+ PNANOVDB_DEREF(hdda).next.y = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.y - pos.y) * dir_inv.y;
2414
+ if (PNANOVDB_DEREF(hdda).step.y > 0)
2415
+ {
2416
+ PNANOVDB_DEREF(hdda).next.y += dim * dir_inv.y;
2417
+ }
2418
+ }
2419
+ if (PNANOVDB_DEREF(hdda).step.z != 0)
2420
+ {
2421
+ PNANOVDB_DEREF(hdda).next.z = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.z - pos.z) * dir_inv.z;
2422
+ if (PNANOVDB_DEREF(hdda).step.z > 0)
2423
+ {
2424
+ PNANOVDB_DEREF(hdda).next.z += dim * dir_inv.z;
2425
+ }
2426
+ }
2427
+
2428
+ return PNANOVDB_TRUE;
2429
+ }
2430
+
2431
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_hdda_step(PNANOVDB_INOUT(pnanovdb_hdda_t) hdda)
2432
+ {
2433
+ pnanovdb_bool_t ret;
2434
+ if (PNANOVDB_DEREF(hdda).next.x < PNANOVDB_DEREF(hdda).next.y && PNANOVDB_DEREF(hdda).next.x < PNANOVDB_DEREF(hdda).next.z)
2435
+ {
2436
+ #ifdef PNANOVDB_ENFORCE_FORWARD_STEPPING
2437
+ if (PNANOVDB_DEREF(hdda).next.x <= PNANOVDB_DEREF(hdda).tmin)
2438
+ {
2439
+ PNANOVDB_DEREF(hdda).next.x += PNANOVDB_DEREF(hdda).tmin - 0.999999f * PNANOVDB_DEREF(hdda).next.x + 1.0e-6f;
2440
+ }
2441
+ #endif
2442
+ PNANOVDB_DEREF(hdda).tmin = PNANOVDB_DEREF(hdda).next.x;
2443
+ PNANOVDB_DEREF(hdda).next.x += PNANOVDB_DEREF(hdda).dim * PNANOVDB_DEREF(hdda).delta.x;
2444
+ PNANOVDB_DEREF(hdda).voxel.x += PNANOVDB_DEREF(hdda).dim * PNANOVDB_DEREF(hdda).step.x;
2445
+ ret = PNANOVDB_DEREF(hdda).tmin <= PNANOVDB_DEREF(hdda).tmax;
2446
+ }
2447
+ else if (PNANOVDB_DEREF(hdda).next.y < PNANOVDB_DEREF(hdda).next.z)
2448
+ {
2449
+ #ifdef PNANOVDB_ENFORCE_FORWARD_STEPPING
2450
+ if (PNANOVDB_DEREF(hdda).next.y <= PNANOVDB_DEREF(hdda).tmin)
2451
+ {
2452
+ PNANOVDB_DEREF(hdda).next.y += PNANOVDB_DEREF(hdda).tmin - 0.999999f * PNANOVDB_DEREF(hdda).next.y + 1.0e-6f;
2453
+ }
2454
+ #endif
2455
+ PNANOVDB_DEREF(hdda).tmin = PNANOVDB_DEREF(hdda).next.y;
2456
+ PNANOVDB_DEREF(hdda).next.y += PNANOVDB_DEREF(hdda).dim * PNANOVDB_DEREF(hdda).delta.y;
2457
+ PNANOVDB_DEREF(hdda).voxel.y += PNANOVDB_DEREF(hdda).dim * PNANOVDB_DEREF(hdda).step.y;
2458
+ ret = PNANOVDB_DEREF(hdda).tmin <= PNANOVDB_DEREF(hdda).tmax;
2459
+ }
2460
+ else
2461
+ {
2462
+ #ifdef PNANOVDB_ENFORCE_FORWARD_STEPPING
2463
+ if (PNANOVDB_DEREF(hdda).next.z <= PNANOVDB_DEREF(hdda).tmin)
2464
+ {
2465
+ PNANOVDB_DEREF(hdda).next.z += PNANOVDB_DEREF(hdda).tmin - 0.999999f * PNANOVDB_DEREF(hdda).next.z + 1.0e-6f;
2466
+ }
2467
+ #endif
2468
+ PNANOVDB_DEREF(hdda).tmin = PNANOVDB_DEREF(hdda).next.z;
2469
+ PNANOVDB_DEREF(hdda).next.z += PNANOVDB_DEREF(hdda).dim * PNANOVDB_DEREF(hdda).delta.z;
2470
+ PNANOVDB_DEREF(hdda).voxel.z += PNANOVDB_DEREF(hdda).dim * PNANOVDB_DEREF(hdda).step.z;
2471
+ ret = PNANOVDB_DEREF(hdda).tmin <= PNANOVDB_DEREF(hdda).tmax;
2472
+ }
2473
+ return ret;
2474
+ }
2475
+
2476
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_hdda_ray_clip(
2477
+ PNANOVDB_IN(pnanovdb_vec3_t) bbox_min,
2478
+ PNANOVDB_IN(pnanovdb_vec3_t) bbox_max,
2479
+ PNANOVDB_IN(pnanovdb_vec3_t) origin, PNANOVDB_INOUT(float) tmin,
2480
+ PNANOVDB_IN(pnanovdb_vec3_t) direction, PNANOVDB_INOUT(float) tmax
2481
+ )
2482
+ {
2483
+ pnanovdb_vec3_t dir_inv = pnanovdb_vec3_div(pnanovdb_vec3_uniform(1.f), PNANOVDB_DEREF(direction));
2484
+ pnanovdb_vec3_t t0 = pnanovdb_vec3_mul(pnanovdb_vec3_sub(PNANOVDB_DEREF(bbox_min), PNANOVDB_DEREF(origin)), dir_inv);
2485
+ pnanovdb_vec3_t t1 = pnanovdb_vec3_mul(pnanovdb_vec3_sub(PNANOVDB_DEREF(bbox_max), PNANOVDB_DEREF(origin)), dir_inv);
2486
+ pnanovdb_vec3_t tmin3 = pnanovdb_vec3_min(t0, t1);
2487
+ pnanovdb_vec3_t tmax3 = pnanovdb_vec3_max(t0, t1);
2488
+ float tnear = pnanovdb_max(tmin3.x, pnanovdb_max(tmin3.y, tmin3.z));
2489
+ float tfar = pnanovdb_min(tmax3.x, pnanovdb_min(tmax3.y, tmax3.z));
2490
+ pnanovdb_bool_t hit = tnear <= tfar;
2491
+ PNANOVDB_DEREF(tmin) = pnanovdb_max(PNANOVDB_DEREF(tmin), tnear);
2492
+ PNANOVDB_DEREF(tmax) = pnanovdb_min(PNANOVDB_DEREF(tmax), tfar);
2493
+ return hit;
2494
+ }
2495
+
2496
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_hdda_zero_crossing(
2497
+ pnanovdb_grid_type_t grid_type,
2498
+ pnanovdb_buf_t buf,
2499
+ PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc,
2500
+ PNANOVDB_IN(pnanovdb_vec3_t) origin, float tmin,
2501
+ PNANOVDB_IN(pnanovdb_vec3_t) direction, float tmax,
2502
+ PNANOVDB_INOUT(float) thit,
2503
+ PNANOVDB_INOUT(float) v
2504
+ )
2505
+ {
2506
+ pnanovdb_coord_t bbox_min = pnanovdb_root_get_bbox_min(buf, PNANOVDB_DEREF(acc).root);
2507
+ pnanovdb_coord_t bbox_max = pnanovdb_root_get_bbox_max(buf, PNANOVDB_DEREF(acc).root);
2508
+ pnanovdb_vec3_t bbox_minf = pnanovdb_coord_to_vec3(bbox_min);
2509
+ pnanovdb_vec3_t bbox_maxf = pnanovdb_coord_to_vec3(pnanovdb_coord_add(bbox_max, pnanovdb_coord_uniform(1)));
2510
+
2511
+ pnanovdb_bool_t hit = pnanovdb_hdda_ray_clip(PNANOVDB_REF(bbox_minf), PNANOVDB_REF(bbox_maxf), origin, PNANOVDB_REF(tmin), direction, PNANOVDB_REF(tmax));
2512
+ if (!hit || tmax > 1.0e20f)
2513
+ {
2514
+ return PNANOVDB_FALSE;
2515
+ }
2516
+
2517
+ pnanovdb_vec3_t pos = pnanovdb_hdda_ray_start(origin, tmin, direction);
2518
+ pnanovdb_coord_t ijk = pnanovdb_hdda_pos_to_ijk(PNANOVDB_REF(pos));
2519
+
2520
+ pnanovdb_address_t address = pnanovdb_readaccessor_get_value_address(PNANOVDB_GRID_TYPE_FLOAT, buf, acc, PNANOVDB_REF(ijk));
2521
+ float v0 = pnanovdb_read_float(buf, address);
2522
+
2523
+ pnanovdb_int32_t dim = pnanovdb_uint32_as_int32(pnanovdb_readaccessor_get_dim(PNANOVDB_GRID_TYPE_FLOAT, buf, acc, PNANOVDB_REF(ijk)));
2524
+ pnanovdb_hdda_t hdda;
2525
+ pnanovdb_hdda_init(PNANOVDB_REF(hdda), origin, tmin, direction, tmax, dim);
2526
+ while (pnanovdb_hdda_step(PNANOVDB_REF(hdda)))
2527
+ {
2528
+ pnanovdb_vec3_t pos_start = pnanovdb_hdda_ray_start(origin, hdda.tmin + 1.0001f, direction);
2529
+ ijk = pnanovdb_hdda_pos_to_ijk(PNANOVDB_REF(pos_start));
2530
+ dim = pnanovdb_uint32_as_int32(pnanovdb_readaccessor_get_dim(PNANOVDB_GRID_TYPE_FLOAT, buf, acc, PNANOVDB_REF(ijk)));
2531
+ pnanovdb_hdda_update(PNANOVDB_REF(hdda), origin, direction, dim);
2532
+ if (hdda.dim > 1 || !pnanovdb_readaccessor_is_active(grid_type, buf, acc, PNANOVDB_REF(ijk)))
2533
+ {
2534
+ continue;
2535
+ }
2536
+ while (pnanovdb_hdda_step(PNANOVDB_REF(hdda)) && pnanovdb_readaccessor_is_active(grid_type, buf, acc, PNANOVDB_REF(hdda.voxel)))
2537
+ {
2538
+ ijk = hdda.voxel;
2539
+ pnanovdb_address_t address = pnanovdb_readaccessor_get_value_address(PNANOVDB_GRID_TYPE_FLOAT, buf, acc, PNANOVDB_REF(ijk));
2540
+ PNANOVDB_DEREF(v) = pnanovdb_read_float(buf, address);
2541
+ if (PNANOVDB_DEREF(v) * v0 < 0.f)
2542
+ {
2543
+ PNANOVDB_DEREF(thit) = hdda.tmin;
2544
+ return PNANOVDB_TRUE;
2545
+ }
2546
+ }
2547
+ }
2548
+ return PNANOVDB_FALSE;
2549
+ }
2550
+
2551
+ #endif
2552
+
2553
+ #endif // end of NANOVDB_PNANOVDB_H_HAS_BEEN_INCLUDED