LODNode DataSourcePlugin::internalNodeToLODNode( const NodeId& internalNode) const { const uint32_t refLevel = internalNode.getLevel(); const Vector3ui& bricksInRefLevel = _volumeInfo.rootNode.getBlockSize(refLevel); const Boxi localBlockPos(internalNode.getPosition(), internalNode.getPosition() + 1u); Vector3f boxCoordMin = localBlockPos.getMin(); Vector3f boxCoordMax = localBlockPos.getMax(); const size_t index = bricksInRefLevel.find_max_index(); boxCoordMin = boxCoordMin / bricksInRefLevel[index]; boxCoordMax = boxCoordMax / bricksInRefLevel[index]; LBVERB << " Internal Node to LOD Node" << std::endl << " Node Id " << internalNode << " BricksInRefLevel " << bricksInRefLevel << std::endl << " lBoxCoordMin " << boxCoordMin << std::endl << " lBoxCoordMax " << boxCoordMax << std::endl << " volume world size " << _volumeInfo.worldSize << std::endl << std::endl; return LODNode(internalNode, _volumeInfo.maximumBlockSize - _volumeInfo.overlap * 2, Boxf(boxCoordMin * _volumeInfo.worldSize - _volumeInfo.worldSize * 0.5f, boxCoordMax * _volumeInfo.worldSize - _volumeInfo.worldSize * 0.5f)); }
namespace livre { LODNode LODNode::empty = LODNode(); LODNode::LODNode( ) : blockSize_( 0 ) {} LODNode::LODNode( const NodeId nodeId, const Vector3i& blockSize, const Vector3i& levelTotalBlockDimensions ) : nodeId_( nodeId ), blockSize_( blockSize ) { initialize_( ); computeWorldBox_( levelTotalBlockDimensions ); } LODNode::LODNode( const NodeId nodeId, const Vector3i& blockSize, const Boxf& worldBox ) : nodeId_( nodeId ), blockSize_( blockSize ), worldBox_( worldBox ) { initialize_( ); } void LODNode::computeVoxelBoxes_( ) { Vector3i pntPos = getAbsolutePosition() * blockSize_; localVoxelBox_ = Boxui( pntPos, pntPos + blockSize_ ); } void LODNode::computeWorldBox_( const Vector3ui &levelTotalBlockDimensions ) { Vector3f lBoxCoordMin( getAbsolutePosition( )); Vector3f lBoxCoordMax( lBoxCoordMin + Vector3i( 1 )); const size_t index = levelTotalBlockDimensions.find_max_index(); lBoxCoordMin = lBoxCoordMin / levelTotalBlockDimensions[index]; lBoxCoordMax = lBoxCoordMax / levelTotalBlockDimensions[index]; worldBox_ = Boxf( lBoxCoordMin, lBoxCoordMax ); } void LODNode::initialize_( ) { computeVoxelBoxes_( ); } Vector3f LODNode::getRelativePosition() const { return Vector3f( getAbsolutePosition( )) / float( 1 << getRefLevel( )); } }