OpenVDB 13.0.1
Loading...
Searching...
No Matches
PNanoVDB.h
Go to the documentation of this file.
1
2// Copyright Contributors to the OpenVDB Project
3// SPDX-License-Identifier: Apache-2.0
4
5/*!
6 \file nanovdb/PNanoVDB.h
7
8 \author Andrew Reidmeyer
9
10 \brief This file is a portable (e.g. pointer-less) C99/GLSL/HLSL port
11 of NanoVDB.h, which is compatible with most graphics APIs.
12*/
13
14#ifndef NANOVDB_PNANOVDB_H_HAS_BEEN_INCLUDED
15#define NANOVDB_PNANOVDB_H_HAS_BEEN_INCLUDED
16
17// ------------------------------------------------ Configuration -----------------------------------------------------------
18
19// platforms
20//#define PNANOVDB_C
21//#define PNANOVDB_HLSL
22//#define PNANOVDB_GLSL
23
24// addressing mode
25// PNANOVDB_ADDRESS_32
26// PNANOVDB_ADDRESS_64
27#if defined(PNANOVDB_C)
28#ifndef PNANOVDB_ADDRESS_32
29#define PNANOVDB_ADDRESS_64
30#endif
31#elif defined(PNANOVDB_HLSL)
32#ifndef PNANOVDB_ADDRESS_64
33#define PNANOVDB_ADDRESS_32
34#endif
35#elif defined(PNANOVDB_GLSL)
36#ifndef PNANOVDB_ADDRESS_64
37#define PNANOVDB_ADDRESS_32
38#endif
39#endif
40
41// bounds checking
42//#define PNANOVDB_BUF_BOUNDS_CHECK
43
44// enable HDDA by default on HLSL/GLSL, make explicit on C
45#if defined(PNANOVDB_C)
46//#define PNANOVDB_HDDA
47#ifdef PNANOVDB_HDDA
48#ifndef PNANOVDB_CMATH
49#define PNANOVDB_CMATH
50#endif
51#endif
52#elif defined(PNANOVDB_HLSL)
53#define PNANOVDB_HDDA
54#elif defined(PNANOVDB_GLSL)
55#define PNANOVDB_HDDA
56#endif
57
58#ifdef PNANOVDB_CMATH
59#ifndef __CUDACC_RTC__
60#include <math.h>
61#endif
62#endif
63
64// ------------------------------------------------ Buffer -----------------------------------------------------------
65
66#if defined(PNANOVDB_BUF_CUSTOM)
67// NOP
68#elif defined(PNANOVDB_C)
69#define PNANOVDB_BUF_C
70#elif defined(PNANOVDB_HLSL)
71#define PNANOVDB_BUF_HLSL
72#elif defined(PNANOVDB_GLSL)
73#define PNANOVDB_BUF_GLSL
74#endif
75
76#if defined(PNANOVDB_BUF_C)
77#ifndef __CUDACC_RTC__
78#include <stdint.h>
79#endif
80#if defined(__CUDACC__)
81#define PNANOVDB_BUF_FORCE_INLINE static __host__ __device__ __forceinline__
82#elif defined(_WIN32)
83#define PNANOVDB_BUF_FORCE_INLINE static inline __forceinline
84#else
85#define PNANOVDB_BUF_FORCE_INLINE static inline __attribute__((always_inline))
86#endif
87typedef struct pnanovdb_buf_t
88{
89 uint32_t* data;
90#ifdef PNANOVDB_BUF_BOUNDS_CHECK
91 uint64_t size_in_words;
92#endif
93}pnanovdb_buf_t;
94PNANOVDB_BUF_FORCE_INLINE pnanovdb_buf_t pnanovdb_make_buf(uint32_t* data, uint64_t size_in_words)
95{
96 pnanovdb_buf_t ret;
97 ret.data = data;
98#ifdef PNANOVDB_BUF_BOUNDS_CHECK
99 ret.size_in_words = size_in_words;
100#endif
101 return ret;
102}
103#if defined(PNANOVDB_ADDRESS_32)
104PNANOVDB_BUF_FORCE_INLINE uint32_t pnanovdb_buf_read_uint32(pnanovdb_buf_t buf, uint32_t byte_offset)
105{
106 uint32_t wordaddress = (byte_offset >> 2u);
107#ifdef PNANOVDB_BUF_BOUNDS_CHECK
108 return wordaddress < buf.size_in_words ? buf.data[wordaddress] : 0u;
109#else
110 return buf.data[wordaddress];
111#endif
112}
113PNANOVDB_BUF_FORCE_INLINE uint64_t pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint32_t byte_offset)
114{
115 uint64_t* data64 = (uint64_t*)buf.data;
116 uint32_t wordaddress64 = (byte_offset >> 3u);
117#ifdef PNANOVDB_BUF_BOUNDS_CHECK
118 uint64_t size_in_words64 = buf.size_in_words >> 1u;
119 return wordaddress64 < size_in_words64 ? data64[wordaddress64] : 0llu;
120#else
121 return data64[wordaddress64];
122#endif
123}
124PNANOVDB_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}
136PNANOVDB_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}
150#elif defined(PNANOVDB_ADDRESS_64)
151PNANOVDB_BUF_FORCE_INLINE uint32_t pnanovdb_buf_read_uint32(pnanovdb_buf_t buf, uint64_t byte_offset)
152{
153 uint64_t wordaddress = (byte_offset >> 2u);
154#ifdef PNANOVDB_BUF_BOUNDS_CHECK
155 return wordaddress < buf.size_in_words ? buf.data[wordaddress] : 0u;
156#else
157 return buf.data[wordaddress];
158#endif
159}
160PNANOVDB_BUF_FORCE_INLINE uint64_t pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint64_t byte_offset)
161{
162 uint64_t* data64 = (uint64_t*)buf.data;
163 uint64_t wordaddress64 = (byte_offset >> 3u);
164#ifdef PNANOVDB_BUF_BOUNDS_CHECK
165 uint64_t size_in_words64 = buf.size_in_words >> 1u;
166 return wordaddress64 < size_in_words64 ? data64[wordaddress64] : 0llu;
167#else
168 return data64[wordaddress64];
169#endif
170}
171PNANOVDB_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}
183PNANOVDB_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}
197#endif
198typedef uint32_t pnanovdb_grid_type_t;
199#define PNANOVDB_GRID_TYPE_GET(grid_typeIn, nameIn) pnanovdb_grid_type_constants[grid_typeIn].nameIn
200#elif defined(PNANOVDB_BUF_HLSL)
201#if defined(PNANOVDB_BUF_HLSL_RW)
202#if defined(PNANOVDB_BUF_HLSL_64)
203#define pnanovdb_buf_t RWStructuredBuffer<uint2>
204#else
205#define pnanovdb_buf_t RWStructuredBuffer<uint>
206#endif
207#else
208#if defined(PNANOVDB_BUF_HLSL_64)
209#define pnanovdb_buf_t StructuredBuffer<uint2>
210#else
211#define pnanovdb_buf_t StructuredBuffer<uint>
212#endif
213#endif
214#if defined(PNANOVDB_ADDRESS_32)
215uint pnanovdb_buf_read_uint32(pnanovdb_buf_t buf, uint byte_offset)
216{
217#if defined(PNANOVDB_BUF_HLSL_64)
218 uint2 val = buf[(byte_offset >> 3u)];
219 return ((byte_offset & 4u) == 0u) ? val.x : val.y;
220#else
221 return buf[(byte_offset >> 2u)];
222#endif
223}
224uint2 pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint byte_offset)
225{
226 uint2 ret;
227#if defined(PNANOVDB_BUF_HLSL_64)
228 ret = buf[(byte_offset >> 3u)];
229#else
230 ret.x = pnanovdb_buf_read_uint32(buf, byte_offset + 0u);
231 ret.y = pnanovdb_buf_read_uint32(buf, byte_offset + 4u);
232#endif
233 return ret;
234}
235void pnanovdb_buf_write_uint32(pnanovdb_buf_t buf, uint byte_offset, uint value)
236{
237 // NOP, by default no write in HLSL
238#if defined(PNANOVDB_BUF_HLSL_RW)
239#if defined(PNANOVDB_BUF_HLSL_64)
240 if ((byte_offset & 4u) == 0u) {buf[(byte_offset >> 3u)].x = value;}
241 else {buf[(byte_offset >> 3u)].y = value;}
242#else
243 buf[(byte_offset >> 2u)] = value;
244#endif
245#endif
246}
247void pnanovdb_buf_write_uint64(pnanovdb_buf_t buf, uint byte_offset, uint2 value)
248{
249 // NOP, by default no write in HLSL
250#if defined(PNANOVDB_BUF_HLSL_RW)
251#if defined(PNANOVDB_BUF_HLSL_64)
252 buf[(byte_offset >> 3u)] = value;
253#else
254 pnanovdb_buf_write_uint32(buf, byte_offset + 0u, value.x);
255 pnanovdb_buf_write_uint32(buf, byte_offset + 4u, value.y);
256#endif
257#endif
258}
259#elif defined(PNANOVDB_ADDRESS_64)
260uint pnanovdb_buf_read_uint32(pnanovdb_buf_t buf, uint64_t byte_offset)
261{
262#if defined(PNANOVDB_BUF_HLSL_64)
263 uint2 val = buf[uint(byte_offset >> 3u)];
264 return ((uint(byte_offset) & 4u) == 0u) ? val.x : val.y;
265#else
266 return buf[uint(byte_offset >> 2u)];
267#endif
268}
269uint64_t pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint64_t byte_offset)
270{
271 uint64_t ret;
272#if defined(PNANOVDB_BUF_HLSL_64)
273 uint2 raw = buf[uint(byte_offset >> 3u)];
274 ret = uint64_t(raw.x) | (uint64_t(raw.y) << 32u);
275#else
276 ret = pnanovdb_buf_read_uint32(buf, byte_offset + 0u);
277 ret = ret | (uint64_t(pnanovdb_buf_read_uint32(buf, byte_offset + 4u)) << 32u);
278#endif
279 return ret;
280}
281void pnanovdb_buf_write_uint32(pnanovdb_buf_t buf, uint64_t byte_offset, uint value)
282{
283 // NOP, by default no write in HLSL
284#if defined(PNANOVDB_BUF_HLSL_RW)
285#if defined(PNANOVDB_BUF_HLSL_64)
286 if ((byte_offset & 4u) == 0u) {buf[uint(byte_offset >> 3u)].x = value;}
287 else {buf[uint(byte_offset >> 3u)].y = value;}
288#else
289 buf[uint(byte_offset >> 2u)] = value;
290#endif
291#endif
292}
293void pnanovdb_buf_write_uint64(pnanovdb_buf_t buf, uint64_t byte_offset, uint64_t value)
294{
295 // NOP, by default no write in HLSL
296#if defined(PNANOVDB_BUF_HLSL_RW)
297#if defined(PNANOVDB_BUF_HLSL_64)
298 uint2 raw = uint2(uint(value), uint(value >> 32u));
299 buf[uint(byte_offset >> 3u)] = raw;
300#else
301 pnanovdb_buf_write_uint32(buf, byte_offset + 0u, uint(value));
302 pnanovdb_buf_write_uint32(buf, byte_offset + 4u, uint(value >> 32u));
303#endif
304#endif
305}
306#endif
307#define pnanovdb_grid_type_t uint
308#define PNANOVDB_GRID_TYPE_GET(grid_typeIn, nameIn) pnanovdb_grid_type_constants[grid_typeIn].nameIn
309#elif defined(PNANOVDB_BUF_GLSL)
310struct pnanovdb_buf_t
311{
312 uint unused; // to satisfy min struct size?
313};
314uint pnanovdb_buf_read_uint32(pnanovdb_buf_t buf, uint byte_offset)
315{
316 return pnanovdb_buf_data[(byte_offset >> 2u)];
317}
318uvec2 pnanovdb_buf_read_uint64(pnanovdb_buf_t buf, uint byte_offset)
319{
320 uvec2 ret;
321 ret.x = pnanovdb_buf_read_uint32(buf, byte_offset + 0u);
322 ret.y = pnanovdb_buf_read_uint32(buf, byte_offset + 4u);
323 return ret;
324}
325void pnanovdb_buf_write_uint32(pnanovdb_buf_t buf, uint byte_offset, uint value)
326{
327 // NOP, by default no write in HLSL
328}
329void pnanovdb_buf_write_uint64(pnanovdb_buf_t buf, uint byte_offset, uvec2 value)
330{
331 // NOP, by default no write in HLSL
332}
333#define pnanovdb_grid_type_t uint
334#define PNANOVDB_GRID_TYPE_GET(grid_typeIn, nameIn) pnanovdb_grid_type_constants[grid_typeIn].nameIn
335#endif
336
337// ------------------------------------------------ Basic Types -----------------------------------------------------------
338
339// force inline
340#if defined(PNANOVDB_C)
341#if defined(__CUDACC__)
342#define PNANOVDB_FORCE_INLINE static __host__ __device__ __forceinline__
343#elif defined(_WIN32)
344#define PNANOVDB_FORCE_INLINE static inline __forceinline
345#else
346#define PNANOVDB_FORCE_INLINE static inline __attribute__((always_inline))
347#endif
348#elif defined(PNANOVDB_HLSL)
349#define PNANOVDB_FORCE_INLINE
350#elif defined(PNANOVDB_GLSL)
351#define PNANOVDB_FORCE_INLINE
352#endif
353
354// struct typedef, static const, inout
355#if defined(PNANOVDB_C)
356#define PNANOVDB_STRUCT_TYPEDEF(X) typedef struct X X;
357#if defined(__CUDA_ARCH__)
358#define PNANOVDB_STATIC_CONST constexpr __constant__
359#else
360#define PNANOVDB_STATIC_CONST static const
361#endif
362#define PNANOVDB_INOUT(X) X*
363#define PNANOVDB_IN(X) const X*
364#define PNANOVDB_DEREF(X) (*X)
365#define PNANOVDB_REF(X) &X
366#elif defined(PNANOVDB_HLSL)
367#define PNANOVDB_STRUCT_TYPEDEF(X)
368#define PNANOVDB_STATIC_CONST static const
369#define PNANOVDB_INOUT(X) inout X
370#define PNANOVDB_IN(X) X
371#define PNANOVDB_DEREF(X) X
372#define PNANOVDB_REF(X) X
373#elif defined(PNANOVDB_GLSL)
374#define PNANOVDB_STRUCT_TYPEDEF(X)
375#define PNANOVDB_STATIC_CONST const
376#define PNANOVDB_INOUT(X) inout X
377#define PNANOVDB_IN(X) X
378#define PNANOVDB_DEREF(X) X
379#define PNANOVDB_REF(X) X
380#endif
381
382// basic types, type conversion
383#if defined(PNANOVDB_C)
384#define PNANOVDB_NATIVE_64
385#ifndef __CUDACC_RTC__
386#include <stdint.h>
387#endif
388#if !defined(PNANOVDB_MEMCPY_CUSTOM)
389#ifndef __CUDACC_RTC__
390#include <string.h>
391#endif
392#define pnanovdb_memcpy memcpy
393#endif
394typedef uint32_t pnanovdb_uint32_t;
395typedef int32_t pnanovdb_int32_t;
396typedef int32_t pnanovdb_bool_t;
397#define PNANOVDB_FALSE 0
398#define PNANOVDB_TRUE 1
399typedef uint64_t pnanovdb_uint64_t;
400typedef int64_t pnanovdb_int64_t;
401typedef struct pnanovdb_coord_t
402{
403 pnanovdb_int32_t x, y, z;
404}pnanovdb_coord_t;
405typedef struct pnanovdb_vec3_t
406{
407 float x, y, z;
408}pnanovdb_vec3_t;
409typedef struct pnanovdb_uvec4_t
410{
411 pnanovdb_uint32_t x, y, z, w;
412}pnanovdb_uvec4_t;
413typedef struct pnanovdb_ivec4_t
414{
415 pnanovdb_int32_t x, y, z, w;
416}pnanovdb_ivec4_t;
417typedef struct pnanovdb_vec4_t
418{
419 float x, y, z, w;
420}pnanovdb_vec4_t;
421PNANOVDB_FORCE_INLINE pnanovdb_int32_t pnanovdb_uint32_as_int32(pnanovdb_uint32_t v) { return (pnanovdb_int32_t)v; }
422PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_uint64_as_int64(pnanovdb_uint64_t v) { return (pnanovdb_int64_t)v; }
423PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_int64_as_uint64(pnanovdb_int64_t v) { return (pnanovdb_uint64_t)v; }
424PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_int32_as_uint32(pnanovdb_int32_t v) { return (pnanovdb_uint32_t)v; }
425PNANOVDB_FORCE_INLINE float pnanovdb_uint32_as_float(pnanovdb_uint32_t v) { float vf; pnanovdb_memcpy(&vf, &v, sizeof(vf)); return vf; }
426PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_float_as_uint32(float v) { pnanovdb_uint32_t vu; pnanovdb_memcpy(&vu, &v, sizeof(vu)); return vu; }
427PNANOVDB_FORCE_INLINE double pnanovdb_uint64_as_double(pnanovdb_uint64_t v) { double vf; pnanovdb_memcpy(&vf, &v, sizeof(vf)); return vf; }
428PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_double_as_uint64(double v) { pnanovdb_uint64_t vu; pnanovdb_memcpy(&vu, &v, sizeof(vu)); return vu; }
429PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_uint64_low(pnanovdb_uint64_t v) { return (pnanovdb_uint32_t)v; }
430PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_uint64_high(pnanovdb_uint64_t v) { return (pnanovdb_uint32_t)(v >> 32u); }
431PNANOVDB_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); }
432PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint32_as_uint64_low(pnanovdb_uint32_t x) { return ((pnanovdb_uint64_t)x); }
433PNANOVDB_FORCE_INLINE pnanovdb_int32_t pnanovdb_uint64_is_equal(pnanovdb_uint64_t a, pnanovdb_uint64_t b) { return a == b; }
434PNANOVDB_FORCE_INLINE pnanovdb_int32_t pnanovdb_int64_is_zero(pnanovdb_int64_t a) { return a == 0; }
435#ifdef PNANOVDB_CMATH
436PNANOVDB_FORCE_INLINE float pnanovdb_floor(float v) { return floorf(v); }
437#endif
438PNANOVDB_FORCE_INLINE pnanovdb_int32_t pnanovdb_float_to_int32(float v) { return (pnanovdb_int32_t)v; }
439PNANOVDB_FORCE_INLINE float pnanovdb_int32_to_float(pnanovdb_int32_t v) { return (float)v; }
440PNANOVDB_FORCE_INLINE float pnanovdb_uint32_to_float(pnanovdb_uint32_t v) { return (float)v; }
441PNANOVDB_FORCE_INLINE float pnanovdb_min(float a, float b) { return a < b ? a : b; }
442PNANOVDB_FORCE_INLINE float pnanovdb_max(float a, float b) { return a > b ? a : b; }
443#elif defined(PNANOVDB_HLSL)
444typedef uint pnanovdb_uint32_t;
445typedef int pnanovdb_int32_t;
446typedef bool pnanovdb_bool_t;
447#define PNANOVDB_FALSE false
448#define PNANOVDB_TRUE true
449typedef int3 pnanovdb_coord_t;
450typedef float3 pnanovdb_vec3_t;
451typedef uint4 pnanovdb_uvec4_t;
452typedef int4 pnanovdb_ivec4_t;
453typedef float4 pnanovdb_vec4_t;
454pnanovdb_int32_t pnanovdb_uint32_as_int32(pnanovdb_uint32_t v) { return int(v); }
455pnanovdb_uint32_t pnanovdb_int32_as_uint32(pnanovdb_int32_t v) { return uint(v); }
456float pnanovdb_uint32_as_float(pnanovdb_uint32_t v) { return asfloat(v); }
457pnanovdb_uint32_t pnanovdb_float_as_uint32(float v) { return asuint(v); }
458float pnanovdb_floor(float v) { return floor(v); }
459pnanovdb_int32_t pnanovdb_float_to_int32(float v) { return int(v); }
460float pnanovdb_int32_to_float(pnanovdb_int32_t v) { return float(v); }
461float pnanovdb_uint32_to_float(pnanovdb_uint32_t v) { return float(v); }
462float pnanovdb_min(float a, float b) { return min(a, b); }
463float pnanovdb_max(float a, float b) { return max(a, b); }
464#if defined(PNANOVDB_ADDRESS_32)
465typedef uint2 pnanovdb_uint64_t;
466typedef int2 pnanovdb_int64_t;
467pnanovdb_int64_t pnanovdb_uint64_as_int64(pnanovdb_uint64_t v) { return int2(v); }
468pnanovdb_uint64_t pnanovdb_int64_as_uint64(pnanovdb_int64_t v) { return uint2(v); }
469double pnanovdb_uint64_as_double(pnanovdb_uint64_t v) { return asdouble(v.x, v.y); }
470pnanovdb_uint64_t pnanovdb_double_as_uint64(double v) { uint2 ret; asuint(v, ret.x, ret.y); return ret; }
471pnanovdb_uint32_t pnanovdb_uint64_low(pnanovdb_uint64_t v) { return v.x; }
472pnanovdb_uint32_t pnanovdb_uint64_high(pnanovdb_uint64_t v) { return v.y; }
473pnanovdb_uint64_t pnanovdb_uint32_as_uint64(pnanovdb_uint32_t x, pnanovdb_uint32_t y) { return uint2(x, y); }
474pnanovdb_uint64_t pnanovdb_uint32_as_uint64_low(pnanovdb_uint32_t x) { return uint2(x, 0); }
475bool pnanovdb_uint64_is_equal(pnanovdb_uint64_t a, pnanovdb_uint64_t b) { return (a.x == b.x) && (a.y == b.y); }
476bool pnanovdb_int64_is_zero(pnanovdb_int64_t a) { return a.x == 0 && a.y == 0; }
477#else
478typedef uint64_t pnanovdb_uint64_t;
479typedef int64_t pnanovdb_int64_t;
480pnanovdb_int64_t pnanovdb_uint64_as_int64(pnanovdb_uint64_t v) { return int64_t(v); }
481pnanovdb_uint64_t pnanovdb_int64_as_uint64(pnanovdb_int64_t v) { return uint64_t(v); }
482double pnanovdb_uint64_as_double(pnanovdb_uint64_t v) { return asdouble(uint(v), uint(v >> 32u)); }
483pnanovdb_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); }
484pnanovdb_uint32_t pnanovdb_uint64_low(pnanovdb_uint64_t v) { return uint(v); }
485pnanovdb_uint32_t pnanovdb_uint64_high(pnanovdb_uint64_t v) { return uint(v >> 32u); }
486pnanovdb_uint64_t pnanovdb_uint32_as_uint64(pnanovdb_uint32_t x, pnanovdb_uint32_t y) { return uint64_t(x) + (uint64_t(y) << 32u); }
487pnanovdb_uint64_t pnanovdb_uint32_as_uint64_low(pnanovdb_uint32_t x) { return uint64_t(x); }
488bool pnanovdb_uint64_is_equal(pnanovdb_uint64_t a, pnanovdb_uint64_t b) { return a == b; }
489bool pnanovdb_int64_is_zero(pnanovdb_int64_t a) { return a == 0; }
490#endif
491#elif defined(PNANOVDB_GLSL)
492#define pnanovdb_uint32_t uint
493#define pnanovdb_int32_t int
494#define pnanovdb_bool_t bool
495#define PNANOVDB_FALSE false
496#define PNANOVDB_TRUE true
497#define pnanovdb_uint64_t uvec2
498#define pnanovdb_int64_t ivec2
499#define pnanovdb_coord_t ivec3
500#define pnanovdb_vec3_t vec3
501#define pnanovdb_uvec4_t uvec4
502#define pnanovdb_ivec4_t ivec4
503#define pnanovdb_vec4_t vec4
504pnanovdb_int32_t pnanovdb_uint32_as_int32(pnanovdb_uint32_t v) { return int(v); }
505pnanovdb_int64_t pnanovdb_uint64_as_int64(pnanovdb_uint64_t v) { return ivec2(v); }
506pnanovdb_uint64_t pnanovdb_int64_as_uint64(pnanovdb_int64_t v) { return uvec2(v); }
507pnanovdb_uint32_t pnanovdb_int32_as_uint32(pnanovdb_int32_t v) { return uint(v); }
508float pnanovdb_uint32_as_float(pnanovdb_uint32_t v) { return uintBitsToFloat(v); }
509pnanovdb_uint32_t pnanovdb_float_as_uint32(float v) { return floatBitsToUint(v); }
510double pnanovdb_uint64_as_double(pnanovdb_uint64_t v) { return packDouble2x32(uvec2(v.x, v.y)); }
511pnanovdb_uint64_t pnanovdb_double_as_uint64(double v) { return unpackDouble2x32(v); }
512pnanovdb_uint32_t pnanovdb_uint64_low(pnanovdb_uint64_t v) { return v.x; }
513pnanovdb_uint32_t pnanovdb_uint64_high(pnanovdb_uint64_t v) { return v.y; }
514pnanovdb_uint64_t pnanovdb_uint32_as_uint64(pnanovdb_uint32_t x, pnanovdb_uint32_t y) { return uvec2(x, y); }
515pnanovdb_uint64_t pnanovdb_uint32_as_uint64_low(pnanovdb_uint32_t x) { return uvec2(x, 0); }
516bool pnanovdb_uint64_is_equal(pnanovdb_uint64_t a, pnanovdb_uint64_t b) { return (a.x == b.x) && (a.y == b.y); }
517bool pnanovdb_int64_is_zero(pnanovdb_int64_t a) { return a.x == 0 && a.y == 0; }
518float pnanovdb_floor(float v) { return floor(v); }
519pnanovdb_int32_t pnanovdb_float_to_int32(float v) { return int(v); }
520float pnanovdb_int32_to_float(pnanovdb_int32_t v) { return float(v); }
521float pnanovdb_uint32_to_float(pnanovdb_uint32_t v) { return float(v); }
522float pnanovdb_min(float a, float b) { return min(a, b); }
523float pnanovdb_max(float a, float b) { return max(a, b); }
524#endif
525
526// ------------------------------------------------ Coord/Vec3 Utilties -----------------------------------------------------------
527
528#if defined(PNANOVDB_C)
529PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_uniform(float a)
530{
531 pnanovdb_vec3_t v;
532 v.x = a;
533 v.y = a;
534 v.z = a;
535 return v;
536}
537PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_add(const pnanovdb_vec3_t a, const pnanovdb_vec3_t b)
538{
539 pnanovdb_vec3_t v;
540 v.x = a.x + b.x;
541 v.y = a.y + b.y;
542 v.z = a.z + b.z;
543 return v;
544}
545PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_sub(const pnanovdb_vec3_t a, const pnanovdb_vec3_t b)
546{
547 pnanovdb_vec3_t v;
548 v.x = a.x - b.x;
549 v.y = a.y - b.y;
550 v.z = a.z - b.z;
551 return v;
552}
553PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_mul(const pnanovdb_vec3_t a, const pnanovdb_vec3_t b)
554{
555 pnanovdb_vec3_t v;
556 v.x = a.x * b.x;
557 v.y = a.y * b.y;
558 v.z = a.z * b.z;
559 return v;
560}
561PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_div(const pnanovdb_vec3_t a, const pnanovdb_vec3_t b)
562{
563 pnanovdb_vec3_t v;
564 v.x = a.x / b.x;
565 v.y = a.y / b.y;
566 v.z = a.z / b.z;
567 return v;
568}
569PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_min(const pnanovdb_vec3_t a, const pnanovdb_vec3_t b)
570{
571 pnanovdb_vec3_t v;
572 v.x = a.x < b.x ? a.x : b.x;
573 v.y = a.y < b.y ? a.y : b.y;
574 v.z = a.z < b.z ? a.z : b.z;
575 return v;
576}
577PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_vec3_max(const pnanovdb_vec3_t a, const pnanovdb_vec3_t b)
578{
579 pnanovdb_vec3_t v;
580 v.x = a.x > b.x ? a.x : b.x;
581 v.y = a.y > b.y ? a.y : b.y;
582 v.z = a.z > b.z ? a.z : b.z;
583 return v;
584}
585PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_coord_to_vec3(const pnanovdb_coord_t coord)
586{
587 pnanovdb_vec3_t v;
588 v.x = pnanovdb_int32_to_float(coord.x);
589 v.y = pnanovdb_int32_to_float(coord.y);
590 v.z = pnanovdb_int32_to_float(coord.z);
591 return v;
592}
593PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_coord_uniform(const pnanovdb_int32_t a)
594{
595 pnanovdb_coord_t v;
596 v.x = a;
597 v.y = a;
598 v.z = a;
599 return v;
600}
601PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_coord_add(pnanovdb_coord_t a, pnanovdb_coord_t b)
602{
603 pnanovdb_coord_t v;
604 v.x = a.x + b.x;
605 v.y = a.y + b.y;
606 v.z = a.z + b.z;
607 return v;
608}
609PNANOVDB_FORCE_INLINE pnanovdb_uvec4_t pnanovdb_uvec4_add(pnanovdb_uvec4_t a, pnanovdb_uvec4_t b)
610{
611 pnanovdb_uvec4_t ret;
612 ret.x = a.x + b.x;
613 ret.y = a.y + b.y;
614 ret.z = a.z + b.z;
615 ret.w = a.w + b.w;
616 return ret;
617}
618
619PNANOVDB_FORCE_INLINE pnanovdb_uvec4_t pnanovdb_uvec4_sub(pnanovdb_uvec4_t a, pnanovdb_uvec4_t b)
620{
621 pnanovdb_uvec4_t ret;
622 ret.x = a.x - b.x;
623 ret.y = a.y - b.y;
624 ret.z = a.z - b.z;
625 ret.w = a.w - b.w;
626 return ret;
627}
628
629PNANOVDB_FORCE_INLINE pnanovdb_vec4_t pnanovdb_vec4_add(pnanovdb_vec4_t a, pnanovdb_vec4_t b)
630{
631 pnanovdb_vec4_t ret;
632 ret.x = a.x + b.x;
633 ret.y = a.y + b.y;
634 ret.z = a.z + b.z;
635 ret.w = a.w + b.w;
636 return ret;
637}
638#elif defined(PNANOVDB_HLSL)
639pnanovdb_vec3_t pnanovdb_vec3_uniform(float a) { return float3(a, a, a); }
640pnanovdb_vec3_t pnanovdb_vec3_add(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a + b; }
641pnanovdb_vec3_t pnanovdb_vec3_sub(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a - b; }
642pnanovdb_vec3_t pnanovdb_vec3_mul(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a * b; }
643pnanovdb_vec3_t pnanovdb_vec3_div(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a / b; }
644pnanovdb_vec3_t pnanovdb_vec3_min(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return min(a, b); }
645pnanovdb_vec3_t pnanovdb_vec3_max(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return max(a, b); }
646pnanovdb_vec3_t pnanovdb_coord_to_vec3(pnanovdb_coord_t coord) { return float3(coord); }
647pnanovdb_coord_t pnanovdb_coord_uniform(pnanovdb_int32_t a) { return int3(a, a, a); }
648pnanovdb_coord_t pnanovdb_coord_add(pnanovdb_coord_t a, pnanovdb_coord_t b) { return a + b; }
649pnanovdb_uvec4_t pnanovdb_uvec4_add(pnanovdb_uvec4_t a, pnanovdb_uvec4_t b) { return a + b; }
650pnanovdb_uvec4_t pnanovdb_uvec4_sub(pnanovdb_uvec4_t a, pnanovdb_uvec4_t b) { return a - b; }
651pnanovdb_vec4_t pnanovdb_vec4_add(pnanovdb_vec4_t a, pnanovdb_vec4_t b) { return a + b; }
652#elif defined(PNANOVDB_GLSL)
653pnanovdb_vec3_t pnanovdb_vec3_uniform(float a) { return vec3(a, a, a); }
654pnanovdb_vec3_t pnanovdb_vec3_add(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a + b; }
655pnanovdb_vec3_t pnanovdb_vec3_sub(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a - b; }
656pnanovdb_vec3_t pnanovdb_vec3_mul(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a * b; }
657pnanovdb_vec3_t pnanovdb_vec3_div(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return a / b; }
658pnanovdb_vec3_t pnanovdb_vec3_min(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return min(a, b); }
659pnanovdb_vec3_t pnanovdb_vec3_max(pnanovdb_vec3_t a, pnanovdb_vec3_t b) { return max(a, b); }
660pnanovdb_vec3_t pnanovdb_coord_to_vec3(const pnanovdb_coord_t coord) { return vec3(coord); }
661pnanovdb_coord_t pnanovdb_coord_uniform(pnanovdb_int32_t a) { return ivec3(a, a, a); }
662pnanovdb_coord_t pnanovdb_coord_add(pnanovdb_coord_t a, pnanovdb_coord_t b) { return a + b; }
663pnanovdb_uvec4_t pnanovdb_uvec4_add(pnanovdb_uvec4_t a, pnanovdb_uvec4_t b) { return a + b; }
664pnanovdb_uvec4_t pnanovdb_uvec4_sub(pnanovdb_uvec4_t a, pnanovdb_uvec4_t b) { return a - b; }
665pnanovdb_vec4_t pnanovdb_vec4_add(pnanovdb_vec4_t a, pnanovdb_vec4_t b) { return a + b; }
666#endif
667
668// ------------------------------------------------ Uint64 Utils -----------------------------------------------------------
669
670PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_uint32_countbits(pnanovdb_uint32_t value)
671{
672#if defined(PNANOVDB_C)
673#if defined(_MSC_VER) && (_MSC_VER >= 1928) && defined(PNANOVDB_USE_INTRINSICS)
674 return __popcnt(value);
675#elif (defined(__GNUC__) || defined(__clang__)) && defined(PNANOVDB_USE_INTRINSICS)
676 return __builtin_popcount(value);
677#else
678 value = value - ((value >> 1) & 0x55555555);
679 value = (value & 0x33333333) + ((value >> 2) & 0x33333333);
680 value = (value + (value >> 4)) & 0x0F0F0F0F;
681 return (value * 0x01010101) >> 24;
682#endif
683#elif defined(PNANOVDB_HLSL)
684 return countbits(value);
685#elif defined(PNANOVDB_GLSL)
686 return bitCount(value);
687#endif
688}
689
690PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_uint64_countbits(pnanovdb_uint64_t value)
691{
692 return pnanovdb_uint32_countbits(pnanovdb_uint64_low(value)) + pnanovdb_uint32_countbits(pnanovdb_uint64_high(value));
693}
694
695#if defined(PNANOVDB_ADDRESS_32)
696PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint64_offset(pnanovdb_uint64_t a, pnanovdb_uint32_t b)
697{
698 pnanovdb_uint32_t low = pnanovdb_uint64_low(a);
699 pnanovdb_uint32_t high = pnanovdb_uint64_high(a);
700 low += b;
701 if (low < b)
702 {
703 high += 1u;
704 }
705 return pnanovdb_uint32_as_uint64(low, high);
706}
707
708PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_uint64_diff(pnanovdb_uint64_t a, pnanovdb_uint64_t b)
709{
710 pnanovdb_uint32_t low = pnanovdb_uint64_low(a);
711 pnanovdb_uint32_t high = pnanovdb_uint64_high(a);
712 low -= pnanovdb_uint64_low(b);
713 if (low > pnanovdb_uint64_low(a))
714 {
715 high -= 1u;
716 }
717 high -= pnanovdb_uint64_high(b);
718 return pnanovdb_uint64_as_int64(pnanovdb_uint32_as_uint64(low, high));
719}
720
721PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint64_dec(pnanovdb_uint64_t a)
722{
723 pnanovdb_uint32_t low = pnanovdb_uint64_low(a);
724 pnanovdb_uint32_t high = pnanovdb_uint64_high(a);
725 if (low == 0u)
726 {
727 high -= 1u;
728 }
729 low -= 1u;
730 return pnanovdb_uint32_as_uint64(low, high);
731}
732
733PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_uint64_to_uint32_lsr(pnanovdb_uint64_t a, pnanovdb_uint32_t b)
734{
735 pnanovdb_uint32_t low = pnanovdb_uint64_low(a);
736 pnanovdb_uint32_t high = pnanovdb_uint64_high(a);
737 return (b >= 32u) ?
738 (high >> (b - 32)) :
739 ((low >> b) | ((b > 0) ? (high << (32u - b)) : 0u));
740}
741
742PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint64_bit_mask(pnanovdb_uint32_t bit_idx)
743{
744 pnanovdb_uint32_t mask_low = bit_idx < 32u ? 1u << bit_idx : 0u;
745 pnanovdb_uint32_t mask_high = bit_idx >= 32u ? 1u << (bit_idx - 32u) : 0u;
746 return pnanovdb_uint32_as_uint64(mask_low, mask_high);
747}
748
749PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint64_and(pnanovdb_uint64_t a, pnanovdb_uint64_t b)
750{
751 return pnanovdb_uint32_as_uint64(
752 pnanovdb_uint64_low(a) & pnanovdb_uint64_low(b),
753 pnanovdb_uint64_high(a) & pnanovdb_uint64_high(b)
754 );
755}
756
757PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_uint64_any_bit(pnanovdb_uint64_t a)
758{
759 return pnanovdb_uint64_low(a) != 0u || pnanovdb_uint64_high(a) != 0u;
760}
761
762#else
763PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint64_offset(pnanovdb_uint64_t a, pnanovdb_uint32_t b)
764{
765 return a + b;
766}
767
768PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_uint64_diff(pnanovdb_uint64_t a, pnanovdb_uint64_t b)
769{
770 return pnanovdb_uint64_as_int64(a - b);
771}
772
773PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint64_dec(pnanovdb_uint64_t a)
774{
775 return a - 1u;
776}
777
778PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_uint64_to_uint32_lsr(pnanovdb_uint64_t a, pnanovdb_uint32_t b)
779{
780 return pnanovdb_uint64_low(a >> b);
781}
782
783PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint64_bit_mask(pnanovdb_uint32_t bit_idx)
784{
785 return 1llu << bit_idx;
786}
787
788PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint64_and(pnanovdb_uint64_t a, pnanovdb_uint64_t b)
789{
790 return a & b;
791}
792
793PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_uint64_any_bit(pnanovdb_uint64_t a)
794{
795 return a != 0llu;
796}
797#endif
798
799// ------------------------------------------------ Address Type -----------------------------------------------------------
800
801#if defined(PNANOVDB_ADDRESS_32)
802struct pnanovdb_address_t
803{
804 pnanovdb_uint32_t byte_offset;
805};
806PNANOVDB_STRUCT_TYPEDEF(pnanovdb_address_t)
807
808PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset(pnanovdb_address_t address, pnanovdb_uint32_t byte_offset)
809{
810 pnanovdb_address_t ret = address;
811 ret.byte_offset += byte_offset;
812 return ret;
813}
814PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset_neg(pnanovdb_address_t address, pnanovdb_uint32_t byte_offset)
815{
816 pnanovdb_address_t ret = address;
817 ret.byte_offset -= byte_offset;
818 return ret;
819}
820PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset_product(pnanovdb_address_t address, pnanovdb_uint32_t byte_offset, pnanovdb_uint32_t multiplier)
821{
822 pnanovdb_address_t ret = address;
823 ret.byte_offset += byte_offset * multiplier;
824 return ret;
825}
826PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset64(pnanovdb_address_t address, pnanovdb_uint64_t byte_offset)
827{
828 pnanovdb_address_t ret = address;
829 // lose high bits on 32-bit
830 ret.byte_offset += pnanovdb_uint64_low(byte_offset);
831 return ret;
832}
833PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset64_product(pnanovdb_address_t address, pnanovdb_uint64_t byte_offset, pnanovdb_uint32_t multiplier)
834{
835 pnanovdb_address_t ret = address;
836 ret.byte_offset += pnanovdb_uint64_low(byte_offset) * multiplier;
837 return ret;
838}
839PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_address_diff(pnanovdb_address_t a, pnanovdb_address_t b)
840{
841 return pnanovdb_uint64_diff(pnanovdb_uint32_as_uint64_low(a.byte_offset),pnanovdb_uint32_as_uint64_low(b.byte_offset));
842}
843PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_address_mask(pnanovdb_address_t address, pnanovdb_uint32_t mask)
844{
845 return address.byte_offset & mask;
846}
847PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_mask_inv(pnanovdb_address_t address, pnanovdb_uint32_t mask)
848{
849 pnanovdb_address_t ret = address;
850 ret.byte_offset &= (~mask);
851 return ret;
852}
853PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_null()
854{
855 pnanovdb_address_t ret = { 0 };
856 return ret;
857}
858PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_address_is_null(pnanovdb_address_t address)
859{
860 return address.byte_offset == 0u;
861}
862PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_address_in_interval(pnanovdb_address_t address, pnanovdb_address_t min_address, pnanovdb_address_t max_address)
863{
864 return address.byte_offset >= min_address.byte_offset && address.byte_offset < max_address.byte_offset;
865}
866PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_add(pnanovdb_address_t a, pnanovdb_address_t b)
867{
868 pnanovdb_address_t sum = a;
869 sum.byte_offset += b.byte_offset;
870 return sum;
871}
872#elif defined(PNANOVDB_ADDRESS_64)
873struct pnanovdb_address_t
874{
875 pnanovdb_uint64_t byte_offset;
876};
877PNANOVDB_STRUCT_TYPEDEF(pnanovdb_address_t)
878
879PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset(pnanovdb_address_t address, pnanovdb_uint32_t byte_offset)
880{
881 pnanovdb_address_t ret = address;
882 ret.byte_offset += byte_offset;
883 return ret;
884}
885PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset_neg(pnanovdb_address_t address, pnanovdb_uint32_t byte_offset)
886{
887 pnanovdb_address_t ret = address;
888 ret.byte_offset -= byte_offset;
889 return ret;
890}
891PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset_product(pnanovdb_address_t address, pnanovdb_uint32_t byte_offset, pnanovdb_uint32_t multiplier)
892{
893 pnanovdb_address_t ret = address;
894 ret.byte_offset += pnanovdb_uint32_as_uint64_low(byte_offset) * pnanovdb_uint32_as_uint64_low(multiplier);
895 return ret;
896}
897PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset64(pnanovdb_address_t address, pnanovdb_uint64_t byte_offset)
898{
899 pnanovdb_address_t ret = address;
900 ret.byte_offset += byte_offset;
901 return ret;
902}
903PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_offset64_product(pnanovdb_address_t address, pnanovdb_uint64_t byte_offset, pnanovdb_uint32_t multiplier)
904{
905 pnanovdb_address_t ret = address;
906 ret.byte_offset += byte_offset * pnanovdb_uint32_as_uint64_low(multiplier);
907 return ret;
908}
909PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_address_diff(pnanovdb_address_t a, pnanovdb_address_t b)
910{
911 return pnanovdb_uint64_diff(a.byte_offset, b.byte_offset);
912}
913PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_address_mask(pnanovdb_address_t address, pnanovdb_uint32_t mask)
914{
915 return pnanovdb_uint64_low(address.byte_offset) & mask;
916}
917PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_mask_inv(pnanovdb_address_t address, pnanovdb_uint32_t mask)
918{
919 pnanovdb_address_t ret = address;
920 ret.byte_offset &= (~pnanovdb_uint32_as_uint64_low(mask));
921 return ret;
922}
923PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_null()
924{
925 pnanovdb_address_t ret = { 0 };
926 return ret;
927}
928PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_address_is_null(pnanovdb_address_t address)
929{
930 return address.byte_offset == 0llu;
931}
932PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_address_in_interval(pnanovdb_address_t address, pnanovdb_address_t min_address, pnanovdb_address_t max_address)
933{
934 return address.byte_offset >= min_address.byte_offset && address.byte_offset < max_address.byte_offset;
935}
936PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_address_add(pnanovdb_address_t a, pnanovdb_address_t b)
937{
938 pnanovdb_address_t sum = a;
939 sum.byte_offset += b.byte_offset;
940 return sum;
941}
942#endif
943
944// ------------------------------------------------ High Level Buffer Read -----------------------------------------------------------
945
946PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_read_uint32(pnanovdb_buf_t buf, pnanovdb_address_t address)
947{
948 return pnanovdb_buf_read_uint32(buf, address.byte_offset);
949}
950PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_read_uint64(pnanovdb_buf_t buf, pnanovdb_address_t address)
951{
952 return pnanovdb_buf_read_uint64(buf, address.byte_offset);
953}
954PNANOVDB_FORCE_INLINE pnanovdb_int32_t pnanovdb_read_int32(pnanovdb_buf_t buf, pnanovdb_address_t address)
955{
956 return pnanovdb_uint32_as_int32(pnanovdb_read_uint32(buf, address));
957}
958PNANOVDB_FORCE_INLINE float pnanovdb_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address)
959{
960 return pnanovdb_uint32_as_float(pnanovdb_read_uint32(buf, address));
961}
962PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_read_int64(pnanovdb_buf_t buf, pnanovdb_address_t address)
963{
964 return pnanovdb_uint64_as_int64(pnanovdb_read_uint64(buf, address));
965}
966PNANOVDB_FORCE_INLINE double pnanovdb_read_double(pnanovdb_buf_t buf, pnanovdb_address_t address)
967{
968 return pnanovdb_uint64_as_double(pnanovdb_read_uint64(buf, address));
969}
970PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_read_coord(pnanovdb_buf_t buf, pnanovdb_address_t address)
971{
972 pnanovdb_coord_t ret;
973 ret.x = pnanovdb_uint32_as_int32(pnanovdb_read_uint32(buf, pnanovdb_address_offset(address, 0u)));
974 ret.y = pnanovdb_uint32_as_int32(pnanovdb_read_uint32(buf, pnanovdb_address_offset(address, 4u)));
975 ret.z = pnanovdb_uint32_as_int32(pnanovdb_read_uint32(buf, pnanovdb_address_offset(address, 8u)));
976 return ret;
977}
978PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_read_vec3(pnanovdb_buf_t buf, pnanovdb_address_t address)
979{
980 pnanovdb_vec3_t ret;
981 ret.x = pnanovdb_read_float(buf, pnanovdb_address_offset(address, 0u));
982 ret.y = pnanovdb_read_float(buf, pnanovdb_address_offset(address, 4u));
983 ret.z = pnanovdb_read_float(buf, pnanovdb_address_offset(address, 8u));
984 return ret;
985}
986
987PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_read_uint16(pnanovdb_buf_t buf, pnanovdb_address_t address)
988{
989 pnanovdb_uint32_t raw = pnanovdb_read_uint32(buf, pnanovdb_address_mask_inv(address, 3u));
990 return (raw >> (pnanovdb_address_mask(address, 2) << 3));
991}
992PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_read_uint8(pnanovdb_buf_t buf, pnanovdb_address_t address)
993{
994 pnanovdb_uint32_t raw = pnanovdb_read_uint32(buf, pnanovdb_address_mask_inv(address, 3u));
995 return (raw >> (pnanovdb_address_mask(address, 3) << 3)) & 255;
996}
997PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_read_vec3u16(pnanovdb_buf_t buf, pnanovdb_address_t address)
998{
999 pnanovdb_vec3_t ret;
1000 const float scale = 1.f / 65535.f;
1001 ret.x = scale * pnanovdb_uint32_to_float(pnanovdb_read_uint16(buf, pnanovdb_address_offset(address, 0u))) - 0.5f;
1002 ret.y = scale * pnanovdb_uint32_to_float(pnanovdb_read_uint16(buf, pnanovdb_address_offset(address, 2u))) - 0.5f;
1003 ret.z = scale * pnanovdb_uint32_to_float(pnanovdb_read_uint16(buf, pnanovdb_address_offset(address, 4u))) - 0.5f;
1004 return ret;
1005}
1006PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_read_vec3u8(pnanovdb_buf_t buf, pnanovdb_address_t address)
1007{
1008 pnanovdb_vec3_t ret;
1009 const float scale = 1.f / 255.f;
1010 ret.x = scale * pnanovdb_uint32_to_float(pnanovdb_read_uint8(buf, pnanovdb_address_offset(address, 0u))) - 0.5f;
1011 ret.y = scale * pnanovdb_uint32_to_float(pnanovdb_read_uint8(buf, pnanovdb_address_offset(address, 1u))) - 0.5f;
1012 ret.z = scale * pnanovdb_uint32_to_float(pnanovdb_read_uint8(buf, pnanovdb_address_offset(address, 2u))) - 0.5f;
1013 return ret;
1014}
1015
1016PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_read_bit(pnanovdb_buf_t buf, pnanovdb_address_t address, pnanovdb_uint32_t bit_offset)
1017{
1018 pnanovdb_address_t word_address = pnanovdb_address_mask_inv(address, 3u);
1019 pnanovdb_uint32_t bit_index = (pnanovdb_address_mask(address, 3u) << 3u) + bit_offset;
1020 pnanovdb_uint32_t value_word = pnanovdb_buf_read_uint32(buf, word_address.byte_offset);
1021 return ((value_word >> bit_index) & 1) != 0u;
1022}
1023
1024#if defined(PNANOVDB_C)
1025PNANOVDB_FORCE_INLINE short pnanovdb_read_half(pnanovdb_buf_t buf, pnanovdb_address_t address)
1026{
1027 pnanovdb_uint32_t raw = pnanovdb_read_uint32(buf, address);
1028 return (short)(raw >> (pnanovdb_address_mask(address, 2) << 3));
1029}
1030#elif defined(PNANOVDB_HLSL)
1031PNANOVDB_FORCE_INLINE float pnanovdb_read_half(pnanovdb_buf_t buf, pnanovdb_address_t address)
1032{
1033 pnanovdb_uint32_t raw = pnanovdb_read_uint32(buf, address);
1034 return f16tof32(raw >> (pnanovdb_address_mask(address, 2) << 3));
1035}
1036#elif defined(PNANOVDB_GLSL)
1037PNANOVDB_FORCE_INLINE float pnanovdb_read_half(pnanovdb_buf_t buf, pnanovdb_address_t address)
1038{
1039 pnanovdb_uint32_t raw = pnanovdb_read_uint32(buf, address);
1040 return unpackHalf2x16(raw >> (pnanovdb_address_mask(address, 2) << 3)).x;
1041}
1042#endif
1043
1044// ------------------------------------------------ High Level Buffer Write -----------------------------------------------------------
1045
1046PNANOVDB_FORCE_INLINE void pnanovdb_write_uint32(pnanovdb_buf_t buf, pnanovdb_address_t address, pnanovdb_uint32_t value)
1047{
1048 pnanovdb_buf_write_uint32(buf, address.byte_offset, value);
1049}
1050PNANOVDB_FORCE_INLINE void pnanovdb_write_uint64(pnanovdb_buf_t buf, pnanovdb_address_t address, pnanovdb_uint64_t value)
1051{
1052 pnanovdb_buf_write_uint64(buf, address.byte_offset, value);
1053}
1054PNANOVDB_FORCE_INLINE void pnanovdb_write_int32(pnanovdb_buf_t buf, pnanovdb_address_t address, pnanovdb_int32_t value)
1055{
1056 pnanovdb_write_uint32(buf, address, pnanovdb_int32_as_uint32(value));
1057}
1058PNANOVDB_FORCE_INLINE void pnanovdb_write_int64(pnanovdb_buf_t buf, pnanovdb_address_t address, pnanovdb_int64_t value)
1059{
1060 pnanovdb_buf_write_uint64(buf, address.byte_offset, pnanovdb_int64_as_uint64(value));
1061}
1062PNANOVDB_FORCE_INLINE void pnanovdb_write_float(pnanovdb_buf_t buf, pnanovdb_address_t address, float value)
1063{
1064 pnanovdb_write_uint32(buf, address, pnanovdb_float_as_uint32(value));
1065}
1066PNANOVDB_FORCE_INLINE void pnanovdb_write_double(pnanovdb_buf_t buf, pnanovdb_address_t address, double value)
1067{
1068 pnanovdb_write_uint64(buf, address, pnanovdb_double_as_uint64(value));
1069}
1070PNANOVDB_FORCE_INLINE void pnanovdb_write_coord(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) value)
1071{
1072 pnanovdb_write_uint32(buf, pnanovdb_address_offset(address, 0u), pnanovdb_int32_as_uint32(PNANOVDB_DEREF(value).x));
1073 pnanovdb_write_uint32(buf, pnanovdb_address_offset(address, 4u), pnanovdb_int32_as_uint32(PNANOVDB_DEREF(value).y));
1074 pnanovdb_write_uint32(buf, pnanovdb_address_offset(address, 8u), pnanovdb_int32_as_uint32(PNANOVDB_DEREF(value).z));
1075}
1076PNANOVDB_FORCE_INLINE void pnanovdb_write_vec3(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_vec3_t) value)
1077{
1078 pnanovdb_write_float(buf, pnanovdb_address_offset(address, 0u), PNANOVDB_DEREF(value).x);
1079 pnanovdb_write_float(buf, pnanovdb_address_offset(address, 4u), PNANOVDB_DEREF(value).y);
1080 pnanovdb_write_float(buf, pnanovdb_address_offset(address, 8u), PNANOVDB_DEREF(value).z);
1081}
1082
1083// ------------------------------------------------ Core Structures -----------------------------------------------------------
1084
1085#define PNANOVDB_MAGIC_NUMBER 0x304244566f6e614eUL// "NanoVDB0" in hex - little endian (uint64_t)
1086#define PNANOVDB_MAGIC_GRID 0x314244566f6e614eUL// "NanoVDB1" in hex - little endian (uint64_t)
1087#define PNANOVDB_MAGIC_FILE 0x324244566f6e614eUL// "NanoVDB2" in hex - little endian (uint64_t)
1088
1089#define PNANOVDB_MAJOR_VERSION_NUMBER 32// reflects changes to the ABI
1090#define PNANOVDB_MINOR_VERSION_NUMBER 9// reflects changes to the API but not ABI
1091#define PNANOVDB_PATCH_VERSION_NUMBER 2// reflects bug-fixes with no ABI or API changes
1092
1093#define PNANOVDB_GRID_TYPE_UNKNOWN 0
1094#define PNANOVDB_GRID_TYPE_FLOAT 1
1095#define PNANOVDB_GRID_TYPE_DOUBLE 2
1096#define PNANOVDB_GRID_TYPE_INT16 3
1097#define PNANOVDB_GRID_TYPE_INT32 4
1098#define PNANOVDB_GRID_TYPE_INT64 5
1099#define PNANOVDB_GRID_TYPE_VEC3F 6
1100#define PNANOVDB_GRID_TYPE_VEC3D 7
1101#define PNANOVDB_GRID_TYPE_MASK 8
1102#define PNANOVDB_GRID_TYPE_HALF 9
1103#define PNANOVDB_GRID_TYPE_UINT32 10
1104#define PNANOVDB_GRID_TYPE_BOOLEAN 11
1105#define PNANOVDB_GRID_TYPE_RGBA8 12
1106#define PNANOVDB_GRID_TYPE_FP4 13
1107#define PNANOVDB_GRID_TYPE_FP8 14
1108#define PNANOVDB_GRID_TYPE_FP16 15
1109#define PNANOVDB_GRID_TYPE_FPN 16
1110#define PNANOVDB_GRID_TYPE_VEC4F 17
1111#define PNANOVDB_GRID_TYPE_VEC4D 18
1112#define PNANOVDB_GRID_TYPE_INDEX 19
1113#define PNANOVDB_GRID_TYPE_ONINDEX 20
1114//#define PNANOVDB_GRID_TYPE_INDEXMASK 21 // retired - available for future use
1115//#define PNANOVDB_GRID_TYPE_ONINDEXMASK 22 // retired - available for future use
1116#define PNANOVDB_GRID_TYPE_POINTINDEX 23
1117#define PNANOVDB_GRID_TYPE_VEC3U8 24
1118#define PNANOVDB_GRID_TYPE_VEC3U16 25
1119#define PNANOVDB_GRID_TYPE_UINT8 26
1120#define PNANOVDB_GRID_TYPE_END 27
1121
1122#define PNANOVDB_GRID_TYPE_CAP 32
1123
1124#define PNANOVDB_GRID_CLASS_UNKNOWN 0
1125#define PNANOVDB_GRID_CLASS_LEVEL_SET 1 // narrow band level set, e.g. SDF
1126#define PNANOVDB_GRID_CLASS_FOG_VOLUME 2 // fog volume, e.g. density
1127#define PNANOVDB_GRID_CLASS_STAGGERED 3 // staggered MAC grid, e.g. velocity
1128#define PNANOVDB_GRID_CLASS_POINT_INDEX 4 // point index grid
1129#define PNANOVDB_GRID_CLASS_POINT_DATA 5 // point data grid
1130#define PNANOVDB_GRID_CLASS_TOPOLOGY 6 // grid with active states only (no values)
1131#define PNANOVDB_GRID_CLASS_VOXEL_VOLUME 7 // volume of geometric cubes, e.g. minecraft
1132#define PNANOVDB_GRID_CLASS_INDEX_GRID 8 // grid whose values are offsets, e.g. into an external array
1133#define PNANOVDB_GRID_CLASS_TENSOR_GRID 9 // grid which can have extra metadata and features
1134#define PNANOVDB_GRID_CLASS_VOXEL_BVH 10 // grid where each voxel points to list of primitive ids
1135#define PNANOVDB_GRID_CLASS_END 11
1136
1137#define PNANOVDB_GRID_FLAGS_HAS_LONG_GRID_NAME (1 << 0)
1138#define PNANOVDB_GRID_FLAGS_HAS_BBOX (1 << 1)
1139#define PNANOVDB_GRID_FLAGS_HAS_MIN_MAX (1 << 2)
1140#define PNANOVDB_GRID_FLAGS_HAS_AVERAGE (1 << 3)
1141#define PNANOVDB_GRID_FLAGS_HAS_STD_DEVIATION (1 << 4)
1142#define PNANOVDB_GRID_FLAGS_IS_BREADTH_FIRST (1 << 5)
1143#define PNANOVDB_GRID_FLAGS_END (1 << 6)
1144
1145#define PNANOVDB_LEAF_TYPE_DEFAULT 0
1146#define PNANOVDB_LEAF_TYPE_LITE 1
1147#define PNANOVDB_LEAF_TYPE_FP 2
1148#define PNANOVDB_LEAF_TYPE_INDEX 3
1149//#define PNANOVDB_LEAF_TYPE_INDEXMASK 4 // retired - available for future use
1150#define PNANOVDB_LEAF_TYPE_POINTINDEX 5
1151
1152// BuildType = Unknown, float, double, int16_t, int32_t, int64_t, Vec3f, Vec3d, Mask, ...
1153// bit count of values in leaf nodes, i.e. 8*sizeof(*nanovdb::LeafNode<BuildType>::mValues) or zero if no values are stored
1154PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_value_strides_bits[PNANOVDB_GRID_TYPE_CAP] = { 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, 0 };
1155// bit count of the Tile union in InternalNodes, i.e. 8*sizeof(nanovdb::InternalData::Tile)
1156PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_table_strides_bits[PNANOVDB_GRID_TYPE_CAP] = { 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, 64 };
1157// bit count of min/max values, i.e. 8*sizeof(nanovdb::LeafData::mMinimum) or zero if no min/max exists
1158PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_minmax_strides_bits[PNANOVDB_GRID_TYPE_CAP] = { 0, 32, 64, 16, 32, 64, 96, 192, 8, 16, 32, 8, 32, 32, 32, 32, 32, 128, 256, 64, 64, 0, 0, 64, 24, 48, 8, 0 };
1159// 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
1160PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_minmax_aligns_bits[PNANOVDB_GRID_TYPE_CAP] = { 0, 32, 64, 16, 32, 64, 32, 64, 8, 16, 32, 8, 32, 32, 32, 32, 32, 32, 64, 64, 64, 0, 0, 64, 8, 16, 8, 0 };
1161// bit alignment of the stats (avg/std-dev) types, e.g. 8*sizeof(nanovdb::LeafData::mAverage)
1162PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_stat_strides_bits[PNANOVDB_GRID_TYPE_CAP] = { 0, 32, 64, 32, 32, 64, 32, 64, 8, 32, 32, 8, 32, 32, 32, 32, 32, 32, 64, 64, 64, 0, 0, 64, 32, 32, 32, 0 };
1163// one of the 4 leaf types defined above, e.g. PNANOVDB_LEAF_TYPE_INDEX = 3
1164PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_leaf_type[PNANOVDB_GRID_TYPE_CAP] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 2, 2, 2, 2, 0, 0, 3, 3, 0, 0, 5, 0, 0, 0, 0 };
1165
1167{
1168 float matf[9];
1169 float invmatf[9];
1170 float vecf[3];
1171 float taperf;
1172 double matd[9];
1173 double invmatd[9];
1174 double vecd[3];
1175 double taperd;
1176};
1177PNANOVDB_STRUCT_TYPEDEF(pnanovdb_map_t)
1178struct pnanovdb_map_handle_t { pnanovdb_address_t address; };
1179PNANOVDB_STRUCT_TYPEDEF(pnanovdb_map_handle_t)
1180
1181#define PNANOVDB_MAP_SIZE 264
1182
1183#define PNANOVDB_MAP_OFF_MATF 0
1184#define PNANOVDB_MAP_OFF_INVMATF 36
1185#define PNANOVDB_MAP_OFF_VECF 72
1186#define PNANOVDB_MAP_OFF_TAPERF 84
1187#define PNANOVDB_MAP_OFF_MATD 88
1188#define PNANOVDB_MAP_OFF_INVMATD 160
1189#define PNANOVDB_MAP_OFF_VECD 232
1190#define PNANOVDB_MAP_OFF_TAPERD 256
1191
1192PNANOVDB_FORCE_INLINE float pnanovdb_map_get_matf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index) {
1193 return pnanovdb_read_float(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_MATF + 4u * index));
1194}
1195PNANOVDB_FORCE_INLINE float pnanovdb_map_get_invmatf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index) {
1196 return pnanovdb_read_float(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_INVMATF + 4u * index));
1197}
1198PNANOVDB_FORCE_INLINE float pnanovdb_map_get_vecf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index) {
1199 return pnanovdb_read_float(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_VECF + 4u * index));
1200}
1201PNANOVDB_FORCE_INLINE float pnanovdb_map_get_taperf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index) {
1202 return pnanovdb_read_float(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_TAPERF));
1203}
1204PNANOVDB_FORCE_INLINE double pnanovdb_map_get_matd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index) {
1205 return pnanovdb_read_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_MATD + 8u * index));
1206}
1207PNANOVDB_FORCE_INLINE double pnanovdb_map_get_invmatd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index) {
1208 return pnanovdb_read_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_INVMATD + 8u * index));
1209}
1210PNANOVDB_FORCE_INLINE double pnanovdb_map_get_vecd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index) {
1211 return pnanovdb_read_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_VECD + 8u * index));
1212}
1213PNANOVDB_FORCE_INLINE double pnanovdb_map_get_taperd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index) {
1214 return pnanovdb_read_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_TAPERD));
1215}
1216
1217PNANOVDB_FORCE_INLINE void pnanovdb_map_set_matf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index, float matf) {
1218 pnanovdb_write_float(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_MATF + 4u * index), matf);
1219}
1220PNANOVDB_FORCE_INLINE void pnanovdb_map_set_invmatf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index, float invmatf) {
1221 pnanovdb_write_float(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_INVMATF + 4u * index), invmatf);
1222}
1223PNANOVDB_FORCE_INLINE void pnanovdb_map_set_vecf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index, float vecf) {
1224 pnanovdb_write_float(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_VECF + 4u * index), vecf);
1225}
1226PNANOVDB_FORCE_INLINE void pnanovdb_map_set_taperf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index, float taperf) {
1227 pnanovdb_write_float(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_TAPERF), taperf);
1228}
1229PNANOVDB_FORCE_INLINE void pnanovdb_map_set_matd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index, double matd) {
1230 pnanovdb_write_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_MATD + 8u * index), matd);
1231}
1232PNANOVDB_FORCE_INLINE void pnanovdb_map_set_invmatd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index, double invmatd) {
1233 pnanovdb_write_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_INVMATD + 8u * index), invmatd);
1234}
1235PNANOVDB_FORCE_INLINE void pnanovdb_map_set_vecd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index, double vecd) {
1236 pnanovdb_write_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_VECD + 8u * index), vecd);
1237}
1238PNANOVDB_FORCE_INLINE void pnanovdb_map_set_taperd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index, double taperd) {
1239 pnanovdb_write_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_MAP_OFF_TAPERD), taperd);
1240}
1241
1243{
1244 pnanovdb_uint64_t magic; // 8 bytes, 0
1245 pnanovdb_uint64_t checksum; // 8 bytes, 8
1246 pnanovdb_uint32_t version; // 4 bytes, 16
1247 pnanovdb_uint32_t flags; // 4 bytes, 20
1248 pnanovdb_uint32_t grid_index; // 4 bytes, 24
1249 pnanovdb_uint32_t grid_count; // 4 bytes, 28
1250 pnanovdb_uint64_t grid_size; // 8 bytes, 32
1251 pnanovdb_uint32_t grid_name[256 / 4]; // 256 bytes, 40
1252 pnanovdb_map_t map; // 264 bytes, 296
1253 double world_bbox[6]; // 48 bytes, 560
1254 double voxel_size[3]; // 24 bytes, 608
1255 pnanovdb_uint32_t grid_class; // 4 bytes, 632
1256 pnanovdb_uint32_t grid_type; // 4 bytes, 636
1257 pnanovdb_int64_t blind_metadata_offset; // 8 bytes, 640
1258 pnanovdb_uint32_t blind_metadata_count; // 4 bytes, 648
1259 pnanovdb_uint32_t data0; // 4 bytes, 652
1260 pnanovdb_uint64_t data1; // 8 bytes, 656
1261 pnanovdb_uint64_t data2; // 8 bytes, 664
1262};
1263PNANOVDB_STRUCT_TYPEDEF(pnanovdb_grid_t)
1264struct pnanovdb_grid_handle_t { pnanovdb_address_t address; };
1265PNANOVDB_STRUCT_TYPEDEF(pnanovdb_grid_handle_t)
1266
1267#define PNANOVDB_GRID_SIZE 672
1268
1269#define PNANOVDB_GRID_OFF_MAGIC 0
1270#define PNANOVDB_GRID_OFF_CHECKSUM 8
1271#define PNANOVDB_GRID_OFF_VERSION 16
1272#define PNANOVDB_GRID_OFF_FLAGS 20
1273#define PNANOVDB_GRID_OFF_GRID_INDEX 24
1274#define PNANOVDB_GRID_OFF_GRID_COUNT 28
1275#define PNANOVDB_GRID_OFF_GRID_SIZE 32
1276#define PNANOVDB_GRID_OFF_GRID_NAME 40
1277#define PNANOVDB_GRID_OFF_MAP 296
1278#define PNANOVDB_GRID_OFF_WORLD_BBOX 560
1279#define PNANOVDB_GRID_OFF_VOXEL_SIZE 608
1280#define PNANOVDB_GRID_OFF_GRID_CLASS 632
1281#define PNANOVDB_GRID_OFF_GRID_TYPE 636
1282#define PNANOVDB_GRID_OFF_BLIND_METADATA_OFFSET 640
1283#define PNANOVDB_GRID_OFF_BLIND_METADATA_COUNT 648
1284#define PNANOVDB_GRID_OFF_DATA0 652
1285#define PNANOVDB_GRID_OFF_DATA1 656
1286#define PNANOVDB_GRID_OFF_DATA2 664
1287
1288PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_grid_get_magic(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
1289 return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_MAGIC));
1290}
1291PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_grid_get_checksum(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
1292 return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_CHECKSUM));
1293}
1294PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_version(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
1295 return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_VERSION));
1296}
1297PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_flags(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
1298 return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_FLAGS));
1299}
1300PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_index(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
1301 return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_INDEX));
1302}
1303PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_count(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
1304 return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_COUNT));
1305}
1306PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_grid_get_grid_size(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
1307 return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_SIZE));
1308}
1309PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_name(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t index) {
1310 return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_NAME + 4u * index));
1311}
1312PNANOVDB_FORCE_INLINE pnanovdb_map_handle_t pnanovdb_grid_get_map(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
1314 ret.address = pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_MAP);
1315 return ret;
1316}
1317PNANOVDB_FORCE_INLINE double pnanovdb_grid_get_world_bbox(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t index) {
1318 return pnanovdb_read_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_WORLD_BBOX + 8u * index));
1319}
1320PNANOVDB_FORCE_INLINE double pnanovdb_grid_get_voxel_size(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t index) {
1321 return pnanovdb_read_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_VOXEL_SIZE + 8u * index));
1322}
1323PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_class(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
1324 return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_CLASS));
1325}
1326PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_type(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
1327 return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_TYPE));
1328}
1329PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_grid_get_blind_metadata_offset(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
1330 return pnanovdb_read_int64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_BLIND_METADATA_OFFSET));
1331}
1332PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_blind_metadata_count(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
1333 return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_BLIND_METADATA_COUNT));
1334}
1335PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_data0(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
1336 return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_DATA0));
1337}
1338PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_grid_get_data1(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
1339 return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_DATA1));
1340}
1341PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_grid_get_data2(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p) {
1342 return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_DATA2));
1343}
1344
1345PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_magic(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint64_t magic) {
1346 pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_MAGIC), magic);
1347}
1348PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_checksum(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint64_t checksum) {
1349 pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_CHECKSUM), checksum);
1350}
1351PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_version(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t version) {
1352 pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_VERSION), version);
1353}
1354PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_flags(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t flags) {
1355 pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_FLAGS), flags);
1356}
1357PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_grid_index(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t grid_index) {
1358 pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_INDEX), grid_index);
1359}
1360PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_grid_count(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t grid_count) {
1361 pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_COUNT), grid_count);
1362}
1363PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_grid_size(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint64_t grid_size) {
1364 pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_SIZE), grid_size);
1365}
1366PNANOVDB_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) {
1367 pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_NAME + 4u * index), grid_name);
1368}
1369PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_world_bbox(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t index, double world_bbox) {
1370 pnanovdb_write_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_WORLD_BBOX + 8u * index), world_bbox);
1371}
1372PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_voxel_size(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t index, double voxel_size) {
1373 pnanovdb_write_double(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_VOXEL_SIZE + 8u * index), voxel_size);
1374}
1375PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_grid_class(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t grid_class) {
1376 pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_CLASS), grid_class);
1377}
1378PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_grid_type(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t grid_type) {
1379 pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_GRID_TYPE), grid_type);
1380}
1381PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_blind_metadata_offset(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint64_t blind_metadata_offset) {
1382 pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_BLIND_METADATA_OFFSET), blind_metadata_offset);
1383}
1384PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_blind_metadata_count(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t metadata_count) {
1385 pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_BLIND_METADATA_COUNT), metadata_count);
1386}
1387PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_data0(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t data0) {
1388 pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_DATA0), data0);
1389}
1390PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_data1(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint64_t data1) {
1391 pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_DATA1), data1);
1392}
1393PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_data2(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint64_t data2) {
1394 pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRID_OFF_DATA2), data2);
1395}
1396
1397PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_make_version(pnanovdb_uint32_t major, pnanovdb_uint32_t minor, pnanovdb_uint32_t patch_num)
1398{
1399 return (major << 21u) | (minor << 10u) | patch_num;
1400}
1401
1402PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_version_get_major(pnanovdb_uint32_t version)
1403{
1404 return (version >> 21u) & ((1u << 11u) - 1u);
1405}
1406PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_version_get_minor(pnanovdb_uint32_t version)
1407{
1408 return (version >> 10u) & ((1u << 11u) - 1u);
1409}
1410PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_version_get_patch(pnanovdb_uint32_t version)
1411{
1412 return version & ((1u << 10u) - 1u);
1413}
1414
1415#define PNANOVDB_GRIDBLINDMETADATA_CLASS_UNKNOWN 0
1416#define PNANOVDB_GRIDBLINDMETADATA_CLASS_INDEX_ARRAY 1 // indices typically used for mapping into other arrays
1417#define PNANOVDB_GRIDBLINDMETADATA_CLASS_ATTRIBUTE_ARRAY 2 // attributes typically associated with points
1418#define PNANOVDB_GRIDBLINDMETADATA_CLASS_GRID_NAME 3 // grid names of length longer than 256 characters
1419#define PNANOVDB_GRIDBLINDMETADATA_CLASS_CHANNEL_ARRAY 4 // channel of values typically used by index grids
1420#define PNANOVDB_GRIDBLINDMETADATA_CLASS_END 5
1421
1422#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_UNKNOWN 0
1423#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_POINT_POSITION 1 // 3D coordinates in an unknown space
1424#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_POINT_COLOR 2 // color associated with point
1425#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_POINT_NORMAL 3 // normal associated with point
1426#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_POINT_RADIUS 4 // radius of point
1427#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_POINT_VELOCITY 5 // velocity associated with point
1428#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_POINT_ID 6 // integer ID of point
1429#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_WORLD_COORDS 7 // 3D coordinates in world space, e.g. (0.056, 0.8, 1,8)
1430#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_GRID_COORDS 8 // 3D coordinates in grid space, e.g. (1.2, 4.0, 5.7), aka index-space
1431#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_VOXEL_COORDS 9 // 3D coordinates in voxel space, e.g. (0.2, 0.0, 0.7)
1432#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_LEVEL_SET 10 // narrow band level set, e.g. SDF
1433#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_FOG_VOLUME 11 // fog volume, e.g. density
1434#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_STAGGERED 12 // staggered MAC grid, e.g. velocity
1435#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_POINT_OPACITY 13 // opacity associated with point
1436#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_POINT_QUAT 14 // quaternion rotation, wxyz convention
1437#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_POINT_SCALE 15 // vec3 scale
1438#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_POINT_SH0 16 // spherical harmonics, DC component
1439#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_POINT_SHN 17 // spherical haromnics, AC components
1440#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_LINE_ID 18 // integer ID of line
1441#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_TRIANGLE_ID 19 // integer ID of triangle
1442#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_GAUSSIAN_ID 20 // integer ID of Gaussian
1443#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_RANGE 21 // begin/end pair of indices
1444#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_VOXEL_BVH 22 // voxelbvh 64-bit voxel value
1445#define PNANOVDB_GRIDBLINDMETADATA_SEMANTIC_END 23
1446
1448{
1449 pnanovdb_int64_t data_offset; // 8 bytes, 0
1450 pnanovdb_uint64_t value_count; // 8 bytes, 8
1451 pnanovdb_uint32_t value_size; // 4 bytes, 16
1452 pnanovdb_uint32_t semantic; // 4 bytes, 20
1453 pnanovdb_uint32_t data_class; // 4 bytes, 24
1454 pnanovdb_uint32_t data_type; // 4 bytes, 28
1455 pnanovdb_uint32_t name[256 / 4]; // 256 bytes, 32
1456};
1457PNANOVDB_STRUCT_TYPEDEF(pnanovdb_gridblindmetadata_t)
1458struct pnanovdb_gridblindmetadata_handle_t { pnanovdb_address_t address; };
1459PNANOVDB_STRUCT_TYPEDEF(pnanovdb_gridblindmetadata_handle_t)
1460
1461#define PNANOVDB_GRIDBLINDMETADATA_SIZE 288
1462
1463#define PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_OFFSET 0
1464#define PNANOVDB_GRIDBLINDMETADATA_OFF_VALUE_COUNT 8
1465#define PNANOVDB_GRIDBLINDMETADATA_OFF_VALUE_SIZE 16
1466#define PNANOVDB_GRIDBLINDMETADATA_OFF_SEMANTIC 20
1467#define PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_CLASS 24
1468#define PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_TYPE 28
1469#define PNANOVDB_GRIDBLINDMETADATA_OFF_NAME 32
1470
1471PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_gridblindmetadata_get_data_offset(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
1472 return pnanovdb_read_int64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_OFFSET));
1473}
1474PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_gridblindmetadata_get_value_count(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
1475 return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_VALUE_COUNT));
1476}
1477PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_value_size(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
1478 return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_VALUE_SIZE));
1479}
1480PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_semantic(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
1481 return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_SEMANTIC));
1482}
1483PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_data_class(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
1484 return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_CLASS));
1485}
1486PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_data_type(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p) {
1487 return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_TYPE));
1488}
1489PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_name(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_uint32_t index) {
1490 return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_NAME + 4u * index));
1491}
1492
1493PNANOVDB_FORCE_INLINE void pnanovdb_gridblindmetadata_set_data_offset(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_int64_t data_offset) {
1494 pnanovdb_write_int64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_OFFSET), data_offset);
1495}
1496PNANOVDB_FORCE_INLINE void pnanovdb_gridblindmetadata_set_value_count(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_uint64_t value_count) {
1497 pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_VALUE_COUNT), value_count);
1498}
1499PNANOVDB_FORCE_INLINE void pnanovdb_gridblindmetadata_set_value_size(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_uint32_t value_size) {
1500 pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_VALUE_SIZE), value_size);
1501}
1502PNANOVDB_FORCE_INLINE void pnanovdb_gridblindmetadata_set_semantic(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_uint32_t semantic) {
1503 pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_SEMANTIC), semantic);
1504}
1505PNANOVDB_FORCE_INLINE void pnanovdb_gridblindmetadata_set_data_class(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_uint32_t data_class) {
1506 pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_CLASS), data_class);
1507}
1508PNANOVDB_FORCE_INLINE void pnanovdb_gridblindmetadata_set_data_type(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_uint32_t data_type) {
1509 pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_TYPE), data_type);
1510}
1511PNANOVDB_FORCE_INLINE void pnanovdb_gridblindmetadata_set_name(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_uint32_t index, pnanovdb_uint32_t name) {
1512 pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_GRIDBLINDMETADATA_OFF_NAME + 4u * index), name);
1513}
1514
1516{
1517 pnanovdb_uint64_t node_offset_leaf;
1518 pnanovdb_uint64_t node_offset_lower;
1519 pnanovdb_uint64_t node_offset_upper;
1520 pnanovdb_uint64_t node_offset_root;
1521 pnanovdb_uint32_t node_count_leaf;
1522 pnanovdb_uint32_t node_count_lower;
1523 pnanovdb_uint32_t node_count_upper;
1524 pnanovdb_uint32_t tile_count_lower;
1525 pnanovdb_uint32_t tile_count_upper;
1526 pnanovdb_uint32_t tile_count_root;
1527 pnanovdb_uint64_t voxel_count;
1528};
1529PNANOVDB_STRUCT_TYPEDEF(pnanovdb_tree_t)
1530struct pnanovdb_tree_handle_t { pnanovdb_address_t address; };
1531PNANOVDB_STRUCT_TYPEDEF(pnanovdb_tree_handle_t)
1532
1533#define PNANOVDB_TREE_SIZE 64
1534
1535#define PNANOVDB_TREE_OFF_NODE_OFFSET_LEAF 0
1536#define PNANOVDB_TREE_OFF_NODE_OFFSET_LOWER 8
1537#define PNANOVDB_TREE_OFF_NODE_OFFSET_UPPER 16
1538#define PNANOVDB_TREE_OFF_NODE_OFFSET_ROOT 24
1539#define PNANOVDB_TREE_OFF_NODE_COUNT_LEAF 32
1540#define PNANOVDB_TREE_OFF_NODE_COUNT_LOWER 36
1541#define PNANOVDB_TREE_OFF_NODE_COUNT_UPPER 40
1542#define PNANOVDB_TREE_OFF_TILE_COUNT_LOWER 44
1543#define PNANOVDB_TREE_OFF_TILE_COUNT_UPPER 48
1544#define PNANOVDB_TREE_OFF_TILE_COUNT_ROOT 52
1545#define PNANOVDB_TREE_OFF_VOXEL_COUNT 56
1546
1547PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_node_offset_leaf(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
1548 return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_OFFSET_LEAF));
1549}
1550PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_node_offset_lower(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
1551 return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_OFFSET_LOWER));
1552}
1553PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_node_offset_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
1554 return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_OFFSET_UPPER));
1555}
1556PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_node_offset_root(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
1557 return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_OFFSET_ROOT));
1558}
1559PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_node_count_leaf(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
1560 return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_COUNT_LEAF));
1561}
1562PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_node_count_lower(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
1563 return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_COUNT_LOWER));
1564}
1565PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_node_count_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
1566 return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_COUNT_UPPER));
1567}
1568PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_tile_count_lower(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
1569 return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_TILE_COUNT_LOWER));
1570}
1571PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_tile_count_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
1572 return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_TILE_COUNT_UPPER));
1573}
1574PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_tile_count_root(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
1575 return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_TILE_COUNT_ROOT));
1576}
1577PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_voxel_count(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p) {
1578 return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_VOXEL_COUNT));
1579}
1580
1581PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_node_offset_leaf(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint64_t node_offset_leaf) {
1582 pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_OFFSET_LEAF), node_offset_leaf);
1583}
1584PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_node_offset_lower(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint64_t node_offset_lower) {
1585 pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_OFFSET_LOWER), node_offset_lower);
1586}
1587PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_node_offset_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint64_t node_offset_upper) {
1588 pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_OFFSET_UPPER), node_offset_upper);
1589}
1590PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_node_offset_root(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint64_t node_offset_root) {
1591 pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_OFFSET_ROOT), node_offset_root);
1592}
1593PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_node_count_leaf(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint32_t node_count_leaf) {
1594 pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_COUNT_LEAF), node_count_leaf);
1595}
1596PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_node_count_lower(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint32_t node_count_lower) {
1597 pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_COUNT_LOWER), node_count_lower);
1598}
1599PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_node_count_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint32_t node_count_upper) {
1600 pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_NODE_COUNT_UPPER), node_count_upper);
1601}
1602PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_tile_count_lower(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint32_t tile_count_lower) {
1603 pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_TILE_COUNT_LOWER), tile_count_lower);
1604}
1605PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_tile_count_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint32_t tile_count_upper) {
1606 pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_TILE_COUNT_UPPER), tile_count_upper);
1607}
1608PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_tile_count_root(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint32_t tile_count_root) {
1609 pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_TILE_COUNT_ROOT), tile_count_root);
1610}
1611PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_voxel_count(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint64_t voxel_count) {
1612 pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_TREE_OFF_VOXEL_COUNT), voxel_count);
1613}
1614
1616{
1617 pnanovdb_coord_t bbox_min;
1618 pnanovdb_coord_t bbox_max;
1619 pnanovdb_uint32_t table_size;
1620 pnanovdb_uint32_t pad1; // background can start here
1621 // background, min, max
1622};
1623PNANOVDB_STRUCT_TYPEDEF(pnanovdb_root_t)
1624struct pnanovdb_root_handle_t { pnanovdb_address_t address; };
1625PNANOVDB_STRUCT_TYPEDEF(pnanovdb_root_handle_t)
1626
1627#define PNANOVDB_ROOT_BASE_SIZE 28
1628
1629#define PNANOVDB_ROOT_OFF_BBOX_MIN 0
1630#define PNANOVDB_ROOT_OFF_BBOX_MAX 12
1631#define PNANOVDB_ROOT_OFF_TABLE_SIZE 24
1632
1633PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_root_get_bbox_min(pnanovdb_buf_t buf, pnanovdb_root_handle_t p) {
1634 return pnanovdb_read_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_OFF_BBOX_MIN));
1635}
1636PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_root_get_bbox_max(pnanovdb_buf_t buf, pnanovdb_root_handle_t p) {
1637 return pnanovdb_read_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_OFF_BBOX_MAX));
1638}
1639PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_root_get_tile_count(pnanovdb_buf_t buf, pnanovdb_root_handle_t p) {
1640 return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_OFF_TABLE_SIZE));
1641}
1642
1643PNANOVDB_FORCE_INLINE void pnanovdb_root_set_bbox_min(pnanovdb_buf_t buf, pnanovdb_root_handle_t p, PNANOVDB_IN(pnanovdb_coord_t) bbox_min) {
1644 pnanovdb_write_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_OFF_BBOX_MIN), bbox_min);
1645}
1646PNANOVDB_FORCE_INLINE void pnanovdb_root_set_bbox_max(pnanovdb_buf_t buf, pnanovdb_root_handle_t p, PNANOVDB_IN(pnanovdb_coord_t) bbox_max) {
1647 pnanovdb_write_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_OFF_BBOX_MAX), bbox_max);
1648}
1649PNANOVDB_FORCE_INLINE void pnanovdb_root_set_tile_count(pnanovdb_buf_t buf, pnanovdb_root_handle_t p, pnanovdb_uint32_t tile_count) {
1650 pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_OFF_TABLE_SIZE), tile_count);
1651}
1652
1654{
1655 pnanovdb_uint64_t key;
1656 pnanovdb_int64_t child; // signed byte offset from root to the child node, 0 means it is a constant tile, so use value
1657 pnanovdb_uint32_t state;
1658 pnanovdb_uint32_t pad1; // value can start here
1659 // value
1660};
1661PNANOVDB_STRUCT_TYPEDEF(pnanovdb_root_tile_t)
1662struct pnanovdb_root_tile_handle_t { pnanovdb_address_t address; };
1663PNANOVDB_STRUCT_TYPEDEF(pnanovdb_root_tile_handle_t)
1664
1665#define PNANOVDB_ROOT_TILE_BASE_SIZE 20
1666
1667#define PNANOVDB_ROOT_TILE_OFF_KEY 0
1668#define PNANOVDB_ROOT_TILE_OFF_CHILD 8
1669#define PNANOVDB_ROOT_TILE_OFF_STATE 16
1670
1671PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_root_tile_get_key(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t p) {
1672 return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_TILE_OFF_KEY));
1673}
1674PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_root_tile_get_child(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t p) {
1675 return pnanovdb_read_int64(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_TILE_OFF_CHILD));
1676}
1677PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_root_tile_get_state(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t p) {
1678 return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_TILE_OFF_STATE));
1679}
1680
1681PNANOVDB_FORCE_INLINE void pnanovdb_root_tile_set_key(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t p, pnanovdb_uint64_t key) {
1682 pnanovdb_write_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_TILE_OFF_KEY), key);
1683}
1684PNANOVDB_FORCE_INLINE void pnanovdb_root_tile_set_child(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t p, pnanovdb_int64_t child) {
1685 pnanovdb_write_int64(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_TILE_OFF_CHILD), child);
1686}
1687PNANOVDB_FORCE_INLINE void pnanovdb_root_tile_set_state(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t p, pnanovdb_uint32_t state) {
1688 pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_ROOT_TILE_OFF_STATE), state);
1689}
1690
1692{
1693 pnanovdb_coord_t bbox_min;
1694 pnanovdb_coord_t bbox_max;
1695 pnanovdb_uint64_t flags;
1696 pnanovdb_uint32_t value_mask[1024];
1697 pnanovdb_uint32_t child_mask[1024];
1698 // min, max
1699 // alignas(32) pnanovdb_uint32_t table[];
1700};
1701PNANOVDB_STRUCT_TYPEDEF(pnanovdb_upper_t)
1702struct pnanovdb_upper_handle_t { pnanovdb_address_t address; };
1703PNANOVDB_STRUCT_TYPEDEF(pnanovdb_upper_handle_t)
1704
1705#define PNANOVDB_UPPER_TABLE_COUNT 32768
1706#define PNANOVDB_UPPER_BASE_SIZE 8224
1707
1708#define PNANOVDB_UPPER_OFF_BBOX_MIN 0
1709#define PNANOVDB_UPPER_OFF_BBOX_MAX 12
1710#define PNANOVDB_UPPER_OFF_FLAGS 24
1711#define PNANOVDB_UPPER_OFF_VALUE_MASK 32
1712#define PNANOVDB_UPPER_OFF_CHILD_MASK 4128
1713
1714PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_upper_get_bbox_min(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p) {
1715 return pnanovdb_read_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_BBOX_MIN));
1716}
1717PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_upper_get_bbox_max(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p) {
1718 return pnanovdb_read_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_BBOX_MAX));
1719}
1720PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_upper_get_flags(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p) {
1721 return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_FLAGS));
1722}
1723PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_upper_get_value_mask(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p, pnanovdb_uint32_t bit_index) {
1724 pnanovdb_uint32_t value = pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_VALUE_MASK + 4u * (bit_index >> 5u)));
1725 return ((value >> (bit_index & 31u)) & 1) != 0u;
1726}
1727PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_upper_get_child_mask(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p, pnanovdb_uint32_t bit_index) {
1728 pnanovdb_uint32_t value = pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_CHILD_MASK + 4u * (bit_index >> 5u)));
1729 return ((value >> (bit_index & 31u)) & 1) != 0u;
1730}
1731
1732PNANOVDB_FORCE_INLINE void pnanovdb_upper_set_bbox_min(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p, PNANOVDB_IN(pnanovdb_coord_t) bbox_min) {
1733 pnanovdb_write_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_BBOX_MIN), bbox_min);
1734}
1735PNANOVDB_FORCE_INLINE void pnanovdb_upper_set_bbox_max(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p, PNANOVDB_IN(pnanovdb_coord_t) bbox_max) {
1736 pnanovdb_write_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_BBOX_MAX), bbox_max);
1737}
1738PNANOVDB_FORCE_INLINE void pnanovdb_upper_set_value_mask(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p, pnanovdb_uint32_t bit_index, pnanovdb_bool_t value) {
1739 pnanovdb_address_t addr = pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_VALUE_MASK + 4u * (bit_index >> 5u));
1740 pnanovdb_uint32_t valueMask = pnanovdb_read_uint32(buf, addr);
1741 if (!value) { valueMask &= ~(1u << (bit_index & 31u)); }
1742 if (value) valueMask |= (1u << (bit_index & 31u));
1743 pnanovdb_write_uint32(buf, addr, valueMask);
1744}
1745PNANOVDB_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) {
1746 pnanovdb_address_t addr = pnanovdb_address_offset(p.address, PNANOVDB_UPPER_OFF_CHILD_MASK + 4u * (bit_index >> 5u));
1747 pnanovdb_uint32_t valueMask = pnanovdb_read_uint32(buf, addr);
1748 if (!value) { valueMask &= ~(1u << (bit_index & 31u)); }
1749 if (value) valueMask |= (1u << (bit_index & 31u));
1750 pnanovdb_write_uint32(buf, addr, valueMask);
1751}
1752
1754{
1755 pnanovdb_coord_t bbox_min;
1756 pnanovdb_coord_t bbox_max;
1757 pnanovdb_uint64_t flags;
1758 pnanovdb_uint32_t value_mask[128];
1759 pnanovdb_uint32_t child_mask[128];
1760 // min, max
1761 // alignas(32) pnanovdb_uint32_t table[];
1762};
1763PNANOVDB_STRUCT_TYPEDEF(pnanovdb_lower_t)
1764struct pnanovdb_lower_handle_t { pnanovdb_address_t address; };
1765PNANOVDB_STRUCT_TYPEDEF(pnanovdb_lower_handle_t)
1766
1767#define PNANOVDB_LOWER_TABLE_COUNT 4096
1768#define PNANOVDB_LOWER_BASE_SIZE 1056
1769
1770#define PNANOVDB_LOWER_OFF_BBOX_MIN 0
1771#define PNANOVDB_LOWER_OFF_BBOX_MAX 12
1772#define PNANOVDB_LOWER_OFF_FLAGS 24
1773#define PNANOVDB_LOWER_OFF_VALUE_MASK 32
1774#define PNANOVDB_LOWER_OFF_CHILD_MASK 544
1775
1776PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_lower_get_bbox_min(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p) {
1777 return pnanovdb_read_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_BBOX_MIN));
1778}
1779PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_lower_get_bbox_max(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p) {
1780 return pnanovdb_read_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_BBOX_MAX));
1781}
1782PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_lower_get_flags(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p) {
1783 return pnanovdb_read_uint64(buf, pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_FLAGS));
1784}
1785PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_lower_get_value_mask(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p, pnanovdb_uint32_t bit_index) {
1786 pnanovdb_uint32_t value = pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_VALUE_MASK + 4u * (bit_index >> 5u)));
1787 return ((value >> (bit_index & 31u)) & 1) != 0u;
1788}
1789PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_lower_get_child_mask(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p, pnanovdb_uint32_t bit_index) {
1790 pnanovdb_uint32_t value = pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_CHILD_MASK + 4u * (bit_index >> 5u)));
1791 return ((value >> (bit_index & 31u)) & 1) != 0u;
1792}
1793
1794PNANOVDB_FORCE_INLINE void pnanovdb_lower_set_bbox_min(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p, PNANOVDB_IN(pnanovdb_coord_t) bbox_min) {
1795 pnanovdb_write_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_BBOX_MIN), bbox_min);
1796}
1797PNANOVDB_FORCE_INLINE void pnanovdb_lower_set_bbox_max(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p, PNANOVDB_IN(pnanovdb_coord_t) bbox_max) {
1798 pnanovdb_write_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_BBOX_MAX), bbox_max);
1799}
1800PNANOVDB_FORCE_INLINE void pnanovdb_lower_set_value_mask(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p, pnanovdb_uint32_t bit_index, pnanovdb_bool_t value) {
1801 pnanovdb_address_t addr = pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_VALUE_MASK + 4u * (bit_index >> 5u));
1802 pnanovdb_uint32_t valueMask = pnanovdb_read_uint32(buf, addr);
1803 if (!value) { valueMask &= ~(1u << (bit_index & 31u)); }
1804 if (value) valueMask |= (1u << (bit_index & 31u));
1805 pnanovdb_write_uint32(buf, addr, valueMask);
1806}
1807PNANOVDB_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) {
1808 pnanovdb_address_t addr = pnanovdb_address_offset(p.address, PNANOVDB_LOWER_OFF_CHILD_MASK + 4u * (bit_index >> 5u));
1809 pnanovdb_uint32_t valueMask = pnanovdb_read_uint32(buf, addr);
1810 if (!value) { valueMask &= ~(1u << (bit_index & 31u)); }
1811 if (value) valueMask |= (1u << (bit_index & 31u));
1812 pnanovdb_write_uint32(buf, addr, valueMask);
1813}
1814
1816{
1817 pnanovdb_coord_t bbox_min;
1818 pnanovdb_uint32_t bbox_dif_and_flags;
1819 pnanovdb_uint32_t value_mask[16];
1820 // min, max
1821 // alignas(32) pnanovdb_uint32_t values[];
1822};
1823PNANOVDB_STRUCT_TYPEDEF(pnanovdb_leaf_t)
1824struct pnanovdb_leaf_handle_t { pnanovdb_address_t address; };
1825PNANOVDB_STRUCT_TYPEDEF(pnanovdb_leaf_handle_t)
1826
1827#define PNANOVDB_LEAF_TABLE_COUNT 512
1828#define PNANOVDB_LEAF_BASE_SIZE 80
1829
1830#define PNANOVDB_LEAF_OFF_BBOX_MIN 0
1831#define PNANOVDB_LEAF_OFF_BBOX_DIF_AND_FLAGS 12
1832#define PNANOVDB_LEAF_OFF_VALUE_MASK 16
1833
1834#define PNANOVDB_LEAF_TABLE_NEG_OFF_BBOX_DIF_AND_FLAGS 84
1835#define PNANOVDB_LEAF_TABLE_NEG_OFF_MINIMUM 16
1836#define PNANOVDB_LEAF_TABLE_NEG_OFF_QUANTUM 12
1837
1838PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_leaf_get_bbox_min(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t p) {
1839 return pnanovdb_read_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_LEAF_OFF_BBOX_MIN));
1840}
1841PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_leaf_get_bbox_dif_and_flags(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t p) {
1842 return pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_LEAF_OFF_BBOX_DIF_AND_FLAGS));
1843}
1844PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_get_value_mask(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t p, pnanovdb_uint32_t bit_index) {
1845 pnanovdb_uint32_t value = pnanovdb_read_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_LEAF_OFF_VALUE_MASK + 4u * (bit_index >> 5u)));
1846 return ((value >> (bit_index & 31u)) & 1) != 0u;
1847}
1848
1849PNANOVDB_FORCE_INLINE void pnanovdb_leaf_set_bbox_min(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t p, PNANOVDB_IN(pnanovdb_coord_t) bbox_min) {
1850 pnanovdb_write_coord(buf, pnanovdb_address_offset(p.address, PNANOVDB_LEAF_OFF_BBOX_MIN), bbox_min);
1851}
1852PNANOVDB_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) {
1853 pnanovdb_write_uint32(buf, pnanovdb_address_offset(p.address, PNANOVDB_LEAF_OFF_BBOX_DIF_AND_FLAGS), bbox_dif_and_flags);
1854}
1855PNANOVDB_FORCE_INLINE void pnanovdb_leaf_set_value_mask(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t p, pnanovdb_uint32_t bit_index, pnanovdb_bool_t value) {
1856 pnanovdb_address_t addr = pnanovdb_address_offset(p.address, PNANOVDB_LEAF_OFF_VALUE_MASK + 4u * (bit_index >> 5u));
1857 pnanovdb_uint32_t valueMask = pnanovdb_read_uint32(buf, addr);
1858 if (!value) { valueMask &= ~(1u << (bit_index & 31u)); }
1859 if (value) valueMask |= (1u << (bit_index & 31u));
1860 pnanovdb_write_uint32(buf, addr, valueMask);
1861}
1862
1864{
1865 pnanovdb_uint32_t root_off_background;
1866 pnanovdb_uint32_t root_off_min;
1867 pnanovdb_uint32_t root_off_max;
1868 pnanovdb_uint32_t root_off_ave;
1869 pnanovdb_uint32_t root_off_stddev;
1870 pnanovdb_uint32_t root_size;
1871 pnanovdb_uint32_t value_stride_bits;
1872 pnanovdb_uint32_t table_stride;
1873 pnanovdb_uint32_t root_tile_off_value;
1874 pnanovdb_uint32_t root_tile_size;
1875 pnanovdb_uint32_t upper_off_min;
1876 pnanovdb_uint32_t upper_off_max;
1877 pnanovdb_uint32_t upper_off_ave;
1878 pnanovdb_uint32_t upper_off_stddev;
1879 pnanovdb_uint32_t upper_off_table;
1880 pnanovdb_uint32_t upper_size;
1881 pnanovdb_uint32_t lower_off_min;
1882 pnanovdb_uint32_t lower_off_max;
1883 pnanovdb_uint32_t lower_off_ave;
1884 pnanovdb_uint32_t lower_off_stddev;
1885 pnanovdb_uint32_t lower_off_table;
1886 pnanovdb_uint32_t lower_size;
1887 pnanovdb_uint32_t leaf_off_min;
1888 pnanovdb_uint32_t leaf_off_max;
1889 pnanovdb_uint32_t leaf_off_ave;
1890 pnanovdb_uint32_t leaf_off_stddev;
1891 pnanovdb_uint32_t leaf_off_table;
1892 pnanovdb_uint32_t leaf_size;
1893};
1894PNANOVDB_STRUCT_TYPEDEF(pnanovdb_grid_type_constants_t)
1895
1896// The following table with offsets will nedd to be updates as new GridTypes are added in NanoVDB.h
1898{
1899{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},
1900{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},
1901{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},
1902{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},
1903{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},
1904{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},
1905{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},
1906{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},
1907{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},
1908{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},
1909{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},
1910{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},
1911{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},
1912{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},
1913{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},
1914{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},
1915{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},
1916{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},
1917{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},
1918{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},
1919{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},
1920{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},
1921{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},
1922{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},
1923{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},
1924{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},
1925{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},
1926{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},
1927};
1928
1929// ------------------------------------------------ Basic Lookup -----------------------------------------------------------
1930
1931PNANOVDB_FORCE_INLINE pnanovdb_gridblindmetadata_handle_t pnanovdb_grid_get_gridblindmetadata(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, pnanovdb_uint32_t index)
1932{
1934 pnanovdb_uint64_t byte_offset = pnanovdb_grid_get_blind_metadata_offset(buf, grid);
1935 meta.address = pnanovdb_address_offset64(meta.address, byte_offset);
1936 meta.address = pnanovdb_address_offset_product(meta.address, PNANOVDB_GRIDBLINDMETADATA_SIZE, index);
1937 return meta;
1938}
1939
1940PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_grid_get_gridblindmetadata_value_address(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, pnanovdb_uint32_t index)
1941{
1943 pnanovdb_int64_t byte_offset = pnanovdb_gridblindmetadata_get_data_offset(buf, meta);
1944 pnanovdb_address_t address = pnanovdb_address_offset64(meta.address, pnanovdb_int64_as_uint64(byte_offset));
1945 return address;
1946}
1947
1948PNANOVDB_FORCE_INLINE pnanovdb_tree_handle_t pnanovdb_grid_get_tree(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid)
1949{
1950 pnanovdb_tree_handle_t tree = { grid.address };
1951 tree.address = pnanovdb_address_offset(tree.address, PNANOVDB_GRID_SIZE);
1952 return tree;
1953}
1954
1955PNANOVDB_FORCE_INLINE pnanovdb_root_handle_t pnanovdb_tree_get_root(pnanovdb_buf_t buf, pnanovdb_tree_handle_t tree)
1956{
1957 pnanovdb_root_handle_t root = { tree.address };
1958 pnanovdb_uint64_t byte_offset = pnanovdb_tree_get_node_offset_root(buf, tree);
1959 root.address = pnanovdb_address_offset64(root.address, byte_offset);
1960 return root;
1961}
1962
1963PNANOVDB_FORCE_INLINE pnanovdb_root_tile_handle_t pnanovdb_root_get_tile(pnanovdb_grid_type_t grid_type, pnanovdb_root_handle_t root, pnanovdb_uint32_t n)
1964{
1965 pnanovdb_root_tile_handle_t tile = { root.address };
1966 tile.address = pnanovdb_address_offset(tile.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_size));
1967 tile.address = pnanovdb_address_offset_product(tile.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_tile_size), n);
1968 return tile;
1969}
1970
1971PNANOVDB_FORCE_INLINE pnanovdb_root_tile_handle_t pnanovdb_root_get_tile_zero(pnanovdb_grid_type_t grid_type, pnanovdb_root_handle_t root)
1972{
1973 pnanovdb_root_tile_handle_t tile = { root.address };
1974 tile.address = pnanovdb_address_offset(tile.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_size));
1975 return tile;
1976}
1977
1978PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_root_tile_get_child_mask(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t tile)
1979{
1980 return !pnanovdb_int64_is_zero(pnanovdb_root_tile_get_child(buf, tile));
1981}
1982
1983PNANOVDB_FORCE_INLINE pnanovdb_upper_handle_t pnanovdb_root_get_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, pnanovdb_root_tile_handle_t tile)
1984{
1985 pnanovdb_upper_handle_t upper = { root.address };
1986 upper.address = pnanovdb_address_offset64(upper.address, pnanovdb_int64_as_uint64(pnanovdb_root_tile_get_child(buf, tile)));
1987 return upper;
1988}
1989
1990PNANOVDB_FORCE_INLINE void pnanovdb_root_set_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, pnanovdb_root_tile_handle_t tile, pnanovdb_upper_handle_t upper)
1991{
1992 pnanovdb_root_tile_set_child(buf, tile, pnanovdb_address_diff(upper.address, root.address));
1993}
1994
1995PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_coord_to_key(PNANOVDB_IN(pnanovdb_coord_t) ijk)
1996{
1997#if defined(PNANOVDB_NATIVE_64)
1998 pnanovdb_uint64_t iu = pnanovdb_int32_as_uint32(PNANOVDB_DEREF(ijk).x) >> 12u;
1999 pnanovdb_uint64_t ju = pnanovdb_int32_as_uint32(PNANOVDB_DEREF(ijk).y) >> 12u;
2000 pnanovdb_uint64_t ku = pnanovdb_int32_as_uint32(PNANOVDB_DEREF(ijk).z) >> 12u;
2001 return (ku) | (ju << 21u) | (iu << 42u);
2002#else
2003 pnanovdb_uint32_t iu = pnanovdb_int32_as_uint32(PNANOVDB_DEREF(ijk).x) >> 12u;
2004 pnanovdb_uint32_t ju = pnanovdb_int32_as_uint32(PNANOVDB_DEREF(ijk).y) >> 12u;
2005 pnanovdb_uint32_t ku = pnanovdb_int32_as_uint32(PNANOVDB_DEREF(ijk).z) >> 12u;
2006 pnanovdb_uint32_t key_x = ku | (ju << 21);
2007 pnanovdb_uint32_t key_y = (iu << 10) | (ju >> 11);
2008 return pnanovdb_uint32_as_uint64(key_x, key_y);
2009#endif
2010}
2011
2012PNANOVDB_FORCE_INLINE pnanovdb_root_tile_handle_t pnanovdb_root_find_tile(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk)
2013{
2014 pnanovdb_uint32_t tile_count = pnanovdb_uint32_as_int32(pnanovdb_root_get_tile_count(buf, root));
2016 pnanovdb_uint64_t key = pnanovdb_coord_to_key(ijk);
2017 for (pnanovdb_uint32_t i = 0u; i < tile_count; i++)
2018 {
2019 if (pnanovdb_uint64_is_equal(key, pnanovdb_root_tile_get_key(buf, tile)))
2020 {
2021 return tile;
2022 }
2023 tile.address = pnanovdb_address_offset(tile.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_tile_size));
2024 }
2025 pnanovdb_root_tile_handle_t null_handle = { pnanovdb_address_null() };
2026 return null_handle;
2027}
2028
2029// ----------------------------- Grid Type Safe Set ---------------------------------------
2030
2031PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_first_gridblindmetadata(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_gridblindmetadata_handle_t gridblindmetadata) {
2032 pnanovdb_grid_set_blind_metadata_offset(buf, p, pnanovdb_address_diff(gridblindmetadata.address, p.address));
2033}
2034
2035// ----------------------------- Tree Type Safe Set ---------------------------------------
2036
2037PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_first_leaf(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_leaf_handle_t leaf) {
2038 pnanovdb_tree_set_node_offset_leaf(buf, p, pnanovdb_address_diff(leaf.address, p.address));
2039}
2040PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_first_lower(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_lower_handle_t lower) {
2041 pnanovdb_tree_set_node_offset_lower(buf, p, pnanovdb_address_diff(lower.address, p.address));
2042}
2043PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_first_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_upper_handle_t upper) {
2044 pnanovdb_tree_set_node_offset_upper(buf, p, pnanovdb_address_diff(upper.address, p.address));
2045}
2046PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_first_root(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_root_handle_t root) {
2047 pnanovdb_tree_set_node_offset_root(buf, p, pnanovdb_address_diff(root.address, p.address));
2048}
2049
2050// ----------------------------- Leaf Node ---------------------------------------
2051
2052PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_leaf_coord_to_offset(PNANOVDB_IN(pnanovdb_coord_t) ijk)
2053{
2054 return (((PNANOVDB_DEREF(ijk).x & 7) >> 0) << (2 * 3)) +
2055 (((PNANOVDB_DEREF(ijk).y & 7) >> 0) << (3)) +
2056 ((PNANOVDB_DEREF(ijk).z & 7) >> 0);
2057}
2058
2059PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_min_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t node)
2060{
2061 pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, leaf_off_min);
2062 return pnanovdb_address_offset(node.address, byte_offset);
2063}
2064
2065PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_max_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t node)
2066{
2067 pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, leaf_off_max);
2068 return pnanovdb_address_offset(node.address, byte_offset);
2069}
2070
2071PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_ave_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t node)
2072{
2073 pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, leaf_off_ave);
2074 return pnanovdb_address_offset(node.address, byte_offset);
2075}
2076
2077PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_stddev_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t node)
2078{
2079 pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, leaf_off_stddev);
2080 return pnanovdb_address_offset(node.address, byte_offset);
2081}
2082
2083PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_table_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t node, pnanovdb_uint32_t n)
2084{
2085 pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, leaf_off_table) + ((PNANOVDB_GRID_TYPE_GET(grid_type, value_stride_bits) * n) >> 3u);
2086 return pnanovdb_address_offset(node.address, byte_offset);
2087}
2088
2089PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, PNANOVDB_IN(pnanovdb_coord_t) ijk)
2090{
2091 pnanovdb_uint32_t n = pnanovdb_leaf_coord_to_offset(ijk);
2092 return pnanovdb_leaf_get_table_address(grid_type, buf, leaf, n);
2093}
2094
2095// ----------------------------- Leaf FP Types Specialization ---------------------------------------
2096
2097PNANOVDB_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)
2098{
2099 // value_log_bits // 2 3 4
2100 pnanovdb_uint32_t value_bits = 1u << value_log_bits; // 4 8 16
2101 pnanovdb_uint32_t value_mask = (1u << value_bits) - 1u; // 0xF 0xFF 0xFFFF
2102 pnanovdb_uint32_t values_per_word_bits = 5u - value_log_bits; // 3 2 1
2103 pnanovdb_uint32_t values_per_word_mask = (1u << values_per_word_bits) - 1u; // 7 3 1
2104
2105 pnanovdb_uint32_t n = pnanovdb_leaf_coord_to_offset(ijk);
2106 float minimum = pnanovdb_read_float(buf, pnanovdb_address_offset_neg(address, PNANOVDB_LEAF_TABLE_NEG_OFF_MINIMUM));
2107 float quantum = pnanovdb_read_float(buf, pnanovdb_address_offset_neg(address, PNANOVDB_LEAF_TABLE_NEG_OFF_QUANTUM));
2108 pnanovdb_uint32_t raw = pnanovdb_read_uint32(buf, pnanovdb_address_offset(address, ((n >> values_per_word_bits) << 2u)));
2109 pnanovdb_uint32_t value_compressed = (raw >> ((n & values_per_word_mask) << value_log_bits)) & value_mask;
2110 return pnanovdb_uint32_to_float(value_compressed) * quantum + minimum;
2111}
2112
2113PNANOVDB_FORCE_INLINE float pnanovdb_leaf_fp4_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk)
2114{
2115 return pnanovdb_leaf_fp_read_float(buf, address, ijk, 2u);
2116}
2117
2118PNANOVDB_FORCE_INLINE float pnanovdb_leaf_fp8_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk)
2119{
2120 return pnanovdb_leaf_fp_read_float(buf, address, ijk, 3u);
2121}
2122
2123PNANOVDB_FORCE_INLINE float pnanovdb_leaf_fp16_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk)
2124{
2125 return pnanovdb_leaf_fp_read_float(buf, address, ijk, 4u);
2126}
2127
2128PNANOVDB_FORCE_INLINE float pnanovdb_leaf_fpn_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk)
2129{
2130 pnanovdb_uint32_t bbox_dif_and_flags = pnanovdb_read_uint32(buf, pnanovdb_address_offset_neg(address, PNANOVDB_LEAF_TABLE_NEG_OFF_BBOX_DIF_AND_FLAGS));
2131 pnanovdb_uint32_t flags = bbox_dif_and_flags >> 24u;
2132 pnanovdb_uint32_t value_log_bits = flags >> 5; // b = 0, 1, 2, 3, 4 corresponding to 1, 2, 4, 8, 16 bits
2133 return pnanovdb_leaf_fp_read_float(buf, address, ijk, value_log_bits);
2134}
2135
2136// ----------------------------- Leaf Index Specialization ---------------------------------------
2137
2138PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_index_has_stats(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
2139{
2140 return (pnanovdb_leaf_get_bbox_dif_and_flags(buf, leaf) & (1u << 28u)) != 0u;
2141}
2142
2143PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_index_get_min_index(pnanovdb_buf_t buf, pnanovdb_address_t min_address)
2144{
2145 return pnanovdb_uint64_offset(pnanovdb_read_uint64(buf, min_address), 512u);
2146}
2147
2148PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_index_get_max_index(pnanovdb_buf_t buf, pnanovdb_address_t max_address)
2149{
2150 return pnanovdb_uint64_offset(pnanovdb_read_uint64(buf, max_address), 513u);
2151}
2152
2153PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_index_get_ave_index(pnanovdb_buf_t buf, pnanovdb_address_t ave_address)
2154{
2155 return pnanovdb_uint64_offset(pnanovdb_read_uint64(buf, ave_address), 514u);
2156}
2157
2158PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_index_get_dev_index(pnanovdb_buf_t buf, pnanovdb_address_t dev_address)
2159{
2160 return pnanovdb_uint64_offset(pnanovdb_read_uint64(buf, dev_address), 515u);
2161}
2162
2163PNANOVDB_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)
2164{
2165 pnanovdb_uint32_t n = pnanovdb_leaf_coord_to_offset(ijk);
2166 pnanovdb_uint64_t offset = pnanovdb_read_uint64(buf, value_address);
2167 return pnanovdb_uint64_offset(offset, n);
2168}
2169
2170// ----------------------------- Leaf OnIndex Specialization ---------------------------------------
2171
2172PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_leaf_onindex_get_value_count(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
2173{
2174 pnanovdb_uint64_t val_mask = pnanovdb_read_uint64(buf, pnanovdb_address_offset(leaf.address, PNANOVDB_LEAF_OFF_VALUE_MASK + 8u * 7u));
2175 pnanovdb_uint64_t prefix_sum = pnanovdb_read_uint64(
2176 buf, pnanovdb_address_offset(leaf.address, PNANOVDB_GRID_TYPE_GET(PNANOVDB_GRID_TYPE_ONINDEX, leaf_off_table) + 8u));
2177 return pnanovdb_uint64_countbits(val_mask) + (pnanovdb_uint64_to_uint32_lsr(prefix_sum, 54u) & 511u);
2178}
2179
2180PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindex_get_last_offset(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
2181{
2183 pnanovdb_read_uint64(buf, pnanovdb_address_offset(leaf.address, PNANOVDB_GRID_TYPE_GET(PNANOVDB_GRID_TYPE_ONINDEX, leaf_off_table))),
2185}
2186
2187PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_onindex_has_stats(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
2188{
2189 return (pnanovdb_leaf_get_bbox_dif_and_flags(buf, leaf) & (1u << 28u)) != 0u;
2190}
2191
2192PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindex_get_min_index(pnanovdb_buf_t buf, pnanovdb_address_t min_address)
2193{
2194 pnanovdb_leaf_handle_t leaf = { pnanovdb_address_offset_neg(min_address, PNANOVDB_GRID_TYPE_GET(PNANOVDB_GRID_TYPE_ONINDEX, leaf_off_table)) };
2195 pnanovdb_uint64_t idx = pnanovdb_uint32_as_uint64_low(0u);
2196 if (pnanovdb_leaf_onindex_has_stats(buf, leaf))
2197 {
2199 }
2200 return idx;
2201}
2202
2203PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindex_get_max_index(pnanovdb_buf_t buf, pnanovdb_address_t max_address)
2204{
2205 pnanovdb_leaf_handle_t leaf = { pnanovdb_address_offset_neg(max_address, PNANOVDB_GRID_TYPE_GET(PNANOVDB_GRID_TYPE_ONINDEX, leaf_off_table)) };
2206 pnanovdb_uint64_t idx = pnanovdb_uint32_as_uint64_low(0u);
2207 if (pnanovdb_leaf_onindex_has_stats(buf, leaf))
2208 {
2210 }
2211 return idx;
2212}
2213
2214PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindex_get_ave_index(pnanovdb_buf_t buf, pnanovdb_address_t ave_address)
2215{
2216 pnanovdb_leaf_handle_t leaf = { pnanovdb_address_offset_neg(ave_address, PNANOVDB_GRID_TYPE_GET(PNANOVDB_GRID_TYPE_ONINDEX, leaf_off_table)) };
2217 pnanovdb_uint64_t idx = pnanovdb_uint32_as_uint64_low(0u);
2218 if (pnanovdb_leaf_onindex_has_stats(buf, leaf))
2219 {
2221 }
2222 return idx;
2223}
2224
2225PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindex_get_dev_index(pnanovdb_buf_t buf, pnanovdb_address_t dev_address)
2226{
2227 pnanovdb_leaf_handle_t leaf = { pnanovdb_address_offset_neg(dev_address, PNANOVDB_GRID_TYPE_GET(PNANOVDB_GRID_TYPE_ONINDEX, leaf_off_table)) };
2228 pnanovdb_uint64_t idx = pnanovdb_uint32_as_uint64_low(0u);
2229 if (pnanovdb_leaf_onindex_has_stats(buf, leaf))
2230 {
2232 }
2233 return idx;
2234}
2235
2236PNANOVDB_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)
2237{
2238 pnanovdb_uint32_t n = pnanovdb_leaf_coord_to_offset(ijk);
2239 pnanovdb_leaf_handle_t leaf = { pnanovdb_address_offset_neg(value_address, PNANOVDB_GRID_TYPE_GET(PNANOVDB_GRID_TYPE_ONINDEX, leaf_off_table)) };
2240
2241 pnanovdb_uint32_t word_idx = n >> 6u;
2242 pnanovdb_uint32_t bit_idx = n & 63u;
2243 pnanovdb_uint64_t val_mask = pnanovdb_read_uint64(buf, pnanovdb_address_offset(leaf.address, PNANOVDB_LEAF_OFF_VALUE_MASK + 8u * word_idx));
2244 pnanovdb_uint64_t mask = pnanovdb_uint64_bit_mask(bit_idx);
2245 pnanovdb_uint64_t value_index = pnanovdb_uint32_as_uint64_low(0u);
2246 if (pnanovdb_uint64_any_bit(pnanovdb_uint64_and(val_mask, mask)))
2247 {
2248 pnanovdb_uint32_t sum = 0u;
2250 if (word_idx > 0u)
2251 {
2252 pnanovdb_uint64_t prefix_sum = pnanovdb_read_uint64(buf, pnanovdb_address_offset(value_address, 8u));
2253 sum += pnanovdb_uint64_to_uint32_lsr(prefix_sum, 9u * (word_idx - 1u)) & 511u;
2254 }
2255 pnanovdb_uint64_t offset = pnanovdb_read_uint64(buf, value_address);
2256 value_index = pnanovdb_uint64_offset(offset, sum);
2257 }
2258 return value_index;
2259}
2260
2261// ----------------------------- Leaf PointIndex Specialization ---------------------------------------
2262
2263PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_pointindex_get_offset(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
2264{
2266}
2267PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_pointindex_get_point_count(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
2268{
2270}
2271PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_pointindex_get_first(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, pnanovdb_uint32_t i)
2272{
2275}
2276PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_pointindex_get_last(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, pnanovdb_uint32_t i)
2277{
2280}
2281PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_pointindex_get_value(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, pnanovdb_uint32_t i)
2282{
2283 return pnanovdb_uint32_as_uint64_low(pnanovdb_read_uint16(buf, pnanovdb_leaf_get_table_address(PNANOVDB_GRID_TYPE_POINTINDEX, buf, leaf, i)));
2284}
2285PNANOVDB_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)
2286{
2287 pnanovdb_address_t addr = pnanovdb_leaf_get_table_address(PNANOVDB_GRID_TYPE_POINTINDEX, buf, leaf, i);
2288 pnanovdb_uint32_t raw32 = pnanovdb_read_uint32(buf, pnanovdb_address_mask_inv(addr, 3u));
2289 if ((i & 1) == 0u)
2290 {
2291 raw32 = (raw32 & 0xFFFF0000) | (value & 0x0000FFFF);
2292 }
2293 else
2294 {
2295 raw32 = (raw32 & 0x0000FFFF) | (value << 16u);
2296 }
2297 pnanovdb_write_uint32(buf, addr, raw32);
2298}
2299PNANOVDB_FORCE_INLINE void pnanovdb_leaf_pointindex_set_on(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, pnanovdb_uint32_t i)
2300{
2301 pnanovdb_uint32_t word_idx = i >> 5;
2302 pnanovdb_uint32_t bit_idx = i & 31;
2303 pnanovdb_address_t addr = pnanovdb_address_offset(leaf.address, PNANOVDB_LEAF_OFF_VALUE_MASK + 4u * word_idx);
2304 pnanovdb_uint32_t val_mask = pnanovdb_read_uint32(buf, addr);
2305 val_mask = val_mask | (1u << bit_idx);
2306 pnanovdb_write_uint32(buf, addr, val_mask);
2307}
2308PNANOVDB_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)
2309{
2310 pnanovdb_leaf_pointindex_set_on(buf, leaf, i);
2311 pnanovdb_leaf_pointindex_set_value_only(buf, leaf, i, value);
2312}
2313
2314// ------------------------------------------------ Lower Node -----------------------------------------------------------
2315
2316PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_lower_coord_to_offset(PNANOVDB_IN(pnanovdb_coord_t) ijk)
2317{
2318 return (((PNANOVDB_DEREF(ijk).x & 127) >> 3) << (2 * 4)) +
2319 (((PNANOVDB_DEREF(ijk).y & 127) >> 3) << (4)) +
2320 ((PNANOVDB_DEREF(ijk).z & 127) >> 3);
2321}
2322
2323PNANOVDB_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)
2324{
2325 pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, lower_off_min);
2326 return pnanovdb_address_offset(node.address, byte_offset);
2327}
2328
2329PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_max_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node)
2330{
2331 pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, lower_off_max);
2332 return pnanovdb_address_offset(node.address, byte_offset);
2333}
2334
2335PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_ave_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node)
2336{
2337 pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, lower_off_ave);
2338 return pnanovdb_address_offset(node.address, byte_offset);
2339}
2340
2341PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_stddev_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node)
2342{
2343 pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, lower_off_stddev);
2344 return pnanovdb_address_offset(node.address, byte_offset);
2345}
2346
2347PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_table_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node, pnanovdb_uint32_t n)
2348{
2349 pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, lower_off_table) + PNANOVDB_GRID_TYPE_GET(grid_type, table_stride) * n;
2350 return pnanovdb_address_offset(node.address, byte_offset);
2351}
2352
2353PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_lower_get_table_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node, pnanovdb_uint32_t n)
2354{
2355 pnanovdb_address_t table_address = pnanovdb_lower_get_table_address(grid_type, buf, node, n);
2356 return pnanovdb_read_int64(buf, table_address);
2357}
2358
2359PNANOVDB_FORCE_INLINE pnanovdb_leaf_handle_t pnanovdb_lower_get_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, pnanovdb_uint32_t n)
2360{
2361 pnanovdb_leaf_handle_t leaf = { lower.address };
2362 leaf.address = pnanovdb_address_offset64(leaf.address, pnanovdb_int64_as_uint64(pnanovdb_lower_get_table_child(grid_type, buf, lower, n)));
2363 return leaf;
2364}
2365
2366PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_value_address_and_level(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
2367{
2368 pnanovdb_uint32_t n = pnanovdb_lower_coord_to_offset(ijk);
2369 pnanovdb_address_t value_address;
2370 if (pnanovdb_lower_get_child_mask(buf, lower, n))
2371 {
2372 pnanovdb_leaf_handle_t child = pnanovdb_lower_get_child(grid_type, buf, lower, n);
2373 value_address = pnanovdb_leaf_get_value_address(grid_type, buf, child, ijk);
2374 PNANOVDB_DEREF(level) = 0u;
2375 }
2376 else
2377 {
2378 value_address = pnanovdb_lower_get_table_address(grid_type, buf, lower, n);
2379 PNANOVDB_DEREF(level) = 1u;
2380 }
2381 return value_address;
2382}
2383
2384PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, PNANOVDB_IN(pnanovdb_coord_t) ijk)
2385{
2386 pnanovdb_uint32_t level;
2387 return pnanovdb_lower_get_value_address_and_level(grid_type, buf, lower, ijk, PNANOVDB_REF(level));
2388}
2389
2390PNANOVDB_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)
2391{
2392 pnanovdb_address_t table_address = pnanovdb_lower_get_table_address(grid_type, buf, node, n);
2393 pnanovdb_write_int64(buf, table_address, child);
2394}
2395
2396PNANOVDB_FORCE_INLINE void pnanovdb_lower_set_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, pnanovdb_uint32_t n, pnanovdb_leaf_handle_t leaf)
2397{
2398 pnanovdb_lower_set_table_child(grid_type, buf, lower, n, pnanovdb_address_diff(leaf.address, lower.address));
2399}
2400
2401// ------------------------------------------------ Upper Node -----------------------------------------------------------
2402
2403PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_upper_coord_to_offset(PNANOVDB_IN(pnanovdb_coord_t) ijk)
2404{
2405 return (((PNANOVDB_DEREF(ijk).x & 4095) >> 7) << (2 * 5)) +
2406 (((PNANOVDB_DEREF(ijk).y & 4095) >> 7) << (5)) +
2407 ((PNANOVDB_DEREF(ijk).z & 4095) >> 7);
2408}
2409
2410PNANOVDB_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)
2411{
2412 pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, upper_off_min);
2413 return pnanovdb_address_offset(node.address, byte_offset);
2414}
2415
2416PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_max_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t node)
2417{
2418 pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, upper_off_max);
2419 return pnanovdb_address_offset(node.address, byte_offset);
2420}
2421
2422PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_ave_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t node)
2423{
2424 pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, upper_off_ave);
2425 return pnanovdb_address_offset(node.address, byte_offset);
2426}
2427
2428PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_stddev_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t node)
2429{
2430 pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, upper_off_stddev);
2431 return pnanovdb_address_offset(node.address, byte_offset);
2432}
2433
2434PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_table_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t node, pnanovdb_uint32_t n)
2435{
2436 pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, upper_off_table) + PNANOVDB_GRID_TYPE_GET(grid_type, table_stride) * n;
2437 return pnanovdb_address_offset(node.address, byte_offset);
2438}
2439
2440PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_upper_get_table_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t node, pnanovdb_uint32_t n)
2441{
2442 pnanovdb_address_t bufAddress = pnanovdb_upper_get_table_address(grid_type, buf, node, n);
2443 return pnanovdb_read_int64(buf, bufAddress);
2444}
2445
2446PNANOVDB_FORCE_INLINE pnanovdb_lower_handle_t pnanovdb_upper_get_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, pnanovdb_uint32_t n)
2447{
2448 pnanovdb_lower_handle_t lower = { upper.address };
2449 lower.address = pnanovdb_address_offset64(lower.address, pnanovdb_int64_as_uint64(pnanovdb_upper_get_table_child(grid_type, buf, upper, n)));
2450 return lower;
2451}
2452
2453PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_value_address_and_level(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
2454{
2455 pnanovdb_uint32_t n = pnanovdb_upper_coord_to_offset(ijk);
2456 pnanovdb_address_t value_address;
2457 if (pnanovdb_upper_get_child_mask(buf, upper, n))
2458 {
2459 pnanovdb_lower_handle_t child = pnanovdb_upper_get_child(grid_type, buf, upper, n);
2460 value_address = pnanovdb_lower_get_value_address_and_level(grid_type, buf, child, ijk, level);
2461 }
2462 else
2463 {
2464 value_address = pnanovdb_upper_get_table_address(grid_type, buf, upper, n);
2465 PNANOVDB_DEREF(level) = 2u;
2466 }
2467 return value_address;
2468}
2469
2470PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, PNANOVDB_IN(pnanovdb_coord_t) ijk)
2471{
2472 pnanovdb_uint32_t level;
2473 return pnanovdb_upper_get_value_address_and_level(grid_type, buf, upper, ijk, PNANOVDB_REF(level));
2474}
2475
2476PNANOVDB_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)
2477{
2478 pnanovdb_address_t bufAddress = pnanovdb_upper_get_table_address(grid_type, buf, node, n);
2479 pnanovdb_write_int64(buf, bufAddress, child);
2480}
2481
2482PNANOVDB_FORCE_INLINE void pnanovdb_upper_set_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, pnanovdb_uint32_t n, pnanovdb_lower_handle_t lower)
2483{
2484 pnanovdb_upper_set_table_child(grid_type, buf, upper, n, pnanovdb_address_diff(lower.address, upper.address));
2485}
2486
2487// ------------------------------------------------ Root -----------------------------------------------------------
2488
2489PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_background_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root)
2490{
2491 pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, root_off_background);
2492 return pnanovdb_address_offset(root.address, byte_offset);
2493}
2494
2495PNANOVDB_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)
2496{
2497 pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, root_off_min);
2498 return pnanovdb_address_offset(root.address, byte_offset);
2499}
2500
2501PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_max_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root)
2502{
2503 pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, root_off_max);
2504 return pnanovdb_address_offset(root.address, byte_offset);
2505}
2506
2507PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_ave_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root)
2508{
2509 pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, root_off_ave);
2510 return pnanovdb_address_offset(root.address, byte_offset);
2511}
2512
2513PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_stddev_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root)
2514{
2515 pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, root_off_stddev);
2516 return pnanovdb_address_offset(root.address, byte_offset);
2517}
2518
2519PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_tile_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t root_tile)
2520{
2521 pnanovdb_uint32_t byte_offset = PNANOVDB_GRID_TYPE_GET(grid_type, root_tile_off_value);
2522 return pnanovdb_address_offset(root_tile.address, byte_offset);
2523}
2524
2525PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address_and_level(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
2526{
2527 pnanovdb_root_tile_handle_t tile = pnanovdb_root_find_tile(grid_type, buf, root, ijk);
2528 pnanovdb_address_t ret;
2529 if (pnanovdb_address_is_null(tile.address))
2530 {
2531 ret = pnanovdb_address_offset(root.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_off_background));
2532 PNANOVDB_DEREF(level) = 4u;
2533 }
2534 else if (pnanovdb_int64_is_zero(pnanovdb_root_tile_get_child(buf, tile)))
2535 {
2536 ret = pnanovdb_address_offset(tile.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_tile_off_value));
2537 PNANOVDB_DEREF(level) = 3u;
2538 }
2539 else
2540 {
2541 pnanovdb_upper_handle_t child = pnanovdb_root_get_child(grid_type, buf, root, tile);
2542 ret = pnanovdb_upper_get_value_address_and_level(grid_type, buf, child, ijk, level);
2543 }
2544 return ret;
2545}
2546
2547PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk)
2548{
2549 pnanovdb_uint32_t level;
2550 return pnanovdb_root_get_value_address_and_level(grid_type, buf, root, ijk, PNANOVDB_REF(level));
2551}
2552
2553PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address_bit(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_uint32_t) bit_index)
2554{
2555 pnanovdb_uint32_t level;
2556 pnanovdb_address_t address = pnanovdb_root_get_value_address_and_level(grid_type, buf, root, ijk, PNANOVDB_REF(level));
2557 PNANOVDB_DEREF(bit_index) = level == 0u ? pnanovdb_int32_as_uint32(PNANOVDB_DEREF(ijk).x & 7) : 0u;
2558 return address;
2559}
2560
2561PNANOVDB_FORCE_INLINE float pnanovdb_root_fp4_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk, pnanovdb_uint32_t level)
2562{
2563 float ret;
2564 if (level == 0)
2565 {
2566 ret = pnanovdb_leaf_fp4_read_float(buf, address, ijk);
2567 }
2568 else
2569 {
2570 ret = pnanovdb_read_float(buf, address);
2571 }
2572 return ret;
2573}
2574
2575PNANOVDB_FORCE_INLINE float pnanovdb_root_fp8_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk, pnanovdb_uint32_t level)
2576{
2577 float ret;
2578 if (level == 0)
2579 {
2580 ret = pnanovdb_leaf_fp8_read_float(buf, address, ijk);
2581 }
2582 else
2583 {
2584 ret = pnanovdb_read_float(buf, address);
2585 }
2586 return ret;
2587}
2588
2589PNANOVDB_FORCE_INLINE float pnanovdb_root_fp16_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk, pnanovdb_uint32_t level)
2590{
2591 float ret;
2592 if (level == 0)
2593 {
2594 ret = pnanovdb_leaf_fp16_read_float(buf, address, ijk);
2595 }
2596 else
2597 {
2598 ret = pnanovdb_read_float(buf, address);
2599 }
2600 return ret;
2601}
2602
2603PNANOVDB_FORCE_INLINE float pnanovdb_root_fpn_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk, pnanovdb_uint32_t level)
2604{
2605 float ret;
2606 if (level == 0)
2607 {
2608 ret = pnanovdb_leaf_fpn_read_float(buf, address, ijk);
2609 }
2610 else
2611 {
2612 ret = pnanovdb_read_float(buf, address);
2613 }
2614 return ret;
2615}
2616
2617PNANOVDB_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)
2618{
2619 pnanovdb_uint64_t ret;
2620 if (level == 0)
2621 {
2622 ret = pnanovdb_leaf_index_get_value_index(buf, address, ijk);
2623 }
2624 else
2625 {
2626 ret = pnanovdb_read_uint64(buf, address);
2627 }
2628 return ret;
2629}
2630
2631PNANOVDB_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)
2632{
2633 pnanovdb_uint64_t ret;
2634 if (level == 0)
2635 {
2636 ret = pnanovdb_leaf_onindex_get_value_index(buf, address, ijk);
2637 }
2638 else
2639 {
2640 ret = pnanovdb_read_uint64(buf, address);
2641 }
2642 return ret;
2643}
2644
2645PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_root_pointindex_get_point_range(
2646 pnanovdb_buf_t buf,
2647 pnanovdb_address_t value_address,
2648 PNANOVDB_IN(pnanovdb_coord_t) ijk,
2649 pnanovdb_uint32_t level,
2650 PNANOVDB_INOUT(pnanovdb_uint64_t)range_begin,
2651 PNANOVDB_INOUT(pnanovdb_uint64_t)range_end
2652)
2653{
2654 pnanovdb_uint32_t local_range_begin = 0u;
2655 pnanovdb_uint32_t local_range_end = 0u;
2656 pnanovdb_uint64_t offset = pnanovdb_uint32_as_uint64_low(0u);
2657 if (level == 0)
2658 {
2659 pnanovdb_uint32_t n = pnanovdb_leaf_coord_to_offset(ijk);
2660 // recover leaf address
2661 pnanovdb_leaf_handle_t leaf = { pnanovdb_address_offset_neg(value_address, PNANOVDB_GRID_TYPE_GET(PNANOVDB_GRID_TYPE_POINTINDEX, leaf_off_table) + 2u * n) };
2662 if (n > 0u)
2663 {
2664 local_range_begin = pnanovdb_read_uint16(buf, pnanovdb_address_offset_neg(value_address, 2u));
2665 }
2666 local_range_end = pnanovdb_read_uint16(buf, value_address);
2667 offset = pnanovdb_leaf_pointindex_get_offset(buf, leaf);
2668 }
2669 PNANOVDB_DEREF(range_begin) = pnanovdb_uint64_offset(offset, local_range_begin);
2670 PNANOVDB_DEREF(range_end) = pnanovdb_uint64_offset(offset, local_range_end);
2671 return pnanovdb_uint32_as_uint64_low(local_range_end - local_range_begin);
2672}
2673
2674PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_root_pointindex_get_point_address_range(
2675 pnanovdb_buf_t buf,
2676 pnanovdb_grid_type_t value_type,
2677 pnanovdb_address_t value_address,
2678 pnanovdb_address_t blindmetadata_value_address,
2679 PNANOVDB_IN(pnanovdb_coord_t) ijk,
2680 pnanovdb_uint32_t level,
2681 PNANOVDB_INOUT(pnanovdb_address_t)address_begin,
2682 PNANOVDB_INOUT(pnanovdb_address_t)address_end
2683)
2684{
2685 pnanovdb_uint64_t range_begin;
2686 pnanovdb_uint64_t range_end;
2687 pnanovdb_uint64_t range_size = pnanovdb_root_pointindex_get_point_range(buf, value_address, ijk, level, PNANOVDB_REF(range_begin), PNANOVDB_REF(range_end));
2688
2689 pnanovdb_uint32_t stride = 12u; // vec3f
2690 if (value_type == PNANOVDB_GRID_TYPE_VEC3U8)
2691 {
2692 stride = 3u;
2693 }
2694 else if (value_type == PNANOVDB_GRID_TYPE_VEC3U16)
2695 {
2696 stride = 6u;
2697 }
2698 PNANOVDB_DEREF(address_begin) = pnanovdb_address_offset64_product(blindmetadata_value_address, range_begin, stride);
2699 PNANOVDB_DEREF(address_end) = pnanovdb_address_offset64_product(blindmetadata_value_address, range_end, stride);
2700 return range_size;
2701}
2702
2703// ------------------------------------------------ ReadAccessor -----------------------------------------------------------
2704
2713PNANOVDB_STRUCT_TYPEDEF(pnanovdb_readaccessor_t)
2714
2715PNANOVDB_FORCE_INLINE void pnanovdb_readaccessor_init(PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, pnanovdb_root_handle_t root)
2716{
2717 PNANOVDB_DEREF(acc).key.x = 0x7FFFFFFF;
2718 PNANOVDB_DEREF(acc).key.y = 0x7FFFFFFF;
2719 PNANOVDB_DEREF(acc).key.z = 0x7FFFFFFF;
2720 PNANOVDB_DEREF(acc).leaf.address = pnanovdb_address_null();
2721 PNANOVDB_DEREF(acc).lower.address = pnanovdb_address_null();
2722 PNANOVDB_DEREF(acc).upper.address = pnanovdb_address_null();
2723 PNANOVDB_DEREF(acc).root = root;
2724}
2725
2726PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_readaccessor_iscached0(PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, int dirty)
2727{
2728 if (pnanovdb_address_is_null(PNANOVDB_DEREF(acc).leaf.address)) { return PNANOVDB_FALSE; }
2729 if ((dirty & ~((1u << 3) - 1u)) != 0)
2730 {
2731 PNANOVDB_DEREF(acc).leaf.address = pnanovdb_address_null();
2732 return PNANOVDB_FALSE;
2733 }
2734 return PNANOVDB_TRUE;
2735}
2736PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_readaccessor_iscached1(PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, int dirty)
2737{
2738 if (pnanovdb_address_is_null(PNANOVDB_DEREF(acc).lower.address)) { return PNANOVDB_FALSE; }
2739 if ((dirty & ~((1u << 7) - 1u)) != 0)
2740 {
2741 PNANOVDB_DEREF(acc).lower.address = pnanovdb_address_null();
2742 return PNANOVDB_FALSE;
2743 }
2744 return PNANOVDB_TRUE;
2745}
2746PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_readaccessor_iscached2(PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, int dirty)
2747{
2748 if (pnanovdb_address_is_null(PNANOVDB_DEREF(acc).upper.address)) { return PNANOVDB_FALSE; }
2749 if ((dirty & ~((1u << 12) - 1u)) != 0)
2750 {
2751 PNANOVDB_DEREF(acc).upper.address = pnanovdb_address_null();
2752 return PNANOVDB_FALSE;
2753 }
2754 return PNANOVDB_TRUE;
2755}
2756PNANOVDB_FORCE_INLINE int pnanovdb_readaccessor_computedirty(PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk)
2757{
2758 return (PNANOVDB_DEREF(ijk).x ^ PNANOVDB_DEREF(acc).key.x) | (PNANOVDB_DEREF(ijk).y ^ PNANOVDB_DEREF(acc).key.y) | (PNANOVDB_DEREF(ijk).z ^ PNANOVDB_DEREF(acc).key.z);
2759}
2760
2761PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_value_address_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
2762{
2763 pnanovdb_uint32_t n = pnanovdb_leaf_coord_to_offset(ijk);
2764 return pnanovdb_leaf_get_table_address(grid_type, buf, leaf, n);
2765}
2766
2767PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_value_address_and_level_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
2768{
2769 pnanovdb_uint32_t n = pnanovdb_lower_coord_to_offset(ijk);
2770 pnanovdb_address_t value_address;
2771 if (pnanovdb_lower_get_child_mask(buf, lower, n))
2772 {
2773 pnanovdb_leaf_handle_t child = pnanovdb_lower_get_child(grid_type, buf, lower, n);
2774 PNANOVDB_DEREF(acc).leaf = child;
2775 PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
2776 value_address = pnanovdb_leaf_get_value_address_and_cache(grid_type, buf, child, ijk, acc);
2777 PNANOVDB_DEREF(level) = 0u;
2778 }
2779 else
2780 {
2781 value_address = pnanovdb_lower_get_table_address(grid_type, buf, lower, n);
2782 PNANOVDB_DEREF(level) = 1u;
2783 }
2784 return value_address;
2785}
2786
2787PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_value_address_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
2788{
2789 pnanovdb_uint32_t level;
2790 return pnanovdb_lower_get_value_address_and_level_and_cache(grid_type, buf, lower, ijk, acc, PNANOVDB_REF(level));
2791}
2792
2793PNANOVDB_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)
2794{
2795 pnanovdb_uint32_t n = pnanovdb_upper_coord_to_offset(ijk);
2796 pnanovdb_address_t value_address;
2797 if (pnanovdb_upper_get_child_mask(buf, upper, n))
2798 {
2799 pnanovdb_lower_handle_t child = pnanovdb_upper_get_child(grid_type, buf, upper, n);
2800 PNANOVDB_DEREF(acc).lower = child;
2801 PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
2802 value_address = pnanovdb_lower_get_value_address_and_level_and_cache(grid_type, buf, child, ijk, acc, level);
2803 }
2804 else
2805 {
2806 value_address = pnanovdb_upper_get_table_address(grid_type, buf, upper, n);
2807 PNANOVDB_DEREF(level) = 2u;
2808 }
2809 return value_address;
2810}
2811
2812PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_value_address_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
2813{
2814 pnanovdb_uint32_t level;
2815 return pnanovdb_upper_get_value_address_and_level_and_cache(grid_type, buf, upper, ijk, acc, PNANOVDB_REF(level));
2816}
2817
2818PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address_and_level_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
2819{
2820 pnanovdb_root_tile_handle_t tile = pnanovdb_root_find_tile(grid_type, buf, root, ijk);
2821 pnanovdb_address_t ret;
2822 if (pnanovdb_address_is_null(tile.address))
2823 {
2824 ret = pnanovdb_address_offset(root.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_off_background));
2825 PNANOVDB_DEREF(level) = 4u;
2826 }
2827 else if (pnanovdb_int64_is_zero(pnanovdb_root_tile_get_child(buf, tile)))
2828 {
2829 ret = pnanovdb_address_offset(tile.address, PNANOVDB_GRID_TYPE_GET(grid_type, root_tile_off_value));
2830 PNANOVDB_DEREF(level) = 3u;
2831 }
2832 else
2833 {
2834 pnanovdb_upper_handle_t child = pnanovdb_root_get_child(grid_type, buf, root, tile);
2835 PNANOVDB_DEREF(acc).upper = child;
2836 PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
2837 ret = pnanovdb_upper_get_value_address_and_level_and_cache(grid_type, buf, child, ijk, acc, level);
2838 }
2839 return ret;
2840}
2841
2842PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
2843{
2844 pnanovdb_uint32_t level;
2845 return pnanovdb_root_get_value_address_and_level_and_cache(grid_type, buf, root, ijk, acc, PNANOVDB_REF(level));
2846}
2847
2848PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_readaccessor_get_value_address_and_level(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
2849{
2850 int dirty = pnanovdb_readaccessor_computedirty(acc, ijk);
2851
2852 pnanovdb_address_t value_address;
2853 if (pnanovdb_readaccessor_iscached0(acc, dirty))
2854 {
2855 value_address = pnanovdb_leaf_get_value_address_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).leaf, ijk, acc);
2856 PNANOVDB_DEREF(level) = 0u;
2857 }
2858 else if (pnanovdb_readaccessor_iscached1(acc, dirty))
2859 {
2860 value_address = pnanovdb_lower_get_value_address_and_level_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).lower, ijk, acc, level);
2861 }
2862 else if (pnanovdb_readaccessor_iscached2(acc, dirty))
2863 {
2864 value_address = pnanovdb_upper_get_value_address_and_level_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).upper, ijk, acc, level);
2865 }
2866 else
2867 {
2868 value_address = pnanovdb_root_get_value_address_and_level_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).root, ijk, acc, level);
2869 }
2870 return value_address;
2871}
2872
2873PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_readaccessor_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk)
2874{
2875 pnanovdb_uint32_t level;
2876 return pnanovdb_readaccessor_get_value_address_and_level(grid_type, buf, acc, ijk, PNANOVDB_REF(level));
2877}
2878
2879PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_readaccessor_get_value_address_bit(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_uint32_t) bit_index)
2880{
2881 pnanovdb_uint32_t level;
2882 pnanovdb_address_t address = pnanovdb_readaccessor_get_value_address_and_level(grid_type, buf, acc, ijk, PNANOVDB_REF(level));
2883 PNANOVDB_DEREF(bit_index) = level == 0u ? pnanovdb_int32_as_uint32(PNANOVDB_DEREF(ijk).x & 7) : 0u;
2884 return address;
2885}
2886
2887// ------------------------------------------------ ReadAccessor GetDim -----------------------------------------------------------
2888
2889PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_leaf_get_dim_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
2890{
2891 return 1u;
2892}
2893
2894PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_lower_get_dim_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
2895{
2896 pnanovdb_uint32_t n = pnanovdb_lower_coord_to_offset(ijk);
2897 pnanovdb_uint32_t ret;
2898 if (pnanovdb_lower_get_child_mask(buf, lower, n))
2899 {
2900 pnanovdb_leaf_handle_t child = pnanovdb_lower_get_child(grid_type, buf, lower, n);
2901 PNANOVDB_DEREF(acc).leaf = child;
2902 PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
2903 ret = pnanovdb_leaf_get_dim_and_cache(grid_type, buf, child, ijk, acc);
2904 }
2905 else
2906 {
2907 ret = (1u << (3u)); // node 0 dim
2908 }
2909 return ret;
2910}
2911
2912PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_upper_get_dim_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
2913{
2914 pnanovdb_uint32_t n = pnanovdb_upper_coord_to_offset(ijk);
2915 pnanovdb_uint32_t ret;
2916 if (pnanovdb_upper_get_child_mask(buf, upper, n))
2917 {
2918 pnanovdb_lower_handle_t child = pnanovdb_upper_get_child(grid_type, buf, upper, n);
2919 PNANOVDB_DEREF(acc).lower = child;
2920 PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
2921 ret = pnanovdb_lower_get_dim_and_cache(grid_type, buf, child, ijk, acc);
2922 }
2923 else
2924 {
2925 ret = (1u << (4u + 3u)); // node 1 dim
2926 }
2927 return ret;
2928}
2929
2930PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_root_get_dim_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
2931{
2932 pnanovdb_root_tile_handle_t tile = pnanovdb_root_find_tile(grid_type, buf, root, ijk);
2933 pnanovdb_uint32_t ret;
2934 if (pnanovdb_address_is_null(tile.address))
2935 {
2936 ret = 1u << (5u + 4u + 3u); // background, node 2 dim
2937 }
2938 else if (pnanovdb_int64_is_zero(pnanovdb_root_tile_get_child(buf, tile)))
2939 {
2940 ret = 1u << (5u + 4u + 3u); // tile value, node 2 dim
2941 }
2942 else
2943 {
2944 pnanovdb_upper_handle_t child = pnanovdb_root_get_child(grid_type, buf, root, tile);
2945 PNANOVDB_DEREF(acc).upper = child;
2946 PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
2947 ret = pnanovdb_upper_get_dim_and_cache(grid_type, buf, child, ijk, acc);
2948 }
2949 return ret;
2950}
2951
2952PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_readaccessor_get_dim(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk)
2953{
2954 int dirty = pnanovdb_readaccessor_computedirty(acc, ijk);
2955
2956 pnanovdb_uint32_t dim;
2957 if (pnanovdb_readaccessor_iscached0(acc, dirty))
2958 {
2959 dim = pnanovdb_leaf_get_dim_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).leaf, ijk, acc);
2960 }
2961 else if (pnanovdb_readaccessor_iscached1(acc, dirty))
2962 {
2963 dim = pnanovdb_lower_get_dim_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).lower, ijk, acc);
2964 }
2965 else if (pnanovdb_readaccessor_iscached2(acc, dirty))
2966 {
2967 dim = pnanovdb_upper_get_dim_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).upper, ijk, acc);
2968 }
2969 else
2970 {
2971 dim = pnanovdb_root_get_dim_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).root, ijk, acc);
2972 }
2973 return dim;
2974}
2975
2976// ------------------------------------------------ ReadAccessor IsActive -----------------------------------------------------------
2977
2978PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_is_active_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
2979{
2980 pnanovdb_uint32_t n = pnanovdb_leaf_coord_to_offset(ijk);
2981 return pnanovdb_leaf_get_value_mask(buf, leaf, n);
2982}
2983
2984PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_lower_is_active_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
2985{
2986 pnanovdb_uint32_t n = pnanovdb_lower_coord_to_offset(ijk);
2987 pnanovdb_bool_t is_active;
2988 if (pnanovdb_lower_get_child_mask(buf, lower, n))
2989 {
2990 pnanovdb_leaf_handle_t child = pnanovdb_lower_get_child(grid_type, buf, lower, n);
2991 PNANOVDB_DEREF(acc).leaf = child;
2992 PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
2993 is_active = pnanovdb_leaf_is_active_and_cache(grid_type, buf, child, ijk, acc);
2994 }
2995 else
2996 {
2997 is_active = pnanovdb_lower_get_value_mask(buf, lower, n);
2998 }
2999 return is_active;
3000}
3001
3002PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_upper_is_active_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
3003{
3004 pnanovdb_uint32_t n = pnanovdb_upper_coord_to_offset(ijk);
3005 pnanovdb_bool_t is_active;
3006 if (pnanovdb_upper_get_child_mask(buf, upper, n))
3007 {
3008 pnanovdb_lower_handle_t child = pnanovdb_upper_get_child(grid_type, buf, upper, n);
3009 PNANOVDB_DEREF(acc).lower = child;
3010 PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
3011 is_active = pnanovdb_lower_is_active_and_cache(grid_type, buf, child, ijk, acc);
3012 }
3013 else
3014 {
3015 is_active = pnanovdb_upper_get_value_mask(buf, upper, n);
3016 }
3017 return is_active;
3018}
3019
3020PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_root_is_active_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
3021{
3022 pnanovdb_root_tile_handle_t tile = pnanovdb_root_find_tile(grid_type, buf, root, ijk);
3023 pnanovdb_bool_t is_active;
3024 if (pnanovdb_address_is_null(tile.address))
3025 {
3026 is_active = PNANOVDB_FALSE; // background
3027 }
3028 else if (pnanovdb_int64_is_zero(pnanovdb_root_tile_get_child(buf, tile)))
3029 {
3030 pnanovdb_uint32_t state = pnanovdb_root_tile_get_state(buf, tile);
3031 is_active = state != 0u; // tile value
3032 }
3033 else
3034 {
3035 pnanovdb_upper_handle_t child = pnanovdb_root_get_child(grid_type, buf, root, tile);
3036 PNANOVDB_DEREF(acc).upper = child;
3037 PNANOVDB_DEREF(acc).key = PNANOVDB_DEREF(ijk);
3038 is_active = pnanovdb_upper_is_active_and_cache(grid_type, buf, child, ijk, acc);
3039 }
3040 return is_active;
3041}
3042
3043PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_readaccessor_is_active(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk)
3044{
3045 int dirty = pnanovdb_readaccessor_computedirty(acc, ijk);
3046
3047 pnanovdb_bool_t is_active;
3048 if (pnanovdb_readaccessor_iscached0(acc, dirty))
3049 {
3050 is_active = pnanovdb_leaf_is_active_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).leaf, ijk, acc);
3051 }
3052 else if (pnanovdb_readaccessor_iscached1(acc, dirty))
3053 {
3054 is_active = pnanovdb_lower_is_active_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).lower, ijk, acc);
3055 }
3056 else if (pnanovdb_readaccessor_iscached2(acc, dirty))
3057 {
3058 is_active = pnanovdb_upper_is_active_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).upper, ijk, acc);
3059 }
3060 else
3061 {
3062 is_active = pnanovdb_root_is_active_and_cache(grid_type, buf, PNANOVDB_DEREF(acc).root, ijk, acc);
3063 }
3064 return is_active;
3065}
3066
3067// ------------------------------------------------ Map Transforms -----------------------------------------------------------
3068
3069PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_map_apply(pnanovdb_buf_t buf, pnanovdb_map_handle_t map, PNANOVDB_IN(pnanovdb_vec3_t) src)
3070{
3071 pnanovdb_vec3_t dst;
3072 float sx = PNANOVDB_DEREF(src).x;
3073 float sy = PNANOVDB_DEREF(src).y;
3074 float sz = PNANOVDB_DEREF(src).z;
3075 dst.x = sx * pnanovdb_map_get_matf(buf, map, 0) + sy * pnanovdb_map_get_matf(buf, map, 1) + sz * pnanovdb_map_get_matf(buf, map, 2) + pnanovdb_map_get_vecf(buf, map, 0);
3076 dst.y = sx * pnanovdb_map_get_matf(buf, map, 3) + sy * pnanovdb_map_get_matf(buf, map, 4) + sz * pnanovdb_map_get_matf(buf, map, 5) + pnanovdb_map_get_vecf(buf, map, 1);
3077 dst.z = sx * pnanovdb_map_get_matf(buf, map, 6) + sy * pnanovdb_map_get_matf(buf, map, 7) + sz * pnanovdb_map_get_matf(buf, map, 8) + pnanovdb_map_get_vecf(buf, map, 2);
3078 return dst;
3079}
3080
3081PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_map_apply_inverse(pnanovdb_buf_t buf, pnanovdb_map_handle_t map, PNANOVDB_IN(pnanovdb_vec3_t) src)
3082{
3083 pnanovdb_vec3_t dst;
3084 float sx = PNANOVDB_DEREF(src).x - pnanovdb_map_get_vecf(buf, map, 0);
3085 float sy = PNANOVDB_DEREF(src).y - pnanovdb_map_get_vecf(buf, map, 1);
3086 float sz = PNANOVDB_DEREF(src).z - pnanovdb_map_get_vecf(buf, map, 2);
3087 dst.x = sx * pnanovdb_map_get_invmatf(buf, map, 0) + sy * pnanovdb_map_get_invmatf(buf, map, 1) + sz * pnanovdb_map_get_invmatf(buf, map, 2);
3088 dst.y = sx * pnanovdb_map_get_invmatf(buf, map, 3) + sy * pnanovdb_map_get_invmatf(buf, map, 4) + sz * pnanovdb_map_get_invmatf(buf, map, 5);
3089 dst.z = sx * pnanovdb_map_get_invmatf(buf, map, 6) + sy * pnanovdb_map_get_invmatf(buf, map, 7) + sz * pnanovdb_map_get_invmatf(buf, map, 8);
3090 return dst;
3091}
3092
3093PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_map_apply_jacobi(pnanovdb_buf_t buf, pnanovdb_map_handle_t map, PNANOVDB_IN(pnanovdb_vec3_t) src)
3094{
3095 pnanovdb_vec3_t dst;
3096 float sx = PNANOVDB_DEREF(src).x;
3097 float sy = PNANOVDB_DEREF(src).y;
3098 float sz = PNANOVDB_DEREF(src).z;
3099 dst.x = sx * pnanovdb_map_get_matf(buf, map, 0) + sy * pnanovdb_map_get_matf(buf, map, 1) + sz * pnanovdb_map_get_matf(buf, map, 2);
3100 dst.y = sx * pnanovdb_map_get_matf(buf, map, 3) + sy * pnanovdb_map_get_matf(buf, map, 4) + sz * pnanovdb_map_get_matf(buf, map, 5);
3101 dst.z = sx * pnanovdb_map_get_matf(buf, map, 6) + sy * pnanovdb_map_get_matf(buf, map, 7) + sz * pnanovdb_map_get_matf(buf, map, 8);
3102 return dst;
3103}
3104
3105PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_map_apply_inverse_jacobi(pnanovdb_buf_t buf, pnanovdb_map_handle_t map, PNANOVDB_IN(pnanovdb_vec3_t) src)
3106{
3107 pnanovdb_vec3_t dst;
3108 float sx = PNANOVDB_DEREF(src).x;
3109 float sy = PNANOVDB_DEREF(src).y;
3110 float sz = PNANOVDB_DEREF(src).z;
3111 dst.x = sx * pnanovdb_map_get_invmatf(buf, map, 0) + sy * pnanovdb_map_get_invmatf(buf, map, 1) + sz * pnanovdb_map_get_invmatf(buf, map, 2);
3112 dst.y = sx * pnanovdb_map_get_invmatf(buf, map, 3) + sy * pnanovdb_map_get_invmatf(buf, map, 4) + sz * pnanovdb_map_get_invmatf(buf, map, 5);
3113 dst.z = sx * pnanovdb_map_get_invmatf(buf, map, 6) + sy * pnanovdb_map_get_invmatf(buf, map, 7) + sz * pnanovdb_map_get_invmatf(buf, map, 8);
3114 return dst;
3115}
3116
3117PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_grid_world_to_indexf(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, PNANOVDB_IN(pnanovdb_vec3_t) src)
3118{
3120 return pnanovdb_map_apply_inverse(buf, map, src);
3121}
3122
3123PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_grid_index_to_worldf(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, PNANOVDB_IN(pnanovdb_vec3_t) src)
3124{
3126 return pnanovdb_map_apply(buf, map, src);
3127}
3128
3129PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_grid_world_to_index_dirf(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, PNANOVDB_IN(pnanovdb_vec3_t) src)
3130{
3132 return pnanovdb_map_apply_inverse_jacobi(buf, map, src);
3133}
3134
3135PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_grid_index_to_world_dirf(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, PNANOVDB_IN(pnanovdb_vec3_t) src)
3136{
3138 return pnanovdb_map_apply_jacobi(buf, map, src);
3139}
3140
3141// ------------------------------------------------ DitherLUT -----------------------------------------------------------
3142
3143// This table was generated with
3144/**************
3145
3146static constexpr inline uint32
3147SYSwang_inthash(uint32 key)
3148{
3149 // From http://www.concentric.net/~Ttwang/tech/inthash.htm
3150 key += ~(key << 16);
3151 key ^= (key >> 5);
3152 key += (key << 3);
3153 key ^= (key >> 13);
3154 key += ~(key << 9);
3155 key ^= (key >> 17);
3156 return key;
3157}
3158
3159static void
3160ut_initDitherR(float *pattern, float offset,
3161 int x, int y, int z, int res, int goalres)
3162{
3163 // These offsets are designed to maximize the difference between
3164 // dither values in nearby voxels within a given 2x2x2 cell, without
3165 // producing axis-aligned artifacts. The are organized in row-major
3166 // order.
3167 static const float theDitherOffset[] = {0,4,6,2,5,1,3,7};
3168 static const float theScale = 0.125F;
3169 int key = (((z << res) + y) << res) + x;
3170
3171 if (res == goalres)
3172 {
3173 pattern[key] = offset;
3174 return;
3175 }
3176
3177 // Randomly flip (on each axis) the dithering patterns used by the
3178 // subcells. This key is xor'd with the subcell index below before
3179 // looking up in the dither offset list.
3180 key = SYSwang_inthash(key) & 7;
3181
3182 x <<= 1;
3183 y <<= 1;
3184 z <<= 1;
3185
3186 offset *= theScale;
3187 for (int i = 0; i < 8; i++)
3188 ut_initDitherR(pattern, offset+theDitherOffset[i ^ key]*theScale,
3189 x+(i&1), y+((i&2)>>1), z+((i&4)>>2), res+1, goalres);
3190}
3191
3192// This is a compact algorithm that accomplishes essentially the same thing
3193// as ut_initDither() above. We should eventually switch to use this and
3194// clean the dead code.
3195static fpreal32 *
3196ut_initDitherRecursive(int goalres)
3197{
3198 const int nfloat = 1 << (goalres*3);
3199 float *pattern = new float[nfloat];
3200 ut_initDitherR(pattern, 1.0F, 0, 0, 0, 0, goalres);
3201
3202 // This has built an even spacing from 1/nfloat to 1.0.
3203 // however, our dither pattern should be 1/(nfloat+1) to nfloat/(nfloat+1)
3204 // So we do a correction here. Note that the earlier calculations are
3205 // done with powers of 2 so are exact, so it does make sense to delay
3206 // the renormalization to this pass.
3207 float correctionterm = nfloat / (nfloat+1.0F);
3208 for (int i = 0; i < nfloat; i++)
3209 pattern[i] *= correctionterm;
3210 return pattern;
3211}
3212
3213 theDitherMatrix = ut_initDitherRecursive(3);
3214
3215 for (int i = 0; i < 512/8; i ++)
3216 {
3217 for (int j = 0; j < 8; j ++)
3218 std::cout << theDitherMatrix[i*8+j] << "f, ";
3219 std::cout << std::endl;
3220 }
3221
3222 **************/
3223
3224PNANOVDB_STATIC_CONST float pnanovdb_dither_lut[512] =
3225{
3226 0.14425f, 0.643275f, 0.830409f, 0.331384f, 0.105263f, 0.604289f, 0.167641f, 0.666667f,
3227 0.892788f, 0.393762f, 0.0818713f, 0.580897f, 0.853801f, 0.354776f, 0.916179f, 0.417154f,
3228 0.612086f, 0.11306f, 0.79922f, 0.300195f, 0.510721f, 0.0116959f, 0.947368f, 0.448343f,
3229 0.362573f, 0.861598f, 0.0506823f, 0.549708f, 0.261209f, 0.760234f, 0.19883f, 0.697856f,
3230 0.140351f, 0.639376f, 0.576998f, 0.0779727f, 0.522417f, 0.0233918f, 0.460039f, 0.959064f,
3231 0.888889f, 0.389864f, 0.327485f, 0.826511f, 0.272904f, 0.77193f, 0.709552f, 0.210526f,
3232 0.483431f, 0.982456f, 0.296296f, 0.795322f, 0.116959f, 0.615984f, 0.0545809f, 0.553606f,
3233 0.732943f, 0.233918f, 0.545809f, 0.0467836f, 0.865497f, 0.366472f, 0.803119f, 0.304094f,
3234 0.518519f, 0.0194932f, 0.45614f, 0.955166f, 0.729045f, 0.230019f, 0.54191f, 0.042885f,
3235 0.269006f, 0.768031f, 0.705653f, 0.206628f, 0.479532f, 0.978558f, 0.292398f, 0.791423f,
3236 0.237817f, 0.736842f, 0.424951f, 0.923977f, 0.136452f, 0.635478f, 0.323587f, 0.822612f,
3237 0.986355f, 0.487329f, 0.674464f, 0.175439f, 0.88499f, 0.385965f, 0.573099f, 0.0740741f,
3238 0.51462f, 0.0155945f, 0.202729f, 0.701754f, 0.148148f, 0.647174f, 0.834308f, 0.335283f,
3239 0.265107f, 0.764133f, 0.951267f, 0.452242f, 0.896686f, 0.397661f, 0.08577f, 0.584795f,
3240 0.8577f, 0.358674f, 0.920078f, 0.421053f, 0.740741f, 0.241715f, 0.678363f, 0.179337f,
3241 0.109162f, 0.608187f, 0.17154f, 0.670565f, 0.491228f, 0.990253f, 0.42885f, 0.927875f,
3242 0.0662768f, 0.565302f, 0.62768f, 0.128655f, 0.183236f, 0.682261f, 0.744639f, 0.245614f,
3243 0.814815f, 0.315789f, 0.378168f, 0.877193f, 0.931774f, 0.432749f, 0.495127f, 0.994152f,
3244 0.0350877f, 0.534113f, 0.97076f, 0.471735f, 0.214425f, 0.71345f, 0.526316f, 0.0272904f,
3245 0.783626f, 0.2846f, 0.222222f, 0.721248f, 0.962963f, 0.463938f, 0.276803f, 0.775828f,
3246 0.966862f, 0.467836f, 0.405458f, 0.904483f, 0.0701754f, 0.569201f, 0.881092f, 0.382066f,
3247 0.218324f, 0.717349f, 0.654971f, 0.155945f, 0.818713f, 0.319688f, 0.132554f, 0.631579f,
3248 0.0623782f, 0.561404f, 0.748538f, 0.249513f, 0.912281f, 0.413255f, 0.974659f, 0.475634f,
3249 0.810916f, 0.311891f, 0.499025f, 0.998051f, 0.163743f, 0.662768f, 0.226121f, 0.725146f,
3250 0.690058f, 0.191033f, 0.00389864f, 0.502924f, 0.557505f, 0.0584795f, 0.120858f, 0.619883f,
3251 0.440546f, 0.939571f, 0.752437f, 0.253411f, 0.307992f, 0.807018f, 0.869396f, 0.37037f,
3252 0.658869f, 0.159844f, 0.346979f, 0.846004f, 0.588694f, 0.0896686f, 0.152047f, 0.651072f,
3253 0.409357f, 0.908382f, 0.596491f, 0.0974659f, 0.339181f, 0.838207f, 0.900585f, 0.401559f,
3254 0.34308f, 0.842105f, 0.779727f, 0.280702f, 0.693957f, 0.194932f, 0.25731f, 0.756335f,
3255 0.592593f, 0.0935673f, 0.0311891f, 0.530214f, 0.444444f, 0.94347f, 0.506823f, 0.00779727f,
3256 0.68616f, 0.187135f, 0.124756f, 0.623782f, 0.288499f, 0.787524f, 0.350877f, 0.849903f,
3257 0.436647f, 0.935673f, 0.873294f, 0.374269f, 0.538012f, 0.0389864f, 0.60039f, 0.101365f,
3258 0.57115f, 0.0721248f, 0.758285f, 0.259259f, 0.719298f, 0.220273f, 0.532164f, 0.0331384f,
3259 0.321637f, 0.820663f, 0.00974659f, 0.508772f, 0.469786f, 0.968811f, 0.282651f, 0.781676f,
3260 0.539961f, 0.0409357f, 0.727096f, 0.22807f, 0.500975f, 0.00194932f, 0.563353f, 0.0643275f,
3261 0.290448f, 0.789474f, 0.477583f, 0.976608f, 0.251462f, 0.750487f, 0.31384f, 0.812865f,
3262 0.94152f, 0.442495f, 0.879142f, 0.380117f, 0.37232f, 0.871345f, 0.309942f, 0.808967f,
3263 0.192982f, 0.692008f, 0.130604f, 0.62963f, 0.621832f, 0.122807f, 0.559454f, 0.0604289f,
3264 0.660819f, 0.161793f, 0.723197f, 0.224172f, 0.403509f, 0.902534f, 0.840156f, 0.341131f,
3265 0.411306f, 0.910331f, 0.473684f, 0.97271f, 0.653021f, 0.153996f, 0.0916179f, 0.590643f,
3266 0.196881f, 0.695906f, 0.384016f, 0.883041f, 0.0955166f, 0.594542f, 0.157895f, 0.65692f,
3267 0.945419f, 0.446394f, 0.633528f, 0.134503f, 0.844055f, 0.345029f, 0.906433f, 0.407407f,
3268 0.165692f, 0.664717f, 0.103314f, 0.602339f, 0.126706f, 0.625731f, 0.189084f, 0.688109f,
3269 0.91423f, 0.415205f, 0.851852f, 0.352827f, 0.875244f, 0.376218f, 0.937622f, 0.438596f,
3270 0.317739f, 0.816764f, 0.255361f, 0.754386f, 0.996101f, 0.497076f, 0.933723f, 0.434698f,
3271 0.567251f, 0.0682261f, 0.504873f, 0.00584795f, 0.247563f, 0.746589f, 0.185185f, 0.684211f,
3272 0.037037f, 0.536062f, 0.0994152f, 0.598441f, 0.777778f, 0.278752f, 0.465887f, 0.964912f,
3273 0.785575f, 0.28655f, 0.847953f, 0.348928f, 0.0292398f, 0.528265f, 0.7154f, 0.216374f,
3274 0.39961f, 0.898636f, 0.961014f, 0.461988f, 0.0487329f, 0.547758f, 0.111111f, 0.610136f,
3275 0.649123f, 0.150097f, 0.212476f, 0.711501f, 0.797271f, 0.298246f, 0.859649f, 0.360624f,
3276 0.118908f, 0.617934f, 0.0565302f, 0.555556f, 0.329435f, 0.82846f, 0.516569f, 0.0175439f,
3277 0.867446f, 0.368421f, 0.805068f, 0.306043f, 0.578947f, 0.079922f, 0.267057f, 0.766082f,
3278 0.270955f, 0.76998f, 0.707602f, 0.208577f, 0.668616f, 0.169591f, 0.606238f, 0.107212f,
3279 0.520468f, 0.0214425f, 0.45809f, 0.957115f, 0.419103f, 0.918129f, 0.356725f, 0.855751f,
3280 0.988304f, 0.489279f, 0.426901f, 0.925926f, 0.450292f, 0.949318f, 0.512671f, 0.0136452f,
3281 0.239766f, 0.738791f, 0.676413f, 0.177388f, 0.699805f, 0.20078f, 0.263158f, 0.762183f,
3282 0.773879f, 0.274854f, 0.337232f, 0.836257f, 0.672515f, 0.173489f, 0.734893f, 0.235867f,
3283 0.0253411f, 0.524366f, 0.586745f, 0.0877193f, 0.423002f, 0.922027f, 0.48538f, 0.984405f,
3284 0.74269f, 0.243665f, 0.680312f, 0.181287f, 0.953216f, 0.454191f, 0.1423f, 0.641326f,
3285 0.493177f, 0.992203f, 0.430799f, 0.929825f, 0.204678f, 0.703704f, 0.890838f, 0.391813f,
3286 0.894737f, 0.395712f, 0.0838207f, 0.582846f, 0.0448343f, 0.54386f, 0.231969f, 0.730994f,
3287 0.146199f, 0.645224f, 0.832359f, 0.333333f, 0.793372f, 0.294347f, 0.980507f, 0.481481f,
3288 0.364522f, 0.863548f, 0.80117f, 0.302144f, 0.824561f, 0.325536f, 0.138402f, 0.637427f,
3289 0.614035f, 0.11501f, 0.0526316f, 0.551657f, 0.0760234f, 0.575049f, 0.88694f, 0.387914f,
3290};
3291
3292PNANOVDB_FORCE_INLINE float pnanovdb_dither_lookup(pnanovdb_bool_t enabled, int offset)
3293{
3294 return enabled ? pnanovdb_dither_lut[offset & 511] : 0.5f;
3295}
3296
3297// ------------------------------------------------ HDDA -----------------------------------------------------------
3298
3299#ifdef PNANOVDB_HDDA
3300
3301// Comment out to disable this explicit round-off check
3302#define PNANOVDB_ENFORCE_FORWARD_STEPPING
3303
3304#define PNANOVDB_HDDA_FLOAT_MAX 1e38f
3305
3306struct pnanovdb_hdda_t
3307{
3308 pnanovdb_int32_t dim;
3309 float tmin;
3310 float tmax;
3311 pnanovdb_coord_t voxel;
3312 pnanovdb_coord_t step;
3313 pnanovdb_vec3_t delta;
3314 pnanovdb_vec3_t next;
3315};
3316PNANOVDB_STRUCT_TYPEDEF(pnanovdb_hdda_t)
3317
3318PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_hdda_pos_to_ijk(PNANOVDB_IN(pnanovdb_vec3_t) pos)
3319{
3320 pnanovdb_coord_t voxel;
3321 voxel.x = pnanovdb_float_to_int32(pnanovdb_floor(PNANOVDB_DEREF(pos).x));
3322 voxel.y = pnanovdb_float_to_int32(pnanovdb_floor(PNANOVDB_DEREF(pos).y));
3323 voxel.z = pnanovdb_float_to_int32(pnanovdb_floor(PNANOVDB_DEREF(pos).z));
3324 return voxel;
3325}
3326
3327PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_hdda_pos_to_voxel(PNANOVDB_IN(pnanovdb_vec3_t) pos, int dim)
3328{
3329 pnanovdb_coord_t voxel;
3330 voxel.x = pnanovdb_float_to_int32(pnanovdb_floor(PNANOVDB_DEREF(pos).x)) & (~(dim - 1));
3331 voxel.y = pnanovdb_float_to_int32(pnanovdb_floor(PNANOVDB_DEREF(pos).y)) & (~(dim - 1));
3332 voxel.z = pnanovdb_float_to_int32(pnanovdb_floor(PNANOVDB_DEREF(pos).z)) & (~(dim - 1));
3333 return voxel;
3334}
3335
3336PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_hdda_ray_start(PNANOVDB_IN(pnanovdb_vec3_t) origin, float tmin, PNANOVDB_IN(pnanovdb_vec3_t) direction)
3337{
3338 pnanovdb_vec3_t pos = pnanovdb_vec3_add(
3339 pnanovdb_vec3_mul(PNANOVDB_DEREF(direction), pnanovdb_vec3_uniform(tmin)),
3340 PNANOVDB_DEREF(origin)
3341 );
3342 return pos;
3343}
3344
3345PNANOVDB_FORCE_INLINE void pnanovdb_hdda_init(PNANOVDB_INOUT(pnanovdb_hdda_t) hdda, PNANOVDB_IN(pnanovdb_vec3_t) origin, float tmin, PNANOVDB_IN(pnanovdb_vec3_t) direction, float tmax, int dim)
3346{
3347 PNANOVDB_DEREF(hdda).dim = dim;
3348 PNANOVDB_DEREF(hdda).tmin = tmin;
3349 PNANOVDB_DEREF(hdda).tmax = tmax;
3350
3351 pnanovdb_vec3_t pos = pnanovdb_hdda_ray_start(origin, tmin, direction);
3352 pnanovdb_vec3_t dir_inv = pnanovdb_vec3_div(pnanovdb_vec3_uniform(1.f), PNANOVDB_DEREF(direction));
3353
3354 PNANOVDB_DEREF(hdda).voxel = pnanovdb_hdda_pos_to_voxel(PNANOVDB_REF(pos), dim);
3355
3356 // x
3357 if (PNANOVDB_DEREF(direction).x == 0.f)
3358 {
3359 PNANOVDB_DEREF(hdda).next.x = PNANOVDB_HDDA_FLOAT_MAX;
3360 PNANOVDB_DEREF(hdda).step.x = 0;
3361 PNANOVDB_DEREF(hdda).delta.x = 0.f;
3362 }
3363 else if (dir_inv.x > 0.f)
3364 {
3365 PNANOVDB_DEREF(hdda).step.x = 1;
3366 PNANOVDB_DEREF(hdda).next.x = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.x + dim - pos.x) * dir_inv.x;
3367 PNANOVDB_DEREF(hdda).delta.x = dir_inv.x;
3368 }
3369 else
3370 {
3371 PNANOVDB_DEREF(hdda).step.x = -1;
3372 PNANOVDB_DEREF(hdda).next.x = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.x - pos.x) * dir_inv.x;
3373 PNANOVDB_DEREF(hdda).delta.x = -dir_inv.x;
3374 }
3375
3376 // y
3377 if (PNANOVDB_DEREF(direction).y == 0.f)
3378 {
3379 PNANOVDB_DEREF(hdda).next.y = PNANOVDB_HDDA_FLOAT_MAX;
3380 PNANOVDB_DEREF(hdda).step.y = 0;
3381 PNANOVDB_DEREF(hdda).delta.y = 0.f;
3382 }
3383 else if (dir_inv.y > 0.f)
3384 {
3385 PNANOVDB_DEREF(hdda).step.y = 1;
3386 PNANOVDB_DEREF(hdda).next.y = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.y + dim - pos.y) * dir_inv.y;
3387 PNANOVDB_DEREF(hdda).delta.y = dir_inv.y;
3388 }
3389 else
3390 {
3391 PNANOVDB_DEREF(hdda).step.y = -1;
3392 PNANOVDB_DEREF(hdda).next.y = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.y - pos.y) * dir_inv.y;
3393 PNANOVDB_DEREF(hdda).delta.y = -dir_inv.y;
3394 }
3395
3396 // z
3397 if (PNANOVDB_DEREF(direction).z == 0.f)
3398 {
3399 PNANOVDB_DEREF(hdda).next.z = PNANOVDB_HDDA_FLOAT_MAX;
3400 PNANOVDB_DEREF(hdda).step.z = 0;
3401 PNANOVDB_DEREF(hdda).delta.z = 0.f;
3402 }
3403 else if (dir_inv.z > 0.f)
3404 {
3405 PNANOVDB_DEREF(hdda).step.z = 1;
3406 PNANOVDB_DEREF(hdda).next.z = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.z + dim - pos.z) * dir_inv.z;
3407 PNANOVDB_DEREF(hdda).delta.z = dir_inv.z;
3408 }
3409 else
3410 {
3411 PNANOVDB_DEREF(hdda).step.z = -1;
3412 PNANOVDB_DEREF(hdda).next.z = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.z - pos.z) * dir_inv.z;
3413 PNANOVDB_DEREF(hdda).delta.z = -dir_inv.z;
3414 }
3415}
3416
3417PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_hdda_update(PNANOVDB_INOUT(pnanovdb_hdda_t) hdda, PNANOVDB_IN(pnanovdb_vec3_t) origin, PNANOVDB_IN(pnanovdb_vec3_t) direction, int dim)
3418{
3419 if (PNANOVDB_DEREF(hdda).dim == dim)
3420 {
3421 return PNANOVDB_FALSE;
3422 }
3423
3424 // compute valid voxel range
3425 pnanovdb_coord_t voxel_max = {
3426 (PNANOVDB_DEREF(hdda).voxel.x + PNANOVDB_DEREF(hdda).dim - 1) & (~(dim - 1)),
3427 (PNANOVDB_DEREF(hdda).voxel.y + PNANOVDB_DEREF(hdda).dim - 1) & (~(dim - 1)),
3428 (PNANOVDB_DEREF(hdda).voxel.z + PNANOVDB_DEREF(hdda).dim - 1) & (~(dim - 1))
3429 };
3430 pnanovdb_coord_t voxel_min = {
3431 PNANOVDB_DEREF(hdda).voxel.x & (~(dim - 1)),
3432 PNANOVDB_DEREF(hdda).voxel.y & (~(dim - 1)),
3433 PNANOVDB_DEREF(hdda).voxel.z & (~(dim - 1))
3434 };
3435
3436 PNANOVDB_DEREF(hdda).dim = dim;
3437
3438 pnanovdb_vec3_t pos = pnanovdb_vec3_add(
3439 pnanovdb_vec3_mul(PNANOVDB_DEREF(direction), pnanovdb_vec3_uniform(PNANOVDB_DEREF(hdda).tmin)),
3440 PNANOVDB_DEREF(origin)
3441 );
3442 pnanovdb_vec3_t dir_inv = pnanovdb_vec3_div(pnanovdb_vec3_uniform(1.f), PNANOVDB_DEREF(direction));
3443
3444 PNANOVDB_DEREF(hdda).voxel = pnanovdb_hdda_pos_to_voxel(PNANOVDB_REF(pos), dim);
3445
3446 // clamp voxel to valid range
3447 PNANOVDB_DEREF(hdda).voxel.x = PNANOVDB_DEREF(hdda).voxel.x < voxel_max.x ? PNANOVDB_DEREF(hdda).voxel.x : voxel_max.x;
3448 PNANOVDB_DEREF(hdda).voxel.y = PNANOVDB_DEREF(hdda).voxel.y < voxel_max.y ? PNANOVDB_DEREF(hdda).voxel.y : voxel_max.y;
3449 PNANOVDB_DEREF(hdda).voxel.z = PNANOVDB_DEREF(hdda).voxel.z < voxel_max.z ? PNANOVDB_DEREF(hdda).voxel.z : voxel_max.z;
3450 PNANOVDB_DEREF(hdda).voxel.x = PNANOVDB_DEREF(hdda).voxel.x > voxel_min.x ? PNANOVDB_DEREF(hdda).voxel.x : voxel_min.x;
3451 PNANOVDB_DEREF(hdda).voxel.y = PNANOVDB_DEREF(hdda).voxel.y > voxel_min.y ? PNANOVDB_DEREF(hdda).voxel.y : voxel_min.y;
3452 PNANOVDB_DEREF(hdda).voxel.z = PNANOVDB_DEREF(hdda).voxel.z > voxel_min.z ? PNANOVDB_DEREF(hdda).voxel.z : voxel_min.z;
3453
3454 if (PNANOVDB_DEREF(hdda).step.x != 0)
3455 {
3456 PNANOVDB_DEREF(hdda).next.x = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.x - pos.x) * dir_inv.x;
3457 if (PNANOVDB_DEREF(hdda).step.x > 0)
3458 {
3459 PNANOVDB_DEREF(hdda).next.x += dim * dir_inv.x;
3460 }
3461 }
3462 if (PNANOVDB_DEREF(hdda).step.y != 0)
3463 {
3464 PNANOVDB_DEREF(hdda).next.y = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.y - pos.y) * dir_inv.y;
3465 if (PNANOVDB_DEREF(hdda).step.y > 0)
3466 {
3467 PNANOVDB_DEREF(hdda).next.y += dim * dir_inv.y;
3468 }
3469 }
3470 if (PNANOVDB_DEREF(hdda).step.z != 0)
3471 {
3472 PNANOVDB_DEREF(hdda).next.z = PNANOVDB_DEREF(hdda).tmin + (PNANOVDB_DEREF(hdda).voxel.z - pos.z) * dir_inv.z;
3473 if (PNANOVDB_DEREF(hdda).step.z > 0)
3474 {
3475 PNANOVDB_DEREF(hdda).next.z += dim * dir_inv.z;
3476 }
3477 }
3478
3479 return PNANOVDB_TRUE;
3480}
3481
3482PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_hdda_step(PNANOVDB_INOUT(pnanovdb_hdda_t) hdda)
3483{
3484 pnanovdb_bool_t ret;
3485 if (PNANOVDB_DEREF(hdda).next.x < PNANOVDB_DEREF(hdda).next.y && PNANOVDB_DEREF(hdda).next.x < PNANOVDB_DEREF(hdda).next.z)
3486 {
3487#ifdef PNANOVDB_ENFORCE_FORWARD_STEPPING
3488 if (PNANOVDB_DEREF(hdda).next.x <= PNANOVDB_DEREF(hdda).tmin)
3489 {
3490 PNANOVDB_DEREF(hdda).next.x += PNANOVDB_DEREF(hdda).tmin - 0.999999f * PNANOVDB_DEREF(hdda).next.x + 1.0e-6f;
3491 }
3492#endif
3493 PNANOVDB_DEREF(hdda).tmin = PNANOVDB_DEREF(hdda).next.x;
3494 PNANOVDB_DEREF(hdda).next.x += PNANOVDB_DEREF(hdda).dim * PNANOVDB_DEREF(hdda).delta.x;
3495 PNANOVDB_DEREF(hdda).voxel.x += PNANOVDB_DEREF(hdda).dim * PNANOVDB_DEREF(hdda).step.x;
3496 ret = PNANOVDB_DEREF(hdda).tmin <= PNANOVDB_DEREF(hdda).tmax;
3497 }
3498 else if (PNANOVDB_DEREF(hdda).next.y < PNANOVDB_DEREF(hdda).next.z)
3499 {
3500#ifdef PNANOVDB_ENFORCE_FORWARD_STEPPING
3501 if (PNANOVDB_DEREF(hdda).next.y <= PNANOVDB_DEREF(hdda).tmin)
3502 {
3503 PNANOVDB_DEREF(hdda).next.y += PNANOVDB_DEREF(hdda).tmin - 0.999999f * PNANOVDB_DEREF(hdda).next.y + 1.0e-6f;
3504 }
3505#endif
3506 PNANOVDB_DEREF(hdda).tmin = PNANOVDB_DEREF(hdda).next.y;
3507 PNANOVDB_DEREF(hdda).next.y += PNANOVDB_DEREF(hdda).dim * PNANOVDB_DEREF(hdda).delta.y;
3508 PNANOVDB_DEREF(hdda).voxel.y += PNANOVDB_DEREF(hdda).dim * PNANOVDB_DEREF(hdda).step.y;
3509 ret = PNANOVDB_DEREF(hdda).tmin <= PNANOVDB_DEREF(hdda).tmax;
3510 }
3511 else
3512 {
3513#ifdef PNANOVDB_ENFORCE_FORWARD_STEPPING
3514 if (PNANOVDB_DEREF(hdda).next.z <= PNANOVDB_DEREF(hdda).tmin)
3515 {
3516 PNANOVDB_DEREF(hdda).next.z += PNANOVDB_DEREF(hdda).tmin - 0.999999f * PNANOVDB_DEREF(hdda).next.z + 1.0e-6f;
3517 }
3518#endif
3519 PNANOVDB_DEREF(hdda).tmin = PNANOVDB_DEREF(hdda).next.z;
3520 PNANOVDB_DEREF(hdda).next.z += PNANOVDB_DEREF(hdda).dim * PNANOVDB_DEREF(hdda).delta.z;
3521 PNANOVDB_DEREF(hdda).voxel.z += PNANOVDB_DEREF(hdda).dim * PNANOVDB_DEREF(hdda).step.z;
3522 ret = PNANOVDB_DEREF(hdda).tmin <= PNANOVDB_DEREF(hdda).tmax;
3523 }
3524 return ret;
3525}
3526
3527PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_hdda_ray_clip(
3528 PNANOVDB_IN(pnanovdb_vec3_t) bbox_min,
3529 PNANOVDB_IN(pnanovdb_vec3_t) bbox_max,
3530 PNANOVDB_IN(pnanovdb_vec3_t) origin, PNANOVDB_INOUT(float) tmin,
3531 PNANOVDB_IN(pnanovdb_vec3_t) direction, PNANOVDB_INOUT(float) tmax
3532)
3533{
3534 pnanovdb_vec3_t dir_inv = pnanovdb_vec3_div(pnanovdb_vec3_uniform(1.f), PNANOVDB_DEREF(direction));
3535 pnanovdb_vec3_t t0 = pnanovdb_vec3_mul(pnanovdb_vec3_sub(PNANOVDB_DEREF(bbox_min), PNANOVDB_DEREF(origin)), dir_inv);
3536 pnanovdb_vec3_t t1 = pnanovdb_vec3_mul(pnanovdb_vec3_sub(PNANOVDB_DEREF(bbox_max), PNANOVDB_DEREF(origin)), dir_inv);
3537 pnanovdb_vec3_t tmin3 = pnanovdb_vec3_min(t0, t1);
3538 pnanovdb_vec3_t tmax3 = pnanovdb_vec3_max(t0, t1);
3539 float tnear = pnanovdb_max(tmin3.x, pnanovdb_max(tmin3.y, tmin3.z));
3540 float tfar = pnanovdb_min(tmax3.x, pnanovdb_min(tmax3.y, tmax3.z));
3541 pnanovdb_bool_t hit = tnear <= tfar;
3542 PNANOVDB_DEREF(tmin) = pnanovdb_max(PNANOVDB_DEREF(tmin), tnear);
3543 PNANOVDB_DEREF(tmax) = pnanovdb_min(PNANOVDB_DEREF(tmax), tfar);
3544 return hit;
3545}
3546
3547PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_hdda_zero_crossing(
3548 pnanovdb_grid_type_t grid_type,
3549 pnanovdb_buf_t buf,
3550 PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc,
3551 PNANOVDB_IN(pnanovdb_vec3_t) origin, float tmin,
3552 PNANOVDB_IN(pnanovdb_vec3_t) direction, float tmax,
3553 PNANOVDB_INOUT(float) thit,
3554 PNANOVDB_INOUT(float) v
3555)
3556{
3557 pnanovdb_coord_t bbox_min = pnanovdb_root_get_bbox_min(buf, PNANOVDB_DEREF(acc).root);
3558 pnanovdb_coord_t bbox_max = pnanovdb_root_get_bbox_max(buf, PNANOVDB_DEREF(acc).root);
3559 pnanovdb_vec3_t bbox_minf = pnanovdb_coord_to_vec3(bbox_min);
3560 pnanovdb_vec3_t bbox_maxf = pnanovdb_coord_to_vec3(pnanovdb_coord_add(bbox_max, pnanovdb_coord_uniform(1)));
3561
3562 pnanovdb_bool_t hit = pnanovdb_hdda_ray_clip(PNANOVDB_REF(bbox_minf), PNANOVDB_REF(bbox_maxf), origin, PNANOVDB_REF(tmin), direction, PNANOVDB_REF(tmax));
3563 if (!hit || tmax > 1.0e20f)
3564 {
3565 return PNANOVDB_FALSE;
3566 }
3567
3568 pnanovdb_vec3_t pos = pnanovdb_hdda_ray_start(origin, tmin, direction);
3569 pnanovdb_coord_t ijk = pnanovdb_hdda_pos_to_ijk(PNANOVDB_REF(pos));
3570
3571 pnanovdb_address_t address = pnanovdb_readaccessor_get_value_address(PNANOVDB_GRID_TYPE_FLOAT, buf, acc, PNANOVDB_REF(ijk));
3572 float v0 = pnanovdb_read_float(buf, address);
3573
3574 pnanovdb_int32_t dim = pnanovdb_uint32_as_int32(pnanovdb_readaccessor_get_dim(PNANOVDB_GRID_TYPE_FLOAT, buf, acc, PNANOVDB_REF(ijk)));
3575 pnanovdb_hdda_t hdda;
3576 pnanovdb_hdda_init(PNANOVDB_REF(hdda), origin, tmin, direction, tmax, dim);
3577 while (pnanovdb_hdda_step(PNANOVDB_REF(hdda)))
3578 {
3579 pnanovdb_vec3_t pos_start = pnanovdb_hdda_ray_start(origin, hdda.tmin + 1.0001f, direction);
3580 ijk = pnanovdb_hdda_pos_to_ijk(PNANOVDB_REF(pos_start));
3581 dim = pnanovdb_uint32_as_int32(pnanovdb_readaccessor_get_dim(PNANOVDB_GRID_TYPE_FLOAT, buf, acc, PNANOVDB_REF(ijk)));
3582 pnanovdb_hdda_update(PNANOVDB_REF(hdda), origin, direction, dim);
3583 if (hdda.dim > 1 || !pnanovdb_readaccessor_is_active(grid_type, buf, acc, PNANOVDB_REF(ijk)))
3584 {
3585 continue;
3586 }
3587 while (pnanovdb_hdda_step(PNANOVDB_REF(hdda)) && pnanovdb_readaccessor_is_active(grid_type, buf, acc, PNANOVDB_REF(hdda.voxel)))
3588 {
3589 ijk = hdda.voxel;
3590 pnanovdb_address_t address = pnanovdb_readaccessor_get_value_address(PNANOVDB_GRID_TYPE_FLOAT, buf, acc, PNANOVDB_REF(ijk));
3591 PNANOVDB_DEREF(v) = pnanovdb_read_float(buf, address);
3592 if (PNANOVDB_DEREF(v) * v0 < 0.f)
3593 {
3594 PNANOVDB_DEREF(thit) = hdda.tmin;
3595 return PNANOVDB_TRUE;
3596 }
3597 }
3598 }
3599 return PNANOVDB_FALSE;
3600}
3601
3602#endif
3603
3604#endif // end of NANOVDB_PNANOVDB_H_HAS_BEEN_INCLUDED
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_version_get_minor(pnanovdb_uint32_t version)
Definition PNanoVDB.h:1406
PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_tile_count_root(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint32_t tile_count_root)
Definition PNanoVDB.h:1608
#define PNANOVDB_GRID_OFF_VERSION
Definition PNanoVDB.h:1271
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_readaccessor_get_value_address_and_level(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
Definition PNanoVDB.h:2848
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_semantic(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p)
Definition PNanoVDB.h:1480
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk)
Definition PNanoVDB.h:2547
PNANOVDB_FORCE_INLINE void pnanovdb_leaf_set_value_mask(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t p, pnanovdb_uint32_t bit_index, pnanovdb_bool_t value)
Definition PNanoVDB.h:1855
#define PNANOVDB_UPPER_OFF_VALUE_MASK
Definition PNanoVDB.h:1711
PNANOVDB_FORCE_INLINE float pnanovdb_map_get_matf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index)
Definition PNanoVDB.h:1192
#define PNANOVDB_TREE_OFF_NODE_COUNT_LOWER
Definition PNanoVDB.h:1540
#define PNANOVDB_GRIDBLINDMETADATA_OFF_VALUE_COUNT
Definition PNanoVDB.h:1464
PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_gridblindmetadata_get_data_offset(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p)
Definition PNanoVDB.h:1471
PNANOVDB_STATIC_CONST float pnanovdb_dither_lut[512]
Definition PNanoVDB.h:3224
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_value_size(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p)
Definition PNanoVDB.h:1477
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_root_tile_get_state(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t p)
Definition PNanoVDB.h:1677
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_root_get_tile_count(pnanovdb_buf_t buf, pnanovdb_root_handle_t p)
Definition PNanoVDB.h:1639
PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_read_coord(pnanovdb_buf_t buf, pnanovdb_address_t address)
Definition PNanoVDB.h:970
PNANOVDB_FORCE_INLINE void pnanovdb_lower_set_value_mask(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p, pnanovdb_uint32_t bit_index, pnanovdb_bool_t value)
Definition PNanoVDB.h:1800
#define PNANOVDB_UPPER_OFF_FLAGS
Definition PNanoVDB.h:1710
#define PNANOVDB_GRID_TYPE_CAP
Definition PNanoVDB.h:1122
#define PNANOVDB_GRID_TYPE_FLOAT
Definition PNanoVDB.h:1094
PNANOVDB_FORCE_INLINE float pnanovdb_map_get_invmatf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index)
Definition PNanoVDB.h:1195
PNANOVDB_FORCE_INLINE float pnanovdb_dither_lookup(pnanovdb_bool_t enabled, int offset)
Definition PNanoVDB.h:3292
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint64_dec(pnanovdb_uint64_t a)
Definition PNanoVDB.h:773
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_index_get_max_index(pnanovdb_buf_t buf, pnanovdb_address_t max_address)
Definition PNanoVDB.h:2148
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)
Definition PNanoVDB.h:2631
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)
Definition PNanoVDB.h:1381
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_data_type(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p)
Definition PNanoVDB.h:1486
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_stddev_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root)
Definition PNanoVDB.h:2513
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_lower_get_value_mask(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p, pnanovdb_uint32_t bit_index)
Definition PNanoVDB.h:1785
#define PNANOVDB_GRID_OFF_BLIND_METADATA_OFFSET
Definition PNanoVDB.h:1282
#define PNANOVDB_MAP_OFF_MATF
Definition PNanoVDB.h:1183
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_upper_get_flags(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p)
Definition PNanoVDB.h:1720
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_leaf_coord_to_offset(PNANOVDB_IN(pnanovdb_coord_t) ijk)
Definition PNanoVDB.h:2052
#define PNANOVDB_ROOT_OFF_BBOX_MIN
Definition PNanoVDB.h:1629
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_stddev_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node)
Definition PNanoVDB.h:2341
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_tile_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t root_tile)
Definition PNanoVDB.h:2519
PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_flags(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t flags)
Definition PNanoVDB.h:1354
PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_value_strides_bits[32]
Definition PNanoVDB.h:1154
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_upper_is_active_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
Definition PNanoVDB.h:3002
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint64_bit_mask(pnanovdb_uint32_t bit_idx)
Definition PNanoVDB.h:783
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_name(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_uint32_t index)
Definition PNanoVDB.h:1489
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_root_is_active_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
Definition PNanoVDB.h:3020
#define PNANOVDB_ROOT_TILE_OFF_CHILD
Definition PNanoVDB.h:1668
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)
Definition PNanoVDB.h:1596
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_uint64_to_uint32_lsr(pnanovdb_uint64_t a, pnanovdb_uint32_t b)
Definition PNanoVDB.h:778
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_value_address_and_level_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
Definition PNanoVDB.h:2767
PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_grid_size(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint64_t grid_size)
Definition PNanoVDB.h:1363
#define PNANOVDB_GRID_OFF_GRID_COUNT
Definition PNanoVDB.h:1274
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_class(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p)
Definition PNanoVDB.h:1323
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_node_offset_lower(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p)
Definition PNanoVDB.h:1550
PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_checksum(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint64_t checksum)
Definition PNanoVDB.h:1348
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, PNANOVDB_IN(pnanovdb_coord_t) ijk)
Definition PNanoVDB.h:2384
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_uint64_any_bit(pnanovdb_uint64_t a)
Definition PNanoVDB.h:793
#define PNANOVDB_LEAF_OFF_VALUE_MASK
Definition PNanoVDB.h:1832
PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_table_strides_bits[32]
Definition PNanoVDB.h:1156
PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_lower_get_bbox_max(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p)
Definition PNanoVDB.h:1779
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_tile_count_lower(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p)
Definition PNanoVDB.h:1568
PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_read_vec3u8(pnanovdb_buf_t buf, pnanovdb_address_t address)
Definition PNanoVDB.h:1006
#define PNANOVDB_GRID_OFF_DATA2
Definition PNanoVDB.h:1286
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)
Definition PNanoVDB.h:1581
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)
Definition PNanoVDB.h:1849
PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_first_root(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_root_handle_t root)
Definition PNanoVDB.h:2046
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_pointindex_get_point_count(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
Definition PNanoVDB.h:2267
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_value_address_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
Definition PNanoVDB.h:2787
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_read_bit(pnanovdb_buf_t buf, pnanovdb_address_t address, pnanovdb_uint32_t bit_offset)
Definition PNanoVDB.h:1016
PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_root_get_bbox_max(pnanovdb_buf_t buf, pnanovdb_root_handle_t p)
Definition PNanoVDB.h:1636
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address_and_level(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
Definition PNanoVDB.h:2525
PNANOVDB_FORCE_INLINE void pnanovdb_write_float(pnanovdb_buf_t buf, pnanovdb_address_t address, float value)
Definition PNanoVDB.h:1062
PNANOVDB_FORCE_INLINE void pnanovdb_leaf_pointindex_set_on(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, pnanovdb_uint32_t i)
Definition PNanoVDB.h:2299
PNANOVDB_FORCE_INLINE void pnanovdb_gridblindmetadata_set_value_size(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_uint32_t value_size)
Definition PNanoVDB.h:1499
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_get_value_mask(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t p, pnanovdb_uint32_t bit_index)
Definition PNanoVDB.h:1844
#define PNANOVDB_GRIDBLINDMETADATA_OFF_VALUE_SIZE
Definition PNanoVDB.h:1465
PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_blind_metadata_count(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t metadata_count)
Definition PNanoVDB.h:1384
PNANOVDB_FORCE_INLINE void pnanovdb_root_set_tile_count(pnanovdb_buf_t buf, pnanovdb_root_handle_t p, pnanovdb_uint32_t tile_count)
Definition PNanoVDB.h:1649
#define PNANOVDB_MAP_OFF_VECD
Definition PNanoVDB.h:1189
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_value_address_and_level(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
Definition PNanoVDB.h:2366
PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_voxel_count(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_uint64_t voxel_count)
Definition PNanoVDB.h:1611
#define PNANOVDB_ROOT_OFF_TABLE_SIZE
Definition PNanoVDB.h:1631
PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_leaf_get_bbox_min(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t p)
Definition PNanoVDB.h:1838
#define PNANOVDB_LEAF_OFF_BBOX_DIF_AND_FLAGS
Definition PNanoVDB.h:1831
PNANOVDB_FORCE_INLINE void pnanovdb_lower_set_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, pnanovdb_uint32_t n, pnanovdb_leaf_handle_t leaf)
Definition PNanoVDB.h:2396
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint64_offset(pnanovdb_uint64_t a, pnanovdb_uint32_t b)
Definition PNanoVDB.h:763
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_gridblindmetadata_get_value_count(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p)
Definition PNanoVDB.h:1474
PNANOVDB_FORCE_INLINE pnanovdb_gridblindmetadata_handle_t pnanovdb_grid_get_gridblindmetadata(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, pnanovdb_uint32_t index)
Definition PNanoVDB.h:1931
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_root_get_dim_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
Definition PNanoVDB.h:2930
PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_upper_get_bbox_max(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p)
Definition PNanoVDB.h:1717
#define PNANOVDB_LOWER_OFF_FLAGS
Definition PNanoVDB.h:1772
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_version(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p)
Definition PNanoVDB.h:1294
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_readaccessor_get_value_address_bit(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_uint32_t) bit_index)
Definition PNanoVDB.h:2879
PNANOVDB_FORCE_INLINE float pnanovdb_map_get_taperf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index)
Definition PNanoVDB.h:1201
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_leaf_get_dim_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
Definition PNanoVDB.h:2889
PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_version(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t version)
Definition PNanoVDB.h:1351
PNANOVDB_FORCE_INLINE void pnanovdb_map_set_taperd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index, double taperd)
Definition PNanoVDB.h:1238
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_node_offset_root(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p)
Definition PNanoVDB.h:1556
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_node_offset_leaf(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p)
Definition PNanoVDB.h:1547
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_uint64_and(pnanovdb_uint64_t a, pnanovdb_uint64_t b)
Definition PNanoVDB.h:788
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)
Definition PNanoVDB.h:2323
PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_first_lower(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_lower_handle_t lower)
Definition PNanoVDB.h:2040
PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_map_apply(pnanovdb_buf_t buf, pnanovdb_map_handle_t map, PNANOVDB_IN(pnanovdb_vec3_t) src)
Definition PNanoVDB.h:3069
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindex_get_ave_index(pnanovdb_buf_t buf, pnanovdb_address_t ave_address)
Definition PNanoVDB.h:2214
PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_minmax_strides_bits[32]
Definition PNanoVDB.h:1158
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindex_get_last_offset(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
Definition PNanoVDB.h:2180
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_stddev_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t node)
Definition PNanoVDB.h:2428
#define PNANOVDB_GRID_TYPE_ONINDEX
Definition PNanoVDB.h:1113
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_uint32_countbits(pnanovdb_uint32_t value)
Definition PNanoVDB.h:670
PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_grid_world_to_index_dirf(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, PNANOVDB_IN(pnanovdb_vec3_t) src)
Definition PNanoVDB.h:3129
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_table_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node, pnanovdb_uint32_t n)
Definition PNanoVDB.h:2347
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_pointindex_get_last(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, pnanovdb_uint32_t i)
Definition PNanoVDB.h:2276
PNANOVDB_FORCE_INLINE void pnanovdb_write_double(pnanovdb_buf_t buf, pnanovdb_address_t address, double value)
Definition PNanoVDB.h:1066
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_lower_get_flags(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p)
Definition PNanoVDB.h:1782
PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_grid_index_to_worldf(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, PNANOVDB_IN(pnanovdb_vec3_t) src)
Definition PNanoVDB.h:3123
PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_stat_strides_bits[32]
Definition PNanoVDB.h:1162
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_upper_get_value_mask(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p, pnanovdb_uint32_t bit_index)
Definition PNanoVDB.h:1723
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)
Definition PNanoVDB.h:1602
PNANOVDB_FORCE_INLINE void pnanovdb_map_set_invmatd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index, double invmatd)
Definition PNanoVDB.h:1232
PNANOVDB_FORCE_INLINE pnanovdb_upper_handle_t pnanovdb_root_get_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, pnanovdb_root_tile_handle_t tile)
Definition PNanoVDB.h:1983
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_uint64_countbits(pnanovdb_uint64_t value)
Definition PNanoVDB.h:690
#define PNANOVDB_GRID_OFF_GRID_INDEX
Definition PNanoVDB.h:1273
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_blind_metadata_count(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p)
Definition PNanoVDB.h:1332
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_lower_coord_to_offset(PNANOVDB_IN(pnanovdb_coord_t) ijk)
Definition PNanoVDB.h:2316
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)
Definition PNanoVDB.h:2308
#define PNANOVDB_UPPER_OFF_BBOX_MIN
Definition PNanoVDB.h:1708
PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_data1(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint64_t data1)
Definition PNanoVDB.h:1390
PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_lower_get_table_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node, pnanovdb_uint32_t n)
Definition PNanoVDB.h:2353
#define PNANOVDB_GRID_OFF_MAP
Definition PNanoVDB.h:1277
#define PNANOVDB_LOWER_OFF_BBOX_MIN
Definition PNanoVDB.h:1770
PNANOVDB_FORCE_INLINE void pnanovdb_root_tile_set_child(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t p, pnanovdb_int64_t child)
Definition PNanoVDB.h:1684
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)
Definition PNanoVDB.h:1590
PNANOVDB_FORCE_INLINE float pnanovdb_leaf_fp16_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk)
Definition PNanoVDB.h:2123
PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_grid_type(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t grid_type)
Definition PNanoVDB.h:1378
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_readaccessor_iscached2(PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, int dirty)
Definition PNanoVDB.h:2746
#define PNANOVDB_GRIDBLINDMETADATA_OFF_SEMANTIC
Definition PNanoVDB.h:1466
#define PNANOVDB_GRID_OFF_WORLD_BBOX
Definition PNanoVDB.h:1278
#define PNANOVDB_TREE_OFF_NODE_OFFSET_UPPER
Definition PNanoVDB.h:1537
PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_data0(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t data0)
Definition PNanoVDB.h:1387
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_voxel_count(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p)
Definition PNanoVDB.h:1577
PNANOVDB_FORCE_INLINE pnanovdb_map_handle_t pnanovdb_grid_get_map(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p)
Definition PNanoVDB.h:1312
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_value_address_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
Definition PNanoVDB.h:2761
#define PNANOVDB_LOWER_OFF_VALUE_MASK
Definition PNanoVDB.h:1773
PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_first_leaf(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_leaf_handle_t leaf)
Definition PNanoVDB.h:2037
PNANOVDB_FORCE_INLINE double pnanovdb_map_get_matd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index)
Definition PNanoVDB.h:1204
PNANOVDB_FORCE_INLINE pnanovdb_root_tile_handle_t pnanovdb_root_get_tile_zero(pnanovdb_grid_type_t grid_type, pnanovdb_root_handle_t root)
Definition PNanoVDB.h:1971
PNANOVDB_FORCE_INLINE void pnanovdb_write_int32(pnanovdb_buf_t buf, pnanovdb_address_t address, pnanovdb_int32_t value)
Definition PNanoVDB.h:1054
#define PNANOVDB_ROOT_OFF_BBOX_MAX
Definition PNanoVDB.h:1630
PNANOVDB_FORCE_INLINE void pnanovdb_write_uint64(pnanovdb_buf_t buf, pnanovdb_address_t address, pnanovdb_uint64_t value)
Definition PNanoVDB.h:1050
#define PNANOVDB_UPPER_OFF_CHILD_MASK
Definition PNanoVDB.h:1712
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindex_get_max_index(pnanovdb_buf_t buf, pnanovdb_address_t max_address)
Definition PNanoVDB.h:2203
PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_minmax_aligns_bits[32]
Definition PNanoVDB.h:1160
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)
Definition PNanoVDB.h:1605
PNANOVDB_STATIC_CONST pnanovdb_grid_type_constants_t pnanovdb_grid_type_constants[32]
Definition PNanoVDB.h:1897
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_tile_count_root(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p)
Definition PNanoVDB.h:1574
#define PNANOVDB_MAP_OFF_VECF
Definition PNanoVDB.h:1185
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)
Definition PNanoVDB.h:1797
#define PNANOVDB_GRID_TYPE_VEC3U16
Definition PNanoVDB.h:1118
PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_uint64_diff(pnanovdb_uint64_t a, pnanovdb_uint64_t b)
Definition PNanoVDB.h:768
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)
Definition PNanoVDB.h:1643
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_make_version(pnanovdb_uint32_t major, pnanovdb_uint32_t minor, pnanovdb_uint32_t patch_num)
Definition PNanoVDB.h:1397
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_value_address_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
Definition PNanoVDB.h:2812
PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_grid_index(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t grid_index)
Definition PNanoVDB.h:1357
#define PNANOVDB_TREE_OFF_VOXEL_COUNT
Definition PNanoVDB.h:1545
PNANOVDB_FORCE_INLINE void pnanovdb_write_vec3(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_vec3_t) value)
Definition PNanoVDB.h:1076
PNANOVDB_FORCE_INLINE void pnanovdb_map_set_invmatf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index, float invmatf)
Definition PNanoVDB.h:1220
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)
Definition PNanoVDB.h:2476
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)
Definition PNanoVDB.h:2390
PNANOVDB_FORCE_INLINE void pnanovdb_map_set_vecf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index, float vecf)
Definition PNanoVDB.h:1223
PNANOVDB_FORCE_INLINE float pnanovdb_leaf_fp4_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk)
Definition PNanoVDB.h:2113
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
Definition PNanoVDB.h:2842
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_value_address_and_level(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
Definition PNanoVDB.h:2453
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_pointindex_get_value(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, pnanovdb_uint32_t i)
Definition PNanoVDB.h:2281
#define PNANOVDB_GRID_TYPE_POINTINDEX
Definition PNanoVDB.h:1116
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_grid_get_data2(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p)
Definition PNanoVDB.h:1341
#define PNANOVDB_LEAF_TABLE_NEG_OFF_QUANTUM
Definition PNanoVDB.h:1836
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_upper_get_dim_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
Definition PNanoVDB.h:2912
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_root_tile_get_child_mask(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t tile)
Definition PNanoVDB.h:1978
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_readaccessor_iscached1(PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, int dirty)
Definition PNanoVDB.h:2736
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_read_uint16(pnanovdb_buf_t buf, pnanovdb_address_t address)
Definition PNanoVDB.h:987
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_table_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t node, pnanovdb_uint32_t n)
Definition PNanoVDB.h:2434
#define PNANOVDB_MAP_OFF_TAPERF
Definition PNanoVDB.h:1186
#define PNANOVDB_TREE_OFF_NODE_OFFSET_LEAF
Definition PNanoVDB.h:1535
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_root_pointindex_get_point_range(pnanovdb_buf_t buf, pnanovdb_address_t value_address, PNANOVDB_IN(pnanovdb_coord_t) ijk, pnanovdb_uint32_t level, PNANOVDB_INOUT(pnanovdb_uint64_t) range_begin, PNANOVDB_INOUT(pnanovdb_uint64_t) range_end)
Definition PNanoVDB.h:2645
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_grid_get_magic(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p)
Definition PNanoVDB.h:1288
PNANOVDB_FORCE_INLINE float pnanovdb_leaf_fp8_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk)
Definition PNanoVDB.h:2118
PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_grid_get_blind_metadata_offset(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p)
Definition PNanoVDB.h:1329
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_node_count_leaf(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p)
Definition PNanoVDB.h:1559
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_grid_get_checksum(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p)
Definition PNanoVDB.h:1291
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)
Definition PNanoVDB.h:1584
PNANOVDB_FORCE_INLINE void pnanovdb_root_tile_set_key(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t p, pnanovdb_uint64_t key)
Definition PNanoVDB.h:1681
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_read_uint32(pnanovdb_buf_t buf, pnanovdb_address_t address)
Definition PNanoVDB.h:946
#define PNANOVDB_GRID_OFF_CHECKSUM
Definition PNanoVDB.h:1270
#define PNANOVDB_MAP_OFF_INVMATD
Definition PNanoVDB.h:1188
PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_data2(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint64_t data2)
Definition PNanoVDB.h:1393
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)
Definition PNanoVDB.h:1593
#define PNANOVDB_TREE_OFF_NODE_OFFSET_ROOT
Definition PNanoVDB.h:1538
#define PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_CLASS
Definition PNanoVDB.h:1467
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_index(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p)
Definition PNanoVDB.h:1300
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, PNANOVDB_IN(pnanovdb_coord_t) ijk)
Definition PNanoVDB.h:2470
#define PNANOVDB_LEAF_TABLE_NEG_OFF_MINIMUM
Definition PNanoVDB.h:1835
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)
Definition PNanoVDB.h:1807
PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_lower_get_bbox_min(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p)
Definition PNanoVDB.h:1776
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_version_get_major(pnanovdb_uint32_t version)
Definition PNanoVDB.h:1402
#define PNANOVDB_GRID_OFF_DATA1
Definition PNanoVDB.h:1285
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)
Definition PNanoVDB.h:1940
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_name(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t index)
Definition PNanoVDB.h:1309
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_node_count_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p)
Definition PNanoVDB.h:1565
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_grid_get_data1(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p)
Definition PNanoVDB.h:1338
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_ave_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node)
Definition PNanoVDB.h:2335
#define PNANOVDB_GRID_OFF_GRID_TYPE
Definition PNanoVDB.h:1281
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)
Definition PNanoVDB.h:2495
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)
Definition PNanoVDB.h:1745
#define PNANOVDB_MAP_OFF_INVMATF
Definition PNanoVDB.h:1184
PNANOVDB_FORCE_INLINE float pnanovdb_root_fp8_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk, pnanovdb_uint32_t level)
Definition PNanoVDB.h:2575
PNANOVDB_FORCE_INLINE pnanovdb_int32_t pnanovdb_read_int32(pnanovdb_buf_t buf, pnanovdb_address_t address)
Definition PNanoVDB.h:954
#define PNANOVDB_GRID_SIZE
Definition PNanoVDB.h:1267
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindex_get_min_index(pnanovdb_buf_t buf, pnanovdb_address_t min_address)
Definition PNanoVDB.h:2192
PNANOVDB_FORCE_INLINE void pnanovdb_map_set_taperf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index, float taperf)
Definition PNanoVDB.h:1226
#define PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_OFFSET
Definition PNanoVDB.h:1463
#define PNANOVDB_ROOT_TILE_OFF_KEY
Definition PNanoVDB.h:1667
#define PNANOVDB_TREE_OFF_NODE_OFFSET_LOWER
Definition PNanoVDB.h:1536
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)
Definition PNanoVDB.h:2793
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_is_active_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
Definition PNanoVDB.h:2978
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)
Definition PNanoVDB.h:1794
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_tree_get_node_offset_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p)
Definition PNanoVDB.h:1553
PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_magic(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint64_t magic)
Definition PNanoVDB.h:1345
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_readaccessor_is_active(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk)
Definition PNanoVDB.h:3043
#define PNANOVDB_UPPER_OFF_BBOX_MAX
Definition PNanoVDB.h:1709
PNANOVDB_FORCE_INLINE void pnanovdb_map_set_vecd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index, double vecd)
Definition PNanoVDB.h:1235
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_lower_get_max_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t node)
Definition PNanoVDB.h:2329
PNANOVDB_FORCE_INLINE void pnanovdb_map_set_matd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index, double matd)
Definition PNanoVDB.h:1229
#define PNANOVDB_MAP_OFF_MATD
Definition PNanoVDB.h:1187
#define PNANOVDB_LOWER_OFF_BBOX_MAX
Definition PNanoVDB.h:1771
PNANOVDB_FORCE_INLINE void pnanovdb_root_set_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, pnanovdb_root_tile_handle_t tile, pnanovdb_upper_handle_t upper)
Definition PNanoVDB.h:1990
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_lower_get_dim_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
Definition PNanoVDB.h:2894
PNANOVDB_FORCE_INLINE void pnanovdb_write_uint32(pnanovdb_buf_t buf, pnanovdb_address_t address, pnanovdb_uint32_t value)
Definition PNanoVDB.h:1046
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_node_count_lower(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p)
Definition PNanoVDB.h:1562
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_readaccessor_get_dim(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk)
Definition PNanoVDB.h:2952
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)
Definition PNanoVDB.h:1735
PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_map_apply_jacobi(pnanovdb_buf_t buf, pnanovdb_map_handle_t map, PNANOVDB_IN(pnanovdb_vec3_t) src)
Definition PNanoVDB.h:3093
PNANOVDB_FORCE_INLINE pnanovdb_root_handle_t pnanovdb_tree_get_root(pnanovdb_buf_t buf, pnanovdb_tree_handle_t tree)
Definition PNanoVDB.h:1955
PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_grid_class(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t grid_class)
Definition PNanoVDB.h:1375
#define PNANOVDB_GRID_OFF_GRID_CLASS
Definition PNanoVDB.h:1280
PNANOVDB_FORCE_INLINE double pnanovdb_read_double(pnanovdb_buf_t buf, pnanovdb_address_t address)
Definition PNanoVDB.h:966
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_data0(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p)
Definition PNanoVDB.h:1335
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_readaccessor_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk)
Definition PNanoVDB.h:2873
PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_root_get_bbox_min(pnanovdb_buf_t buf, pnanovdb_root_handle_t p)
Definition PNanoVDB.h:1633
PNANOVDB_FORCE_INLINE float pnanovdb_root_fp16_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk, pnanovdb_uint32_t level)
Definition PNanoVDB.h:2589
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_count(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p)
Definition PNanoVDB.h:1303
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_background_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root)
Definition PNanoVDB.h:2489
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)
Definition PNanoVDB.h:1366
PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_read_int64(pnanovdb_buf_t buf, pnanovdb_address_t address)
Definition PNanoVDB.h:962
PNANOVDB_FORCE_INLINE double pnanovdb_map_get_vecd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index)
Definition PNanoVDB.h:1210
PNANOVDB_FORCE_INLINE double pnanovdb_map_get_invmatd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index)
Definition PNanoVDB.h:1207
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_root_tile_get_key(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t p)
Definition PNanoVDB.h:1671
PNANOVDB_FORCE_INLINE void pnanovdb_upper_set_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, pnanovdb_uint32_t n, pnanovdb_lower_handle_t lower)
Definition PNanoVDB.h:2482
PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_map_apply_inverse_jacobi(pnanovdb_buf_t buf, pnanovdb_map_handle_t map, PNANOVDB_IN(pnanovdb_vec3_t) src)
Definition PNanoVDB.h:3105
PNANOVDB_FORCE_INLINE float pnanovdb_root_fpn_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk, pnanovdb_uint32_t level)
Definition PNanoVDB.h:2603
PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_read_vec3(pnanovdb_buf_t buf, pnanovdb_address_t address)
Definition PNanoVDB.h:978
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)
Definition PNanoVDB.h:2236
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_lower_is_active_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc)
Definition PNanoVDB.h:2984
#define PNANOVDB_GRID_OFF_DATA0
Definition PNanoVDB.h:1284
PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_first_gridblindmetadata(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_gridblindmetadata_handle_t gridblindmetadata)
Definition PNanoVDB.h:2031
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)
Definition PNanoVDB.h:2285
PNANOVDB_FORCE_INLINE int pnanovdb_readaccessor_computedirty(PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_IN(pnanovdb_coord_t) ijk)
Definition PNanoVDB.h:2756
#define PNANOVDB_GRIDBLINDMETADATA_OFF_NAME
Definition PNanoVDB.h:1469
PNANOVDB_FORCE_INLINE void pnanovdb_gridblindmetadata_set_semantic(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_uint32_t semantic)
Definition PNanoVDB.h:1502
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)
Definition PNanoVDB.h:1599
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_lower_get_child_mask(pnanovdb_buf_t buf, pnanovdb_lower_handle_t p, pnanovdb_uint32_t bit_index)
Definition PNanoVDB.h:1789
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)
Definition PNanoVDB.h:1646
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_value_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, PNANOVDB_IN(pnanovdb_coord_t) ijk)
Definition PNanoVDB.h:2089
#define PNANOVDB_GRID_OFF_GRID_NAME
Definition PNanoVDB.h:1276
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_index_get_min_index(pnanovdb_buf_t buf, pnanovdb_address_t min_address)
Definition PNanoVDB.h:2143
#define PNANOVDB_TREE_OFF_NODE_COUNT_LEAF
Definition PNanoVDB.h:1539
PNANOVDB_FORCE_INLINE pnanovdb_lower_handle_t pnanovdb_upper_get_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t upper, pnanovdb_uint32_t n)
Definition PNanoVDB.h:2446
PNANOVDB_FORCE_INLINE double pnanovdb_map_get_taperd(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index)
Definition PNanoVDB.h:1213
PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_upper_get_table_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t node, pnanovdb_uint32_t n)
Definition PNanoVDB.h:2440
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_max_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t node)
Definition PNanoVDB.h:2065
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_onindex_get_dev_index(pnanovdb_buf_t buf, pnanovdb_address_t dev_address)
Definition PNanoVDB.h:2225
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)
Definition PNanoVDB.h:1732
#define PNANOVDB_GRID_OFF_VOXEL_SIZE
Definition PNanoVDB.h:1279
PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_grid_world_to_indexf(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, PNANOVDB_IN(pnanovdb_vec3_t) src)
Definition PNanoVDB.h:3117
PNANOVDB_FORCE_INLINE void pnanovdb_write_coord(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) value)
Definition PNanoVDB.h:1070
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_read_uint64(pnanovdb_buf_t buf, pnanovdb_address_t address)
Definition PNanoVDB.h:950
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_gridblindmetadata_get_data_class(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p)
Definition PNanoVDB.h:1483
PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_grid_index_to_world_dirf(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid, PNANOVDB_IN(pnanovdb_vec3_t) src)
Definition PNanoVDB.h:3135
PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_map_apply_inverse(pnanovdb_buf_t buf, pnanovdb_map_handle_t map, PNANOVDB_IN(pnanovdb_vec3_t) src)
Definition PNanoVDB.h:3081
PNANOVDB_FORCE_INLINE void pnanovdb_gridblindmetadata_set_value_count(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_uint64_t value_count)
Definition PNanoVDB.h:1496
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_tree_get_tile_count_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p)
Definition PNanoVDB.h:1571
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_upper_get_child_mask(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p, pnanovdb_uint32_t bit_index)
Definition PNanoVDB.h:1727
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_onindex_has_stats(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
Definition PNanoVDB.h:2187
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_ave_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t node)
Definition PNanoVDB.h:2422
#define PNANOVDB_GRID_OFF_MAGIC
Definition PNanoVDB.h:1269
#define PNANOVDB_GRIDBLINDMETADATA_OFF_DATA_TYPE
Definition PNanoVDB.h:1468
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_grid_get_grid_size(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p)
Definition PNanoVDB.h:1306
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_table_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t node, pnanovdb_uint32_t n)
Definition PNanoVDB.h:2083
#define PNANOVDB_LEAF_OFF_BBOX_MIN
Definition PNanoVDB.h:1830
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)
Definition PNanoVDB.h:1372
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)
Definition PNanoVDB.h:2410
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address_bit(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_uint32_t) bit_index)
Definition PNanoVDB.h:2553
PNANOVDB_FORCE_INLINE pnanovdb_leaf_handle_t pnanovdb_lower_get_child(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_lower_handle_t lower, pnanovdb_uint32_t n)
Definition PNanoVDB.h:2359
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_pointindex_get_offset(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
Definition PNanoVDB.h:2263
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_read_uint8(pnanovdb_buf_t buf, pnanovdb_address_t address)
Definition PNanoVDB.h:992
PNANOVDB_FORCE_INLINE pnanovdb_coord_t pnanovdb_upper_get_bbox_min(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p)
Definition PNanoVDB.h:1714
PNANOVDB_FORCE_INLINE void pnanovdb_gridblindmetadata_set_data_type(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_uint32_t data_type)
Definition PNanoVDB.h:1508
PNANOVDB_FORCE_INLINE pnanovdb_vec3_t pnanovdb_read_vec3u16(pnanovdb_buf_t buf, pnanovdb_address_t address)
Definition PNanoVDB.h:997
PNANOVDB_FORCE_INLINE void pnanovdb_upper_set_value_mask(pnanovdb_buf_t buf, pnanovdb_upper_handle_t p, pnanovdb_uint32_t bit_index, pnanovdb_bool_t value)
Definition PNanoVDB.h:1738
PNANOVDB_FORCE_INLINE float pnanovdb_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address)
Definition PNanoVDB.h:958
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_coord_to_key(PNANOVDB_IN(pnanovdb_coord_t) ijk)
Definition PNanoVDB.h:1995
PNANOVDB_FORCE_INLINE void pnanovdb_tree_set_first_upper(pnanovdb_buf_t buf, pnanovdb_tree_handle_t p, pnanovdb_upper_handle_t upper)
Definition PNanoVDB.h:2043
PNANOVDB_FORCE_INLINE void pnanovdb_map_set_matf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index, float matf)
Definition PNanoVDB.h:1217
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_readaccessor_iscached0(PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, int dirty)
Definition PNanoVDB.h:2726
#define PNANOVDB_GRID_OFF_BLIND_METADATA_COUNT
Definition PNanoVDB.h:1283
#define PNANOVDB_LEAF_TABLE_NEG_OFF_BBOX_DIF_AND_FLAGS
Definition PNanoVDB.h:1834
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_leaf_get_bbox_dif_and_flags(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t p)
Definition PNanoVDB.h:1841
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_root_pointindex_get_point_address_range(pnanovdb_buf_t buf, pnanovdb_grid_type_t value_type, pnanovdb_address_t value_address, pnanovdb_address_t blindmetadata_value_address, PNANOVDB_IN(pnanovdb_coord_t) ijk, pnanovdb_uint32_t level, PNANOVDB_INOUT(pnanovdb_address_t) address_begin, PNANOVDB_INOUT(pnanovdb_address_t) address_end)
Definition PNanoVDB.h:2674
#define PNANOVDB_TREE_OFF_TILE_COUNT_UPPER
Definition PNanoVDB.h:1543
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_stddev_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t node)
Definition PNanoVDB.h:2077
#define PNANOVDB_TREE_OFF_TILE_COUNT_LOWER
Definition PNanoVDB.h:1542
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_max_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root)
Definition PNanoVDB.h:2501
PNANOVDB_FORCE_INLINE void pnanovdb_grid_set_grid_count(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t grid_count)
Definition PNanoVDB.h:1360
PNANOVDB_FORCE_INLINE double pnanovdb_grid_get_world_bbox(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t index)
Definition PNanoVDB.h:1317
PNANOVDB_FORCE_INLINE pnanovdb_int64_t pnanovdb_root_tile_get_child(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t p)
Definition PNanoVDB.h:1674
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_pointindex_get_first(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf, pnanovdb_uint32_t i)
Definition PNanoVDB.h:2271
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_min_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t node)
Definition PNanoVDB.h:2059
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_ave_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root)
Definition PNanoVDB.h:2507
PNANOVDB_STATIC_CONST pnanovdb_uint32_t pnanovdb_grid_type_leaf_type[32]
Definition PNanoVDB.h:1164
PNANOVDB_FORCE_INLINE void pnanovdb_write_int64(pnanovdb_buf_t buf, pnanovdb_address_t address, pnanovdb_int64_t value)
Definition PNanoVDB.h:1058
#define PNANOVDB_MAP_OFF_TAPERD
Definition PNanoVDB.h:1190
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_upper_get_max_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_upper_handle_t node)
Definition PNanoVDB.h:2416
#define PNANOVDB_GRID_OFF_GRID_SIZE
Definition PNanoVDB.h:1275
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_flags(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p)
Definition PNanoVDB.h:1297
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)
Definition PNanoVDB.h:2163
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)
Definition PNanoVDB.h:1852
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)
Definition PNanoVDB.h:2617
PNANOVDB_FORCE_INLINE double pnanovdb_grid_get_voxel_size(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p, pnanovdb_uint32_t index)
Definition PNanoVDB.h:1320
PNANOVDB_FORCE_INLINE void pnanovdb_gridblindmetadata_set_data_offset(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_int64_t data_offset)
Definition PNanoVDB.h:1493
#define PNANOVDB_TREE_OFF_NODE_COUNT_UPPER
Definition PNanoVDB.h:1541
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_root_get_value_address_and_level_and_cache(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk, PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, PNANOVDB_INOUT(pnanovdb_uint32_t) level)
Definition PNanoVDB.h:2818
PNANOVDB_FORCE_INLINE void pnanovdb_gridblindmetadata_set_data_class(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_uint32_t data_class)
Definition PNanoVDB.h:1505
#define PNANOVDB_GRID_TYPE_VEC3U8
Definition PNanoVDB.h:1117
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)
Definition PNanoVDB.h:1369
#define PNANOVDB_TREE_OFF_TILE_COUNT_ROOT
Definition PNanoVDB.h:1544
#define PNANOVDB_ROOT_TILE_OFF_STATE
Definition PNanoVDB.h:1669
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)
Definition PNanoVDB.h:1587
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_leaf_onindex_get_value_count(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
Definition PNanoVDB.h:2172
#define PNANOVDB_GRIDBLINDMETADATA_SIZE
Definition PNanoVDB.h:1461
PNANOVDB_FORCE_INLINE pnanovdb_bool_t pnanovdb_leaf_index_has_stats(pnanovdb_buf_t buf, pnanovdb_leaf_handle_t leaf)
Definition PNanoVDB.h:2138
PNANOVDB_FORCE_INLINE pnanovdb_tree_handle_t pnanovdb_grid_get_tree(pnanovdb_buf_t buf, pnanovdb_grid_handle_t grid)
Definition PNanoVDB.h:1948
PNANOVDB_FORCE_INLINE float pnanovdb_map_get_vecf(pnanovdb_buf_t buf, pnanovdb_map_handle_t p, pnanovdb_uint32_t index)
Definition PNanoVDB.h:1198
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_upper_coord_to_offset(PNANOVDB_IN(pnanovdb_coord_t) ijk)
Definition PNanoVDB.h:2403
PNANOVDB_FORCE_INLINE pnanovdb_root_tile_handle_t pnanovdb_root_get_tile(pnanovdb_grid_type_t grid_type, pnanovdb_root_handle_t root, pnanovdb_uint32_t n)
Definition PNanoVDB.h:1963
PNANOVDB_FORCE_INLINE void pnanovdb_root_tile_set_state(pnanovdb_buf_t buf, pnanovdb_root_tile_handle_t p, pnanovdb_uint32_t state)
Definition PNanoVDB.h:1687
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_index_get_ave_index(pnanovdb_buf_t buf, pnanovdb_address_t ave_address)
Definition PNanoVDB.h:2153
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_grid_get_grid_type(pnanovdb_buf_t buf, pnanovdb_grid_handle_t p)
Definition PNanoVDB.h:1326
PNANOVDB_FORCE_INLINE pnanovdb_uint64_t pnanovdb_leaf_index_get_dev_index(pnanovdb_buf_t buf, pnanovdb_address_t dev_address)
Definition PNanoVDB.h:2158
PNANOVDB_FORCE_INLINE void pnanovdb_readaccessor_init(PNANOVDB_INOUT(pnanovdb_readaccessor_t) acc, pnanovdb_root_handle_t root)
Definition PNanoVDB.h:2715
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)
Definition PNanoVDB.h:2097
PNANOVDB_FORCE_INLINE void pnanovdb_gridblindmetadata_set_name(pnanovdb_buf_t buf, pnanovdb_gridblindmetadata_handle_t p, pnanovdb_uint32_t index, pnanovdb_uint32_t name)
Definition PNanoVDB.h:1511
PNANOVDB_FORCE_INLINE pnanovdb_address_t pnanovdb_leaf_get_ave_address(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_leaf_handle_t node)
Definition PNanoVDB.h:2071
PNANOVDB_FORCE_INLINE float pnanovdb_leaf_fpn_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk)
Definition PNanoVDB.h:2128
PNANOVDB_FORCE_INLINE pnanovdb_uint32_t pnanovdb_version_get_patch(pnanovdb_uint32_t version)
Definition PNanoVDB.h:1410
#define PNANOVDB_LOWER_OFF_CHILD_MASK
Definition PNanoVDB.h:1774
#define PNANOVDB_GRID_OFF_FLAGS
Definition PNanoVDB.h:1272
PNANOVDB_FORCE_INLINE pnanovdb_root_tile_handle_t pnanovdb_root_find_tile(pnanovdb_grid_type_t grid_type, pnanovdb_buf_t buf, pnanovdb_root_handle_t root, PNANOVDB_IN(pnanovdb_coord_t) ijk)
Definition PNanoVDB.h:2012
PNANOVDB_FORCE_INLINE float pnanovdb_root_fp4_read_float(pnanovdb_buf_t buf, pnanovdb_address_t address, PNANOVDB_IN(pnanovdb_coord_t) ijk, pnanovdb_uint32_t level)
Definition PNanoVDB.h:2561
const std::enable_if<!VecTraits< T >::IsVec, T >::type & max(const T &a, const T &b)
Definition Composite.h:110
const std::enable_if<!VecTraits< T >::IsVec, T >::type & min(const T &a, const T &b)
Definition Composite.h:106
Definition PNanoVDB.h:1264
pnanovdb_address_t address
Definition PNanoVDB.h:1264
Definition PNanoVDB.h:1243
pnanovdb_uint64_t magic
Definition PNanoVDB.h:1244
pnanovdb_uint32_t grid_class
Definition PNanoVDB.h:1255
double voxel_size[3]
Definition PNanoVDB.h:1254
pnanovdb_uint32_t grid_index
Definition PNanoVDB.h:1248
pnanovdb_uint64_t grid_size
Definition PNanoVDB.h:1250
pnanovdb_uint32_t grid_type
Definition PNanoVDB.h:1256
pnanovdb_uint32_t version
Definition PNanoVDB.h:1246
pnanovdb_uint32_t data0
Definition PNanoVDB.h:1259
pnanovdb_int64_t blind_metadata_offset
Definition PNanoVDB.h:1257
double world_bbox[6]
Definition PNanoVDB.h:1253
pnanovdb_uint64_t data1
Definition PNanoVDB.h:1260
pnanovdb_uint32_t flags
Definition PNanoVDB.h:1247
pnanovdb_uint64_t data2
Definition PNanoVDB.h:1261
pnanovdb_uint32_t blind_metadata_count
Definition PNanoVDB.h:1258
pnanovdb_uint64_t checksum
Definition PNanoVDB.h:1245
pnanovdb_map_t map
Definition PNanoVDB.h:1252
pnanovdb_uint32_t grid_count
Definition PNanoVDB.h:1249
pnanovdb_uint32_t grid_name[256/4]
Definition PNanoVDB.h:1251
Definition PNanoVDB.h:1864
pnanovdb_uint32_t leaf_off_stddev
Definition PNanoVDB.h:1890
pnanovdb_uint32_t leaf_off_ave
Definition PNanoVDB.h:1889
pnanovdb_uint32_t upper_off_min
Definition PNanoVDB.h:1875
pnanovdb_uint32_t leaf_size
Definition PNanoVDB.h:1892
pnanovdb_uint32_t root_size
Definition PNanoVDB.h:1870
pnanovdb_uint32_t leaf_off_table
Definition PNanoVDB.h:1891
pnanovdb_uint32_t upper_off_max
Definition PNanoVDB.h:1876
pnanovdb_uint32_t upper_off_ave
Definition PNanoVDB.h:1877
pnanovdb_uint32_t table_stride
Definition PNanoVDB.h:1872
pnanovdb_uint32_t upper_off_table
Definition PNanoVDB.h:1879
pnanovdb_uint32_t root_tile_size
Definition PNanoVDB.h:1874
pnanovdb_uint32_t leaf_off_min
Definition PNanoVDB.h:1887
pnanovdb_uint32_t lower_size
Definition PNanoVDB.h:1886
pnanovdb_uint32_t lower_off_min
Definition PNanoVDB.h:1881
pnanovdb_uint32_t upper_size
Definition PNanoVDB.h:1880
pnanovdb_uint32_t value_stride_bits
Definition PNanoVDB.h:1871
pnanovdb_uint32_t root_off_min
Definition PNanoVDB.h:1866
pnanovdb_uint32_t root_tile_off_value
Definition PNanoVDB.h:1873
pnanovdb_uint32_t root_off_ave
Definition PNanoVDB.h:1868
pnanovdb_uint32_t lower_off_stddev
Definition PNanoVDB.h:1884
pnanovdb_uint32_t root_off_stddev
Definition PNanoVDB.h:1869
pnanovdb_uint32_t root_off_background
Definition PNanoVDB.h:1865
pnanovdb_uint32_t root_off_max
Definition PNanoVDB.h:1867
pnanovdb_uint32_t lower_off_table
Definition PNanoVDB.h:1885
pnanovdb_uint32_t lower_off_max
Definition PNanoVDB.h:1882
pnanovdb_uint32_t leaf_off_max
Definition PNanoVDB.h:1888
pnanovdb_uint32_t upper_off_stddev
Definition PNanoVDB.h:1878
pnanovdb_uint32_t lower_off_ave
Definition PNanoVDB.h:1883
Definition PNanoVDB.h:1458
pnanovdb_address_t address
Definition PNanoVDB.h:1458
Definition PNanoVDB.h:1448
pnanovdb_int64_t data_offset
Definition PNanoVDB.h:1449
pnanovdb_uint64_t value_count
Definition PNanoVDB.h:1450
pnanovdb_uint32_t name[256/4]
Definition PNanoVDB.h:1455
pnanovdb_uint32_t value_size
Definition PNanoVDB.h:1451
pnanovdb_uint32_t data_type
Definition PNanoVDB.h:1454
pnanovdb_uint32_t data_class
Definition PNanoVDB.h:1453
pnanovdb_uint32_t semantic
Definition PNanoVDB.h:1452
Definition PNanoVDB.h:1824
pnanovdb_address_t address
Definition PNanoVDB.h:1824
Definition PNanoVDB.h:1816
pnanovdb_uint32_t value_mask[16]
Definition PNanoVDB.h:1819
pnanovdb_uint32_t bbox_dif_and_flags
Definition PNanoVDB.h:1818
pnanovdb_coord_t bbox_min
Definition PNanoVDB.h:1817
Definition PNanoVDB.h:1764
pnanovdb_address_t address
Definition PNanoVDB.h:1764
Definition PNanoVDB.h:1754
pnanovdb_uint32_t child_mask[128]
Definition PNanoVDB.h:1759
pnanovdb_uint64_t flags
Definition PNanoVDB.h:1757
pnanovdb_uint32_t value_mask[128]
Definition PNanoVDB.h:1758
pnanovdb_coord_t bbox_max
Definition PNanoVDB.h:1756
pnanovdb_coord_t bbox_min
Definition PNanoVDB.h:1755
Definition PNanoVDB.h:1178
pnanovdb_address_t address
Definition PNanoVDB.h:1178
Definition PNanoVDB.h:1167
double matd[9]
Definition PNanoVDB.h:1172
double vecd[3]
Definition PNanoVDB.h:1174
float taperf
Definition PNanoVDB.h:1171
double invmatd[9]
Definition PNanoVDB.h:1173
float matf[9]
Definition PNanoVDB.h:1168
double taperd
Definition PNanoVDB.h:1175
float invmatf[9]
Definition PNanoVDB.h:1169
float vecf[3]
Definition PNanoVDB.h:1170
Definition PNanoVDB.h:2706
pnanovdb_upper_handle_t upper
Definition PNanoVDB.h:2710
pnanovdb_root_handle_t root
Definition PNanoVDB.h:2711
pnanovdb_coord_t key
Definition PNanoVDB.h:2707
pnanovdb_lower_handle_t lower
Definition PNanoVDB.h:2709
pnanovdb_leaf_handle_t leaf
Definition PNanoVDB.h:2708
Definition PNanoVDB.h:1624
pnanovdb_address_t address
Definition PNanoVDB.h:1624
Definition PNanoVDB.h:1616
pnanovdb_uint32_t table_size
Definition PNanoVDB.h:1619
pnanovdb_coord_t bbox_max
Definition PNanoVDB.h:1618
pnanovdb_uint32_t pad1
Definition PNanoVDB.h:1620
pnanovdb_coord_t bbox_min
Definition PNanoVDB.h:1617
Definition PNanoVDB.h:1662
pnanovdb_address_t address
Definition PNanoVDB.h:1662
Definition PNanoVDB.h:1654
pnanovdb_uint64_t key
Definition PNanoVDB.h:1655
pnanovdb_uint32_t state
Definition PNanoVDB.h:1657
pnanovdb_int64_t child
Definition PNanoVDB.h:1656
pnanovdb_uint32_t pad1
Definition PNanoVDB.h:1658
Definition PNanoVDB.h:1530
pnanovdb_address_t address
Definition PNanoVDB.h:1530
Definition PNanoVDB.h:1516
pnanovdb_uint32_t node_count_leaf
Definition PNanoVDB.h:1521
pnanovdb_uint32_t tile_count_lower
Definition PNanoVDB.h:1524
pnanovdb_uint64_t node_offset_upper
Definition PNanoVDB.h:1519
pnanovdb_uint64_t node_offset_root
Definition PNanoVDB.h:1520
pnanovdb_uint64_t node_offset_leaf
Definition PNanoVDB.h:1517
pnanovdb_uint64_t voxel_count
Definition PNanoVDB.h:1527
pnanovdb_uint32_t tile_count_upper
Definition PNanoVDB.h:1525
pnanovdb_uint64_t node_offset_lower
Definition PNanoVDB.h:1518
pnanovdb_uint32_t tile_count_root
Definition PNanoVDB.h:1526
pnanovdb_uint32_t node_count_upper
Definition PNanoVDB.h:1523
pnanovdb_uint32_t node_count_lower
Definition PNanoVDB.h:1522
Definition PNanoVDB.h:1702
pnanovdb_address_t address
Definition PNanoVDB.h:1702
Definition PNanoVDB.h:1692
pnanovdb_uint64_t flags
Definition PNanoVDB.h:1695
pnanovdb_uint32_t value_mask[1024]
Definition PNanoVDB.h:1696
pnanovdb_coord_t bbox_max
Definition PNanoVDB.h:1694
pnanovdb_uint32_t child_mask[1024]
Definition PNanoVDB.h:1697
pnanovdb_coord_t bbox_min
Definition PNanoVDB.h:1693