warp-lang 1.1.0__py3-none-manylinux2014_aarch64.whl → 1.2.1__py3-none-manylinux2014_aarch64.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 (218) hide show
  1. warp/bin/warp-clang.so +0 -0
  2. warp/bin/warp.so +0 -0
  3. warp/build.py +10 -37
  4. warp/build_dll.py +2 -2
  5. warp/builtins.py +274 -6
  6. warp/codegen.py +51 -4
  7. warp/config.py +2 -2
  8. warp/constants.py +4 -0
  9. warp/context.py +422 -203
  10. warp/examples/benchmarks/benchmark_api.py +0 -2
  11. warp/examples/benchmarks/benchmark_cloth_warp.py +0 -1
  12. warp/examples/benchmarks/benchmark_launches.py +0 -2
  13. warp/examples/core/example_dem.py +0 -2
  14. warp/examples/core/example_fluid.py +0 -2
  15. warp/examples/core/example_graph_capture.py +0 -2
  16. warp/examples/core/example_marching_cubes.py +0 -2
  17. warp/examples/core/example_mesh.py +0 -2
  18. warp/examples/core/example_mesh_intersect.py +0 -2
  19. warp/examples/core/example_nvdb.py +0 -2
  20. warp/examples/core/example_raycast.py +0 -2
  21. warp/examples/core/example_raymarch.py +0 -2
  22. warp/examples/core/example_render_opengl.py +0 -2
  23. warp/examples/core/example_sph.py +0 -2
  24. warp/examples/core/example_torch.py +0 -3
  25. warp/examples/core/example_wave.py +0 -2
  26. warp/examples/fem/example_apic_fluid.py +140 -115
  27. warp/examples/fem/example_burgers.py +262 -0
  28. warp/examples/fem/example_convection_diffusion.py +0 -2
  29. warp/examples/fem/example_convection_diffusion_dg.py +0 -2
  30. warp/examples/fem/example_deformed_geometry.py +0 -2
  31. warp/examples/fem/example_diffusion.py +0 -2
  32. warp/examples/fem/example_diffusion_3d.py +5 -4
  33. warp/examples/fem/example_diffusion_mgpu.py +0 -2
  34. warp/examples/fem/example_mixed_elasticity.py +0 -2
  35. warp/examples/fem/example_navier_stokes.py +0 -2
  36. warp/examples/fem/example_stokes.py +0 -2
  37. warp/examples/fem/example_stokes_transfer.py +0 -2
  38. warp/examples/optim/example_bounce.py +0 -2
  39. warp/examples/optim/example_cloth_throw.py +0 -2
  40. warp/examples/optim/example_diffray.py +0 -2
  41. warp/examples/optim/example_drone.py +0 -2
  42. warp/examples/optim/example_inverse_kinematics.py +0 -2
  43. warp/examples/optim/example_inverse_kinematics_torch.py +0 -2
  44. warp/examples/optim/example_spring_cage.py +0 -2
  45. warp/examples/optim/example_trajectory.py +0 -2
  46. warp/examples/optim/example_walker.py +0 -2
  47. warp/examples/sim/example_cartpole.py +0 -2
  48. warp/examples/sim/example_cloth.py +0 -2
  49. warp/examples/sim/example_granular.py +0 -2
  50. warp/examples/sim/example_granular_collision_sdf.py +0 -2
  51. warp/examples/sim/example_jacobian_ik.py +0 -2
  52. warp/examples/sim/example_particle_chain.py +0 -2
  53. warp/examples/sim/example_quadruped.py +0 -2
  54. warp/examples/sim/example_rigid_chain.py +0 -2
  55. warp/examples/sim/example_rigid_contact.py +0 -2
  56. warp/examples/sim/example_rigid_force.py +0 -2
  57. warp/examples/sim/example_rigid_gyroscopic.py +0 -2
  58. warp/examples/sim/example_rigid_soft_contact.py +0 -2
  59. warp/examples/sim/example_soft_body.py +0 -2
  60. warp/fem/__init__.py +1 -0
  61. warp/fem/cache.py +3 -1
  62. warp/fem/geometry/__init__.py +1 -0
  63. warp/fem/geometry/element.py +4 -0
  64. warp/fem/geometry/grid_3d.py +0 -4
  65. warp/fem/geometry/nanogrid.py +455 -0
  66. warp/fem/integrate.py +63 -9
  67. warp/fem/space/__init__.py +43 -158
  68. warp/fem/space/basis_space.py +34 -0
  69. warp/fem/space/collocated_function_space.py +1 -1
  70. warp/fem/space/grid_2d_function_space.py +13 -132
  71. warp/fem/space/grid_3d_function_space.py +16 -154
  72. warp/fem/space/hexmesh_function_space.py +37 -134
  73. warp/fem/space/nanogrid_function_space.py +202 -0
  74. warp/fem/space/quadmesh_2d_function_space.py +12 -119
  75. warp/fem/space/restriction.py +4 -1
  76. warp/fem/space/shape/__init__.py +77 -0
  77. warp/fem/space/shape/cube_shape_function.py +5 -15
  78. warp/fem/space/tetmesh_function_space.py +6 -76
  79. warp/fem/space/trimesh_2d_function_space.py +6 -76
  80. warp/native/array.h +12 -3
  81. warp/native/builtin.h +48 -5
  82. warp/native/bvh.cpp +14 -10
  83. warp/native/bvh.cu +23 -15
  84. warp/native/bvh.h +1 -0
  85. warp/native/clang/clang.cpp +2 -1
  86. warp/native/crt.cpp +11 -1
  87. warp/native/crt.h +18 -1
  88. warp/native/exports.h +187 -0
  89. warp/native/mat.h +47 -0
  90. warp/native/mesh.cpp +1 -1
  91. warp/native/mesh.cu +1 -2
  92. warp/native/nanovdb/GridHandle.h +366 -0
  93. warp/native/nanovdb/HostBuffer.h +590 -0
  94. warp/native/nanovdb/NanoVDB.h +3999 -2157
  95. warp/native/nanovdb/PNanoVDB.h +936 -99
  96. warp/native/quat.h +28 -1
  97. warp/native/rand.h +5 -1
  98. warp/native/vec.h +45 -1
  99. warp/native/volume.cpp +335 -103
  100. warp/native/volume.cu +39 -13
  101. warp/native/volume.h +725 -303
  102. warp/native/volume_builder.cu +381 -360
  103. warp/native/volume_builder.h +16 -1
  104. warp/native/volume_impl.h +61 -0
  105. warp/native/warp.cu +8 -2
  106. warp/native/warp.h +15 -7
  107. warp/render/render_opengl.py +191 -52
  108. warp/sim/integrator_featherstone.py +10 -3
  109. warp/sim/integrator_xpbd.py +16 -22
  110. warp/sparse.py +89 -27
  111. warp/stubs.py +83 -0
  112. warp/tests/assets/test_index_grid.nvdb +0 -0
  113. warp/tests/aux_test_dependent.py +0 -2
  114. warp/tests/aux_test_grad_customs.py +0 -2
  115. warp/tests/aux_test_reference.py +0 -2
  116. warp/tests/aux_test_reference_reference.py +0 -2
  117. warp/tests/aux_test_square.py +0 -2
  118. warp/tests/disabled_kinematics.py +0 -2
  119. warp/tests/test_adam.py +0 -2
  120. warp/tests/test_arithmetic.py +0 -36
  121. warp/tests/test_array.py +9 -11
  122. warp/tests/test_array_reduce.py +0 -2
  123. warp/tests/test_async.py +0 -2
  124. warp/tests/test_atomic.py +0 -2
  125. warp/tests/test_bool.py +58 -50
  126. warp/tests/test_builtins_resolution.py +0 -2
  127. warp/tests/test_bvh.py +0 -2
  128. warp/tests/test_closest_point_edge_edge.py +0 -1
  129. warp/tests/test_codegen.py +0 -4
  130. warp/tests/test_compile_consts.py +130 -10
  131. warp/tests/test_conditional.py +0 -2
  132. warp/tests/test_copy.py +0 -2
  133. warp/tests/test_ctypes.py +6 -8
  134. warp/tests/test_dense.py +0 -2
  135. warp/tests/test_devices.py +0 -2
  136. warp/tests/test_dlpack.py +9 -11
  137. warp/tests/test_examples.py +42 -39
  138. warp/tests/test_fabricarray.py +0 -3
  139. warp/tests/test_fast_math.py +0 -2
  140. warp/tests/test_fem.py +75 -54
  141. warp/tests/test_fp16.py +0 -2
  142. warp/tests/test_func.py +0 -2
  143. warp/tests/test_generics.py +27 -2
  144. warp/tests/test_grad.py +147 -8
  145. warp/tests/test_grad_customs.py +0 -2
  146. warp/tests/test_hash_grid.py +1 -3
  147. warp/tests/test_import.py +0 -2
  148. warp/tests/test_indexedarray.py +0 -2
  149. warp/tests/test_intersect.py +0 -2
  150. warp/tests/test_jax.py +0 -2
  151. warp/tests/test_large.py +11 -9
  152. warp/tests/test_launch.py +0 -2
  153. warp/tests/test_lerp.py +10 -54
  154. warp/tests/test_linear_solvers.py +3 -5
  155. warp/tests/test_lvalue.py +0 -2
  156. warp/tests/test_marching_cubes.py +0 -2
  157. warp/tests/test_mat.py +0 -2
  158. warp/tests/test_mat_lite.py +0 -2
  159. warp/tests/test_mat_scalar_ops.py +0 -2
  160. warp/tests/test_math.py +0 -2
  161. warp/tests/test_matmul.py +35 -37
  162. warp/tests/test_matmul_lite.py +29 -31
  163. warp/tests/test_mempool.py +0 -2
  164. warp/tests/test_mesh.py +0 -3
  165. warp/tests/test_mesh_query_aabb.py +0 -2
  166. warp/tests/test_mesh_query_point.py +0 -2
  167. warp/tests/test_mesh_query_ray.py +0 -2
  168. warp/tests/test_mlp.py +0 -2
  169. warp/tests/test_model.py +0 -2
  170. warp/tests/test_module_hashing.py +111 -0
  171. warp/tests/test_modules_lite.py +0 -3
  172. warp/tests/test_multigpu.py +0 -2
  173. warp/tests/test_noise.py +0 -4
  174. warp/tests/test_operators.py +0 -2
  175. warp/tests/test_options.py +0 -2
  176. warp/tests/test_peer.py +0 -2
  177. warp/tests/test_pinned.py +0 -2
  178. warp/tests/test_print.py +0 -2
  179. warp/tests/test_quat.py +0 -2
  180. warp/tests/test_rand.py +41 -5
  181. warp/tests/test_reload.py +0 -10
  182. warp/tests/test_rounding.py +0 -2
  183. warp/tests/test_runlength_encode.py +0 -2
  184. warp/tests/test_sim_grad.py +0 -2
  185. warp/tests/test_sim_kinematics.py +0 -2
  186. warp/tests/test_smoothstep.py +0 -2
  187. warp/tests/test_snippet.py +0 -2
  188. warp/tests/test_sparse.py +0 -2
  189. warp/tests/test_spatial.py +0 -2
  190. warp/tests/test_special_values.py +362 -0
  191. warp/tests/test_streams.py +0 -2
  192. warp/tests/test_struct.py +0 -2
  193. warp/tests/test_tape.py +0 -2
  194. warp/tests/test_torch.py +0 -2
  195. warp/tests/test_transient_module.py +0 -2
  196. warp/tests/test_types.py +0 -2
  197. warp/tests/test_utils.py +0 -2
  198. warp/tests/test_vec.py +0 -2
  199. warp/tests/test_vec_lite.py +0 -2
  200. warp/tests/test_vec_scalar_ops.py +0 -2
  201. warp/tests/test_verify_fp.py +0 -2
  202. warp/tests/test_volume.py +237 -13
  203. warp/tests/test_volume_write.py +86 -3
  204. warp/tests/unittest_serial.py +10 -9
  205. warp/tests/unittest_suites.py +6 -2
  206. warp/tests/unittest_utils.py +2 -171
  207. warp/tests/unused_test_misc.py +0 -2
  208. warp/tests/walkthrough_debug.py +1 -1
  209. warp/thirdparty/unittest_parallel.py +37 -40
  210. warp/types.py +526 -85
  211. {warp_lang-1.1.0.dist-info → warp_lang-1.2.1.dist-info}/METADATA +61 -31
  212. warp_lang-1.2.1.dist-info/RECORD +359 -0
  213. warp/examples/fem/example_convection_diffusion_dg0.py +0 -204
  214. warp/native/nanovdb/PNanoVDBWrite.h +0 -295
  215. warp_lang-1.1.0.dist-info/RECORD +0 -352
  216. {warp_lang-1.1.0.dist-info → warp_lang-1.2.1.dist-info}/LICENSE.md +0 -0
  217. {warp_lang-1.1.0.dist-info → warp_lang-1.2.1.dist-info}/WHEEL +0 -0
  218. {warp_lang-1.1.0.dist-info → warp_lang-1.2.1.dist-info}/top_level.txt +0 -0
