void MetavoxelData::expand() { for (QHash<AttributePointer, MetavoxelNode*>::iterator it = _roots.begin(); it != _roots.end(); it++) { MetavoxelNode* newParent = new MetavoxelNode(it.key()); for (int i = 0; i < MetavoxelNode::CHILD_COUNT; i++) { MetavoxelNode* newChild = new MetavoxelNode(it.key()); newParent->setChild(i, newChild); int index = getOppositeIndex(i); if (it.value()->isLeaf()) { newChild->setChild(index, new MetavoxelNode(it.value()->getAttributeValue(it.key()))); } else { MetavoxelNode* grandchild = it.value()->getChild(i); grandchild->incrementReferenceCount(); newChild->setChild(index, grandchild); } for (int j = 1; j < MetavoxelNode::CHILD_COUNT; j++) { MetavoxelNode* newGrandchild = new MetavoxelNode(it.key()); newChild->setChild((index + j) % MetavoxelNode::CHILD_COUNT, newGrandchild); } newChild->mergeChildren(it.key()); } newParent->mergeChildren(it.key()); it.value()->decrementReferenceCount(it.key()); it.value() = newParent; } _size *= 2.0f; }
MetavoxelNode* Attribute::expandMetavoxelRoot(const MetavoxelNode& root) { AttributePointer attribute(this); MetavoxelNode* newParent = new MetavoxelNode(attribute); for (int i = 0; i < MetavoxelNode::CHILD_COUNT; i++) { MetavoxelNode* newChild = new MetavoxelNode(attribute); newParent->setChild(i, newChild); int index = MetavoxelNode::getOppositeChildIndex(i); if (root.isLeaf()) { newChild->setChild(index, new MetavoxelNode(root.getAttributeValue(attribute))); } else { MetavoxelNode* grandchild = root.getChild(i); grandchild->incrementReferenceCount(); newChild->setChild(index, grandchild); } for (int j = 1; j < MetavoxelNode::CHILD_COUNT; j++) { MetavoxelNode* newGrandchild = new MetavoxelNode(attribute); newChild->setChild((index + j) % MetavoxelNode::CHILD_COUNT, newGrandchild); } newChild->mergeChildren(attribute); } newParent->mergeChildren(attribute); return newParent; }