warp-lang 1.1.0__py3-none-macosx_10_13_universal2.whl → 1.2.0__py3-none-macosx_10_13_universal2.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of warp-lang might be problematic. Click here for more details.
- warp/bin/libwarp-clang.dylib +0 -0
- warp/bin/libwarp.dylib +0 -0
- warp/build.py +10 -37
- warp/build_dll.py +2 -2
- warp/builtins.py +274 -6
- warp/codegen.py +51 -4
- warp/config.py +2 -2
- warp/constants.py +4 -0
- warp/context.py +418 -203
- warp/examples/benchmarks/benchmark_api.py +0 -2
- warp/examples/benchmarks/benchmark_cloth_warp.py +0 -1
- warp/examples/benchmarks/benchmark_launches.py +0 -2
- warp/examples/core/example_dem.py +0 -2
- warp/examples/core/example_fluid.py +0 -2
- warp/examples/core/example_graph_capture.py +0 -2
- warp/examples/core/example_marching_cubes.py +0 -2
- warp/examples/core/example_mesh.py +0 -2
- warp/examples/core/example_mesh_intersect.py +0 -2
- warp/examples/core/example_nvdb.py +0 -2
- warp/examples/core/example_raycast.py +0 -2
- warp/examples/core/example_raymarch.py +0 -2
- warp/examples/core/example_render_opengl.py +0 -2
- warp/examples/core/example_sph.py +0 -2
- warp/examples/core/example_torch.py +0 -3
- warp/examples/core/example_wave.py +0 -2
- warp/examples/fem/example_apic_fluid.py +140 -115
- warp/examples/fem/example_burgers.py +262 -0
- warp/examples/fem/example_convection_diffusion.py +0 -2
- warp/examples/fem/example_convection_diffusion_dg.py +0 -2
- warp/examples/fem/example_deformed_geometry.py +0 -2
- warp/examples/fem/example_diffusion.py +0 -2
- warp/examples/fem/example_diffusion_3d.py +5 -4
- warp/examples/fem/example_diffusion_mgpu.py +0 -2
- warp/examples/fem/example_mixed_elasticity.py +0 -2
- warp/examples/fem/example_navier_stokes.py +0 -2
- warp/examples/fem/example_stokes.py +0 -2
- warp/examples/fem/example_stokes_transfer.py +0 -2
- warp/examples/optim/example_bounce.py +0 -2
- warp/examples/optim/example_cloth_throw.py +0 -2
- warp/examples/optim/example_diffray.py +0 -2
- warp/examples/optim/example_drone.py +0 -2
- warp/examples/optim/example_inverse_kinematics.py +0 -2
- warp/examples/optim/example_inverse_kinematics_torch.py +0 -2
- warp/examples/optim/example_spring_cage.py +0 -2
- warp/examples/optim/example_trajectory.py +0 -2
- warp/examples/optim/example_walker.py +0 -2
- warp/examples/sim/example_cartpole.py +0 -2
- warp/examples/sim/example_cloth.py +0 -2
- warp/examples/sim/example_granular.py +0 -2
- warp/examples/sim/example_granular_collision_sdf.py +0 -2
- warp/examples/sim/example_jacobian_ik.py +0 -2
- warp/examples/sim/example_particle_chain.py +0 -2
- warp/examples/sim/example_quadruped.py +0 -2
- warp/examples/sim/example_rigid_chain.py +0 -2
- warp/examples/sim/example_rigid_contact.py +0 -2
- warp/examples/sim/example_rigid_force.py +0 -2
- warp/examples/sim/example_rigid_gyroscopic.py +0 -2
- warp/examples/sim/example_rigid_soft_contact.py +0 -2
- warp/examples/sim/example_soft_body.py +0 -2
- warp/fem/__init__.py +1 -0
- warp/fem/cache.py +3 -1
- warp/fem/geometry/__init__.py +1 -0
- warp/fem/geometry/element.py +4 -0
- warp/fem/geometry/grid_3d.py +0 -4
- warp/fem/geometry/nanogrid.py +455 -0
- warp/fem/integrate.py +63 -9
- warp/fem/space/__init__.py +43 -158
- warp/fem/space/basis_space.py +34 -0
- warp/fem/space/collocated_function_space.py +1 -1
- warp/fem/space/grid_2d_function_space.py +13 -132
- warp/fem/space/grid_3d_function_space.py +16 -154
- warp/fem/space/hexmesh_function_space.py +37 -134
- warp/fem/space/nanogrid_function_space.py +202 -0
- warp/fem/space/quadmesh_2d_function_space.py +12 -119
- warp/fem/space/restriction.py +4 -1
- warp/fem/space/shape/__init__.py +77 -0
- warp/fem/space/shape/cube_shape_function.py +5 -15
- warp/fem/space/tetmesh_function_space.py +6 -76
- warp/fem/space/trimesh_2d_function_space.py +6 -76
- warp/native/array.h +12 -3
- warp/native/builtin.h +48 -5
- warp/native/bvh.cpp +14 -10
- warp/native/bvh.cu +23 -15
- warp/native/bvh.h +1 -0
- warp/native/clang/clang.cpp +2 -1
- warp/native/crt.cpp +11 -1
- warp/native/crt.h +18 -1
- warp/native/exports.h +187 -0
- warp/native/mat.h +47 -0
- warp/native/mesh.cpp +1 -1
- warp/native/mesh.cu +1 -2
- warp/native/nanovdb/GridHandle.h +366 -0
- warp/native/nanovdb/HostBuffer.h +590 -0
- warp/native/nanovdb/NanoVDB.h +3999 -2157
- warp/native/nanovdb/PNanoVDB.h +936 -99
- warp/native/quat.h +28 -1
- warp/native/rand.h +5 -1
- warp/native/vec.h +45 -1
- warp/native/volume.cpp +335 -103
- warp/native/volume.cu +39 -13
- warp/native/volume.h +725 -303
- warp/native/volume_builder.cu +381 -360
- warp/native/volume_builder.h +16 -1
- warp/native/volume_impl.h +61 -0
- warp/native/warp.cu +8 -2
- warp/native/warp.h +15 -7
- warp/render/render_opengl.py +191 -52
- warp/sim/integrator_featherstone.py +10 -3
- warp/sim/integrator_xpbd.py +16 -22
- warp/sparse.py +89 -27
- warp/stubs.py +83 -0
- warp/tests/assets/test_index_grid.nvdb +0 -0
- warp/tests/aux_test_dependent.py +0 -2
- warp/tests/aux_test_grad_customs.py +0 -2
- warp/tests/aux_test_reference.py +0 -2
- warp/tests/aux_test_reference_reference.py +0 -2
- warp/tests/aux_test_square.py +0 -2
- warp/tests/disabled_kinematics.py +0 -2
- warp/tests/test_adam.py +0 -2
- warp/tests/test_arithmetic.py +0 -36
- warp/tests/test_array.py +9 -11
- warp/tests/test_array_reduce.py +0 -2
- warp/tests/test_async.py +0 -2
- warp/tests/test_atomic.py +0 -2
- warp/tests/test_bool.py +58 -50
- warp/tests/test_builtins_resolution.py +0 -2
- warp/tests/test_bvh.py +0 -2
- warp/tests/test_closest_point_edge_edge.py +0 -1
- warp/tests/test_codegen.py +0 -4
- warp/tests/test_compile_consts.py +130 -10
- warp/tests/test_conditional.py +0 -2
- warp/tests/test_copy.py +0 -2
- warp/tests/test_ctypes.py +6 -8
- warp/tests/test_dense.py +0 -2
- warp/tests/test_devices.py +0 -2
- warp/tests/test_dlpack.py +9 -11
- warp/tests/test_examples.py +42 -39
- warp/tests/test_fabricarray.py +0 -3
- warp/tests/test_fast_math.py +0 -2
- warp/tests/test_fem.py +75 -54
- warp/tests/test_fp16.py +0 -2
- warp/tests/test_func.py +0 -2
- warp/tests/test_generics.py +27 -2
- warp/tests/test_grad.py +147 -8
- warp/tests/test_grad_customs.py +0 -2
- warp/tests/test_hash_grid.py +1 -3
- warp/tests/test_import.py +0 -2
- warp/tests/test_indexedarray.py +0 -2
- warp/tests/test_intersect.py +0 -2
- warp/tests/test_jax.py +0 -2
- warp/tests/test_large.py +11 -9
- warp/tests/test_launch.py +0 -2
- warp/tests/test_lerp.py +10 -54
- warp/tests/test_linear_solvers.py +3 -5
- warp/tests/test_lvalue.py +0 -2
- warp/tests/test_marching_cubes.py +0 -2
- warp/tests/test_mat.py +0 -2
- warp/tests/test_mat_lite.py +0 -2
- warp/tests/test_mat_scalar_ops.py +0 -2
- warp/tests/test_math.py +0 -2
- warp/tests/test_matmul.py +35 -37
- warp/tests/test_matmul_lite.py +29 -31
- warp/tests/test_mempool.py +0 -2
- warp/tests/test_mesh.py +0 -3
- warp/tests/test_mesh_query_aabb.py +0 -2
- warp/tests/test_mesh_query_point.py +0 -2
- warp/tests/test_mesh_query_ray.py +0 -2
- warp/tests/test_mlp.py +0 -2
- warp/tests/test_model.py +0 -2
- warp/tests/test_module_hashing.py +111 -0
- warp/tests/test_modules_lite.py +0 -3
- warp/tests/test_multigpu.py +0 -2
- warp/tests/test_noise.py +0 -4
- warp/tests/test_operators.py +0 -2
- warp/tests/test_options.py +0 -2
- warp/tests/test_peer.py +0 -2
- warp/tests/test_pinned.py +0 -2
- warp/tests/test_print.py +0 -2
- warp/tests/test_quat.py +0 -2
- warp/tests/test_rand.py +41 -5
- warp/tests/test_reload.py +0 -10
- warp/tests/test_rounding.py +0 -2
- warp/tests/test_runlength_encode.py +0 -2
- warp/tests/test_sim_grad.py +0 -2
- warp/tests/test_sim_kinematics.py +0 -2
- warp/tests/test_smoothstep.py +0 -2
- warp/tests/test_snippet.py +0 -2
- warp/tests/test_sparse.py +0 -2
- warp/tests/test_spatial.py +0 -2
- warp/tests/test_special_values.py +362 -0
- warp/tests/test_streams.py +0 -2
- warp/tests/test_struct.py +0 -2
- warp/tests/test_tape.py +0 -2
- warp/tests/test_torch.py +0 -2
- warp/tests/test_transient_module.py +0 -2
- warp/tests/test_types.py +0 -2
- warp/tests/test_utils.py +0 -2
- warp/tests/test_vec.py +0 -2
- warp/tests/test_vec_lite.py +0 -2
- warp/tests/test_vec_scalar_ops.py +0 -2
- warp/tests/test_verify_fp.py +0 -2
- warp/tests/test_volume.py +237 -13
- warp/tests/test_volume_write.py +86 -3
- warp/tests/unittest_serial.py +10 -9
- warp/tests/unittest_suites.py +6 -2
- warp/tests/unittest_utils.py +2 -171
- warp/tests/unused_test_misc.py +0 -2
- warp/tests/walkthrough_debug.py +1 -1
- warp/thirdparty/unittest_parallel.py +37 -40
- warp/types.py +514 -77
- {warp_lang-1.1.0.dist-info → warp_lang-1.2.0.dist-info}/METADATA +57 -30
- warp_lang-1.2.0.dist-info/RECORD +359 -0
- warp/examples/fem/example_convection_diffusion_dg0.py +0 -204
- warp/native/nanovdb/PNanoVDBWrite.h +0 -295
- warp_lang-1.1.0.dist-info/RECORD +0 -352
- {warp_lang-1.1.0.dist-info → warp_lang-1.2.0.dist-info}/LICENSE.md +0 -0
- {warp_lang-1.1.0.dist-info → warp_lang-1.2.0.dist-info}/WHEEL +0 -0
- {warp_lang-1.1.0.dist-info → warp_lang-1.2.0.dist-info}/top_level.txt +0 -0
warp/native/nanovdb/PNanoVDB.h
CHANGED
|
@@ -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
|
-
|
|
76
|
-
#
|
|
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__
|
|
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__
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
647
|
-
ret.
|
|
648
|
-
ret.
|
|
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
|
|
686
|
-
#define PNANOVDB_PATCH_VERSION_NUMBER
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
PNANOVDB_STATIC_CONST pnanovdb_uint32_t
|
|
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
|
|
894
|
-
pnanovdb_uint64_t
|
|
895
|
-
pnanovdb_uint32_t
|
|
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
|
|
908
|
-
#define
|
|
909
|
-
#define
|
|
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
|
|
916
|
-
return pnanovdb_read_int64(buf, pnanovdb_address_offset(p.address,
|
|
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
|
|
919
|
-
return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address,
|
|
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
|
|
922
|
-
return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address,
|
|
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
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
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
|
|
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 =
|
|
1246
|
-
pnanovdb_address_t 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
|
-
|
|
1408
|
-
|
|
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
|
-
|
|
1482
|
-
|
|
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);
|