@@ -3,11 +3,11 @@
3
3
  // SPDX-License-Identifier: MPL-2.0
4
4
 
5
5
  /*!
6
- \file PNanoVDB.h
6
+ \file nanovdb/PNanoVDB.h
7
7
 
8
8
  \author Andrew Reidmeyer
9
9
 
10
- \brief This file is a portable (e.g. pointer-less) C99/GLSL/HLSL port
10
+ \brief This file is a portable (e.g. pointer-less) C99/GLSL/HLSL port
11
11
  of NanoVDB.h, which is compatible with most graphics APIs.
12
12
  */
13
13
 
@@ -56,8 +56,10 @@
56
56
  #endif
57
57
 
58
58
  #ifdef PNANOVDB_CMATH
59
+ #ifndef __CUDACC_RTC__
59
60
  #include <math.h>
60
61
  #endif
62
+ #endif
61
63
 
62
64
  // ------------------------------------------------ Buffer -----------------------------------------------------------
63
65
 
@@ -72,38 +74,11 @@
72
74
  #endif
73
75
 
74
76
  #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;
77
+ #ifndef __CUDACC_RTC__
78
+ #include <stdint.h>
104
79
  #endif
105
80
  #if defined(__CUDACC__)
106
- #define PNANOVDB_BUF_FORCE_INLINE __host__ __device__ static __forceinline__
81
+ #define PNANOVDB_BUF_FORCE_INLINE static __host__ __device__ __forceinline__
107
82
  #elif defined(_WIN32)
108
83
  #define PNANOVDB_BUF_FORCE_INLINE static inline __forceinline
109
84
  #else
@@ -146,6 +121,32 @@ PNANOVDB_BUF_FORCE_INLINE uint64_t pnanovdb_buf_read_uint64(pnanovdb_buf_t buf,
146
121
  return data64[wordaddress64];
147
122
  #endif
148
123
  }
124
+ PNANOVDB_BUF_FORCE_INLINE void pnanovdb_buf_write_uint32(pnanovdb_buf_t buf, uint32_t byte_offset, uint32_t value)
125
+ {
126
+ uint32_t wordaddress = (byte_offset >> 2u);
127
+ #ifdef PNANOVDB_BUF_BOUNDS_CHECK
128
+ if (wordaddress < buf.size_in_words)
129
+ {
130
+ buf.data[wordaddress] = value;
131
+ }
132
+ #else
133
+ buf.data[wordaddress] = value;
134
+ #endif
135
+ }
136
+ PNANOVDB_BUF_FORCE_INLINE void pnanovdb_buf_write_uint64(pnanovdb_buf_t buf, uint32_t byte_offset, uint64_t value)
137
+ {
138
+ uint64_t* data64 = (uint64_t*)buf.data;
139
+ uint32_t wordaddress64 = (byte_offset >> 3u);
140
+ #ifdef PNANOVDB_BUF_BOUNDS_CHECK
141
+ uint64_t size_in_words64 = buf.size_in_words >> 1u;
142
+ if (wordaddress64 < size_in_words64)
143
+ {
144
+ data64[wordaddress64] = value;
145
+ }
146
+ #else
147
+ data64[wordaddress64] = value;
148
+ #endif
149
+ }
149
150
  #elif defined(PNANOVDB_ADDRESS_64)
150
151
  PNANOVDB_BUF_FORCE_INLINE uint32_t pnanovdb_buf_read_uint32(pnanovdb_buf_t buf, uint64_t byte_offset)
151
152
  {
@@ -167,6 +168,32 @@ PNANOVDB_BUF_FORCE_INLINE uint64_t pnanovdb_buf_read_uint64(pnanovdb_buf_t buf,
167
168
  return data64[wordaddress64];
168
169
  #endif
169
170
  }
171
+ PNANOVDB_BUF_FORCE_INLINE void pnanovdb_buf_write_uint32(pnanovdb_buf_t buf, uint64_t byte_offset, uint32_t value)
172
+ {
173
+ uint64_t wordaddress = (byte_offset >> 2u);
174
+ #ifdef PNANOVDB_BUF_BOUNDS_CHECK
175
+ if (wordaddress < buf.size_in_words)
176
+ {
177
+ buf.data[wordaddress] = value;
178
+ }
179
+ #else
180
+ buf.data[wordaddress] = value;
181
+ #endif
182
+ }
183
+ PNANOVDB_BUF_FORCE_INLINE void pnanovdb_buf_write_uint64(pnanovdb_buf_t buf, uint64_t byte_offset, uint64_t value)
184
+ {
185
+ uint64_t* data64 = (uint64_t*)buf.data;
186
+ uint64_t wordaddress64 = (byte_offset >> 3u);
187
+ #ifdef PNANOVDB_BUF_BOUNDS_CHECK
188
+ uint64_t size_in_words64 = buf.size_in_words >> 1u;
189
+ if (wordaddress64 < size_in_words64)
190
+ {
191
+ data64[wordaddress64] = value;
192
+ }
193
+ #else
194
+ data64[wordaddress64] = value;
195
+ #endif
196
+ }
170
197
  #endif
171
198
  typedef uint32_t pnanovdb_grid_type_t;
172
199
  #define PNANOVDB_GRID_TYPE_GET(grid_typeIn, nameIn) pnanovdb_grid_type_constants[grid_typeIn].nameIn
@@ -184,6 +211,14 @@ uint2 pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint byte_offset)
184
211
  ret.y = pnanovdb_buf_read_uint32(buf, byte_offset + 4u);
185
212
  return ret;
186
213
  }
214
+ void pnanovdb_buf_write_uint32(pnanovdb_buf_t buf, uint byte_offset, uint value)
215
+ {
216
+ // NOP, by default no write in HLSL
217
+ }
218
+ void pnanovdb_buf_write_uint64(pnanovdb_buf_t buf, uint byte_offset, uint2 value)
219
+ {
220
+ // NOP, by default no write in HLSL
221
+ }
187
222
  #elif defined(PNANOVDB_ADDRESS_64)
188
223
  #define pnanovdb_buf_t StructuredBuffer<uint>
189
224
  uint pnanovdb_buf_read_uint32(pnanovdb_buf_t buf, uint64_t byte_offset)
@@ -197,6 +232,14 @@ uint64_t pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint64_t byte_offset)
197
232
  ret = ret + (uint64_t(pnanovdb_buf_read_uint32(buf, byte_offset + 4u)) << 32u);
198
233
  return ret;
199
234
  }
235
+ void pnanovdb_buf_write_uint32(pnanovdb_buf_t buf, uint64_t byte_offset, uint value)
236
+ {
237
+ // NOP, by default no write in HLSL
238
+ }
239
+ void pnanovdb_buf_write_uint64(pnanovdb_buf_t buf, uint64_t byte_offset, uint64_t value)
240
+ {
241
+ // NOP, by default no write in HLSL
242
+ }
200
243
  #endif
201
244
  #define pnanovdb_grid_type_t uint
202
245
  #define PNANOVDB_GRID_TYPE_GET(grid_typeIn, nameIn) pnanovdb_grid_type_constants[grid_typeIn].nameIn
@@ -216,6 +259,14 @@ uvec2 pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint byte_offset)
216
259
  ret.y = pnanovdb_buf_read_uint32(buf, byte_offset + 4u);
217
260
  return ret;
218
261
  }
262
+ void pnanovdb_buf_write_uint32(pnanovdb_buf_t buf, uint byte_offset, uint value)
263
+ {
264
+ // NOP, by default no write in HLSL
265
+ }
266
+ void pnanovdb_buf_write_uint64(pnanovdb_buf_t buf, uint byte_offset, uvec2 value)
267
+ {
268
+ // NOP, by default no write in HLSL
269
+ }
219
270
  #define pnanovdb_grid_type_t uint
220
271
  #define PNANOVDB_GRID_TYPE_GET(grid_typeIn, nameIn) pnanovdb_grid_type_constants[grid_typeIn].nameIn
221
272
  #endif
@@ -225,7 +276,7 @@ uvec2 pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint byte_offset)
225
276
  // force inline
226
277
  #if defined(PNANOVDB_C)
227
278
  #if defined(__CUDACC__)
228
- #define PNANOVDB_FORCE_INLINE __host__ __device__ static __forceinline__
279
+ #define PNANOVDB_FORCE_INLINE static __host__ __device__ __forceinline__
229
280
  #elif defined(_WIN32)
230
281
  #define PNANOVDB_FORCE_INLINE static inline __forceinline
231
282
  #else
@@ -240,7 +291,11 @@ uvec2 pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint byte_offset)
240
291
  // struct typedef, static const, inout
241
292
  #if defined(PNANOVDB_C)
242
293
  #define PNANOVDB_STRUCT_TYPEDEF(X) typedef struct X X;
294
+ #if defined(__CUDA_ARCH__)
295
+ #define PNANOVDB_STATIC_CONST constexpr __constant__
296
+ #else
243
297
  #define PNANOVDB_STATIC_CONST static const
298
+ #endif
244
299
  #define PNANOVDB_INOUT(X) X*
245
300
  #define PNANOVDB_IN(X) const X*
246
301
  #define PNANOVDB_DEREF(X) (*X)
@@ -264,9 +319,13 @@ uvec2 pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint byte_offset)
264
319
  // basic types, type conversion
265
320
  #if defined(PNANOVDB_C)
266
321
  #define PNANOVDB_NATIVE_64
267
- // #include <stdint.h>
322
+ #ifndef __CUDACC_RTC__
323
+ #include <stdint.h>
324
+ #endif
268
325
  #if !defined(PNANOVDB_MEMCPY_CUSTOM)
326
+ #ifndef __CUDACC_RTC__
269
327
  #include <string.h>
328
+ #endif
270
329
  #define pnanovdb_memcpy memcpy
271
330
  #endif
272
331
  typedef uint32_t pnanovdb_uint32_t;
@@ -288,10 +347,10 @@ PNANOVDB_FORCE_INLINE pnanovdb_int32_t pnanovdb_uint32_as_int32(pnanovdb_uint32_
288
347
  PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_uint64_as_int64(pnanovdb_uint64_t v) { return (pnanovdb_int64_t)v; }
289
348
  PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_int64_as_uint64(pnanovdb_int64_t v) { return (pnanovdb_uint64_t)v; }
290
349
  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
350
  PNANOVDB_FORCE_INLINE float pnanovdb_uint32_as_float(pnanovdb_uint32_t v) { float vf; pnanovdb_memcpy(&vf, &v, sizeof(vf)); return vf; }
351
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_float_as_uint32(float v) { return *((pnanovdb_uint32_t*)(&v)); }
294
352
  PNANOVDB_FORCE_INLINE double pnanovdb_uint64_as_double(pnanovdb_uint64_t v) { double vf; pnanovdb_memcpy(&vf, &v, sizeof(vf)); return vf; }
353
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_double_as_uint64(double v) { return *((pnanovdb_uint64_t*)(&v)); }
295
354
  PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_uint64_low(pnanovdb_uint64_t v) { return (pnanovdb_uint32_t)v; }
296
355
  PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_uint64_high(pnanovdb_uint64_t v) { return (pnanovdb_uint32_t)(v >> 32u); }
297
356
  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); }
