//---------------------------------------------------------------------------
//
// Project: OpenWalnut ( http://www.openwalnut.org )
//
// Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS
// For more information see http://www.openwalnut.org/copying
//
// This file is part of OpenWalnut.
//
// OpenWalnut is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// OpenWalnut is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with OpenWalnut. If not, see .
//
//---------------------------------------------------------------------------
#include
#include
#include "WUpdateThread.h"
#include "WROIManagerFibers.h"
WROIManagerFibers::WROIManagerFibers()
{
m_activeBitField = 0;
m_recalcLock = false;
}
WROIManagerFibers::~WROIManagerFibers()
{
}
void WROIManagerFibers::addRoi( boost::shared_ptr< WROI > newRoi )
{
// create new branch
boost::shared_ptr< WRMBranch > newBranch = boost::shared_ptr< WRMBranch >( new WRMBranch( shared_from_this() ) );
// create roi
boost::shared_ptr< WRMROIRepresentation > rroi = boost::shared_ptr< WRMROIRepresentation >( new WRMROIRepresentation( newRoi, newBranch ) );
// add roi to branch
newBranch->addRoi( rroi );
// add branch to list
m_branches.push_back( newBranch );
// add bit fields
newBranch->addBitField( m_fibers.get()->size() );
for ( std::list< boost::function< void( boost::shared_ptr< WRMROIRepresentation > ) > >::iterator iter = m_notifiers.begin(); iter
!= m_notifiers.end(); ++iter )
{
( *iter )( rroi );
}
}
void WROIManagerFibers::addRoi( boost::shared_ptr< WROI > newRoi, boost::shared_ptr< WROI > parentRoi )
{
// find branch
boost::shared_ptr< WRMBranch > branch;
for ( std::list< boost::shared_ptr< WRMBranch > >::iterator iter = m_branches.begin(); iter != m_branches.end(); ++iter )
{
if ( ( *iter ).get()->getFirstRoi()->getROI() == parentRoi )
{
branch = ( *iter );
}
}
// create roi
boost::shared_ptr< WRMROIRepresentation > rroi = boost::shared_ptr< WRMROIRepresentation >( new WRMROIRepresentation( newRoi, branch ) );
// add bit fields
rroi->addBitField( m_fibers.get()->size() );
// add roi to branch
branch->addRoi( rroi );
for ( std::list< boost::function< void( boost::shared_ptr< WRMROIRepresentation > ) > >::iterator iter = m_notifiers.begin(); iter
!= m_notifiers.end(); ++iter )
{
( *iter )( rroi );
}
}
void WROIManagerFibers::removeRoi( boost::shared_ptr< WROI > /*roi */ )
{
}
void WROIManagerFibers::addFiberDataset( boost::shared_ptr< const WDataSetFibers > fibers )
{
m_fibers = fibers;
boost::shared_ptr< std::vector< float > > verts = fibers->getVertices();
m_kdTree = boost::shared_ptr< WKdTree >( new WKdTree( verts->size() / 3, &( ( *verts )[0] ) ) );
addBitField( fibers->size() );
setDirty();
}
void WROIManagerFibers::removeFiberDataset( boost::shared_ptr< const WDataSetFibers > /*fibers*/ )
{
assert( 0 && "removeFiberDataset( --- ) not implemented yet." );
}
boost::shared_ptr< std::vector< bool > > WROIManagerFibers::getBitField()
{
m_dirty = false;
if ( m_activeBitField == 0 )
{
return m_bitField;
}
else
{
return m_bitField2;
}
}
void WROIManagerFibers::addBitField( size_t size )
{
boost::shared_ptr< std::vector< bool > > bf = boost::shared_ptr< std::vector< bool > >( new std::vector< bool >( size, false ) );
m_bitField = bf;
boost::shared_ptr< std::vector< bool > > bf2 = boost::shared_ptr< std::vector< bool > >( new std::vector< bool >( size, false ) );
m_bitField2 = bf2;
for ( std::list< boost::shared_ptr< WRMBranch > >::iterator iter = m_branches.begin(); iter != m_branches.end(); ++iter )
{
( *iter ).get()->addBitField( size );
}
setDirty();
}
void WROIManagerFibers::recalculate()
{
// boost::unique_lock slock;
// slock = boost::unique_lock( m_updateLock );
if ( m_recalcLock )
return;
m_recalcLock = true;
boost::shared_ptr< std::vector< bool > > mbf;
if ( m_activeBitField == 0 )
{
mbf = m_bitField2;
}
else
{
mbf = m_bitField;
}
int size = mbf->size();
mbf->clear();
if ( m_branches.empty() )
{
mbf->resize( size, true );
if ( m_activeBitField == 0 )
{
m_activeBitField = 1;
}
else
{
m_activeBitField = 0;
}
m_recalcLock = false;
//slock.unlock();
return;
}
else
{
mbf->resize( size, false );
}
for ( std::list< boost::shared_ptr< WRMBranch > >::iterator iter = m_branches.begin(); iter != m_branches.end(); ++iter )
{
boost::shared_ptr< std::vector< bool > > bf = ( *iter )->getBitField();
for ( size_t i = 0; i < mbf->size(); ++i )
{
mbf->at( i ) = mbf->at( i ) | bf->at( i );
}
}
if ( m_activeBitField == 0 )
{
m_activeBitField = 1;
}
else
{
m_activeBitField = 0;
}
m_dirty = true;
//slock.unlock();
m_recalcLock = false;
}
void WROIManagerFibers::setDirty()
{
WUpdateThread* t = new WUpdateThread( shared_from_this() );
t->run();
}
boost::shared_ptr< const WDataSetFibers > WROIManagerFibers::getDataSet()
{
return m_fibers;
}
boost::shared_ptr< WKdTree > WROIManagerFibers::getKdTree()
{
return m_kdTree;
}
bool WROIManagerFibers::isDirty()
{
return m_dirty;
}
void WROIManagerFibers::addDefaultNotifier( boost::function< void( boost::shared_ptr< WRMROIRepresentation > ) > notifier )
{
boost::unique_lock< boost::shared_mutex > lock;
lock = boost::unique_lock< boost::shared_mutex >( m_associatedNotifiersLock );
m_notifiers.push_back( notifier );
lock.unlock();
}