void Attribute::readMetavoxelSubdivision(MetavoxelData& data, MetavoxelStreamState& state) { // copy if changed MetavoxelNode* oldRoot = data.getRoot(state.base.attribute); MetavoxelNode* newRoot = oldRoot->readSubdivision(state); if (newRoot != oldRoot) { data.setRoot(state.base.attribute, newRoot); } }
void Attribute::readMetavoxelDelta(MetavoxelData& data, const MetavoxelNode& reference, MetavoxelStreamState& state) { data.createRoot(state.base.attribute)->readDelta(reference, state); }
void MetavoxelData::writeDelta(const MetavoxelData& reference, Bitstream& out) const { // first things first: there might be no change whatsoever if (_size == reference._size && _roots == reference._roots) { out << false; return; } out << true; // compare the size; if changed (rare), we must compare to the expanded reference const MetavoxelData* expandedReference = &reference; if (_size == reference._size) { out << false; } else { out << true; out << _size; MetavoxelData* expanded = new MetavoxelData(reference); while (expanded->_size < _size) { expanded->expand(); } expandedReference = expanded; } // count the number of roots added/changed, then write int changedCount = 0; for (QHash<AttributePointer, MetavoxelNode*>::const_iterator it = _roots.constBegin(); it != _roots.constEnd(); it++) { MetavoxelNode* referenceRoot = expandedReference->_roots.value(it.key()); if (it.value() != referenceRoot) { changedCount++; } } out << changedCount; for (QHash<AttributePointer, MetavoxelNode*>::const_iterator it = _roots.constBegin(); it != _roots.constEnd(); it++) { MetavoxelNode* referenceRoot = expandedReference->_roots.value(it.key()); if (it.value() != referenceRoot) { out.getAttributeStreamer() << it.key(); if (referenceRoot) { it.value()->writeDelta(it.key(), *referenceRoot, out); } else { it.value()->write(it.key(), out); } } } // same with nodes removed int removedCount = 0; for (QHash<AttributePointer, MetavoxelNode*>::const_iterator it = expandedReference->_roots.constBegin(); it != expandedReference->_roots.constEnd(); it++) { if (!_roots.contains(it.key())) { removedCount++; } } out << removedCount; for (QHash<AttributePointer, MetavoxelNode*>::const_iterator it = expandedReference->_roots.constBegin(); it != expandedReference->_roots.constEnd(); it++) { if (!_roots.contains(it.key())) { out.getAttributeStreamer() << it.key(); } } // delete the expanded reference if we had to expand if (expandedReference != &reference) { delete expandedReference; } }
void Attribute::readMetavoxelRoot(MetavoxelData& data, MetavoxelStreamState& state) { data.createRoot(state.base.attribute)->read(state); }
void Attribute::readMetavoxelSubdivision(MetavoxelData& data, MetavoxelStreamState& state) { data.getRoot(state.attribute)->readSubdivision(state); }