void BVHN<N>::clearBarrier(NodeRef& node) { if (node.isBarrier()) node.clearBarrier(); else if (!node.isLeaf()) { Node* n = node.node(); for (size_t c=0; c<N; c++) clearBarrier(n->child(c)); } }
void BVHN<N>::clearBarrier(NodeRef& node) { if (node.isBarrier()) node.clearBarrier(); else if (!node.isLeaf()) { BaseNode* n = node.baseNode(BVH_FLAG_ALIGNED_NODE); // FIXME: flags should be stored in BVH for (size_t c=0; c<N; c++) clearBarrier(n->child(c)); } }
typename BVHN<N>::NodeRef BVHN<N>::layoutLargeNodesRecursion(NodeRef& node, FastAllocator::ThreadLocal& allocator) { if (node.isBarrier()) { node.clearBarrier(); return node; } else if (node.isNode()) { Node* oldnode = node.node(); Node* newnode = (BVHN::Node*) allocator.malloc(sizeof(BVHN::Node),byteNodeAlignment); *newnode = *oldnode; for (size_t c=0; c<N; c++) newnode->child(c) = layoutLargeNodesRecursion(oldnode->child(c),allocator); return encodeNode(newnode); } else return node; }
BVH4::NodeRef BVH4::layoutLargeNodesRecursion(NodeRef& node) { if (node.isBarrier()) { node.clearBarrier(); return node; } else if (node.isNode()) { Node* oldnode = node.node(); Node* newnode = (BVH4::Node*) alloc.threadLocal2()->alloc0.malloc(sizeof(BVH4::Node)); // FIXME: optimize access to threadLocal2 *newnode = *oldnode; for (size_t c=0; c<BVH4::N; c++) newnode->child(c) = layoutLargeNodesRecursion(oldnode->child(c)); return encodeNode(newnode); } else return node; }