Пример #1
0
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));
}
Пример #2
0
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( ));
}

}