@@ -317,6 +376,7 @@ typedef float3 pnanovdb_vec3_t;
317
376
  pnanovdb_int32_t pnanovdb_uint32_as_int32(pnanovdb_uint32_t v) { return int(v); }
318
377
  pnanovdb_uint32_t pnanovdb_int32_as_uint32(pnanovdb_int32_t v) { return uint(v); }
319
378
  float pnanovdb_uint32_as_float(pnanovdb_uint32_t v) { return asfloat(v); }
379
+ pnanovdb_uint32_t pnanovdb_float_as_uint32(float v) { return asuint(v); }
320
380
  float pnanovdb_floor(float v) { return floor(v); }
321
381
  pnanovdb_int32_t pnanovdb_float_to_int32(float v) { return int(v); }
322
382
  float pnanovdb_int32_to_float(pnanovdb_int32_t v) { return float(v); }
@@ -329,6 +389,7 @@ typedef int2 pnanovdb_int64_t;
329
389
  pnanovdb_int64_t pnanovdb_uint64_as_int64(pnanovdb_uint64_t v) { return int2(v); }
330
390
  pnanovdb_uint64_t pnanovdb_int64_as_uint64(pnanovdb_int64_t v) { return uint2(v); }
331
391
  double pnanovdb_uint64_as_double(pnanovdb_uint64_t v) { return asdouble(v.x, v.y); }
392
+ pnanovdb_uint64_t pnanovdb_double_as_uint64(double v) { uint2 ret; asuint(v, ret.x, ret.y); return ret; }
332
393
  pnanovdb_uint32_t pnanovdb_uint64_low(pnanovdb_uint64_t v) { return v.x; }
333
394
  pnanovdb_uint32_t pnanovdb_uint64_high(pnanovdb_uint64_t v) { return v.y; }
334
395
  pnanovdb_uint64_t pnanovdb_uint32_as_uint64(pnanovdb_uint32_t x, pnanovdb_uint32_t y) { return uint2(x, y); }
@@ -341,6 +402,7 @@ typedef int64_t pnanovdb_int64_t;
341
402
  pnanovdb_int64_t pnanovdb_uint64_as_int64(pnanovdb_uint64_t v) { return int64_t(v); }
342
403
  pnanovdb_uint64_t pnanovdb_int64_as_uint64(pnanovdb_int64_t v) { return uint64_t(v); }
343
404
  double pnanovdb_uint64_as_double(pnanovdb_uint64_t v) { return asdouble(uint(v), uint(v >> 32u)); }
405
+ pnanovdb_uint64_t pnanovdb_double_as_uint64(double v) { uint2 ret; asuint(v, ret.x, ret.y); return uint64_t(ret.x) + (uint64_t(ret.y) << 32u); }
344
406
  pnanovdb_uint32_t pnanovdb_uint64_low(pnanovdb_uint64_t v) { return uint(v); }
345
407
  pnanovdb_uint32_t pnanovdb_uint64_high(pnanovdb_uint64_t v) { return uint(v >> 32u); }
346
408
  pnanovdb_uint64_t pnanovdb_uint32_as_uint64(pnanovdb_uint32_t x, pnanovdb_uint32_t y) { return uint64_t(x) + (uint64_t(y) << 32u); }
