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