18#define USE_SINGLE_ROOT_KEY
20#ifdef __OPENCL_VERSION__
22#define CNANOVDB_GLOBAL __global
23#define RESTRICT restrict
26typedef unsigned long uint64_t;
28typedef unsigned int uint32_t;
31typedef unsigned short uint16_t;
32typedef unsigned char uint8_t;
36#define CNANOVDB_GLOBAL
37#define RESTRICT __restrict
59#define CNANOVDB_GRIDTYPE_UNKNOWN 0
60#define CNANOVDB_GRIDTYPE_FLOAT 1
61#define CNANOVDB_GRIDTYPE_DOUBLE 2
62#define CNANOVDB_GRIDTYPE_INT16 3
63#define CNANOVDB_GRIDTYPE_INT32 4
64#define CNANOVDB_GRIDTYPE_INT64 5
65#define CNANOVDB_GRIDTYPE_VEC3F 6
66#define CNANOVDB_GRIDTYPE_VEC3D 7
67#define CNANOVDB_GRIDTYPE_MASK 8
68#define CNANOVDB_GRIDTYPE_FP16 9
69#define CNANOVDB_GRIDTYPE_END 10
74#define DEFINEMASK_int(LOG2DIM, SIZE) \
77 uint64_t mWords[SIZE >> 6]; \
78} cnanovdb_mask##LOG2DIM; \
80static void cnanovdb_mask##LOG2DIM##_clear(CNANOVDB_GLOBAL cnanovdb_mask##LOG2DIM *RESTRICT mask) \
81{ for (uint32_t i = 0; i < (SIZE >> 6); i++) mask->mWords[i] = 0; } \
83static bool cnanovdb_mask##LOG2DIM##_isOn(const CNANOVDB_GLOBAL cnanovdb_mask##LOG2DIM *RESTRICT mask, uint32_t n) \
84{ return 0 != (mask->mWords[n >> 6] & (((uint64_t)(1)) << (n & 63))); } \
87#define DEFINEMASK(LOG2DIM) \
88 DEFINEMASK_int(LOG2DIM, (1U << (3*LOG2DIM)))
90#define INSTANTIATE(LOG2DIM) \
122 if (a->mVec[0] < b->
mVec[0])
124 if (a->mVec[0] > b->
mVec[0])
126 if (a->mVec[1] < b->
mVec[1])
128 if (a->mVec[1] > b->
mVec[1])
130 if (a->mVec[2] < b->
mVec[2])
132 if (a->mVec[2] > b->
mVec[2])
137#ifdef USE_SINGLE_ROOT_KEY
142#if defined(AVOID_64BIT_SHIFT)
143 uint2 key = (uint2)( ((uint32_t)ijk->mVec[2]) >> 12, 0) |
144 (uint2)((((uint32_t)ijk->mVec[1]) >> 12) << 21,
145 ((uint32_t)ijk->mVec[1]) >> 23) |
146 (uint2)(0, (((uint32_t)ijk->mVec[0]) >> 12) << 10);
147 return *(uint64_t *)&key;
149 return ((uint64_t) (((uint32_t)ijk->mVec[2]) >> 12)) |
150 (((uint64_t) (((uint32_t)ijk->mVec[1]) >> 12)) << 21) |
151 (((uint64_t) (((uint32_t)ijk->mVec[0]) >> 12)) << 42);
158 key->
mVec[0] = ijk->mVec[0] & ~((1u << 12) - 1u);
159 key->mVec[1] = ijk->mVec[1] & ~((1u << 12) - 1u);
160 key->mVec[2] = ijk->mVec[2] & ~((1u << 12) - 1u);
167 float sx = src->
mVec[0];
168 float sy = src->
mVec[1];
169 float sz = src->
mVec[2];
170 dst->
mVec[0] = sx * map->mMatF[0] + sy * map->mMatF[1] + sz * map->mMatF[2] + map->mVecF[0];
171 dst->
mVec[1] = sx * map->mMatF[3] + sy * map->mMatF[4] + sz * map->mMatF[5] + map->mVecF[1];
172 dst->
mVec[2] = sx * map->mMatF[6] + sy * map->mMatF[7] + sz * map->mMatF[8] + map->mVecF[2];
178 float sx = src->
mVec[0] - map->mVecF[0];
179 float sy = src->
mVec[1] - map->mVecF[1];
180 float sz = src->
mVec[2] - map->mVecF[2];
181 dst->
mVec[0] = sx * map->mInvMatF[0] + sy * map->mInvMatF[1] + sz * map->mInvMatF[2];
182 dst->
mVec[1] = sx * map->mInvMatF[3] + sy * map->mInvMatF[4] + sz * map->mInvMatF[5];
183 dst->
mVec[2] = sx * map->mInvMatF[6] + sy * map->mInvMatF[7] + sz * map->mInvMatF[8];
189 float sx = src->
mVec[0];
190 float sy = src->
mVec[1];
191 float sz = src->
mVec[2];
192 dst->
mVec[0] = sx * map->mMatF[0] + sy * map->mMatF[1] + sz * map->mMatF[2];
193 dst->
mVec[1] = sx * map->mMatF[3] + sy * map->mMatF[4] + sz * map->mMatF[5];
194 dst->
mVec[2] = sx * map->mMatF[6] + sy * map->mMatF[7] + sz * map->mMatF[8];
200 float sx = src->
mVec[0];
201 float sy = src->
mVec[1];
202 float sz = src->
mVec[2];
203 dst->
mVec[0] = sx * map->mInvMatF[0] + sy * map->mInvMatF[1] + sz * map->mInvMatF[2];
204 dst->
mVec[1] = sx * map->mInvMatF[3] + sy * map->mInvMatF[4] + sz * map->mInvMatF[5];
205 dst->
mVec[2] = sx * map->mInvMatF[6] + sy * map->mInvMatF[7] + sz * map->mInvMatF[8];
211 float sx = src->
mVec[0];
212 float sy = src->
mVec[1];
213 float sz = src->
mVec[2];
214 dst->
mVec[0] = sx * map->mInvMatF[0] + sy * map->mInvMatF[3] + sz * map->mInvMatF[6];
215 dst->
mVec[1] = sx * map->mInvMatF[1] + sy * map->mInvMatF[4] + sz * map->mInvMatF[7];
216 dst->
mVec[2] = sx * map->mInvMatF[2] + sy * map->mInvMatF[5] + sz * map->mInvMatF[8];
301#define CREATE_TILEENTRY(VALUETYPE, SUFFIX) \
306} cnanovdb_tileentry##SUFFIX; \
319 acc->
mNode[childlevel] = node;
320 acc->mKey.mVec[0] = ijk->mVec[0];
321 acc->mKey.mVec[1] = ijk->mVec[1];
322 acc->mKey.mVec[2] = ijk->mVec[2];
328#define LEAFDATA_PAD_F
329#define LEAFDATA_PAD_F3 uint32_t _reserved[4];
330#define LEAFDATA_PAD_I
332#define NODEDATA_PAD_F uint8_t _reserved[16];
333#define NODEDATA_PAD_F3
334#define NODEDATA_PAD_I uint8_t _reserved[16];
336#define CREATE_LEAF_NODE_int(LEVEL, LOG2DIM, CHILDTOTAL, TOTAL, MASK, VALUETYPE, STATSTYPE, SUFFIX) \
339 cnanovdb_coord mBBox_min; \
340 uint8_t mBBoxDif[3]; \
342 cnanovdb_mask##LOG2DIM mValueMask; \
343 VALUETYPE mMinimum; \
344 VALUETYPE mMaximum; \
345 STATSTYPE mAverage; \
346 STATSTYPE mStdDevi; \
347 LEAFDATA_PAD_##SUFFIX \
349 VALUETYPE mVoxels[1u << (3*LOG2DIM)]; \
350} cnanovdb_node##LEVEL##SUFFIX; \
353cnanovdb_node##LEVEL##SUFFIX##_CoordToOffset(const cnanovdb_coord *RESTRICT ijk) \
355 return ( ( ( ijk->mVec[0] & MASK ) >> CHILDTOTAL ) << ( 2 * LOG2DIM ) ) + \
356 ( ( ( ijk->mVec[1] & MASK ) >> CHILDTOTAL ) << ( LOG2DIM ) ) + \
357 ( ( ijk->mVec[2] & MASK ) >> CHILDTOTAL ); \
361cnanovdb_node##LEVEL##SUFFIX##_getValue(const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *RESTRICT node, const cnanovdb_coord *RESTRICT ijk) \
363 uint32_t n = cnanovdb_node##LEVEL##SUFFIX##_CoordToOffset(ijk); \
364 return node->mVoxels[n]; \
368cnanovdb_node##LEVEL##SUFFIX##_getValueAndCache(const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *RESTRICT node, const cnanovdb_coord *RESTRICT ijk, cnanovdb_readaccessor *RESTRICT acc) \
371 uint32_t n = cnanovdb_node##LEVEL##SUFFIX##_CoordToOffset(ijk); \
372 return node->mVoxels[n]; \
376cnanovdb_node##LEVEL##SUFFIX##_setValue(CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *RESTRICT node, const cnanovdb_coord *RESTRICT ijk, VALUETYPE value) \
378 uint32_t n = cnanovdb_node##LEVEL##SUFFIX##_CoordToOffset(ijk); \
379 node->mVoxels[n] = value; \
384cnanovdb_node##LEVEL##SUFFIX##_setValueAndCache(CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *RESTRICT node, const cnanovdb_coord *RESTRICT ijk, VALUETYPE value,cnanovdb_readaccessor *RESTRICT acc) \
387 uint32_t n = cnanovdb_node##LEVEL##SUFFIX##_CoordToOffset(ijk); \
388 node->mVoxels[n] = value; \
393cnanovdb_node##LEVEL##SUFFIX##_isActive(const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *RESTRICT node, const cnanovdb_coord *RESTRICT ijk) \
395 uint32_t n = cnanovdb_node##LEVEL##SUFFIX##_CoordToOffset(ijk); \
396 if (cnanovdb_mask##LOG2DIM##_isOn(&node->mValueMask, n)) \
402cnanovdb_node##LEVEL##SUFFIX##_isActiveAndCache(const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *RESTRICT node, const cnanovdb_coord *RESTRICT ijk, cnanovdb_readaccessor *RESTRICT acc) \
405 uint32_t n = cnanovdb_node##LEVEL##SUFFIX##_CoordToOffset(ijk); \
406 if (cnanovdb_mask##LOG2DIM##_isOn(&node->mValueMask, n)) \
411static const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX * \
412cnanovdb_tree_getNode##LEVEL##SUFFIX(const CNANOVDB_GLOBAL cnanovdb_treedata *RESTRICT tree, uint64_t i) \
414 const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *basenode = (const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *)((CNANOVDB_GLOBAL uint8_t *)(tree) + tree->mNodeOffset[LEVEL]); \
415 return basenode + i; \
420#define CREATE_LEAF_NODE(LEVEL, LOG2DIM, TOTAL, VALUETYPE, STATSTYPE, SUFFIX) \
421CREATE_LEAF_NODE_int(LEVEL, LOG2DIM, (TOTAL-LOG2DIM), TOTAL, ((1u << TOTAL) - 1u), VALUETYPE, STATSTYPE, SUFFIX)
423#define CREATE_INTERNAL_NODE_int(CHILDLEVEL, LEVEL, LOG2DIM, CHILDTOTAL, TOTAL, MASK, VALUETYPE, STATSTYPE, SUFFIX) \
426 cnanovdb_coord mBBox_min, mBBox_max; \
429 cnanovdb_mask##LOG2DIM mValueMask, mChildMask; \
430 VALUETYPE mMinimum, mMaximum; \
431 STATSTYPE mAverage, mStdDevi; \
432 NODEDATA_PAD_##SUFFIX \
433 cnanovdb_tileentry##SUFFIX mTable[1u << (3*LOG2DIM)]; \
434} cnanovdb_node##LEVEL##SUFFIX; \
437cnanovdb_node##LEVEL##SUFFIX##_CoordToOffset(const cnanovdb_coord *RESTRICT ijk) \
439 return ( ( ( ijk->mVec[0] & MASK ) >> CHILDTOTAL ) << ( 2 * LOG2DIM ) ) + \
440 ( ( ( ijk->mVec[1] & MASK ) >> CHILDTOTAL ) << ( LOG2DIM ) ) + \
441 ( ( ijk->mVec[2] & MASK ) >> CHILDTOTAL ); \
444static const CNANOVDB_GLOBAL cnanovdb_node##CHILDLEVEL##SUFFIX * \
445cnanovdb_node##LEVEL##SUFFIX##_getChild(const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *RESTRICT node, uint32_t n) \
447 const CNANOVDB_GLOBAL cnanovdb_node##CHILDLEVEL##SUFFIX *childnode = (const CNANOVDB_GLOBAL cnanovdb_node##CHILDLEVEL##SUFFIX *)( ((CNANOVDB_GLOBAL uint8_t *)node) + node->mTable[n].child); \
451static CNANOVDB_GLOBAL cnanovdb_node##CHILDLEVEL##SUFFIX * \
452cnanovdb_node##LEVEL##SUFFIX##_getChildNC(CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *RESTRICT node, uint32_t n) \
454 CNANOVDB_GLOBAL cnanovdb_node##CHILDLEVEL##SUFFIX *childnode = (CNANOVDB_GLOBAL cnanovdb_node##CHILDLEVEL##SUFFIX *)( ((CNANOVDB_GLOBAL uint8_t *)node) + node->mTable[n].child); \
459cnanovdb_node##LEVEL##SUFFIX##_getValue(const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *RESTRICT node, const cnanovdb_coord *RESTRICT ijk) \
461 uint32_t n = cnanovdb_node##LEVEL##SUFFIX##_CoordToOffset(ijk); \
462 if (cnanovdb_mask##LOG2DIM##_isOn(&node->mChildMask, n)) \
464 const CNANOVDB_GLOBAL cnanovdb_node##CHILDLEVEL##SUFFIX *child = cnanovdb_node##LEVEL##SUFFIX##_getChild(node, n); \
465 return cnanovdb_node##CHILDLEVEL##SUFFIX##_getValue(child, ijk); \
467 return node->mTable[n].value; \
471cnanovdb_node##LEVEL##SUFFIX##_getValueAndCache(const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *RESTRICT node, const cnanovdb_coord *RESTRICT ijk, cnanovdb_readaccessor *RESTRICT acc) \
473 uint32_t n = cnanovdb_node##LEVEL##SUFFIX##_CoordToOffset(ijk); \
474 if (cnanovdb_mask##LOG2DIM##_isOn(&node->mChildMask, n)) \
476 const CNANOVDB_GLOBAL cnanovdb_node##CHILDLEVEL##SUFFIX *child = cnanovdb_node##LEVEL##SUFFIX##_getChild(node, n); \
477 cnanovdb_readaccessor_insert(acc, CHILDLEVEL, child, ijk); \
478 return cnanovdb_node##CHILDLEVEL##SUFFIX##_getValueAndCache(child, ijk, acc); \
480 return node->mTable[n].value; \
484cnanovdb_node##LEVEL##SUFFIX##_setValue(CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *RESTRICT node, const cnanovdb_coord *RESTRICT ijk, VALUETYPE value) \
486 uint32_t n = cnanovdb_node##LEVEL##SUFFIX##_CoordToOffset(ijk); \
487 if (cnanovdb_mask##LOG2DIM##_isOn(&node->mChildMask, n)) \
489 CNANOVDB_GLOBAL cnanovdb_node##CHILDLEVEL##SUFFIX *child = cnanovdb_node##LEVEL##SUFFIX##_getChildNC(node, n); \
490 return cnanovdb_node##CHILDLEVEL##SUFFIX##_setValue(child, ijk, value); \
496cnanovdb_node##LEVEL##SUFFIX##_setValueAndCache(CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *RESTRICT node, const cnanovdb_coord *RESTRICT ijk, VALUETYPE value, cnanovdb_readaccessor *RESTRICT acc) \
498 uint32_t n = cnanovdb_node##LEVEL##SUFFIX##_CoordToOffset(ijk); \
499 if (cnanovdb_mask##LOG2DIM##_isOn(&node->mChildMask, n)) \
501 CNANOVDB_GLOBAL cnanovdb_node##CHILDLEVEL##SUFFIX *child = cnanovdb_node##LEVEL##SUFFIX##_getChildNC(node, n); \
502 cnanovdb_readaccessor_insert(acc, CHILDLEVEL, child, ijk); \
503 return cnanovdb_node##CHILDLEVEL##SUFFIX##_setValueAndCache(child, ijk, value, acc); \
509cnanovdb_node##LEVEL##SUFFIX##_isActive(const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *RESTRICT node, const cnanovdb_coord *RESTRICT ijk) \
511 uint32_t n = cnanovdb_node##LEVEL##SUFFIX##_CoordToOffset(ijk); \
512 if (cnanovdb_mask##LOG2DIM##_isOn(&node->mChildMask, n)) \
514 const CNANOVDB_GLOBAL cnanovdb_node##CHILDLEVEL##SUFFIX *child = cnanovdb_node##LEVEL##SUFFIX##_getChild(node, n); \
515 return cnanovdb_node##CHILDLEVEL##SUFFIX##_isActive(child, ijk); \
517 return cnanovdb_mask##LOG2DIM##_isOn(&node->mValueMask, n) ? true : false; \
521cnanovdb_node##LEVEL##SUFFIX##_isActiveAndCache(const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *RESTRICT node, const cnanovdb_coord *RESTRICT ijk, cnanovdb_readaccessor *RESTRICT acc) \
523 uint32_t n = cnanovdb_node##LEVEL##SUFFIX##_CoordToOffset(ijk); \
524 if (cnanovdb_mask##LOG2DIM##_isOn(&node->mChildMask, n)) \
526 const CNANOVDB_GLOBAL cnanovdb_node##CHILDLEVEL##SUFFIX *child = cnanovdb_node##LEVEL##SUFFIX##_getChild(node, n); \
527 cnanovdb_readaccessor_insert(acc, CHILDLEVEL, child, ijk); \
528 return cnanovdb_node##CHILDLEVEL##SUFFIX##_isActiveAndCache(child, ijk, acc); \
530 return cnanovdb_mask##LOG2DIM##_isOn(&node->mValueMask, n) ? true : false; \
533static const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX * \
534cnanovdb_tree_getNode##LEVEL##SUFFIX(const CNANOVDB_GLOBAL cnanovdb_treedata *RESTRICT tree, uint64_t i) \
536 const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *basenode = (const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *)((CNANOVDB_GLOBAL uint8_t *)(tree) + tree->mNodeOffset[LEVEL]); \
537 return basenode + i; \
542#define CREATE_INTERNAL_NODE(CHILDLEVEL, LEVEL, LOG2DIM, TOTAL, VALUETYPE, STATSTYPE, SUFFIX) \
543CREATE_INTERNAL_NODE_int(CHILDLEVEL, LEVEL, LOG2DIM, (TOTAL-LOG2DIM), TOTAL, ((1u << TOTAL) - 1u), VALUETYPE, STATSTYPE, SUFFIX)
546#ifdef USE_SINGLE_ROOT_KEY
549#define ROOTDATATILE_PAD_F uint8_t _reserved[8];
550#define ROOTDATATILE_PAD_I uint8_t _reserved[8];
551#define ROOTDATATILE_PAD_F3
553#define DEFINE_KEY(KEY) \
555#define KEYSIZE sizeof(uint64_t)
557#ifdef CNANOVDB_FULL_ROOT_SEARCH
558#define KEYSEARCH(SUFFIX) \
560 const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *result = 0; \
561 key = cnanovdb_coord_to_key(ijk); \
565 for (int idx = low; idx < rootdata->mTableSize; idx++) \
567 const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *tile = tiles + idx; \
568 if (tile->key == key) \
574#define KEYSEARCH(SUFFIX) \
576 key = cnanovdb_coord_to_key(ijk); \
578 for (int i = low; i < high; i++) \
580 const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *tile = tiles + i; \
581 if (tile->key == key) \
589#define ROOTDATATILE_PAD_F
590#define ROOTDATATILE_PAD_I
591#define ROOTDATATILE_PAD_F3 uint8_t _reserved[24];
593#define DEFINE_KEY(KEY) \
595#define KEYSIZE sizeof(cnanovdb_coord)
596#define KEYSEARCH(SUFFIX) \
597 cnanovdb_coord key; \
598 cnanovdb_coord_to_key(&key, ijk); \
600 while (low != high) \
602 int32_t mid = low + (( high - low ) >> 1 ); \
603 const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *tile = tiles + mid; \
605 int keycmp = cnanovdb_coord_compare(&tile->key, &key); \
619#define ROOTDATA_PAD_F uint32_t reserved[4];
620#define ROOTDATA_PAD_F3 uint32_t reserved[6];
621#define ROOTDATA_PAD_I uint32_t reserved[4];
623#define CREATE_ROOTDATA(VALUETYPE, STATSTYPE, SUFFIX) \
633 ROOTDATATILE_PAD_##SUFFIX \
635} cnanovdb_rootdata_tile##SUFFIX; \
639 cnanovdb_coord mBBox_min, mBBox_max; \
640 uint32_t mTableSize; \
641 VALUETYPE mBackground; \
642 VALUETYPE mMinimum, mMaximum; \
643 STATSTYPE mAverage, mStdDevi; \
646 ROOTDATA_PAD_##SUFFIX \
648} cnanovdb_rootdata##SUFFIX; \
650static const CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX * \
651cnanovdb_treedata_root##SUFFIX(const CNANOVDB_GLOBAL cnanovdb_treedata *RESTRICT treedata) \
653 return (const CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *) ((const CNANOVDB_GLOBAL uint8_t *)(treedata) + treedata->mNodeOffset[ROOT_LEVEL]); \
656static const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX * \
657cnanovdb_rootdata##SUFFIX##_getTile(const CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *RESTRICT rootdata, uint32_t n) \
659 const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *basetile = (const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *) (rootdata + 1); \
660 return basetile + n; \
663static const CNANOVDB_GLOBAL cnanovdb_node2##SUFFIX * \
664cnanovdb_rootdata##SUFFIX##_getChild(const CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *RESTRICT rootdata, const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *RESTRICT tile) \
666 CNANOVDB_GLOBAL cnanovdb_node2##SUFFIX *basenode = (CNANOVDB_GLOBAL cnanovdb_node2##SUFFIX *) (((CNANOVDB_GLOBAL uint8_t *) rootdata) + tile->child); \
670static CNANOVDB_GLOBAL cnanovdb_node2##SUFFIX * \
671cnanovdb_rootdata##SUFFIX##_getChildNC(CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *RESTRICT rootdata, CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *RESTRICT tile) \
673 CNANOVDB_GLOBAL cnanovdb_node2##SUFFIX *basenode = (CNANOVDB_GLOBAL cnanovdb_node2##SUFFIX *) (((CNANOVDB_GLOBAL uint8_t *) rootdata) + tile->child); \
677static const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX * \
678cnanovdb_rootdata##SUFFIX##_findTile(const CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *RESTRICT rootdata, const cnanovdb_coord *RESTRICT ijk) \
680 int32_t low = 0, high = rootdata->mTableSize; \
681 const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *tiles = cnanovdb_rootdata##SUFFIX##_getTile(rootdata, 0); \
687static CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX * \
688cnanovdb_rootdata##SUFFIX##_findTileNC(CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *RESTRICT rootdata, const cnanovdb_coord *RESTRICT ijk) \
690 return (CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *) \
691 cnanovdb_rootdata##SUFFIX##_findTile(rootdata, ijk); \
695cnanovdb_rootdata##SUFFIX##_getValue(const CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *RESTRICT rootdata, const cnanovdb_coord *RESTRICT ijk) \
697 const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *tile = cnanovdb_rootdata##SUFFIX##_findTile(rootdata, ijk); \
699 return rootdata->mBackground; \
700 if (tile->child == 0) \
701 return tile->value; \
702 return cnanovdb_node2##SUFFIX##_getValue( cnanovdb_rootdata##SUFFIX##_getChild(rootdata, tile), ijk ); \
706cnanovdb_rootdata##SUFFIX##_getValueAndCache(const CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *RESTRICT rootdata, const cnanovdb_coord *RESTRICT ijk, cnanovdb_readaccessor *RESTRICT acc) \
708 const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *tile = cnanovdb_rootdata##SUFFIX##_findTile(rootdata, ijk); \
710 return rootdata->mBackground; \
711 if (tile->child == 0) \
712 return tile->value; \
713 const CNANOVDB_GLOBAL cnanovdb_node2##SUFFIX *child = cnanovdb_rootdata##SUFFIX##_getChild(rootdata, tile); \
714 cnanovdb_readaccessor_insert(acc, 2, child, ijk); \
715 return cnanovdb_node2##SUFFIX##_getValueAndCache( child, ijk, acc ); \
719cnanovdb_rootdata##SUFFIX##_setValue(CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *RESTRICT rootdata, const cnanovdb_coord *RESTRICT ijk, VALUETYPE value) \
721 CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *tile = cnanovdb_rootdata##SUFFIX##_findTileNC(rootdata, ijk); \
724 if (tile->child == 0) \
726 return cnanovdb_node2##SUFFIX##_setValue( cnanovdb_rootdata##SUFFIX##_getChildNC(rootdata, tile), ijk, value ); \
730cnanovdb_rootdata##SUFFIX##_setValueAndCache(CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *RESTRICT rootdata, const cnanovdb_coord *RESTRICT ijk, VALUETYPE value, cnanovdb_readaccessor *RESTRICT acc) \
732 CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *tile = cnanovdb_rootdata##SUFFIX##_findTileNC(rootdata, ijk); \
735 if (tile->child == 0) \
737 CNANOVDB_GLOBAL cnanovdb_node2##SUFFIX *child = cnanovdb_rootdata##SUFFIX##_getChildNC(rootdata, tile); \
738 cnanovdb_readaccessor_insert(acc, 2, child, ijk); \
739 return cnanovdb_node2##SUFFIX##_setValueAndCache( child, ijk, value, acc );\
743cnanovdb_rootdata##SUFFIX##_isActive(const CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *RESTRICT rootdata, const cnanovdb_coord *RESTRICT ijk) \
745 const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *tile = cnanovdb_rootdata##SUFFIX##_findTile(rootdata, ijk); \
748 if (tile->child == 0) \
749 return tile->state; \
750 return cnanovdb_node2##SUFFIX##_isActive( cnanovdb_rootdata##SUFFIX##_getChild(rootdata, tile), ijk ); \
754cnanovdb_rootdata##SUFFIX##_isActiveAndCache(const CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *RESTRICT rootdata, const cnanovdb_coord *RESTRICT ijk, cnanovdb_readaccessor *RESTRICT acc) \
756 const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *tile = cnanovdb_rootdata##SUFFIX##_findTile(rootdata, ijk); \
759 if (tile->child == 0) \
760 return tile->state; \
761 const CNANOVDB_GLOBAL cnanovdb_node2##SUFFIX *child = cnanovdb_rootdata##SUFFIX##_getChild(rootdata, tile); \
762 cnanovdb_readaccessor_insert(acc, 2, child, ijk); \
763 return cnanovdb_node2##SUFFIX##_isActiveAndCache( child, ijk, acc ); \
772 acc->mKey.mVec[0] = 0;
773 acc->mKey.mVec[1] = 0;
774 acc->mKey.mVec[2] = 0;
775 acc->mNode[0] = acc->mNode[1] = acc->mNode[2] = 0;
776 acc->mNode[3] = rootdata;
779#define DEFINE_ISCACHED(LEVEL, MASK) \
781cnanovdb_readaccessor_isCached##LEVEL(cnanovdb_readaccessor *RESTRICT acc, int32_t dirty) \
783 if (!acc->mNode[LEVEL]) \
787 acc->mNode[LEVEL] = 0; \
801 return (ijk->mVec[0] ^ acc->mKey.mVec[0]) |
802 (ijk->mVec[1] ^ acc->mKey.mVec[1]) |
803 (ijk->mVec[2] ^ acc->mKey.mVec[2]);
806#define CREATE_ACCESSOR(VALUETYPE, SUFFIX) \
807static inline VALUETYPE \
808cnanovdb_readaccessor_getValue##SUFFIX(cnanovdb_readaccessor *RESTRICT acc, const cnanovdb_coord *RESTRICT ijk) \
810 int32_t dirty = cnanovdb_readaccessor_computeDirty(acc, ijk); \
812 if (cnanovdb_readaccessor_isCached0(acc, dirty)) \
813 return cnanovdb_node0##SUFFIX##_getValue( ((const CNANOVDB_GLOBAL cnanovdb_node0##SUFFIX *) acc->mNode[0]), ijk); \
814 if (cnanovdb_readaccessor_isCached1(acc, dirty)) \
815 return cnanovdb_node1##SUFFIX##_getValueAndCache( ((const CNANOVDB_GLOBAL cnanovdb_node1##SUFFIX *) acc->mNode[1]), ijk, acc); \
816 if (cnanovdb_readaccessor_isCached2(acc, dirty)) \
817 return cnanovdb_node2##SUFFIX##_getValueAndCache( ((const CNANOVDB_GLOBAL cnanovdb_node2##SUFFIX *) acc->mNode[2]), ijk, acc); \
819 return cnanovdb_rootdata##SUFFIX##_getValueAndCache( ((const CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *)acc->mNode[3]), ijk, acc); \
822static inline VALUETYPE \
823cnanovdb_readaccessor_getIJKValue##SUFFIX(cnanovdb_readaccessor *RESTRICT acc, int i, int j, int k) \
825 cnanovdb_coord coord; \
826 coord.mVec[0] = i; coord.mVec[1] = j; coord.mVec[2] = k; \
827 return cnanovdb_readaccessor_getValue##SUFFIX(acc, &coord); \
830static inline CNANOVDB_GLOBAL VALUETYPE * \
831cnanovdb_readaccessor_getLeaf##SUFFIX(cnanovdb_readaccessor *RESTRICT acc, const cnanovdb_coord *RESTRICT ijk) \
833 int32_t dirty = cnanovdb_readaccessor_computeDirty(acc, ijk); \
835 if (cnanovdb_readaccessor_isCached0(acc, dirty)) \
836 return ((CNANOVDB_GLOBAL cnanovdb_node0##SUFFIX *) acc->mNode[0])->mVoxels; \
837 else if (cnanovdb_readaccessor_isCached1(acc, dirty)) \
838 cnanovdb_node1##SUFFIX##_getValueAndCache( ((const CNANOVDB_GLOBAL cnanovdb_node1##SUFFIX *) acc->mNode[1]), ijk, acc); \
839 else if (cnanovdb_readaccessor_isCached2(acc, dirty)) \
840 cnanovdb_node2##SUFFIX##_getValueAndCache( ((const CNANOVDB_GLOBAL cnanovdb_node2##SUFFIX *) acc->mNode[2]), ijk, acc); \
842 cnanovdb_rootdata##SUFFIX##_getValueAndCache( ((const CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *)acc->mNode[3]), ijk, acc); \
844 return ((CNANOVDB_GLOBAL cnanovdb_node0##SUFFIX *) acc->mNode[0])->mVoxels; \
848static inline CNANOVDB_GLOBAL VALUETYPE * \
849cnanovdb_readaccessor_getIJKLeaf##SUFFIX(cnanovdb_readaccessor *RESTRICT acc, int i, int j, int k) \
851 cnanovdb_coord coord; \
852 coord.mVec[0] = i; coord.mVec[1] = j; coord.mVec[2] = k; \
853 return cnanovdb_readaccessor_getLeaf##SUFFIX(acc, &coord); \
857cnanovdb_readaccessor_isActive##SUFFIX(cnanovdb_readaccessor *RESTRICT acc, const cnanovdb_coord *RESTRICT ijk) \
859 int32_t dirty = cnanovdb_readaccessor_computeDirty(acc, ijk); \
861 if (cnanovdb_readaccessor_isCached0(acc, dirty)) \
862 return cnanovdb_node0##SUFFIX##_isActive( ((const CNANOVDB_GLOBAL cnanovdb_node0##SUFFIX *) acc->mNode[0]), ijk); \
863 if (cnanovdb_readaccessor_isCached1(acc, dirty)) \
864 return cnanovdb_node1##SUFFIX##_isActiveAndCache( ((const CNANOVDB_GLOBAL cnanovdb_node1##SUFFIX *) acc->mNode[1]), ijk, acc); \
865 if (cnanovdb_readaccessor_isCached2(acc, dirty)) \
866 return cnanovdb_node2##SUFFIX##_isActiveAndCache( ((const CNANOVDB_GLOBAL cnanovdb_node2##SUFFIX *) acc->mNode[2]), ijk, acc); \
868 return cnanovdb_rootdata##SUFFIX##_isActiveAndCache( ((const CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *)acc->mNode[3]), ijk, acc); \
872cnanovdb_readaccessor_isIJKActive##SUFFIX(cnanovdb_readaccessor *RESTRICT acc, int i, int j, int k) \
874 cnanovdb_coord coord; \
875 coord.mVec[0] = i; coord.mVec[1] = j; coord.mVec[2] = k; \
876 return cnanovdb_readaccessor_isActive##SUFFIX(acc, &coord); \
880cnanovdb_readaccessor_setValue##SUFFIX(cnanovdb_readaccessor *RESTRICT acc, const cnanovdb_coord *RESTRICT ijk, VALUETYPE value) \
882 int32_t dirty = cnanovdb_readaccessor_computeDirty(acc, ijk); \
884 if (cnanovdb_readaccessor_isCached0(acc, dirty)) \
885 return cnanovdb_node0##SUFFIX##_setValue( ((CNANOVDB_GLOBAL cnanovdb_node0##SUFFIX *) acc->mNode[0]), ijk, value); \
886 if (cnanovdb_readaccessor_isCached1(acc, dirty)) \
887 return cnanovdb_node1##SUFFIX##_setValueAndCache( ((CNANOVDB_GLOBAL cnanovdb_node1##SUFFIX *) acc->mNode[1]), ijk, value, acc); \
888 if (cnanovdb_readaccessor_isCached2(acc, dirty)) \
889 return cnanovdb_node2##SUFFIX##_setValueAndCache( ((CNANOVDB_GLOBAL cnanovdb_node2##SUFFIX *) acc->mNode[2]), ijk, value, acc); \
891 return cnanovdb_rootdata##SUFFIX##_setValueAndCache( ((CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *)acc->mNode[3]), ijk, value, acc); \
895cnanovdb_readaccessor_setIJKValue##SUFFIX(cnanovdb_readaccessor *RESTRICT acc, int i, int j, int k, VALUETYPE value) \
897 cnanovdb_coord coord; \
898 coord.mVec[0] = i; coord.mVec[1] = j; coord.mVec[2] = k; \
899 return cnanovdb_readaccessor_setValue##SUFFIX(acc, &coord, value); \
906#define CREATE_GRIDTYPE(VALUETYPE, STATSTYPE, SUFFIX) \
907CREATE_TILEENTRY(VALUETYPE, SUFFIX) \
908CREATE_LEAF_NODE(0, 3, 3, VALUETYPE, STATSTYPE, SUFFIX) \
909CREATE_INTERNAL_NODE(0, 1, 4, 7, VALUETYPE, STATSTYPE, SUFFIX) \
910CREATE_INTERNAL_NODE(1, 2, 5, 12, VALUETYPE, STATSTYPE, SUFFIX) \
911CREATE_ROOTDATA(VALUETYPE, STATSTYPE, SUFFIX) \
912CREATE_ACCESSOR(VALUETYPE, SUFFIX) \
924 if (grid->mMagic != 0x304244566f6e614eUL && grid->mMagic != 0x314244566f6e614eUL)
static void cnanovdb_griddata_indexToWorldDir(cnanovdb_Vec3F *dst, const cnanovdb_griddata *__restrict grid, const cnanovdb_Vec3F *src)
Definition CNanoVDB.h:274
static void cnanovdb_readaccessor_insert(cnanovdb_readaccessor *__restrict acc, int childlevel, const void *__restrict node, const cnanovdb_coord *__restrict ijk)
Definition CNanoVDB.h:317
static int cnanovdb_griddata_validF(const cnanovdb_griddata *__restrict grid)
Definition CNanoVDB.h:930
static void cnanovdb_griddata_worldToIndexDir(cnanovdb_Vec3F *dst, const cnanovdb_griddata *__restrict grid, const cnanovdb_Vec3F *src)
Definition CNanoVDB.h:268
static int32_t cnanovdb_readaccessor_computeDirty(const cnanovdb_readaccessor *__restrict acc, const cnanovdb_coord *__restrict ijk)
Definition CNanoVDB.h:799
static int cnanovdb_griddata_valid(const cnanovdb_griddata *__restrict grid)
Definition CNanoVDB.h:920
static void cnanovdb_map_applyIJT(cnanovdb_Vec3F *dst, const cnanovdb_map *__restrict map, const cnanovdb_Vec3F *src)
Definition CNanoVDB.h:209
static void cnanovdb_map_applyInverse(cnanovdb_Vec3F *dst, const cnanovdb_map *__restrict map, const cnanovdb_Vec3F *src)
Definition CNanoVDB.h:176
#define INSTANTIATE(LOG2DIM)
Definition CNanoVDB.h:90
static int cnanovdb_coord_compare(const cnanovdb_coord *a, const cnanovdb_coord *b)
Definition CNanoVDB.h:120
static void cnanovdb_griddata_indexToWorld(cnanovdb_Vec3F *dst, const cnanovdb_griddata *__restrict grid, const cnanovdb_Vec3F *src)
Definition CNanoVDB.h:262
static void cnanovdb_map_applyInverseJacobi(cnanovdb_Vec3F *dst, const cnanovdb_map *__restrict map, const cnanovdb_Vec3F *src)
Definition CNanoVDB.h:198
#define ROOT_LEVEL
Definition CNanoVDB.h:72
#define CNANOVDB_GLOBAL
Definition CNanoVDB.h:36
static void cnanovdb_map_apply(cnanovdb_Vec3F *dst, const cnanovdb_map *__restrict map, const cnanovdb_Vec3F *src)
Definition CNanoVDB.h:165
static int cnanovdb_griddata_validF3(const cnanovdb_griddata *__restrict grid)
Definition CNanoVDB.h:940
static void cnanovdb_readaccessor_init(cnanovdb_readaccessor *__restrict acc, const void *__restrict rootdata)
Definition CNanoVDB.h:769
#define RESTRICT
Definition CNanoVDB.h:37
static int cnanovdb_griddata_validI(const cnanovdb_griddata *__restrict grid)
Definition CNanoVDB.h:950
static void cnanovdb_map_applyJacobi(cnanovdb_Vec3F *dst, const cnanovdb_map *__restrict map, const cnanovdb_Vec3F *src)
Definition CNanoVDB.h:187
#define CREATE_GRIDTYPE(VALUETYPE, STATSTYPE, SUFFIX)
Definition CNanoVDB.h:906
static void cnanovdb_griddata_worldToIndex(cnanovdb_Vec3F *dst, const cnanovdb_griddata *__restrict grid, const cnanovdb_Vec3F *src)
Definition CNanoVDB.h:256
static const cnanovdb_treedata * cnanovdb_griddata_tree(const cnanovdb_griddata *__restrict griddata)
Definition CNanoVDB.h:296
#define DEFINE_ISCACHED(LEVEL, MASK)
Definition CNanoVDB.h:779
cnanovdb_GridType
Definition CNanoVDB.h:43
@ cnanovdb_GridType_Int32
Definition CNanoVDB.h:48
@ cnanovdb_GridType_Unknown
Definition CNanoVDB.h:44
@ cnanovdb_GridType_Double
Definition CNanoVDB.h:46
@ cnanovdb_GridType_FP16
Definition CNanoVDB.h:53
@ cnanovdb_GridType_Vec3f
Definition CNanoVDB.h:50
@ cnanovdb_GridType_Float
Definition CNanoVDB.h:45
@ cnanovdb_GridType_End
Definition CNanoVDB.h:54
@ cnanovdb_GridType_Mask
Definition CNanoVDB.h:52
@ cnanovdb_GridType_Int64
Definition CNanoVDB.h:49
@ cnanovdb_GridType_Vec3d
Definition CNanoVDB.h:51
@ cnanovdb_GridType_Int16
Definition CNanoVDB.h:47
static uint64_t cnanovdb_coord_to_key(const cnanovdb_coord *__restrict ijk)
Definition CNanoVDB.h:139
static void cnanovdb_griddata_applyIJT(cnanovdb_Vec3F *dst, const cnanovdb_griddata *__restrict grid, const cnanovdb_Vec3F *src)
Definition CNanoVDB.h:280
Definition CNanoVDB.h:110
float mVec[3]
Definition CNanoVDB.h:111
Definition CNanoVDB.h:115
int32_t mVec[3]
Definition CNanoVDB.h:116
Definition CNanoVDB.h:233
uint32_t mFlags
Definition CNanoVDB.h:237
double mVoxelSize[3]
Definition CNanoVDB.h:244
uint32_t mVersion
Definition CNanoVDB.h:236
uint32_t mBlindMetadataCount
Definition CNanoVDB.h:248
cnanovdb_map mMap
Definition CNanoVDB.h:242
uint64_t mMagic
Definition CNanoVDB.h:234
uint64_t mGridSize
Definition CNanoVDB.h:240
char mGridName[256]
Definition CNanoVDB.h:241
uint64_t mChecksum
Definition CNanoVDB.h:235
uint32_t mGridCount
Definition CNanoVDB.h:239
uint32_t mGridClass
Definition CNanoVDB.h:245
int64_t mBlindMetadataOffset
Definition CNanoVDB.h:247
uint32_t mGridIndex
Definition CNanoVDB.h:238
double mBBox[6]
Definition CNanoVDB.h:243
uint32_t mGridType
Definition CNanoVDB.h:246
uint32_t _reserved[5]
Definition CNanoVDB.h:252
double mTaperD
Definition CNanoVDB.h:106
double mVecD[3]
Definition CNanoVDB.h:105
float mInvMatF[9]
Definition CNanoVDB.h:100
double mInvMatD[9]
Definition CNanoVDB.h:104
float mMatF[9]
Definition CNanoVDB.h:99
double mMatD[9]
Definition CNanoVDB.h:103
float mTaperF
Definition CNanoVDB.h:102
float mVecF[3]
Definition CNanoVDB.h:101
Definition CNanoVDB.h:310
const void * mNode[4]
Definition CNanoVDB.h:312
cnanovdb_coord mKey
Definition CNanoVDB.h:311
Definition CNanoVDB.h:286
uint64_t mNodeOffset[3+1]
Definition CNanoVDB.h:287
uint32_t mNodeCount[3]
Definition CNanoVDB.h:288
uint32_t mTileCount[3]
Definition CNanoVDB.h:289
uint64_t mVoxelCount
Definition CNanoVDB.h:290