@@ -363,7 +425,9 @@ pnanovdb_int64_t pnanovdb_uint64_as_int64(pnanovdb_uint64_t v) { return ivec2(v)
363
425
  pnanovdb_uint64_t pnanovdb_int64_as_uint64(pnanovdb_int64_t v) { return uvec2(v); }
364
426
  pnanovdb_uint32_t pnanovdb_int32_as_uint32(pnanovdb_int32_t v) { return uint(v); }
365
427
  float pnanovdb_uint32_as_float(pnanovdb_uint32_t v) { return uintBitsToFloat(v); }
428
+ pnanovdb_uint32_t pnanovdb_float_as_uint32(float v) { return floatBitsToUint(v); }
366
429
  double pnanovdb_uint64_as_double(pnanovdb_uint64_t v) { return packDouble2x32(uvec2(v.x, v.y)); }
430
+ pnanovdb_uint64_t pnanovdb_double_as_uint64(double v) { return unpackDouble2x32(v); }
367
431
  pnanovdb_uint32_t pnanovdb_uint64_low(pnanovdb_uint64_t v) { return v.x; }
368
432
  pnanovdb_uint32_t pnanovdb_uint64_high(pnanovdb_uint64_t v) { return v.y; }
369
433
  pnanovdb_uint64_t pnanovdb_uint32_as_uint64(pnanovdb_uint32_t x, pnanovdb_uint32_t y) { return uvec2(x, y); }
@@ -437,14 +501,6 @@ PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_max(const pnanovdb_vec3_t a,
437
501
  v.z = a.z > b.z ? a.z : b.z;
438
502
  return v;
439
503
  }
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
504
  PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_coord_to_vec3(const pnanovdb_coord_t coord)
449
505
  {
450
506
  pnanovdb_vec3_t v;
@@ -493,6 +549,119 @@ pnanovdb_coord_t pnanovdb_coord_uniform(pnanovdb_int32_t a) { return ivec3(a, a,
493
549
  pnanovdb_coord_t pnanovdb_coord_add(pnanovdb_coord_t a, pnanovdb_coord_t b) { return a + b; }
494
550
  #endif
495
551
 
552
+ // ------------------------------------------------ Uint64 Utils -----------------------------------------------------------
553
+
554
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_uint32_countbits(pnanovdb_uint32_t value)
555
+ {
556
+ #if defined(PNANOVDB_C)
557
+ #if defined(_MSC_VER) && (_MSC_VER >= 1928) && defined(PNANOVDB_USE_INTRINSICS)
558
+ return __popcnt(value);
559
+ #elif (defined(__GNUC__) || defined(__clang__)) && defined(PNANOVDB_USE_INTRINSICS)
560
+ return __builtin_popcount(value);
561
+ #else
562
+ value = value - ((value >> 1) & 0x55555555);
563
+ value = (value & 0x33333333) + ((value >> 2) & 0x33333333);
564
+ value = (value + (value >> 4)) & 0x0F0F0F0F;
565
+ return (value * 0x01010101) >> 24;
566
+ #endif
567
+ #elif defined(PNANOVDB_HLSL)
568
+ return countbits(value);
569
+ #elif defined(PNANOVDB_GLSL)
570
+ return bitCount(value);
571
+ #endif
572
+ }
573
+
574
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_uint64_countbits(pnanovdb_uint64_t value)
575
+ {
576
+ return pnanovdb_uint32_countbits(pnanovdb_uint64_low(value)) + pnanovdb_uint32_countbits(pnanovdb_uint64_high(value));
577
+ }
578
+
579
+ #if defined(PNANOVDB_ADDRESS_32)
580
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint64_offset(pnanovdb_uint64_t a, pnanovdb_uint32_t b)
581
+ {
582
+ pnanovdb_uint32_t low = pnanovdb_uint64_low(a);
583
+ pnanovdb_uint32_t high = pnanovdb_uint64_high(a);
584
+ low += b;
585
+ if (low < b)
586
+ {
587
+ high += 1u;
588
+ }
589
+ return pnanovdb_uint32_as_uint64(low, high);
590
+ }
591
+
592
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint64_dec(pnanovdb_uint64_t a)
593
+ {
594
+ pnanovdb_uint32_t low = pnanovdb_uint64_low(a);
595
+ pnanovdb_uint32_t high = pnanovdb_uint64_high(a);
596
+ if (low == 0u)
597
+ {
598
+ high -= 1u;
599
+ }
600
+ low -= 1u;
601
+ return pnanovdb_uint32_as_uint64(low, high);
602
+ }
603
+
604
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_uint64_to_uint32_lsr(pnanovdb_uint64_t a, pnanovdb_uint32_t b)
605
+ {
606
+ pnanovdb_uint32_t low = pnanovdb_uint64_low(a);
607
+ pnanovdb_uint32_t high = pnanovdb_uint64_high(a);
608
+ return (b >= 32u) ?
609
+ (high >> (b - 32)) :
610
+ ((low >> b) | ((b > 0) ? (high << (32u - b)) : 0u));
611
+ }
612
+
613
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint64_bit_mask(pnanovdb_uint32_t bit_idx)
614
+ {
615
+ pnanovdb_uint32_t mask_low = bit_idx < 32u ? 1u << bit_idx : 0u;
616
+ pnanovdb_uint32_t mask_high = bit_idx >= 32u ? 1u << (bit_idx - 32u) : 0u;
617
+ return pnanovdb_uint32_as_uint64(mask_low, mask_high);
618
+ }
619
+
620
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint64_and(pnanovdb_uint64_t a, pnanovdb_uint64_t b)
621
+ {
622
+ return pnanovdb_uint32_as_uint64(
623
+ pnanovdb_uint64_low(a) & pnanovdb_uint64_low(b),
624
+ pnanovdb_uint64_high(a) & pnanovdb_uint64_high(b)
625
+ );
626
+ }
627
+
628
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_uint64_any_bit(pnanovdb_uint64_t a)
629
+ {
630
+ return pnanovdb_uint64_low(a) != 0u || pnanovdb_uint64_high(a) != 0u;
631
+ }
632
+
633
+ #else
634
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint64_offset(pnanovdb_uint64_t a, pnanovdb_uint32_t b)
635
+ {
636
+ return a + b;
637
+ }
638
+
639
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint64_dec(pnanovdb_uint64_t a)
640
+ {
641
+ return a - 1u;
642
+ }
643
+
644
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_uint64_to_uint32_lsr(pnanovdb_uint64_t a, pnanovdb_uint32_t b)
645
+ {
646
+ return pnanovdb_uint64_low(a >> b);
647
+ }
648
+
649
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint64_bit_mask(pnanovdb_uint32_t bit_idx)
650
+ {
651
+ return 1llu << bit_idx;
652
+ }
653
+
654
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint64_and(pnanovdb_uint64_t a, pnanovdb_uint64_t b)
655
+ {
656
+ return a & b;
657
+ }
658
+
659
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_uint64_any_bit(pnanovdb_uint64_t a)
660
+ {
661
+ return a != 0llu;
662
+ }
663
+ #endif
664
+
496
665
  // ------------------------------------------------ Address Type -----------------------------------------------------------
497
666
 
498
667
  #if defined(PNANOVDB_ADDRESS_32)
@@ -527,6 +696,12 @@ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset64(pnanovdb_addr
527
696
  ret.byte_offset += pnanovdb_uint64_low(byte_offset);
528
697
  return ret;
529
698
  }
699
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset64_product(pnanovdb_address_t address, pnanovdb_uint64_t byte_offset, pnanovdb_uint32_t multiplier)
700
+ {
701
+ pnanovdb_address_t ret = address;
702
+ ret.byte_offset += pnanovdb_uint64_low(byte_offset) * multiplier;
703
+ return ret;
704
+ }
530
705
  PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_address_mask(pnanovdb_address_t address, pnanovdb_uint32_t mask)
531
706
  {
532
707
  return address.byte_offset & mask;
@@ -581,6 +756,12 @@ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset64(pnanovdb_addr
581
756
  ret.byte_offset += byte_offset;
582
757
  return ret;
583
758
  }
759
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset64_product(pnanovdb_address_t address, pnanovdb_uint64_t byte_offset, pnanovdb_uint32_t multiplier)
760
+ {
761
+ pnanovdb_address_t ret = address;
762
+ ret.byte_offset += byte_offset * pnanovdb_uint32_as_uint64_low(multiplier);
763
+ return ret;
764
+ }
584
765
  PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_address_mask(pnanovdb_address_t address, pnanovdb_uint32_t mask)
585
766
  {
586
767
  return pnanovdb_uint64_low(address.byte_offset) & mask;
@@ -640,12 +821,41 @@ PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_read_coord(pnanovdb_buf_t buf, p
640
821
  ret.z = pnanovdb_uint32_as_int32(pnanovdb_read_uint32(buf, pnanovdb_address_offset(address, 8u)));
641
822
  return ret;
642
823
  }
643
- PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_read_vec3f(pnanovdb_buf_t buf, pnanovdb_address_t address)
824
+ PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_read_vec3(pnanovdb_buf_t buf, pnanovdb_address_t address)
825
+ {
826
+ pnanovdb_vec3_t ret;
827
+ ret.x = pnanovdb_read_float(buf, pnanovdb_address_offset(address, 0u));
828
+ ret.y = pnanovdb_read_float(buf, pnanovdb_address_offset(address, 4u));
829
+ ret.z = pnanovdb_read_float(buf, pnanovdb_address_offset(address, 8u));
830
+ return ret;
831
+ }
832
+
833
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_read_uint16(pnanovdb_buf_t buf, pnanovdb_address_t address)
834
+ {
835
+ pnanovdb_uint32_t raw = pnanovdb_read_uint32(buf, pnanovdb_address_mask_inv(address, 3u));
836
+ return (raw >> (pnanovdb_address_mask(address, 2) << 3));
837
+ }
838
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_read_uint8(pnanovdb_buf_t buf, pnanovdb_address_t address)
839
+ {
840
+ pnanovdb_uint32_t raw = pnanovdb_read_uint32(buf, pnanovdb_address_mask_inv(address, 3u));
841
+ return (raw >> (pnanovdb_address_mask(address, 3) << 3)) & 255;
842
+ }
843
+ PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_read_vec3u16(pnanovdb_buf_t buf, pnanovdb_address_t address)
644
844
  {
645
845
  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)));
846
+ const float scale = 1.f / 65535.f;
847
+ ret.x = scale * pnanovdb_uint32_to_float(pnanovdb_read_uint16(buf, pnanovdb_address_offset(address, 0u))) - 0.5f;
848
+ ret.y = scale * pnanovdb_uint32_to_float(pnanovdb_read_uint16(buf, pnanovdb_address_offset(address, 2u))) - 0.5f;
849
+ ret.z = scale * pnanovdb_uint32_to_float(pnanovdb_read_uint16(buf, pnanovdb_address_offset(address, 4u))) - 0.5f;
850
+ return ret;
851
+ }
852
+ PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_read_vec3u8(pnanovdb_buf_t buf, pnanovdb_address_t address)
853
+ {
854
+ pnanovdb_vec3_t ret;
855
+ const float scale = 1.f / 255.f;
856
+ ret.x = scale * pnanovdb_uint32_to_float(pnanovdb_read_uint8(buf, pnanovdb_address_offset(address, 0u))) - 0.5f;
857
+ ret.y = scale * pnanovdb_uint32_to_float(pnanovdb_read_uint8(buf, pnanovdb_address_offset(address, 1u))) - 0.5f;
858
+ ret.z = scale * pnanovdb_uint32_to_float(pnanovdb_read_uint8(buf, pnanovdb_address_offset(address, 2u))) - 0.5f;
649
859
  return ret;
650
860
  }
651
861
 
@@ -677,13 +887,54 @@ PNANOVDB_FORCE_INLINE float pnanovdb_read_half(pnanovdb_buf_t buf, pnanovdb_addr
677
887
  }
678
888
  #endif
679
889
 
890
+ // ------------------------------------------------ High Level Buffer Write -----------------------------------------------------------
891
+
892
+ PNANOVDB_FORCE_INLINE void pnanovdb_write_uint32(pnanovdb_buf_t buf, pnanovdb_address_t address, pnanovdb_uint32_t value)
893
+ {
894
+ pnanovdb_buf_write_uint32(buf, address.byte_offset, value);
895
+ }
896
+ PNANOVDB_FORCE_INLINE void pnanovdb_write_uint64(pnanovdb_buf_t buf, pnanovdb_address_t address, pnanovdb_uint64_t value)
897
+ {
898
+ pnanovdb_buf_write_uint64(buf, address.byte_offset, value);
899
+ }
900
+ PNANOVDB_FORCE_INLINE void pnanovdb_write_int32(pnanovdb_buf_t buf, pnanovdb_address_t address, pnanovdb_int32_t value)
901
+ {
902
+ pnanovdb_write_uint32(buf, address, pnanovdb_int32_as_uint32(value));
903
+ }
904
+ PNANOVDB_FORCE_INLINE void pnanovdb_write_int64(pnanovdb_buf_t buf, pnanovdb_address_t address, pnanovdb_int64_t value)
905
+ {
906
+ pnanovdb_buf_write_uint64(buf, address.byte_offset, pnanovdb_int64_as_uint64(value));
907
+ }
908
+ PNANOVDB_FORCE_INLINE void pnanovdb_write_float(pnanovdb_buf_t buf, pnanovdb_address_t address, float value)
909
+ {
910
+ pnanovdb_write_uint32(buf, address, pnanovdb_float_as_uint32(value));
911
+ }
912
+ PNANOVDB_FORCE_INLINE void pnanovdb_write_double(pnanovdb_buf_t buf, pnanovdb_address_t address, double value)
913
+ {
914
+ pnanovdb_write_uint64(buf, address, pnanovdb_double_as_uint64(value));
915
+ }
916
+ PNANOVDB_FORCE_INLINE void pnanovdb_write_coord(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) value)
917
+ {
918
+ pnanovdb_write_uint32(buf, pnanovdb_address_offset(address, 0u), pnanovdb_int32_as_uint32(PNANOVDB_DEREF(value).x));
919
+ pnanovdb_write_uint32(buf, pnanovdb_address_offset(address, 4u), pnanovdb_int32_as_uint32(PNANOVDB_DEREF(value).y));
920
+ pnanovdb_write_uint32(buf, pnanovdb_address_offset(address, 8u), pnanovdb_int32_as_uint32(PNANOVDB_DEREF(value).z));
921
+ }
922
+ PNANOVDB_FORCE_INLINE void pnanovdb_write_vec3(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_vec3_t) value)
923
+ {
924
+ pnanovdb_write_float(buf, pnanovdb_address_offset(address, 0u), PNANOVDB_DEREF(value).x);
925
+ pnanovdb_write_float(buf, pnanovdb_address_offset(address, 4u), PNANOVDB_DEREF(value).y);
926
+ pnanovdb_write_float(buf, pnanovdb_address_offset(address, 8u), PNANOVDB_DEREF(value).z);
927
+ }
928
+
680
929
  // ------------------------------------------------ Core Structures -----------------------------------------------------------
681
930
 
682
931
  #define PNANOVDB_MAGIC_NUMBER 0x304244566f6e614eUL// "NanoVDB0" in hex - little endian (uint64_t)
932
+ #define PNANOVDB_MAGIC_GRID 0x314244566f6e614eUL// "NanoVDB1" in hex - little endian (uint64_t)
933
+ #define PNANOVDB_MAGIC_FILE 0x324244566f6e614eUL// "NanoVDB2" in hex - little endian (uint64_t)
683
934
 
684
935
  #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
936
+ #define PNANOVDB_MINOR_VERSION_NUMBER 7// reflects changes to the API but not ABI
937
+ #define PNANOVDB_PATCH_VERSION_NUMBER 0// reflects bug-fixes with no ABI or API changes
687
938
 
688
939
  #define PNANOVDB_GRID_TYPE_UNKNOWN 0
689
940
  #define PNANOVDB_GRID_TYPE_FLOAT 1
@@ -704,17 +955,27 @@ PNANOVDB_FORCE_INLINE float pnanovdb_read_half(pnanovdb_buf_t buf, pnanovdb_addr
704
955
  #define PNANOVDB_GRID_TYPE_FPN 16
705
956
  #define PNANOVDB_GRID_TYPE_VEC4F 17
706
957
  #define PNANOVDB_GRID_TYPE_VEC4D 18
707
- #define PNANOVDB_GRID_TYPE_END 19
958
+ #define PNANOVDB_GRID_TYPE_INDEX 19
959
+ #define PNANOVDB_GRID_TYPE_ONINDEX 20
960
+ #define PNANOVDB_GRID_TYPE_INDEXMASK 21
961
+ #define PNANOVDB_GRID_TYPE_ONINDEXMASK 22
962
+ #define PNANOVDB_GRID_TYPE_POINTINDEX 23
963
+ #define PNANOVDB_GRID_TYPE_VEC3U8 24
964
+ #define PNANOVDB_GRID_TYPE_VEC3U16 25
965
+ #define PNANOVDB_GRID_TYPE_UINT8 26
966
+ #define PNANOVDB_GRID_TYPE_END 27
708
967
 
709
968
  #define PNANOVDB_GRID_CLASS_UNKNOWN 0
710
- #define PNANOVDB_GRID_CLASS_LEVEL_SET 1 // narrow band levelset, e.g. SDF
969
+ #define PNANOVDB_GRID_CLASS_LEVEL_SET 1 // narrow band level set, e.g. SDF
711
970
  #define PNANOVDB_GRID_CLASS_FOG_VOLUME 2 // fog volume, e.g. density
712
971
  #define PNANOVDB_GRID_CLASS_STAGGERED 3 // staggered MAC grid, e.g. velocity
713
972
  #define PNANOVDB_GRID_CLASS_POINT_INDEX 4 // point index grid
714
973
  #define PNANOVDB_GRID_CLASS_POINT_DATA 5 // point data grid
715
974
  #define PNANOVDB_GRID_CLASS_TOPOLOGY 6 // grid with active states only (no values)
716
975
  #define PNANOVDB_GRID_CLASS_VOXEL_VOLUME 7 // volume of geometric cubes, e.g. minecraft
717
- #define PNANOVDB_GRID_CLASS_END 8
976
+ #define PNANOVDB_GRID_CLASS_INDEX_GRID 8 // grid whose values are offsets, e.g. into an external array
977
+ #define PNANOVDB_GRID_CLASS_TENSOR_GRID 9 // grid which can have extra metadata and features
978
+ #define PNANOVDB_GRID_CLASS_END 10
718
979
 
719
980
  #define PNANOVDB_GRID_FLAGS_HAS_LONG_GRID_NAME (1 << 0)
720
981
  #define PNANOVDB_GRID_FLAGS_HAS_BBOX (1 << 1)
@@ -727,13 +988,23 @@ PNANOVDB_FORCE_INLINE float pnanovdb_read_half(pnanovdb_buf_t buf, pnanovdb_addr
727
988
  #define PNANOVDB_LEAF_TYPE_DEFAULT 0
728
989
  #define PNANOVDB_LEAF_TYPE_LITE 1
729
990
  #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 };
991
+ #define PNANOVDB_LEAF_TYPE_INDEX 3
992
+ #define PNANOVDB_LEAF_TYPE_INDEXMASK 4
993
+ #define PNANOVDB_LEAF_TYPE_POINTINDEX 5
994
+
995
+ // BuildType = Unknown, float, double, int16_t, int32_t, int64_t, Vec3f, Vec3d, Mask, ...
996
+ // bit count of values in leaf nodes, i.e. 8*sizeof(*nanovdb::LeafNode<BuildType>::mValues) or zero if no values are stored
997
+ 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, 0, 0, 0, 0, 16, 24, 48, 8 };
998
+ // bit count of the Tile union in InternalNodes, i.e. 8*sizeof(nanovdb::InternalData::Tile)
999
+ 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, 64, 64, 64, 64, 64, 64, 64, 64 };
1000
+ // bit count of min/max values, i.e. 8*sizeof(nanovdb::LeafData::mMinimum) or zero if no min/max exists
1001
+ 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, 64, 64, 64, 64, 64, 24, 48, 8 };
1002
+ // bit alignment of the value type, controlled by the smallest native type, which is why it is always 0, 8, 16, 32, or 64, e.g. for Vec3f it is 32
1003
+ 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, 64, 64, 64, 64, 64, 8, 16, 8 };
1004
+ // bit alignment of the stats (avg/std-dev) types, e.g. 8*sizeof(nanovdb::LeafData::mAverage)
1005
+ 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, 64, 64, 64, 64, 64, 32, 32, 32 };
1006
+ // one of the 4 leaf types defined above, e.g. PNANOVDB_LEAF_TYPE_INDEX = 3
1007
+ 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, 3, 3, 4, 4, 5, 0, 0, 0 };
737
1008
 
