14 #define CNANOVDB_DATA_ALIGNMENT 32 15 #define CNANOVDB_ALIGNMENT_PADDING(x, n) (-(x) & ((n)-1)) 17 #define USE_SINGLE_ROOT_KEY 19 #ifdef __OPENCL_VERSION__ 21 #define CNANOVDB_GLOBAL __global 22 #define RESTRICT restrict 25 typedef unsigned long uint64_t;
27 typedef unsigned int uint32_t;
29 typedef short int16_t;
30 typedef unsigned short uint16_t;
31 typedef unsigned char uint8_t;
35 #define CNANOVDB_GLOBAL 36 #define RESTRICT __restrict 58 #define DEFINEMASK_int(LOG2DIM, SIZE) \ 61 uint64_t mWords[SIZE >> 6]; \ 62 } cnanovdb_mask##LOG2DIM; \ 64 static void cnanovdb_mask##LOG2DIM##_clear(CNANOVDB_GLOBAL cnanovdb_mask##LOG2DIM *RESTRICT mask) \ 65 { for (uint32_t i = 0; i < (SIZE >> 6); i++) mask->mWords[i] = 0; } \ 67 static bool cnanovdb_mask##LOG2DIM##_isOn(const CNANOVDB_GLOBAL cnanovdb_mask##LOG2DIM *RESTRICT mask, uint32_t n) \ 68 { return 0 != (mask->mWords[n >> 6] & (((uint64_t)(1)) << (n & 63))); } \ 71 #define DEFINEMASK(LOG2DIM) \ 72 DEFINEMASK_int(LOG2DIM, (1U << (3*LOG2DIM))) 74 #define INSTANTIATE(LOG2DIM) \ 106 if (a->mVec[0] < b->
mVec[0])
108 if (a->mVec[0] > b->
mVec[0])
110 if (a->mVec[1] < b->
mVec[1])
112 if (a->mVec[1] > b->
mVec[1])
114 if (a->mVec[2] < b->
mVec[2])
116 if (a->mVec[2] > b->
mVec[2])
121 #ifdef USE_SINGLE_ROOT_KEY 126 #if defined(AVOID_64BIT_SHIFT) 127 uint2 key = (uint2)( ((uint32_t)ijk->mVec[2]) >> 12, 0) |
128 (uint2)((((uint32_t)ijk->mVec[1]) >> 12) << 21,
129 ((uint32_t)ijk->mVec[1]) >> 23) |
130 (uint2)(0, (((uint32_t)ijk->mVec[0]) >> 12) << 10);
131 return *(uint64_t *)&key;
133 return ((uint64_t) (((uint32_t)ijk->mVec[2]) >> 12)) |
134 (((uint64_t) (((uint32_t)ijk->mVec[1]) >> 12)) << 21) |
135 (((uint64_t) (((uint32_t)ijk->mVec[0]) >> 12)) << 42);
142 key->mVec[0] = ijk->mVec[0] & ~((1u << 12) - 1u);
143 key->mVec[1] = ijk->mVec[1] & ~((1u << 12) - 1u);
144 key->mVec[2] = ijk->mVec[2] & ~((1u << 12) - 1u);
151 float sx = src->
mVec[0];
152 float sy = src->
mVec[1];
153 float sz = src->
mVec[2];
154 dst->
mVec[0] = sx * map->mMatF[0] + sy * map->mMatF[1] + sz * map->mMatF[2] + map->mVecF[0];
155 dst->
mVec[1] = sx * map->mMatF[3] + sy * map->mMatF[4] + sz * map->mMatF[5] + map->mVecF[1];
156 dst->
mVec[2] = sx * map->mMatF[6] + sy * map->mMatF[7] + sz * map->mMatF[8] + map->mVecF[2];
162 float sx = src->
mVec[0] - map->mVecF[0];
163 float sy = src->
mVec[1] - map->mVecF[1];
164 float sz = src->
mVec[2] - map->mVecF[2];
165 dst->
mVec[0] = sx * map->mInvMatF[0] + sy * map->mInvMatF[1] + sz * map->mInvMatF[2];
166 dst->
mVec[1] = sx * map->mInvMatF[3] + sy * map->mInvMatF[4] + sz * map->mInvMatF[5];
167 dst->
mVec[2] = sx * map->mInvMatF[6] + sy * map->mInvMatF[7] + sz * map->mInvMatF[8];
173 float sx = src->
mVec[0];
174 float sy = src->
mVec[1];
175 float sz = src->
mVec[2];
176 dst->
mVec[0] = sx * map->mMatF[0] + sy * map->mMatF[1] + sz * map->mMatF[2];
177 dst->
mVec[1] = sx * map->mMatF[3] + sy * map->mMatF[4] + sz * map->mMatF[5];
178 dst->
mVec[2] = sx * map->mMatF[6] + sy * map->mMatF[7] + sz * map->mMatF[8];
184 float sx = src->
mVec[0];
185 float sy = src->
mVec[1];
186 float sz = src->
mVec[2];
187 dst->
mVec[0] = sx * map->mInvMatF[0] + sy * map->mInvMatF[1] + sz * map->mInvMatF[2];
188 dst->
mVec[1] = sx * map->mInvMatF[3] + sy * map->mInvMatF[4] + sz * map->mInvMatF[5];
189 dst->
mVec[2] = sx * map->mInvMatF[6] + sy * map->mInvMatF[7] + sz * map->mInvMatF[8];
195 float sx = src->
mVec[0];
196 float sy = src->
mVec[1];
197 float sz = src->
mVec[2];
198 dst->
mVec[0] = sx * map->mInvMatF[0] + sy * map->mInvMatF[3] + sz * map->mInvMatF[6];
199 dst->
mVec[1] = sx * map->mInvMatF[1] + sy * map->mInvMatF[4] + sz * map->mInvMatF[7];
200 dst->
mVec[2] = sx * map->mInvMatF[2] + sy * map->mInvMatF[5] + sz * map->mInvMatF[8];
227 double mVoxelSize[3];
280 #define CREATE_TILEENTRY(VALUETYPE, SUFFIX) \ 285 } cnanovdb_tileentry##SUFFIX; \ 298 acc->mNode[childlevel] = node;
299 acc->mKey.mVec[0] = ijk->mVec[0];
300 acc->mKey.mVec[1] = ijk->mVec[1];
301 acc->mKey.mVec[2] = ijk->mVec[2];
304 #define CREATE_LEAF_NODE_int(LEVEL, LOG2DIM, CHILDTOTAL, TOTAL, MASK, VALUETYPE, STATSTYPE, SUFFIX) \ 307 cnanovdb_coord mBBox_min; \ 308 uint8_t mBBoxDif[3]; \ 310 cnanovdb_mask##LOG2DIM mValueMask; \ 311 VALUETYPE mMinimum; \ 312 VALUETYPE mMaximum; \ 313 STATSTYPE mAverage; \ 314 STATSTYPE mStdDevi; \ 315 uint32_t _reserved[ CNANOVDB_ALIGNMENT_PADDING(sizeof(cnanovdb_mask##LOG2DIM)+2*sizeof(VALUETYPE)+2*sizeof(STATSTYPE)+sizeof(cnanovdb_coord)+sizeof(uint8_t[3])+sizeof(uint8_t), CNANOVDB_DATA_ALIGNMENT)/4]; \ 316 VALUETYPE mVoxels[1u << (3*LOG2DIM)]; \ 317 } cnanovdb_node##LEVEL##SUFFIX; \ 320 cnanovdb_node##LEVEL##SUFFIX##_CoordToOffset(const cnanovdb_coord *RESTRICT ijk) \ 322 return ( ( ( ijk->mVec[0] & MASK ) >> CHILDTOTAL ) << ( 2 * LOG2DIM ) ) + \ 323 ( ( ( ijk->mVec[1] & MASK ) >> CHILDTOTAL ) << ( LOG2DIM ) ) + \ 324 ( ( ijk->mVec[2] & MASK ) >> CHILDTOTAL ); \ 328 cnanovdb_node##LEVEL##SUFFIX##_getValue(const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *RESTRICT node, const cnanovdb_coord *RESTRICT ijk) \ 330 uint32_t n = cnanovdb_node##LEVEL##SUFFIX##_CoordToOffset(ijk); \ 331 return node->mVoxels[n]; \ 335 cnanovdb_node##LEVEL##SUFFIX##_getValueAndCache(const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *RESTRICT node, const cnanovdb_coord *RESTRICT ijk, cnanovdb_readaccessor *RESTRICT acc) \ 338 uint32_t n = cnanovdb_node##LEVEL##SUFFIX##_CoordToOffset(ijk); \ 339 return node->mVoxels[n]; \ 343 cnanovdb_node##LEVEL##SUFFIX##_isActive(const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *RESTRICT node, const cnanovdb_coord *RESTRICT ijk) \ 345 uint32_t n = cnanovdb_node##LEVEL##SUFFIX##_CoordToOffset(ijk); \ 346 if (cnanovdb_mask##LOG2DIM##_isOn(&node->mValueMask, n)) \ 352 cnanovdb_node##LEVEL##SUFFIX##_isActiveAndCache(const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *RESTRICT node, const cnanovdb_coord *RESTRICT ijk, cnanovdb_readaccessor *RESTRICT acc) \ 355 uint32_t n = cnanovdb_node##LEVEL##SUFFIX##_CoordToOffset(ijk); \ 356 if (cnanovdb_mask##LOG2DIM##_isOn(&node->mValueMask, n)) \ 361 static const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX * \ 362 cnanovdb_tree_getNode##LEVEL##SUFFIX(const CNANOVDB_GLOBAL cnanovdb_treedata *RESTRICT tree, uint64_t i) \ 364 const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *basenode = (const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *)((CNANOVDB_GLOBAL uint8_t *)(tree) + tree->mNodeOffset[LEVEL]); \ 365 return basenode + i; \ 370 #define CREATE_LEAF_NODE(LEVEL, LOG2DIM, TOTAL, VALUETYPE, STATSTYPE, SUFFIX) \ 371 CREATE_LEAF_NODE_int(LEVEL, LOG2DIM, (TOTAL-LOG2DIM), TOTAL, ((1u << TOTAL) - 1u), VALUETYPE, STATSTYPE, SUFFIX) 373 #define CREATE_INTERNAL_NODE_int(CHILDLEVEL, LEVEL, LOG2DIM, CHILDTOTAL, TOTAL, MASK, VALUETYPE, STATSTYPE, SUFFIX) \ 376 cnanovdb_coord mBBox_min, mBBox_max; \ 379 cnanovdb_mask##LOG2DIM mValueMask, mChildMask; \ 380 VALUETYPE mMinimum, mMaximum; \ 381 STATSTYPE mAverage, mStdDevi; \ 382 uint8_t _reserved[CNANOVDB_ALIGNMENT_PADDING(sizeof(cnanovdb_mask##LOG2DIM)+sizeof(VALUETYPE)*2+sizeof(STATSTYPE)*2+sizeof(cnanovdb_coord)*2+sizeof(int32_t)+sizeof(uint32_t), CNANOVDB_DATA_ALIGNMENT)]; \ 383 cnanovdb_tileentry##SUFFIX mTable[1u << (3*LOG2DIM)]; \ 384 } cnanovdb_node##LEVEL##SUFFIX; \ 387 cnanovdb_node##LEVEL##SUFFIX##_CoordToOffset(const cnanovdb_coord *RESTRICT ijk) \ 389 return ( ( ( ijk->mVec[0] & MASK ) >> CHILDTOTAL ) << ( 2 * LOG2DIM ) ) + \ 390 ( ( ( ijk->mVec[1] & MASK ) >> CHILDTOTAL ) << ( LOG2DIM ) ) + \ 391 ( ( ijk->mVec[2] & MASK ) >> CHILDTOTAL ); \ 394 static const CNANOVDB_GLOBAL cnanovdb_node##CHILDLEVEL##SUFFIX * \ 395 cnanovdb_node##LEVEL##SUFFIX##_getChild(const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *RESTRICT node, uint32_t n) \ 397 const CNANOVDB_GLOBAL cnanovdb_node##CHILDLEVEL##SUFFIX *childnode = (const CNANOVDB_GLOBAL cnanovdb_node##CHILDLEVEL##SUFFIX *)( ((CNANOVDB_GLOBAL uint8_t *)node) + node->mTable[n].child); \ 402 cnanovdb_node##LEVEL##SUFFIX##_getValue(const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *RESTRICT node, const cnanovdb_coord *RESTRICT ijk) \ 404 uint32_t n = cnanovdb_node##LEVEL##SUFFIX##_CoordToOffset(ijk); \ 405 if (cnanovdb_mask##LOG2DIM##_isOn(&node->mChildMask, n)) \ 407 const CNANOVDB_GLOBAL cnanovdb_node##CHILDLEVEL##SUFFIX *child = cnanovdb_node##LEVEL##SUFFIX##_getChild(node, n); \ 408 return cnanovdb_node##CHILDLEVEL##SUFFIX##_getValue(child, ijk); \ 410 return node->mTable[n].value; \ 414 cnanovdb_node##LEVEL##SUFFIX##_getValueAndCache(const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *RESTRICT node, const cnanovdb_coord *RESTRICT ijk, cnanovdb_readaccessor *RESTRICT acc) \ 416 uint32_t n = cnanovdb_node##LEVEL##SUFFIX##_CoordToOffset(ijk); \ 417 if (cnanovdb_mask##LOG2DIM##_isOn(&node->mChildMask, n)) \ 419 const CNANOVDB_GLOBAL cnanovdb_node##CHILDLEVEL##SUFFIX *child = cnanovdb_node##LEVEL##SUFFIX##_getChild(node, n); \ 420 cnanovdb_readaccessor_insert(acc, CHILDLEVEL, child, ijk); \ 421 return cnanovdb_node##CHILDLEVEL##SUFFIX##_getValueAndCache(child, ijk, acc); \ 423 return node->mTable[n].value; \ 427 cnanovdb_node##LEVEL##SUFFIX##_isActive(const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *RESTRICT node, const cnanovdb_coord *RESTRICT ijk) \ 429 uint32_t n = cnanovdb_node##LEVEL##SUFFIX##_CoordToOffset(ijk); \ 430 if (cnanovdb_mask##LOG2DIM##_isOn(&node->mChildMask, n)) \ 432 const CNANOVDB_GLOBAL cnanovdb_node##CHILDLEVEL##SUFFIX *child = cnanovdb_node##LEVEL##SUFFIX##_getChild(node, n); \ 433 return cnanovdb_node##CHILDLEVEL##SUFFIX##_isActive(child, ijk); \ 435 return cnanovdb_mask##LOG2DIM##_isOn(&node->mValueMask, n) ? true : false; \ 439 cnanovdb_node##LEVEL##SUFFIX##_isActiveAndCache(const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *RESTRICT node, const cnanovdb_coord *RESTRICT ijk, cnanovdb_readaccessor *RESTRICT acc) \ 441 uint32_t n = cnanovdb_node##LEVEL##SUFFIX##_CoordToOffset(ijk); \ 442 if (cnanovdb_mask##LOG2DIM##_isOn(&node->mChildMask, n)) \ 444 const CNANOVDB_GLOBAL cnanovdb_node##CHILDLEVEL##SUFFIX *child = cnanovdb_node##LEVEL##SUFFIX##_getChild(node, n); \ 445 cnanovdb_readaccessor_insert(acc, CHILDLEVEL, child, ijk); \ 446 return cnanovdb_node##CHILDLEVEL##SUFFIX##_isActiveAndCache(child, ijk, acc); \ 448 return cnanovdb_mask##LOG2DIM##_isOn(&node->mValueMask, n) ? true : false; \ 451 static const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX * \ 452 cnanovdb_tree_getNode##LEVEL##SUFFIX(const CNANOVDB_GLOBAL cnanovdb_treedata *RESTRICT tree, uint64_t i) \ 454 const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *basenode = (const CNANOVDB_GLOBAL cnanovdb_node##LEVEL##SUFFIX *)((CNANOVDB_GLOBAL uint8_t *)(tree) + tree->mNodeOffset[LEVEL]); \ 455 return basenode + i; \ 460 #define CREATE_INTERNAL_NODE(CHILDLEVEL, LEVEL, LOG2DIM, TOTAL, VALUETYPE, STATSTYPE, SUFFIX) \ 461 CREATE_INTERNAL_NODE_int(CHILDLEVEL, LEVEL, LOG2DIM, (TOTAL-LOG2DIM), TOTAL, ((1u << TOTAL) - 1u), VALUETYPE, STATSTYPE, SUFFIX) 464 #ifdef USE_SINGLE_ROOT_KEY 465 #define DEFINE_KEY(KEY) \ 467 #define KEYSIZE sizeof(uint64_t) 469 #define KEYSEARCH(SUFFIX) \ 471 key = cnanovdb_coord_to_key(ijk); \ 473 for (int i = low; i < high; i++) \ 475 const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *tile = tiles + i; \ 476 if (tile->key == key) \ 481 #define DEFINE_KEY(KEY) \ 483 #define KEYSIZE sizeof(cnanovdb_coord) 484 #define KEYSEARCH(SUFFIX) \ 485 cnanovdb_coord key; \ 486 cnanovdb_coord_to_key(&key, ijk); \ 488 while (low != high) \ 490 int32_t mid = low + (( high - low ) >> 1 ); \ 491 const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *tile = tiles + mid; \ 493 int keycmp = cnanovdb_coord_compare(&tile->key, &key); \ 508 #define CREATE_ROOTDATA(VALUETYPE, STATSTYPE, SUFFIX) \ 515 uint8_t _reserved[CNANOVDB_ALIGNMENT_PADDING(sizeof(KEYSIZE)+sizeof(VALUETYPE)+sizeof(int64_t)+sizeof(uint32_t), CNANOVDB_DATA_ALIGNMENT)]; \ 516 } cnanovdb_rootdata_tile##SUFFIX; \ 520 cnanovdb_coord mBBox_min, mBBox_max; \ 521 uint32_t mTableSize; \ 522 VALUETYPE mBackground; \ 523 VALUETYPE mMinimum, mMaximum; \ 524 STATSTYPE mAverage, mStdDevi; \ 525 uint32_t _reserved[CNANOVDB_ALIGNMENT_PADDING(sizeof(cnanovdb_coord)*2+sizeof(uint32_t)+sizeof(VALUETYPE)*3+sizeof(STATSTYPE)*2, CNANOVDB_DATA_ALIGNMENT)/4]; \ 526 } cnanovdb_rootdata##SUFFIX; \ 528 static const CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX * \ 529 cnanovdb_treedata_root##SUFFIX(const CNANOVDB_GLOBAL cnanovdb_treedata *RESTRICT treedata) \ 531 return (const CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *) ((const CNANOVDB_GLOBAL uint8_t *)(treedata) + treedata->mNodeOffset[ROOT_LEVEL]); \ 534 static const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX * \ 535 cnanovdb_rootdata##SUFFIX##_getTile(const CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *RESTRICT rootdata, uint32_t n) \ 537 const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *basetile = (const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *) (rootdata + 1); \ 538 return basetile + n; \ 541 static const CNANOVDB_GLOBAL cnanovdb_node2##SUFFIX * \ 542 cnanovdb_rootdata##SUFFIX##_getChild(const CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *RESTRICT rootdata, const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *RESTRICT tile) \ 544 CNANOVDB_GLOBAL cnanovdb_node2##SUFFIX *basenode = (CNANOVDB_GLOBAL cnanovdb_node2##SUFFIX *) (((CNANOVDB_GLOBAL uint8_t *) rootdata) + tile->child); \ 548 static const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX * \ 549 cnanovdb_rootdata##SUFFIX##_findTile(const CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *RESTRICT rootdata, const cnanovdb_coord *RESTRICT ijk) \ 551 int32_t low = 0, high = rootdata->mTableSize; \ 552 const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *tiles = cnanovdb_rootdata##SUFFIX##_getTile(rootdata, 0); \ 559 cnanovdb_rootdata##SUFFIX##_getValue(const CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *RESTRICT rootdata, const cnanovdb_coord *RESTRICT ijk) \ 561 const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *tile = cnanovdb_rootdata##SUFFIX##_findTile(rootdata, ijk); \ 563 return rootdata->mBackground; \ 564 if (tile->child == 0) \ 565 return tile->value; \ 566 return cnanovdb_node2##SUFFIX##_getValue( cnanovdb_rootdata##SUFFIX##_getChild(rootdata, tile), ijk ); \ 570 cnanovdb_rootdata##SUFFIX##_getValueAndCache(const CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *RESTRICT rootdata, const cnanovdb_coord *RESTRICT ijk, cnanovdb_readaccessor *RESTRICT acc) \ 572 const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *tile = cnanovdb_rootdata##SUFFIX##_findTile(rootdata, ijk); \ 574 return rootdata->mBackground; \ 575 if (tile->child == 0) \ 576 return tile->value; \ 577 const CNANOVDB_GLOBAL cnanovdb_node2##SUFFIX *child = cnanovdb_rootdata##SUFFIX##_getChild(rootdata, tile); \ 578 cnanovdb_readaccessor_insert(acc, 2, child, ijk); \ 579 return cnanovdb_node2##SUFFIX##_getValueAndCache( child, ijk, acc ); \ 583 cnanovdb_rootdata##SUFFIX##_isActive(const CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *RESTRICT rootdata, const cnanovdb_coord *RESTRICT ijk) \ 585 const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *tile = cnanovdb_rootdata##SUFFIX##_findTile(rootdata, ijk); \ 588 if (tile->child == 0) \ 589 return tile->state; \ 590 return cnanovdb_node2##SUFFIX##_isActive( cnanovdb_rootdata##SUFFIX##_getChild(rootdata, tile), ijk ); \ 594 cnanovdb_rootdata##SUFFIX##_isActiveAndCache(const CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *RESTRICT rootdata, const cnanovdb_coord *RESTRICT ijk, cnanovdb_readaccessor *RESTRICT acc) \ 596 const CNANOVDB_GLOBAL cnanovdb_rootdata_tile##SUFFIX *tile = cnanovdb_rootdata##SUFFIX##_findTile(rootdata, ijk); \ 599 if (tile->child == 0) \ 600 return tile->state; \ 601 const CNANOVDB_GLOBAL cnanovdb_node2##SUFFIX *child = cnanovdb_rootdata##SUFFIX##_getChild(rootdata, tile); \ 602 cnanovdb_readaccessor_insert(acc, 2, child, ijk); \ 603 return cnanovdb_node2##SUFFIX##_isActiveAndCache( child, ijk, acc ); \ 612 acc->mNode[0] = acc->mNode[1] = acc->mNode[2] = 0;
613 acc->mNode[3] = rootdata;
616 #define DEFINE_ISCACHED(LEVEL, MASK) \ 618 cnanovdb_readaccessor_isCached##LEVEL(cnanovdb_readaccessor *RESTRICT acc, int32_t dirty) \ 620 if (!acc->mNode[LEVEL]) \ 624 acc->mNode[LEVEL] = 0; \ 638 return (ijk->mVec[0] ^ acc->mKey.mVec[0]) |
639 (ijk->mVec[1] ^ acc->mKey.mVec[1]) |
640 (ijk->mVec[2] ^ acc->mKey.mVec[2]);
643 #define CREATE_ACCESSOR(VALUETYPE, SUFFIX) \ 645 cnanovdb_readaccessor_getValue##SUFFIX(cnanovdb_readaccessor *RESTRICT acc, const cnanovdb_coord *RESTRICT ijk) \ 647 int32_t dirty = cnanovdb_readaccessor_computeDirty(acc, ijk); \ 649 if (cnanovdb_readaccessor_isCached0(acc, dirty)) \ 650 return cnanovdb_node0##SUFFIX##_getValue( ((CNANOVDB_GLOBAL cnanovdb_node0##SUFFIX *) acc->mNode[0]), ijk); \ 651 if (cnanovdb_readaccessor_isCached1(acc, dirty)) \ 652 return cnanovdb_node1##SUFFIX##_getValueAndCache( ((CNANOVDB_GLOBAL cnanovdb_node1##SUFFIX *) acc->mNode[1]), ijk, acc); \ 653 if (cnanovdb_readaccessor_isCached2(acc, dirty)) \ 654 return cnanovdb_node2##SUFFIX##_getValueAndCache( ((CNANOVDB_GLOBAL cnanovdb_node2##SUFFIX *) acc->mNode[2]), ijk, acc); \ 656 return cnanovdb_rootdata##SUFFIX##_getValueAndCache( ((CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *)acc->mNode[3]), ijk, acc); \ 660 cnanovdb_readaccessor_isActive##SUFFIX(cnanovdb_readaccessor *RESTRICT acc, const cnanovdb_coord *RESTRICT ijk) \ 662 int32_t dirty = cnanovdb_readaccessor_computeDirty(acc, ijk); \ 664 if (cnanovdb_readaccessor_isCached0(acc, dirty)) \ 665 return cnanovdb_node0##SUFFIX##_isActive( ((CNANOVDB_GLOBAL cnanovdb_node0##SUFFIX *) acc->mNode[0]), ijk); \ 666 if (cnanovdb_readaccessor_isCached1(acc, dirty)) \ 667 return cnanovdb_node1##SUFFIX##_isActiveAndCache( ((CNANOVDB_GLOBAL cnanovdb_node1##SUFFIX *) acc->mNode[1]), ijk, acc); \ 668 if (cnanovdb_readaccessor_isCached2(acc, dirty)) \ 669 return cnanovdb_node2##SUFFIX##_isActiveAndCache( ((CNANOVDB_GLOBAL cnanovdb_node2##SUFFIX *) acc->mNode[2]), ijk, acc); \ 671 return cnanovdb_rootdata##SUFFIX##_isActiveAndCache( ((CNANOVDB_GLOBAL cnanovdb_rootdata##SUFFIX *)acc->mNode[3]), ijk, acc); \ 676 #define CREATE_GRIDTYPE(VALUETYPE, STATSTYPE, SUFFIX) \ 677 CREATE_TILEENTRY(VALUETYPE, SUFFIX) \ 678 CREATE_LEAF_NODE(0, 3, 3, VALUETYPE, STATSTYPE, SUFFIX) \ 679 CREATE_INTERNAL_NODE(0, 1, 4, 7, VALUETYPE, STATSTYPE, SUFFIX) \ 680 CREATE_INTERNAL_NODE(1, 2, 5, 12, VALUETYPE, STATSTYPE, SUFFIX) \ 681 CREATE_ROOTDATA(VALUETYPE, STATSTYPE, SUFFIX) \ 682 CREATE_ACCESSOR(VALUETYPE, SUFFIX) \ 693 if (grid->mMagic != 0x304244566f6e614eUL && grid->mMagic != 0x314244566f6e614eUL)
Definition: CNanoVDB.h:45
Definition: CNanoVDB.h:49
#define INSTANTIATE(LOG2DIM)
Definition: CNanoVDB.h:74
Definition: CNanoVDB.h:46
static void cnanovdb_map_applyInverseJacobi(cnanovdb_Vec3F *dst, const cnanovdb_map *__restrict map, const cnanovdb_Vec3F *src)
Definition: CNanoVDB.h:182
static int cnanovdb_griddata_validF3(const cnanovdb_griddata *__restrict grid)
Definition: CNanoVDB.h:709
uint64_t mGridSize
Definition: CNanoVDB.h:223
static void cnanovdb_griddata_worldToIndexDir(cnanovdb_Vec3F *dst, const cnanovdb_griddata *__restrict grid, const cnanovdb_Vec3F *src)
Definition: CNanoVDB.h:248
static int cnanovdb_coord_compare(const cnanovdb_coord *a, const cnanovdb_coord *b)
Definition: CNanoVDB.h:104
void cnanovdb_readaccessor_init(cnanovdb_readaccessor *__restrict acc, const void *__restrict rootdata)
Definition: CNanoVDB.h:609
uint32_t mGridIndex
Definition: CNanoVDB.h:221
Definition: CNanoVDB.h:81
Definition: CNanoVDB.h:215
static void cnanovdb_map_applyJacobi(cnanovdb_Vec3F *dst, const cnanovdb_map *__restrict map, const cnanovdb_Vec3F *src)
Definition: CNanoVDB.h:171
uint32_t mGridType
Definition: CNanoVDB.h:229
Definition: CNanoVDB.h:43
cnanovdb_GridType
Definition: CNanoVDB.h:41
Definition: CNanoVDB.h:44
static void cnanovdb_griddata_indexToWorld(cnanovdb_Vec3F *dst, const cnanovdb_griddata *__restrict grid, const cnanovdb_Vec3F *src)
Definition: CNanoVDB.h:242
Definition: CNanoVDB.h:98
Definition: CNanoVDB.h:265
int32_t cnanovdb_readaccessor_computeDirty(const cnanovdb_readaccessor *__restrict acc, const cnanovdb_coord *__restrict ijk)
Definition: CNanoVDB.h:636
#define CREATE_GRIDTYPE(VALUETYPE, STATSTYPE, SUFFIX)
Definition: CNanoVDB.h:676
Definition: CNanoVDB.h:51
float mVec[3]
Definition: CNanoVDB.h:95
uint64_t mVoxelCount
Definition: CNanoVDB.h:270
static void cnanovdb_griddata_applyIJT(cnanovdb_Vec3F *dst, const cnanovdb_griddata *__restrict grid, const cnanovdb_Vec3F *src)
Definition: CNanoVDB.h:260
#define CNANOVDB_GLOBAL
Definition: CNanoVDB.h:35
uint32_t mGridCount
Definition: CNanoVDB.h:222
static void cnanovdb_map_applyIJT(cnanovdb_Vec3F *dst, const cnanovdb_map *__restrict map, const cnanovdb_Vec3F *src)
Definition: CNanoVDB.h:193
#define RESTRICT
Definition: CNanoVDB.h:36
#define DEFINE_ISCACHED(LEVEL, MASK)
Definition: CNanoVDB.h:616
Definition: CNanoVDB.h:53
uint32_t mGridClass
Definition: CNanoVDB.h:228
#define ROOT_LEVEL
Definition: CNanoVDB.h:56
uint64_t mBlindMetadataOffset
Definition: CNanoVDB.h:230
Definition: CNanoVDB.h:288
static void cnanovdb_griddata_worldToIndex(cnanovdb_Vec3F *dst, const cnanovdb_griddata *__restrict grid, const cnanovdb_Vec3F *src)
Definition: CNanoVDB.h:236
static int cnanovdb_griddata_valid(const cnanovdb_griddata *__restrict grid)
Definition: CNanoVDB.h:689
#define CNANOVDB_ALIGNMENT_PADDING(x, n)
Definition: CNanoVDB.h:15
cnanovdb_coord mKey
Definition: CNanoVDB.h:290
#define CNANOVDB_DATA_ALIGNMENT
Definition: CNanoVDB.h:14
uint32_t mVersion
Definition: CNanoVDB.h:219
uint64_t mMagic
Definition: CNanoVDB.h:217
Definition: CNanoVDB.h:93
int32_t mVec[3]
Definition: CNanoVDB.h:100
static uint64_t cnanovdb_coord_to_key(const cnanovdb_coord *__restrict ijk)
Definition: CNanoVDB.h:123
float mTaperF
Definition: CNanoVDB.h:86
cnanovdb_map mMap
Definition: CNanoVDB.h:225
static void cnanovdb_map_apply(cnanovdb_Vec3F *dst, const cnanovdb_map *__restrict map, const cnanovdb_Vec3F *src)
Definition: CNanoVDB.h:149
Definition: CNanoVDB.h:50
Definition: CNanoVDB.h:47
static const cnanovdb_treedata * cnanovdb_griddata_tree(const cnanovdb_griddata *__restrict griddata)
Definition: CNanoVDB.h:275
int32_t mBlindMetadataCount
Definition: CNanoVDB.h:231
static void cnanovdb_griddata_indexToWorldDir(cnanovdb_Vec3F *dst, const cnanovdb_griddata *__restrict grid, const cnanovdb_Vec3F *src)
Definition: CNanoVDB.h:254
uint32_t mFlags
Definition: CNanoVDB.h:220
Definition: CNanoVDB.h:52
static void cnanovdb_map_applyInverse(cnanovdb_Vec3F *dst, const cnanovdb_map *__restrict map, const cnanovdb_Vec3F *src)
Definition: CNanoVDB.h:160
double mTaperD
Definition: CNanoVDB.h:90
uint64_t mChecksum
Definition: CNanoVDB.h:218
static void cnanovdb_readaccessor_insert(cnanovdb_readaccessor *__restrict acc, int childlevel, const void *__restrict node, const cnanovdb_coord *__restrict ijk)
Definition: CNanoVDB.h:296
Definition: CNanoVDB.h:48
static int cnanovdb_griddata_validF(const cnanovdb_griddata *__restrict grid)
Definition: CNanoVDB.h:699