738
1009
  struct pnanovdb_map_t
739
1010
  {
@@ -786,6 +1057,31 @@ PNANOVDB_FORCE_INLINE double pnanovdb_map_get_taperd(pnanovdb_buf_t buf, pnanovd
786
1057
  return pnanovdb_read_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_TAPERD));
787
1058
  }
788
1059
 
1060
+ PNANOVDB_FORCE_INLINE void pnanovdb_map_set_matf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index, float matf) {
1061
+ pnanovdb_write_float(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_MATF + 4u * index), matf);
1062
+ }
1063
+ PNANOVDB_FORCE_INLINE void pnanovdb_map_set_invmatf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index, float invmatf) {
1064
+ pnanovdb_write_float(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_INVMATF + 4u * index), invmatf);
1065
+ }
1066
+ PNANOVDB_FORCE_INLINE void pnanovdb_map_set_vecf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index, float vecf) {
1067
+ pnanovdb_write_float(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_VECF + 4u * index), vecf);
1068
+ }
1069
+ PNANOVDB_FORCE_INLINE void pnanovdb_map_set_taperf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index, float taperf) {
1070
+ pnanovdb_write_float(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_TAPERF), taperf);
1071
+ }
1072
+ PNANOVDB_FORCE_INLINE void pnanovdb_map_set_matd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index, double matd) {
1073
+ pnanovdb_write_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_MATD + 8u * index), matd);
1074
+ }
1075
+ PNANOVDB_FORCE_INLINE void pnanovdb_map_set_invmatd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index, double invmatd) {
1076
+ pnanovdb_write_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_INVMATD + 8u * index), invmatd);
1077
+ }
1078
+ PNANOVDB_FORCE_INLINE void pnanovdb_map_set_vecd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index, double vecd) {
1079
+ pnanovdb_write_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_VECD + 8u * index), vecd);
1080
+ }
1081
+ PNANOVDB_FORCE_INLINE void pnanovdb_map_set_taperd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index, double taperd) {
1082
+ pnanovdb_write_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_TAPERD), taperd);
1083
+ }
1084
+
789
1085
  struct pnanovdb_grid_t
790
1086
  {
791
1087
  pnanovdb_uint64_t magic; // 8 bytes, 0
@@ -875,6 +1171,54 @@ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_blind_metadata_count(p
875
1171
  return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_BLIND_METADATA_COUNT));
876
1172
  }
877
1173
 
1174
+ PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_magic(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint64_t magic) {
1175
+ pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_MAGIC), magic);
1176
+ }
1177
+ PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_checksum(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint64_t checksum) {
1178
+ pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_CHECKSUM), checksum);
1179
+ }
1180
+ PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_version(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t version) {
1181
+ pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_VERSION), version);
1182
+ }
1183
+ PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_flags(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t flags) {
1184
+ pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_FLAGS), flags);
1185
+ }
1186
+ PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_grid_index(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t grid_index) {
1187
+ pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_INDEX), grid_index);
1188
+ }
1189
+ PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_grid_count(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t grid_count) {
1190
+ pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_COUNT), grid_count);
1191
+ }
1192
+ PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_grid_size(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint64_t grid_size) {
1193
+ pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_SIZE), grid_size);
1194
+ }
1195
+ PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_grid_name(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t index, pnanovdb_uint32_t grid_name) {
1196
+ pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_NAME + 4u * index), grid_name);
1197
+ }
1198
+ PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_world_bbox(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t index, double world_bbox) {
1199
+ pnanovdb_write_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_WORLD_BBOX + 8u * index), world_bbox);
1200
+ }
1201
+ PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_voxel_size(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t index, double voxel_size) {
1202
+ pnanovdb_write_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_VOXEL_SIZE + 8u * index), voxel_size);
1203
+ }
1204
+ PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_grid_class(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t grid_class) {
1205
+ pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_CLASS), grid_class);
1206
+ }
1207
+ PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_grid_type(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t grid_type) {
1208
+ pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_TYPE), grid_type);
1209
+ }
1210
+ PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_blind_metadata_offset(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint64_t blind_metadata_offset) {
1211
+ pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_BLIND_METADATA_OFFSET), blind_metadata_offset);
1212
+ }
1213
+ PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_blind_metadata_count(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t metadata_count) {
1214
+ pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_BLIND_METADATA_COUNT), metadata_count);
1215
+ }
1216
+
1217
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_make_version(pnanovdb_uint32_t major, pnanovdb_uint32_t minor, pnanovdb_uint32_t patch_num)
1218
+ {
1219
+ return (major << 21u) | (minor << 10u) | patch_num;
1220
+ }
1221
+
878
1222
  PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_version_get_major(pnanovdb_uint32_t version)
879
1223
  {
880
1224
  return (version >> 21u) & ((1u << 11u) - 1u);
@@ -890,9 +1234,9 @@ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_version_get_patch(pnanovdb_uint
890
1234
 
891
1235
  struct pnanovdb_gridblindmetadata_t
892
1236
  {
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
1237
+ pnanovdb_int64_t data_offset; // 8 bytes, 0
1238
+ pnanovdb_uint64_t value_count; // 8 bytes, 8
1239
+ pnanovdb_uint32_t value_size; // 4 bytes, 16
896
1240
  pnanovdb_uint32_t semantic; // 4 bytes, 20
897
1241
  pnanovdb_uint32_t data_class; // 4 bytes, 24
898
1242
  pnanovdb_uint32_t data_type; // 4 bytes, 28
@@ -904,22 +1248,22 @@ PNANOVDB_STRUCT_TYPEDEF(pnanovdb_gridblindmetadata_handle_t)
904
1248
 
905
1249
  #define PNANOVDB_GRIDBLINDMETADATA_SIZE 288
906
1250
 
907
- #define PNANOVDB_GRIDBLINDMETADATA_OFF_BYTE_OFFSET 0
908
- #define PNANOVDB_GRIDBLINDMETADATA_OFF_ELEMENT_COUNT 8
909
- #define PNANOVDB_GRIDBLINDMETADATA_OFF_FLAGS 16
1251
+ #define PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_OFFSET 0
1252
+ #define PNANOVDB_GRIDBLINDMETADATA_OFF_VALUE_COUNT 8
1253
+ #define PNANOVDB_GRIDBLINDMETADATA_OFF_VALUE_SIZE 16
910
1254
  #define PNANOVDB_GRIDBLINDMETADATA_OFF_SEMANTIC 20
911
1255
  #define PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_CLASS 24
912
1256
  #define PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_TYPE 28
913
1257
  #define PNANOVDB_GRIDBLINDMETADATA_OFF_NAME 32
914
1258
 
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));
1259
+ PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_gridblindmetadata_get_data_offset(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
1260
+ return pnanovdb_read_int64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_OFFSET));
917
1261
  }
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));
1262
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_gridblindmetadata_get_value_count(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
1263
+ return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_VALUE_COUNT));
920
1264
  }
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));
1265
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_value_size(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
1266
+ return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_VALUE_SIZE));
923
1267
  }
924
1268
  PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_semantic(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
925
1269
  return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_SEMANTIC));
@@ -1000,6 +1344,40 @@ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_voxel_count(pnanovdb_b
1000
1344
  return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_VOXEL_COUNT));
1001
1345
  }
1002
1346
 
1347
+ PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_node_offset_leaf(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint64_t node_offset_leaf) {
1348
+ pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_OFFSET_LEAF), node_offset_leaf);
1349
+ }
1350
+ PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_node_offset_lower(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint64_t node_offset_lower) {
1351
+ pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_OFFSET_LOWER), node_offset_lower);
1352
+ }
1353
+ PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_node_offset_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint64_t node_offset_upper) {
1354
+ pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_OFFSET_UPPER), node_offset_upper);
1355
+ }
1356
+ PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_node_offset_root(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint64_t node_offset_root) {
1357
+ pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_OFFSET_ROOT), node_offset_root);
1358
+ }
1359
+ PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_node_count_leaf(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint32_t node_count_leaf) {
1360
+ pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_COUNT_LEAF), node_count_leaf);
1361
+ }
1362
+ PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_node_count_lower(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint32_t node_count_lower) {
1363
+ pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_COUNT_LOWER), node_count_lower);
1364
+ }
1365
+ PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_node_count_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint32_t node_count_upper) {
1366
+ pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_COUNT_UPPER), node_count_upper);
1367
+ }
1368
+ PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_tile_count_leaf(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint32_t tile_count_leaf) {
1369
+ pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_TILE_COUNT_LEAF), tile_count_leaf);
1370
+ }
1371
+ PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_tile_count_lower(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint32_t tile_count_lower) {
1372
+ pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_TILE_COUNT_LOWER), tile_count_lower);
1373
+ }
1374
+ PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_tile_count_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint32_t tile_count_upper) {
1375
+ pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_TILE_COUNT_UPPER), tile_count_upper);
1376
+ }
1377
+ PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_voxel_count(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint64_t voxel_count) {
1378
+ pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_VOXEL_COUNT), voxel_count);
1379
+ }
1380
+
1003
1381
  struct pnanovdb_root_t
1004
1382
  {
1005
1383
  pnanovdb_coord_t bbox_min;
@@ -1028,6 +1406,16 @@ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_root_get_tile_count(pnanovdb_bu
1028
1406
  return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_OFF_TABLE_SIZE));
1029
1407
  }
1030
1408
 
1409
+ PNANOVDB_FORCE_INLINE void pnanovdb_root_set_bbox_min(pnanovdb_buf_t buf, pnanovdb_root_handle_t p, PNANOVDB_IN(pnanovdb_coord_t) bbox_min) {
1410
+ pnanovdb_write_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_OFF_BBOX_MIN), bbox_min);
1411
+ }
1412
+ PNANOVDB_FORCE_INLINE void pnanovdb_root_set_bbox_max(pnanovdb_buf_t buf, pnanovdb_root_handle_t p, PNANOVDB_IN(pnanovdb_coord_t) bbox_max) {
1413
+ pnanovdb_write_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_OFF_BBOX_MAX), bbox_max);
1414
+ }
1415
+ PNANOVDB_FORCE_INLINE void pnanovdb_root_set_tile_count(pnanovdb_buf_t buf, pnanovdb_root_handle_t p, pnanovdb_uint32_t tile_count) {
1416
+ pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_OFF_TABLE_SIZE), tile_count);
1417
+ }
1418
+
1031
1419
  struct pnanovdb_root_tile_t
1032
1420
  {
1033
1421
  pnanovdb_uint64_t key;
@@ -1056,6 +1444,16 @@ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_root_tile_get_state(pnanovdb_bu
1056
1444
  return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_TILE_OFF_STATE));
1057
1445
  }
1058
1446
 
1447
+ PNANOVDB_FORCE_INLINE void pnanovdb_root_tile_set_key(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t p, pnanovdb_uint64_t key) {
1448
+ pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_TILE_OFF_KEY), key);
1449
+ }
1450
+ PNANOVDB_FORCE_INLINE void pnanovdb_root_tile_set_child(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t p, pnanovdb_int64_t child) {
1451
+ pnanovdb_write_int64(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_TILE_OFF_CHILD), child);
1452
+ }
1453
+ PNANOVDB_FORCE_INLINE void pnanovdb_root_tile_set_state(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t p, pnanovdb_uint32_t state) {
1454
+ pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_TILE_OFF_STATE), state);
1455
+ }
1456
+
1059
1457
  struct pnanovdb_upper_t
1060
1458
  {
1061
1459
  pnanovdb_coord_t bbox_min;
@@ -1097,6 +1495,20 @@ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_upper_get_child_mask(pnanovdb_buf
1097
1495
  return ((value >> (bit_index & 31u)) & 1) != 0u;
1098
1496
  }
1099
1497
 
1498
+ PNANOVDB_FORCE_INLINE void pnanovdb_upper_set_bbox_min(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p, PNANOVDB_IN(pnanovdb_coord_t) bbox_min) {
1499
+ pnanovdb_write_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_BBOX_MIN), bbox_min);
1500
+ }
1501
+ PNANOVDB_FORCE_INLINE void pnanovdb_upper_set_bbox_max(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p, PNANOVDB_IN(pnanovdb_coord_t) bbox_max) {
1502
+ pnanovdb_write_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_BBOX_MAX), bbox_max);
1503
+ }
1504
+ PNANOVDB_FORCE_INLINE void pnanovdb_upper_set_child_mask(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p, pnanovdb_uint32_t bit_index, pnanovdb_bool_t value) {
1505
+ pnanovdb_address_t addr = pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_CHILD_MASK + 4u * (bit_index >> 5u));
1506
+ pnanovdb_uint32_t valueMask = pnanovdb_read_uint32(buf, addr);
1507
+ if (!value) { valueMask &= ~(1u << (bit_index & 31u)); }
1508
+ if (value) valueMask |= (1u << (bit_index & 31u));
1509
+ pnanovdb_write_uint32(buf, addr, valueMask);
1510
+ }
1511
+
1100
1512
  struct pnanovdb_lower_t
1101
1513
  {
1102
1514
  pnanovdb_coord_t bbox_min;
@@ -1138,6 +1550,20 @@ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_lower_get_child_mask(pnanovdb_buf
1138
1550
  return ((value >> (bit_index & 31u)) & 1) != 0u;
1139
1551
  }
1140
1552
 
1553
+ PNANOVDB_FORCE_INLINE void pnanovdb_lower_set_bbox_min(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p, PNANOVDB_IN(pnanovdb_coord_t) bbox_min) {
1554
+ pnanovdb_write_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_BBOX_MIN), bbox_min);
1555
+ }
1556
+ PNANOVDB_FORCE_INLINE void pnanovdb_lower_set_bbox_max(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p, PNANOVDB_IN(pnanovdb_coord_t) bbox_max) {
1557
+ pnanovdb_write_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_BBOX_MAX), bbox_max);
1558
+ }
1559
+ PNANOVDB_FORCE_INLINE void pnanovdb_lower_set_child_mask(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p, pnanovdb_uint32_t bit_index, pnanovdb_bool_t value) {
1560
+ pnanovdb_address_t addr = pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_CHILD_MASK + 4u * (bit_index >> 5u));
1561
+ pnanovdb_uint32_t valueMask = pnanovdb_read_uint32(buf, addr);
1562
+ if (!value) { valueMask &= ~(1u << (bit_index & 31u)); }
1563
+ if (value) valueMask |= (1u << (bit_index & 31u));
1564
+ pnanovdb_write_uint32(buf, addr, valueMask);
1565
+ }
1566
+
1141
1567
  struct pnanovdb_leaf_t
1142
1568
  {
1143
1569
  pnanovdb_coord_t bbox_min;
@@ -1172,6 +1598,13 @@ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_get_value_mask(pnanovdb_buf_
1172
1598
  return ((value >> (bit_index & 31u)) & 1) != 0u;
1173
1599
  }
1174
1600
 
1601
+ PNANOVDB_FORCE_INLINE void pnanovdb_leaf_set_bbox_min(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t p, PNANOVDB_IN(pnanovdb_coord_t) bbox_min) {
1602
+ pnanovdb_write_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_LEAF_OFF_BBOX_MIN), bbox_min);
1603
+ }
1604
+ PNANOVDB_FORCE_INLINE void pnanovdb_leaf_set_bbox_dif_and_flags(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t p, pnanovdb_uint32_t bbox_dif_and_flags) {
1605
+ pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_LEAF_OFF_BBOX_DIF_AND_FLAGS), bbox_dif_and_flags);
1606
+ }
1607
+
1175
1608
  struct pnanovdb_grid_type_constants_t
1176
1609
  {
1177
1610
  pnanovdb_uint32_t root_off_background;
@@ -1205,27 +1638,36 @@ struct pnanovdb_grid_type_constants_t
1205
1638
  };
1206
1639
  PNANOVDB_STRUCT_TYPEDEF(pnanovdb_grid_type_constants_t)
1207
1640
 
1641
+ // The following table with offsets will nedd to be updates as new GridTypes are added in NanoVDB.h
1208
1642
  PNANOVDB_STATIC_CONST pnanovdb_grid_type_constants_t pnanovdb_grid_type_constants[PNANOVDB_GRID_TYPE_END] =
1209
1643
  {
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},
1644
+ {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},
1645
+ {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},
1646
+ {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},
1647
+ {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},
1648
+ {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},
1649
+ {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},
1650
+ {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},
1651
+ {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},
1652
+ {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},
1653
+ {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},
1654
+ {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},
1655
+ {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},
1656
+ {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},
1657
+ {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},
1658
+ {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},
1659
+ {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},
1660
+ {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},
1661
+ {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},
1662
+ {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},
1663
+ {32, 40, 48, 56, 64, 96, 0, 8, 24, 32, 8224, 8232, 8240, 8248, 8256, 270400, 1056, 1064, 1072, 1080, 1088, 33856, 80, 80, 80, 80, 80, 96},
1664
+ {32, 40, 48, 56, 64, 96, 0, 8, 24, 32, 8224, 8232, 8240, 8248, 8256, 270400, 1056, 1064, 1072, 1080, 1088, 33856, 80, 80, 80, 80, 80, 96},
1665
+ {32, 40, 48, 56, 64, 96, 0, 8, 24, 32, 8224, 8232, 8240, 8248, 8256, 270400, 1056, 1064, 1072, 1080, 1088, 33856, 80, 80, 80, 80, 80, 160},
1666
+ {32, 40, 48, 56, 64, 96, 0, 8, 24, 32, 8224, 8232, 8240, 8248, 8256, 270400, 1056, 1064, 1072, 1080, 1088, 33856, 80, 80, 80, 80, 80, 160},
1667
+ {32, 40, 48, 56, 64, 96, 16, 8, 24, 32, 8224, 8232, 8240, 8248, 8256, 270400, 1056, 1064, 1072, 1080, 1088, 33856, 80, 88, 96, 96, 96, 1120},
1668
+ {28, 31, 34, 40, 44, 64, 24, 8, 20, 32, 8224, 8227, 8232, 8236, 8256, 270400, 1056, 1059, 1064, 1068, 1088, 33856, 80, 83, 88, 92, 96, 1632},
1669
+ {28, 34, 40, 48, 52, 64, 48, 8, 20, 32, 8224, 8230, 8236, 8240, 8256, 270400, 1056, 1062, 1068, 1072, 1088, 33856, 80, 86, 92, 96, 128, 3200},
1670
+ {28, 29, 30, 32, 36, 64, 8, 8, 20, 32, 8224, 8225, 8228, 8232, 8256, 270400, 1056, 1057, 1060, 1064, 1088, 33856, 80, 81, 84, 88, 96, 608},
1229
1671
  };
1230
1672
 
1231
1673
  // ------------------------------------------------ Basic Lookup -----------------------------------------------------------
@@ -1239,12 +1681,11 @@ PNANOVDB_FORCE_INLINE pnanovdb_gridblindmetadata_handle_t pnanovdb_grid_get_grid
1239
1681
  return meta;
1240
1682
  }
1241
1683
 
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)
1684
+ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_grid_get_gridblindmetadata_value_address(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, pnanovdb_uint32_t index)
1243
1685
  {
1244
1686
  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));
1687
+ pnanovdb_int64_t byte_offset = pnanovdb_gridblindmetadata_get_data_offset(buf, meta);
1688
+ pnanovdb_address_t address = pnanovdb_address_offset64(meta.address, pnanovdb_int64_as_uint64(byte_offset));
1248
1689
  return address;
1249
1690
  }
1250
1691
 
@@ -1319,6 +1760,8 @@ PNANOVDB_FORCE_INLINE pnanovdb_root_tile_handle_t pnanovdb_root_find_tile(pnanov
1319
1760
  return null_handle;
1320
1761
  }
1321
1762
 
1763
+ // ----------------------------- Leaf Node ---------------------------------------
1764
+
1322
1765
  PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_leaf_coord_to_offset(PNANOVDB_IN(pnanovdb_coord_t) ijk)
1323
1766
  {
1324
1767
  return (((PNANOVDB_DEREF(ijk).x & 7) >> 0) << (2 * 3)) +
@@ -1362,6 +1805,8 @@ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_value_address(pnanovd
1362
1805
  return pnanovdb_leaf_get_table_address(grid_type, buf, leaf, n);
1363
1806
  }
1364
1807
 
1808
+ // ----------------------------- Leaf FP Types Specialization ---------------------------------------
1809
+
1365
1810
  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
1811
  {
1367
1812
  // value_log_bits // 2 3 4
@@ -1401,11 +1846,301 @@ PNANOVDB_FORCE_INLINE float pnanovdb_leaf_fpn_read_float(pnanovdb_buf_t buf, pna
1401
1846
  return pnanovdb_leaf_fp_read_float(buf, address, ijk, value_log_bits);
1402
1847
  }
1403
1848
 
1849
+ // ----------------------------- Leaf Index Specialization ---------------------------------------
1850
+
1851
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_index_has_stats(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
1852
+ {
1853
+ return (pnanovdb_leaf_get_bbox_dif_and_flags(buf, leaf) & (1u << 28u)) != 0u;
1854
+ }
1855
+
1856
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_index_get_min_index(pnanovdb_buf_t buf, pnanovdb_address_t min_address)
1857
+ {
1858
+ return pnanovdb_uint64_offset(pnanovdb_read_uint64(buf, min_address), 512u);
1859
+ }
1860
+
1861
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_index_get_max_index(pnanovdb_buf_t buf, pnanovdb_address_t max_address)
1862
+ {
1863
+ return pnanovdb_uint64_offset(pnanovdb_read_uint64(buf, max_address), 513u);
1864
+ }
1865
+
1866
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_index_get_ave_index(pnanovdb_buf_t buf, pnanovdb_address_t ave_address)
1867
+ {
1868
+ return pnanovdb_uint64_offset(pnanovdb_read_uint64(buf, ave_address), 514u);
1869
+ }
1870
+
1871
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_index_get_dev_index(pnanovdb_buf_t buf, pnanovdb_address_t dev_address)
1872
+ {
1873
+ return pnanovdb_uint64_offset(pnanovdb_read_uint64(buf, dev_address), 515u);
1874
+ }
1875
+
1876
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_index_get_value_index(pnanovdb_buf_t buf, pnanovdb_address_t value_address, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1877
+ {
1878
+ pnanovdb_uint32_t n = pnanovdb_leaf_coord_to_offset(ijk);
1879
+ pnanovdb_uint64_t offset = pnanovdb_read_uint64(buf, value_address);
1880
+ return pnanovdb_uint64_offset(offset, n);
1881
+ }
1882
+
1883
+ // ----------------------------- Leaf IndexMask Specialization ---------------------------------------
1884
+
1885
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_indexmask_has_stats(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
1886
+ {
1887
+ return pnanovdb_leaf_index_has_stats(buf, leaf);
1888
+ }
1889
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_indexmask_get_min_index(pnanovdb_buf_t buf, pnanovdb_address_t min_address)
1890
+ {
1891
+ return pnanovdb_leaf_index_get_min_index(buf, min_address);
1892
+ }
1893
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_indexmask_get_max_index(pnanovdb_buf_t buf, pnanovdb_address_t max_address)
1894
+ {
1895
+ return pnanovdb_leaf_index_get_max_index(buf, max_address);
1896
+ }
1897
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_indexmask_get_ave_index(pnanovdb_buf_t buf, pnanovdb_address_t ave_address)
1898
+ {
1899
+ return pnanovdb_leaf_index_get_ave_index(buf, ave_address);
1900
+ }
1901
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_indexmask_get_dev_index(pnanovdb_buf_t buf, pnanovdb_address_t dev_address)
1902
+ {
1903
+ return pnanovdb_leaf_index_get_dev_index(buf, dev_address);
1904
+ }
1905
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_indexmask_get_value_index(pnanovdb_buf_t buf, pnanovdb_address_t value_address, PNANOVDB_IN(pnanovdb_coord_t) ijk)
1906
+ {
1907
+ return pnanovdb_leaf_index_get_value_index(buf, value_address, ijk);
1908
+ }
1909
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_indexmask_get_mask_bit(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, pnanovdb_uint32_t n)
1910
+ {
1911
+ pnanovdb_uint32_t word_idx = n >> 5;
1912
+ pnanovdb_uint32_t bit_idx = n & 31;
1913
+ pnanovdb_uint32_t val_mask =
1914
+ pnanovdb_read_uint32(buf, pnanovdb_address_offset(leaf.address, 96u + 4u * word_idx));
1915
+ return (val_mask & (1u << bit_idx)) != 0u;
1916
+ }
1917
+ PNANOVDB_FORCE_INLINE void pnanovdb_leaf_indexmask_set_mask_bit(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, pnanovdb_uint32_t n, pnanovdb_bool_t v)
1918
+ {
1919
+ pnanovdb_uint32_t word_idx = n >> 5;
1920
+ pnanovdb_uint32_t bit_idx = n & 31;
1921
+ pnanovdb_uint32_t val_mask =
1922
+ pnanovdb_read_uint32(buf, pnanovdb_address_offset(leaf.address, 96u + 4u * word_idx));
1923
+ if (v)
1924
+ {
1925
+ val_mask = val_mask | (1u << bit_idx);
1926
+ }
1927
+ else
1928
+ {
1929
+ val_mask = val_mask & ~(1u << bit_idx);
1930
+ }
1931
+ pnanovdb_write_uint32(buf, pnanovdb_address_offset(leaf.address, 96u + 4u * word_idx), val_mask);
1932
+ }
1933
+
1934
+ // ----------------------------- Leaf OnIndex Specialization ---------------------------------------
1935
+
1936
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_leaf_onindex_get_value_count(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
1937
+ {
1938
+ pnanovdb_uint64_t val_mask = pnanovdb_read_uint64(buf, pnanovdb_address_offset(leaf.address, PNANOVDB_LEAF_OFF_VALUE_MASK + 8u * 7u));
1939
+ pnanovdb_uint64_t prefix_sum = pnanovdb_read_uint64(
1940
+ buf, pnanovdb_address_offset(leaf.address, PNANOVDB_GRID_TYPE_GET(PNANOVDB_GRID_TYPE_ONINDEX, leaf_off_table) + 8u));
1941
+ return pnanovdb_uint64_countbits(val_mask) + (pnanovdb_uint64_to_uint32_lsr(prefix_sum, 54u) & 511u);
1942
+ }
1943
+
1944
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindex_get_last_offset(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
1945
+ {
1946
+ return pnanovdb_uint64_offset(
1947
+ pnanovdb_read_uint64(buf, pnanovdb_address_offset(leaf.address, PNANOVDB_GRID_TYPE_GET(PNANOVDB_GRID_TYPE_ONINDEX, leaf_off_table))),
1948
+ pnanovdb_leaf_onindex_get_value_count(buf, leaf) - 1u);
1949
+ }
1950
+
1951
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_onindex_has_stats(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
1952
+ {
1953
+ return (pnanovdb_leaf_get_bbox_dif_and_flags(buf, leaf) & (1u << 28u)) != 0u;
1954
+ }
1955
+
1956
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindex_get_min_index(pnanovdb_buf_t buf, pnanovdb_address_t min_address)
1957
+ {
1958
+ pnanovdb_leaf_handle_t leaf = { pnanovdb_address_offset_neg(min_address, PNANOVDB_GRID_TYPE_GET(PNANOVDB_GRID_TYPE_ONINDEX, leaf_off_table)) };
1959
+ pnanovdb_uint64_t idx = pnanovdb_uint32_as_uint64_low(0u);
1960
+ if (pnanovdb_leaf_onindex_has_stats(buf, leaf))
1961
+ {
1962
+ idx = pnanovdb_uint64_offset(pnanovdb_leaf_onindex_get_last_offset(buf, leaf), 1u);
1963
+ }
1964
+ return idx;
1965
+ }
1966
+
1967
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindex_get_max_index(pnanovdb_buf_t buf, pnanovdb_address_t max_address)
1968
+ {
1969
+ pnanovdb_leaf_handle_t leaf = { pnanovdb_address_offset_neg(max_address, PNANOVDB_GRID_TYPE_GET(PNANOVDB_GRID_TYPE_ONINDEX, leaf_off_table)) };
1970
+ pnanovdb_uint64_t idx = pnanovdb_uint32_as_uint64_low(0u);
1971
+ if (pnanovdb_leaf_onindex_has_stats(buf, leaf))
1972
+ {
1973
+ idx = pnanovdb_uint64_offset(pnanovdb_leaf_onindex_get_last_offset(buf, leaf), 2u);
1974
+ }
1975
+ return idx;
1976
+ }
1977
+
1978
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindex_get_ave_index(pnanovdb_buf_t buf, pnanovdb_address_t ave_address)
1979
+ {
1980
+ pnanovdb_leaf_handle_t leaf = { pnanovdb_address_offset_neg(ave_address, PNANOVDB_GRID_TYPE_GET(PNANOVDB_GRID_TYPE_ONINDEX, leaf_off_table)) };
1981
+ pnanovdb_uint64_t idx = pnanovdb_uint32_as_uint64_low(0u);
1982
+ if (pnanovdb_leaf_onindex_has_stats(buf, leaf))
1983
+ {
1984
+ idx = pnanovdb_uint64_offset(pnanovdb_leaf_onindex_get_last_offset(buf, leaf), 3u);
1985
+ }
1986
+ return idx;
1987
+ }
1988
+
1989
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindex_get_dev_index(pnanovdb_buf_t buf, pnanovdb_address_t dev_address)
1990
+ {
1991
+ pnanovdb_leaf_handle_t leaf = { pnanovdb_address_offset_neg(dev_address, PNANOVDB_GRID_TYPE_GET(PNANOVDB_GRID_TYPE_ONINDEX, leaf_off_table)) };
1992
+ pnanovdb_uint64_t idx = pnanovdb_uint32_as_uint64_low(0u);
1993
+ if (pnanovdb_leaf_onindex_has_stats(buf, leaf))
1994
+ {
1995
+ idx = pnanovdb_uint64_offset(pnanovdb_leaf_onindex_get_last_offset(buf, leaf), 4u);
1996
+ }
1997
+ return idx;
1998
+ }
1999
+
2000
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindex_get_value_index(pnanovdb_buf_t buf, pnanovdb_address_t value_address, PNANOVDB_IN(pnanovdb_coord_t) ijk)
2001
+ {
2002
+ pnanovdb_uint32_t n = pnanovdb_leaf_coord_to_offset(ijk);
2003
+ pnanovdb_leaf_handle_t leaf = { pnanovdb_address_offset_neg(value_address, PNANOVDB_GRID_TYPE_GET(PNANOVDB_GRID_TYPE_ONINDEX, leaf_off_table)) };
2004
+
2005
+ pnanovdb_uint32_t word_idx = n >> 6u;
2006
+ pnanovdb_uint32_t bit_idx = n & 63u;
2007
+ pnanovdb_uint64_t val_mask = pnanovdb_read_uint64(buf, pnanovdb_address_offset(leaf.address, PNANOVDB_LEAF_OFF_VALUE_MASK + 8u * word_idx));
2008
+ pnanovdb_uint64_t mask = pnanovdb_uint64_bit_mask(bit_idx);
2009
+ pnanovdb_uint64_t value_index = pnanovdb_uint32_as_uint64_low(0u);
2010
+ if (pnanovdb_uint64_any_bit(pnanovdb_uint64_and(val_mask, mask)))
2011
+ {
2012
+ pnanovdb_uint32_t sum = 0u;
2013
+ sum += pnanovdb_uint64_countbits(pnanovdb_uint64_and(val_mask, pnanovdb_uint64_dec(mask)));
2014
+ if (word_idx > 0u)
2015
+ {
2016
+ pnanovdb_uint64_t prefix_sum = pnanovdb_read_uint64(buf, pnanovdb_address_offset(value_address, 8u));
2017
+ sum += pnanovdb_uint64_to_uint32_lsr(prefix_sum, 9u * (word_idx - 1u)) & 511u;
2018
+ }
2019
+ pnanovdb_uint64_t offset = pnanovdb_read_uint64(buf, value_address);
2020
+ value_index = pnanovdb_uint64_offset(offset, sum);
2021
+ }
2022
+ return value_index;
2023
+ }
2024
+
2025
+ // ----------------------------- Leaf OnIndexMask Specialization ---------------------------------------
2026
+
2027
+ PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_leaf_onindexmask_get_value_count(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
2028
+ {
2029
+ return pnanovdb_leaf_onindex_get_value_count(buf, leaf);
2030
+ }
2031
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindexmask_get_last_offset(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
2032
+ {
2033
+ return pnanovdb_leaf_onindex_get_last_offset(buf, leaf);
2034
+ }
2035
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_onindexmask_has_stats(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
2036
+ {
2037
+ return pnanovdb_leaf_onindex_has_stats(buf, leaf);
2038
+ }
2039
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindexmask_get_min_index(pnanovdb_buf_t buf, pnanovdb_address_t min_address)
2040
+ {
2041
+ return pnanovdb_leaf_onindex_get_min_index(buf, min_address);
2042
+ }
2043
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindexmask_get_max_index(pnanovdb_buf_t buf, pnanovdb_address_t max_address)
2044
+ {
2045
+ return pnanovdb_leaf_onindex_get_max_index(buf, max_address);
2046
+ }
2047
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindexmask_get_ave_index(pnanovdb_buf_t buf, pnanovdb_address_t ave_address)
2048
+ {
2049
+ return pnanovdb_leaf_onindex_get_ave_index(buf, ave_address);
2050
+ }
2051
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindexmask_get_dev_index(pnanovdb_buf_t buf, pnanovdb_address_t dev_address)
2052
+ {
2053
+ return pnanovdb_leaf_onindex_get_dev_index(buf, dev_address);
2054
+ }
2055
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindexmask_get_value_index(pnanovdb_buf_t buf, pnanovdb_address_t value_address, PNANOVDB_IN(pnanovdb_coord_t) ijk)
2056
+ {
2057
+ return pnanovdb_leaf_onindex_get_value_index(buf, value_address, ijk);
2058
+ }
2059
+ PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_onindexmask_get_mask_bit(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, pnanovdb_uint32_t n)
2060
+ {
2061
+ pnanovdb_uint32_t word_idx = n >> 5;
2062
+ pnanovdb_uint32_t bit_idx = n & 31;
2063
+ pnanovdb_uint32_t val_mask =
2064
+ pnanovdb_read_uint32(buf, pnanovdb_address_offset(leaf.address, 96u + 4u * word_idx));
2065
+ return (val_mask & (1u << bit_idx)) != 0u;
2066
+ }
2067
+ PNANOVDB_FORCE_INLINE void pnanovdb_leaf_onindexmask_set_mask_bit(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, pnanovdb_uint32_t n, pnanovdb_bool_t v)
2068
+ {
2069
+ pnanovdb_uint32_t word_idx = n >> 5;
2070
+ pnanovdb_uint32_t bit_idx = n & 31;
2071
+ pnanovdb_uint32_t val_mask =
2072
+ pnanovdb_read_uint32(buf, pnanovdb_address_offset(leaf.address, 96u + 4u * word_idx));
2073
+ if (v)
2074
+ {
2075
+ val_mask = val_mask | (1u << bit_idx);
2076
+ }
2077
+ else
2078
+ {
2079
+ val_mask = val_mask & ~(1u << bit_idx);
2080
+ }
2081
+ pnanovdb_write_uint32(buf, pnanovdb_address_offset(leaf.address, 96u + 4u * word_idx), val_mask);
2082
+ }
2083
+
2084
+ // ----------------------------- Leaf PointIndex Specialization ---------------------------------------
2085
+
2086
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_pointindex_get_offset(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
2087
+ {
2088
+ return pnanovdb_read_uint64(buf, pnanovdb_leaf_get_min_address(PNANOVDB_GRID_TYPE_POINTINDEX, buf, leaf));
2089
+ }
2090
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_pointindex_get_point_count(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
2091
+ {
2092
+ return pnanovdb_read_uint64(buf, pnanovdb_leaf_get_max_address(PNANOVDB_GRID_TYPE_POINTINDEX, buf, leaf));
2093
+ }
2094
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_pointindex_get_first(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, pnanovdb_uint32_t i)
2095
+ {
2096
+ return pnanovdb_uint64_offset(pnanovdb_leaf_pointindex_get_offset(buf, leaf),
2097
+ (i == 0u ? 0u : pnanovdb_read_uint16(buf, pnanovdb_leaf_get_table_address(PNANOVDB_GRID_TYPE_POINTINDEX, buf, leaf, i - 1u))));
2098
+ }
2099
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_pointindex_get_last(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, pnanovdb_uint32_t i)
2100
+ {
2101
+ return pnanovdb_uint64_offset(pnanovdb_leaf_pointindex_get_offset(buf, leaf),
2102
+ pnanovdb_read_uint16(buf, pnanovdb_leaf_get_table_address(PNANOVDB_GRID_TYPE_POINTINDEX, buf, leaf, i)));
2103
+ }
2104
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_pointindex_get_value(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, pnanovdb_uint32_t i)
2105
+ {
2106
+ return pnanovdb_uint32_as_uint64_low(pnanovdb_read_uint16(buf, pnanovdb_leaf_get_table_address(PNANOVDB_GRID_TYPE_POINTINDEX, buf, leaf, i)));
2107
+ }
2108
+ PNANOVDB_FORCE_INLINE void pnanovdb_leaf_pointindex_set_value_only(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, pnanovdb_uint32_t i, pnanovdb_uint32_t value)
2109
+ {
2110
+ pnanovdb_address_t addr = pnanovdb_leaf_get_table_address(PNANOVDB_GRID_TYPE_POINTINDEX, buf, leaf, i);
2111
+ pnanovdb_uint32_t raw32 = pnanovdb_read_uint32(buf, pnanovdb_address_mask_inv(addr, 3u));
2112
+ if ((i & 1) == 0u)
2113
+ {
2114
+ raw32 = (raw32 & 0xFFFF0000) | (value & 0x0000FFFF);
2115
+ }
2116
+ else
2117
+ {
2118
+ raw32 = (raw32 & 0x0000FFFF) | (value << 16u);
2119
+ }
2120
+ pnanovdb_write_uint32(buf, addr, raw32);
2121
+ }
2122
+ PNANOVDB_FORCE_INLINE void pnanovdb_leaf_pointindex_set_on(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, pnanovdb_uint32_t i)
2123
+ {
2124
+ pnanovdb_uint32_t word_idx = i >> 5;
2125
+ pnanovdb_uint32_t bit_idx = i & 31;
2126
+ pnanovdb_address_t addr = pnanovdb_address_offset(leaf.address, PNANOVDB_LEAF_OFF_VALUE_MASK + 4u * word_idx);
2127
+ pnanovdb_uint32_t val_mask = pnanovdb_read_uint32(buf, addr);
2128
+ val_mask = val_mask | (1u << bit_idx);
2129
+ pnanovdb_write_uint32(buf, addr, val_mask);
2130
+ }
2131
+ PNANOVDB_FORCE_INLINE void pnanovdb_leaf_pointindex_set_value(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, pnanovdb_uint32_t i, pnanovdb_uint32_t value)
2132
+ {
2133
+ pnanovdb_leaf_pointindex_set_on(buf, leaf, i);
2134
+ pnanovdb_leaf_pointindex_set_value_only(buf, leaf, i, value);
2135
+ }
2136
+
2137
+ // ------------------------------------------------ Lower Node -----------------------------------------------------------
2138
+
1404
2139
  PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_lower_coord_to_offset(PNANOVDB_IN(pnanovdb_coord_t) ijk)
1405
2140
  {
1406
2141
  return (((PNANOVDB_DEREF(ijk).x & 127) >> 3) << (2 * 4)) +
1407
- (((PNANOVDB_DEREF(ijk).y & 127) >> 3) << (4)) +
1408
- ((PNANOVDB_DEREF(ijk).z & 127) >> 3);
2142
+ (((PNANOVDB_DEREF(ijk).y & 127) >> 3) << (4)) +
2143
+ ((PNANOVDB_DEREF(ijk).z & 127) >> 3);
1409
2144
  }
1410
2145
 
1411
2146
  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)
@@ -1475,11 +2210,13 @@ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_value_address(pnanov
1475
2210
  return pnanovdb_lower_get_value_address_and_level(grid_type, buf, lower, ijk, PNANOVDB_REF(level));
1476
2211
  }
1477
2212
 
2213
+ // ------------------------------------------------ Upper Node -----------------------------------------------------------
2214
+
1478
2215
  PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_upper_coord_to_offset(PNANOVDB_IN(pnanovdb_coord_t) ijk)
1479
2216
  {
1480
2217
  return (((PNANOVDB_DEREF(ijk).x & 4095) >> 7) << (2 * 5)) +
1481
- (((PNANOVDB_DEREF(ijk).y & 4095) >> 7) << (5)) +
1482
- ((PNANOVDB_DEREF(ijk).z & 4095) >> 7);
2218
+ (((PNANOVDB_DEREF(ijk).y & 4095) >> 7) << (5)) +
2219
+ ((PNANOVDB_DEREF(ijk).z & 4095) >> 7);
1483
2220
  }
1484
2221
 
1485
2222
  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)
@@ -1548,6 +2285,14 @@ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_value_address(pnanov
1548
2285
  return pnanovdb_upper_get_value_address_and_level(grid_type, buf, upper, ijk, PNANOVDB_REF(level));
1549
2286
  }
1550
2287
 
2288
+ PNANOVDB_FORCE_INLINE void pnanovdb_upper_set_table_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t node, pnanovdb_uint32_t n, pnanovdb_int64_t child)
2289
+ {
2290
+ pnanovdb_address_t bufAddress = pnanovdb_upper_get_table_address(grid_type, buf, node, n);
2291
+ pnanovdb_write_int64(buf, bufAddress, child);
2292
+ }
2293
+
2294
+ // ------------------------------------------------ Root -----------------------------------------------------------
2295
+
1551
2296
  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
2297
  {
1553
2298
  pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, root_off_min);
@@ -1670,6 +2415,92 @@ PNANOVDB_FORCE_INLINE float pnanovdb_root_fpn_read_float(pnanovdb_buf_t buf, pna
1670
2415
  return ret;
1671
2416
  }
1672
2417
 
2418
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_root_index_get_value_index(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk, pnanovdb_uint32_t level)
2419
+ {
2420
+ pnanovdb_uint64_t ret;
2421
+ if (level == 0)
2422
+ {
2423
+ ret = pnanovdb_leaf_index_get_value_index(buf, address, ijk);
2424
+ }
2425
+ else
2426
+ {
2427
+ ret = pnanovdb_read_uint64(buf, address);
2428
+ }
2429
+ return ret;
2430
+ }
2431
+
2432
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_root_onindex_get_value_index(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk, pnanovdb_uint32_t level)
2433
+ {
2434
+ pnanovdb_uint64_t ret;
2435
+ if (level == 0)
2436
+ {
2437
+ ret = pnanovdb_leaf_onindex_get_value_index(buf, address, ijk);
2438
+ }
2439
+ else
2440
+ {
2441
+ ret = pnanovdb_read_uint64(buf, address);
2442
+ }
2443
+ return ret;
2444
+ }
2445
+
2446
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_root_pointindex_get_point_range(
2447
+ pnanovdb_buf_t buf,
2448
+ pnanovdb_address_t value_address,
2449
+ PNANOVDB_IN(pnanovdb_coord_t) ijk,
2450
+ pnanovdb_uint32_t level,
2451
+ PNANOVDB_INOUT(pnanovdb_uint64_t)range_begin,
2452
+ PNANOVDB_INOUT(pnanovdb_uint64_t)range_end
2453
+ )
2454
+ {
2455
+ pnanovdb_uint32_t local_range_begin = 0u;
2456
+ pnanovdb_uint32_t local_range_end = 0u;
2457
+ pnanovdb_uint64_t offset = pnanovdb_uint32_as_uint64_low(0u);
2458
+ if (level == 0)
2459
+ {
2460
+ pnanovdb_uint32_t n = pnanovdb_leaf_coord_to_offset(ijk);
2461
+ // recover leaf address
2462
+ pnanovdb_leaf_handle_t leaf = { pnanovdb_address_offset_neg(value_address, PNANOVDB_GRID_TYPE_GET(PNANOVDB_GRID_TYPE_POINTINDEX, leaf_off_table) + 2u * n) };
2463
+ if (n > 0u)
2464
+ {
2465
+ local_range_begin = pnanovdb_read_uint16(buf, pnanovdb_address_offset_neg(value_address, 2u));
2466
+ }
2467
+ local_range_end = pnanovdb_read_uint16(buf, value_address);
2468
+ offset = pnanovdb_leaf_pointindex_get_offset(buf, leaf);
2469
+ }
2470
+ PNANOVDB_DEREF(range_begin) = pnanovdb_uint64_offset(offset, local_range_begin);
2471
+ PNANOVDB_DEREF(range_end) = pnanovdb_uint64_offset(offset, local_range_end);
2472
+ return pnanovdb_uint32_as_uint64_low(local_range_end - local_range_begin);
2473
+ }
2474
+
2475
+ PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_root_pointindex_get_point_address_range(
2476
+ pnanovdb_buf_t buf,
2477
+ pnanovdb_grid_type_t value_type,
2478
+ pnanovdb_address_t value_address,
2479
+ pnanovdb_address_t blindmetadata_value_address,
2480
+ PNANOVDB_IN(pnanovdb_coord_t) ijk,
2481
+ pnanovdb_uint32_t level,
2482
+ PNANOVDB_INOUT(pnanovdb_address_t)address_begin,
2483
+ PNANOVDB_INOUT(pnanovdb_address_t)address_end
2484
+ )
2485
+ {
2486
+ pnanovdb_uint64_t range_begin;
2487
+ pnanovdb_uint64_t range_end;
2488
+ pnanovdb_uint64_t range_size = pnanovdb_root_pointindex_get_point_range(buf, value_address, ijk, level, PNANOVDB_REF(range_begin), PNANOVDB_REF(range_end));
2489
+
2490
+ pnanovdb_uint32_t stride = 12u; // vec3f
2491
+ if (value_type == PNANOVDB_GRID_TYPE_VEC3U8)
2492
+ {
2493
+ stride = 3u;
2494
+ }
2495
+ else if (value_type == PNANOVDB_GRID_TYPE_VEC3U16)
2496
+ {
2497
+ stride = 6u;
2498
+ }
2499
+ PNANOVDB_DEREF(address_begin) = pnanovdb_address_offset64_product(blindmetadata_value_address, range_begin, stride);
2500
+ PNANOVDB_DEREF(address_end) = pnanovdb_address_offset64_product(blindmetadata_value_address, range_end, stride);
2501
+ return range_size;
2502
+ }
2503
+
1673
2504
  // ------------------------------------------------ ReadAccessor -----------------------------------------------------------
1674
2505
 
1675
2506
  struct pnanovdb_readaccessor_t
@@ -1760,6 +2591,12 @@ PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_value_address_and_ca
1760
2591
  return pnanovdb_lower_get_value_address_and_level_and_cache(grid_type, buf, lower, ijk, acc, PNANOVDB_REF(level));
1761
2592
  }
1762
2593
 
2594
+ PNANOVDB_FORCE_INLINE void pnanovdb_lower_set_table_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node, pnanovdb_uint32_t n, pnanovdb_int64_t child)
2595
+ {
2596
+ pnanovdb_address_t table_address = pnanovdb_lower_get_table_address(grid_type, buf, node, n);
2597
+ pnanovdb_write_int64(buf, table_address, child);
2598
+ }
2599
+
1763
2600
  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
2601
  {
1765
2602
  pnanovdb_uint32_t n = pnanovdb_upper_coord_to_offset(ijk);